@dktunited-techoff/techoff-suite-ui 1.8.1 → 1.8.2

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 (350) hide show
  1. package/esm/assets/fonts/Montserrat-Medium.ttf +0 -0
  2. package/esm/assets/fonts/Roboto-Light.ttf +0 -0
  3. package/esm/components/TsButton/TsButton.css +121 -0
  4. package/esm/components/TsButton/TsButton.d.ts +5 -0
  5. package/esm/components/TsButton/TsButton.js +17 -0
  6. package/esm/components/TsButton/TsButton.js.map +1 -0
  7. package/esm/components/TsButton/TsButton.types.d.ts +9 -0
  8. package/esm/components/TsButton/TsButton.types.js +2 -0
  9. package/esm/components/TsButton/TsButton.types.js.map +1 -0
  10. package/esm/components/TsButton/__stories__/TsButton.stories.mdx +84 -0
  11. package/esm/components/TsCheckbox/TsCheckbox.css +64 -0
  12. package/esm/components/TsCheckbox/TsCheckbox.d.ts +4 -0
  13. package/esm/components/TsCheckbox/TsCheckbox.js +17 -0
  14. package/esm/components/TsCheckbox/TsCheckbox.js.map +1 -0
  15. package/esm/components/TsCheckbox/TsCheckbox.types.d.ts +7 -0
  16. package/esm/components/TsCheckbox/TsCheckbox.types.js +2 -0
  17. package/esm/components/TsCheckbox/TsCheckbox.types.js.map +1 -0
  18. package/esm/components/TsCheckbox/__stories__/TsCheckbox.stories.mdx +56 -0
  19. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.css +114 -0
  20. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.d.ts +4 -0
  21. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.js +100 -0
  22. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.js.map +1 -0
  23. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.tsx +165 -0
  24. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.types.d.ts +17 -0
  25. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.types.js +2 -0
  26. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.types.js.map +1 -0
  27. package/esm/components/TsDropdowns/TsDropdown/TsDropdown.types.ts +18 -0
  28. package/esm/components/TsDropdowns/TsDropdown/__stories__/TsDropdown.stories.mdx +85 -0
  29. package/esm/components/TsDropdowns/TsDropdown/__stories__/fruits.d.ts +4 -0
  30. package/esm/components/TsDropdowns/TsDropdown/__stories__/fruits.js +48 -0
  31. package/esm/components/TsDropdowns/TsDropdown/__stories__/fruits.js.map +1 -0
  32. package/esm/components/TsDropdowns/TsDropdown/__stories__/fruits.ts +47 -0
  33. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.css +83 -0
  34. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.d.ts +4 -0
  35. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js +62 -0
  36. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js.map +1 -0
  37. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx +105 -0
  38. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.d.ts +8 -0
  39. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.js +2 -0
  40. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.js.map +1 -0
  41. package/esm/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.ts +8 -0
  42. package/esm/components/TsDropdowns/TsDropdownFilter/__stories__/TsDropdown.stories.mdx +69 -0
  43. package/esm/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.d.ts +4 -0
  44. package/esm/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.js +48 -0
  45. package/esm/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.js.map +1 -0
  46. package/esm/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.ts +47 -0
  47. package/esm/components/TsIcon/TsIcon.css +26 -0
  48. package/esm/components/TsIcon/TsIcon.d.ts +4 -0
  49. package/esm/components/TsIcon/TsIcon.js +12 -0
  50. package/esm/components/TsIcon/TsIcon.js.map +1 -0
  51. package/esm/components/TsIcon/TsIcon.types.d.ts +4 -0
  52. package/esm/components/TsIcon/TsIcon.types.js +2 -0
  53. package/esm/components/TsIcon/TsIcon.types.js.map +1 -0
  54. package/esm/components/TsIcon/__stories__/TsIcon.stories.mdx +89 -0
  55. package/esm/components/TsIcon/icons/add-circle.svg +1 -0
  56. package/esm/components/TsIcon/icons/add.svg +1 -0
  57. package/esm/components/TsIcon/icons/alert-circle-filled.svg +1 -0
  58. package/esm/components/TsIcon/icons/alert-circle.svg +1 -0
  59. package/esm/components/TsIcon/icons/alert-triangle-filled.svg +1 -0
  60. package/esm/components/TsIcon/icons/alert-triangle.svg +1 -0
  61. package/esm/components/TsIcon/icons/arrow-diagonal-collapse.svg +1 -0
  62. package/esm/components/TsIcon/icons/arrow-diagonal-expand.svg +1 -0
  63. package/esm/components/TsIcon/icons/arrow-down.svg +1 -0
  64. package/esm/components/TsIcon/icons/arrow-go-back.svg +1 -0
  65. package/esm/components/TsIcon/icons/arrow-left-right.svg +1 -0
  66. package/esm/components/TsIcon/icons/arrow-left.svg +1 -0
  67. package/esm/components/TsIcon/icons/arrow-right.svg +1 -0
  68. package/esm/components/TsIcon/icons/arrow-up-down.svg +1 -0
  69. package/esm/components/TsIcon/icons/arrow-up.svg +1 -0
  70. package/esm/components/TsIcon/icons/award.svg +1 -0
  71. package/esm/components/TsIcon/icons/check-circle-filled.svg +1 -0
  72. package/esm/components/TsIcon/icons/check-circle-timer.svg +7 -0
  73. package/esm/components/TsIcon/icons/check-circle.svg +1 -0
  74. package/esm/components/TsIcon/icons/check-square-filled.svg +1 -0
  75. package/esm/components/TsIcon/icons/check-square.svg +1 -0
  76. package/esm/components/TsIcon/icons/check.svg +1 -0
  77. package/esm/components/TsIcon/icons/chevron-down.svg +1 -0
  78. package/esm/components/TsIcon/icons/chevron-left.svg +1 -0
  79. package/esm/components/TsIcon/icons/chevron-right.svg +1 -0
  80. package/esm/components/TsIcon/icons/chevron-up.svg +1 -0
  81. package/esm/components/TsIcon/icons/circle.svg +1 -0
  82. package/esm/components/TsIcon/icons/close-circle.svg +1 -0
  83. package/esm/components/TsIcon/icons/close.svg +1 -0
  84. package/esm/components/TsIcon/icons/currency-euro.svg +1 -0
  85. package/esm/components/TsIcon/icons/download.svg +1 -0
  86. package/esm/components/TsIcon/icons/edit.svg +1 -0
  87. package/esm/components/TsIcon/icons/external-link.svg +1 -0
  88. package/esm/components/TsIcon/icons/filter-off.svg +1 -0
  89. package/esm/components/TsIcon/icons/filter.svg +1 -0
  90. package/esm/components/TsIcon/icons/flashlight-off.svg +1 -0
  91. package/esm/components/TsIcon/icons/flashlight.svg +1 -0
  92. package/esm/components/TsIcon/icons/header-bikestudio.svg +32 -0
  93. package/esm/components/TsIcon/icons/header-nsc-helmet.svg +32 -0
  94. package/esm/components/TsIcon/icons/header-opticost.svg +32 -0
  95. package/esm/components/TsIcon/icons/header-repairability.svg +32 -0
  96. package/esm/components/TsIcon/icons/header-techoff-suite.svg +32 -0
  97. package/esm/components/TsIcon/icons/heart-filled.svg +1 -0
  98. package/esm/components/TsIcon/icons/heart.svg +1 -0
  99. package/esm/components/TsIcon/icons/history.svg +1 -0
  100. package/esm/components/TsIcon/icons/home.svg +1 -0
  101. package/esm/components/TsIcon/icons/index.d.ts +3 -0
  102. package/esm/components/TsIcon/icons/index.js +62 -0
  103. package/esm/components/TsIcon/icons/index.js.map +1 -0
  104. package/esm/components/TsIcon/icons/index.ts +61 -0
  105. package/esm/components/TsIcon/icons/link.svg +1 -0
  106. package/esm/components/TsIcon/icons/list-settings.svg +1 -0
  107. package/esm/components/TsIcon/icons/lock.svg +1 -0
  108. package/esm/components/TsIcon/icons/loop-right.svg +1 -0
  109. package/esm/components/TsIcon/icons/percent.svg +1 -0
  110. package/esm/components/TsIcon/icons/question-circle.svg +1 -0
  111. package/esm/components/TsIcon/icons/save.svg +1 -0
  112. package/esm/components/TsIcon/icons/search.svg +1 -0
  113. package/esm/components/TsIcon/icons/seedling-circle.svg +12 -0
  114. package/esm/components/TsIcon/icons/square.svg +1 -0
  115. package/esm/components/TsIcon/icons/timer.svg +1 -0
  116. package/esm/components/TsIcon/icons/tools.svg +1 -0
  117. package/esm/components/TsIcon/icons/user.svg +1 -0
  118. package/esm/components/TsInput/TsInput/TsInput.css +92 -0
  119. package/esm/components/TsInput/TsInput/TsInput.d.ts +4 -0
  120. package/esm/components/TsInput/TsInput/TsInput.js +21 -0
  121. package/esm/components/TsInput/TsInput/TsInput.js.map +1 -0
  122. package/esm/components/TsInput/TsInput/TsInput.tsx +34 -0
  123. package/esm/components/TsInput/TsInput/TsInput.types.d.ts +8 -0
  124. package/esm/components/TsInput/TsInput/TsInput.types.js +2 -0
  125. package/esm/components/TsInput/TsInput/TsInput.types.js.map +1 -0
  126. package/esm/components/TsInput/TsInput/TsInput.types.tsx +9 -0
  127. package/esm/components/TsInput/TsInput/__stories__/TsInput.stories.mdx +77 -0
  128. package/esm/components/TsLoader/TsLoader.css +42 -0
  129. package/esm/components/TsLoader/TsLoader.d.ts +4 -0
  130. package/esm/components/TsLoader/TsLoader.js +6 -0
  131. package/esm/components/TsLoader/TsLoader.js.map +1 -0
  132. package/esm/components/TsLoader/TsLoader.types.d.ts +3 -0
  133. package/esm/components/TsLoader/TsLoader.types.js +2 -0
  134. package/esm/components/TsLoader/TsLoader.types.js.map +1 -0
  135. package/esm/components/TsLoader/__stories__/TsLoader.stories.mdx +30 -0
  136. package/esm/components/TsTabs/TsTabs.css +69 -0
  137. package/esm/components/TsTabs/TsTabs.d.ts +4 -0
  138. package/esm/components/TsTabs/TsTabs.js +30 -0
  139. package/esm/components/TsTabs/TsTabs.js.map +1 -0
  140. package/esm/components/TsTabs/TsTabs.types.d.ts +14 -0
  141. package/esm/components/TsTabs/TsTabs.types.js +2 -0
  142. package/esm/components/TsTabs/TsTabs.types.js.map +1 -0
  143. package/esm/components/TsTabs/__stories__/TsTabs.stories.mdx +50 -0
  144. package/esm/hooks/use-click-outside.d.ts +2 -0
  145. package/esm/hooks/use-click-outside.js +14 -0
  146. package/esm/hooks/use-click-outside.js.map +1 -0
  147. package/esm/index.d.ts +11 -0
  148. package/esm/index.js +12 -0
  149. package/esm/index.js.map +1 -0
  150. package/esm/layouts/TsHeader/TsHeader.css +186 -0
  151. package/esm/layouts/TsHeader/TsHeader.d.ts +4 -0
  152. package/esm/layouts/TsHeader/TsHeader.js +13 -0
  153. package/esm/layouts/TsHeader/TsHeader.js.map +1 -0
  154. package/esm/layouts/TsHeader/TsHeader.types.d.ts +23 -0
  155. package/esm/layouts/TsHeader/TsHeader.types.js +2 -0
  156. package/esm/layouts/TsHeader/TsHeader.types.js.map +1 -0
  157. package/esm/layouts/TsHeader/TsHeaderProfile.d.ts +5 -0
  158. package/esm/layouts/TsHeader/TsHeaderProfile.js +38 -0
  159. package/esm/layouts/TsHeader/TsHeaderProfile.js.map +1 -0
  160. package/esm/layouts/TsHeader/TsHeaderSearch.d.ts +3 -0
  161. package/esm/layouts/TsHeader/TsHeaderSearch.js +58 -0
  162. package/esm/layouts/TsHeader/TsHeaderSearch.js.map +1 -0
  163. package/esm/layouts/TsHeader/__stories__/TsHeader.stories.mdx +71 -0
  164. package/esm/layouts/TsNavigation/TsNavigation.css +72 -0
  165. package/esm/layouts/TsNavigation/TsNavigation.d.ts +7 -0
  166. package/esm/layouts/TsNavigation/TsNavigation.js +29 -0
  167. package/esm/layouts/TsNavigation/TsNavigation.js.map +1 -0
  168. package/esm/layouts/TsNavigation/TsNavigation.types.d.ts +10 -0
  169. package/esm/layouts/TsNavigation/TsNavigation.types.js +2 -0
  170. package/esm/layouts/TsNavigation/TsNavigation.types.js.map +1 -0
  171. package/esm/layouts/TsNavigation/__stories__/TsNavigation.stories.mdx +51 -0
  172. package/esm/utils/string.utils.d.ts +1 -0
  173. package/esm/utils/string.utils.js +2 -0
  174. package/esm/utils/string.utils.js.map +1 -0
  175. package/lib/assets/fonts/Montserrat-Medium.ttf +0 -0
  176. package/lib/assets/fonts/Roboto-Light.ttf +0 -0
  177. package/lib/components/TsButton/TsButton.css +121 -0
  178. package/lib/components/TsButton/TsButton.d.ts +5 -0
  179. package/lib/components/TsButton/TsButton.js +21 -0
  180. package/lib/components/TsButton/TsButton.js.map +1 -0
  181. package/lib/components/TsButton/TsButton.types.d.ts +9 -0
  182. package/lib/components/TsButton/TsButton.types.js +3 -0
  183. package/lib/components/TsButton/TsButton.types.js.map +1 -0
  184. package/lib/components/TsButton/__stories__/TsButton.stories.mdx +84 -0
  185. package/lib/components/TsCheckbox/TsCheckbox.css +64 -0
  186. package/lib/components/TsCheckbox/TsCheckbox.d.ts +4 -0
  187. package/lib/components/TsCheckbox/TsCheckbox.js +21 -0
  188. package/lib/components/TsCheckbox/TsCheckbox.js.map +1 -0
  189. package/lib/components/TsCheckbox/TsCheckbox.types.d.ts +7 -0
  190. package/lib/components/TsCheckbox/TsCheckbox.types.js +3 -0
  191. package/lib/components/TsCheckbox/TsCheckbox.types.js.map +1 -0
  192. package/lib/components/TsCheckbox/__stories__/TsCheckbox.stories.mdx +56 -0
  193. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.css +114 -0
  194. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.d.ts +4 -0
  195. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.js +104 -0
  196. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.js.map +1 -0
  197. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.tsx +165 -0
  198. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.types.d.ts +17 -0
  199. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.types.js +3 -0
  200. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.types.js.map +1 -0
  201. package/lib/components/TsDropdowns/TsDropdown/TsDropdown.types.ts +18 -0
  202. package/lib/components/TsDropdowns/TsDropdown/__stories__/TsDropdown.stories.mdx +85 -0
  203. package/lib/components/TsDropdowns/TsDropdown/__stories__/fruits.d.ts +4 -0
  204. package/lib/components/TsDropdowns/TsDropdown/__stories__/fruits.js +51 -0
  205. package/lib/components/TsDropdowns/TsDropdown/__stories__/fruits.js.map +1 -0
  206. package/lib/components/TsDropdowns/TsDropdown/__stories__/fruits.ts +47 -0
  207. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.css +83 -0
  208. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.d.ts +4 -0
  209. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js +66 -0
  210. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.js.map +1 -0
  211. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx +105 -0
  212. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.d.ts +8 -0
  213. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.js +3 -0
  214. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.js.map +1 -0
  215. package/lib/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.types.ts +8 -0
  216. package/lib/components/TsDropdowns/TsDropdownFilter/__stories__/TsDropdown.stories.mdx +69 -0
  217. package/lib/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.d.ts +4 -0
  218. package/lib/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.js +51 -0
  219. package/lib/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.js.map +1 -0
  220. package/lib/components/TsDropdowns/TsDropdownFilter/__stories__/fruits.ts +47 -0
  221. package/lib/components/TsIcon/TsIcon.css +26 -0
  222. package/lib/components/TsIcon/TsIcon.d.ts +4 -0
  223. package/lib/components/TsIcon/TsIcon.js +16 -0
  224. package/lib/components/TsIcon/TsIcon.js.map +1 -0
  225. package/lib/components/TsIcon/TsIcon.types.d.ts +4 -0
  226. package/lib/components/TsIcon/TsIcon.types.js +3 -0
  227. package/lib/components/TsIcon/TsIcon.types.js.map +1 -0
  228. package/lib/components/TsIcon/__stories__/TsIcon.stories.mdx +89 -0
  229. package/lib/components/TsIcon/icons/add-circle.svg +1 -0
  230. package/lib/components/TsIcon/icons/add.svg +1 -0
  231. package/lib/components/TsIcon/icons/alert-circle-filled.svg +1 -0
  232. package/lib/components/TsIcon/icons/alert-circle.svg +1 -0
  233. package/lib/components/TsIcon/icons/alert-triangle-filled.svg +1 -0
  234. package/lib/components/TsIcon/icons/alert-triangle.svg +1 -0
  235. package/lib/components/TsIcon/icons/arrow-diagonal-collapse.svg +1 -0
  236. package/lib/components/TsIcon/icons/arrow-diagonal-expand.svg +1 -0
  237. package/lib/components/TsIcon/icons/arrow-down.svg +1 -0
  238. package/lib/components/TsIcon/icons/arrow-go-back.svg +1 -0
  239. package/lib/components/TsIcon/icons/arrow-left-right.svg +1 -0
  240. package/lib/components/TsIcon/icons/arrow-left.svg +1 -0
  241. package/lib/components/TsIcon/icons/arrow-right.svg +1 -0
  242. package/lib/components/TsIcon/icons/arrow-up-down.svg +1 -0
  243. package/lib/components/TsIcon/icons/arrow-up.svg +1 -0
  244. package/lib/components/TsIcon/icons/award.svg +1 -0
  245. package/lib/components/TsIcon/icons/check-circle-filled.svg +1 -0
  246. package/lib/components/TsIcon/icons/check-circle-timer.svg +7 -0
  247. package/lib/components/TsIcon/icons/check-circle.svg +1 -0
  248. package/lib/components/TsIcon/icons/check-square-filled.svg +1 -0
  249. package/lib/components/TsIcon/icons/check-square.svg +1 -0
  250. package/lib/components/TsIcon/icons/check.svg +1 -0
  251. package/lib/components/TsIcon/icons/chevron-down.svg +1 -0
  252. package/lib/components/TsIcon/icons/chevron-left.svg +1 -0
  253. package/lib/components/TsIcon/icons/chevron-right.svg +1 -0
  254. package/lib/components/TsIcon/icons/chevron-up.svg +1 -0
  255. package/lib/components/TsIcon/icons/circle.svg +1 -0
  256. package/lib/components/TsIcon/icons/close-circle.svg +1 -0
  257. package/lib/components/TsIcon/icons/close.svg +1 -0
  258. package/lib/components/TsIcon/icons/currency-euro.svg +1 -0
  259. package/lib/components/TsIcon/icons/download.svg +1 -0
  260. package/lib/components/TsIcon/icons/edit.svg +1 -0
  261. package/lib/components/TsIcon/icons/external-link.svg +1 -0
  262. package/lib/components/TsIcon/icons/filter-off.svg +1 -0
  263. package/lib/components/TsIcon/icons/filter.svg +1 -0
  264. package/lib/components/TsIcon/icons/flashlight-off.svg +1 -0
  265. package/lib/components/TsIcon/icons/flashlight.svg +1 -0
  266. package/lib/components/TsIcon/icons/header-bikestudio.svg +32 -0
  267. package/lib/components/TsIcon/icons/header-nsc-helmet.svg +32 -0
  268. package/lib/components/TsIcon/icons/header-opticost.svg +32 -0
  269. package/lib/components/TsIcon/icons/header-repairability.svg +32 -0
  270. package/lib/components/TsIcon/icons/header-techoff-suite.svg +32 -0
  271. package/lib/components/TsIcon/icons/heart-filled.svg +1 -0
  272. package/lib/components/TsIcon/icons/heart.svg +1 -0
  273. package/lib/components/TsIcon/icons/history.svg +1 -0
  274. package/lib/components/TsIcon/icons/home.svg +1 -0
  275. package/lib/components/TsIcon/icons/index.d.ts +3 -0
  276. package/lib/components/TsIcon/icons/index.js +65 -0
  277. package/lib/components/TsIcon/icons/index.js.map +1 -0
  278. package/lib/components/TsIcon/icons/index.ts +61 -0
  279. package/lib/components/TsIcon/icons/link.svg +1 -0
  280. package/lib/components/TsIcon/icons/list-settings.svg +1 -0
  281. package/lib/components/TsIcon/icons/lock.svg +1 -0
  282. package/lib/components/TsIcon/icons/loop-right.svg +1 -0
  283. package/lib/components/TsIcon/icons/percent.svg +1 -0
  284. package/lib/components/TsIcon/icons/question-circle.svg +1 -0
  285. package/lib/components/TsIcon/icons/save.svg +1 -0
  286. package/lib/components/TsIcon/icons/search.svg +1 -0
  287. package/lib/components/TsIcon/icons/seedling-circle.svg +12 -0
  288. package/lib/components/TsIcon/icons/square.svg +1 -0
  289. package/lib/components/TsIcon/icons/timer.svg +1 -0
  290. package/lib/components/TsIcon/icons/tools.svg +1 -0
  291. package/lib/components/TsIcon/icons/user.svg +1 -0
  292. package/lib/components/TsInput/TsInput/TsInput.css +92 -0
  293. package/lib/components/TsInput/TsInput/TsInput.d.ts +4 -0
  294. package/lib/components/TsInput/TsInput/TsInput.js +25 -0
  295. package/lib/components/TsInput/TsInput/TsInput.js.map +1 -0
  296. package/lib/components/TsInput/TsInput/TsInput.tsx +34 -0
  297. package/lib/components/TsInput/TsInput/TsInput.types.d.ts +8 -0
  298. package/lib/components/TsInput/TsInput/TsInput.types.js +3 -0
  299. package/lib/components/TsInput/TsInput/TsInput.types.js.map +1 -0
  300. package/lib/components/TsInput/TsInput/TsInput.types.tsx +9 -0
  301. package/lib/components/TsInput/TsInput/__stories__/TsInput.stories.mdx +77 -0
  302. package/lib/components/TsLoader/TsLoader.css +42 -0
  303. package/lib/components/TsLoader/TsLoader.d.ts +4 -0
  304. package/lib/components/TsLoader/TsLoader.js +10 -0
  305. package/lib/components/TsLoader/TsLoader.js.map +1 -0
  306. package/lib/components/TsLoader/TsLoader.types.d.ts +3 -0
  307. package/lib/components/TsLoader/TsLoader.types.js +3 -0
  308. package/lib/components/TsLoader/TsLoader.types.js.map +1 -0
  309. package/lib/components/TsLoader/__stories__/TsLoader.stories.mdx +30 -0
  310. package/lib/components/TsTabs/TsTabs.css +69 -0
  311. package/lib/components/TsTabs/TsTabs.d.ts +4 -0
  312. package/lib/components/TsTabs/TsTabs.js +34 -0
  313. package/lib/components/TsTabs/TsTabs.js.map +1 -0
  314. package/lib/components/TsTabs/TsTabs.types.d.ts +14 -0
  315. package/lib/components/TsTabs/TsTabs.types.js +3 -0
  316. package/lib/components/TsTabs/TsTabs.types.js.map +1 -0
  317. package/lib/components/TsTabs/__stories__/TsTabs.stories.mdx +50 -0
  318. package/lib/hooks/use-click-outside.d.ts +2 -0
  319. package/lib/hooks/use-click-outside.js +18 -0
  320. package/lib/hooks/use-click-outside.js.map +1 -0
  321. package/lib/index.d.ts +11 -0
  322. package/lib/index.js +28 -0
  323. package/lib/index.js.map +1 -0
  324. package/lib/layouts/TsHeader/TsHeader.css +186 -0
  325. package/lib/layouts/TsHeader/TsHeader.d.ts +4 -0
  326. package/lib/layouts/TsHeader/TsHeader.js +17 -0
  327. package/lib/layouts/TsHeader/TsHeader.js.map +1 -0
  328. package/lib/layouts/TsHeader/TsHeader.types.d.ts +23 -0
  329. package/lib/layouts/TsHeader/TsHeader.types.js +3 -0
  330. package/lib/layouts/TsHeader/TsHeader.types.js.map +1 -0
  331. package/lib/layouts/TsHeader/TsHeaderProfile.d.ts +5 -0
  332. package/lib/layouts/TsHeader/TsHeaderProfile.js +43 -0
  333. package/lib/layouts/TsHeader/TsHeaderProfile.js.map +1 -0
  334. package/lib/layouts/TsHeader/TsHeaderSearch.d.ts +3 -0
  335. package/lib/layouts/TsHeader/TsHeaderSearch.js +62 -0
  336. package/lib/layouts/TsHeader/TsHeaderSearch.js.map +1 -0
  337. package/lib/layouts/TsHeader/__stories__/TsHeader.stories.mdx +71 -0
  338. package/lib/layouts/TsNavigation/TsNavigation.css +72 -0
  339. package/lib/layouts/TsNavigation/TsNavigation.d.ts +7 -0
  340. package/lib/layouts/TsNavigation/TsNavigation.js +35 -0
  341. package/lib/layouts/TsNavigation/TsNavigation.js.map +1 -0
  342. package/lib/layouts/TsNavigation/TsNavigation.types.d.ts +10 -0
  343. package/lib/layouts/TsNavigation/TsNavigation.types.js +3 -0
  344. package/lib/layouts/TsNavigation/TsNavigation.types.js.map +1 -0
  345. package/lib/layouts/TsNavigation/__stories__/TsNavigation.stories.mdx +51 -0
  346. package/lib/utils/string.utils.d.ts +1 -0
  347. package/lib/utils/string.utils.js +6 -0
  348. package/lib/utils/string.utils.js.map +1 -0
  349. package/package.json +1 -1
  350. package/src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx +1 -0
@@ -0,0 +1,165 @@
1
+ import * as React from 'react';
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { TsDropdownProps } from './TsDropdown.types';
4
+ import { TsIcon } from '../../TsIcon/TsIcon';
5
+ import { TsInput } from '../../TsInput/TsInput/TsInput';
6
+ import { useClickOutside } from '../../../hooks/use-click-outside';
7
+ import { TsLoader } from '../../TsLoader/TsLoader';
8
+ import './TsDropdown.css';
9
+
10
+ export const TsDropdown = <T,>({
11
+ containerRef,
12
+ error,
13
+ label,
14
+ options,
15
+ placeholder,
16
+ reloadOptionsOn = [],
17
+ searchPlaceholder,
18
+ value,
19
+ disabled,
20
+ searchable,
21
+ getOptionLabel,
22
+ getOptionValue,
23
+ loadOptions,
24
+ onChange,
25
+ }: TsDropdownProps<T>) => {
26
+ const [showDropdownMenu, setShowDropdownMenu] = useState<boolean>(false);
27
+ const [searchValue, setSearchValue] = useState<string>('');
28
+ const [items, setItems] = useState<T[]>(options ?? []);
29
+ const [loading, setLoading] = useState<boolean>(false);
30
+ const [isFetchError, setIsFetchError] = useState<boolean>(false);
31
+ const dropdownRef = useClickOutside(() => setShowDropdownMenu(false));
32
+ const dropdownMenuRef = useRef<HTMLDivElement>(null);
33
+
34
+ // ########
35
+ // Fetchers
36
+ const fetchOptions = () => {
37
+ if (!options && loadOptions) {
38
+ setLoading(true);
39
+ setIsFetchError(false);
40
+ loadOptions(searchValue)
41
+ .then(setItems)
42
+ .catch(() => setIsFetchError(true))
43
+ .finally(() => setLoading(false));
44
+ }
45
+ };
46
+
47
+ // ########
48
+ // Handlers
49
+ const handleSelectItem = (item: T) => {
50
+ setShowDropdownMenu(false);
51
+ onChange(item);
52
+ };
53
+ const handleShowDropdownMenu = () => !disabled && setShowDropdownMenu(true);
54
+
55
+ // ########
56
+ // Watchers
57
+ useEffect(() => {
58
+ if (!disabled) fetchOptions();
59
+ }, [...reloadOptionsOn, disabled]);
60
+ useEffect(() => {
61
+ if (searchable && options) {
62
+ setItems(options.filter(option => getOptionLabel(option).toLowerCase().includes(searchValue.toLowerCase())));
63
+ }
64
+
65
+ if (searchable && !options && loadOptions) {
66
+ setLoading(true);
67
+ setIsFetchError(false);
68
+ const timeOutId = setTimeout(fetchOptions, 500);
69
+ return () => clearTimeout(timeOutId);
70
+ }
71
+
72
+ return () => {};
73
+ }, [searchValue]);
74
+ useEffect(() => {
75
+ if (searchable && !showDropdownMenu) setSearchValue('');
76
+
77
+ if (showDropdownMenu && containerRef?.current && dropdownMenuRef.current) {
78
+ const dropdownMenuRect = dropdownMenuRef.current.getBoundingClientRect();
79
+ const containerRect = containerRef.current.getBoundingClientRect();
80
+
81
+ if (dropdownMenuRect.bottom > containerRect.bottom) {
82
+ dropdownMenuRef.current.style.bottom = '40px';
83
+ dropdownMenuRef.current.style.top = 'auto';
84
+ } else {
85
+ dropdownMenuRef.current.style.top = '60px';
86
+ dropdownMenuRef.current.style.bottom = 'auto';
87
+ }
88
+ }
89
+ }, [showDropdownMenu]);
90
+
91
+ // #########
92
+ // Rendering
93
+ return (
94
+ <div className="ts-dropdown-container" ref={dropdownRef}>
95
+ <div className="ts-dropdown-input-container">
96
+ {label && <div className="ts-dropdown-label">{label}</div>}
97
+ <div
98
+ className={`
99
+ ts-dropdown-input
100
+ ${disabled ? 'ts-dropdown-input--disabled' : ''}
101
+ ${error && error !== '' ? 'ts-dropdown-container--error' : ''}
102
+ `}
103
+ onClick={handleShowDropdownMenu}
104
+ >
105
+ {!value && placeholder && <div className="ts-dropdown-input--placeholder">{placeholder}</div>}
106
+ {value && <div className="ts-dropdown-input--value">{getOptionLabel(value)}</div>}
107
+ <div className="ts-dropdown-input--chevron">
108
+ <TsIcon name={showDropdownMenu ? 'chevron-up' : 'chevron-down'} />
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ {error && error !== '' && (
114
+ <div className="ts-dropdown-error">
115
+ <div className="ts-dropdown-error--icon">
116
+ <TsIcon name="alert-circle" size="16" />
117
+ </div>
118
+ <div className="ts-dropdown-error--label">{error}</div>
119
+ </div>
120
+ )}
121
+
122
+ {!disabled && showDropdownMenu && (
123
+ <div className="ts-dropdown-menu-container" ref={dropdownMenuRef}>
124
+ {searchable && (
125
+ <div className="ts-dropdown-search">
126
+ <TsInput
127
+ icon="search"
128
+ placeholder={searchPlaceholder}
129
+ value={searchValue}
130
+ autoFocus
131
+ onChange={setSearchValue}
132
+ />
133
+ </div>
134
+ )}
135
+
136
+ <div className="ts-dropdown-menu">
137
+ {loading && (
138
+ <div className="ts-dropdown-menu-loader">
139
+ <TsLoader size="sm" />
140
+ </div>
141
+ )}
142
+ {!loading && isFetchError && (
143
+ <div className="ts-dropdown-menu-error-text">An error occured, try again later.</div>
144
+ )}
145
+ {!loading && !isFetchError && items.length === 0 && (
146
+ <div className="ts-dropdown-menu-error-text">No options found.</div>
147
+ )}
148
+ {!loading &&
149
+ !isFetchError &&
150
+ items.length > 0 &&
151
+ items.map(item => (
152
+ <div
153
+ key={getOptionValue(item)}
154
+ className="ts-dropdown-menu-item"
155
+ onClick={() => handleSelectItem(item)}
156
+ >
157
+ {getOptionLabel(item)}
158
+ </div>
159
+ ))}
160
+ </div>
161
+ </div>
162
+ )}
163
+ </div>
164
+ );
165
+ };
@@ -0,0 +1,17 @@
1
+ import { RefObject } from 'react';
2
+ export type TsDropdownProps<T> = {
3
+ containerRef?: RefObject<HTMLElement>;
4
+ error?: string;
5
+ label?: string;
6
+ options?: T[];
7
+ placeholder?: string;
8
+ reloadOptionsOn?: any[];
9
+ searchPlaceholder?: string;
10
+ value?: T;
11
+ disabled?: boolean;
12
+ searchable?: boolean;
13
+ getOptionLabel: (option: T) => string;
14
+ getOptionValue: (option: T) => string;
15
+ loadOptions?: (search?: string) => Promise<T[]>;
16
+ onChange: (value?: T) => void;
17
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TsDropdown.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TsDropdown.types.js","sourceRoot":"","sources":["../../../../src/components/TsDropdowns/TsDropdown/TsDropdown.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { RefObject } from 'react';
2
+
3
+ export type TsDropdownProps<T> = {
4
+ containerRef?: RefObject<HTMLElement>;
5
+ error?: string;
6
+ label?: string;
7
+ options?: T[];
8
+ placeholder?: string;
9
+ reloadOptionsOn?: any[];
10
+ searchPlaceholder?: string;
11
+ value?: T;
12
+ disabled?: boolean;
13
+ searchable?: boolean;
14
+ getOptionLabel: (option: T) => string;
15
+ getOptionValue: (option: T) => string;
16
+ loadOptions?: (search?: string) => Promise<T[]>;
17
+ onChange: (value?: T) => void;
18
+ };
@@ -0,0 +1,85 @@
1
+ import React from 'react';
2
+ import { ArgsTable, Canvas, Meta, Story } from '@storybook/blocks';
3
+ import { TsDropdown } from '../TsDropdown';
4
+ import { fruits } from './fruits';
5
+
6
+ <Meta title="Components/Dropdowns/Dropdown" />
7
+
8
+ export const dropdownArgTypes = {
9
+ error: {
10
+ control: 'text',
11
+ description: 'Error of the dropdown.',
12
+ },
13
+ label: {
14
+ control: 'text',
15
+ description: 'Label of the dropdown.',
16
+ },
17
+ placeholder: {
18
+ control: 'text',
19
+ description: 'Placeholder of the dropdown.',
20
+ },
21
+ searchPlaceholder: {
22
+ control: 'text',
23
+ description: 'Placeholder of the option search (only for searchable dropdowns).',
24
+ },
25
+ searchable: {
26
+ control: 'boolean',
27
+ description: 'Enable search on dropdown items.',
28
+ table: { defaultValue: { summary: 'false' } },
29
+ },
30
+ disabled: {
31
+ control: 'boolean',
32
+ description: 'Enable state of the dropdown.',
33
+ table: { defaultValue: { summary: 'false' } },
34
+ },
35
+ getOptionLabel: {
36
+ control: 'function',
37
+ description: 'The handler called to get the option label',
38
+ },
39
+ getOptionValue: {
40
+ control: 'function',
41
+ description: 'The handler called to get the option value.',
42
+ },
43
+ loadOptions: {
44
+ control: 'function',
45
+ description: 'The handler called to fetch all options in async (not available on playground).',
46
+ },
47
+ onChange: {
48
+ control: 'function',
49
+ description: 'The handler called when clicking on the dropdown option.',
50
+ },
51
+ };
52
+
53
+ # Dropdown
54
+
55
+ Dropdowns show a list of options that can be used to select, filter or sort content.
56
+
57
+ ## Overview
58
+
59
+ <Canvas>
60
+ <Story
61
+ name="Overview"
62
+ args={{
63
+ error: '',
64
+ label: 'Label',
65
+ options: fruits,
66
+ searchPlaceholder: '',
67
+ placeholder: 'Select an item',
68
+ disabled: false,
69
+ searchable: false,
70
+ getOptionLabel: function ol(fruit) {
71
+ return fruit.name;
72
+ },
73
+ getOptionValue: function ov(fruit) {
74
+ return fruit.id;
75
+ },
76
+ }}
77
+ argTypes={dropdownArgTypes}
78
+ >
79
+ {args => <TsDropdown {...args}>{args.children}</TsDropdown>}
80
+ </Story>
81
+ </Canvas>
82
+
83
+ ## Props
84
+
85
+ <ArgsTable story="Overview" of={TsDropdown} />
@@ -0,0 +1,4 @@
1
+ export declare const fruits: {
2
+ name: string;
3
+ id: number;
4
+ }[];
@@ -0,0 +1,48 @@
1
+ export const fruits = [
2
+ { name: 'Persimmon', id: 52 },
3
+ { name: 'Strawberry', id: 3 },
4
+ { name: 'Banana', id: 1 },
5
+ { name: 'Tomato', id: 5 },
6
+ { name: 'Pear', id: 4 },
7
+ { name: 'Durian', id: 60 },
8
+ { name: 'Blackberry', id: 64 },
9
+ { name: 'Lingonberry', id: 65 },
10
+ { name: 'Kiwi', id: 66 },
11
+ { name: 'Lychee', id: 67 },
12
+ { name: 'Pineapple', id: 10 },
13
+ { name: 'Fig', id: 68 },
14
+ { name: 'Gooseberry', id: 69 },
15
+ { name: 'Passionfruit', id: 70 },
16
+ { name: 'Plum', id: 71 },
17
+ { name: 'Orange', id: 2 },
18
+ { name: 'GreenApple', id: 72 },
19
+ { name: 'Raspberry', id: 23 },
20
+ { name: 'Watermelon', id: 25 },
21
+ { name: 'Lemon', id: 26 },
22
+ { name: 'Mango', id: 27 },
23
+ { name: 'Blueberry', id: 33 },
24
+ { name: 'Apple', id: 6 },
25
+ { name: 'Guava', id: 37 },
26
+ { name: 'Apricot', id: 35 },
27
+ { name: 'Papaya', id: 42 },
28
+ { name: 'Melon', id: 41 },
29
+ { name: 'Tangerine', id: 77 },
30
+ { name: 'Pitahaya', id: 78 },
31
+ { name: 'Lime', id: 44 },
32
+ { name: 'Pomegranate', id: 79 },
33
+ { name: 'Dragonfruit', id: 80 },
34
+ { name: 'Grape', id: 81 },
35
+ { name: 'Morus', id: 82 },
36
+ { name: 'Feijoa', id: 76 },
37
+ { name: 'Avocado', id: 84 },
38
+ { name: 'Kiwifruit', id: 85 },
39
+ { name: 'Cranberry', id: 87 },
40
+ { name: 'Cherry', id: 9 },
41
+ { name: 'Peach', id: 86 },
42
+ { name: 'Jackfruit', id: 94 },
43
+ { name: 'Horned Melon', id: 95 },
44
+ { name: 'Hazelnut', id: 96 },
45
+ { name: 'Pomelo', id: 98 },
46
+ { name: 'Mangosteen', id: 99 },
47
+ ];
48
+ //# sourceMappingURL=fruits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fruits.js","sourceRoot":"","sources":["../../../../../src/components/TsDropdowns/TsDropdown/__stories__/fruits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export const fruits = [
2
+ { name: 'Persimmon', id: 52 },
3
+ { name: 'Strawberry', id: 3 },
4
+ { name: 'Banana', id: 1 },
5
+ { name: 'Tomato', id: 5 },
6
+ { name: 'Pear', id: 4 },
7
+ { name: 'Durian', id: 60 },
8
+ { name: 'Blackberry', id: 64 },
9
+ { name: 'Lingonberry', id: 65 },
10
+ { name: 'Kiwi', id: 66 },
11
+ { name: 'Lychee', id: 67 },
12
+ { name: 'Pineapple', id: 10 },
13
+ { name: 'Fig', id: 68 },
14
+ { name: 'Gooseberry', id: 69 },
15
+ { name: 'Passionfruit', id: 70 },
16
+ { name: 'Plum', id: 71 },
17
+ { name: 'Orange', id: 2 },
18
+ { name: 'GreenApple', id: 72 },
19
+ { name: 'Raspberry', id: 23 },
20
+ { name: 'Watermelon', id: 25 },
21
+ { name: 'Lemon', id: 26 },
22
+ { name: 'Mango', id: 27 },
23
+ { name: 'Blueberry', id: 33 },
24
+ { name: 'Apple', id: 6 },
25
+ { name: 'Guava', id: 37 },
26
+ { name: 'Apricot', id: 35 },
27
+ { name: 'Papaya', id: 42 },
28
+ { name: 'Melon', id: 41 },
29
+ { name: 'Tangerine', id: 77 },
30
+ { name: 'Pitahaya', id: 78 },
31
+ { name: 'Lime', id: 44 },
32
+ { name: 'Pomegranate', id: 79 },
33
+ { name: 'Dragonfruit', id: 80 },
34
+ { name: 'Grape', id: 81 },
35
+ { name: 'Morus', id: 82 },
36
+ { name: 'Feijoa', id: 76 },
37
+ { name: 'Avocado', id: 84 },
38
+ { name: 'Kiwifruit', id: 85 },
39
+ { name: 'Cranberry', id: 87 },
40
+ { name: 'Cherry', id: 9 },
41
+ { name: 'Peach', id: 86 },
42
+ { name: 'Jackfruit', id: 94 },
43
+ { name: 'Horned Melon', id: 95 },
44
+ { name: 'Hazelnut', id: 96 },
45
+ { name: 'Pomelo', id: 98 },
46
+ { name: 'Mangosteen', id: 99 },
47
+ ];
@@ -0,0 +1,83 @@
1
+ .ts-dropdown-container {
2
+ position: relative;
3
+ }
4
+ .ts-dropdown-input {
5
+ display: flex;
6
+ height: 32px;
7
+ padding-left: 16px;
8
+ padding-right: 12px;
9
+ background: #e1e3f5;
10
+ color: #3643ba;
11
+ cursor: pointer;
12
+ }
13
+ .ts-dropdown-input:hover {
14
+ background: #d7daf1;
15
+ }
16
+ .ts-dropdown-label {
17
+ display: flex;
18
+ align-items: center;
19
+ height: 32px;
20
+ margin-right: 2px;
21
+ }
22
+ .ts-dropdown-input--chevron {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ height: 32px;
27
+ }
28
+ .ts-dropdown-menu-container {
29
+ position: absolute;
30
+ top: calc(100% + 8px);
31
+ display: flex;
32
+ flex-direction: column;
33
+ width: 320px;
34
+ max-height: 200px;
35
+ padding: 12px;
36
+ box-shadow: 0px 8px 9px 0px #1010101a;
37
+ background: #ffffff;
38
+ overflow: hidden;
39
+ z-index: 10;
40
+ }
41
+ .ts-dropdown-search {
42
+ padding-bottom: 12px;
43
+ border-bottom: 1px solid #d9dde1;
44
+ }
45
+ .ts-dropdown-menu-loader {
46
+ display: flex;
47
+ align-items: center;
48
+ justify-content: center;
49
+ padding-top: 12px;
50
+ }
51
+ .ts-dropdown-menu-error-text {
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ padding-top: 12px;
56
+ color: #687787;
57
+ font-style: italic;
58
+ }
59
+ .ts-dropdown-menu {
60
+ padding-top: 12px;
61
+ overflow: auto;
62
+ }
63
+ .ts-dropdown-menu-item {
64
+ display: flex;
65
+ align-items: center;
66
+ height: 32px;
67
+ padding: 0 12px;
68
+ cursor: pointer;
69
+ }
70
+ .ts-dropdown-menu-item:hover {
71
+ background: #e1e3f5;
72
+ color: #3643ba;
73
+ }
74
+
75
+ /* ######### */
76
+ /* GLOBALS */
77
+ * {
78
+ font-size: 14px;
79
+ outline: none;
80
+ box-sizing: border-box;
81
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',
82
+ 'Helvetica Neue', sans-serif;
83
+ }
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ import { TsDropdownFilterProps } from './TsDropdownFilter.types';
3
+ import './TsDropdownFilter.css';
4
+ export declare const TsDropdownFilter: <T>({ label, searchPlaceholder, loadOptions, getOptionLabel, getOptionValue, onChange, }: TsDropdownFilterProps<T>) => React.JSX.Element;
@@ -0,0 +1,62 @@
1
+ import * as React from 'react';
2
+ import { useEffect, useState } from 'react';
3
+ import { useClickOutside } from '../../../hooks/use-click-outside';
4
+ import { capitalize } from '../../../utils/string.utils';
5
+ import { TsIcon } from '../../TsIcon/TsIcon';
6
+ import { TsInput } from '../../TsInput/TsInput/TsInput';
7
+ import { TsLoader } from '../../TsLoader/TsLoader';
8
+ import './TsDropdownFilter.css';
9
+ export const TsDropdownFilter = ({ label, searchPlaceholder, loadOptions, getOptionLabel, getOptionValue, onChange, }) => {
10
+ const [searchValue, setSearchValue] = useState('');
11
+ const [showDropdown, setShowDropdown] = useState(false);
12
+ const [items, setItems] = useState([]);
13
+ const [loading, setLoading] = useState(true);
14
+ const ref = useClickOutside(() => setShowDropdown(false));
15
+ // ########
16
+ // Fetchers
17
+ const fetchAllItems = () => {
18
+ return loadOptions(searchValue)
19
+ .then(setItems)
20
+ .catch(() => { }); // TODO: Manage fetch ERRORS (Show an error message : 'An error occured, please retry later' or something else)
21
+ };
22
+ // ########
23
+ // Handlers
24
+ const handleSelectItem = (value) => {
25
+ onChange(value);
26
+ setShowDropdown(false);
27
+ };
28
+ // ########
29
+ // Watchers
30
+ useEffect(() => {
31
+ if (!showDropdown)
32
+ setSearchValue('');
33
+ }, [showDropdown]);
34
+ useEffect(() => {
35
+ setLoading(true);
36
+ if (!searchValue) {
37
+ fetchAllItems().finally(() => setLoading(false));
38
+ }
39
+ else {
40
+ const timeOutId = setTimeout(() => {
41
+ fetchAllItems().finally(() => setLoading(false));
42
+ }, 500);
43
+ return () => clearTimeout(timeOutId);
44
+ }
45
+ return;
46
+ }, [searchValue]);
47
+ // #########
48
+ // Rendering
49
+ return (React.createElement("div", { className: "ts-dropdown-container", ref: ref },
50
+ React.createElement("div", { className: "ts-dropdown-input", onClick: () => setShowDropdown(!showDropdown) },
51
+ React.createElement("div", { className: "ts-dropdown-label" }, label),
52
+ React.createElement("div", { className: "ts-dropdown-input--chevron" },
53
+ React.createElement(TsIcon, { name: showDropdown ? 'chevron-up' : 'chevron-down' }))),
54
+ showDropdown && (React.createElement("div", { className: "ts-dropdown-menu-container" },
55
+ React.createElement("div", { className: "ts-dropdown-search" },
56
+ React.createElement(TsInput, { icon: "search", placeholder: searchPlaceholder, value: searchValue, autoFocus: true, onChange: setSearchValue })),
57
+ loading && (React.createElement("div", { className: "ts-dropdown-menu-loader" },
58
+ React.createElement(TsLoader, { size: "sm" }))),
59
+ !loading && items.length === 0 && React.createElement("div", { className: "ts-dropdown-menu-error-text" }, "Nothing found."),
60
+ !loading && items.length > 0 && (React.createElement("div", { className: "ts-dropdown-menu" }, items.map(item => (React.createElement("div", { key: getOptionValue(item), className: "ts-dropdown-menu-item", onClick: () => handleSelectItem(item) }, capitalize(getOptionLabel(item)))))))))));
61
+ };
62
+ //# sourceMappingURL=TsDropdownFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TsDropdownFilter.js","sourceRoot":"","sources":["../../../../src/components/TsDropdowns/TsDropdownFilter/TsDropdownFilter.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import * as React from 'react';
2
+ import { useEffect, useState } from 'react';
3
+ import { useClickOutside } from '../../../hooks/use-click-outside';
4
+ import { capitalize } from '../../../utils/string.utils';
5
+ import { TsIcon } from '../../TsIcon/TsIcon';
6
+ import { TsInput } from '../../TsInput/TsInput/TsInput';
7
+ import { TsLoader } from '../../TsLoader/TsLoader';
8
+ import { TsDropdownFilterProps } from './TsDropdownFilter.types';
9
+ import './TsDropdownFilter.css';
10
+
11
+ export const TsDropdownFilter = <T,>({
12
+ label,
13
+ searchPlaceholder,
14
+ loadOptions,
15
+ getOptionLabel,
16
+ getOptionValue,
17
+ onChange,
18
+ }: TsDropdownFilterProps<T>) => {
19
+ const [searchValue, setSearchValue] = useState<string>('');
20
+ const [showDropdown, setShowDropdown] = useState<boolean>(false);
21
+ const [items, setItems] = useState<T[]>([]);
22
+ const [loading, setLoading] = useState<boolean>(true);
23
+ const ref = useClickOutside(() => setShowDropdown(false));
24
+
25
+ // ########
26
+ // Fetchers
27
+ const fetchAllItems = () => {
28
+ return loadOptions(searchValue)
29
+ .then(setItems)
30
+ .catch(() => {}); // TODO: Manage fetch ERRORS (Show an error message : 'An error occured, please retry later' or something else)
31
+ };
32
+
33
+ // ########
34
+ // Handlers
35
+ const handleSelectItem = (value: T) => {
36
+ onChange(value);
37
+ setShowDropdown(false);
38
+ };
39
+
40
+ // ########
41
+ // Watchers
42
+ useEffect(() => {
43
+ if (!showDropdown) setSearchValue('');
44
+ }, [showDropdown]);
45
+ useEffect(() => {
46
+ setLoading(true);
47
+
48
+ if (!searchValue) {
49
+ fetchAllItems().finally(() => setLoading(false));
50
+ } else {
51
+ const timeOutId = setTimeout(() => {
52
+ fetchAllItems().finally(() => setLoading(false));
53
+ }, 500);
54
+ return () => clearTimeout(timeOutId);
55
+ }
56
+ return;
57
+ }, [searchValue]);
58
+
59
+ // #########
60
+ // Rendering
61
+ return (
62
+ <div className="ts-dropdown-container" ref={ref}>
63
+ <div className="ts-dropdown-input" onClick={() => setShowDropdown(!showDropdown)}>
64
+ <div className="ts-dropdown-label">{label}</div>
65
+ <div className="ts-dropdown-input--chevron">
66
+ <TsIcon name={showDropdown ? 'chevron-up' : 'chevron-down'} />
67
+ </div>
68
+ </div>
69
+
70
+ {showDropdown && (
71
+ <div className="ts-dropdown-menu-container">
72
+ <div className="ts-dropdown-search">
73
+ <TsInput
74
+ icon="search"
75
+ placeholder={searchPlaceholder}
76
+ value={searchValue}
77
+ autoFocus
78
+ onChange={setSearchValue}
79
+ />
80
+ </div>
81
+
82
+ {loading && (
83
+ <div className="ts-dropdown-menu-loader">
84
+ <TsLoader size="sm" />
85
+ </div>
86
+ )}
87
+ {!loading && items.length === 0 && <div className="ts-dropdown-menu-error-text">Nothing found.</div>}
88
+ {!loading && items.length > 0 && (
89
+ <div className="ts-dropdown-menu">
90
+ {items.map(item => (
91
+ <div
92
+ key={getOptionValue(item)}
93
+ className="ts-dropdown-menu-item"
94
+ onClick={() => handleSelectItem(item)}
95
+ >
96
+ {capitalize(getOptionLabel(item))}
97
+ </div>
98
+ ))}
99
+ </div>
100
+ )}
101
+ </div>
102
+ )}
103
+ </div>
104
+ );
105
+ };
@@ -0,0 +1,8 @@
1
+ export type TsDropdownFilterProps<T> = {
2
+ label: string;
3
+ searchPlaceholder?: string;
4
+ loadOptions: (query?: string) => Promise<T[]>;
5
+ getOptionLabel: (item: T) => string;
6
+ getOptionValue: (item: T) => string;
7
+ onChange: (item: T) => void;
8
+ };