@solidxai/core-ui 0.1.5-beta.0 → 0.1.5-beta.10
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.
- package/dist/components/auth/AuthTabs.d.ts +14 -0
- package/dist/components/auth/AuthTabs.d.ts.map +1 -0
- package/dist/components/auth/AuthTabs.js +19 -0
- package/dist/components/auth/AuthTabs.js.map +1 -0
- package/dist/components/auth/AuthTabs.tsx +38 -0
- package/dist/components/common/AuthBanner.js.map +1 -1
- package/dist/components/common/SolidErrorStatePage.d.ts +12 -0
- package/dist/components/common/SolidErrorStatePage.d.ts.map +1 -0
- package/dist/components/common/SolidErrorStatePage.js +16 -0
- package/dist/components/common/SolidErrorStatePage.js.map +1 -0
- package/dist/components/common/SolidErrorStatePage.tsx +55 -0
- package/dist/components/core/chatter/SolidChatter.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatter.js +6 -7
- package/dist/components/core/chatter/SolidChatter.js.map +1 -1
- package/dist/components/core/chatter/SolidChatter.tsx +6 -7
- package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts +5 -2
- package/dist/components/core/chatter/SolidChatterAuditMessage.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterAuditMessage.js +19 -1
- package/dist/components/core/chatter/SolidChatterAuditMessage.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterAuditMessage.tsx +29 -5
- package/dist/components/core/chatter/SolidChatterDateDivider.d.ts.map +1 -1
- package/dist/components/core/chatter/SolidChatterDateDivider.js +4 -1
- package/dist/components/core/chatter/SolidChatterDateDivider.js.map +1 -1
- package/dist/components/core/chatter/SolidChatterDateDivider.tsx +5 -1
- package/dist/components/core/common/SolidCreateButton.js +3 -3
- package/dist/components/core/common/SolidCreateButton.js.map +1 -1
- package/dist/components/core/common/SolidCreateButton.tsx +3 -3
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +1 -0
- package/dist/components/core/dashboard/DashboardFilter.d.ts +13 -0
- package/dist/components/core/dashboard/DashboardFilter.d.ts.map +1 -0
- package/dist/components/core/dashboard/DashboardFilter.js +305 -0
- package/dist/components/core/dashboard/DashboardFilter.js.map +1 -0
- package/dist/components/core/dashboard/DashboardFilter.tsx +356 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.d.ts +3 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.d.ts.map +1 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.js +21 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.js.map +1 -0
- package/dist/components/core/dashboard/PrimeDataTableWrapper.tsx +40 -0
- package/dist/components/core/dashboard/SolidDashboard.d.ts +0 -1
- package/dist/components/core/dashboard/SolidDashboard.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.js +51 -22
- package/dist/components/core/dashboard/SolidDashboard.js.map +1 -1
- package/dist/components/core/dashboard/SolidDashboard.module.css +6 -2
- package/dist/components/core/dashboard/SolidDashboard.tsx +133 -56
- package/dist/components/core/dashboard/SolidDashboardBody.d.ts +13 -1
- package/dist/components/core/dashboard/SolidDashboardBody.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidDashboardBody.js +134 -48
- package/dist/components/core/dashboard/SolidDashboardBody.js.map +1 -1
- package/dist/components/core/dashboard/SolidDashboardBody.tsx +143 -91
- package/dist/components/core/dashboard/SolidQuestionRenderer.d.ts.map +1 -1
- package/dist/components/core/dashboard/SolidQuestionRenderer.js +1 -1
- package/dist/components/core/dashboard/SolidQuestionRenderer.js.map +1 -1
- package/dist/components/core/dashboard/SolidQuestionRenderer.tsx +12 -10
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.d.ts.map +1 -1
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.js +29 -2
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.js.map +1 -1
- package/dist/components/core/dashboard/chart-renderers/ChartJsRenderer.tsx +33 -3
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.d.ts +10 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.js +16 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.js.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardFormViewChangeHandler.ts +19 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.d.ts +8 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.js +64 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.js.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionFieldChangeHandler.ts +30 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.d.ts +8 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.js +62 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.js.map +1 -0
- package/dist/components/core/extension/solid-core/dashboard/dashboardQuestionOnFormLoadHandler.ts +29 -0
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js +2 -2
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/modelMetadata/list/DeleteModelRowAction.tsx +2 -2
- package/dist/components/core/form/SolidFormView.js +1 -1
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +2 -2
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +2 -2
- package/dist/components/core/list/PLAN.md +92 -0
- package/dist/components/core/list/SolidDataTable.d.ts +58 -0
- package/dist/components/core/list/SolidDataTable.d.ts.map +1 -0
- package/dist/components/core/list/SolidDataTable.js +141 -0
- package/dist/components/core/list/SolidDataTable.js.map +1 -0
- package/dist/components/core/list/SolidDataTable.tsx +314 -0
- package/dist/components/core/list/SolidDataTablePagination.d.ts +15 -0
- package/dist/components/core/list/SolidDataTablePagination.d.ts.map +1 -0
- package/dist/components/core/list/SolidDataTablePagination.js +22 -0
- package/dist/components/core/list/SolidDataTablePagination.js.map +1 -0
- package/dist/components/core/list/SolidDataTablePagination.tsx +71 -0
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +14 -11
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +8 -7
- package/dist/components/core/list/columns/SolidDateColumn.d.ts +2 -0
- package/dist/components/core/list/columns/SolidDateColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidDateColumn.js +9 -1
- package/dist/components/core/list/columns/SolidDateColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidDateColumn.tsx +13 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.js +1 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidDatetimeColumn.tsx +1 -1
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +277 -43
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +436 -4
- package/dist/components/layout/AdminTopHeader.d.ts +2 -0
- package/dist/components/layout/AdminTopHeader.d.ts.map +1 -0
- package/dist/components/layout/AdminTopHeader.js +68 -0
- package/dist/components/layout/AdminTopHeader.js.map +1 -0
- package/dist/components/layout/AdminTopHeader.tsx +135 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts +24 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.js +224 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidAutocomplete.tsx +339 -0
- package/dist/components/shad-cn-ui/SolidButton.d.ts +14 -0
- package/dist/components/shad-cn-ui/SolidButton.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidButton.js +36 -0
- package/dist/components/shad-cn-ui/SolidButton.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidButton.tsx +54 -0
- package/dist/components/shad-cn-ui/SolidInput.d.ts +5 -0
- package/dist/components/shad-cn-ui/SolidInput.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidInput.js +35 -0
- package/dist/components/shad-cn-ui/SolidInput.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidInput.tsx +12 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.d.ts +10 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.js +33 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidNumberInput.tsx +24 -0
- package/dist/components/shad-cn-ui/SolidSelect.d.ts +16 -0
- package/dist/components/shad-cn-ui/SolidSelect.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidSelect.js +26 -0
- package/dist/components/shad-cn-ui/SolidSelect.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidSelect.tsx +65 -0
- package/dist/components/shad-cn-ui/SolidTabs.d.ts +18 -0
- package/dist/components/shad-cn-ui/SolidTabs.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/SolidTabs.js +22 -0
- package/dist/components/shad-cn-ui/SolidTabs.js.map +1 -0
- package/dist/components/shad-cn-ui/SolidTabs.tsx +73 -0
- package/dist/components/shad-cn-ui/index.d.ts +7 -0
- package/dist/components/shad-cn-ui/index.d.ts.map +1 -0
- package/dist/components/shad-cn-ui/index.js +7 -0
- package/dist/components/shad-cn-ui/index.js.map +1 -0
- package/dist/components/shad-cn-ui/index.ts +6 -0
- package/dist/components/solid-ui/SolidButton.d.ts +14 -0
- package/dist/components/solid-ui/SolidButton.d.ts.map +1 -0
- package/dist/components/solid-ui/SolidButton.js +36 -0
- package/dist/components/solid-ui/SolidButton.js.map +1 -0
- package/dist/components/solid-ui/SolidButton.tsx +54 -0
- package/dist/components/solid-ui/SolidTabs.d.ts +18 -0
- package/dist/components/solid-ui/SolidTabs.d.ts.map +1 -0
- package/dist/components/solid-ui/SolidTabs.js +22 -0
- package/dist/components/solid-ui/SolidTabs.js.map +1 -0
- package/dist/components/solid-ui/SolidTabs.tsx +73 -0
- package/dist/components/solid-ui/index.d.ts +3 -0
- package/dist/components/solid-ui/index.d.ts.map +1 -0
- package/dist/components/solid-ui/index.js +3 -0
- package/dist/components/solid-ui/index.js.map +1 -0
- package/dist/components/solid-ui/index.ts +2 -0
- package/dist/constants/error-messages.d.ts +3 -0
- package/dist/constants/error-messages.d.ts.map +1 -1
- package/dist/constants/error-messages.js +3 -0
- package/dist/constants/error-messages.js.map +1 -1
- package/dist/constants/error-messages.ts +24 -20
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +10 -0
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +12 -0
- package/dist/helpers/routePaths.d.ts +1 -1
- package/dist/helpers/routePaths.d.ts.map +1 -1
- package/dist/helpers/routePaths.js +2 -2
- package/dist/helpers/routePaths.js.map +1 -1
- package/dist/helpers/routePaths.ts +2 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.ts +8 -0
- package/dist/redux/api/dashboardLayoutApi.d.ts +24 -0
- package/dist/redux/api/dashboardLayoutApi.d.ts.map +1 -0
- package/dist/redux/api/dashboardLayoutApi.js +34 -0
- package/dist/redux/api/dashboardLayoutApi.js.map +1 -0
- package/dist/redux/api/dashboardLayoutApi.ts +55 -0
- package/dist/redux/store/defaultStoreConfig.d.ts +4 -0
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/redux/store/defaultStoreConfig.js +3 -2
- package/dist/redux/store/defaultStoreConfig.js.map +1 -1
- package/dist/redux/store/defaultStoreConfig.ts +4 -2
- package/dist/resources/globals.css +8 -0
- package/dist/resources/images/errors/error-astronaut-404.png +0 -0
- package/dist/resources/shadcn-base.css +3200 -0
- package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.js +3 -7
- package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -5
- package/dist/routes/pages/admin/core/FormPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/FormPage.js +6 -1
- package/dist/routes/pages/admin/core/FormPage.js.map +1 -1
- package/dist/routes/pages/admin/core/FormPage.tsx +7 -1
- package/dist/routes/solidRoutes.js +1 -1
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +1 -1
- package/package.json +13 -11
- package/dist/components/auth/SolidOTPVerify.d.ts +0 -3
- package/dist/components/auth/SolidOTPVerify.d.ts.map +0 -1
- package/dist/components/auth/SolidOTPVerify.js +0 -67
- package/dist/components/auth/SolidOTPVerify.js.map +0 -1
- package/dist/components/auth/SolidOTPVerify.tsx +0 -133
- package/dist/components/core/common/LoadDynamicJsxComponent.d.ts +0 -2
- package/dist/components/core/common/LoadDynamicJsxComponent.d.ts.map +0 -1
- package/dist/components/core/common/LoadDynamicJsxComponent.js +0 -50
- package/dist/components/core/common/LoadDynamicJsxComponent.js.map +0 -1
- package/dist/components/core/common/LoadDynamicJsxComponent.tsx +0 -70
- package/dist/nextAuth/authProviders.d.ts +0 -4
- package/dist/nextAuth/authProviders.d.ts.map +0 -1
- package/dist/nextAuth/authProviders.js +0 -198
- package/dist/nextAuth/authProviders.js.map +0 -1
- package/dist/nextAuth/authProviders.tsx +0 -232
- package/dist/nextAuth/handleLogout.d.ts +0 -2
- package/dist/nextAuth/handleLogout.d.ts.map +0 -1
- package/dist/nextAuth/handleLogout.js +0 -36
- package/dist/nextAuth/handleLogout.js.map +0 -1
- package/dist/nextAuth/handleLogout.tsx +0 -39
- package/dist/nextAuth/refreshAccessToken.d.ts +0 -2
- package/dist/nextAuth/refreshAccessToken.d.ts.map +0 -1
- package/dist/nextAuth/refreshAccessToken.js +0 -24
- package/dist/nextAuth/refreshAccessToken.js.map +0 -1
- package/dist/nextAuth/refreshAccessToken.tsx +0 -28
- package/dist/redux/features/settingsSlice.d.ts +0 -20
- package/dist/redux/features/settingsSlice.d.ts.map +0 -1
- package/dist/redux/features/settingsSlice.js +0 -39
- package/dist/redux/features/settingsSlice.js.map +0 -1
- package/dist/redux/features/settingsSlice.ts +0 -60
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { useContext, useMemo } from "react";
|
|
2
|
+
import { usePathname } from "../../hooks/usePathname";
|
|
3
|
+
import { useSearchParams } from "../../hooks/useSearchParams";
|
|
4
|
+
import { useRouter } from "../../hooks/useRouter";
|
|
5
|
+
import { useGetSolidActionByIdQuery } from "../../redux/api/solidActionApi";
|
|
6
|
+
import { LayoutContext } from "./context/layoutcontext";
|
|
7
|
+
|
|
8
|
+
const SIDEBAR_TOGGLE_EVENT = "solidx:sidebar-toggle";
|
|
9
|
+
|
|
10
|
+
const toLabel = (value: string) =>
|
|
11
|
+
decodeURIComponent(value)
|
|
12
|
+
.replace(/[-_]/g, " ")
|
|
13
|
+
.replace(/\b\w/g, (m) => m.toUpperCase());
|
|
14
|
+
|
|
15
|
+
export const AdminTopHeader = () => {
|
|
16
|
+
const pathname = usePathname();
|
|
17
|
+
const searchParams = useSearchParams();
|
|
18
|
+
const router = useRouter();
|
|
19
|
+
const { toggleThemeMode } = useContext(LayoutContext);
|
|
20
|
+
|
|
21
|
+
// We treat actionId as the source of truth for breadcrumb labels.
|
|
22
|
+
// If present, we resolve module/model/action via action-metadata API
|
|
23
|
+
// so breadcrumbs are consistent across list/form/tree/kanban pages.
|
|
24
|
+
const actionId = searchParams.get("actionId");
|
|
25
|
+
const { data: actionResponse } = useGetSolidActionByIdQuery(actionId as string, {
|
|
26
|
+
skip: !actionId,
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const crumbs = useMemo(() => {
|
|
30
|
+
// API response shapes vary by adapter layer, so normalize defensively.
|
|
31
|
+
const actionData = actionResponse?.data?.data ?? actionResponse?.data ?? actionResponse;
|
|
32
|
+
const moduleFromApi = actionData?.module?.displayName || actionData?.module?.name;
|
|
33
|
+
const modelFromApi = actionData?.model?.displayName || actionData?.model?.name;
|
|
34
|
+
const actionFromApi = actionData?.displayName || actionData?.name;
|
|
35
|
+
const actionDataId = actionData?.id != null ? String(actionData.id) : null;
|
|
36
|
+
const hasMatchingActionData = Boolean(actionId) && actionDataId === actionId;
|
|
37
|
+
|
|
38
|
+
// Priority 1: exact business breadcrumb contract requested:
|
|
39
|
+
// <module> > <model> > <action>.
|
|
40
|
+
// We only trust API crumbs when they belong to the current URL's actionId.
|
|
41
|
+
// This avoids stale list breadcrumbs bleeding into form routes that do not
|
|
42
|
+
// carry actionId in their query string.
|
|
43
|
+
if (hasMatchingActionData && (moduleFromApi || modelFromApi || actionFromApi)) {
|
|
44
|
+
return [moduleFromApi, modelFromApi, actionFromApi].filter(Boolean);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const segments = pathname.split("/").filter(Boolean);
|
|
48
|
+
// Priority 2: derive from route segments when API data is unavailable.
|
|
49
|
+
// This is intentionally ahead of query fallback so form pages don't
|
|
50
|
+
// inherit stale list query labels after list -> form navigation.
|
|
51
|
+
if (segments[0] === "admin" && segments[1] === "core") {
|
|
52
|
+
const moduleName = segments[2];
|
|
53
|
+
const modelName = segments[3];
|
|
54
|
+
const viewName = segments[4];
|
|
55
|
+
const next = [moduleName, modelName, viewName].filter(Boolean).map((item) => toLabel(item!));
|
|
56
|
+
return next.length ? next : ["Admin"];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const menuItemName = searchParams.get("menuItemName");
|
|
60
|
+
const actionName = searchParams.get("actionName");
|
|
61
|
+
|
|
62
|
+
// Priority 3: legacy URL-query fallback for older links/pages.
|
|
63
|
+
if (menuItemName || actionName) {
|
|
64
|
+
return [menuItemName, actionName].filter(Boolean).map((item) => toLabel(item!));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return ["Admin"];
|
|
68
|
+
}, [actionId, actionResponse, pathname, searchParams]);
|
|
69
|
+
|
|
70
|
+
const showBack = /\/admin\/core\/[^/]+\/[^/]+\/form\/[^/]+/.test(pathname);
|
|
71
|
+
|
|
72
|
+
const triggerSidebar = () => {
|
|
73
|
+
window.dispatchEvent(new CustomEvent(SIDEBAR_TOGGLE_EVENT));
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<header className="solid-admin-header">
|
|
78
|
+
<div className="solid-admin-header-inner">
|
|
79
|
+
<button
|
|
80
|
+
type="button"
|
|
81
|
+
className="solid-admin-sidebar-trigger"
|
|
82
|
+
onClick={triggerSidebar}
|
|
83
|
+
aria-label="Toggle sidebar"
|
|
84
|
+
>
|
|
85
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
|
|
86
|
+
<rect x="1.5" y="2" width="13" height="12" rx="2" stroke="currentColor" />
|
|
87
|
+
<path d="M5.5 2V14" stroke="currentColor" />
|
|
88
|
+
<rect x="8" y="5.25" width="4.5" height="5.5" rx="0.9" stroke="currentColor" />
|
|
89
|
+
</svg>
|
|
90
|
+
</button>
|
|
91
|
+
|
|
92
|
+
<div className="solid-admin-header-sep" />
|
|
93
|
+
|
|
94
|
+
<nav className="solid-admin-breadcrumbs" aria-label="Breadcrumb">
|
|
95
|
+
{crumbs.map((crumb, index) => (
|
|
96
|
+
<span key={`${crumb}-${index}`} className="solid-admin-crumb">
|
|
97
|
+
{index > 0 && <span className="solid-admin-crumb-sep">›</span>}
|
|
98
|
+
<span>{crumb}</span>
|
|
99
|
+
</span>
|
|
100
|
+
))}
|
|
101
|
+
</nav>
|
|
102
|
+
|
|
103
|
+
<div className="solid-admin-header-actions">
|
|
104
|
+
<button
|
|
105
|
+
type="button"
|
|
106
|
+
className="solid-admin-theme-toggle"
|
|
107
|
+
onClick={toggleThemeMode}
|
|
108
|
+
aria-label="Toggle theme"
|
|
109
|
+
title="Toggle theme"
|
|
110
|
+
>
|
|
111
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" aria-hidden="true">
|
|
112
|
+
<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" />
|
|
113
|
+
<path d="M12 3l0 18" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
114
|
+
<path d="M12 9l4.65 -4.65" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
115
|
+
<path d="M12 14.3l7.37 -7.37" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
116
|
+
<path d="M12 19.6l8.85 -8.85" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
117
|
+
</svg>
|
|
118
|
+
<span className="solid-sr-only">Toggle theme</span>
|
|
119
|
+
</button>
|
|
120
|
+
|
|
121
|
+
{showBack && (
|
|
122
|
+
<button
|
|
123
|
+
type="button"
|
|
124
|
+
className="solid-admin-back-btn"
|
|
125
|
+
onClick={() => router.back()}
|
|
126
|
+
aria-label="Go back"
|
|
127
|
+
>
|
|
128
|
+
Back
|
|
129
|
+
</button>
|
|
130
|
+
)}
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</header>
|
|
134
|
+
);
|
|
135
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type SolidAutocompleteProps = {
|
|
2
|
+
value?: any;
|
|
3
|
+
suggestions?: any[];
|
|
4
|
+
completeMethod?: (event: {
|
|
5
|
+
query: string;
|
|
6
|
+
}) => void | Promise<void>;
|
|
7
|
+
onChange?: (event: {
|
|
8
|
+
value: any;
|
|
9
|
+
}) => void;
|
|
10
|
+
onSelect?: (event: {
|
|
11
|
+
value: any;
|
|
12
|
+
}) => void;
|
|
13
|
+
field?: string;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
inputClassName?: string;
|
|
17
|
+
dropdown?: boolean;
|
|
18
|
+
forceSelection?: boolean;
|
|
19
|
+
multiple?: boolean;
|
|
20
|
+
maxVisibleChips?: number;
|
|
21
|
+
};
|
|
22
|
+
export declare function SolidAutocomplete({ value, suggestions, completeMethod, onChange, onSelect, field, placeholder, className, inputClassName, dropdown, forceSelection, multiple, maxVisibleChips, }: SolidAutocompleteProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=SolidAutocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolidAutocomplete.d.ts","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidAutocomplete.tsx"],"names":[],"mappings":"AAEA,KAAK,sBAAsB,GAAG;IAC5B,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAiBF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,WAAgB,EAChB,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,KAAe,EACf,WAAW,EACX,SAAS,EACT,cAAc,EACd,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,eAAmB,GACpB,EAAE,sBAAsB,2CAmSxB"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
2
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3
|
+
if (ar || !(i in from)) {
|
|
4
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
5
|
+
ar[i] = from[i];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
9
|
+
};
|
|
10
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
12
|
+
function cx() {
|
|
13
|
+
var parts = [];
|
|
14
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
15
|
+
parts[_i] = arguments[_i];
|
|
16
|
+
}
|
|
17
|
+
return parts.filter(Boolean).join(" ");
|
|
18
|
+
}
|
|
19
|
+
function getDisplayValue(value, field) {
|
|
20
|
+
if (value == null)
|
|
21
|
+
return "";
|
|
22
|
+
if (typeof value === "string" || typeof value === "number")
|
|
23
|
+
return String(value);
|
|
24
|
+
if (typeof value === "object") {
|
|
25
|
+
var direct = value === null || value === void 0 ? void 0 : value[field];
|
|
26
|
+
if (direct != null)
|
|
27
|
+
return String(direct);
|
|
28
|
+
if ((value === null || value === void 0 ? void 0 : value.label) != null)
|
|
29
|
+
return String(value.label);
|
|
30
|
+
}
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
export function SolidAutocomplete(_a) {
|
|
34
|
+
var value = _a.value, _b = _a.suggestions, suggestions = _b === void 0 ? [] : _b, completeMethod = _a.completeMethod, onChange = _a.onChange, onSelect = _a.onSelect, _c = _a.field, field = _c === void 0 ? "label" : _c, placeholder = _a.placeholder, className = _a.className, inputClassName = _a.inputClassName, dropdown = _a.dropdown, forceSelection = _a.forceSelection, multiple = _a.multiple, _d = _a.maxVisibleChips, maxVisibleChips = _d === void 0 ? 2 : _d;
|
|
35
|
+
var rootRef = useRef(null);
|
|
36
|
+
var completeTimerRef = useRef(null);
|
|
37
|
+
var _e = useState(false), open = _e[0], setOpen = _e[1];
|
|
38
|
+
var _f = useState(false), manageOpen = _f[0], setManageOpen = _f[1];
|
|
39
|
+
var _g = useState(""), query = _g[0], setQuery = _g[1];
|
|
40
|
+
var _h = useState(-1), activeIndex = _h[0], setActiveIndex = _h[1];
|
|
41
|
+
var _j = useState(false), isFocused = _j[0], setIsFocused = _j[1];
|
|
42
|
+
useEffect(function () {
|
|
43
|
+
if (multiple)
|
|
44
|
+
return;
|
|
45
|
+
if (!value || typeof value === "string") {
|
|
46
|
+
setQuery(typeof value === "string" ? value : "");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
setQuery("");
|
|
50
|
+
}, [value, field, multiple]);
|
|
51
|
+
useEffect(function () {
|
|
52
|
+
return function () {
|
|
53
|
+
if (completeTimerRef.current) {
|
|
54
|
+
window.clearTimeout(completeTimerRef.current);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}, []);
|
|
58
|
+
var runCompleteMethod = function (nextQuery, immediate) {
|
|
59
|
+
if (immediate === void 0) { immediate = false; }
|
|
60
|
+
if (!completeMethod)
|
|
61
|
+
return;
|
|
62
|
+
if (completeTimerRef.current) {
|
|
63
|
+
window.clearTimeout(completeTimerRef.current);
|
|
64
|
+
completeTimerRef.current = null;
|
|
65
|
+
}
|
|
66
|
+
if (immediate) {
|
|
67
|
+
void completeMethod({ query: nextQuery });
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
completeTimerRef.current = window.setTimeout(function () {
|
|
71
|
+
void completeMethod({ query: nextQuery });
|
|
72
|
+
}, 140);
|
|
73
|
+
};
|
|
74
|
+
useEffect(function () {
|
|
75
|
+
function handleOutsideClick(event) {
|
|
76
|
+
if (!rootRef.current)
|
|
77
|
+
return;
|
|
78
|
+
if (!rootRef.current.contains(event.target)) {
|
|
79
|
+
setOpen(false);
|
|
80
|
+
setManageOpen(false);
|
|
81
|
+
setIsFocused(false);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
document.addEventListener("mousedown", handleOutsideClick);
|
|
85
|
+
return function () { return document.removeEventListener("mousedown", handleOutsideClick); };
|
|
86
|
+
}, []);
|
|
87
|
+
var normalizedSuggestions = useMemo(function () {
|
|
88
|
+
return (suggestions || []).map(function (item) { return ({
|
|
89
|
+
raw: item,
|
|
90
|
+
label: getDisplayValue(item, field),
|
|
91
|
+
}); });
|
|
92
|
+
}, [suggestions, field]);
|
|
93
|
+
var selectedItems = useMemo(function () {
|
|
94
|
+
if (multiple) {
|
|
95
|
+
if (!Array.isArray(value))
|
|
96
|
+
return [];
|
|
97
|
+
return value.filter(function (item) { return item !== null && item !== undefined && item !== ""; });
|
|
98
|
+
}
|
|
99
|
+
if (!value || typeof value === "string")
|
|
100
|
+
return [];
|
|
101
|
+
return [value];
|
|
102
|
+
}, [multiple, value]);
|
|
103
|
+
var visibleSelectedItems = selectedItems.slice(0, maxVisibleChips);
|
|
104
|
+
var hiddenSelectedItems = selectedItems.slice(maxVisibleChips);
|
|
105
|
+
useEffect(function () {
|
|
106
|
+
if (multiple && hiddenSelectedItems.length === 0 && manageOpen) {
|
|
107
|
+
setManageOpen(false);
|
|
108
|
+
}
|
|
109
|
+
}, [multiple, hiddenSelectedItems.length, manageOpen]);
|
|
110
|
+
var toItemKey = function (item, index) {
|
|
111
|
+
if (item && typeof item === "object") {
|
|
112
|
+
if (item.value !== undefined && item.value !== null)
|
|
113
|
+
return String(item.value);
|
|
114
|
+
if (item.id !== undefined && item.id !== null)
|
|
115
|
+
return String(item.id);
|
|
116
|
+
}
|
|
117
|
+
var label = getDisplayValue(item, field);
|
|
118
|
+
return label ? "".concat(label, "-").concat(index) : String(index);
|
|
119
|
+
};
|
|
120
|
+
var toComparableKey = function (item) {
|
|
121
|
+
if (item && typeof item === "object") {
|
|
122
|
+
if (item.value !== undefined && item.value !== null)
|
|
123
|
+
return "value:".concat(String(item.value));
|
|
124
|
+
if (item.id !== undefined && item.id !== null)
|
|
125
|
+
return "id:".concat(String(item.id));
|
|
126
|
+
}
|
|
127
|
+
return "label:".concat(getDisplayValue(item, field));
|
|
128
|
+
};
|
|
129
|
+
var removeSelectedAt = function (index) {
|
|
130
|
+
if (multiple) {
|
|
131
|
+
var existing = Array.isArray(value) ? __spreadArray([], value, true) : [];
|
|
132
|
+
existing.splice(index, 1);
|
|
133
|
+
onChange === null || onChange === void 0 ? void 0 : onChange({ value: existing });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
onChange === null || onChange === void 0 ? void 0 : onChange({ value: null });
|
|
137
|
+
};
|
|
138
|
+
var clearAllSelected = function () {
|
|
139
|
+
onChange === null || onChange === void 0 ? void 0 : onChange({ value: multiple ? [] : null });
|
|
140
|
+
setManageOpen(false);
|
|
141
|
+
};
|
|
142
|
+
var commitSelection = function (item) {
|
|
143
|
+
if (multiple) {
|
|
144
|
+
var existing = Array.isArray(value) ? __spreadArray([], value, true) : [];
|
|
145
|
+
var exists = existing.some(function (entry) { return toComparableKey(entry) === toComparableKey(item); });
|
|
146
|
+
if (!exists) {
|
|
147
|
+
onChange === null || onChange === void 0 ? void 0 : onChange({ value: __spreadArray(__spreadArray([], existing, true), [item], false) });
|
|
148
|
+
}
|
|
149
|
+
setQuery("");
|
|
150
|
+
setOpen(false);
|
|
151
|
+
setManageOpen(false);
|
|
152
|
+
setActiveIndex(-1);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
setQuery("");
|
|
156
|
+
onChange === null || onChange === void 0 ? void 0 : onChange({ value: item });
|
|
157
|
+
onSelect === null || onSelect === void 0 ? void 0 : onSelect({ value: item });
|
|
158
|
+
setOpen(false);
|
|
159
|
+
setManageOpen(false);
|
|
160
|
+
setActiveIndex(-1);
|
|
161
|
+
};
|
|
162
|
+
return (_jsxs("div", { ref: rootRef, className: cx("solid-autocomplete", className), children: [_jsxs("div", { className: cx("solid-autocomplete-control solid-autocomplete-chip-control", isFocused && "is-focused"), children: [visibleSelectedItems.map(function (item, index) { return (_jsxs("span", { className: "solid-autocomplete-chip", children: [_jsx("span", { className: "solid-autocomplete-chip-label", children: getDisplayValue(item, field) }), _jsx("button", { type: "button", className: "solid-autocomplete-chip-remove", onMouseDown: function (event) { return event.preventDefault(); }, onClick: function () { return removeSelectedAt(index); }, "aria-label": "Remove selection", children: _jsx("i", { className: "pi pi-times" }) })] }, toItemKey(item, index))); }), multiple && hiddenSelectedItems.length > 0 && (_jsxs("button", { type: "button", className: "solid-autocomplete-chip-manage", onMouseDown: function (event) { return event.preventDefault(); }, onClick: function () {
|
|
163
|
+
setOpen(false);
|
|
164
|
+
setManageOpen(function (prev) { return !prev; });
|
|
165
|
+
}, children: ["+", hiddenSelectedItems.length, " more"] })), _jsx("input", { className: cx("solid-input solid-autocomplete-input solid-autocomplete-inline-input", inputClassName), value: query, placeholder: selectedItems.length > 0 ? "" : placeholder, onFocus: function () {
|
|
166
|
+
setIsFocused(true);
|
|
167
|
+
setOpen(true);
|
|
168
|
+
setManageOpen(false);
|
|
169
|
+
runCompleteMethod(query, true);
|
|
170
|
+
}, onChange: function (event) {
|
|
171
|
+
var next = event.target.value;
|
|
172
|
+
setQuery(next);
|
|
173
|
+
setOpen(true);
|
|
174
|
+
setManageOpen(false);
|
|
175
|
+
runCompleteMethod(next, false);
|
|
176
|
+
}, onClick: function () {
|
|
177
|
+
setOpen(true);
|
|
178
|
+
setManageOpen(false);
|
|
179
|
+
}, onBlur: function () {
|
|
180
|
+
setIsFocused(false);
|
|
181
|
+
if (!forceSelection)
|
|
182
|
+
return;
|
|
183
|
+
var matched = normalizedSuggestions.find(function (item) { return item.label.toLowerCase() === query.toLowerCase(); });
|
|
184
|
+
if (matched) {
|
|
185
|
+
onChange === null || onChange === void 0 ? void 0 : onChange({ value: matched.raw });
|
|
186
|
+
setQuery("");
|
|
187
|
+
}
|
|
188
|
+
}, onKeyDown: function (event) {
|
|
189
|
+
if (!open && (event.key === "ArrowDown" || event.key === "ArrowUp")) {
|
|
190
|
+
setOpen(true);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (!normalizedSuggestions.length)
|
|
194
|
+
return;
|
|
195
|
+
if (event.key === "ArrowDown") {
|
|
196
|
+
event.preventDefault();
|
|
197
|
+
setActiveIndex(function (prev) { return (prev + 1) % normalizedSuggestions.length; });
|
|
198
|
+
}
|
|
199
|
+
if (event.key === "ArrowUp") {
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
setActiveIndex(function (prev) {
|
|
202
|
+
return prev <= 0 ? normalizedSuggestions.length - 1 : prev - 1;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
if (event.key === "Enter" && activeIndex >= 0) {
|
|
206
|
+
event.preventDefault();
|
|
207
|
+
commitSelection(normalizedSuggestions[activeIndex].raw);
|
|
208
|
+
}
|
|
209
|
+
if (event.key === "Backspace" && !query && selectedItems.length > 0) {
|
|
210
|
+
event.preventDefault();
|
|
211
|
+
removeSelectedAt(selectedItems.length - 1);
|
|
212
|
+
}
|
|
213
|
+
} }), dropdown && (_jsx("button", { type: "button", className: "solid-autocomplete-trigger", onMouseDown: function (event) { return event.preventDefault(); }, onClick: function () {
|
|
214
|
+
var nextOpen = !open;
|
|
215
|
+
setOpen(nextOpen);
|
|
216
|
+
if (nextOpen) {
|
|
217
|
+
setManageOpen(false);
|
|
218
|
+
}
|
|
219
|
+
if (nextOpen) {
|
|
220
|
+
runCompleteMethod(query, true);
|
|
221
|
+
}
|
|
222
|
+
}, "aria-label": "Toggle suggestions", children: _jsx("i", { className: open ? "pi pi-chevron-up" : "pi pi-chevron-down" }) }))] }), multiple && manageOpen && selectedItems.length > 0 && (_jsxs("div", { className: "solid-autocomplete-manager-panel", children: [_jsxs("div", { className: "solid-autocomplete-manager-header", children: [_jsxs("div", { className: "solid-autocomplete-manager-title", children: ["Selected (", selectedItems.length, ")"] }), _jsx("button", { type: "button", className: "solid-autocomplete-manager-clear", onClick: clearAllSelected, children: "Clear all" })] }), _jsx("div", { className: "solid-autocomplete-manager-body", children: selectedItems.map(function (item, index) { return (_jsxs("span", { className: "solid-autocomplete-chip", children: [_jsx("span", { className: "solid-autocomplete-chip-label", children: getDisplayValue(item, field) }), _jsx("button", { type: "button", className: "solid-autocomplete-chip-remove", onClick: function () { return removeSelectedAt(index); }, "aria-label": "Remove selection", children: _jsx("i", { className: "pi pi-times" }) })] }, "managed-".concat(toItemKey(item, index)))); }) })] })), open && normalizedSuggestions.length > 0 && (_jsx("div", { className: "solid-autocomplete-panel", role: "listbox", children: normalizedSuggestions.map(function (item, index) { return (_jsx("button", { type: "button", className: cx("solid-autocomplete-option", activeIndex === index && "is-active"), onMouseEnter: function () { return setActiveIndex(index); }, onMouseDown: function (event) { return event.preventDefault(); }, onClick: function () { return commitSelection(item.raw); }, children: item.label }, "".concat(item.label, "-").concat(index))); }) }))] }));
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=SolidAutocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolidAutocomplete.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidAutocomplete.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\n\ntype SolidAutocompleteProps = {\n value?: any;\n suggestions?: any[];\n completeMethod?: (event: { query: string }) => void | Promise<void>;\n onChange?: (event: { value: any }) => void;\n onSelect?: (event: { value: any }) => void;\n field?: string;\n placeholder?: string;\n className?: string;\n inputClassName?: string;\n dropdown?: boolean;\n forceSelection?: boolean;\n multiple?: boolean;\n maxVisibleChips?: number;\n};\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction getDisplayValue(value: any, field: string) {\n if (value == null) return \"\";\n if (typeof value === \"string\" || typeof value === \"number\") return String(value);\n if (typeof value === \"object\") {\n const direct = value?.[field];\n if (direct != null) return String(direct);\n if (value?.label != null) return String(value.label);\n }\n return \"\";\n}\n\nexport function SolidAutocomplete({\n value,\n suggestions = [],\n completeMethod,\n onChange,\n onSelect,\n field = \"label\",\n placeholder,\n className,\n inputClassName,\n dropdown,\n forceSelection,\n multiple,\n maxVisibleChips = 2,\n}: SolidAutocompleteProps) {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const completeTimerRef = useRef<number | null>(null);\n const [open, setOpen] = useState(false);\n const [manageOpen, setManageOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (multiple) return;\n if (!value || typeof value === \"string\") {\n setQuery(typeof value === \"string\" ? value : \"\");\n return;\n }\n setQuery(\"\");\n }, [value, field, multiple]);\n\n useEffect(() => {\n return () => {\n if (completeTimerRef.current) {\n window.clearTimeout(completeTimerRef.current);\n }\n };\n }, []);\n\n const runCompleteMethod = (nextQuery: string, immediate = false) => {\n if (!completeMethod) return;\n if (completeTimerRef.current) {\n window.clearTimeout(completeTimerRef.current);\n completeTimerRef.current = null;\n }\n if (immediate) {\n void completeMethod({ query: nextQuery });\n return;\n }\n completeTimerRef.current = window.setTimeout(() => {\n void completeMethod({ query: nextQuery });\n }, 140);\n };\n\n useEffect(() => {\n function handleOutsideClick(event: MouseEvent) {\n if (!rootRef.current) return;\n if (!rootRef.current.contains(event.target as Node)) {\n setOpen(false);\n setManageOpen(false);\n setIsFocused(false);\n }\n }\n document.addEventListener(\"mousedown\", handleOutsideClick);\n return () => document.removeEventListener(\"mousedown\", handleOutsideClick);\n }, []);\n\n const normalizedSuggestions = useMemo(\n () =>\n (suggestions || []).map((item) => ({\n raw: item,\n label: getDisplayValue(item, field),\n })),\n [suggestions, field]\n );\n\n const selectedItems = useMemo(() => {\n if (multiple) {\n if (!Array.isArray(value)) return [];\n return value.filter((item) => item !== null && item !== undefined && item !== \"\");\n }\n if (!value || typeof value === \"string\") return [];\n return [value];\n }, [multiple, value]);\n\n const visibleSelectedItems = selectedItems.slice(0, maxVisibleChips);\n const hiddenSelectedItems = selectedItems.slice(maxVisibleChips);\n\n useEffect(() => {\n if (multiple && hiddenSelectedItems.length === 0 && manageOpen) {\n setManageOpen(false);\n }\n }, [multiple, hiddenSelectedItems.length, manageOpen]);\n\n const toItemKey = (item: any, index: number) => {\n if (item && typeof item === \"object\") {\n if (item.value !== undefined && item.value !== null) return String(item.value);\n if (item.id !== undefined && item.id !== null) return String(item.id);\n }\n const label = getDisplayValue(item, field);\n return label ? `${label}-${index}` : String(index);\n };\n\n const toComparableKey = (item: any) => {\n if (item && typeof item === \"object\") {\n if (item.value !== undefined && item.value !== null) return `value:${String(item.value)}`;\n if (item.id !== undefined && item.id !== null) return `id:${String(item.id)}`;\n }\n return `label:${getDisplayValue(item, field)}`;\n };\n\n const removeSelectedAt = (index: number) => {\n if (multiple) {\n const existing = Array.isArray(value) ? [...value] : [];\n existing.splice(index, 1);\n onChange?.({ value: existing });\n return;\n }\n onChange?.({ value: null });\n };\n\n const clearAllSelected = () => {\n onChange?.({ value: multiple ? [] : null });\n setManageOpen(false);\n };\n\n const commitSelection = (item: any) => {\n if (multiple) {\n const existing = Array.isArray(value) ? [...value] : [];\n const exists = existing.some((entry) => toComparableKey(entry) === toComparableKey(item));\n if (!exists) {\n onChange?.({ value: [...existing, item] });\n }\n setQuery(\"\");\n setOpen(false);\n setManageOpen(false);\n setActiveIndex(-1);\n return;\n }\n setQuery(\"\");\n onChange?.({ value: item });\n onSelect?.({ value: item });\n setOpen(false);\n setManageOpen(false);\n setActiveIndex(-1);\n };\n\n return (\n <div ref={rootRef} className={cx(\"solid-autocomplete\", className)}>\n <div className={cx(\"solid-autocomplete-control solid-autocomplete-chip-control\", isFocused && \"is-focused\")}>\n {visibleSelectedItems.map((item, index) => (\n <span key={toItemKey(item, index)} className=\"solid-autocomplete-chip\">\n <span className=\"solid-autocomplete-chip-label\">{getDisplayValue(item, field)}</span>\n <button\n type=\"button\"\n className=\"solid-autocomplete-chip-remove\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => removeSelectedAt(index)}\n aria-label=\"Remove selection\"\n >\n <i className=\"pi pi-times\" />\n </button>\n </span>\n ))}\n {multiple && hiddenSelectedItems.length > 0 && (\n <button\n type=\"button\"\n className=\"solid-autocomplete-chip-manage\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n setOpen(false);\n setManageOpen((prev) => !prev);\n }}\n >\n +{hiddenSelectedItems.length} more\n </button>\n )}\n <input\n className={cx(\"solid-input solid-autocomplete-input solid-autocomplete-inline-input\", inputClassName)}\n value={query}\n placeholder={selectedItems.length > 0 ? \"\" : placeholder}\n onFocus={() => {\n setIsFocused(true);\n setOpen(true);\n setManageOpen(false);\n runCompleteMethod(query, true);\n }}\n onChange={(event) => {\n const next = event.target.value;\n setQuery(next);\n setOpen(true);\n setManageOpen(false);\n runCompleteMethod(next, false);\n }}\n onClick={() => {\n setOpen(true);\n setManageOpen(false);\n }}\n onBlur={() => {\n setIsFocused(false);\n if (!forceSelection) return;\n const matched = normalizedSuggestions.find(\n (item) => item.label.toLowerCase() === query.toLowerCase()\n );\n if (matched) {\n onChange?.({ value: matched.raw });\n setQuery(\"\");\n }\n }}\n onKeyDown={(event) => {\n if (!open && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n setOpen(true);\n return;\n }\n if (!normalizedSuggestions.length) return;\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setActiveIndex((prev) => (prev + 1) % normalizedSuggestions.length);\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveIndex((prev) =>\n prev <= 0 ? normalizedSuggestions.length - 1 : prev - 1\n );\n }\n if (event.key === \"Enter\" && activeIndex >= 0) {\n event.preventDefault();\n commitSelection(normalizedSuggestions[activeIndex].raw);\n }\n if (event.key === \"Backspace\" && !query && selectedItems.length > 0) {\n event.preventDefault();\n removeSelectedAt(selectedItems.length - 1);\n }\n }}\n />\n {dropdown && (\n <button\n type=\"button\"\n className=\"solid-autocomplete-trigger\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n const nextOpen = !open;\n setOpen(nextOpen);\n if (nextOpen) {\n setManageOpen(false);\n }\n if (nextOpen) {\n runCompleteMethod(query, true);\n }\n }}\n aria-label=\"Toggle suggestions\"\n >\n <i className={open ? \"pi pi-chevron-up\" : \"pi pi-chevron-down\"} />\n </button>\n )}\n </div>\n\n {multiple && manageOpen && selectedItems.length > 0 && (\n <div className=\"solid-autocomplete-manager-panel\">\n <div className=\"solid-autocomplete-manager-header\">\n <div className=\"solid-autocomplete-manager-title\">Selected ({selectedItems.length})</div>\n <button type=\"button\" className=\"solid-autocomplete-manager-clear\" onClick={clearAllSelected}>\n Clear all\n </button>\n </div>\n <div className=\"solid-autocomplete-manager-body\">\n {selectedItems.map((item, index) => (\n <span key={`managed-${toItemKey(item, index)}`} className=\"solid-autocomplete-chip\">\n <span className=\"solid-autocomplete-chip-label\">{getDisplayValue(item, field)}</span>\n <button\n type=\"button\"\n className=\"solid-autocomplete-chip-remove\"\n onClick={() => removeSelectedAt(index)}\n aria-label=\"Remove selection\"\n >\n <i className=\"pi pi-times\" />\n </button>\n </span>\n ))}\n </div>\n </div>\n )}\n\n {open && normalizedSuggestions.length > 0 && (\n <div className=\"solid-autocomplete-panel\" role=\"listbox\">\n {normalizedSuggestions.map((item, index) => (\n <button\n key={`${item.label}-${index}`}\n type=\"button\"\n className={cx(\n \"solid-autocomplete-option\",\n activeIndex === index && \"is-active\"\n )}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => commitSelection(item.raw)}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
|