eis-ui-render 0.30.21 → 0.30.22

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 (578) hide show
  1. package/README.md +114 -14
  2. package/dist/index.js +3 -0
  3. package/dist/index.js.LICENSE.txt +72 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/package.json +150 -0
  6. package/{static/all.less → dist/static/all.css} +0 -0
  7. package/dist/static/font.css +8 -0
  8. package/dist/static/fonts/iconsOpenL.eot +0 -0
  9. package/dist/static/fonts/iconsOpenL.svg +95 -0
  10. package/dist/static/fonts/iconsOpenL.ttf +0 -0
  11. package/dist/static/fonts/iconsOpenL.woff +0 -0
  12. package/dist/static/images/diamonds-dimmed-flipped.png +0 -0
  13. package/dist/static/images/diamonds-dimmed.png +0 -0
  14. package/dist/static/images/diamonds.png +0 -0
  15. package/dist/static/images/flags/ad.svg +150 -0
  16. package/dist/static/images/flags/ae.svg +6 -0
  17. package/dist/static/images/flags/af.svg +81 -0
  18. package/dist/static/images/flags/ag.svg +14 -0
  19. package/dist/static/images/flags/ai.svg +767 -0
  20. package/dist/static/images/flags/al.svg +5 -0
  21. package/dist/static/images/flags/am.svg +5 -0
  22. package/dist/static/images/flags/ao.svg +13 -0
  23. package/dist/static/images/flags/aq.svg +6 -0
  24. package/dist/static/images/flags/ar.svg +31 -0
  25. package/dist/static/images/flags/as.svg +33 -0
  26. package/dist/static/images/flags/at.svg +6 -0
  27. package/dist/static/images/flags/au.svg +9 -0
  28. package/dist/static/images/flags/aw.svg +186 -0
  29. package/dist/static/images/flags/ax.svg +18 -0
  30. package/dist/static/images/flags/az.svg +8 -0
  31. package/dist/static/images/flags/ba.svg +12 -0
  32. package/dist/static/images/flags/bb.svg +6 -0
  33. package/dist/static/images/flags/bd.svg +4 -0
  34. package/dist/static/images/flags/be.svg +7 -0
  35. package/dist/static/images/flags/bf.svg +7 -0
  36. package/dist/static/images/flags/bg.svg +7 -0
  37. package/dist/static/images/flags/bh.svg +11 -0
  38. package/dist/static/images/flags/bi.svg +15 -0
  39. package/dist/static/images/flags/bj.svg +14 -0
  40. package/dist/static/images/flags/bl.svg +7 -0
  41. package/dist/static/images/flags/bm.svg +98 -0
  42. package/dist/static/images/flags/bn.svg +36 -0
  43. package/dist/static/images/flags/bo.svg +676 -0
  44. package/dist/static/images/flags/bq.svg +5 -0
  45. package/dist/static/images/flags/br.svg +45 -0
  46. package/dist/static/images/flags/bs.svg +13 -0
  47. package/dist/static/images/flags/bt.svg +89 -0
  48. package/dist/static/images/flags/bv.svg +13 -0
  49. package/dist/static/images/flags/bw.svg +7 -0
  50. package/dist/static/images/flags/by.svg +20 -0
  51. package/dist/static/images/flags/bz.svg +145 -0
  52. package/dist/static/images/flags/ca.svg +4 -0
  53. package/dist/static/images/flags/cc.svg +19 -0
  54. package/dist/static/images/flags/cd.svg +5 -0
  55. package/dist/static/images/flags/cf.svg +15 -0
  56. package/dist/static/images/flags/cg.svg +12 -0
  57. package/dist/static/images/flags/ch.svg +9 -0
  58. package/dist/static/images/flags/ci.svg +7 -0
  59. package/dist/static/images/flags/ck.svg +9 -0
  60. package/dist/static/images/flags/cl.svg +13 -0
  61. package/dist/static/images/flags/cm.svg +15 -0
  62. package/dist/static/images/flags/cn.svg +11 -0
  63. package/dist/static/images/flags/co.svg +7 -0
  64. package/dist/static/images/flags/cr.svg +7 -0
  65. package/dist/static/images/flags/cu.svg +13 -0
  66. package/dist/static/images/flags/cv.svg +13 -0
  67. package/dist/static/images/flags/cw.svg +14 -0
  68. package/dist/static/images/flags/cx.svg +15 -0
  69. package/dist/static/images/flags/cy.svg +6 -0
  70. package/dist/static/images/flags/cz.svg +12 -0
  71. package/dist/static/images/flags/de.svg +5 -0
  72. package/dist/static/images/flags/dj.svg +13 -0
  73. package/dist/static/images/flags/dk.svg +5 -0
  74. package/dist/static/images/flags/dm.svg +152 -0
  75. package/dist/static/images/flags/do.svg +6745 -0
  76. package/dist/static/images/flags/dz.svg +5 -0
  77. package/dist/static/images/flags/ec.svg +138 -0
  78. package/dist/static/images/flags/ee.svg +7 -0
  79. package/dist/static/images/flags/eg.svg +38 -0
  80. package/dist/static/images/flags/eh.svg +15 -0
  81. package/dist/static/images/flags/el.svg +22 -0
  82. package/dist/static/images/flags/en.svg +15 -0
  83. package/dist/static/images/flags/er.svg +8 -0
  84. package/dist/static/images/flags/es-ct.svg +4 -0
  85. package/dist/static/images/flags/es.svg +544 -0
  86. package/dist/static/images/flags/et.svg +14 -0
  87. package/dist/static/images/flags/eu.svg +28 -0
  88. package/dist/static/images/flags/fa.svg +219 -0
  89. package/dist/static/images/flags/fi.svg +5 -0
  90. package/dist/static/images/flags/fj.svg +120 -0
  91. package/dist/static/images/flags/fk.svg +89 -0
  92. package/dist/static/images/flags/fm.svg +11 -0
  93. package/dist/static/images/flags/fo.svg +12 -0
  94. package/dist/static/images/flags/fr.svg +7 -0
  95. package/dist/static/images/flags/ga.svg +7 -0
  96. package/dist/static/images/flags/gb-eng.svg +5 -0
  97. package/dist/static/images/flags/gb-nir.svg +131 -0
  98. package/dist/static/images/flags/gb-sct.svg +4 -0
  99. package/dist/static/images/flags/gb-wls.svg +9 -0
  100. package/dist/static/images/flags/gb.svg +15 -0
  101. package/dist/static/images/flags/gd.svg +27 -0
  102. package/dist/static/images/flags/ge.svg +6 -0
  103. package/dist/static/images/flags/gf.svg +5 -0
  104. package/dist/static/images/flags/gg.svg +9 -0
  105. package/dist/static/images/flags/gh.svg +6 -0
  106. package/dist/static/images/flags/gi.svg +32 -0
  107. package/dist/static/images/flags/gl.svg +4 -0
  108. package/dist/static/images/flags/gm.svg +14 -0
  109. package/dist/static/images/flags/gn.svg +7 -0
  110. package/dist/static/images/flags/gp.svg +7 -0
  111. package/dist/static/images/flags/gq.svg +23 -0
  112. package/dist/static/images/flags/gr.svg +22 -0
  113. package/dist/static/images/flags/gs.svg +201 -0
  114. package/dist/static/images/flags/gt.svg +204 -0
  115. package/dist/static/images/flags/gu.svg +39 -0
  116. package/dist/static/images/flags/gw.svg +13 -0
  117. package/dist/static/images/flags/gy.svg +9 -0
  118. package/dist/static/images/flags/he.svg +14 -0
  119. package/dist/static/images/flags/hk.svg +30 -0
  120. package/dist/static/images/flags/hm.svg +9 -0
  121. package/dist/static/images/flags/hn.svg +18 -0
  122. package/dist/static/images/flags/hr.svg +58 -0
  123. package/dist/static/images/flags/ht.svg +116 -0
  124. package/dist/static/images/flags/hu.svg +7 -0
  125. package/dist/static/images/flags/id.svg +6 -0
  126. package/dist/static/images/flags/ie.svg +7 -0
  127. package/dist/static/images/flags/il.svg +14 -0
  128. package/dist/static/images/flags/im.svg +36 -0
  129. package/dist/static/images/flags/in.svg +25 -0
  130. package/dist/static/images/flags/io.svg +138 -0
  131. package/dist/static/images/flags/iq.svg +10 -0
  132. package/dist/static/images/flags/ir.svg +219 -0
  133. package/dist/static/images/flags/is.svg +12 -0
  134. package/dist/static/images/flags/it.svg +7 -0
  135. package/dist/static/images/flags/ja.svg +11 -0
  136. package/dist/static/images/flags/je.svg +29 -0
  137. package/dist/static/images/flags/jm.svg +8 -0
  138. package/dist/static/images/flags/jo.svg +16 -0
  139. package/dist/static/images/flags/jp.svg +11 -0
  140. package/dist/static/images/flags/ke.svg +23 -0
  141. package/dist/static/images/flags/kg.svg +15 -0
  142. package/dist/static/images/flags/kh.svg +61 -0
  143. package/dist/static/images/flags/ki.svg +36 -0
  144. package/dist/static/images/flags/km.svg +16 -0
  145. package/dist/static/images/flags/kn.svg +14 -0
  146. package/dist/static/images/flags/ko.svg +24 -0
  147. package/dist/static/images/flags/kp.svg +15 -0
  148. package/dist/static/images/flags/kr.svg +24 -0
  149. package/dist/static/images/flags/kw.svg +13 -0
  150. package/dist/static/images/flags/ky.svg +63 -0
  151. package/dist/static/images/flags/kz.svg +23 -0
  152. package/dist/static/images/flags/la.svg +12 -0
  153. package/dist/static/images/flags/lb.svg +15 -0
  154. package/dist/static/images/flags/lc.svg +8 -0
  155. package/dist/static/images/flags/li.svg +43 -0
  156. package/dist/static/images/flags/lk.svg +22 -0
  157. package/dist/static/images/flags/lr.svg +14 -0
  158. package/dist/static/images/flags/ls.svg +8 -0
  159. package/dist/static/images/flags/lt.svg +7 -0
  160. package/dist/static/images/flags/lu.svg +5 -0
  161. package/dist/static/images/flags/lv.svg +6 -0
  162. package/dist/static/images/flags/ly.svg +13 -0
  163. package/dist/static/images/flags/ma.svg +4 -0
  164. package/dist/static/images/flags/mc.svg +6 -0
  165. package/dist/static/images/flags/md.svg +70 -0
  166. package/dist/static/images/flags/me.svg +116 -0
  167. package/dist/static/images/flags/mf.svg +7 -0
  168. package/dist/static/images/flags/mg.svg +7 -0
  169. package/dist/static/images/flags/mh.svg +7 -0
  170. package/dist/static/images/flags/mk.svg +5 -0
  171. package/dist/static/images/flags/ml.svg +7 -0
  172. package/dist/static/images/flags/mm.svg +16 -0
  173. package/dist/static/images/flags/mn.svg +13 -0
  174. package/dist/static/images/flags/mo.svg +9 -0
  175. package/dist/static/images/flags/mp.svg +86 -0
  176. package/dist/static/images/flags/mq.svg +7 -0
  177. package/dist/static/images/flags/mr.svg +6 -0
  178. package/dist/static/images/flags/ms.svg +39 -0
  179. package/dist/static/images/flags/mt.svg +49 -0
  180. package/dist/static/images/flags/mu.svg +8 -0
  181. package/dist/static/images/flags/mv.svg +6 -0
  182. package/dist/static/images/flags/mw.svg +10 -0
  183. package/dist/static/images/flags/mx.svg +382 -0
  184. package/dist/static/images/flags/my.svg +15 -0
  185. package/dist/static/images/flags/mz.svg +21 -0
  186. package/dist/static/images/flags/na.svg +16 -0
  187. package/dist/static/images/flags/nc.svg +7 -0
  188. package/dist/static/images/flags/ne.svg +6 -0
  189. package/dist/static/images/flags/nf.svg +9 -0
  190. package/dist/static/images/flags/ng.svg +6 -0
  191. package/dist/static/images/flags/ni.svg +129 -0
  192. package/dist/static/images/flags/nl.svg +7 -0
  193. package/dist/static/images/flags/no.svg +7 -0
  194. package/dist/static/images/flags/np.svg +14 -0
  195. package/dist/static/images/flags/nr.svg +12 -0
  196. package/dist/static/images/flags/nu.svg +26 -0
  197. package/dist/static/images/flags/nz.svg +41 -0
  198. package/dist/static/images/flags/om.svg +115 -0
  199. package/dist/static/images/flags/pa.svg +14 -0
  200. package/dist/static/images/flags/pe.svg +244 -0
  201. package/dist/static/images/flags/pf.svg +19 -0
  202. package/dist/static/images/flags/pg.svg +9 -0
  203. package/dist/static/images/flags/ph.svg +9 -0
  204. package/dist/static/images/flags/pk.svg +15 -0
  205. package/dist/static/images/flags/pl.svg +6 -0
  206. package/dist/static/images/flags/pm.svg +7 -0
  207. package/dist/static/images/flags/pn.svg +62 -0
  208. package/dist/static/images/flags/pr.svg +13 -0
  209. package/dist/static/images/flags/ps.svg +15 -0
  210. package/dist/static/images/flags/pt.svg +57 -0
  211. package/dist/static/images/flags/pw.svg +11 -0
  212. package/dist/static/images/flags/py.svg +157 -0
  213. package/dist/static/images/flags/qa.svg +4 -0
  214. package/dist/static/images/flags/re.svg +7 -0
  215. package/dist/static/images/flags/ro.svg +7 -0
  216. package/dist/static/images/flags/rs.svg +292 -0
  217. package/dist/static/images/flags/ru.svg +7 -0
  218. package/dist/static/images/flags/rw.svg +13 -0
  219. package/dist/static/images/flags/sa.svg +26 -0
  220. package/dist/static/images/flags/sb.svg +13 -0
  221. package/dist/static/images/flags/sc.svg +14 -0
  222. package/dist/static/images/flags/sd.svg +13 -0
  223. package/dist/static/images/flags/se.svg +16 -0
  224. package/dist/static/images/flags/sg.svg +13 -0
  225. package/dist/static/images/flags/sh.svg +74 -0
  226. package/dist/static/images/flags/si.svg +18 -0
  227. package/dist/static/images/flags/sj.svg +7 -0
  228. package/dist/static/images/flags/sk.svg +9 -0
  229. package/dist/static/images/flags/sl.svg +7 -0
  230. package/dist/static/images/flags/sm.svg +91 -0
  231. package/dist/static/images/flags/sn.svg +8 -0
  232. package/dist/static/images/flags/so.svg +11 -0
  233. package/dist/static/images/flags/sr.svg +6 -0
  234. package/dist/static/images/flags/ss.svg +8 -0
  235. package/dist/static/images/flags/st.svg +16 -0
  236. package/dist/static/images/flags/sv.svg +601 -0
  237. package/dist/static/images/flags/sx.svg +56 -0
  238. package/dist/static/images/flags/sy.svg +6 -0
  239. package/dist/static/images/flags/sz.svg +45 -0
  240. package/dist/static/images/flags/tc.svg +67 -0
  241. package/dist/static/images/flags/td.svg +7 -0
  242. package/dist/static/images/flags/tf.svg +15 -0
  243. package/dist/static/images/flags/tg.svg +14 -0
  244. package/dist/static/images/flags/th.svg +7 -0
  245. package/dist/static/images/flags/tj.svg +22 -0
  246. package/dist/static/images/flags/tk.svg +5 -0
  247. package/dist/static/images/flags/tl.svg +13 -0
  248. package/dist/static/images/flags/tm.svg +206 -0
  249. package/dist/static/images/flags/tn.svg +13 -0
  250. package/dist/static/images/flags/to.svg +10 -0
  251. package/dist/static/images/flags/tr.svg +8 -0
  252. package/dist/static/images/flags/tt.svg +5 -0
  253. package/dist/static/images/flags/tv.svg +27 -0
  254. package/dist/static/images/flags/tw.svg +14 -0
  255. package/dist/static/images/flags/tz.svg +13 -0
  256. package/dist/static/images/flags/ua.svg +6 -0
  257. package/dist/static/images/flags/ug.svg +30 -0
  258. package/dist/static/images/flags/um.svg +15 -0
  259. package/dist/static/images/flags/un.svg +16 -0
  260. package/dist/static/images/flags/us.svg +10 -0
  261. package/dist/static/images/flags/uy.svg +28 -0
  262. package/dist/static/images/flags/uz.svg +30 -0
  263. package/dist/static/images/flags/va.svg +479 -0
  264. package/dist/static/images/flags/vc.svg +8 -0
  265. package/dist/static/images/flags/ve.svg +26 -0
  266. package/dist/static/images/flags/vg.svg +127 -0
  267. package/dist/static/images/flags/vi.svg +28 -0
  268. package/dist/static/images/flags/vn.svg +11 -0
  269. package/dist/static/images/flags/vu.svg +18 -0
  270. package/dist/static/images/flags/wf.svg +7 -0
  271. package/dist/static/images/flags/ws.svg +7 -0
  272. package/dist/static/images/flags/xk.svg +16 -0
  273. package/dist/static/images/flags/ye.svg +7 -0
  274. package/dist/static/images/flags/yi.svg +12 -0
  275. package/dist/static/images/flags/yt.svg +7 -0
  276. package/dist/static/images/flags/za.svg +17 -0
  277. package/dist/static/images/flags/zh-HK.svg +30 -0
  278. package/dist/static/images/flags/zh.svg +11 -0
  279. package/dist/static/images/flags/zm.svg +27 -0
  280. package/dist/static/images/flags/zw.svg +21 -0
  281. package/dist/static/images/flags.png +0 -0
  282. package/dist/static/images/home.jpg +0 -0
  283. package/dist/static/images/logo.svg +1 -0
  284. package/dist/static/images/showIf.png +0 -0
  285. package/dist/static/images/ui-architecture.png +0 -0
  286. package/dist/static/images/ui-render-inspect.png +0 -0
  287. package/dist/static/images/ui-render-version.png +0 -0
  288. package/{static/semantic.less → dist/static/semantic.css} +0 -0
  289. package/package.json +143 -8
  290. package/static/all.css +0 -0
  291. package/static/font.css +8 -0
  292. package/static/fonts/iconsOpenL.eot +0 -0
  293. package/static/fonts/iconsOpenL.ttf +0 -0
  294. package/static/fonts/iconsOpenL.woff +0 -0
  295. package/static/images/flags/ad.svg +0 -0
  296. package/static/images/flags/ae.svg +0 -0
  297. package/static/images/flags/af.svg +0 -0
  298. package/static/images/flags/ag.svg +0 -0
  299. package/static/images/flags/ai.svg +0 -0
  300. package/static/images/flags/al.svg +0 -0
  301. package/static/images/flags/am.svg +0 -0
  302. package/static/images/flags/ao.svg +0 -0
  303. package/static/images/flags/aq.svg +0 -0
  304. package/static/images/flags/ar.svg +0 -0
  305. package/static/images/flags/as.svg +0 -0
  306. package/static/images/flags/at.svg +0 -0
  307. package/static/images/flags/au.svg +0 -0
  308. package/static/images/flags/aw.svg +0 -0
  309. package/static/images/flags/ax.svg +0 -0
  310. package/static/images/flags/az.svg +0 -0
  311. package/static/images/flags/ba.svg +0 -0
  312. package/static/images/flags/bb.svg +0 -0
  313. package/static/images/flags/bd.svg +0 -0
  314. package/static/images/flags/be.svg +0 -0
  315. package/static/images/flags/bf.svg +0 -0
  316. package/static/images/flags/bg.svg +0 -0
  317. package/static/images/flags/bh.svg +0 -0
  318. package/static/images/flags/bi.svg +0 -0
  319. package/static/images/flags/bj.svg +0 -0
  320. package/static/images/flags/bl.svg +0 -0
  321. package/static/images/flags/bm.svg +0 -0
  322. package/static/images/flags/bn.svg +0 -0
  323. package/static/images/flags/bo.svg +0 -0
  324. package/static/images/flags/bq.svg +0 -0
  325. package/static/images/flags/br.svg +0 -0
  326. package/static/images/flags/bs.svg +0 -0
  327. package/static/images/flags/bt.svg +0 -0
  328. package/static/images/flags/bv.svg +0 -0
  329. package/static/images/flags/bw.svg +0 -0
  330. package/static/images/flags/by.svg +0 -0
  331. package/static/images/flags/bz.svg +0 -0
  332. package/static/images/flags/ca.svg +0 -0
  333. package/static/images/flags/cc.svg +0 -0
  334. package/static/images/flags/cd.svg +0 -0
  335. package/static/images/flags/cf.svg +0 -0
  336. package/static/images/flags/cg.svg +0 -0
  337. package/static/images/flags/ch.svg +0 -0
  338. package/static/images/flags/ci.svg +0 -0
  339. package/static/images/flags/ck.svg +0 -0
  340. package/static/images/flags/cl.svg +0 -0
  341. package/static/images/flags/cm.svg +0 -0
  342. package/static/images/flags/cn.svg +0 -0
  343. package/static/images/flags/co.svg +0 -0
  344. package/static/images/flags/cr.svg +0 -0
  345. package/static/images/flags/cu.svg +0 -0
  346. package/static/images/flags/cv.svg +0 -0
  347. package/static/images/flags/cw.svg +0 -0
  348. package/static/images/flags/cx.svg +0 -0
  349. package/static/images/flags/cy.svg +0 -0
  350. package/static/images/flags/cz.svg +0 -0
  351. package/static/images/flags/de.svg +0 -0
  352. package/static/images/flags/dj.svg +0 -0
  353. package/static/images/flags/dk.svg +0 -0
  354. package/static/images/flags/dm.svg +0 -0
  355. package/static/images/flags/do.svg +0 -0
  356. package/static/images/flags/dz.svg +0 -0
  357. package/static/images/flags/ec.svg +0 -0
  358. package/static/images/flags/ee.svg +0 -0
  359. package/static/images/flags/eg.svg +0 -0
  360. package/static/images/flags/eh.svg +0 -0
  361. package/static/images/flags/el.svg +0 -0
  362. package/static/images/flags/en.svg +0 -0
  363. package/static/images/flags/er.svg +0 -0
  364. package/static/images/flags/es-ct.svg +0 -0
  365. package/static/images/flags/es.svg +0 -0
  366. package/static/images/flags/et.svg +0 -0
  367. package/static/images/flags/eu.svg +0 -0
  368. package/static/images/flags/fa.svg +0 -0
  369. package/static/images/flags/fi.svg +0 -0
  370. package/static/images/flags/fj.svg +0 -0
  371. package/static/images/flags/fk.svg +0 -0
  372. package/static/images/flags/fm.svg +0 -0
  373. package/static/images/flags/fo.svg +0 -0
  374. package/static/images/flags/fr.svg +0 -0
  375. package/static/images/flags/ga.svg +0 -0
  376. package/static/images/flags/gb-eng.svg +0 -0
  377. package/static/images/flags/gb-nir.svg +0 -0
  378. package/static/images/flags/gb-sct.svg +0 -0
  379. package/static/images/flags/gb-wls.svg +0 -0
  380. package/static/images/flags/gb.svg +0 -0
  381. package/static/images/flags/gd.svg +0 -0
  382. package/static/images/flags/ge.svg +0 -0
  383. package/static/images/flags/gf.svg +0 -0
  384. package/static/images/flags/gg.svg +0 -0
  385. package/static/images/flags/gh.svg +0 -0
  386. package/static/images/flags/gi.svg +0 -0
  387. package/static/images/flags/gl.svg +0 -0
  388. package/static/images/flags/gm.svg +0 -0
  389. package/static/images/flags/gn.svg +0 -0
  390. package/static/images/flags/gp.svg +0 -0
  391. package/static/images/flags/gq.svg +0 -0
  392. package/static/images/flags/gr.svg +0 -0
  393. package/static/images/flags/gs.svg +0 -0
  394. package/static/images/flags/gt.svg +0 -0
  395. package/static/images/flags/gu.svg +0 -0
  396. package/static/images/flags/gw.svg +0 -0
  397. package/static/images/flags/gy.svg +0 -0
  398. package/static/images/flags/he.svg +0 -0
  399. package/static/images/flags/hk.svg +0 -0
  400. package/static/images/flags/hm.svg +0 -0
  401. package/static/images/flags/hn.svg +0 -0
  402. package/static/images/flags/hr.svg +0 -0
  403. package/static/images/flags/ht.svg +0 -0
  404. package/static/images/flags/hu.svg +0 -0
  405. package/static/images/flags/id.svg +0 -0
  406. package/static/images/flags/ie.svg +0 -0
  407. package/static/images/flags/il.svg +0 -0
  408. package/static/images/flags/im.svg +0 -0
  409. package/static/images/flags/in.svg +0 -0
  410. package/static/images/flags/io.svg +0 -0
  411. package/static/images/flags/iq.svg +0 -0
  412. package/static/images/flags/ir.svg +0 -0
  413. package/static/images/flags/is.svg +0 -0
  414. package/static/images/flags/it.svg +0 -0
  415. package/static/images/flags/ja.svg +0 -0
  416. package/static/images/flags/je.svg +0 -0
  417. package/static/images/flags/jm.svg +0 -0
  418. package/static/images/flags/jo.svg +0 -0
  419. package/static/images/flags/jp.svg +0 -0
  420. package/static/images/flags/ke.svg +0 -0
  421. package/static/images/flags/kg.svg +0 -0
  422. package/static/images/flags/kh.svg +0 -0
  423. package/static/images/flags/ki.svg +0 -0
  424. package/static/images/flags/km.svg +0 -0
  425. package/static/images/flags/kn.svg +0 -0
  426. package/static/images/flags/ko.svg +0 -0
  427. package/static/images/flags/kp.svg +0 -0
  428. package/static/images/flags/kr.svg +0 -0
  429. package/static/images/flags/kw.svg +0 -0
  430. package/static/images/flags/ky.svg +0 -0
  431. package/static/images/flags/kz.svg +0 -0
  432. package/static/images/flags/la.svg +0 -0
  433. package/static/images/flags/lb.svg +0 -0
  434. package/static/images/flags/lc.svg +0 -0
  435. package/static/images/flags/li.svg +0 -0
  436. package/static/images/flags/lk.svg +0 -0
  437. package/static/images/flags/lr.svg +0 -0
  438. package/static/images/flags/ls.svg +0 -0
  439. package/static/images/flags/lt.svg +0 -0
  440. package/static/images/flags/lu.svg +0 -0
  441. package/static/images/flags/lv.svg +0 -0
  442. package/static/images/flags/ly.svg +0 -0
  443. package/static/images/flags/ma.svg +0 -0
  444. package/static/images/flags/mc.svg +0 -0
  445. package/static/images/flags/md.svg +0 -0
  446. package/static/images/flags/me.svg +0 -0
  447. package/static/images/flags/mf.svg +0 -0
  448. package/static/images/flags/mg.svg +0 -0
  449. package/static/images/flags/mh.svg +0 -0
  450. package/static/images/flags/mk.svg +0 -0
  451. package/static/images/flags/ml.svg +0 -0
  452. package/static/images/flags/mm.svg +0 -0
  453. package/static/images/flags/mn.svg +0 -0
  454. package/static/images/flags/mo.svg +0 -0
  455. package/static/images/flags/mp.svg +0 -0
  456. package/static/images/flags/mq.svg +0 -0
  457. package/static/images/flags/mr.svg +0 -0
  458. package/static/images/flags/ms.svg +0 -0
  459. package/static/images/flags/mt.svg +0 -0
  460. package/static/images/flags/mu.svg +0 -0
  461. package/static/images/flags/mv.svg +0 -0
  462. package/static/images/flags/mw.svg +0 -0
  463. package/static/images/flags/mx.svg +0 -0
  464. package/static/images/flags/my.svg +0 -0
  465. package/static/images/flags/mz.svg +0 -0
  466. package/static/images/flags/na.svg +0 -0
  467. package/static/images/flags/nc.svg +0 -0
  468. package/static/images/flags/ne.svg +0 -0
  469. package/static/images/flags/nf.svg +0 -0
  470. package/static/images/flags/ng.svg +0 -0
  471. package/static/images/flags/ni.svg +0 -0
  472. package/static/images/flags/nl.svg +0 -0
  473. package/static/images/flags/no.svg +0 -0
  474. package/static/images/flags/np.svg +0 -0
  475. package/static/images/flags/nr.svg +0 -0
  476. package/static/images/flags/nu.svg +0 -0
  477. package/static/images/flags/nz.svg +0 -0
  478. package/static/images/flags/om.svg +0 -0
  479. package/static/images/flags/pa.svg +0 -0
  480. package/static/images/flags/pe.svg +0 -0
  481. package/static/images/flags/pf.svg +0 -0
  482. package/static/images/flags/pg.svg +0 -0
  483. package/static/images/flags/ph.svg +0 -0
  484. package/static/images/flags/pk.svg +0 -0
  485. package/static/images/flags/pl.svg +0 -0
  486. package/static/images/flags/pm.svg +0 -0
  487. package/static/images/flags/pn.svg +0 -0
  488. package/static/images/flags/pr.svg +0 -0
  489. package/static/images/flags/ps.svg +0 -0
  490. package/static/images/flags/pt.svg +0 -0
  491. package/static/images/flags/pw.svg +0 -0
  492. package/static/images/flags/py.svg +0 -0
  493. package/static/images/flags/qa.svg +0 -0
  494. package/static/images/flags/re.svg +0 -0
  495. package/static/images/flags/ro.svg +0 -0
  496. package/static/images/flags/rs.svg +0 -0
  497. package/static/images/flags/ru.svg +0 -0
  498. package/static/images/flags/rw.svg +0 -0
  499. package/static/images/flags/sa.svg +0 -0
  500. package/static/images/flags/sb.svg +0 -0
  501. package/static/images/flags/sc.svg +0 -0
  502. package/static/images/flags/sd.svg +0 -0
  503. package/static/images/flags/se.svg +0 -0
  504. package/static/images/flags/sg.svg +0 -0
  505. package/static/images/flags/sh.svg +0 -0
  506. package/static/images/flags/si.svg +0 -0
  507. package/static/images/flags/sj.svg +0 -0
  508. package/static/images/flags/sk.svg +0 -0
  509. package/static/images/flags/sl.svg +0 -0
  510. package/static/images/flags/sm.svg +0 -0
  511. package/static/images/flags/sn.svg +0 -0
  512. package/static/images/flags/so.svg +0 -0
  513. package/static/images/flags/sr.svg +0 -0
  514. package/static/images/flags/ss.svg +0 -0
  515. package/static/images/flags/st.svg +0 -0
  516. package/static/images/flags/sv.svg +0 -0
  517. package/static/images/flags/sx.svg +0 -0
  518. package/static/images/flags/sy.svg +0 -0
  519. package/static/images/flags/sz.svg +0 -0
  520. package/static/images/flags/tc.svg +0 -0
  521. package/static/images/flags/td.svg +0 -0
  522. package/static/images/flags/tf.svg +0 -0
  523. package/static/images/flags/tg.svg +0 -0
  524. package/static/images/flags/th.svg +0 -0
  525. package/static/images/flags/tj.svg +0 -0
  526. package/static/images/flags/tk.svg +0 -0
  527. package/static/images/flags/tl.svg +0 -0
  528. package/static/images/flags/tm.svg +0 -0
  529. package/static/images/flags/tn.svg +0 -0
  530. package/static/images/flags/to.svg +0 -0
  531. package/static/images/flags/tr.svg +0 -0
  532. package/static/images/flags/tt.svg +0 -0
  533. package/static/images/flags/tv.svg +0 -0
  534. package/static/images/flags/tw.svg +0 -0
  535. package/static/images/flags/tz.svg +0 -0
  536. package/static/images/flags/ua.svg +0 -0
  537. package/static/images/flags/ug.svg +0 -0
  538. package/static/images/flags/um.svg +0 -0
  539. package/static/images/flags/un.svg +0 -0
  540. package/static/images/flags/us.svg +0 -0
  541. package/static/images/flags/uy.svg +0 -0
  542. package/static/images/flags/uz.svg +0 -0
  543. package/static/images/flags/va.svg +0 -0
  544. package/static/images/flags/vc.svg +0 -0
  545. package/static/images/flags/ve.svg +0 -0
  546. package/static/images/flags/vg.svg +0 -0
  547. package/static/images/flags/vi.svg +0 -0
  548. package/static/images/flags/vn.svg +0 -0
  549. package/static/images/flags/vu.svg +0 -0
  550. package/static/images/flags/wf.svg +0 -0
  551. package/static/images/flags/ws.svg +0 -0
  552. package/static/images/flags/xk.svg +0 -0
  553. package/static/images/flags/ye.svg +0 -0
  554. package/static/images/flags/yi.svg +0 -0
  555. package/static/images/flags/yt.svg +0 -0
  556. package/static/images/flags/za.svg +0 -0
  557. package/static/images/flags/zh-HK.svg +0 -0
  558. package/static/images/flags/zh.svg +0 -0
  559. package/static/images/flags/zm.svg +0 -0
  560. package/static/images/flags/zw.svg +0 -0
  561. package/static/images/home.jpg +0 -0
  562. package/static/images/logo.svg +1 -0
  563. package/static/images/showIf.png +0 -0
  564. package/static/images/ui-architecture.png +0 -0
  565. package/static/images/ui-render-inspect.png +0 -0
  566. package/static/images/ui-render-version.png +0 -0
  567. package/static/semantic.css +0 -0
  568. package/UIRender.d.ts +0 -45
  569. package/UIRender.js +0 -151
  570. package/index.d.ts +0 -10
  571. package/index.js +0 -15
  572. package/static/chunk.js +0 -2
  573. package/static/chunk.js.map +0 -1
  574. package/static/js/runtime~main.38823ca4.js +0 -2
  575. package/static/js/runtime~main.38823ca4.js.map +0 -1
  576. package/static/loader.js +0 -1
  577. package/static/main.js +0 -2
  578. package/static/main.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../ui-utils-pack/src/string.js","../../ui-utils-pack/src/array.js","../../ui-utils-pack/src/number.js","../../ui-react-pack/src/files.js","../../ui-utils-pack/src/object.js","../../ui-modules-pack/src/variables/routes.js","../../core/src/common/variables/routes.js","../../core/src/common/variables/index.js","../../ui-modules-pack/src/variables/configs.js","../../ui-modules-pack/src/redux/actions.js","../../ui-modules-pack/src/saga/middleware.js","../../ui-modules-pack/src/saga/utils.js","../../ui-utils-pack/src/codec.js","../../ui-utils-pack/src/storage.js","../../ui-utils-pack/src/utility.js","../../ui-modules-pack/src/api/constants.js","../../ui-modules-pack/src/api/actions.js","../../ui-modules-pack/src/api/selectors.js","../../ui-modules-pack/src/api/utils/saga.js","../../ui-modules-pack/src/api/fetch.js","../../ui-utils-pack/src/definitions.js","../../ui-utils-pack/src/translations.js","../../ui-react-pack/src/inputs/translations.js","../../ui-react-pack/src/inputs/validationRules.js","../../ui-react-pack/src/utils/hocs.js","../../ui-react-pack/src/Text.js","../../ui-react-pack/src/Tooltip.js","../../ui-react-pack/src/TooltipPop.js","../../ui-react-pack/src/View.js","../../ui-modules-pack/src/variables/fields.js","../../ui-modules-pack/src/variables/date.js","../../core/src/pages/main/utils.js","../../ui-modules-pack/src/form/utils.js","../../ui-modules-pack/src/popup/constants.js","../../ui-modules-pack/src/popup/actions.js","../../ui-react-pack/src/JsonView/themes.js","../../ui-react-pack/src/JsonView/index.js","../../ui-react-pack/src/ScrollView.js","../../core/src/ui-render/Render.js","../../core/src/ui-render/transforms.js","../../core/src/ui-render/index.js","../../ui-react-pack/src/Spinner.js","../../ui-react-pack/src/Loading.js","../../ui-modules-pack/src/form/views/AutoSave.js","../../ui-react-pack/src/Button.js","../../ui-react-pack/src/ColorSwatch.js","../../ui-react-pack/src/Icon.js","../../ui-react-pack/src/Image.js","../../ui-react-pack/src/Row.js","../../ui-react-pack/src/renders.js","../../ui-react-pack/src/styles.js","../../ui-utils-pack/src/time.js","../../ui-react-pack/src/charts/utils.js","../../ui-react-pack/src/charts/constants.js","../../ui-react-pack/src/charts/PieChart.js","../../ui-react-pack/src/Label.js","../../ui-react-pack/src/Checkbox.js","../../ui-react-pack/src/Counter.js","../../ui-react-pack/src/Dropdown.js","../../ui-react-pack/src/AnimateHeight.js","../../ui-react-pack/src/Expand.js","../../ui-react-pack/src/ExpandList.js","../../ui-react-pack/src/List.js","../../core/src/providers/ConfigProvider.js","../../ui-react-pack/src/TextDateValue.js","../../ui-react-pack/src/ProgressBar.js","../../ui-react-pack/src/ProgressSteps.js","../../ui-react-pack/src/Space.js","../../ui-react-pack/src/Table.js","../../ui-react-pack/src/Select.js","../../ui-react-pack/src/InputNative.js","../../ui-react-pack/src/Input.js","../../ui-modules-pack/src/form/inputs/InputField.js","../../ui-modules-pack/src/form/inputs/DropdownField.js","../../ui-modules-pack/src/form/inputs/ToggleField.js","../../ui-modules-pack/src/form/inputs/InputNumberField.js","../../ui-react-pack/src/InputNumber.js","../../ui-modules-pack/src/form/inputs/InputDateField.js","../../ui-modules-pack/src/form/asInputDateField.js","../../ui-react-pack/src/InputDate.js","../../ui-modules-pack/src/variables/files.js","../../ui-modules-pack/src/upload/constants.js","../../ui-utils-pack/src/selectors.js","../../ui-modules-pack/src/upload/selectors.js","../../ui-modules-pack/src/upload/views/Upload.js","../../ui-react-pack/src/PlaceholderField.js","../../core/src/pages/main/components/renders.js","../../ui-react-pack/src/Emoji.js","../../ui-react-pack/src/Placeholder.js","../../core/src/pages/main/components/TableColGroup.js","../../core/src/pages/main/components/TableView.js","../../ui-react-pack/src/types.js","../../core/src/pages/main/components/Tabs.js","../../core/src/pages/main/components/TabList.js","../../core/src/pages/main/Data.js","../../core/src/pages/main/mapper.js","../../core/src/pages/main/translations.js","../../web/services/downloadFile.js","../../ui-react-pack/src/ErrorTable.js","../../ui-react-pack/src/ErrorContent.js","../../ui-modules-pack/src/popup/selectors.js","../../ui-modules-pack/src/popup/views/Popup.js","../../core/src/pages/main/components/Popup.js","../../ui-react-pack/src/inputs/normalizers.js","../../core/src/pages/main/rules.js","../../core/src/pages/main/webstudio.js","../../ui-modules-pack/src/redux/index.js","../../ui-modules-pack/src/router/selectors.js","../../ui-modules-pack/src/router/constants.js","../../ui-modules-pack/src/router/browser/components.js","../../ui-modules-pack/src/router/browser/constants.js","../../ui-modules-pack/src/router/browser/history.js","../../ui-modules-pack/src/router/browser/index.js","../../ui-modules-pack/src/settings/constants.js","../../ui-modules-pack/src/redux/reducers.js","../../ui-modules-pack/src/settings/data.js","../../ui-modules-pack/src/settings/reducers.js","../../ui-modules-pack/src/variables/definitions.js","../../ui-modules-pack/src/user/definitions.js","../../ui-modules-pack/src/user/logic.js","../../ui-modules-pack/src/variables/defaults.js","../../ui-modules-pack/src/form/constants.js","../../ui-modules-pack/src/user/translations.js","../../ui-modules-pack/src/user/constants.js","../../ui-modules-pack/src/user/selectors.js","../../ui-modules-pack/src/settings/selectors.js","../../ui-modules-pack/src/settings/index.js","../../ui-react-pack/src/MenuButton.js","../../ui-react-pack/src/Badge.js","../../ui-react-pack/src/AlertCounter.js","../../core/src/containers/NavLinks.js","../../core/src/containers/Navigation.js","AppElement.js","../../ui-modules-pack/src/api/data.js","../../ui-modules-pack/src/api/middleware.js","../../ui-modules-pack/src/api/reducers.js","../../ui-modules-pack/src/api/index.js","../../ui-modules-pack/src/form/index.js","../../ui-modules-pack/src/popup/data.js","../../ui-modules-pack/src/popup/reducers.js","../../ui-modules-pack/src/popup/sagas.js","../../ui-modules-pack/src/popup/index.js","../../ui-modules-pack/src/saga/index.js","../../ui-modules-pack/src/saga/constants.js","../../ui-modules-pack/src/redux/createStore.js","../../ui-modules-pack/src/upload/data.js","../../ui-modules-pack/src/upload/index.js","../../ui-modules-pack/src/upload/reducers.js","../../ui-modules-pack/src/user/data.js","../../ui-modules-pack/src/user/reducers.js","store.js","../../ui-modules-pack/src/user/index.js","main.js","../../ui-react-pack/src/utils/interactions.js","../../ui-utils-pack/src/log.js","../../ui-utils-pack/src/function.js","../../ui-utils-pack/src/constants.js","../../ui-utils-pack/src/_envs.js"],"names":["alphaNumIdPattern","fileNameWithoutExtPattern","spacesPattern","symbols","symbolRatio","length","upperThreshold","upperThresholdAlphaNum","isInString","string","search","indexOf","isInStringAny","_len2","arguments","searches","Array","_key2","_i","_searches","value","isFileSrc","RegExp","isPhoneNumber","isPhoneNumberPattern","test","isString","interpolateString","variables","undefined","_ref","formatKey","name","suppressError","replace","interpolateStringPattern","__","match","key","result","lodash_es_get__WEBPACK_IMPORTED_MODULE_2__","apply","concat","Object","_Users_asamuseu_IdeaProjects_ui_render_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__","split","hasOwnProperty","Error","fileFormatNormalized","fileName","ext","array","pop","fileFormat","toLowerCase","fileNameWithoutExt","mimeTypeFromDataUrl","dataUrl","hostname","url","padStringLeft","padTemplate","slice","Math","max","pluralize","word","count","shouldIncludeCount","pluralizer","randomString","min","_ref2","_ref2$alphaNum","alphaNum","_ref2$hex","hex","searchSpace","uppercase","floor","random","randomNumberInRange","map","charAt","randomFromString","toString","toUpperCase","join","toAlphaNumId","truncate","lastChars","firstChars","substr","toLowerCaseAny","String","trimSpaces","trim","history","lut","i","hasListValue","data","isList","isCollection","constructor","lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_5__","isEqualList","a","b","isInList","isInListAny","args","_args","isInCollection","collection","element","lodash_es_some__WEBPACK_IMPORTED_MODULE_4__","toList","clean","filter","v","toListValuesTotal","_step3","fallback","sum","_iterator3","_createForOfIteratorHelper","s","n","done","err","e","f","toUniqueList","lodash_es_uniqWith__WEBPACK_IMPORTED_MODULE_1__","lodash_es_isEqual__WEBPACK_IMPORTED_MODULE_6__","toUniqueListCaseInsensitive","listLower","firstListValue","last","sortAscending","sortDescending","by","_len4","_key4","_step4","_iterator4","substring","lodash_es_get__WEBPACK_IMPORTED_MODULE_7__","Function","toFlatList","lodash_es_flatten__WEBPACK_IMPORTED_MODULE_8__","isNumeric","val","isNaN","parseFloat","isFinite","startEndFromNumberRanges","arrayOfNumberRanges","start","find","from","end","reverse","_ref3","to","formatNumber","_ref5","decimals","_ref5$delimits","delimits","_ref5$sectionDelimite","sectionDelimiter","decimalDelimiter","ordinal","number","Number","toFixed","dot","dotPattern","pattern","toOrdinal","shortNumber","digits","divider","delimiter","suffixes","formatSI","abs","precision","PREFIXES","exponent","prefix","toPrecision","round","list","rad","degree","PI","factor","pow","24","21","18","15","12","9","6","3","0","-3","-6","-9","-12","-15","-18","-21","-24","CDN_URL","ENV","REACT_APP_CDN_URL","FILE","PATH_IMAGES","PATH_SOUNDS","get","Active","SETTINGS","objectSpread","HAS_SOUND","SOUND","ALERT","soundFile","INCREASE","DECREASE","PRESS","PROGRESS","TOUCH","SWOOSH","SLIDE","file","play","Audio","warn","catch","hasObjectValue","obj","isObject","keys","isEqualJSON","oldVal","newVal","JSON","stringify","isPlainObject","objChanges","original","changed","field","isEqual","deleted","isEmpty","set","object","path","customizer","setWith","update","state","payload","shouldCloneDeep","deleteNull","cloneDeep","hasObjMatch","searchObj","call","lodash_es_matches","isObjectLike","hasObjKeys","searchValue","lodash_es_get","findObjByKeys","foundObj","flatten","unflatten","ROUTE_SLASH","ROUTE_BASE","ROUTE","HOME","TESTER","THEME","LOGIN","LOGOUT","LOADING","ROUTES","NAV_HEADER_MAX_LINKS","FOR_DEFINITION","createNestedRoutes","defineProperty","FOR_NAV","icon","WITHOUT_NAV","NEW","routeObj","matches","uris","title","parentRoute","route","items","push","_SHOULD_SHOW_TEST_","_ROUTES$FOR_NAV","__PROD__","REACT_APP_HOMEPAGE","_ROUTE","DOCS","TEST","assign","_ROUTES","API_REQUEST_TIMEOUT","REACT_APP_API_REQUEST_TIMEOUT","THIRTY_SECONDS","UI","SOCKET_CONNECT_TIMEOUT","REACT_APP_SOCKET_CONNECT_TIMEOUT","STATE_ACTION_TIMEOUT","REACT_APP_STATE_ACTION_TIMEOUT","REQUEST_TIMEOUT_BACKOFF_DURATION","REACT_APP_REQUEST_TIMEOUT_BACKOFF_DURATION","FIVE_MINUTES","APP_NAME","REACT_APP_NAME","APP_RELEASE_VERSION","REACT_APP_RELEASE_VERSION","APP_SUPPORT_TEAM_NAME","REACT_APP_SUPPORT_TEAM_NAME","REACT_APP_ANALYTICS_TRACKING_ID","REACT_APP_CONTACT_HOST","REACT_APP_CONTACT_SERVER","LANGUAGE","ENGLISH","FRENCH","QUERY_CACHE_TIME","TWO_SECONDS","TYPING_DELAY","TOOLTIP_DELAY","FORM_SYNC_THROTTLE","THREE_SECONDS","ANIMATION_DURATION","LIGHT","DARK","stateAction","TYPE","ACTION","RESULT","meta","hasAction","ALL_ACTIONS","hasResult","ALL_RESULTS","finalACTION","finalRESULT","finalPayload","finalMeta","createAction","stateActionType","NAME","SEPARATOR","RESULT_SEPARATOR","ERROR","createSagaMiddleware","runTask","func","middleware","run","bind","this","toPromise","toJSON","_len","_key","CircularJSON","fromJSON","parse","hasLocalStorage","localStorage","performStorage","storageKey","_localStorage","initialValue","ADD","isAsync","GET","then","oldData","SET","Storage","toServer","enumCheck","DELETE","toClient","__DEV__","log","_performStorage$toCli","_performStorage$toSer","toServerSync","_performStorage$toSer2","init","_Active$Storage","initSync","_Active$Storage2","Id","_ref$timestamp","timestamp","Date","now","_ref$caseSensitive","caseSensitive","_ref$alphabet","alphabet","alphabetLower","_ref$padCount","padCount","_ref$suffix","suffix","time","charsCount","remainder","unshift","fill","isTruthy","isGoodPassword","password","strength","passwordCheck","score","namespace","constant","service","minLength","API","NETWORK","SERVICE","capitalize","ADD_ACTIONS_PENDING_AUTH","ADD_ACTIONS_PENDING_LOCATION","ADD_ACTIONS_PENDING_NETWORK","CLEAR_ACTIONS_PENDING_NETWORK","REQUEST_TIMEOUT","API_CALL","API_ACTIONS","CREATE","UPDATE","LIST","API_RESULTS","REQUEST","SUCCESS","TIMEOUT","NETWORK_ERROR_MESSAGES","REQUEST_TIMEOUT_MESSAGE","HTTP_401_UNAUTHORIZED","apiAction","URL","id","includes","ID","type","apiActionType","method","crudToFetch","TypeError","apiActionResultsType","RESULTS","resultList","forEach","_crudToFetch","fetchToCrud","swapKeyWithValue","actionsPendingAuth","createSelector","logSelector","actionsPendingLocation","actionsPendingNetwork","subscribeToApiResults","fetchFlow","resubscribe","listener","response","_response$error","_response$error$paylo","_listener","_response2","_response2$action","_response2$action$pay","_status","_response2$action$met","_args2","regenerator_default","wrap","_context2","prev","next","race","success","take","action","isMatchingApiActionType","error","timeout","void","delay","sent","status","abrupt","VOID","stop","saga_marked2","_ref$method","_ref$meta","headers","_context3","objectWithoutProperties","put","saga_marked3","isApiActionType","_action$meta","isApiActionTypeTimeout","isApiActionTypeError","fetch","body","params","definitionByValue","DEFINITION","index","def","_","enumFrom","optionsFrom","options","LANG","_DEFINITION$index","langs","lang","text","localiseTranslation","TRANSLATION","_loop2","KEY","_data","instance","DEFAULT","queriedById","Proxy","target","prop","UNTRANSLATED","l","CLICK_HERE","CONTACT_US","COPY","COPIED","NO","YES","OK","ERROR_MESSAGE","ERROR_INFO","ERROR_STACK","DATA_CAUSING_ERROR","CLOSE","OPEN","REMOVE","BACK","NEXT","LOGIN_noun","REGISTER","RESET","RETRY","SELECT","SEARCH","SEARCHING___","SIGN_IN","SIGN_IN_noun","SIGNUP","SIGNUP_noun","SEND","SUBMIT","SAVE","SAVED","SAVE_TO_FAVORITES","TYPE_A_MESSAGE","HIDE","SHOW","SHOW_LESS","READ_MORE","BY","BETWEEN","OR","PRIVACY_POLICY","YOUR_INFO_IS_SAFE_WITH_US_SEE_OUR","TERMS_OF_SERVICE","THANK_YOU","WE_HAVE_RECEIVED_YOUR_MESSAGE_AND_WILL_GET_IN_TOUCH_SHORTLY","OUR_SITE_USES_COOKIES_BY_CONTINUING_TO_USE_OUR_SITE_YOU_ARE_AGREEING_TO_OUR","OK_I_UNDERSTAND","PLEASE","USE_ANOTHER_BROWSER_TO","DONT_SHOW_AGAIN","ERROR_ID","REASON","STATUS","REQUEST_FAILED","SERVER_DISCONNECTED","DOWNLOAD_FAILED_","REQUEST_FAILED_FOR_url","CHARACTER","ENTER_NUMBER_STARTING_WITH_plus_COUNTRY_CODE","INVALID_DATE","INVALID_EMAIL_ADDRESS","INVALID_URL","MUST_BE_LESS_THEN_characters","MUST_BE_IN_THE_PAST","MUST_BE_IN_THE_FUTURE","MUST_HAVE_START_TIME","MUST_HAVE_END_TIME","PASSWORD_IS_TOO_WEAK","PASSWORD_MISMATCH","REQUIRED","isRequired","email","isEmail","confirm","accessibilitySupport","props","sound","tabIndex","onKeyPress","onClick","onPressHoc","event","withTimer","Class","componentWillUnmount","prototype","setTimeout","timers","setInterval","intervals","clearTimer","clearTimeout","clearInterval","UIContext","React","createContext","memo","className","rtl","children","expanded","_ref$translate","translate","react_default","createElement","classNames","pointer","top","bottom","right","left","show","TooltipPop","inverted","isFunction","Popup_Popup","trigger","content","mouseEnterDelay","View","ref","onDataChanged","defaultProps","forwardRef","FIELD","definitionSetup","BUTTON","EXPAND","EXPAND_LIST","CHECKBOX","COL","COL2","COL3","COL_LIST","COL_LIST3","COUNTER","DROPDOWN","LABEL","PIE_CHART","PROGRESS_STEPS","ROW","ROW2","ROW_LIST","ROW_LIST2","SPACE","TABLE","TABS","TAB_LIST","TEXT","TITLE","TOOLTIP","RENDER","CURRENCY","PERCENT","DOUBLE5","FLOAT","TITLE_n_INPUT","STRING","DATE","SET_STATE","FETCH","POPUP","WARN","FUNC","console","ID_HIDDEN","EMAIL","ABOUT","ADDRESS","PHONE","WEBSITE","MIN_MAX","LANGUAGE_LEVEL","BASIC","NATIVE","DEF","ISO_8601_FULL","getFormsData","forms","formDataArray","form","formData","getStructuredDataFromFormObject","mergeData","relativePath","relativeIndex","formValues","getState","values","formState","changeOptionOrderForSelectFields","createObjectStructure","reduce","acc","item","tmpArray","masterDataIndex","objects","merge","replaceDeep","isArray","k","errorsProcessing","_getKeyAndPathFromMet","getKeyAndPathFromMetaData","registeredFieldNames","getRegisteredFields","_form$getFieldState","getFieldState","touched","storedTouched","errorText","convertFieldNameToTitleCaseText","errorsMap","str","fieldName","recursiveDataParser","optionName","selectValue","isDataOrderChanged","splice","view","selectName","mapOptions","optionValue","renderItem","getDateStringFromDateObject","date","year","getUTCFullYear","padStart","month","getUTCMonth","day","getUTCDate","normalizeIncomingData","nextData","isDataChangedListenerCalled","formInitialValues","fieldValues","registeredFieldValues","registeredFieldErrors","errors","asField","InputComponent","sanitize","Field","_PureComponent","inherits","_super","_createSuper","_this","classCallCheck","selectPreviousValue","Input","_ref2$input","input","_ref2$meta","pristine","_this$props","onChange","defaultValue","format","normalize","validate","onRemoveChange","hasFocus","readonly","initValues","initialValues","nextValue","displayName","setState","onFocus","handleFocus","onBlur","handleBlur","handleChange","_this$input","_this$props2","_this$props2$parse","createClass","_this$props3","isUnmounting","change","_this$props4","disabled","_this$props4$parse","_envs","component","_value","PureComponent","setFieldTouched","slicedToArray","fields","withFormSetup","Tooltip","renderField","UNSAFE_componentWillReceiveProps","handleChangeInput","propTypes","formProps","PropTypes","onChangeState","canSave","parent","handleSubmit","_props","loading","changedValues","registeredValues","messages","_fields","_loop","_ref8","_ref9","label","labelGroup","src_Text","src_View","PLEASE_COMPLETE_","validationErrors","src_Tooltip","debounce","syncInputChanges","_ref10","_ref10$parent","_meta","POPUP_ALERT","POPUP_CONFIRM","POPUP_ERROR","popupAlert","store","dispatch","nicinabox","scheme","author","base00","base01","base02","base03","base04","base05","base06","base07","base08","base09","base0A","base0B","base0C","base0D","base0E","base0F","_ref$data","_ref$inverted","_ref$expanded","_ref$theme","theme","defaultTheme","style","shouldExpandNode","lib_default","hideRoot","invertTheme","ScrollView","classNameInner","styleInner","row","center","tab","thisRef","useRef","_useState","useState","_useState2","scrollYPosition","setScrollYPosition","onScroll","current","scrollLeft","margin-auto","Render","dateFormat","rest","Render_RenderClass","RenderClass","Component","Method","errorInfo","_this2","onError","_this3","tooltip","tooltipProps","TooltipDefaultProps","debug","relativeData","currencyCode","mappedData","FUNCTION_NAMES","mapProps","mapper","mapData","metaToProps","config","funcConfig","metaToFunctions","attribute","definition","self","useForm","filterItems","configs","revPath","relativePathFrom","parentItem","removeNilValues","_ref3$recursive","recursive","getFunctionFromString","getFunctionFromObject","currencySymbol","getCurrencySymbol","symbol","valueDefinition","default","attrCount","fieldValidation","fieldNormalizer","fieldParser","fieldFunc","_config$funcNames","funcNames","verify","_definition$verify","opt","validators","composeValidators","toConsumableArray","validator","mapArgs","_definition$args","onDone","fieldMethods","_config$fallback","hasMapArgs","mapFunctionArgs","Promise","_len3","_key3","_ref4","_ref4$fallback","_string$split","_string$split2","toArray","arg","template","_ref$size","size","_ref$color","color","Loading","_ref$loading","iconClassName","_ref$transparent","transparent","src_Spinner","SYNCING___","AutoSave","submitting","_callee","partial","changes","_context","promise","renderLoading","showLoader","loadContent","subscription","Fragment","react_final_form_es","TIME_DURATION_INSTANT","_ref$disabled","active","circle","square","_ref$type","src_Loading","small","large","backgroundColor","cn","white","black","iconClass","iconClassPrefix","aria-hidden","Image","src","avatar","_ref2$name","_ref2$path","imageSrc","alt","decoding","Row","noSpellCheck","autoComplete","autoCorrect","autoCapitalize","spellCheck","renderFloat","truncated","_ref2$faded","faded","fraction","showFraction","toLocaleString","minimumFractionDigits","maximumFractionDigits","trunc","renderSort","order","src_Icon","resizeToContent","offset","width","boxSizing","transition","SORT_ORDER","toTextHeight","toTextHeightFunc","leading","height","computed","window","getComputedStyle","parseInt","getPropertyValue","scrollHeight","innerHeight","STYLE","SIZE_SCALE","GREY","TEXT_LIGHT","BG","BG_LIGHT","TEAL","TEAL_LIGHT","GREEN","GREEN_LIGHT","GOLD","GOLD_LIGHT","YELLOW","YELLOW_LIGHT","ORANGE","ORANGE_LIGHT","RED","RED_LIGHT","PINK","PINK_LIGHT","VIOLET","VIOLET_LIGHT","BORDER","TRANSPARENT","PRIMARY","PRIMARY_LIGHT","SECONDARY","SECONDARY_LIGHT","formatDuration","milliseconds","_ref$shorten","shorten","_ref$round","shortEnglish","humanizeDuration","humanizer","language","languages","shortEn","y","mo","w","d","h","m","ms","decimal","chartTooltip","animationEasing","animationDuration","wrapperStyle","zIndex","colorsPalette","unit","RADIAN","fontSize","renderCell","gradient","es6","stroke","renderGradient","_ref3$startOpacity","startOpacity","_ref3$stopOpacity","stopOpacity","_ref3$x","x1","_ref3$y","y1","_ref3$x2","x2","_ref3$y2","y2","stopColor","renderGradients","textColor","PieChart","renderTotal","renderReference","itemsLength","legends","columns","_ref$background","background","classes","offsetTop","marginTop","ceil","src_Row","renderReferenceItem","_items","u","classNameWrap","_this$props$gradient","pointers","sort","sorts","Container","colors","dataNormalized","dataKey","innerRadius","outerRadius","labelLine","renderPercentPointer","renderPercent","strokeWidth","renderTooltip","donutPieCenterCoords","cx","cy","midAngle","radius","x","cos","sin","percent","startAngle","endAngle","fontScale","percentColor","_donutPieCenterCoords","textAnchor","dominantBaseline","_ref6","angleEffect","radiusEffect","_donutPieCenterCoords2","labelSize","lineScale","lineSize","sx","sy","mx","my","ex","ey","xOuter","r","dy","throttle","_ref7","total","renderTooltipItem","_ref8$payload","child","Checkbox","_ref$valueTrue","valueTrue","_ref$valueFalse","valueFalse","labelTrue","labelFalse","danger","float","readOnly","defaultChecked","checked","src_Label","htmlFor","react","Counter","steps","animate","_this$state","setup","easingFn","_props$duration","duration","ONE_SECOND","_props$delay","_props$interval","interval","nextProps","render","t","Dropdown","tempValue","opts","onSelect","onSearch","_ref$placeholder","placeholder","info","classNameIcon","_ref$fill","_ref$lazyLoad","lazyLoad","optionsLabel","autofocus","onAddItem","onClickIcon","valueFromParent","setOptions","_useState3","_useState4","setValue","useEffect","searchInput","autoFocus","selection","deburr","option","multiple","duplicate","onClose","onSearchChange","searchQuery","allowAdditions","additionLabel","ADD_","upward","additionPosition","newOption","labeled","fill-width","compact","required","noResultsMessage","NO_OPTIONS_LEFT","NOTHING_FOUND","_ref$duration","AnimateHeight_default","Expand","changing","handleToggleExpand","expand","handleClick","renderLabel","_this$props2$justify","justify","iconOpened","iconClosed","classNameLabel","Title","_content","classNameItems","hasContent","src_AnimateHeight","Expand_Expand","ConfigContext","TextDateValue","useContext","formatedDate","moment","ProgressBar","styleBar","progressBar","_this$props2$hasToolt","hasTooltip","transform","ProgressSteps","activeIndex","defaultIndex","handleClickStep","handleClickTab","hasConnector","classNameSteps","styleSteps","classNameContent","styleContent","connector","step","passed","ProgressBar_ProgressBar","src_Button","bold","src_ScrollView","fade-in","Table","_ref$fixedHeader","fixedHeader","Header","TableS","HeaderCell","Cell","Body","Footer","_ref$label","_ref$id","_ref$value","_ref$defaultValue","selectLabel","SELECT_option","InputNative","_event$target","onChangeCheckbox","onChangeColor","onMountColor","onMountResize","onMount","onKeyUp","nextContext","inputValue","_this$props5","_this$props6","disabledSpellCheck","resize","rows","src_Select","lefty","stickyPlaceholder","onRemove","InputNative_InputNative","idHelp","hasValue","isCheckbox","swatch","aria-describedby","ToggleField","_ref$outputFormat","outputFormat","percentage","separateThousands","formatDecimals","setActive","rc_input_number_es","parser","formatter","userTyping","parts","numberPart","decimalPart","commify","wheel","asInputDateField","asInputDateField_createSuper","_this$props3$parse","useMemo","rc_picker_es","prefixCls","generateConfig","allowClear","locale","enUs","picker","onCalendarChange","_FILE","EXT","CSV","GIF","JPG","JPEG","MP3","MP4","PNG","SVG","WEBP","MIME_TYPE","BIN","IMAGE","VIDEO","FORMAT_BY_MIME_TYPE","_FILE$FORMAT_BY_MIME_","MAX_RES","SIZE_MB_16","EXTENSIONS","MIME_TYPES","SIZES","","res","medium","fit","thumb","UPLOAD","DIR","BY_ROUTE","_BY_ROUTE","fileTypes","maxSize","PATH","CDN_BUCKET_NAME","UPLOAD_PATH","_WORK_DIR_","selector","maxTime","ONE_MILLISECOND","selectors","lastFunc","__CLIENT__","keyword","select","files","images","preview","Upload","connect","actions","upload","fileType","popup","activePopup","onDragEnter","onDragLeave","handleUpload","acceptedFiles","rejectedFiles","_step","_iterator","Upload_createForOfIteratorHelper","MAXIMUM_FILE_SIZE_EXCEEDED","MUST_BE_UNDER","SIZE_KB","closeLabel","dropzone","FILE_UPLOAD_FAILED","formats","FILES_ONLY","handleKeyPress","open","renderClose","handleClose","onComponentWillMount","labelOnHover","classWrap","hasHeader","showTypes","parseString","UPLOAD_file","dist_es","inputProps","node","onDrop","onFileDialogCancel","accept","SELECT_OR_DROP","UPLOAD_file_FILE","U","uri","PlaceholderField","FIELD_DOES_NOT_EXIST_","UploadField","fieldDefinition","INPUT","InputField","DropdownField","TOGGLE","InputNumberField","InputDateField","role","display","transformOrigin","margin","Placeholder","Searching","src_Emoji","any","TableColGroup","colGroup","column","TableView","itemsExpanded","expandedByIndex","activePage","rowsPerPage","tableWrapper","createRef","expandedByRow","_this$state$items","handleToggleExpandAll","handleItemExpand","findIndex","handleSort","onSort","_itemsSorted","getStickyCellClassName","styles","nextCellStyles","position","handlePaginationChange","scrollIntoView","behavior","block","renderHeader","cell","colSpan","classNameHeader","styleHeader","hasSort","Table_Table","assertThisInitialized","renderItemCells","itemClassNames","renderItemData","renderItemsVertical","header","additionalCellsStyles","itemsSorted","_ref5$classNameCellWr","classNameCellWrap","classNameCell","styleCell","showEmptyAs","cellStyle","cellClassName","vertical","_headers","src_Placeholder","extraHeaders","renderExtraItem","usePagination","sellStyles","totalPages","tableBody","components_TableColGroup","react_final_form_arrays_es","justifyContent","Pagination","onPageChange","sortKeys","sortKey","Any","Boolean","bool","Degree","Decimal","Enum","oneOf","File","Float","Fraction","GetterString","Int","List","ListOf","arrayOf","Milliseconds","Mm","Node","NumberOrString","oneOfType","ObjectOf","objectOf","Of","shape","OneOf","types","Px","PrimitiveOrObject","StringOrNumber","Timestamp","Url","UrlOrBase64","UrlOrBase64OrPreview","UrlOrNode","UrlOrObject","Definition","en","DefinitionSet","FileInput","kind","remove","sizes","FieldForList","FormValueType","Option","Options","Tabs","setTab","updateTab","_tabs","_contents","transitionUpdate","buttoned","childrenBeforeTabs","childrenAfterTabs","centerTabs","classNameTabs","styleTabs","contents","tabs","Tabs_Tabs","Data","_this$props$initialVa","embedded","UIRender","rules","Name","_ref6$decimals","_ref6$symbol","src_TextDateValue","_ref11","errInfo","textAlign","src_JsonView","showIf","version","__data","equal","getAllFormsData","DATA","Data_Data","src_List","TABLE_CELLS","AUTO_SUBMIT","AutoSave_AutoSave","src_ExpandList","Counter_Counter","ICON","src_Image","mapItems","PieChart_PieChart","ProgressSteps_ProgressSteps","src_Space","extraItems","group","table","_group$by","groupByProps","_group$extraHeader","extraHeader","errorTitle","groupsByValue","rowsByCommonValue","mapper_createForOfIteratorHelper","groupId","commonValue","groupIds","newHeaders","_id","groupHeaders","newExtraHeaders","_item","accumulatedWidth","col","isFixed","minWidth","TableView_TableView","components_TabList","popupById","PopupContent","mapper_createSuper","removable","autoSubmit","uniqueIdentificator","dropdown","src_Dropdown","SLIDER","submit","downloadFile_downloadFile","href","createObjectURL","link","document","setAttribute","appendChild","click","removeChild","revokeObjectURL","isServerError","hasId","hasStatus","hasTitle","striped","statusCode","code","detail","message","msg","scope","wordBreak","serverErrors","userErrors","src_ErrorTable","activePopups","alert","ui","CANCEL","CONFIRM","CONFIRM_ACTION","ERROR_excMark","Popup","close","closeAlert","closeConfirm","closeError","closePopup","hasAlert","hasConfirm","hasError","_this$props$ui","canClose","activeClass","cancelLabel","confirmLabel","_ref2$confirmClass","confirmClass","src_ErrorContent","PopupContext","Consumer","context","isOpen","togglePopupState","contextType","phone","ADD_DATA","DOWNLOAD","REMOVE_DATA","POPUP_DELAY","POPUP_OPEN","UPDATE_DATA_ON_CHANGE","ON_APPLY_PERIODS","LINK","CROSS_VALIDATE","NOT_WITHIN_RANGE","NORMALIZE","HOUR_MINUTE","INTEGER","UPPERCASE","NORMALIZER","_FIELD$NORMALIZER","PARSER","formConfig","formsStorage","Map","errorHandlerFunction","clearErrorsMap","_Component","rules_createSuper","getCalledMethod","_this$props$methods","methods","getAPICalls","_this$props$apiCalls","apiCalls","getValidationErrors","_ref$title","_ref$content","isPopupOpen","popupTitle","popupContent","json","getFormData","deepEqual","mapErrorObjectToUIFormat","childBefore","childAfter","hasData","hasMeta","ui_render","onSubmit","ConfigProvider","Provider","components_Popup_Popup","views_Popup_Popup","UIRenderWithUISetup","valid","UNSAFE_componentWillMount","UNSAFE_componentWillUpdate","getDataKindByRelativePath","dataJson","dataKindPath","getDataKindPath","pathToData","registerDataKind","dataKind","unregisterDataKind","getDataKind","pathToDataKindArray","withDataKind","shift","_this2$getAPICalls","downloadFile","blob","downloadFileProcessing","asyncToGenerator","mark","dropzoneRef","_this2$getAPICalls2","uploadFile","_files","normalizedResponse","fileInputEl","restart","t0","_x","_x2","_x3","parentForm","mutators","dataActionWarning","_ref3$id","_ref3$id$title","_callee2","_this2$getAPICalls3","updateExperienceData","errorObject","subMessage","Response","METHODS","VALIDATION","_a","_b","_ref5$args","_this2$props","valuesBy","ranges","thisIndex","_valuesBy$i","range","resetForm","setStates","_callee3","_args3","sleep","delayed","toOpenLConfig","firstHeader","sanitizeResponse","_ref4$tags","tags","_ref4$clone","clone","keyPath","reset","nextState","_this3$form","formSubscription","_Object$keys","_i2","_Object$keys2","_PureComponent2","WithForm","_super2","prevInitialValues","renderForm","_formProps","subscribe","_initValues","delete","_this$props6$onSubmit","restProps","arrayMutators","withForm","resolve","WebStudioPage","loadingData","loadingMeta","metaJson","_ref$body","_ref$contentType","contentType","_yield$fetch","_yield$fetch$meta","Content-Type","POST","_window","_this$props$dataUrl","urlPrefix","REACT_APP_DATA_URL","_this$props$metaUrl","metaUrl","REACT_APP_META_URL","_dataFetchMethod","blink","_urlPrefix","getElementById","getAttribute","location","origin","redux","thunk","activeRoute","Link","_ref2$sound","react_router_dom","CHANGE","require","createBrowserHistory","router","ACTION_TYPE","routerMiddleware","reducer","connectRouter","Router","ConnectedRouter","Route","defineRoutes","routes","pages","results","react_router","exact","_history$location","pathname","activeRouteId","SETTING","uiLoading","LOAD","START","FINISH","initState","dataHandler","handleActions","settings","uiHandler","allHandlers","combineReducers","USD","EUR","RUB","MOBILE","WORK","OPTIONS","DEFINITION_BY_VAL","_DEFINITION","ENUM","_USER","ROLE","USER","STAFF","DEVELOPER","ADMIN","KIND","INDIVIDUAL","COMPANY","SEX","ANY","FEMALE","MALE","hasStaffOrHigherRole","isStaff","isAdmin","isCompany","isIndividual","USER_ROLE","USER_KIND","LOGIN_DURATION","ONE_MONTH","ONE_WEEK","GRADIENT_HUE_COUNT","PAY_INTERVAL","ONE_HOUR","QUERY_LIMIT","QUERY_ID_LIMIT","QUERY_TAG_LIMIT","QUERY_USER_LIMIT","DATES","GROUP","MULTIPLE","MULTIPLE_LEVEL","PLACE","UPLOAD_GRID","UPLOAD_GRIDS","VALIDATE","MAX_LENGTH","PASSWORD","_FIELD$VALIDATION","isLength","characters","isURL","require_protocol","_FIELD$DEF","hint","MY_EMAIL_ADDRESS_IS","EXAMPLE_GMAIL_COM","labelType","MY_PHONE_NUMBER_IS","plus_1_555_555_55_55","minFields","GIVEN_NAME","MY_GIVEN_NAME_IS","MY_SURNAME_IS","SURNAME","ABOUT_ME","BRIEF_DESCRIPTION","DATE_OF_BIRTH","I_WAS_BORN","MY_ROLE","REGISTER_ME_AS","GENDER","I_AM","SELF","FULL_NAME","BIRTHDAY","BIRTH_n_SEX","constants_FIELD$DEF","user","lastLogin","isLoggedIn","country","currency","isOpenSidebar","routesForNav","routerSelect","userSelect","userRole","routeWithoutId","lastIndexOf","userRoles","sagas","aria-label","_ref$digits","counter","AlertCounter","src_Badge","NavLinks","onChangeRoute","animationDelay","CHAT","AlertCounter_AlertCounter","mapStateToProps","mapDispatchToProps","Navigation_dec","Navigation_class","Navigation_createSuper","handleToggleSidebar","isMobile","hasSidebar","links","NavLinks_NavLinks","handleCloseSidebar","src_MenuButton","showSidebar","containerClass","contentClass","AppElement","debounceBy","screenRatio","innerWidth","addEventListener","_this$props$theme","_this$props$lang","Navigation_Header","lastNetworkErrorMessage","auth","useFetch","axios","hasFetch","ApiMiddleware","configDefault","addTokenToRequest","token","Authorization","requestComplete","request","afterRequest","afterResponse","onTimeout","isFetch","apiCall","shouldAuthenticate","requestArgs","responseHandler","responseProcessing","responseProcessFetch","responseProcessAxios","_setTimeout","_logTime","requestError","_afterRequest","callRequest","_omitBy2","authenticate","credentials","_meta$headers","_meta$method","qs","endpoint","questionIndex","urlWithParams","omitBy_default","isNil_default","_setHeaders","startsWith_default","requestTimeout","_response$headers","latency","callError","_onError","_error$response$data","pendingNetwork","_onTimeout","cloneDeep_default","_afterResponse","updated","constants","LOCATION_LIFESPAN","createApiMiddleware","_handleActions","api","data_data","_ref$payload","_ref2$payload","_ref2$payload$id","popups","saga","popupWatch","apiErrorFlow","apiTimeoutAlert","networkErrorAlert","popupError","all","sagas_marked","takeEvery","SYSTEM","sagas_marked2","lastApiErrorMessage","shouldIgnoreErrorCodes","_ref$meta$shouldAlert","shouldAlertSameErrorOnce","errorMessage","sagas_marked3","_context4","sagas_marked4","_context5","_marked5","_ref3$payload","_context6","_marked6","_ref4$payload","_ref4$payload$title","_context7","_marked7","hasEnabledSaga","createStore","modules","ignore","reduxCreateStore","middlewares","module","composeEnhancers","compose","allMiddleware","applyMiddleware","handlers","ignoreActions","rootReducer","HYDRATE","_objectSpread2","modulesActivated","DOMProxy","callback","preCallback","syncState","webstudio_WebStudioPage","_mountUIRender","src_redux","AppElement_AppElement","main_DOMProxy","first","_console2","_console","_len5","_key5","_console6","_console7","Async","Generator","enums","callerFunctionName","descriptor","configurable","enumerable","wait","callNow","_Users_asamuseu_IdeaProjects_ui_render_node_modules_babel_preset_react_app_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default","_Users_asamuseu_IdeaProjects_ui_render_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__","lodash_es_throttle__WEBPACK_IMPORTED_MODULE_2__","RECEIVED","FORMAT_TIME_FOR_HUMAN","FORMAT_DATE","FORMAT_DD_MMM","FORMAT_DD_MMM_YYYY","FORMAT_MMM_YYYY","SIZE_MB","NOW","ONE_MINUTE","ONE_DAY","THIRTY_MINUTES","FIFTEEN_MINUTES","RUSSIAN","CHINESE","CHINESE_HK","CHINESE_TW","GERMAN","SPANISH","ITALIAN","PORTUGUESE","DUTCH","SWEDISH","FINNISH","GREEK","KOREAN","JAPANESE","HEBREW","PERSIAN","YIDDISH","ARABIC","AFRIKAANS","_Users_asamuseu_IdeaProjects_ui_render_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_objectSpread__WEBPACK_IMPORTED_MODULE_1__","UNKNOWN","_Users_asamuseu_IdeaProjects_ui_render_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_0__","WORKING","PROFICIENT","FLUENT","1","process","__webpack_require__","__webpack_exports__","__TEST__","__BACKEND__","_constants_js__WEBPACK_IMPORTED_MODULE_0__","NODE_ENV","cwd","WebSocket","client","usersById","zxcvbn","Infinity"],"mappings":"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","file":"static/js/main.6b8b26a7.chunk.js","sourcesContent":["import { capitalize, get } from 'lodash-es'\nimport pluralizer from 'pluralize'\n\nexport const alphaNumPattern = /[^a-zA-Z0-9]/g\nexport const alphaNumIdPattern = /[^a-zA-Z0-9_-]/g\nexport const escapeRegExpPattern = /[.*+?^${}()|[\\]\\\\]/g\nexport const fileNameWithoutExtPattern = /\\.[^.$]+$/\nexport const hyphensPattern = /-+/g\nexport const hyphensTrimPattern = /^-+|-+$/g\nexport const isBase64Pattern = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/\n// Matches multiples spaces, including tabs, newline, etc.\nexport const spacesPattern = /\\s\\s+/g\n\n// Random String Generation (with increased search space to 88^n)\nconst symbols = `~!@#%^&*()[]|{}<>:;,.?-+_=` // only use safe symbols\nconst symbolRatio = symbols.length / (62 + symbols.length) // rate of symbols against alphanumeric characters\nconst upperThreshold = 1 - 26 / (62 + symbols.length) // minimum Math.random() result for upper case\nconst upperThresholdAlphaNum = 1 - 26 / 62 // minimum Math.random() result for upper case\n\n/**\n * STRING FUNCTIONS ===========================================================\n * =============================================================================\n */\n\n/**\n * Escape String for use in Regex Expression\n * @see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping\n * @param {String} string - to be sanitized\n * @returns {String} string - escaped for Regex use\n */\nexport function escapeRegExp (string) {\n\treturn string.replace(escapeRegExpPattern, '\\\\$&') // $& means the whole matched string\n}\n\n/**\n * Convert String to RegexExp (with given String being escaped first)\n * @param {String} string - to be converted to Regex\n * @param {*[]} [args] - to be passed to RegexExp initialization\n */\nexport function regexExp (string, ...args) {\n\treturn new RegExp(escapeRegExp(string), ...args)\n}\n\n/**\n * Get Cookie Value by Name from Cookie String\n *\n * @example:\n * const cookie = 'KEY=value; KEY2=value2'\n * getCookie(cookie, KEY)\n * >>> 'value'\n *\n * @param {String} cookie - whole cookie string to get value from\n * @param {String} key - cookie name to get value for\n * @return {String} value - cookie\n */\nexport function getCookie(cookie, key) {\n\tif (!cookie) return\n\tlet value = cookie.split('; ').find(string => string.indexOf(key + '=') === 0)\n\tif (!value) return\n\treturn value.split('=')[1]\n}\n\n/**\n * Get Query Parameter Value by its Key from URL String\n * @example:\n * // URL is: https://example.com?foo=man&bar=&baz\n * var foo = getParameterByKey('foo'); // \"man\"\n * var bar = getParameterByKey('bar'); // \"\" (present with empty value)\n * var baz = getParameterByKey('baz'); // \"\" (present with no value)\n * var qux = getParameterByKey('qux'); // undefined (absent)\n *\n * @param {String} key - query parameter to extract from current URL\n * @param {String} [url] - string to search query parameters, defaults to current browser URL\n * @returns {String|Undefined} - value if found, else undefined\n */\nexport function getParamByKey (key, url = window.location.href) {\n\tkey = key.replace(getParamByKeyPattern, '\\\\$&')\n\tconst regex = new RegExp('[?&]' + key + '(=([^&#]*)|&|#|$)')\n\tconst results = regex.exec(url)\n\tif (!results) return undefined\n\tif (!results[2]) return ''\n\treturn decodeURIComponent(results[2].replace(getParamByKeySpacePattern, ' '))\n}\n\nexport const getParamByKeyPattern = /[[\\]]/g\nexport const getParamByKeySpacePattern = /\\+/g\n\n/**\n * Get URI from given URL string\n * @param {String} url - to extract URI\n * @returns {String} URI\n */\nexport function pathURI (url) {\n\treturn url.split('/').pop()\n}\n\n/**\n * Check that given value is a string and is not empty\n *\n * @param {*} value - to check\n * @returns {Boolean} true - if given value is non-empty string\n */\nexport function hasStringValue(value) {\n\treturn !!value && typeof value === 'string'\n}\n\n/**\n * Checks to see if the search param exists within the string param.\n *\n * @param {string} string - haystack\n * @param {string} search - needle\n * @return {boolean}\n */\nexport function isInString(string, search) {\n\treturn string.indexOf(search) > -1\n}\n\n/**\n * Checks to see if any of the searches params exist within the string param.\n *\n * @param {string} string - haystack\n * @param searches - needles\n * @return {boolean}\n */\nexport function isInStringAny(string, ...searches) {\n\tif (typeof string !== 'string') return false\n\n\tfor (const value of searches) {\n\t\tif (string.indexOf(value) >= 0) return true\n\t}\n\n\treturn false\n}\n\n/**\n * Insert Value to String at Specified Index\n *\n * @param {string} string - the string to be inserted to\n * @param {number} index - the position to insert\n * @param {string|number} value - the string to insert\n * @returns {string}\n */\nexport function insertToString (string, index, value) {\n\tif (index > 0) return string.substring(0, index) + value + string.substring(index, string.length)\n\treturn value + string\n}\n\n/**\n * Check if Given Value is a Base64 Encoded String\n * @note: cache regex pattern for faster search on large strings\n * @param {String} string - value to check\n * @returns {Boolean} true - if it is a valid Base64 encoded string\n */\nexport function isBase64 (string) {\n\treturn isBase64Pattern.test(string)\n}\n\n/**\n * Check if given string is a File URL or Path.\n * Helps to determine if File.src is URL or Path string vs. base64 encoded string.\n * @param {String} string - to check\n * @returns {Boolean} true - if string contains a dot '.', because a file always needs extension\n */\nexport function isFileSrc (string) {\n\treturn !!string && string.indexOf('.') > -1\n}\n\n/**\n * Check if Given String is a Valid IP v4 Address\n *\n * @param {*} address - value to check\n * @returns {Boolean} true - if value given is a valid IP address string\n */\nexport function isIpAddress (address) {\n\treturn typeof address === 'string' && isIpAddressPattern.test(address)\n}\n\nexport const isIpAddressPattern = new RegExp(\n\t'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}' +\n\t'([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])\\\\.)' +\n\t'*([A-Za-z]|[A-Za-z][A-Za-z0-9\\\\-]*[A-Za-z0-9])$|^\\\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|((' +\n\t'[0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1' +\n\t'\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\\\d|1' +\n\t'\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}' +\n\t'(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)' +\n\t'(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|' +\n\t'((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?' +\n\t'\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|' +\n\t'2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}' +\n\t'(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]' +\n\t'|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]' +\n\t'|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:)))(%.+)?\\\\s*$'\n)\n\n/**\n * Check if given string is a valid Phone Number\n *\n * @param {String} string - value to check\n * @returns {Boolean} true - if is valid phone number\n */\nexport function isPhoneNumber(string) {\n\treturn isPhoneNumberPattern.test(string)\n}\n\nexport const isPhoneNumberPattern = /^\\+[0-9()\\-\\s]+$/\n\n/**\n * Check if given value is a String\n * @param {*} value - to check\n * @returns {Boolean} true - if it's a string\n */\nexport function isString(value) {\n\treturn typeof value === 'string'\n}\n\n/**\n * Interpolate a Template String with given Variables\n * @example:\n * interpolateString('key.{id}.name', {id: 'user'})\n * >>> 'key.user.name'\n *\n * interpolateString('key.{state.id}.name', {state: {id: 'user'}})\n * >>> 'key.user.name'\n *\n * interpolateString('key.{state.id,0}.name', {})\n * >>> 'key.0.name'\n *\n * interpolateString('key.{id}.name', {$id: 'user'}, {formatKey: '$key'})\n * >>> 'key.user.name'\n *\n * @param {String} string - template with '{placeholders}' to interpolate\n * @param {Object} variables - object containing keys matching the names of placeholders to interpolate\n * @param {String} [formatKey] - key format to match in given 'variables' (e.g. format = '$key')\n * @param {String} [name] - function name to use in case error is thrown\n * @param {Boolean} [suppressError] - whether to ignore error when replacement string not found, and leave as is\n * @return {String} output - with interpolated variables\n */\nexport function interpolateString (string, variables = {}, {formatKey, name, suppressError} = {}) {\n\treturn string.replace(interpolateStringPattern, (__, match) => {\n\t\tlet key = match\n\t\tif (formatKey) key = formatKey.replace('key', key)\n\t\t// noinspection JSCheckFunctionSignatures\n\t\tconst result = get(variables, ...key.split(','))\n\t\tif (result === void 0) {\n\t\t\tif (!suppressError && !variables.hasOwnProperty(key.split(',')[0])) {\n\t\t\t\tthrow new Error(`${name || interpolateString.name + '()'} expects variable '${key}', got '${variables[key]}'`)\n\t\t\t}\n\t\t\treturn `{${match}}`\n\t\t}\n\t\treturn result\n\t})\n}\n\nexport const ips = interpolateString\nexport const interpolateStringPattern = /{([^{}]+)}/g\n\n/**\n * Remove brackets around strings (add a dot before it, except when bracket is the first character)\n *\n * @example:\n * formatKeyPath('object[string]') // 'object.string'\n *\n * @param {string} keyPath - the path string to format\n */\nexport function formatKeyPath(keyPath) {\n\treturn keyPath.replace(\n\t\tformatKeyPathPattern, (match, match1, match2, match3, offset) => (offset > 0 ? '.' : '') + String(match2)\n\t)\n}\n\nexport const formatKeyPathPattern = /(\\[)(.*?)(\\])/g\n\n/**\n * Get File Name Format Extension from String\n *\n * @param {string} fileName - full file name with format extension (ex. 'image.png')\n * @returns {string} extension - file format if exists (ex. 'png') or empty string if it does not\n */\nexport function fileFormat (fileName) {\n\tconst array = fileName.split('.')\n\treturn array.length > 1 ? array.pop() : ''\n}\n\n/**\n * Get File Extension used in Backend from User submitted file name\n *\n * @param {String|Null|Undefined} fileName - to extract extension\n * @returns {String|Undefined} file format extension, or empty string, or undefined\n */\nexport function fileFormatNormalized (fileName) {\n\tif (!fileName) return\n\tconst ext = fileFormat(toLowerCase(fileName))\n\tswitch (ext) {\n\t\tcase 'jpeg':\n\t\tcase 'jpg':\n\t\t\treturn 'jpg'\n\t\tdefault:\n\t\t\treturn ext\n\t}\n}\n\n/**\n * Get File Name without Extension String\n *\n * @param {string} fileName - full file name with extension\n */\nexport function fileNameWithoutExt (fileName) {\n\treturn fileName.replace(fileNameWithoutExtPattern, '')\n}\n\n/**\n * Convert Data URL, such as Base64 Image string to JS File object\n * @param {String} dataUrl\n * @param {String} filename\n * @returns {File} file - object\n */\nexport function fileFromDataUrl (dataUrl, filename) {\n\tconst arr = dataUrl.split(',')\n\tconst mime = arr[0].match(/:(.*?);/)[1]\n\tconst str = atob(arr[1])\n\tlet n = str.length\n\tconst u8arr = new Uint8Array(n)\n\n\twhile (n--) {\n\t\tu8arr[n] = str.charCodeAt(n)\n\t}\n\n\treturn new File([u8arr], filename, {type: mime})\n}\n\n/**\n * Get File Mime Type from Data URL\n * @param {String} dataUrl - see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n * @returns {String|undefined} mime type\n */\nexport function mimeTypeFromDataUrl (dataUrl) {\n\treturn dataUrl.split(',')[0].match(/:(.*?);/)[1]\n}\n\n/**\n * Get hostname from URL string\n *\n * @param {string} url - to extract hostname\n * @return {string} - hostname\n */\nexport function hostname (url) {\n\tlet hostname\n\n\t// find & remove protocol (http, ftp, etc.) and get hostname\n\tif (url.indexOf('://') > -1) {\n\t\thostname = url.split('/')[2]\n\t} else {\n\t\thostname = url.split('/')[0]\n\t}\n\n\t// find & remove port number\n\thostname = hostname.split(':')[0]\n\n\t// find & remove \"?\"\n\thostname = hostname.split('?')[0]\n\n\treturn hostname\n}\n\n/**\n * Get Matching Substring Between Two Strings\n *\n * @example:\n * matchBetween('cool_black__hat', '_', '__')\n * >>> 'black'\n *\n * @param {string} string - to match against\n * @param {string} before - string preceding the match\n * @param {string} after - string succeeding the match\n * @returns {string} - matching string between `before` and `after` strings if found, or an empty string if not\n */\nexport function matchBetween(string, before, after) {\n\treturn get(string.match(`${before}(.*)${after}`), '[1]') || ''\n}\n\n/**\n * Convert two strings or numbers into one scrambled string, deterministically\n *\n * @param {string|number} str1\n * @param {string|number} str2\n * @returns {string} - scrambled characters from provided values\n */\nexport function mergeStrings(str1, str2) {\n\tstr1 = String(str1)\n\tstr2 = String(str2)\n\tconst strLong = (str1.length >= str2.length ? str1 : str2).split('').reverse()\n\tconst strShort = (str1.length > str2.length ? str2 : str1).split('')\n\treturn strLong\n\t\t.map((char, index) => {\n\t\t\treturn strShort[index] != null ? char + strShort[index] : char + strShort[index % strShort.length]\n\t\t})\n\t\t.join('')\n}\n\n/**\n * Pad Left given String with Template String\n *\n * @param {String} string - to be padded, example 7\n * @param {String} padTemplate - example: '000'\n * @return {String} padded with template - example: '007'\n */\nexport function padStringLeft (string, padTemplate) {\n\treturn `${padTemplate}${string}`.slice(-(Math.max(string.length, padTemplate.length)))\n}\n\n/**\n * Pad Right given String with Template String\n *\n * @param {String} string - to be padded, example 7\n * @param {String} padTemplate - example: '000'\n * @return {String} padded with template - example: '700'\n */\nexport function padStringRight (string, padTemplate) {\n\treturn `${string}${padTemplate}`.substr(0, Math.max(string.length, padTemplate.length))\n}\n\n/**\n * Converts the given singular word to it's plural version\n *\n * @example\n * plural('butterfly')\n * >>> 'butterflies'\n *\n * @uses pluralize\n * @see {@link https://github.com/blakeembrey/pluralize} for further information\n *\n * @param {string} string\n */\nexport function plural(string) {\n\treturn pluralizer.plural(string)\n}\n\n/**\n * Pluralize or singularize a word based on count\n *\n * @uses pluralize\n * @see {@link https://github.com/blakeembrey/pluralize} for further information\n *\n * @param {string} word - The word to pluralize/singularize\n * @param {number} count - A count\n * @param {boolean} [shouldIncludeCount] - If true will prefix the given count to the word\n * @return {string} - A new string\n */\nexport function pluralize(word, count, shouldIncludeCount) {\n\treturn pluralizer(word, count, shouldIncludeCount)\n}\n\n/**\n * Get a random Character from provided string\n *\n * @param {String} string\n * @returns {String} character\n */\nexport function randomFromString(string) {\n\treturn string.charAt(Math.floor(Math.random() * string.length))\n}\n\n/**\n * Create a Random ASCII String with Random length within given min - max range\n *\n * @param {Number} [min] - length\n * @param {Number} [max] - length\n * @param {Boolean} [alphaNum] - whether to create alphanumeric string only\n * @param {Boolean} [hex] - whether to create hex string only\n * @returns {String} random - ASCII compliant string\n */\nexport function randomString (min = 32, max = 64, {alphaNum = false, hex = false} = {}) {\n\tconst searchSpace = hex ? 16 : 36\n\tconst uppercase = alphaNum ? upperThresholdAlphaNum : upperThreshold\n\treturn [...Array(randomNumberInRange(min, max))]\n\t\t.map(() => {\n\t\t\tconst random = Math.random()\n\t\t\tif (!alphaNum && !hex && random < symbolRatio) return randomFromString(symbols)\n\t\t\tconst string = (~~(random * searchSpace)).toString(searchSpace)\n\t\t\treturn !hex && random > uppercase ? string.toUpperCase() : string\n\t\t})\n\t\t.join('')\n}\n\nrandomString.history = []\n\n/**\n * Hash ASCII String using SHA256\n *\n * @param {String} ascii - compliant\n * @returns {String} digest - hashed to 64 characters long\n */\nexport function sha256(ascii) {\n\tfunction rightRotate(value, amount) {\n\t\treturn (value >>> amount) | (value << (32 - amount))\n\t}\n\n\tconst mathPow = Math.pow\n\tconst maxWord = mathPow(2, 32)\n\tconst lengthProperty = 'length'\n\tlet i, j // Used as a counter across the whole file\n\tlet result = ''\n\n\tconst words = []\n\tconst asciiBitLength = ascii[lengthProperty] * 8\n\n\t//* caching results is optional - remove/add slash from front of this line to toggle\n\t// Initial hash value: first 32 bits of the fractional parts of the square roots of the first 8 primes\n\t// (we actually calculate the first 64, but extra values are just ignored)\n\tlet hash = (sha256.h = sha256.h || [])\n\t// Round constants: first 32 bits of the fractional parts of the cube roots of the first 64 primes\n\tconst k = (sha256.k = sha256.k || [])\n\tlet primeCounter = k[lengthProperty]\n\t/*/\n const hash = [], k = [];\n const primeCounter = 0;\n //*/\n\n\tconst isComposite = {}\n\tfor (let candidate = 2; primeCounter < 64; candidate++) {\n\t\tif (!isComposite[candidate]) {\n\t\t\tfor (i = 0; i < 313; i += candidate) {\n\t\t\t\tisComposite[i] = candidate\n\t\t\t}\n\t\t\thash[primeCounter] = (mathPow(candidate, 0.5) * maxWord) | 0\n\t\t\tk[primeCounter++] = (mathPow(candidate, 1 / 3) * maxWord) | 0\n\t\t}\n\t}\n\n\tascii += '\\x80' // Append Ƈ' bit (plus zero padding)\n\twhile ((ascii[lengthProperty] % 64) - 56) ascii += '\\x00' // More zero padding\n\tfor (i = 0; i < ascii[lengthProperty]; i++) {\n\t\tj = ascii.charCodeAt(i)\n\t\tif (j >> 8) return // ASCII check: only accept characters in range 0-255\n\t\twords[i >> 2] |= j << (((3 - i) % 4) * 8)\n\t}\n\twords[words[lengthProperty]] = (asciiBitLength / maxWord) | 0\n\twords[words[lengthProperty]] = asciiBitLength\n\n\t// process each chunk\n\tfor (j = 0; j < words[lengthProperty]; ) {\n\t\tconst w = words.slice(j, (j += 16)) // The message is expanded into 64 words as part of the iteration\n\t\tconst oldHash = hash\n\t\t// This is now the undefined working hash\", often labelled as variables a...g\n\t\t// (we have to truncate as well, otherwise extra entries at the end accumulate\n\t\thash = hash.slice(0, 8)\n\n\t\tfor (i = 0; i < 64; i++) {\n\t\t\t// Expand the message into 64 words\n\t\t\t// Used below if\n\t\t\tconst w15 = w[i - 15],\n\t\t\t\tw2 = w[i - 2]\n\n\t\t\t// Iterate\n\t\t\tconst a = hash[0],\n\t\t\t\te = hash[4]\n\t\t\tconst temp1 =\n\t\t\t\thash[7] +\n\t\t\t\t(rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25)) + // S1\n\t\t\t\t((e & hash[5]) ^ (~e & hash[6])) + // ch\n\t\t\t\tk[i] +\n\t\t\t\t// Expand the message schedule if needed\n\t\t\t\t(w[i] =\n\t\t\t\t\ti < 16\n\t\t\t\t\t\t? w[i]\n\t\t\t\t\t\t: (w[i - 16] +\n\t\t\t\t\t\t (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15 >>> 3)) + // s0\n\t\t\t\t\t\t\t\tw[i - 7] +\n\t\t\t\t\t\t\t\t(rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2 >>> 10))) | // s1\n\t\t\t\t\t\t 0)\n\t\t\t// This is only used once, so *could* be moved below, but it only saves 4 bytes and makes things unreadble\n\t\t\tconst temp2 =\n\t\t\t\t(rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22)) + // S0\n\t\t\t\t((a & hash[1]) ^ (a & hash[2]) ^ (hash[1] & hash[2])) // maj\n\n\t\t\thash = [(temp1 + temp2) | 0].concat(hash) // We don't bother trimming off the extra ones, they're harmless as long as we're truncating when we do the slice()\n\t\t\thash[4] = (hash[4] + temp1) | 0\n\t\t}\n\n\t\tfor (i = 0; i < 8; i++) {\n\t\t\thash[i] = (hash[i] + oldHash[i]) | 0\n\t\t}\n\t}\n\n\tfor (i = 0; i < 8; i++) {\n\t\tfor (j = 3; j + 1; j--) {\n\t\t\tconst b = (hash[i] >> (j * 8)) & 255\n\t\t\tresult += (b < 16 ? 0 : '') + b.toString(16)\n\t\t}\n\t}\n\treturn result\n}\n\n/**\n * Encode given String to HEX format\n *\n * @param {String} string - to encode\n * @returns {String} hex - encoded string\n */\nexport function toHex(string) {\n\tlet hex\n\tlet result = ''\n\tfor (let i = 0; i < string.length; i++) {\n\t\thex = string.charCodeAt(i).toString(16)\n\t\tresult += ('000' + hex).slice(-4)\n\t}\n\treturn result\n}\n\n/**\n * Convert String to Alpha Numeric Characters\n *\n * @param {String} string - to convert\n * @returns {String} - with alpha numeric characters only\n */\nexport function toAlphaNum(string) {\n\treturn string.replace(alphaNumPattern, '')\n}\n\n/**\n * Convert String to Alpha Numeric Characters with dashes and underscores\n *\n * @param {String} string - to convert\n * @returns {String} - with alpha numeric characters, dash and underscore only\n */\nexport function toAlphaNumId(string) {\n\treturn string.replace(alphaNumIdPattern, '')\n}\n\n/**\n * Sanitize String for use in URL without encoding.\n * @param {String} string - to sanitize, can contain any characters\n * @returns {String} URI - sanitized for browser URL, without encoding/decoding\n */\nexport function toURI (string) {\n\treturn string && string.replace(spacesPattern, '-') // remove spaces/newlines before stripping special characters\n\t\t.replace(alphaNumIdPattern, '-') // convert all invalid characters to hyphen\n\t\t.replace(hyphensPattern, '-') // may have hyphen at the start or end\n\t\t.replace(hyphensTrimPattern, '')\n\t\t.toLowerCase()\n}\n\n/**\n * Truncate a String to Given Character Length, Showing the Last n Characters at the End\n *\n * @param {String} string - to truncate with ellipses\n * @param {Number} [length] - number of characters to keep in total\n * @param {Number} [lastChars] - number of characters to keep at the end\n * @returns {String} string - truncated to given total length\n */\nexport function truncate(string, length = 15, lastChars = 3) {\n\tif (string.length <= length) return string\n\tconst firstChars = length - lastChars - 3\n\tif (firstChars < 1) return string\n\treturn string.substr(0, firstChars) + '...' + string.substr(string.length - lastChars, lastChars)\n}\n\n/**\n * Convert All Characters to lower case\n * @param {String|*} string - value to make lower case\n * @returns {String|*} - in lower case\n */\nexport function toLowerCase (string) {\n\treturn string && string.toLowerCase()\n}\n\n/**\n * Convert Any Value type to lower case String\n * @param {*} value - make lower case\n * @returns {String} value - in lower case\n */\nexport function toLowerCaseAny (value) {\n\treturn String(value).toLowerCase()\n}\n\n/**\n * Convert All Characters to UPPER CASE\n * @param {String|*} string - value to make upper case\n * @returns {String|*} - in upper case\n */\nexport function toUpperCase (string) {\n\treturn string && string.toUpperCase()\n}\n\n/**\n * Convert Any Value type to UPPER CASE String\n * @param {*} value - make UPPER CASE\n * @returns {String} value - in UPPER CASE\n */\nexport function toUpperCaseAny (value) {\n\treturn String(value).toUpperCase()\n}\n\n/**\n * Trim spaces at the start and end of String, and convert multiples spaces,\n * including tabs, newline, etc. in between to a single space.\n * @param {String|*} string - to trim\n * @returns {String|*} string - trimmed\n */\nexport function trimSpaces (string) {\n\treturn string && string.replace(spacesPattern, ' ').trim()\n}\n\n/**\n * Create RFC4122 Complaint Version 4 UUID\n *\n * @see: https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n * @returns {String} uuid - in this format 'xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx'\n */\nexport function uuid () {\n\tconst d0 = (Math.random() * 0xffffffff) | 0\n\tconst d1 = (Math.random() * 0xffffffff) | 0\n\tconst d2 = (Math.random() * 0xffffffff) | 0\n\tconst d3 = (Math.random() * 0xffffffff) | 0\n\treturn (\n\t\tlut[d0 & 0xff] +\n\t\tlut[(d0 >> 8) & 0xff] +\n\t\tlut[(d0 >> 16) & 0xff] +\n\t\tlut[(d0 >> 24) & 0xff] +\n\t\t'-' +\n\t\tlut[d1 & 0xff] +\n\t\tlut[(d1 >> 8) & 0xff] +\n\t\t'-' +\n\t\tlut[((d1 >> 16) & 0x0f) | 0x40] +\n\t\tlut[(d1 >> 24) & 0xff] +\n\t\t'-' +\n\t\tlut[(d2 & 0x3f) | 0x80] +\n\t\tlut[(d2 >> 8) & 0xff] +\n\t\t'-' +\n\t\tlut[(d2 >> 16) & 0xff] +\n\t\tlut[(d2 >> 24) & 0xff] +\n\t\tlut[d3 & 0xff] +\n\t\tlut[(d3 >> 8) & 0xff] +\n\t\tlut[(d3 >> 16) & 0xff] +\n\t\tlut[(d3 >> 24) & 0xff]\n\t)\n}\n\nconst lut = []\nfor (let i = 0; i < 256; i++) {\n\tlut[i] = (i < 16 ? '0' : '') + i.toString(16)\n}\n\n// LODASH CLONES\n// -----------------------------------------------------------------------------\n\nexport {\n\t/**\n\t * A wrapper around the lodash's capitalize function\n\t *\n\t * @uses lodash\n\t * @see {@link https://lodash.com/docs/4.17.4#capitalize} for further information.\n\t *\n\t * @param {string} string - the string to capitalize\n\t * @returns {string} - the capitalized string\n\t */\n\t\tcapitalize,\n}\n\nfunction randomNumberInRange (min, max) {\n\treturn Math.floor(Math.random() * (max - min + 1)) + min\n}\n","import {\n difference,\n flatten,\n get,\n intersection,\n isEqual,\n isPlainObject,\n max,\n min,\n some,\n union,\n unionBy,\n unionWith,\n uniqWith,\n} from 'lodash-es'\nimport thenby from 'thenby'\nimport { toLowerCaseAny } from './string.js'\n\n/**\n * ARRAY FUNCTIONS =============================================================\n * =============================================================================\n */\n\n/**\n * Check if the data passed is an array and has values.\n *\n * @param {*} data - The variable to check\n * @return {boolean}\n */\nexport function hasListValue (data) {\n return (isList(data) && data.length > 0)\n}\n\n/**\n * Check if given lists have at least one intersecting value in each list\n *\n * @param {Array[]} lists - array of arrays to test\n * @return {boolean} - true if a common value is found among given lists\n */\nexport function hasCommonListValue (...lists) {\n // Find the list with the shortest length\n let listLength = Infinity\n let shortestList = []\n lists.forEach(list => {\n if (list.length < listLength) {\n listLength = list.length\n shortestList = list\n }\n })\n\n // If at least one value found among all lists, skip the loop and return true\n return shortestList.some(value => {\n // If value does not exist in at least one list, skip to next value\n return !lists.some(list => !isInList(list, value))\n })\n}\n\n/**\n * Check if given list contains primitive duplicate values\n * @Note: array.indexOf(NaN) always returns -1, even if the array has `NaN` value\n * @param {*[]} array - to check for duplicates\n * @returns {Boolean} true - if duplicate found\n */\nexport function hasDuplicateInList (array) {\n return array.some((value, index, self) => self.indexOf(value) !== index)\n}\n\n/**\n * Get All Indexes of Value in Array\n * @param {Array<*>} list - to search for index list\n * @param {*} value - to find indexes for\n * @returns {Number[]} index - list of value indexes, or empty array if nothing found\n */\nexport function indexesOf (list, value) {\n let indices = [], i = -1\n while ((i = list.indexOf(value, i + 1)) !== -1) {\n indices.push(i)\n }\n return indices\n}\n\n/**\n * Check if the data passed is an array or plain object.\n *\n * @param {*} data - The variable to check\n * @return {boolean}\n */\nexport function isCollection (data) {\n return (!!data && (data.constructor === Array || isPlainObject(data)))\n}\n\n/**\n * Check if Given Arrays are Equal in Values by Element References\n *\n * @param {Array|*} a\n * @param {Array|*} b\n * @returns {Boolean} true - if all elements of `a` are equal to all elements of `b` using exact equality match\n */\nexport function isEqualList (a, b) {\n if (a === b) return true\n if (a && b && a.length !== b.length) return false\n if (!a || !b) return false\n for (const i in a) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n\n/**\n * Check if the data passed is an array.\n *\n * @param {*} data - The variable to check\n * @return {boolean}\n */\nexport function isList (data) {\n return (!!data && data.constructor === Array)\n}\n\n/**\n * Check if the value passed exists within the array passed.\n *\n * @param {Array} array - haystack\n * @param {*} value - needle\n * @return {boolean}\n */\nexport function isInList (array, value) {\n return array.indexOf(value) >= 0\n}\n\n/**\n * Check if any of the values passed in via ...args exists within the array passed.\n *\n * @param {Array} array - the array to search for the values\n * @param {*} args - the values to search for\n */\nexport function isInListAny (array, ...args) {\n for (const value of args) {\n if (array.indexOf(value) >= 0) {\n return true\n }\n }\n return false\n}\n\n/**\n * Check if a given Element exists in the Collection, with shallow include match\n *\n * @uses lodash\n * @see {@link https://lodash.com/docs/4.17.2#some} for further information.\n * @return {Boolean} true - if element found in given collection with shallow include match\n */\nexport function isInCollection (collection, element) {\n return some(collection, element)\n}\n\n/**\n * Check if any given Element exists in the Collection, with shallow include match\n *\n * @example:\n * isInCollectionAny([{name: 'god', age: 'eternal'}], {name: 'dog'}, {name: 'god'})\n * >>> true\n *\n * @param {Array|Object} collection - to search from\n * @param {*} elements - to search for\n * @return {boolean} true - if any of the given elements found in the collection\n */\nexport function isInCollectionAny (collection, ...elements) {\n for (const element of elements) {\n if (isInCollection(collection, element)) return true\n }\n return false\n}\n\n/**\n * Compare two Arrays and determine if they have the same values\n * @param array1\n * @param array2\n */\nexport function isSameList (array1, array2) {\n return isEqual(array1.sort(), array2.sort())\n}\n\n/**\n * Creates an array with all falsey values removed\n * (values false, null, 0, \"\", undefined, and NaN are falsey)\n *\n * @param {Array} array - the array to clean from falsey values\n * @return {Array} - returns the new array of filtered values\n */\nexport function cleanList (array) {\n return array.filter(v => v)\n}\n\n/**\n * Converts Any Value to Array (or keep it as is if already Array)\n *\n * @param {*} value - the value to convert\n * @param {*} [clean] - if truthy, remove falsey values: false, null, 0, \"\", undefined, and NaN\n * @return {Array}\n */\nexport function toList (value, clean) { // eslint-disable-line no-shadow\n if (!isList(value)) value = [value]\n return clean ? value.filter(v => v) : value\n}\n\n/**\n * Compute the Average Number from Array Elements\n *\n * @param {Array} array - list of numbers to calculate average of\n * @returns {number} - the average value\n */\nexport function toListAvg (array) {\n let sum = 0\n for (const value of array) {\n sum += value\n }\n return (sum / array.length)\n}\n\n/**\n * Compute the Total Number from Array Elements\n * @Note: ~2.5 times faster than array.reduce() in Node.js\n * @example:\n * toListTotal([1, 2])\n * >>> 3\n *\n * @param {Array} array - list of numbers to calculate total of\n * @returns {number} total - value of all elements\n */\nexport function toListTotal (array = []) {\n let sum = 0\n for (const value of array) {\n sum += value\n }\n return sum\n}\n\n/**\n * Compute the Total Number from Array Element Values\n * @Note: ~2.5 times faster than array.reduce() in Node.js\n * @example:\n * toListValuesTotal([{count: 1}, {count: 2}], 'count')\n * >>> 3\n *\n * @param {Array} array - list of objects to calculate total values for\n * @param {String} [key] - object key to extract values from\n * @param {Number} [fallback] - default value to use when not a number encountered\n * @returns {Number} total - of all element values\n */\nexport function toListValuesTotal (array = [], key = 'value', fallback = 0) {\n let sum = 0\n for (const obj of array) {\n sum += obj[key] || fallback\n }\n return sum\n}\n\n/**\n * Ensures the array has unique values, including nested objects.\n *\n * @uses lodash\n * @see https://lodash.com/docs/#uniqWith\n * @example\n before [1, 2, 2, {a: 5, b: {c: 6}}, {a: 5, b: {c: 6}}];\n after [1, 2, {a: 5, b: {c: 6}}];\n * @param {Array} array - the array to enforce unique values for\n * @return {Array}\n */\nexport function toUniqueList (array) {\n return uniqWith(toList(array), isEqual)\n}\n\n/**\n * Ensure array has only unique primitive values.\n *\n * @param {Array} array - the array to enforce unique primitive values for\n * @return {Array} - new array\n */\nexport function toUniqueListFast (array) {\n return array.filter((value, index, self) => self.indexOf(value) === index)\n}\n\n/**\n * Ensure array has only unique values case insensitive keeping the first occurrence of duplicates.\n *\n * @param {Array<*>} array - the array to enforce unique values for (can be mix of value types)\n * @return {Array<*>} list - new array containing only unique values, case insensitive\n */\nexport function toUniqueListCaseInsensitive (array) {\n const listLower = array.map(toLowerCaseAny)\n return array.filter((v, i) => listLower.indexOf(toLowerCaseAny(v)) === i)\n}\n\n/**\n * Merge two arrays into one, with objects containing only unique key, keeping the value from the first array\n * @Note: this method is faster than `array.filter((val, _, self) => self.find(i => i[key] === val[key]) === val)`\n * by about x5 times\n *\n * @param {Array} newList - list of new objects to keep\n * @param {Array} oldList - list of old objects to be updated\n * @param {string} key - objects's key that needs to be unique\n * @returns {Array} list - of unique objects\n */\nexport function toUniqueListByKey (newList, oldList, key) {\n return unionBy(newList, oldList, key)\n}\n\n/**\n * Add value to the beginning of Array, optionally trimming its length to provided limit\n *\n * @param {Array} array - to prepend to\n * @param {*} value - to prepend to `array`\n * @param {number} [limit] - optionally trim array to this length\n */\nexport function prependToList (array, value, limit) {\n const result = [value, ...array]\n if (limit && result.length > limit) result.length = limit\n return result\n}\n\n/**\n * Merge Arrays into a single List with unique values keeping orders given (using SameValueZero comparison)\n *\n * @param {Array} arrays - lists to combine (if not array given, it will be ignored without error)\n * @returns {Array} - merged list with unique values\n */\nexport function mergeLists (...arrays) {\n return union(...arrays)\n}\n\n/**\n * Remove Value from Array if found, without mutation\n *\n * @param {Array } listToKeep - list of values to search from\n * @param {String|Number|Array} valueToRemove - to remove\n * @return {Array} - new array with value removed\n */\nexport function removeFromList (listToKeep, valueToRemove) {\n // Value is Array\n if (isList(valueToRemove)) return difference(listToKeep, valueToRemove)\n\n // Value is of primitive type\n const result = [...listToKeep]\n const index = listToKeep.indexOf(valueToRemove)\n if (index > -1) result.splice(index, 1)\n return result\n}\n\n/**\n * Get the first element of an array, or return the value if it's not array\n *\n * @param {Array|*} array - The array to query\n * @returns {*} - The first element of the array\n */\nexport function firstListValue (array) {\n return isList(array) ? array[0] : array\n}\n\n/**\n * Gets the first value of array\n *\n * @param {Array} array - The array to query\n * @return {*} - The last element of the given array\n */\nexport function first (array) {\n return array[0]\n}\n\n/**\n * Gets the last value of array\n *\n * @param {Array} array - The array to query\n * @return {*} - The last element of the given array\n */\nexport function last (array) {\n return array[array.length - 1]\n}\n\n/**\n * Get a random value from provided list\n */\nexport function randomFromList (array) {\n return array[Math.floor(Math.random() * array.length)]\n}\n\n/**\n * Get a random value from provided list, removing it from the list\n */\nexport function randomFromListExtract (array) {\n const index = Math.floor(Math.random() * array.length)\n return array.splice(index, 1)[0]\n}\n\nexport function listAlphabetically (array) {\n return array.sort(sortAscending)\n}\n\n/**\n * Array.reduce callback to convert list of objects with .id attributes to a key-value hashmap object\n * @example:\n * [{id: \"unique\", name: \"test\"}].reduce(listToMap, {})\n * >>> {\"unique\": {id: \"unique\", name: \"test\"}}\n *\n * @returns {Object} object with element.id being keys, and elements of original array being values\n */\nexport function listToMap (obj, data) {\n obj[data.id] = data\n return obj\n}\n\n/**\n * Sort List in Ascending Order\n * (Fastest)\n *\n * @example:\n * array.sort(sortAscending)\n *\n * @param {*} a - first value in the iteration\n * @param {*} b - second value in the iteration\n * @return {number} - whether values should be re-arranged\n */\nexport function sortAscending (a, b) {\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n\n/**\n * Sort List in Descending Order\n * (Fastest)\n *\n * @example:\n * array.sort(sortDescending)\n *\n * @param {*} a - first value in the iteration\n * @param {*} b - second value in the iteration\n * @return {number} - whether values should be re-arranged\n */\nexport function sortDescending (a, b) {\n if (a < b) return 1\n if (a > b) return -1\n return 0\n}\n\n/**\n * Sort List by Object Property\n * (Fastest)\n *\n * @example:\n * array.sort(sort('name', 'asc'))\n *\n * @param {String} [key] - property value used to compare for sorting\n * @param {String} [order] - enum ['asc', 'desc']\n * @return {Function} - to be used as argument for native Array.sort()\n */\nexport function sort (key, order = 'asc') {\n const sortFunc = order === 'asc' ? sortAscending : sortDescending\n return (a, b) => sortFunc(a[key], b[key])\n}\n\n/**\n * Sort List By Object Properties or custom sort Function (with optional chaining)\n * (Moderately Fast)\n *\n * @example:\n * // sort objects by descending 'name' length property, then by descending 'name', then by given function,\n * // useful in situations when 'name' is a string containing numbers\n * array.sort(by('-name.length', '-name', (a, b) => a.localCompare(b)))\n *\n * @param {String|Function} args - compare function, object Key, or Path (prepend string with '-' for descending)\n */\nexport function by (...args) {\n return (a, b) => {\n let result = 0\n\n // Loop through given sort arguments\n for (let key of args) {\n if (key.constructor === String) {\n if (key.indexOf('-') === 0) {\n key = key.substring(1)\n if (key.indexOf('.') > 0) {\n result = sortDescending(get(a, key), get(b, key))\n } else {\n result = sortDescending(a[key], b[key])\n }\n } else {\n if (key.indexOf('.') > 0) {\n result = sortAscending(get(a, key), get(b, key))\n } else {\n result = sortAscending(a[key], b[key])\n }\n }\n\n // exit function when has sorting to perform,\n // else keep looping to the next sort argument\n if (result) return result\n } else if (key.constructor === Function) {\n result = key(a, b)\n\n // exit function when has sorting to perform,\n // else keep looping to the next sort argument\n if (result) return result\n }\n }\n\n return result\n }\n}\n\n/**\n * Helper to sort arrays on multiple keys. Can compose like sortBy().thenBy().thenBy()\n * @NOTE: this methods is much slower than writing native sort function, use it for convenience only\n *\n * @uses thenby\n * @see {@link https://github.com/Teun/thenBy.js} for further information\n *\n * @example\n * array.sort(firstBy((a, b) => (a > b ? -1 : 1)).thenBy('id'))\n * >>> a will appear before b, then sorted by id alphabetically\n *\n * @param {Function|string} sort - A sorting compare function or, in the case of a string, an object attribute to sort by\n * @param {Object|number} options - An object of options for sorting, or in the case of a number, the sort direction\n * @return {Function} - A new sortBy function\n */\nexport function firstBy (sort, options) {\n return thenby(sort, options)\n}\n\n/**\n * Randomize List Value Orders by mutation\n *\n * @param {Array} list - to shuffle values for\n * @return {Array} list - mutated with shuffled values\n */\nexport function shuffle (list) {\n for (let i = list.length - 1; i > 0; i--) {\n let j = Math.floor(Math.random() * (i + 1));\n [list[i], list[j]] = [list[j], list[i]]\n }\n return list\n}\n\n// LODASH CLONES\n// -----------------------------------------------------------------------------\n\nexport {\n min,\n max,\n\n /**\n * Creates an array of array values not included in the other given arrays\n */\n difference,\n\n /**\n * Create a new list of values that exist in all given lists using SameValueZero equality check.\n * The order and references of result values are determined by the first array.\n *\n * @param {Array} args - lists to check for intersection\n * @return {Array} list - of common values\n */\n intersection,\n\n /**\n * Creates an array of unique values from all given arrays using the provided 'comparator' function\n * to determine value equality\n *\n * @uses lodash\n * @see {@link https://lodash.com/docs/4.17.4#unionWith} for further information.\n *\n * @param {...Array} arrays - The arrays to inspect\n * @param {Function} comparator - The comparator invoked per element\n * @return {Array} - The new array of combined values\n */\n unionWith,\n}\n\n/**\n * Flatten an Array a single level deep\n *\n * @param {Array} array - The array to flatten\n * @return {Array} - The new flattened array\n */\nexport const toFlatList = flatten\n","import { hasListValue } from './array.js'\nimport { isInString } from './string.js'\n\n/**\n * NUMBER FUNCTIONS ============================================================\n * =============================================================================\n */\n\n/**\n * Checks if value is classified as a Number primitive or object.\n *\n * Note: To exclude Infinity, -Infinity, and NaN,\n * which are classified as numbers, use the isFinite method.\n *\n * @example\n * isNumber(3)\n * >>> true\n * isNumber(Number.MIN_VALUE)\n * >>> true\n * isNumber(Infinity)\n * >>> true\n * isNumber('3')\n * >>> false\n *\n * @param {*} val - The value to check.\n * @returns {boolean} - Returns true if value is a number, else false.\n */\nexport { isNumber } from 'lodash-es'\n\n/**\n * Returns true if the given variable is a number,\n * including if it's data type is not a number eg. '1'\n *\n * @example\n isNumeric('1') // NOTE: isNumber('1') would return false\n >>> true\n isNumeric('a')\n >>> false\n *\n * @param {*} val\n * @returns {boolean}\n */\nexport function isNumeric(val) {\n\treturn !isNaN(parseFloat(val)) && isFinite(val) // must use parseFloat, cannot use the faster Number()\n}\n\n/**\n * Check if given list of {from: Number, to: Number} is in continuous incrementing order\n * (useful for checking schedules of time durations in milliseconds)\n *\n * @param {Array<{from: Number, to: Number}>} arrayOfNumberRanges - to check for validity\n * @returns {Boolean} true - if it is a continuously incrementing ranges of numbers\n */\nexport function isContinuousNumberRanges(arrayOfNumberRanges) {\n\tif (!hasListValue(arrayOfNumberRanges)) return false\n\tlet result = true\n\tlet lastTo = -Infinity\n\tarrayOfNumberRanges.forEach(({ from, to }) => {\n\t\tif (from <= lastTo || from >= to) result = false\n\t\tif (to) lastTo = to\n\t})\n\treturn result\n}\n\n/**\n * Extract the Starting and Ending Number in given list of continuously incrementing number ranges\n *\n * @param {Array<{from: Number, to: Number}>} arrayOfNumberRanges - to check for values\n * @returns {{start: Number|Undefined, end: Number|Undefined}}\n */\nexport function startEndFromNumberRanges(arrayOfNumberRanges) {\n\tconst start = (arrayOfNumberRanges.find(({ from }) => from != null) || {}).from\n\tlet end = ([...arrayOfNumberRanges].reverse().find(({ to }) => to != null) || {}).to\n\tif (end <= start) end = undefined\n\treturn { start, end }\n}\n\n/**\n * Increment Counter\n *\n * @example:\n * - This is a Closure Function, declare at the start to instantiate the environment:\n * const addCount = createIncrementCounter(7)\n * - Then perform incrementing:\n * addCount()\n * >>> 8\n * - Add 2 to current count:\n * addCount(2)\n * >>> 10\n * - Reset Count:\n * addCount(0)\n * >>> 0\n * - Subtract 2 from current count:\n * addCount(-2)\n * >>> -2\n *\n * @param {number} initValue - initial count\n * @return {Function} - closure that stores a local number count,\n * and increments count by 1 when no argument passed\n * @return\n */\nexport function createIncrementCounter(initValue = 0) {\n\tlet count = initValue\n\treturn value => {\n\t\tif (value === 0) {\n\t\t\tcount = value // Reset count\n\t\t} else if (isNumeric(value)) {\n\t\t\tcount += Number(value)\n\t\t} else {\n\t\t\tcount++ // eslint-disable-line\n\t\t}\n\n\t\treturn count\n\t}\n}\n\n/**\n * Format Currency\n *\n * @param {Number|String} value - to format with currency symbol\n * @param {String} [symbol] - currency code to use, default is `$`\n */\nexport function formatCurrency(value, { symbol = '$' } = {}) {\n\treturn `${symbol} ${shortNumber(value, 3)}`\n}\n\n/**\n * Format Number to Delimited String, and optionally set the number of Decimals\n * @Note: use Number().toLocaleString() for faster performance if no fixed decimals needed.\n *\n * @param {number|string} value - number to format\n * @param {number} [decimals] - length of decimal\n * @param {number} [delimits] - length of digits to be delimited\n * @param {string} [sectionDelimiter] - section delimiter character\n * @param {string} [decimalDelimiter] - decimal delimiter character\n * @param {boolean} [ordinal] - whether to convert to ordinal number\n * @return {string} - delimited number with specified decimals\n */\nexport function formatNumber(\n\tvalue,\n\t{ decimals, delimits = 3, sectionDelimiter = ',', decimalDelimiter, ordinal } = {}\n) {\n\tif (!isNumeric(value)) return value\n\tconst number = Number(value)\n\n\t/* Set Decimals */\n\tlet result = decimals != null ? number.toFixed(decimals) : String(number) // toFixed is slow, but can force decimal\n\n\t/* Replace Delimiter */\n\tif (decimalDelimiter) result = result.replace('.', decimalDelimiter)\n\n\t/* Delimit Sections */\n\t// Note: because JS does not have negative lookbehind regex, we have to create dynamic pattern\n\tif (number >= 1000 || number <= -1000) {\n\t\t// Note: below code is slightly slower than toLocalString(), but needed for custom formatting\n\t\tconst dot = decimalDelimiter || '.'\n\t\tconst dotPattern = `\\\\${dot}\\\\d+`\n\t\tconst pattern = `(\\\\d)(?=(\\\\d{${delimits}})+(${isInString(result, dot) ? dotPattern : '$'}))`\n\t\tresult = result.replace(new RegExp(pattern, 'g'), `$1${sectionDelimiter}`)\n\t}\n\n\t/* Final Output */\n\tif (Number(result) === 0) result = result.replace('-', '')\n\treturn ordinal ? toOrdinal(result) : result\n}\n\n/**\n * Shorten Number to given Digits Length, with Suffix Added if Necessary\n *\n * @param {number|string} value - number to format\n * @param {Number} [digits] - maximum number of digits to keep (will add/remove decimals to match final length)\n * @param {Number} [divider] - value to divide by when determining exponent steps, example: 1024 for bytes\n * @param {String} [delimiter] - character to insert between computed value and suffix\n * @param {Object} [suffixes] - list of suffixes to use for each exponent\n * @return {String} number - shorten to digits length with suffix if needed\n */\nexport function shortNumber (value, digits = 3, divider = 1000, delimiter, suffixes) {\n\tlet number = Number(value)\n\tif (number === 0) return '0'\n\n\t/* Suffix Required */\n\tif (number >= divider || number <= -divider) return formatSI(number, digits, divider, delimiter, suffixes)\n\n\t/* No Suffix Truncate (for numbers less than 1k, with decimals rounded if needed) */\n\tconst decimals = Math.max(0, digits - String(~~Math.abs(number)).length)\n\tnumber = number.toFixed(decimals) // must use toFixed(), cannot use parseFloat, to avoid scientific notation\n\treturn decimals ? number.replace(/\\.?0+$/, '') : number\n}\n\n/**\n * Format Number with SI Prefix\n * @link: https://github.com/ThomWright/format-si-prefix\n *\n * @param {Number} number - to format\n * @param {Number} [precision] - number of significant digits to keep, will round number if 0 given\n * @param {Number} [divider] - value to divide by when determining exponent steps, example: 1024 for bytes\n * @param {String} [delimiter] - character to insert between computed value and suffix\n * @param {Object} [suffixes] - list of suffixes to use for each exponent\n * @return {string} number - with unit suffix if needed\n */\nexport function formatSI (number, precision = 3, divider = 1000, delimiter = '', suffixes = formatSI.PREFIXES) {\n\tif (number === 0) return '0'\n\n\tlet result = Math.abs(number) // significand\n\tlet exponent = 0\n\n\twhile (result >= divider && exponent < 24) {\n\t\tresult /= divider\n\t\texponent += 3\n\t}\n\twhile (result < 1 && exponent > -24) {\n\t\tresult *= divider\n\t\texponent -= 3\n\t}\n\n\tconst prefix = number < 0 ? '-' : ''\n\tif (result > divider) {\n\t\t// exponent == 24\n\t\t// significand can be arbitrarily long\n\t\treturn `${prefix}${result.toFixed(0)}${delimiter}${suffixes[exponent]}`\n\t}\n\treturn `${prefix}${(precision ? Number(result.toPrecision(precision)) : Math.round(result))}${delimiter}${suffixes[exponent]}`\n}\n\nformatSI.PREFIXES = {\n\t'24': 'Y',\n\t'21': 'Z',\n\t'18': 'E',\n\t'15': 'P',\n\t'12': 'T',\n\t'9': 'B',\n\t'6': 'M',\n\t'3': 'k',\n\t'0': '',\n\t'-3': 'm',\n\t'-6': 'µ',\n\t'-9': 'n',\n\t'-12': 'p',\n\t'-15': 'f',\n\t'-18': 'a',\n\t'-21': 'z',\n\t'-24': 'y',\n}\n\n/**\n * Calculate Logarithm for given exponent and base numbers\n *\n * @param {Number} exponent\n * @param {Number} base\n * @returns {number} log\n */\nexport function mathLog(exponent, base) {\n\treturn Math.log(exponent) / Math.log(base)\n}\n\n/**\n * Format Number to Ordinal Numeric String\n *\n * @param {number|string} number - to format\n * @return {string} - ordered number (i.e. 1st, 2nd, 3rd, 4th...)\n */\nexport function toOrdinal(number) {\n\tconst v = number % 100\n\treturn number + (toOrdinal.list[(v - 20) % 10] || toOrdinal.list[v] || toOrdinal.list[0])\n}\n\ntoOrdinal.list = ['th', 'st', 'nd', 'rd']\n\n/**\n * Compute Radian Value from given Degree\n *\n * @param {Number} degree - to ompute\n * @returns {Number} radian\n */\nexport function rad(degree) {\n\treturn (degree * Math.PI) / 180\n}\n\n/**\n * Round off a number to n* last digits\n * (e.g. converting timestamps into whole seconds)\n *\n * @example:\n * roundTail(1234567, 3)\n * >>> 1235000\n * roundTail(1234567, 7)\n * >>> 1000000\n * roundTail(5234567, 7)\n * >>> 10000000\n * @param {number} number - the value to convert\n * @param {number} lastDigits - the number of digits to round off to 0 at the end\n * @returns {number} - rounded number\n */\nexport function roundTail(number, lastDigits) {\n\tif (-1 < number && number < 1) return 0\n\tconst precision = Math.pow(10, lastDigits)\n\treturn Math.round(number / precision) * precision || precision / 10\n}\n\n/**\n * Round Number to given Precision decimal point\n *\n * @example:\n * roundNumber(123.4567, 3)\n * >>> 123.457\n *\n * @param {number} number - value to round\n * @param {number} [precision] - decimal places to keep\n * @returns {number} - with rounded values\n */\nexport function round(number, precision = 0) {\n\tconst factor = Math.pow(10, precision)\n\treturn Math.round(number * factor) / factor\n}\n\n/**\n * Round Number up to given Precision decimal point\n *\n * @example:\n * roundUp(123.4564, 3)\n * >>> 123.457\n *\n * @param {number} number - value to round\n * @param {number} [precision] - decimal places to keep\n * @returns {number} - with rounded values\n */\nexport function roundUp(number, precision = 0) {\n\tconst factor = Math.pow(10, precision)\n\treturn Math.ceil(number * factor) / factor\n}\n\n/**\n * Round Number down to given Precision decimal point\n *\n * @example:\n * roundDown(123.4567, 3)\n * >>> 123.456\n *\n * @param {number} number - value to round\n * @param {number} [precision] - decimal places to keep\n * @returns {number} - with rounded values\n */\nexport function roundDown (number, precision = 0) {\n\tconst factor = Math.pow(10, precision)\n\treturn Math.floor(number * factor) / factor\n}\n\n/**\n * Round Number to the closest Multiple of value\n * @Note: this function need precision rounding because of floating point issues, as the last operation is multiply\n * => example: roundTo(1.2, 0.1)\n * >>> 1.2000000000000002 -> this is the output without precision rounding\n *\n * @example:\n * roundTo(123.4567, 10)\n * >>> 120\n *\n * @param {number} number - value to round\n * @param {number} [multiple] - value, the multiple of which to round to\n * @returns {number} - rounded to given multiple of value\n */\nexport function roundTo (number, multiple = 1) {\n\treturn +(Math.round(number / multiple) * multiple).toPrecision(15)\n}\n\n/**\n * Round Down Number to the closest Multiple of value\n * @Note: this function needs rounding twice, because\n * => example: 1.2 / 0.1\n * >>> 11.999999999999998 -> rounds down to 11\n *\n * @example:\n * roundTo(123.4567, 10)\n * >>> 120\n *\n * @param {number} number - value to round\n * @param {number} [multiple] - value, the multiple of which to round to\n * @returns {number} - rounded to given multiple of value\n */\nexport function roundDownTo (number, multiple = 1) {\n\treturn +(Math.floor(+(number / multiple).toPrecision(15)) * multiple).toPrecision(15)\n}\n\n/**\n * Round Up Number to the closest Multiple of value\n * @Note: this function needs rounding twice, like roundDownTo\n *\n * @example:\n * roundTo(123.4567, 10)\n * >>> 130\n *\n * @param {number} number - value to round\n * @param {number} [multiple] - value, the multiple of which to round to\n * @returns {number} - rounded to given multiple of value\n */\nexport function roundUpTo (number, multiple = 1) {\n\treturn +(Math.ceil(+(number / multiple).toPrecision(15)) * multiple).toPrecision(15)\n}\n\n/**\n * Get decimal places of given Numeric value\n *\n * @param {number|string} value - number to get precision for\n * @return {number} precision - decimal places\n */\nexport function decimalPlaces (value) {\n\tconst match = String(Number(value)).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/)\n\tif (!match) return 0\n\treturn Math.max(\n\t\t// Number of digits right of decimal point.\n\t\t(match[1] ? match[1].length : 0) -\n\t\t\t// Adjust for scientific notation.\n\t\t\t(match[2] ? +match[2] : 0),\n\t\t0\n\t)\n}\n\n/**\n * Calculates the Greatest Common Divisor Between Two Numbers\n *\n * @param {Number|String} a - first number\n * @param {Number|String} b - second number\n * @returns {Number} - the biggest divisible number between `a` and `b`\n */\nexport function greatestCommonDivisor(a, b) {\n\treturn b ? greatestCommonDivisor(b, a % b) : Math.abs(Number(a) || Infinity)\n}\n\n/**\n * Returns a random integer/float between min (inclusive) and max (inclusive),\n * if given numbers are whole integers, then returned value will also be a whole number,\n * if given numbers are floats, then returned value can also be a float.\n *\n * Note: Using Math.round() will give you a non-uniform distribution!\n *\n * @param {number} min - minimum number\n * @param {number} max - maximum number\n * @returns {number} - random value between min and max, inclusive\n */\nexport function randomNumberInRange(min, max) {\n\treturn Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n/**\n * Compute the Difference between two numbers in Percents\n *\n * @param {number} newNumber - new value to calculate percent change\n * @param {number} baseNumber - the number to calculate percentage from\n * @return {number|NaN} diff - percentage difference, or not a number\n */\nexport function toPercentage(newNumber, baseNumber) {\n\tif (!isNumeric(newNumber) || !isNumeric(baseNumber)) return NaN\n\tif (baseNumber === 0) return newNumber === 0 ? 0 : newNumber > 0 ? Infinity : -Infinity\n\treturn ((newNumber - baseNumber) / baseNumber) * 100\n}\n\n/**\n * Convert Fraction number to Percentage string with '%', or render an empty string if not a number\n *\n * @param {Number|String} number - fraction from 0 to 1 to show as percent\n * @param {Number} [decimals] - number of digits to show after the dot\n * @returns {String} percentage - formatted string with set decimal places and '%', or empty string\n */\nexport function toPercent (number, decimals = 0) {\n\tif (!isNumeric(number)) return ''\n\treturn (Number(number) * 100).toFixed(decimals).toLocaleString() + '%'\n}\n","import { Active, ENV, get, warn } from 'ui-utils-pack'\n\n/**\n * FILE VARIABLES ==============================================================\n * =============================================================================\n */\n\nexport const CDN_URL = ENV.REACT_APP_CDN_URL || ''\n\nexport const FILE = {\n PATH_IMAGES: `${CDN_URL}/static/images/`,\n PATH_SOUNDS: `${CDN_URL}/static/sounds/`,\n CDN_URL,\n}\n\nif (get(Active, 'SETTINGS.HAS_SOUND') == null) {\n Active.SETTINGS = {\n ...Active.SETTINGS,\n HAS_SOUND: false\n }\n}\n\n/* Sounds */\nexport const SOUND = {\n ALERT: soundFile('alert.mp3'),\n INCREASE: soundFile('increase.mp3'),\n DECREASE: soundFile('decrease.mp3'),\n PRESS: soundFile('press.mp3'),\n PROGRESS: soundFile('progress.mp3'),\n TOUCH: soundFile('touch.mp3'),\n SWOOSH: soundFile('swoosh.mp3'),\n SLIDE: soundFile('slide.mp3'),\n}\n\n/**\n * HELPER FUNCTIONS ------------------------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\n/**\n * Lazy Load Sound File with safe .play() method that is muted when sound is off\n *\n * @param {String} name - sound file name\n * @returns {Object<{play()}>} - object with .play() method\n */\nfunction soundFile (name) {\n let file\n return {\n play () {\n // IE 11 does not support Audio()\n if (!file) try {\n file = new Audio(FILE.PATH_SOUNDS + name)\n } catch (err) {\n warn(err)\n }\n if (Active.SETTINGS.HAS_SOUND && file) file.play().catch()\n }\n }\n}\n","import dotProp from 'dot-prop-immutable'\nimport flatten from 'flat'\nimport {\n\tcloneDeep,\n\tget,\n\tisEmpty,\n\tisEqual,\n\tisObjectLike,\n\tisPlainObject,\n\tmatches,\n\tmerge as _merge,\n\tproperty,\n\tsetWith,\n\tunset\n} from 'lodash-es'\nimport qs from 'querystring'\nimport { isCollection } from './array.js'\n\n/**\n * OBJECT FUNCTIONS ============================================================\n * =============================================================================\n */\n\n/**\n * Get The List of Class Instance Method Names\n * @param {Class} Class - to get methods names from\n * @returns {String[]} list - of all instance methods, including async (but excludes properties, and static methods)\n */\nexport function classInstanceMethodNames (Class) {\n\tconst [_, ...methodNames] = Object.getOwnPropertyNames(Class.prototype)\n\treturn methodNames\n}\n\n/**\n * Clone Object/Collection/Class\n */\nexport function clone (obj) {\n\treturn Object.assign(Object.create(Object.getPrototypeOf(obj)), obj)\n}\n\n/**\n * Delete Nested Property of an Object by given Key Path\n * @param {Object} obj - to delete property from\n * @param {String|*} path - key path to nested property for deletion\n * @returns {Boolean} return value of the `delete` keyword\n */\nexport function deleteProp (obj, path) {\n\tif (!obj || !path) return false\n\tif (typeof path === 'string') path = path.split('.')\n\tfor (let i = 0; i < path.length - 1; i++) {\n\t\tobj = obj[path[i]]\n\t\tif (typeof obj === 'undefined') return false\n\t}\n\treturn delete obj[path.pop()]\n}\n\n/**\n * Check if value provided is an Object with at least one attribute\n *\n * @param {*} obj - value to check\n * @returns {boolean} - true if value is an Object with value\n */\nexport function hasObjectValue (obj) {\n\treturn isObject(obj) && Object.keys(obj).length > 0\n}\n\n/**\n * Compare if two values are the same by converting them to JSON strings\n * @example:\n * React.memo(func, isEqualJSON)\n *\n * @param {*} oldVal - to compare\n * @param {*} newVal - to compare\n * @returns {Boolean} true - if JSON string of given values are the same\n */\nexport function isEqualJSON (oldVal, newVal) {\n\treturn JSON.stringify(oldVal) === JSON.stringify(newVal)\n}\n\n/**\n * Checks if value is the language type of Object\n *\n * @uses lodash\n * @see https://lodash.com/docs/4.17.4#isPlainObject\n *\n * @param {*} value - any value to check\n * @return {boolean}\n */\nexport function isObject (value) {\n\treturn isPlainObject(value)\n}\n\n/**\n * List the keys and values of an object for iteration.\n * @Note: use for convenience only because it takes 0.5 microseconds per loop, which is:\n * - x2-3 times longer than looping with `for (const key in obj) {...}` (0.2 microseconds),\n * - x4-5 times longer than `forEach` or `for i++` loop using array (0.1 microseconds).\n * => For performance, best to store list as array.\n *\n * @uses generator\n * @uses lodash\n * @see https://lodash.com/docs/#isObjectLike\n *\n * @example:\n for (const [key, value] of listProps(obj)) {\n console.log(key, value);\n }\n *\n * @param {Object} obj - the object to list\n * @return {Object} generator's yielded value\n */\nexport function * listProps (obj) {\n\tif (!isObjectLike(obj)) {\n\t\treturn []\n\t}\n\n\tfor (const key of Object.keys(obj)) {\n\t\tyield [key, obj[key]]\n\t}\n}\n\n/**\n * Creates a new object that merges properties from all given objects. Properties from the right take precedence\n * over properties on the left\n * @Note: use update() for faster performance of x5 times (without cloneDeep) and x3 times (with cloneDeep)\n *\n * @param {Array|Object} objects - Objects to merge\n * @return {Object} - A new object\n */\nexport function merge (...objects) {\n\treturn _merge({}, ...objects)\n}\n\n/**\n * Compare Original Object vs. Changed Object and keep only changed values\n * @note: deleted props will output as `null` value\n *\n * @param {Object|Undefined|Null} original - to compare against\n * @param {Object|Undefined|Null} changed - object to keep changes\n * @returns {Object|Undefined|Null} changedOnly - new object with only changed values kept, or undefined if no changes\n */\nexport function objChanges (original, changed) {\n\t// clone so we can delete keys while iterating\n\toriginal = {...original}\n\tchanged = {...changed}\n\tfor (const field in changed) {\n\t\tif (isEqual(original[field], changed[field])) {\n\t\t\tdelete changed[field]\n\t\t} else {\n\t\t\t// Recursively check for nested field changes\n\t\t\tif (hasObjectValue(original[field]) && hasObjectValue(changed[field]))\n\t\t\t\tchanged[field] = objChanges(original[field], changed[field])\n\t\t}\n\t\tdelete original[field]\n\t}\n\tfor (const deleted in original) {\n\t\tchanged[deleted] = null\n\t}\n\treturn isEmpty(changed) ? undefined : changed\n}\n\n/**\n * Safely sets the provided value at the given path of an object, creating portions of the path if they don't exist.\n * Unless an optional customizer function is provided, arrays are created for missing index properties while objects\n * are created for all other missing properties.\n *\n * NOTE - This function mutates the provided 'object'\n *\n * @uses lodash\n * @see https://lodash.com/docs/4.17.4#set\n *\n * @param {Object} object - The object to modify\n * @param {String|String[]|Number|Number[]} path - The path in the given object to set the provided values\n * @param {*} value - The value to set\n * @param {Function} [customizer] - An optional function that specifies how to fill in a missing path\n * @returns {Object}\n */\nexport function set(object, path, value, customizer) {\n\treturn setWith(object, path, value, customizer)\n}\n\n/**\n * Similar to set() but returns copy of the object instead of mutating it\n * Note: may not work if the path contains space character, e.g. `path = 'items[key with space].isNotWorking'`\n *\n * @uses dot-prop-immutable\n * @see {@link https://github.com/debitoor/dot-prop-immutable} for further information\n *\n * @param {Object} object - The object to modify\n * @param {string} path - The path in the given object to set the provided values\n * @param {*} value - The value to set\n * @return {Object} - A new object\n */\nexport function setImmutably(object, path, value) {\n\t// Change into suitable format for dotProp eg. myArray[0].myProperty -> myArray.0.myProperty\n\tconst parsedPath = path\n\n\t\t// Remove brackets around strings (add a dot before it, except when bracket is the first character) ie. object[string] -> object.string\n\t\t.replace(/(\\[)(.*?)(\\])/g, (match, match1, match2, match3, offset) => (offset > 0 ? '.' : '') + String(match2))\n\n\treturn dotProp.set(object, parsedPath, value)\n}\n\n/**\n * Set Object to be given Payload recursively, by Mutation\n *\n * @example:\n reset({user: {name: 'Chris'}}, {user: {sign: 'scorpion'}})\n >>> {user: {sign: 'scorpion'}}\n *\n * @param {Object|Array} collection - collection to be reset\n * @param {Object} payload - the nested Object to update with\n * @return {Object|Array} - mutated collection that has properties of payload\n */\nexport function reset(collection, payload) {\n\tfor (const key in payload) {\n\t\tconst value = payload[key]\n\t\tif (isObject(value)) {\n\t\t\tcollection[key] = collection[key] ? reset(collection[key], value) : value\n\t\t} else {\n\t\t\tcollection[key] = value\n\t\t}\n\t}\n\n\tfor (const key in collection) {\n\t\tif (!payload[key]) delete collection[key]\n\t}\n\n\treturn collection\n}\n\n/**\n * Update Object with nested payload, keeping other attributes in the Object intact\n *\n * @example:\n update({user: {name: 'Chris'}}, {user: {sign: 'scorpion'}})\n >>> {user: {name: 'Chris', sign: 'scorpion'}}\n *\n * @param {Object|Array} state - collection to be updated\n * @param {Object|Array} payload - the nested Object to update with\n * @param {Boolean} [shouldCloneDeep] - whether to return new Object instead of mutating it\n * @param {Boolean} [deleteNull] - whether to remove `null` props instead of updating them\n * @return {Object|Array} - mutated/cloned Object with nested update\n */\nexport function update (state, payload, shouldCloneDeep = false, deleteNull = false) {\n\tif (shouldCloneDeep) state = cloneDeep(state)\n\n\tfor (const key in payload) {\n\t\tconst value = payload[key]\n\t\tif (value === null && deleteNull) {\n\t\t\tdelete state[key]\n\t\t} else if (isObject(value)) {\n\t\t\tstate[key] = state[key] ? update(state[key], value) : value\n\t\t} else {\n\t\t\tstate[key] = value\n\t\t}\n\t}\n\treturn state\n}\n\n/**\n * Check Recursively for Matching Object within Nested Object or Collection.\n *\n * @example:\n * hasObjMatch([[[1, -1], [2, -2]]], [1, -1]);\n * >>> true\n *\n * @param {*} obj - the collection to search for matching object\n * @param {*} searchObj - the matching object to find\n * @returns {boolean} - true if a match found.\n */\nexport function hasObjMatch(obj, searchObj) {\n\tfor (const key in obj) {\n\t\tif (!{}.hasOwnProperty.call(obj, key)) return\n\t\tconst value = obj[key]\n\n\t\tif (matches(searchObj)(value)) {\n\t\t\treturn true\n\t\t} else if (isObjectLike(value)) {\n\t\t\tconst nestedMatch = hasObjMatch(value, searchObj)\n\t\t\tif (nestedMatch) return true\n\t\t}\n\t}\n\n\treturn false\n}\n\n/**\n * Check if an Object has Provided Key Paths and Values.\n *\n * @example:\n * const obj = {\n * properties: {\n * id: 7\n * },\n * type: 'DRAFT',\n * coords: [[[1, -1], [2, -2]]]\n * }\n * hasObjKeys(obj, { 'properties.id': 7, 'coords': [1, -1] }, 'include');\n * >>> true\n *\n * @param {*} obj - the object to check\n * @param {object} keys - key paths and values to match, e.g. { 'properties.id': 7, type: 'DRAFT' }\n * @param {String} match - one of comparison types ['deep', 'shallow', 'include'], default is `shallow`\n * @returns {boolean} - true if a match found.\n */\nexport function hasObjKeys(obj, keys = {}, match = 'deep') {\n\tfor (const key in keys) {\n\t\tconst value = keys[key]\n\t\tconst searchValue = get(obj, key)\n\n\t\t// Deep comparison\n\t\tif (match === 'deep') {\n\t\t\tif (searchValue !== value) return false\n\t\t} // eslint-disable-line\n\n\t\t// Shallow comparison\n\t\telse if (match === 'shallow') {\n\t\t\tif ((isObjectLike(searchValue) && !matches(value)(searchValue)) || searchValue != value) {\n\t\t\t\t// eslint-disable-line eqeqeq\n\t\t\t\treturn false\n\t\t\t}\n\t\t} // eslint-disable-line\n\n\t\t// Include comparison\n\t\telse if (match === 'include') {\n\t\t\tif (searchValue !== value && !isObjectLike(searchValue)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tif (!matches(value)(searchValue)) {\n\t\t\t\tif (isObjectLike(searchValue)) return hasObjMatch(searchValue, value)\n\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Get Reference to Object with Provided Key Paths and Values within Nested Object or Collection.\n *\n * @example:\n * const obj = {\n * id: 7,\n * items: [\n * {\n * type: 'polygon',\n * geoJSON: {\n * properties: {\n * id: 7\n * },\n * type: 'DRAFT',\n * coords: [[[1, -1], [2, -2]]]\n * }\n * }\n * ]\n * }\n * findObjByKeys(obj, { 'properties.id': 7, 'coords': [1, -1] }, 'include');\n * >>> Object: {\n * properties: {\n * id: 7\n * },\n * type: 'DRAFT',\n * coords: [[[1, -1], [2, -2]]]\n * }\n *\n * @param {*} obj - the collection to search for matching object\n * @param {Object} keys - object with key paths and values to match, e.g. { 'properties.id': 7, type: 'DRAFT' }\n * @param {String} match - one of comparison types ['deep', 'shallow', 'include']\n * @returns {Object} - the matching object.\n */\nexport function findObjByKeys(obj, keys = {}, match = 'deep') {\n\tfor (const key in obj) {\n\t\tif (!{}.hasOwnProperty.call(obj, key)) return\n\t\tconst value = obj[key]\n\n\t\tif (!isObjectLike(value)) continue\n\n\t\tif (hasObjKeys(value, keys, match)) return value\n\n\t\tconst foundObj = findObjByKeys(value, keys, match)\n\t\tif (foundObj) return foundObj\n\t}\n}\n\n/**\n * Find all the objects which matches the the keys in the object.\n * @see findObjByKeys on usage details.\n * @param obj\n * @param keys\n * @param match\n * @returns {Array}\n */\nexport function findAllObjsByKeys(obj, keys = {}, match = 'deep') {\n\tconst result = []\n\t_findAllObjsByKeys(result, obj, keys, match)\n\treturn result\n}\n\n/**\n * Find all the objects with matching keys-values pairs in the Object or Collection.\n * @see findObjByKeys (which only returns a single matched object) on usage details.\n * The only usage difference from findObjByKeys is that the found objects are not in the return value.\n * This method populates the argument array 'foundObjs' with the found objects. This method has no return value.\n *\n * @param {Array} result - this is the return array. Pass in an empty array and it will be populated with the found objects\n * @param {Object} obj - Object or Collection to search from\n * @param {Object} keys - object with key paths and values to match, e.g. { 'properties.id': 7, type: 'DRAFT' }\n * @param {String} match - one of comparison types ['deep', 'shallow', 'include']\n */\nfunction _findAllObjsByKeys(result, obj, keys = {}, match = 'deep') {\n\tfor (const key in obj) {\n\t\tif (!{}.hasOwnProperty.call(obj, key)) return\n\t\tconst value = obj[key]\n\n\t\tif (!isObjectLike(value)) continue\n\n\t\tif (hasObjKeys(value, keys, match)) result.push(value)\n\n\t\t_findAllObjsByKeys(result, value, keys, match)\n\t}\n}\n\n/**\n * Flatten/Unflatten Nested Object Keys into Single Object with Dot Separated Keys\n */\nexport const toFlatObj = flatten\nexport const fromFlatObj = flatten.unflatten\n\n/**\n * Extract the value safely from an object via the keyPath and returns the value.\n * Removes that value's key from the passed object.\n *\n * @uses lodash\n * @see https://lodash.com/docs/4.17.1#get\n * @param {Object} obj - the object to get from and mutate\n * @param {string|Array} keyPath - the path to the desired value\n * @param {*} [fallback] - optional fallback value to return\n * @return {*}\n */\nexport function pop(obj, keyPath, fallback) {\n\tconst value = get(obj, keyPath) || null\n\tif (value) unset(obj, keyPath)\n\treturn value || fallback\n}\n\n/**\n * Delete Object property without mutating it, returning new Object without the deleted property\n *\n * @param {Object} obj - the Object to remove property from\n * @param {string} key - Object property to delete\n * @return {Object} - without the deleted key property\n */\nexport function removeKey (obj, key) {\n\tconst {[key]: _, ...rest} = obj // eslint-disable-line\n\treturn rest\n}\n\n/**\n * Recursively remove given list of keys from object or collection\n * @param {Object|Array} obj - or collection to remove keys from\n * @param {String[]} keys - list of keys to remove\n * @param {Boolean} [clone] - whether to return new object, defaults to mutating existing\n * @param {Boolean} [recursive] - whether to parse given obj recursively\n */\nexport function removeKeys (obj, keys, {clone = false, recursive = false} = {}) {\n\tconst data = clone ? cloneDeep(obj) : obj\n\tfor (const key in data) {\n\t\tif (keys.indexOf(key) >= 0) {\n\t\t\tdelete data[key]\n\t\t} else if (recursive && isCollection(data[key])) {\n\t\t\tdata[key] = removeKeys(data[key], keys, {recursive})\n\t\t}\n\t}\n\treturn data\n}\n\n/**\n * Remove Empty String value keys from given Collection by mutation\n * (For Array, Falsey values will be removed)\n *\n * @param {Object|Array} collection - to remove empty values\n * @param {Boolean} [recursive] - whether to remove empty values recursively\n * @return {Object|Array} - without empty strings\n */\nexport function removeEmptyValues (collection, {recursive = true} = {}) {\n\tfor (const key in collection) {\n\t\tif (collection[key] === '') {\n\t\t\tdelete collection[key]\n\t\t} else if (recursive && typeof (collection[key] || '') === 'object') {\n\t\t\tcollection[key] = removeEmptyValues(collection[key], { recursive })\n\t\t}\n\t}\n\n\treturn collection.constructor === Array ? collection.filter(v => v) : collection\n}\n\n/**\n * Remove Null/Undefined value keys from given Collection by mutation\n * (For Array, Falsey values will be removed)\n *\n * @param {Object|Array} collection - to remove nil values\n * @param {Boolean} [recursive] - whether to remove nil values recursively\n * @return {Object|Array} - without null or undefined keys\n */\nexport function removeNilValues (collection, {recursive = true} = {}) {\n\tfor (const key in collection) {\n\t\tif (collection[key] == null) {\n\t\t\tdelete collection[key]\n\t\t} else if (recursive && typeof collection[key] === 'object') {\n\t\t\tcollection[key] = removeNilValues(collection[key], {recursive})\n\t\t}\n\t}\n\n\treturn collection.constructor === Array ? collection.filter(v => v) : collection\n}\n\n/**\n * Remove items with truthy 'delete' properties from given Collection by mutation\n * (For Array, Falsey values will be removed)\n *\n * @param {Object|Array} collection - to remove deleted items from\n * @return {Object|Array} - without items with .delete keys\n */\nexport function removeDeletedItems(collection) {\n\tfor (const key in collection) {\n\t\t// Null is of type 'object' according to stupid JS specs\n\t\tif (typeof (collection[key] || '') !== 'object') continue\n\n\t\tif (collection[key].delete) {\n\t\t\tdelete collection[key]\n\t\t} else {\n\t\t\tcollection[key] = removeDeletedItems(collection[key])\n\t\t}\n\t}\n\n\treturn collection.constructor === Array ? collection.filter(v => v) : collection\n}\n\n/**\n * Remove GraphQL Tags and Null values from given Collection\n * - Nullable values will be removed from Array\n * - Commonly uneditable attributes listed in `tags` are deleted, see `GQL_HIDDEN_FIELDS` for example\n *\n * @param {Object|Array} collection - to remove graphql tags from\n * @param {Array} [tags] - list of tags to remove\n * @param {Boolean} [clone] - whether to clone the object before mutating\n * @return {Object|Array} - without graphql tags\n */\nexport function sanitizeResponse (collection, {tags = ['__typename'], clone = false} = {}) {\n\tconst result = clone ? cloneDeep(collection) : collection\n\n\tfor (const key in result) {\n\t\tif (tags.includes(key)) {\n\t\t\tdelete result[key]\n\t\t} else if (result[key] == null) {\n\t\t\tdelete result[key]\n\t\t} else if (typeof result[key] === 'object') {\n\t\t\tresult[key] = sanitizeResponse(result[key])\n\t\t}\n\t}\n\n\treturn result.constructor === Array ? result.filter(v => v != null) : result\n}\n\n/**\n * Sort Object Keys by given order, returning new Object with Keys sorted\n *\n * @param {Object} obj - to sort key attributes for\n * @param {String} order - enum, one of ['asc', 'desc']\n * @return {Object} - sorted by key attributes\n */\nexport function sortObjKeys(obj, order = 'asc') {\n\tconst result = {}\n\tObject.keys(obj)\n\t\t.sort(order === 'desc' ? sortObjKeys.descending : undefined)\n\t\t.forEach(key => {\n\t\t\tresult[key] = obj[key]\n\t\t})\n\treturn result\n}\n\nsortObjKeys.descending = (a, b) => {\n\tif (a < b) return 1\n\tif (a > b) return -1\n\treturn 0\n}\n\n/**\n * Swap Object's Keys with its Values\n *\n * @example:\n * swapKeyWithValue({id: 1, name: Tom})\n * >>> {1: 'id', 'Tom': name}\n *\n * @param {Object} obj - to swap keys with values\n * @returns {Object} - with key and values swapped\n */\nexport function swapKeyWithValue(obj) {\n\tconst result = {}\n\tfor (const key in obj) {\n\t\tresult[obj[key]] = key\n\t}\n\treturn result\n}\n\n/**\n * Compute the Total Number from Object Values\n * @example:\n * toObjValuesTotal({'a': 1, 'b': 2})\n * >>> 3\n *\n * @param {Object} obj - with nested values to calculate total for\n * @returns {number} total - value of object values\n */\nexport function toObjValuesTotal(obj) {\n\tlet sum = 0\n\tfor (const key in obj) {\n\t\tsum += obj[key]\n\t}\n\treturn sum\n}\n\n/**\n * Compute the Total Number from Object Values given Key Property\n * @example:\n * toObjValuesKeyTotal({'a': {'count': 1}, 'b': {'count': 2}}, 'count')\n * >>> 3\n *\n * @param {Object} obj - with nested values to calculate total for\n * @param {String} [key] - nested obj value key to extract amount for calculation\n * @returns {number} total - value of object values for given key property\n */\nexport function toObjValuesKeyTotal(obj, key = 'value') {\n\tlet sum = 0\n\tfor (const val in obj) {\n\t\tsum += obj[val][key]\n\t}\n\treturn sum\n}\n\n/**\n * Converts object properties to a query string\n *\n * @example\n toParams({ids: [1, 2]});\n >>> 'ids=1&ids=2'\n *\n * @param {Object} obj - the object to turn into a query string\n * @return {string}\n */\nexport function queryString(obj) {\n\treturn qs.stringify(obj)\n}\n\n// LODASH CLONES\n// -----------------------------------------------------------------------------\n\nexport {\n\tcloneDeep,\n\t/**\n\t * Search an object safely for a value via the keyPath and returns the value.\n\t *\n\t * @NOTE: this method is x10 times slower than Object property direct access\n\t * - try and catch block is even slower\n\t * - Object destructuring is much faster (more noticeable on big objects)\n\t * => best to use Object destructuring with default fallback\n\t *\n\t * @uses lodash\n\t * @see https://lodash.com/docs/4.17.1#get\n\t * @param {Object} obj - the object to get the value from\n\t * @param {string|Array} keyPath - the path to the desired value\n\t * @param {*} [defaultValue] - The value returned for `undefined` resolved values\n\t * @return {*} the value at the keyPath\n\t */\n\tget,\n\n\t/**\n\t * Check if two Objects are Equal\n\t * @example:\n\t * const a = [{ code: 'en' }, { code: 'ru' }]\n\t * const b = [{ code: 'en' }, { code: 'ru' }]\n\t * >>> isEqual(a, b)\n\t * >>> true\n\t *\n\t * @uses lodash\n\t * @see https://lodash.com/docs/4.17.4#isEqual\n\t *\n\t * @param {Object} object - the object to compare against\n\t * @param {Object} object2 - the object to compare with\n\t * @return {boolean} - true or false\n\t */\n\t\tisEqual,\n\n\t/**\n\t * Checks if value is an empty object, collection, map or set\n\t *\n\t * @param {*} value - The value to check\n\t * @return {boolean} - Returns true if value is empty, else false\n\t */\n\t\tisEmpty,\n\n\t/**\n\t * Creates a function that returns the value at path of a given object\n\t *\n\t * @example\n\t * [{ name: 'Neo', ... }, { name: 'Morpheus', ... }].map(property('name'))\n\t * >>> ['Neo', 'Morpheus']\n\t *\n\t * @uses lodash\n\t * @see {@link https://lodash.com/docs/4.17.4#property} for further information\n\t *\n\t * @param {Array|string} path - The path of the property to get\n\t * @returns {Function} - Returns the new accessor function\n\t */\n\t\tproperty,\n\n\t/**\n\t * Removes the Property at Path of Object by Mutation\n\t *\n\t * @uses lodash\n\t * @see https://lodash.com/docs/4.17.4#unset\n\t *\n\t * @param {Object} object - to remove property from\n\t * @param {String|Array} path - of the property to unset.\n\t * @return {boolean} - whether the value was removed from object\n\t */\n\t\tunset,\n}\n","import { _SHOULD_SHOW_TEST_, findObjByKeys } from 'ui-utils-pack'\n\n/* Routes */\nexport const ROUTE_HOME = '/'\nexport const ROUTE_SLASH = ROUTE_HOME.slice(-1) === '/' ? '' : '/' // used when ROUTE_HOME does not end with `/`\nexport const ROUTE_BASE = `${ROUTE_HOME}${ROUTE_SLASH}`\n\n// Define only SSR/SPA routes here for navigating to external server (i.e. WordPress)\nexport const ROUTE = {\n HOME: ROUTE_HOME, // required fallback route when nothing matches\n TESTER: `${ROUTE_BASE}tester`, // for development only\n THEME: `${ROUTE_BASE}theme`, // for development only\n LOGIN: `${ROUTE_BASE}login`,\n LOGOUT: `${ROUTE_BASE}logout`,\n LOADING: `${ROUTE_BASE}loading`, // the loading route does not actually exist, but used for Login refresh\n}\n\nexport const ROUTES = {\n NAV_HEADER_MAX_LINKS: 5, // show up to 5 links in Header navigation\n\n // used for Routes definition\n FOR_DEFINITION: createNestedRoutes(ROUTE, {\n [ROUTE.TESTER]: '/:id?', // add id to this route using `react-router`\n }),\n\n // shown in Navigation\n FOR_NAV: [\n {path: ROUTE.HOME, name: 'Home', icon: 'home'},\n ],\n\n // not shown in Navigation\n WITHOUT_NAV: [],\n\n // ID for new EntryEdit\n NEW: 'new',\n LOGIN: 'login', // prevent GQL from querying it as Id\n}\n\nif (_SHOULD_SHOW_TEST_) ROUTES.FOR_NAV.push(...[\n {path: ROUTE.TESTER, name: 'Tester', icon: 'test'},\n {path: ROUTE.THEME, name: 'Theme', icon: 'theme'},\n])\n\n/**\n * HELPER FUNCTIONS ------------------------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\n/**\n * Automatically Nest Routes based on their URI path names\n * @example:\n * const ROUTE = {ABOUT: '/about', CONTACT: '/about/contact'}\n * const ROUTES = createNestedRoutes(ROUTE, {[ROUTE.ABOUT]: '/:id?'})\n * >>> ROUTES[\n * {path: '/about/:id?', name: 'About', items: [\n * {path: '/about/contact', name: 'Contact'},\n * ]},\n * ]\n */\nexport function createNestedRoutes (routeObj, matches = {}) {\n const result = []\n for (const key in routeObj) {\n const path = routeObj[key]\n const uris = path.split('/')\n const title = uris.pop().replace(/-/g, ' ') || 'Homepage'\n const name = title.charAt(0).toUpperCase() + title.slice(1) // capitalise first letter\n const parentPath = uris.join('/')\n const parentRoute = findObjByKeys(result, {path: parentPath})\n const route = {path, name}\n\n // Define nested route\n if (parentRoute) {\n parentRoute.items = (parentRoute.items || []).concat(route)\n } else {\n result.push(route)\n }\n }\n\n // Add route matches\n for (const path in matches) {\n const match = matches[path]\n findObjByKeys(result, {path}).path = path + match\n }\n\n return result\n}\n","import { createNestedRoutes, ROUTE, ROUTES } from 'ui-modules-pack/variables'\nimport { __PROD__, ENV } from 'ui-utils-pack'\n\nexport const ROUTE_BASE = __PROD__ ? `${ENV.REACT_APP_HOMEPAGE || ''}/` : '/'\nconst _ROUTE = {\n HOME: ROUTE_BASE,\n DOCS: __PROD__ ? ROUTE_BASE : `${ROUTE_BASE}docs`,\n TEST: `${ROUTE_BASE}test`\n}\nObject.assign(ROUTE, _ROUTE)\n\nconst _ROUTES = {\n FOR_DEFINITION: createNestedRoutes(ROUTE, {\n [ROUTE.DOCS]: __PROD__ ? ':id?' : '/:id?', // add id to this route\n }),\n FOR_NAV: [],\n WITHOUT_NAV: []\n}\n\nObject.assign(ROUTES, _ROUTES)\nexport { ROUTE, ROUTES }\n\nexport function goTo (uri, title = uri, page = uri) {\n if (typeof window === 'undefined') return\n// eslint-disable-next-line no-restricted-globals\n if (typeof history === 'undefined') return\n// eslint-disable-next-line no-restricted-globals\n if (typeof history.pushState !== 'undefined') {\n// eslint-disable-next-line no-restricted-globals\n history.pushState({page: page}, title, uri)\n } else {\n window.location.assign(uri)\n }\n}\n","import { FILE } from 'ui-react-pack/files'\nimport { __PROD__, ENV } from 'ui-utils-pack'\n/**\n * GLOBAL VARIABLES ============================================================\n * =============================================================================\n */\n\nexport * from './routes'\n\nif (__PROD__) FILE.PATH_IMAGES = `${ENV.REACT_APP_HOMEPAGE}/static/images/`\n\n/* Platform Prefixes */\nexport const SERVER = 'SERVER'\n","import { ENV, FIVE_MINUTES, LANGUAGE, THIRTY_SECONDS, THREE_SECONDS, TWO_SECONDS } from 'ui-utils-pack'\n\n/**\n * APP CONFIGURATIONS ==========================================================\n * =============================================================================\n */\n\n/* Network Configs */\nexport const API_REQUEST_TIMEOUT = Number(ENV.API_REQUEST_TIMEOUT || ENV.REACT_APP_API_REQUEST_TIMEOUT) || THIRTY_SECONDS\nexport const SOCKET_CONNECT_TIMEOUT = Number(ENV.SOCKET_CONNECT_TIMEOUT || ENV.REACT_APP_SOCKET_CONNECT_TIMEOUT) || THIRTY_SECONDS\nexport const STATE_ACTION_TIMEOUT = Number(ENV.STATE_ACTION_TIMEOUT || ENV.REACT_APP_STATE_ACTION_TIMEOUT) || THIRTY_SECONDS\nexport const REQUEST_TIMEOUT_BACKOFF_DURATION = Number(ENV.REQUEST_TIMEOUT_BACKOFF_DURATION || ENV.REACT_APP_REQUEST_TIMEOUT_BACKOFF_DURATION) || FIVE_MINUTES\n\n/* Client App */\nexport const APP_NAME = ENV.APP_NAME || ENV.REACT_APP_NAME || 'APP_NAME'\nexport const APP_RELEASE_VERSION = parseFloat(ENV.APP_RELEASE_VERSION || ENV.REACT_APP_RELEASE_VERSION || '1.0')\nexport const APP_SUPPORT_TEAM_NAME = ENV.APP_SUPPORT_TEAM_NAME || ENV.REACT_APP_SUPPORT_TEAM_NAME || 'Support'\nexport const ANALYTICS_TRACKING_ID = ENV.REACT_APP_ANALYTICS_TRACKING_ID\nexport const CONTACT_EMAIL = ENV.REACT_APP_CONTACT_HOST + '@' + ENV.REACT_APP_CONTACT_SERVER\n\n/* Configuration */\nexport const CONFIG = {\n LANGUAGE_OPTIONS: [LANGUAGE.ENGLISH, LANGUAGE.FRENCH] // enabled languages\n}\n\n/* Client */\nexport const CLIENT = {\n // add env variables for frontend\n}\n\n/* Server */\nexport const SERVER = {\n QUERY_CACHE_TIME: Number(ENV.QUERY_CACHE_TIME) || TWO_SECONDS\n}\n\n/* UI */\nexport const UI = {\n TYPING_DELAY: 300, // Milliseconds - 300 is ideal for debouncing input changes while typing\n TOOLTIP_DELAY: 777, // Milliseconds\n FORM_SYNC_THROTTLE: THREE_SECONDS, // Milliseconds - debounce input changes duration\n ANIMATION_DURATION: 500, // Milliseconds - match with CSS @speed-base in /repos/web/style/_variables.less\n}\n\n/* Theme Options */\nexport const THEME = {\n LIGHT: 'LIGHT',\n DARK: 'DARK',\n}\n\n/**\n * FOR TESTS -------------------------------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\nexport const TEST = {\n COUNT: 1\n}\n\nexport const MOCK = {\n DATA_SEED: 7,\n UNIT_COUNT: 14,\n}\n","import { createAction } from 'redux-actions'\nimport { delay, race, take } from 'redux-saga/effects'\nimport {\n ALL_ACTIONS,\n ALL_RESULTS,\n CANCEL,\n ERROR,\n isInCollection,\n isInList,\n isInListAny,\n RECEIVED,\n RESULT_SEPARATOR,\n SEPARATOR,\n SUCCESS,\n TIMEOUT,\n VOID\n} from 'ui-utils-pack'\nimport { STATE_ACTION_TIMEOUT } from '../variables/configs'\n\n/**\n * ACTION CREATORS =============================================================\n * =============================================================================\n */\n\n/**\n * State Action Creator.\n *\n * @example\n * Valid usage options:\n * >>> stateAction('SOMETHING', 'GET', 'FINISH', { foo: 'bar' }, { type: 1 })\n * >>> stateAction('SOMETHING', 'GET', { foo: 'bar' }, { type: 1 })\n * >>> stateAction('SOMETHING', 'FINISH', { foo: 'bar' }, { type: 1 })\n * >>> stateAction('SOMETHING', { foo: 'bar' }, { type: 1 })\n * >>> stateAction('SOMETHING', { foo: 'bar' })\n * >>> stateAction('SOMETHING')\n *\n * @param {String} TYPE - action type to dispatch\n * @param {String|Null|Object} [ACTION] - optional, one of ALL_ACTIONS, if not provided, second argument can be @payload\n * @param {String|Null|Object} [RESULT] - optional, one of ALL_RESULTS, if not provided, third argument can be @payload\n * @param {Object|Null} [payload] - optional, action.payload\n * @param {Object} [meta] - optional meta data, action.meta\n * @return {Object} Flux Standard Action\n */\nexport function stateAction (TYPE, ACTION, RESULT, payload = {}, meta = {}) {\n const hasAction = isInList(ALL_ACTIONS, ACTION)\n const hasResult = isInListAny(ALL_RESULTS, ACTION, RESULT)\n\n // Case 1: All arguments provided\n let finalACTION = ACTION\n let finalRESULT = RESULT\n let finalPayload = payload\n let finalMeta = meta\n\n // Case 2: ACTION provided, but RESULT not provided\n // make 3nd argument payload and 4rd argument meta\n if (hasAction && !hasResult) {\n finalRESULT = null\n finalPayload = RESULT\n finalMeta = payload\n }\n\n // Case 3: ACTION not provided, but RESULT provided\n // make 3rd argument payload and 4rd argument meta\n if (!hasAction && hasResult) {\n finalACTION = null\n finalRESULT = ACTION\n finalPayload = RESULT\n finalMeta = payload\n }\n\n // Case 4: ACTION and RESULT not provided\n // make 2nd argument payload and 3rd argument meta\n if (!hasAction && !hasResult) {\n finalACTION = null\n finalRESULT = null\n finalPayload = ACTION\n finalMeta = RESULT\n }\n\n return createAction(stateActionType(TYPE, finalACTION, finalRESULT), null, () => (finalMeta || {}))(finalPayload)\n}\n\n/**\n * ACTION TYPE CREATORS --------------------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\n/**\n * State Action Type Creator.\n *\n * @example\n * stateActionType(FUN, GET, START);\n * >>> String: 'FUN -> GET_START'\n *\n * @param {string} NAME - action type identifier\n * @param {string|null} ACTION - optional, action type name suffix, if not provided, 2nd argument can be @RESULT\n * @param {string|null} RESULT - optional, action type name result suffix\n * @return {string} action type\n */\nexport function stateActionType (NAME, ACTION = null, RESULT = null) {\n return NAME +\n (ACTION ? SEPARATOR + ACTION : '') +\n ((!ACTION && RESULT) ? SEPARATOR + RESULT : '') +\n ((ACTION && RESULT) ? RESULT_SEPARATOR + RESULT : '')\n}\n\n/**\n * Multiple State Action Types Creator\n *\n * @param {Array} NAMES - list of action type identifiers\n * @param {string|null} ACTION - optional, action type name suffix, if not provided, 2nd argument can be @RESULT\n * @param {string|null} RESULT - optional, action type name result suffix\n * @return {Array} - list of action types\n */\nexport function stateActionNamesType (NAMES, ACTION = null, RESULT = null) {\n return NAMES.reduce((list, NAME) => list.concat(stateActionType(NAME, ACTION, RESULT)), [])\n}\n\n/**\n * ACTION HELPERS --------------------------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\n/**\n * Subscribe to All State Action results\n *\n * @example\n * const {payload = {}, meta = {}} = yield call(subscribeToResults, GOD, GET, meta, contractActionType)\n * if (meta.result === SUCCESS) return payload\n *\n * @param {string} NAME - action type identifier\n * @param {string} ACTION - state action method type\n * @param {object} [meta] - meta data to match (with include comparison)\n * @param {function} [actionType] - action type creator, default is stateActionType()\n * @param {boolean} [hasTimeout] - whether to timeout automatically\n * @return {object} - action with payload and meta data (payload may not exist on TIMEOUT/VOID results)\n */\nexport function * subscribeToResults (NAME, ACTION, meta = null, actionType = stateActionType, hasTimeout = true) {\n /* Match specific action with given meta data */\n if (meta) {\n const listener = race({\n received: take(action => isMatchingActionType(action, NAME, ACTION, null, meta, actionType)),\n success: take(action => isMatchingActionType(action, NAME, ACTION, SUCCESS, meta, actionType)),\n error: take(action => isMatchingActionType(action, NAME, ACTION, ERROR, meta, actionType)),\n cancel: take(action => isMatchingActionType(action, NAME, ACTION, CANCEL, meta, actionType)),\n timeout: take(action => isMatchingActionType(action, NAME, ACTION, TIMEOUT, meta, actionType)),\n ...hasTimeout && {void: delay(STATE_ACTION_TIMEOUT + 100)} // in case State action was not called\n })\n let {received, success, error, cancel, timeout} = yield listener\n\n if (received) {\n received.meta.result = RECEIVED\n return received\n }\n\n if (success) {\n success.meta.result = SUCCESS\n return success\n }\n\n if (error) {\n error.meta.result = ERROR\n return error\n }\n\n if (cancel) {\n cancel.meta.result = CANCEL\n return cancel\n }\n\n if (timeout) {\n timeout.meta.result = TIMEOUT\n return timeout\n }\n\n return {meta: {result: VOID}}\n }\n}\n\n/**\n * Check if Action is a Matching State Action Type with given Result and Meta data\n * (for subscribing to the exact stateAction).\n *\n * @param {object} action - Flux Standard Action to check against\n * @param {string} NAME - action type identifier\n * @param {string} ACTION - state action method type\n * @param {string} RESULT - state action response type\n * @param {Object} meta - meta data to match (with include comparison)\n * @param {Function} actionType - action type creator, default is stateActionType()\n * @return {bool} - true if it's a matching State Action\n */\nexport function isMatchingActionType (action, NAME, ACTION, RESULT, meta, actionType) {\n return action.type === actionType(NAME, ACTION, RESULT) && isInCollection([action.meta], meta)\n}\n\nexport const errorPattern = new RegExp(`(?:[^a-zA-Z0-9])(${ERROR})$`)\n\nexport function isError (action) {\n return errorPattern.test(action.type)\n}\n\n/* Extract ACTION constant from Action Type */\nexport function actionFromType (type) {\n return type.split(RESULT_SEPARATOR)[0].split(SEPARATOR).pop()\n}\n","import createSagaMiddleware from 'redux-saga' // Middleware for async tasks\n\n/**\n * REDUX SAGA MIDDLEWARE =======================================================\n * =============================================================================\n */\n\nexport default createSagaMiddleware()\n","import { call, delay, put, spawn, take } from 'redux-saga/effects'\nimport { __CLIENT__, ALERT, FINISH, LOAD, START, SYSTEM } from 'ui-utils-pack'\nimport { stateAction } from '../redux/actions'\nimport middleware from './middleware'\n\n/**\n * ASYNC TASK HELPERS ==========================================================\n * =============================================================================\n */\n\nexport {\n all, call, delay, fork, put, race, select as selectState, spawn,\n take, takeEvery, takeLatest, throttle,\n} from 'redux-saga/effects'\n\n/**\n * Subscribe to the First Action and ignore incoming actions until the Task is finished\n *\n * @param {string} actionType - action type to subscribe to\n * @param {function} callback - normal or generator function to fire when action dispatches\n * @param {Array} args - arguments to pass to the started task\n */\nexport function * takeFirst (actionType, callback, ...args) {\n /* Take(), followed by async method call, equals takeFirst\n * because rapid actions are only executed once\n * since saga has to finish the last yield statement\n * in order to take the next same action in while loop\n */\n while (true) {\n const action = yield take(actionType)\n yield call(callback, ...args.concat(action))\n }\n}\n\n/**\n * Dispatches a loading START action\n *\n * @example\n * takeEvery(stateActionType(SOMETHING, GET), loadingStart(SOMETHING))\n *\n * @param {string} type - The action type to dispatch a loading action for\n * @returns {Function} - A generator function that will dispatch the loading START action\n */\nexport function loadingStart (type) {\n return function * ({payload, meta, meta: {loading = true} = {}} = {}) { // eslint-disable-line\n // Don't dispatch action if told not to\n if (!loading) return\n\n // Dispatch the load action\n yield put(stateAction(type, LOAD, START, payload, meta))\n }\n}\n\n/**\n * Dispatches a loading FINISH action\n *\n * @example\n * takeEvery(stateActionType(SOMETHING, GET), loadingFinish(SOMETHING))\n *\n * @param {String} type - The action type to dispatch a loading action for\n * @param {Number} [wait] - milliseconds to wait before dispatching loading action\n * @returns {Function} - A generator function that will dispatch the loading FINISH action\n */\nexport function loadingFinish (type, wait) {\n return function * ({payload, meta} = {}) { // eslint-disable-line\n if (wait) yield delay(wait)\n yield put(stateAction(type, LOAD, FINISH, payload, meta))\n }\n}\n\n/**\n * Run Saga Middleware for given Generator Function\n *\n * @param {Function} func - generator function to run\n * @param {*} args - arguments to pass to generator function\n * @return {Object} Task - redux-saga task description, with .toPromise(), .cancel(), etc.\n */\nexport function runSaga (func, ...args) {\n return middleware.run(func.bind(this, ...args))\n}\n\n/**\n * Execute a Saga Task and Return Its Promise\n * @See: runSaga() for docs\n * @example:\n * const result = await runTask(sagaFlowGeneratorFunction, {payload: {...}})\n */\nexport function runTask (...args) {\n return runSaga(...args).toPromise()\n}\n\n/* Dispatch Alert Message Action to be Handled by Appropriate Platform */\nexport function * systemAlert ({message, title = 'Alert'}) {\n if (__CLIENT__) return yield put(stateAction(SYSTEM, ALERT, {items: [{title, content: message}]}))\n}\n\n/**\n * Schedule Action Dispatch\n *\n * @param {String} [id] - of action types used for rescheduling pending actions\n * @param {Array<time, type, payload, meta>} [actions] - to schedule, each with `time` timestamp of when to dispatch,\n * if not given, will use previously given list of actions\n * @param {Number} timeOffset - milliseconds to add to each scheduled action time, default is 0,\n * so we can playback past actions as if they are happening right now\n * @param {Number} timeModifier - playback speed multiplier, default is 1\n */\nexport function * scheduleActions ({payload: {id = '', actions = null, timeOffset = null, timeModifier = null}}) {\n if (!actions) actions = (scheduleActions[id] || {}).actions\n if (!timeOffset) timeOffset = (scheduleActions[id] || {}).timeOffset || 0\n if (!timeModifier) timeModifier = (scheduleActions[id] || {}).timeModifier || 1\n if (scheduleActions[id]) scheduleActions[id].task.cancel()\n scheduleActions[id] = {actions, timeOffset, timeModifier, task: {cancel () {}}} // create/reset schedule\n\n // All Actions completed/not needed anymore (allows resetting actions by passing empty array)\n if (!scheduleActions[id].actions.length) return delete scheduleActions[id]\n\n // Dispatch the First Action\n const action = scheduleActions[id].actions[0]\n const time = action.time + timeOffset\n scheduleActions[id].task = yield spawn(scheduleActionTask, {id, action, time, timeModifier})\n}\n\nfunction * scheduleActionTask ({id, action, time, timeModifier}) {\n const wait = (time - Date.now()) * timeModifier\n if (wait > 0) yield delay(wait)\n\n /* Dispatch Action */\n action.meta.isScheduled = true\n yield put(action)\n\n // Only remove the action after execution to allow rescheduling with different playback speed\n scheduleActions[id].actions.shift()\n\n /* Recursively schedule the rest of actions */\n yield spawn(scheduleActions, {payload: {id}}) // spawn to prevent recursive task.cancel() error\n}\n\n/* Check if Given Action is a Scheduled Action */\nexport function isScheduledActionType ({meta: {isScheduled} = {}}) {\n return isScheduled\n}\n","import CircularJSON from 'circular-json' // do not change to `flatted` package, because it does not comply to JSON standard\n\n/**\n * DATA FORMAT FUNCTIONS =======================================================\n * =============================================================================\n */\n\nexport {\n CircularJSON\n}\n\n/**\n * Converts given value to a JSON string if necessary\n *\n * @param {*} data - to convert\n * @param {*} args - additional options\n * @return {string}\n */\nexport function toJSON (data, ...args) {\n return (typeof data === 'object') ? CircularJSON.stringify(data, ...args) : data\n}\n\n/**\n * Attempts to parse a JSON string.\n *\n * @param {string} data - the string to be parsed\n * @return {Object|Null} - a JavaScript object if parsed successfully, null if not\n */\nexport function fromJSON (data) {\n try {\n return CircularJSON.parse(data)\n } catch (e) {\n return data\n }\n}\n\n/**\n * Checks to see if the data passed is valid JSON.\n *\n * @param {string} data - the json to parse.\n * @return {boolean}\n */\nexport function isJSON (data) {\n let isJson = true\n\n try {\n JSON.parse(data)\n } catch (e) {\n isJson = false\n }\n\n return isJson\n}\n\n/**\n * Convert Javascript object to text\n *\n * @param {*} value - to convert to text\n * @return {string}\n */\nexport function toText (value) {\n if (value == null) return String(value)\n const string = []\n\n /* Array */\n if (value.constructor === Array) {\n for (const prop in value) {\n string.push(toText(value[prop]))\n }\n return '[' + string.join(',') + ']'\n }\n\n /* Object */\n if (value.constructor === Object) {\n for (const prop in value) {\n string.push(prop + ':' + toText(value[prop]))\n }\n return '{' + string.join(',') + '}'\n }\n\n /* Function */\n if (value.constructor === Function) {\n return value.toString()\n }\n\n /* Other Values */\n return JSON.stringify(value)\n}\n\n/**\n * JSON Encoder and Decoder\n */\nexport const Json = {\n encode: toJSON,\n decode: fromJSON,\n}\n","import { __DEV__, Active } from './_envs.js'\nimport { isList } from './array.js'\nimport { fromJSON, toJSON } from './codec.js'\nimport { ADD, DELETE, GET, SET } from './constants.js'\nimport { enumCheck } from './function.js'\nimport { log } from './log.js'\nimport { update } from './object.js'\n\n/**\n * STORAGE FUNCTIONS ===========================================================\n * =============================================================================\n */\n\nconst hasLocalStorage = typeof localStorage !== 'undefined' // eslint-disable-line\n\n/**\n * Closure Function to Store Data in Memory (RAM)\n *\n * @param {Object|Array = Object} [initValue] - initialized value\n * @return {function(ACTION, key, value)} - to store or retrieve data in memory\n */\nexport function memoryCache (initValue = {}) {\n return function memoryCache (ACTION, key, value) {\n if (ACTION === GET) return initValue[key] // eslint-disable-line\n if (ACTION === SET) return initValue[key] = value // eslint-disable-line\n if (ACTION === DELETE) return delete initValue[key] // eslint-disable-line\n }\n}\n\n/**\n * Perform fastest possible cache in RAM\n *\n * @param {string} ACTION - one of GET, SET, or DELETE\n * @param {string} key - stored value's key identifier\n * @param {*} value - value to store\n */\nexport function performCache (ACTION, key, value) {\n if (ACTION === GET) return performCache.cache[key] // eslint-disable-line\n if (ACTION === SET) return performCache.cache[key] = value // eslint-disable-line\n if (ACTION === DELETE) return delete performCache.cache[key] // eslint-disable-line\n}\nperformCache.cache = {}\n\n/**\n * Perform localStorage (for the Web)\n *\n * @example:\n * performStorage(SET, 'token', 'Wait_for_it___Legendary_Genius')\n *\n * @NOTE:\n * AsyncStorage takes 5 milliseconds delay on average for each storage operation, and can add up.\n * Store in state instead, for non-persistent data, because it is much faster and synchronous.\n *\n * @param {string} ACTION - one of GET, SET, DELETE or ADD\n * @param {string} storageKey - stored value's key identifier\n * @param {*} value - value to store\n * @param {Array|Object} initialValue - used for ADD ACTION when saving the first time\n * @return {*} - Synchronous/Asynchronous promise result of Local Storage (or stored value for GET action)\n */\nexport function performStorage (ACTION, storageKey, value = null, initialValue = []) {\n /* ADD action abstraction */\n if (ACTION === ADD) {\n if (performStorage.isAsync) {\n return performStorage(GET, storageKey)\n .then(value => value || initialValue)\n .then(oldData => performStorage(SET, storageKey, isList(oldData) ? oldData.concat(value) : update(oldData, value)))\n }\n const oldData = performStorage(GET, storageKey) || initialValue\n return performStorage(SET, storageKey, isList(oldData) ? oldData.concat(value) : update(oldData, value))\n }\n\n /* SERVER (or missing localStorage) */\n if (!hasLocalStorage) return Active.Storage[performStorage.toServer[ACTION]](storageKey, value)\n\n /* CLIENT */\n enumCheck([GET, SET, DELETE], ACTION, this)\n const args = [storageKey]\n if (value != null) args.push(toJSON(value))\n let result = localStorage[performStorage.toClient[ACTION]](...args)\n\n // Storage Retrieval\n if (GET === ACTION && result) result = fromJSON(result) // Deserialize data\n\n if (!__DEV__) return result\n\n // Development Logging\n log(`STORAGE -> ${ACTION}: ${storageKey} as:`, `color: teal`, result || value)\n return result\n}\n\nperformStorage.toClient = {\n [GET]: 'getItem',\n [SET]: 'setItem',\n [DELETE]: 'removeItem'\n}\nperformStorage.toServer = {\n [GET]: 'getItem',\n [SET]: 'setItem',\n [DELETE]: 'removeItem'\n}\nperformStorage.toServerSync = {\n [GET]: 'getItemSync',\n [SET]: 'setItemSync',\n [DELETE]: 'removeItemSync'\n}\n// Setup Asynchronous Local Storage\nperformStorage.init = function (...args) {\n performStorage.isAsync = true\n return Active.Storage.init(...args)\n}\n// Setup Synchronous Local Storage (not recommended)\nperformStorage.initSync = function (...args) {\n performStorage.toServer = performStorage.toServerSync\n return Active.Storage.initSync(...args)\n}\n\n","import { Active, ENV } from './_envs.js'\nimport { isInList, isList } from './array.js'\nimport { fromJSON } from './codec.js'\nimport { rad } from './number.js'\nimport { isObject } from './object.js'\nimport { isString, padStringLeft, randomString } from './string.js'\n\n/**\n * AD HOC FUNCTIONS ============================================================\n * =============================================================================\n */\n\n/**\n * Create Case-Sensitive Short Auto Incrementing ID string derived from Timestamp in milliseconds\n * @Important:\n * - modifying this function may break existing database implementations.\n * - directory/file names in Linux are case-sensitive, but are not in macOS or Windows;\n * => it is better to only use lower case characters for this reason.\n * @Rationale: the primary use case is for generating globally unique Ids from frontend that can be used in backend.\n *\n * @Note:\n * - The ID is 10 characters long:\n * 1. URL safe - case-insensitive alphanumeric only characters (36 radix)\n * 2. Safe for use as HTML5 id attribute\n * 2. Sorts chronologically without conversion (replacing the need for database timestamp)\n * => Sorting will stop working after April 22, the year 5,188, because 36^9 limit padding is reached\n * -> The solution is to increment the padCount to 10, which will work until January 18, the year 117,829.\n *\n * - first 9 characters is Hex string of Timestamp\n * - Last 3 character is randomized using alphanumeric characters to avoid collision\n * - Collision probability is near zero in practice, because 3 random string suffix\n * a. using 36 (case-insensitive) characters have 36^3 = 46,656 possibilities,\n * b. using 62 (case-sensitive) characters have 62^3 = 238,328 possibilities,\n * => it is unlikely two people would create more than that possibilities in the same millisecond.\n * - Collision from the same user is prevented by checking for suffix duplicates within each millisecond.\n * - This function is purposely slow with de-optimization to prevent generating too many Ids within one millisecond.\n *\n * @param {Number|String} [timestamp] - custom timestamp to generate ID for, defaults to Date.now()\n * @param {String} [alphabet] - custom characters to use for Id generation, default to alphaNumeric characters\n * @param {Boolean} [caseSensitive] - whether to use case-sensitive characters\n * @param {Number} [padCount] - if generated ID length is less than this, it's padded with the first character in the `alphabet`\n * @param {String} [suffix] - string to append to ID timestamp, default is random alphanumeric 3 characters string\n * @return {String} ID - example: 'MJ8FU-RVRo'\n */\nexport function Id ({\n timestamp = Date.now(),\n caseSensitive = false,\n alphabet = caseSensitive ? Id.alphabet : Id.alphabetLower,\n padCount = caseSensitive ? 7 : 9,\n suffix = randomString(3, 3, {alphaNum: true}),\n} = {}) {\n if (!caseSensitive) suffix = suffix.toLowerCase()\n\n // Ensure unique suffix for each millisecond\n const history = Id.history[timestamp]\n if (history) {\n while (isInList(history, suffix)) {\n suffix = randomString(3, 3, {alphaNum: true})\n if (!caseSensitive) suffix = suffix.toLowerCase()\n }\n history.push(suffix)\n } else {\n Id.history[timestamp] = [suffix]\n }\n\n // Garbage clean Id history\n for (const time in Id.history) {\n if (time < timestamp) delete Id.history[time]\n }\n\n // Create hashed Id from Timestamp\n const charsCount = alphabet.length\n let time = []\n let remainder = 0\n while (timestamp >= charsCount) {\n remainder = timestamp % charsCount // can be zero\n timestamp = Math.floor(timestamp / charsCount)\n time.unshift(alphabet[remainder])\n }\n time.unshift(alphabet[timestamp])\n time = time.join('')\n return padStringLeft(time, Array(padCount).fill(alphabet[0]).join('')) + suffix\n}\n\n// !Important: changing values below may break existing database implementations\nId.alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'\nId.alphabetLower = '0123456789abcdefghijklmnopqrstuvwxyz'\nId.minLength = 10 // minimum case-sensitive ID length, including suffix\nId.pattern = new RegExp(`^[${Id.alphabet}]+$`)\nId.history = {} // log of previously generated Ids by timestamp\n\n/**\n * Check if given string is a valid Short Auto Incrementing ID derived from Timestamp in milliseconds\n * @param {*} value - to check\n * @return {Boolean} true - if valid, else false\n */\nexport function isId (value) {\n return isString(value) && value.length >= Id.minLength && Id.pattern.test(value)\n}\n\n/**\n * Check if given value is truthy.\n * A value is considered to be falsy, if it's one of these:\n * false, undefined, null, NaN, 0, 0.0, -0, +0, -0.0, +0.0, '', {}, [],\n *\n * @param {*} val - to evaluate for truthiness\n * @returns {boolean}\n */\nexport function isTruthy (val) {\n if (!val) return false\n if (isList(val) && val.length === 0) return false\n return !(isObject(val) && Object.keys(val).length === 0)\n}\n\n/**\n * Get Timestamp in Milliseconds from Id string\n * @param {String} string - Id generated by the Id() function\n * @return {Number|Error} Timestamp - in Milliseconds, or throws error of Id is invalid\n */\nexport function timestampFromId (string) {\n const alphabet = Id.alphabet\n const radix = alphabet.length\n const id = string.replace(timestampFromId.padPattern, '') // remove time padding\n const [...chars] = id.substring(0, id.length - 3) // trim out random strings\n let result = 0\n chars.reverse()\n for (const index in chars) {\n const multiple = alphabet.indexOf(chars[index])\n if (multiple === -1) throw new Error(`${timestampFromId.name}() found invalid Id character '${chars[index]}'`)\n result += multiple * Math.pow(radix, +index)\n }\n return result\n}\n\ntimestampFromId.padPattern = new RegExp(`^(${Id.alphabet[0]})+`)\n\n/**\n * Calculate Distance between two Geometry Points (with latitude and longitude)\n *\n * @note: this method is fast, but inaccurate (using Haversine formula);\n * for precise calculation - use https://www.npmjs.com/package/geolib\n *\n * @param {Object<lat, lng>} point1\n * @param {Object<lat, lng>} point2\n * @param {String<'km'|'m'|'mm'>} [unit] - of measurements, default is millimeter (length unit saved in database)\n * @returns {Number} distance - between given points in chosen unit\n */\nexport function distanceBetween (point1, point2, unit = 'mm') {\n const dLat = rad(point2.lat - point1.lat)\n const dLong = rad(point2.lng - point1.lng)\n const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(rad(point1.lat)) * Math.cos(rad(point2.lat)) *\n Math.sin(dLong / 2) * Math.sin(dLong / 2)\n let distance = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)) * 6378137 // Earth’s mean radius in meter\n switch (unit) {\n case 'mm':\n return distance * 1000\n case 'km':\n return distance / 1000\n case 'm':\n default:\n return distance // in metre\n }\n}\n\n/**\n * Check if given password is good enough\n * @see: https://lowe.github.io/tryzxcvbn/\n * minimum score of 3 is for safe password in security sensitive applications, 2 is usually enough\n *\n * @param {String} value - to check\n * @param {Number} strength - minimum strength\n * @returns {Boolean} true - if it is\n */\nexport function isGoodPassword (value, strength = 2) {\n return passStrength(value) >= strength\n}\n\n/**\n * Asynchronously load script with callback function once loaded\n * @note: only works if called before runtime!\n * @example:\n * asyncLoad('/static/js/file.js', () => {})\n *\n * @param {String} src - file path\n * @param {Function} [callback]\n */\nexport function asyncLoad (src, callback) {\n const load = () => createScript(src, callback)\n if (window.attachEvent != null) {\n window.attachEvent('onload', load)\n } else {\n window.addEventListener('load', load, false)\n }\n}\n\n/**\n * Create HTML Element and insert it to DOM, before similar element type found in existing DOM\n * @param {String} type - HTML element kind (i.e. 'script', 'link', etc.)\n * @param {Object} props - element attributes\n * @returns {Promise<element, event>|void} promise - resolves when element loaded, with arguments of `addEventListener`\n */\nfunction createElement ({type = 'script', ...props}) {\n if (typeof document === 'undefined') return\n const element = document.createElement(type)\n const sameType = document.getElementsByTagName(type)[0]\n for (const attribute in props) {\n element.attribute = props[attribute]\n }\n const result = new Promise((resolve) => {\n element.addEventListener('load', resolve, false)\n })\n sameType.parentNode.insertBefore(element, sameType)\n return result\n}\n\n/**\n * Create HTML DOM <script/>\n * @param {String} src\n * @param {Function} callback - to fire on script loaded\n */\nexport function createScript (src, callback) {\n if (typeof document === 'undefined') return\n const d = document, t = 'script',\n o = d.createElement(t),\n s = d.getElementsByTagName(t)[0]\n o.src = src\n o.async = true\n if (callback) { o.addEventListener('load', callback, false) }\n s.parentNode.insertBefore(o, s)\n}\n\n/**\n * Create standardized constant for namespacing modules\n * @param {String} constant - to be used as unique module name\n * @param {String} service - usually from ENV.SERVICE (example: \"WEB\", \"SERVER\", \"API\")\n * @returns {String} namespace - prefixed with service name (example: \"~WEB USER_LOGIN\")\n */\nexport function namespace (constant, service) {\n return `~${service} ${constant}`\n}\n\n/**\n * Check Password Strength\n *\n * @See: https://github.com/dropbox/zxcvbn\n *\n * @param {String} password - to check\n * @return {Object} strength - result\n */\nexport function passStrength (password) {\n return Active.passwordCheck(password).score\n}\n\n/**\n * Check that given .env variables are defined, and parse them to objects if necessary\n *\n * @param {Object} variables - key/value pairs of variable names and their descriptions\n * @return {Object} variables - has map of variables with their .env values, or throws error if variables are missing\n */\nexport function requireEnv (variables) {\n const result = {}\n Object.keys(variables).forEach(variable => {\n if (!ENV[variable])\n throw new Error(`Please enter ${variable} in .env in the root directory, as ${variables[variable]}`)\n result[variable] = fromJSON(ENV[variable].replace(/'/g, '\"'))\n })\n return result\n}\n\n/**\n * Add Event Listener\n *\n * @param {String} event - name (i.e. 'keydown', 'keyup', etc.)\n * @param {Function} callback - event handler to add, receives `event` as argument\n */\nexport function subscribeTo (event, callback) {\n if (typeof document === 'undefined') return\n document.addEventListener(event, callback)\n}\n\n/**\n * Remove Event Listener\n *\n * @param {String} event - name (i.e. 'keydown', 'keyup', etc.)\n * @param {Function} callback - event handler to remove\n */\nexport function unsubscribeFrom (event, callback) {\n if (typeof document === 'undefined') return\n document.removeEventListener(event, callback)\n}\n","import { API_REQUEST_TIMEOUT } from 'ui-modules-pack/variables'\nimport {\n Active,\n capitalize,\n CREATE,\n DELETE,\n ERROR,\n GET,\n LIST,\n namespace,\n REQUEST,\n SUCCESS,\n TIMEOUT,\n UPDATE\n} from 'ui-utils-pack'\n\n/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\n/* State Action Types (must have NAME prefix) */\nexport const API = 'API' // Namespace this module\nexport const API_SEVER = namespace(API, Active.SERVICE) // Namespace this module for backend\nexport const API_MODEL = capitalize(API) // db model name\nexport const API_PLATFORM_ANDROID = 'android'\nexport const API_PLATFORM_IOS = 'ios'\nexport const API_PLATFORM_WEB = 'web'\nexport const API_PLACES = 'places'\nexport const API_PROVIDER_GOOGLE = 'google'\n\nexport const NETWORK = `${API}_NETWORK` // Network connection\nexport const ADD_ACTIONS_PENDING_AUTH = `${API}_ACTIONS_PENDING_AUTH`\nexport const CLEAR_ACTIONS_PENDING_AUTH = `${API}_CLEAR_ACTIONS_PENDING_AUTH`\nexport const ADD_ACTIONS_PENDING_LOCATION = `${API}_ACTIONS_PENDING_LOCATION`\nexport const CLEAR_ACTIONS_PENDING_LOCATION = `${API}_CLEAR_ACTIONS_PENDING_LOCATION`\nexport const ADD_ACTIONS_PENDING_NETWORK = `${API}_ACTIONS_PENDING_NETWORK`\nexport const CLEAR_ACTIONS_PENDING_NETWORK = `${API}_CLEAR_ACTIONS_PENDING_NETWORK`\n\n/* General */\nexport const STORAGE_KEY_TOKEN = `${API}_TOKEN`\nexport const REQUEST_TIMEOUT = API_REQUEST_TIMEOUT\nexport const AUTH = 'AUTH' // Authentication resume action type\nexport const LOCATION = 'LOCATION' // Location resume action type\nexport const API_CALL = `${API}_CALL` // -> apiActionType identifier\nexport const API_ACTIONS = [GET, CREATE, UPDATE, DELETE, LIST]\nexport const API_RESULTS = [REQUEST, SUCCESS, ERROR, TIMEOUT]\nexport const NETWORK_ERROR_MESSAGES = ['Network Error']\nexport const REQUEST_TIMEOUT_MESSAGE = `${API} Call Timeout`\n\n/**\n * RESPONSE STATUS CODES (same as Django Rest Framework) -----------------------\n * -----------------------------------------------------------------------------\n */\nexport const HTTP_100_CONTINUE = 100\nexport const HTTP_101_SWITCHING_PROTOCOLS = 101\nexport const HTTP_200_OK = 200\nexport const HTTP_201_CREATED = 201\nexport const HTTP_202_ACCEPTED = 202\nexport const HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203\nexport const HTTP_204_NO_CONTENT = 204\nexport const HTTP_205_RESET_CONTENT = 205\nexport const HTTP_206_PARTIAL_CONTENT = 206\nexport const HTTP_300_MULTIPLE_CHOICES = 300\nexport const HTTP_301_MOVED_PERMANENTLY = 301\nexport const HTTP_302_FOUND = 302\nexport const HTTP_303_SEE_OTHER = 303\nexport const HTTP_304_NOT_MODIFIED = 304\nexport const HTTP_305_USE_PROXY = 305\nexport const HTTP_306_RESERVED = 306\nexport const HTTP_307_TEMPORARY_REDIRECT = 307\nexport const HTTP_400_BAD_REQUEST = 400\nexport const HTTP_401_UNAUTHORIZED = 401\nexport const HTTP_402_PAYMENT_REQUIRED = 402\nexport const HTTP_403_FORBIDDEN = 403\nexport const HTTP_404_NOT_FOUND = 404\nexport const HTTP_405_METHOD_NOT_ALLOWED = 405\nexport const HTTP_406_NOT_ACCEPTABLE = 406\nexport const HTTP_407_PROXY_AUTHENTICATION_REQUIRED = 407\nexport const HTTP_408_REQUEST_TIMEOUT = 408\nexport const HTTP_409_CONFLICT = 409\nexport const HTTP_410_GONE = 410\nexport const HTTP_411_LENGTH_REQUIRED = 411\nexport const HTTP_412_PRECONDITION_FAILED = 412\nexport const HTTP_413_REQUEST_ENTITY_TOO_LARGE = 413\nexport const HTTP_414_REQUEST_URI_TOO_LONG = 414\nexport const HTTP_415_UNSUPPORTED_MEDIA_TYPE = 415\nexport const HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE = 416\nexport const HTTP_417_EXPECTATION_FAILED = 417\nexport const HTTP_428_PRECONDITION_REQUIRED = 428\nexport const HTTP_429_TOO_MANY_REQUESTS = 429\nexport const HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431\nexport const HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS = 451\nexport const HTTP_500_INTERNAL_SERVER_ERROR = 500\nexport const HTTP_501_NOT_IMPLEMENTED = 501\nexport const HTTP_502_BAD_GATEWAY = 502\nexport const HTTP_503_SERVICE_UNAVAILABLE = 503\nexport const HTTP_504_GATEWAY_TIMEOUT = 504\nexport const HTTP_505_HTTP_VERSION_NOT_SUPPORTED = 505\nexport const HTTP_511_NETWORK_AUTHENTICATION_REQUIRED = 511\n","import { stateActionType } from 'ui-modules-pack/redux/actions'\nimport {\n __DEV__,\n CREATE,\n DELETE,\n ERROR,\n GET,\n ID,\n interpolateString,\n isInList,\n LIST,\n performStorage,\n REQUEST,\n RESULT_SEPARATOR,\n SEPARATOR,\n SET,\n swapKeyWithValue,\n UPDATE,\n warn\n} from 'ui-utils-pack'\nimport { API, API_ACTIONS, API_CALL, API_RESULTS, NETWORK, STORAGE_KEY_TOKEN } from './constants'\n\n/**\n * ACTION CREATORS =============================================================\n * =============================================================================\n */\n\n/**\n * API Fetch Action Creator.\n *\n * @param {string} URL - API url to request, can have `{id}` placeholder\n * -> If `id` attribute provided in payload without placeholder, it is appended to endpoint with preceding slash.\n * @param {string} [ACTION = GET] - request action, one of the API_ACTIONS constants\n * @param {object} [payload] - optional, request options\n * -> payload.params will be converted to query string parameters\n * -> payload.body will be JSON stringified automatically if necessary\n * -> Example: {id: 7, params: {limit: 3}} - id `7` will be added to request endpoint, and limit response to `3` results\n * @param {Object} [meta] - optional, request meta data\n * -> meta.url object will be used for endpoint string interpolation with matching `{key}` placeholders\n * -> Example: {url: {'{currency}': BTC} } - endpoint `api.com/exchange/{currency}` will turn to `api.com/exchange/BTC`\n * -> Example: {authenticate: true, callError: false} - request with token, and do not dispatch Error action\n * @returns {Object} - with [API_CALL} key as Flux Standard Action (to be consumed by apiMiddleware).\n */\nexport function apiAction (URL, ACTION = GET, payload = {}, meta = {}) {\n if (!URL) throw Error(`${this.name}() expects URL argument, got ${URL}`)\n\n // Add ID to the url if ID is provided (.replace() will clone the string)\n let url = URL\n if (payload && payload.id) url = URL.includes(ID) ? URL.replace(ID, payload.id) : `${URL}/${payload.id}`\n\n // Check and Interpolate url string if necessary\n url = interpolateString(url, meta.url, {formatKey: '{key}', name: URL})\n\n return {\n [API_CALL]: {\n type: apiActionType(URL, ACTION), // -> if `type` is undefined, ensure apiMiddleware is registered in store\n payload: {url, ...payload},\n meta: {\n method: crudToFetch[ACTION], // -> will be overridden if `method` is provided explicitly\n ...meta\n }\n }\n }\n}\n\n/**\n * API Fetch Action Creator for Tests.\n * Wraps API_CALL action dispatch inside Promise to test in Jest.\n * (to be dispatched with store created using `redux-mock-store` library)\n *\n * @example\n * ```\n * return store.dispatch(apiActionTest(API_TEST_URL, GET, null, { authenticate: false }))\n * .then(() => {\n * const calledActions = store.getActions();\n * expect(calledActions.length).toBe(2);\n * expect(calledActions[0].type).toEqual(apiActionType(API_TEST_URL, GET, REQUEST));\n * expect(calledActions[1].type).toEqual(apiActionType(API_TEST_URL, GET, SUCCESS));\n * });\n * ```\n *\n * @params - same as apiAction() method\n * @returns {function(*)} - function that takes `dispatch` as argument and returns resolved Promise\n */\nexport function apiActionTest (URL, ACTION, payload = {}, meta = {}) {\n return (dispatch) => {\n dispatch(apiAction(URL, ACTION, payload, meta))\n\n // Delay assertion to allow result action to be dispatched\n return new Promise((resolve) => {\n setTimeout(resolve, 1) // 1 ms is enough\n })\n }\n}\n\n/**\n * API Fetch Action Type Creator.\n *\n * @param {string} URL - API url to request, can have `{id}` placeholder/s for string interpolation\n * @param {string} ACTION - request action, one of the API_ACTIONS constants\n * @param {string|null} RESULT - request result, one of the API_RESULTS constants\n * @returns {string} - API action type\n */\nexport function apiActionType (URL, ACTION = GET, RESULT = null) {\n if (__DEV__) {\n if (ACTION && !isInList(API_ACTIONS, ACTION)) {\n warn(new TypeError(`${API} action must be one of ${API_ACTIONS}`))\n }\n\n if (RESULT && !isInList(API_RESULTS, RESULT)) {\n warn(new TypeError(`${API} result must be one of ${API_RESULTS}`))\n }\n }\n\n return URL + SEPARATOR + ACTION + (RESULT ? RESULT_SEPARATOR + RESULT : '')\n}\n\n/**\n * Multiple API request Action Types Creator.\n * (For Async Tasks - Sagas to Subscribe to)\n *\n * @NOTE:\n * See documentation for apiActionType() method\n *\n * @param {String} URL - API request URL to subscribe to\n * @param {Array} ACTIONS - list of request actions to subscribe to (i.e. [GET, CREATE, LIST, DELETE])\n * @param {String} [RESULT] - the same result for given actions (i.e. SUCCESS)\n * @returns {Array} - list of different API action types with the same result\n */\nexport function apiActionsType (URL, ACTIONS, RESULT = null) {\n const typeList = []\n\n ACTIONS.forEach(ACTION => {\n typeList.push(apiActionType(URL, ACTION, RESULT))\n })\n\n return typeList\n}\n\n/**\n * Multiple API request Action Type Results Creator.\n * (For Async Tasks - Sagas to Subscribe to)\n *\n * @NOTE:\n * See documentation for apiActionType() method\n *\n * @param {string} URL - API request URL to subscribe to\n * @param {String} ACTION - request action to subscribe to (i.e. GET)\n * @param {Array} [RESULTS] - list of request results for given action (i.e. [SUCCESS, ERROR, TIMEOUT, CANCEL])\n * @returns {Array} - list of the same API action with different results\n */\nexport function apiActionResultsType (URL, ACTION, RESULTS = API_RESULTS) {\n const resultList = [stateActionType(NETWORK, ERROR)] // Catch NETWORK ERROR use case by default\n\n RESULTS.forEach(RESULT => {\n if (RESULT !== REQUEST) resultList.push(apiActionType(URL, ACTION, RESULT))\n })\n\n return resultList\n}\n\n/**\n * Multiple API URLs request Action Type Creator.\n * (For Async Tasks - Sagas to Subscribe to)\n *\n * @NOTE:\n * - FASTER than having individual subscriptions\n * - See documentation for apiActionType() method\n *\n * @example:\n takeEvery(apiActionTypeURLList([\n API_INFO,\n API_TICKERS,\n API_ORDERS,\n ], GET, SUCCESS), tradeUpdate)\n *\n * @param {Array} URLS - list of different API request URLs to subscribe to\n * @param {String} ACTION - request action to subscribe to (i.e. GET)\n * @param {String} [RESULT] - request result for given action (i.e. SUCCESS)\n * @returns {Array} - list of different API action types with the same result\n */\nexport function apiActionURLsType (URLS, ACTION, RESULT = null) {\n const typeList = []\n\n URLS.forEach(URL => {\n typeList.push(apiActionType(URL, ACTION, RESULT))\n })\n\n return typeList\n}\n\n/**\n * API Standard Flux Action Creator\n */\nexport function createAction ({type, payload, meta}, RESULT) {\n return {\n type: type + (RESULT ? RESULT_SEPARATOR + RESULT : ''),\n payload,\n meta: {\n ...meta,\n result: RESULT\n }\n }\n}\n\n/**\n * API Helper Class to Perform Token Storage\n */\nexport default class Api {\n static storeToken (token) {\n if (!token) throw new Error(`${API} expects token, got ${token}`)\n return performStorage(SET, STORAGE_KEY_TOKEN, token)\n }\n\n static getToken () {\n return performStorage(GET, STORAGE_KEY_TOKEN)\n }\n\n static clearToken () {\n return performStorage(DELETE, STORAGE_KEY_TOKEN)\n }\n}\n\n/**\n * Convert API CRUD ACTION to RESTFul Request Method.\n *\n * @Rationale:\n * encapsulate away the RESTFul implementation,\n * because the API can be GraphQL or something else.\n */\nexport const crudToFetch = {\n [LIST]: 'GET',\n [GET]: 'GET',\n [CREATE]: 'POST',\n [UPDATE]: 'PATCH',\n [DELETE]: 'DELETE',\n}\nexport const fetchToCrud = swapKeyWithValue(crudToFetch)\n","import { createSelector } from 'reselect'\nimport { logSelector } from 'ui-utils-pack'\nimport { API } from './constants'\n\n/**\n * STATE SELECTORS =============================================================\n * Memoized Functions - to retrieve specific branches of the app state\n * =============================================================================\n */\n\n/* Actions Pending Authentication */\nexport const actionsPendingAuth = createSelector(\n (state) => state[API].data.actionsPendingAuth,\n (val = []) => {\n logSelector(`${API} actionsPendingAuth`, val)\n return val\n }\n)\n\n/* Actions Pending Location */\nexport const actionsPendingLocation = createSelector(\n (state) => state[API].data.actionsPendingLocation,\n (val = []) => {\n logSelector(`${API} actionsPendingLocation`, val)\n return val\n }\n)\n\n/* Actions Pending Network */\nexport const actionsPendingNetwork = createSelector(\n (state) => state[API].data.actionsPendingNetwork,\n (val = []) => {\n logSelector(`${API} actionsPendingNetwork`, val)\n return val\n }\n)\n","import { stateAction } from 'ui-modules-pack/redux'\nimport { call, delay, put, race, select, take } from 'redux-saga/effects'\nimport { ERROR, hasListValue, hasObjectValue, isInCollection, SUCCESS, TIMEOUT, toUpperCase, VOID } from 'ui-utils-pack'\nimport { apiAction, apiActionResultsType, apiActionType, fetchToCrud } from '../actions'\nimport { CLEAR_ACTIONS_PENDING_NETWORK, HTTP_401_UNAUTHORIZED, NETWORK, REQUEST_TIMEOUT, } from '../constants'\nimport { actionsPendingNetwork } from '../selectors'\n\n/**\n * ASYNC TASK HELPERS ==========================================================\n * =============================================================================\n */\n\n/* Resume API Actions Pending Valid State */\nexport function * resumeActionsPending (type) {\n /**\n * @param {string} type - one of AUTH, LOCATION, or NETWORK;\n */\n let actionsSelector\n let CLEAR_ACTION\n\n switch (type) {\n // case AUTH:\n // actionsSelector = actionsPendingAuth\n // CLEAR_ACTION = CLEAR_ACTIONS_PENDING_AUTH\n // break\n //\n // case LOCATION:\n // actionsSelector = actionsPendingLocation\n // CLEAR_ACTION = CLEAR_ACTIONS_PENDING_LOCATION\n // break\n\n case NETWORK:\n actionsSelector = actionsPendingNetwork\n CLEAR_ACTION = CLEAR_ACTIONS_PENDING_NETWORK\n break\n\n default:\n return\n }\n\n const actionsPending = yield select(actionsSelector)\n\n if (hasListValue(actionsPending)) {\n for (const action of actionsPending) {\n // Dispatch each pending action\n yield put(action)\n }\n\n // Clear all actions from state to prevent recursive loop (must be called last)\n yield put(stateAction(CLEAR_ACTION))\n }\n}\n\n/**\n * Subscribe to all API Request results\n * (optionally resubscribe once on HTTP 401 response)\n *\n * @example\n const {payload = {}, meta: {result} = {}} = yield call(subscribeToApiActionResults, URL, GET, meta)\n if (result === SUCCESS) return payload\n *\n * @return {Object} - action with payload and meta data (payload may not exist on TIMEOUT/VOID results)\n */\nexport function * subscribeToApiResults (URL, ACTION, meta = null, resubscribe = false) {\n /* Match specific action with given meta data */\n if (hasObjectValue(meta)) {\n const listener = race({\n success: take(action => isMatchingApiActionType(action, URL, ACTION, SUCCESS, meta)),\n error: take(action => isMatchingApiActionType(action, URL, ACTION, ERROR, meta)),\n timeout: take(action => isMatchingApiActionType(action, URL, ACTION, TIMEOUT, meta)),\n void: delay(REQUEST_TIMEOUT + 100) // in case API request was not called\n })\n let response = yield listener\n\n // Ignore the first HTTP 401 Unauthorised Response to retry with Token Refresh flow\n if (resubscribe && response.error) {\n const {error: {payload: {status} = {}} = {}} = response\n if (status === HTTP_401_UNAUTHORIZED) response = yield listener // Re-subscribe\n }\n\n return response.success || response.error || response.timeout || {meta: {result: VOID}} // Return action\n } // eslint-disable-line\n\n /* Match generic action */\n else {\n const listener = race({\n action: take(apiActionResultsType(URL, ACTION)),\n void: delay(REQUEST_TIMEOUT + 100) // in case API request was not called\n })\n let response = yield listener\n\n // Ignore the first HTTP 401 Unauthorised Response to retry with Token Refresh flow\n if (resubscribe && response.action) {\n const {payload: {status} = {}, meta: {result} = {}} = response.action\n if (result === ERROR && status === HTTP_401_UNAUTHORIZED) response = yield listener // Re-subscribe\n }\n\n return response.action || {meta: {result: VOID}} // Return action\n }\n}\n\n/**\n * Async Fetch Request Task that always resolves with predictable result\n * @example:\n * const {payload = {}, meta: {result} = {}} = await runTask(fetchFlow, {url, payload: {params: {q: 'query'}}})\n *\n * @returns {IterableIterator<*>} {payload = {}, meta: {result} = {}} - result can be one of API_RESULTS, or VOID\n */\nexport function * fetchFlow ({url, payload, method = 'GET', meta: {headers, ...meta}}) {\n const ACTION = fetchToCrud[toUpperCase(method)]\n // noinspection JSCheckFunctionSignatures\n yield put(apiAction(url, ACTION, payload, {headers, ...meta}))\n return yield call(subscribeToApiResults, url, ACTION, meta)\n}\n\n/**\n * Check if Action is of API Action Type with Matching Result\n *\n * @param {object} action - Flux Standard Action to check\n * @param {string} RESULT - API request response type\n * @return {bool} - true if it is an API Action\n */\nexport function isApiActionType (action, RESULT = SUCCESS) {\n const {type, meta = {}} = action\n return (meta.result === RESULT) && (/^http/i.test(type))\n}\n\nexport function isApiActionTypeSuccess (action) {\n return isApiActionType(action, SUCCESS)\n}\n\nexport function isApiActionTypeTimeout (action) {\n return isApiActionType(action, TIMEOUT)\n}\n\nexport function isApiActionTypeError (action) {\n return isApiActionType(action, ERROR)\n}\n\n/**\n * Check if Action is a Matching API Action Type with given Result and Meta data\n * (for subscribing to the exact apiAction).\n *\n * @param {object} action - Flux Standard Action to check against\n * @param {string} URL - API request URL\n * @param {string} ACTION - API request method type\n * @param {string} RESULT - API request response type\n * @param {Object} meta - API meta data to match (with include comparison)\n * @return {bool} - true if it's a matching API Action\n */\nexport function isMatchingApiActionType (action, URL, ACTION, RESULT, meta) {\n return action.type === apiActionType(URL, ACTION, RESULT) && isInCollection([action.meta], meta)\n}\n","import { runTask } from 'ui-modules-pack/saga/utils'\nimport { fetchFlow } from './utils'\n\n/**\n * FETCH API WRAPPER ===========================================================\n * =============================================================================\n */\n\n/**\n * Wrapper for fetch request with identical interface to Fetch API,\n * but using redux actions (via the `core/src/common/api` module).\n * This makes it easy to debug because requests are logged to console (if `core/src/common/logger` module is enabled).\n * @todo: write test because upgrading may break current implementation\n * @example:\n * const {payload = {}, meta: {result} = {}} = await fetch(url, {params: {q: 'query'}})\n *\n * @param {String} url - to fetch\n * @param {String} [method] - RESTFul fetch method ['GET', 'POST', 'PATCH', 'DELETE'], default is 'GET'\n * @param {Object} [body] - payload to send with request\n * @param {Object} [params] - query string to append to url\n * @param {Object} [meta] - additional metadata to attach to the request\n * @returns {Promise<{payload, meta}>} action - result is always a Flux Standard Action with `meta.result`\n */\nexport function fetch (url, {method, body, params, ...meta} = {}) {\n return runTask(fetchFlow, {url, method, payload: {body, params}, meta})\n}\n","import { Active } from './_envs.js'\nimport { LANGUAGE } from './constants.js'\n\n/**\n * PROJECT DEFINITIONS =========================================================\n * =============================================================================\n */\n\n/**\n * Define Getters and Setters for Definition Object to avoid duplicate definitions by mistake\n *\n * @example:\n * const FIELD = definitionSetup('TYPE', 'ID')\n * FIELD.TYPE = {\n * EXPAND: 'Expand',\n * COLLAPSE: 'Expand', // throws error because of duplicate value 'Expand'\n * }\n * ....\n * FIELD.TYPE = {\n * EXPAND: 'Expand' // throws error the second time because of duplicate key 'EXPAND'\n * }\n *\n * @param {String} props - list of definition keys\n * @returns {Object} DEFINITION - new object with getters and setters defined for given `props`\n */\nexport function definitionSetup (...props) {\n const DEFINITION = {}\n props.forEach(prop => {\n const _key = `_${prop}`\n Object.defineProperty(DEFINITION, prop, {\n get () {\n return this[_key]\n },\n set (def) {\n if (!this[_key]) this[_key] = {}\n const data = this[_key]\n for (const key in def) {\n if (data[key] != null)\n throw new Error(`Duplicate ${prop}[${key}] definition ${JSON.stringify(def, null, 2)}`)\n const value = def[key]\n for (const i in data) {\n if (data[i] === value)\n throw new Error(`Duplicate ${prop}[${key}] definition value \"${value}\" ${JSON.stringify(def, null, 2)}`)\n }\n data[key] = value\n }\n return data\n },\n })\n })\n return DEFINITION\n}\n\n/**\n * Map Object Definition by its Underscore Value\n *\n * @example:\n * definitionByValue(LANGUAGE)\n * >>> {\n * 'en': {\n * _: 'en',\n * 'en': 'English'\n * ...\n * },\n * ...\n * }\n *\n * @param {Object<KEY<_...>>|Array<_...>} DEFINITION - key/value pairs of variable name with its underscore value\n * @return {Object<_<_...>>} definition - grouped by its underscore value\n */\nexport function definitionByValue (DEFINITION) {\n const result = {}\n for (const index in DEFINITION) {\n const def = DEFINITION[index]\n result[def._] = def\n }\n return result\n}\n\n/**\n * Generate Enumerable List of Values from given Object Definition\n *\n * @example:\n * enumFrom(LANGUAGE)\n * >>> ['en', 'fr'...]\n *\n * @param {Object<KEY<_...>>|Array<_...>} DEFINITION - key/value pairs of variable name with its underscore value\n * @returns {Array<String>} enums - list of enumerable values\n */\nexport function enumFrom (DEFINITION) {\n const list = []\n for (const index in DEFINITION) {\n list.push(DEFINITION[index]._)\n }\n return list\n}\n\n/*\n * Extract Dropdown Options by Language for Given Object Definition\n *\n * @example:\n * const options = optionsFrom(LANGUAGE)\n * <Dropdown options={options.items} .../> // options for currently active language can be accessed via `items`,\n * <Dropdown options={options[LANGUAGE.ENGLISH._]} .../> // or directly via language _\n *\n * @param {Object<KEY<_...>>|Array<_...>} DEFINITION - key/value pairs of variable name with its underscore value\n * @return {Object<items, lang[{text, value}]>} options - grouped by language underscore value, with .items pointing to active lang\n */\nexport function optionsFrom (DEFINITION) {\n const options = {\n get items () {\n return this[Active.LANG._] || this[LANGUAGE.ENGLISH._] || []\n }\n }\n for (const index in DEFINITION) {\n const {_: value, ...langs} = DEFINITION[index]\n for (const lang in langs) {\n const text = langs[lang]\n // Dropdown `value` cannot be array because of shallow match\n options[lang] = (options[lang] || []).concat({text, value: value.constructor === Array ? value.join(',') : value})\n }\n }\n return options\n}\n\n/**\n * Prepare definitions for localisation, so they can be accessed via .name property without needing active language _\n *\n * @example:\n * localise(LANGUAGE)\n * console.log(LANGUAGE.ENGLISH.name)\n * >>> English\n *\n * @param {Object|Object<KEY<_...>>|Array<_...>} DEFINITION - key/value pairs of variable name with its _ value\n * Multiple definitions can be nested unlimited times inside a single object.\n */\nexport function localise (DEFINITION) {\n for (const index in DEFINITION) {\n const definition = DEFINITION[index]\n const {_, name} = definition\n if (name == null && _ != null) {\n Object.defineProperty(DEFINITION[index], 'name', {\n get () {\n return this[Active.LANG._] != null\n ? this[Active.LANG._]\n : (this[LANGUAGE.ENGLISH._] != null ? this[LANGUAGE.ENGLISH._] : String(_))\n }\n })\n } else {\n if (definition.constructor === Object) localise(definition, Active) // recursively process nested definitions\n }\n }\n}\n\n/**\n * Prepare translations for localisation by mutation, so they can be accessed directly via .TEXT property\n * @Note: can be applied repeatedly to add new translations or languages after requests from API\n *\n * @example:\n * const _ = localiseTranslation(TRANSLATIONS)\n * log(_.SEARCH)\n * # if active language is English\n * >>> 'Search'\n * # if active language is Russian\n * >>> 'Поиск'\n *\n * Add language:\n * _.SEARCH = {\n * ..., // previous definitions\n * [l.CHINESE]: '搜索', // language addition\n * }\n * log(_.SEARCH)\n * # if active language is Chinese\n * >>> 搜索\n *\n * @param {Object|Object<KEY<_...>>} TRANSLATION - key/value pairs of variable name with its localised values\n * @returns {Object} translations - with all definitions as javascript getters returning currently active language,\n * (falls back to English if definition not found for active language, or empty string).\n */\nexport function localiseTranslation (TRANSLATION) {\n for (const KEY in TRANSLATION) {\n const _data = TRANSLATION[KEY]\n // Update existing translations\n if (KEY in localiseTranslation.instance) {\n localiseTranslation.instance[KEY] = _data\n } else {\n // Define translations for the first time\n const _key = '~' + KEY\n Object.defineProperty(localiseTranslation.instance, KEY, {\n get () {\n // initially cannot use setter to define translations, thus fallback to _data\n const data = localiseTranslation.instance[_key] || (localiseTranslation.instance[_key] = _data)\n return data[Active.LANG._] || data[Active.DEFAULT.LANGUAGE] || KEY || ''\n },\n set (data) {\n // merge new translations with existing\n localiseTranslation.instance[_key] = {...localiseTranslation.instance[_key], ...data}\n }\n })\n }\n }\n return localiseTranslation.instance\n}\n\nlocaliseTranslation.instance = {}\nlocaliseTranslation.queriedById = {}\n\n/**\n * Create Initial Values for given Object Definition\n *\n * @example:\n * initValuesFor(LANGUAGE, LANGUAGE_LEVEL.BASIC._)\n * >>> {'en': 1, 'fr': 1, ...}\n *\n * @param {Object<KEY<_...>>} DEFINITION - key/value pairs of variable name with its underscore value\n * @param {Number} initValue - the initial value to use for each option\n * @return {Object} initial values - to use with redux form, for example\n */\nexport function initValuesFor (DEFINITION, initValue = 1) {\n const initValues = {}\n for (const key in DEFINITION) {\n initValues[DEFINITION[key]._] = initValue\n }\n return initValues\n}\n\n/**\n * Convert Single/Multiple Definition Values into Human Friendly String/s\n *\n * @param {String|Number|Array} values - definition's underscore value/s\n * @param {Object} definitionByValue - example: definitionByValue(LANGUAGE)\n * @param {*} [output] - one of types (i.e. String, Array, etc.)\n * @returns {String|Array<String>} string/s - for human consumption\n */\nexport function valueToName (values, definitionByValue, output = String) {\n const items = ((values && values.constructor === Array) ? values : [values]).map(code => (definitionByValue[code] || {}).name)\n switch (output) {\n case Array:\n return items\n case String:\n default:\n return items.join(' ' + _.OR + ' ')\n }\n}\n","import { l } from './constants'\nimport { localiseTranslation } from './definitions'\n\n/**\n * LOCALISED TRANSLATIONS (i18n) ===============================================\n * =============================================================================\n */\n\n/**\n * Localised String Object (can be extended by adding new terms or languages)\n * @note: follow the example to ensure only one instance of translation exists.\n * @example:\n * import { l, localiseTranslation } from 'ui-utils-pack'\n * export { _ } from 'ui-utils-pack/translations'\n * localiseTranslation({\n * NEW_PHRASE: {\n * [l.ENGLISH]: 'New Phrase',\n * },\n * })\n * @usage:\n * console.log(_.NEW_PHRASE)\n * >>> 'New Phrase'\n * console.log(_.THANK_YOU)\n * >>> 'Thank You!'\n * @returns {Object} localised string - that returns localised 'Untranslated' string if no translation found\n */\nexport const _ = new Proxy(localiseTranslation.instance, {\n get (target, prop) {\n return localiseTranslation.queriedById[prop] = (target[prop] || target.UNTRANSLATED)\n }\n})\nlocaliseTranslation({\n // Default messaged for undefined strings\n UNTRANSLATED: {\n [l.ENGLISH]: 'Untranslated',\n // @Note: only english is provided in the bundle definition\n // All other languages are to be loaded on the fly as static assets,\n // so that they can be cached by the the browser.\n },\n\n // Actions\n // ---------------------------------------------------------------------------\n ADD: {\n [l.ENGLISH]: 'Add',\n },\n CLICK_HERE: {\n [l.ENGLISH]: 'Click here',\n },\n CONTACT_US: {\n [l.ENGLISH]: 'Contact Us',\n },\n COPY: {\n [l.ENGLISH]: 'Copy',\n },\n COPIED: {\n [l.ENGLISH]: 'Copied',\n },\n NO: {\n [l.ENGLISH]: 'No',\n },\n YES: {\n [l.ENGLISH]: 'Yes',\n },\n OK: {\n [l.ENGLISH]: 'Ok',\n },\n ERROR: {\n [l.ENGLISH]: 'Error',\n },\n ERROR_MESSAGE: {\n [l.ENGLISH]: 'Error Message',\n },\n ERROR_INFO: {\n [l.ENGLISH]: 'Error Info',\n },\n ERROR_STACK: {\n [l.ENGLISH]: 'Error Stack',\n },\n DATA_CAUSING_ERROR: {\n [l.ENGLISH]: 'Data Causing Error',\n },\n CLOSE: {\n [l.ENGLISH]: 'Close',\n },\n OPEN: {\n [l.ENGLISH]: 'Open',\n },\n DELETE: {\n [l.ENGLISH]: 'Delete',\n },\n REMOVE: {\n [l.ENGLISH]: 'Remove',\n },\n BACK: {\n [l.ENGLISH]: 'Back',\n },\n NEXT: {\n [l.ENGLISH]: 'Next',\n },\n NEW: {\n [l.ENGLISH]: 'New',\n },\n LOGIN: {\n [l.ENGLISH]: 'Login',\n },\n LOGIN_noun: {\n [l.ENGLISH]: 'Login',\n },\n LOGOUT: {\n [l.ENGLISH]: 'Logout',\n },\n REGISTER: {\n [l.ENGLISH]: 'Register',\n },\n RESET: {\n [l.ENGLISH]: 'Reset',\n },\n RETRY: {\n [l.ENGLISH]: 'Retry',\n },\n SELECT: {\n [l.ENGLISH]: 'Select',\n },\n SEARCH: {\n [l.ENGLISH]: 'Search',\n },\n SEARCHING___: {\n [l.ENGLISH]: 'Searching...',\n },\n SIGN_IN: {\n [l.ENGLISH]: 'Sign in',\n },\n SIGN_IN_noun: {\n [l.ENGLISH]: 'Sign in',\n },\n SIGNUP: {\n [l.ENGLISH]: 'Signup',\n },\n SIGNUP_noun: {\n [l.ENGLISH]: 'Signup',\n },\n SEND: {\n [l.ENGLISH]: 'Send',\n },\n SUBMIT: {\n [l.ENGLISH]: 'Submit',\n },\n SAVE: {\n [l.ENGLISH]: 'Save',\n },\n SAVED: {\n [l.ENGLISH]: 'Saved',\n },\n SAVE_TO_FAVORITES: {\n [l.ENGLISH]: 'Save to Favorites',\n },\n TYPE_A_MESSAGE: {\n [l.ENGLISH]: 'Type a message',\n },\n HIDE: {\n [l.ENGLISH]: 'Hide',\n },\n SHOW: {\n [l.ENGLISH]: 'Show',\n },\n SHOW_LESS: {\n [l.ENGLISH]: 'Show less',\n },\n READ_MORE: {\n [l.ENGLISH]: 'Read more',\n },\n\n // Common\n // ---------------------------------------------------------------------------\n BY: {\n [l.ENGLISH]: 'by',\n },\n BETWEEN: {\n [l.ENGLISH]: 'between',\n },\n OR: {\n [l.ENGLISH]: 'or',\n },\n PRIVACY_POLICY: {\n [l.ENGLISH]: 'Privacy Policy',\n },\n YOUR_INFO_IS_SAFE_WITH_US_SEE_OUR: {\n [l.ENGLISH]: 'Your info is safe with us, see our',\n },\n TERMS_OF_SERVICE: {\n [l.ENGLISH]: 'Terms of Service',\n },\n TESTER: {\n [l.ENGLISH]: 'Tester',\n },\n THANK_YOU: {\n [l.ENGLISH]: 'Thank You!',\n },\n WE_HAVE_RECEIVED_YOUR_MESSAGE_AND_WILL_GET_IN_TOUCH_SHORTLY: {\n [l.ENGLISH]: 'We have received your message and will get in touch shortly',\n },\n OUR_SITE_USES_COOKIES_BY_CONTINUING_TO_USE_OUR_SITE_YOU_ARE_AGREEING_TO_OUR: {\n [l.ENGLISH]: 'Our site uses cookies. By continuing to use our site you are agreeing to our',\n },\n OK_I_UNDERSTAND: {\n [l.ENGLISH]: 'OK, I understand',\n },\n PLEASE: {\n [l.ENGLISH]: 'Please',\n },\n USE_ANOTHER_BROWSER_TO: {\n [l.ENGLISH]: 'Use another browser to',\n },\n DONT_SHOW_AGAIN: {\n [l.ENGLISH]: `Don't Show Again`,\n },\n ERROR_ID: {\n [l.ENGLISH]: 'Error ID',\n },\n REASON: {\n [l.ENGLISH]: 'Reason',\n },\n STATUS: {\n [l.ENGLISH]: 'Status',\n },\n REQUEST_FAILED: {\n [l.ENGLISH]: 'Request Failed',\n },\n SERVER_DISCONNECTED: {\n [l.ENGLISH]: 'Server Disconnected',\n },\n DOWNLOAD_FAILED_: {\n [l.ENGLISH]: 'Download Failed!',\n },\n REQUEST_FAILED_FOR_url: {\n [l.ENGLISH]: 'Request failed for {url}',\n },\n})\n","import { l, localiseTranslation } from 'ui-utils-pack'\n\n/**\n * LOCALISED TRANSLATIONS (i18n) ===============================================\n * =============================================================================\n */\nlocaliseTranslation({\n CHARACTER: {\n [l.ENGLISH]: 'Character',\n },\n ENTER_NUMBER_STARTING_WITH_plus_COUNTRY_CODE: {\n [l.ENGLISH]: 'Enter number starting with + country code',\n },\n INVALID_DATE: {\n [l.ENGLISH]: 'Invalid date',\n },\n INVALID_EMAIL_ADDRESS: {\n [l.ENGLISH]: 'Invalid email address',\n },\n INVALID_URL: {\n [l.ENGLISH]: 'Invalid URL',\n },\n MUST_BE_LESS_THEN_characters: {\n [l.ENGLISH]: 'Must be less than {characters}',\n },\n MUST_BE_IN_THE_PAST: {\n [l.ENGLISH]: 'Must be in the past',\n },\n MUST_BE_IN_THE_FUTURE: {\n [l.ENGLISH]: 'Must be in the future',\n },\n MUST_HAVE_START_TIME: {\n [l.ENGLISH]: 'Must have start time',\n },\n MUST_HAVE_END_TIME: {\n [l.ENGLISH]: 'Must have end time',\n },\n PASSWORD_IS_TOO_WEAK: {\n [l.ENGLISH]: 'Password is too weak',\n },\n PASSWORD_MISMATCH: {\n [l.ENGLISH]: 'Password mismatch',\n },\n REQUIRED: {\n [l.ENGLISH]: 'Required',\n },\n})\n","import { interpolateString, isEmpty, isNumeric, isPhoneNumber, pluralize, toList, toLowerCase } from 'ui-utils-pack'\nimport { _ } from 'ui-utils-pack/translations'\nimport { isGoodPassword } from 'ui-utils-pack/utility'\nimport isEmail from 'validator/lib/isEmail'\nimport isLength from 'validator/lib/isLength'\nimport isURL from 'validator/lib/isURL'\nimport * as t from './translations'\n\nconst sideEffects = {t}\n\n/**\n * VALIDATION RULES ============================================================\n * Common validation rules to be used with redux-form\n * =============================================================================\n */\n\n\nexport const OK = undefined // Return type when validation passes\n\nexport function isRequired (value) {\n return (value == null || value === '' || Number.isNaN(value) || (typeof value === 'object' && isEmpty(value))) ? _.REQUIRED : OK\n}\n\nexport function url (value) {\n return (value && !isURL(String(value), {require_protocol: true})) ? _.INVALID_URL : OK\n}\n\nexport function email (value) {\n return value && (isEmail(String(value)) ? OK : _.INVALID_EMAIL_ADDRESS)\n}\n\nexport function maxLength (length = 100) {\n return (value) => (\n isLength(String(value), {max: length})\n ? OK\n : interpolateString(_.MUST_BE_LESS_THEN_characters, {characters: pluralize(toLowerCase(_.CHARACTER), length, true)})\n )\n}\n\nexport function password (value) {\n password.value = value\n return (!value || isGoodPassword(value)) ? OK : _.PASSWORD_IS_TOO_WEAK\n}\n\n// @Note: must be called after `password` validator, because it depends on value set by that function\npassword.confirm = (value) => {\n return (value === password.value) ? OK : _.PASSWORD_MISMATCH\n}\n\nexport function phoneNumber (value) {\n return (!value || isPhoneNumber(value)) ? OK : _.ENTER_NUMBER_STARTING_WITH_plus_COUNTRY_CODE\n}\n\nexport function dateMonthYear (value) {\n return /^([0-3])?[0-9]\\.([0-1])?[0-9]\\.\\d+$/.test(value) ? OK : _.INVALID_DATE\n}\n\nexport function timeInThePast (value) {\n if (!isNumeric(value)) return OK\n const now = Date.now()\n return value >= now ? _.MUST_BE_IN_THE_PAST : OK\n}\n\nexport function timeRangesInFuture (value) {\n if (isEmpty(value)) return OK\n const now = Date.now()\n return toList(value).find(({from, to}) => (from <= now || to <= now)) ? _.MUST_BE_IN_THE_FUTURE : OK\n}\n\n// Validate that Time Ranges contain `from` and `to` time\nexport function timeRanges (value) {\n if (isEmpty(value)) return OK\n const values = toList(value)\n if (!values.find(({from}) => from != null)) return _.MUST_HAVE_START_TIME\n if (!values.find(({to}) => to != null)) return _.MUST_HAVE_END_TIME\n return OK\n}\n","import React, { useContext } from 'react'\nimport { Active } from 'ui-utils-pack'\nimport { SOUND } from '../files'\n\n/**\n * Add Accessibility Support to React Component\n *\n * @param {Object} props - React render props\n * @param {Object} [sound] - new Audio(URL) file\n * @returns {Object} props - mutated with necessary accessibility attributes\n */\nexport function accessibilitySupport (props, sound = Active.SETTINGS.HAS_SOUND && SOUND.TOUCH) {\n /* Remove key press and click event if necessary */\n if (props.tabIndex === -1) {\n delete props.onKeyPress\n delete props.onClick\n } else {\n const {onClick, onKeyPress, tabIndex} = props\n if (sound && onKeyPress) props.onKeyPress = onPressHoc(onKeyPress, sound)\n if (onClick) {\n if (sound) props.onClick = onPressHoc(onClick, sound)\n if (tabIndex == null) props.tabIndex = 0 // add keyboard accessibility for onClick\n if (!onKeyPress) props.onKeyPress = (event) => (event.key === 'Enter' && props.onClick(event))\n } else {\n delete props.onClick\n }\n }\n return props\n}\n\n/**\n * Higher Order Function Wrapper for onClick event to play sound\n * @example:\n * <Button onClick={onPressHoc(onClick, sound)}/>\n *\n * @param {Function} onClick\n * @param {Object} [sound] - new Audio(URL) file object\n * @returns {Function} onPress - callback\n */\nexport function onPressHoc (onClick, sound) {\n return function onPress () {\n if (sound) sound.play()\n onClick && onClick(...arguments)\n }\n}\n\n/**\n * React Component Context Decorator\n */\nexport function withContext (Component) {\n return function ContextWrapper (props) {\n const context = useContext(UIContext)\n return <Component {...context} {...props}/>\n }\n}\n\n/**\n * React Component Timer Decorator to clearTimeout() and clearInterval() automatically on componentWillUnmount()\n * @example:\n * @withTimer\n * class Homepage extends Component {\n * animate = () => {\n * this.setTimeout(this.props.animate, 500)\n * this.setInterval(this.props.refresh, 500)\n * }\n * }\n *\n * @param {Object} Class - to be decorated\n */\nexport function withTimer (Class) {\n const componentWillUnmount = Class.prototype.componentWillUnmount\n\n Class.prototype.setTimeout = function () {\n if (!this.timers) this.timers = []\n this.timers.push(setTimeout(...arguments))\n }\n\n Class.prototype.setInterval = function () {\n if (!this.intervals) this.intervals = []\n this.intervals.push(setInterval(...arguments))\n }\n\n Class.prototype.clearTimer = function () {\n if (this.timers) this.timers.forEach(clearTimeout)\n if (this.intervals) this.intervals.forEach(clearInterval)\n }\n\n Class.prototype.componentWillUnmount = function () {\n this.clearTimer()\n if (componentWillUnmount) componentWillUnmount.apply(this, arguments)\n }\n\n return Class\n}\n\nexport const UIContext = React.createContext({})\n","import classNames from 'classnames'\nimport React from 'react'\nimport { accessibilitySupport } from './utils'\nimport { Active } from 'ui-utils-pack'\n\n/**\n * Text View - Pure Component.\n * (to be used as replacement for `<span></span>` for cross platform integration)\n *\n * @param {string} [className] - optional css class name\n * @param {Function} [onClick] - callback to fire on click or Enter press (if `onKeyPress` not given)\n * @param {Boolean} [fill] - whether to make the view fill up available height and width\n * @param {Boolean} [reverse] - whether to reverse order of rendering\n * @param {Boolean} [rtl] - whether to use right to left direction\n * @param {Object} [sound] - new Audio(URL) sound file\n * @param {*} props - other attributes to pass to `<div></div>`\n * @returns {Object} - React Component\n */\nexport function Text ({\n className,\n fill,\n reverse,\n rtl,\n sound,\n expanded: _, // not used, remove to prevent warnings\n children,\n translate = Active.translate,\n ...props\n}) {\n props = accessibilitySupport(props, sound)\n return (\n <span className={classNames('text', {fill, reverse, rtl, pointer: props.onClick}, className)} {...props}>\n {(typeof children === 'string') ? translate(children) : children}\n </span>\n )\n}\n\nexport default React.memo(Text)\n","import classNames from 'classnames'\nimport React from 'react'\n\n/**\n * Tooltip - Pure Component\n */\nexport function Tooltip ({top, bottom, right, left, show, className, ...props}) {\n return <span\n className={classNames('tooltip no-wrap', {top, bottom, right, left, show}, className)} {...props} />\n}\n\nexport default React.memo(Tooltip)\n","import React from 'react'\nimport { Popup as Pop } from 'semantic-ui-react'\nimport { isFunction } from 'ui-utils-pack'\n\n/**\n * Tooltip Component using Semantic UI Popup\n */\nexport default function TooltipPop ({\n title,\n children,\n delay,\n inverted,\n ...props\n}) {\n // fix for Semantic UI issue https://github.com/Semantic-Org/Semantic-UI-React/pull/4029\n if (isFunction(title)) title = {children: title}\n return (\n <Pop inverted={inverted} trigger={children} content={title} mouseEnterDelay={delay} {...props}/>\n )\n}\n\n// Override `defaultProps` attributes for custom behavior\nTooltipPop.defaultProps = {\n // improve UX by avoiding accidental popup when user is already familiar with the UI\n delay: 500,\n}\n","import classNames from 'classnames'\nimport React from 'react'\nimport { isFunction } from 'ui-utils-pack'\nimport { accessibilitySupport } from './utils'\n\n/**\n * View - Pure Component.\n * @todo: test rendering without React.memo on large scene to see which is faster.\n * With default `display: flex` style\n * (to be used as replacement for `<div></div>` and `<span></span>` for cross platform integration)\n *\n * @param {string} [className] - optional css class\n * @param {Function} [onClick] - callback to fire on click or Enter press (if `onKeyPress` not given)\n * @param {Boolean} [fill] - whether to make the view fill up available height and width\n * @param {Boolean} [reverse] - whether to reverse order of rendering\n * @param {Boolean} [rtl] - whether to use right to left direction\n * @param {Object} [sound] - new Audio(URL) sound file\n * @param {*} props - other attributes to pass to `<div></div>`\n * @param {*} [ref] - callback(element) when component mounts, or from React.createRef()\n * @returns {Object} - React Component\n */\nexport function View ({\n className,\n fill,\n reverse,\n rtl,\n sound,\n expanded: _, // not used, remove to prevent warnings\n translate: _2,\n onDataChanged: _3,\n ...props\n}, ref) {\n props = accessibilitySupport(props, sound)\n if (isFunction(ref)) props.ref = ref\n return <div className={classNames('flex--col', {fill, reverse, rtl, pointer: props.onClick}, className)} {...props}/>\n}\n\nexport const ViewRef = React.forwardRef(View)\nexport default React.memo(View)\n","import { definitionSetup, LANGUAGE_LEVEL } from 'ui-utils-pack'\nimport { TYPE } from './definitions'\n\n/**\n * FIELD DEFINITIONS ===========================================================\n */\nexport const FIELD = definitionSetup('TYPE', 'RENDER', 'ACTION', 'ID', 'DEF', 'MIN_MAX', 'FOR')\n\n// Field Type Definitions\nFIELD.TYPE = {\n BUTTON: 'Button',\n EXPAND: 'Expand', // Expandable/collapsing content with clickable `title` or `renderLabel` area\n EXPAND_LIST: 'ExpandList', // list of Expand components with dynamic `renderLabel` and `renderItem` attributes\n CHECKBOX: 'Checkbox', // checkbox with optional label\n COL: 'Col', // Vertical column layout\n COL2: 'Column', // alias for Column\n COL3: 'VerticalLayout', // alias for Column\n COL_LIST: 'ColList', // alias for List\n COL_LIST3: 'VerticalList', // alias for List\n COUNTER: 'Counter', // Animated number changing from `start` to `end` values\n DROPDOWN: 'Dropdown', // Semantic UI Dropdown\n LABEL: 'Label',\n LIST: 'List', // list of Col components with dynamic `renderItem` attributes\n PIE_CHART: 'PieChart', // Pie chat (can be in shape of donut) with optional legends\n PROGRESS_STEPS: 'ProgressSteps', // Progress Steps, with content like Tabs\n ROW: 'Row', // Horizontal row layout\n ROW2: 'HorizontalLayout', // alias for Row\n ROW_LIST: 'RowList', // alias for List with Row layout\n ROW_LIST2: 'HorizontalList', // alias for List with Row layout\n SPACE: 'Space', // for adding space between items\n TABLE: 'Table',\n TABS: 'Tabs',\n TAB_LIST: 'TabList',\n TEXT: 'Text',\n TITLE: 'Title', // A customised `Text` view with certain styling for consistent look and feel\n TOOLTIP: 'Tooltip', // A hint components that pops up when element is being hovered\n // ...to be populated by modules\n}\n\n// Value Renderer Definitions\nFIELD.RENDER = {\n CURRENCY: 'Currency',\n PERCENT: 'Percent',\n DOUBLE5: 'Double5',\n FLOAT: 'Float',\n TITLE_n_INPUT: 'Title+Input',\n STRING: 'String',\n DATE: 'Date'\n}\n\n// Action Type Definitions\nFIELD.ACTION = {\n RESET: 'reset',\n SET_STATE: 'setState',\n FETCH: 'fetch',\n POPUP: 'popup',\n WARN: 'warn',\n}\n\n// Action Methods by Action Type Definitions\nFIELD.FUNC = {\n [FIELD.ACTION.WARN]: console.warn,\n}\n\n// Field IDs for uniquely identifying field definitions\nFIELD.ID = {\n // Common Inputs\n ID: 'id', // use lower case value so it can be used as input.name by default\n ID_HIDDEN: 'id_hidden', // input `name` should be set to `id`, defining with underscore to avoid potential conflict\n NAME: 'name',\n EMAIL: 'email',\n ABOUT: 'about',\n ADDRESS: 'address',\n LANGUAGE: 'language',\n PHONE: 'phone',\n WEBSITE: 'website',\n\n // ...to be populated by modules\n}\n\n// Field Min/Max Value Definitions by ID (used for extending base definitions from FIELD.DEF)\nFIELD.MIN_MAX = {\n // Common\n [FIELD.ID.LANGUAGE]: [LANGUAGE_LEVEL.BASIC._, LANGUAGE_LEVEL.NATIVE._],\n // ...to be populated by modules\n}\n\n// Field Definitions by ID\nFIELD.DEF = {\n // ...to be populated by modules (see form/constants for reference)\n}\n","/**\n * RegExp to test a string for a ISO 8601 Date spec\n * YYYY\n * YYYY-MM\n * YYYY-MM-DD\n * YYYY-MM-DDThh:mmTZD\n * YYYY-MM-DDThh:mm:ssTZD\n * YYYY-MM-DDThh:mm:ss.sTZD\n * @see: https://www.w3.org/TR/NOTE-datetime\n * @type {RegExp}\n */\nexport const ISO_8601 = /^\\d{4}(-\\d\\d(-\\d\\d(T\\d\\d:\\d\\d(:\\d\\d)?(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?)?)?)?$/i\n\n\n\n/**\n * RegExp to test a string for a full ISO 8601 Date\n * Does not do any sort of date validation, only checks if the string is according to the ISO 8601 spec.\n * YYYY-MM-DDThh:mm:ss\n * YYYY-MM-DDThh:mm:ssTZD\n * YYYY-MM-DDThh:mm:ss.sTZD\n * @see: https://www.w3.org/TR/NOTE-datetime\n * @type {RegExp}\n */\nexport const ISO_8601_FULL = /^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?$/i\n","import { merge, isObject } from 'ui-utils-pack/object'\nimport { errorsMap } from './rules'\nimport { FIELD, ISO_8601_FULL } from 'ui-modules-pack'\nimport { cloneDeep } from 'ui-utils-pack'\nimport { storedTouched } from 'ui-modules-pack/form'\n\nexport const getFormsData = (forms) => {\n const formDataArray = [];\n\n forms.forEach(value => {\n const { form, meta } = value;\n const formData = getStructuredDataFromFormObject(form, meta);\n if (formData) {\n formDataArray.push(formData);\n }\n })\n\n return mergeData([...formDataArray]);\n}\n\nconst getStructuredDataFromFormObject = (form, meta) => {\n const { relativePath, relativeIndex } = meta || {};\n\n if (relativePath && typeof relativeIndex === 'undefined') {\n return;\n }\n\n const formValues = cloneDeep(form.getState().values);\n const formState = changeOptionOrderForSelectFields(formValues, meta);\n\n if (!relativePath) {\n return formState;\n }\n\n return createObjectStructure(formState, relativePath, relativeIndex);\n}\n\nconst createObjectStructure = (value, relativePath, relativeIndex) => {\n return relativePath.split('.').reverse().reduce((acc, item, index) => {\n const result = {};\n if (index === 0) {\n const tmpArray = [];\n tmpArray[relativeIndex] = value;\n result[item] = tmpArray;\n } else {\n result[item] = acc;\n }\n\n return result;\n }, {})\n}\n\nconst mergeData = (formData) => {\n let masterDataIndex = -1;\n // Find Master object which contains all data structure\n // It should be one object in array\n // All other objects contain only one property at the first level of the structure\n let result = formData.find((formValues, index) => {\n if (Object.keys(formValues).length !== 1) {\n masterDataIndex = index;\n return true\n }\n return false;\n })\n\n formData.forEach((formValues, index) => {\n if (index === masterDataIndex) {\n return;\n }\n\n result = merge(result, formValues);\n })\n\n return result;\n}\n\nexport const replaceDeep = (object, key, value) => {\n if (Array.isArray(object)) {\n object.forEach(item => {\n replaceDeep(item, key, value)\n })\n } else if (isObject(object)) {\n if (object.hasOwnProperty(key)) {\n object[key] = value;\n }\n\n Object.keys(object).forEach(k => {\n replaceDeep(object[k], key, value)\n })\n }\n};\n\nfunction getKeyAndPathFromMetaData(meta) {\n const { relativeIndex, relativePath } = meta;\n let path = '';\n let key = 'master';\n\n if (relativePath && typeof relativeIndex === 'undefined') {\n return {};\n }\n\n if (relativePath) {\n path = `${relativePath}[${relativeIndex}].`;\n key = path;\n }\n\n return { key, path }\n}\n\nexport function errorsProcessing(form, meta) {\n const { key, path } = getKeyAndPathFromMetaData(meta);\n const errors = {};\n\n if (!key) {\n return;\n }\n\n const registeredFieldNames = form.getRegisteredFields()\n if (!registeredFieldNames.length) {\n return;\n }\n\n registeredFieldNames.forEach(field => {\n const { name, error, touched } = form.getFieldState(field);\n\n if (error && (touched || storedTouched[name])) {\n let errorText = error;\n if (errorText === 'Required') {\n errorText = convertFieldNameToTitleCaseText(name) + ' is Required'\n }\n errorsMap[name] = errorText;\n } else {\n delete errorsMap[name];\n }\n })\n}\n\n/*\n Expected format of filed validation object (from Policy team)\n {\n \"quote.termDetails[0].termEffectiveDate\": {\n \"messages\": [\n {\n \"text\": \"Master Policy should be effective on the 1st day of month.\"\n }\n ],\n }\n}\n */\nexport const mapErrorObjectToUIFormat = (errors) => {\n const result = {};\n\n Object.keys(errors).forEach(fieldName => {\n result[fieldName] = {\n messages: [\n {\n text: errors[fieldName]\n }\n ]\n }\n })\n\n return result;\n}\n\nexport const convertFieldNameToTitleCaseText = (str) => {\n let fieldName = str;\n if (fieldName.includes('.')) {\n fieldName = fieldName.split('.').pop();\n }\n const result = fieldName.replace(/([A-Z])/g, \" $1\").trim();\n\n return result.charAt(0).toUpperCase() + result.slice(1);\n}\n\n// Find Select fields and change options order in case select was changed\nconst changeOptionOrderForSelectFields = (data, meta) => {\n // find data related to Select and change options order\n const recursiveDataParser = (data, optionName, selectValue) => {\n let isDataOrderChanged = false\n if (isObject(data)) {\n Object.keys(data).forEach(key => {\n if (Array.isArray(data[key]) && data[key][0] && data[key][0][optionName]) {\n data[key].unshift(data[key].splice(selectValue, 1)[0]);\n isDataOrderChanged = true\n }\n })\n }\n return isDataOrderChanged\n }\n\n if (meta && meta.view === FIELD.TYPE.SELECT) {\n const selectName = meta.name;\n if (typeof data[selectName] === 'string') {\n const { mapOptions } = meta;\n const { text: optionName, value: optionValue } = mapOptions\n if (typeof mapOptions === 'string') {\n recursiveDataParser(data, mapOptions, data[selectName]) && delete data[selectName]\n } else if (optionValue === '{index}') {\n recursiveDataParser(data, optionName, data[selectName]) && delete data[selectName]\n }\n }\n }\n\n if (meta && Array.isArray(meta.items)) {\n meta.items.forEach(item => {\n changeOptionOrderForSelectFields(data, item)\n })\n } else if (meta && meta.renderItem && Array.isArray(meta.renderItem.items)) {\n meta.renderItem.items.forEach(item => {\n changeOptionOrderForSelectFields(data, item)\n })\n }\n\n return data;\n}\n\n/*\n Return date in format 'YYYY-MM-DD'\n */\nexport const getDateStringFromDateObject = (date) => {\n const year = String(date.getUTCFullYear()).padStart(4, '0')\n const month = String(date.getUTCMonth() + 1).padStart(2, '0')\n const day = String(date.getUTCDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n\nexport const normalizeIncomingData = (data) => {\n if (!data) {\n return data\n }\n\n if (typeof data === 'string') {\n if (ISO_8601_FULL.test(data)) {\n // based on previous solution from Normalize function\n return data.split('T')[0]\n }\n\n return data\n }\n\n if (typeof data === 'number') {\n return data\n }\n\n if (data instanceof Date) {\n return getDateStringFromDateObject(data);\n }\n\n if (Array.isArray(data)) {\n return data.map(item => normalizeIncomingData(item))\n }\n\n if (Object.keys(data).length) {\n const nextData = {};\n Object.keys(data).forEach(key => {\n nextData[key] = normalizeIncomingData(data[key])\n })\n return nextData;\n }\n\n return data;\n}","import { UI } from 'ui-modules-pack/variables'\nimport PropTypes from 'prop-types'\nimport React, { PureComponent } from 'react'\nimport { Field, Form } from 'react-final-form'\nimport { isRequired } from 'ui-react-pack/inputs/validationRules'\nimport Text from 'ui-react-pack/Text'\nimport ToolTip from 'ui-react-pack/Tooltip'\nimport TooltipPop from 'ui-react-pack/TooltipPop'\nimport View from 'ui-react-pack/View'\nimport { Active, debounce, isEqualJSON, toJSON, warn } from 'ui-utils-pack'\nimport { hasObjectValue, objChanges, set } from 'ui-utils-pack/object'\nimport { _ } from 'ui-utils-pack/translations'\nimport { errorsProcessing } from 'core/src/pages/main/utils'\nimport { clearErrorsMap, formsStorage } from 'core/src/pages/main/rules'\nimport arrayMutators from 'final-form-arrays'\n\n/**\n * STATE SELECTORS =============================================================\n * Memoized Functions - to retrieve specific branches of the app state\n * =============================================================================\n */\n\nlet isDataChangedListenerCalled = false;\n\nlet formInitialValues = null;\nexport let storedTouched = {};\n\n/**\n * Get Form's Field Values\n * @param {Object} form - instance from react-final-form\n * @return {Object} formValues - key values of field names and values\n */\nexport function fieldValues (form) {\n return form.getState().values\n}\n\n/**\n * Get Form's Registered Field Values\n *\n * @param {FormApi} form - instance from react-final-form\n * @returns {Object|Undefined} values - nested mapping of field values by their name, or `false` if no field values found\n */\nexport function registeredFieldValues (form) {\n const registeredFieldNames = form.getRegisteredFields()\n if (!registeredFieldNames.length) return\n\n // Return object mapping of registered values,\n // unfilled fields are considered as non-registered.\n const values = {}\n registeredFieldNames.forEach(field => {\n const {value} = form.getFieldState(field)\n if (value != null) set(values, field, value) // use set() to convert nested paths to objects\n })\n if (hasObjectValue(values)) return values\n}\n\n/**\n * Get Form's Registered Field Errors\n *\n * @param {FormApi} form - instance from react-final-form\n * @returns {Object|Undefined} errors - key values of field names and error messages\n */\nexport function registeredFieldErrors (form) {\n const registeredFieldNames = form.getRegisteredFields()\n if (!registeredFieldNames.length) return\n\n // Return object mapping of registered field errors,\n // unfilled fields are considered as non-registered.\n const errors = {}\n registeredFieldNames.forEach(field => {\n const {error} = form.getFieldState(field)\n if (error != null) errors[field] = error\n })\n if (hasObjectValue(errors)) return errors\n}\n\n/**\n * HELPER FUNCTIONS ============================================================\n * =============================================================================\n */\n\n/**\n * Wrapper Proxy for react-final-form Field with unified API.\n * @Note:\n * - `normalize` does not exist in react-final-form, only `format` and `parse`\n * - must use Class to prevent input from loosing focus on input 'onChange'\n *\n * @param InputComponent - React component to use for input\n * @param {Function} sanitize(value, props) - callback to parse (formatted) value from input Field to InputComponent\n * @returns {Class} React InputComponentField - connected to react-final-form\n */\nexport function asField (InputComponent, {sanitize} = {}) {\n if (!Active.Field) Active.Field = Field\n // noinspection JSPotentiallyInvalidUsageOfThis\n const Class = class extends PureComponent {\n static propTypes = {\n // Input `name` attribute\n name: PropTypes.string.isRequired,\n // Instance of the Class component decorated withFormSetup (i.e withForm)\n instance: PropTypes.object,\n // Whether to fire Field.onChange(null) when its component unmounts\n onRemoveChange: PropTypes.bool,\n label: PropTypes.any,\n id: PropTypes.string,\n // HTML Input type attribute\n type: PropTypes.string,\n // Input placeholder\n placeholder: PropTypes.any,\n // help text or component to show on focus\n info: PropTypes.any,\n // help text or component to show on invalid input\n error: PropTypes.any,\n value: PropTypes.any,\n onChange: PropTypes.func,\n format: PropTypes.func,\n normalize: PropTypes.func,\n parse: PropTypes.func,\n translate: PropTypes.func,\n }\n\n state = {\n selectPreviousValue: null\n }\n\n get value () {\n if (this._value !== void 0) {\n return this._value\n }\n return ''\n }\n\n set value (v) {\n this._value = v\n }\n\n // Handle onRemove field in FIELD.TYPE.MULTIPLE*\n componentWillUnmount () {\n // warn('-------componentWillUnmount', this.constructor.name)\n // Call onChange for the deleted input, setting it to `null`:\n // - if input is not registered, its value will not pass to backend\n // => this should be fine, because if registeredValues are used,\n // then backend should override the entire object (i.e. removing unregistered fields automatically).\n // - if changedValues are used, the deleted `null` value will be sent to backend,\n // because changedValues does not depend on registered values.\n // Use setTimeout to avoid triggering `valid: false` for required fields\n // @scenario:\n // - onChange(null) triggers `valid: false` for FIELD.TYPE.MULTIPLE with `required`, thus canSave gets disabled\n // => to fix it, need to call onChange(null) after input unmounts, or disable validation temporarily\n // => both cases do not update `pristine`, so cannot rely on this for `canSave` state.\n // @Note:\n // - this.props.onChange is callback defined in withFormSetup - does not update form values, or change `pristine`\n // - this.input.onChange is callback from final-form - does not trigger parent re-render directly, only when `valid` prob changes\n // => the best logic is to change input value after it unmounts, and call `onChange` to update parent state,\n // because this avoids validation, ties all operations together and persists `state.canSave`.\n const {instance, name, onChange, onRemoveChange} = this.props\n if (instance && onRemoveChange) {\n const initialValues = this.initValues\n setTimeout(() => {\n // only call this if the form is not unmounted and initialValues remained (i.e. not between transitions)\n if (instance.isUnmounting) {\n return\n }\n const form = instance.form\n if (form && initialValues === instance.props.initialValues) {\n form.change(name, null)\n onChange && onChange(null) // update Save button state\n }\n }, 0)\n }\n }\n\n // do not use ...props from input, because it is shared by <Active.Field> instances\n // @Note: react-final-form fires `format()` when `input.value` getter is called\n Input = ({input: {value, ...input}, meta: {touched, error, pristine} = {}}) => {\n const {\n onChange, error: err, defaultValue, normalize, format, parse, validate,\n instance, onRemoveChange, ...props\n } = this.props\n\n if (!this.hasFocus) { // use cached `value` while editing to prevent format/parse bugs and rerender\n // @Note: defaultValue is only used for UI, internal value is still undefined\n this.value = value === void 0\n ? (pristine && defaultValue != null ? (format ? format(defaultValue) : defaultValue) : value)\n : value\n\n }\n\n // Hide this field if it's readonly and has no value.\n if (this.props.readonly && isRequired(this.value != null ? this.value : this.props.value)) return null\n\n this.input = input\n\n if (instance) this.initValues = instance.props.initialValues\n\n const nextValue = (InputComponent.displayName) === 'Dropdown'\n ? (value === '' ? undefined : value)\n : sanitize\n ? sanitize(this.value, this.props)\n : this.value\n\n if ((InputComponent.displayName) === 'Dropdown') {\n if (nextValue === value) {\n this.setState({\n selectPreviousValue: nextValue\n })\n } else if (nextValue !== value && this.state.selectPreviousValue !== null) {\n props.value = nextValue\n this.setState({\n selectPreviousValue: null\n })\n }\n\n }\n\n const errorText = error && (storedTouched[input.name] || touched || !pristine) && (err || error)\n\n return (\n <InputComponent\n {...input}\n value={nextValue}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur} // prevent value change, but need onBlur to set touched for validation\n onChange={this.handleChange}\n error={errorText} // only show error after user interaction\n {...props} // allow forceful value override\n />\n )\n }\n\n handleFocus = (...args) => {\n this.hasFocus = true\n return this.input.onFocus(...args)\n }\n\n handleBlur = () => {\n this.hasFocus = false\n return this.input.onBlur()\n }\n\n handleChange = (value, ...args) => {\n const {onChange, type, normalize, parse = normalize} = this.props\n /**\n * @Note:\n * - `parse` gets called by final-form automatically on input.onChange,\n * but `formatOnBlur` (needed to prevent cursor jumping) only calls format onBlur,\n * even if input did not change. This causes extra call on `format` when input did not change,\n * and doesn't call `format` when `parse` was called onChange.\n * => the solution is to cache `value` internally to prevent Input rerender while in focus,\n * and remove `formatOnBlur` because it's buggy behavior (does not format on initial mount).\n */\n if (this.hasFocus) {\n this.value = value // store value exactly as typed in (example: value of '1.0' to work nicely with `unit` = '%')\n }\n // Possible need to remove this transformation\n // Value is already a number or null by the time it gets here\n // if (type === 'number') {\n // value = value !== '' ? Number(value) : null\n // }\n this.input.onChange(value) // final-form input.onChange can accept 'event' or 'value'\n onChange && onChange(parse ? parse(value) : value, ...args)\n }\n\n // Do not pass 'onChange' to Field because it fires event as argument\n // final-form does not take controlled `value`\n render () {\n const {\n name, disabled, normalize, format, parse = normalize, validate, options\n } = this.props\n return <Active.Field {...{name, disabled, normalize, format, parse, validate, options}}\n component={this.Input}/>\n }\n }\n\n Object.defineProperty(Class, 'name', {value: (InputComponent.name || InputComponent.constructor.name) + 'AsField'})\n return Class\n}\n\n/**\n * React Component React Final Form Decorator with getters to detect form input changes\n * @note:\n * - cannot wrap connected to redux component, @connect must be declared before\n * - onSubmit can be passed to the decorated Class component\n * @example:\n * *@withForm()\n * class SigninForm extends PureComponent {}\n * // later in the render()\n * <SigninForm onSubmit={(formValues, form, callback: ?(errors?) => void) => ?Object | Promise<?Object> | void}/>\n * // see https://final-form.org/docs/react-final-form/types/FormProps#onsubmit\n *\n * @usage:\n * or apply <Input onChange={this.handleChangeInput.bind(this)}/> manually:\n * - this.canSave - getter boolean: true if form has input changes, no validation error exists, and is not loading\n * - this.changedValues - getter object: key value pairs of form input values that have changed since initial values\n * - this.registeredValues - getter object: key value pairs of registered form input values\n * - this.changedAndRegisteredValues - getter object: combination of above\n * - this.formValues - getter object: key value pairs of all form input values\n *\n * @helpers:\n * - this.handleChangeInput() - function: updates state.canSave (hooked to this.renderInput, must be defined as function)\n * - this.syncInputChanges() - function: can be called manually to update input changes state, and force re-rendering\n * - this.props.tooltip - object|boolean: automatically wrap rendered input with Semantic UI Popup\n * - this.props.onChangeState - function: callback when internal state changes, receives this class instance,\n * or {} on unmount. This is useful for nested forms with remote submit button within parent container.\n *\n * @example:\n * @connect(mapStateToProps)\n * @withForm({subscription: {pristine: true, valid: true}})\n * export default class UserEdit extends Component {\n * state = {\n * company: {}\n * }\n * render = () => (\n * <View>\n * <Company onChangeState={(instance) => this.setState({company: instance})} />\n * <Button disabled={!this.state.company.canSave}>Save<Button/>\n * </View>\n * )\n * }\n *\n * @param {FormProps|Object} [options] - for <Form/> see: https://final-form.org/docs/react-final-form/types/FormProps\n * @param {Component} [Tooltip] - React component to wrap inputs with tooltip\n * @returns {Function} decorator - HOC wrapper function for given React component\n */\nexport function withForm (options = {subscription: {pristine: true, valid: true}}, Tooltip = TooltipPop) {\n return function Decorator (Class) {\n // @Note: form field re-renders because of constantly changing formProps reference\n // => convert it to instance getter, so `asField` does not depend on formProps.\n // => cannot use context, because it triggers re-render of all child components.\n // Define withFormSetup here to load it only once on App init\n withFormSetup(Class, {fieldValues, registeredFieldValues, registeredFieldErrors, Tooltip})\n\n const formSubscription = (form) => ({touched, initialValues}) => {\n if (formInitialValues === null) {\n formInitialValues = initialValues;\n }\n\n if (formInitialValues !== initialValues && initialValues && Object.keys(initialValues).length) {\n formInitialValues = initialValues;\n for(const field of Object.keys(storedTouched)){\n form.mutators.setFieldTouched(field, false)\n }\n storedTouched = {}\n clearErrorsMap()\n } else {\n for(const field of Object.keys(touched)) {\n if(touched[field]) {\n storedTouched[field] = true;\n }\n }\n }\n }\n\n // @Note: to avoid several WithForm instances sharing the same closure props,\n // this decorator must return a class component that stores its internal state between re-renders.\n // Use PureComponent to avoid double checking large payloads.\n // noinspection JSPotentiallyInvalidUsageOfThis\n return class WithForm extends PureComponent {\n get initValues () {\n return this._initValues || (this._initValues = this.props.initialValues)\n }\n\n prevInitialValues = null;\n\n // @see: https://final-form.org/docs/react-final-form/types/FormProps\n // Form only calls `render` function when `subscription` changes, or itself rerenders.\n // `formState` can remain unchanged, even if `initialValues` changed.\n // thus comparing formState is not suitable for memoizing when props change.\n // `formProps` does not pass through `initialValues` (it's undefined).\n // => better to let `render` function always run, and memoize at the highest <WithForm> level.\n // => this way, rerender is minimized to only when props changed, or form state changed.\n renderForm = ({form, handleSubmit, ...formProps}) => {\n // formProps `form` and `handleSubmit` props always change, possibly due to inline fat arrow function.\n this.form = form\n this.handleSubmit = handleSubmit\n\n if (!isEqualJSON(this._formProps, formProps)) {\n this._formProps = formProps\n }\n\n form.subscribe(formSubscription(form), {touched: true, initialValues: true, error: true, errors: true})\n\n // Class should use PureComponent to take advantage of caching\n return <Class {...this._props} formProps={this._formProps} initialValues={this._initValues} instance={this}/>\n }\n\n componentDidMount () {\n const { meta, initialValues } = this.props\n this.prevInitialValues = {...initialValues}\n formsStorage.set(this.prevInitialValues, {\n meta: meta,\n form: this.form\n });\n }\n\n UNSAFE_componentWillReceiveProps (next, nextContext) {\n const {initialValues, meta} = next\n // Only assign `initialValues` when it truly changes\n if (this._initValues !== initialValues && !isEqualJSON(this._initValues, initialValues)) {\n formsStorage.delete(this.prevInitialValues)\n this._initValues = initialValues\n this.prevInitialValues = {...initialValues}\n // explicitly reset to new values when entries change,\n // because final-form only resets to the very first initialValues.\n if (this.form) {\n this.form.reset(this._initValues)\n formsStorage.set(this.prevInitialValues, {\n meta: meta,\n form: this.form\n });\n }\n }\n }\n\n componentWillUnmount () {\n formsStorage.delete(this.prevInitialValues)\n }\n\n render () {\n // warn('-->>WithForm-------------------------------------------')\n const {initialValues, onSubmit = warn, ...restProps} = this.props\n this._props = restProps\n\n // @Note: when form is submitted, it triggers loading true, and receives old initialValues.\n // If the `initialValues` is computed on the fly and changes reference each time,\n // <Form/> reinitialises while loading, causing the flickering.\n // => either cache `initialValues`, or better, stop <Form/> from reinitializing while loading.\n // because final-form always re-initializes\n return <Form\n onSubmit={onSubmit}\n {...options}\n mutators={{\n ...arrayMutators,\n setFieldTouched\n }}\n initialValues={this.initValues}\n render={this.renderForm}\n />\n }\n }\n }\n}\n\nconst setFieldTouched = (args, state) => {\n const [name, touched] = args\n const field = state.fields[name]\n\n if (field) {\n field.touched = touched\n }\n}\n\n/**\n * Mixin to add Class Attributes and Methods commonly used with forms\n * @note: works with react-final-form\n *\n * @param {Object} Class - React Component or PureComponent to decorate\n * @param {Function} fieldValues - callback to get form values\n * @param {Function} registeredFieldValues - callback to get form registered values\n * @param {Function} registeredFieldErrors - callback to get form registered errors\n * @param {Component} [Tooltip] - React component to wrap inputs with tooltip\n * @returns {Object} Class - mutated with form properties\n */\nexport function withFormSetup (Class, {fieldValues, registeredFieldValues, registeredFieldErrors, Tooltip}) {\n if (!Active.renderField) throw new Error(`${withFormSetup.name} requires Active.renderField to be registered`)\n const UNSAFE_componentWillReceiveProps = Class.prototype.UNSAFE_componentWillReceiveProps\n const componentWillUnmount = Class.prototype.componentWillUnmount\n const handleChangeInput = Class.prototype.handleChangeInput\n\n Class.propTypes = {\n formProps: PropTypes.object.isRequired, // form props, without `form` and `handleSubmit`\n instance: PropTypes.object.isRequired, // {Class<form, handleSubmit>} WithForm instance for getting the form\n initialValues: PropTypes.object, // form initial values\n onChangeState: PropTypes.func, // onChangeState(this: Class)\n ...Class.propTypes\n }\n\n Class.prototype.state = {\n // This state only updates on input changes, for changes in parent props, use this.changedValues\n canSave: false, // used to compare changes for re-rendering, like 'Save' button\n ...Class.prototype.state\n }\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'form', {\n get () {\n return this.props.instance ? this.props.instance.form : this.props.parent.form\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'handleSubmit', {\n get () {\n return this.props.instance ? this.props.instance.handleSubmit : this.props.parent.handleSubmit\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'canSave', {\n get () {\n // @note: do not use `pristine` because it only reflects visible (i.e. registered inputs)\n // do not use `valid` because it does not compute correctly on tab changes in FieldsInGroup\n const {loading} = this._props || this.props\n return !loading && !registeredFieldErrors(this.form) && !!this.changedValues\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'formValues', {\n get () {\n return fieldValues(this.form)\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'registeredValues', {\n get () {\n return registeredFieldValues(this.form)\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'changedValues', {\n get () {\n // Have to select all form values, because registered values may not include all input values\n const {initialValues} = this._props || this.props\n return objChanges(initialValues, this.formValues)\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'changedAndRegisteredValues', {\n get () {\n const values = Object.assign({}, this.registeredValues || {}, this.changedValues || {})\n if (hasObjectValue(values)) return values\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'validationErrors', {\n get () {\n const errors = registeredFieldErrors(this.form)\n if (!errors) return null\n const messages = []\n // Use label if defined, for more intuitive error messages\n const fields = this._fields || []\n for (const k in errors) {\n let {label, labelGroup} = fields.find(({name}) => name === k) || {}\n label = labelGroup || label || k\n messages.push(<Text key={k} className=\"margin-bottom-smaller\">{`• ${label}: ${toJSON(errors[k])}`}</Text>)\n }\n return (\n <View className=\"padding-h-smaller\">\n <Text className=\"margin-v-small bold\">{_.PLEASE_COMPLETE_}</Text>\n {messages}\n </View>\n )\n }\n })\n\n Object.defineProperty(Class.prototype, 'validationErrorsTooltip', {\n get () {\n const errors = this.validationErrors\n return errors ? <ToolTip top>{errors}</ToolTip> : null\n }\n })\n\n // Define instance method\n Class.prototype.handleChangeInput = debounce(function () {\n // To handle use case when all fields in a group are removed, and no registered values are sent to backend,\n // use placeholder parent field that reserves as registered null value field for the entire group.\n // See <Fields> component for example.\n this.syncInputChanges()\n if (handleChangeInput) handleChangeInput.apply(this, arguments)\n }, UI.TYPING_DELAY)\n\n // Define instance method\n Class.prototype.syncInputChanges = function () {\n const { formProps, onDataChanged, parent = {} } = this._props || this.props;\n if (formProps && !formProps.pristine || isDataChangedListenerCalled) {\n isDataChangedListenerCalled = true\n if (typeof onDataChanged === 'function') {\n onDataChanged()\n } else if (parent && typeof parent.onDataChanged === 'function') {\n parent.onDataChanged();\n }\n }\n\n const canSave = this.canSave\n if (canSave !== this.state.canSave) {\n this.setState({canSave})\n const {onChangeState} = this._props || this.props\n if (onChangeState) onChangeState(this)\n }\n }\n\n Class.prototype.UNSAFE_componentWillReceiveProps = function (next) {\n // @Note: using componentDidUpdate comparison logic is not reliable,\n // because on the last re-render, Form may trigger `pristine` update without changing initialValues,\n // which will make .canSave false, but this.syncInputChanges() only updated in the previous render, which was true.\n // => thus need to take formProps into consideration\n if (\n !isEqualJSON(next.initialValues, this.props.initialValues) ||\n !isEqualJSON(next.formProps, this.props.formProps)\n ) {\n // temporarily set to next props for state computation\n this._props = next\n this.syncInputChanges()\n this._props = null\n if (this._meta) {\n errorsProcessing(this.form, this._meta);\n }\n }\n if (UNSAFE_componentWillReceiveProps) UNSAFE_componentWillReceiveProps.apply(this, arguments)\n }\n\n Class.prototype.componentWillUnmount = function () {\n this.isUnmounting = true\n if (this.props.onChangeState) this.props.onChangeState({})\n if (componentWillUnmount) componentWillUnmount.apply(this, arguments)\n }\n\n return Class\n}","/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const POPUP = 'POPUP'\nexport const POPUP_ALERT = `${POPUP}_ALERT`\nexport const POPUP_CONFIRM = `${POPUP}_CONFIRM`\nexport const POPUP_ERROR = `${POPUP}_ERROR`\n","import { Active, ALERT } from 'ui-utils-pack'\nimport { stateAction } from '../redux/actions'\nimport { POPUP } from './constants'\n\n/**\n * Open Popup Alert with given messages\n * @param {String|Number|Node|JSX} title\n * @param {String|Number|Node|JSX} [content]\n */\nexport function popupAlert (title, content) {\n Active.store.dispatch(stateAction(POPUP, ALERT, {items: [{title, content}]}))\n}\n","export const nicinabox = {\n scheme: 'nicinabox',\n author: 'nicinabox (http://github.com/nicinabox)',\n base00: 'rgba(0, 0, 0, 0)', // modified to match site's background\n base01: '#3C444F',\n base02: '#4F5A65',\n base03: '#BEBEBE',\n base04: '#b0b0b0', // based on ocean theme\n base05: '#d0d0d0', // based on ocean theme\n base06: '#FFFFFF',\n base07: '#f5f5f5', // based on ocean theme\n base08: '#fb9fb1', // based on ocean theme\n base09: '#FC6D24',\n base0A: '#ddb26f', // based on ocean theme\n base0B: '#A1C659',\n base0C: '#12cfc0', // based on ocean theme\n base0D: '#6FB3D2',\n base0E: '#D381C3',\n base0F: '#deaf8f' // based on ocean theme\n}\n\nexport default nicinabox\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport JsonTree from 'react-json-tree' // do not use react-json-view because it breaks with recursive JSON and in Node.js\nimport View from '../View'\nimport defaultTheme from './themes'\n\n/**\n * Json nested Object Renderer - Pure Component.\n *\n * @param {Object|Array} data - collection to render\n * @param {Boolean} [inverted] - whether to render inverse background color\n * @param {Boolean} [expanded] - whether to expand all nested nodes\n * @param {Object} [theme] - color definitions\n * @param {String} [className] - css class name\n * @param {Object} [style] - css styles\n * @param {Boolean} [fill] - css styles\n * @param {*} props - other attributes to pass to `<div></div>`\n * @returns {Object} - React Component\n */\nexport function JsonView ({\n data = {},\n inverted = false,\n expanded = false,\n theme = defaultTheme,\n className,\n style,\n fill,\n ...props\n}) {\n if (expanded) props.shouldExpandNode = () => true\n return (\n <View className={classNames('json-tree', className, {fill})} style={style}>\n <JsonTree hideRoot invertTheme={!inverted} theme={theme} data={data} {...props} />\n </View>\n )\n}\n\nJsonView.propTypes = {\n data: PropTypes.any.isRequired, // JSON data to show\n}\n\nexport default React.memo(JsonView)\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React, { useRef, useState } from 'react'\nimport { accessibilitySupport } from './utils'\n\n/**\n * View with Custom Scroll Bar - Pure Component\n *\n * @param {String} [className] - CSS classes to apply\n * @param {String} [classNameInner] - CSS classes to apply to inner wrapper\n * @param {Object} [style] - CSS to apply\n * @param {Object} [styleInner] - CSS to apply to inner wrapper\n * @param {Boolean} [row] - whether to render children as <Row />\n * @param {Boolean} [fill] - whether to make the view fill up available height and width\n * @param {Boolean} [reverse] - whether to reverse order of rendering\n * @param {Boolean} [rtl] - whether to use right to left direction\n * @param {Boolean} [center] - whether to center align content\n * @param {Object} [sound] - new Audio(URL) sound file\n * @param {*} [tab]\n * @param {*} props - other props\n * @returns {Object} - React component\n */\nconst ScrollView = ({\n className,\n classNameInner,\n style,\n styleInner,\n row,\n fill,\n reverse,\n rtl,\n center,\n sound,\n // Remove tab to prevent Error\n tab,\n ...props\n}) => {\n const thisRef = useRef(null)\n const [scrollYPosition, setScrollYPosition] = useState(0)\n\n const handleScroll = (e) => {\n if (e.target === thisRef.current) {\n setScrollYPosition(e.target.scrollLeft)\n }\n }\n\n props = accessibilitySupport(props, sound)\n return (\n <div\n ref={thisRef}\n className={classNames('overflow-scroll',\n row ? 'flex--row max-width' : 'flex--col max-height',\n scrollYPosition && 'vertical-scroll',\n {fill, rtl, center: center && !row}, className,\n )}\n style={style}\n onScroll={handleScroll}\n >\n <div\n className={classNames(row ? 'flex--row min-width' : 'flex--col min-height',\n {fill, reverse, rtl, pointer: props.onClick, 'margin-auto': center}, classNameInner,\n )}\n style={styleInner}\n {...props}\n />\n </div>\n )\n}\n\nScrollView.propTypes = {\n className: PropTypes.string,\n classNameInner: PropTypes.string,\n style: PropTypes.object,\n styleInner: PropTypes.object,\n children: PropTypes.any.isRequired\n}\n\nexport default ScrollView\n","import React, { Component } from 'react'\nimport { get, isObject } from 'ui-utils-pack'\n\n/**\n * Recursive Field Renderer\n * @setup:\n * // mapper.js\n * import { Render } from 'ui-render'\n * import TooltipPop from 'ui-react-pack/TooltipPop'\n *\n * // Setup common components/callbacks\n * Render.Tooltip = TooltipPop\n * Render.TooltipDefaultProps = {inverted: true}\n * Render.onError = handleErrorCallback // usually, open a Popup to show error message\n *\n * // Render Component resolver for `view` definitions in meta.json\n * Render.Component = function RenderComponent ({\n * view, items, data, _data, debug, form, showIf,\n * relativeData, relativeIndex, relativePath,version,\n * ...props\n * }) {\n * switch (view) {\n * case FIELD.TYPE.ROW:\n * return <Row {...props}>{items.map(Render)}</View>\n * // ...map all other components needed for the UI\n * }\n * }\n *\n * // Render Function resolver for `render...` definitions in meta.json\n * Render.Method = function RenderMethod (Name) {\n * switch (Name) {\n * case FIELD.RENDER.PERCENT:\n * return (val, index, {decimals} = {}) => toPercent(val, decimals)\n * case FIELD.RENDER.TITLE_n_INPUT:\n * return (val, index, {id, ...props} = {}) => <Row {...props}><Text>{val}</Text></Row>\n * // ...map all other methods needed for the UI\n * }\n * }\n *\n * @param {*} [props] - React component props to pass to given field\n * @param {Number|String} [index] - index of field in the list\n * @returns {*} Node - React component/s\n */\nexport default function Render (props, index) {\n const {dateFormat, ...rest} = props\n return (\n <RenderClass {...rest} key={typeof index !== 'object' ? index : undefined} />\n )\n}\n\nclass RenderClass extends Component {\n static defaultProps = {\n items: []\n }\n\n state = {\n error: false,\n }\n\n componentDidMount () {\n if (!Render.Component) throw new Error(`Please setup Render.Component mapper first`)\n if (!Render.Method) throw new Error(`Please setup Render.Method mapper first`)\n }\n\n componentDidCatch (error, errorInfo) {\n this.setState({error}, () => Render.onError({error, errorInfo, props: this.props}))\n }\n\n /**\n * @Note: try block only catches error in this Render function,\n * Errors in components will propagate up to componentDidCatch in parent class.\n */\n render () {\n if (this.state.error) return String(this.state.error)\n\n // Wrap component with Tooltip automatically\n if (this.props.tooltip != null) {\n const {tooltip, ...props} = this.props\n const tooltipProps = {...Render.TooltipDefaultProps, ...isObject(tooltip) ? tooltip : {title: tooltip}}\n return <Render.Tooltip {...tooltipProps}>{Render(props)}</Render.Tooltip>\n }\n\n let {data, _data, debug, form, instance, items, relativeData, name, currencyCode} = this.props\n\n // Set currencyCode from instance if not given\n if (currencyCode === undefined && instance) {\n currencyCode = instance.state.currencyCode\n }\n\n // Global/Relative Data access\n if (name) _data = get((relativeData !== false && _data) || data, name) // local data dynamically retrieved from definition\n\n // Pass down data to child renderers\n // allow `data` and `_data` to be overridden by config\n items = items.map((item) => {\n const mappedData = {data, _data, debug, form, instance, currencyCode, ...item};\n if (this.props.view === 'TableCells' && this.props.relativeIndex !== undefined) {\n mappedData.relativePath = this.props.relativePath;\n mappedData.relativeIndex = this.props.relativeIndex;\n }\n\n return mappedData;\n })\n\n // return Render.Component.call(this, {...this.props, _data, items})\n return <Render.Component\n {...this.props}\n _data={_data}\n items={items}\n currencyCode={currencyCode}\n />\n }\n}\n\nRender.onError = (error) => console.warn(`Unhandled ${Render.name} error:`, error)\n\nRender.TooltipDefaultProps = {inverted: true}\n","import { interpolateString, isCollection, isFunction, isList, isString, removeNilValues, toList } from 'ui-utils-pack'\nimport { cloneDeep, get, hasObjectValue, isObject } from 'ui-utils-pack/object'\nimport Render from './Render'\n\nconst FUNCTION_NAMES = ['onClick', 'onChange', 'onDone']\n\n/**\n * Map Data by given Mapper definition\n *\n * @param {Array|*} data - to map\n * @param {Object|String} mapper - object of key / value pairs (value being key path from `data`), or key path string\n * @param {Boolean} [debug] - whether to raise silenced error if data is missing or of incorrect type\n * @returns {Array} list - mapped from given data\n */\nexport function mapProps (data, mapper, {debug} = {}) {\n const mapData = typeof mapper === 'string' ? (item) => get(item, mapper, item) : (item, index) => {\n const result = {}\n for (const key in mapper) {\n // `index` must be converted to string to match fallback value defined in config (which can only be string)\n // fallback to item if key not found\n result[key] = mapper[key] === '{index}' ? String(index) : get(item, mapper[key], item)\n }\n return result\n }\n return (debug ? data : toList(data, true)).map(mapData)\n}\n\nexport function getCurrencySymbol (currencyCode) {\n if (!currencyCode) return null\n switch (currencyCode) {\n case 'USD':\n return '$'\n case 'EUR':\n return '€'\n case 'GBP':\n return '£'\n default:\n return null\n }\n}\n\n/**\n * Recursively map meta.json declarations to props ready for rendering (by mutation)\n * @Note: this function must only transform config, without adding data.\n * Because data is added at runtime on Render.\n *\n * @param {Object} meta - json\n * @param {*} config\n * @returns {Object} props - mutated meta\n */\nexport function metaToProps (meta, config) {\n const {\n form,\n instance, // contains dynamic `state` to hydrate meta data\n relativePath,\n relativeIndex,\n funcConfig,\n } = config\n let {data, _data} = config\n // Transform Root attributes\n if (isObject(meta)) {\n metaToFunctions(meta, {...funcConfig, data})\n if (meta.name) meta.name = interpolateString(meta.name, instance, {suppressError: true})\n }\n\n for (const attribute in meta) {\n // Skip `meta` json config for nested UI Render instances\n if (attribute === 'meta') continue\n const definition = meta[attribute]\n if (!definition) continue\n\n // Map `onClick` functions by name (if exists)\n // @Note: high priority, because onClick string will be bound to `self` class inside `render` functions\n if (isObject(definition)) {\n metaToFunctions(definition, {...funcConfig, data})\n if (definition.name) {\n definition.name = interpolateString(definition.name, instance, {suppressError: true})\n }\n }\n\n // Map Value Renderer Names/Objects to Actual Render Functions\n if (attribute.indexOf('render') === 0) {\n if (typeof definition === 'string') { // @ts-ignore\n meta[attribute] = Render.Method(meta[attribute])\n }\n // Below transformation only happens during render\n if (isObject(definition)) meta[attribute] = (value, index, props, self) => {\n if (attribute === 'renderExtraItem') {\n definition.useForm = true\n }\n\n if (definition.relativeData === false) {\n _data = data\n } else {\n _data = value\n }\n\n // Render is a field definition\n if (definition.view) {\n const {name, filterItems, ...configs} = definition\n const revPath = {\n relativeIndex: index\n }\n // `meta.name` is undefined when Table.headers.renderCell is defined,\n // this leads to nested Table with incorrect Input.name, which relies on correct `relativePath`.\n // The condition is met when:\n // - meta.name === undefined\n // - relativePath != null\n // - relativeIndex != null\n // - self.props.name !== relativePath.split('.').pop() // when Table is nested inside List\n // And requires Table.name to be appended to existing `relativePath`:\n // `${relativePath}.${relativeIndex}.${Table.name}`\n // @solution: extract Table.name from class instance `self` because `meta` only has parent config.\n if (\n meta.name == null && relativePath != null && relativeIndex != null &&\n self && self.props && self.props.name !== relativePath.split('.').pop()\n ) {\n revPath.relativePath = relativePathFrom(self.props, relativePath, relativeIndex)\n } else {\n revPath.relativePath = relativePathFrom(meta, relativePath, relativeIndex)\n }\n\n return Render({\n // Relative Path is required for nested Inputs\n ...revPath,\n ...props,\n // Recursively map definitions within Render function\n // Note: since definition is mutated on each transform,\n // we have to use original config for rendering lists\n ...metaToProps(cloneDeep(configs), {...config, ...revPath, data, _data}),\n // Transform key path with actual data\n ...name && {name: interpolateString(definition.name, {index, value})},\n ...definition.index && {index: interpolateString(definition.index, {index})},\n ...definition.useForm && {useForm: true},\n // Filter for row data from parent table (in default layout)\n ...filterItems && {filterItems, parentItem: value},\n // Inject functions by their name string\n ...removeNilValues(FUNCTION_NAMES.map(func => isString(definition[func]) && self &&\n !getFunctionFromString(definition[func], {...funcConfig, fallback: null}) &&\n {[func]: self[definition[func]]}\n )).reduce((obj, item) => ({...obj, ...item}), {}),\n ...definition.view.indexOf('Data') === 0 && {index},\n data, _data, form, instance,\n }, index)\n }\n\n // Render is a function definition\n else if (definition.name) {\n const func = getFunctionFromObject(definition, {...funcConfig, data})\n const currencyCode = (definition.currencyCode) || (instance && instance.state && instance.state.currencyCode)\n const currencySymbol = getCurrencySymbol(currencyCode)\n return isFunction(func) ? func.apply(this, [value, index, {...props, ...definition, symbol: currencySymbol ,data, _data}])\n : func\n }\n\n // Render is conditional match by values definitions\n else if (definition.values) {\n const valueDefinition = definition.values[value] || definition.default\n if (!valueDefinition) return value\n return (isObject(valueDefinition))\n ? (valueDefinition.view\n ? Render({...props, ...valueDefinition, data, _data}, index)\n : getFunctionFromObject(valueDefinition, {...funcConfig, data}) // @ts-ignore\n .apply(this, [value, index, {...props, ...valueDefinition, data, _data}])\n )\n : Render.Method(valueDefinition).apply(this, [value, index, {...props, data, _data}])\n }\n }\n }\n\n // Process nested Object/List definitions\n else if (isCollection(definition)) {\n const attrCount = Object.keys(definition).length\n if ( // this condition check must match exact case immediately, so that other cases get transformed\n attribute !== 'showIf' && definition.name != null &&\n (attrCount === 1 || (attrCount === 2 && definition.relativeData != null))\n ) {\n // Value Transform {name} - single key objects with name to their values\n // fallback to `name` attribute for transformed values from `state` (i.e. Tab.index, Dropdown.value...)\n // noinspection PointlessBooleanExpressionJS\n meta[attribute] = isString(definition.name)\n ? get((definition.relativeData !== false && _data) || data, definition.name, definition.name)\n : definition.name\n // Leave this to help users debug unresolved values\n if (meta[attribute] === definition.name && isString(definition.name) && isNaN(+definition.name)) {\n // meta.view is equal to undefined in case of table headers (in some cases)\n // in other cases no need to display label name\n if (meta.view !== undefined) {\n meta[attribute] = \"\";\n }\n // console.warn(`${meta.view}.${attribute}`, definition, '\\n❌ Not found! relative _data:', _data)\n }\n } else {\n // Recursively process the rest of definitions\n // Relative path must always be passed down, because nested Inputs inside List require absolute path for `name`\n const options = {\n data, _data, instance,\n relativePath: relativePathFrom(meta, relativePath, relativeIndex), relativeIndex\n }\n // Resolve local `_data` for nested definitions\n // noinspection PointlessBooleanExpressionJS\n if (meta.relativeData !== false && meta.name != null) options._data = get(_data || data, meta.name, _data)\n meta[attribute] = metaToProps(meta[attribute], {...config, ...options})\n }\n }\n }\n\n // Pass down relative path to nested views\n if (meta.view) {\n if (relativePath != null && meta.relativePath == null) meta.relativePath = relativePath\n if (relativeIndex != null && meta.relativeIndex == null) meta.relativeIndex = relativeIndex\n }\n\n return meta\n}\n\n/**\n * Transform Function Definition strings to actual methods, if they exist, by mutation\n * @example:\n * const definition = {onChange: 'functionName'}\n * >>> {onChange: Function}\n *\n * @param {Object} definition - containing function names\n * @param {Object} config\n * @returns {void} definition - with names replaced by functions (by mutation)\n */\nfunction metaToFunctions(definition, config) {\n const {\n fieldValidation,\n fieldNormalizer,\n fieldParser,\n fieldFunc,\n funcNames = FUNCTION_NAMES\n } = config\n /* react-final-form does not support validate as array */\n // const validations = toList(definition.validate)\n // if (isString(validations[0])) definition.validate = removeNilValues(validations.map(id => FIELD.VALIDATION[id]))\n if (isString(definition.format)) definition.format = fieldNormalizer[definition.format]\n if (isString(definition.parse)) definition.parse = fieldParser[definition.parse] || fieldNormalizer[definition.parse]\n if (isString(definition.normalize)) definition.normalize = fieldNormalizer[definition.normalize]\n if (isString(definition.validate)) definition.validate = fieldValidation[definition.validate]\n if (hasObjectValue(definition.verify)) {\n // in the future, verify can have multiple validator functions, so compose them\n const {validate, ...opt} = definition.verify\n // final-form only passes input `value` to validate function\n const validators = toList(validate).map(({name, ...args}) => (v) => fieldValidation[name](v, {...opt, ...args}))\n if (definition.validate) validators.unshift(definition.validate)\n definition.validate = composeValidators(...validators)\n delete definition.verify\n }\n funcNames.forEach(name => {\n if (isString(definition[name])) {\n definition[name] = getFunctionFromString(definition[name], {fieldFunc})\n } else if (isObject(definition[name])) {\n definition[name] = getFunctionFromObject(definition[name], config)\n }\n })\n}\n\nconst composeValidators = (...validators) => (value) => validators.reduce((error, validator) => error || validator(value), undefined)\n\n/**\n * Get Function/s from Definition Object Recursively\n * @example:\n * getFunctionFromObject({name: 'reset', args: [0], onDone: 'setState,active.plan'})\n * >>> function (...argumentsSuppliedFromCaller) {\n * return setState(reset(...argumentsSuppliedFromCaller, 0), 'active.plan')\n * }\n *\n * @param {Object<name, args, onDone>} definition - of function to call\n * - @param {String} name - of the function\n * - @param {Array} [args] - last arguments to pass to the function\n * - @param {String|Object} [onDone] - callback recursive function definitions\n * @param {Object} config\n * @returns {Function|String} method - that receives caller arguments as its first arguments,\n * and will chain function calls `onDone` recursively\n */\nfunction getFunctionFromObject(definition, config) {\n const {name, mapArgs, args = [], onDone} = definition\n const {data, fieldFunc, fieldMethods, fallback = definition.name} = config\n const func = fieldFunc[name] || fieldMethods[name]\n if (onDone) metaToFunctions(definition, config)\n if (func) {\n const hasMapArgs = isList(mapArgs)\n if (isFunction(definition.onDone)) {\n return (...values) => {\n if (hasMapArgs) {\n values = mapArgs.map((val) => mapFunctionArgs(val, {data, args: values}))\n }\n const result = func(...values, ...args)\n if (result instanceof Promise) {\n return result.then(definition.onDone)\n }\n return definition.onDone(result)\n }\n } else {\n return (...values) => {\n if (hasMapArgs) {\n values = mapArgs.map((val) => mapFunctionArgs(val, {data, args: values}))\n }\n return func(...values, ...args)\n }\n }\n }\n // @ts-ignore\n return func || Render.Method(name) || fallback\n}\n\n/**\n * Get Function from Definition String\n * @example:\n * getFunctionFromString('reset,0', {fieldFunc: FIELD.FUNC})\n * >>> function reset(...argumentsSuppliedFromCaller, '0') {...}\n *\n * @param {String} string - name of function to get, with optional arguments, separated by comma\n * @param {*} config\n * @returns {Function|String|*} method - that receives caller arguments as its first arguments,\n * along with optionally defined arguments in the config string\n */\nfunction getFunctionFromString (string, {fieldFunc, fallback = string}) {\n const [name, ...args] = string.split(',')\n const func = fieldFunc[name]\n return ((args.length && func) ? ((...arg) => func(...arg, ...args)) : func) || fallback\n}\n\n/**\n * Map function arguments definition to actual values\n * @param {*} template - for the argument to be transformed\n * @param {*} options\n * @returns {*} argument transformed with given options\n */\nfunction mapFunctionArgs (template, {data, args}) {\n if (isString(template))\n return interpolateString(interpolateString(template, args, {suppressError: true}), data, {suppressError: true})\n if (isCollection(template)) {\n for (const key in template) {\n template[key] = mapFunctionArgs(template[key], {data, args})\n }\n }\n return template\n}\n\n/**\n * Compute Relative Path for given config\n * @param {Object|*[]|*} meta - config of the parent node\n * @param {String} relativePath - inherited from parent node\n * @param {String|Number} relativeIndex - inherited from parent node\n * @returns {String} relativePath - calculated from root path for current config\n */\nfunction relativePathFrom (meta, relativePath, relativeIndex) {\n let result = relativePath || meta.name\n // If `meta.name` is relative, concatenate it with inherited `relativePath` for absolute relative path,\n // to pass down to nested configs (ex. Expand inside Table.headers = [{id, renderCell: {...}}] )\n if (meta.name != null && meta.relativeData !== false) {\n result = relativePath != null ? `${relativePath}.${relativeIndex}.${meta.name}` : meta.name\n }\n return result\n}\n","import Render from './Render'\nimport { mapProps, metaToProps } from './transforms'\n\nexport {\n Render,\n mapProps,\n metaToProps\n}\n\nexport default Render\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport View from './View'\n\n/**\n * Spinner - Pure Component\n *\n * @param {string} size - spinner size\n * @param {string} color - spinner color\n * @param {string} className - optional, will be prepended with spinner classes\n * @param {*} props - other attributes to pass to spinner\n * @returns {object} - React Component\n */\nexport function Spinner ({\n size = 'base', // Enum\n color = 'primary', // Enum\n className,\n ...props\n}) {\n return <View className={classNames('app__spinner', size, color, className)} {...props} />\n}\n\nSpinner.propTypes = {\n size: PropTypes.oneOf(['largest', 'larger', 'large', 'base', 'small', 'smaller', 'smallest']),\n color: PropTypes.oneOf(['primary', 'secondary', 'text', 'inverse', 'white', 'black']),\n className: PropTypes.string\n}\n\nexport default React.memo(Spinner)\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport Spinner from './Spinner'\nimport Text from './Text'\nimport View from './View'\n\n/**\n * Loading Overlay - Pure Component\n *\n * @param {Boolean} [loading] - whether to show this Component or not\n * @param {String} [size] - spinner size\n * @param {String} [className] - css class to add\n * @param {String} [iconClassName] - css class to add to spinner icon\n * @param {Boolean} [transparent] - whether to add 'transparent' css class\n * @param {*} [children] - optional content to render\n * @param {*} props - other attributes to pass to spinner\n * @returns {object} - React Component\n */\nexport function Loading ({\n loading = true,\n size = 'larger', // Enum\n className,\n iconClassName,\n transparent = false,\n children,\n ...props\n}) {\n return (loading &&\n <View className={classNames('app__loading', className, {transparent})}>\n <Spinner className={iconClassName} size={size} {...props} />\n {children && <Text className='h4 blink'>{children}</Text>}\n </View>\n )\n}\n\nLoading.propTypes = {\n loading: PropTypes.bool,\n size: PropTypes.any,\n className: PropTypes.string,\n iconClassName: PropTypes.string\n}\n\nexport default React.memo(Loading)\n","import React, { PureComponent } from 'react'\nimport { FormSpy } from 'react-final-form'\nimport { PropTypes } from 'ui-react-pack'\nimport { Loading } from 'ui-react-pack/Loading'\nimport { debounce, l, localiseTranslation, objChanges, TIME_DURATION_INSTANT } from 'ui-utils-pack'\nimport { _ } from 'ui-utils-pack/translations'\n\nlocaliseTranslation({\n SYNCING___: {\n [l.ENGLISH]: 'Syncing...',\n },\n})\n\n/**\n * Final Form Auto Save on Input Value Changes\n * @example:\n * <AutoSave onChange={console.warn} partial showLoader />\n */\nexport default class AutoSave extends PureComponent {\n static propTypes = {\n // Async Function(values) to call on input changes\n onChange: PropTypes.func.isRequired,\n // Whether to save only changed values, default is all Form values\n partial: PropTypes.bool,\n // Whether to overlay parent container with Loading spinner component\n showLoader: PropTypes.bool,\n // FormSpy subscription\n subscription: PropTypes.object,\n // Milliseconds to delay form `onChange`\n delay: PropTypes.number,\n // Loading message\n loadContent: PropTypes.any,\n }\n\n static defaultProps = {\n delay: TIME_DURATION_INSTANT,\n subscription: {values: true},\n }\n\n state = {\n values: undefined,\n submitting: false\n }\n\n UNSAFE_componentWillReceiveProps (next, _) {\n if (next.delay !== this.props.delay) this.handleChange = debounce(this.onChange, next.delay)\n }\n\n onChange = async ({values}) => {\n if (this.state.values == null) return this.setState({values})\n\n if (this.promise) await this.promise\n const {onChange, partial} = this.props\n\n // This diff step is totally optional\n const changes = objChanges(this.state.values, values)\n if (changes) {\n // values have changed\n this.setState({submitting: true, values})\n this.promise = onChange(partial ? changes : values)\n await this.promise\n delete this.promise\n this.setState({submitting: false})\n }\n }\n\n handleChange = debounce(this.onChange, this.props.delay)\n\n renderLoading = () => {\n const {showLoader, loadContent} = this.props\n const {submitting} = this.state\n if (!showLoader || !submitting) return null\n return <Loading loading>{loadContent || _.SYNCING___}</Loading>\n }\n\n // Make a HOC\n // This is not the only way to accomplish auto-save, but it does let us:\n // - Use built-in React lifecycle methods to listen for changes\n // - Maintain state of when we are submitting\n // - Render a message when submitting\n // - Pass in delay and save props nicely\n // This component doesn't have to render anything, but it can render submitting state.\n render () {\n const {subscription} = this.props\n return <>\n {/* FormSpy onChange will be called once on component mount */}\n <FormSpy subscription={subscription} onChange={this.handleChange}/>\n {this.renderLoading()}\n </>\n }\n}\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport Loading from './Loading'\nimport { onPressHoc } from './utils'\nimport { Active } from 'ui-utils-pack'\n\n/**\n * Button - Pure Component.\n *\n * @param {Function} [onClick] - button click callback\n * @param {String} [size] - button size, one of ['small', 'base', 'large']\n * @param {String} [type=button] - button type eg. button, submit\n * @param {String} [className] - optional, will be prepended with `button `\n * @param {Boolean} [disabled] - optional, whether the button is disabled\n * @param {Boolean} [loading] - optional, show spinner instead of children\n * @param {Boolean} [active] - whether to add `active` css class=\n * @param {Boolean} [circle] - whether to add `circle` css class with even padding\n * @param {Boolean} [square] - whether to add `square` css class with even padding\n * @param {Object} [sound] - new Audio(URL) sound file\n * @param {*} [children] - optional, content to be wrapped inside button `<button>{children}</button>`\n * @param {*} [props] - other attributes to pass\n * @returns {Object} - React component\n */\nexport function Button ({\n onClick,\n disabled = false,\n loading = false,\n active,\n circle,\n square,\n children,\n size,\n type = 'button',\n sound,\n className,\n translate = Active.translate,\n ...props\n}) {\n\n return (\n <button\n className={classNames('button', size, className, {circle, square, active, loading})}\n disabled={disabled || loading}\n type={type}\n onClick={onPressHoc(onClick, sound)}\n {...props}\n >\n {(typeof children === 'string') ? translate(children) : children}\n {loading && <Loading loading/>}\n </button>\n )\n}\n\nButton.propTypes = {\n type: PropTypes.string,\n className: PropTypes.string,\n children: PropTypes.any\n}\n\nexport default React.memo(Button)\n","import cn from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport Text from './Text'\n\n/**\n * Color Swatch - Pure Component.\n */\nexport function ColorSwatch ({\n value,\n small,\n large,\n className,\n style,\n ...props\n}) {\n const color = String(value || '')\n if (color) style = {backgroundColor: `rgb(${color})`, ...style}\n return <Text\n className={cn('color__swatch', className, {small, large, white: color === '255,255,255', black: color === '0,0,0'})}\n style={style}\n {...props}\n />\n}\n\nColorSwatch.propTypes = {\n /** RGB Value */\n value: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.number)\n ]).isRequired,\n small: PropTypes.bool,\n large: PropTypes.bool,\n className: PropTypes.string,\n style: PropTypes.object,\n}\n\nexport default React.memo(ColorSwatch)\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { Active } from 'ui-utils-pack'\nimport { accessibilitySupport } from './utils'\n\n/**\n * Icon - Pure Component\n *\n * @param {String} name - icon class name\n * @param {String} [className] - optional, will be appended with 'pointer' class when `onClick` given\n * @param {Function} [onClick] - callback to fire on click or Enter press (if `onKeyPress` not given)\n * @param {Object} [sound] - new Audio(URL) sound file\n * @param {*} props - other attributes to pass to Icon\n * @returns {Object} - React Component\n */\nexport function Icon ({\n name,\n className,\n large,\n small,\n sound,\n ...props\n}) {\n props = accessibilitySupport(props, sound)\n return (\n <i className={classNames(Active.iconClass, Active.iconClassPrefix + name, className, {\n large,\n small,\n pointer: props.onClick\n })}\n aria-hidden='true' {...props} />\n )\n}\n\nIcon.propTypes = {\n name: PropTypes.string.isRequired,\n sound: PropTypes.object,\n large: PropTypes.bool,\n small: PropTypes.bool,\n className: PropTypes.string,\n}\n\nexport default React.memo(Icon)\n","import classNames from 'classnames'\nimport React from 'react'\nimport { fileNameWithoutExt } from 'ui-utils-pack'\nimport { FILE } from './files'\nimport { type } from './types'\n\n/**\n * Image - Pure Component.\n *\n * @param {String} name - file name\n * @param {String} [path] - file directory path to use if `src` not given\n * @param {String} [className] - optional css class\n * @param {*} [props] - other attributes to pass to `<img>`\n * @returns {Object} - React component\n */\nexport function Image ({\n name,\n path,\n className,\n ...props\n}) {\n if (props.src == null) props.src = imageSrc({name, path})\n if (props.alt == null) props.alt = fileNameWithoutExt(name)\n return <img className={classNames('img', className)} {...props}/>\n}\n\nImage.defaultProps = {\n decoding: 'async',\n loading: 'lazy',\n}\nImage.propTypes = {\n // Required if `src` or `alt` not defined\n name: type.String,\n path: type.String,\n className: type.String,\n decoding: type.Enum(['auto', 'async', 'sync']),\n loading: type.Enum(['eager', 'lazy']),\n}\n\nexport function imageSrc ({avatar, src, name = '', path = FILE.PATH_IMAGES}) {\n return avatar || src || (path + name.replace(/\\s/g, '-').toLowerCase())\n}\n\nexport default React.memo(Image)\n","import classNames from 'classnames'\nimport React from 'react'\nimport { isFunction } from 'ui-utils-pack'\nimport { accessibilitySupport } from './utils'\n\n/**\n * Row View - Pure Component.\n * With default `display: flex` style\n * (to be used as replacement for `<div></div>` and `<span></span>` for cross platform integration)\n *\n * @param {string} [className] - optional css class\n * @param {Function} [onClick] - callback to fire on click or Enter press (if `onKeyPress` not given)\n * @param {Boolean} [fill] - whether to make the view fill up available height and width\n * @param {Boolean} [reverse] - whether to reverse order of rendering\n * @param {Boolean} [rtl] - whether to use right to left direction\n * @param {Object} [sound] - new Audio(URL) sound file\n * @param {*} props - other attributes to pass to `<div></div>`\n * @param {*} [ref] - callback(element) when component mounts, or from React.createRef()\n * @returns {Object} - React Component\n */\nexport function Row ({\n className,\n fill,\n reverse,\n rtl,\n sound,\n expanded: _, // not used, remove to prevent warnings\n ...props\n}, ref) {\n props = accessibilitySupport(props, sound)\n if (isFunction(ref)) props.ref = ref\n return <div className={classNames('flex--row', {fill, reverse, rtl, pointer: props.onClick}, className)} {...props} />\n}\n\nexport const RowRef = React.forwardRef(Row)\nexport default React.memo(Row)\n","import classNames from 'classnames'\nimport React from 'react'\nimport { Active, debounce, LANGUAGE, round, shortNumber, SORT_ORDER, toUpperCase } from 'ui-utils-pack'\nimport ColorSwatch from './ColorSwatch'\nimport { FILE } from './files'\nimport Icon from './Icon'\nimport Image from './Image'\nimport Row from './Row'\nimport Text from './Text'\n\nexport const noSpellCheck = {\n autoComplete: 'off',\n autoCorrect: 'off',\n autoCapitalize: 'off',\n spellCheck: false,\n}\n\n/**\n * RENDER HELPERS ==============================================================\n * =============================================================================\n */\n\n/**\n * Create Color Swatch Options from RGB Definition for use with Dropdowns\n *\n * @param {Object|Array<Object>} colorObj - definition from variables.js\n * @param {Object} Active - object containing active .LANG._\n * @returns {Object<lang[{text, value, content}]>} options - grouped by language code, for use with dropdowns\n */\nexport function colorDropdownOptions (colorObj, Active) {\n const options = {\n get items () {\n return this[Active.LANG._] || this[LANGUAGE.ENGLISH._] || []\n }\n }\n for (const key in colorObj) {\n const {_, ...langs} = colorObj[key]\n const value = String(_) // Dropdown `value` cannot be array\n for (const lang in langs) {\n const text = langs[lang]\n options[lang] = (options[lang] || []).concat({\n text,\n value,\n content: <Row className='input--dropdown__option middle'>\n <ColorSwatch value={value} className='input--dropdown__option__color'/>\n <Text className='margin-top-smallest'>{text}</Text>\n </Row>\n })\n }\n }\n return options\n}\n\n/**\n * Create Language Options from Language Definition for use with Dropdowns\n *\n * @param {Object|Array<Object>} languageObj - definition from variables.js\n * @param {Boolean} [selection] - whether to render as selected language flag and code, default is searchable text\n * @returns {Object<lang[{text, value, content}]>} options - grouped by language code, for use with dropdowns\n */\nexport function languageDropdownOptions (languageObj, {selection} = {}) {\n const options = {\n get items () {\n return this[Active.LANG._] || this[LANGUAGE.ENGLISH._] || []\n }\n }\n for (const key in languageObj) {\n const {_, lang: name, ...langs} = languageObj[key]\n for (const lang in langs) {\n const text = langs[lang]\n options[lang] = (options[lang] || []).concat({\n text: selection\n ? (\n <Row className='input--dropdown__option middle'>\n <Image className='margin-right-smaller' name={`${_.toLowerCase()}.svg`}\n path={`${FILE.PATH_IMAGES}flags/`}/>\n <Text className='no-wrap'>{toUpperCase(_)}</Text>\n </Row>\n )\n : `${text} ${name}`, // make option searchable both in chosen and native language\n value: _,\n content: <Row className='input--dropdown__option middle'>\n <Image className='margin-right-small' name={`${_.toLowerCase()}.svg`} path={`${FILE.PATH_IMAGES}flags/`}/>\n <Text>{text}</Text>\n </Row>\n })\n }\n }\n return options\n}\n\n/**\n * Render Selected Option with Color Swatch in Multiple Choices Dropdown\n * @example:\n * FIELD.DEF = {\n * [FIELD.ID.COLOR]: {\n * view: FIELD.TYPE.DROPDOWN,\n * renderLabel: colorDropdownChoice,\n * }\n * }\n *\n * @param {Object<value, text>} obj - selected dropdown item\n * @returns {Object<content>}\n */\nexport function colorDropdownChoice (obj) {\n return {\n content: <Text className='bottom'>\n <ColorSwatch value={obj.value} className='input--dropdown__option__color'/>\n <Text>{obj.text}</Text>\n </Text>\n }\n}\n\n/**\n * Render Currency Amount in consistent manner\n *\n * @param {Number|String} amount - float number or string\n * @param {Number} [decimals] - the number of decimal digits to keep\n * @param {*} [props] - other pros to pass\n * @returns {Object} - React component\n */\nexport function renderCurrency (amount, decimals, props) {\n return renderFloat(amount, decimals != null ? decimals : (amount < 100 ? 2 : 0), props)\n}\n\n/**\n * Render Float Number as Localised String with Faded Fraction\n *\n * @param {String|Number} value\n * @param {Number|Undefined} [decimals] - the number of fraction digits to keep, default has no fraction (Integer)\n * @param {*} [props<truncated, faded>] - other pros to pass\n * `truncated: true` will not apply rounding, but only trim excess fraction\n * `faded: false` will not apply fraction part with faded CSS style\n * @return {Object} - React component\n */\nexport function renderFloat (value, decimals, props) {\n const {truncated, faded = true, ...options} = props || {}\n let fraction = String(value).split('.')[1] || '0' // extract fraction before rounding, because we need fixed length\n if (!truncated && decimals != null) value = round(value, decimals)\n const showFraction = decimals > 0\n if (showFraction) {\n fraction = truncated ? fraction.substr(0, decimals == null ? undefined : decimals) : fraction\n fraction = Number('0.' + fraction).toLocaleString(undefined, decimals == null ? undefined : {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).substr(1) // toLocalString will return fixed length fraction to given decimals number\n }\n return (\n <Text {...options}>\n {Math.trunc(value).toLocaleString()}\n {showFraction && (faded ? <Text className='fade--quarter no-margin'>{fraction}</Text> : fraction)}\n </Text>\n )\n}\n\n/**\n * Render Float Number as Shortened Localised String with Faded Decimals (keeping only given significant digits)\n *\n * @param {String|Number} value\n * @param {Number} [digits] - the number of significant digits to keep\n * @param {*} [props] - other pros to pass\n * @return {Object} - React component\n */\nexport function renderFloatShort (value, digits = 3, props) {\n const [number, unit] = shortNumber(value, digits).split(/([a-zA-Z]+)/) // split at SI unit, keeping the unit\n return (\n <Text {...props}>{renderFloat(number, undefined, {className: 'no-margin'})}{unit}</Text>\n )\n}\n\n/**\n * Render Sort Icon\n *\n * @param {Number|Undefined} order - sorting order, one of renderSort.icon keys\n * @param {Number|Undefined} [id] - of the column or row to sort\n * @param {Function} [onClick] - callback when sort Icon is clicked, received clicked sort object\n * @param {String} [className] - CSS class names to add\n */\nexport function renderSort ({id, order}, {onClick, className} = {}) {\n return (\n <Icon\n className={classNames('app__sort__icon', className, {active: !order})}\n name={renderSort.icon[order || 0]}\n onClick={onClick && (() => onClick({id, order}))}\n />\n )\n}\n\nrenderSort.icon = SORT_ORDER\n\n/**\n * Resize Element Width to Match Content Length\n *\n * @param {String} value - of the element to resize\n * @param {Object} style - of the element to resize\n * @param {Boolean|Number} offset - count of characters to add to final width\n */\nexport function resizeToContent (value, style, offset = 1) {\n // Add additional character to prevent truncation from uneven fonts\n // boolean `offset` evaluates to 1 by default.\n style.width = value.length + Number(offset) + 'ch'\n style.boxSizing = 'content-box'\n if (!style.transition) style.transition = '200ms'\n}\n\n/**\n * Event handler to autosize Input height to match typed in text height\n * @example:\n * <Input type='textarea' onKeyUp={toTextHeight} />\n */\nexport const toTextHeight = debounce(toTextHeightFunc, 50, {leading: true})\n\nexport function toTextHeightFunc (e) {\n if (!e.target) return\n\n // Reset field height\n e.target.style.height = 'inherit'\n\n // Get the computed styles for the element\n const computed = window.getComputedStyle(e.target)\n\n // Calculate the height\n const height = parseInt(computed.getPropertyValue('border-top-width'), 10)\n + e.target.scrollHeight\n + parseInt(computed.getPropertyValue('border-bottom-width'), 10)\n\n e.target.style.height = `${Math.min(height, Math.round(window.innerHeight / 5))}px`\n}\n","/**\n * STYLE VARIABLES =============================================================\n * Should match with colors defined in /style/_variables.less\n * =============================================================================\n */\n\n/* Colors */\nexport const STYLE = {\n ANIMATION_DURATION: 500,\n SIZE_SCALE: 62.5, // match percentage of font-size defined in <html> root element\n GREY: 'rgb(55, 145, 70)',\n TEXT: 'rgb(23,21,31)',\n TEXT_LIGHT: 'rgb(237, 237, 237)',\n BG: 'rgb(238,246,255)',\n BG_LIGHT: 'rgb(23,21,31)',\n TEAL: 'rgb(0, 172, 188)',\n TEAL_LIGHT: 'rgb(16, 165, 234)',\n GREEN: 'rgb(55, 145, 70)',\n GREEN_LIGHT: 'rgb(36, 210, 187)',\n GOLD: 'rgb(239, 165, 44)',\n GOLD_LIGHT: 'rgb(243, 200, 88)',\n YELLOW: 'rgb(250, 215, 88)',\n YELLOW_LIGHT: 'rgb(255, 237, 122)',\n ORANGE: 'rgb(229, 114, 37)',\n ORANGE_LIGHT: 'rgb(244, 150, 45)',\n RED: 'rgb(220, 30, 45)',\n RED_LIGHT: 'rgb(247, 111, 170)',\n PINK: 'rgb(235, 77, 164)',\n PINK_LIGHT: 'rgb(255, 125, 205)',\n VIOLET: 'rgb(90, 55, 187)',\n VIOLET_LIGHT: 'rgb(103, 118, 234)',\n BORDER: 'rgba(124, 124, 153, 0.3)',\n TRANSPARENT: 'rgba(0, 0, 0, 0)',\n}\nSTYLE.PRIMARY = STYLE.TEAL\nSTYLE.PRIMARY_LIGHT = STYLE.TEAL_LIGHT\nSTYLE.SECONDARY = STYLE.VIOLET\nSTYLE.SECONDARY_LIGHT = STYLE.VIOLET_LIGHT\n","import moment from 'dayjs'\nimport humanizeDuration from 'humanize-duration'\nimport {\n FIFTEEN_MINUTES,\n FORMAT_DATE,\n FORMAT_DD_MMM,\n FORMAT_DD_MMM_YYYY,\n FORMAT_MMM_YYYY,\n FORMAT_TIME_FOR_HUMAN,\n ONE_HOUR,\n ONE_MINUTE,\n THIRTY_MINUTES\n} from './constants.js'\nimport { isNumeric, startEndFromNumberRanges } from './number.js'\n\n/**\n * TIME FUNCTIONS ==============================================================\n * =============================================================================\n */\n\n/**\n * Convert Time Duration to User Friendly and Readable Format\n *\n * @param {Number} milliseconds - duration in milliseconds to convert\n * @param {Object} [options] - other humanize options, like `largest` to trim down units\n * @param {Boolean} [shorten] - whether to shorten words, like `seconds` to `s`\n * @returns {String} - formatted time\n */\nexport function formatDuration (milliseconds, { shorten = false, round = true, ...props } = {}) {\n props.round = round\n if (shorten) {\n return formatDuration.shortEnglish(milliseconds, props)\n }\n return humanizeDuration(milliseconds, props)\n}\n\nformatDuration.shortEnglish = humanizeDuration.humanizer({\n language: 'shortEn',\n languages: {\n shortEn: {\n y: function () { return 'y' },\n mo: function () { return 'mo' },\n w: function () { return 'w' },\n d: function () { return 'd' },\n h: function () { return 'h' },\n m: function () { return 'm' },\n s: function () { return 's' },\n ms: function () { return 'ms' }\n }\n },\n decimal: '.'\n})\n\n/**\n * Convert time to human readable date and time\n *\n * @param {String|Number|Date} time - date string, Unix timestamp, Date object, etc.\n * @param {String} [format] - to render date time as\n * @returns {String} - date time in given format\n */\nexport function formatTime (time, format = FORMAT_TIME_FOR_HUMAN) {\n return moment(time).format(format)\n}\n\n/**\n * Convert 24hr and minute format string (HH:mm) to Milliseconds\n *\n * @param {String} hourMinute - to convert\n * @returns {Number} milliseconds\n */\nexport function msFromHourMinute (hourMinute = '') {\n const time = hourMinute.split(':')\n if (!time[0] || !time[1]) return 0\n return (+time[0] * ONE_HOUR) + (+time[1] * ONE_MINUTE)\n}\n\n/**\n * Convert Number to String with leading zero/s at specified character length\n * @param {Number|String} number - to format\n * @param {Number} [length] - total character length of output, default is 2\n * @returns {String} time - string with leading zero/s if needed\n */\nexport function toLeadingZero (number, length = 2) {\n return ('0' + number).slice(-length)\n}\n\n/**\n * Convert time to full hour string\n *\n * @param {String|Number|Date} time - date string, Unix timestamp, Date object, etc.\n * @return {String} - hours and minutes\n */\nexport function toHours (time) {\n return formatTime(time, 'h a')\n}\n\n/**\n * Convert time to hour and minute string\n *\n * @param {String|Number|Date} time - date string, Unix timestamp, Date object, etc.\n * @return {String} - hours and minutes\n */\nexport function toHourMinutes (time) {\n return formatTime(time, 'h:mm A')\n}\n\n/**\n * Convert time to Day and Month string\n *\n * @param {String|Number|Date} time - date string, Unix timestamp, Date object, etc.\n * @return {String} - Day and Month\n */\nexport function toDate (time) {\n return formatTime(time, FORMAT_DD_MMM)\n}\n\n/**\n * Convert time to Day, Month and Year string\n *\n * @param {String|Number|Date} time - date string, Unix timestamp, Date object, etc.\n * @return {String} - Day Month, Year\n */\nexport function toDateYear (time) {\n return formatTime(time, FORMAT_DD_MMM_YYYY)\n}\n\n/**\n * Convert time toMonth and Year string\n *\n * @param {String|Number|Date} time - date string, Unix timestamp, Date object, etc.\n * @return {String} - Month and Year\n */\nexport function toMonthYear (time) {\n return formatTime(time, FORMAT_MMM_YYYY)\n}\n\n/**\n * Convert Start and End timestamp range to Human-friendly string\n *\n * @param {Number} start - timestamp\n * @param {Number} end - timestamp\n * @returns {String} date range - ex. `21 Sep - 17 Oct, 2019` or `13 - 21 Sep, 2019` or `13 Sep, 2019``\n */\nexport function toDateRange (start, end) {\n let from = formatTime(start, 'D MMM, YYYY')\n const to = formatTime(end, 'D MMM, YYYY')\n const fromDate = from.split(',')\n const toDate = to.split(',')\n if (from === to) {\n from = '' // same start and end date\n } else if (fromDate[1] === toDate[1]) {\n if (fromDate[0].split(' ')[1] === toDate[0].split(' ')[1]) // same month and year\n from = fromDate[0].split(' ')[0]\n else\n from = fromDate[0] // same year\n }\n return `${from ? from + ' - ' : ''}${to}`\n}\n\n/**\n * Convert Date String to Unix Timestamp\n * @param {String} dayMonthYear - DD.MM.YYYY\n * @returns {Number|Undefined} timestamp - if given date string is valid, else undefined\n */\nexport function timestampFromDate (dayMonthYear) {\n const d = (dayMonthYear || '').split('.')\n if (!d[0] || !d[1] || !d[2]) return\n return toTimestamp(new Date(+d[2], +d[1] - 1, +d[0]))\n}\n\n/**\n * Convert List of Dates with Hours and Minutes to list of Unix Timestamp Ranges\n *\n * @param {Array<{date: 'dd.mm.yyyy', from: 'hh:mm', to: 'hh:mm'}>} dates - list of dates with hours and minutes\n * @returns {Array<{from: Number, to: Number}>} times - list of Unix timestamp ranges\n */\nexport function toTimeRanges (dates) {\n return dates.map(toTimeRange)\n}\n\n/**\n * Convert Date with Hours and Minutes to Unix Timestamp Range\n *\n * @param {Object<{date: 'dd.mm.yyyy', from: 'hh:mm', to: 'hh:mm', ...}>} dateTime - strings\n * @returns {Object<{from: Number, to: Number, ...}>} time - Unix timestamp range\n */\nexport function toTimeRange ({date, from, to, ...result}) {\n const timeOfTheDay = timestampFromDate(date)\n if (!timeOfTheDay) return result\n if ((from || '').length === 5) result.from = timeOfTheDay + msFromHourMinute(from)\n if ((to || '').length === 5) result.to = timeOfTheDay + msFromHourMinute(to)\n return result\n}\n\n/**\n * Convert List of Unix Timestamp Ranges to list of Dates with Hours and Minutes\n * @param {Array<{from: Number, to: Number}>} times - list of Unix timestamp ranges\n * @returns {Array<{date: 'dd.mm.yyyy', from: 'hh:mm', to: 'hh:mm'}>} dates - list of dates with hours and minutes\n */\nexport function fromTimeRanges (times) {\n return times.map(({from, to}) => ({\n date: (from || to) ? formatTime(from || to, FORMAT_DATE) : '',\n from: from ? formatTime(from, 'HH:mm') : '',\n to: to ? formatTime(to, 'HH:mm') : '',\n }))\n}\n\n/**\n * Compute total milliseconds for given list of time ranges\n * @param {Array<{from: Number, to: Number}>} times - list of Unix timestamp ranges\n * @returns {Number} time - milliseconds\n */\nexport function totalFromTimeRanges (times) {\n let total = 0\n const {start, end} = startEndFromNumberRanges(times)\n if (start == null || end == null) return total\n total = end - start\n let breaks = 0\n let lastBreak = {}\n times.forEach(({from, to}) => {\n if (from < end && lastBreak.start != null) lastBreak.end = from\n if (to > start && !lastBreak.start) lastBreak.start = to\n if (lastBreak.start != null && lastBreak.end != null) {\n breaks += lastBreak.end - lastBreak.start\n lastBreak = {}\n }\n })\n return total - breaks\n}\n\n/**\n * Convert time to Unix timestamp in milliseconds\n *\n * @param {String|Number|Date} time - date string, Unix timestamp, Date object, etc.\n * @param {Number} [fallback] - timestamp to use in case conversion fails\n * @returns {Number} - timestamp in milliseconds\n */\nexport function toTimestamp (time, fallback) {\n // Timestamp number given as string or number\n if (isNumeric(time)) {\n if (typeof time === 'string') time = Number(time)\n return time\n }\n\n return time ? moment(time).valueOf() : fallback\n}\n\n/**\n * Get a short string indicating time for given date in human-friendly way\n * @example:\n * @return: 'Yesterday', '1 day ago', '2 weeks ago',\n * @param timestamp\n */\nexport function timeSince (timestamp) {\n return formatDuration(Date.now() - timestamp, { largest: 1 })\n}\n\n/* Time Utilities */\nexport class Time {\n /**\n * Get Milliseconds Until the Next Full Hour\n */\n static get tillNextHour () {\n const d = new Date()\n const minutes = d.getMinutes()\n const seconds = d.getSeconds()\n const milliseconds = d.getMilliseconds()\n return ONE_HOUR - (minutes * 60 + seconds) * 1000 - milliseconds\n }\n\n /**\n * Get Milliseconds Until the Next Full 30 Minutes\n */\n static get tillNext30Mins () {\n return Time.tillNextHour % THIRTY_MINUTES\n }\n\n /**\n * Get Milliseconds Until the Next Full 15 Minutes\n */\n static get tillNext15Mins () {\n return Time.tillNextHour % FIFTEEN_MINUTES\n }\n\n /**\n * Get Milliseconds Until the Next Full Duration Provided\n * (duration given must be less than ONE_HOUR)\n */\n static tillNext (duration) {\n return Time.tillNextHour % duration\n }\n}\n","import React from 'react'\nimport { Area, Cell, LabelList } from 'recharts'\nimport { shortNumber, toAlphaNumId, } from 'ui-utils-pack'\nimport { toHours } from 'ui-utils-pack/time'\nimport { STYLE } from '../styles'\n\n// =============================================================================\n// COMMON CHART OPTIONS AND HELPERS\n// =============================================================================\nexport const chartOffsetMargin = 20 // to the right of Y-axis\n\n/* Area Chart Common Props */\nexport const chartArea = {\n type: 'monotone',\n animationEasing: 'ease-in-out',\n animationDuration: STYLE.ANIMATION_DURATION,\n fillOpacity: 1\n}\n\nexport const chartCartesianGrid = {\n stroke: STYLE.BORDER,\n strokeDasharray: '3 4'\n}\n\n/* Chart Container Common Props */\nexport const chartContainer = {\n margin: { top: 20, right: chartOffsetMargin, left: 0, bottom: 5 }\n}\n\nexport const chartTooltip = {\n animationEasing: 'ease-out',\n animationDuration: STYLE.ANIMATION_DURATION,\n wrapperStyle: {zIndex: 1}\n}\n\n/* XAxis Chart Common Props */\nexport const chartXaxis = {\n dataKey: 'time',\n domain: ['auto', 'auto'],\n scale: 'linear',\n type: 'number',\n tickLine: false,\n tickFormatter: toHours,\n minTickGap: 12\n}\n\n/* YAxis Chart Common Props */\nexport const chartYaxis = {\n tickLine: false,\n tickFormatter: shortNumber,\n minTickGap: 12\n}\n\n/**\n * Create Function to Render Chart Area\n *\n * @param {String} id - unique id prefix for the chart type\n * @returns {function({name: *, color: *}): *}\n */\nexport function renderAreas (id) {\n return function ({name: n, color, gradient, ...props}) {\n const name = toAlphaNumId(n)\n const value = gradient ? `url(#${id}-${name})` : color\n return (\n <Area key={name} name={name} dataKey={`${name}.value`} fill={value} stroke={color} color={color} {...props} >\n <LabelList dataKey={`${name}.label`} fill={color} position='top'/>\n </Area>\n )\n }\n}\n\n/**\n * Create Function to Render Chart Cell (for Bars, Pies, etc.)\n *\n * @param {String} id - unique id prefix for the chart type\n * @returns {function({name: *, color: *, gradient: *}): *}\n */\nexport function renderCells (id) {\n return function renderCell ({ name, color, gradient }) {\n const value = gradient ? `url(#${id}-${toAlphaNumId(name)})` : color\n return <Cell fill={value} stroke={value} color={color}/>\n }\n}\n\n/**\n * Create Function to Render Gradient Color Definition\n *\n * @param {String} id - unique id prefix for the chart type\n * @param {Number} [startOpacity] - beginning opacity\n * @param {Number} [stopOpacity] - ending opacity\n * @param {String} [x1] - gradient start position\n * @param {String} [y1] - gradient start position\n * @param {String} [x2] - gradient end position\n * @param {String} [y2] - gradient end position\n * @returns {function({name: *, color: *}): *}\n */\nexport function renderGradients ({ id, startOpacity = 0.67, stopOpacity = 1, x1 = '0', y1 = '0', x2 = '1', y2 = '1' }) {\n return function ({name: n, color}) {\n const name = toAlphaNumId(n)\n return (\n <linearGradient key={name} id={`${id}-${name}`} x1={x1} y1={y1} x2={x2} y2={y2}>\n <stop offset='5%' stopColor={color} stopOpacity={startOpacity}/>\n <stop offset='95%' stopColor={color} stopOpacity={stopOpacity}/>\n </linearGradient>\n )\n }\n}\n","export const colorsPalette = [\n '#FF6633', '#FFB399', '#9d669d', '#a6a666', '#00B3E6',\n '#E6B333', '#3366E6', '#999966', '#79ad79', '#B34D4D',\n '#80B300', '#809900', '#bb9191', '#6680B3', '#66991A',\n '#FF99E6', '#CCFF1A', '#FF1A66', '#E6331A', '#33FFCC',\n '#66994D', '#B366CC', '#4D8000', '#B33300', '#CC80CC',\n '#c4c459', '#991AFF', '#E666FF', '#4DB3FF', '#1AB399',\n '#E666B3', '#33991A', '#CC9999', '#B3B31A', '#00E680',\n '#4D8066', '#809980', '#E6FF80', '#1AFF33', '#999933',\n '#FF3380', '#CCCC00', '#66E64D', '#4D80CC', '#9900B3',\n '#E64D66', '#4DB380', '#FF4D4D', '#99E6E6', '#6666FF',\n]","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React, { Fragment, PureComponent } from 'react'\nimport { Pie, PieChart as Piechart, ResponsiveContainer, Tooltip } from 'recharts'\nimport { by, pluralize, shortNumber, throttle, toList, toListValuesTotal, truncate } from 'ui-utils-pack'\nimport { renderFloat } from '../renders'\nimport Row from '../Row'\nimport { STYLE } from '../styles'\nimport Text from '../Text'\nimport View from '../View'\nimport { chartTooltip, renderCells, renderGradients } from './utils'\nimport { colorsPalette } from './constants'\n\nconst RADIAN = Math.PI / 180\nconst fontSize = 14 // label size\nconst id = 'pc' // unique id prefix for this chart type\nconst renderCell = renderCells(id)\nconst renderGradient = renderGradients({id, startOpacity: 0.67, stopOpacity: 1})\nconst textColor = '#444'\nlet decimals, unit\n\n/**\n * Pie Chart Component\n */\nexport default class PieChart extends PureComponent {\n static propTypes = {\n items: PropTypes.arrayOf(\n PropTypes.shape({\n label: PropTypes.any.isRequired,\n value: PropTypes.number.isRequired,\n })\n ).isRequired,\n height: PropTypes.number, // the size fo the pie chart\n unit: PropTypes.string, // text to render next to value\n className: PropTypes.string,\n classNameWrap: PropTypes.string,\n children: PropTypes.any, // content to render inside the pie, will override default Label\n gradient: PropTypes.bool, // default is true\n legends: PropTypes.oneOfType([\n PropTypes.bool, // whether to render Legends to the side of Pie Chart, default is false\n PropTypes.shape({\n background: PropTypes.bool, // whether to make legends have background, default is true\n bottom: PropTypes.bool, // whether to keep legends on the bottom, under the Pie\n columns: PropTypes.number, // the number of columns to break down long list of legends\n })\n ]),\n pointers: PropTypes.bool, // whether to render reference pointers to each pie, default is true if `legends` is false\n sort: PropTypes.oneOfType([ // items sorting order\n PropTypes.string, // key path to value used for sorting item's order, prefix with `-` for descending order\n PropTypes.arrayOf(PropTypes.string),\n ]),\n }\n\n static defaultProps = {\n height: 290,\n }\n\n renderTotal = () => {\n return (\n <>\n <Text className='h2 no-margin padding-bottom-smaller'>{shortNumber(toListValuesTotal(this.props.items))}</Text>\n <Text>Total</Text>\n </>\n )\n }\n\n renderReference = () => {\n const {bottom, columns, background = true} = this.props.legends || {}\n const classes = classNames('app__pie-chart__ref__items padding-small', {background, wrap: columns > 0})\n const offsetTop = bottom ? {marginTop: this.props.height * -0.1} : undefined\n let result\n let itemsLength\n if (columns > 0) {\n itemsLength = Math.ceil(this.data.length / columns)\n result =\n <Row className='top' style={offsetTop}>\n {Array(columns).fill(true).map((_, index) => {\n const start = index * itemsLength\n return <View key={index} className={classes}>\n {this.data.slice(start, start + itemsLength).map(this.renderReferenceItem)}\n </View>\n })}\n </Row>\n } else {\n result = <View className={classes} style={offsetTop}>{this.data.map(this.renderReferenceItem)}</View>\n }\n return result\n }\n\n renderReferenceItem = ({name, color, value}) => (\n <Row key={name} className='app__pie-chart__ref__item justify'>\n <Text className='truncate padding-right'>{name}</Text>\n <Text style={{color}}>{value.toLocaleString()}</Text>\n </Row>\n )\n\n render () {\n const {\n items: _items, height, unit: u, classNameWrap, className, children,\n gradient = true, legends, pointers, sort,\n ...props\n } = this.props\n unit = u\n const sorts = toList(sort, 'clean')\n const items = sort ? [..._items].sort(by(...sorts)) : _items\n const Container = legends ? (legends.bottom ? View : Row) : Fragment\n this.data = dataNormalized(items, gradient, sorts)\n return (\n <Container {...legends && {className: classNames('app__pie-chart--ref middle center wrap', classNameWrap)}}>\n <View className={classNames('app__pie-chart min-width-290 center', className, {gradient})} {...props}>\n <ResponsiveContainer height={height}>\n <Piechart>\n {gradient && <defs>{this.data.map(renderGradient)}</defs>}\n <Pie\n data={this.data}\n dataKey='value'\n innerRadius='40%'\n outerRadius='60%'\n labelLine={false}\n label={(pointers || (!legends && pointers !== false)) ? renderPercentPointer : renderPercent}\n strokeWidth={0}\n children={this.data.map(renderCell)}\n />\n <Tooltip {...chartTooltip} content={renderTooltip}/>\n </Piechart>\n </ResponsiveContainer>\n <View className='position-center center fade-in-slow'>\n {children != null\n ? (typeof children === 'object' ? children : <Text className='center'>{children}</Text>)\n : this.renderTotal()\n }\n </View>\n </View>\n {legends && this.renderReference()}\n </Container>\n )\n }\n}\n\n/**\n * Converted given Data to normalized list for Chart Rendering\n */\nfunction dataNormalized (items, colors, gradient, sorts = ['-value', 'name']) {\n const itemsLength = items.length\n const list = items.map(({id, label, value}) => ({name: id || label, gradient, value}))\n return list.sort(by(...sorts)).map((item, i) => {\n item.color = colorsPalette[i % itemsLength]\n return item\n })\n}\n\n/**\n * Get Coordinates of Center Point within each Pie in a Donut\n */\nfunction donutPieCenterCoords ({cx, cy, midAngle, innerRadius, outerRadius}) {\n const radius = innerRadius + (outerRadius - innerRadius) * 0.5\n const x = cx + radius * Math.cos(-midAngle * RADIAN)\n const y = cy + radius * Math.sin(-midAngle * RADIAN)\n return {x, y}\n}\n\nfunction renderPercent ({\n cx,\n cy,\n midAngle,\n innerRadius,\n outerRadius,\n startAngle,\n endAngle,\n name,\n percent,\n fill,\n color\n}) {\n percent = percent * 100\n if (percent < 1) return null\n const fontScale = Math.min(percent + 5, fontSize) // make font size smaller if percent is low\n\n /* Inner Label */\n const percentColor = fill === 'none' ? color : textColor\n const {x, y} = donutPieCenterCoords({cx, cy, midAngle, innerRadius, outerRadius})\n\n return (\n <g>\n <text x={x} y={y} fill={percentColor} textAnchor='middle' dominantBaseline='central' fontSize={fontScale - 2}>\n {Math.round(percent) + '%'}\n </text>\n </g>\n )\n}\n\nfunction renderPercentPointer ({cx, cy, midAngle, innerRadius, outerRadius, name, percent, fill, color}) {\n percent = percent * 100\n name = truncate(name, 9, 2)\n if (percent < 1) return null\n const sin = Math.sin(-RADIAN * midAngle)\n const cos = Math.cos(-RADIAN * midAngle) // at start angle cos = -1, at end angle cos = 1\n const angleEffect = Math.abs(cos)\n const radiusEffect = outerRadius / 13\n const fontScale = Math.min(percent + 5, fontSize) // make font size smaller if percent is low\n\n /* Inner Label */\n const percentColor = fill === 'none' ? color : STYLE.TEXT_LIGHT\n const {x, y} = donutPieCenterCoords({cx, cy, midAngle, innerRadius, outerRadius})\n\n /* Out Label */\n const labelSize = Math.max(fontScale - Math.max(0, name.length - 5) * angleEffect, 6) // scale to characters and angle\n const lineScale = Math.min(percent + 2, radiusEffect) // scale line length proportionally to percent and chart size\n const lineSize = lineScale * (1 - angleEffect / 2) // reduce to 50% size when approaching start or end angles\n const sx = cx + (outerRadius) * cos // label line start x coordinate\n const sy = cy + (outerRadius) * sin // label line start y coordinate\n const mx = cx + (outerRadius + lineSize) * cos // label line break angle x coordinate\n const my = cy + (outerRadius + lineSize) * sin // label line break angle y coordinate\n const ex = mx + (cos >= 0 ? 1 : -1) * lineSize // horizontal label line length\n const ey = my\n const textAnchor = cos >= 0 ? 'start' : 'end'\n const xOuter = ex + (cos >= 0 ? 1 : -1) * lineScale / 2\n return (\n <g>\n <text x={x} y={y} fill={percentColor} stroke={textColor} textAnchor='middle' dominantBaseline='central' fontSize={fontScale - 2}>\n {Math.round(percent) + '%'}\n </text>\n <path d={`M${sx},${sy}L${mx},${my}L${ex},${ey}`} stroke={textColor} fill=\"none\"/>\n <circle cx={ex} cy={ey} r={Math.min(lineSize / 4, 2)} fill={textColor} stroke=\"none\"/>\n <text x={xOuter} y={ey} dy={labelSize / 3} textAnchor={textAnchor} fill={textColor}\n fontSize={labelSize}>{name}</text>\n </g>\n )\n}\n\nconst renderTooltip = throttle(({active, payload}) => {\n if (!active) return null\n const items = toList(payload, true)\n const total = toListValuesTotal(items)\n // Show up to 7 digits\n decimals = Math.max(6 - (Math.round(total) || 0).toString().length, 0)\n return (\n <View className='app__chart__tooltip'>\n {items.map(renderTooltipItem)}\n </View>\n )\n}, 50)\n\nfunction renderTooltipItem ({payload: {name, value, color} = {}}, i) {\n return (\n <View key={name || i} className='fill--width center'>\n <Text className='truncate'>{name}</Text>\n <Text className='row'>{renderFloat(Number(value).toFixed(decimals))} {unit ? pluralize(unit, value) : ''}</Text>\n </View>\n )\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\n\n/**\n * Label - Pure Component.\n * Abstraction layer for React Web\n *\n * @param {*} children - optional, content to be wrapped inside `<label>{children}</label>`\n * @param {*} props - other attributes to pass to `<label></label>`\n * @returns {Object}\n */\nexport function Label ({\n children,\n translate,\n ...props\n}) {\n const child = (typeof children === 'string' && typeof translate === 'function') ? translate(children) : children\n return <label {...props}>{child}</label>\n}\n\nLabel.propTypes = {\n children: PropTypes.any\n}\n\nexport default React.memo(Label)\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React, { Fragment } from 'react'\nimport Label from './Label'\nimport Row from './Row'\nimport View from './View'\n\n/**\n * Checkbox - Pure Component\n *\n * @Note: either `id` or `label` must be given\n *\n * @param {String} [label] - text to use for identification, uses `id` if not given\n * @param {String} [id] - will be derived from `label` if not given\n * @param {Function} onChange - callback on value change\n * @param {Boolean|*} value - checked or unchecked state\n * @param {String} [type] - one of ['toggle']\n * @param {String} [title] - tooltip\n * @param {Boolean} [defaultValue] - checked or unchecked state\n * @param {String|Object} [labelTrue] - text to show for checked state\n * @param {String|Object} [labelFalse] - text to show for unchecked state\n * @param {*} [valueTrue] - value to assign to true case\n * @param {*} [valueFalse] - value to assign to false case\n * @param {Boolean} [readonly] - input attribute\n * @param {Boolean} [danger] - if true, then unchecked will have red background\n * @param {String} [className] - css class to apply\n * @param {Object} [props] - other props to pass\n * @return {*}\n * @constructor\n */\nexport function Checkbox ({\n value,\n valueTrue = true,\n valueFalse = false,\n defaultValue,\n onChange,\n type = 'checkbox',\n title,\n label,\n labelTrue,\n labelFalse,\n id,\n readonly,\n danger,\n className,\n translate = Active.translate,\n float: _0, // not used\n initialValues: _1, // not used\n ...props\n}) {\n if (readonly) props.readOnly = readonly // React wants `readonly` to be `readOnly`\n labelTrue = labelTrue || label || 'ON'\n labelFalse = labelFalse || label || 'OFF'\n if (!id && label) id = 'checkbox-' + label.replace(/ +?/g, '-')\n if (value === valueTrue) value = true\n if (value === valueFalse) value = false\n if (value == null) {\n if (defaultValue != null) props.defaultChecked = defaultValue\n } else {\n props.checked = !!value\n }\n return (\n <Row className={classNames('checkbox--wrapper', className)}>\n <input\n type={type === 'toggle' ? 'checkbox' : type}\n className={classNames('checkbox', type)}\n id={id}\n onChange={readonly ? null : (event) => onChange(event.target.checked ? valueTrue : valueFalse, props.name, event)}\n {...props}\n />\n <Label\n htmlFor={id} title={translate(title)}\n className={classNames('flex--row middle justify', {danger})}\n >\n {type === 'toggle'\n ? <Fragment>\n <View className=\"checkbox__true\">{translate(labelTrue)}</View>\n <View className=\"checkbox__button\"/>\n <View className=\"checkbox__false\">{translate(labelFalse)}</View>\n </Fragment>\n : (translate(label) || id)\n }\n </Label>\n </Row>\n )\n}\n\nCheckbox.propTypes = {\n id: PropTypes.string,\n label: PropTypes.string,\n labelTrue: PropTypes.any,\n labelFalse: PropTypes.any,\n onChange: PropTypes.func,\n value: PropTypes.any,\n valueTrue: PropTypes.any,\n valueFalse: PropTypes.any,\n defaultValue: PropTypes.bool,\n className: PropTypes.string,\n}\n\nexport default React.memo(Checkbox)\n","import PropTypes from 'prop-types'\nimport React, { PureComponent } from 'react'\nimport { ONE_SECOND, TIME_DURATION_INSTANT } from 'ui-utils-pack'\nimport { renderFloat } from './renders'\nimport { withTimer } from './utils'\n\n/**\n * Animated Number Counter using Localised Render Float function\n */\n@withTimer\nexport default class Counter extends PureComponent {\n static propTypes = {\n start: PropTypes.number, // default is 0\n end: PropTypes.number.isRequired,\n render: PropTypes.func, // number formatting function\n decimals: PropTypes.number, // default is 0\n delay: PropTypes.number, // animation delay, default is TIME_DURATION_INSTANT\n duration: PropTypes.number, // animation duration\n interval: PropTypes.number, // animation interval, default is 17 ms, which translates to ~60 frames per second\n easingFn: PropTypes.func, // animation easing function, see https://gist.github.com/gre/1650294\n className: PropTypes.string,\n style: PropTypes.object,\n }\n\n static defaultProps = {\n start: 0,\n decimals: 0,\n render: renderFloat,\n easingFn: (t) => t * t * t,\n }\n\n state = {\n value: this.props.start,\n steps: 0, // steps left to animate\n }\n\n animate = () => {\n const {value, steps} = this.state\n const {end} = this.props\n if (!steps) return\n this.setState({\n value: value + (end - value) / steps,\n steps: steps - 1,\n })\n }\n\n setup = (props = this.props) => {\n const {\n end, start, easingFn,\n duration = ONE_SECOND,\n delay = TIME_DURATION_INSTANT,\n interval = 17\n } = props\n const steps = end === start ? 0 : Math.ceil(duration / interval)\n if (steps) {\n this.clearTimer()\n this.setTimeout(() => {\n for (let i = 0; i < steps; i++) {\n this.setTimeout(this.animate, duration * easingFn((i + 1) / steps))\n }\n }, delay)\n }\n this.setState({steps, value: start})\n }\n\n componentDidMount () {\n this.setup()\n }\n\n UNSAFE_componentWillReceiveProps (nextProps) {\n if (nextProps.end !== this.props.end) this.setup(nextProps)\n }\n\n render () {\n const {decimals, render} = this.props\n const {value} = this.state\n return render(value, decimals)\n }\n}\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React, { useEffect, useRef, useState } from 'react'\nimport { Dropdown as DropDown } from 'semantic-ui-react' // adds 27 KB to final js bundle\nimport {\n hasListValue,\n isEqual,\n isObject,\n isString,\n l,\n last,\n localiseTranslation,\n toLowerCase,\n toLowerCaseAny,\n toUniqueListCaseInsensitive,\n trimSpaces\n} from 'ui-utils-pack'\nimport { _ } from 'ui-utils-pack/translations'\nimport Icon from './Icon'\nimport Text from './Text'\nimport View from './View'\nimport { Active } from 'ui-utils-pack'\n\nlocaliseTranslation({\n ADD_: {\n [l.ENGLISH]: 'Add ',\n },\n NOTHING_FOUND: {\n [l.ENGLISH]: 'Nothing found',\n },\n NO_OPTIONS_LEFT: {\n [l.ENGLISH]: 'No options left',\n }\n})\n\n/**\n * Drop Down Select - Pure Component.\n *\n * @Note: for docs, check out https://react.semantic-ui.com/modules/dropdown/\n *\n * @example:\n * <Dropdown\n * label=\"Snap\"\n * value={0.1}\n * options={[0.1, 0.2, 0.3]}\n * className=\"inline-block\"\n * />\n *\n * @param {*} value - selected option value\n * @param {Array} options - list of option values, e.g. ['value']\n * @param {Function} [onChange] - callback when user changes input value, receives value as argument\n * @param {Function} [onSelect] - callback when user selects an option, receives value as argument\n * @param {Function} [onSearch] - callback when user types in the input, receives value as argument\n * @param {Function} [onAddItem] - callback when user adds new options, must enable `allowAdditions: true`\n * @param {String} [label] - text to display next to input\n * @param {String} [placeholder] - text\n * @param {Boolean} [done] - whether input is completed\n * @param {String|Object} [error] - message to display\n * @param {String|Object} [info] - explanation message to display under input\n * @param {Boolean} [float] - whether display as float-label input\n * @param {Boolean} [readonly] - whether to disable input and add `readonly` css class\n * @param {String} [className] - css class to add\n * @param {Object} [style] - css styles to add\n * @param {Boolean} [fill] - whether to fill available width\n * @param {Boolean} [lazyLoad] - whether to defer rendering options until opened, default is true\n * @param {*} [optionsLabel] - extra label for dropdown options on the bottom\n * @param {*} [props] - other attributes to pass to `<select>`\n * @returns {Object}\n */\nexport function Dropdown ({\n options: opts,\n onChange,\n onSelect,\n onSearch,\n label,\n placeholder = _.SELECT,\n done,\n error,\n info,\n float,\n className,\n classNameIcon,\n style,\n fill = true,\n lazyLoad = true,\n optionsLabel,\n initialValues, // not used, removing from DOM\n readonly,\n autofocus,\n onAddItem,\n onClickIcon,\n translate = Active.translate,\n value: valueFromParent,\n ...props\n}) {\n // Store options as state to allow additions\n let [options, setOptions] = useState(opts)\n const defaultValue = useRef(typeof valueFromParent !== 'undefined'\n ? valueFromParent\n : ((Array.isArray(opts) && opts[0] && opts[0].value) || undefined)\n )\n const [value, setValue] = useState(defaultValue.current)\n let tempValue\n\n useEffect(() => {\n !isEqual(options, opts) && setOptions(opts)\n }, [opts])\n\n useEffect(() => {\n setValue(valueFromParent || null)\n }, [valueFromParent])\n\n useEffect(() => {\n setValue(defaultValue.current)\n }, [])\n\n if (autofocus) props.searchInput = {autoFocus: true} // better to disable autofocus for usability - why?\n if (readonly) props.disabled = true // Semantic Dropdown does not accept `readOnly` prop\n if (props.selection == null) props.selection = true\n if (props.search && props.deburr == null) props.deburr = true // Case and diacritics insensitive search\n\n // Sanitize\n switch (typeof options[0]) {\n case 'string':\n options = options.map(value => ({text: translate(value), value}))\n break\n case 'number':\n options = options.map(value => ({text: String(value), value}))\n break\n case 'object':\n if (typeof options[0].value === 'object') { // value is an array (ex. Color)\n options = options.map(({ value, text, ...option }) => ({ value: String(value), text: translate(text), ...option }))\n } else if (typeof options[0].value === 'string') {\n options = options.map(({ value, text, ...option }) => ({ value: value, text: translate(text), ...option }))\n }\n break\n }\n if (optionsLabel) options = [...options, {key: '', text: '', content: optionsLabel, disabled: true}]\n\n // Convert Icon to Node because Semantic has no `onClickIcon` callback\n if (onClickIcon) props.icon = <Icon name={props.icon || 'dropdown'} onClick={onClickIcon} className={classNameIcon}/>\n\n // On Change gets called before `onAddItem`\n if (onChange || onSelect) {\n props.onChange = (event, {value}) => {\n // Since there is no option to disable addition when search matches existing options (case-insensitive),\n // => sanitize onChange to have value from existing options.\n // @note: it's possible to temporarily disable addition, but that logic is more complex,\n // and shows 'No options left' message, instead of 'Add value',\n // which may be more intuitive, because it simply moves the selected value to the end.\n let val = props.multiple ? last(value) : value\n if (val && isString(val)) {\n val = trimSpaces(val).toLowerCase()\n const duplicate = options.find(({text}) => typeof text === 'string' && toLowerCase(text) === val)\n if (duplicate && toLowerCaseAny(duplicate.value) !== val) {\n if (props.multiple) {\n value[value.length - 1] = duplicate.value\n } else {\n value = duplicate.value\n }\n }\n }\n\n // Remove duplicates for non-matching cases, or value converted to Id from the operation above.\n // Keep the last entered value for new additions.\n // @Note: the list of values can be a mix of primitive Number and String\n // Store value temporarily for onSelect event.\n tempValue = (props.multiple && !isObject(last(value))) ? toUniqueListCaseInsensitive(value.reverse()).reverse() : value\n setValue(value)\n onChange && onChange(tempValue, props.name, event)\n }\n }\n\n if (onSelect) props.onClose = (event) => onSelect(tempValue, props.name, event)\n if (onSearch) props.onSearchChange = (event, data) => onSearch(data.searchQuery, props.name, event)\n\n // Sanitize options from duplicates on addition\n if (props.allowAdditions) {\n if (props.additionLabel == null) props.additionLabel = _.ADD_\n if (!props.upward && props.additionPosition == null) props.additionPosition = 'bottom'\n\n // This may add duplicate item for non-matching cases\n props.onAddItem = (event, {value}) => {\n value = trimSpaces(value)\n const val = toLowerCase(value)\n // The duplicate can be exiting options, or a newly added option\n const duplicate = options.find(({text}) => toLowerCase(text) === val)\n const newOption = {text: value, value} // `options` is always a list of objects because of sanitization below\n if (duplicate) {\n // Override only newly added duplicate option to match the last case entered\n if (toLowerCaseAny(duplicate.value) === val) Object.assign(duplicate, newOption)\n } else {\n setOptions([newOption, ...options])\n onAddItem && onAddItem(value, props.name, event)\n }\n }\n }\n\n // Sanitize Value (for Colors)\n if (props.value && props.value.constructor === Array && props.value.length) {\n if (!props.multiple) props.value = props.value.join(',')\n if (props.multiple && props.value[0].constructor === Array) props.value = props.value.map(v => v.join(','))\n }\n\n /// Error handling\n // @Note: below logic only works as DropdownField with controlled value\n if (done == null) done = !error && (props.multiple ? hasListValue(props.value) : (!!props.value || props.value === 0))\n\n return (\n <View className={classNames('input--wrapper', {\n float, done, labeled: label, 'fill-width': !props.compact && fill, required: props.required,\n }, className)} style={style}>\n {label && !float && <Text className=\"input__label\">{translate(label)}</Text>}\n <DropDown\n className={classNames({info, readonly})}\n options={options}\n placeholder={translate(placeholder)}\n error={!!error}\n lazyLoad={lazyLoad}\n noResultsMessage={(hasListValue(props.value) && props.value.length === options.length) ? _.NO_OPTIONS_LEFT : _.NOTHING_FOUND}\n value={value}\n {...props}\n />\n {label && float && <Text className=\"input__label\">{translate(label)}</Text>}\n {(error || info) &&\n <View id={props.id} className=\"field-help\">\n {error && <Text className=\"error\">{translate(error)}</Text>}\n {info && <Text className=\"into\">{translate(info)}</Text>}\n </View>\n }\n </View>\n )\n}\n\nDropdown.displayName = 'Dropdown'\n\nDropdown.propTypes = {\n value: PropTypes.any,\n options: PropTypes.arrayOf(PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.shape({\n text: PropTypes.any.isRequired,\n value: PropTypes.any,\n key: PropTypes.any\n })\n ])).isRequired,\n onChange: PropTypes.func,\n onSelect: PropTypes.func,\n onSearch: PropTypes.func,\n onAddItem: PropTypes.func,\n placeholder: PropTypes.any\n}\n\nexport default React.memo(Dropdown)\n","import classNames from 'classnames'\nimport React from 'react'\nimport ReactAnimateHeight from 'react-animate-height'\nimport { STYLE } from './styles'\n\n/**\n * Wrapper component that animates height changes\n *\n * @uses react-animate-height\n * @see {@link https://github.com/Stanko/react-animate-height} for further information\n * @example:\n * <AnimateHeight expanded={this.state.isOpen[item.id]}>\n * <Item {...item} />\n * </AnimateHeight>\n *\n * @param {boolean} expanded - used to change height for animation\n * @param {number} [duration] - The duration of the animation\n * @param {String} [className] - css class names to add\n * @param {*} [props] - Other attributes to pass to the container\n * @returns {Object} - React element\n */\nexport function AnimateHeight ({\n expanded,\n duration = STYLE.ANIMATION_DURATION,\n className,\n ...props\n}) {\n return <ReactAnimateHeight\n className={classNames('position-relative', className)}\n duration={duration} height={expanded ? 'auto' : 0}\n {...props}\n />\n}\n\nexport default React.memo(AnimateHeight)\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React, { PureComponent } from 'react'\nimport { isFunction } from 'ui-utils-pack'\nimport AnimateHeight from './AnimateHeight'\nimport Icon from './Icon'\nimport { STYLE } from './styles'\nimport Text from './Text'\nimport { withTimer } from './utils'\nimport View from './View'\n\n/**\n * Expandable Row - Pure Component.\n */\n@withTimer\nexport default class Expand extends PureComponent {\n static propTypes = {\n title: PropTypes.any, // string or component to always show\n children: PropTypes.oneOfType([\n PropTypes.func, // function to render content when expanded, receives `id` if given\n PropTypes.any, // pre-rendered content (not recommended for performance reasons)\n ]),\n renderLabel: PropTypes.func, // function to render title\n expanded: PropTypes.bool, // whether should render as expanded\n active: PropTypes.bool, // whether to add `active` css class\n justify: PropTypes.bool, // whether should render expand icon spread out from `title`\n iconOpened: PropTypes.string, // name of icon for expanded state\n iconClosed: PropTypes.string, // name of icon for collapsed state\n onClick: PropTypes.func, // callback({expanded, key, value}) on click or Enter press (if `onKeyPress` not given)\n id: PropTypes.oneOfType([ // argument to pass to 'onClick' callback as `key`\n PropTypes.string,\n PropTypes.number,\n ]),\n index: PropTypes.oneOfType([ // argument to pass to 'onClick' callback as `index`\n PropTypes.string,\n PropTypes.number,\n ]),\n duration: PropTypes.number, // milliseconds for the animation\n className: PropTypes.string,\n classNameLabel: PropTypes.string,\n classNameItems: PropTypes.string,\n }\n\n static defaultProps = {\n duration: STYLE.ANIMATION_DURATION,\n iconOpened: 'chevron-down',\n iconClosed: 'chevron-right',\n }\n\n state = {\n expanded: this.props.expanded,\n changing: false,\n }\n\n get content () {\n if (this._content) return this._content\n const {children} = this.props\n return (this._content = isFunction(children) ? children() : children)\n }\n\n UNSAFE_componentWillReceiveProps (next) {\n if (next.children !== this.props.children) this._content = null\n if (next.expanded !== this.props.expanded) this.update(next.expanded)\n }\n\n handleToggleExpand = () => {\n this.update(!this.state.expanded)\n }\n\n update = (expand = !this.state.expanded) => {\n // New prop may match with current state\n if (expand === this.state.expanded) return\n\n // Expanding should be fast\n if (expand) {\n this.setState({expanded: false, changing: true}, () => {\n this.handleClick(true)\n this.setState({expanded: true, changing: false})\n })\n } else {\n // Collapsing has to wait for Animation\n this.setState({expanded: false, changing: true}, () => {\n this.handleClick(false)\n this.setTimeout(() => this.setState({changing: false}), this.props.duration)\n })\n }\n }\n\n handleClick = (expanded) => {\n const {onClick, id, title, index} = this.props\n onClick && onClick({expanded, index, key: id, value: String(title)})\n }\n\n renderLabel = () => {\n const {title, renderLabel, justify = false, iconOpened, iconClosed, classNameLabel} = this.props\n if (title == null && !renderLabel) return null\n const {expanded} = this.state\n const hasContent = true // children != null // allow expanding remote children\n const Title = renderLabel ? renderLabel(title) : title\n return (\n <Text\n className={classNames('row fill-width middle padding-small', {justify}, classNameLabel)}\n onClick={hasContent && this.handleToggleExpand}\n >\n {justify && Title}\n {hasContent && iconOpened && iconClosed &&\n <Icon name={(expanded ? iconOpened : iconClosed) + ' spin-90-deg' + (expanded ? '' : '-')}/>}\n {!justify && Title}\n </Text>\n )\n }\n\n render () {\n const {\n id,\n title,\n onClick,\n active,\n duration,\n className,\n classNameLabel,\n classNameItems,\n children,\n expanded: _,\n justify: __,\n iconClosed: ___,\n iconOpened: ____,\n renderLabel: _____,\n ...props\n } = this.props\n const {expanded, changing} = this.state\n const hasContent = children != null\n const content = hasContent && (expanded || changing) && this.content\n return (\n <View className={classNames('app__expand', className, {expanded, active})} id={String(id)} {...props}>\n {this.renderLabel()}\n {hasContent &&\n <AnimateHeight expanded={expanded} duration={duration}\n className={classNames('expand__content', classNameItems)}>\n {content}\n </AnimateHeight>\n }\n </View>\n )\n }\n}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport Expand from './Expand'\n\n/**\n * Dynamic List of Expandable Rows - Pure Component.\n */\nexport function ExpandList ({renderLabel, renderItem, items, ...props}) {\n return (\n items.map((item, i) => (\n <Expand key={item.id || i} {...props} title={renderLabel(item, i)}>{() => renderItem(item, i)}</Expand>\n ))\n )\n}\nExpandList.propTypes = {\n items: PropTypes.array.isRequired,\n renderLabel: PropTypes.func.isRequired,\n renderItem: PropTypes.func.isRequired,\n}\nexport default React.memo(ExpandList)\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport Row from './Row'\nimport View from './View'\n\n/**\n * Dynamic List of Views/Rows - Pure Component.\n */\nexport function List ({renderItem, items, row, currencyCode, ...props}) {\n const Container = row ? Row : View\n return (\n <Container {...props}>\n {items.map((item, i) => renderItem({...item, currencyCode}, i))}\n </Container>\n )\n}\n\nList.propTypes = {\n items: PropTypes.array.isRequired,\n renderItem: PropTypes.func.isRequired,\n row: PropTypes.bool,\n}\n\nexport default React.memo(List)\n","import { createContext } from 'react';\n\nconst ConfigContext = createContext(null);\n\nexport default ConfigContext;","import React, { useContext } from 'react'\nimport moment from 'moment'\nimport Text from './Text'\nimport ConfigContext from 'core/src/providers/ConfigProvider'\n\nconst TextDateValue = ({value, dateFormat = 'DD/MM/YYYY', ...props}) => {\n const config = useContext(ConfigContext)\n const formatedDate = moment(value).format(config.dateFormat || 'DD/MM/YYYY')\n\n return <Text>{formatedDate}</Text>\n}\n\nexport default TextDateValue","import classNames from 'classnames'\nimport React, { PureComponent } from 'react'\nimport { Active, TIME_DURATION_INSTANT } from 'ui-utils-pack'\nimport { SOUND } from './files'\nimport { STYLE } from './styles'\nimport Text from './Text'\nimport { type } from './types'\nimport { withTimer } from './utils'\nimport View from './View'\n\n/**\n * Progress Bar Component\n *\n * @param {Number|NaN|Undefined|Null} [value] - fraction from 0 to 1, renders placeholder tooltip by default\n * @param {String} [className] - optional css class names to add\n * @param {Boolean} [gradient] - whether to separate bar color into two gradients\n * @param {*} [children] - text or React component to render as progress indicator\n * @param {*} [props] - other attributes to pass to component\n * @returns {Object} - React Component\n */\n@withTimer\nexport default class ProgressBar extends PureComponent {\n static propTypes = {\n // fraction from 0 to 1\n value: type.Fraction.isRequired,\n // content to render inside the filled bar\n label: type.Any,\n // default is false\n hasTooltip: type.Boolean,\n className: type.String,\n // CSS bar color\n color: type.String,\n children: type.Any,\n // default is true\n gradient: type.Boolean,\n // style the percentage bar itself\n styleBar: type.Object,\n }\n\n state = {\n value: 0,\n }\n\n get progressBar () {\n const {children, color, label, hasTooltip = false, styleBar} = this.props\n const {value} = this.state\n const percentage = Math.round(value * 100)\n const width = percentage + '%'\n const tooltip = this.props.value >= 0 ? (children || width) : 'No Data'\n const style = {width, ...styleBar}\n if (color) style.backgroundColor = color\n return (\n <View className='app__progress__bar' style={style}>\n {label && <Text>{label}</Text>}\n {hasTooltip &&\n <View className='app__progress__bar__tooltip'>\n <Text className='app__progress__bar__tooltip__inner'\n style={{transform: `translateX(${(0.5 - value) * 50}%)`}}\n children={tooltip}\n />\n </View>\n }\n </View>\n )\n }\n\n componentDidMount () {\n const {value} = this.props\n if (value != null) this.setTimeout(() => {\n this.setState({value})\n if (Active.SETTINGS.HAS_SOUND) this.setTimeout(SOUND.PROGRESS.play, STYLE.ANIMATION_DURATION * 0.8)\n }, TIME_DURATION_INSTANT)\n }\n\n UNSAFE_componentWillReceiveProps ({value}) {\n if (value !== this.props.value) this.setState({value: value || 0})\n }\n\n render () {\n const {className, gradient = true, children: _1, value: _2, styleBar: _3, ...props} = this.props\n return (\n <View className={classNames('app__progress--bar', className, {gradient})} {...props}>\n <View className={'app__progress--bar__wrapper'}>\n {this.progressBar}\n </View>\n </View>\n )\n }\n}\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React, { Fragment, PureComponent } from 'react'\nimport { get, isFunction } from 'ui-utils-pack'\nimport Button from './Button'\nimport Icon from './Icon'\nimport ProgressBar from './ProgressBar'\nimport Row from './Row'\nimport ScrollView from './ScrollView'\nimport Text from './Text'\nimport { withTimer } from './utils'\nimport View from './View'\n\n/**\n * Progress Steps - Component\n */\n@withTimer\nexport default class ProgressSteps extends PureComponent {\n static propTypes = {\n items: PropTypes.arrayOf(\n PropTypes.shape({\n step: PropTypes.string, // step text to display, default is incremental step number\n label: PropTypes.string, // text to display under step\n done: PropTypes.bool, // whether the step is completed\n error: PropTypes.bool, // whether the step has error\n content: PropTypes.any, // content to render under the step\n })\n ).isRequired,\n activeIndex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), // index of active item (starts at 0)\n defaultIndex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n onChange: PropTypes.func, // callback when step is clicked, receives clicked step index\n hasConnector: PropTypes.bool, // whether to render the vertical line below each step\n className: PropTypes.string, // css class names to add\n style: PropTypes.object, // css styles to add\n classNameSteps: PropTypes.string, // css class names to add\n styleSteps: PropTypes.object, // css styles to add\n classNameContent: PropTypes.string, // css class names to add\n styleContent: PropTypes.object, // css styles to add\n }\n\n state = {\n activeIndex: Math.max(+(this.props.activeIndex || this.props.defaultIndex) || 0, 0),\n transition: false,\n }\n\n UNSAFE_componentWillReceiveProps (next) {\n const {activeIndex, items} = next\n if (activeIndex != null && +activeIndex !== this.state.activeIndex) this.handleClickTab(+activeIndex)\n\n // Handle use case when parent changes layout and tab has less panels than previously set active index\n if (this.state.activeIndex >= items.length) this.setState({activeIndex: 0})\n }\n\n handleClickStep = (index) => {\n this.setState({transition: true})\n this.setTimeout(() => {\n this.setState({activeIndex: index, transition: false})\n if (this.props.onChange) this.props.onChange(index)\n }, 50) // 50 ms is needed to allow full rendering so css transition can take effect\n }\n\n render () {\n const {items, hasConnector, className, style, classNameSteps, styleSteps, classNameContent, styleContent} = this.props\n const {activeIndex, transition} = this.state\n const content = get(items[activeIndex], 'content')\n return (\n <View\n className={classNames('app__progress-steps max-size', className)}\n style={style}\n >\n <Row className={classNames('app__progress--steps top justify', classNameSteps, {connector: hasConnector})}\n style={styleSteps}>\n {items.map(({label, step, done, error}, i) => {\n const passed = i <= activeIndex\n const active = i === activeIndex\n return (\n <Fragment key={step || i}>\n {i > 0 && <ProgressBar value={passed ? 1 : 0}/>}\n <View className={classNames('app__progress__step align-center', {\n passed, active, done, error, labeled: label != null\n })}>\n <Button className='circle small margin-h-smallest' onClick={() => this.handleClickStep(i)}>\n {done\n ? <Icon className='small' name='checkmark'/>\n : (error ? <Icon className='small' name='close'/> : (step ? step : i + 1))}\n </Button>\n {label != null &&\n <Text className={classNames('position-bottom padding-top no-wrap', {bold: active})}>{label}</Text>\n }\n </View>\n </Fragment>\n )\n })}\n </Row>\n {content != null &&\n <ScrollView fill className={classNames('tabs__content', {'fade-in': !transition}, classNameContent)}\n style={styleContent}>\n {typeof content === 'object' ? content : (isFunction(content) ? content() : <Text>{content}</Text>)}\n </ScrollView>\n }\n </View>\n )\n }\n}\n","import classNames from 'classnames'\nimport React from 'react'\nimport View from './View'\n\n/**\n * Space - Pure Component\n */\nexport function Space ({small, large, className, ...props}) {\n return <View className={classNames('space' + (small ? '-small' : (large ? '-large' : '')), className)} {...props}/>\n}\n\nexport default React.memo(Space)\n","import React from 'react'\nimport { Table as TableS } from 'semantic-ui-react' // adds 4 KB to final js bundle, but has many features\nimport View from './View'\n\nexport default function Table ({\n fixedHeader = false,\n ...props\n}) {\n return (fixedHeader\n ? <View className='app__table__container--fixed-header'>\n <View className='app__table__container__inner--fixed-header'>\n <TableS {...props} />\n </View>\n </View>\n : <TableS {...props} />\n )\n}\n\nTable.Header = TableS.Header\nTable.HeaderCell = TableS.HeaderCell\nTable.Row = TableS.Row\nTable.Cell = TableS.Cell\nTable.Body = TableS.Body\nTable.Footer = TableS.Footer\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { interpolateString, isFunction, l, localiseTranslation } from 'ui-utils-pack'\nimport { _ } from 'ui-utils-pack/translations'\nimport Label from './Label'\n\n/**\n * Select - Pure Component.\n *\n * @param {*} value - selected option value\n * @param {Array} options - list of option values, e.g. ['value']\n * @param {Function} onChange - callback when user selects an option, receives value as argument\n * @param {String} [name] - input name identification for form submission\n * @param {String} [label] - select label\n * @param {String} [id] - to map label with Select for accessibility\n * @param {String} [placeholder] - text\n * @param {String} [defaultValue] - text\n * @param {String} [className] - css class name to apply\n * @param {Object} [style] - css to apply\n * @param {*} [props] - other attributes to pass to `<select>`\n * @returns {Object} - React select component\n */\nexport function Select ({\n name,\n label = name,\n id = 'select-' + name,\n value = '',\n options,\n onChange,\n placeholder,\n defaultValue = '',\n className,\n style,\n ...props\n}) {\n if (typeof options[0] === 'string') options = options.map(value => ({text: value, value}))\n if (typeof options[0] === 'number') options = options.map(value => ({text: String(value), value}))\n if (value && !onChange) throw new Error('Select.value is only used when `onChange` or `readOnly` provided')\n if (label == null) label = ''\n const selectLabel = interpolateString(_.SELECT_option, {option: label})\n return (\n <div className={classNames('select', className)} style={style}>\n <Label htmlFor={id} className=\"sr-only\">{selectLabel}</Label>\n <select\n id={id}\n name={name}\n {...isFunction(onChange) ? {\n value, onChange: (event) => onChange(event.target.value, name, event)\n } : {defaultValue}}\n {...props}\n >\n {(value == null || !!label) &&\n <option value=\"\" disabled>{placeholder || selectLabel}</option>}\n {options.map(({text, value, key}, index) => (\n <option key={key || index} value={value != null ? value : text}>{text}</option>\n ))}\n </select>\n </div>\n )\n}\n\nSelect.propTypes = {\n value: PropTypes.any,\n options: PropTypes.arrayOf(PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.shape({\n text: PropTypes.any.isRequired,\n value: PropTypes.any,\n key: PropTypes.any,\n })\n ])).isRequired,\n onChange: PropTypes.func,\n placeholder: PropTypes.any\n}\n\nexport default React.memo(Select)\n\nlocaliseTranslation({\n SELECT_option: {\n [l.ENGLISH]: 'Select {option}',\n },\n})\n","import PropTypes from 'prop-types'\nimport React, { PureComponent } from 'react'\nimport { noSpellCheck, resizeToContent, toTextHeight, toTextHeightFunc } from './renders'\nimport Select from './Select'\nimport { onPressHoc } from './utils'\n\n/**\n * Input - Pure Component.\n * Abstraction layer for React Web\n */\nexport default class InputNative extends PureComponent {\n static propTypes = {\n /* Controlled value */\n value: PropTypes.any,\n defaultValue: PropTypes.any,\n /* Input type */\n type: PropTypes.string,\n /* Textarea rows */\n rows: PropTypes.number,\n /* Callback(value) when input value changes */\n onChange: PropTypes.func,\n /* Whether to resize input width to match content length */\n compact: PropTypes.oneOfType([\n PropTypes.bool,\n // Width offset\n PropTypes.number,\n ]),\n /* Whether to adjust input height to match typed in text */\n resize: PropTypes.bool,\n /* Whether to have no spell check or correction */\n disabledSpellCheck: PropTypes.bool,\n /* Audio sound file to play on touch */\n sound: PropTypes.object,\n /* Callback(element) on mount */\n onMount: PropTypes.func,\n }\n\n UNSAFE_componentWillReceiveProps (next, nextContext) {\n const {compact, value} = this.props\n if (next.compact != null) {\n let inputValue\n if (next.value !== value) {\n inputValue = next.value\n } else if (next.compact !== compact) {\n inputValue = this.element.value\n }\n if (inputValue) resizeToContent(inputValue, this.element.style, next.compact)\n }\n }\n\n onChange = (event) => {\n const {target: {value, style}} = event\n const {onChange, compact, name} = this.props\n if (compact != null) resizeToContent(value, style, compact)\n onChange && onChange(value, name, event)\n }\n\n onChangeCheckbox = (event) => {\n const {target: {checked}} = event\n const {onChange, sound, name} = this.props\n onChange && onPressHoc(onChange, sound)(checked, name, event)\n }\n\n // @see: https://stackoverflow.com/questions/11167281/webkit-css-to-control-the-box-around-the-color-in-an-inputtype-color\n onChangeColor = (event) => {\n const {target} = event\n const {onChange, name} = this.props\n target.style.backgroundColor = target.value\n onChange && onChange(target.value, name, event)\n }\n\n onMountColor = (element) => {\n if (!element) return\n this.element = element\n element.style.backgroundColor = element.value\n }\n\n onMountResize = (element) => {\n if (!element) return\n const {compact, onMount} = this.props\n this.element = element\n resizeToContent(element.value, element.style, compact)\n onMount && onMount(element)\n }\n\n onKeyUp = (event) => {\n const {onKeyUp} = this.props\n const textHeightFunc = (event.key === 'Enter') ? toTextHeightFunc : toTextHeight // resize instantly for Enter\n textHeightFunc(event)\n onKeyUp && onKeyUp(event)\n }\n\n render () {\n let {\n disabledSpellCheck,\n resize,\n compact,\n sound,\n onMount,\n initialValues,\n ...props\n } = this.props\n if (disabledSpellCheck) props = {...noSpellCheck, ...props}\n if (resize) {\n // Must use onKeyUp because onKeyDown/onKeyPress does not register `Enter` or fire too many times\n props.onKeyUp = this.onKeyUp\n props.type = 'textarea' // only textarea can resize\n if (!props.rows) props.rows = 1\n }\n if (compact != null) props.ref = this.onMountResize\n switch (props.type) {\n case 'select':\n return <Select {...props} />\n case 'checkbox':\n props.onChange = this.onChangeCheckbox\n if (props.checked == null && props.value != null) props.checked = props.value\n return <input {...props} />\n case 'color':\n if (this.element && props.value !== this.element.value) {\n this.element.style.backgroundColor = props.value // update color for controlled input\n }\n props.onChange = this.onChangeColor // update color for uncontrolled input\n props.ref = this.onMountColor\n return <input {...props} />\n case 'textarea':\n props.onChange = this.onChange\n return <textarea {...props} />\n default:\n props.onChange = this.onChange\n return <input {...props} />\n }\n }\n}\n","import classNames from 'classnames'\nimport React, { useState, useRef } from 'react'\nimport { capitalize, isString } from 'ui-utils-pack'\nimport Button from './Button'\nimport Icon from './Icon'\nimport InputNative from './InputNative'\nimport Label from './Label'\nimport Row from './Row'\nimport Text from './Text'\nimport View from './View'\nimport { Active } from 'ui-utils-pack'\n\n/**\n * Input Wrapper - Pure Component.\n * @Note: see `InputNative` component for more documentation\n *\n * @param {String} [name] - input name attribute\n * @param {String|Object|Boolean} [icon] - name or rendered component, rendered after input by default\n * @param {Boolean} [lefty] - whether to render icon on the left before input\n * @param {Function} [onClickIcon] - callback function when clicking on the icon if given\n * @param {Function} [onFocus] - callback when input gets focus\n * @param {Function} [onBlur] - callback when input loses focus\n * @param {Function} [onRemove] - callback(id || name) when input is deleted\n * @param {String} [unit] - text to display next to entered input value\n * @param {String} [label] - text to display next to input\n * @param {String} [id] - unique identifier for label\n * @param {Boolean} [float] - whether display as float-label input\n * @param {Boolean} [disabled] - whether input is disabled\n * @param {Boolean} [done] - whether input is completed\n * @param {Boolean} [stickyPlaceholder] - whether to persist placeholder as user types\n * @param {Boolean} [resize] - whether to adjust input height to match typed in text\n * @param {Boolean} [readonly] - whether to disable input and add `readonly` css class\n * @param {Boolean} [autofocus] - whether to make input focused on page load\n * @param {String|Object} [error] - message to display\n * @param {String|Object} [info] - explanation message to display under input\n * @param {String} [title] - tooltip\n * @param {String} [className] - css class to add\n * @param {String} [classNameIcon] - css class to add to Icon\n * @param {Object} [style] - css styles\n * @param {String|Object} [children] - React component\n * @param {*} props - attributes to pass to `<input />`\n * @returns {Object} - React Component\n */\nexport function Input ({\n name,\n id = name,\n icon,\n lefty,\n onClickIcon,\n unit,\n label,\n disabled,\n done,\n className,\n classNameIcon,\n children,\n stickyPlaceholder, // only works with controlled component when `props.value` is provided\n resize,\n readonly,\n autofocus,\n float,\n error,\n info,\n style,\n onFocus,\n onBlur,\n onRemove,\n title,\n placeholder,\n translate = Active.translate,\n ...props\n}) {\n const [active, setState] = useState(props.autoFocus)\n const max = useRef(props.type === 'date' ? '9999-01-01' : null);\n if (autofocus) props.autoFocus = autofocus // React fix\n if (readonly) {\n props.className = 'readonly'\n props.readOnly = readonly\n } // React fix\n if (props.type === 'hidden') return <InputNative {...props} />\n if (float) {\n if (!label && name) label = capitalize(name)\n if (!placeholder) placeholder = ' ' // required for Float label CSS to work\n }\n if (!id && label) id = 'input-' + label.replace(/ +?/g, '-')\n if (!label && title) props.title = translate(title)\n const idHelp = id + '-help'\n const value = props.value != null ? props.value : props.defaultValue\n const hasValue = value || value === 0\n const isCheckbox = props.type === 'checkbox'\n if (done == null) done = !error && hasValue\n return (\n <View\n className={classNames('input--wrapper', className, {\n float, done, resize, swatch: props.type === 'color', required: props.required\n })}\n style={style}\n >\n {!float &&\n <Row className=\"middle\">\n {!isCheckbox && label && <Label htmlFor={id} title={translate(title)}>{translate(label)}</Label>}\n {onRemove && !readonly &&\n <Button className=\"input__delete\" onClick={() => onRemove(name || id)}><Icon name=\"delete\"/></Button>}\n </Row>\n }\n <Row className={classNames('input', {active, icon, lefty, error, info, unit})}>\n {icon && lefty && (isString(icon)\n ? <Icon name={icon} onClick={onClickIcon} className={classNameIcon}/>\n : icon\n )}\n {unit && hasValue &&\n <Text className='input__unit truncate'>\n <Text className='invisible' aria-hidden='true'>{value}</Text> {unit}\n </Text>\n }\n {stickyPlaceholder && placeholder && hasValue &&\n <Text className='input__unit' aria-hidden='true'>\n <Text className='invisible no-margin'>{props.value}</Text>{placeholder.substring(props.value.length)}\n </Text>\n }\n <InputNative\n name={name} id={id} disabled={disabled} resize={resize} aria-describedby={idHelp}\n onFocus={(...args) => {\n !active && setState(true)\n onFocus && onFocus(...args)\n }}\n onBlur={(...args) => {\n active && setState(false)\n onBlur && onBlur(...args)\n }}\n max={max.current}\n placeholder={translate(placeholder)}\n {...props}\n />\n {icon && !lefty && (isString(icon)\n ? <Icon name={icon} onClick={onClickIcon} className={classNameIcon}/>\n : icon\n )}\n {(float || isCheckbox) && label && <Label htmlFor={id} title={translate(title)}>{translate(label)}</Label>}\n </Row>\n {(error || info) &&\n <View id={idHelp} className='field-help'>\n {error && <Text className='error'>{translate(error)}</Text>}\n {info && <Text className='into'>{translate(info)}</Text>}\n </View>\n }\n {/* Reserved for Tooltip or other things */}\n {children}\n </View>\n )\n}\n\nexport default React.memo(Input)\n","import { asField } from 'ui-modules-pack/form'\nimport React from 'react'\nimport { Input } from 'ui-react-pack/Input'\n\n/**\n * Input Field connected with react-final-form\n */\nexport default asField(Input)\n","import { asField } from 'ui-modules-pack/form'\nimport React from 'react'\nimport { Dropdown } from 'ui-react-pack/Dropdown'\n\n/**\n * Dropdown Field connected with react-final-form\n */\nexport default asField(Dropdown, {\n sanitize: (value, { multiple }) => {\n return value === '' ? (multiple ? [] : '') : value\n }})\n","import PropTypes from 'prop-types'\nimport React, { PureComponent } from 'react'\nimport { Field } from 'react-final-form'\nimport { Checkbox } from 'ui-react-pack/Checkbox'\nimport { isRequired } from 'ui-react-pack/inputs/validationRules'\nimport { Active, isFunction } from 'ui-utils-pack'\n\nif (!Active.Field) Active.Field = Field\n\n/**\n * Toggle Field connected with react-final-form\n * @note: do not use `asField` because this component needs all props passed to Field for proper updates.\n * @example:\n * [FIELD.ID.TOGGLE]: {\n * name: 'tier',\n * valueTrue: TIER.PUBLIC._, // optional, defaults to `true`\n * valueFalse: TIER.PRIVATE._, // optional, defaults to `false`\n * get labelTrue () {return TIER.PUBLIC.name},\n * get labelFalse () {return TIER.PRIVATE.name},\n * get readonly () {return !hasStaffOrHigherAuth(Active.user.role)},\n * get tooltip () {return _.MESSAGE},\n * view: FIELD.TYPE.TOGGLE,\n * }\n */\nexport default class ToggleField extends PureComponent {\n static propTypes = {\n // @Note: this component should not have parse/format/normalize,\n // because you can map values explicitly with `valueTrue/False`\n name: PropTypes.string.isRequired,\n label: PropTypes.string,\n labelTrue: PropTypes.string,\n labelFalse: PropTypes.string,\n value: PropTypes.bool,\n valueTrue: PropTypes.any,\n valueFalse: PropTypes.any,\n onChange: PropTypes.func,\n id: PropTypes.string,\n danger: PropTypes.bool,\n translate: PropTypes.func,\n // @Note: see <Checkbox> component for docs\n }\n input = ({input}) => {\n if (this.props.readonly && isRequired(input.value)) return null\n const {onChange, label, name, instance, translate, ...props} = this.props\n return (\n <Checkbox\n type='toggle'\n label={translate(label) || name}\n value={input.value}\n onChange={value => {\n input.onChange(value)\n isFunction(onChange) && onChange(value, { name })\n }}\n translate={translate}\n {...props} // allow forceful value override\n />\n )\n }\n\n // Rerender Field for all prop changes to update 'labelTrue/False'\n render = () => {\n // do not pass 'onChange' to Field because it fires event as argument\n const {onChange: _, instance, ...props} = this.props\n return <Active.Field {...props} component={this.input}/>\n }\n}\n","import { asField } from 'ui-modules-pack/form'\nimport React from 'react'\nimport InputNumber from 'ui-react-pack/InputNumber'\n\nexport default asField(InputNumber)\n","import classNames from 'classnames'\nimport React, { useState, useEffect } from 'react'\nimport { capitalize, isString } from 'ui-utils-pack'\nimport Button from './Button'\nimport Icon from './Icon'\nimport Label from './Label'\nimport Row from './Row'\nimport Text from './Text'\nimport View from './View'\nimport { Active } from 'ui-utils-pack'\nimport RCInputNumber from 'rc-input-number'\n\nconst InputNumber = ({\n name,\n id = name,\n icon,\n lefty,\n onClickIcon,\n unit,\n label,\n disabled,\n done,\n className,\n classNameIcon,\n children,\n stickyPlaceholder, // only works with controlled component when `props.value` is provided\n resize,\n readonly,\n float,\n error,\n info,\n style,\n onFocus,\n onBlur,\n onRemove,\n title,\n defaultValue,\n placeholder,\n translate = Active.translate,\n outputFormat = {\n percentage: false,\n separateThousands: false,\n },\n onChange,\n value: valueFromParent,\n type: _1,\n ...props\n}) => {\n const formatDecimals = (value) => {\n if (value && outputFormat && typeof outputFormat.decimals === 'number' && outputFormat.decimals >= 0) {\n const pattern = `^\\\\d*(\\\\.\\\\d{0,${outputFormat.decimals}})?$`\n const re = new RegExp(pattern, 'g')\n if (!(re.test(value.toString()))) {\n return parseFloat(value).toFixed(outputFormat.decimals);\n }\n }\n return value\n }\n\n const [active, setActive] = useState(false)\n const [value, setValue] = useState(formatDecimals(valueFromParent))\n\n if (readonly) {\n props.className = 'readonly'\n props.readOnly = readonly\n } // React fix\n if (float) {\n if (!label && name) label = capitalize(name)\n if (!placeholder) placeholder = ' ' // required for Float label CSS to work\n }\n if (!id && label) id = 'input-' + label.replace(/ +?/g, '-')\n if (!label && title) props.title = translate(title)\n const idHelp = id + '-help'\n\n const hasValue = typeof value === 'number' && !isNaN(value)\n if (done == null) done = !error && hasValue\n\n useEffect(() => {\n if (valueFromParent !== value) {\n setValue(formatDecimals(valueFromParent))\n }\n }, [valueFromParent])\n\n const onChangeHandler = (value, name, event) => {\n let nextValue = formatDecimals(value)\n onChange(nextValue, name, event)\n setValue(nextValue)\n }\n\n function commify(n) {\n var parts = n.toString().split('.');\n const numberPart = parts[0];\n const decimalPart = parts[1];\n const thousands = /\\B(?=(\\d{3})+(?!\\d))/g;\n return numberPart.replace(thousands, ' ') + (decimalPart ? '.' + decimalPart : '');\n }\n\n const format = (value, {userTyping, input}) => {\n if (outputFormat) {\n if (outputFormat.percentage) {\n return value + ' %'\n }\n if (outputFormat.separateThousands) {\n return commify(value)\n }\n }\n\n return value\n }\n\n const parser = (value) => {\n if (outputFormat) {\n if (outputFormat.percentage) {\n return Number(value.replace(' %', ''))\n }\n if (outputFormat.separateThousands) {\n if (!value) {\n return value\n }\n return Number(value.toString().replace(/ /g, ''))\n }\n }\n return value\n }\n\n return (\n <View\n className={classNames('input--wrapper', className, {\n float, done, resize, required: props.required\n })}\n style={style}\n >\n {!float &&\n <Row className=\"middle\">\n {label && <Label htmlFor={id} title={translate(title)}>{translate(label)}</Label>}\n {onRemove && !readonly &&\n <Button className=\"input__delete\" onClick={() => onRemove(name || id)}><Icon name=\"delete\"/></Button>}\n </Row>\n }\n <Row className={classNames('input', {active, icon, lefty, error, info, unit})}>\n {icon && lefty && (isString(icon)\n ? <Icon name={icon} onClick={onClickIcon} className={classNameIcon}/>\n : icon\n )}\n {unit && hasValue &&\n <Text className='input__unit truncate'>\n <Text className='invisible' aria-hidden='true'>{value}</Text> {unit}\n </Text>\n }\n {stickyPlaceholder && placeholder && hasValue &&\n <Text className='input__unit' aria-hidden='true'>\n <Text className='invisible no-margin'>{props.value}</Text>{placeholder.substring(props.value.length)}\n </Text>\n }\n <RCInputNumber\n name={name}\n id={id}\n disabled={disabled}\n resize={resize}\n aria-describedby={idHelp}\n placeholder={translate(placeholder)}\n onFocus={(...args) => {\n !active && setActive(true)\n onFocus && onFocus(...args)\n }}\n onBlur={(...args) => {\n active && setActive(false)\n onBlur && onBlur(...args)\n }}\n onChange={onChangeHandler}\n {...props}\n value={value}\n parser={parser}\n formatter={format}\n wheel={false}\n />\n {icon && !lefty && (isString(icon)\n ? <Icon name={icon} onClick={onClickIcon} className={classNameIcon}/>\n : icon\n )}\n {float && label && <Label htmlFor={id} title={translate(title)}>{translate(label)}</Label>}\n </Row>\n {(error || info) &&\n <View id={idHelp} className='field-help'>\n {error && <Text className='error'>{translate(error)}</Text>}\n {info && <Text className='into'>{translate(info)}</Text>}\n </View>\n }\n {children}\n </View>\n )\n}\n\nexport default InputNumber\n","import { asInputDateField } from 'ui-modules-pack/form'\nimport InputDate from 'ui-react-pack/InputDate'\n\nexport default asInputDateField(InputDate)\n","import { Field } from 'react-final-form'\nimport React, { PureComponent } from 'react'\nimport PropTypes from 'prop-types'\nimport { isRequired } from 'ui-react-pack/inputs/validationRules'\nimport { storedTouched } from 'ui-modules-pack/form/utils'\nimport { Active } from 'ui-utils-pack'\n\nexport function asInputDateField (InputComponent, {sanitize} = {}) {\n if (!Active.Field) Active.Field = Field\n const Class = class extends PureComponent {\n static propTypes = {\n // Input `name` attribute\n name: PropTypes.string.isRequired,\n // Instance of the Class component decorated withFormSetup (i.e withForm)\n instance: PropTypes.object,\n label: PropTypes.any,\n id: PropTypes.string,\n // HTML Input type attribute\n type: PropTypes.string,\n // Input placeholder\n placeholder: PropTypes.any,\n // help text or component to show on focus\n info: PropTypes.any,\n // help text or component to show on invalid input\n error: PropTypes.any,\n value: PropTypes.any,\n onChange: PropTypes.func,\n format: PropTypes.func,\n normalize: PropTypes.func,\n parse: PropTypes.func,\n translate: PropTypes.func,\n }\n\n state = {\n selectPreviousValue: null\n }\n\n get value () {\n if (this._value !== void 0) {\n return this._value\n }\n return null\n }\n\n set value (v) {\n this._value = v\n }\n\n // do not use ...props from input, because it is shared by <Active.Field> instances\n // @Note: react-final-form fires `format()` when `input.value` getter is called\n Input = ({input: {value, ...input}, meta: {touched, error, pristine} = {}}) => {\n const {\n onChange, error: err, defaultValue, normalize, format, parse, validate,\n instance, onRemoveChange, ...props\n } = this.props\n\n if (!this.hasFocus) { // use cached `value` while editing to prevent format/parse bugs and rerender\n // @Note: defaultValue is only used for UI, internal value is still undefined\n this.value = value === void 0\n ? (pristine && defaultValue != null ? (format ? format(defaultValue) : defaultValue) : value)\n : value\n\n }\n\n // Hide this field if it's readonly and has no value.\n if (this.props.readonly && isRequired(this.value != null ? this.value : this.props.value)) return null\n\n this.input = input\n\n if (instance) this.initValues = instance.props.initialValues\n\n const nextValue = this.value\n\n const errorText = error && (storedTouched[input.name] || touched || !pristine) && (err || error)\n\n return (\n <InputComponent\n {...input}\n value={nextValue}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur} // prevent value change, but need onBlur to set touched for validation\n onChange={this.handleChange}\n error={errorText} // only show error after user interaction\n {...props} // allow forceful value override\n />\n )\n }\n\n handleFocus = (...args) => {\n this.hasFocus = true\n return this.input.onFocus(...args)\n }\n\n\n handleChange = (value, ...args) => {\n const {onChange, normalize, parse = normalize} = this.props\n\n if (this.hasFocus) {\n this.value = value\n }\n\n this.input.onChange(value) // final-form input.onChange can accept 'event' or 'value'\n onChange && onChange(parse ? parse(value) : value, ...args)\n }\n\n\n render () {\n const {\n name, disabled, normalize, format, parse = normalize, validate, options\n } = this.props\n return <Active.Field {...{name, disabled, normalize, format, parse, validate, options}}\n component={this.Input}/>\n }\n }\n\n Object.defineProperty(Class, 'name', {value: (InputComponent.name || InputComponent.constructor.name) + 'AsField'})\n return Class\n}","import classNames from 'classnames'\nimport React, { useState, useMemo, useContext } from 'react'\nimport Row from './Row'\nimport Text from './Text'\nimport View from './View'\nimport Label from './Label'\nimport { Active } from 'ui-utils-pack'\nimport Picker from 'rc-picker'\nimport enUs from 'rc-picker/lib/locale/en_US'\nimport generateConfig from 'rc-picker/lib/generate/moment'\nimport moment from 'moment'\nimport ConfigContext from 'core/src/providers/ConfigProvider'\n\nconst InputDate = ({\n name,\n id = name,\n icon,\n lefty,\n onClickIcon,\n unit,\n label,\n disabled,\n done,\n className,\n classNameIcon,\n children,\n stickyPlaceholder, // only works with controlled component when `props.value` is provided\n resize,\n readonly,\n autofocus,\n error,\n info,\n style,\n onFocus,\n onBlur,\n onRemove,\n title,\n placeholder,\n translate = Active.translate,\n onChange,\n onSelect,\n ...props\n}) => {\n const config = useContext(ConfigContext)\n\n const dateFormat = useMemo(() => config.dateFormat || 'DD/MM/YYYY', [config])\n\n if (autofocus) props.autoFocus = autofocus // React fix\n if (readonly) {\n props.className = 'readonly'\n props.readOnly = readonly\n }\n\n if (!id && label) id = 'input-' + label.replace(/ +?/g, '-')\n if (!label && title) props.title = translate(title)\n\n const value = props.value ?\n moment(props.value) :\n props.defaultValue ?\n moment(props.defaultValue) : null\n\n const idHelp = useMemo(() => id + '-help', [id])\n\n const onDateChanged = (date, ...rest) => {\n onChange && onChange(moment(date, dateFormat).format('YYYY-MM-DD'))\n }\n\n return (\n <View\n className={classNames('input--wrapper', className, {\n resize, swatch: props.type === 'color', required: props.required\n })}\n style={style}\n >\n <Row className=\"middle\">\n {label && <Label htmlFor={id} title={translate(title)}>{translate(label)}</Label>}\n </Row>\n <Row className={classNames('input', {icon, lefty, error, info, unit})}>\n <Picker\n name={name}\n id={id}\n prefixCls={'ui-render-picker'}\n className={'ui-render-picker'}\n disabled={disabled}\n resize={resize}\n aria-describedby={idHelp}\n placeholder={translate(placeholder)}\n generateConfig={generateConfig}\n {...props}\n value={value}\n allowClear={false}\n locale={enUs}\n picker='date'\n format={[dateFormat, 'YYYY-MM-DD']}\n onChange={onDateChanged}\n onCalendarChange={onSelect}\n />\n </Row>\n {(error || info) &&\n <View id={idHelp} className='field-help'>\n {error && <Text className='error'>{translate(error)}</Text>}\n {info && <Text className='into'>{translate(info)}</Text>}\n </View>\n }\n {children}\n </View>\n )\n}\n\nexport default InputDate\n// export default React.memo(InputDate)\n","import { FILE as _FILE } from 'ui-react-pack/files'\nimport { _WORK_DIR_, ENV, isList, SIZE_MB_16 } from 'ui-utils-pack'\nimport { fileFormatNormalized, fileNameWithoutExt, isFileSrc, mimeTypeFromDataUrl } from 'ui-utils-pack/string'\n\n/**\n * FILE VARIABLES ==============================================================\n * =============================================================================\n */\n\nexport const FILE = {\n ..._FILE,\n EXT: {\n CSV: 'csv',\n GIF: 'gif',\n JSON: 'json',\n JPG: 'jpg',\n JPEG: 'jpeg',\n MP3: 'mp3',\n MP4: 'mp4',\n PNG: 'png',\n SVG: 'svg',\n WEBP: 'webp',\n },\n MIME_TYPE: {\n BIN: 'application/octet-stream',\n CSV: 'text/csv',\n GIF: 'image/gif',\n JSON: 'application/json',\n JPG: 'image/jpeg',\n MP3: 'audio/mpeg',\n MP4: 'video/mp4',\n PNG: 'image/png',\n SVG: 'image/svg+xml',\n WEBP: 'image/webp',\n },\n // File Uploads\n TYPE: {\n JSON: 'json',\n IMAGE: 'image',\n SOUND: 'sound',\n VIDEO: 'video',\n },\n}\n\nFILE.FORMAT_BY_MIME_TYPE = {\n [FILE.MIME_TYPE.BIN]: 'bin',\n [FILE.MIME_TYPE.CSV]: 'csv',\n [FILE.MIME_TYPE.GIF]: 'gif',\n [FILE.MIME_TYPE.JSON]: 'json',\n [FILE.MIME_TYPE.JPG]: 'jpg',\n [FILE.MIME_TYPE.MP3]: 'mp3',\n [FILE.MIME_TYPE.MP4]: 'mp4',\n [FILE.MIME_TYPE.PNG]: 'png',\n [FILE.MIME_TYPE.SVG]: 'svg',\n [FILE.MIME_TYPE.WEBP]: 'webp',\n}\n\nexport const IMAGE = {\n MAX_RES: SIZE_MB_16, // total Image width*height resolution limit (16 MB is about 4K image)\n EXTENSIONS: [FILE.EXT.JPG, FILE.EXT.JPEG, FILE.EXT.PNG, FILE.EXT.SVG, FILE.EXT.GIF, FILE.EXT.WEBP],\n MIME_TYPES: [FILE.MIME_TYPE.JPG, FILE.MIME_TYPE.PNG, FILE.MIME_TYPE.SVG, FILE.MIME_TYPE.GIF, FILE.MIME_TYPE.WEBP],\n SIZES: { // default sharp.resize() config for image uploads\n // @see: https://sharp.pixelplumbing.com/api-resize\n '': {res: SIZE_MB_16}, // max 4K resolution for the original file\n medium: {width: 1200, height: 1200, fit: 'inside'},\n thumb: {width: 150, height: 150, fit: 'cover'},\n }\n}\n\nexport const UPLOAD = {\n DIR: `/uploads`, // relative to site's root for frontend, and _WORK_DIR_ for backend\n BY_ROUTE: {\n [FILE.TYPE.JSON]: {fileTypes: '.json', maxSize: SIZE_MB_16},\n [FILE.TYPE.IMAGE]: {fileTypes: '.' + IMAGE.EXTENSIONS.join(', .'), maxSize: SIZE_MB_16},\n [FILE.TYPE.SOUND]: {fileTypes: '.mp3', maxSize: SIZE_MB_16},\n [FILE.TYPE.VIDEO]: {fileTypes: '.mp4', maxSize: SIZE_MB_16},\n },\n}\n\n// @important: for backend, insert this at the top of _init.js:\n// import 'ui-modules-pack/utils/server/config' // load .env file variables\n// Bucket name must be empty string so that backend can set bucket during runtime\nUPLOAD.PATH = `${ENV.CDN_BUCKET_NAME ? '' : (ENV.UPLOAD_PATH || _WORK_DIR_)}${UPLOAD.DIR}` // full upload path\n\n/**\n * Create JS File Object from given URL\n * @param {String} url - to fetch file, can be Base64 string, http url, dataURL, blobURL, etc...\n * @param {String} filename - to use\n * @param {FilePropertyBag|undefined} [options] - attributes to pass to new File()\n * @returns {Promise<File>} file object if resolved\n */\nexport function fileFromUrl (url, filename, options) {\n return fetch(url)\n .then((res) => res.arrayBuffer())\n .then((buf) => new File([buf], filename, options))\n}\n\n/**\n * Get File Format Extension from Data URL String\n * @param {String} dataUrl - see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\n * @returns {String} format - example: 'png'\n */\nexport function fileFormatFromDataUrl (dataUrl) {\n return FILE.FORMAT_BY_MIME_TYPE[mimeTypeFromDataUrl(dataUrl)]\n}\n\n/**\n * Create File Name (with optional ID folder) from FileInput object in this format:\n * `{id}/{kind}_{i}.{ext}` - for use in File `src` string for frontend and backend.\n *\n * @example: possible outputs\n * const file = {id: 'test', kind: 'public', i: 'thumb', ext: 'jpg'}\n * >>> 'test/public_thumb.jpg'\n * const file = {id: 'test', kind: 'public', ext: 'jpg'}\n * >>> 'test/public.jpg'\n * const file = {id: 'test', i: 'thumb'}\n * >>> 'test/thumb'\n * const file = {id: 'test', ext: 'jpg'}\n * >>> 'test.jpg'\n * const file = {ext: 'jpg'}\n * >>> '.jpg'\n *\n * @param {FileInput|Object<id, kind, i, name>} fileInput - FileInput object (ex. from GraphQL)\n * @returns {string} filename - including optional ID folder\n */\nexport function fileName (fileInput) {\n let {id, kind, i, name} = fileInput\n id = id != null ? String(id) : ''\n kind = kind != null ? String(kind) : ''\n i = i != null ? String(i) : ''\n const ext = name != null ? fileFormatNormalized(name) : ''\n const slash = id && (kind || i) && '/'\n const _ = kind && i && '_'\n const dot = ext && '.'\n return `${id}${slash}${kind}${_}${i}${dot}${ext}`\n}\n\n/**\n * Compute File Name with given Size label\n *\n * @param {String} filename - with extension, result of `fileName()`\n * @param {String} size - for given `filename`\n * @returns {String} filename with size added to the name.\n */\nexport function fileNameSized (filename, size) {\n if (!size) return filename\n const name = fileNameWithoutExt(filename)\n const ext = fileFormatNormalized(filename)\n const extension = ext ? `.${ext}` : ''\n return `${name}_${size}${extension}`\n}\n\n/**\n * Compute Unique File ID for given FileInput props.\n * File can have different versions with the same `id`, thus need to combine other props as primary key.\n * @see `fileName()` for arguments and return value\n */\nexport function fileId ({name, ext, ...fileInput}) {\n return fileName(fileInput)\n}\n\n/**\n * Create File Upload Folder from given Mongoose Document Instance\n * @param {Document} instance - Mongoose doc\n * @returns {String} folder - in this format `{ModelName}/{id}`\n */\nexport function folderFrom (instance) {\n const {id, constructor: {modelName}} = instance\n return `/${modelName}/${id}`\n}\n\n/**\n * Standardizes how the absolute file path is computed\n * @param {String} [filename] - required if absolute `path` not given (ex. photo.jpg)\n * @param {String} [folder] - file directory path relative to `workDir`, if `dir` not given, must start with slash (ex. '/User')\n * @param {String} [workDir] - absolute working directory path, defaults to UPLOAD.PATH\n * @param {String} [dir] - absolute directory path, excluding file name (ex. `/root/uploads`), defaults to `workDir` + `folder`\n * @param {String} [path] - required if `filename` not given, absolute directory path, including file name (ex. `/root/uploads/old_image.jpg`)\n * @returns {Object} {dir, path, name}\n * - `path` -> absolute path including filename,\n * - `dir` -> without filename\n * - `name` -> filename\n */\nexport function resolvePath ({filename = '', folder = '', dir = '', path = '', workDir = UPLOAD.PATH}) {\n if (!filename && !path) throw new Error(`${resolvePath.name}() requires either 'filename' or full absolute 'path'`)\n if (!path) {\n if (!dir) dir = `${workDir}${folder}`\n const _name = fileNameWithoutExt(filename)\n const slash = _name && '/' // turn directory into file when `filename` only has extension (ex. '.jpg')\n path = `${dir}${slash}${filename}`\n dir = _name ? dir : path.substr(0, path.lastIndexOf('/'))\n } else {\n dir = path.substr(0, path.lastIndexOf('/'))\n }\n const name = path.substr(path.lastIndexOf('/') + 1)\n return {dir, path, name}\n}\n\n/**\n * Parse <UploadGridField/> onChange(files) values to match Backend API\n * @param {FileInput[]|FileInput} files - single or list of FileInputs to parse\n * @returns {Object[]|Object|void} {file, kind, i, remove}[] - single or list of FileInputs for backend\n */\nexport function fileParser (files) {\n if (isList(files)) {\n const list = files.map(fileParser).filter(v => v)\n if (list.length) return list\n } else {\n const {file, kind, i, remove} = files\n if (file) return {file, kind, i}\n if (remove) return {kind, i, remove}\n }\n}\n\n/**\n * Parse <UploadGridField/> onChange(files) values to have `kind` as given\n * @param fileInput\n * @param {String} kind - to use\n * @returns {{kind, remove}|{file, kind}} fileInput for backend with kind inserted\n */\nexport function fileKindParser (fileInput, kind) {\n const {file, remove} = fileInput\n if (file) return {file, kind}\n if (remove) return {kind, remove}\n}\n\n/**\n * Load Image file\n *\n * @param {String} src - full image file path\n * @return {Promise<Image|Error>} promise - resolves to loaded Image file or error\n */\nexport function loadImage (src) {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = reject\n img.src = src\n })\n}\n\n/**\n * Compute Image `preview` URL/pathname (can accept Base64 string) in different sizes for consumption by frontend:\n * - `preview` matches original `src`\n * - `preview.medium` matches medium size of `src`\n * - `preview.thumb` matches thumbnail size of `src`\n *\n * => pass in `null` as the second parameter to disable default fallback to IMAGE.SIZES.\n *\n * @example:\n * const preview = previewSizes(image)\n * preview == image.src >>> true\n * preview.medium >>> string\n * preview.thumb >>> string\n *\n * Scenarios:\n * 1. Production file: use `src` suffixed with 'medium' for default size, else `src` as 'original'\n * 2. Local dev file: user `src` as base64 data if it is of base64 type, else same as point 1.\n * @param {Object} - FileInput with `src` and optional `sizes` attribute (ex. [{key: 'medium', val: 99}])\n * @param {String[]|Null} [resKeys] - use predefined image size keys when FileInput.sizes not available\n * @return {Object|Undefined} preview<medium, thumb...> - string object with sizes attached as props of `preview`\n */\nexport function previewSizes ({src, sizes}, resKeys = imgSizes) {\n if (!src) return\n if ((sizes || resKeys) && isFileSrc(src)) {\n // noinspection JSPrimitiveTypeWrapperUsage\n const preview = new String(src)\n if (sizes) {\n for (const size of sizes) {\n const {key} = size\n if (!key) continue\n preview[key] = fileNameSized(src, key)\n }\n } else {\n // fallback is needed to compute sizes for EntrySummary that likely doesn't query `sizes`,\n resKeys.forEach(key => key && (preview[key] = fileNameSized(src, key)))\n }\n return preview\n }\n return src\n}\n\nconst imgSizes = Object.keys(IMAGE.SIZES)\n","import { Active, namespace } from 'ui-utils-pack'\n\n/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const UPLOAD = 'UPLOAD' // namespace this module\nexport const UPLOAD_SERVER = namespace(UPLOAD, Active.SERVICE) // Namespace this module for backend\n","import now from 'performance-now' // adds almost zero KB to bundle size because browsers have window.performance.now()\nimport { createSelector } from 'reselect'\nimport { __CLIENT__, __DEV__, Active } from './_envs.js'\nimport { ONE_MILLISECOND } from './constants.js'\nimport { logSelector } from './log.js'\nimport { formatNumber } from './number.js'\n\n/**\n * Selector Decorator to turn all class static property functions into Memoized Functions\n *\n * @see: `createSelector` in reselect library for docs\n * @note: make sure to avoid arrow function when reusing selectors\n *\n * @example:\n * // selectors.js\n * @selector(NAME)\n * export default class select {\n *\n * static activeRoute = () => [\n * (state) => get(state, `${NAME}.location.pathname`),\n * (pathname) => pathname\n * ]\n *\n * // Reusing selectors\n * static activeUri = function () {\n * // noinspection JSPotentiallyInvalidUsageOfClassThis\n * return [\n * this.activeRoute,\n * (state) => get(state, `${this.NAME}.location.id`),\n * (route, id) => route.split('/').pop()\n * ]\n * }\n * }\n * @param {String} NAME - module's namespace\n * @param {Number} [maxTime] - milliseconds, to be considered slow (highlights execution time as red), default is 5 ms\n * @returns {Function} decorator - that transforms given class' static properties\n */\nexport default function selector (NAME, maxTime = 5 * ONE_MILLISECOND) {\n let start\n return function (constructor) {\n for (const key in constructor) {\n const selectors = constructor[key]()\n const lastFunc = selectors.pop()\n selectors.forEach((selector, i) => selector || console.error(`${lastFunc.name} is missing selector ${i + 1}!`))\n constructor[key] = createSelector(\n ...selectors,\n function () {\n __DEV__ && (start = now())\n const result = lastFunc(...arguments)\n if (__DEV__) {\n const duration = now() - start\n let time = `${formatNumber(duration, {decimals: 3})} ms`\n if (duration >= maxTime) {\n if (__CLIENT__ || (!Active.log || !Active.log.keyword)) {\n time = '%c' + time + '%c'\n logSelector(`${NAME} ${key} [${time}]`, result, 'color: Red', 'color: Orange')\n }\n // Chalk logger is available\n else {\n logSelector(`${NAME} ${key} [`, result, Active.log.keyword('red')(time), Active.log.keyword('orange')(']'))\n }\n } else {\n logSelector(`${NAME} ${key} [${time}]`, result)\n }\n }\n return result\n }\n )\n }\n constructor.NAME = NAME // can be accessed as instance `this.NAME` within selectors\n }\n}\n\n","import selector from 'ui-utils-pack/selectors'\nimport { UPLOAD } from './constants'\n\n/**\n * STATE SELECTORS =============================================================\n * Memoized Functions - to retrieve specific branches of the app state\n * =============================================================================\n */\n\n@selector(UPLOAD)\nexport default class select {\n\n // Dropzone Files\n static files = () => [\n state => state[UPLOAD].files,\n (val) => val || []\n ]\n\n static loading = () => [\n state => state[UPLOAD].loading,\n (val) => val\n ]\n\n static images = function () {\n return [\n this.files,\n (files) => files.filter(({preview}) => !!preview)\n ]\n }\n}\n","import classNames from 'classnames'\nimport { POPUP, POPUP_ALERT } from 'ui-modules-pack/popup/constants'\nimport { connect, stateAction } from 'ui-modules-pack/redux'\nimport { ROUTE_HOME, UPLOAD as U } from 'ui-modules-pack/variables'\nimport React, { Fragment, PureComponent } from 'react'\nimport Dropzone from 'react-dropzone'\nimport { type, withTimer } from 'ui-react-pack'\nimport Icon from 'ui-react-pack/Icon'\nimport Loading from 'ui-react-pack/Loading'\nimport Row from 'ui-react-pack/Row'\nimport Text from 'ui-react-pack/Text'\nimport Tooltip from 'ui-react-pack/Tooltip'\nimport View from 'ui-react-pack/View'\nimport {\n get,\n hasListValue,\n interpolateString as parseString,\n isFunction,\n log,\n OPEN,\n pluralize,\n SET,\n shortNumber,\n SIZE_KB\n} from 'ui-utils-pack'\nimport { UPLOAD } from '../constants'\nimport select from '../selectors'\nimport { _ } from '../translations'\nimport { Active } from 'ui-utils-pack'\n\n/**\n * MAP STATE & ACTIONS TO PROPS ------------------------------------------------\n * -----------------------------------------------------------------------------\n */\nconst mapStateToProps = (state) => ({\n loading: select.loading(state)\n})\nconst mapDispatchToProps = (dispatch) => ({\n actions: {\n upload: (files, fileType) => dispatch(stateAction(UPLOAD, SET, {files, fileType})),\n popup: (item) => dispatch(stateAction(POPUP, OPEN, {\n activePopup: POPUP_ALERT,\n [POPUP_ALERT]: {\n items: [item]\n }\n }))\n }\n})\n\n/**\n * VIEW TEMPLATE ---------------------------------------------------------------\n * todo: fix Dropzone opening upload window twice (try fast upload)\n * -----------------------------------------------------------------------------\n */\n@connect(mapStateToProps, mapDispatchToProps)\n@withTimer\nexport default class Upload extends PureComponent {\n static propTypes = {\n // Upload file type, falls back to Route pathname\n // If given, will render as embedded component, instead of Modal route\n fileType: type.OneOf(type.String, type.Number),\n /* Allowed file formats, example: ['jpg', 'png'] */\n formats: type.ListOf(type.String),\n /* Maximum File size in bytes */\n maxSize: type.Number,\n /* Callback(acceptedFiles, name) onDrop files */\n onChange: type.Method,\n /* Callback when close button is clicked (ex. history.goBack()) */\n onClose: type.Method,\n /* Callback when cancel upload or on drag leave */\n onBlur: type.Method,\n /* Callback when choose file or on drag enter */\n onFocus: type.Method,\n /* Callback(instance, ...componentWillMountProps) before component mounts */\n onComponentWillMount: type.Method,\n loading: type.Boolean,\n disabled: type.Boolean, // whether to disable upload\n readonly: type.Boolean, // whether to make upload viewable only\n multiple: type.Boolean, // whether to allow multiple file uploads, true by default\n hasHeader: type.Boolean, // whether to show title above the upload\n showTypes: type.Boolean, // whether to show file types tooltip\n round: type.Boolean, // whether to add `round` css class\n label: type.String, // optional label to show in the title\n labelOnHover: type.String, // optional label to show on Dropzone hover\n children: type.Any,\n translate: type.Method,\n }\n\n static defaultProps = {\n loading: false,\n multiple: true,\n showTypes: true,\n translate: Active.translate\n }\n\n state = {\n active: false\n }\n\n get formats () {\n const {formats} = this.props\n return formats ? `.${formats.join(', .')}` : (U.BY_ROUTE[this.fileType] || {}).fileTypes\n }\n\n get maxSize () {\n return this.props.maxSize || (U.BY_ROUTE[this.fileType] || {}).maxSize\n }\n\n get fileType () {\n return this.props.fileType || this.uri.split(/\\//).pop().toLowerCase()\n }\n\n get uri () {\n return get(this.props, 'location.pathname', ROUTE_HOME)\n }\n\n onDragEnter = (...args) => this.setState({active: true}, () => this.props.onFocus && this.props.onFocus(...args))\n onDragLeave = (...args) => this.setState({active: false}, () => this.props.onBlur && this.props.onBlur(...args))\n\n handleUpload = (acceptedFiles, rejectedFiles) => {\n log('acceptedFiles:', acceptedFiles)\n log('rejectedFiles:', rejectedFiles)\n const {actions, onChange, name} = this.props\n if (hasListValue(acceptedFiles)) {\n const maxSize = this.maxSize\n for (const file of acceptedFiles) {\n if (file.size > maxSize) return actions.popup({\n title: _.MAXIMUM_FILE_SIZE_EXCEEDED,\n content: <Row className=\"center wrap\">\n <Text className=\"bold margin-h-smaller\">{file.name}</Text>\n <Text>{_.MUST_BE_UNDER}</Text>\n <Text className=\"bold margin-h-smaller\">{shortNumber(maxSize, 3, SIZE_KB)}B</Text>\n </Row>,\n closeLabel: _.OK\n })\n }\n actions.upload(acceptedFiles, this.fileType)\n isFunction(onChange) && onChange(acceptedFiles, name, this.dropzone)\n } else {\n actions.popup({\n title: _.FILE_UPLOAD_FAILED,\n content: <View className='center wrap'>\n <Text>{_.UPLOAD}</Text>\n <Text className=\"p bold\">{this.formats}</Text>\n <Text>{_.FILES_ONLY}</Text>\n </View>,\n closeLabel: _.OK\n })\n }\n }\n\n handleKeyPress = event => {\n if (event.key === 'Enter') this.dropzone.open()\n }\n\n renderClose = (handleClose) => (\n <View className=\"app__view--close\" onClick={handleClose}>\n <Text className=\"app__view--close__icon\">{'✕'}</Text>\n <Tooltip top>{_.CLOSE}</Tooltip>\n </View>\n )\n\n UNSAFE_componentWillMount (...args) {\n this.props.onComponentWillMount && this.props.onComponentWillMount(this, ...args)\n // if (this.props.fileType == null && !window.prevLocation) { // if this route is accessed directly in browser\n // history.push(ROUTE_HOME) // go to homepage first,\n // this.setTimeout(() => { // then open as Modal\n // openModal(this.uri, {className: 'fill--three-quarter'})\n // }, 100)\n // }\n }\n\n render () {\n const {\n loading, children, multiple, disabled, readonly, onBlur, name, labelOnHover, onClose,\n className, classWrap, hasHeader, round, showTypes, title, translate\n } = this.props\n const label = this.props.label || this.fileType || _.FILE\n const {active} = this.state\n const formats = this.formats\n return (\n <View className={classNames('app__upload', classWrap, {round})}>\n {onClose && this.renderClose(onClose)}\n {hasHeader && <h2>{parseString(_.UPLOAD_file, {file: label})}</h2>}\n <Dropzone\n // @note: When tabbing to dropzone with keyboard, input[type=\"file\"] also gets event -> causing open twice.\n // => input is hidden by dropzone because it has ugly \"Choose File\" button\n name={name}\n title={translate(title)}\n inputProps={inputProps}\n tabIndex={disabled ? -1 : 0}\n className={classNames('upload__dropzone', className, {active, round, disabled, readonly})}\n ref={(node) => { this.dropzone = node }}\n onDragEnter={this.onDragEnter}\n onDragLeave={this.onDragLeave}\n onDrop={this.handleUpload}\n onFileDialogCancel={onBlur}\n onKeyPress={this.handleKeyPress}\n accept={formats}\n multiple={multiple}\n disabled={disabled || readonly}\n >\n {children || <Fragment>\n <Icon name=\"image\" className=\"text largest no-margin\"/>\n <Text className='p margin-top-smallest'>\n {_.SELECT_OR_DROP}<br/>\n {pluralize(label, multiple ? 2 : 1)}\n </Text>\n </Fragment>\n }\n {showTypes &&\n <View className=\"dropzone__hover position-fill align-center appear-on-hover\">\n <View className=\"padding text-outline\">\n <View className=\"dropzone__hover__bg position-fill bg-neutral radius-large\"/>\n <Text className=\"margin-bottom-smaller\">\n {labelOnHover || parseString(_.UPLOAD_file_FILE, {file: label})}\n </Text>\n <Text className=\"bold p\">{formats.replace(/\\./g, '')}</Text>\n </View>\n </View>\n }\n </Dropzone>\n <Loading loading={loading}/>\n </View>\n )\n }\n}\n\nconst inputProps = {tabIndex: -1}\n","import PropTypes from 'prop-types'\nimport React from 'react'\nimport { l, localiseTranslation, toLowerCase } from 'ui-utils-pack'\nimport { _ } from 'ui-utils-pack/translations'\nimport Text from './Text'\nimport View from './View'\n\nlocaliseTranslation({\n FIELD_DOES_NOT_EXIST_: {\n [l.ENGLISH]: 'Field does not exist!',\n }\n})\n\n/**\n * Placeholder Field - Pure Component.\n */\nexport function PlaceholderField ({name, ...props} = {}) {\n if (props.children == null)\n props.children = <Text className=\"p error padding border\">\n <Text className=\"bold\">{name}</Text>{toLowerCase(_.FIELD_DOES_NOT_EXIST_)}\n </Text>\n return <View {...props}/>\n}\n\nPlaceholderField.propTypes = {\n name: PropTypes.any\n}\n\nexport default React.memo(PlaceholderField)\n","import { asField } from 'ui-modules-pack/form'\nimport { DropdownField, InputField, ToggleField, InputNumberField, InputDateField } from 'ui-modules-pack/form/inputs'\nimport Upload from 'ui-modules-pack/upload/views/Upload'\nimport { FIELD } from 'ui-modules-pack/variables'\nimport React from 'react'\nimport { PlaceholderField } from 'ui-react-pack/PlaceholderField'\nimport { Active } from 'ui-utils-pack'\n\nconst UploadField = asField(Upload, {sanitize: (value) => value || undefined})\n\nexport function renderField (fieldDefinition, i) {\n let Field\n const {view, type, ...props} = fieldDefinition\n switch (view) {\n case FIELD.TYPE.INPUT:\n Field = InputField\n break\n case FIELD.TYPE.SELECT:\n Field = DropdownField\n break\n case FIELD.TYPE.TOGGLE:\n Field = ToggleField\n break\n case FIELD.TYPE.UPLOAD:\n Field = UploadField\n break\n default:\n Field = PlaceholderField.bind(this, {name: view})\n }\n\n if (type === 'number') {\n Field = InputNumberField\n }\n\n if (type === 'date') {\n Field = InputDateField\n }\n\n return <Field key={i} {...props} type={type} />\n}\n\nActive.renderField = renderField\n","import React from 'react'\nimport { round } from 'ui-utils-pack'\n\n/**\n * Emoji - Pure Component to center emoji\n * @see: https://stackoverflow.com/questions/44142464/how-do-i-horizontally-center-an-emoji\n */\nexport function Emoji ({small, large, ...props}) {\n let size = 4\n if (small) size *= 0.75\n if (large) size *= 2\n return (\n <span role=\"img\" {...props} style={{\n display: 'inline-block',\n fontSize: `${size}em`,\n transform: `scale(.25) translateY(${large ? 6.175 : 2.175}em)`,\n transformOrigin: 'center',\n margin: `-${round(size / 4, 3)}em -.333em`,\n }}/>\n )\n}\n\nexport default React.memo(Emoji)\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport Emoji from './Emoji'\nimport Text from './Text'\nimport View from './View'\n\n/**\n * Placeholder - Pure Component.\n */\nexport function Placeholder ({className, ...props}) {\n return <View\n fill\n className={classNames('bg-texture-faded full-screen middle center fade-in-up padding-largest', className)}\n {...props}\n />\n}\n\nPlaceholder.propTypes = {\n children: PropTypes.any.isRequired\n}\n\nPlaceholder.Searching = function ({title, ...props}) {\n return (\n <Placeholder {...props}>\n <Text className='h2 center'>{title}</Text>\n <View className='signal-pulse large margin-v'>\n <View className='position-center blink'><Emoji large>😎</Emoji></View>\n </View>\n <View className='margin-v'>\n <Text className='center large margin-v-small'>{'Nothing found,'}</Text>\n <Text className='center large margin-bottom'>{'check back in later...'}</Text>\n </View>\n </Placeholder>\n )\n}\n\nPlaceholder.Searching.propTypes = {\n title: PropTypes.any.isRequired\n}\n\nexport default React.memo(Placeholder)\n","import React from 'react'\n\nconst TableColGroup = ({ colGroup }) => {\n return (\n <colgroup>\n {colGroup.map(column => {\n return <col style={column.style}/>\n })}\n </colgroup>\n )\n}\n\nexport default TableColGroup;","import PropTypes from 'prop-types'\nimport React, { Fragment, PureComponent, createRef } from 'react'\nimport { cn } from 'ui-react-pack'\nimport Placeholder from 'ui-react-pack/Placeholder'\nimport { renderSort } from 'ui-react-pack/renders'\nimport Row from 'ui-react-pack/Row'\nimport ScrollView from 'ui-react-pack/ScrollView'\nimport Table from 'ui-react-pack/Table'\nimport Text from 'ui-react-pack/Text'\nimport View from 'ui-react-pack/View'\nimport { by, get, hasListValue, isEqual, isEqualList, isFunction } from 'ui-utils-pack'\nimport { getDateStringFromDateObject } from '../utils'\nimport TableColGroup from './TableColGroup'\nimport { FieldArray } from 'react-final-form-arrays'\nimport { Pagination } from 'semantic-ui-react'\n\nconst sortObj = {\n id: PropTypes.string.isRequired, // id of the header, used for grouping columns/rows\n order: PropTypes.oneOf([-1, 0, 1, undefined]),\n sortKey: PropTypes.string, // path to item's value used for sorting objects\n}\n\n/**\n * Table with Dynamic Headers - Component\n * @Note: check <Table> component for props documentation\n */\nexport default class TableView extends PureComponent {\n static propTypes = {\n items: PropTypes.arrayOf( // in default layout, items are rows\n PropTypes.object.isRequired, // nested object by key matching `id` in `headers` prop\n ).isRequired,\n // Header will be derived from items, if not defined\n headers: PropTypes.arrayOf( // in default layout, headers are columns\n PropTypes.shape({\n ...sortObj,\n renderCell: PropTypes.func, // cell render function(value, index, props) for items under the header\n label: PropTypes.string, // header title, falls back to `id` if not given, and `children` not defined\n children: PropTypes.any, // custom header content to render, overrides `label`\n className: PropTypes.string, // css class name\n classNameCell: PropTypes.string, // css class name for items under the header\n classNameCellWrap: PropTypes.string, // css class name for items <td> wrapper under the header\n style: PropTypes.object, // css inline styles\n styleCell: PropTypes.object, // css inline styles for items under the header\n })\n ),\n extraHeaders: PropTypes.arrayOf( // additional header layers to be rendered above/before `headers`\n PropTypes.arrayOf( // layers will be rendered in the order they are defined -> this is the first level header\n PropTypes.shape({\n colSpan: PropTypes.number, // count of `headers` columns to span, default is 1\n label: PropTypes.string, // header title, falls back to `id` if not given, and `children` not defined\n children: PropTypes.any, // custom header content to render, overrides `label`\n className: PropTypes.string, // css class name\n style: PropTypes.object, // css inline styles\n })\n )\n ),\n // When the cell is empty (i.e. falsey value), render it as given value\n showEmptyAs: PropTypes.any,\n sorts: PropTypes.arrayOf(PropTypes.shape({...sortObj})),\n onSort: PropTypes.func, // receives clicked sort object {id, order, sortKey} as argument\n renderItem: PropTypes.func, // callback to render extra table rows in default layout\n renderItemCells: PropTypes.func, // callback to use custom renderer for each table rows in default layout\n renderExtraItem: PropTypes.func, // callback to use custom renderer for extra row (default layout) at the end\n itemsExpanded: PropTypes.bool,\n itemClassNames: PropTypes.arrayOf( // conditional class names for table items (rows in default layout)\n PropTypes.shape({\n id: PropTypes.string.isRequired,\n values: PropTypes.object.isRequired,\n })\n ),\n vertical: PropTypes.bool, // whether to render rows as columns (first column as Header)\n // ...other Table props\n translate: PropTypes.func,\n colGroup: PropTypes.arrayOf(\n PropTypes.shape({\n styles: PropTypes.object\n })\n ),\n additionalCellsStyles: PropTypes.array,\n // Pagination props\n usePagination: PropTypes.bool,\n rowsPerPage: PropTypes.number,\n }\n\n state = {\n items: {\n expanded: this.props.itemsExpanded,\n expandedByIndex: {},\n },\n sorts: this.props.sorts,\n activePage: 1,\n rowsPerPage: this.props.rowsPerPage || 20,\n }\n\n tableWrapper = createRef()\n\n // LOGIC ---------------------------------------------------------------------\n\n // Compute header based on items if not defined\n get headers () {\n if (this.props.headers) return this.props.headers\n if (this._headers) return this._headers\n const [item] = this.props.items\n if (!item) return\n return (this._headers = Object.keys(item).map(id => ({id})))\n }\n\n get itemsSorted () {\n if (this._itemsSorted) return this._itemsSorted\n const {items} = this.props\n const {sorts} = this.state\n this._itemsSorted = items\n\n // Multiple Header Sorting according to the order they are given\n if (hasListValue(sorts)) {\n // Create new list to avoid mutating original data\n this._itemsSorted = [...items]\n const sortKeys = []\n sorts.forEach(({id, order, sortKey}) => {\n if (order) sortKeys.push((order < 0 ? '-' : '') + (sortKey ? `${id}.${sortKey}` : id))\n })\n this._itemsSorted.sort(by(...sortKeys))\n }\n\n return this._itemsSorted\n }\n\n expandedByRow = (index) => {\n const {items: {expanded, expandedByIndex}} = this.state\n return expandedByIndex[index] != null ? expandedByIndex[index] : expanded\n }\n\n UNSAFE_componentWillReceiveProps (next) {\n const {items, sorts} = this.props\n\n // Reset if items or sorting if items changed\n if (!isEqualList(next.items, items)) this._itemsSorted = null\n if (!isEqual(next.sorts, sorts)) {\n this._itemsSorted = null\n this.setState({sorts: next.sorts})\n }\n\n // Reset Header definitions if not defined and item structure changed\n if (\n !next.headers &&\n next.items.length &&\n !isEqual(Object.keys(next.items[0] || {}), Object.keys(items[0] || {}))\n ) this._headers = null\n }\n\n // HANDLERS ------------------------------------------------------------------\n handleToggleExpandAll = (expanded) => {\n if (expanded == null) expanded = !this.state.items.expanded\n const expandedByIndex = {}\n for (const i in this.state.items.expandedByIndex) {\n expandedByIndex[i] = expanded\n }\n this.setState({\n items: {\n ...this.state.items,\n expandedByIndex,\n expanded,\n }\n })\n }\n\n /**\n * Toggle Table item expansion (row in default layout)\n * @param {Number|String} [index] - index of item to expand\n * @param {Number|String} [key] - id of item to expand\n * @param {String|Number} [value] - of given id `key`, if given, to find item that needs expansion\n * @param {Boolean} expanded - whether item should be expanded\n */\n handleItemExpand = ({key, value, index, expanded}) => {\n const {items} = this.props\n value = String(value).toLowerCase()\n this.setState({\n items: {\n ...this.state.items,\n expandedByIndex: {\n ...this.state.items.expandedByIndex,\n [index != null ? index : items.findIndex(i => String(i[key]).toLowerCase() === value)]: expanded\n }\n }\n })\n }\n\n handleSort = (id) => {\n const {onSort} = this.props\n let sort\n this._itemsSorted = null\n this.setState({\n sorts: this.state.sorts.map(s => {\n if (s.id === id) {\n sort = {...s, order: s.order ? (s.order < 0 ? 1 : 0) : -1}\n return sort\n }\n return s\n })\n })\n onSort && onSort(sort)\n }\n\n getStickyCellClassName = (styles, className, nextCellStyles) => {\n if (styles.position === 'sticky') {\n if (typeof className === 'string' && className.length && !className.includes('sticky')) {\n className += ' sticky'\n } else {\n className = 'sticky'\n }\n }\n\n if (!(nextCellStyles.position === 'sticky')) {\n className += '-last'\n }\n\n return className;\n }\n\n handlePaginationChange = (e, { activePage }) => {\n this.tableWrapper.current.scrollIntoView({ behavior: 'smooth', block: 'start' })\n this.setState({ activePage })\n }\n\n // RENDERS -------------------------------------------------------------------\n renderHeader = ({\n id,\n label,\n children: cell,\n data,\n className,\n style,\n colSpan,\n classNameHeader,\n styleHeader,\n renderHeader\n }, i) => {\n const { translate } = this.props\n const { sorts } = this.state\n const hasSort = sorts && !!sorts.find(s => s.id === id)\n const render = isFunction(cell) ? cell : renderHeader\n const value = data != null ? data : (cell || label)\n return (\n <Table.HeaderCell key={id || i} colSpan={colSpan} className={classNameHeader} style={styleHeader}>\n <Row className={cn('middle', className, {sort: hasSort})} style={style}\n onClick={hasSort && this.handleSort.bind(this, id)}>\n {render\n ? render(value, id, {className, style}, this)\n : (typeof cell === 'object' ? cell : <Text className=\"p\">{cell || (label != null ? translate(label) : id)}</Text>)\n }\n {hasSort && renderSort(sorts.find(item => item.id === id) || {})}\n </Row>\n </Table.HeaderCell>\n )\n }\n\n // Render Rows (in default layout)\n renderItem = (item, index) => {\n const {renderItem, renderItemCells, itemClassNames} = this.props\n let className\n if (itemClassNames) {\n className = []\n itemClassNames.forEach(({id, values}) => {\n const value = get(item, id)\n if (value == null) return\n for (const match in values) {\n if (match === String(value)) {\n className.push(values[match])\n break\n }\n }\n })\n className = className.length ? className.join(' ') : undefined\n }\n\n return (\n <Fragment key={index}>\n <Table.Row className={className}>\n {renderItemCells ? renderItemCells(item, index) : this.headers.map(this.renderItemData.bind(this, item, index))}\n </Table.Row>\n {renderItem && this.expandedByRow(index) &&\n <Table.Row>\n <Table.Cell colSpan={this.headers.length}>\n {renderItem(item, index)}\n </Table.Cell>\n </Table.Row>\n }\n </Fragment>\n )\n }\n\n // Render Rows (in Vertical layout)\n // @Note: in Vertical layout, the first column in each item is a header\n renderItemsVertical = (header, index) => {\n const { additionalCellsStyles } = this.props\n const items = this.itemsSorted\n header.styleHeader = additionalCellsStyles[0] || {}\n header.classNameHeader = this.getStickyCellClassName(header.styleHeader, header.classNameHeader, additionalCellsStyles[1] || {})\n return (\n /* `itemClassNames` is not supported yet */\n <Table.Row key={index}>\n {this.renderHeader(header, index)}\n {items.map((item, i) => this.renderItemData(item, i, header))}\n </Table.Row>\n /* Vertical layout has no expandable row */\n )\n }\n\n // Render Row Cells (in default layout)\n renderItemData = (item, index, {id, renderCell, classNameCellWrap = '', classNameCell: className, styleCell: style}) => {\n // Conditional rendering logic based on given cell data\n const { additionalCellsStyles } = this.props\n const cell = get(item, id)\n const {render: r, data} = cell || {}\n const render = isFunction(cell) ? cell : (r || renderCell)\n const value = data != null ? data : cell\n let content = render ? render(value, index, {className, style, expanded: this.expandedByRow(index)}, this) : cell\n if ((content == null || content === '') && this.props.showEmptyAs != null) content = this.props.showEmptyAs\n if (content instanceof Date) {\n content = getDateStringFromDateObject(content)\n }\n const cellStyle = additionalCellsStyles[index+1] || {}\n const cellClassName = this.getStickyCellClassName(cellStyle, classNameCellWrap, additionalCellsStyles[index+2] || {})\n return (\n <Table.Cell key={this.props.vertical ? index : id} className={cellClassName} style={cellStyle}>\n {typeof content === 'object'\n ? content\n : <View className={className} style={style}><Text className=\"p\">{content}</Text></View>\n }\n </Table.Cell>\n )\n }\n\n render () {\n const headers = this.headers\n if (!headers) return <Placeholder>{'Table has no data!'}</Placeholder>\n const {\n fill, className, sorts, onSort, extraHeaders, renderExtraItem, showEmptyAs, vertical, colGroup, usePagination,\n items: _, headers: _2, renderItem: _3, renderItemCells: _4, itemClassNames: _5,\n itemsExpanded: _6, translate: _7, sellStyles: _8, additionalCellsStyles: _9, rowsPerPage: _10,\n ...props\n } = this.props\n const {activePage, rowsPerPage} = this.state\n let items = this.itemsSorted\n const totalPages = Math.ceil(items.length / rowsPerPage)\n\n if (usePagination && totalPages > 1) {\n items = items.slice((activePage - 1) * rowsPerPage, activePage * rowsPerPage)\n }\n\n const tableBody = (\n <>\n {vertical ? headers.map(this.renderItemsVertical) : items.map(this.renderItem)}\n {renderExtraItem && <Table.Row>{renderExtraItem(items)}</Table.Row>}\n </>\n )\n\n return (\n <div ref={this.tableWrapper}>\n <ScrollView row classNameInner=\"fill-width\" fill={fill}>\n <Table className={cn('full-width', className, {vertical})} {...props}>\n {colGroup && <TableColGroup colGroup={colGroup} />}\n <Table.Header className=\"font-normal\">\n {extraHeaders && extraHeaders.map((row, i) => (\n <Table.Row key={i}>{row.map(this.renderHeader)}</Table.Row>\n ))}\n {/* Vertical layout does not have horizontal headers */}\n {!vertical && <Table.Row>{headers.map(this.renderHeader)}</Table.Row>}\n </Table.Header>\n <Table.Body>\n {this.props.name ? (\n <FieldArray name={this.props.name}>\n {({ fields }) => tableBody}\n </FieldArray>\n ) : tableBody}\n </Table.Body>\n </Table>\n </ScrollView>\n {usePagination && totalPages > 1 && (\n <ScrollView row styleInner={{ justifyContent: 'center', marginTop: 20 }} classNameInner=\"fill-width\" fill={fill}>\n <Pagination\n activePage={activePage}\n totalPages={totalPages}\n onPageChange={this.handlePaginationChange}\n />\n </ScrollView>\n )}\n </div>\n )\n }\n}\n","import PropTypes from 'prop-types'\n\n/**\n * PROPTYPES PROXY =============================================================\n * For clear semantic meaning without documentation\n * =============================================================================\n */\n\nexport const type = {}\n\n/* Common types */\ntype.Any = PropTypes.any\ntype.Boolean = PropTypes.bool\ntype.Degree = PropTypes.number\ntype.Decimal = PropTypes.number // precision decimal points count\ntype.Enum = PropTypes.oneOf\ntype.File = PropTypes.object // File object\ntype.Float = PropTypes.number\ntype.Fraction = PropTypes.number // between 0 - 1\ntype.GetterString = PropTypes.string // Javascript getter function\ntype.Id = PropTypes.string\ntype.Int = PropTypes.number\ntype.List = PropTypes.array\ntype.ListOf = PropTypes.arrayOf\ntype.Method = PropTypes.func\ntype.Milliseconds = PropTypes.number\ntype.Mm = PropTypes.number // millimeter\ntype.Node = PropTypes.object\ntype.Number = PropTypes.number\ntype.NumberOrString = PropTypes.oneOfType([PropTypes.string, PropTypes.number])\ntype.Object = PropTypes.object\ntype.ObjectOf = PropTypes.objectOf\ntype.Of = PropTypes.shape\ntype.OneOf = (...types) => PropTypes.oneOfType(types)\ntype.Promise = PropTypes.shape({\n then: PropTypes.func.isRequired,\n catch: PropTypes.func.isRequired\n})\ntype.Px = PropTypes.number // screen unit\ntype.PrimitiveOrObject = PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.object]) // tooltip prop\ntype.String = PropTypes.string\ntype.StringOrNumber = PropTypes.oneOfType([PropTypes.string, PropTypes.number])\ntype.Timestamp = PropTypes.number\ntype.Url = PropTypes.string\ntype.UrlOrBase64 = type.String\ntype.UrlOrBase64OrPreview = type.OneOf(type.String, type.Object) // `preview` is new String() object\ntype.UrlOrNode = type.OneOf(type.String, type.Object, type.Method)\ntype.UrlOrObject = type.OneOf(type.String, type.Object)\n\n/* Component Types */\n\n// localised definition (example: LANGUAGE.ENGLISH object)\ntype.Definition = type.Of({\n _: type.Any.isRequired, // identifier code that is language agnostic\n name: type.GetterString.isRequired, // definition's `name` string for currently active Language\n en: type.String, // `name` string in English\n // 'ru': other definition's `name` strings by their language code\n})\n\n// set of localised definitions (example: LANGUAGE object)\ntype.DefinitionSet = type.ObjectOf(type.Definition.isRequired)\n\ntype.FileInput = type.Of({\n src: type.UrlOrBase64, // file source URL or base64 encoded string\n kind: type.Any, // type of file (ex: public/private...)\n i: type.Any, // identifier or index position of the file in the grid (ex. thumb/small/large...)\n id: type.String, // optional ID\n name: type.String, // file name with extension\n file: type.File, // -> sent by onChange callbacks for upload to backend (example: Dropzone file object)\n remove: type.Boolean, // -> sent by onChange callbacks for deletion to backend\n sizes: type.ListOf(type.Of({ // for ImageInput\n key: type.String, // resKey (ex. 'thumb', 'medium', '')\n val: type.Number, // size in bytes\n })),\n})\n\n// FIELD.FOR.TAG for example\ntype.FieldForList = type.ListOf(type.Of({\n id: type.String.isRequired,\n}))\n// One of @withForm() value getters\ntype.FormValueType = type.Enum(['changedValues', 'registeredValues', 'formValues'])\n\n// Dropdown option\ntype.Option = type.OneOf(\n type.String,\n type.Number,\n type.Of({\n value: type.Any.isRequired,\n text: type.String.isRequired,\n content: type.Any,\n }),\n)\ntype.Options = type.ListOf(type.Option.isRequired)\n","import React, { PureComponent } from 'react'\nimport { cn, PropTypes } from 'ui-react-pack'\nimport Icon from 'ui-react-pack/Icon'\nimport ScrollView from 'ui-react-pack/ScrollView'\nimport Text from 'ui-react-pack/Text'\nimport { type } from 'ui-react-pack/types'\nimport { withTimer } from 'ui-react-pack/utils'\nimport View from 'ui-react-pack/View'\nimport { isEqual, isFunction } from 'ui-utils-pack'\n\ntype.Node = PropTypes.object\n\n/**\n * Tabs Component with overridable self-managed state and overflow scrollbars.\n */\n@withTimer\nexport default class Tabs extends PureComponent {\n static propTypes = {\n items: type.ListOf(type.Of({\n // Tab Title - clickable buttons\n tab: type.OneOf(\n type.String,\n type.Number,\n type.Node, // JSX\n type.Of({\n text: PropTypes.string.isRequired,\n icon: PropTypes.string,\n })\n ).isRequired,\n // Tab Content\n content: type.Any.isRequired,\n })).isRequired,\n // Opened tab index (controlled)\n activeIndex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n // Opened tab index initially (uncontrolled)\n defaultIndex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n // Callback when tab's activeIndex changes, receives new `activeIndex` as argument\n onChange: PropTypes.func,\n // Render tabs as vertical layout\n vertical: PropTypes.bool,\n // Align tabs to center\n centerTabs: PropTypes.bool,\n // Style tabs as buttons\n buttoned: PropTypes.bool,\n // Whether to enable transition during force update via props\n transitionUpdate: PropTypes.bool,\n // Extra content to render after Tabs content\n children: PropTypes.any,\n className: PropTypes.string,\n classNameTabs: PropTypes.string,\n classNameContent: PropTypes.string,\n styleTabs: PropTypes.object,\n styleContent: PropTypes.object,\n currencyCode: PropTypes.string,\n\n // UI Render specific\n // Extra content to render inside Tabs\n childrenBeforeTabs: PropTypes.any,\n childrenAfterTabs: PropTypes.any,\n }\n\n state = {\n activeIndex: Math.max(+(this.props.activeIndex || this.props.defaultIndex) || 0, 0),\n transition: false\n }\n\n get tabs () {\n return this._tabs || (this._tabs = this.props.items.map(({tab}) => tab))\n }\n\n get contents () {\n return this._contents || (this._contents = this.props.items.map(({content}) => content))\n }\n\n UNSAFE_componentWillReceiveProps (next) {\n const {activeIndex, items} = next\n if (!isEqual(items, this.props.items)) this._tabs = this._contents = null\n if (activeIndex != null && +activeIndex !== this.state.activeIndex) this.setTab(+activeIndex, next.transitionUpdate)\n\n // Handle use case when parent changes layout and tab has less panels than previously set active index\n if (this.state.activeIndex >= items.length) this.setState({activeIndex: 0})\n }\n\n setTab = (activeIndex, transition = true) => {\n const updateTab = () => {\n this.setState({activeIndex, transition: false})\n if (this.props.onChange) this.props.onChange(activeIndex)\n }\n if (transition) {\n this.setState({transition: true})\n this.setTimeout(updateTab, 50) // 50 ms is needed to allow full rendering so css transition can take effect\n } else {\n updateTab()\n }\n }\n\n render () {\n const {\n vertical, buttoned, items, children, childrenBeforeTabs, childrenAfterTabs, centerTabs,\n className, classNameTabs, classNameContent, styleTabs, styleContent, currencyCode,\n activeIndex: _, defaultIndex: __, onChange: ___, transitionUpdate: ____,\n ...props\n } = this.props\n const {activeIndex, transition} = this.state\n const content = this.contents[activeIndex]\n\n return (\n // In Safari, the entire .tabs container scrolls, but in Chrome, only .tabs__content scrolls\n // the solution is to enforce `min-height: initial` for this wrapper in `classNameInner`\n <ScrollView // ScrollView is needed so inner content scroll does not overlap tabs, and has correct height\n className={cn('tabs fade-in', className, {buttoned})}\n classNameInner=\"max-height\" // fix to allow child ScrollViews to take 100% of available height\n {...props}\n >\n <ScrollView row={!vertical} center={centerTabs}\n className={cn('tabs__items no-scrollbar', classNameTabs)} style={styleTabs}>\n {isFunction(childrenBeforeTabs) ? childrenBeforeTabs(this) : childrenBeforeTabs}\n {this.tabs.map((tab, i, tabs) => (\n <View key={i} className={cn('tabs__item', {active: activeIndex === i && tabs.length > 1})}\n onClick={activeIndex !== i && (() => this.setTab(i))}>\n {typeof tab === 'object'\n ? (tab.icon ? <Text><Icon name={tab.icon}/>{tab.text}</Text> : tab)\n : <Text>{tab}</Text>\n }\n </View>\n ))}\n {isFunction(childrenAfterTabs) ? childrenAfterTabs(this) : childrenAfterTabs}\n </ScrollView>\n <ScrollView fill className={cn('tabs__content', {'fade-in': !transition}, classNameContent)}\n style={styleContent}>\n {typeof content === 'object' ? content : (isFunction(content) ? content(this) : <Text>{content}</Text>)}\n </ScrollView>\n {isFunction(children) ? children(this) : children}\n </ScrollView>\n )\n }\n}\n","import React from 'react'\nimport { PropTypes } from 'ui-react-pack'\nimport Tabs from './Tabs'\n\n/**\n * Dynamic List of Tabs - Pure Component.\n */\nexport function TabList ({renderLabel, renderItem, items, ...props}) {\n return <Tabs\n {...props}\n items={items.map((item, i) => ({tab: renderLabel(item, i), content: renderItem(item, i)}))}\n />\n}\n\nTabList.propTypes = {\n items: PropTypes.array.isRequired,\n renderLabel: PropTypes.func.isRequired,\n renderItem: PropTypes.func.isRequired,\n}\n\nexport default React.memo(TabList)\n","import React, { Component } from 'react'\nimport { type } from 'ui-react-pack'\nimport { Active } from 'ui-utils-pack'\nimport UIRenderWithUISetup from './rules'\n\n/**\n * Component to hold independent UI Render Instance Data\n *\n * @interface:\n * a. The entire component is a separate instance of UI render\n * b. Data component can be created via meta.json config, or by uploading a meta.json file.\n * {\n * view: 'Data',\n * kind: 'Id',\n * data: {\n * // can be loaded from existing UI\n * name: 'path.to.data.to.use.as.json'\n * },\n * meta: {\n * view:\n * }\n * }\n *\n */\nexport default class Data extends Component {\n static propTypes = {\n // Identifier for this type of data.\n // Data of the same `kind` are grouped into array as list, and used for complex validation (together as group).\n kind: type.Id.isRequired,\n // The UI Render Instance containing this Data component\n instance: type.Object.isRequired,\n // The Index of this Data component in the array of rendered data for removing itself\n index: type.NumberOrString,\n // Data.json to use\n data: type.Any,\n // Meta.json to use\n meta: type.Object,\n // Data.json to initialize with\n initialValues: type.Any,\n // Whether the `name` attribute should use data relative to root UI Render instance, defaults to this instance.\n rootData: type.Boolean,\n\n relativePath: type.String,\n relativeIndex: type.Number,\n }\n\n static defaultProps = {\n data: {},\n meta: {},\n }\n\n render () {\n const {kind, instance, index, data, meta, initialValues = data, className, style, embedded, useForm} = this.props\n // Use Active.UIRender to avoid circular import\n const UIRender = Active.UIRender\n\n // For 'TableCells' add additional params to generate unique IDs\n if (meta.view === 'TableCells' || meta.view === 'Data') {\n meta.relativePath = this.props.relativePath;\n meta.relativeIndex = this.props.relativeIndex;\n }\n\n if (useForm) {\n return <UIRenderWithUISetup\n data={data}\n meta={meta}\n initialValues={initialValues}\n form={{kind}}\n parent={instance}\n index={index}\n embedded={embedded}\n {...{className, style}}\n />\n }\n\n return <UIRender\n data={data}\n meta={meta}\n initialValues={initialValues}\n form={{kind}}\n parent={instance}\n index={index}\n embedded={embedded}\n {...{className, style}}\n />\n }\n}\n\n// =============================================================================\n// NOTES\n/**\n * @strategies:\n * 1. Render all Input as is, with button (configured) duplicating all inputs into new form instance\n * 2. Render Input inside configured Data component as independent UI Render instance\n * + validation is isolated from the rest of UI\n * + submission of the entire UI does not submit temporary instance\n * + easy to understand for end users\n * + allows uploading file with errors as config, without breaking the rest of UI.\n * => Choose the 2nd option, because it's architecturally correct.\n */\n// =============================================================================\n","import React, { PureComponent } from 'react'\nimport AutoSave from 'ui-modules-pack/form/views/AutoSave'\nimport { POPUP, popupAlert } from 'ui-modules-pack/popup'\nimport { stateAction } from 'ui-modules-pack/redux'\nimport { FIELD } from 'ui-modules-pack/variables'\nimport { cn } from 'ui-react-pack'\nimport Button from 'ui-react-pack/Button'\nimport PieChart from 'ui-react-pack/charts/PieChart'\nimport { Checkbox } from 'ui-react-pack/Checkbox'\nimport Counter from 'ui-react-pack/Counter'\nimport Dropdown from 'ui-react-pack/Dropdown'\nimport Expand from 'ui-react-pack/Expand'\nimport ExpandList from 'ui-react-pack/ExpandList'\nimport Icon from 'ui-react-pack/Icon'\nimport Image from 'ui-react-pack/Image'\nimport { OK } from 'ui-react-pack/inputs/validationRules'\nimport Json from 'ui-react-pack/JsonView'\nimport Label from 'ui-react-pack/Label'\nimport List from 'ui-react-pack/List'\nimport TextDateValue from 'ui-react-pack/TextDateValue'\nimport ProgressSteps from 'ui-react-pack/ProgressSteps'\nimport { renderFloat } from 'ui-react-pack/renders'\nimport Row from 'ui-react-pack/Row'\nimport Space from 'ui-react-pack/Space'\nimport Table from 'ui-react-pack/Table'\nimport Text from 'ui-react-pack/Text'\nimport TooltipPop from 'ui-react-pack/TooltipPop'\nimport View from 'ui-react-pack/View'\nimport { Active, debounce, isList, isNumeric, isString, isTruthy, toFlatList, toJSON } from 'ui-utils-pack'\nimport { ALERT, TIME_DURATION_INSTANT } from 'ui-utils-pack/constants'\nimport { get, hasObjectValue, isEqual, isObject, } from 'ui-utils-pack/object'\nimport { _ } from 'ui-utils-pack/translations'\nimport Render, { mapProps } from '../../ui-render'\nimport { renderField } from './components/renders'\nimport TableView from './components/TableView'\nimport TabList from './components/TabList'\nimport Tabs from './components/Tabs'\nimport Data from './Data'\n\n/**\n * UI RENDERER COMPONENTS SETUP ================================================\n * Map Component props and Methods for recursive rendering\n * =============================================================================\n */\n\nRender.Tooltip = TooltipPop\n\n/**\n * Map UI Render props to final Rendering Component/s\n *\n * @param {String} view - component type (one of FIELD.TYPE values)\n * @param {Array} items - nested child component props\n * @param {Object|Array} data - global data object to be passed down to child components\n * @param {*} _data - local data object to be consumed by the component for rendering\n * @param {Boolean} debug - whether to use debug mode\n * @param {Class} instance - UI Render instance\n * @param {Boolean} relativeData - whether to retrieve values from local `_data`, defaults to global `data`\n * @param {Number|String} relativeIndex - used when component is rendered in array\n * @param {String} relativePath - path used to compute form input \"name\" attribute\n * @param {Object} form - react-final-form FormApi instance\n * @param {String|Object} [showIf] - whether to not render the component if it evaluates to truthy value\n * @param {Function} [Render] - the recursive renderer\n * @param {String} [version] - of the config\n * @param {*} [props] - other component props\n * @returns {JSX.Element|*} React component\n */\nconst RenderComponent = ({\n view, items, data, _data, debug, form, instance,\n showIf, relativeData, relativeIndex, relativePath, version,\n ...props\n}) => {\n const translate = Active.translate\n /* General showIf logic */\n if (showIf != null) {\n // UI Render should not 'Value Transform' `showIf` attribute\n if (isString(showIf)) {\n const __data = get((relativeData !== false && _data) || data, showIf)\n if (!isTruthy(__data)) return null\n } else if (hasObjectValue(showIf)) {\n const {name, relativeData, equal} = showIf\n let __data;\n // if (relativePath && typeof relativeIndex !== undefined && name) {\n if (name) {\n // Get from form instead of initial data\n // It is important to get the value from form, because it might have been changed\n // On first render the value might not be available in form, so get from initial data\n const formData = instance.getAllFormsData() || data;\n if (relativePath && typeof relativeIndex !== 'undefined') {\n __data = get(formData, `${relativePath}[${relativeIndex}].${name}`, undefined)\n } else {\n __data = get(formData, name, undefined)\n }\n } else {\n // Get from initial data.\n // TODO: review this logic. It might be better to get from form instead of initial data\n __data = (relativeData !== false && !name && _data) || get((relativeData !== false && _data) || data, name)\n }\n if (equal !== undefined) {\n if (!isEqual(__data, equal)) return null\n } else {\n if (!isTruthy(__data)) return null\n }\n } else if (isObject(showIf)) {\n if (!isTruthy(_data)) return null\n }\n }\n\n switch (view) {\n case FIELD.TYPE.DATA:\n return <Data\n instance={instance}\n data={_data || data}\n {...props}\n relativeIndex={relativeIndex}\n relativePath={relativePath}\n />\n\n case FIELD.TYPE.COL:\n case FIELD.TYPE.COL2:\n case FIELD.TYPE.COL3: {\n return <View {...props}>{items.map(Render)}</View>\n }\n\n case FIELD.TYPE.ROW:\n case FIELD.TYPE.ROW2: {\n return <Row {...props}>{items.map(Render)}</Row>\n }\n\n case FIELD.TYPE.LIST:\n case FIELD.TYPE.COL_LIST:\n case FIELD.TYPE.COL_LIST3: {\n return <List items={_data} {...props}/>\n }\n\n case FIELD.TYPE.ROW_LIST:\n case FIELD.TYPE.ROW_LIST2: {\n return <List items={_data} {...props} row/>\n }\n\n case FIELD.TYPE.TABLE_CELLS: {\n const { onDataChanged: _1, ...rest } = props\n return <>{items.map((item, i) => <Table.Cell key={i} {...rest}>{Render(item, i)}</Table.Cell>)}</>\n }\n\n case FIELD.TYPE.AUTO_SUBMIT: {\n return <AutoSave {...props}/>\n }\n\n case FIELD.TYPE.CHECKBOX: {\n return <Checkbox {...props} translate={translate} />\n }\n\n case FIELD.TYPE.EXPAND: {\n if (props.label != null && props.title == null) {\n props.title = props.label\n delete props.label\n }\n if (props.name != null && props.title == null) props.title = props.name\n if (items.length) props.children = () => items.map(Render)\n return <Expand {...props}/>\n }\n\n case FIELD.TYPE.EXPAND_LIST: {\n return <ExpandList items={_data} {...props}/>\n }\n\n case FIELD.TYPE.BUTTON: {\n if (items.length) props.children = items.map(Render)\n if (props.label != null && props.children == null) {\n props.children = props.label\n delete props.label\n }\n return <Button {...props} translate={translate}/>\n }\n\n case FIELD.TYPE.COUNTER: {\n return <Counter {...props}/>\n }\n\n case FIELD.TYPE.ICON: {\n if (items.length) props.children = items.map(Render)\n return <Icon {...props}/>\n }\n\n case FIELD.TYPE.IMAGE: {\n if (items.length) props.children = items.map(Render)\n return <Image {...props}/>\n }\n\n case FIELD.TYPE.LABEL: {\n if (items.length) props.children = items.map(Render)\n return <Label {...props} translate={translate}/>\n }\n\n case FIELD.TYPE.PIE_CHART: {\n const {mapItems, ...prop} = props\n if (mapItems) _data = mapProps(_data, mapItems, {debug})\n if (items.length) prop.children = items.map(Render)\n return <PieChart items={_data} {...prop}/>\n }\n\n case FIELD.TYPE.PROGRESS_STEPS: {\n const steps = items.map(({step, label, content, data, _data, ...info}, i) => {\n return {\n ...info,\n step: isObject(step) ? Render.call(this, {data, _data, debug, form, instance, ...step}, i) : step,\n label: isObject(label) ? Render.call(this, {data, _data, debug, form, instance, ...label}, i) : label,\n content: isObject(content) ? Render.bind(this, {data, _data, debug, form, instance, ...content}, i) : content\n }\n })\n return <ProgressSteps items={steps} {...props}/>\n }\n\n case FIELD.TYPE.SPACE: {\n return <Space {...props}/>\n }\n\n case FIELD.TYPE.TABLE: {\n const {extraItems, filterItems, parentItem, group, ...table} = props\n const additionalCellsStyles = []\n if (!isList(_data)) _data = []\n\n // Matrix table headers and data transform\n if (group) {\n // `header` must exist as a single object, otherwise there is no way to group tables\n let {by: {id, label, renderLabel, ...groupByProps} = {}, header, extraHeader = {label: ''}} = group\n const errorTitle = `Incorrect config for ${view} with {name: \"${props.name}\"}!`\n if (id == null) popupAlert(errorTitle, `${view}.group.by must have 'id', got '${toJSON(group.by, null, 2)}'`)\n if (!header || header.id == null) {\n popupAlert(errorTitle, `${view}.group.header must have 'id', got '${toJSON(header, null, 2)}'`)\n header = {} // prevent breaking code\n }\n\n // First, check data to determine headers\n const groupsByValue = {}\n const rowsByCommonValue = {}\n for (const row of _data) {\n const {[id]: groupId, [header.id]: commonValue} = row\n if (groupId != null) groupsByValue[groupId] = groupId\n if (commonValue != null) rowsByCommonValue[commonValue] = [...(rowsByCommonValue[commonValue] || []), row]\n }\n const groupIds = Object.values(groupsByValue)\n if (groupIds.length) {\n\n // Transform headers\n const _headers = (props.headers || [])\n const newHeaders = toFlatList(groupIds.map(_id => _headers.map(({id, ...h}) => ({id: `${id}_${_id}`, ...h}))))\n table.headers = [header].concat(newHeaders)\n\n // Label grouped tables\n if (label != null && !hasObjectValue(label)) popupAlert(errorTitle,\n `${view}.group.by.label must resolve to object of labels by ${id} 'value', got '${toJSON(label, null, 2)}'`)\n const groupHeaders = groupIds.map(id => ({\n colSpan: _headers.length,\n label: label ? (renderLabel ? renderLabel(label[id]) : label[id]) : id,\n ...groupByProps,\n }))\n const newExtraHeaders = [\n [extraHeader].concat(groupHeaders)\n ]\n table.extraHeaders = (props.extraHeaders || []).concat(newExtraHeaders)\n\n // Transform data by grouping them with `commonValue`\n _data = Object.values(rowsByCommonValue).map(rows => {\n const item = {}\n rows.forEach(row => {\n const {[id]: groupId, [header.id]: commonValue, ..._item} = row\n item[header.id] = commonValue\n for (const key in _item) {\n item[`${key}_${groupId}`] = _item[key]\n }\n })\n return item\n })\n }\n }\n\n // Mixed array nested table data filtering\n if (filterItems && parentItem) {\n _data = _data.filter(item => {\n return !filterItems.find(filter => {\n for (const key in filter) {\n // If mismatch in value found, filter out given item\n if (get(item, key) !== get(parentItem, filter[key])) return true\n }\n return false\n })\n })\n }\n\n // Table with custom rows\n if (extraItems) _data = _data.concat(extraItems.map(item => {\n for (const id in item) {\n const definition = item[id]\n if (isObject(definition)) {\n if ((definition.name && Object.keys(definition).length === 1)) {\n item[id] = get(data, definition.name)\n } else if (definition.name && definition.render) {\n item[id].data = get(data, definition.name)\n } else if (definition.view) {\n item[id] = (_, index, props) => Render({debug, ...props, ...definition})\n }\n }\n }\n return item\n }))\n\n if (table.colGroup) {\n let accumulatedWidth = 0;\n table.colGroup.forEach(col => {\n if (col.isFixed && col.style) {\n additionalCellsStyles.push({\n left: `${accumulatedWidth}px`,\n position: 'sticky',\n zIndex: 1,\n })\n accumulatedWidth += parseInt(col.style.minWidth) || 0\n }\n })\n }\n\n return <TableView\n items={_data}\n additionalCellsStyles={additionalCellsStyles}\n {...table}\n translate={translate}\n />\n }\n\n case FIELD.TYPE.TABS:\n case FIELD.TYPE.TAB_LIST: {\n const {childrenBeforeTabs, childrenAfterTabs, currencyCode} = props\n if (hasObjectValue(childrenBeforeTabs))\n props.childrenBeforeTabs = Render.bind(this, {data, _data, debug, form, instance, ...childrenBeforeTabs})\n if (hasObjectValue(childrenAfterTabs))\n props.childrenAfterTabs = Render.bind(this, {data, _data, debug, form, instance, ...childrenAfterTabs})\n\n switch (view) {\n case FIELD.TYPE.TAB_LIST:\n return <TabList items={_data} {...props}/>\n\n case FIELD.TYPE.TABS:\n default:\n return <Tabs items={items.map(({tab, content, _data, data}, i) => ({\n tab: isObject(tab) ? Render.call(this, {data, _data, debug, form, instance, currencyCode, ...tab}, i) : tab,\n content: isObject(content) ? Render.bind(this, {\n data, _data, debug, form, instance, currencyCode, ...content\n }, i) : content,\n }))} {...props}/>\n }\n }\n\n case FIELD.TYPE.TEXT:\n case FIELD.TYPE.TITLE: {\n if (props.label != null && props.children == null) {\n props.children = props.label\n delete props.label\n }\n if (items.length) {\n props.children = items.map(Render)\n } else if (props.renderLabel) {\n props.children = props.renderLabel(props.children)\n delete props.renderLabel\n }\n if (view === FIELD.TYPE.TITLE) props.className = cn('h3', props.className)\n return <Text {...props} translate={translate}/>\n }\n\n case FIELD.TYPE.TOOLTIP: {\n if (props.label != null && props.content == null) {\n props.content = props.label\n delete props.label\n }\n if (props.renderLabel) {\n props.content = props.renderLabel(props.content)\n delete props.renderLabel\n }\n if (items.length) {\n props.children = items.map(Render)\n } else if (isObject(props.children)) {\n props.children = Render({debug, ...props.children})\n }\n return <TooltipPop inverted {...props}/>\n }\n\n case FIELD.TYPE.POPUP: {\n if (!instance.popupById) instance.popupById = {}\n const {id, ...popup} = props\n /**\n * Popup is a special case, it does not render content to the DOM immediately, only as VirtualDOM.\n * When user clicks on a button that opens popup, the VirtualDOM is inserted to Popup component for rendering.\n * @withForm needs to wrap the entire content to provide Form field instance using existing form.\n */\n class PopupContent extends PureComponent {\n render () {\n return items.map(Render)\n }\n }\n\n instance.popupById[id] = {...popup, content: <PopupContent/>}\n return null\n }\n\n default: {\n if (items.length) props.children = items.map(Render)\n const {mapOptions, removable, autoSubmit, expanded: _1, ...input} = props\n const {readonly, disabled} = data || {}\n if (mapOptions) input.options = mapProps(input.options || [], mapOptions, {debug})\n\n // Resolve Input name dynamic path\n if (relativeData !== false && relativePath != null && input.name) {\n const uniqueIdentificator = `${relativePath}${relativeIndex != null ? `[${relativeIndex}]` : ''}.${input.name}`\n input.id = uniqueIdentificator\n input.name = uniqueIdentificator\n }\n\n // Render Dropdown separately, to avoid triggering form value changes\n if (view === FIELD.TYPE.DROPDOWN) {\n // proxy onChange to prevent event sent as second argument\n const {onChange, ...dropdown} = input\n return <Dropdown\n lazyLoad={false}\n onChange={onChange ? (value => onChange(value)) : undefined}\n {...dropdown}\n translate={translate}\n />\n }\n\n // Form value changing fields should have 'Input' as view\n if (view === FIELD.TYPE.INPUT) {\n // eslint-disable-next-line default-case\n switch (input.type) {\n case 'select':\n view = FIELD.TYPE.SELECT\n break\n case 'slider':\n view = FIELD.TYPE.SLIDER\n break\n case 'toggle':\n view = FIELD.TYPE.TOGGLE\n break\n case 'file':\n view = FIELD.TYPE.UPLOAD\n input.className = cn('input--wrapper', input.className)\n break\n }\n if (input.icon && input.icon.view) input.icon = Render({debug, ...input.icon})\n }\n\n // Auto submit on changes\n if (autoSubmit) {\n const {onChange} = input\n const submit = debounce(instance.submit, autoSubmit.delay >= 0 ? autoSubmit.delay : TIME_DURATION_INSTANT)\n input.onChange = (value) => {\n onChange && onChange(value)\n submit()\n }\n }\n\n // Input clearing\n if (removable) {\n const {onRemove, onClickIcon} = input\n input.icon = 'delete'\n input.classNameIcon = 'button circle small transparent appear-on-hover'\n input.onClickIcon = (...args) => {\n // todo: for some reason Dropdown/Select have `form` undefined\n form.change(input.name, null)\n onRemove && onRemove(input.name)\n autoSubmit && input.onChange(null)\n onClickIcon && onClickIcon(...args)\n }\n }\n\n // Validate type=\"number\" with min/max\n if (input.type === 'number') {\n const {validate, min, max} = input\n if (min != null || max != null) input.validate = (value) => {\n if (min != null && value < min) return `Must be minimum ${min}`\n if (max != null && value > max) return `Must be maximum ${max}`\n return (validate && validate(value)) || OK\n }\n }\n\n return renderField({view, ...input, ...readonly && {readonly}, ...disabled && {disabled}, translate})\n }\n }\n}\n\n/**\n * Render Value Function Getter\n *\n * @param {String} Name - one of FIELD.TYPE definitions\n * @returns {Function} renderer - that takes value as the first argument, and renders value in desired format\n */\nRender.Method = function RenderMethod (Name) {\n switch (Name) {\n case FIELD.RENDER.CURRENCY:\n return (val, index, {id, decimals = 2, symbol = '$', className, style, ...props} = {}) => {\n return (isNumeric(val)\n ? <Row className={className} style={style}>\n <Text className=\"margin-right-smallest\">{symbol}</Text>\n {renderFloat(val, decimals, props)}\n </Row>\n : null\n )\n }\n case FIELD.RENDER.DOUBLE5:\n return (val, index, {id, decimals, ...props} = {}) => isNumeric(val) ? renderFloat(val, 5, props) : null\n case FIELD.RENDER.FLOAT:\n return (val, index, {id, decimals, ...props} = {}) => isNumeric(val) ? renderFloat(val, decimals, props) : null\n case FIELD.RENDER.PERCENT:\n return (val, index, {id, decimals, className, style, ...props} = {}) => (isNumeric(val)\n ? <Row className={className} style={style}>\n {renderFloat(Number(val) * 100, decimals, props)}\n <Text className=\"margin-left-smallest\">%</Text>\n </Row>\n : null\n )\n case FIELD.RENDER.TITLE_n_INPUT:\n return (val, index, {id, ...props} = {}) => <Row {...props}><Text>{val}</Text></Row>\n case FIELD.RENDER.STRING:\n return (val) => {\n return <Text>{val}</Text>\n }\n case FIELD.RENDER.DATE: {\n return (val) => {\n if (val) {\n return <TextDateValue value={val} />\n }\n return null\n }\n }\n default:\n return (val) => <Text>{val}</Text>\n }\n}\n\n/**\n * Error handling when something breaks because of mis-configured meta.json\n */\nRender.onError = ({err, errInfo, props}) => Active.store.dispatch(stateAction(POPUP, ALERT, {\n items: [\n {\n title: `${Render.name} Error!`,\n content: <View>\n <Text className=\"h5\">{_.ERROR_MESSAGE}</Text>\n <Text className=\"p\">{String(err)}</Text>\n <Text className=\"h5 padding-top\">{_.DATA_CAUSING_ERROR}</Text>\n <View style={{textAlign: 'left'}}>\n <Json data={props}/>\n </View>\n <Text className=\"h5 padding-top\">{_.ERROR_INFO}</Text>\n <View style={{textAlign: 'left'}}>\n <Json data={errInfo}/>\n </View>\n </View>\n }\n ]\n}))\n\nRender.Component = RenderComponent","import { l, localiseTranslation } from 'ui-utils-pack'\n\nexport { _ } from 'ui-utils-pack/translations'\n\n/**\n * LOCALISED TRANSLATIONS (i18n) ===============================================\n * =============================================================================\n */\nlocaliseTranslation({\n CHARACTER: {\n [l.ENGLISH]: 'Character',\n },\n ENTER_NUMBER_STARTING_WITH_plus_COUNTRY_CODE: {\n [l.ENGLISH]: 'Enter number starting with + country code',\n },\n INVALID_DATE: {\n [l.ENGLISH]: 'Invalid date',\n },\n INVALID_EMAIL_ADDRESS: {\n [l.ENGLISH]: 'Invalid email address',\n },\n INVALID_URL: {\n [l.ENGLISH]: 'Invalid URL',\n },\n MUST_BE_LESS_THEN_characters: {\n [l.ENGLISH]: 'Must be less than {characters}',\n },\n MUST_BE_IN_THE_PAST: {\n [l.ENGLISH]: 'Must be in the past',\n },\n MUST_BE_IN_THE_FUTURE: {\n [l.ENGLISH]: 'Must be in the future',\n },\n MUST_HAVE_START_TIME: {\n [l.ENGLISH]: 'Must have start time',\n },\n MUST_HAVE_END_TIME: {\n [l.ENGLISH]: 'Must have end time',\n },\n PASSWORD_IS_TOO_WEAK: {\n [l.ENGLISH]: 'Password is too weak',\n },\n PASSWORD_MISMATCH: {\n [l.ENGLISH]: 'Password mismatch',\n },\n REQUIRED: {\n [l.ENGLISH]: 'Required',\n },\n})\n","export var downloadFile = function downloadFile(fileName) {\n return function (response) {\n // create file link in browser's memory\n var href = URL.createObjectURL(response); // create \"a\" HTML element with href to file & click\n\n var link = document.createElement('a');\n link.href = href;\n link.setAttribute('download', fileName); //or any other extension\n\n document.body.appendChild(link);\n link.click(); // clean up \"a\" element & remove ObjectURL\n\n document.body.removeChild(link);\n URL.revokeObjectURL(href);\n };\n};","import PropTypes from 'prop-types'\nimport React from 'react'\nimport { get, hasListValue } from 'ui-utils-pack'\nimport Table from './Table'\n\n/**\n * Error Table Listing - Pure Component.\n *\n * @param {Array} items - error objects\n * @param {Boolean} isServerError - whether the error is server related or user related\n * @param {Boolean} inverted - whether to add `inverted` class\n * @param {*} props - other attributes to pass to `<Table>`\n * @returns {Object} - React table component\n */\nexport function ErrorTable ({\n items,\n isServerError,\n inverted,\n ...props\n}) {\n const hasId = !!get(items, '[0].id')\n const hasStatus = !!get(items, '[0].status') || !!get(items, '[0].statusCode') || !!get(items, '[0].code')\n const hasTitle = !!get(items, '[0].title') || !!get(items, '[0].error')\n return (\n <Table inverted={inverted} striped {...props}>\n <Table.Header className='font-normal'>\n <Table.Row>\n {hasId && <Table.HeaderCell>Error ID</Table.HeaderCell>}\n {hasStatus && <Table.HeaderCell>Status</Table.HeaderCell>}\n {hasTitle && <Table.HeaderCell>{isServerError ? 'Title' : 'Reason'}</Table.HeaderCell>}\n <Table.HeaderCell>Message</Table.HeaderCell>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {hasListValue(items) &&\n items.map(({id, status, statusCode, code, title, error, content, detail, message, msg, ...data}, index) => (\n <Table.Row key={id || index}>\n {hasId && <Table.Cell scope='row' className='font-smaller'>{id}</Table.Cell>}\n {hasStatus && <Table.Cell>{status || statusCode || code}</Table.Cell>}\n {hasTitle && <Table.Cell>{title || error}</Table.Cell>}\n <Table.Cell style={{wordBreak: 'break-word'}}>\n {content || detail || message || msg || get(data, 'details[0].message', String(items[index]))}\n </Table.Cell>\n </Table.Row>\n ))}\n </Table.Body>\n </Table>\n )\n}\n\nErrorTable.propTypes = {\n isServerError: PropTypes.bool,\n items: PropTypes.arrayOf(PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.shape({\n id: PropTypes.any,\n status: PropTypes.number,\n title: PropTypes.string,\n detail: PropTypes.string,\n message: PropTypes.string\n })\n ])).isRequired\n}\n\nexport default React.memo(ErrorTable)\n","import PropTypes from 'prop-types'\nimport React, { Fragment } from 'react'\nimport { hasListValue } from 'ui-utils-pack'\nimport ErrorTable from './ErrorTable'\nimport View from './View'\n\n/**\n * Error Alert Message Content - Pure Component.\n *\n * @param {Array} items - error objects\n * @param {*} props - other attributes to pass to `<Table>`\n * @returns {Object} - React table component\n */\nexport function ErrorContent ({\n items,\n ...props\n}) {\n // Filter out User vs Server Errors\n const serverErrors = items.filter(({status, statusCode, code}) => (((status || statusCode || code) >= 500) || ((status || statusCode || code) == null)))\n const userErrors = items.filter(({status, statusCode, code}) => ((status || statusCode || code) < 500))\n return (\n <Fragment>\n {hasListValue(serverErrors) &&\n <View className='border radius'>\n <ErrorTable className='margin' isServerError items={serverErrors} {...props} />\n </View>\n }\n {hasListValue(userErrors) &&\n <View className={'border radius' + (hasListValue(serverErrors) ? ' margin-top' : '')}>\n <ErrorTable className='margin' items={userErrors} {...props} />\n </View>\n }\n </Fragment>\n )\n}\n\nErrorContent.propTypes = {\n items: PropTypes.arrayOf(PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.number,\n PropTypes.shape({\n id: PropTypes.any,\n status: PropTypes.number,\n title: PropTypes.string,\n detail: PropTypes.string,\n message: PropTypes.string\n })\n ])).isRequired\n}\n\nexport default React.memo(ErrorContent)\n","import selector from 'ui-utils-pack/selectors'\nimport { POPUP, POPUP_ALERT, POPUP_CONFIRM, POPUP_ERROR } from './constants'\n\n/**\n * STATE SELECTORS =============================================================\n * Memoized Functions - to retrieve specific branches of the app state\n * =============================================================================\n */\n\n@selector(POPUP)\nexport default class select {\n\n static activePopups = () => [\n state => state[POPUP].data.activePopups,\n (val) => val\n ]\n\n static alert = () => [\n state => state[POPUP].data[POPUP_ALERT],\n (val) => val\n ]\n\n static confirm = () => [\n state => state[POPUP].data[POPUP_CONFIRM],\n (val) => val\n ]\n\n static error = () => [\n state => state[POPUP].data[POPUP_ERROR],\n (val) => val\n ]\n\n static ui = () => [\n state => state[POPUP].ui,\n val => val || {}\n ]\n}\n\n","import classNames from 'classnames'\nimport React, { Fragment, PureComponent } from 'react'\nimport { type } from 'ui-react-pack'\nimport Button from 'ui-react-pack/Button'\nimport ErrorContent from 'ui-react-pack/ErrorContent'\nimport Row from 'ui-react-pack/Row'\nimport Text from 'ui-react-pack/Text'\nimport View from 'ui-react-pack/View'\nimport { CLOSE, hasListValue, isInList, l, localiseTranslation } from 'ui-utils-pack'\nimport { _ } from 'ui-utils-pack/translations'\nimport { connect } from '../../redux'\nimport { stateAction } from '../../redux/actions'\nimport { POPUP, POPUP_ALERT, POPUP_CONFIRM, POPUP_ERROR } from '../constants'\nimport select from '../selectors'\n\nlocaliseTranslation({\n CANCEL: {\n [l.ENGLISH]: 'Cancel',\n },\n CONFIRM: {\n [l.ENGLISH]: 'Confirm',\n },\n CONFIRM_ACTION: {\n [l.ENGLISH]: 'Confirm Action',\n },\n ERROR_excMark: {\n [l.ENGLISH]: 'Error!',\n },\n})\n/**\n * MAP STATE & ACTIONS TO PROPS ------------------------------------------------\n * -----------------------------------------------------------------------------\n */\nconst mapStateToProps = (state) => ({\n activePopups: state ? select.activePopups(state) : [],\n alert: state && select.alert(state),\n confirm: state && select.confirm(state),\n error: state && select.error(state),\n ui: state && select.ui(state),\n})\nconst mapDispatchToProps = (dispatch) => ({\n actions: {\n close: (activePopup) => dispatch(stateAction(POPUP, CLOSE, {activePopup}))\n }\n})\n\n/**\n * VIEW TEMPLATE ---------------------------------------------------------------\n * -----------------------------------------------------------------------------\n */\n@connect(mapStateToProps, mapDispatchToProps)\nexport default class Popup extends PureComponent {\n static propTypes = {\n actions: type.Object,\n // Whether Popup can be closed by clicking outside around greyed out background area\n canClose: type.Boolean,\n // Callback(this) class instance when close action is fired\n onClose: type.Method,\n // Callback(this) class instance for rendering close Button, for example\n renderClose: type.Method,\n }\n\n closeAlert = () => this.props.actions.close(POPUP_ALERT) || this.onClose()\n closeConfirm = () => this.props.actions.close(POPUP_CONFIRM) || this.onClose()\n closeError = () => this.props.actions.close(POPUP_ERROR) || this.onClose()\n closePopup = () => {\n if (this.hasAlert) return this.closeAlert()\n if (this.hasConfirm) return this.closeConfirm()\n if (this.hasError) return this.closeError()\n }\n onClose = () => {\n const {onClose} = this.props\n if (onClose) onClose(this)\n }\n\n render () {\n const {\n activePopups,\n alert,\n error,\n confirm,\n actions,\n ui: {className} = {},\n canClose,\n onClose,\n renderClose,\n ...props\n } = this.props\n const activeClass = hasListValue(activePopups) ? ' active' : ''\n this.hasAlert = isInList(activePopups, POPUP_ALERT)\n this.hasConfirm = isInList(activePopups, POPUP_CONFIRM)\n this.hasError = isInList(activePopups, POPUP_ERROR)\n return (\n <View className={'app__popup' + activeClass}>\n <View\n className=\"app__popup__backdrop no-outline\"\n onClick={canClose ? this.closePopup : void 0}\n />\n <View className={classNames('app__popup__box zoomin', className)}>\n <View className=\"app__popup__box__content\">\n {renderClose && renderClose(this)}\n {this.hasAlert && alert.items.map(({id, title, content, closeLabel}, index) => (\n <Fragment key={id || index}>\n <View className=\"app__popup__box__header\">\n <Text className=\"app__popup__box__header__title\">{title}</Text>\n </View>\n <View className=\"app__popup__box__body\">\n {typeof content === 'string' ? <Text className=\"p center\">{content}</Text> : content}\n </View>\n {!renderClose &&\n <View className=\"app__popup__box__footer center\">\n <Button onClick={this.closeAlert} className=\"primary\">{closeLabel || _.OK}</Button>\n </View>}\n </Fragment>\n ))}\n {this.hasConfirm && confirm.items.map(({\n id,\n title,\n content,\n cancelLabel,\n confirmLabel,\n confirmClass = 'basic primary',\n action\n }, index) => (\n <Fragment key={id || index}>\n <View className=\"app__popup__box__header\">\n <Text className=\"app__popup__box__header__title\">{title || _.CONFIRM_ACTION}</Text>\n </View>\n <View className=\"app__popup__box__body\">\n {typeof content === 'string' ? <Text className=\"p center\">{content}</Text> : content}\n </View>\n <Row className=\"app__popup__box__footer center\">\n <Button onClick={this.closeConfirm}\n className=\"basic grey margin-smaller\">{cancelLabel || _.CANCEL}</Button>\n <Button onClick={() => {\n this.closeConfirm()\n action(id)\n }} className={'margin-smaller ' + confirmClass}>{confirmLabel || _.CONFIRM}</Button>\n </Row>\n </Fragment>\n ))}\n {this.hasError &&\n <Fragment>\n <View className=\"app__popup__box__header\">\n <Text className=\"app__popup__box__header__title\">{error.title || _.ERROR_excMark}</Text>\n </View>\n <View className=\"app__popup__box__body\">\n <ErrorContent items={error.items} {...props}/>\n </View>\n <View className=\"app__popup__box__footer center\">\n <Button onClick={this.closeError} className=\"primary\">{_.OK}</Button>\n </View>\n </Fragment>}\n </View>\n </View>\n </View>\n )\n }\n}\n","import classNames from 'classnames'\nimport React, { Component } from 'react'\nimport { type } from 'ui-react-pack'\nimport Button from 'ui-react-pack/Button'\nimport Text from 'ui-react-pack/Text'\nimport View from 'ui-react-pack/View'\nimport { l, localiseTranslation } from 'ui-utils-pack'\nimport { _ } from 'ui-utils-pack/translations'\nimport { PopupContext } from '../rules'\n\nlocaliseTranslation({\n CANCEL: {\n [l.ENGLISH]: 'Cancel',\n },\n CONFIRM: {\n [l.ENGLISH]: 'Confirm',\n },\n CONFIRM_ACTION: {\n [l.ENGLISH]: 'Confirm Action',\n },\n ERROR_excMark: {\n [l.ENGLISH]: 'Error!',\n },\n})\n\n\nexport default class Popup extends Component {\n static contextType = PopupContext\n static propTypes = {\n // Whether Popup can be closed by clicking outside around greyed out background area\n canClose: type.Boolean,\n // Callback(this) class instance when close action is fired\n onClose: type.Method,\n // Callback(this) class instance for rendering close Button, for example\n renderClose: type.Method,\n }\n\n\n render () {\n const {\n activePopups,\n alert,\n error,\n confirm,\n actions,\n ui: {className} = {},\n canClose,\n onClose,\n ...props\n } = this.props\n\n return (\n <PopupContext.Consumer>\n {(context) => {\n const { isOpen, togglePopupState, title, content} = context\n\n const activeClass = isOpen ? ' active' : ''\n\n return (\n <View className={'app__popup' + activeClass}>\n <View\n className=\"app__popup__backdrop no-outline\"\n onClick={togglePopupState}\n />\n <View className={classNames('app__popup__box zoomin', className)}>\n <View className=\"app__popup__box__content\">\n {isOpen && (\n <>\n <View className=\"app__popup__box__header\">\n <Text className=\"app__popup__box__header__title\">{title}</Text>\n </View>\n <View className=\"app__popup__box__body\">\n {typeof content === 'string' ? <Text className=\"p center\">{content}</Text> : content}\n </View>\n <View className=\"app__popup__box__footer center\">\n <Button onClick={togglePopupState} className=\"primary\">{_.OK}</Button>\n </View>\n </>\n )}\n </View>\n </View>\n </View>\n )\n }}\n </PopupContext.Consumer>\n )\n }\n}\n","import { round } from 'ui-utils-pack'\n\n/**\n * NORMALIZERS =================================================================\n * Common normalizers to be used with redux-form\n * =============================================================================\n */\n\nexport const integer = (value) => value && parseInt(value, 10)\nexport const double5 = (value) => value && round(value, 5)\nexport const emptyStringToNull = (value) => ((value === '') ? null : value)\nexport const uppercase = (value) => value.toUpperCase()\n\nexport function number ({min = -Infinity, max = Infinity, decimals}) {\n return (value) => {\n if (value > max) return max\n if (Number(value) && value < min) return min\n return (decimals != null && value) ? round(value, decimals) : value\n // Disable pretty formatting because of cursor jump\n // let number = value.replace(/[^0-9.]/g, '') // sanitize\n // if (!number) return ''\n // const decimals = String(number).split('.')[1]\n // return Math.floor(number).toLocaleString() + (decimals != null ? '.' + decimals : '')\n }\n}\n\nexport function phone (value) {\n if (!value) return value\n return value.replace(/[^\\d\\s-+()]+/gi, '')\n .replace(/^(.)?\\+([^\\d]+)?/g, '+')\n .replace(/([^\\d\\s]+)?\\(([^\\d]+)?/g, '(')\n .replace(/([^\\d]+)?\\)([^\\d\\s]+)?/g, ')')\n .replace(/([^\\d]+)?-([^\\d]+)?/g, '-')\n .replace(/\\s\\s+/g, ' ')\n}\n","import React, { Component, Fragment } from 'react'\nimport { fetch } from 'ui-modules-pack/api'\nimport { storedTouched, withForm } from 'ui-modules-pack/form'\nimport { popupAlert } from 'ui-modules-pack/popup'\nimport { FIELD } from 'ui-modules-pack/variables'\nimport { cn, type } from 'ui-react-pack'\nimport Json from 'ui-react-pack/JsonView'\nimport ScrollView from 'ui-react-pack/ScrollView'\nimport { Active, get, isEmpty, isList, isString, round, sanitizeResponse, warn } from 'ui-utils-pack'\nimport { cloneDeep, hasObjectValue, isObject, set } from 'ui-utils-pack/object'\nimport Render, { metaToProps } from '../../ui-render'\nimport './mapper' // Set up UI Renderer components and methods\nimport { _ } from './translations'\nimport {\n replaceDeep,\n getFormsData,\n mapErrorObjectToUIFormat,\n getDateStringFromDateObject,\n errorsProcessing,\n normalizeIncomingData\n} from './utils'\nimport deepEqual from 'deep-equal';\nimport { downloadFile as downloadFileProcessing } from 'web/services/downloadFile'\nimport OldPopup from 'ui-modules-pack/popup/views/Popup'\nimport Popup from './components/Popup'\nimport { double5, integer, phone, uppercase } from 'ui-react-pack/inputs/normalizers'\nimport ConfigContext from '../../providers/ConfigProvider'\n\n/**\n * BUSINESS RULES ==============================================================\n * UI Config transform logic specific to OpenL reports\n * =============================================================================\n */\n\nFIELD.ACTION = {\n ADD_DATA: 'addData',\n DOWNLOAD: 'download',\n UPLOAD: 'upload',\n REMOVE_DATA: 'removeData',\n POPUP_DELAY: 'popupDelay',\n POPUP_OPEN: 'popupOpen',\n SUBMIT: 'submit',\n UPDATE_DATA_ON_CHANGE: 'updateDataOnChange',\n ON_APPLY_PERIODS : 'onApplyPeriods',\n}\nFIELD.TYPE = {\n AUTO_SUBMIT: 'AutoSubmit',\n DATA: 'Data',\n ICON: 'Icon',\n IMAGE: 'Image',\n LINK: 'Link',\n POPUP: 'Popup',\n TABLE_CELLS: 'TableCells',\n}\nFIELD.CROSS_VALIDATE = {\n NOT_WITHIN_RANGE: 'notWithinRange',\n}\nFIELD.NORMALIZE = {\n DATE: 'date',\n HOUR_MINUTE: 'hh:mm',\n DOUBLE5: 'double5',\n INTEGER: 'integer',\n PHONE: 'phone',\n UPPERCASE: 'uppercase',\n CURRENCY: 'currency',\n PERCENT: 'percent',\n}\n\nFIELD.NORMALIZER = {\n [FIELD.NORMALIZE.DOUBLE5]: double5,\n [FIELD.NORMALIZE.INTEGER]: integer,\n [FIELD.NORMALIZE.PHONE]: phone,\n [FIELD.NORMALIZE.UPPERCASE]: uppercase,\n [FIELD.NORMALIZE.DATE]: (val) => {\n if (val) {\n const date = new Date(val);\n return getDateStringFromDateObject(date);\n }\n },\n [FIELD.NORMALIZE.CURRENCY]: (v) => v == null ? v : Number((v || 0) || 0).toFixed(2),\n [FIELD.NORMALIZE.PERCENT]: (v) => {\n return v == null ? v : (Number((v || 0) || 0) * 100).toLocaleString()\n },\n}\nFIELD.PARSER = {\n ...FIELD.PARSER,\n [FIELD.NORMALIZE.PERCENT]: function fromPercent (v) {\n return v && round(v / 100, 5)\n },\n}\n\n/*\n FormStorage is used for storing all active forms.\n This solution provides ability to get data from all forms\n */\nexport const formsStorage = new Map();\n\n\n/*\n Accumulate validation errors from all Form instances\n */\nexport let errorsMap = {};\n\nlet errorHandlerFunction = undefined;\n\n// Context for Popup component\n// TODO: replace redux state for popup with this context\nexport const PopupContext = React.createContext({\n isOpen: false,\n togglePopupState: () => {},\n title: '',\n content: '',\n});\n\nexport const usePopup = () => React.useContext(PopupContext)\n\nexport const clearErrorsMap = () => {\n errorsMap = {};\n}\n\n/**\n * UI Render Instance Component\n * @example:\n * <UIRender data={data} meta={meta} initialValues={data} onSubmit={this.submit}/>\n */\nexport class UIRender extends Component {\n static propTypes = {\n data: type.Any.isRequired,\n meta: type.Object.isRequired,\n initialValues: type.Any, // should be the same as `data` initially\n childBefore: type.Any,\n childAfter: type.Any,\n // If given, will render <form onSubmit {...form} />\n form: type.OneOf(type.Boolean, type.Of({\n kind: type.Id,\n })),\n // Whether to disable rendering of wrapper scroll view and html form\n embedded: type.Boolean,\n getFormData: type.Method,\n onDataChanged: type.Method,\n getValidationErrors: type.Method,\n methods: type.ObjectOf(type.Method),\n translate: type.Method,\n apiCalls: type.ObjectOf(type.Method),\n dateFormat: type.String,\n }\n\n constructor (props) {\n super(props);\n if (typeof props.getValidationErrors === 'function') {\n errorHandlerFunction = props.getValidationErrors;\n }\n if (typeof props.translate === 'function') {\n Active.translate = props.translate\n }\n\n this.togglePopupState = ({title = '', content = ''}) => {\n if (title && content) {\n this.setState({\n isPopupOpen: true,\n popupTitle: title,\n popupContent: content\n });\n } else {\n this.setState({\n isPopupOpen: false,\n popupTitle: '',\n popupContent: ''\n });\n }\n }\n\n this.state = {\n data: {\n json: normalizeIncomingData(this.props.data)\n },\n meta: {\n json: this.props.meta\n },\n errors: {},\n key: new Date(),\n isPopupOpen: false,\n togglePopupState: this.togglePopupState,\n popupTitle: '',\n popupContent: '',\n currencyCode: (this.props.meta && this.props.meta.currencyCode) || 'USD',\n }\n }\n\n UNSAFE_componentWillReceiveProps (next, nextContext) {\n const update = {}\n const {data, meta} = this.props\n\n if (next.data !== data) set(update, 'data.json', normalizeIncomingData(next.data))\n if (next.meta !== meta) set(update, 'meta.json', next.meta)\n if (next.meta && next.meta.currencyCode !== this.state.currencyCode) {\n update.currencyCode = next.meta.currencyCode\n }\n if (hasObjectValue(update)) this.setState(update)\n }\n\n componentDidMount () {\n if (typeof this.props.getFormData === 'function') {\n this.props.getFormData(this.getAllFormsData)\n }\n\n if (typeof this.props.onDataChanged === 'function') {\n this.onDataChanged = this.props.onDataChanged;\n } else if (this.props.parent && typeof this.props.parent.onDataChanged === 'function') {\n this.onDataChanged = this.props.parent.onDataChanged;\n }\n }\n\n componentDidUpdate () {\n if (this.props.meta) {\n errorsProcessing(this.form, this.props.meta)\n }\n\n if (typeof errorHandlerFunction === 'function'\n && !deepEqual(errorsMap, this.state.errors)\n ) {\n const errors = cloneDeep(errorsMap);\n errorHandlerFunction(mapErrorObjectToUIFormat(errors))\n this.setState({ errors })\n }\n }\n\n getAllFormsData = () => {\n // TODO: investigate realisation with this.data\n // this.data contains related data but there no all changes\n return getFormsData(formsStorage)\n }\n\n getCalledMethod = () => {\n const { methods = {} } = this.props\n return methods\n }\n\n getAPICalls = () => {\n const { apiCalls = {} } = this.props\n return apiCalls\n }\n\n onDataChanged = undefined;\n\n render () {\n const {childBefore, childAfter, form, embedded, className, style, translate, parent, dateFormat} = this.props\n const { key, isPopupOpen, togglePopupState, popupTitle, popupContent } = this.state\n\n const content = this.hasData && this.hasMeta &&\n <Render\n key={key}\n data={this.data}\n {...this.meta}\n form={this.form || parent.form}\n instance={parent || this}\n translate={translate}\n onDataChanged={this.onDataChanged}\n currencyCode={this.state.currencyCode}\n dateFormat={dateFormat}\n />\n const Container = embedded ? Fragment : ScrollView\n const props = embedded ? undefined : {\n fill: true,\n className: cn('ui__render fade-in bg-neutral', className),\n style,\n }\n\n if (parent) {\n return <Container {...props}>\n {childBefore}\n {(form && !embedded) ? <form onSubmit={this.handleSubmit} {...form}>{content}</form> : content}\n {childAfter}\n </Container>\n }\n\n return (\n <ConfigContext.Provider value={{ dateFormat }}>\n <PopupContext.Provider value={{ isOpen: isPopupOpen, togglePopupState, title: popupTitle, content: popupContent }}>\n <Container {...props}>\n {childBefore}\n {(form && !embedded) ? <form onSubmit={this.handleSubmit} {...form}>{content}</form> : content}\n {childAfter}\n <Popup />\n <OldPopup />\n </Container>\n </PopupContext.Provider>\n </ConfigContext.Provider>\n )\n }\n}\n\nconst UIRenderWithUISetup = withUISetup({subscription: {pristine: true, valid: true, values: true, touched: true}})(UIRender)\nexport default UIRenderWithUISetup\n\nActive.UIRender = UIRender\n\n/**\n * Transform *_meta.json API response into custom rules applied by the team\n */\nexport function transformConfig (meta) {\n return toOpenLConfig(sanitizeResponse(meta || {}, {tags: []}))\n}\n\nexport function toOpenLConfig (meta) {\n if (isObject(meta)) {\n const {view} = meta\n\n // Apply default Dropdown config if onChange is not defined\n if ((view === FIELD.TYPE.DROPDOWN || view === FIELD.TYPE.SELECT) && meta.name != null && meta.onChange == null) {\n if (view === FIELD.TYPE.DROPDOWN) {\n meta.onChange = FIELD.ACTION.SET_STATE + ',' + meta.name\n }\n // if (meta.value == null) meta.value = {name: `{state.${meta.name},0}`}\n if (meta.options != null) {\n if (isString(meta.options)) meta.options = {name: meta.options}\n if (isObject(meta.mapOptions)) {\n if (meta.mapOptions.value == null) meta.mapOptions.value = '{index}'\n } else {\n meta.mapOptions = {\n text: meta.mapOptions, // if not defined, will default to given option value\n value: '{index}', // always enforce using index\n }\n }\n }\n }\n\n // Add Table Expand to first column if `renderItem` defined, but `renderCell` is undefined\n else if (view === FIELD.TYPE.TABLE && meta.renderItem != null) {\n const firstHeader = get(meta.headers, '[0]')\n if (isObject(firstHeader) && firstHeader.renderCell == null) {\n firstHeader.renderCell = {\n view: FIELD.TYPE.EXPAND,\n name: '{value}',\n index: '{index}',\n onClick: 'handleItemExpand',\n }\n }\n }\n }\n\n for (const key in meta) {\n const val = meta[key] // need to also transform Tabs.items collection of objects, which have no `view`\n if (isList(val) || (isObject(val) && (val.view || val.content || val.id))) {\n meta[key] = toOpenLConfig(val)\n }\n\n // Convert `styles` attribute to `className`\n else if (key === 'styles') {\n meta.className = val\n delete meta[key]\n }\n }\n\n return meta\n}\n\n/**\n * Decorator to extend UI Render instance with nested Data component interface\n */\nexport function withDataKind (Class) {\n Class.prototype.getDataKindByRelativePath = function (dataJson) {\n if (!this.dataKindPath) {\n return dataJson\n }\n\n return get(dataJson, this.dataKindPath)\n }\n\n Class.prototype.getDataKindPath = function (relativePath, kind) {\n const pathToData = `.dataKind.${kind}`\n if (relativePath.includes(pathToData)) {\n return relativePath.replace(pathToData, \"\")\n }\n\n return ''\n }\n\n // Register child instance from parent instance\n Class.prototype.registerDataKind = function (instance, kind, index) {\n if (!this.dataKind) this.dataKind = {}\n if (!this.dataKind[kind]) this.dataKind[kind] = {}\n this.dataKind[kind][index] = instance\n this.dataKindPath = this.getDataKindPath(instance.props.meta.relativePath, kind)\n }\n\n // Unregister child instance from parent instance\n Class.prototype.unregisterDataKind = function (instance, kind, index) {\n if (!this.dataKind) {\n this.dataKind = {}\n }\n if (this.dataKind[kind] && this.dataKind[kind][index]) {\n delete this.dataKind[kind][index]\n }\n }\n\n /**\n * Retrieve current forms' values for given data kind, with fallback to data in state\n * @param {String}kind - Data component kind\n * @param {Number} [index] - Data component index\n * @returns {Array|Object|Undefined} all forms values by index array, or form values for given index object, else undefined\n */\n Class.prototype.getDataKind = function (kind) {\n const dataJson = getFormsData(formsStorage)\n const pathToDataKindArray = this.dataKindPath ? this.dataKindPath + '.dataKind.' + kind : 'dataKind.' + kind\n\n return get(dataJson, pathToDataKindArray, [])\n }\n\n return Class\n}\n\n/**\n * React Class Decorator to setup UI with necessary variables and function definitions\n * @usage:\n * - this.data -> *_data.json from state, ready for <Render> component consumption\n * - this.meta -> transformed *_meta.json data from state, ready for <Render> component consumption\n * - this.handleSubmit:\n * 1. final-form: to be used like this <form onSubmit={this.handleSubmit}>\n * - this.hasData and this.hasMeta getters can be used for conditional check\n * - Initialize with data by overriding initial state\n */\nexport function withUISetup (formConfig) {\n return function Decorator (Class) {\n const componentWillUnmount = Class.prototype.componentWillUnmount\n const UNSAFE_componentWillMount = Class.prototype.UNSAFE_componentWillMount\n const UNSAFE_componentWillUpdate = Class.prototype.UNSAFE_componentWillUpdate\n const UNSAFE_componentWillReceiveProps = Class.prototype.UNSAFE_componentWillReceiveProps\n withDataKind(Class)\n\n // @Note: the state shape is used for reference only, it is not instantiated\n Class.prototype.state = {\n data: {\n json: undefined, // data object\n name: undefined, // file name\n },\n meta: {\n json: undefined, // data object\n name: undefined, // file name\n },\n }\n\n const callOnDataChanged = (props) => {\n if (props\n && props.instance\n && props.instance.props\n && props.instance.props.parent\n && typeof props.instance.props.parent.onDataChanged === 'function'\n ) {\n props.instance.props.parent.onDataChanged()\n }\n }\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'config', {\n get () {\n const data = this.data\n const {form, parent, index} = this.props\n // Download file from URL\n FIELD.FUNC[FIELD.ACTION.DOWNLOAD] = (...args) => {\n // The first argument can be Button Event\n if (typeof args[0] === 'object') args.shift()\n const [fileName] = args\n const { downloadFile } = this.getAPICalls();\n if (typeof downloadFile !== 'function') {\n return false;\n }\n downloadFile(fileName)\n .then(response => response.blob())\n .then(downloadFileProcessing(fileName))\n .catch(err => this.popupAlert(err, _.DOWNLOAD_FAILED_))\n }\n // File upload\n FIELD.FUNC[FIELD.ACTION.UPLOAD] = async (files, path, dropzoneRef) => {\n const { uploadFile } = this.getAPICalls()\n const [file] = files\n if (file && typeof uploadFile === 'function') {\n const data = this.getAllFormsData();\n delete data[path];\n try {\n const response = await uploadFile(JSON.stringify(data), file)\n const normalizedResponse = normalizeIncomingData(response)\n dropzoneRef.fileInputEl.value = null\n this.setState({\n data: {\n json: normalizedResponse\n }\n }, () => {\n this.setState({key: new Date()})\n this.form.restart(normalizedResponse)\n })\n } catch (error) {\n console.error(error)\n }\n }\n }\n // Add current Form values to parent UI Render instance.state\n FIELD.FUNC[FIELD.ACTION.ADD_DATA] = (parent && form)\n ? () => {\n // Call form submit to run validation\n if (!this.canSave) return this.handleSubmit()\n const registeredValues = this.registeredValues\n // Add directly to data.json, to keep all data patterns consistent, and to enable backend override.\n // And store a copy in state for rehydration when backend updates response without added data.\n const {data} = parent.state\n const dataKindPath = parent.dataKindPath ? `${parent.dataKindPath}.dataKind` : 'dataKind'\n const dataKind = get(data.json, dataKindPath)\n dataKind[form.kind] = [...dataKind[form.kind] || [], registeredValues]\n const parentForm = this.props.parent.props.instance.form\n parentForm.mutators.push(`${dataKindPath}.${form.kind}`, registeredValues)\n this.form.restart()\n this.form.getRegisteredFields().forEach(field => {\n delete storedTouched[field]\n })\n }\n : dataActionWarning\n // Remove current Form values from parent UI Render instance.state\n FIELD.FUNC[FIELD.ACTION.REMOVE_DATA] = (parent && form)\n ? () => {\n const {data} = parent.state\n const dataKindPath = parent.dataKindPath ? `${parent.dataKindPath}.dataKind` : 'dataKind'\n const dataKind = get(data.json, dataKindPath)\n const array = [...dataKind[form.kind] || []]\n array.splice(index, 1)\n dataKind[form.kind] = array\n const parentForm = this.props.parent.props.instance.form\n parentForm.mutators.remove(`${dataKindPath}.${form.kind}`, index)\n }\n : dataActionWarning\n\n // Popup Content Opening\n FIELD.FUNC[FIELD.ACTION.POPUP_OPEN] = (...args) => {\n // The first argument can be Button Event\n if (typeof args[0] === 'object') args.shift()\n // noinspection JSCheckFunctionSignatures\n const [id, options] = args\n const {[id]: {content, title = '', ...props} = {}} = this.popupById || {}\n popupAlert(title, content, {...props, ...options})\n }\n\n // this.data is not updated dynamically at the moment\n // Implemented as temporary solution\n FIELD.FUNC[FIELD.ACTION.UPDATE_DATA_ON_CHANGE] = (value, ...params) => {\n if (typeof value !== 'object' && Array.isArray(params)) {\n const { name } = params[0];\n if (name) {\n replaceDeep(this.data, name, value)\n this.data = cloneDeep(this.data);\n }\n }\n }\n\n FIELD.FUNC[FIELD.ACTION.ON_APPLY_PERIODS] = async () => {\n const { updateExperienceData } = this.getAPICalls();\n if (typeof updateExperienceData !== 'function') {\n return false;\n }\n const data = this.getAllFormsData();\n\n try {\n const response = await updateExperienceData(data)\n const normalizedResponse = normalizeIncomingData(response)\n this.setState({\n data: {\n json: normalizedResponse\n }\n }, () => {\n this.form.restart(normalizedResponse)\n })\n } catch (error) {\n let message = error\n // Fix to get error message from Response object\n if (error instanceof Response) {\n const errorText = await error.text()\n const errorObject = JSON.parse(errorText.replace(/(\\w+:)|(\\w+ :)/g, function(s) {\n return '\"' + s.substring(0, s.length-1) + '\":';\n }));\n message = errorObject;\n if (errorObject.message) {\n message = errorObject.message\n\n if (/message=(.*)errors.*/.test(message)) {\n const subMessage = message.match(/message=(.*)errors.*/)[1]\n if (subMessage) {\n message = subMessage\n }\n }\n }\n }\n\n this.togglePopupState({\n title: 'Error',\n content: <Json data={{message}}/>\n })\n console.error(error)\n }\n }\n\n FIELD.METHODS = this.getCalledMethod()\n\n // Cross UI Render instances validation\n FIELD.VALIDATION[FIELD.CROSS_VALIDATE.NOT_WITHIN_RANGE] = (value, {dataKind, args: [start, end]}) => {\n const {form, index, parent, meta} = this.props\n // get relative path and index to field from formValues\n const { relativeIndex, relativePath } = meta || {}\n let _a, _b;\n\n if (relativePath && typeof relativeIndex === 'number') {\n _a = get(this.formValues, `${relativePath}.${relativeIndex}.${start}`)\n _b = get(this.formValues, `${relativePath}.${relativeIndex}.${end}`)\n } else {\n _a = this.formValues[start]\n _b = this.formValues[end]\n }\n\n if (_a !== undefined && _b !== undefined) {\n if (_a === _b) {\n return `Start date and end date cannot be the same`\n } else if (_a === value && _b < _a) {\n return `Start date cannot be more than end date`\n } else if (_b === value && _b < _a) {\n return `End date cannot be less than start date`\n }\n }\n // Retrieve current state from all Forms, with fallback to parent instance.state\n const valuesBy = parent.getDataKind(dataKind) // this only includes values in `data.dataKind` state\n const ranges = []\n const thisIndex = form.kind === dataKind ? String(index) : null\n for (const i in valuesBy) {\n if (i === thisIndex) continue\n const {[start]: a, [end]: b} = valuesBy[i]\n ranges.push([a, b])\n }\n\n // Validate against overlap\n if (_a && _b) {\n // TODO: review this logic\n const range = ranges.find((([a, b]) => _a < a && b < _b))\n const error = ranges.find(([start, end]) => start <= value && value <= end)\n\n if (range || error) {\n return `Periods cannot overlap`\n }\n }\n\n return undefined\n }\n FIELD.FUNC[FIELD.ACTION.RESET] = this.resetForm.bind(this)\n FIELD.FUNC[FIELD.ACTION.SET_STATE] = this.setStates.bind(this)\n FIELD.FUNC[FIELD.ACTION.FETCH] = fetch\n FIELD.FUNC[FIELD.ACTION.POPUP] = this.popupAlert\n FIELD.FUNC[FIELD.ACTION.POPUP_DELAY] = delayed(this.popupAlert)\n FIELD.FUNC[FIELD.ACTION.SUBMIT] = this.submit\n\n return {\n data,\n form: this.form,\n instance: this,\n funcConfig: {\n data,\n fieldFunc: {...FIELD.FUNC}, // bind definition to this instance\n fieldNormalizer: {...FIELD.NORMALIZER},\n fieldParser: {...FIELD.PARSER},\n fieldValidation: {...FIELD.VALIDATION},\n fieldMethods: {...FIELD.METHODS},\n }\n }\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'data', {\n get () {\n return get(this.state, 'data.json')\n },\n set (value) {\n return this.setState(set(this.state, 'data.json', value))\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'meta', {\n get () {\n if (this._meta != null) return this._meta\n return this._meta = metaToProps(transformConfig(cloneDeep(get(this.state, 'meta.json'))), this.config)\n },\n set (value) {\n return this._meta = value\n }\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'hasData', {\n get () {\n return this.data != null\n },\n })\n\n // Define instance getter\n Object.defineProperty(Class.prototype, 'hasMeta', {\n get () {\n return !isEmpty(this.meta)\n },\n })\n\n // Define instance method\n // @Note: functions should have consistent pattern of receiving important arguments first,\n // followed by optional arguments.\n // Positional arguments was chosen instead of keyword arguments because\n // it provides more flexibility and separation of concerns between different configs.\n Class.prototype.setStates = function (value, keyPath) {\n return this.setState(set(this.state, keyPath, value))\n }\n\n // Define instance method\n Class.prototype.resetForm = function () {\n this.form.reset()\n }\n\n // Define instance method\n Class.prototype.popupAlert = function (content, title) {\n return popupAlert(title, <Json data={content}/>)\n }\n\n Class.prototype.componentWillUnmount = function (nextProps, nextState) {\n const {parent, form, index} = this.props\n if (parent && index != null) parent.unregisterDataKind(this, form.kind, index)\n if (componentWillUnmount) componentWillUnmount.apply(this, arguments)\n }\n\n Class.prototype.UNSAFE_componentWillMount = function (nextProps, nextState) {\n // Wrap form.submit with HOC to extract nested form values before submission\n this.submit = (...args) => {\n const {dataKind} = this.formValues\n for (const kind in dataKind) {\n dataKind[kind] = this.getDataKind(kind).map((v, index) => isEmpty(v) ? dataKind[kind][index] : v)\n }\n return this.form.submit(...args)\n }\n\n const {parent, form, index} = this.props\n\n if (parent && index != null) {\n parent.registerDataKind(this, form.kind, index)\n }\n if (UNSAFE_componentWillMount) {\n UNSAFE_componentWillMount.apply(this, arguments)\n }\n }\n\n Class.prototype.UNSAFE_componentWillUpdate = function (nextProps, nextState) {\n if (this.state !== nextState) this.meta = null // update changes by UI interactions (i.e. Dropdown onChange)\n if (UNSAFE_componentWillUpdate) UNSAFE_componentWillUpdate.apply(this, arguments)\n }\n\n Class.prototype.UNSAFE_componentWillReceiveProps = function (next, _) {\n const {data, meta} = this.props\n // external API changes\n if (next.data != null && next.data !== data) {\n this.setState(set(this.state, 'data.json', normalizeIncomingData(next.data)))\n }\n // external API changes\n if (next.meta != null && next.meta !== meta) {\n this.setState(set(this.state, 'meta.json', next.meta))\n }\n if (UNSAFE_componentWillReceiveProps) {\n UNSAFE_componentWillReceiveProps.apply(this, arguments)\n }\n }\n\n return withForm(formConfig)(Class)\n }\n}\n\nconst sleep = ms => new Promise(resolve => setTimeout(resolve, ms))\n\nfunction delayed (func, delay = 2000) {\n return async (...args) => {\n await sleep(delay)\n return func(...args)\n }\n}\n\nconst dataActionWarning = (e) => warn('Missing parent UI Render instance to modify form values!', e)\n","import { fetch } from 'ui-modules-pack/api'\nimport { popupAlert } from 'ui-modules-pack/popup'\nimport { FIELD } from 'ui-modules-pack/variables'\nimport React, { Component } from 'react'\nimport { cn, type } from 'ui-react-pack'\nimport Placeholder from 'ui-react-pack/Placeholder'\nimport Spinner from 'ui-react-pack/Spinner'\nimport Text from 'ui-react-pack/Text'\nimport { ENV, fromJSON, get, isEmpty, isFunction, isString, SUCCESS } from 'ui-utils-pack'\nimport UIRender from './rules'\n\nFIELD.ACTION = {\n UPDATE: 'update',\n}\n\n// noinspection JSConstantReassignment\n/**\n * VIEW TEMPLATE ---------------------------------------------------------------\n * UI Render wrapper Container to handle data/meta fetching and submit updates.\n * -----------------------------------------------------------------------------\n */\nexport default class WebStudioPage extends Component {\n static propTypes = {\n dataUrl: type.Url,\n metaUrl: type.Url,\n }\n\n state = {\n loadingData: true,\n loadingMeta: true,\n }\n\n get id () {\n return get(this.props, 'match.params.id') || ((typeof document !== 'undefined' && document.id) || '')\n }\n\n get urlPrefix () {\n if (this._urlPrefix != null) return this._urlPrefix\n this._urlPrefix = document.getElementById('ui-render').getAttribute('data-prefix-url') || ''\n if (typeof window !== 'undefined') {\n if (this._urlPrefix) this._urlPrefix = window.location.origin + this._urlPrefix\n }\n return this._urlPrefix\n }\n\n componentDidMount () {\n /* Use local variables, if set */\n if (typeof window !== 'undefined') {\n const {dataJson, metaJson} = window\n if (dataJson && metaJson) {\n return this.update(dataJson, metaJson)\n } else if (isFunction(window.POST)) {\n FIELD.FUNC[FIELD.ACTION.UPDATE] = this.POST = window.POST\n if (!window.UPDATE) window.UPDATE = this.update\n return window.POST().then(({data, meta}) => this.update(data, meta)).catch(this.popup)\n }\n }\n\n /* Fetch JSON from external API */\n const {\n dataUrl = this.urlPrefix + ENV.REACT_APP_DATA_URL,\n metaUrl = this.urlPrefix + ENV.REACT_APP_META_URL\n } = this.props\n\n // todo: remove temporary mock for Policy UI for fetch method\n this.fetch(dataUrl, {body: this.id, contentType: 'text/plain', method: window._dataFetchMethod})\n .then(data => this.setState({loadingData: false, data}))\n .catch(this.popup)\n this.fetch(metaUrl, {contentType: 'application/json'})\n .then(meta => this.setState({loadingMeta: false, meta}))\n .catch(this.popup)\n }\n\n update = (dataJson, metaJson = null) => {\n const state = {loadingData: false, loadingMeta: false}\n state.data = isString(dataJson) ? fromJSON(dataJson) : dataJson\n if (metaJson) state.meta = isString(metaJson) ? fromJSON(metaJson) : metaJson\n return this.setState(state)\n }\n\n fetch = async (url, {body = {}, contentType = 'application/json', method = 'POST'}) => {\n const data = {method, body, headers: {'Content-Type': contentType}}\n\n if (data.method === 'GET') {\n delete data.body\n }\n\n const {payload, meta: {result} = {}} = await fetch(url, data)\n if (result === SUCCESS) return payload\n if (result != null) throw Error(result)\n }\n\n popup = (error) => popupAlert('Fetch Error', <Text>{String(error)}</Text>)\n\n submit = (formValues) => {\n // In Classic UI, there is no backend API, the window.POST method is simulated in Java template to return promise.\n if (this.POST) return this.POST(formValues).then(({data, meta}) => this.update(data, meta)).catch(this.popup)\n\n // todo: logic to update backend (waiting for Backend API to be done)\n console.warn(formValues)\n }\n\n render () {\n const {loadingData, loadingMeta, data, meta} = this.state\n this.hasData = !isEmpty(data)\n this.hasMeta = !isEmpty(meta)\n return (this.hasData && this.hasMeta\n ? <UIRender onSubmit={this.submit} {...this.props} data={data} meta={meta} initialValues={data}/>\n : <Placeholder>\n {!this.hasData &&\n <Text className={cn('h1', {error: !loadingData, blink: loadingData})}>\n {loadingData ? <Text><Spinner size=\"large\"/> Loading...</Text> : 'Missing'} *_data.json\n </Text>\n }\n {!this.hasMeta &&\n <Text className={cn('h1', {error: !loadingMeta, blink: loadingMeta})}>\n {loadingMeta ? <Text><Spinner size=\"large\"/> Loading...</Text> : 'Missing'} *_meta.json\n </Text>\n }\n </Placeholder>\n )\n }\n}\n\n\n","import { connect, Provider } from 'react-redux' // import like this produces smallest js bundle size\nimport mergeReducers from 'reduce-reducers'\nimport { combineReducers } from 'redux'\nimport { createAction, handleActions } from 'redux-actions' // import like this produces smallest js bundle size\nimport thunk from 'redux-thunk' // Middleware for async tasks\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport * from './actions'\nexport * from './reducers'\nexport { default as createStore } from './createStore'\nexport {\n combineReducers,\n connect,\n createAction,\n handleActions,\n mergeReducers,\n Provider\n}\n\nconst redux = {\n middleware: thunk,\n Provider\n}\n\nexport default redux\n","import { get } from 'ui-utils-pack'\nimport selector from 'ui-utils-pack/selectors'\nimport { ROUTER } from './constants'\n\n/**\n * STATE SELECTORS =============================================================\n * Memoized Functions - to retrieve specific branches of the app state\n * =============================================================================\n */\n\n@selector(ROUTER)\nexport default class select {\n static activeRoute = () => [\n (state) => get(state, `${ROUTER}.location.pathname`),\n (val) => val\n ]\n}\n","/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const ROUTER = 'router' // Namespace this module\n","import { ROUTE } from 'ui-modules-pack'\nimport React from 'react'\nimport { withRouter } from 'react-router'\nimport { Link as ClientLink, Route } from 'react-router-dom'\nimport { onPressHoc, SOUND } from 'ui-react-pack'\nimport { Active, hasListValue } from 'ui-utils-pack'\nimport { idFromRoute } from '../utils'\n\n/**\n * Recursively Declare Browser Routes using Absolute Paths\n * @Note: this function expects js files to be found with matching route path from `pages` default export\n *\n * @param {Array} routes - list of nested routes, in this structure [{path, name, items}]\n * @param {Object} pages - pages by route name\n * @returns {Array} routes - flat list of React Route Components\n */\nexport function defineRoutes (routes, pages) {\n const results = []\n if (!hasListValue(routes)) return results\n routes.forEach(({path, items}) => {\n const route = (path.indexOf('/:') ? path.split('/:')[0] : path)\n results.push(<Route key={path} exact path={path} component={pages[route] || pages[ROUTE.HOME]}/>)\n if (hasListValue(items)) results.push(defineRoutes(items, pages))\n })\n return results\n}\n\n/**\n * Link HOC for react-router to play sound onClick\n */\nexport function Link ({onClick, sound = Active.SETTINGS.HAS_SOUND && SOUND.TOUCH, ...props}) {\n return <ClientLink onClick={onPressHoc(onClick, sound)} {...props}/>\n}\n\n/**\n *\n * React Component Decorator (HOC) to provide this.id getter that returns ID from Browser router pathname\n *\n * @example:\n * https://example.com/user/edit/uuid\n * this.id\n * >>> 'uuid'\n *\n * @param {Class|Function} constructor - to be decorated\n * @param {Class|Function} constructor - class, wrapped using @withRouter decorator\n */\nexport function withRouteId (constructor) {\n // Define instance getter\n Object.defineProperty(constructor.prototype, 'id', {\n get () {\n return idFromRoute(this.props)\n }\n })\n return withRouter(constructor)\n}\n","import { CHANGE } from 'ui-utils-pack'\n\n/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const ACTION_TYPE = '@@router' // for react-router\nexport const ROUTER_ACTION_TYPE = {\n [CHANGE]: `${ACTION_TYPE}/LOCATION_CHANGE`\n}\n","import { Active } from 'ui-utils-pack'\n\n// history requires DOM and will throw error in Node when used with Next.js\n// thus need to do conditional check before importing\nexport const history = Active.history = typeof window !== 'undefined' ? require('history').createBrowserHistory() : {}\nexport default history\n","import { ConnectedRouter, connectRouter, routerMiddleware } from 'connected-react-router'\nimport { Route } from 'react-router-dom'\nimport { ROUTER } from '../constants'\nimport select from '../selectors'\nimport { defineRoutes } from './components'\nimport { ACTION_TYPE } from './constants'\nimport history from './history'\n\n/**\n * BROWSER ROUTER EXPORTS ======================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport { Switch } from 'react-router-dom'\nexport { withRouter } from 'react-router'\nexport * from '../utils'\nexport * from '../constants'\nexport * from './constants'\nexport * from './components'\nexport * from './actions'\nexport * from './history'\nexport {\n select\n}\n\nconst router = {\n NAME: ROUTER,\n ACTION_TYPE,\n history,\n middleware: typeof window !== 'undefined' ? routerMiddleware(history) : {},\n reducer: typeof window !== 'undefined' ? connectRouter(history) : undefined,\n Router: ConnectedRouter,\n Route,\n select,\n defineRoutes,\n get activeRoute () {\n const {location: {pathname} = {}} = history\n return pathname\n },\n get activeRouteId () {\n return (this.activeRoute || '').split(/\\//).pop()\n }\n}\n\nexport default router\n","import { THEME } from '../variables'\n\n/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const NAME = 'SETTINGS' // Namespace this module\nexport const UI = `${NAME}_UI`\nexport const SETTING = {THEME}\n","import { CLOSE, FINISH, isInList, LOAD, OPEN, START } from 'ui-utils-pack'\nimport { stateActionType } from './actions'\n\n/**\n * ACTION HANDLER HELPERS ======================================================\n * =============================================================================\n */\n\n// See `popup` module for reference\nexport const popupsInitState = {\n activePopups: [\n // ROUTE.RESULT,\n // ROUTE.MATCH,\n ],\n // [ROUTE.RESULT]: {\n // items: [],\n // },\n}\n\nexport function popups (NAME) {\n return {\n /* Subscribe to POPUP action */\n [stateActionType(NAME, OPEN)]: (state, {payload, payload: {activePopup} = {}}) => {\n // Append items if Popup is already Open\n if (isInList(state.activePopups, payload.activePopup)) {\n return {\n ...state,\n [activePopup]: {\n ...state[activePopup],\n items: [\n ...(state[activePopup] || {}).items || [],\n ...(payload[activePopup] || {}).items || []\n ]\n }\n }\n }\n // Else, set them to current payload (thus, removing previous items)\n return {\n ...state,\n ...payload, // payload must have `items` nested inside `activePopup` key -> {[activePopup]: {items: [...]}}\n activePopups: [...state.activePopups, activePopup]\n }\n },\n\n /* Close Popup */\n [stateActionType(NAME, CLOSE)]: (state, {payload: {activePopup, id = null}}) => {\n // Closing only specified item ID\n if (id) {\n const items = ((state[activePopup] || {}).items || []).filter(item => item.id !== id)\n return {\n ...state,\n [activePopup]: {\n ...state[activePopup],\n items\n },\n // Close the entire popup if no more items left\n ...!items.length && {activePopups: state.activePopups.filter(item => item !== activePopup)}\n }\n }\n // Closing the entire popup by its type\n return {\n ...state, // Closing does not remove items, because garbage collection is handled by OPEN action logic above\n activePopups: state.activePopups.filter(item => item !== activePopup)\n }\n }\n }\n}\n\nexport function uiLoading (NAME) {\n return {\n /* Subscribe to loading start action */\n [stateActionType(NAME, LOAD, START)]: (state) => ({...state, loading: true}),\n\n /* Subscribe to loading complete action */\n [stateActionType(NAME, LOAD, FINISH)]: (state) => ({...state, loading: false})\n }\n}\n","import { GET, performStorage } from 'ui-utils-pack'\nimport { NAME } from './constants'\n\n/**\n * STATE DATA ==================================================================\n * Initial State or Test Data - used to launch the app initially\n * =============================================================================\n */\n\nconst initState = {\n data: {\n ...performStorage(GET, NAME)\n },\n ui: {\n loading: false,\n }\n}\n\nexport default initState\n","import { combineReducers, handleActions, stateActionType, uiLoading } from 'ui-modules-pack/redux'\nimport { performStorage, SET } from 'ui-utils-pack'\nimport { NAME, UI } from './constants'\nimport initState from './data'\n\n/**\n * ACTION HANDLERS =============================================================\n * Pure Functions Only - business logic to handle actions and update app state\n * =============================================================================\n */\n\n/* Data Handler (persistent settings) */\nconst dataHandler = handleActions({\n\n [stateActionType(NAME, SET)]: (state, {payload}) => {\n const settings = {...state, ...payload}\n performStorage(SET, NAME, settings)\n return settings\n }\n\n}, initState.data)\n\n/* UI Handler (non-persistent settings) */\nconst uiHandler = handleActions({\n ...uiLoading(NAME),\n [stateActionType(UI, SET)]: (state, {payload}) => ({...state, ...payload}),\n}, initState.ui)\n\nconst allHandlers = combineReducers({\n data: dataHandler,\n ui: uiHandler\n})\n\nexport default allHandlers\n","import { Active, definitionByValue, enumFrom, l, LANGUAGE, LANGUAGE_LEVEL, optionsFrom } from 'ui-utils-pack'\n\n/**\n * PROJECT DEFINITIONS =========================================================\n * =============================================================================\n */\n\nexport const CURRENCY = {\n USD: {\n _: 'USD',\n [l.ENGLISH]: 'USD',\n },\n EUR: {\n _: 'EUR',\n [l.ENGLISH]: 'EUR',\n },\n RUB: {\n _: 'RUB',\n [l.ENGLISH]: 'RUB',\n },\n}\nActive.CURRENCY = CURRENCY.USD\n\nexport const PHONE = {\n MOBILE: {\n _: 'mobile',\n [l.ENGLISH]: 'Mobile Phone'\n },\n HOME: {\n _: 'home',\n [l.ENGLISH]: 'Home Phone'\n },\n WORK: {\n _: 'work',\n [l.ENGLISH]: 'Work Phone'\n },\n}\n\nexport const PERMISSION = {\n // @note: permissions are defined as separate access levels.\n // To have full access, one must have all permissions defined below.\n // This way we keep the logic for checking permissions simple.\n // Example: User with permission {'1': true, '99': true} cannot update/delete.\n READ: {\n _: 1,\n [l.ENGLISH]: 'Read',\n },\n UPDATE: {\n _: 2,\n [l.ENGLISH]: 'Update',\n },\n DELETE: {\n _: 3,\n [l.ENGLISH]: 'Delete',\n },\n MANAGE_USERS: {\n _: 99, // same as STAFF authorization level\n [l.ENGLISH]: 'Manage Users',\n },\n}\n\n/* Match with GraphQL Type */\nexport const TYPE = {\n CURRENCY: {\n _: 'Currency',\n [l.ENGLISH]: 'Currency'\n },\n LANGUAGE: {\n _: 'Language',\n [l.ENGLISH]: 'Language'\n },\n LANGUAGE_LEVEL: {\n _: 'LanguageLevel',\n [l.ENGLISH]: 'Language Level'\n },\n PHONE: {\n _: 'Phone',\n [l.ENGLISH]: 'Phone Number'\n },\n}\n\nexport const OPTIONS = {\n CURRENCY: optionsFrom(CURRENCY),\n LANGUAGE: optionsFrom(LANGUAGE),\n PHONE: optionsFrom(PHONE),\n}\n\nexport const DEFINITION = {\n [TYPE.CURRENCY._]: CURRENCY,\n [TYPE.LANGUAGE._]: LANGUAGE,\n [TYPE.PHONE._]: PHONE,\n}\n\nexport const DEFINITION_BY_VAL = {\n LANGUAGE: definitionByValue(LANGUAGE),\n LANGUAGE_LEVEL: definitionByValue(LANGUAGE_LEVEL),\n [TYPE.LANGUAGE._]: definitionByValue(LANGUAGE),\n}\n\nexport const ENUM = {\n LANGUAGE: enumFrom(LANGUAGE),\n LANGUAGE_LEVEL: enumFrom(LANGUAGE_LEVEL),\n}\n","import { DEFINITION_BY_VAL, ENUM } from 'ui-modules-pack/variables/definitions'\nimport { definitionByValue, enumFrom, l } from 'ui-utils-pack'\n\n/**\n * LOCALISED DEFINITIONS =======================================================\n * =============================================================================\n */\n\nexport const _USER = {\n // @Note: User Authorization can have matching values with User Role, but incrementing in between.\n // Example: a Supervising Staff may have authorization level 200, while New Hire - level 99.\n // It is then possible to set access threshold for certain features based on auth level.\n ROLE: {\n // 0: 'Any' - zero value code is used to delete record in database\n // Language is the bottom most in hierarchy because code should be defined only once\n // and it's easier to see all translation of the same word together\n // We use numbered code for security reasons so it's harder for hackers to guess.\n // Numbered code also allows computation of permissions with quick `<` or `>` checks\n USER: {\n _: 0, // default role -> undefined in database\n [l.ENGLISH]: 'User',\n },\n STAFF: {\n _: 99,\n [l.ENGLISH]: 'Staff',\n },\n DEVELOPER: {\n _: 699,\n [l.ENGLISH]: 'Developer',\n },\n ADMIN: {\n _: 999,\n [l.ENGLISH]: 'Admin',\n },\n },\n\n KIND: {\n INDIVIDUAL: {\n _: 0,\n [l.ENGLISH]: 'Individual',\n },\n COMPANY: {\n _: 1,\n [l.ENGLISH]: 'Company',\n },\n },\n}\n\nexport const SEX = { // code needs to be incrementing value for slider\n ANY: {\n _: 0,\n [l.ENGLISH]: 'Any',\n },\n FEMALE: {\n _: 1,\n [l.ENGLISH]: 'Female',\n },\n MALE: {\n _: 2,\n [l.ENGLISH]: 'Male',\n }\n}\n\nDEFINITION_BY_VAL.USER_ROLE = definitionByValue(_USER.ROLE)\nDEFINITION_BY_VAL.USER_KIND = definitionByValue(_USER.KIND)\nDEFINITION_BY_VAL.SEX = definitionByValue(SEX)\nENUM.USER_ROLE = enumFrom(_USER.ROLE)\nENUM.USER_KIND = enumFrom(_USER.KIND)\nENUM.SEX = enumFrom(SEX)\n","import { _USER } from './definitions'\n\n/**\n * BUSINESS LOGIC COMPUTATIONS =================================================\n * =============================================================================\n */\n\n/**\n * Check if User has Admin or higher authorization based on User.auth\n */\nexport function hasAdminAuth (auth) {\n return auth >= _USER.ROLE.ADMIN._\n}\n\n/**\n * Check if User has Developer or higher authorization based on User.auth\n */\nexport function hasDeveloperOrHigherAuth (auth) {\n return auth >= _USER.ROLE.DEVELOPER._\n}\n\n/**\n * Check if User has Staff or higher authorization based on User.auth\n */\nexport function hasStaffOrHigherAuth (auth) {\n return auth >= _USER.ROLE.STAFF._\n}\n\n/**\n * Check if User has Staff or higher permission based on User.role\n */\nexport function hasStaffOrHigherRole (role) {\n return role >= _USER.ROLE.STAFF._\n}\n\n/**\n * Check if given User.role is Staff\n */\nexport function isStaff (role) {\n return role === _USER.ROLE.STAFF._\n}\n\n/**\n * Check if given User.role is Admin\n */\nexport function isAdmin (role) {\n return role === _USER.ROLE.ADMIN._\n}\n\n/**\n * Check if given User.kind is Company\n */\nexport function isCompany (kind) {\n return kind === _USER.KIND.COMPANY._\n}\n\n/**\n * Check if given User.kind is Individual\n */\nexport function isIndividual (kind) {\n return !kind || kind === _USER.KIND.INDIVIDUAL._\n}\n\n/**\n * Check if given Instance or Object is of User Type\n *\n * @param {Object|Undefined} instance - to check, can be empty\n * @returns {Boolean} true - if it is\n */\nexport function isUserModel (instance) {\n return !!instance && (instance.lastLogin != null || instance.lastOnline != null || instance.surname != null)\n}\n","import { __PROD__, Active, ONE_HOUR, ONE_MONTH, ONE_WEEK } from 'ui-utils-pack'\nimport { THEME } from './configs'\nimport { CURRENCY } from './definitions'\n\n/**\n * PROJECT DEFAULTS ============================================================\n * =============================================================================\n */\n\nexport const DEFAULT = {\n LANGUAGE: Active.LANG._,\n CURRENCY: CURRENCY.USD._,\n LOGIN_DURATION: __PROD__ ? ONE_MONTH : ONE_WEEK, // match `TOKEN_LIFESPAN_JWT`\n GRADIENT_HUE_COUNT: 3,\n PAY_INTERVAL: ONE_HOUR,\n QUERY_LIMIT: 1000, // generic limit\n QUERY_ID_LIMIT: 10000, // about 2.9 KB for 100 ObjectIds, allowing 33k IDs per 1 MB\n QUERY_TAG_LIMIT: 1000, // about 0.3 KB for each tag with 10 languages, allowing 3.3k Tags per 1 MB\n QUERY_USER_LIMIT: 300, // each user response takes about ?, GraphQl default limit is 1 MB\n THEME: THEME.LIGHT,\n}\n","import { OPTIONS, TYPE } from 'ui-modules-pack/variables/definitions'\nimport { FIELD } from 'ui-modules-pack/variables/fields'\nimport { double5, integer, phone, uppercase } from 'ui-react-pack/inputs/normalizers'\nimport { email, isRequired, maxLength, password, phoneNumber, url } from 'ui-react-pack/inputs/validationRules'\nimport { _ } from 'ui-utils-pack/translations'\n\n/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const NAME = 'FORM' // Namespace this module\nexport const FORM_ASYNC_VALIDATE = 'FORM_ASYNC_VALIDATE'\nexport const API_VALIDATE_FAIL_CODE = 422\n\n// Field Type Definitions\nFIELD.TYPE = {\n DATE: 'Date',\n DATES: 'Dates', // multiple date ranges with `from` and `to` times\n GROUP: 'Group', // group of semantically related fields (i.e. pay rate and currency)\n INPUT: 'Input', // generic input of different types (i.e. type='text', 'textarea', etc.)\n SELECT: 'Select', // Semantic UI Dropdown\n SLIDER: 'SliderLabel', // slider field with label\n TOGGLE: 'Toggle', // checkbox rendered as toggle button\n MULTIPLE: 'Fields', // multiple fields of the same type (i.e. mobile/work/home phone numbers)\n MULTIPLE_LEVEL: 'FieldsWithLevel', // multiple fields of the same type, each having a value in predefined scale\n PLACE: 'Place', // Google Places Autocomplete\n UPLOAD: 'Upload', // single file upload with drag & drop\n UPLOAD_GRID: 'UploadGrid', // multiple uploads in grid layout\n UPLOAD_GRIDS: 'UploadGrids', // multiple uploads in grid layout of different kinds as separate tabs\n}\n\n// Validation Definitions\nFIELD.VALIDATE = {\n EMAIL: 'email',\n MAX_LENGTH: 'maxLength',\n PASSWORD: 'password',\n REQUIRED: 'required',\n URL: 'url',\n}\nFIELD.VALIDATION = {\n [FIELD.VALIDATE.EMAIL]: email,\n [FIELD.VALIDATE.MAX_LENGTH]: maxLength,\n [FIELD.VALIDATE.PASSWORD]: password,\n [FIELD.VALIDATE.REQUIRED]: isRequired,\n [FIELD.VALIDATE.URL]: url,\n}\n\n// Field Definitions\nFIELD.DEF = {\n [FIELD.ID.EMAIL]: {\n name: 'email',\n get label () {return _.EMAIL},\n get hint () {return _.MY_EMAIL_ADDRESS_IS},\n get placeholder () {return _.EXAMPLE_GMAIL_COM},\n type: 'email',\n validate: email,\n view: FIELD.TYPE.INPUT, // required definition\n },\n [FIELD.ID.PHONE]: {\n name: 'phones',\n get labelType () {return TYPE.PHONE.name},\n get hint () {return _.MY_PHONE_NUMBER_IS},\n get placeholder () {return _.plus_1_555_555_55_55},\n options: OPTIONS.PHONE,\n minFields: 1,\n type: 'tel',\n normalize: phone,\n validate: [phoneNumber],\n view: FIELD.TYPE.MULTIPLE,\n },\n}\n\n// Field props\nexport const allowAdditions = true\nexport const stickyPlaceholder = true\nexport const lefty = true\nexport const disabled = true\nexport const readonly = true\nexport const multiple = true\nexport const required = true\nexport const search = true\nexport const upward = true\n\n/**\n * Populate List of Field Definition with Slider Field required props\n *\n * @param {Array<Object>} fields - list of fields to create, requires FIELD.ID, used for extending base definition\n * @param {Object} [options] - extra props to add (i.e. {namePrefix})\n * @returns {Array<Object>} list - of slider field definitions\n */\nexport function toSlider (fields, options) {\n return fields.map(field => {\n const [min, max] = FIELD.MIN_MAX[field.id]\n return {...options, ...field, min, max, defaultValue: [min, max], view: FIELD.TYPE.SLIDER}\n })\n}\n","import { l, localiseTranslation } from 'ui-utils-pack'\n\n/**\n * LOCALISED TRANSLATIONS (i18n) ===============================================\n * =============================================================================\n */\n\nexport { _ } from 'ui-utils-pack/translations'\nlocaliseTranslation({\n GIVEN_NAME: {\n [l.ENGLISH]: 'Given Name',\n },\n MY_GIVEN_NAME_IS: {\n [l.ENGLISH]: 'My given name is',\n },\n MY_SURNAME_IS: {\n [l.ENGLISH]: 'My surname is',\n },\n SURNAME: {\n [l.ENGLISH]: 'Surname',\n },\n ABOUT_ME: {\n [l.ENGLISH]: 'About Me',\n },\n BRIEF_DESCRIPTION: {\n [l.ENGLISH]: 'Brief description',\n },\n DATE_OF_BIRTH: {\n [l.ENGLISH]: 'Date of Birth',\n },\n I_WAS_BORN: {\n [l.ENGLISH]: 'I was born',\n },\n MY_ROLE: {\n [l.ENGLISH]: 'My Role',\n },\n REGISTER_ME_AS: {\n [l.ENGLISH]: 'Register me as',\n },\n GENDER: {\n [l.ENGLISH]: 'Gender',\n },\n I_AM: {\n [l.ENGLISH]: 'I am',\n },\n})\n","import { stickyPlaceholder } from 'ui-modules-pack/form/constants'\nimport { FIELD } from 'ui-modules-pack/variables'\nimport { timeInThePast } from 'ui-react-pack/inputs/validationRules'\nimport { Active, capitalize, optionsFrom } from 'ui-utils-pack'\nimport { namespace } from 'ui-utils-pack/utility'\nimport { _USER, SEX } from './definitions'\nimport * as t from './translations'\nimport { _ } from './translations'\n\nconst sideEffects = {t}\n\n/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const USER = 'USER' // Namespace this module\nexport const USERS = 'USERS' // GraphQL field type for list query (to be lower-cased)\nexport const USER_CLIENT = namespace(USER, Active.SERVICE) // Namespace this module for frontend\nexport const USER_SERVER = namespace(USER, Active.SERVICE) // Namespace this module for backend\nexport const USER_MODEL = capitalize(USER) // db model name\nexport const SELF = `${USER}_SELF`\nexport const USER_LOGIN = `${USER}_LOGIN`\nexport const ROLE = {} // object of role values by name\nfor (const name in _USER.ROLE) {\n ROLE[name] = _USER.ROLE[name]._\n}\n\n// Field IDs\nFIELD.ID = {\n GIVEN_NAME: `${USER}_GIVEN_NAME`,\n SURNAME: `${USER}_SURNAME`,\n FULL_NAME: `${USER}_FULL_NAME`,\n ABOUT_ME: `${USER}_ABOUT_ME`,\n BIRTHDAY: `${USER}_BIRTHDAY`,\n BIRTH_n_SEX: `${USER}_BIRTH_&_SEX`,\n ROLE: `${USER}_ROLE`,\n SEX: `${USER}_SEX`,\n}\n\n// Field Definitions\nFIELD.DEF = {\n [FIELD.ID.GIVEN_NAME]: {\n name: 'name',\n get label () {return _.GIVEN_NAME},\n get hint () {return _.MY_GIVEN_NAME_IS},\n view: FIELD.TYPE.INPUT,\n },\n [FIELD.ID.SURNAME]: {\n name: 'surname',\n get label () {return _.SURNAME},\n get hint () {return _.MY_SURNAME_IS},\n view: FIELD.TYPE.INPUT,\n },\n [FIELD.ID.ABOUT_ME]: {\n name: 'about',\n get label () {return _.ABOUT_ME},\n get hint () {return _.ABOUT_ME},\n get placeholder () {return _.BRIEF_DESCRIPTION},\n type: 'textarea',\n view: FIELD.TYPE.INPUT,\n },\n [FIELD.ID.BIRTHDAY]: {\n name: 'birthday',\n get label () {return _.DATE_OF_BIRTH},\n get hint () {return _.I_WAS_BORN},\n placeholder: 'dd.mm.yyyy',\n stickyPlaceholder,\n validate: [timeInThePast],\n view: FIELD.TYPE.DATE,\n },\n [FIELD.ID.ROLE]: {\n name: 'role',\n get label () {return _.MY_ROLE},\n get hint () {return _.REGISTER_ME_AS},\n options: optionsFrom([_USER.ROLE.STAFF, _USER.ROLE.USER]),\n view: FIELD.TYPE.DROPDOWN,\n },\n [FIELD.ID.SEX]: {\n name: 'sex',\n get label () {return _.GENDER},\n get hint () {return _.I_AM},\n options: optionsFrom([SEX.FEMALE, SEX.MALE]),\n view: FIELD.TYPE.DROPDOWN,\n // Cannot use minWidth because it causes overflow for long text, add minWidth for FormInSteps only\n // style: {minWidth: 120},\n },\n [FIELD.ID.FULL_NAME]: {\n // `required` can be passed down as group, leave undefined by default for customisation\n items: [{id: FIELD.ID.GIVEN_NAME}, {id: FIELD.ID.SURNAME}],\n view: FIELD.TYPE.GROUP,\n },\n [FIELD.ID.BIRTH_n_SEX]: {\n items: [{id: FIELD.ID.BIRTHDAY}, {id: FIELD.ID.SEX}],\n view: FIELD.TYPE.GROUP,\n },\n}\n","import { hasStaffOrHigherRole, isAdmin, isCompany, isIndividual, isStaff } from 'ui-modules-pack/user/logic'\nimport { DEFAULT } from 'ui-modules-pack/variables'\nimport { Active } from 'ui-utils-pack'\nimport selector from 'ui-utils-pack/selectors'\nimport { USER } from './constants'\n\n// noinspection JSPotentiallyInvalidUsageOfClassThis\n/**\n * STATE SELECTORS =============================================================\n * Memoized Functions - to retrieve specific branches of the app state\n * =============================================================================\n */\n\n@selector(USER)\nexport default class select {\n static self = () => [\n (state) => state[USER].self,\n (val) => Active.user = val || {}\n ]\n\n static id = () => [\n (state) => state[USER].self.id,\n (val) => val\n ]\n\n static role = () => [\n (state) => state[USER].self.role,\n (val) => val\n ]\n\n static kind = () => [\n (state) => state[USER].self.kind,\n (val) => val\n ]\n\n // This selector is used to compute whether to show Login or Signup popup, without identifying user\n static lastLogin = () => [\n (state) => state[USER].self.lastLogin,\n (val) => val\n ]\n\n static loading = () => [\n state => state[USER].loading,\n (val) => val || {}\n ]\n\n static isLoggedIn = () => [\n (state) => state[USER].self.id,\n (state) => state[USER].self.lastLogin,\n (id, lastLogin) => (Active.user.isLoggedIn = (!!id && (Date.now() - lastLogin) < DEFAULT.LOGIN_DURATION))\n ]\n\n static isAdmin = function () {\n return [\n this.role,\n isAdmin,\n ]\n }\n\n static isStaff = function () {\n return [\n this.role,\n isStaff,\n ]\n }\n\n static hasStaffOrHigherRole = function () {\n return [\n this.role,\n hasStaffOrHigherRole,\n ]\n }\n\n static isCompany = function () {\n return [\n this.kind,\n isCompany,\n ]\n }\n\n static isIndividual = function () {\n return [\n this.kind,\n isIndividual,\n ]\n }\n}\n","import routerSelect from 'ui-modules-pack/router/selectors'\nimport userSelect from 'ui-modules-pack/user/selectors'\nimport { Active, findObjByKeys, isInList, LANGUAGE } from 'ui-utils-pack'\nimport selector from 'ui-utils-pack/selectors'\nimport { CURRENCY, DEFAULT, ROUTES } from '../variables'\nimport { NAME } from './constants'\n\n/**\n * STATE SELECTORS =============================================================\n * Memoized Functions - to retrieve specific branches of the app state\n * =============================================================================\n */\n\n@selector(NAME)\nexport default class select {\n static country = () => [\n (state) => state[NAME].data.country,\n (val) => val\n ]\n\n static currency = () => [\n (state) => state[NAME].data.currency,\n (val) => {\n Active.CURRENCY = findObjByKeys(CURRENCY, {_: val}) || findObjByKeys(CURRENCY, {_: DEFAULT.CURRENCY})\n return val\n }\n ]\n\n static language = () => [\n (state) => state[NAME].data.language,\n (val) => { // @note: do not add default language here to trigger setLanguageFlow saga\n Active.LANG = findObjByKeys(LANGUAGE, {_: val}) || LANGUAGE.ENGLISH\n return val\n }\n ]\n\n static isOpenSidebar = () => [\n (state) => state[NAME].ui.isOpenSidebar,\n (val) => val\n ]\n\n static theme = () => [\n (state) => state[NAME].data.theme,\n (val) => val\n ]\n\n static ui = () => [\n (state) => state[NAME].ui,\n (val) => val\n ]\n\n static routesForNav = function () {\n return [\n routerSelect.activeRoute,\n userSelect.role,\n userSelect.isLoggedIn,\n (activeRoute, userRole, isLoggedIn) => {\n if (isInList(ROUTES.WITHOUT_NAV, activeRoute)) return []\n const routeWithoutId = activeRoute.substring(0, activeRoute.lastIndexOf('/'))\n if (routeWithoutId && isInList(ROUTES.WITHOUT_NAV, routeWithoutId)) return []\n return ROUTES.FOR_NAV.filter(r => {\n if (r.userRoles != null && !isInList(r.userRoles, userRole)) return false\n if (r.isLoggedIn != null && r.isLoggedIn !== isLoggedIn) return false\n return true\n })\n }\n ]\n }\n}\n","import { NAME, SETTING, UI } from './constants'\nimport reducer from './reducers'\nimport select from './selectors'\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport * from './constants'\nexport * from './actions'\nexport {\n NAME,\n UI,\n SETTING,\n select,\n}\n\nconst settings = {\n NAME,\n SETTING,\n reducer,\n sagas: {},\n select,\n}\n\nexport default settings\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { Active } from 'ui-utils-pack'\nimport Button from './Button'\nimport { SOUND } from './files'\n\n/**\n * Hamburger Style Button animating into Cross - Pure Component.\n *\n * @param {Boolean} [active] - whether to render the cross\n * @param {String} [className] - optional css class name\n * @param {*} [props] - other props\n * @returns {Object} - React button component\n */\nexport function MenuButton ({\n active,\n className,\n ...props\n}) {\n return (\n <Button\n className={classNames('app__menu__button transparent', {active}, className)}\n aria-label={(active ? 'Close' : 'Open') + ' Menu'}\n sound={Active.SETTINGS.HAS_SOUND && SOUND.TOUCH}\n {...props}\n >\n <span className='box'>\n <span className='bar'/>\n </span>\n </Button>\n )\n}\n\nMenuButton.propTypes = {\n active: PropTypes.bool,\n className: PropTypes.string,\n}\n\nexport default React.memo(MenuButton)\n","import classNames from 'classnames'\nimport PropTypes from 'prop-types'\nimport React from 'react'\nimport { shortNumber } from 'ui-utils-pack'\nimport View from './View'\n\n/**\n * Badge Counter - Pure Component.\n */\nexport function Badge ({\n count,\n digits = 2,\n className,\n ...props\n}) {\n const counter = (digits && count > 9) ? shortNumber(count, digits) : count\n // noinspection JSConstructorReturnsPrimitive\n return counter ? <View className={classNames('badge', className)} {...props}>{counter}</View> : null\n}\n\nBadge.propTypes = {\n count: PropTypes.number.isRequired,\n digits: PropTypes.number,\n className: PropTypes.string,\n}\n\nexport default React.memo(Badge)\n","import PropTypes from 'prop-types'\nimport React, { PureComponent } from 'react'\nimport { Active } from 'ui-utils-pack'\nimport Badge from './Badge'\nimport { SOUND } from './files'\n\n/**\n * VIEW TEMPLATE ---------------------------------------------------------------\n * Notification Counter Icon\n * @Usage: to be wrapped using @withGql decorator\n * -----------------------------------------------------------------------------\n */\nexport default class AlertCounter extends PureComponent {\n static propTypes = {\n alert: PropTypes.number.isRequired,\n }\n\n static defaultProps = {\n alert: 0\n }\n\n componentDidUpdate (prev) {\n if (prev.alert < this.props.alert && Active.SETTINGS.HAS_SOUND) SOUND.ALERT.play()\n }\n\n render () {\n return <Badge className='alert__counter' count={this.props.alert}/>\n }\n}\n","import { connect } from 'ui-modules-pack/redux'\nimport router, { Link } from 'ui-modules-pack/router/browser'\nimport { ROUTE } from 'ui-modules-pack/variables'\nimport React, { Component, Fragment } from 'react'\nimport { PropTypes, STYLE } from 'ui-react-pack'\nimport AlertCounter from 'ui-react-pack/AlertCounter'\nimport Icon from 'ui-react-pack/Icon'\nimport Text from 'ui-react-pack/Text'\nimport { withTimer } from 'ui-react-pack/utils'\n\n/**\n * MAP STATE & ACTIONS TO PROPS ------------------------------------------------\n * -----------------------------------------------------------------------------\n */\nconst mapStateToProps = (state) => ({\n activeRoute: router.select.activeRoute(state),\n})\n\n/**\n * VIEW TEMPLATE ---------------------------------------------------------------\n * Routed Navigation Links with Icon\n * -----------------------------------------------------------------------------\n */\n@connect(mapStateToProps)\n@withTimer\nexport default class NavLinks extends Component {\n static propTypes = {\n items: PropTypes.arrayOf(PropTypes.shape({\n path: PropTypes.string.isRequired,\n name: PropTypes.string.isRequired,\n icon: PropTypes.string,\n })).isRequired,\n onChangeRoute: PropTypes.func,\n }\n\n render () {\n const {activeRoute, items, onChangeRoute} = this.props\n return (\n <Fragment>\n {items.map(({path, name, icon}, i) => {\n const delay = (i + 1) * STYLE.ANIMATION_DURATION * 0.3\n\n return (\n <Link\n key={path || i}\n to={{pathname: path}}\n className={'app__menu__item ' + (path === activeRoute ? 'active' : '')}\n disabled={path === activeRoute}\n onClick={onChangeRoute}\n style={{animationDelay: delay + 'ms'}}\n >\n <Icon name={icon}>{path === ROUTE.CHAT && <AlertCounter/>}</Icon><Text>{name}</Text>\n </Link>\n )\n })}\n </Fragment>\n )\n }\n}\n","import { connect, stateAction } from 'ui-modules-pack/redux'\nimport router from 'ui-modules-pack/router/browser'\nimport settings, { UI } from 'ui-modules-pack/settings'\nimport { ROUTES } from 'ui-modules-pack/variables'\nimport React, { Component } from 'react'\nimport { cn, PropTypes, SOUND } from 'ui-react-pack'\nimport MenuButton from 'ui-react-pack/MenuButton'\nimport Row from 'ui-react-pack/Row'\nimport View from 'ui-react-pack/View'\nimport { SET } from 'ui-utils-pack'\nimport NavLinks from './NavLinks'\n\n/**\n * MAP STATE & ACTIONS TO PROPS ------------------------------------------------\n * -----------------------------------------------------------------------------\n */\nconst mapStateToProps = (state) => ({\n activeRoute: router.select.activeRoute(state),\n items: settings.select.routesForNav(state),\n isOpenSidebar: settings.select.isOpenSidebar(state),\n})\nconst mapDispatchToProps = (dispatch) => ({\n actions: {\n set: (payload) => dispatch(stateAction(UI, SET, payload))\n }\n})\n\n/**\n * VIEW TEMPLATE ---------------------------------------------------------------\n * Header Navigation\n * -----------------------------------------------------------------------------\n */\n@connect(mapStateToProps, mapDispatchToProps)\nexport class Header extends Component {\n static propTypes = {\n isMobile: PropTypes.bool.isRequired, // whether the view is for mobile\n }\n\n handleToggleSidebar = () => {\n const { actions, isOpenSidebar } = this.props\n actions.set({ isOpenSidebar: !isOpenSidebar })\n }\n\n render () {\n const { isMobile, isOpenSidebar, items } = this.props\n if (!items.length) return null\n if (!isMobile) return null\n const hasSidebar = items.length > ROUTES.NAV_HEADER_MAX_LINKS\n const links = [...items]\n if (hasSidebar) links.length = ROUTES.NAV_HEADER_MAX_LINKS - 1\n return (\n <Row className='app__header__items fill-width'>\n <NavLinks\n items={links}\n onChangeRoute={this.handleCloseSidebar}\n />\n {hasSidebar && <MenuButton active={isOpenSidebar} onClick={this.handleToggleSidebar}/>}\n </Row>\n )\n }\n}\n\n/**\n * VIEW TEMPLATE ---------------------------------------------------------------\n * Sidebar Navigation\n * -----------------------------------------------------------------------------\n */\n@connect(mapStateToProps, mapDispatchToProps)\nexport default class Sidebar extends Component {\n static propTypes = {\n isMobile: PropTypes.bool.isRequired, // whether the view is for mobile\n }\n\n handleCloseSidebar = () => {\n const {actions, isOpenSidebar} = this.props\n if (isOpenSidebar) actions.set({isOpenSidebar: !isOpenSidebar})\n }\n\n render () {\n const { isMobile, isOpenSidebar, className, items } = this.props\n if (!items.length) return null\n const links = isMobile ? items.slice(ROUTES.NAV_HEADER_MAX_LINKS - 1) : items\n const showSidebar = !isMobile || isOpenSidebar\n const containerClass = showSidebar\n ? 'active' // do not add `fade-in` class because of Safari bug\n : (isOpenSidebar === false ? 'fade-out' : 'hide')\n const contentClass = showSidebar\n ? 'slide-in-right'\n : (isOpenSidebar === false ? 'slide-out-right' : 'hide')\n return (\n <Row className={cn('app__sidebar', containerClass, className)}>\n {/* Empty overlay in Mobile view */}\n {isMobile && <View className='fill no-outline' onClick={this.handleCloseSidebar} tabIndex={-2}/>}\n\n {/* Nav items */}\n <View className={cn('fill-height ', contentClass)}>\n <View className='overflow-scroll no-scrollbar'>\n <View className='app__sidebar__items min-height'>\n <NavLinks\n items={links}\n onChangeRoute={this.handleCloseSidebar}\n sound={showSidebar ? SOUND.SLIDE : undefined}\n />\n </View>\n </View>\n\n {/* Empty space between Nav items and the static links on the bottom */}\n <View className='app__menu__item--empty fill no-outline' onClick={isMobile && this.handleCloseSidebar}\n tabIndex={-2}/>\n </View>\n </Row>\n )\n }\n}\n","import React, { Component } from 'react'\nimport { Header } from 'core/src/containers/Navigation'\n// import Popup from 'ui-modules-pack/popup/views/Popup'\nimport { connect } from 'ui-modules-pack/redux'\nimport { select, SETTING } from 'ui-modules-pack/settings'\nimport { DEFAULT } from 'ui-modules-pack/variables'\nimport Row from 'ui-react-pack/Row'\nimport { UIContext } from 'ui-react-pack/utils'\nimport View from 'ui-react-pack/View'\nimport { debounceBy, TIME_DURATION_INSTANT } from 'ui-utils-pack'\n\n/**\n * MAP STATE & ACTIONS TO PROPS ------------------------------------------------\n * -----------------------------------------------------------------------------\n */\nconst mapStateToProps = (state) => ({\n lang: select.language(state),\n currency: select.currency(state),\n theme: select.theme(state)\n})\n\n/**\n * ROOT VIEW WITHOUT ROUTER AND MODAL ------------------------------------------\n * -----------------------------------------------------------------------------\n */\n@connect(mapStateToProps)\nexport default class AppElement extends Component {\n state = {\n isMobile: false,\n screenRatio: 1,\n }\n\n constructor (props) {\n super(props)\n this.content = React.createRef()\n }\n\n @debounceBy(TIME_DURATION_INSTANT)\n resize () {\n const isMobile = window.innerWidth < 768\n const screenRatio = window.innerWidth / window.innerHeight\n this.setState({isMobile, screenRatio})\n }\n\n componentDidMount () {\n window.addEventListener('resize', this.resize.bind(this))\n this.resize()\n }\n\n render () {\n const {children, theme = DEFAULT.THEME, lang = DEFAULT.LANGUAGE, currency, ...props} = this.props\n const {isMobile} = this.state\n const inverted = theme === SETTING.THEME.DARK\n return (\n <UIContext.Provider value={this.state}>\n <View className={`app fade-in lang--${lang} ${currency}` + (inverted ? ' inverted text-shadow' : '')}>\n {/*<AcceptCookie/>*/}\n\n {/* Header */}\n <Header isMobile={isMobile} {...props} />\n\n <Row fill reverse={isMobile} className='max-size'>\n\n {/* Content */}\n <View className='app__content'>\n <div ref={this.content}/>\n {children}\n\n {/* Popup */}\n {/*<Popup inverted={inverted}/>*/}\n </View>\n\n </Row>\n </View>\n </UIContext.Provider>\n )\n }\n}\n","// Additional modules are optional to optimize for performance\n// import modules, { auth, location } from './modules'\n\n/**\n * STATE DATA ==================================================================\n * Initial State or Test Data - used to launch the app initially\n * =============================================================================\n */\n\nexport const hasAuthActivated = false // modules.some(({NAME}) => auth.NAME === NAME)\nexport const hasLocationActivated = false // modules.some(({NAME}) => location.NAME === NAME)\n\nconst initState = {\n data: {\n lastNetworkErrorMessage: null,\n location: 0, // Use 0 to compute initial Error alert\n // actionsPendingAuth: [], // Failed actions because of missing Authentication\n // actionsPendingLocation: [], // Failed actions because of missing Location access\n actionsPendingNetwork: [] // Failed actions because of Network connection\n }\n}\n\nexport default initState\n","import axios from 'axios' // 'axios' adds 13 KB to final js bundle size\nimport { cloneDeep, isNil, omitBy, startsWith } from 'lodash'\nimport { stateAction } from 'ui-modules-pack/redux/actions'\nimport qs from 'querystring'\nimport {\n ERROR,\n firstListValue,\n fromJSON,\n isFunction,\n isInString,\n isInStringAny,\n LOGOUT,\n REQUEST,\n SUCCESS,\n TIMEOUT,\n toJSON\n} from 'ui-utils-pack'\nimport { createAction } from './actions'\nimport {\n ADD_ACTIONS_PENDING_AUTH,\n ADD_ACTIONS_PENDING_LOCATION,\n ADD_ACTIONS_PENDING_NETWORK,\n API,\n API_CALL,\n HTTP_401_UNAUTHORIZED,\n NETWORK,\n NETWORK_ERROR_MESSAGES,\n REQUEST_TIMEOUT,\n} from './constants'\nimport { hasAuthActivated, hasLocationActivated } from './data' // import { auth, location } from './modules'\n// import { auth, location } from './modules'\nconst auth = {}\nconst location = {}\n\n/**\n * MIDDLEWARE ENHANCER =========================================================\n * Interceptors to preprocess actions dispatched by the store\n * =============================================================================\n */\n\n// const httpsAgent = new (require('https')).Agent({keepAlive: true}) // comment out if used in browser only\nconst httpsAgent = undefined // comment out if used in node.js\nconst useFetch = typeof axios === 'undefined'\nconst hasFetch = typeof fetch !== 'undefined'\n\n/**\n * Api Middleware Class to Handle All Fetch Actions\n *\n * @FEATURES:\n * - Auto-retrieve API Token and include in request headers if required\n * - dispatch action to store actionsPendingAuth:\n * a) if Token required but does not exist\n * b) if fetch response status is HTTP_401_UNAUTHORIZED\n * - dispatch action to store actionsPendingLocation if missing Location access\n * - dispatch action to store actionsPendingNetwork if network connection fails\n *\n * @USAGE:\n * - takes Flux Standard Action {type, payload, meta, [error]}\n * - defaults to GET method if not defined in {payload}\n * - authentication can be enabled with {meta: {authenticate: true}}\n *\n * @OPTIONS:\n * ```\n * const examplePostAction = () => ({\n * [API_CALL]: {\n * type: ENDPOINT_POST_ACTION, // -> computed action type from apiAction() creator\n * payload: {\n * id: 7, // will be inserted to url automatically\n * url: 'http://localhost/bar/7/foo', // if provided will override dynamically generated url\n * body: { // payload body\n * key: value, // will be automatically serialized according to `Content-Type`\n * },\n * params: { // parameters object that will be converted to query string by the apiMiddleware\n * limit: 5,\n * order_by: desc,\n * },\n * },\n * meta: {\n * url: {[PLACEHOLDER]: 'value'}, // placeholder values to be interpolated into request url\n * authenticate: false, // default - send requests without API Token\n * credentials: 'same-origin', // automatically send cookies for current domain\n * headers: {\n * 'Content-Type': 'application/json', // default\n * },\n * location: false, // if true, request User's location (lat and lng coordinates), then add to query\n * method: 'POST', // if provided, will override fetch method created by apiAction()\n * responseHandler: (response) => {}, // default is undefined - callback after response resolves\n * related: ['ormModel'], // list of related ORM Models to fetch (to be handled by Sagas)\n * callRequest: false, // if true, dispatch REQUEST action, default is false\n * callError: true, // if false, will not dispatch ERROR action, default is true\n * timeout: 30000, // milliseconds, default is REQUEST_TIMEOUT, will dispatch CANCEL action\n * }\n * }\n * })\n * ```\n */\nexport class ApiMiddleware {\n configDefault = {\n addTokenToRequest: (token) => ({\n Authorization: `Bearer ${token}` // -> override token from pending action resume\n }),\n headers: {\n // 'Accept': 'application/json', // axios auto adds correct header\n // To avoid calling OPTIONS, thus creating CORS problems, use 'application/x-www-form-urlencoded'\n // https://stackoverflow.com/questions/25727306/request-header-field-access-control-allow-headers-is-not-allowed-by-access-contr\n // 'Content-Type': 'application/x-www-form-urlencoded',\n // 'Content-Type': 'application/json', // do not specify header by default to avoid CORS problem\n // Keep-Alive header is only allowed using Fetch\n // ...useFetch && hasFetch && {'Keep-Alive': `timeout=${REQUEST_TIMEOUT}, max=1000`},\n },\n // credentials: 'include', // only works using Fetch\n REQUEST_TIMEOUT\n }\n\n constructor (action, store, config = {}) {\n this.action = action // Clone deep at implementation, to prevent mutation, without overhead\n this.apiAction = action[API_CALL]\n this.meta = this.apiAction.meta\n this.meta.request = {}\n this.store = store\n this.afterRequest = config.afterRequest\n this.afterResponse = config.afterResponse\n this.onError = config.onError\n this.onTimeout = config.onTimeout\n this.isFetch = hasFetch && (config.useFetch != null ? config.useFetch : useFetch)\n this.addTokenToRequest = config.addTokenToRequest || this.configDefault.addTokenToRequest\n this.REQUEST_TIMEOUT = this.meta.timeout || config.REQUEST_TIMEOUT || this.configDefault.REQUEST_TIMEOUT\n }\n\n get token () {\n if (!hasAuthActivated) throw new Error(`Please enable '${auth.NAME}' module for API token feature`)\n return auth.select.token(this.store.getState())\n }\n\n get shouldGetNewToken () {\n return (this.shouldAuthenticate && !this.token)\n }\n\n get shouldAuthenticate () {\n return this.meta.authenticate\n }\n\n get location () {\n if (!hasLocationActivated) throw new Error(`Please enable '${location.NAME}' module for API location feature`)\n return location.select.geoJSON(this.store.getState())\n }\n\n get shouldGetNewLocation () {\n // Location is required\n if (this.meta.location) {\n const {updated} = this.location\n return !(updated && ((Date.now() - updated) <= location.constants.LOCATION_LIFESPAN))\n }\n return false\n }\n\n call () {\n /* Token Expired / Does Not Exist */\n if (hasAuthActivated && this.shouldGetNewToken) {\n this.pendingAuth()\n } // eslint-disable-line\n\n /* Location Expired / Does Not Exist */\n else if (hasLocationActivated && this.shouldGetNewLocation) {\n this.pendingLocation()\n } // eslint-disable-line\n\n /* API Request */\n else {\n this.apiCall(this.apiAction, this.shouldAuthenticate && this.token)\n }\n }\n\n // REQUEST PROCESSING ----------------------------------------------------------\n // -----------------------------------------------------------------------------\n\n /* Single API request */\n apiCall (token = null) {\n const args = this.requestArgs(this.apiAction.payload, this.meta, token)\n const {responseHandler} = this.meta\n const responseProcessing = (this.isFetch ? this.responseProcessFetch : this.responseProcessAxios).bind(this)\n const timeout = this._setTimeout(this.apiAction) // must be just before request call\n ;(this.isFetch ? fetch : axios.request)(...args)\n .then(response => {\n this._logTime('end')\n clearTimeout(timeout)\n return response\n })\n .then(responseHandler) // if .responseHandler() provided in meta\n .then(responseProcessing)\n .then(this.requestComplete) // Dispatch SUCCESS action with response as payload\n .catch(error => {\n this._logTime('end')\n clearTimeout(timeout)\n return this.requestError(error)\n })\n this._afterRequest()\n if (this.meta.callRequest) this.dispatch(createAction(this.apiAction, REQUEST))\n }\n\n /* Parse Action payload and meta for request arguments */\n requestArgs (payload, meta, token = null) {\n const {authenticate, location, credentials} = meta\n let {headers = {}, method = 'GET'} = meta\n let {url, body, params} = payload\n let data = body\n\n // Set Headers\n headers = {\n ...this.configDefault.headers,\n ...token && authenticate && this.addTokenToRequest(token),\n ...headers\n }\n\n // For form upload, let it detect content type automatically and add proper string\n if (headers['Content-Type'] === 'multipart/form-data') {\n delete headers['Content-Type']\n }\n\n // Add location to query string or body payload\n if (location && hasLocationActivated) {\n if (method === 'GET') {\n if (params && params.constructor !== Object) {\n throw new Error(`${API} ${location.NAME} expects 'params' to be an Object, got '${typeof params}'`)\n }\n params = {...params, ...this.location}\n } else {\n if (body && body.constructor !== Object) {\n throw new Error(`${API} ${location.NAME} expects 'body' to be an Object, got '${typeof body}'`)\n }\n body = {...body, ...this.location}\n }\n }\n\n // Serialize request body if necessary\n if (body && body.constructor === Object) {\n if (!headers['Content-Type'] || headers['Content-Type'] === 'application/json') {\n data = toJSON(body)\n } else if (headers['Content-Type'] === 'application/x-www-form-urlencoded') {\n data = qs.stringify(body)\n }\n }\n\n // Add parameters to endpoint\n // Note: original payload.url cannot be mutated for resume actions\n payload.endpoint = params ? urlWithParams(url, params) : url\n\n // Update ACTION meta data\n this.meta.headers = headers\n this.meta.request.url = url\n if (params) this.meta.request.params = params\n if (body) this.meta.request.body = body\n\n return [\n payload.endpoint,\n omitBy({\n method,\n [this.isFetch ? 'body' : 'data']: data,\n credentials,\n headers,\n httpsAgent,\n timeout: this.REQUEST_TIMEOUT\n }, isNil) // remove null/undefined\n ]\n }\n\n /* Parse Response from `fetch` */\n responseProcessFetch (response) {\n this._setHeaders(response)\n const {contentType} = this.meta.headers\n if (\n !contentType ||\n startsWith(contentType, 'application/json') ||\n startsWith(contentType, 'text/html') ||\n startsWith(contentType, 'text/javascript')\n ) return response.json()\n return response\n }\n\n /* Parse Response from `axios` */\n responseProcessAxios (response) {\n this._setHeaders(response)\n\n // Deserialize JSON string if 'Content-Type'\n // a) is not specified\n // c) starts with 'text/html'\n // d) starts with 'text/javascript'\n const {contentType} = this.meta.headers\n if (\n response.data.constructor === String &&\n (\n !contentType ||\n startsWith(contentType, 'text/html') ||\n startsWith(contentType, 'text/javascript')\n )\n ) return fromJSON(response.data)\n return response.data\n }\n\n // LOGGING ---------------------------------------------------------------------\n // -----------------------------------------------------------------------------\n\n /* Called just before REQUEST */\n _setTimeout (action) { // Return timeout separately to enable multiple request timeouts\n this._logTime('start')\n return setTimeout(() => {\n // Note: dispatching CANCEL action is for UI only,\n // because if 'fetch' used it will continue to resolve since 'fetch cannot be canceled.\n // So do not add action to pending, because it may resolve after.\n // If using 'axios' with 'http', request will be canceled after given timeout.\n this._logTime('end')\n this.requestTimeout(action)\n }, this.REQUEST_TIMEOUT)\n }\n\n /* Called after RESPONSE */\n _setHeaders (response) {\n let contentType, token\n if (this.isFetch) {\n contentType = response.headers.get('Content-Type')\n token = response.headers.get('Authorization')\n } else {\n const {headers: {'content-type': c, 'authorization': t} = {}} = response\n contentType = c\n token = t\n }\n\n this.meta.headers = {\n contentType,\n ...token && {token: token.replace('Bearer ', '')}\n }\n }\n\n /* Add Performance Stats to API Action Meta data */\n _logTime (type) {\n if (type === 'start') {\n this.meta.request.start = Date.now()\n }\n if (type === 'end') {\n const end = Date.now()\n this.meta.request.end = end\n this.meta.request.latency = end - this.meta.request.start\n }\n }\n\n /* Fire Config Callback (immediately after firing API request, but before response) */\n _afterRequest () {\n if (isFunction(this.afterRequest)) this.afterRequest(this.apiAction)\n }\n\n /* Fire Config Callback (just after dispatching API response action of any kind) */\n _afterResponse (action) {\n if (isFunction(this.afterResponse)) this.afterResponse(action)\n }\n\n /* Fire Config Callback */\n _onError (error) {\n if (isFunction(this.onError)) this.onError(this.apiAction, error)\n }\n\n /* Fire Config Callback */\n _onTimeout () {\n if (isFunction(this.onTimeout)) this.onTimeout(this.apiAction)\n }\n\n // REDUX ACTION DISPATCHES -----------------------------------------------------\n // -----------------------------------------------------------------------------\n\n requestComplete = (response) => {\n this.dispatch(createAction({...this.apiAction, payload: response}, SUCCESS))\n }\n\n requestError (error) {\n if (this.meta.callError === false) return // Terminate early\n this._onError(error)\n let payload = error\n\n /* The request was made and the server responded with a status code that falls out of the range of 2xx */\n if (error.response) {\n this._setHeaders(error.response)\n const {data = {}} = error.response\n switch (data.constructor) {\n case Object:\n payload = data\n break\n case Array:\n payload = {errors: data}\n break\n case String:\n const isHtml = isInString(data, '<!DOCTYPE html>')\n payload = {message: isHtml ? (firstListValue(data.match(/<h1>(.*)<\\/h1>/i)) || '<!DOCTYPE html>...') : data}\n break\n default:\n payload = {message: data}\n }\n\n // Actions Pending Authentication\n if (error.response.status === HTTP_401_UNAUTHORIZED && hasAuthActivated) {\n this.pendingAuth() // -> need to LOGOUT here because it's definitely invalid Token.\n payload.type = LOGOUT // let Sagas handle LOGOUT dispatch\n }\n\n payload.status = error.response.status\n } // eslint-disable-line\n\n /* The request was made but no response was received */\n else if (error.request) {\n // Actions Pending Internet\n if (isInStringAny(error.message, ...NETWORK_ERROR_MESSAGES)) {\n return this.pendingNetwork(error) // Terminate early -> dispatch NETWORK ERROR\n }\n }\n\n /* Dispatch API Call ERROR Action */\n this.dispatch(createAction({...this.apiAction, payload}, ERROR))\n }\n\n requestTimeout (action) {\n this._onTimeout()\n this.meta.callError = false // -> prevent error from dispatching action later\n this.dispatch(createAction(action, TIMEOUT))\n }\n\n pendingAuth () {\n // Store action to resume when LOGIN SUCCESS\n this.dispatch(stateAction(ADD_ACTIONS_PENDING_AUTH, [cloneDeep(this.action)]))\n }\n\n pendingLocation () {\n // Store action to resume when LOCATION UPDATED\n this.dispatch(stateAction(ADD_ACTIONS_PENDING_LOCATION, [cloneDeep(this.action)]))\n }\n\n pendingNetwork (error) {\n // Store action to resume when NETWORK CONNECTED\n this.dispatch(stateAction(ADD_ACTIONS_PENDING_NETWORK, [cloneDeep(this.action)]))\n this.dispatch(stateAction(NETWORK, ERROR, error))\n }\n\n dispatch (action) {\n this.store.dispatch(action)\n this._afterResponse(action)\n }\n}\n\n/**\n * Create API Middleware to Register Actions dispatched using apiAction() from apiActions.js\n *\n * @example:\n api/index.js:\n ```\n import api from './common/api';\n import analytics from './common/analytics';\n ...\n middleware: createApiMiddleware({\n afterRequest: (apiAction) => {}, // -> callback to fire immediately after API request (before response)\n afterResponse: (apiAction) => {}, // -> callback to fire just after dispatching API response action\n onError: (apiAction, error) => {}, // -> do something with error\n onTimeout: (apiAction) => {}, // -> do something when request times out\n REQUEST_TIMEOUT: 20000, // -> set default timeout to be 20 seconds\n useFetch: true, // -> whether to use fetch for requesting API\n addTokenToRequest: (headers, token) => ({\n ...headers,\n Authorization: `Token ${token}`, // -> default Authorization headers is `Bearer ...`\n }),\n })\n ```\n * @param {Object} config - default api configurations\n * @returns {function(*=): function(*): function(*=)}\n */\nexport function createApiMiddleware (config = {}) {\n return store => next => action => {\n if (typeof action[API_CALL] === 'undefined') return next(action)\n const middleware = new ApiMiddleware(action, store, config)\n\n // /* React Native */\n // /* Abort API CALL when APP is not Active */\n // if (AppState.currentState !== 'active') {\n // setTimeout(() => { // try one more time 7 seconds later in case it was transitioning\n // if (AppState.currentState !== 'active') {\n // return log(`${API_CALL} -> Aborted because AppState is`, 'color: Red', AppState.currentState);\n // } else {\n // apiMiddleware.call();\n // }\n // }, 7000);\n // return;\n // }\n\n middleware.call()\n }\n}\n\n/**\n * Add params to URL and return URL with query string added\n *\n * @param {string} url - to add query string to\n * @param {Object|string} params - to turn into query string\n * @return {string} - url with params as query string added\n */\nexport function urlWithParams (url, params) {\n const questionIndex = url.indexOf('?')\n const prefix = (questionIndex > -1 ? (questionIndex === url.length - 1 ? '' : '&') : '?')\n return url + prefix + (params.constructor === Object ? qs.stringify(params) : params)\n}\n\nexport default createApiMiddleware()\n","import { combineReducers, handleActions } from 'ui-modules-pack/redux'\nimport { toUniqueList } from 'ui-utils-pack'\nimport { ADD_ACTIONS_PENDING_NETWORK, CLEAR_ACTIONS_PENDING_NETWORK } from './constants'\nimport initState from './data'\n// import modules, { auth, location } from './modules'\n\n/**\n * ACTION HANDLERS =============================================================\n * Pure Functions Only - business logic to handle actions and update app state\n * =============================================================================\n */\n\n// const authActions = modules.some(({NAME}) => auth.NAME === NAME) && {\n// [ADD_ACTIONS_PENDING_AUTH]: (state, {payload}) => {\n// return {\n// ...state,\n// actionsPendingAuth: toUniqueList([\n// ...state.actionsPendingAuth,\n// ...payload\n// ])\n// }\n// },\n// [CLEAR_ACTIONS_PENDING_AUTH]: (state) => {\n// return {\n// ...state,\n// actionsPendingAuth: [] // Clear all actions\n// }\n// }\n// }\n// const locationActions = modules.some(({NAME}) => location.NAME === NAME) && {\n// [ADD_ACTIONS_PENDING_LOCATION]: (state, {payload}) => {\n// return {\n// ...state,\n// actionsPendingLocation: toUniqueList([\n// ...state.actionsPendingLocation,\n// ...payload\n// ])\n// }\n// },\n// [CLEAR_ACTIONS_PENDING_LOCATION]: (state) => {\n// return {\n// ...state,\n// actionsPendingLocation: [] // Clear all actions\n// }\n// }\n// }\n\n/* Handler */\nconst data = handleActions({\n // ...authActions,\n // ...locationActions,\n [ADD_ACTIONS_PENDING_NETWORK]: (state, {payload}) => {\n return {\n ...state,\n actionsPendingNetwork: toUniqueList([\n ...state.actionsPendingNetwork,\n ...payload\n ])\n }\n },\n [CLEAR_ACTIONS_PENDING_NETWORK]: (state) => {\n return {\n ...state,\n actionsPendingNetwork: [] // Clear all actions\n }\n }\n}, initState.data)\n\n// const moduleHandlers = {}\n// modules.forEach(module => { if (isFunction(module.reducer)) moduleHandlers[module.NAME] = module.reducer })\nconst allHandlers = combineReducers({\n data,\n // ...moduleHandlers\n})\n\nexport default allHandlers\n","import { API } from './constants'\nimport middleware, { createApiMiddleware } from './middleware'\nimport reducer from './reducers'\nimport * as select from './selectors'\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport * from './constants'\nexport * from './actions'\nexport * from './fetch'\nexport * from './utils'\n\n/** See apiMiddleware for more documentation */\nexport { createApiMiddleware }\n\nconst api = {\n NAME: API,\n reducer,\n select,\n middleware\n}\n\nexport default api\n","import { NAME } from './constants'\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\nexport * from 'react-final-form'\nexport * from './constants'\nexport * from './utils'\nexport * from './asInputDateField'\n\nconst form = {\n NAME,\n}\n\nexport default form\n","import { POPUP_ALERT, POPUP_CONFIRM, POPUP_ERROR } from './constants'\n\n/**\n * STATE DATA ==================================================================\n * Initial State or Test Data - used to launch the app initially\n * =============================================================================\n */\n\nconst initState = {\n data: {\n activePopups: [\n // POPUP_ALERT,\n // POPUP_CONFIRM,\n // POPUP_ERROR,\n ],\n [POPUP_ALERT]: {\n items: [\n // {\n // title: 'Alert Popup',\n // content: 'Alert details',\n // closeLabel: 'Ok' // optional\n // }\n ]\n },\n [POPUP_CONFIRM]: {\n items: [\n // {\n // title: 'Confirm Action',\n // content: 'Confirm details',\n // confirmLabel: 'Delete', // optional\n // confirmClass: 'inverted red', // optional button className\n // action: (id) => {}, // dispatch action\n // id: 'argument to pass to action' // optional\n // }\n ]\n },\n [POPUP_ERROR]: {\n items: [\n // {\n // id: '21Fd-213',\n // status: 500,\n // title: 'Internal Server Error',\n // detail: 'Backend server issue'\n // },\n // {\n // id: '87fd-293',\n // status: 401,\n // title: 'Unauthorized',\n // detail: 'Token is required'\n // }\n ]\n }\n },\n ui: {\n loading: false,\n className: ''\n }\n}\n\nexport default initState\n\nexport const testPayload = {\n items: [\n {\n title: 'Alert Popup 1',\n content: 'Alert Text',\n closeLabel: 'Ok' // optional\n },\n // {\n // title: 'Alert Popup 2',\n // content: (\n // <View>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // <Text>Full React Component</Text>\n // </View>\n // )\n // }\n ]\n}\n","import { combineReducers, handleActions, popups, uiLoading } from '../redux'\nimport { POPUP } from './constants'\nimport initState from './data'\n\n/**\n * ACTION HANDLERS =============================================================\n * Pure Functions Only - business logic to handle actions and update app state\n * =============================================================================\n */\n\n/* Data Handler */\nconst dataHandler = handleActions({\n ...popups(POPUP)\n}, initState.data)\n\n/* UI Handler */\nconst uiHandler = handleActions({\n ...uiLoading(POPUP)\n}, initState.ui)\n\nconst allHandlers = combineReducers({\n data: dataHandler,\n ui: uiHandler\n})\n\nexport default allHandlers\n","import {\n API as API,\n HTTP_401_UNAUTHORIZED,\n NETWORK,\n NETWORK_ERROR_MESSAGES,\n REQUEST_TIMEOUT_MESSAGE\n} from 'ui-modules-pack/api/constants'\nimport { isApiActionTypeError, isApiActionTypeTimeout } from 'ui-modules-pack/api/utils'\nimport { stateAction, stateActionType, } from 'ui-modules-pack/redux/actions'\nimport { all, call, put, takeEvery } from 'ui-modules-pack/saga/utils'\nimport { ALERT, ERROR, get, hostname, isInList, LOGOUT, OPEN, SYSTEM, toList, } from 'ui-utils-pack'\nimport { POPUP, POPUP_ALERT, POPUP_ERROR } from './constants'\n\n/**\n * ASYNC TASKS =================================================================\n * Actions Orchestration - for subscribing, managing and dispatching actions.\n * =============================================================================\n */\n\n/* Module's Combined Task to start all sagas at once */\nexport default function * saga () {\n yield all([\n // List someSaga() here\n popupWatch()\n ])\n}\n\n/**\n * WATCH TASKS (Action Subscriptions) ------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\nfunction * popupWatch () {\n yield all([\n takeEvery(stateActionType(SYSTEM, ALERT), popupAlert),\n takeEvery(stateActionType(POPUP, ALERT), popupAlert),\n takeEvery(stateActionType(POPUP, ERROR), popupError),\n takeEvery(isApiActionTypeError, apiErrorFlow),\n takeEvery(isApiActionTypeTimeout, apiTimeoutAlert),\n takeEvery(stateActionType(NETWORK, ERROR), networkErrorAlert)\n ])\n}\n\n/**\n * FLOW TASKS (Action Management) ----------------------------------------------\n * -----------------------------------------------------------------------------\n */\nlet lastApiErrorMessage = null\n\nfunction * apiErrorFlow ({payload = {}, meta: {shouldIgnoreErrorCodes, errorTitle, shouldAlertSameErrorOnce = false}}) {\n const {status, code, type, content, detail, message, msg} = payload\n const errors = toList(payload.errors || payload.error || {status, code, type, content, detail, message, msg})\n const errorMessage = get(errors, '[0].message', get(errors, '[0].details[0].message', payload.message))\n\n // Ignore any given errors\n if (shouldIgnoreErrorCodes && isInList(shouldIgnoreErrorCodes, status)) return\n\n // Ignore 401 Responses\n if (status === HTTP_401_UNAUTHORIZED) return\n\n // Dispatch LOGOUT if Error came from LOGOUT request\n if (type === LOGOUT) yield put(stateAction(API, LOGOUT))\n\n // Popup Error\n if (!shouldAlertSameErrorOnce || lastApiErrorMessage !== errorMessage) {\n lastApiErrorMessage = errorMessage\n yield call(popupError, {payload: {title: errorTitle, errors}})\n }\n}\n\n/**\n * HELPER TASKS (Action Dispatches) --------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\nfunction * apiTimeoutAlert ({payload: {url} = {}}) {\n // Show Popup Alert\n yield call(popupAlert, {\n payload: {\n items: [{\n title: REQUEST_TIMEOUT_MESSAGE,\n content: `API request timed out for ${hostname(url)}, please try again.`\n }]\n }\n })\n}\n\nfunction * networkErrorAlert () {\n // Show Popup Alert\n yield call(popupAlert, {\n payload: {\n items: [{\n title: NETWORK_ERROR_MESSAGES[0],\n content: 'Cannot connect to the internet.'\n }]\n }\n })\n}\n\n/**\n * @param {Array} items - [{title, content}]\n */\nfunction * popupAlert ({payload: {items} = {}}) {\n yield put(stateAction(POPUP, OPEN, {\n activePopup: POPUP_ALERT,\n [POPUP_ALERT]: {\n items\n }\n }))\n}\n\nfunction * popupError ({payload: {title = 'Error', errors, items} = {}}) {\n yield put(stateAction(POPUP, OPEN, {\n activePopup: POPUP_ERROR,\n [POPUP_ERROR]: {\n title,\n items: toList(errors || items)\n }\n }))\n}\n","import { POPUP } from './constants'\nimport reducer from './reducers'\nimport saga from './sagas'\nimport select from './selectors'\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport * from './constants'\nexport * from './actions'\nexport {\n POPUP,\n select,\n}\n\nconst popup = {\n NAME: POPUP,\n reducer,\n saga,\n select,\n}\n\nexport default popup\n","import { NAME } from './constants'\nimport middleware from './middleware'\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport * from './utils'\nexport {\n middleware\n}\n\nconst saga = {\n NAME,\n hasEnabledSaga: true, // for createStore() to check\n middleware,\n}\n\nexport default saga\n","/**\n * CONSTANT VARIABLES ==========================================================\n * =============================================================================\n */\n\nexport const NAME = 'SAGA' // Namespace this module\n","import { applyMiddleware, combineReducers, compose, createStore as reduxCreateStore } from 'redux'\nimport { ignoreActions } from 'redux-ignore'\nimport { all } from 'redux-saga/effects'\nimport { __DEV__, Active, get, hasListValue, hasObjectValue, HYDRATE, isFunction, RESET, toList } from 'ui-utils-pack'\nimport saga from '../saga'\n\n/**\n * STORE CREATION ==============================================================\n * =============================================================================\n */\n\n/**\n * Creates the Redux store for the app\n * @Note:\n * - redux action execution takes 0.5 microseconds by default\n * - every new reducer adds about 0.45 microseconds to action execution\n * - every new saga adds about 0.75 microseconds to action execution\n * => optimize performance with `redux-ignore` library to filter actions\n *\n * @param {Object[]|Object} modules - list of modules to activate {NAME, middleware, reducer, saga}\n * @param {Boolean} [ignore] - whether to filter reducers using `ignoreActions` from `redux-ignore` library, default is false\n * @returns {Object} - redux store\n */\nexport default function createStore (modules = [], {ignore} = {}) {\n modules = toList(modules)\n if (!hasListValue(modules)) return reduxCreateStore(state => state)\n\n /* Register Middleware */\n const middlewares = modules.filter(({middleware}) => isFunction(middleware)).map(module => module.middleware)\n let composeEnhancers = compose\n if (typeof window !== 'undefined') { // need to put this check on separate lite because of Next.js\n if (__DEV__) {\n composeEnhancers = get(window, '__REDUX_DEVTOOLS_EXTENSION_COMPOSE__', compose)\n }\n }\n const allMiddleware = composeEnhancers(applyMiddleware(...middlewares))\n\n /* Register Action Handlers */\n let handlers = {}\n modules.forEach(({NAME, ACTION_TYPE, reducer}) => {\n if (!NAME || !isFunction(reducer)) return\n handlers[NAME] = ignore ? ignoreActions(reducer, ({type}) => (!type || type.indexOf(ACTION_TYPE || NAME) !== 0)) : reducer\n })\n const rootReducer = hasObjectValue(handlers) ? combineReducers(handlers) : (state => state)\n const allHandlers = (state, action) => {\n if (RESET === action.type) state = undefined // reset App to initial state\n if (HYDRATE === action.type) return action.payload // set App to given state\n return Active.state = rootReducer(state, action)\n }\n\n /* Register Store */\n const store = reduxCreateStore(allHandlers, allMiddleware)\n\n /* Register Async Tasks when Enabled */\n if (modules.find(({hasEnabledSaga}) => hasEnabledSaga)) {\n saga.middleware.run(function * () {\n yield all(modules.filter(({saga}) => isFunction(saga)).map(module => module.saga()))\n })\n }\n\n return store\n}\n","/**\n * STATE DATA ==================================================================\n * Initial State or Test Data - used to launch the app initially\n * =============================================================================\n */\nconst initState = {\n files: [],\n fileType: undefined,\n loading: false\n}\n\nexport default initState\n","import { UPLOAD } from './constants'\nimport reducer from './reducers'\nimport select from './selectors'\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport * from './constants'\nconst upload = {\n NAME: UPLOAD,\n reducer,\n select,\n}\n\nexport default upload\n","import { handleActions, stateActionType, uiLoading } from 'ui-modules-pack/redux'\nimport { SET } from 'ui-utils-pack'\nimport { UPLOAD } from './constants'\nimport initState from './data'\n\n/**\n * ACTION HANDLERS =============================================================\n * Pure Functions Only - business logic to handle actions and update app state\n * =============================================================================\n */\n\nexport default handleActions({\n [stateActionType(UPLOAD, SET)]: (state, {payload}) => ({...state, ...payload}),\n ...uiLoading(UPLOAD)\n}, initState)\n","import { Active, GET, performStorage } from 'ui-utils-pack'\nimport { USER } from './constants'\n\n/**\n * STATE DATA ==================================================================\n * Initial State or Test Data - used to launch the app initially\n * =============================================================================\n */\n\nconst initState = {\n self: Active.user = {\n // @Note: in backend, performStorage returns promise, and resolves to nothing,\n // but it does not matter, since only frontend needs to retrieve from localStorage.\n ...(typeof window === 'undefined') ? {} : performStorage(GET, USER),\n },\n loading: false\n}\n\nexport default initState\n","import { handleActions, stateActionType, uiLoading } from 'ui-modules-pack/redux'\nimport { Active, performStorage, RESET, SET } from 'ui-utils-pack'\nimport { SELF, USER } from './constants'\nimport initState from './data'\n\n/**\n * ACTION HANDLERS =============================================================\n * Pure Functions Only - business logic to handle actions and update app state\n * =============================================================================\n */\n\n/* Data Handler */\nexport default handleActions({\n [stateActionType(USER, SET)]: (state, {payload}) => ({...state, ...payload}),\n [stateActionType(SELF, SET)]: (state, {payload}) => {\n const data = {\n ...state,\n self: Active.user = {...state.self, ...payload}\n }\n performStorage(SET, USER, data.self)\n return data\n },\n [stateActionType(SELF, RESET)]: (state, {payload}) => {\n const data = {\n ...state, // always keep `lastLogin` for checking if user is new or returning visitor\n self: Active.user = {lastLogin: state.self.lastLogin, ...payload},\n }\n performStorage(SET, USER, data.self)\n return data\n },\n ...uiLoading(USER)\n}, initState)\n","import api from 'ui-modules-pack/api'\nimport form from 'ui-modules-pack/form'\nimport popup from 'ui-modules-pack/popup'\nimport redux, { createStore } from 'ui-modules-pack/redux'\nimport router from 'ui-modules-pack/router/browser'\nimport saga from 'ui-modules-pack/saga'\nimport settings from 'ui-modules-pack/settings'\nimport upload from 'ui-modules-pack/upload'\nimport user from 'ui-modules-pack/user'\nimport { Active } from 'ui-utils-pack'\n\n/**\n * STORE CREATION ==============================================================\n * =============================================================================\n */\n\nconst modulesActivated = [\n redux,\n saga,\n api,\n router,\n form,\n popup,\n settings,\n upload,\n user,\n]\nActive.store = createStore(modulesActivated)\nActive.createStore = () => createStore(modulesActivated)\nexport default Active.store\n","import { USER } from './constants'\nimport reducer from './reducers'\nimport select from './selectors'\n\n/**\n * EXPORTS =====================================================================\n * Modules' Exposing API - to enable consistent and maintainable app integration\n * =============================================================================\n */\n\nexport * from './constants'\nexport * from './actions'\nexport * from './definitions'\nexport * from './logic'\nexport {\n select,\n}\n\nconst user = {\n NAME: USER,\n reducer,\n select,\n}\n\nexport default user\n","import UIRender from 'core/src/pages/main/rules'\nimport WebStudioPage from 'core/src/pages/main/webstudio'\nimport Redux from 'ui-modules-pack/redux'\nimport React, { PureComponent } from 'react'\nimport { render } from 'react-dom'\nimport { syncState } from 'ui-react-pack'\nimport AppElement from './AppElement'\nimport store from './store'\n\n/**\n * ROOT APP VIEW ===============================================================\n * =============================================================================\n */\n\n/**\n * React Component Wrapper to enable Multiple React instances in HTML DOM from Remote Component\n */\nclass DOMProxy extends PureComponent {\n state = {\n ...this.props\n }\n\n UNSAFE_componentWillReceiveProps (nextProps, nextContext) {\n syncState(this.props, nextProps, this)\n }\n\n componentDidMount () {\n const {onMount} = this.props\n onMount && onMount(this) // pass this Class instance control to remote Component\n }\n\n render () {\n const {onMount, dataUrl, metaUrl, ...props} = this.state\n return (dataUrl && metaUrl)\n ? <WebStudioPage dataUrl={dataUrl} metaUrl={metaUrl} {...props}/>\n : <UIRender {...props}/>\n }\n}\n\n// Setup global method for UIRender.tsx to use for mounting to the DOM.\nif (typeof window === 'undefined') {\n console.error(`window object is required for UIRender!`)\n} else {\n window._dataFetchMethod = 'GET'\n window._mountUIRender = ({id, ...props}) => render(\n <Redux.Provider store={store}>\n <AppElement>\n <DOMProxy {...props}/>\n </AppElement>\n </Redux.Provider>,\n document.getElementById(id)\n )\n}\n","/**\n * Set Cursor to given type\n * @see: https://www.w3schools.com/cssref/tryit.asp?filename=trycss_cursor\n * @param {String} name - one of cursor strings\n */\n\nexport function cursorSet (name) {\n if (typeof window !== 'undefined') {\n document.body.style.cursor = null // Safari fix\n document.body.style.cursor = name\n }\n}\n\n/**\n * Reset Cursor to default state\n */\nexport function cursorUnset () {\n if (typeof window !== 'undefined') document.body.style.cursor = null\n}\n\n/**\n * Create Inline SVG data for use as CSS value\n * @note: the `#` string inside svg data will be converted to `%23`\n *\n * @param {String} svgString - svg file data as base64 string\n * @param {Number} [x] - coordinate of the hot spot, default is 0\n * @param {Number} [y] - coordinate of the hot spot, default is 0\n * @return {string} url - as inline css value (example: for use as cursor)\n */\nexport function inlineSvg (svgString, x = 0, y = 0) {\n return `url('data:image/svg+xml;utf8,${svgString.replace(/#/g, '%23')}') ${x} ${y}, auto`\n}\n\n/**\n * Get Pointer Event Position Offset from Target Element\n * @param {Event|PointerEvent|MouseEvent} event - pointer event\n * @param {Object<left, top>} rectangle - from event.target.getBoundingClientRect()\n * @return {{x: number, y: number}} offset - coordinates relative to event.target\n */\nexport function offsetFrom (event, rectangle) {\n // @Note: there is a difference between rectangle.left vs. rectangle.x\n // @see: https://stackoverflow.com/questions/27169534/in-google-chrome-getboundingclientrect-x-is-undefined/29741969\n return {x: event.clientX - rectangle.left, y: event.clientY - rectangle.top}\n}\n\n/**\n * Sync React Component state with new props\n * @example:\n * UNSAFE_componentWillReceiveProps (next, _) {\n * const {id} = this.props\n * if (syncState({id}, next, this)) return\n * }\n *\n * @param {Object} current - props\n * @param {Object} next - props\n * @param {Object|Class|Component|PureComponent} instance - React component\n * @param {Function} [callback] - after state update\n * @return {Boolean} true - if state was synced\n */\nexport function syncState (current, next, instance, callback, preCallback) {\n const update = {}\n for (const key in current) {\n if (next[key] != null && next[key] !== current[key]) update[key] = next[key]\n }\n if (Object.keys(update).length) {\n if (preCallback) preCallback(update)\n instance.setState(update, callback)\n return true\n }\n}\n","import { get } from 'lodash-es'\nimport now from 'performance-now'\nimport { __BACKEND__, __CLIENT__, __DEV__, __TEST__, Active } from './_envs.js'\nimport { WARN } from './constants.js'\nimport { isFunction } from './function.js'\nimport { formatNumber } from './number.js'\nimport { isInString } from './string.js'\n\n/**\n * LOGGING FUNCTIONS ===========================================================\n * =============================================================================\n */\n\n/**\n * Benchmark provided function with optional logging of its output\n *\n * @example\n * bench({type: SET, loop: 10000}, performStorage, SET, 'id', [13])\n * >>> performStorage() ▶ SET took 1,912.790 ms for 10,000 iterations, 0.191 ms each\n *\n * @param {string} [type] - name of benchmark type (i.e. `selector`, `query`, etc.)\n * @param {Function|string|boolean} [log] - wrapper function or property path of the result to log,\n * use `true` to log result itself\n * @param {string} [name] - the benched function name\n * @param {number} [loop] - number of iterations to run the function\n * @param {Function} func - to benchmark\n * @param {*} args - arguments to pass to the function\n * @return {*} - result as processed by given `log` argument, if any\n */\nexport function bench ({type, log, name, loop}, func, ...args) {\n let result = []\n const start = now()\n if (loop) {\n for (let i = 0; i < loop; i++) {\n result.push(func(...args))\n }\n } else {\n result = func(...args)\n }\n const duration = now() - start\n\n result = (log != null) ? (isFunction(log) ? log(result) : get(result, log, result)) : null\n\n logBenchmark({\n name: name || func.name,\n type,\n duration,\n loop,\n result,\n })\n\n return result\n}\n\nbench.skip = new Function('') // eslint-disable-line\n\n/**\n * Asynchronous Benchmark Version\n * @Note: see bench() method for documentation\n */\nexport async function benchA ({type, log, name, loop}, func, ...args) {\n let result = []\n const start = now()\n if (loop) {\n for (let i = 0; i < loop; i++) {\n result.push(await func(...args))\n }\n } else {\n result = await func(...args)\n }\n const duration = now() - start\n\n result = (log != null) ? (isFunction(log) ? log(result) : get(result, log, result)) : null\n\n logBenchmark({\n name: name || func.name,\n type,\n duration,\n loop,\n result,\n })\n\n return result\n}\n\nbenchA.skip = new Function('') // eslint-disable-line\n\n/**\n * Console log proxy method which provides a way to prepend the log with the first param\n * and also pass colors via the ...args array. Only runs in dev.\n *\n * @requires __DEV__\n * @param {string} first - string to prepend to the log message\n * @param {*} [args] - optionally pass additional arguments to log\n * @return void\n */\nexport function log (first, ...args) {\n if (!__DEV__) return\n // Client or no Chalk logger\n if (__CLIENT__ || (!Active.log || !Active.log.keyword)) {\n console.log((typeof first === 'string' && isInString(args[0] || '', 'color:')) ? `%c${first}` : first, ...args)\n }\n\n // Backend with Chalk logger\n else {\n const color = isInString(args[0] || '', 'color:') ? args.shift().split(': ')[1].toLowerCase() : ''\n console.log((typeof first === 'string' && color) ? Active.log.keyword(color)(first) : first, ...args)\n }\n}\n\n/**\n * Console log proxy method to show Benchmark stats\n *\n * @param {string} name - the calling function name\n * @param {string} [type] - the calling function type\n * @param {number} duration - milliseconds it took to execute\n * @param {number} [loop] - execution iterations\n * @param {*} result - execution result\n * @return void\n */\nexport function logBenchmark ({name, type = '', duration, loop = null, result = null}) {\n const task = `\\n${name}()`\n const took = `▶ ${type} took`\n const ms = `${formatNumber(duration, {decimals: 3})} ms`\n const iteration = !loop ? '' : `for ${formatNumber(loop)} iterations, `\n const time = `${formatNumber(duration / loop, {decimals: 3})} ms`\n const each = 'each'\n const output = (result != null) ? ['\\n>>>', result] : []\n if (Active.log) {\n console.log(\n Active.log.green(task),\n Active.log.keyword('cyan')(took),\n Active.log.keyword('orange')(ms),\n Active.log.keyword('cyan')(iteration),\n Active.log.keyword('orange')(time),\n each,\n ...output,\n )\n } else {\n console.log(\n `%c${task} %c${took} %c${ms} %c${iteration} %c${time}`,\n 'color: Green', 'color: Teal', 'color: Orange', 'color: Teal', 'color: Orange', 'each',\n ...output\n )\n }\n}\n\n/**\n * Console log proxy for Component props mapping from State with standardised colors and format.\n * Only runs in dev.\n *\n * @requires __DEV__\n * @param {string} NAME - View Template's name\n * @param {*} value - Mapping result to log\n * @return void\n */\nexport function logMapping (NAME, value) {\n if (!__DEV__) return\n log(`MAPPING -> ${NAME}`, 'color: Green', __CLIENT__ ? value : '')\n}\n\n/**\n * Console log proxy for memoized Selectors with standardised colors and format.\n * Only runs in dev.\n *\n * @requires __DEV__\n * @param {string} NAME - Selector function name\n * @param {*} value - Selector value to log\n * @param {*} [args] - other arguments to pass\n * @return void\n */\nexport function logSelector (NAME, value, ...args) {\n if (!__DEV__) return\n log(`SELECT -> ${NAME}`, 'color: Orange', ...args, __CLIENT__ ? value : '')\n}\n\n/**\n * Console log proxy for non-cached state Queries with standardised colors and format.\n * Only runs in dev.\n *\n * @requires __DEV__\n * @param {string} NAME - Query function name\n * @param {*} value - value to log\n * @return void\n */\nexport function logQuery (NAME, value) {\n if (!__DEV__) return\n log(`QUERY -> ${NAME}`, 'color: DarkOrange', __CLIENT__ ? value : '')\n}\n\n/**\n * Console log proxy for async Tasks with standardised colors and format.\n * Only runs in dev.\n *\n * @requires __DEV__\n * @param {string} NAME - Task function name\n * @param {*} value - Task value to log\n * @return void\n */\nexport function logTask (NAME, value = '') {\n if (!__DEV__) return\n log(`TASK -> ${NAME}`, 'color: BlueViolet', __CLIENT__ ? value : '')\n}\n\n/**\n * Console log proxy for Tests with standardised colors and format.\n * Only runs in test.\n *\n * @requires __TEST__\n * @return void\n */\nexport function logTest (...args) {\n if (!__TEST__) return\n console.log(...args)\n}\n\n/**\n * Clear Console Log\n */\nexport function logClear () {\n if (!__DEV__) return\n if (typeof process !== 'undefined') {\n process.stdout.write('\\u001b[2J')\n process.stdout.write('\\u001b[1;1H')\n process.stdout.write('\\u001b[3J')\n return\n }\n console.clear()\n}\n\n/**\n * Console warn proxy method. Only runs in dev.\n *\n * @requires __DEV__\n * @param {*} args - the arguments to log\n * @return void\n */\nexport function warn (...args) {\n // eslint-disable-next-line no-console\n if (!__DEV__) return\n if (__CLIENT__) {\n console.warn('✋ ', ...args)\n } else {\n console.warn('✋ ', ...args)\n }\n}\n\n/**\n * Ensure file is loaded in correct platform\n */\nexport function assertFrontend () {\n if (__BACKEND__ && !__TEST__) throw new Error(`${WARN} WARNING! Backend file loaded in Frontend!!!`)\n}\n\n/**\n * Ensure file is loaded in correct platform\n */\nexport function assertBackend () {\n if (__CLIENT__ && !__TEST__) throw new Error(`${WARN} WARNING! Frontend file loaded in Backend!!!`)\n}\n","import { throttle as _throttle } from 'lodash-es'\nimport { __DEV__ } from './_envs.js'\nimport { isInListAny } from './array.js'\nimport { NOW, ONE_DAY, ONE_HOUR, TIME_DURATION_INSTANT } from './constants.js'\nimport { randomNumberInRange } from './number.js'\nimport { randomString } from './string.js'\n\n/**\n * FUNCTION HELPERS ============================================================\n * =============================================================================\n */\n\n/**\n * Checks if passed argument is of type function.\n *\n * @param {*} func - the thing we are checking for being a function\n * @return {boolean}\n */\nexport function isFunction (func) {\n\t// When 'GeneratorFunction' is defined globally, use it instead of isFunction.Generator\n\treturn !!func && (\n\t\tfunc.constructor === Function ||\n\t\tfunc.constructor === isFunction.Async ||\n\t\tfunc.constructor === isFunction.Generator\n\t)\n}\n\nisFunction.Generator = (function * () {}).constructor\nisFunction.Async = (async () => {}).constructor\n\n/**\n * Check if given function is Asynchronous\n *\n * @param {Function} func - to check\n * @returns {Boolean} true - if it is\n */\nexport function isAsync (func) {\n\treturn func.constructor.name === 'AsyncFunction'\n}\n\n/**\n * Check for a Valid Enumerable Value and Throw Error If It's Not\n *\n * @param {Array} enums - valid enum values\n * @param {*} value - variable to check against enum\n * @param {Function} [self] - optional, the caller function's ${this} context\n */\nexport function enumCheck (enums, value, self) {\n\tif (!__DEV__) return\n\n\tif (!isInListAny(enums, value)) {\n\t\tconst callerFunctionName = isFunction(self) ? self.name : 'function'\n\t\tthrow new TypeError(`${callerFunctionName} expected @value to be one of ${enums}, but got '${value}'`,)\n\t}\n}\n\n/**\n * Check if values provided do match, using given comparison operator\n *\n * @param {string} type - comparison operator (i.e. enum(['AND', 'OR']))\n * @return {function<Array>} that takes boolean arguments and return true or false based on match type\n */\nexport function matchByType (type) {\n\tenumCheck(['AND', 'OR'], type, this)\n\treturn {\n\t\t'AND': (...args) => !args.some(v => !v),\n\t\t'OR': (...args) => args.some(v => v),\n\t}[type]\n}\n\n/**\n * Decorates a class method so that it is debounced by the specified duration\n * @Note:\n * - the method will have to bind manually, and cannot be defined as class property arrow function\n * - see `debounce()` method for docs\n *\n * @example:\n * class Search extends Component {\n * @debounceBy(200)\n * handleSearch () {...}\n * }\n *\n * @param {Number} [duration] - milliseconds to delay\n * @param {Object} [options] - for debounce\n * @returns {Function} decorator - for class method\n */\nexport function debounceBy (duration, options) {\n\treturn function innerDecorator (target, key, descriptor) {\n\t\treturn {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: descriptor.enumerable,\n\t\t\tget: function getter () {\n\t\t\t\t// Attach this function to the instance (not the class)\n\t\t\t\tObject.defineProperty(this, key, {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t\tvalue: debounce(descriptor.value, duration, options),\n\t\t\t\t})\n\t\t\t\treturn this[key]\n\t\t\t},\n\t\t}\n\t}\n}\n\n/**\n * Decorates a class method so that it is throttled by the specified duration\n * @Note:\n * - the method will have to bind manually, and cannot be defined as class property arrow function\n * - see `throttle()` method for docs\n *\n * @example:\n * class Search extends Component {\n * @throttleBy(200)\n * handleSearch () {...}\n * }\n *\n * @param {Number} [duration] - milliseconds to delay\n * @param {Object} [options] - for throttle\n * @returns {Function} decorator - for class method\n */\nexport function throttleBy (duration = TIME_DURATION_INSTANT, options) {\n\treturn function innerDecorator (target, key, descriptor) {\n\t\treturn {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: descriptor.enumerable,\n\t\t\tget: function getter () {\n\t\t\t\t// Attach this function to the instance (not the class)\n\t\t\t\tObject.defineProperty(this, key, {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: descriptor.enumerable,\n\t\t\t\t\tvalue: throttle(descriptor.value, duration, options),\n\t\t\t\t})\n\t\t\t\treturn this[key]\n\t\t\t},\n\t\t}\n\t}\n}\n\n/**\n * Delay given Function execution\n *\n * @param {Function} func - to call\n * @param {Number} [wait] - milliseconds to delay\n * @param {Boolean} [leading] - whether to execute the Function immediately first\n * @returns {function(...[*]=)} - debounced\n */\nexport function debounce (func, wait = TIME_DURATION_INSTANT, { leading } = {}) {\n\tlet timeout\n\treturn function() {\n\t\tconst self = this\n\t\tconst args = arguments\n\n\t\tfunction later () {\n\t\t\ttimeout = null\n\t\t\tfunc.apply(self, args)\n\t\t}\n\n\t\tconst callNow = leading && !timeout\n\t\tclearTimeout(timeout)\n\t\ttimeout = setTimeout(later, wait)\n\t\tif (callNow) {\n\t\t\tclearTimeout(timeout)\n\t\t\tfunc.apply(self, args)\n\t\t}\n\t}\n}\n\n/**\n * Mock Data for Testing\n */\nexport const testMock = {\n\ti: 0,\n\tdayCount: 0,\n\thourCount: 0,\n\n\t/* Get Decrementing Day From Now */\n\tget dayDecrementing () {\n\t\treturn NOW - ONE_DAY * this.dayCount++\n\t},\n\n\t/* Get Decrementing Hour From Now */\n\tget hourDecrementing () {\n\t\treturn NOW - ONE_HOUR * this.hourCount++\n\t},\n\n\tget id () {\n\t\treturn randomString(7, 7)\n\t},\n\n\tget index () {\n\t\treturn this.i++\n\t},\n\n\tget number () {\n\t\treturn randomNumberInRange(1, 1000000)\n\t},\n}\n\n/**\n * LODASH CLONES ---------------------------------------------------------------\n * -----------------------------------------------------------------------------\n */\n\n/**\n * A wrapper around the lodash's throttle function.\n * @see {@link https://lodash.com/docs/4.17.2#throttle) for further information.\n * @param {Function} func - to call\n * @param {Number} [wait] - milliseconds to delay\n * @param {Object} [options]\n * @returns {function(...[*]=)} - throttled\n */\nexport function throttle (func, wait = TIME_DURATION_INSTANT, options = {}) {\n\treturn _throttle(func, wait, options)\n}\n","/**\n * COMMON ACTION CONSTANTS =====================================================\n * =============================================================================\n */\nexport const SEPARATOR = ' -> ' // ACTION type separator string\nexport const RESULT_SEPARATOR = '_' // RESULT type separator string\nexport const SYSTEM = 'SYSTEM' // Internal app action subject\n\n/* CRUD Actions */\nexport const GET = 'GET' \t\t// Retrieving data\nexport const CREATE = 'CREATE' // Posting new data to backend\nexport const UPDATE = 'UPDATE' // For saving remote API data (e.g. syncing with backend)\nexport const DELETE = 'DELETE' // Destroying data from backend\nexport const LIST = 'LIST' \t// Retrieving list of data\n\n/* State Only Actions */\nexport const SET = 'SET' \t\t// For saving non-API data in state\nexport const RESET = 'RESET'\nexport const REFRESH = 'REFRESH'\nexport const HYDRATE = 'HYDRATE' // For Hydrating Redux Store\nexport const LOGIN = 'LOGIN'\nexport const LOGOUT = 'LOGOUT'\nexport const LOAD = 'LOAD'\nexport const ALERT = 'ALERT' \t// For broadcasting a resource\nexport const SAVE = 'SAVE' \t// For triggering persistence of a resource\nexport const EDIT = 'EDIT'\nexport const OPEN = 'OPEN'\nexport const CLOSE = 'CLOSE'\nexport const SEARCH = 'SEARCH' // For searching for a resource\nexport const SUBMIT = 'SUBMIT' // For triggering submission of a resource\nexport const ADD = 'ADD' \t\t// For adding a resource\nexport const APPLY = 'APPLY' // For administering a resource\nexport const CHANGE = 'CHANGE' // For changing state\nexport const REMOVE = 'REMOVE' // For removing state\nexport const REPORT = 'REPORT' \t\t// For broadcasting a resource\nexport const PREFETCH = 'PREFETCH' // For pre-loading resources\nexport const PRESET = 'PRESET'\t\t\t\t\t// For preparing a resource\nexport const PRE_ADD = 'PRE_ADD'\t\t\t\t// For preparing a resource\nexport const PRE_REMOVE = 'PRE_REMOVE'\t// For preparing a resource\nexport const SELECT = 'SELECT' \t\t// For picking a resource\nexport const TOGGLE = 'TOGGLE' \t\t// For switching between states\n\n/* App Specific Actions */\n\n/* Action Result Types */\nexport const START = 'START'\nexport const CANCEL = 'CANCEL'\nexport const FINISH = 'FINISH'\nexport const RECEIVED = 'RECEIVED'\nexport const VOID = 'VOID' \t// No response at all\n\n/* Socket Actions */\nexport const SEND = 'SEND'\nexport const SUBSCRIBE = 'SUBSCRIBE'\nexport const UNSUBSCRIBE = 'UNSUBSCRIBE'\n\n/* Socket Network Action Result Types */\nexport const CONNECTED = 'CONNECTED'\nexport const DISCONNECTED = 'DISCONNECTED'\nexport const MESSAGE = 'MESSAGE'\n\n/* API Network Action Result Types */\nexport const REQUEST = 'REQUEST'\nexport const SUCCESS = 'SUCCESS'\nexport const ERROR = 'ERROR'\nexport const TIMEOUT = 'TIMEOUT'\n\nexport const ALL_ACTIONS = [\n\tMESSAGE,\n\tGET,\n\tCREATE,\n\tUPDATE,\n\tDELETE,\n\tLIST,\n\tSET,\n\tRESET,\n\tREFRESH,\n\tHYDRATE,\n\tEDIT,\n\tLOGIN,\n\tLOGOUT,\n\tLOAD,\n\tSAVE,\n\tCLOSE,\n\tOPEN,\n\tSUBMIT,\n\tSEARCH,\n\tADD,\n\tAPPLY,\n\tALERT,\n\tCHANGE,\n\tREMOVE,\n\tREPORT,\n\tPREFETCH,\n\tPRESET,\n\tPRE_ADD,\n\tPRE_REMOVE,\n\tSELECT,\n\tTOGGLE,\n]\n\nexport const ALL_RESULTS = [\n\tSTART,\n\tCANCEL,\n\tFINISH,\n\tREQUEST,\n\tSUCCESS,\n\tERROR,\n\tTIMEOUT,\n\tRECEIVED,\n\tVOID,\n]\n\n/* Key Codes */\nexport const KEY = {\n UNDEFINED: -1,\n LEFT_CLICK: 0,\n MIDDLE_CLICK: 1,\n RIGHT_CLICK: 2,\n\n // @see: https://github.com/kabirbaidhya/keycode-js/blob/master/dist/keycode.cjs.js\n CANCEL: 3,\n HELP: 6,\n BACK_SPACE: 8,\n TAB: 9,\n CLEAR: 12,\n RETURN: 13,\n SHIFT: 16,\n CONTROL: 17,\n ALT: 18,\n PAUSE: 19,\n CAPS_LOCK: 20,\n ESCAPE: 27,\n SPACE: 32,\n PAGE_UP: 33,\n PAGE_DOWN: 34,\n END: 35,\n HOME: 36,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n PRINTSCREEN: 44,\n INSERT: 45,\n DELETE: 46,\n LEFT_CMD: 91,\n RIGHT_CMD: 92,\n\n // Alphanumeric\n _0: 48,\n _1: 49,\n _2: 50,\n _3: 51,\n _4: 52,\n _5: 53,\n _6: 54,\n _7: 55,\n _8: 56,\n _9: 57,\n A: 65,\n B: 66,\n C: 67,\n D: 68,\n E: 69,\n F: 70,\n G: 71,\n H: 72,\n I: 73,\n J: 74,\n K: 75,\n L: 76,\n M: 77,\n N: 78,\n O: 79,\n P: 80,\n Q: 81,\n R: 82,\n S: 83,\n T: 84,\n U: 85,\n V: 86,\n W: 87,\n X: 88,\n Y: 89,\n Z: 90,\n}\n\n/* Distance */\nexport const ONE_MM = 1\nexport const ONE_CM = 10 * ONE_MM\nexport const ONE_METER = 1000 * ONE_MM\nexport const ONE_KM = 1000 * ONE_METER\nexport const ONE_INCH = 25.4 * ONE_MM\nexport const ONE_FOOT = 304.8 * ONE_MM\nexport const ONE_YARD = 914.4 * ONE_MM\nexport const ONE_MILE = 1609344 * ONE_MM\n\n/* Formats */\nexport const FORMAT_TIME = 'YYYY-MM-DD hh:mm:ss'\nexport const FORMAT_TIME_FOR_HUMAN = 'ddd, D MMM - hh:mm a'\nexport const FORMAT_DATE = 'DD.MM.YYYY'\nexport const FORMAT_DATE_ISO = 'YYYY-MM-DD'\nexport const FORMAT_HH_MM = 'HH[:]mm'\nexport const FORMAT_DD_MMM = 'D MMM'\nexport const FORMAT_DD_MMM_YYYY = 'D MMM, YYYY'\nexport const FORMAT_MMM_YYYY = 'MMM YYYY'\n\n/* Placeholders */\nexport const ID = '{ID}'\n\n/* Size */\nexport const SIZE_KB = 1024\nexport const SIZE_MB = SIZE_KB * 1024\nexport const SIZE_MB_2 = SIZE_MB * 2\nexport const SIZE_MB_4 = SIZE_MB * 4\nexport const SIZE_MB_5 = SIZE_MB * 5\nexport const SIZE_MB_6 = SIZE_MB * 6\nexport const SIZE_MB_8 = SIZE_MB * 8\nexport const SIZE_MB_10 = SIZE_MB * 10\nexport const SIZE_MB_16 = SIZE_MB * 16\n\n/* Storage Keys */\nexport const UI_STATE = 'UI_STATE'\n\n/* Time */\nexport const TIME_DURATION_INSTANT = 200\nexport const NOW = Date.now()\nexport const ONE_MILLISECOND = 1\nexport const HALF_SECOND = 500\nexport const HALF_MINUTE = HALF_SECOND * 60\nexport const HALF_HOUR = HALF_MINUTE * 60\nexport const ONE_SECOND = 1000\nexport const ONE_MINUTE = ONE_SECOND * 60\nexport const ONE_HALF_SECONDS = 1500\nexport const ONE_HOUR = ONE_MINUTE * 60\nexport const ONE_DAY = ONE_HOUR * 24\nexport const ONE_WEEK = ONE_DAY * 7\nexport const ONE_MONTH = ONE_DAY * 30\nexport const ONE_YEAR = ONE_DAY * 365\nexport const TWO_SECONDS = ONE_SECOND * 2\nexport const TWO_MINUTES = ONE_MINUTE * 2\nexport const TWO_DAYS = ONE_DAY * 2\nexport const TWO_WEEKS = ONE_WEEK * 2\nexport const TWO_MONTHS = ONE_MONTH * 2\nexport const THREE_SECONDS = ONE_SECOND * 3\nexport const THREE_MINUTES = ONE_MINUTE * 3\nexport const FIVE_SECONDS = ONE_SECOND * 5\nexport const FIVE_MINUTES = ONE_MINUTE * 5\nexport const FIVE_HOURS = ONE_HOUR * 5\nexport const SEVEN_SECONDS = ONE_SECOND * 7\nexport const SEVEN_MINUTES = ONE_MINUTE * 7\nexport const TEN_SECONDS = ONE_SECOND * 10\nexport const TEN_MINUTES = ONE_MINUTE * 10\nexport const THIRTY_SECONDS = ONE_SECOND * 30\nexport const THIRTY_MINUTES = ONE_MINUTE * 30\nexport const FIFTEEN_MINUTES = ONE_MINUTE * 15\nexport const FORTY_SECONDS = ONE_SECOND * 40\nexport const HUNDRED_SECONDS = ONE_SECOND * 100\nexport const HUNDRED_MINUTES = ONE_MINUTE * 100\n\n/* Mappings */\nexport const CRYPTO = { // mapped for cryptoSign() and cryptoHash()\n\tHMAC_SHA256: 'sha256',\n\tHMAC_SHA384: 'sha384',\n\tHMAC_SHA512: 'sha512',\n\tMD5: 'md5',\n}\n\n/**\n * Language Definition\n * @see: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\n * @note: sync with Google standard https://developers.google.com/maps/faq#languagesupport\n * - Correct syntax for <html lang=\"zh-CN\"> uses hyphen, including Google API,\n *\t\thowever, database tables and many backends only accept undersacore.\n *\t\t=> Use _ for better compatibility between systems.\n */\nexport const LANGUAGE = {\n\tENGLISH: {_: 'en', lang: 'English', 'en': 'English'},\n\tRUSSIAN: {_: 'ru', lang: 'Русский', 'en': 'Russian'},\n\tCHINESE: {_: 'zh_CN', lang: '中文 (中国)', 'en': 'Chinese (Simplified)'},\n\tCHINESE_HK: {_: 'zh_HK', lang: '中文 (香港)', 'en': 'Chinese (Hong Kong)'},\n\tCHINESE_TW: {_: 'zh_TW', lang: '中文 (台灣)', 'en': 'Chinese (Traditional)'},\n\tGERMAN: {_: 'de', lang: 'Deutsch', 'en': 'German'},\n\tSPANISH: {_: 'es', lang: 'Español', 'en': 'Spanish'},\n\tITALIAN: {_: 'it', lang: 'Italiano', 'en': 'Italian'},\n\tPORTUGUESE: {_: 'pt', lang: 'Português', 'en': 'Portuguese'},\n\tDUTCH: {_: 'nl', lang: 'Nederlands', 'en': 'Dutch'},\n\tFRENCH: {_: 'fr', lang: 'Français', 'en': 'French'},\n\tSWEDISH: {_: 'sv', lang: 'Svenska', 'en': 'Swedish'},\n\tFINNISH: {_: 'fi', lang: 'Suomi', 'en': 'Finnish'},\n\tGREEK: {_: 'el', lang: 'Ελληνικά', 'en': 'Greek'},\n\tKOREAN: {_: 'ko', lang: '한국어', 'en': 'Korean'},\n\tJAPANESE: {_: 'ja', lang: '日本語', 'en': 'Japanese'},\n\tHEBREW: {_: 'he', lang: 'עִבְרִית', 'en': 'Hebrew'},\n\tPERSIAN: {_: 'fa', lang: 'فارسی', 'en': 'Persian'},\n\tYIDDISH: {_: 'yi', lang: 'ייִדיש', 'en': 'Yiddish'},\n\tARABIC: {_: 'ar', lang: 'العَرَبِيَّة‎', 'en': 'Arabic'},\n\tAFRIKAANS: {_: 'af', lang: 'Afrikaans', 'en': 'Afrikaans'},\n}\n\n/**\n * Object mapping of language to their code\n */\nexport const l = {\n\t...LANGUAGE // enable IDE suggestion\n}\nfor (const key in LANGUAGE) {\n\tl[key] = LANGUAGE[key]._\n}\n\n/**\n * Spoken Language Fluency Definition\n */\nexport const LANGUAGE_LEVEL = {\n\tUNKNOWN: {\n\t\t_: 0,\n\t\t[l.ENGLISH]: 'Unknown',\n\t},\n\tBASIC: {\n\t\t_: 1,\n\t\t[l.ENGLISH]: 'Beginner',\n\t},\n\tWORKING: {\n\t\t_: 2,\n\t\t[l.ENGLISH]: 'Working',\n\t},\n\tPROFICIENT: {\n\t\t_: 3,\n\t\t[l.ENGLISH]: 'Proficient',\n\t},\n\tFLUENT: {\n\t\t_: 4,\n\t\t[l.ENGLISH]: 'Fluent',\n\t},\n\tNATIVE: {\n\t\t_: 5,\n\t\t[l.ENGLISH]: 'Native',\n\t},\n}\n\n/* Mappings */\nexport const SORT_ORDER = {\n\t0: 'sort',\n\t1: 'asc',\n\t[-1]: 'desc',\n}\n\n/* Characters */\nexport const PLUS = '✛'\nexport const MINUS = '╍'\nexport const DOT = '•'\nexport const CROSS = '✕'\nexport const CROSSMARK = '❌'\nexport const CHECK = '✓'\nexport const CHECKBOX = '✅'\nexport const CLOVER = '☘'\nexport const RECYCLE = '♻️'\nexport const HEART = '♥'\nexport const HEART_EXCLAMATION = '❣'\nexport const SPARKLES = '✨'\nexport const THUNDER = '⚡'\nexport const FIREWORK = '💥'\nexport const ROCKET = '🚀'\nexport const BLOCK = '🚷'\nexport const CHICKEN = '🐣'\nexport const SKULL = '☠'\nexport const WARN = '✋'\nexport const WORKER = '👷'\n\n/*\n * Special Characters Reference for Documentation Use\n * ┌───┬───────────────────────────────────────────────────────────────────────┐\n * │ 1 │ ╭ ─ ╮ │\n * │ │ │ 5 │ │\n * │ 2 │ ╰ ─ ╯ │\n * ├───┼───────────────────────────────────────────────────────────────────────┤\n * │ 3 │ │\n * └───┴───────────────────────────────────────────────────────────────────────┘\n * ├─┬─> A ⟶ B\n * │ ├─> A ⟵ B\n * │ └─> C ⟶ B\n * │\n * └─┬─> C ⟶ D\n * └─> C ⟵ D\n * Time\n * │\n * Start someFunctionName() -> ├───> Action A (start) ─────┐\n * ├───> Action B (start) ───────┐\n * │ │ │\n * Call someFunctionName() -> │╭ ──── Action A (end) ─────┘ │\n * (dispatch new actions) │╰ ─> Action C (start) ──────────┐\n * │ │ │\n * │ │ │\n * Call someFunctionName() -> │╭ ── Action D <─ User Input │ │\n * (dispatch new actions) │╰ ─> Action E (start) ─────────────┐\n * │ │ │ │\n * │ │ │ │\n * Call someFunctionName() -> │ <─── Action B (end) ───────┘ │ │\n * (no more actions, wait...) │ <─── Action C (end) ──────────┘ │\n * │ │\n * End someFunctionName() -> │ <─── Action E (end) ─────────────┘\n * │\n*/\n","import { LANGUAGE } from './constants.js'\n\n/**\n * Environment Variables\n * @note: for Next.js, explicitly set variable on initialisation like so:\n * import config from 'next/config'\n * import { ENV } from 'ui-utils-pack'\n *\n * Object.assign(ENV, config().publicRuntimeConfig)\n */\nexport let ENV = (typeof process !== 'undefined' && process.env) || {}\nexport const NODE_ENV = ENV.NODE_ENV // @Note: Next.js does not automatically add NODE_ENV, set inside next.config.js\nexport const __PROD__ = NODE_ENV === 'production'\nexport const __STAGE__ = NODE_ENV === 'stage'\nexport const __TEST__ = NODE_ENV === 'test'\nexport const __DEV__ = NODE_ENV === 'development'\nexport const __CLIENT__ = typeof window !== 'undefined'\nexport const __BACKEND__ = !__CLIENT__\nexport const __IOS__ = false\nexport const _INIT_ = __BACKEND__ && (__PROD__ || __STAGE__)\nexport const _SHOULD_SHOW_TEST_ = __DEV__\nexport const _WORK_DIR_ = typeof process !== 'undefined' ? process.cwd() : '.' // relative to root `index.js`\nexport const UNDEFINED = (Undefined => Undefined)()\n\n/* Globally Accessible Objects */\nexport const Active = {\n // will be overridden at runtime, used for avoiding circular import and env-dependent libraries\n DEFAULT: {LANGUAGE: LANGUAGE.ENGLISH._},\n LANG: LANGUAGE.ENGLISH, // currently used language\n SETTINGS: {}, // User settings\n Storage: typeof localStorage !== 'undefined' ? localStorage : undefined, // LocalStorage for Node\n WebSocket: typeof WebSocket !== 'undefined' ? WebSocket : undefined, // WebSocket for Node\n history: {}, // Cross Platform route history object\n iconClass: '', // CSS className for <Icon />\n iconClassPrefix: 'icon-', // CSS className prefix for <Icon />\n client: undefined, // Apollo client\n log: undefined, // backend console logger\n user: {}, // the current user, for quick access to user info, such as auth\n usersById: {}, // for storing temporary info, like user.lastOnline\n translate: (value) => value, // Global translate function\n\n /**\n * Password Strength Calculator\n * @example: <script async src=\"/static/zxcvbn.js\"/>\n * - Frontend uses async script in <head/> section to load static zxcvbn.js for faster page load.\n * - Backend should override this prop with `Active.passwordCheck = require('zxcvbn')`\n * @returns {zxcvbn|(function(): {score: number})|*}\n */\n get passwordCheck () {\n // When not loaded, skip password validation in frontend\n if (typeof window !== 'undefined') return window.zxcvbn || (() => ({score: Infinity}))\n return this.zxcvbn\n },\n set passwordCheck (zxcvbn) {\n this.zxcvbn = zxcvbn\n }\n}\n"],"sourceRoot":""}