@bynder/compact-view 5.1.2 → 5.1.4

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 (377) hide show
  1. package/ActiveFilter.js +33 -0
  2. package/ActiveFilter.js.map +1 -0
  3. package/ActiveFilters.js +81 -0
  4. package/ActiveFilters.js.map +1 -0
  5. package/AddMedia.js +90 -0
  6. package/AddMedia.js.map +1 -0
  7. package/Advanced.js +66 -0
  8. package/Advanced.js.map +1 -0
  9. package/App.d.ts +1 -1
  10. package/App.js +89 -0
  11. package/App.js.map +1 -0
  12. package/AssetCard.js +172 -0
  13. package/AssetCard.js.map +1 -0
  14. package/AssetCardMetaproperties.js +47 -0
  15. package/AssetCardMetaproperties.js.map +1 -0
  16. package/AssetFilter.js +158 -0
  17. package/AssetFilter.js.map +1 -0
  18. package/AssetFilterContext.js +162 -0
  19. package/AssetFilterContext.js.map +1 -0
  20. package/AssetItem.js +40 -0
  21. package/AssetItem.js.map +1 -0
  22. package/AssetList.js +158 -0
  23. package/AssetList.js.map +1 -0
  24. package/AssetTypeItem.js +34 -0
  25. package/AssetTypeItem.js.map +1 -0
  26. package/AssetsView.js +61 -0
  27. package/AssetsView.js.map +1 -0
  28. package/Autocomplete.js +148 -0
  29. package/Autocomplete.js.map +1 -0
  30. package/ButtonAction.js +14 -0
  31. package/ButtonAction.js.map +1 -0
  32. package/CardSkeleton.js +31 -0
  33. package/CardSkeleton.js.map +1 -0
  34. package/Checkbox.styles.js +38 -0
  35. package/Checkbox.styles.js.map +1 -0
  36. package/Chip.js +43 -0
  37. package/Chip.js.map +1 -0
  38. package/CollectionCard.js +56 -0
  39. package/CollectionCard.js.map +1 -0
  40. package/CollectionItem.js +41 -0
  41. package/CollectionItem.js.map +1 -0
  42. package/CollectionList.js +53 -0
  43. package/CollectionList.js.map +1 -0
  44. package/CollectionView.js +73 -0
  45. package/CollectionView.js.map +1 -0
  46. package/CollectionsView.js +58 -0
  47. package/CollectionsView.js.map +1 -0
  48. package/ConfigContext.js +18 -0
  49. package/ConfigContext.js.map +1 -0
  50. package/ConnectButton.js +20 -0
  51. package/ConnectButton.js.map +1 -0
  52. package/Container.js +52 -0
  53. package/Container.js.map +1 -0
  54. package/ContextAction.js +42 -0
  55. package/ContextAction.js.map +1 -0
  56. package/Dat/Dat.d.ts +2 -12
  57. package/Dat/DatDropdownItem.d.ts +1 -1
  58. package/Dat/index.d.ts +0 -1
  59. package/Dat/types.d.ts +1 -1
  60. package/Dat.js +90 -0
  61. package/Dat.js.map +1 -0
  62. package/DatDropdownItem.js +47 -0
  63. package/DatDropdownItem.js.map +1 -0
  64. package/DesignSystemContext.js +12 -0
  65. package/DesignSystemContext.js.map +1 -0
  66. package/DirectionSelect.js +43 -0
  67. package/DirectionSelect.js.map +1 -0
  68. package/DocumentIcon.js +69 -0
  69. package/DocumentIcon.js.map +1 -0
  70. package/DomainInput.js +39 -0
  71. package/DomainInput.js.map +1 -0
  72. package/DragSelect.js +144 -0
  73. package/DragSelect.js.map +1 -0
  74. package/Dropdown.js +72 -0
  75. package/Dropdown.js.map +1 -0
  76. package/DropdownContent.js +59 -0
  77. package/DropdownContent.js.map +1 -0
  78. package/DropdownListItem.js +52 -0
  79. package/DropdownListItem.js.map +1 -0
  80. package/ErrorIcon.js +48 -0
  81. package/ErrorIcon.js.map +1 -0
  82. package/ErrorMessage.js +40 -0
  83. package/ErrorMessage.js.map +1 -0
  84. package/FieldSelect.js +74 -0
  85. package/FieldSelect.js.map +1 -0
  86. package/FileSelector.js +239 -0
  87. package/FileSelector.js.map +1 -0
  88. package/Header.js +42 -0
  89. package/Header.js.map +1 -0
  90. package/HorizontalScroll.js +51 -0
  91. package/HorizontalScroll.js.map +1 -0
  92. package/InfiniteScroll.js +26 -0
  93. package/InfiniteScroll.js.map +1 -0
  94. package/LeftArrow.js +31 -0
  95. package/LeftArrow.js.map +1 -0
  96. package/LoginComponent.js +32 -0
  97. package/LoginComponent.js.map +1 -0
  98. package/LoginContext.js +85 -0
  99. package/LoginContext.js.map +1 -0
  100. package/MetapropertyFilterContent.js +25 -0
  101. package/MetapropertyFilterContent.js.map +1 -0
  102. package/MetapropertyOption.js +24 -0
  103. package/MetapropertyOption.js.map +1 -0
  104. package/Modal.js +48 -0
  105. package/Modal.js.map +1 -0
  106. package/NoResults.js +51 -0
  107. package/NoResults.js.map +1 -0
  108. package/Oops.js +54 -0
  109. package/Oops.js.map +1 -0
  110. package/Option.js +50 -0
  111. package/Option.js.map +1 -0
  112. package/RefreshingSpinner.js +22 -0
  113. package/RefreshingSpinner.js.map +1 -0
  114. package/ReportModal.js +51 -0
  115. package/ReportModal.js.map +1 -0
  116. package/RightArrow.js +31 -0
  117. package/RightArrow.js.map +1 -0
  118. package/RootElementContext.js +12 -0
  119. package/RootElementContext.js.map +1 -0
  120. package/SearchInput.js +76 -0
  121. package/SearchInput.js.map +1 -0
  122. package/SelectedItemContainer.js +44 -0
  123. package/SelectedItemContainer.js.map +1 -0
  124. package/SelectedItems.js +27 -0
  125. package/SelectedItems.js.map +1 -0
  126. package/SelectionContext.js +144 -0
  127. package/SelectionContext.js.map +1 -0
  128. package/SelectionFooter.js +65 -0
  129. package/SelectionFooter.js.map +1 -0
  130. package/ShadowRoot.js +11 -0
  131. package/ShadowRoot.js.map +1 -0
  132. package/ShadowRootInternal.js +78 -0
  133. package/ShadowRootInternal.js.map +1 -0
  134. package/Shield.js +25 -0
  135. package/Shield.js.map +1 -0
  136. package/Skeleton.js +43 -0
  137. package/Skeleton.js.map +1 -0
  138. package/SmartFilterContent.js +11 -0
  139. package/SmartFilterContent.js.map +1 -0
  140. package/SmartFilterSelect.js +91 -0
  141. package/SmartFilterSelect.js.map +1 -0
  142. package/Smartfilters.js +186 -0
  143. package/Smartfilters.js.map +1 -0
  144. package/Spinner.js +32 -0
  145. package/Spinner.js.map +1 -0
  146. package/StatefulAssetList.js +100 -0
  147. package/StatefulAssetList.js.map +1 -0
  148. package/Styles.css.js +5 -0
  149. package/Styles.css.js.map +1 -0
  150. package/SwitchNLS.js +80 -0
  151. package/SwitchNLS.js.map +1 -0
  152. package/TagItem.js +38 -0
  153. package/TagItem.js.map +1 -0
  154. package/Tags.js +48 -0
  155. package/Tags.js.map +1 -0
  156. package/Theming.js +30 -0
  157. package/Theming.js.map +1 -0
  158. package/Toolbar.js +53 -0
  159. package/Toolbar.js.map +1 -0
  160. package/Tooltip.js +81 -0
  161. package/Tooltip.js.map +1 -0
  162. package/ViewSwitch.js +45 -0
  163. package/ViewSwitch.js.map +1 -0
  164. package/api/filterAssets.d.ts +1 -1
  165. package/api/getCollections.d.ts +1 -1
  166. package/api/getFilters.d.ts +1 -1
  167. package/api/getSimilarityAssets.d.ts +1 -1
  168. package/api/index.d.ts +2 -2
  169. package/api/rest/autocomplete.d.ts +1 -1
  170. package/api/rest/getAssetCounts.d.ts +2 -2
  171. package/api/rest/getInitialFilters.d.ts +2 -2
  172. package/api/rest/getMetapropertiesOptions.d.ts +1 -1
  173. package/app-config/ConfigContext.d.ts +3 -4
  174. package/app-config/appConfig.type.guard.d.ts +1 -1
  175. package/asset.type.js +31 -0
  176. package/asset.type.js.map +1 -0
  177. package/asyncDebounce.js +14 -0
  178. package/asyncDebounce.js.map +1 -0
  179. package/auth.js +35 -0
  180. package/auth.js.map +1 -0
  181. package/autocomplete2.js +25 -0
  182. package/autocomplete2.js.map +1 -0
  183. package/base64Converter.js +15 -0
  184. package/base64Converter.js.map +1 -0
  185. package/chunk.js +10 -0
  186. package/chunk.js.map +1 -0
  187. package/class.js +7 -0
  188. package/class.js.map +1 -0
  189. package/combineFilters.js +9 -0
  190. package/combineFilters.js.map +1 -0
  191. package/combineMetaproperties.js +25 -0
  192. package/combineMetaproperties.js.map +1 -0
  193. package/common/components/CardSkeleton.d.ts +1 -1
  194. package/common/components/Checkbox.styles.d.ts +4 -4
  195. package/common/components/Chip.d.ts +1 -1
  196. package/common/components/DocumentIcon.d.ts +1 -1
  197. package/common/components/DragSelect.d.ts +1 -1
  198. package/common/components/HorizontalScroll.d.ts +1 -1
  199. package/common/components/InfiniteScroll.d.ts +1 -1
  200. package/common/components/LeftArrow.d.ts +1 -1
  201. package/common/components/Modal.d.ts +1 -1
  202. package/common/components/NoResults.d.ts +1 -1
  203. package/common/components/RightArrow.d.ts +1 -1
  204. package/common/components/Skeleton.d.ts +1 -1
  205. package/common/components/Spinner.d.ts +1 -1
  206. package/common/components/Tooltip.d.ts +1 -1
  207. package/common/components/dropdown/Dropdown.d.ts +1 -1
  208. package/common/components/dropdown/DropdownContent.d.ts +1 -1
  209. package/common/components/dropdown/DropdownListItem.d.ts +1 -1
  210. package/common/hooks/useClickOutside.d.ts +1 -1
  211. package/constants.js +15 -0
  212. package/constants.js.map +1 -0
  213. package/createSelectors.js +11 -0
  214. package/createSelectors.js.map +1 -0
  215. package/crypto.js +21 -0
  216. package/crypto.js.map +1 -0
  217. package/error-handling/ErrorIcon.d.ts +1 -1
  218. package/error-handling/ErrorMessage.d.ts +1 -1
  219. package/error-handling/Oops.d.ts +1 -1
  220. package/error-handling/ReportModal.d.ts +1 -1
  221. package/error-handling/Shield.d.ts +1 -1
  222. package/filter/AssetFilter.d.ts +1 -1
  223. package/filter/AssetFilterContext.d.ts +3 -3
  224. package/filter/active-filters/ActiveFilter.d.ts +1 -1
  225. package/filter/active-filters/ActiveFilters.d.ts +1 -1
  226. package/filter/filters/advanced/Advanced.d.ts +1 -1
  227. package/filter/filters/advanced/AssetTypeItem.d.ts +1 -1
  228. package/filter/filters/metaproperty/Metaproperty.d.ts +1 -1
  229. package/filter/filters/metaproperty/MetapropertyFilterContent.d.ts +1 -1
  230. package/filter/filters/metaproperty/MetapropertyOption.d.ts +1 -1
  231. package/filter/filters/metaproperty/SmartFilterContent.d.ts +1 -1
  232. package/filter/filters/smartfilters/Metaproperties/Autocomplete.d.ts +3 -3
  233. package/filter/filters/smartfilters/Metaproperties/Option.d.ts +2 -2
  234. package/filter/filters/smartfilters/Metaproperties/SmartFilterSelect.d.ts +2 -2
  235. package/filter/filters/smartfilters/Smartfilters.d.ts +2 -2
  236. package/filter/filters/tags/TagItem.d.ts +1 -1
  237. package/filter/filters/tags/Tags.d.ts +1 -1
  238. package/filterAssets.js +175 -0
  239. package/filterAssets.js.map +1 -0
  240. package/filterEmptyMetaproperties.js +11 -0
  241. package/filterEmptyMetaproperties.js.map +1 -0
  242. package/getAsset.js +70 -0
  243. package/getAsset.js.map +1 -0
  244. package/getAssetCounts.js +27 -0
  245. package/getAssetCounts.js.map +1 -0
  246. package/getAssets.js +137 -0
  247. package/getAssets.js.map +1 -0
  248. package/getCollections.js +78 -0
  249. package/getCollections.js.map +1 -0
  250. package/getFilters.js +84 -0
  251. package/getFilters.js.map +1 -0
  252. package/getInitialFilters.js +51 -0
  253. package/getInitialFilters.js.map +1 -0
  254. package/getMetapropertiesOptions.js +31 -0
  255. package/getMetapropertiesOptions.js.map +1 -0
  256. package/getSimilarityAssets.js +141 -0
  257. package/getSimilarityAssets.js.map +1 -0
  258. package/handlers.js +11 -0
  259. package/handlers.js.map +1 -0
  260. package/helpers.js +7 -0
  261. package/helpers.js.map +1 -0
  262. package/index.js +9 -1162
  263. package/index.js.map +1 -0
  264. package/index2.js +18 -0
  265. package/index2.js.map +1 -0
  266. package/index3.js +36 -0
  267. package/index3.js.map +1 -0
  268. package/index4.js +20 -0
  269. package/index4.js.map +1 -0
  270. package/logger.js +7 -0
  271. package/logger.js.map +1 -0
  272. package/login/LoginComponent.d.ts +1 -1
  273. package/login/LoginContext.d.ts +1 -1
  274. package/login/components/ConnectButton.d.ts +1 -1
  275. package/login/components/Container.d.ts +1 -1
  276. package/login/components/DomainInput.d.ts +1 -1
  277. package/login/components/Header.d.ts +1 -1
  278. package/login/components/RefreshingSpinner.d.ts +1 -1
  279. package/loginwindow.js +84 -0
  280. package/loginwindow.js.map +1 -0
  281. package/normalizeResponse.js +31 -0
  282. package/normalizeResponse.js.map +1 -0
  283. package/oauth2.js +87 -0
  284. package/oauth2.js.map +1 -0
  285. package/order/DirectionSelect.d.ts +1 -1
  286. package/order/FieldSelect.d.ts +2 -2
  287. package/package.json +2 -9
  288. package/result.type.js +25 -0
  289. package/result.type.js.map +1 -0
  290. package/router/RouterContext.d.ts +1 -1
  291. package/search/SearchInput.d.ts +1 -1
  292. package/search/SwitchNLS.d.ts +1 -1
  293. package/search/index.d.ts +0 -2
  294. package/select/FileSelector.d.ts +1 -1
  295. package/select/SelectionContext.d.ts +1 -1
  296. package/select/SelectionFooter.d.ts +1 -1
  297. package/select/add-media/AddMedia.d.ts +1 -1
  298. package/select/add-media/ButtonAction.d.ts +1 -1
  299. package/select/current-selection/AssetItem.d.ts +1 -1
  300. package/select/current-selection/CollectionItem.d.ts +1 -1
  301. package/select/current-selection/SelectedItemContainer.d.ts +1 -1
  302. package/select/current-selection/SelectedItems.d.ts +1 -1
  303. package/store/useDatStore.d.ts +73 -0
  304. package/store/useOrderingStore.d.ts +2 -2
  305. package/store/useRouterStore.d.ts +4 -4
  306. package/store/useSearchStore.d.ts +69 -0
  307. package/store/useSimilaritySearchStore.d.ts +67 -0
  308. package/style/DesignSystemContext.d.ts +1 -1
  309. package/style/RootElementContext.d.ts +1 -1
  310. package/style/Theming.d.ts +1 -1
  311. package/style/shadowroot/ShadowRoot.d.ts +1 -1
  312. package/style/shadowroot/ShadowRootInternal.d.ts +1 -1
  313. package/text.js +9 -0
  314. package/text.js.map +1 -0
  315. package/toolbar/Toolbar.d.ts +1 -1
  316. package/toolbar/ViewSwitch.d.ts +1 -1
  317. package/trimMetapropertyValue.js +6 -0
  318. package/trimMetapropertyValue.js.map +1 -0
  319. package/url.js +7 -0
  320. package/url.js.map +1 -0
  321. package/useAccountDomain.js +33 -0
  322. package/useAccountDomain.js.map +1 -0
  323. package/useAuthInformation.js +42 -0
  324. package/useAuthInformation.js.map +1 -0
  325. package/useClickOutside.js +16 -0
  326. package/useClickOutside.js.map +1 -0
  327. package/useDatStore.js +62 -0
  328. package/useDatStore.js.map +1 -0
  329. package/useDimensions.js +31 -0
  330. package/useDimensions.js.map +1 -0
  331. package/useOrderingStore.js +27 -0
  332. package/useOrderingStore.js.map +1 -0
  333. package/useRouterStore.js +21 -0
  334. package/useRouterStore.js.map +1 -0
  335. package/useSearchStore.js +49 -0
  336. package/useSearchStore.js.map +1 -0
  337. package/useSimilaritySearchStore.js +28 -0
  338. package/useSimilaritySearchStore.js.map +1 -0
  339. package/utils/base64Converter.d.ts +1 -1
  340. package/utils/combineFilters.d.ts +1 -1
  341. package/utils/combineMetaproperties.d.ts +2 -2
  342. package/utils/filterEmptyMetaproperties.d.ts +1 -1
  343. package/utils/getMetaPropertiesForFilter.d.ts +1 -1
  344. package/utils/normalizeResponse.d.ts +1 -1
  345. package/utils.js +49 -0
  346. package/utils.js.map +1 -0
  347. package/utils2.js +51 -0
  348. package/utils2.js.map +1 -0
  349. package/views/asset/AssetList.d.ts +5 -3
  350. package/views/asset/AssetsView.d.ts +1 -1
  351. package/views/asset/StatefulAssetList.d.ts +2 -2
  352. package/views/asset/asset-card/AssetCard.d.ts +1 -1
  353. package/views/asset/asset-card/AssetCardMetaproperties.d.ts +3 -3
  354. package/views/asset/asset-card/ContextAction.d.ts +1 -1
  355. package/views/collection/CollectionView.d.ts +1 -1
  356. package/views/collections/CollectionCard.d.ts +1 -1
  357. package/views/collections/CollectionList.d.ts +1 -1
  358. package/views/collections/CollectionsView.d.ts +1 -1
  359. package/Dat/DatContext.d.ts +0 -12
  360. package/__tests__/utils/index.d.ts +0 -116
  361. package/api/__tests__/testMocks/mocks.d.ts +0 -14
  362. package/api/__tests__/utils.d.ts +0 -10
  363. package/common/components/__mocks__/Tooltip.d.ts +0 -6
  364. package/common/components/__tests__/utils.d.ts +0 -34
  365. package/error-handling/__tests__/utils.d.ts +0 -56
  366. package/filter/__tests__/utils.d.ts +0 -13
  367. package/index.mjs +0 -1163
  368. package/login/__tests__/mocks.d.ts +0 -1
  369. package/login/__tests__/utils.d.ts +0 -41
  370. package/search/SearchContext.d.ts +0 -25
  371. package/search/SimilaritySearchContext.d.ts +0 -21
  372. package/search/__mocks__/SimilaritySearchContext.d.ts +0 -5
  373. package/select/__tests__/utils.d.ts +0 -11
  374. package/style/shadowroot/__mocks__/ShadowRoot.d.ts +0 -4
  375. package/utils/__mocks__/logger.d.ts +0 -4
  376. package/views/asset/__tests__/utils.d.ts +0 -7
  377. package/views/collections/__tests__/utils.d.ts +0 -5
@@ -0,0 +1,91 @@
1
+ import { jsxs as S, jsx as i } from "react/jsx-runtime";
2
+ import { useState as l } from "react";
3
+ import r from "styled-components";
4
+ import { token as n } from "@bynder/design-system";
5
+ import { getMetapropertiesOptions as C } from "./getMetapropertiesOptions.js";
6
+ import { InfiniteScroll as $ } from "./InfiniteScroll.js";
7
+ import { OptionComponent as v } from "./Option.js";
8
+ import { useAuth as z } from "./LoginContext.js";
9
+ const E = ({
10
+ metaproperty: t,
11
+ smartfilterId: h,
12
+ onOptionSelect: m,
13
+ selectedOptions: p,
14
+ filteredMetaproperty: a
15
+ }) => {
16
+ const x = z(), [f, d] = l(!1), [s, g] = l(t.options), [u, c] = l(t.options.length % 30 === 0), w = async () => {
17
+ d(!0);
18
+ const e = s[s.length - 1];
19
+ try {
20
+ const o = await C({
21
+ auth: x,
22
+ smartfilterId: h,
23
+ metapropertyId: t.id,
24
+ labelKeyset: e.label,
25
+ zindexKeyset: e.zindex,
26
+ mpoKeyset: e.id
27
+ });
28
+ o.options.length ? (g((b) => [...b, ...o.options]), c(o.options.length % 30 === 0)) : c(!1);
29
+ } catch (o) {
30
+ throw new Error(`Error while loading more options: ${o}`);
31
+ } finally {
32
+ d(!1);
33
+ }
34
+ };
35
+ return /* @__PURE__ */ S(F, { "data-testid": "metaproperty-filter-content", children: [
36
+ /* @__PURE__ */ i(
37
+ L,
38
+ {
39
+ "data-testid": "metaproperty-title",
40
+ title: t.label || t.name,
41
+ children: t.label || t.name
42
+ }
43
+ ),
44
+ /* @__PURE__ */ i(M, { children: /* @__PURE__ */ i(
45
+ $,
46
+ {
47
+ isLoading: f,
48
+ hasNextPage: u,
49
+ loadMore: w,
50
+ children: s.map((e) => a[e?.name] ? /* @__PURE__ */ i(
51
+ v,
52
+ {
53
+ option: e,
54
+ onClick: m,
55
+ metapropertyName: t.name,
56
+ isSelected: !!p[t.name]?.[e.id],
57
+ metapropertyMultifilter: !!t.isMultifilter,
58
+ count: a[e.name],
59
+ showCount: t.showCounter
60
+ },
61
+ e.id
62
+ ) : null)
63
+ }
64
+ ) })
65
+ ] });
66
+ }, F = r.div`
67
+ color: ${n.colorText};
68
+ width: 282px;
69
+ `, L = r.h3`
70
+ padding: ${n.spacing5};
71
+ margin: 0;
72
+ overflow: hidden;
73
+ text-overflow: ellipsis;
74
+ white-space: nowrap;
75
+ font-size: ${n.fontSize100};
76
+ line-height: ${n.lineHeightText};
77
+ border-bottom: 1px solid rgba(3, 16, 38, 0.1);
78
+ box-shadow: 0px 0px 1px 0px rgba(3, 16, 38, 0.1), 0px 1px 4px -1px rgba(3, 16, 38, 0.1);
79
+ `, M = r.ul`
80
+ max-height: 400px;
81
+ overflow-y: auto;
82
+ padding: 0;
83
+ width: 100%;
84
+ list-style: none;
85
+ margin: 0;
86
+ scrollbar-width: none;
87
+ `;
88
+ export {
89
+ E as SmartFilterSelect
90
+ };
91
+ //# sourceMappingURL=SmartFilterSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartFilterSelect.js","sources":["../../src/filter/filters/smartfilters/Metaproperties/SmartFilterSelect.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { token } from '@bynder/design-system';\nimport {\n\tSmartfilterMetaproperty,\n\tSmartfilterOption,\n\tSmartfilterSelectedOptionType,\n} from '@src/api/rest/types';\nimport { getMetapropertiesOptions } from '@src/api/rest/getMetapropertiesOptions';\nimport { InfiniteScroll } from '@src/common/components/InfiniteScroll';\nimport { OptionComponent } from './Option';\nimport { useAuth } from '@src/login/LoginContext';\n\ntype Props = {\n\tmetaproperty: SmartfilterMetaproperty;\n\tsmartfilterId: string;\n\tonOptionSelect: (\n\t\tmetapropertyName: string,\n\t\toption: SmartfilterOption,\n\t\tmetapropertyMultifilter: boolean,\n\t) => void;\n\tselectedOptions: Record<string, Record<string, SmartfilterSelectedOptionType>>;\n\tfilteredMetaproperty: Record<string, number>;\n};\n\nconst SmartFilterSelect = ({\n\tmetaproperty,\n\tsmartfilterId,\n\tonOptionSelect,\n\tselectedOptions,\n\tfilteredMetaproperty,\n}: Props) => {\n\tconst auth = useAuth();\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [options, setOptions] = useState(metaproperty.options);\n\tconst [hasNextPage, setHasNextPage] = useState(metaproperty.options.length % 30 === 0);\n\n\tconst handleLoadMore = async () => {\n\t\tsetIsLoading(true);\n\t\tconst lastOption = options[options.length - 1];\n\n\t\ttry {\n\t\t\tconst response = await getMetapropertiesOptions({\n\t\t\t\tauth,\n\t\t\t\tsmartfilterId,\n\t\t\t\tmetapropertyId: metaproperty.id,\n\t\t\t\tlabelKeyset: lastOption.label,\n\t\t\t\tzindexKeyset: lastOption.zindex,\n\t\t\t\tmpoKeyset: lastOption.id,\n\t\t\t});\n\n\t\t\tif (response.options.length) {\n\t\t\t\tsetOptions((prevOptions) => [...prevOptions, ...response.options]);\n\t\t\t\tsetHasNextPage(response.options.length % 30 === 0);\n\t\t\t} else {\n\t\t\t\tsetHasNextPage(false);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Error while loading more options: ${error}`);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<FilterContent data-testid=\"metaproperty-filter-content\">\n\t\t\t<FilterHead\n\t\t\t\tdata-testid=\"metaproperty-title\"\n\t\t\t\ttitle={metaproperty.label || metaproperty.name}\n\t\t\t>\n\t\t\t\t{metaproperty.label || metaproperty.name}\n\t\t\t</FilterHead>\n\t\t\t<FilterList>\n\t\t\t\t<InfiniteScroll\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\thasNextPage={hasNextPage}\n\t\t\t\t\tloadMore={handleLoadMore}\n\t\t\t\t>\n\t\t\t\t\t{options.map((option) => {\n\t\t\t\t\t\tif (!filteredMetaproperty[option?.name]) {\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<OptionComponent\n\t\t\t\t\t\t\t\tkey={option.id}\n\t\t\t\t\t\t\t\toption={option}\n\t\t\t\t\t\t\t\tonClick={onOptionSelect}\n\t\t\t\t\t\t\t\tmetapropertyName={metaproperty.name}\n\t\t\t\t\t\t\t\tisSelected={!!selectedOptions[metaproperty.name]?.[option.id]}\n\t\t\t\t\t\t\t\tmetapropertyMultifilter={!!metaproperty.isMultifilter}\n\t\t\t\t\t\t\t\tcount={filteredMetaproperty[option.name]}\n\t\t\t\t\t\t\t\tshowCount={metaproperty.showCounter}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</InfiniteScroll>\n\t\t\t</FilterList>\n\t\t</FilterContent>\n\t);\n};\n\nexport { SmartFilterSelect };\n\nconst FilterContent = styled.div`\n\tcolor: ${token.colorText};\n\twidth: 282px;\n`;\n\nconst FilterHead = styled.h3`\n\tpadding: ${token.spacing5};\n\tmargin: 0;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tfont-size: ${token.fontSize100};\n\tline-height: ${token.lineHeightText};\n\tborder-bottom: 1px solid rgba(3, 16, 38, 0.1);\n\tbox-shadow: 0px 0px 1px 0px rgba(3, 16, 38, 0.1), 0px 1px 4px -1px rgba(3, 16, 38, 0.1);\n`;\n\nconst FilterList = styled.ul`\n\tmax-height: 400px;\n\toverflow-y: auto;\n\tpadding: 0;\n\twidth: 100%;\n\tlist-style: none;\n\tmargin: 0;\n\tscrollbar-width: none;\n`;\n"],"names":["SmartFilterSelect","metaproperty","smartfilterId","onOptionSelect","selectedOptions","filteredMetaproperty","auth","useAuth","isLoading","setIsLoading","useState","options","setOptions","hasNextPage","setHasNextPage","handleLoadMore","lastOption","response","getMetapropertiesOptions","prevOptions","error","jsxs","FilterContent","jsx","FilterHead","FilterList","InfiniteScroll","option","OptionComponent","styled","token"],"mappings":";;;;;;;;AAyBA,MAAMA,IAAoB,CAAC;AAAA,EAC1B,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,sBAAAC;AACD,MAAa;AACZ,QAAMC,IAAOC,EAAA,GACP,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACC,GAASC,CAAU,IAAIF,EAAST,EAAa,OAAO,GACrD,CAACY,GAAaC,CAAc,IAAIJ,EAAST,EAAa,QAAQ,SAAS,OAAO,CAAC,GAE/Ec,IAAiB,YAAY;AAClC,IAAAN,EAAa,EAAI;AACjB,UAAMO,IAAaL,EAAQA,EAAQ,SAAS,CAAC;AAE7C,QAAI;AACH,YAAMM,IAAW,MAAMC,EAAyB;AAAA,QAC/C,MAAAZ;AAAA,QACA,eAAAJ;AAAA,QACA,gBAAgBD,EAAa;AAAA,QAC7B,aAAae,EAAW;AAAA,QACxB,cAAcA,EAAW;AAAA,QACzB,WAAWA,EAAW;AAAA,MAAA,CACtB;AAED,MAAIC,EAAS,QAAQ,UACpBL,EAAW,CAACO,MAAgB,CAAC,GAAGA,GAAa,GAAGF,EAAS,OAAO,CAAC,GACjEH,EAAeG,EAAS,QAAQ,SAAS,OAAO,CAAC,KAEjDH,EAAe,EAAK;AAAA,IAEtB,SAASM,GAAO;AACf,YAAM,IAAI,MAAM,qCAAqCA,CAAK,EAAE;AAAA,IAC7D,UAAA;AACC,MAAAX,EAAa,EAAK;AAAA,IACnB;AAAA,EACD;AAEA,SACC,gBAAAY,EAACC,GAAA,EAAc,eAAY,+BAC1B,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACA,eAAY;AAAA,QACZ,OAAOvB,EAAa,SAASA,EAAa;AAAA,QAEzC,UAAAA,EAAa,SAASA,EAAa;AAAA,MAAA;AAAA,IAAA;AAAA,sBAEpCwB,GAAA,EACA,UAAA,gBAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACA,WAAAlB;AAAA,QACA,aAAAK;AAAA,QACA,UAAUE;AAAA,QAET,UAAAJ,EAAQ,IAAI,CAACgB,MACRtB,EAAqBsB,GAAQ,IAAI,IAKrC,gBAAAJ;AAAA,UAACK;AAAA,UAAA;AAAA,YAEA,QAAAD;AAAA,YACA,SAASxB;AAAA,YACT,kBAAkBF,EAAa;AAAA,YAC/B,YAAY,CAAC,CAACG,EAAgBH,EAAa,IAAI,IAAI0B,EAAO,EAAE;AAAA,YAC5D,yBAAyB,CAAC,CAAC1B,EAAa;AAAA,YACxC,OAAOI,EAAqBsB,EAAO,IAAI;AAAA,YACvC,WAAW1B,EAAa;AAAA,UAAA;AAAA,UAPnB0B,EAAO;AAAA,QAAA,IALN,IAeR;AAAA,MAAA;AAAA,IAAA,EACF,CACD;AAAA,EAAA,GACD;AAEF,GAIML,IAAgBO,EAAO;AAAA,UACnBC,EAAM,SAAS;AAAA;AAAA,GAInBN,IAAaK,EAAO;AAAA,YACdC,EAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,cAKZA,EAAM,WAAW;AAAA,gBACfA,EAAM,cAAc;AAAA;AAAA;AAAA,GAK9BL,IAAaI,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
@@ -0,0 +1,186 @@
1
+ import { jsx as r, Fragment as _, jsxs as O } from "react/jsx-runtime";
2
+ import { useState as u, useRef as p, useEffect as T } from "react";
3
+ import { styled as f } from "styled-components";
4
+ import { Box as q, token as S, Flex as G, Button as J } from "@bynder/design-system";
5
+ import { IconArrowLeft as K, IconArrowRight as Q } from "@bynder/icons";
6
+ import { useConfig as Y } from "./ConfigContext.js";
7
+ import { useAssetFilter as Z } from "./AssetFilterContext.js";
8
+ import { Dropdown as tt } from "./Dropdown.js";
9
+ import { Autocomplete as et } from "./Autocomplete.js";
10
+ import { SmartFilterSelect as nt } from "./SmartFilterSelect.js";
11
+ import { getAutocompleteOptions as rt } from "./autocomplete2.js";
12
+ import { useAuth as ot } from "./LoginContext.js";
13
+ import { debounceAsync as it } from "./asyncDebounce.js";
14
+ const vt = ({ smartfilters: l, metaproperties: m }) => {
15
+ const o = Z(), $ = ot(), { language: w } = Y(), k = lt(l), [L, D] = u({}), [X, A] = u(), [P, M] = u({}), [g, d] = u(0), [s, I] = u(0), [v, y] = u(!1), c = p(null), b = p(!1), a = p(null), h = p(null), x = p({});
16
+ T(() => {
17
+ c.current && I(c.current.scrollWidth - c.current.clientWidth), o.isDropdownActive || (D({}), A({}));
18
+ }, [l, c, o]);
19
+ const R = g === 0, U = s > 5 && g !== s;
20
+ function j() {
21
+ d((t) => {
22
+ const e = Math.max(t - 250, 0);
23
+ return e >= 100 ? e : 0;
24
+ });
25
+ }
26
+ function z() {
27
+ d((t) => {
28
+ const e = Math.min(t + 250, s);
29
+ return e <= s - 100 ? e : s;
30
+ });
31
+ }
32
+ const E = async (t, e) => {
33
+ let n;
34
+ M((i) => ({
35
+ ...i,
36
+ [e]: !0
37
+ })), t.length >= 2 && (n = await rt({
38
+ metapropertyId: e,
39
+ auth: $,
40
+ searchTerm: t
41
+ })), A((i) => ({
42
+ ...i,
43
+ [e]: n || null
44
+ })), M((i) => ({
45
+ ...i,
46
+ [e]: !1
47
+ }));
48
+ }, N = (t) => (x.current[t] || (x.current[t] = it(E, 500)), x.current[t]), F = (t, e, n) => {
49
+ o.selectSmartfilterOption(t, e, n);
50
+ }, W = (t, e) => {
51
+ D((i) => ({
52
+ ...i,
53
+ [t]: e
54
+ })), N(t)(e, t);
55
+ }, B = (t) => {
56
+ a.current = t.clientX, b.current = !1, y(!0);
57
+ }, H = (t) => {
58
+ if (b.current) {
59
+ t.preventDefault();
60
+ const e = (n) => {
61
+ n.stopPropagation(), document.removeEventListener("click", e, !0);
62
+ };
63
+ document.addEventListener("click", e, {
64
+ capture: !0,
65
+ once: !0
66
+ });
67
+ }
68
+ a.current = null, h.current = null, y(!1);
69
+ }, V = (t) => {
70
+ if (!v || !c.current || !a.current) return;
71
+ t.preventDefault(), h.current === null && (h.current = g), a.current && Math.abs(t.clientX - a.current) > 5 && (b.current = !0);
72
+ const e = (t.clientX - a.current) * -1 + h.current;
73
+ return e <= 16 ? d(0) : e + 16 < s ? d(e) : d(s);
74
+ };
75
+ return /* @__PURE__ */ r(_, { children: k.map((t) => m[t.id] ? /* @__PURE__ */ r(
76
+ tt,
77
+ {
78
+ title: t.labels[w] || t.labels.en_US,
79
+ alt: t.labels[w] || t.labels.en_US,
80
+ isSmall: !0,
81
+ fadeIn: !0,
82
+ isMetapropertyDropdown: !0,
83
+ children: () => /* @__PURE__ */ O(
84
+ st,
85
+ {
86
+ ref: c,
87
+ onMouseDown: B,
88
+ onMouseUp: H,
89
+ onMouseMove: V,
90
+ children: [
91
+ /* @__PURE__ */ r(
92
+ ct,
93
+ {
94
+ $scroll: g,
95
+ "data-testid": "metaproperty-dropdown-content",
96
+ $isDragging: v,
97
+ children: t.metaproperties.map((e) => {
98
+ const n = m[t.id][e];
99
+ if (!n || !o.existingFilters?.[n.name] || n.type !== "autocomplete" && (n.type !== "smart-single" && n.type !== "select" || n.options.length === 0))
100
+ return null;
101
+ const i = n.type === "autocomplete" ? /* @__PURE__ */ r(
102
+ et,
103
+ {
104
+ metaproperty: n,
105
+ value: L[n.id] || "",
106
+ onChange: W,
107
+ onOptionSelect: F,
108
+ autocompleteOptions: X || {},
109
+ isLoading: P[n.id] || !1,
110
+ selectedOptions: o.selectedSmartfilterOptions || {}
111
+ }
112
+ ) : /* @__PURE__ */ r(
113
+ nt,
114
+ {
115
+ metaproperty: n,
116
+ smartfilterId: t.id,
117
+ onOptionSelect: F,
118
+ selectedOptions: o.selectedSmartfilterOptions || {},
119
+ filteredMetaproperty: o.existingFilters?.[n.name]
120
+ }
121
+ );
122
+ return /* @__PURE__ */ r(at, { children: i }, e);
123
+ })
124
+ }
125
+ ),
126
+ /* @__PURE__ */ O(ut, { direction: "row", justifyContent: "flex-end", children: [
127
+ /* @__PURE__ */ r(
128
+ C,
129
+ {
130
+ title: "Previous",
131
+ icon: /* @__PURE__ */ r(K, {}),
132
+ onClick: j,
133
+ "data-testid": "left-arrow",
134
+ isDisabled: R
135
+ }
136
+ ),
137
+ /* @__PURE__ */ r(
138
+ C,
139
+ {
140
+ title: "Next",
141
+ icon: /* @__PURE__ */ r(Q, {}),
142
+ onClick: z,
143
+ "data-testid": "right-arrow",
144
+ isDisabled: !U
145
+ }
146
+ )
147
+ ] })
148
+ ]
149
+ }
150
+ )
151
+ },
152
+ t.id
153
+ ) : null) });
154
+ };
155
+ function lt(l) {
156
+ return [...l].sort((m, o) => m.zindex - o.zindex);
157
+ }
158
+ const st = f.div`
159
+ display: flex;
160
+ flex-direction: column;
161
+ overflow: hidden;
162
+ `, ct = f.div`
163
+ display: flex;
164
+ flex-direction: row;
165
+ transform: translateX(-${(l) => l.$scroll}px);
166
+ transition: transform 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.15);
167
+ width: fit-content;
168
+ cursor: ${(l) => l.$isDragging ? "grabbing" : "default"};
169
+ `, at = f(q)`
170
+ border-right: 1px solid rgba(3, 16, 38, 0.1);
171
+ max-width: 300px;
172
+ `, ut = f(G)`
173
+ padding: ${S.spacing3};
174
+ border-top: 1px solid rgba(3, 16, 38, 0.1);
175
+ gap: ${S.spacing3};
176
+ `, C = f(J)`
177
+ padding: ${S.spacing3};
178
+ border-radius: 6px;
179
+ border: 1px solid rgba(3, 16, 38, 0.1);
180
+ background: rgba(3, 16, 38, 0.03);
181
+ cursor: pointer;
182
+ `;
183
+ export {
184
+ vt as Smartfilter
185
+ };
186
+ //# sourceMappingURL=Smartfilters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Smartfilters.js","sources":["../../src/filter/filters/smartfilters/Smartfilters.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { styled } from 'styled-components';\nimport { Box, Button, Flex, token } from '@bynder/design-system';\nimport { IconArrowLeft, IconArrowRight } from '@bynder/icons';\nimport {\n\tSmartfilter as SmartfilterType,\n\tSmartfilterMetaproperty,\n\tSmartfilterOption,\n\tAutocompleteOption,\n} from '@src/api/rest/types';\nimport { useConfig } from '@src/app-config/ConfigContext';\nimport { useAssetFilter } from '../../AssetFilterContext';\nimport { Dropdown } from '@src/common/components/dropdown/Dropdown';\nimport { Autocomplete } from './Metaproperties/Autocomplete';\nimport { SmartFilterSelect } from './Metaproperties/SmartFilterSelect';\nimport { getAutocompleteOptions, AutocompleteOptions } from '@src/api/rest/autocomplete';\nimport { useAuth } from '@src/login/LoginContext';\nimport { debounceAsync } from '@src/utils/asyncDebounce';\n\ntype Props = {\n\tsmartfilters: SmartfilterType[];\n\tmetaproperties: Record<string, Record<string, SmartfilterMetaproperty>>;\n};\n\nconst Smartfilter = ({ smartfilters, metaproperties }: Props) => {\n\tconst assetFilterState = useAssetFilter();\n\tconst auth = useAuth();\n\tconst { language } = useConfig();\n\n\tconst sortedFilters = sortFilters(smartfilters);\n\n\tconst [inputValue, setInputValue] = useState<{ [key: string]: string }>({});\n\tconst [autocompleteOptions, setAutocompleteOptions] = useState<\n\t\tAutocompleteOptions | undefined\n\t>();\n\tconst [isLoading, setIsLoading] = useState<{ [key: string]: boolean }>({});\n\n\tconst [scroll, setScroll] = useState(0);\n\tconst [maxScroll, setMaxScroll] = useState(0);\n\n\tconst [isDragging, setIsDragging] = useState(false);\n\n\tconst nodeRef = useRef<HTMLDivElement>(null);\n\tconst hasMoved = useRef(false);\n\tconst initialX = useRef<number | null>(null);\n\tconst initialScrollPos = useRef<number | null>(null);\n\n\t// useRef to track inputs so we can debounce them individually\n\tconst debouncedFunctions = useRef<{\n\t\t[key: string]: (search: string, id: string) => Promise<void>;\n\t}>({});\n\n\tuseEffect(() => {\n\t\tif (nodeRef.current) {\n\t\t\tsetMaxScroll(nodeRef.current.scrollWidth - nodeRef.current.clientWidth);\n\t\t}\n\n\t\tif (!assetFilterState.isDropdownActive) {\n\t\t\tsetInputValue({});\n\t\t\tsetAutocompleteOptions({});\n\t\t}\n\t}, [smartfilters, nodeRef, assetFilterState]);\n\n\tconst isLeftArrowDisabled = scroll === 0;\n\tconst isRightArrowDisabled = maxScroll > 5 && scroll !== maxScroll;\n\n\tfunction handleLeftScroll() {\n\t\tsetScroll((prevScroll: number) => {\n\t\t\tconst leftScroll = Math.max(prevScroll - 250, 0);\n\n\t\t\treturn leftScroll >= 100 ? leftScroll : 0;\n\t\t});\n\t}\n\n\tfunction handleRightScroll() {\n\t\tsetScroll((prevScroll: number) => {\n\t\t\tconst rightScroll = Math.min(prevScroll + 250, maxScroll);\n\n\t\t\treturn rightScroll <= maxScroll - 100 ? rightScroll : maxScroll;\n\t\t});\n\t}\n\n\tconst handleApi = async (search: string, id: string) => {\n\t\tlet callAutocomplete;\n\t\t// set the loading state for the specific search as we can have more than 1\n\t\tsetIsLoading((prev) => ({\n\t\t\t...prev,\n\t\t\t[id]: true,\n\t\t}));\n\n\t\t// api searches of 1 character break the api returning a 500\n\t\tif (search.length >= 2) {\n\t\t\tcallAutocomplete = await getAutocompleteOptions({\n\t\t\t\tmetapropertyId: id,\n\t\t\t\tauth,\n\t\t\t\tsearchTerm: search,\n\t\t\t});\n\t\t}\n\n\t\tsetAutocompleteOptions((prev) => ({\n\t\t\t...prev,\n\t\t\t[id]: callAutocomplete ? callAutocomplete : null,\n\t\t}));\n\n\t\tsetIsLoading((prev) => ({\n\t\t\t...prev,\n\t\t\t[id]: false,\n\t\t}));\n\t};\n\n\tconst getDebouncedFunction = (id: string) => {\n\t\t// Create a debounced function for the specific input if it doesn't exist\n\t\tif (!debouncedFunctions.current[id]) {\n\t\t\tdebouncedFunctions.current[id] = debounceAsync(handleApi, 500) as (\n\t\t\t\tsearch: string,\n\t\t\t\tid: string,\n\t\t\t) => Promise<void>;\n\t\t}\n\n\t\treturn debouncedFunctions.current[id];\n\t};\n\n\tconst handleSmartfilterOptionSelections = (\n\t\tmetapropertyName: string,\n\t\toption: AutocompleteOption | SmartfilterOption,\n\t\tisMultifilter: boolean,\n\t) => {\n\t\tassetFilterState.selectSmartfilterOption(metapropertyName, option, isMultifilter);\n\t};\n\n\tconst handleAutocompleteInputChange = (metapropertyId: string, value: string) => {\n\t\tsetInputValue((prev) => ({\n\t\t\t...prev,\n\t\t\t[metapropertyId]: value,\n\t\t}));\n\t\tconst debouncedHandleApi = getDebouncedFunction(metapropertyId);\n\t\tdebouncedHandleApi(value, metapropertyId);\n\t};\n\n\tconst handleMouseDown = (event: React.MouseEvent<HTMLDivElement>) => {\n\t\t// Save the initial position for movement detection\n\t\tinitialX.current = event.clientX;\n\t\thasMoved.current = false;\n\t\tsetIsDragging(true);\n\t};\n\n\tconst handleMouseUp = (event: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (hasMoved.current) {\n\t\t\tevent.preventDefault();\n\t\t\tconst preventClickPropagation = (e: MouseEvent) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tdocument.removeEventListener('click', preventClickPropagation, true);\n\t\t\t};\n\n\t\t\t// Add a one-time click handler that will fire before any other click handlers\n\t\t\tdocument.addEventListener('click', preventClickPropagation, {\n\t\t\t\tcapture: true,\n\t\t\t\tonce: true,\n\t\t\t});\n\t\t}\n\n\t\tinitialX.current = null;\n\t\tinitialScrollPos.current = null;\n\n\t\tsetIsDragging(false);\n\t};\n\n\tconst handleDrag = (event: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (!isDragging || !nodeRef.current || !initialX.current) return;\n\n\t\tevent.preventDefault();\n\n\t\t// This tracks the initial scroll position when the drag starts so it doesn't reset\n\t\t// to 0 when the user starts dragging again.\n\t\tif (initialScrollPos.current === null) {\n\t\t\tinitialScrollPos.current = scroll;\n\t\t}\n\n\t\t// Check if we've moved enough to consider this a drag operation\n\t\tif (initialX.current) {\n\t\t\tconst deltaX = Math.abs(event.clientX - initialX.current);\n\n\t\t\t// If moved more than the threshold in either direction, mark as moved\n\t\t\tif (deltaX > 5) {\n\t\t\t\thasMoved.current = true;\n\t\t\t}\n\t\t}\n\n\t\tconst walkX = (event.clientX - initialX.current) * -1 + initialScrollPos.current;\n\n\t\t// 16 is to make the scroll a bit smoother in case of coming up short (Padding width offset)\n\t\tif (walkX <= 16) {\n\t\t\treturn setScroll(0);\n\t\t}\n\n\t\tif (walkX + 16 < maxScroll) {\n\t\t\treturn setScroll(walkX);\n\t\t}\n\n\t\treturn setScroll(maxScroll);\n\t};\n\n\t/* Note that it is important for the Dropdown component *not* to be rerendered when\n\t * the reference value of the filter object changes, only when it is actually a\n\t * different filter (i.e. when the ID changes). When a GraphQL request is made, the\n\t * same filter will be represented by a new object. If this causes a rerender of the\n\t * Dropdown component, the dropdown will close after every filter selection. Instead,\n\t * the dropdown should stay open after a filter is selected.\n\t */\n\treturn (\n\t\t<>\n\t\t\t{sortedFilters.map((filter) => {\n\t\t\t\tif (!metaproperties[filter.id]) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<Dropdown\n\t\t\t\t\t\tkey={filter.id}\n\t\t\t\t\t\ttitle={filter.labels[language] || filter.labels.en_US}\n\t\t\t\t\t\talt={filter.labels[language] || filter.labels.en_US}\n\t\t\t\t\t\tisSmall\n\t\t\t\t\t\tfadeIn\n\t\t\t\t\t\tisMetapropertyDropdown\n\t\t\t\t\t>\n\t\t\t\t\t\t{() => (\n\t\t\t\t\t\t\t<MetaPropertyFilterParent\n\t\t\t\t\t\t\t\tref={nodeRef}\n\t\t\t\t\t\t\t\tonMouseDown={handleMouseDown}\n\t\t\t\t\t\t\t\tonMouseUp={handleMouseUp}\n\t\t\t\t\t\t\t\tonMouseMove={handleDrag}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DropdownContentWrapper\n\t\t\t\t\t\t\t\t\t$scroll={scroll}\n\t\t\t\t\t\t\t\t\tdata-testid=\"metaproperty-dropdown-content\"\n\t\t\t\t\t\t\t\t\t$isDragging={isDragging}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{filter.metaproperties.map((metapropertyId) => {\n\t\t\t\t\t\t\t\t\t\tconst metaproperty =\n\t\t\t\t\t\t\t\t\t\t\tmetaproperties[filter.id][metapropertyId];\n\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t!metaproperty ||\n\t\t\t\t\t\t\t\t\t\t\t!assetFilterState.existingFilters?.[metaproperty.name]\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tmetaproperty.type !== 'autocomplete' &&\n\t\t\t\t\t\t\t\t\t\t\t((metaproperty.type !== 'smart-single' &&\n\t\t\t\t\t\t\t\t\t\t\t\tmetaproperty.type !== 'select') ||\n\t\t\t\t\t\t\t\t\t\t\t\tmetaproperty.options.length === 0)\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst content =\n\t\t\t\t\t\t\t\t\t\t\tmetaproperty.type === 'autocomplete' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Autocomplete\n\t\t\t\t\t\t\t\t\t\t\t\t\tmetaproperty={metaproperty}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={inputValue[metaproperty.id] || ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={handleAutocompleteInputChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonOptionSelect={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleSmartfilterOptionSelections\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tautocompleteOptions={autocompleteOptions || {}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisLoading={isLoading[metaproperty.id] || false}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectedOptions={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tassetFilterState.selectedSmartfilterOptions ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<SmartFilterSelect\n\t\t\t\t\t\t\t\t\t\t\t\t\tmetaproperty={metaproperty}\n\t\t\t\t\t\t\t\t\t\t\t\t\tsmartfilterId={filter.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonOptionSelect={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleSmartfilterOptionSelections\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectedOptions={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tassetFilterState.selectedSmartfilterOptions ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tfilteredMetaproperty={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tassetFilterState.existingFilters?.[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmetaproperty.name\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<DropdownContentContainer key={metapropertyId}>\n\t\t\t\t\t\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t\t\t\t\t\t</DropdownContentContainer>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</DropdownContentWrapper>\n\n\t\t\t\t\t\t\t\t<NavigationParent direction=\"row\" justifyContent=\"flex-end\">\n\t\t\t\t\t\t\t\t\t<NavigationArrow\n\t\t\t\t\t\t\t\t\t\ttitle=\"Previous\"\n\t\t\t\t\t\t\t\t\t\ticon={<IconArrowLeft />}\n\t\t\t\t\t\t\t\t\t\tonClick={handleLeftScroll}\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"left-arrow\"\n\t\t\t\t\t\t\t\t\t\tisDisabled={isLeftArrowDisabled}\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t<NavigationArrow\n\t\t\t\t\t\t\t\t\t\ttitle=\"Next\"\n\t\t\t\t\t\t\t\t\t\ticon={<IconArrowRight />}\n\t\t\t\t\t\t\t\t\t\tonClick={handleRightScroll}\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"right-arrow\"\n\t\t\t\t\t\t\t\t\t\tisDisabled={!isRightArrowDisabled}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</NavigationParent>\n\t\t\t\t\t\t\t</MetaPropertyFilterParent>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Dropdown>\n\t\t\t\t);\n\t\t\t})}\n\t\t</>\n\t);\n};\n\nfunction sortFilters(filters: SmartfilterType[]) {\n\treturn [...filters].sort((a, b) => a.zindex - b.zindex);\n}\n\nexport { Smartfilter };\n\nconst MetaPropertyFilterParent = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\toverflow: hidden;\n`;\n\nconst DropdownContentWrapper = styled.div<{ $scroll: number; $isDragging?: boolean }>`\n\tdisplay: flex;\n\tflex-direction: row;\n\ttransform: translateX(-${(p) => p.$scroll}px);\n\ttransition: transform 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.15);\n\twidth: fit-content;\n\tcursor: ${(p) => (p.$isDragging ? 'grabbing' : 'default')};\n`;\n\nconst DropdownContentContainer = styled(Box)`\n\tborder-right: 1px solid rgba(3, 16, 38, 0.1);\n\tmax-width: 300px;\n`;\n\nconst NavigationParent = styled(Flex)`\n\tpadding: ${token.spacing3};\n\tborder-top: 1px solid rgba(3, 16, 38, 0.1);\n\tgap: ${token.spacing3};\n`;\n\nconst NavigationArrow = styled(Button)`\n\tpadding: ${token.spacing3};\n\tborder-radius: 6px;\n\tborder: 1px solid rgba(3, 16, 38, 0.1);\n\tbackground: rgba(3, 16, 38, 0.03);\n\tcursor: pointer;\n`;\n"],"names":["Smartfilter","smartfilters","metaproperties","assetFilterState","useAssetFilter","auth","useAuth","language","useConfig","sortedFilters","sortFilters","inputValue","setInputValue","useState","autocompleteOptions","setAutocompleteOptions","isLoading","setIsLoading","scroll","setScroll","maxScroll","setMaxScroll","isDragging","setIsDragging","nodeRef","useRef","hasMoved","initialX","initialScrollPos","debouncedFunctions","useEffect","isLeftArrowDisabled","isRightArrowDisabled","handleLeftScroll","prevScroll","leftScroll","handleRightScroll","rightScroll","handleApi","search","id","callAutocomplete","prev","getAutocompleteOptions","getDebouncedFunction","debounceAsync","handleSmartfilterOptionSelections","metapropertyName","option","isMultifilter","handleAutocompleteInputChange","metapropertyId","value","handleMouseDown","event","handleMouseUp","preventClickPropagation","e","handleDrag","walkX","jsx","Fragment","filter","Dropdown","jsxs","MetaPropertyFilterParent","DropdownContentWrapper","metaproperty","content","Autocomplete","SmartFilterSelect","DropdownContentContainer","NavigationParent","NavigationArrow","IconArrowLeft","IconArrowRight","filters","a","b","styled","p","Box","Flex","token","Button"],"mappings":";;;;;;;;;;;;;AAwBA,MAAMA,KAAc,CAAC,EAAE,cAAAC,GAAc,gBAAAC,QAA4B;AAChE,QAAMC,IAAmBC,EAAA,GACnBC,IAAOC,GAAA,GACP,EAAE,UAAAC,EAAA,IAAaC,EAAA,GAEfC,IAAgBC,GAAYT,CAAY,GAExC,CAACU,GAAYC,CAAa,IAAIC,EAAoC,CAAA,CAAE,GACpE,CAACC,GAAqBC,CAAsB,IAAIF,EAAA,GAGhD,CAACG,GAAWC,CAAY,IAAIJ,EAAqC,CAAA,CAAE,GAEnE,CAACK,GAAQC,CAAS,IAAIN,EAAS,CAAC,GAChC,CAACO,GAAWC,CAAY,IAAIR,EAAS,CAAC,GAEtC,CAACS,GAAYC,CAAa,IAAIV,EAAS,EAAK,GAE5CW,IAAUC,EAAuB,IAAI,GACrCC,IAAWD,EAAO,EAAK,GACvBE,IAAWF,EAAsB,IAAI,GACrCG,IAAmBH,EAAsB,IAAI,GAG7CI,IAAqBJ,EAExB,EAAE;AAEL,EAAAK,EAAU,MAAM;AACf,IAAIN,EAAQ,WACXH,EAAaG,EAAQ,QAAQ,cAAcA,EAAQ,QAAQ,WAAW,GAGlErB,EAAiB,qBACrBS,EAAc,CAAA,CAAE,GAChBG,EAAuB,CAAA,CAAE;AAAA,EAE3B,GAAG,CAACd,GAAcuB,GAASrB,CAAgB,CAAC;AAE5C,QAAM4B,IAAsBb,MAAW,GACjCc,IAAuBZ,IAAY,KAAKF,MAAWE;AAEzD,WAASa,IAAmB;AAC3B,IAAAd,EAAU,CAACe,MAAuB;AACjC,YAAMC,IAAa,KAAK,IAAID,IAAa,KAAK,CAAC;AAE/C,aAAOC,KAAc,MAAMA,IAAa;AAAA,IACzC,CAAC;AAAA,EACF;AAEA,WAASC,IAAoB;AAC5B,IAAAjB,EAAU,CAACe,MAAuB;AACjC,YAAMG,IAAc,KAAK,IAAIH,IAAa,KAAKd,CAAS;AAExD,aAAOiB,KAAejB,IAAY,MAAMiB,IAAcjB;AAAA,IACvD,CAAC;AAAA,EACF;AAEA,QAAMkB,IAAY,OAAOC,GAAgBC,MAAe;AACvD,QAAIC;AAEJ,IAAAxB,EAAa,CAACyB,OAAU;AAAA,MACvB,GAAGA;AAAA,MACH,CAACF,CAAE,GAAG;AAAA,IAAA,EACL,GAGED,EAAO,UAAU,MACpBE,IAAmB,MAAME,GAAuB;AAAA,MAC/C,gBAAgBH;AAAA,MAChB,MAAAnC;AAAA,MACA,YAAYkC;AAAA,IAAA,CACZ,IAGFxB,EAAuB,CAAC2B,OAAU;AAAA,MACjC,GAAGA;AAAA,MACH,CAACF,CAAE,GAAGC,KAAsC;AAAA,IAAA,EAC3C,GAEFxB,EAAa,CAACyB,OAAU;AAAA,MACvB,GAAGA;AAAA,MACH,CAACF,CAAE,GAAG;AAAA,IAAA,EACL;AAAA,EACH,GAEMI,IAAuB,CAACJ,OAExBX,EAAmB,QAAQW,CAAE,MACjCX,EAAmB,QAAQW,CAAE,IAAIK,GAAcP,GAAW,GAAG,IAMvDT,EAAmB,QAAQW,CAAE,IAG/BM,IAAoC,CACzCC,GACAC,GACAC,MACI;AACJ,IAAA9C,EAAiB,wBAAwB4C,GAAkBC,GAAQC,CAAa;AAAA,EACjF,GAEMC,IAAgC,CAACC,GAAwBC,MAAkB;AAChF,IAAAxC,EAAc,CAAC8B,OAAU;AAAA,MACxB,GAAGA;AAAA,MACH,CAACS,CAAc,GAAGC;AAAA,IAAA,EACjB,GACyBR,EAAqBO,CAAc,EAC3CC,GAAOD,CAAc;AAAA,EACzC,GAEME,IAAkB,CAACC,MAA4C;AAEpE,IAAA3B,EAAS,UAAU2B,EAAM,SACzB5B,EAAS,UAAU,IACnBH,EAAc,EAAI;AAAA,EACnB,GAEMgC,IAAgB,CAACD,MAA4C;AAClE,QAAI5B,EAAS,SAAS;AACrB,MAAA4B,EAAM,eAAA;AACN,YAAME,IAA0B,CAACC,MAAkB;AAClD,QAAAA,EAAE,gBAAA,GACF,SAAS,oBAAoB,SAASD,GAAyB,EAAI;AAAA,MACpE;AAGA,eAAS,iBAAiB,SAASA,GAAyB;AAAA,QAC3D,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,CACN;AAAA,IACF;AAEA,IAAA7B,EAAS,UAAU,MACnBC,EAAiB,UAAU,MAE3BL,EAAc,EAAK;AAAA,EACpB,GAEMmC,IAAa,CAACJ,MAA4C;AAC/D,QAAI,CAAChC,KAAc,CAACE,EAAQ,WAAW,CAACG,EAAS,QAAS;AAE1D,IAAA2B,EAAM,eAAA,GAIF1B,EAAiB,YAAY,SAChCA,EAAiB,UAAUV,IAIxBS,EAAS,WACG,KAAK,IAAI2B,EAAM,UAAU3B,EAAS,OAAO,IAG3C,MACZD,EAAS,UAAU;AAIrB,UAAMiC,KAASL,EAAM,UAAU3B,EAAS,WAAW,KAAKC,EAAiB;AAGzE,WAAI+B,KAAS,KACLxC,EAAU,CAAC,IAGfwC,IAAQ,KAAKvC,IACTD,EAAUwC,CAAK,IAGhBxC,EAAUC,CAAS;AAAA,EAC3B;AASA,SACC,gBAAAwC,EAAAC,GAAA,EACE,UAAApD,EAAc,IAAI,CAACqD,MACd5D,EAAe4D,EAAO,EAAE,IAK5B,gBAAAF;AAAA,IAACG;AAAA,IAAA;AAAA,MAEA,OAAOD,EAAO,OAAOvD,CAAQ,KAAKuD,EAAO,OAAO;AAAA,MAChD,KAAKA,EAAO,OAAOvD,CAAQ,KAAKuD,EAAO,OAAO;AAAA,MAC9C,SAAO;AAAA,MACP,QAAM;AAAA,MACN,wBAAsB;AAAA,MAErB,UAAA,MACA,gBAAAE;AAAA,QAACC;AAAA,QAAA;AAAA,UACA,KAAKzC;AAAA,UACL,aAAa6B;AAAA,UACb,WAAWE;AAAA,UACX,aAAaG;AAAA,UAEb,UAAA;AAAA,YAAA,gBAAAE;AAAA,cAACM;AAAA,cAAA;AAAA,gBACA,SAAShD;AAAA,gBACT,eAAY;AAAA,gBACZ,aAAaI;AAAA,gBAEZ,UAAAwC,EAAO,eAAe,IAAI,CAACX,MAAmB;AAC9C,wBAAMgB,IACLjE,EAAe4D,EAAO,EAAE,EAAEX,CAAc;AASzC,sBANC,CAACgB,KACD,CAAChE,EAAiB,kBAAkBgE,EAAa,IAAI,KAMrDA,EAAa,SAAS,mBACpBA,EAAa,SAAS,kBACvBA,EAAa,SAAS,YACtBA,EAAa,QAAQ,WAAW;AAEjC,2BAAO;AAGR,wBAAMC,IACLD,EAAa,SAAS,iBACrB,gBAAAP;AAAA,oBAACS;AAAA,oBAAA;AAAA,sBACA,cAAAF;AAAA,sBACA,OAAOxD,EAAWwD,EAAa,EAAE,KAAK;AAAA,sBACtC,UAAUjB;AAAA,sBACV,gBACCJ;AAAA,sBAED,qBAAqBhC,KAAuB,CAAA;AAAA,sBAC5C,WAAWE,EAAUmD,EAAa,EAAE,KAAK;AAAA,sBACzC,iBACChE,EAAiB,8BACjB,CAAA;AAAA,oBAAC;AAAA,kBAAA,IAIH,gBAAAyD;AAAA,oBAACU;AAAA,oBAAA;AAAA,sBACA,cAAAH;AAAA,sBACA,eAAeL,EAAO;AAAA,sBACtB,gBACChB;AAAA,sBAED,iBACC3C,EAAiB,8BACjB,CAAA;AAAA,sBAED,sBACCA,EAAiB,kBAChBgE,EAAa,IACd;AAAA,oBAAA;AAAA,kBAAA;AAKJ,yBACC,gBAAAP,EAACW,IAAA,EACC,UAAAH,EAAA,GAD6BjB,CAE/B;AAAA,gBAEF,CAAC;AAAA,cAAA;AAAA,YAAA;AAAA,YAGF,gBAAAa,EAACQ,IAAA,EAAiB,WAAU,OAAM,gBAAe,YAChD,UAAA;AAAA,cAAA,gBAAAZ;AAAA,gBAACa;AAAA,gBAAA;AAAA,kBACA,OAAM;AAAA,kBACN,wBAAOC,GAAA,EAAc;AAAA,kBACrB,SAASzC;AAAA,kBACT,eAAY;AAAA,kBACZ,YAAYF;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGb,gBAAA6B;AAAA,gBAACa;AAAA,gBAAA;AAAA,kBACA,OAAM;AAAA,kBACN,wBAAOE,GAAA,EAAe;AAAA,kBACtB,SAASvC;AAAA,kBACT,eAAY;AAAA,kBACZ,YAAY,CAACJ;AAAA,gBAAA;AAAA,cAAA;AAAA,YACd,EAAA,CACD;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACD;AAAA,IAnGI8B,EAAO;AAAA,EAAA,IALN,IA4GR,EAAA,CACF;AAEF;AAEA,SAASpD,GAAYkE,GAA4B;AAChD,SAAO,CAAC,GAAGA,CAAO,EAAE,KAAK,CAACC,GAAGC,MAAMD,EAAE,SAASC,EAAE,MAAM;AACvD;AAIA,MAAMb,KAA2Bc,EAAO;AAAA;AAAA;AAAA;AAAA,GAMlCb,KAAyBa,EAAO;AAAA;AAAA;AAAA,0BAGZ,CAACC,MAAMA,EAAE,OAAO;AAAA;AAAA;AAAA,WAG/B,CAACA,MAAOA,EAAE,cAAc,aAAa,SAAU;AAAA,GAGpDT,KAA2BQ,EAAOE,CAAG;AAAA;AAAA;AAAA,GAKrCT,KAAmBO,EAAOG,CAAI;AAAA,YACxBC,EAAM,QAAQ;AAAA;AAAA,QAElBA,EAAM,QAAQ;AAAA,GAGhBV,IAAkBM,EAAOK,CAAM;AAAA,YACzBD,EAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;"}
package/Spinner.js ADDED
@@ -0,0 +1,32 @@
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { styled as r } from "styled-components";
3
+ import { token as n } from "@bynder/design-system";
4
+ function g(i) {
5
+ return /* @__PURE__ */ e(
6
+ s,
7
+ {
8
+ "data-testid": "spinner",
9
+ $isRelative: i.isRelative,
10
+ $isHidden: i.isHidden,
11
+ $isRefreshingSpinner: i.isRefreshingSpinner,
12
+ $isNotUsingMargin: i.isNotUsingMargin,
13
+ children: /* @__PURE__ */ e("svg", { className: "spinner", viewBox: "0 0 20 20", children: /* @__PURE__ */ e("circle", { cx: "10", cy: "10", r: "8", fill: "none", strokeWidth: "3" }) })
14
+ }
15
+ );
16
+ }
17
+ const s = r.div`
18
+ display: ${(i) => i.$isHidden ? "none" : "initial"};
19
+ position: ${(i) => i.$isRelative ? "relative" : "absolute"};
20
+ top: ${(i) => i.$isRefreshingSpinner ? "initial" : "0"};
21
+ right: ${(i) => i.$isRefreshingSpinner ? "initial" : "0"};
22
+ width: ${n.spacing6};
23
+ height: ${n.spacing6};
24
+ margin-right: ${(i) => i.$isNotUsingMargin ? "0" : n.spacing3};
25
+ margin-top: ${(i) => i.$isNotUsingMargin ? "0" : n.spacing4};
26
+ background-color: #fff;
27
+ color: rgba(0, 34, 51, 0.3);
28
+ `;
29
+ export {
30
+ g as Spinner
31
+ };
32
+ //# sourceMappingURL=Spinner.js.map
package/Spinner.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sources":["../../src/common/components/Spinner.tsx"],"sourcesContent":["import React from 'react';\n\nimport { styled } from 'styled-components';\nimport { token } from '@bynder/design-system';\n\ninterface Props {\n\tisRelative?: boolean;\n\tisHidden?: boolean;\n\tisRefreshingSpinner?: boolean;\n\tisNotUsingMargin?: boolean;\n}\n\nexport function Spinner(props: Props) {\n\treturn (\n\t\t<SpinnerContainer\n\t\t\tdata-testid=\"spinner\"\n\t\t\t$isRelative={props.isRelative}\n\t\t\t$isHidden={props.isHidden}\n\t\t\t$isRefreshingSpinner={props.isRefreshingSpinner}\n\t\t\t$isNotUsingMargin={props.isNotUsingMargin}\n\t\t>\n\t\t\t<svg className=\"spinner\" viewBox=\"0 0 20 20\">\n\t\t\t\t<circle cx=\"10\" cy=\"10\" r=\"8\" fill=\"none\" strokeWidth=\"3\" />\n\t\t\t</svg>\n\t\t</SpinnerContainer>\n\t);\n}\n\nconst SpinnerContainer = styled.div<{\n\t$isRelative?: boolean;\n\t$isHidden?: boolean;\n\t$isRefreshingSpinner?: boolean;\n\t$isNotUsingMargin?: boolean;\n}>`\n\tdisplay: ${(props) => (props.$isHidden ? 'none' : 'initial')};\n\tposition: ${(props) => (props.$isRelative ? 'relative' : 'absolute')};\n\ttop: ${(props) => (props.$isRefreshingSpinner ? 'initial' : '0')};\n\tright: ${(props) => (props.$isRefreshingSpinner ? 'initial' : '0')};\n\twidth: ${token.spacing6};\n\theight: ${token.spacing6};\n\tmargin-right: ${(props) => (props.$isNotUsingMargin ? '0' : token.spacing3)};\n\tmargin-top: ${(props) => (props.$isNotUsingMargin ? '0' : token.spacing4)};\n\tbackground-color: #fff;\n\tcolor: rgba(0, 34, 51, 0.3);\n`;\n"],"names":["Spinner","props","jsx","SpinnerContainer","styled","token"],"mappings":";;;AAYO,SAASA,EAAQC,GAAc;AACrC,SACC,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACA,eAAY;AAAA,MACZ,aAAaF,EAAM;AAAA,MACnB,WAAWA,EAAM;AAAA,MACjB,sBAAsBA,EAAM;AAAA,MAC5B,mBAAmBA,EAAM;AAAA,MAEzB,4BAAC,OAAA,EAAI,WAAU,WAAU,SAAQ,aAChC,4BAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,QAAO,aAAY,KAAI,EAAA,CAC3D;AAAA,IAAA;AAAA,EAAA;AAGH;AAEA,MAAME,IAAmBC,EAAO;AAAA,YAMpB,CAACH,MAAWA,EAAM,YAAY,SAAS,SAAU;AAAA,aAChD,CAACA,MAAWA,EAAM,cAAc,aAAa,UAAW;AAAA,QAC7D,CAACA,MAAWA,EAAM,uBAAuB,YAAY,GAAI;AAAA,UACvD,CAACA,MAAWA,EAAM,uBAAuB,YAAY,GAAI;AAAA,UACzDI,EAAM,QAAQ;AAAA,WACbA,EAAM,QAAQ;AAAA,iBACR,CAACJ,MAAWA,EAAM,oBAAoB,MAAMI,EAAM,QAAS;AAAA,eAC7D,CAACJ,MAAWA,EAAM,oBAAoB,MAAMI,EAAM,QAAS;AAAA;AAAA;AAAA;"}
@@ -0,0 +1,100 @@
1
+ import { jsx as t, jsxs as F } from "react/jsx-runtime";
2
+ import { useEffect as c } from "react";
3
+ import { styled as f } from "styled-components";
4
+ import { token as i } from "@bynder/design-system";
5
+ import { IconErrorOutline as N } from "@bynder/icons";
6
+ import { __ as m } from "./index2.js";
7
+ import { NoResults as I } from "./NoResults.js";
8
+ import { useAssetFilter as _ } from "./AssetFilterContext.js";
9
+ import { useConfig as w } from "./ConfigContext.js";
10
+ import { useSelectedAssetIds as D, useSelection as R } from "./SelectionContext.js";
11
+ import { Oops as M } from "./Oops.js";
12
+ import { ActiveFilters as P } from "./ActiveFilters.js";
13
+ import { pluralize as $ } from "./text.js";
14
+ import { AssetList as b } from "./AssetList.js";
15
+ import { DirectionSelect as j } from "./DirectionSelect.js";
16
+ import { FieldSelect as k } from "./FieldSelect.js";
17
+ import { Tooltip as z } from "./Tooltip.js";
18
+ import { useSearchStore as B } from "./useSearchStore.js";
19
+ import { useSimilaritySearchStore as H } from "./useSimilaritySearchStore.js";
20
+ function ce(e) {
21
+ const { data: s, isLoading: r, loadMore: g, hasNextPage: p, executeQuery: d } = e.connection, { setIsLoading: S, setSearch: a } = B(), l = w(), A = D(), { selectAssets: h, toggleAssets: v, setAllAssets: L } = R(), x = _(), {
22
+ isNLSSelected: E,
23
+ NLSSearchText: y,
24
+ isSelected: C
25
+ } = H();
26
+ if (c(() => {
27
+ r || S(!1);
28
+ }, [r]), c(() => {
29
+ s.tag !== "Failure" && L(u(s));
30
+ }, [s]), s.tag === "Failure")
31
+ return /* @__PURE__ */ t(M, { error: new Error(s.value), onRetry: d });
32
+ const o = s.value?.searchAssets?.assets?.totalCount ?? e.totalCount, T = () => {
33
+ x.clear(), a("assets", ""), a("collection", "");
34
+ }, n = !!(C || E && y);
35
+ return /* @__PURE__ */ t(
36
+ b,
37
+ {
38
+ assets: u(s),
39
+ count: o,
40
+ isLoading: r,
41
+ loadMore: g,
42
+ hasNextPage: p,
43
+ theme: l.theme,
44
+ selectionMode: l.selectionMode,
45
+ selectedAssetIds: A,
46
+ onSelect: h,
47
+ onToggle: v,
48
+ emptyStateElement: /* @__PURE__ */ t(I, { onReset: T }),
49
+ children: /* @__PURE__ */ F(O, { children: [
50
+ o !== void 0 && /* @__PURE__ */ t(U, { "data-testid": "assets-amount", children: $(o, m("{} asset"), m("{} assets")) }, o),
51
+ e.showActiveFilters && /* @__PURE__ */ t(P, {}),
52
+ /* @__PURE__ */ t(
53
+ k,
54
+ {
55
+ options: n ? ["NL_SEARCH"] : ["CREATED_AT", "PUBLISHED_AT", "UPDATED_AT", "NAME"]
56
+ }
57
+ ),
58
+ /* @__PURE__ */ t(j, { nlSearch: n }),
59
+ n && /* @__PURE__ */ t(
60
+ z,
61
+ {
62
+ text: `You cannot change the sorting criteria while a Visual Similarity filter
63
+ is being applied`,
64
+ position: "left",
65
+ margin: "left",
66
+ marginAmount: "spacing3",
67
+ children: /* @__PURE__ */ t(N, {})
68
+ }
69
+ )
70
+ ] })
71
+ }
72
+ );
73
+ }
74
+ function u(e) {
75
+ return e.tag === "Loading" && !e.value ? {
76
+ tag: "Loading",
77
+ value: void 0
78
+ } : e.tag === "Loading" ? {
79
+ tag: e.tag,
80
+ value: e.value?.searchAssets.assets.nodes
81
+ } : {
82
+ tag: e.tag,
83
+ value: e.value.searchAssets.assets.nodes
84
+ };
85
+ }
86
+ const O = f.div`
87
+ display: flex;
88
+ justify-content: space-between;
89
+ align-items: center;
90
+ z-index: 10;
91
+ padding: ${i.spacing5} ${i.spacing5} ${i.spacing3} ${i.spacing5};
92
+ `, U = f.span`
93
+ color: rgba(0, 34, 51, 0.5);
94
+ flex-shrink: 0;
95
+ animation: fade-in-down 0.15s ease-out;
96
+ `;
97
+ export {
98
+ ce as StatefulAssetList
99
+ };
100
+ //# sourceMappingURL=StatefulAssetList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatefulAssetList.js","sources":["../../src/views/asset/StatefulAssetList.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { styled } from 'styled-components';\nimport { token } from '@bynder/design-system';\nimport { IconErrorOutline } from '@bynder/icons';\nimport { __ } from '@src/localization';\nimport { NoResults } from '@src/common/components/NoResults';\nimport { useAssetFilter } from '@src/filter/AssetFilterContext';\nimport { Connection } from '@src/api/graphql.types';\nimport { useConfig } from '@src/app-config/ConfigContext';\nimport { useSelectedAssetIds, useSelection } from '@src/select/SelectionContext';\nimport { Oops } from '@src/error-handling/Oops';\nimport { ActiveFilters } from '@src/filter/active-filters/ActiveFilters';\nimport { pluralize } from '@src/utils/text';\nimport { Asset } from './asset.type';\nimport { AssetList } from './AssetList';\nimport { DirectionSelect } from '@src/order/DirectionSelect';\nimport { FieldSelect } from '@src/order/FieldSelect';\nimport { Tooltip } from '@src/common/components/Tooltip';\nimport { useSearchStore } from '@src/store/useSearchStore';\nimport { useSimilaritySearchStore } from '@src/store/useSimilaritySearchStore';\n\ninterface DataValue {\n\tsearchAssets: {\n\t\tassets: {\n\t\t\ttotalCount: number;\n\t\t\tnodes: Asset[];\n\t\t};\n\t};\n}\n\ninterface Props {\n\tconnection: Connection<DataValue>;\n\ttotalCount?: number;\n\tshowActiveFilters?: boolean;\n}\n\nexport function StatefulAssetList(props: Props) {\n\tconst { data, isLoading, loadMore, hasNextPage, executeQuery } = props.connection;\n\tconst { setIsLoading, setSearch } = useSearchStore();\n\tconst config = useConfig();\n\tconst selectedAssetIds = useSelectedAssetIds();\n\tconst { selectAssets, toggleAssets, setAllAssets } = useSelection();\n\tconst assetFilterState = useAssetFilter();\n\tconst {\n\t\tisNLSSelected,\n\t\tNLSSearchText,\n\t\tisSelected: isSimilaritySearchSelected,\n\t} = useSimilaritySearchStore();\n\n\tuseEffect(() => {\n\t\tif (!isLoading) {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t}, [isLoading]); // eslint-disable-line react-hooks/exhaustive-deps\n\n\tuseEffect(() => {\n\t\tif (data.tag !== 'Failure') {\n\t\t\tsetAllAssets(getAssetNodes(data));\n\t\t}\n\t}, [data]); // eslint-disable-line react-hooks/exhaustive-deps\n\n\tif (data.tag === 'Failure') {\n\t\treturn <Oops error={new Error(data.value)} onRetry={executeQuery} />;\n\t}\n\n\tconst totalCount = data.value?.searchAssets?.assets?.totalCount ?? props.totalCount;\n\n\tconst onReset = () => {\n\t\tassetFilterState.clear();\n\t\tsetSearch('assets', '');\n\t\tsetSearch('collection', '');\n\t};\n\n\tconst isAISearchPerformed = Boolean(\n\t\tisSimilaritySearchSelected || (isNLSSelected && NLSSearchText),\n\t);\n\n\treturn (\n\t\t<AssetList\n\t\t\tassets={getAssetNodes(data)}\n\t\t\tcount={totalCount}\n\t\t\tisLoading={isLoading}\n\t\t\tloadMore={loadMore}\n\t\t\thasNextPage={hasNextPage}\n\t\t\ttheme={config.theme}\n\t\t\tselectionMode={config.selectionMode}\n\t\t\tselectedAssetIds={selectedAssetIds}\n\t\t\tonSelect={selectAssets}\n\t\t\tonToggle={toggleAssets}\n\t\t\temptyStateElement={<NoResults onReset={onReset} />}\n\t\t>\n\t\t\t<StatefulAssetListContainer>\n\t\t\t\t{totalCount !== undefined && (\n\t\t\t\t\t<StatefulAssetListCount data-testid=\"assets-amount\" key={totalCount}>\n\t\t\t\t\t\t{pluralize(totalCount, __('{} asset'), __('{} assets'))}\n\t\t\t\t\t</StatefulAssetListCount>\n\t\t\t\t)}\n\n\t\t\t\t{props.showActiveFilters && <ActiveFilters />}\n\n\t\t\t\t<FieldSelect\n\t\t\t\t\toptions={\n\t\t\t\t\t\tisAISearchPerformed\n\t\t\t\t\t\t\t? ['NL_SEARCH']\n\t\t\t\t\t\t\t: ['CREATED_AT', 'PUBLISHED_AT', 'UPDATED_AT', 'NAME']\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<DirectionSelect nlSearch={isAISearchPerformed} />\n\t\t\t\t{isAISearchPerformed && (\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\ttext=\"You cannot change the sorting criteria while a Visual Similarity filter\n\t\t\t\t\t\t\tis being applied\"\n\t\t\t\t\t\tposition=\"left\"\n\t\t\t\t\t\tmargin=\"left\"\n\t\t\t\t\t\tmarginAmount=\"spacing3\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<IconErrorOutline />\n\t\t\t\t\t</Tooltip>\n\t\t\t\t)}\n\t\t\t</StatefulAssetListContainer>\n\t\t</AssetList>\n\t);\n}\n\nfunction getAssetNodes(\n\tdata:\n\t\t| { tag: 'Loading'; value: undefined | null | DataValue }\n\t\t| { tag: 'Loaded'; value: DataValue },\n): { tag: 'Loading'; value: undefined | Asset[] } | { tag: 'Loaded'; value: Asset[] } {\n\tif (data.tag === 'Loading' && !data.value) {\n\t\treturn {\n\t\t\ttag: 'Loading',\n\t\t\tvalue: undefined,\n\t\t};\n\t} else if (data.tag === 'Loading') {\n\t\treturn {\n\t\t\ttag: data.tag,\n\t\t\tvalue: data.value?.searchAssets.assets.nodes,\n\t\t};\n\t}\n\n\treturn {\n\t\ttag: data.tag,\n\t\tvalue: data.value.searchAssets.assets.nodes,\n\t};\n}\n\nconst StatefulAssetListContainer = styled.div`\n\tdisplay: flex;\n\tjustify-content: space-between;\n\talign-items: center;\n\tz-index: 10;\n\tpadding: ${token.spacing5} ${token.spacing5} ${token.spacing3} ${token.spacing5};\n`;\n\nconst StatefulAssetListCount = styled.span`\n\tcolor: rgba(0, 34, 51, 0.5);\n\tflex-shrink: 0;\n\tanimation: fade-in-down 0.15s ease-out;\n`;\n"],"names":["StatefulAssetList","props","data","isLoading","loadMore","hasNextPage","executeQuery","setIsLoading","setSearch","useSearchStore","config","useConfig","selectedAssetIds","useSelectedAssetIds","selectAssets","toggleAssets","setAllAssets","useSelection","assetFilterState","useAssetFilter","isNLSSelected","NLSSearchText","isSimilaritySearchSelected","useSimilaritySearchStore","useEffect","getAssetNodes","jsx","Oops","totalCount","onReset","isAISearchPerformed","AssetList","NoResults","StatefulAssetListContainer","StatefulAssetListCount","pluralize","__","ActiveFilters","FieldSelect","DirectionSelect","Tooltip","IconErrorOutline","styled","token"],"mappings":"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"}
package/Styles.css.js ADDED
@@ -0,0 +1,5 @@
1
+ const e = ':host{font-family:SourceSansPro,Source Sans Pro,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";--fade-in-down: fade-in-down .15s ease-out}.translate-y-2\\/4{-webkit-transform:translateY(-50%);transform:translateY(-50%)}@-webkit-keyframes fade-in{0%{opacity:0}to{opacity:1}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-in-down{0%{opacity:0;-webkit-transform:translateY(-2px);transform:translateY(-2px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fade-in-down{0%{opacity:0;-webkit-transform:translateY(-2px);transform:translateY(-2px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes border-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes border-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes border-dash{0%{stroke-dasharray:1,100;stroke-dashoffset:0}50%{stroke-dasharray:80,100;stroke-dashoffset:-20}to{stroke-dasharray:80,100;stroke-dashoffset:-48}}@keyframes border-dash{0%{stroke-dasharray:1,100;stroke-dashoffset:0}50%{stroke-dasharray:80,100;stroke-dashoffset:-20}to{stroke-dasharray:80,100;stroke-dashoffset:-48}}.transition-shadow{-webkit-transition:-webkit-box-shadow .1s linear;transition:-webkit-box-shadow .1s linear;transition:box-shadow .1s linear;transition:box-shadow .1s linear,-webkit-box-shadow .1s linear}.transition-transform{-webkit-transition:-webkit-transform .6s cubic-bezier(.175,.885,.32,1.15);transition:-webkit-transform .6s cubic-bezier(.175,.885,.32,1.15);transition:transform .6s cubic-bezier(.175,.885,.32,1.15);transition:transform .6s cubic-bezier(.175,.885,.32,1.15),-webkit-transform .6s cubic-bezier(.175,.885,.32,1.15)}.cv-root{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;background-color:#fff;font-family:SourceSansPro,Source Sans Pro,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;font-size:16px;color:#023c}.cv-root *,.cv-root *:before,.cv-root *:after{-webkit-box-sizing:inherit;box-sizing:inherit}.cv-container{overflow:hidden;width:100%;height:100%}.cv-container nav:last-of-type{-webkit-box-shadow:0 1px 0 0 rgba(0,34,51,.1),0 1px 6px 0 rgba(0,34,51,.1);box-shadow:0 1px #0022331a,0 1px 6px #0022331a}.cv-dropdown{position:fixed;border-width:1px;border-color:#0022331a;-webkit-animation:fade-in-down .15s ease-out;animation:fade-in-down .15s ease-out;margin-top:16px;border-radius:5px;-webkit-box-shadow:0 4px 10px 0 rgba(0,34,51,.1);box-shadow:0 4px 10px #0022331a;z-index:9999999;overflow-y:hidden;-webkit-transition:left .1s ease-out;transition:left .1s ease-out}.card-list{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-positive:1;flex-grow:1;-ms-flex-line-pack:start;align-content:flex-start;-ms-flex-pack:center;justify-content:center;position:relative;padding-left:8px;padding-right:8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.max-h-400{max-height:400px}.max-w-600{max-width:600px}.flip-y{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.spinner{-webkit-animation:border-rotate 1s linear infinite;animation:border-rotate 1s linear infinite;z-index:2;position:absolute;top:50%;left:50%;margin:-10px 0 0 -10px;width:20px;height:20px}.spinner circle{stroke:currentColor;stroke-linecap:round;-webkit-animation:border-dash 1.5s ease-in-out infinite;animation:border-dash 1.5s ease-in-out infinite}::-ms-clear{display:none}.fa-lg{line-height:1.05em}.z-a-lot{z-index:999999}.z-a-lot-more{z-index:9999999}button:focus{outline:revert}';
2
+ export {
3
+ e as default
4
+ };
5
+ //# sourceMappingURL=Styles.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Styles.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/SwitchNLS.js ADDED
@@ -0,0 +1,80 @@
1
+ import { jsxs as l, jsx as i } from "react/jsx-runtime";
2
+ import r from "styled-components";
3
+ import { token as e, textStyles as s, TruncatedText as c, Switch as f } from "@bynder/design-system";
4
+ import { IconSmart as m } from "@bynder/icons";
5
+ import { __ as d } from "./index2.js";
6
+ const C = ({ isNLSSearchOn: n, setIsNLSSearchOn: o }) => {
7
+ const a = (t) => {
8
+ t && t.currentTarget !== t.target || (t?.stopPropagation(), o(!n));
9
+ }, g = () => {
10
+ o(!n);
11
+ };
12
+ return /* @__PURE__ */ l(
13
+ p,
14
+ {
15
+ onClick: a,
16
+ onKeyDown: (t) => {
17
+ (t.key === "Enter" || t.key === " ") && (t.preventDefault(), a(t));
18
+ },
19
+ tabIndex: 0,
20
+ "data-testid": "switch-nls-container",
21
+ children: [
22
+ /* @__PURE__ */ i(h, { children: /* @__PURE__ */ i(m, {}) }),
23
+ /* @__PURE__ */ l(u, { id: "labelId", children: [
24
+ /* @__PURE__ */ i(c, { children: d("Use natural language search") }),
25
+ /* @__PURE__ */ i(x, { children: /* @__PURE__ */ i(c, { children: d("Find images by describing them") }) })
26
+ ] }),
27
+ /* @__PURE__ */ i(b, { children: /* @__PURE__ */ i(
28
+ f,
29
+ {
30
+ isChecked: n,
31
+ "aria-labelledby": "labelId",
32
+ onChange: g
33
+ }
34
+ ) })
35
+ ]
36
+ }
37
+ );
38
+ }, p = r.div`
39
+ display: flex;
40
+
41
+ align-items: flex-start;
42
+ margin: ${e.spacing3};
43
+ padding: ${e.spacing3};
44
+ background-color: #f3f2fd;
45
+ border-radius: ${e.radiusLarge};
46
+
47
+ &:hover {
48
+ background-color: #eeedfc;
49
+ cursor: pointer;
50
+ }
51
+
52
+ &:active {
53
+ background-color: #f3f2fd;
54
+ }
55
+ `, h = r.div`
56
+ flex: none;
57
+ margin-right: ${e.spacing4};
58
+ color: ${e.purple500};
59
+ `, u = r.div`
60
+ ${s.uiTextM}
61
+
62
+ flex: 1;
63
+ min-width: 0;
64
+ font-weight: 400;
65
+ color: #031026;
66
+ `, x = r.div`
67
+ ${s.uiTextS}
68
+
69
+ color: ${e.colorTextMuted};
70
+ `, b = r.div`
71
+ display: flex;
72
+ flex: none;
73
+ gap: ${e.spacing3};
74
+ align-items: center;
75
+ margin-left: ${e.spacing4};
76
+ `;
77
+ export {
78
+ C as SwitchNLS
79
+ };
80
+ //# sourceMappingURL=SwitchNLS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SwitchNLS.js","sources":["../../src/search/SwitchNLS.tsx"],"sourcesContent":["import React from 'react';\nimport styled from 'styled-components';\nimport { Switch, textStyles, token, TruncatedText } from '@bynder/design-system';\nimport { IconSmart } from '@bynder/icons';\nimport { __ } from '@src/localization';\n\ninterface Props {\n\tisNLSSearchOn: boolean;\n\tsetIsNLSSearchOn: React.Dispatch<React.SetStateAction<boolean>>;\n}\n\nexport const SwitchNLS = ({ isNLSSearchOn, setIsNLSSearchOn }: Props) => {\n\tconst toggleNLSAndFocusSpotlight = (event?: React.MouseEvent | React.KeyboardEvent) => {\n\t\t// Only proceed if the click was directly on the container, not on its children (especially the Switch)\n\t\tif (event && event.currentTarget !== event.target) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent?.stopPropagation();\n\t\tsetIsNLSSearchOn(!isNLSSearchOn);\n\t};\n\n\tconst handleSwitchChange = () => {\n\t\tsetIsNLSSearchOn(!isNLSSearchOn);\n\t};\n\n\treturn (\n\t\t<ItemStyled\n\t\t\tonClick={toggleNLSAndFocusSpotlight}\n\t\t\tonKeyDown={(event) => {\n\t\t\t\tif (event.key === 'Enter' || event.key === ' ') {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\ttoggleNLSAndFocusSpotlight(event);\n\t\t\t\t}\n\t\t\t}}\n\t\t\ttabIndex={0}\n\t\t\tdata-testid=\"switch-nls-container\"\n\t\t>\n\t\t\t<ThumbnailContainer>\n\t\t\t\t<IconSmart />\n\t\t\t</ThumbnailContainer>\n\n\t\t\t<Content id=\"labelId\">\n\t\t\t\t<TruncatedText>{__('Use natural language search')}</TruncatedText>\n\t\t\t\t<Subtext>\n\t\t\t\t\t<TruncatedText>{__('Find images by describing them')}</TruncatedText>\n\t\t\t\t</Subtext>\n\t\t\t</Content>\n\n\t\t\t<RightElements>\n\t\t\t\t<Switch\n\t\t\t\t\tisChecked={isNLSSearchOn}\n\t\t\t\t\taria-labelledby=\"labelId\"\n\t\t\t\t\tonChange={handleSwitchChange}\n\t\t\t\t/>\n\t\t\t</RightElements>\n\t\t</ItemStyled>\n\t);\n};\n\nconst ItemStyled = styled.div`\n\tdisplay: flex;\n\n\talign-items: flex-start;\n\tmargin: ${token.spacing3};\n\tpadding: ${token.spacing3};\n\tbackground-color: #f3f2fd;\n\tborder-radius: ${token.radiusLarge};\n\n\t&:hover {\n\t\tbackground-color: #eeedfc;\n\t\tcursor: pointer;\n\t}\n\n\t&:active {\n\t\tbackground-color: #f3f2fd;\n\t}\n`;\n\nconst ThumbnailContainer = styled.div`\n\tflex: none;\n\tmargin-right: ${token.spacing4};\n\tcolor: ${token.purple500};\n`;\n\nconst Content = styled.div`\n\t${textStyles.uiTextM}\n\n\tflex: 1;\n\tmin-width: 0;\n\tfont-weight: 400;\n\tcolor: #031026;\n`;\n\nconst Subtext = styled.div<{ $isDisabled?: boolean }>`\n\t${textStyles.uiTextS}\n\n\tcolor: ${token.colorTextMuted};\n`;\n\nconst RightElements = styled.div`\n\tdisplay: flex;\n\tflex: none;\n\tgap: ${token.spacing3};\n\talign-items: center;\n\tmargin-left: ${token.spacing4};\n`;\n"],"names":["SwitchNLS","isNLSSearchOn","setIsNLSSearchOn","toggleNLSAndFocusSpotlight","event","handleSwitchChange","jsxs","ItemStyled","jsx","ThumbnailContainer","IconSmart","Content","TruncatedText","__","Subtext","RightElements","Switch","styled","token","textStyles"],"mappings":";;;;;AAWO,MAAMA,IAAY,CAAC,EAAE,eAAAC,GAAe,kBAAAC,QAA8B;AACxE,QAAMC,IAA6B,CAACC,MAAmD;AAEtF,IAAIA,KAASA,EAAM,kBAAkBA,EAAM,WAI3CA,GAAO,gBAAA,GACPF,EAAiB,CAACD,CAAa;AAAA,EAChC,GAEMI,IAAqB,MAAM;AAChC,IAAAH,EAAiB,CAACD,CAAa;AAAA,EAChC;AAEA,SACC,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MACA,SAASJ;AAAA,MACT,WAAW,CAACC,MAAU;AACrB,SAAIA,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SAC1CA,EAAM,eAAA,GACND,EAA2BC,CAAK;AAAA,MAElC;AAAA,MACA,UAAU;AAAA,MACV,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAI,EAACC,GAAA,EACA,UAAA,gBAAAD,EAACE,GAAA,CAAA,CAAU,GACZ;AAAA,QAEA,gBAAAJ,EAACK,GAAA,EAAQ,IAAG,WACX,UAAA;AAAA,UAAA,gBAAAH,EAACI,GAAA,EAAe,UAAAC,EAAG,6BAA6B,EAAA,CAAE;AAAA,4BACjDC,GAAA,EACA,UAAA,gBAAAN,EAACI,KAAe,UAAAC,EAAG,gCAAgC,GAAE,EAAA,CACtD;AAAA,QAAA,GACD;AAAA,0BAECE,GAAA,EACA,UAAA,gBAAAP;AAAA,UAACQ;AAAA,UAAA;AAAA,YACA,WAAWf;AAAA,YACX,mBAAgB;AAAA,YAChB,UAAUI;AAAA,UAAA;AAAA,QAAA,EACX,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGH,GAEME,IAAaU,EAAO;AAAA;AAAA;AAAA;AAAA,WAIfC,EAAM,QAAQ;AAAA,YACbA,EAAM,QAAQ;AAAA;AAAA,kBAERA,EAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAY7BT,IAAqBQ,EAAO;AAAA;AAAA,iBAEjBC,EAAM,QAAQ;AAAA,UACrBA,EAAM,SAAS;AAAA,GAGnBP,IAAUM,EAAO;AAAA,GACpBE,EAAW,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQfL,IAAUG,EAAO;AAAA,GACpBE,EAAW,OAAO;AAAA;AAAA,UAEXD,EAAM,cAAc;AAAA,GAGxBH,IAAgBE,EAAO;AAAA;AAAA;AAAA,QAGrBC,EAAM,QAAQ;AAAA;AAAA,gBAENA,EAAM,QAAQ;AAAA;"}
package/TagItem.js ADDED
@@ -0,0 +1,38 @@
1
+ import { jsxs as m, jsx as a } from "react/jsx-runtime";
2
+ import { styled as n } from "styled-components";
3
+ import { token as s } from "@bynder/design-system";
4
+ import { Chip as l } from "./Chip.js";
5
+ import { useAssetFilter as r } from "./AssetFilterContext.js";
6
+ function x(t) {
7
+ const e = r(), i = e.tags.includes(t.tag.name);
8
+ function o() {
9
+ i ? e.removeTag(t.tag.name) : t.isLoading || e.addTag(t.tag.name);
10
+ }
11
+ return /* @__PURE__ */ m(
12
+ l,
13
+ {
14
+ loading: t.isLoading,
15
+ active: i,
16
+ onClick: o,
17
+ "data-testid": "tag-item",
18
+ children: [
19
+ /* @__PURE__ */ a(g, { children: t.tag.name }),
20
+ /* @__PURE__ */ a(c, { children: t.tag.assetCount })
21
+ ]
22
+ },
23
+ t.tag.id
24
+ );
25
+ }
26
+ const g = n.span`
27
+ max-with: 128px;
28
+ overflow: hidden;
29
+ text-overflow: ellipsis;
30
+ white-space: nowrap;
31
+ `, c = n.span`
32
+ color: rgba(0, 34, 51, 0.5);
33
+ margin-left: ${s.spacing3};
34
+ `;
35
+ export {
36
+ x as TagItem
37
+ };
38
+ //# sourceMappingURL=TagItem.js.map
package/TagItem.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagItem.js","sources":["../../src/filter/filters/tags/TagItem.tsx"],"sourcesContent":["import React from 'react';\nimport { styled } from 'styled-components';\nimport { token } from '@bynder/design-system';\nimport { Chip } from '../../../common/components/Chip';\nimport { useAssetFilter } from '../../AssetFilterContext';\nimport { Tag } from '../metaproperty/MetapropertyFilterContent';\n\nexport function TagItem(props: { tag: Tag; isLoading: boolean }) {\n\tconst assetFilterState = useAssetFilter();\n\n\tconst active = assetFilterState.tags.includes(props.tag.name);\n\n\tfunction handleClick() {\n\t\tif (active) {\n\t\t\tassetFilterState.removeTag(props.tag.name);\n\t\t} else if (!props.isLoading) {\n\t\t\tassetFilterState.addTag(props.tag.name);\n\t\t}\n\t}\n\n\treturn (\n\t\t<Chip\n\t\t\tkey={props.tag.id}\n\t\t\tloading={props.isLoading}\n\t\t\tactive={active}\n\t\t\tonClick={handleClick}\n\t\t\tdata-testid=\"tag-item\"\n\t\t>\n\t\t\t<ChipName>{props.tag.name}</ChipName>\n\t\t\t<ChipCount>{props.tag.assetCount}</ChipCount>\n\t\t</Chip>\n\t);\n}\n\nconst ChipName = styled.span`\n\tmax-with: 128px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n`;\n\nconst ChipCount = styled.span`\n\tcolor: rgba(0, 34, 51, 0.5);\n\tmargin-left: ${token.spacing3};\n`;\n"],"names":["TagItem","props","assetFilterState","useAssetFilter","active","handleClick","jsxs","Chip","jsx","ChipName","ChipCount","styled","token"],"mappings":";;;;;AAOO,SAASA,EAAQC,GAAyC;AAChE,QAAMC,IAAmBC,EAAA,GAEnBC,IAASF,EAAiB,KAAK,SAASD,EAAM,IAAI,IAAI;AAE5D,WAASI,IAAc;AACtB,IAAID,IACHF,EAAiB,UAAUD,EAAM,IAAI,IAAI,IAC9BA,EAAM,aACjBC,EAAiB,OAAOD,EAAM,IAAI,IAAI;AAAA,EAExC;AAEA,SACC,gBAAAK;AAAA,IAACC;AAAA,IAAA;AAAA,MAEA,SAASN,EAAM;AAAA,MACf,QAAAG;AAAA,MACA,SAASC;AAAA,MACT,eAAY;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAG,EAACC,GAAA,EAAU,UAAAR,EAAM,IAAI,MAAK;AAAA,QAC1B,gBAAAO,EAACE,GAAA,EAAW,UAAAT,EAAM,IAAI,WAAA,CAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IAP5BA,EAAM,IAAI;AAAA,EAAA;AAUlB;AAEA,MAAMQ,IAAWE,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,GAOlBD,IAAYC,EAAO;AAAA;AAAA,gBAETC,EAAM,QAAQ;AAAA;"}