@solidxai/core-ui 0.1.13-beta.4 → 0.1.13-beta.6

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 (149) hide show
  1. package/dist/components/auth/AuthTabs.d.ts.map +1 -1
  2. package/dist/components/auth/AuthTabs.js +1 -1
  3. package/dist/components/auth/AuthTabs.js.map +1 -1
  4. package/dist/components/auth/AuthTabs.tsx +1 -0
  5. package/dist/components/auth/SolidChangeForcePassword.d.ts.map +1 -1
  6. package/dist/components/auth/SolidChangeForcePassword.js +2 -2
  7. package/dist/components/auth/SolidChangeForcePassword.js.map +1 -1
  8. package/dist/components/auth/SolidChangeForcePassword.tsx +9 -8
  9. package/dist/components/common/SettingsComponent.d.ts.map +1 -1
  10. package/dist/components/common/SettingsComponent.js +1 -1
  11. package/dist/components/common/SettingsComponent.js.map +1 -1
  12. package/dist/components/common/SettingsComponent.tsx +1 -0
  13. package/dist/components/common/SolidFieldTooltip.d.ts.map +1 -1
  14. package/dist/components/common/SolidFieldTooltip.js +1 -33
  15. package/dist/components/common/SolidFieldTooltip.js.map +1 -1
  16. package/dist/components/common/SolidFieldTooltip.tsx +8 -64
  17. package/dist/components/common/SolidMaterialSymbol.d.ts +1 -1
  18. package/dist/components/common/SolidMaterialSymbol.d.ts.map +1 -1
  19. package/dist/components/common/SolidMaterialSymbol.js +6 -37
  20. package/dist/components/common/SolidMaterialSymbol.js.map +1 -1
  21. package/dist/components/common/SolidMaterialSymbol.tsx +6 -54
  22. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  23. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +2 -2
  24. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  25. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +2 -0
  26. package/dist/components/core/card/CardItem.d.ts.map +1 -1
  27. package/dist/components/core/card/CardItem.js +1 -1
  28. package/dist/components/core/card/CardItem.js.map +1 -1
  29. package/dist/components/core/card/CardItem.tsx +16 -14
  30. package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
  31. package/dist/components/core/card/SolidCardView.js +69 -40
  32. package/dist/components/core/card/SolidCardView.js.map +1 -1
  33. package/dist/components/core/card/SolidCardView.tsx +55 -24
  34. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +99 -0
  35. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts.map +1 -1
  36. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js +76 -5
  37. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js.map +1 -1
  38. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx +39 -4
  39. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  40. package/dist/components/core/common/SolidGlobalSearchElement.js +172 -124
  41. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  42. package/dist/components/core/common/SolidGlobalSearchElement.tsx +73 -84
  43. package/dist/components/core/common/globalSearchPersistence.d.ts +3 -0
  44. package/dist/components/core/common/globalSearchPersistence.d.ts.map +1 -1
  45. package/dist/components/core/common/globalSearchPersistence.js +33 -24
  46. package/dist/components/core/common/globalSearchPersistence.js.map +1 -1
  47. package/dist/components/core/common/globalSearchPersistence.ts +34 -27
  48. package/dist/components/core/filter/fields/SolidMediaMultipleField.js +2 -2
  49. package/dist/components/core/filter/fields/SolidMediaMultipleField.js.map +1 -1
  50. package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +2 -2
  51. package/dist/components/core/filter/fields/SolidMediaSingleField.js +2 -2
  52. package/dist/components/core/filter/fields/SolidMediaSingleField.js.map +1 -1
  53. package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +2 -2
  54. package/dist/components/core/filter/fields/SolidShortTextField.js +2 -2
  55. package/dist/components/core/filter/fields/SolidShortTextField.js.map +1 -1
  56. package/dist/components/core/filter/fields/SolidShortTextField.tsx +2 -2
  57. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  58. package/dist/components/core/kanban/KanbanCard.js +1 -1
  59. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  60. package/dist/components/core/kanban/KanbanCard.tsx +18 -16
  61. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  62. package/dist/components/core/kanban/SolidKanbanView.js +67 -48
  63. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  64. package/dist/components/core/kanban/SolidKanbanView.tsx +51 -11
  65. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts +1 -1
  66. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts.map +1 -1
  67. package/dist/components/core/kanban/SolidKanbanViewConfigure.js +11 -2
  68. package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
  69. package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +35 -0
  70. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  71. package/dist/components/core/list/SolidListView.js +6 -2
  72. package/dist/components/core/list/SolidListView.js.map +1 -1
  73. package/dist/components/core/list/SolidListView.tsx +7 -1
  74. package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
  75. package/dist/components/core/list/SolidListViewConfigure.js +15 -11
  76. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  77. package/dist/components/core/list/SolidListViewConfigure.tsx +25 -6
  78. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts +1 -1
  79. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts.map +1 -1
  80. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js +3 -1
  81. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js.map +1 -1
  82. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +3 -1
  83. package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
  84. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +7 -0
  85. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  86. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +5 -0
  87. package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
  88. package/dist/components/core/list/columns/SolidMediaSingleColumn.js +3 -0
  89. package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
  90. package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +2 -0
  91. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.d.ts.map +1 -1
  92. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js +3 -0
  93. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js.map +1 -1
  94. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.tsx +2 -0
  95. package/dist/components/core/model/CreateModel.css +10 -0
  96. package/dist/components/core/model/FieldMetaDataForm.css +10 -0
  97. package/dist/components/core/model/FieldMetaDataForm.js +8 -8
  98. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  99. package/dist/components/core/model/FieldMetaDataForm.tsx +13 -13
  100. package/dist/components/core/module/ModuleMetadataExplorer.css +23 -0
  101. package/dist/components/core/module/ModuleMetadataExplorer.d.ts.map +1 -1
  102. package/dist/components/core/module/ModuleMetadataExplorer.js +1 -1
  103. package/dist/components/core/module/ModuleMetadataExplorer.js.map +1 -1
  104. package/dist/components/core/module/ModuleMetadataExplorer.tsx +9 -0
  105. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
  106. package/dist/components/core/tree/SolidTreeView.js +249 -138
  107. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  108. package/dist/components/core/tree/SolidTreeView.tsx +220 -92
  109. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
  110. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +1 -1
  111. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
  112. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +1 -0
  113. package/dist/components/layout/AdminHeaderActions.js +6 -13
  114. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  115. package/dist/components/layout/AdminHeaderActions.tsx +11 -11
  116. package/dist/components/layout/AdminLayout.d.ts.map +1 -1
  117. package/dist/components/layout/AdminLayout.js +2 -2
  118. package/dist/components/layout/AdminLayout.js.map +1 -1
  119. package/dist/components/layout/AdminLayout.tsx +5 -4
  120. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  121. package/dist/components/layout/AppSidebar.js +17 -2
  122. package/dist/components/layout/AppSidebar.js.map +1 -1
  123. package/dist/components/layout/AppSidebar.tsx +21 -2
  124. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts +1 -1
  125. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts.map +1 -1
  126. package/dist/components/shad-cn-ui/SolidDatePicker.js +35 -3
  127. package/dist/components/shad-cn-ui/SolidDatePicker.js.map +1 -1
  128. package/dist/components/shad-cn-ui/SolidDatePicker.tsx +84 -0
  129. package/dist/components/shad-cn-ui/SolidTooltip.d.ts.map +1 -1
  130. package/dist/components/shad-cn-ui/SolidTooltip.js +55 -2
  131. package/dist/components/shad-cn-ui/SolidTooltip.js.map +1 -1
  132. package/dist/components/shad-cn-ui/SolidTooltip.tsx +95 -1
  133. package/dist/helpers/downloadMediaFile.d.ts.map +1 -1
  134. package/dist/helpers/downloadMediaFile.js +80 -5
  135. package/dist/helpers/downloadMediaFile.js.map +1 -1
  136. package/dist/helpers/downloadMediaFile.tsx +33 -6
  137. package/dist/resources/globals.css +109 -1
  138. package/dist/resources/solid-custom.css +53 -3
  139. package/dist/resources/solid-tailwind-generated.css +1 -1
  140. package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
  141. package/dist/routes/pages/admin/core/DashboardPage.js +2 -2
  142. package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
  143. package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -0
  144. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.d.ts.map +1 -1
  145. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js +1 -1
  146. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js.map +1 -1
  147. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.tsx +1 -0
  148. package/dist/types/css-modules.d.ts +2 -0
  149. package/package.json +1 -1
@@ -15,7 +15,7 @@ import { SolidHeaderRequestStatus } from "../../common/SolidHeaderRequestStatus"
15
15
  import { SolidCreateButton } from "../common/SolidCreateButton";
16
16
  import { SolidGlobalSearchElement } from "../common/SolidGlobalSearchElement";
17
17
  import { SolidEmptyListViewPlaceholder } from "../list/SolidEmptyListViewPlaceholder";
18
- import { getFilterObjectFromLocalStorage, hasStoredFilterPredicates, setFilterObjectToLocalStorage } from "../common/globalSearchPersistence";
18
+ import { getFilterObjectFromLocalStorage,hasMeaningfulPersistedFilter,hasStoredFilterPredicates,hasStoredSearchUiState, setFilterObjectToLocalStorage} from "../common/globalSearchPersistence";
19
19
  import { normalizeSolidListTreeKanbanActionPath } from "../../../helpers/routePaths";
20
20
  import { SolidCardViewConfigure } from "./SolidCardViewConfigure";
21
21
  import { CardGrid } from "./CardGrid";
@@ -109,6 +109,7 @@ export const SolidCardView = (params: SolidCardViewParams) => {
109
109
 
110
110
  const [actionsAllowed, setActionsAllowed] = useState<string[]>([]);
111
111
  const [showGlobalSearchElement, setShowGlobalSearchElement] = useState(false);
112
+ const [filterPredicates, setFilterPredicates] = useState<any>(null);
112
113
  const [viewModes, setViewModes] = useState<any[]>([]);
113
114
  const [filters, setFilters] = useState<any>({ $and: [] });
114
115
  const [cards, setCards] = useState<any[]>([]);
@@ -131,6 +132,7 @@ export const SolidCardView = (params: SolidCardViewParams) => {
131
132
  const [showArchived, setShowArchived] = useState(false);
132
133
  const [selectedCardForDelete, setSelectedCardForDelete] = useState<any>(null);
133
134
  const [isDeleteDialogVisible, setDeleteDialogVisible] = useState(false);
135
+ const shouldShowMobileSearchElement = showGlobalSearchElement || hasStoredSearchUiState(filterPredicates) || hasStoredSearchUiState(getFilterObjectFromLocalStorage());
134
136
 
135
137
  const lightboxSlides: SolidLightboxSlide[] = Array.isArray(lightboxUrls)
136
138
  ? lightboxUrls
@@ -151,8 +153,8 @@ export const SolidCardView = (params: SolidCardViewParams) => {
151
153
 
152
154
  const entityApi = createSolidEntityApi(params.modelName);
153
155
  const { useDeleteSolidEntityMutation, useLazyGetSolidEntitiesQuery, useLazyRecoverSolidEntityByIdQuery } = entityApi;
154
- const [triggerGetSolidEntities] = useLazyGetSolidEntitiesQuery();
155
- const [deleteSolidEntity] = useDeleteSolidEntityMutation();
156
+ const [triggerGetSolidEntities, { data: solidEntityCardViewData }] = useLazyGetSolidEntitiesQuery();
157
+ const [deleteSolidEntity, { isLoading: isDeletingRecord }] = useDeleteSolidEntityMutation();
156
158
  const [triggerRecoverSolidEntityById, { isLoading: recoverByIdIsLoading }] = useLazyRecoverSolidEntityByIdQuery();
157
159
 
158
160
  const menuItemId = searchParams.get("menuItemId");
@@ -175,7 +177,7 @@ export const SolidCardView = (params: SolidCardViewParams) => {
175
177
  }
176
178
  );
177
179
 
178
- const { data: solidCardViewMetaDataResponse } = useGetSolidViewLayoutQuery(cardViewMetaDataQs);
180
+ const {data: solidCardViewMetaDataResponse,isLoading: solidCardViewMetaDataIsLoading,} = useGetSolidViewLayoutQuery(cardViewMetaDataQs);
179
181
 
180
182
  const editBaseUrl = normalizeSolidListTreeKanbanActionPath(pathname, editButtonUrl || "form");
181
183
  const rowsOptions = rowsPerPageOptions && rowsPerPageOptions.length > 0 ? rowsPerPageOptions : [12, 24, 48];
@@ -311,6 +313,13 @@ export const SolidCardView = (params: SolidCardViewParams) => {
311
313
  void loadCards(filters);
312
314
  }, [filters, first, queryDataLoaded, rows, showArchived, solidCardViewMetaDataResponse, toPopulate, toPopulateMedia]);
313
315
 
316
+ useEffect(() => {
317
+ if (!solidEntityCardViewData) return;
318
+
319
+ setCards(solidEntityCardViewData?.records || []);
320
+ setTotalRecords(solidEntityCardViewData?.meta?.totalRecords || 0);
321
+ }, [solidEntityCardViewData]);
322
+
314
323
  useEffect(() => {
315
324
  if (!queryDataLoaded) return;
316
325
 
@@ -348,6 +357,7 @@ export const SolidCardView = (params: SolidCardViewParams) => {
348
357
  }
349
358
 
350
359
  setFirst(0);
360
+ setFilterPredicates(structuredClone(filterPredicates));
351
361
  setFilters(updatedFilter);
352
362
  setFilterObjectToLocalStorage({
353
363
  offset: 0,
@@ -361,13 +371,13 @@ export const SolidCardView = (params: SolidCardViewParams) => {
361
371
  });
362
372
  };
363
373
 
364
- const handleFetchUpdatedRecords = () => {
374
+ const handleFetchUpdatedRecords = async () => {
365
375
  if (hasStoredFilterPredicates(getFilterObjectFromLocalStorage())) {
366
376
  solidGlobalSearchElementRef.current?.clearAppliedFilters?.();
367
377
  return;
368
378
  }
369
379
 
370
- void loadCards(filters);
380
+ await loadCards(filters);
371
381
  };
372
382
 
373
383
  const handleRecoverRecord = async (record: any) => {
@@ -438,8 +448,19 @@ export const SolidCardView = (params: SolidCardViewParams) => {
438
448
  const canDeleteCards = actionsAllowed.includes(`${permissionExpression(params.modelName, "delete")}`) &&
439
449
  solidCardViewMetaDataResponse?.data?.solidView?.layout?.attrs?.delete !== false &&
440
450
  solidCardViewMetaDataResponse?.data?.solidView?.layout?.attrs?.showRowDeleteInContextMenu !== false;
441
- const showEmptyState = !loading && cards.length === 0;
442
- const headerRequestStatusLabel = recoverByIdIsLoading ? "Recovering..." : loading || !queryDataLoaded ? "Loading..." : null;
451
+ const isCardViewMetaDataReady = Boolean(solidCardViewMetaDataResponse?.data?.solidView);
452
+ const showCardBodyLoadingPlaceholder = solidCardViewMetaDataIsLoading || (isCardViewMetaDataReady && (!queryDataLoaded || (loading && cards.length === 0)));
453
+ const hasActiveFilters = hasMeaningfulPersistedFilter(filters);
454
+ const showEmptyState = !loading && cards.length === 0 && !hasActiveFilters;
455
+ const showFilteredEmptyState = !loading && cards.length === 0 && hasActiveFilters;
456
+ const filteredEmptyMessage = solidCardViewMetaDataResponse?.data?.solidView?.model?.description || "No Entities found";
457
+ const headerRequestStatusLabel = isDeletingRecord
458
+ ? "Deleting..."
459
+ : recoverByIdIsLoading
460
+ ? "Recovering..."
461
+ : loading || !queryDataLoaded
462
+ ? "Loading..."
463
+ : null;
443
464
 
444
465
  return (
445
466
  <div className="page-parent-wrapper solid-list-page-wrapper flex h-full min-h-0 overflow-hidden">
@@ -462,6 +483,7 @@ export const SolidCardView = (params: SolidCardViewParams) => {
462
483
  ref={solidGlobalSearchElementRef}
463
484
  viewData={solidCardViewMetaDataResponse}
464
485
  handleApplyCustomFilter={handleApplyCustomFilter}
486
+ filterPredicates={filterPredicates}
465
487
  />
466
488
  </div>
467
489
  </div>
@@ -514,7 +536,7 @@ export const SolidCardView = (params: SolidCardViewParams) => {
514
536
  </div>
515
537
  </div>
516
538
 
517
- {showGlobalSearchElement && (
539
+ {shouldShowMobileSearchElement && (
518
540
  <div className="flex lg:hidden">
519
541
  <SolidGlobalSearchElement
520
542
  viewType="card"
@@ -523,14 +545,18 @@ export const SolidCardView = (params: SolidCardViewParams) => {
523
545
  ref={solidGlobalSearchElementRef}
524
546
  viewData={solidCardViewMetaDataResponse}
525
547
  handleApplyCustomFilter={handleApplyCustomFilter}
548
+ filterPredicates={filterPredicates}
526
549
  />
527
550
  </div>
528
551
  )}
529
552
  </div>
530
553
 
531
554
  <div className="solid-card-view-content">
532
- <div className="solid-card-view-body">
533
- {showEmptyState ? (
555
+ {showCardBodyLoadingPlaceholder ? (
556
+ <div className="solid-view-loading-body-spacer flex-1 min-h-0" />
557
+ ) : (
558
+ <div className="solid-card-view-body">
559
+ {showEmptyState ? (
534
560
  <SolidEmptyListViewPlaceholder
535
561
  createButtonUrl={createButtonUrl}
536
562
  createActionQueryParams={createActionQueryParams}
@@ -539,19 +565,24 @@ export const SolidCardView = (params: SolidCardViewParams) => {
539
565
  solidListViewMetaData={solidCardViewMetaDataResponse}
540
566
  handleFetchUpdatedRecords={handleFetchUpdatedRecords}
541
567
  />
542
- ) : (
543
- <CardGrid
544
- records={cards}
545
- solidCardViewMetaData={solidCardViewMetaDataResponse?.data}
546
- editButtonUrl={editBaseUrl}
547
- onDelete={canDeleteCards ? handleOpenDeleteDialog : undefined}
548
- onRecover={handleRecoverRecord}
549
- setLightboxUrls={setLightboxUrls}
550
- setOpenLightbox={setOpenLightbox}
551
- showArchived={showArchived}
552
- />
553
- )}
554
- </div>
568
+ ) : showFilteredEmptyState ? (
569
+ <div className="flex min-h-[240px] items-center justify-center rounded-md border border-border/60 bg-background px-6 py-10 text-center text-muted-foreground">
570
+ {filteredEmptyMessage}
571
+ </div>
572
+ ) : (
573
+ <CardGrid
574
+ records={cards}
575
+ solidCardViewMetaData={solidCardViewMetaDataResponse?.data}
576
+ editButtonUrl={editBaseUrl}
577
+ onDelete={canDeleteCards ? handleOpenDeleteDialog : undefined}
578
+ onRecover={handleRecoverRecord}
579
+ setLightboxUrls={setLightboxUrls}
580
+ setOpenLightbox={setOpenLightbox}
581
+ showArchived={showArchived}
582
+ />
583
+ )}
584
+ </div>
585
+ )}
555
586
 
556
587
  {totalRecords > 0 && (
557
588
  <div className="solid-card-view-pagination">
@@ -12,6 +12,7 @@
12
12
  .modal {
13
13
  width: min(540px, calc(100vw - 20px));
14
14
  max-height: calc(100vh - 32px);
15
+ min-width: 0;
15
16
  display: flex;
16
17
  flex-direction: column;
17
18
  border-radius: 12px;
@@ -20,6 +21,7 @@
20
21
  color: var(--card-foreground);
21
22
  box-shadow: 0 20px 48px rgba(2, 6, 23, 0.35);
22
23
  overflow: hidden;
24
+ overscroll-behavior: contain;
23
25
  }
24
26
 
25
27
  .header {
@@ -32,6 +34,10 @@
32
34
  gap: 12px;
33
35
  }
34
36
 
37
+ .header > div {
38
+ min-width: 0;
39
+ }
40
+
35
41
  .title {
36
42
  margin: 0;
37
43
  color: var(--card-foreground);
@@ -96,6 +102,7 @@
96
102
  .formWrapper {
97
103
  flex: 1;
98
104
  min-height: 0;
105
+ min-width: 0;
99
106
  overflow: auto;
100
107
  padding: 12px;
101
108
  background: var(--card);
@@ -195,11 +202,17 @@
195
202
  padding: 0 14px 14px;
196
203
  }
197
204
 
205
+ .tabsLine::-webkit-scrollbar {
206
+ display: none;
207
+ }
208
+
198
209
  @media (max-width: 900px) {
199
210
  .tabsLine {
200
211
  gap: 12px;
201
212
  overflow-x: auto;
202
213
  white-space: nowrap;
214
+ scrollbar-width: none;
215
+ -ms-overflow-style: none;
203
216
  }
204
217
  }
205
218
 
@@ -527,6 +540,16 @@
527
540
  display: flex;
528
541
  align-items: center;
529
542
  gap: 8px;
543
+ flex-wrap: wrap;
544
+ justify-content: flex-end;
545
+ }
546
+
547
+ .diagnosticsRefreshStatus {
548
+ font-size: 12px;
549
+ color: var(--muted-foreground);
550
+ min-height: 18px;
551
+ display: inline-flex;
552
+ align-items: center;
530
553
  }
531
554
 
532
555
  .diagnosticsSummary {
@@ -696,3 +719,79 @@
696
719
  grid-column: span 1;
697
720
  }
698
721
  }
722
+
723
+ @media (max-width: 640px) {
724
+ .backdrop {
725
+ padding: 8px;
726
+ }
727
+
728
+ .modal {
729
+ width: calc(100vw - 16px);
730
+ max-height: calc(100dvh - 16px);
731
+ border-radius: 14px;
732
+ }
733
+
734
+ .header {
735
+ padding: 14px 12px 10px;
736
+ align-items: flex-start;
737
+ }
738
+
739
+ .title {
740
+ font-size: 18px;
741
+ }
742
+
743
+ .subtitle {
744
+ font-size: 11.5px;
745
+ line-height: 1.4;
746
+ }
747
+
748
+ .tabsLine {
749
+ gap: 10px;
750
+ padding: 0 12px;
751
+ overscroll-behavior-x: contain;
752
+ }
753
+
754
+ .tabTrigger {
755
+ flex: 0 0 auto;
756
+ font-size: 12px;
757
+ padding: 11px 0 9px;
758
+ }
759
+
760
+ .formWrapper {
761
+ padding: 8px;
762
+ }
763
+
764
+ .accountScroll {
765
+ padding: 8px 8px 0;
766
+ }
767
+
768
+ .avatarRow,
769
+ .versionRow {
770
+ flex-direction: column;
771
+ align-items: flex-start;
772
+ }
773
+
774
+ .versionTags {
775
+ flex-wrap: wrap;
776
+ }
777
+
778
+ .footerActions {
779
+ padding: 10px 8px 12px;
780
+ }
781
+
782
+ .confirmActions {
783
+ padding: 0 8px 12px;
784
+ flex-direction: column-reverse;
785
+ }
786
+
787
+ .footerActions :global(.solid-btn),
788
+ .confirmActions :global(.solid-btn),
789
+ .versionActions :global(.solid-btn) {
790
+ width: 100%;
791
+ justify-content: center;
792
+ }
793
+
794
+ .versionActions {
795
+ width: 100%;
796
+ }
797
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"SolidVersionInfo.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,gBAAgB,+CAsK5B,CAAC"}
1
+ {"version":3,"file":"SolidVersionInfo.d.ts","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx"],"names":[],"mappings":"AA0BA,eAAO,MAAM,gBAAgB,+CAyM5B,CAAC"}
@@ -1,5 +1,41 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
1
37
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useMemo, useState } from "react";
38
+ import { useEffect, useState } from "react";
3
39
  import { env } from "../../../../adapters/env";
4
40
  import { hasAnyRole } from "../../../../helpers/rolesHelper";
5
41
  import { useSession } from "../../../../hooks/useSession";
@@ -22,12 +58,47 @@ export var SolidVersionInfo = function () {
22
58
  var session = useSession().data;
23
59
  var _f = useLazyGetSolidVersionInfoQuery(), trigger = _f[0], _g = _f[1], data = _g.data, isLoading = _g.isLoading, isError = _g.isError;
24
60
  var _h = useState(false), showDiagnostics = _h[0], setShowDiagnostics = _h[1];
25
- var _j = useState(0), refreshTick = _j[0], setRefreshTick = _j[1];
26
- var _k = useState("pool"), activeTab = _k[0], setActiveTab = _k[1];
27
- var poolSnapshot = useMemo(function () { return getSolidEntityApiPoolSnapshot(); }, [refreshTick, showDiagnostics]);
61
+ var _j = useState("pool"), activeTab = _j[0], setActiveTab = _j[1];
62
+ var _k = useState(function () { return getSolidEntityApiPoolSnapshot(); }), poolSnapshot = _k[0], setPoolSnapshot = _k[1];
63
+ var _l = useState(false), isRefreshingDiagnostics = _l[0], setIsRefreshingDiagnostics = _l[1];
64
+ var _m = useState(null), lastDiagnosticsRefreshLabel = _m[0], setLastDiagnosticsRefreshLabel = _m[1];
28
65
  useEffect(function () {
29
66
  trigger("");
30
67
  }, [trigger]);
68
+ var refreshDiagnosticsSnapshot = function () { return __awaiter(void 0, void 0, void 0, function () {
69
+ var snapshot;
70
+ return __generator(this, function (_a) {
71
+ switch (_a.label) {
72
+ case 0:
73
+ setIsRefreshingDiagnostics(true);
74
+ _a.label = 1;
75
+ case 1:
76
+ _a.trys.push([1, , 3, 4]);
77
+ return [4 /*yield*/, new Promise(function (resolve) {
78
+ window.requestAnimationFrame(function () { return resolve(); });
79
+ })];
80
+ case 2:
81
+ _a.sent();
82
+ snapshot = getSolidEntityApiPoolSnapshot();
83
+ setPoolSnapshot(snapshot);
84
+ setLastDiagnosticsRefreshLabel("Refreshed at ".concat(new Intl.DateTimeFormat(undefined, {
85
+ hour: "numeric",
86
+ minute: "2-digit",
87
+ second: "2-digit",
88
+ }).format(new Date())));
89
+ return [3 /*break*/, 4];
90
+ case 3:
91
+ setIsRefreshingDiagnostics(false);
92
+ return [7 /*endfinally*/];
93
+ case 4: return [2 /*return*/];
94
+ }
95
+ });
96
+ }); };
97
+ useEffect(function () {
98
+ if (!showDiagnostics)
99
+ return;
100
+ void refreshDiagnosticsSnapshot();
101
+ }, [showDiagnostics]);
31
102
  if (isLoading) {
32
103
  return (_jsx("div", { className: styles.versionLoaderWrap, children: _jsx("span", { className: "solid-btn-spinner", "aria-hidden": "true" }) }));
33
104
  }
@@ -45,6 +116,6 @@ export var SolidVersionInfo = function () {
45
116
  return (_jsxs("div", { className: styles.versionPanel, children: [_jsx("h3", { className: styles.sectionTitle, children: "Version Information" }), _jsx("p", { className: styles.versionCaption, children: "Packages powering this application" }), _jsx("div", { className: styles.versionList, children: Object.entries(packages).map(function (_a) {
46
117
  var key = _a[0], info = _a[1];
47
118
  return (_jsxs("div", { className: styles.versionRow, children: [_jsxs("div", { children: [_jsx("div", { className: styles.versionName, children: PACKAGE_LABELS[key] || key }), _jsx("div", { className: styles.versionHint, children: PACKAGE_HINTS[key] || key })] }), _jsxs("div", { className: styles.versionTags, children: [_jsx("span", { className: styles.versionTag, children: info.version }), _jsx("span", { className: "".concat(styles.versionTag, " ").concat(info.repo === "local" ? styles.repoLocal : styles.repoNpm), children: info.repo })] })] }, key));
48
- }) }), canOpenDiagnostics && (_jsx("div", { className: styles.versionActions, children: _jsx(SolidButton, { type: "button", size: "sm", variant: "outline", onClick: function () { return setShowDiagnostics(true); }, children: "Diagnostics" }) })), canOpenDiagnostics && showDiagnostics && (_jsx("div", { className: styles.diagnosticsBackdrop, role: "presentation", onClick: function () { return setShowDiagnostics(false); }, children: _jsxs("section", { className: styles.diagnosticsModal, role: "dialog", "aria-modal": "true", "aria-labelledby": "solid-diagnostics-title", onClick: function (event) { return event.stopPropagation(); }, children: [_jsxs("header", { className: styles.diagnosticsHeader, children: [_jsxs("div", { children: [_jsx("h3", { id: "solid-diagnostics-title", className: styles.sectionTitle, children: "Diagnostics" }), _jsx("p", { className: styles.versionCaption, children: "Current tab runtime entity API pool snapshot." })] }), _jsxs("div", { className: styles.diagnosticsHeaderActions, children: [_jsx(SolidButton, { type: "button", size: "sm", variant: "outline", onClick: function () { return setRefreshTick(function (value) { return value + 1; }); }, children: "Refresh" }), _jsx("button", { type: "button", className: styles.closeButton, onClick: function () { return setShowDiagnostics(false); }, "aria-label": "Close diagnostics", children: "\u00D7" })] })] }), _jsxs("div", { className: styles.diagnosticsSummary, children: [_jsxs("span", { children: [_jsx("strong", { children: "Environment:" }), " ", envName || "unknown"] }), _jsxs("span", { children: [_jsx("strong", { children: "Pool Limit:" }), " ", SOLID_ENTITY_API_POOL_LIMIT] }), _jsxs("span", { children: [_jsx("strong", { children: "Active:" }), " ", activeCount] }), _jsxs("span", { children: [_jsx("strong", { children: "Cached:" }), " ", poolSnapshot.length] })] }), _jsxs("div", { className: styles.diagnosticsTabs, children: [_jsx("button", { type: "button", className: "".concat(styles.diagnosticsTab, " ").concat(activeTab === "pool" ? styles.diagnosticsTabActive : ""), onClick: function () { return setActiveTab("pool"); }, children: "Pool" }), _jsx("button", { type: "button", className: "".concat(styles.diagnosticsTab, " ").concat(activeTab === "runtime" ? styles.diagnosticsTabActive : ""), onClick: function () { return setActiveTab("runtime"); }, children: "Runtime" })] }), activeTab === "pool" ? (_jsx("div", { className: styles.diagnosticsTableWrap, children: _jsxs("table", { className: styles.diagnosticsTable, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Entity" }), _jsx("th", { children: "Reducer Path" }), _jsx("th", { children: "Registered" }), _jsx("th", { children: "Last Accessed" }), _jsx("th", { children: "Active" })] }) }), _jsx("tbody", { children: poolSnapshot.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: 5, className: styles.diagnosticsEmpty, children: "No entity APIs created in this session yet." }) })) : (poolSnapshot.map(function (entry) { return (_jsxs("tr", { children: [_jsx("td", { children: entry.entityName }), _jsx("td", { className: styles.diagnosticsMono, children: entry.reducerPath }), _jsxs("td", { children: ["#", entry.registeredAt] }), _jsxs("td", { children: ["#", entry.lastAccessedAt] }), _jsx("td", { children: entry.active ? "yes" : "no" })] }, entry.reducerPath)); })) })] }) })) : (_jsxs("div", { className: styles.diagnosticsRuntimeGrid, children: [_jsxs("div", { children: [_jsx("strong", { children: "Environment:" }), " ", envName || "unknown"] }), _jsxs("div", { children: [_jsx("strong", { children: "Backend API:" }), " ", backendApi] }), _jsxs("div", { children: [_jsx("strong", { children: "Login Redirect:" }), " ", loginRedirect] }), _jsxs("div", { children: [_jsx("strong", { children: "User:" }), " ", ((_d = session === null || session === void 0 ? void 0 : session.user) === null || _d === void 0 ? void 0 : _d.email) || ((_e = session === null || session === void 0 ? void 0 : session.user) === null || _e === void 0 ? void 0 : _e.name) || "(unknown)"] }), _jsxs("div", { className: styles.diagnosticsSpan2, children: [_jsx("strong", { children: "Roles:" }), " ", roles] })] }))] }) }))] }));
119
+ }) }), canOpenDiagnostics && (_jsx("div", { className: styles.versionActions, children: _jsx(SolidButton, { type: "button", size: "sm", variant: "outline", onClick: function () { return setShowDiagnostics(true); }, children: "Diagnostics" }) })), canOpenDiagnostics && showDiagnostics && (_jsx("div", { className: styles.diagnosticsBackdrop, role: "presentation", onClick: function () { return setShowDiagnostics(false); }, children: _jsxs("section", { className: styles.diagnosticsModal, role: "dialog", "aria-modal": "true", "aria-labelledby": "solid-diagnostics-title", onClick: function (event) { return event.stopPropagation(); }, children: [_jsxs("header", { className: styles.diagnosticsHeader, children: [_jsxs("div", { children: [_jsx("h3", { id: "solid-diagnostics-title", className: styles.sectionTitle, children: "Diagnostics" }), _jsx("p", { className: styles.versionCaption, children: "Current tab runtime entity API pool snapshot." })] }), _jsxs("div", { className: styles.diagnosticsHeaderActions, children: [_jsx("span", { className: styles.diagnosticsRefreshStatus, "aria-live": "polite", children: lastDiagnosticsRefreshLabel }), _jsx(SolidButton, { type: "button", size: "sm", variant: "outline", loading: isRefreshingDiagnostics, onClick: function () { return void refreshDiagnosticsSnapshot(); }, children: "Refresh" }), _jsx("button", { type: "button", className: styles.closeButton, onClick: function () { return setShowDiagnostics(false); }, "aria-label": "Close diagnostics", children: "\u00D7" })] })] }), _jsxs("div", { className: styles.diagnosticsSummary, children: [_jsxs("span", { children: [_jsx("strong", { children: "Environment:" }), " ", envName || "unknown"] }), _jsxs("span", { children: [_jsx("strong", { children: "Pool Limit:" }), " ", SOLID_ENTITY_API_POOL_LIMIT] }), _jsxs("span", { children: [_jsx("strong", { children: "Active:" }), " ", activeCount] }), _jsxs("span", { children: [_jsx("strong", { children: "Cached:" }), " ", poolSnapshot.length] })] }), _jsxs("div", { className: styles.diagnosticsTabs, children: [_jsx("button", { type: "button", className: "".concat(styles.diagnosticsTab, " ").concat(activeTab === "pool" ? styles.diagnosticsTabActive : ""), onClick: function () { return setActiveTab("pool"); }, children: "Pool" }), _jsx("button", { type: "button", className: "".concat(styles.diagnosticsTab, " ").concat(activeTab === "runtime" ? styles.diagnosticsTabActive : ""), onClick: function () { return setActiveTab("runtime"); }, children: "Runtime" })] }), activeTab === "pool" ? (_jsx("div", { className: styles.diagnosticsTableWrap, children: _jsxs("table", { className: styles.diagnosticsTable, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Entity" }), _jsx("th", { children: "Reducer Path" }), _jsx("th", { children: "Registered" }), _jsx("th", { children: "Last Accessed" }), _jsx("th", { children: "Active" })] }) }), _jsx("tbody", { children: poolSnapshot.length === 0 ? (_jsx("tr", { children: _jsx("td", { colSpan: 5, className: styles.diagnosticsEmpty, children: "No entity APIs created in this session yet." }) })) : (poolSnapshot.map(function (entry) { return (_jsxs("tr", { children: [_jsx("td", { children: entry.entityName }), _jsx("td", { className: styles.diagnosticsMono, children: entry.reducerPath }), _jsxs("td", { children: ["#", entry.registeredAt] }), _jsxs("td", { children: ["#", entry.lastAccessedAt] }), _jsx("td", { children: entry.active ? "yes" : "no" })] }, entry.reducerPath)); })) })] }) })) : (_jsxs("div", { className: styles.diagnosticsRuntimeGrid, children: [_jsxs("div", { children: [_jsx("strong", { children: "Environment:" }), " ", envName || "unknown"] }), _jsxs("div", { children: [_jsx("strong", { children: "Backend API:" }), " ", backendApi] }), _jsxs("div", { children: [_jsx("strong", { children: "Login Redirect:" }), " ", loginRedirect] }), _jsxs("div", { children: [_jsx("strong", { children: "User:" }), " ", ((_d = session === null || session === void 0 ? void 0 : session.user) === null || _d === void 0 ? void 0 : _d.email) || ((_e = session === null || session === void 0 ? void 0 : session.user) === null || _e === void 0 ? void 0 : _e.name) || "(unknown)"] }), _jsxs("div", { className: styles.diagnosticsSpan2, children: [_jsx("strong", { children: "Roles:" }), " ", roles] })] }))] }) }))] }));
49
120
  };
50
121
  //# sourceMappingURL=SolidVersionInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SolidVersionInfo.js","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { env } from \"../../../../adapters/env\";\nimport { hasAnyRole } from \"../../../../helpers/rolesHelper\";\nimport { useSession } from \"../../../../hooks/useSession\";\nimport { useLazyGetSolidVersionInfoQuery } from \"../../../../redux/api/solidSettingsApi\";\nimport { getSolidEntityApiPoolSnapshot, SOLID_ENTITY_API_POOL_LIMIT } from \"../../../../redux/store/solidEntityApiPool\";\nimport { SolidButton } from \"../../../shad-cn-ui/SolidButton\";\nimport styles from \"./SolidAccountSettings.module.css\";\n\ninterface PackageVersionInfo {\n repo: \"local\" | \"npm\";\n version: string;\n}\n\nconst PACKAGE_LABELS: Record<string, string> = {\n \"solid-core\": \"Solid Core\",\n \"solid-core-ui\": \"Solid Core UI\",\n \"solid-code-builder\": \"Solid Code Builder\",\n};\n\nconst PACKAGE_HINTS: Record<string, string> = {\n \"solid-core\": \"@solidxai/core\",\n \"solid-core-ui\": \"@solidxai/core-ui\",\n \"solid-code-builder\": \"@solidxai/code-builder\",\n};\n\nexport const SolidVersionInfo = () => {\n const { data: session } = useSession();\n const [trigger, { data, isLoading, isError }] = useLazyGetSolidVersionInfoQuery();\n const [showDiagnostics, setShowDiagnostics] = useState(false);\n const [refreshTick, setRefreshTick] = useState(0);\n const [activeTab, setActiveTab] = useState<\"pool\" | \"runtime\">(\"pool\");\n const poolSnapshot = useMemo(() => getSolidEntityApiPoolSnapshot(), [refreshTick, showDiagnostics]);\n\n useEffect(() => {\n trigger(\"\");\n }, [trigger]);\n\n if (isLoading) {\n return (\n <div className={styles.versionLoaderWrap}>\n <span className=\"solid-btn-spinner\" aria-hidden=\"true\" />\n </div>\n );\n }\n\n if (isError || !data) {\n return <p className={styles.versionError}>Unable to load version information.</p>;\n }\n\n const packages = ((data as any)?.data ?? data) as Record<string, PackageVersionInfo>;\n const envName = (env(\"VITE_SOLIDX_ENV\") || \"\").toLowerCase();\n const isDevLikeEnvironment = [\"dev\", \"development\", \"staging\", \"stage\", \"uat\", \"test\", \"local\"].includes(envName);\n const canOpenDiagnostics = hasAnyRole(session?.user?.roles, [\"Admin\"]) && isDevLikeEnvironment;\n const loginRedirect = env(\"NEXT_PUBLIC_LOGIN_REDIRECT_URL\") || \"/admin\";\n const backendApi = env(\"NEXT_PUBLIC_BACKEND_API_URL\") || env(\"API_URL\") || \"(not set)\";\n const roles = (session?.user?.roles || []).map((role: any) => role?.name || role).join(\", \") || \"(none)\";\n const activeCount = poolSnapshot.filter((entry) => entry.active).length;\n\n return (\n <div className={styles.versionPanel}>\n <h3 className={styles.sectionTitle}>Version Information</h3>\n <p className={styles.versionCaption}>Packages powering this application</p>\n\n <div className={styles.versionList}>\n {Object.entries(packages).map(([key, info]) => (\n <div key={key} className={styles.versionRow}>\n <div>\n <div className={styles.versionName}>{PACKAGE_LABELS[key] || key}</div>\n <div className={styles.versionHint}>{PACKAGE_HINTS[key] || key}</div>\n </div>\n <div className={styles.versionTags}>\n <span className={styles.versionTag}>{info.version}</span>\n <span className={`${styles.versionTag} ${info.repo === \"local\" ? styles.repoLocal : styles.repoNpm}`}>\n {info.repo}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {canOpenDiagnostics && (\n <div className={styles.versionActions}>\n <SolidButton\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setShowDiagnostics(true)}\n >\n Diagnostics\n </SolidButton>\n </div>\n )}\n\n {canOpenDiagnostics && showDiagnostics && (\n <div className={styles.diagnosticsBackdrop} role=\"presentation\" onClick={() => setShowDiagnostics(false)}>\n <section\n className={styles.diagnosticsModal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"solid-diagnostics-title\"\n onClick={(event) => event.stopPropagation()}\n >\n <header className={styles.diagnosticsHeader}>\n <div>\n <h3 id=\"solid-diagnostics-title\" className={styles.sectionTitle}>Diagnostics</h3>\n <p className={styles.versionCaption}>Current tab runtime entity API pool snapshot.</p>\n </div>\n <div className={styles.diagnosticsHeaderActions}>\n <SolidButton type=\"button\" size=\"sm\" variant=\"outline\" onClick={() => setRefreshTick((value) => value + 1)}>\n Refresh\n </SolidButton>\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={() => setShowDiagnostics(false)}\n aria-label=\"Close diagnostics\"\n >\n ×\n </button>\n </div>\n </header>\n\n <div className={styles.diagnosticsSummary}>\n <span><strong>Environment:</strong> {envName || \"unknown\"}</span>\n <span><strong>Pool Limit:</strong> {SOLID_ENTITY_API_POOL_LIMIT}</span>\n <span><strong>Active:</strong> {activeCount}</span>\n <span><strong>Cached:</strong> {poolSnapshot.length}</span>\n </div>\n\n <div className={styles.diagnosticsTabs}>\n <button\n type=\"button\"\n className={`${styles.diagnosticsTab} ${activeTab === \"pool\" ? styles.diagnosticsTabActive : \"\"}`}\n onClick={() => setActiveTab(\"pool\")}\n >\n Pool\n </button>\n <button\n type=\"button\"\n className={`${styles.diagnosticsTab} ${activeTab === \"runtime\" ? styles.diagnosticsTabActive : \"\"}`}\n onClick={() => setActiveTab(\"runtime\")}\n >\n Runtime\n </button>\n </div>\n\n {activeTab === \"pool\" ? (\n <div className={styles.diagnosticsTableWrap}>\n <table className={styles.diagnosticsTable}>\n <thead>\n <tr>\n <th>Entity</th>\n <th>Reducer Path</th>\n <th>Registered</th>\n <th>Last Accessed</th>\n <th>Active</th>\n </tr>\n </thead>\n <tbody>\n {poolSnapshot.length === 0 ? (\n <tr>\n <td colSpan={5} className={styles.diagnosticsEmpty}>No entity APIs created in this session yet.</td>\n </tr>\n ) : (\n poolSnapshot.map((entry) => (\n <tr key={entry.reducerPath}>\n <td>{entry.entityName}</td>\n <td className={styles.diagnosticsMono}>{entry.reducerPath}</td>\n <td>#{entry.registeredAt}</td>\n <td>#{entry.lastAccessedAt}</td>\n <td>{entry.active ? \"yes\" : \"no\"}</td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n ) : (\n <div className={styles.diagnosticsRuntimeGrid}>\n <div><strong>Environment:</strong> {envName || \"unknown\"}</div>\n <div><strong>Backend API:</strong> {backendApi}</div>\n <div><strong>Login Redirect:</strong> {loginRedirect}</div>\n <div><strong>User:</strong> {session?.user?.email || session?.user?.name || \"(unknown)\"}</div>\n <div className={styles.diagnosticsSpan2}><strong>Roles:</strong> {roles}</div>\n </div>\n )}\n </section>\n </div>\n )}\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"SolidVersionInfo.js","sourceRoot":"","sources":["../../../../../src/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport { env } from \"../../../../adapters/env\";\nimport { hasAnyRole } from \"../../../../helpers/rolesHelper\";\nimport { useSession } from \"../../../../hooks/useSession\";\nimport { useLazyGetSolidVersionInfoQuery } from \"../../../../redux/api/solidSettingsApi\";\nimport { getSolidEntityApiPoolSnapshot, SOLID_ENTITY_API_POOL_LIMIT } from \"../../../../redux/store/solidEntityApiPool\";\nimport { SolidButton } from \"../../../shad-cn-ui/SolidButton\";\nimport styles from \"./SolidAccountSettings.module.css\";\n\ninterface PackageVersionInfo {\n repo: \"local\" | \"npm\";\n version: string;\n}\n\nconst PACKAGE_LABELS: Record<string, string> = {\n \"solid-core\": \"Solid Core\",\n \"solid-core-ui\": \"Solid Core UI\",\n \"solid-code-builder\": \"Solid Code Builder\",\n};\n\nconst PACKAGE_HINTS: Record<string, string> = {\n \"solid-core\": \"@solidxai/core\",\n \"solid-core-ui\": \"@solidxai/core-ui\",\n \"solid-code-builder\": \"@solidxai/code-builder\",\n};\n\nexport const SolidVersionInfo = () => {\n const { data: session } = useSession();\n const [trigger, { data, isLoading, isError }] = useLazyGetSolidVersionInfoQuery();\n const [showDiagnostics, setShowDiagnostics] = useState(false);\n const [activeTab, setActiveTab] = useState<\"pool\" | \"runtime\">(\"pool\");\n const [poolSnapshot, setPoolSnapshot] = useState(() => getSolidEntityApiPoolSnapshot());\n const [isRefreshingDiagnostics, setIsRefreshingDiagnostics] = useState(false);\n const [lastDiagnosticsRefreshLabel, setLastDiagnosticsRefreshLabel] = useState<string | null>(null);\n\n useEffect(() => {\n trigger(\"\");\n }, [trigger]);\n\n const refreshDiagnosticsSnapshot = async () => {\n setIsRefreshingDiagnostics(true);\n\n try {\n await new Promise<void>((resolve) => {\n window.requestAnimationFrame(() => resolve());\n });\n\n const snapshot = getSolidEntityApiPoolSnapshot();\n setPoolSnapshot(snapshot);\n setLastDiagnosticsRefreshLabel(\n `Refreshed at ${new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n second: \"2-digit\",\n }).format(new Date())}`\n );\n } finally {\n setIsRefreshingDiagnostics(false);\n }\n };\n\n useEffect(() => {\n if (!showDiagnostics) return;\n void refreshDiagnosticsSnapshot();\n }, [showDiagnostics]);\n\n if (isLoading) {\n return (\n <div className={styles.versionLoaderWrap}>\n <span className=\"solid-btn-spinner\" aria-hidden=\"true\" />\n </div>\n );\n }\n\n if (isError || !data) {\n return <p className={styles.versionError}>Unable to load version information.</p>;\n }\n\n const packages = ((data as any)?.data ?? data) as Record<string, PackageVersionInfo>;\n const envName = (env(\"VITE_SOLIDX_ENV\") || \"\").toLowerCase();\n const isDevLikeEnvironment = [\"dev\", \"development\", \"staging\", \"stage\", \"uat\", \"test\", \"local\"].includes(envName);\n const canOpenDiagnostics = hasAnyRole(session?.user?.roles, [\"Admin\"]) && isDevLikeEnvironment;\n const loginRedirect = env(\"NEXT_PUBLIC_LOGIN_REDIRECT_URL\") || \"/admin\";\n const backendApi = env(\"NEXT_PUBLIC_BACKEND_API_URL\") || env(\"API_URL\") || \"(not set)\";\n const roles = (session?.user?.roles || []).map((role: any) => role?.name || role).join(\", \") || \"(none)\";\n const activeCount = poolSnapshot.filter((entry) => entry.active).length;\n\n return (\n <div className={styles.versionPanel}>\n <h3 className={styles.sectionTitle}>Version Information</h3>\n <p className={styles.versionCaption}>Packages powering this application</p>\n\n <div className={styles.versionList}>\n {Object.entries(packages).map(([key, info]) => (\n <div key={key} className={styles.versionRow}>\n <div>\n <div className={styles.versionName}>{PACKAGE_LABELS[key] || key}</div>\n <div className={styles.versionHint}>{PACKAGE_HINTS[key] || key}</div>\n </div>\n <div className={styles.versionTags}>\n <span className={styles.versionTag}>{info.version}</span>\n <span className={`${styles.versionTag} ${info.repo === \"local\" ? styles.repoLocal : styles.repoNpm}`}>\n {info.repo}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {canOpenDiagnostics && (\n <div className={styles.versionActions}>\n <SolidButton\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n onClick={() => setShowDiagnostics(true)}\n >\n Diagnostics\n </SolidButton>\n </div>\n )}\n\n {canOpenDiagnostics && showDiagnostics && (\n <div className={styles.diagnosticsBackdrop} role=\"presentation\" onClick={() => setShowDiagnostics(false)}>\n <section\n className={styles.diagnosticsModal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"solid-diagnostics-title\"\n onClick={(event) => event.stopPropagation()}\n >\n <header className={styles.diagnosticsHeader}>\n <div>\n <h3 id=\"solid-diagnostics-title\" className={styles.sectionTitle}>Diagnostics</h3>\n <p className={styles.versionCaption}>Current tab runtime entity API pool snapshot.</p>\n </div>\n <div className={styles.diagnosticsHeaderActions}>\n <span className={styles.diagnosticsRefreshStatus} aria-live=\"polite\">{lastDiagnosticsRefreshLabel}</span>\n <SolidButton\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n loading={isRefreshingDiagnostics}\n onClick={() => void refreshDiagnosticsSnapshot()}\n >\n Refresh\n </SolidButton>\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={() => setShowDiagnostics(false)}\n aria-label=\"Close diagnostics\"\n >\n ×\n </button>\n </div>\n </header>\n\n <div className={styles.diagnosticsSummary}>\n <span><strong>Environment:</strong> {envName || \"unknown\"}</span>\n <span><strong>Pool Limit:</strong> {SOLID_ENTITY_API_POOL_LIMIT}</span>\n <span><strong>Active:</strong> {activeCount}</span>\n <span><strong>Cached:</strong> {poolSnapshot.length}</span>\n </div>\n\n <div className={styles.diagnosticsTabs}>\n <button\n type=\"button\"\n className={`${styles.diagnosticsTab} ${activeTab === \"pool\" ? styles.diagnosticsTabActive : \"\"}`}\n onClick={() => setActiveTab(\"pool\")}\n >\n Pool\n </button>\n <button\n type=\"button\"\n className={`${styles.diagnosticsTab} ${activeTab === \"runtime\" ? styles.diagnosticsTabActive : \"\"}`}\n onClick={() => setActiveTab(\"runtime\")}\n >\n Runtime\n </button>\n </div>\n\n {activeTab === \"pool\" ? (\n <div className={styles.diagnosticsTableWrap}>\n <table className={styles.diagnosticsTable}>\n <thead>\n <tr>\n <th>Entity</th>\n <th>Reducer Path</th>\n <th>Registered</th>\n <th>Last Accessed</th>\n <th>Active</th>\n </tr>\n </thead>\n <tbody>\n {poolSnapshot.length === 0 ? (\n <tr>\n <td colSpan={5} className={styles.diagnosticsEmpty}>No entity APIs created in this session yet.</td>\n </tr>\n ) : (\n poolSnapshot.map((entry) => (\n <tr key={entry.reducerPath}>\n <td>{entry.entityName}</td>\n <td className={styles.diagnosticsMono}>{entry.reducerPath}</td>\n <td>#{entry.registeredAt}</td>\n <td>#{entry.lastAccessedAt}</td>\n <td>{entry.active ? \"yes\" : \"no\"}</td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n ) : (\n <div className={styles.diagnosticsRuntimeGrid}>\n <div><strong>Environment:</strong> {envName || \"unknown\"}</div>\n <div><strong>Backend API:</strong> {backendApi}</div>\n <div><strong>Login Redirect:</strong> {loginRedirect}</div>\n <div><strong>User:</strong> {session?.user?.email || session?.user?.name || \"(unknown)\"}</div>\n <div className={styles.diagnosticsSpan2}><strong>Roles:</strong> {roles}</div>\n </div>\n )}\n </section>\n </div>\n )}\n </div>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { useEffect, useMemo, useState } from "react";
1
+ import { useEffect, useState } from "react";
2
2
  import { env } from "../../../../adapters/env";
3
3
  import { hasAnyRole } from "../../../../helpers/rolesHelper";
4
4
  import { useSession } from "../../../../hooks/useSession";
@@ -28,14 +28,42 @@ export const SolidVersionInfo = () => {
28
28
  const { data: session } = useSession();
29
29
  const [trigger, { data, isLoading, isError }] = useLazyGetSolidVersionInfoQuery();
30
30
  const [showDiagnostics, setShowDiagnostics] = useState(false);
31
- const [refreshTick, setRefreshTick] = useState(0);
32
31
  const [activeTab, setActiveTab] = useState<"pool" | "runtime">("pool");
33
- const poolSnapshot = useMemo(() => getSolidEntityApiPoolSnapshot(), [refreshTick, showDiagnostics]);
32
+ const [poolSnapshot, setPoolSnapshot] = useState(() => getSolidEntityApiPoolSnapshot());
33
+ const [isRefreshingDiagnostics, setIsRefreshingDiagnostics] = useState(false);
34
+ const [lastDiagnosticsRefreshLabel, setLastDiagnosticsRefreshLabel] = useState<string | null>(null);
34
35
 
35
36
  useEffect(() => {
36
37
  trigger("");
37
38
  }, [trigger]);
38
39
 
40
+ const refreshDiagnosticsSnapshot = async () => {
41
+ setIsRefreshingDiagnostics(true);
42
+
43
+ try {
44
+ await new Promise<void>((resolve) => {
45
+ window.requestAnimationFrame(() => resolve());
46
+ });
47
+
48
+ const snapshot = getSolidEntityApiPoolSnapshot();
49
+ setPoolSnapshot(snapshot);
50
+ setLastDiagnosticsRefreshLabel(
51
+ `Refreshed at ${new Intl.DateTimeFormat(undefined, {
52
+ hour: "numeric",
53
+ minute: "2-digit",
54
+ second: "2-digit",
55
+ }).format(new Date())}`
56
+ );
57
+ } finally {
58
+ setIsRefreshingDiagnostics(false);
59
+ }
60
+ };
61
+
62
+ useEffect(() => {
63
+ if (!showDiagnostics) return;
64
+ void refreshDiagnosticsSnapshot();
65
+ }, [showDiagnostics]);
66
+
39
67
  if (isLoading) {
40
68
  return (
41
69
  <div className={styles.versionLoaderWrap}>
@@ -107,7 +135,14 @@ export const SolidVersionInfo = () => {
107
135
  <p className={styles.versionCaption}>Current tab runtime entity API pool snapshot.</p>
108
136
  </div>
109
137
  <div className={styles.diagnosticsHeaderActions}>
110
- <SolidButton type="button" size="sm" variant="outline" onClick={() => setRefreshTick((value) => value + 1)}>
138
+ <span className={styles.diagnosticsRefreshStatus} aria-live="polite">{lastDiagnosticsRefreshLabel}</span>
139
+ <SolidButton
140
+ type="button"
141
+ size="sm"
142
+ variant="outline"
143
+ loading={isRefreshingDiagnostics}
144
+ onClick={() => void refreshDiagnosticsSnapshot()}
145
+ >
111
146
  Refresh
112
147
  </SolidButton>
113
148
  <button
@@ -1 +1 @@
1
- {"version":3,"file":"SolidGlobalSearchElement.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidGlobalSearchElement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgF,MAAM,OAAO,CAAC;AAarG,OAA0B,EAAE,eAAe,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AA0B3G,MAAM,MAAM,eAAe,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;CAClC,CAAA;AAoUD,eAAO,MAAM,2BAA2B,sBAAuB,GAAG,aAAa,GAAG,yBAAyB,MAAM,iBAAiB,MAAM,QAavI,CAAA;AAGD,eAAO,MAAM,mBAAmB,iBAAkB,GAAG,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,GAAG,kBAAkB,YAAY,EAAE,qBAAqB,eAAe,EAAE,QAwBvL,CAAA;AAiID,eAAO,MAAM,wBAAwB,kFA4tDnC,CAAC"}
1
+ {"version":3,"file":"SolidGlobalSearchElement.d.ts","sourceRoot":"","sources":["../../../../src/components/core/common/SolidGlobalSearchElement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6F,MAAM,OAAO,CAAC;AAclH,OAA0B,EAAE,eAAe,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AA0B3G,MAAM,MAAM,eAAe,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;CAClC,CAAA;AAoUD,eAAO,MAAM,2BAA2B,sBAAuB,GAAG,aAAa,GAAG,yBAAyB,MAAM,iBAAiB,MAAM,QAavI,CAAA;AAGD,eAAO,MAAM,mBAAmB,iBAAkB,GAAG,gBAAgB,GAAG,eAAe,GAAG,qBAAqB,GAAG,kBAAkB,YAAY,EAAE,qBAAqB,eAAe,EAAE,QAwBvL,CAAA;AAoID,eAAO,MAAM,wBAAwB,kFA6sDnC,CAAC"}