@solidxai/core-ui 0.1.14 → 0.1.15-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/components/auth/AuthLayout.js +1 -1
  2. package/dist/components/auth/AuthLayout.js.map +1 -1
  3. package/dist/components/auth/AuthLayout.tsx +2 -2
  4. package/dist/components/common/DropzonePlaceholder.d.ts +2 -1
  5. package/dist/components/common/DropzonePlaceholder.d.ts.map +1 -1
  6. package/dist/components/common/DropzonePlaceholder.js +10 -7
  7. package/dist/components/common/DropzonePlaceholder.js.map +1 -1
  8. package/dist/components/common/DropzonePlaceholder.tsx +14 -9
  9. package/dist/components/common/SettingsComponent.module.css +4 -1
  10. package/dist/components/common/SolidFormStepper.d.ts.map +1 -1
  11. package/dist/components/common/SolidFormStepper.js +7 -6
  12. package/dist/components/common/SolidFormStepper.js.map +1 -1
  13. package/dist/components/common/SolidFormStepper.tsx +7 -1
  14. package/dist/components/common/SolidThemeProvider.d.ts.map +1 -1
  15. package/dist/components/common/SolidThemeProvider.js +127 -11
  16. package/dist/components/common/SolidThemeProvider.js.map +1 -1
  17. package/dist/components/common/SolidThemeProvider.tsx +104 -22
  18. package/dist/components/core/card/CardGrid.d.ts +1 -1
  19. package/dist/components/core/card/CardGrid.d.ts.map +1 -1
  20. package/dist/components/core/card/CardGrid.js +2 -2
  21. package/dist/components/core/card/CardGrid.js.map +1 -1
  22. package/dist/components/core/card/CardGrid.tsx +4 -0
  23. package/dist/components/core/card/CardItem.d.ts +2 -0
  24. package/dist/components/core/card/CardItem.d.ts.map +1 -1
  25. package/dist/components/core/card/CardItem.js +5 -4
  26. package/dist/components/core/card/CardItem.js.map +1 -1
  27. package/dist/components/core/card/CardItem.tsx +16 -1
  28. package/dist/components/core/card/SolidCardView.d.ts +28 -1
  29. package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
  30. package/dist/components/core/card/SolidCardView.js +99 -44
  31. package/dist/components/core/card/SolidCardView.js.map +1 -1
  32. package/dist/components/core/card/SolidCardView.tsx +119 -7
  33. package/dist/components/core/card/SolidCardViewConfigure.d.ts +1 -1
  34. package/dist/components/core/card/SolidCardViewConfigure.d.ts.map +1 -1
  35. package/dist/components/core/card/SolidCardViewConfigure.js +15 -6
  36. package/dist/components/core/card/SolidCardViewConfigure.js.map +1 -1
  37. package/dist/components/core/card/SolidCardViewConfigure.tsx +34 -0
  38. package/dist/components/core/common/PDFViewer.d.ts +9 -5
  39. package/dist/components/core/common/PDFViewer.d.ts.map +1 -1
  40. package/dist/components/core/common/PDFViewer.js +10 -102
  41. package/dist/components/core/common/PDFViewer.js.map +1 -1
  42. package/dist/components/core/common/PDFViewer.tsx +29 -88
  43. package/dist/components/core/common/SolidCreateButton.d.ts.map +1 -1
  44. package/dist/components/core/common/SolidCreateButton.js +2 -2
  45. package/dist/components/core/common/SolidCreateButton.js.map +1 -1
  46. package/dist/components/core/common/SolidCreateButton.tsx +22 -2
  47. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  48. package/dist/components/core/common/SolidGlobalSearchElement.js +216 -198
  49. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  50. package/dist/components/core/common/SolidGlobalSearchElement.tsx +287 -216
  51. package/dist/components/core/form/SolidFormActionHeader.d.ts.map +1 -1
  52. package/dist/components/core/form/SolidFormActionHeader.js +21 -21
  53. package/dist/components/core/form/SolidFormActionHeader.js.map +1 -1
  54. package/dist/components/core/form/SolidFormActionHeader.tsx +62 -53
  55. package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
  56. package/dist/components/core/form/SolidFormView.js +101 -74
  57. package/dist/components/core/form/SolidFormView.js.map +1 -1
  58. package/dist/components/core/form/SolidFormView.tsx +46 -19
  59. package/dist/components/core/form/fields/SolidMediaMultipleField.d.ts.map +1 -1
  60. package/dist/components/core/form/fields/SolidMediaMultipleField.js +3 -2
  61. package/dist/components/core/form/fields/SolidMediaMultipleField.js.map +1 -1
  62. package/dist/components/core/form/fields/SolidMediaMultipleField.tsx +3 -1
  63. package/dist/components/core/form/fields/SolidMediaSingleField.d.ts.map +1 -1
  64. package/dist/components/core/form/fields/SolidMediaSingleField.js +3 -2
  65. package/dist/components/core/form/fields/SolidMediaSingleField.js.map +1 -1
  66. package/dist/components/core/form/fields/SolidMediaSingleField.tsx +3 -1
  67. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts +1 -0
  68. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.d.ts.map +1 -1
  69. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js +20 -2
  70. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.js.map +1 -1
  71. package/dist/components/core/form/fields/relations/SolidRelationManyToManyField.tsx +29 -2
  72. package/dist/components/core/form/fields/solidFields.module.css +7 -0
  73. package/dist/components/core/kanban/KanbanBoard.d.ts +1 -1
  74. package/dist/components/core/kanban/KanbanBoard.d.ts.map +1 -1
  75. package/dist/components/core/kanban/KanbanBoard.js +2 -2
  76. package/dist/components/core/kanban/KanbanBoard.js.map +1 -1
  77. package/dist/components/core/kanban/KanbanBoard.tsx +3 -1
  78. package/dist/components/core/kanban/KanbanCard.d.ts +2 -0
  79. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  80. package/dist/components/core/kanban/KanbanCard.js +5 -3
  81. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  82. package/dist/components/core/kanban/KanbanCard.tsx +15 -2
  83. package/dist/components/core/kanban/KanbanColumn.d.ts +3 -1
  84. package/dist/components/core/kanban/KanbanColumn.d.ts.map +1 -1
  85. package/dist/components/core/kanban/KanbanColumn.js +2 -2
  86. package/dist/components/core/kanban/KanbanColumn.js.map +1 -1
  87. package/dist/components/core/kanban/KanbanColumn.tsx +4 -2
  88. package/dist/components/core/kanban/SolidKanbanView.d.ts +25 -1
  89. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  90. package/dist/components/core/kanban/SolidKanbanView.js +95 -50
  91. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  92. package/dist/components/core/kanban/SolidKanbanView.tsx +87 -9
  93. package/dist/components/core/list/PLAN.md +1 -1
  94. package/dist/components/core/list/SolidListView.d.ts +11 -0
  95. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  96. package/dist/components/core/list/SolidListView.js +51 -90
  97. package/dist/components/core/list/SolidListView.js.map +1 -1
  98. package/dist/components/core/list/SolidListView.tsx +77 -112
  99. package/dist/components/core/list/SolidListViewColumn.d.ts +2 -1
  100. package/dist/components/core/list/SolidListViewColumn.d.ts.map +1 -1
  101. package/dist/components/core/list/SolidListViewColumn.js +2 -2
  102. package/dist/components/core/list/SolidListViewColumn.js.map +1 -1
  103. package/dist/components/core/list/SolidListViewColumn.tsx +4 -3
  104. package/dist/components/core/list/SolidListViewConfigure.js +1 -1
  105. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  106. package/dist/components/core/list/SolidListViewConfigure.tsx +1 -1
  107. package/dist/components/core/list/columns/SolidRelationColumn.d.ts +1 -1
  108. package/dist/components/core/list/columns/SolidRelationColumn.d.ts.map +1 -1
  109. package/dist/components/core/list/columns/SolidRelationColumn.js +2 -2
  110. package/dist/components/core/list/columns/SolidRelationColumn.js.map +1 -1
  111. package/dist/components/core/list/columns/SolidRelationColumn.tsx +2 -2
  112. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts +2 -2
  113. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.d.ts.map +1 -1
  114. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js +5 -4
  115. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.js.map +1 -1
  116. package/dist/components/core/list/columns/relations/SolidRelationManyToOneColumn.tsx +5 -4
  117. package/dist/components/core/model/CreateModel.d.ts.map +1 -1
  118. package/dist/components/core/model/CreateModel.js +2 -1
  119. package/dist/components/core/model/CreateModel.js.map +1 -1
  120. package/dist/components/core/model/CreateModel.tsx +2 -0
  121. package/dist/components/core/model/FieldMetaData.d.ts +1 -1
  122. package/dist/components/core/model/FieldMetaData.d.ts.map +1 -1
  123. package/dist/components/core/model/FieldMetaData.js +8 -8
  124. package/dist/components/core/model/FieldMetaData.js.map +1 -1
  125. package/dist/components/core/model/FieldMetaData.tsx +2 -2
  126. package/dist/components/core/model/FieldMetaDataForm.css +119 -0
  127. package/dist/components/core/model/FieldMetaDataForm.d.ts.map +1 -1
  128. package/dist/components/core/model/FieldMetaDataForm.js +147 -97
  129. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  130. package/dist/components/core/model/FieldMetaDataForm.tsx +124 -32
  131. package/dist/components/core/module/ModuleMetadataExplorer.css +64 -0
  132. package/dist/components/core/module/ModulePackageDialog.css +117 -12
  133. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
  134. package/dist/components/core/tree/SolidTreeView.js +6 -3
  135. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  136. package/dist/components/core/tree/SolidTreeView.tsx +27 -13
  137. package/dist/components/layout/AdminHeaderActions.d.ts.map +1 -1
  138. package/dist/components/layout/AdminHeaderActions.js +16 -11
  139. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  140. package/dist/components/layout/AdminHeaderActions.tsx +16 -9
  141. package/dist/components/layout/AdminTopHeader.d.ts.map +1 -1
  142. package/dist/components/layout/AdminTopHeader.js +1 -18
  143. package/dist/components/layout/AdminTopHeader.js.map +1 -1
  144. package/dist/components/layout/AdminTopHeader.tsx +3 -21
  145. package/dist/helpers/getAcceptedFileTypes.d.ts +12 -2
  146. package/dist/helpers/getAcceptedFileTypes.d.ts.map +1 -1
  147. package/dist/helpers/getAcceptedFileTypes.js +72 -16
  148. package/dist/helpers/getAcceptedFileTypes.js.map +1 -1
  149. package/dist/helpers/getAcceptedFileTypes.tsx +101 -18
  150. package/dist/helpers/registry.js +2 -1
  151. package/dist/helpers/registry.js.map +1 -1
  152. package/dist/helpers/registry.ts +3 -1
  153. package/dist/index.d.ts +6 -1
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +3 -0
  156. package/dist/index.js.map +1 -1
  157. package/dist/index.ts +6 -2
  158. package/dist/resources/globals.css +274 -109
  159. package/dist/resources/solid-custom.css +11 -0
  160. package/dist/resources/solid-responsive.css +1 -5
  161. package/dist/resources/solid-tailwind-generated.css +1 -1
  162. package/dist/routes/pages/admin/core/CardPage.d.ts.map +1 -1
  163. package/dist/routes/pages/admin/core/CardPage.js +15 -2
  164. package/dist/routes/pages/admin/core/CardPage.js.map +1 -1
  165. package/dist/routes/pages/admin/core/CardPage.tsx +17 -2
  166. package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
  167. package/dist/routes/pages/admin/core/DashboardPage.js +31 -3
  168. package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
  169. package/dist/routes/pages/admin/core/DashboardPage.tsx +39 -11
  170. package/dist/routes/pages/admin/core/KanbanPage.d.ts.map +1 -1
  171. package/dist/routes/pages/admin/core/KanbanPage.js +15 -2
  172. package/dist/routes/pages/admin/core/KanbanPage.js.map +1 -1
  173. package/dist/routes/pages/admin/core/KanbanPage.tsx +17 -2
  174. package/dist/routes/pages/admin/core/ListPage.d.ts.map +1 -1
  175. package/dist/routes/pages/admin/core/ListPage.js +5 -13
  176. package/dist/routes/pages/admin/core/ListPage.js.map +1 -1
  177. package/dist/routes/pages/admin/core/ListPage.tsx +5 -15
  178. package/dist/types/index.d.ts +2 -4
  179. package/dist/types/solid-core.d.ts +12 -13
  180. package/package.json +1 -1
@@ -21,6 +21,7 @@ import { AggregationRule, GroupingRule } from "../common/GroupingComponent";
21
21
  import { SolidListViewColumn } from "../list/SolidListViewColumn";
22
22
  import { hasAnyRole } from "../../../helpers/rolesHelper";
23
23
  import { useSession } from "../../../hooks/useSession";
24
+ import { resolveActiveUserId, resolveSavedFilterVariables } from "../../../helpers/resolveActiveUserId";
24
25
  import { useLazyCheckIfPermissionExistsQuery } from "../../../redux/api/userApi";
25
26
  import { SolidListViewConfigure } from "../list/SolidListViewConfigure";
26
27
  import CompactImage from '../../../resources/images/layout/images/compact.png';
@@ -1067,6 +1068,7 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
1067
1068
  custom_filter_predicate: latestFilterPredicatesRef.current.custom_filter_predicate || null,
1068
1069
  search_predicate: latestFilterPredicatesRef.current.search_predicate || null,
1069
1070
  saved_filter_predicate: latestFilterPredicatesRef.current.saved_filter_predicate || null,
1071
+ saved_filter_variables: latestFilterPredicatesRef.current.saved_filter_variables || {},
1070
1072
  predefined_search_predicate: latestFilterPredicatesRef.current.predefined_search_predicate || null,
1071
1073
  grouping_rules: latestFilterPredicatesRef.current.grouping_rules || null,
1072
1074
  aggregation_rules: latestFilterPredicatesRef.current.aggregation_rules || null,
@@ -1275,7 +1277,14 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
1275
1277
 
1276
1278
  if (nextFilterPredicates?.custom_filter_predicate) queryfilter.$and.push(nextFilterPredicates.custom_filter_predicate);
1277
1279
  if (nextFilterPredicates?.search_predicate) queryfilter.$and.push(nextFilterPredicates.search_predicate);
1278
- if (nextFilterPredicates?.saved_filter_predicate) queryfilter.$and.push(nextFilterPredicates.saved_filter_predicate);
1280
+ if (nextFilterPredicates?.saved_filter_predicate) queryfilter.$and.push(
1281
+ nextFilterPredicates.resolved_saved_filter_predicate ||
1282
+ resolveSavedFilterVariables(
1283
+ nextFilterPredicates.saved_filter_predicate,
1284
+ user?.id,
1285
+ nextFilterPredicates.saved_filter_variables || {}
1286
+ ).value
1287
+ );
1279
1288
  if (nextFilterPredicates?.predefined_search_predicate) queryfilter.$and.push(nextFilterPredicates.predefined_search_predicate);
1280
1289
 
1281
1290
  latestFiltersRef.current = queryfilter;
@@ -1897,17 +1906,22 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
1897
1906
  </div>
1898
1907
 
1899
1908
  {solidTreeViewMetaData?.data?.solidView?.layout?.attrs.enableGlobalSearch === true && (
1900
- <div className={`${showGlobalSearchElement ? "flex" : "hidden lg:flex"} mt-3 lg:mt-0 w-full lg:flex lg:min-w-0`}>
1901
- <SolidGlobalSearchElement
1902
- viewType="tree"
1903
- showSaveFilterPopup={showSaveFilterPopup}
1904
- setShowSaveFilterPopup={setShowSaveFilterPopup}
1905
- ref={solidGlobalSearchElementRef}
1906
- viewData={solidTreeViewMetaData}
1907
- handleApplyCustomFilter={handleApplyCustomFilter}
1908
- filterPredicates={filterPredicates}
1909
- />
1910
- </div>
1909
+ <>
1910
+ {/* Base `hidden` must be avoided here: the consuming app's Tailwind CSS loads after this
1911
+ library's generated CSS, so the app's base `.hidden` would override our media-scoped
1912
+ `lg:flex`. Only media-scoped visibility classes are safe on this element. */}
1913
+ <div className={`${showGlobalSearchElement ? "flex" : "max-lg:hidden lg:flex"} w-full mt-3 lg:mt-0 lg:min-w-0`}>
1914
+ <SolidGlobalSearchElement
1915
+ viewType="tree"
1916
+ showSaveFilterPopup={showSaveFilterPopup}
1917
+ setShowSaveFilterPopup={setShowSaveFilterPopup}
1918
+ ref={solidGlobalSearchElementRef}
1919
+ viewData={solidTreeViewMetaData}
1920
+ handleApplyCustomFilter={handleApplyCustomFilter}
1921
+ filterPredicates={filterPredicates}
1922
+ />
1923
+ </div>
1924
+ </>
1911
1925
  )}
1912
1926
  </div>
1913
1927
 
@@ -1915,7 +1929,7 @@ export const SolidTreeView = forwardRef<SolidTreeViewHandle, SolidTreeViewParams
1915
1929
  {headerRequestStatusLabel ? <SolidHeaderRequestStatus label={headerRequestStatusLabel} /> : null}
1916
1930
 
1917
1931
  {solidTreeViewMetaData?.data?.solidView?.layout?.attrs.enableGlobalSearch === true && (
1918
- <div className="flex lg:hidden">
1932
+ <div className="solid-list-search-toggle">
1919
1933
  <SolidButton
1920
1934
  type="button"
1921
1935
  size="sm"
@@ -1 +1 @@
1
- {"version":3,"file":"AdminHeaderActions.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"AAWA,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,eAAO,MAAM,iBAAiB,+CAK7B,CAAC;AAYF,eAAO,MAAM,kBAAkB,2BAAiC,uBAAuB,mDAmHtF,CAAC"}
1
+ {"version":3,"file":"AdminHeaderActions.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"AAaA,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAUF,eAAO,MAAM,iBAAiB,+CAK7B,CAAC;AAYF,eAAO,MAAM,kBAAkB,2BAAiC,uBAAuB,mDAwHtF,CAAC"}
@@ -8,7 +8,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
8
8
  return to.concat(ar || Array.prototype.slice.call(from));
9
9
  };
10
10
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
- import { useContext } from "react";
11
+ import { useContext, useMemo } from "react";
12
12
  import { useDispatch, useSelector } from "react-redux";
13
13
  // import { usePathname } from "../../hooks/usePathname";
14
14
  import { useRouter } from "../../hooks/useRouter";
@@ -18,6 +18,8 @@ import { hasAnyRole } from "../../helpers/rolesHelper";
18
18
  import { enterStudioMode } from "../../redux/features/solidStudioSlice";
19
19
  import { LayoutContext } from "./context/layoutcontext";
20
20
  import { BackendReconnectIndicator } from "../common/BackendReconnectIndicator";
21
+ import { useGetSolidSettingsQuery } from "../../redux/api/solidSettingsApi";
22
+ import { getSettingsMap } from "../../helpers/settingsPayload";
21
23
  export var StudioSparkleIcon = function () { return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" }), _jsx("circle", { cx: "7", cy: "7", r: "2", stroke: "currentColor", strokeWidth: "1.4" })] })); };
22
24
  var ThemeToggleIcon = function () { return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [_jsx("path", { d: "M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 3l0 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 9l4.65 -4.65", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 14.3l7.37 -7.37", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), _jsx("path", { d: "M12 19.6l8.85 -8.85", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" })] })); };
23
25
  export var AdminHeaderActions = function (_a) {
@@ -27,10 +29,13 @@ export var AdminHeaderActions = function (_a) {
27
29
  var dispatch = useDispatch();
28
30
  var session = useSession().data;
29
31
  var _c = useContext(LayoutContext), toggleThemeMode = _c.toggleThemeMode, themeMode = _c.themeMode;
32
+ var solidSettingsData = useGetSolidSettingsQuery(undefined).data;
30
33
  var user = session === null || session === void 0 ? void 0 : session.user;
31
34
  var isAdmin = hasAnyRole(user === null || user === void 0 ? void 0 : user.roles, ["Admin"]);
32
35
  var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
33
36
  var isDev = env("VITE_SOLIDX_ENV") === "dev";
37
+ var settingsMap = useMemo(function () { return getSettingsMap(solidSettingsData); }, [solidSettingsData]);
38
+ var showThemeToggle = (settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.showThemeToggle) === true || (settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.showThemeToggle) === "true";
34
39
  // const showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
35
40
  var actions = __spreadArray(__spreadArray([], (isAdmin && isDev && !isStudioMode
36
41
  ? [{
@@ -43,22 +48,22 @@ export var AdminHeaderActions = function (_a) {
43
48
  title: "Enter SolidX Studio",
44
49
  icon: _jsx(StudioSparkleIcon, {}),
45
50
  }]
46
- : []), true), [
47
- {
48
- key: "theme",
49
- label: themeMode === "dark" ? "Light Mode" : "Dark Mode",
50
- onClick: toggleThemeMode,
51
- title: "Toggle theme",
52
- icon: _jsx(ThemeToggleIcon, {}),
53
- },
54
- ], false);
51
+ : []), true), (showThemeToggle
52
+ ? [{
53
+ key: "theme",
54
+ label: themeMode === "dark" ? "Light Mode" : "Dark Mode",
55
+ onClick: toggleThemeMode,
56
+ title: "Toggle theme",
57
+ icon: _jsx(ThemeToggleIcon, {}),
58
+ }]
59
+ : []), true);
55
60
  if (!actions.length) {
56
61
  return null;
57
62
  }
58
63
  if (variant === "sidebar") {
59
64
  return (_jsx("div", { className: "solid-sidebar-mobile-actions md:hidden ".concat(className).trim(), children: actions.map(function (action) { return (_jsx("button", { type: "button", className: "solid-sidebar-mobile-action", onClick: action.onClick, title: action.title, "aria-label": action.title, children: action.label }, action.key)); }) }));
60
65
  }
61
- return (_jsxs("div", { className: "solid-admin-header-actions hidden md:flex ".concat(className).trim(), children: [_jsx(BackendReconnectIndicator, {}), actions.map(function (action) {
66
+ return (_jsxs("div", { className: "solid-admin-header-actions max-md:hidden lg:flex ".concat(className).trim(), children: [_jsx(BackendReconnectIndicator, {}), actions.map(function (action) {
62
67
  if (action.key === "studio") {
63
68
  return (_jsxs("button", { type: "button", className: "solid-studio-trigger-btn", onClick: action.onClick, title: action.title, "aria-label": action.title, children: [action.icon, _jsx("span", { className: "solid-studio-trigger-label", children: action.label })] }, action.key));
64
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AdminHeaderActions.js","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ReactNode, useContext } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\n// import { usePathname } from \"../../hooks/usePathname\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { env } from \"../../adapters/env\";\nimport { hasAnyRole } from \"../../helpers/rolesHelper\";\nimport { enterStudioMode } from \"../../redux/features/solidStudioSlice\";\nimport { LayoutContext } from \"./context/layoutcontext\";\nimport { BackendReconnectIndicator } from \"../common/BackendReconnectIndicator\";\n\ntype AdminHeaderActionsProps = {\n variant: \"header\" | \"sidebar\";\n className?: string;\n};\n\ntype AdminAction = {\n key: string;\n label: string;\n onClick: () => void;\n title: string;\n icon?: ReactNode;\n};\n\nexport const StudioSparkleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n </svg>\n);\n\nconst ThemeToggleIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const AdminHeaderActions = ({ variant, className = \"\" }: AdminHeaderActionsProps) => {\n // const pathname = usePathname();\n const router = useRouter();\n const dispatch = useDispatch();\n const { data: session } = useSession();\n const { toggleThemeMode, themeMode } = useContext(LayoutContext);\n const user = session?.user;\n const isAdmin = hasAnyRole(user?.roles, [\"Admin\"]);\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const isDev = env(\"VITE_SOLIDX_ENV\") === \"dev\";\n // const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const actions: AdminAction[] = [\n ...(isAdmin && isDev && !isStudioMode\n ? [{\n key: \"studio\",\n label: \"Studio\",\n onClick: () => {\n dispatch(enterStudioMode());\n router.push(\"/studio\");\n },\n title: \"Enter SolidX Studio\",\n icon: <StudioSparkleIcon />,\n }]\n : []),\n {\n key: \"theme\",\n label: themeMode === \"dark\" ? \"Light Mode\" : \"Dark Mode\",\n onClick: toggleThemeMode,\n title: \"Toggle theme\",\n icon: <ThemeToggleIcon />,\n },\n // ...(showBack\n // ? [{\n // key: \"back\",\n // label: \"Back\",\n // onClick: () => router.back(),\n // title: \"Go back\",\n // }]\n // : []),\n ];\n\n if (!actions.length) {\n return null;\n }\n\n if (variant === \"sidebar\") {\n return (\n <div className={`solid-sidebar-mobile-actions md:hidden ${className}`.trim()}>\n {actions.map((action) => (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-sidebar-mobile-action\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.label}\n </button>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`solid-admin-header-actions hidden md:flex ${className}`.trim()}>\n <BackendReconnectIndicator />\n {actions.map((action) => {\n if (action.key === \"studio\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.icon}\n <span className=\"solid-studio-trigger-label\">{action.label}</span>\n </button>\n );\n }\n\n if (action.key === \"theme\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={action.onClick}\n aria-label={action.title}\n title={action.title}\n >\n {action.icon}\n <span className=\"solid-sr-only\">{action.label}</span>\n </button>\n );\n }\n\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={action.onClick}\n aria-label={action.title}\n >\n {action.label}\n </button>\n );\n })}\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"AdminHeaderActions.js","sourceRoot":"","sources":["../../../src/components/layout/AdminHeaderActions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ReactNode, useContext, useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\n// import { usePathname } from \"../../hooks/usePathname\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useSession } from \"../../hooks/useSession\";\nimport { env } from \"../../adapters/env\";\nimport { hasAnyRole } from \"../../helpers/rolesHelper\";\nimport { enterStudioMode } from \"../../redux/features/solidStudioSlice\";\nimport { LayoutContext } from \"./context/layoutcontext\";\nimport { BackendReconnectIndicator } from \"../common/BackendReconnectIndicator\";\nimport { useGetSolidSettingsQuery } from \"../../redux/api/solidSettingsApi\";\nimport { getSettingsMap } from \"../../helpers/settingsPayload\";\n\ntype AdminHeaderActionsProps = {\n variant: \"header\" | \"sidebar\";\n className?: string;\n};\n\ntype AdminAction = {\n key: string;\n label: string;\n onClick: () => void;\n title: string;\n icon?: ReactNode;\n};\n\nexport const StudioSparkleIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M7 1v2M7 11v2M1 7h2M11 7h2M2.93 2.93l1.41 1.41M9.66 9.66l1.41 1.41M2.93 11.07l1.41-1.41M9.66 4.34l1.41-1.41\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"7\" r=\"2\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n </svg>\n);\n\nconst ThemeToggleIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const AdminHeaderActions = ({ variant, className = \"\" }: AdminHeaderActionsProps) => {\n // const pathname = usePathname();\n const router = useRouter();\n const dispatch = useDispatch();\n const { data: session } = useSession();\n const { toggleThemeMode, themeMode } = useContext(LayoutContext);\n const { data: solidSettingsData } = useGetSolidSettingsQuery(undefined);\n const user = session?.user;\n const isAdmin = hasAnyRole(user?.roles, [\"Admin\"]);\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const isDev = env(\"VITE_SOLIDX_ENV\") === \"dev\";\n const settingsMap = useMemo(() => getSettingsMap(solidSettingsData), [solidSettingsData]);\n const showThemeToggle = settingsMap?.showThemeToggle === true || settingsMap?.showThemeToggle === \"true\";\n // const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const actions: AdminAction[] = [\n ...(isAdmin && isDev && !isStudioMode\n ? [{\n key: \"studio\",\n label: \"Studio\",\n onClick: () => {\n dispatch(enterStudioMode());\n router.push(\"/studio\");\n },\n title: \"Enter SolidX Studio\",\n icon: <StudioSparkleIcon />,\n }]\n : []),\n ...(showThemeToggle\n ? [{\n key: \"theme\",\n label: themeMode === \"dark\" ? \"Light Mode\" : \"Dark Mode\",\n onClick: toggleThemeMode,\n title: \"Toggle theme\",\n icon: <ThemeToggleIcon />,\n }]\n : []),\n // ...(showBack\n // ? [{\n // key: \"back\",\n // label: \"Back\",\n // onClick: () => router.back(),\n // title: \"Go back\",\n // }]\n // : []),\n ];\n\n if (!actions.length) {\n return null;\n }\n\n if (variant === \"sidebar\") {\n return (\n <div className={`solid-sidebar-mobile-actions md:hidden ${className}`.trim()}>\n {actions.map((action) => (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-sidebar-mobile-action\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.label}\n </button>\n ))}\n </div>\n );\n }\n\n return (\n <div className={`solid-admin-header-actions max-md:hidden lg:flex ${className}`.trim()}>\n <BackendReconnectIndicator />\n {actions.map((action) => {\n if (action.key === \"studio\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={action.onClick}\n title={action.title}\n aria-label={action.title}\n >\n {action.icon}\n <span className=\"solid-studio-trigger-label\">{action.label}</span>\n </button>\n );\n }\n\n if (action.key === \"theme\") {\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={action.onClick}\n aria-label={action.title}\n title={action.title}\n >\n {action.icon}\n <span className=\"solid-sr-only\">{action.label}</span>\n </button>\n );\n }\n\n return (\n <button\n key={action.key}\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={action.onClick}\n aria-label={action.title}\n >\n {action.label}\n </button>\n );\n })}\n </div>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { ReactNode, useContext } from "react";
1
+ import { ReactNode, useContext, useMemo } from "react";
2
2
  import { useDispatch, useSelector } from "react-redux";
3
3
  // import { usePathname } from "../../hooks/usePathname";
4
4
  import { useRouter } from "../../hooks/useRouter";
@@ -8,6 +8,8 @@ import { hasAnyRole } from "../../helpers/rolesHelper";
8
8
  import { enterStudioMode } from "../../redux/features/solidStudioSlice";
9
9
  import { LayoutContext } from "./context/layoutcontext";
10
10
  import { BackendReconnectIndicator } from "../common/BackendReconnectIndicator";
11
+ import { useGetSolidSettingsQuery } from "../../redux/api/solidSettingsApi";
12
+ import { getSettingsMap } from "../../helpers/settingsPayload";
11
13
 
12
14
  type AdminHeaderActionsProps = {
13
15
  variant: "header" | "sidebar";
@@ -45,10 +47,13 @@ export const AdminHeaderActions = ({ variant, className = "" }: AdminHeaderActio
45
47
  const dispatch = useDispatch();
46
48
  const { data: session } = useSession();
47
49
  const { toggleThemeMode, themeMode } = useContext(LayoutContext);
50
+ const { data: solidSettingsData } = useGetSolidSettingsQuery(undefined);
48
51
  const user = session?.user;
49
52
  const isAdmin = hasAnyRole(user?.roles, ["Admin"]);
50
53
  const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);
51
54
  const isDev = env("VITE_SOLIDX_ENV") === "dev";
55
+ const settingsMap = useMemo(() => getSettingsMap(solidSettingsData), [solidSettingsData]);
56
+ const showThemeToggle = settingsMap?.showThemeToggle === true || settingsMap?.showThemeToggle === "true";
52
57
  // const showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
53
58
 
54
59
  const actions: AdminAction[] = [
@@ -64,13 +69,15 @@ export const AdminHeaderActions = ({ variant, className = "" }: AdminHeaderActio
64
69
  icon: <StudioSparkleIcon />,
65
70
  }]
66
71
  : []),
67
- {
68
- key: "theme",
69
- label: themeMode === "dark" ? "Light Mode" : "Dark Mode",
70
- onClick: toggleThemeMode,
71
- title: "Toggle theme",
72
- icon: <ThemeToggleIcon />,
73
- },
72
+ ...(showThemeToggle
73
+ ? [{
74
+ key: "theme",
75
+ label: themeMode === "dark" ? "Light Mode" : "Dark Mode",
76
+ onClick: toggleThemeMode,
77
+ title: "Toggle theme",
78
+ icon: <ThemeToggleIcon />,
79
+ }]
80
+ : []),
74
81
  // ...(showBack
75
82
  // ? [{
76
83
  // key: "back",
@@ -105,7 +112,7 @@ export const AdminHeaderActions = ({ variant, className = "" }: AdminHeaderActio
105
112
  }
106
113
 
107
114
  return (
108
- <div className={`solid-admin-header-actions hidden md:flex ${className}`.trim()}>
115
+ <div className={`solid-admin-header-actions max-md:hidden lg:flex ${className}`.trim()}>
109
116
  <BackendReconnectIndicator />
110
117
  {actions.map((action) => {
111
118
  if (action.key === "studio") {
@@ -1 +1 @@
1
- {"version":3,"file":"AdminTopHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"AAsBA,eAAO,MAAM,cAAc,+CA0L1B,CAAC"}
1
+ {"version":3,"file":"AdminTopHeader.d.ts","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"AAeA,eAAO,MAAM,cAAc,+CA+K1B,CAAC"}
@@ -1,17 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useContext, useMemo } from "react";
2
+ import { useMemo } from "react";
3
3
  import { usePathname } from "../../hooks/usePathname";
4
4
  import { useSearchParams } from "../../hooks/useSearchParams";
5
5
  import { useRouter } from "../../hooks/useRouter";
6
6
  import { useGetSolidActionByIdQuery } from "../../redux/api/solidActionApi";
7
- import { useGetSolidSettingsQuery } from "../../redux/api/solidSettingsApi";
8
- import { LayoutContext } from "./context/layoutcontext";
9
- import { hasAnyRole } from "../../helpers/rolesHelper";
10
- import { getSettingsMap } from "../../helpers/settingsPayload";
11
- import { env } from "../../adapters/env";
12
7
  import { AdminHeaderActions } from "./AdminHeaderActions";
13
- import { useDispatch, useSelector } from "react-redux";
14
- import { useSession } from "../../hooks/useSession";
15
8
  var SIDEBAR_TOGGLE_EVENT = "solidx:sidebar-toggle";
16
9
  var toLabel = function (value) {
17
10
  return decodeURIComponent(value)
@@ -22,16 +15,6 @@ export var AdminTopHeader = function () {
22
15
  var pathname = usePathname();
23
16
  var searchParams = useSearchParams();
24
17
  var router = useRouter();
25
- var dispatch = useDispatch();
26
- var toggleThemeMode = useContext(LayoutContext).toggleThemeMode;
27
- var session = useSession().data;
28
- var solidSettingsData = useGetSolidSettingsQuery(undefined).data;
29
- var user = session === null || session === void 0 ? void 0 : session.user;
30
- var isAdmin = hasAnyRole(user === null || user === void 0 ? void 0 : user.roles, ["Admin"]);
31
- var isStudioMode = useSelector(function (state) { var _a, _b; return (_b = (_a = state.solidStudio) === null || _a === void 0 ? void 0 : _a.isStudioMode) !== null && _b !== void 0 ? _b : false; });
32
- var isDev = env("VITE_SOLIDX_ENV") === "dev";
33
- var settingsMap = useMemo(function () { return getSettingsMap(solidSettingsData); }, [solidSettingsData]);
34
- var isDarkModeEnabled = (settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.enableDarkMode) === true || (settingsMap === null || settingsMap === void 0 ? void 0 : settingsMap.enableDarkMode) === "true";
35
18
  // We treat actionId as the source of truth for breadcrumb labels.
36
19
  // If present, we resolve module/model/action via action-metadata API
37
20
  // so breadcrumbs are consistent across list/form/tree/kanban pages.
@@ -1 +1 @@
1
- {"version":3,"file":"AdminTopHeader.js","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useContext, useMemo } from \"react\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useGetSolidActionByIdQuery } from \"../../redux/api/solidActionApi\";\nimport { useGetSolidSettingsQuery } from \"../../redux/api/solidSettingsApi\";\nimport { LayoutContext } from \"./context/layoutcontext\";\nimport { enterStudioMode } from \"../../redux/features/solidStudioSlice\";\nimport { hasAnyRole } from \"../../helpers/rolesHelper\";\nimport { getSettingsMap } from \"../../helpers/settingsPayload\";\nimport { env } from \"../../adapters/env\";\nimport { AdminHeaderActions, StudioSparkleIcon } from \"./AdminHeaderActions\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { useSession } from \"../../hooks/useSession\";\n\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\n\nconst toLabel = (value: string) =>\n decodeURIComponent(value)\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n\nexport const AdminTopHeader = () => {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const router = useRouter();\n const dispatch = useDispatch();\n const { toggleThemeMode } = useContext(LayoutContext);\n const { data: session } = useSession();\n const { data: solidSettingsData } = useGetSolidSettingsQuery(undefined);\n const user = session?.user;\n const isAdmin = hasAnyRole(user?.roles, [\"Admin\"]);\n const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);\n const isDev = env(\"VITE_SOLIDX_ENV\") === \"dev\";\n const settingsMap = useMemo(() => getSettingsMap(solidSettingsData), [solidSettingsData]);\n const isDarkModeEnabled = settingsMap?.enableDarkMode === true || settingsMap?.enableDarkMode === \"true\";\n\n // We treat actionId as the source of truth for breadcrumb labels.\n // If present, we resolve module/model/action via action-metadata API\n // so breadcrumbs are consistent across list/form/tree/kanban pages.\n const actionId = searchParams.get(\"actionId\");\n const { data: actionResponse } = useGetSolidActionByIdQuery(actionId as string, {\n skip: !actionId,\n });\n\n const crumbs = useMemo(() => {\n // API response shapes vary by adapter layer, so normalize defensively.\n const actionData = actionResponse?.data?.data ?? actionResponse?.data ?? actionResponse;\n const moduleFromApi = actionData?.module?.displayName || actionData?.module?.name;\n const modelFromApi = actionData?.model?.displayName || actionData?.model?.name;\n const actionFromApi = actionData?.displayName || actionData?.name;\n const actionDataId = actionData?.id != null ? String(actionData.id) : null;\n const hasMatchingActionData = Boolean(actionId) && actionDataId === actionId;\n\n // Priority 1: exact business breadcrumb contract requested:\n // <module> > <model> > <action>.\n // We only trust API crumbs when they belong to the current URL's actionId.\n // This avoids stale list breadcrumbs bleeding into form routes that do not\n // carry actionId in their query string.\n if (hasMatchingActionData && (moduleFromApi || modelFromApi || actionFromApi)) {\n return [moduleFromApi, modelFromApi, actionFromApi].filter(Boolean);\n }\n\n const segments = pathname.split(\"/\").filter(Boolean);\n // Priority 2: derive from route segments when API data is unavailable.\n // This is intentionally ahead of query fallback so form pages don't\n // inherit stale list query labels after list -> form navigation.\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const viewName = segments[4];\n const next = [\n moduleName ? toLabel(moduleName) : null,\n modelFromApi ? decodeURIComponent(modelFromApi) : modelName ? toLabel(modelName) : null,\n viewName ? toLabel(viewName) : null,\n ].filter(Boolean) as string[];\n return next.length ? next : [\"Admin\"];\n }\n\n const menuItemName = searchParams.get(\"menuItemName\");\n const actionName = searchParams.get(\"actionName\");\n\n // Priority 3: legacy URL-query fallback for older links/pages.\n if (menuItemName || actionName) {\n return [menuItemName, actionName].filter(Boolean).map((item) => toLabel(item!));\n }\n\n return [\"Admin\"];\n }, [actionId, actionResponse, pathname, searchParams]);\n\n const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const triggerSidebar = () => {\n window.dispatchEvent(new CustomEvent(SIDEBAR_TOGGLE_EVENT));\n };\n\n const handleBreadcrumbClick = (crumbIndex: number) => {\n // When on a form view, clicking the model name (second crumb) should navigate back to list\n // Index 1 is the model name in a breadcrumb like: Module > Model > Action\n if (crumbIndex === 1 && showBack) {\n if (typeof window !== \"undefined\") {\n // First, try to use the full stored URL (preserves all query params)\n const storedFullUrl = sessionStorage.getItem(\"fromViewUrl\");\n if (storedFullUrl) {\n router.push(storedFullUrl);\n return;\n }\n }\n \n // Fallback: construct URL from current path and stored view\n const segments = pathname.split(\"/\").filter(Boolean);\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const fromView = typeof window !== \"undefined\" \n ? sessionStorage.getItem(\"fromView\") || \"list\" \n : \"list\";\n router.push(`/admin/core/${moduleName}/${modelName}/${fromView}`);\n }\n }\n };\n\n return (\n <header className=\"solid-admin-header\">\n <div className=\"solid-admin-header-inner\">\n <button\n type=\"button\"\n className=\"solid-admin-sidebar-trigger\"\n onClick={triggerSidebar}\n aria-label=\"Toggle sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2\" stroke=\"currentColor\" />\n <path d=\"M5.5 2V14\" stroke=\"currentColor\" />\n <rect x=\"8\" y=\"5.25\" width=\"4.5\" height=\"5.5\" rx=\"0.9\" stroke=\"currentColor\" />\n </svg>\n </button>\n\n <div className=\"solid-admin-header-sep\" />\n\n <nav className=\"solid-admin-breadcrumbs\" aria-label=\"Breadcrumb\">\n {crumbs.map((crumb, index) => (\n <span key={`${crumb}-${index}`} className=\"solid-admin-crumb\">\n {index > 0 && <span className=\"solid-admin-crumb-sep\">›</span>}\n {index === 1 && showBack ? (\n <button\n type=\"button\"\n className=\"px-0 solid-admin-crumb-link\"\n onClick={() => handleBreadcrumbClick(index)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"inherit\", textDecoration: \"underline\", fontFamily: 'inherit' }}\n >\n {crumb}\n </button>\n ) : (\n <span className=\"solid-bread-crum-text-wrapper\">{crumb}</span>\n )}\n </span>\n ))}\n </nav>\n\n {/* <div className=\"solid-admin-header-actions\">\n {isAdmin && isDev && !isStudioMode && (\n <button\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={() => { dispatch(enterStudioMode()); router.push(\"/studio\"); }}\n title=\"Enter SolidX Studio\"\n aria-label=\"Enter SolidX Studio\"\n >\n <StudioSparkleIcon />\n <span className=\"solid-studio-trigger-label\">Studio</span>\n </button>\n )}\n\n {isDarkModeEnabled && (\n <button\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={toggleThemeMode}\n aria-label=\"Toggle theme\"\n title=\"Toggle theme\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"solid-sr-only\">Toggle theme</span>\n </button>\n )}\n\n {showBack && (\n <button\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={() => router.back()}\n aria-label=\"Go back\"\n >\n Back\n </button>\n )}\n </div> */}\n <AdminHeaderActions variant=\"header\" />\n </div>\n </header>\n );\n};\n"]}
1
+ {"version":3,"file":"AdminTopHeader.js","sourceRoot":"","sources":["../../../src/components/layout/AdminTopHeader.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from \"react\";\nimport { usePathname } from \"../../hooks/usePathname\";\nimport { useSearchParams } from \"../../hooks/useSearchParams\";\nimport { useRouter } from \"../../hooks/useRouter\";\nimport { useGetSolidActionByIdQuery } from \"../../redux/api/solidActionApi\";\nimport { AdminHeaderActions } from \"./AdminHeaderActions\";\n\n\nconst SIDEBAR_TOGGLE_EVENT = \"solidx:sidebar-toggle\";\n\nconst toLabel = (value: string) =>\n decodeURIComponent(value)\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n\nexport const AdminTopHeader = () => {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n const router = useRouter();\n // We treat actionId as the source of truth for breadcrumb labels.\n // If present, we resolve module/model/action via action-metadata API\n // so breadcrumbs are consistent across list/form/tree/kanban pages.\n const actionId = searchParams.get(\"actionId\");\n const { data: actionResponse } = useGetSolidActionByIdQuery(actionId as string, {\n skip: !actionId,\n });\n\n const crumbs = useMemo(() => {\n // API response shapes vary by adapter layer, so normalize defensively.\n const actionData = actionResponse?.data?.data ?? actionResponse?.data ?? actionResponse;\n const moduleFromApi = actionData?.module?.displayName || actionData?.module?.name;\n const modelFromApi = actionData?.model?.displayName || actionData?.model?.name;\n const actionFromApi = actionData?.displayName || actionData?.name;\n const actionDataId = actionData?.id != null ? String(actionData.id) : null;\n const hasMatchingActionData = Boolean(actionId) && actionDataId === actionId;\n\n // Priority 1: exact business breadcrumb contract requested:\n // <module> > <model> > <action>.\n // We only trust API crumbs when they belong to the current URL's actionId.\n // This avoids stale list breadcrumbs bleeding into form routes that do not\n // carry actionId in their query string.\n if (hasMatchingActionData && (moduleFromApi || modelFromApi || actionFromApi)) {\n return [moduleFromApi, modelFromApi, actionFromApi].filter(Boolean);\n }\n\n const segments = pathname.split(\"/\").filter(Boolean);\n // Priority 2: derive from route segments when API data is unavailable.\n // This is intentionally ahead of query fallback so form pages don't\n // inherit stale list query labels after list -> form navigation.\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const viewName = segments[4];\n const next = [\n moduleName ? toLabel(moduleName) : null,\n modelFromApi ? decodeURIComponent(modelFromApi) : modelName ? toLabel(modelName) : null,\n viewName ? toLabel(viewName) : null,\n ].filter(Boolean) as string[];\n return next.length ? next : [\"Admin\"];\n }\n\n const menuItemName = searchParams.get(\"menuItemName\");\n const actionName = searchParams.get(\"actionName\");\n\n // Priority 3: legacy URL-query fallback for older links/pages.\n if (menuItemName || actionName) {\n return [menuItemName, actionName].filter(Boolean).map((item) => toLabel(item!));\n }\n\n return [\"Admin\"];\n }, [actionId, actionResponse, pathname, searchParams]);\n\n const showBack = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form\\/[^/]+/.test(pathname);\n\n const triggerSidebar = () => {\n window.dispatchEvent(new CustomEvent(SIDEBAR_TOGGLE_EVENT));\n };\n\n const handleBreadcrumbClick = (crumbIndex: number) => {\n // When on a form view, clicking the model name (second crumb) should navigate back to list\n // Index 1 is the model name in a breadcrumb like: Module > Model > Action\n if (crumbIndex === 1 && showBack) {\n if (typeof window !== \"undefined\") {\n // First, try to use the full stored URL (preserves all query params)\n const storedFullUrl = sessionStorage.getItem(\"fromViewUrl\");\n if (storedFullUrl) {\n router.push(storedFullUrl);\n return;\n }\n }\n \n // Fallback: construct URL from current path and stored view\n const segments = pathname.split(\"/\").filter(Boolean);\n if (segments[0] === \"admin\" && segments[1] === \"core\") {\n const moduleName = segments[2];\n const modelName = segments[3];\n const fromView = typeof window !== \"undefined\" \n ? sessionStorage.getItem(\"fromView\") || \"list\" \n : \"list\";\n router.push(`/admin/core/${moduleName}/${modelName}/${fromView}`);\n }\n }\n };\n\n return (\n <header className=\"solid-admin-header\">\n <div className=\"solid-admin-header-inner\">\n <button\n type=\"button\"\n className=\"solid-admin-sidebar-trigger\"\n onClick={triggerSidebar}\n aria-label=\"Toggle sidebar\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2\" width=\"13\" height=\"12\" rx=\"2\" stroke=\"currentColor\" />\n <path d=\"M5.5 2V14\" stroke=\"currentColor\" />\n <rect x=\"8\" y=\"5.25\" width=\"4.5\" height=\"5.5\" rx=\"0.9\" stroke=\"currentColor\" />\n </svg>\n </button>\n\n <div className=\"solid-admin-header-sep\" />\n\n <nav className=\"solid-admin-breadcrumbs\" aria-label=\"Breadcrumb\">\n {crumbs.map((crumb, index) => (\n <span key={`${crumb}-${index}`} className=\"solid-admin-crumb\">\n {index > 0 && <span className=\"solid-admin-crumb-sep\">›</span>}\n {index === 1 && showBack ? (\n <button\n type=\"button\"\n className=\"px-0 solid-admin-crumb-link\"\n onClick={() => handleBreadcrumbClick(index)}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", color: \"inherit\", textDecoration: \"underline\", fontFamily: 'inherit' }}\n >\n {crumb}\n </button>\n ) : (\n <span className=\"solid-bread-crum-text-wrapper\">{crumb}</span>\n )}\n </span>\n ))}\n </nav>\n\n {/* <div className=\"solid-admin-header-actions\">\n {isAdmin && isDev && !isStudioMode && (\n <button\n type=\"button\"\n className=\"solid-studio-trigger-btn\"\n onClick={() => { dispatch(enterStudioMode()); router.push(\"/studio\"); }}\n title=\"Enter SolidX Studio\"\n aria-label=\"Enter SolidX Studio\"\n >\n <StudioSparkleIcon />\n <span className=\"solid-studio-trigger-label\">Studio</span>\n </button>\n )}\n\n {isDarkModeEnabled && (\n <button\n type=\"button\"\n className=\"solid-admin-theme-toggle\"\n onClick={toggleThemeMode}\n aria-label=\"Toggle theme\"\n title=\"Toggle theme\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 3l0 18\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 9l4.65 -4.65\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 14.3l7.37 -7.37\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <path d=\"M12 19.6l8.85 -8.85\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className=\"solid-sr-only\">Toggle theme</span>\n </button>\n )}\n\n {showBack && (\n <button\n type=\"button\"\n className=\"solid-admin-back-btn\"\n onClick={() => router.back()}\n aria-label=\"Go back\"\n >\n Back\n </button>\n )}\n </div> */}\n <AdminHeaderActions variant=\"header\" />\n </div>\n </header>\n );\n};\n"]}
@@ -1,17 +1,10 @@
1
- import { useContext, useMemo } from "react";
1
+ import { useMemo } from "react";
2
2
  import { usePathname } from "../../hooks/usePathname";
3
3
  import { useSearchParams } from "../../hooks/useSearchParams";
4
4
  import { useRouter } from "../../hooks/useRouter";
5
5
  import { useGetSolidActionByIdQuery } from "../../redux/api/solidActionApi";
6
- import { useGetSolidSettingsQuery } from "../../redux/api/solidSettingsApi";
7
- import { LayoutContext } from "./context/layoutcontext";
8
- import { enterStudioMode } from "../../redux/features/solidStudioSlice";
9
- import { hasAnyRole } from "../../helpers/rolesHelper";
10
- import { getSettingsMap } from "../../helpers/settingsPayload";
11
- import { env } from "../../adapters/env";
12
- import { AdminHeaderActions, StudioSparkleIcon } from "./AdminHeaderActions";
13
- import { useDispatch, useSelector } from "react-redux";
14
- import { useSession } from "../../hooks/useSession";
6
+ import { AdminHeaderActions } from "./AdminHeaderActions";
7
+
15
8
 
16
9
  const SIDEBAR_TOGGLE_EVENT = "solidx:sidebar-toggle";
17
10
 
@@ -24,17 +17,6 @@ export const AdminTopHeader = () => {
24
17
  const pathname = usePathname();
25
18
  const searchParams = useSearchParams();
26
19
  const router = useRouter();
27
- const dispatch = useDispatch();
28
- const { toggleThemeMode } = useContext(LayoutContext);
29
- const { data: session } = useSession();
30
- const { data: solidSettingsData } = useGetSolidSettingsQuery(undefined);
31
- const user = session?.user;
32
- const isAdmin = hasAnyRole(user?.roles, ["Admin"]);
33
- const isStudioMode = useSelector((state: any) => state.solidStudio?.isStudioMode ?? false);
34
- const isDev = env("VITE_SOLIDX_ENV") === "dev";
35
- const settingsMap = useMemo(() => getSettingsMap(solidSettingsData), [solidSettingsData]);
36
- const isDarkModeEnabled = settingsMap?.enableDarkMode === true || settingsMap?.enableDarkMode === "true";
37
-
38
20
  // We treat actionId as the source of truth for breadcrumb labels.
39
21
  // If present, we resolve module/model/action via action-metadata API
40
22
  // so breadcrumbs are consistent across list/form/tree/kanban pages.
@@ -1,4 +1,14 @@
1
- export default function getAcceptedFileTypes(mediaTypes: string[]): {
2
- [k: string]: never[];
1
+ export type MediaConfig = {
2
+ mediaFileTypeDefinitions?: Array<{
3
+ mediaType: string;
4
+ extension: string;
5
+ }>;
3
6
  };
7
+ export declare const getAvailableMediaExtensionOptions: (mediaTypes?: string[] | null, mediaFileTypeDefinitions?: MediaConfig["mediaFileTypeDefinitions"] | null) => Array<{
8
+ label: string;
9
+ value: string;
10
+ }>;
11
+ export declare const getAllowedMediaTypesLabel: (mediaTypes?: string[] | null) => string;
12
+ export declare const getAllowedMediaExtensionsLabel: (mediaAllowedExtensions?: string[] | null) => string | null;
13
+ export default function getAcceptedFileTypes(mediaTypes?: string[] | null, mediaAllowedExtensions?: string[] | null, mediaConfig?: MediaConfig | null): Record<string, string[]>;
4
14
  //# sourceMappingURL=getAcceptedFileTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getAcceptedFileTypes.d.ts","sourceRoot":"","sources":["../../src/helpers/getAcceptedFileTypes.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE;;EAqBhE"}
1
+ {"version":3,"file":"getAcceptedFileTypes.d.ts","sourceRoot":"","sources":["../../src/helpers/getAcceptedFileTypes.tsx"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACtB,wBAAwB,CAAC,EAAE,KAAK,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACN,CAAC;AAuCF,eAAO,MAAM,iCAAiC,gBAAiB,MAAM,EAAE,GAAG,IAAI,6BAA6B,WAAW,CAAC,0BAA0B,CAAC,GAAG,IAAI,KAAG,MAAM;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKjM,CAAC;AAEF,eAAO,MAAM,yBAAyB,gBAAiB,MAAM,EAAE,GAAG,IAAI,KAAG,MAWxE,CAAC;AAEF,eAAO,MAAM,8BAA8B,4BAA6B,MAAM,EAAE,GAAG,IAAI,KAAG,MAAM,GAAG,IAOlG,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,sBAAsB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,4BA+BpJ"}
@@ -1,20 +1,76 @@
1
- export default function getAcceptedFileTypes(mediaTypes) {
2
- if (!mediaTypes || mediaTypes.length === 0)
3
- return {}; // Default empty
4
- var fileTypeMapping = {
5
- image: "image/*",
6
- audio: "audio/*",
7
- video: "video/*",
8
- pdf: "application/pdf",
9
- file: "",
10
- };
11
- // If "file" exists in mediaTypes, allow all files
12
- if (mediaTypes.includes("file")) {
1
+ var MEDIA_TYPE_LABELS = {
2
+ image: "Images",
3
+ audio: "Audio",
4
+ video: "Video",
5
+ file: "Documents and archives",
6
+ pdf: "PDF",
7
+ };
8
+ var normalizeExtensions = function (extensions) { return Array.from(new Set((Array.isArray(extensions) ? extensions : [])
9
+ .map(function (extension) { return String(extension || "").trim().toLowerCase().replace(/^\./, ""); })
10
+ .filter(Boolean))); };
11
+ var normalizeMediaTypes = function (mediaTypes) { return Array.from(new Set((Array.isArray(mediaTypes) ? mediaTypes : [])
12
+ .map(function (type) { return String(type || "").trim().toLowerCase(); })
13
+ .filter(Boolean))); };
14
+ var getCategoryExtensions = function (mediaTypes, mediaFileTypeDefinitions) {
15
+ var allowedMediaTypes = new Set(normalizeMediaTypes(mediaTypes));
16
+ if (allowedMediaTypes.size === 0) {
17
+ return [];
18
+ }
19
+ return normalizeExtensions((mediaFileTypeDefinitions !== null && mediaFileTypeDefinitions !== void 0 ? mediaFileTypeDefinitions : [])
20
+ .filter(function (fileType) { return allowedMediaTypes.has(String((fileType === null || fileType === void 0 ? void 0 : fileType.mediaType) || "").toLowerCase()); })
21
+ .map(function (fileType) { return String((fileType === null || fileType === void 0 ? void 0 : fileType.extension) || "").trim().toLowerCase(); }));
22
+ };
23
+ export var getAvailableMediaExtensionOptions = function (mediaTypes, mediaFileTypeDefinitions) {
24
+ return getCategoryExtensions(mediaTypes, mediaFileTypeDefinitions).map(function (extension) { return ({
25
+ label: ".".concat(extension),
26
+ value: extension,
27
+ }); });
28
+ };
29
+ export var getAllowedMediaTypesLabel = function (mediaTypes) {
30
+ var normalizedMediaTypes = normalizeMediaTypes(mediaTypes);
31
+ if (normalizedMediaTypes.length === 0) {
32
+ return "Any file";
33
+ }
34
+ var labels = normalizedMediaTypes.map(function (type) { return MEDIA_TYPE_LABELS[type] || type.toUpperCase(); });
35
+ return labels.length > 0 ? labels.join(", ") : "Any file";
36
+ };
37
+ export var getAllowedMediaExtensionsLabel = function (mediaAllowedExtensions) {
38
+ var selectedExtensions = normalizeExtensions(mediaAllowedExtensions);
39
+ if (selectedExtensions.length === 0) {
40
+ return null;
41
+ }
42
+ return selectedExtensions.map(function (extension) { return ".".concat(extension); }).join(", ");
43
+ };
44
+ export default function getAcceptedFileTypes(mediaTypes, mediaAllowedExtensions, mediaConfig) {
45
+ var effectiveExtensions = normalizeExtensions(mediaAllowedExtensions);
46
+ if (effectiveExtensions.length > 0) {
47
+ return {
48
+ "application/octet-stream": effectiveExtensions.map(function (extension) { return ".".concat(extension); }),
49
+ };
50
+ }
51
+ var normalizedMediaTypes = normalizeMediaTypes(mediaTypes);
52
+ if (normalizedMediaTypes.length === 0) {
53
+ return {};
54
+ }
55
+ var categoryExtensions = getCategoryExtensions(mediaTypes, mediaConfig === null || mediaConfig === void 0 ? void 0 : mediaConfig.mediaFileTypeDefinitions);
56
+ var allowedExtensions = categoryExtensions.map(function (extension) { return ".".concat(extension); });
57
+ var acceptGroups = [];
58
+ if (normalizedMediaTypes.includes("image"))
59
+ acceptGroups.push("image/*");
60
+ if (normalizedMediaTypes.includes("audio"))
61
+ acceptGroups.push("audio/*");
62
+ if (normalizedMediaTypes.includes("video"))
63
+ acceptGroups.push("video/*");
64
+ if (normalizedMediaTypes.includes("pdf"))
65
+ acceptGroups.push("application/pdf");
66
+ if (normalizedMediaTypes.includes("file"))
67
+ acceptGroups.push("application/*", "text/*");
68
+ if (acceptGroups.length === 0) {
13
69
  return {};
14
70
  }
15
- var acceptedTypes = mediaTypes
16
- .map(function (type) { return fileTypeMapping[type.toLowerCase()]; })
17
- .filter(Boolean); // Remove undefined values
18
- return acceptedTypes.length > 0 ? Object.fromEntries(acceptedTypes.map(function (type) { return [type, []]; })) : {};
71
+ return acceptGroups.reduce(function (acceptMap, acceptGroup) {
72
+ acceptMap[acceptGroup] = allowedExtensions;
73
+ return acceptMap;
74
+ }, {});
19
75
  }
20
76
  //# sourceMappingURL=getAcceptedFileTypes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getAcceptedFileTypes.js","sourceRoot":"","sources":["../../src/helpers/getAcceptedFileTypes.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,UAAoB;IAC7D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,CAAC,gBAAgB;IAEvE,IAAM,eAAe,GAA2B;QAC5C,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,iBAAiB;QACtB,IAAI,EAAE,EAAE;KACX,CAAC;IAEF,kDAAkD;IAClD,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAC7B,OAAO,EAAE,CAAC;KACb;IAED,IAAM,aAAa,GAAG,UAAU;SAC3B,GAAG,CAAC,UAAA,IAAI,IAAI,OAAA,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAnC,CAAmC,CAAC;SAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;IAEhD,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,UAAA,IAAI,IAAI,OAAA,CAAC,IAAI,EAAE,EAAE,CAAC,EAAV,CAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrG,CAAC","sourcesContent":["export default function getAcceptedFileTypes(mediaTypes: string[]) {\n if (!mediaTypes || mediaTypes.length === 0) return {}; // Default empty\n\n const fileTypeMapping: Record<string, string> = {\n image: \"image/*\",\n audio: \"audio/*\",\n video: \"video/*\",\n pdf: \"application/pdf\",\n file: \"\",\n };\n\n // If \"file\" exists in mediaTypes, allow all files\n if (mediaTypes.includes(\"file\")) {\n return {};\n }\n\n const acceptedTypes = mediaTypes\n .map(type => fileTypeMapping[type.toLowerCase()])\n .filter(Boolean); // Remove undefined values\n\n return acceptedTypes.length > 0 ? Object.fromEntries(acceptedTypes.map(type => [type, []])) : {};\n}"]}
1
+ {"version":3,"file":"getAcceptedFileTypes.js","sourceRoot":"","sources":["../../src/helpers/getAcceptedFileTypes.tsx"],"names":[],"mappings":"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","sourcesContent":["export type MediaConfig = {\n mediaFileTypeDefinitions?: Array<{\n mediaType: string;\n extension: string;\n }>;\n};\n\nconst MEDIA_TYPE_LABELS: Record<string, string> = {\n image: \"Images\",\n audio: \"Audio\",\n video: \"Video\",\n file: \"Documents and archives\",\n pdf: \"PDF\",\n};\n\nconst normalizeExtensions = (extensions?: string[] | null): string[] => Array.from(\n new Set(\n (Array.isArray(extensions) ? extensions : [])\n .map((extension) => String(extension || \"\").trim().toLowerCase().replace(/^\\./, \"\"))\n .filter(Boolean)\n )\n);\n\nconst normalizeMediaTypes = (mediaTypes?: string[] | null): string[] => Array.from(\n new Set(\n (Array.isArray(mediaTypes) ? mediaTypes : [])\n .map((type) => String(type || \"\").trim().toLowerCase())\n .filter(Boolean)\n )\n);\n\nconst getCategoryExtensions = (mediaTypes?: string[] | null, mediaFileTypeDefinitions?: MediaConfig[\"mediaFileTypeDefinitions\"] | null): string[] => {\n const allowedMediaTypes = new Set(normalizeMediaTypes(mediaTypes));\n if (allowedMediaTypes.size === 0) {\n return [];\n }\n\n return normalizeExtensions(\n (mediaFileTypeDefinitions ?? [])\n .filter((fileType) => allowedMediaTypes.has(String(fileType?.mediaType || \"\").toLowerCase()))\n .map((fileType) => String(fileType?.extension || \"\").trim().toLowerCase())\n );\n};\n\nexport const getAvailableMediaExtensionOptions = (mediaTypes?: string[] | null, mediaFileTypeDefinitions?: MediaConfig[\"mediaFileTypeDefinitions\"] | null): Array<{ label: string; value: string }> => {\n return getCategoryExtensions(mediaTypes, mediaFileTypeDefinitions).map((extension) => ({\n label: `.${extension}`,\n value: extension,\n }));\n};\n\nexport const getAllowedMediaTypesLabel = (mediaTypes?: string[] | null): string => {\n const normalizedMediaTypes = normalizeMediaTypes(mediaTypes);\n if (normalizedMediaTypes.length === 0) {\n return \"Any file\";\n }\n\n const labels = normalizedMediaTypes.map(\n (type) => MEDIA_TYPE_LABELS[type] || type.toUpperCase()\n );\n\n return labels.length > 0 ? labels.join(\", \") : \"Any file\";\n};\n\nexport const getAllowedMediaExtensionsLabel = (mediaAllowedExtensions?: string[] | null): string | null => {\n const selectedExtensions = normalizeExtensions(mediaAllowedExtensions);\n if (selectedExtensions.length === 0) {\n return null;\n }\n\n return selectedExtensions.map((extension) => `.${extension}`).join(\", \");\n};\n\nexport default function getAcceptedFileTypes(mediaTypes?: string[] | null, mediaAllowedExtensions?: string[] | null, mediaConfig?: MediaConfig | null) {\n const effectiveExtensions = normalizeExtensions(mediaAllowedExtensions);\n if (effectiveExtensions.length > 0) {\n return {\n \"application/octet-stream\": effectiveExtensions.map((extension) => `.${extension}`),\n };\n }\n\n const normalizedMediaTypes = normalizeMediaTypes(mediaTypes);\n if (normalizedMediaTypes.length === 0) {\n return {};\n }\n\n const categoryExtensions = getCategoryExtensions(mediaTypes, mediaConfig?.mediaFileTypeDefinitions);\n const allowedExtensions = categoryExtensions.map((extension) => `.${extension}`);\n const acceptGroups: string[] = [];\n\n if (normalizedMediaTypes.includes(\"image\")) acceptGroups.push(\"image/*\");\n if (normalizedMediaTypes.includes(\"audio\")) acceptGroups.push(\"audio/*\");\n if (normalizedMediaTypes.includes(\"video\")) acceptGroups.push(\"video/*\");\n if (normalizedMediaTypes.includes(\"pdf\")) acceptGroups.push(\"application/pdf\");\n if (normalizedMediaTypes.includes(\"file\")) acceptGroups.push(\"application/*\", \"text/*\");\n\n if (acceptGroups.length === 0) {\n return {};\n }\n\n return acceptGroups.reduce<Record<string, string[]>>((acceptMap, acceptGroup) => {\n acceptMap[acceptGroup] = allowedExtensions;\n return acceptMap;\n }, {});\n}\n"]}