@alepha/ui 0.11.4 → 0.11.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.
@@ -1,34 +1,222 @@
1
- import type { Async } from "@alepha/core";
2
- import type { TableTrProps } from "@mantine/core";
3
- import { Table, type TableProps } from "@mantine/core";
1
+ import {
2
+ type Async,
3
+ type Page,
4
+ type PageMetadata,
5
+ type TObject,
6
+ t,
7
+ } from "@alepha/core";
8
+ import { DateTimeProvider, type DurationLike } from "@alepha/datetime";
9
+ import { useInject } from "@alepha/react";
10
+ import { useForm } from "@alepha/react-form";
11
+ import {
12
+ Flex,
13
+ Pagination,
14
+ Paper,
15
+ Select,
16
+ Table,
17
+ type TableProps,
18
+ type TableTrProps,
19
+ } from "@mantine/core";
20
+ import { useDebouncedCallback } from "@mantine/hooks";
4
21
  import { type ReactNode, useEffect, useState } from "react";
5
22
  import ActionButton from "../buttons/ActionButton.tsx";
23
+ import TypeForm from "../form/TypeForm.tsx";
6
24
 
7
25
  export interface DataTableColumn<T extends object> {
8
26
  label: string;
9
- value: (item: T) => ReactNode;
27
+ value: (item: T, index: number) => ReactNode;
10
28
  }
11
29
 
30
+ export type MaybePage<T> = Omit<Page<T>, "page"> & {
31
+ page?: Partial<PageMetadata>;
32
+ };
33
+
12
34
  export interface DataTableProps<T extends object> {
13
- items: T[] | (() => Async<T[]>);
35
+ /**
36
+ * The items to display in the table. Can be a static page of items or a function that returns a promise resolving to a page of items.
37
+ */
38
+ items:
39
+ | MaybePage<T>
40
+ | ((
41
+ filters: Record<string, string> & {
42
+ page: number;
43
+ size: number;
44
+ sort?: string;
45
+ },
46
+ ) => Async<MaybePage<T>>);
47
+
48
+ /**
49
+ * The columns to display in the table. Each column is defined by a key and a DataTableColumn object.
50
+ */
14
51
  columns: {
15
52
  [key: string]: DataTableColumn<T>;
16
53
  };
54
+
55
+ defaultSize?: number;
56
+
57
+ /**
58
+ * Optional filters to apply to the data.
59
+ */
60
+ filters?: TObject;
61
+
62
+ panel?: (item: T) => ReactNode;
63
+ canPanel?: (item: T) => boolean;
64
+
65
+ submitOnInit?: boolean;
66
+ submitEvery?: DurationLike;
67
+
68
+ withLineNumbers?: boolean;
69
+ withCheckbox?: boolean;
70
+ checkboxActions?: any[];
71
+
72
+ actions?: any[];
73
+
74
+ /**
75
+ * Enable infinity scroll mode. When true, pagination controls are hidden and new items are loaded automatically when scrolling to the bottom.
76
+ */
77
+ infinityScroll?: boolean;
78
+
79
+ // -------------------------------------------------------------------------------------------------------------------
80
+
81
+ /**
82
+ * Props to pass to the Mantine Table component.
83
+ */
17
84
  tableProps?: TableProps;
85
+
86
+ /**
87
+ * Function to generate props for each table row based on the item.
88
+ */
18
89
  tableTrProps?: (item: T) => TableTrProps;
19
90
  }
20
91
 
21
92
  const DataTable = <T extends object>(props: DataTableProps<T>) => {
22
- const [items, setItems] = useState<object[]>(
23
- typeof props.items === "function" ? [] : props.items,
93
+ const [items, setItems] = useState<MaybePage<T>>(
94
+ typeof props.items === "function"
95
+ ? {
96
+ content: [],
97
+ }
98
+ : props.items,
99
+ );
100
+
101
+ const defaultSize = props.infinityScroll ? 50 : props.defaultSize || 10;
102
+ const [page, setPage] = useState(1);
103
+ const [size, setSize] = useState(String(defaultSize));
104
+ const [isLoadingMore, setIsLoadingMore] = useState(false);
105
+ const [currentPage, setCurrentPage] = useState(0);
106
+
107
+ const form = useForm(
108
+ {
109
+ schema: t.object({
110
+ ...(props.filters ? props.filters.properties : {}),
111
+ page: t.number({ default: 0 }),
112
+ size: t.number({ default: defaultSize }),
113
+ sort: t.optional(t.string()),
114
+ }),
115
+ handler: async (values, args) => {
116
+ if (typeof props.items === "function") {
117
+ const response = await props.items(
118
+ values as Record<string, string> & {
119
+ page: number;
120
+ size: number;
121
+ sort?: string;
122
+ },
123
+ );
124
+
125
+ if (props.infinityScroll && values.page > 0) {
126
+ // Append new items to existing ones for infinity scroll
127
+ setItems((prev) => ({
128
+ ...response,
129
+ content: [...prev.content, ...response.content],
130
+ }));
131
+ } else {
132
+ setItems(response);
133
+ }
134
+ setCurrentPage(values.page);
135
+ setIsLoadingMore(false);
136
+ }
137
+ },
138
+ onReset: async () => {
139
+ setPage(1);
140
+ setSize("10");
141
+ await form.submit();
142
+ },
143
+ onChange: async (key, value) => {
144
+ if (key === "page") {
145
+ setPage(value + 1);
146
+ await form.submit();
147
+ return;
148
+ }
149
+
150
+ if (key === "size") {
151
+ setSize(String(value));
152
+ form.input.page.set(0);
153
+ return;
154
+ }
155
+
156
+ //submitDebounce();
157
+ },
158
+ },
159
+ [],
24
160
  );
25
161
 
162
+ const submitDebounce = useDebouncedCallback(() => form.submit(), {
163
+ delay: 1000,
164
+ });
165
+
166
+ const dt = useInject(DateTimeProvider);
167
+
168
+ useEffect(() => {
169
+ if (props.submitOnInit) {
170
+ console.log("submitting");
171
+ form.submit();
172
+ }
173
+ if (props.submitEvery) {
174
+ const it = dt.createInterval(() => {
175
+ form.submit();
176
+ }, props.submitEvery);
177
+ return () => dt.clearInterval(it);
178
+ }
179
+ }, []);
180
+
26
181
  useEffect(() => {
27
182
  if (typeof props.items !== "function") {
28
183
  setItems(props.items);
29
184
  }
30
185
  }, [props.items]);
31
186
 
187
+ // Infinity scroll detection
188
+ useEffect(() => {
189
+ if (!props.infinityScroll || typeof props.items !== "function") return;
190
+
191
+ const handleScroll = () => {
192
+ if (isLoadingMore) return;
193
+
194
+ const scrollTop = window.scrollY;
195
+ const windowHeight = window.innerHeight;
196
+ const docHeight = document.documentElement.scrollHeight;
197
+
198
+ const isNearBottom = scrollTop + windowHeight >= docHeight - 200;
199
+
200
+ if (isNearBottom) {
201
+ const totalPages = items.page?.totalPages ?? 1;
202
+
203
+ if (currentPage + 1 < totalPages) {
204
+ setIsLoadingMore(true);
205
+ form.input.page.set(currentPage + 1);
206
+ }
207
+ }
208
+ };
209
+
210
+ window.addEventListener("scroll", handleScroll);
211
+ return () => window.removeEventListener("scroll", handleScroll);
212
+ }, [
213
+ props.infinityScroll,
214
+ isLoadingMore,
215
+ items.page?.totalPages,
216
+ currentPage,
217
+ form,
218
+ ]);
219
+
32
220
  const head = Object.entries(props.columns).map(([key, col]) => (
33
221
  <Table.Th key={key}>
34
222
  <ActionButton justify={"space-between"} radius={0} fullWidth size={"xs"}>
@@ -37,26 +225,61 @@ const DataTable = <T extends object>(props: DataTableProps<T>) => {
37
225
  </Table.Th>
38
226
  ));
39
227
 
40
- const rows = items.map((item, index) => {
228
+ const rows = items.content.map((item, index) => {
41
229
  const trProps = props.tableTrProps
42
230
  ? props.tableTrProps(item as T)
43
231
  : ({} as TableTrProps);
44
232
  return (
45
233
  <Table.Tr key={JSON.stringify(item)} {...trProps}>
46
234
  {Object.entries(props.columns).map(([key, col]) => (
47
- <Table.Td key={key}>{col.value(item as T)}</Table.Td>
235
+ <Table.Td key={key}>{col.value(item as T, index)}</Table.Td>
48
236
  ))}
49
237
  </Table.Tr>
50
238
  );
51
239
  });
52
240
 
241
+ const schema = t.omit(form.options.schema, ["page", "size", "sort"]);
242
+
53
243
  return (
54
- <Table {...props.tableProps}>
55
- <Table.Thead>
56
- <Table.Tr>{head}</Table.Tr>
57
- </Table.Thead>
58
- <Table.Tbody>{rows}</Table.Tbody>
59
- </Table>
244
+ <Flex direction={"column"} gap={"sm"} flex={1}>
245
+ <Paper withBorder p={"sm"}>
246
+ {props.filters ? <TypeForm form={form} schema={schema} /> : null}
247
+ </Paper>
248
+ <Table striped stripedColor={""} {...props.tableProps}>
249
+ <Table.Thead>
250
+ <Table.Tr>{head}</Table.Tr>
251
+ </Table.Thead>
252
+ <Table.Tbody>{rows}</Table.Tbody>
253
+ </Table>
254
+
255
+ {!props.infinityScroll && (
256
+ <Flex justify={"space-between"} align={"center"}>
257
+ <Pagination
258
+ withEdges
259
+ total={items.page?.totalPages ?? 1}
260
+ value={page}
261
+ onChange={(value) => {
262
+ form.input.page.set(value - 1);
263
+ }}
264
+ />
265
+ <Flex>
266
+ <Select
267
+ value={size}
268
+ onChange={(value) => {
269
+ form.input.size.set(Number(value));
270
+ }}
271
+ data={[
272
+ { value: "5", label: "5" },
273
+ { value: "10", label: "10" },
274
+ { value: "25", label: "25" },
275
+ { value: "50", label: "50" },
276
+ { value: "100", label: "100" },
277
+ ]}
278
+ />
279
+ </Flex>
280
+ </Flex>
281
+ )}
282
+ </Flex>
60
283
  );
61
284
  };
62
285
 
@@ -4,5 +4,6 @@ export const ui = {
4
4
  background: "var(--alepha-background)",
5
5
  surface: "var(--alepha-surface)",
6
6
  elevated: "var(--alepha-elevated)",
7
+ border: "var(--alepha-border)",
7
8
  },
8
9
  };
package/src/index.ts CHANGED
@@ -28,6 +28,7 @@ export { default as ConfirmDialog } from "./components/dialogs/ConfirmDialog.tsx
28
28
  export { default as PromptDialog } from "./components/dialogs/PromptDialog.tsx";
29
29
  export { default as Control } from "./components/form/Control.tsx";
30
30
  export { default as ControlDate } from "./components/form/ControlDate.tsx";
31
+ export { default as ControlQueryBuilder } from "./components/form/ControlQueryBuilder.tsx";
31
32
  export { default as ControlSelect } from "./components/form/ControlSelect.tsx";
32
33
  export { default as TypeForm } from "./components/form/TypeForm.tsx";
33
34
  export { default as AdminShell } from "./components/layout/AdminShell.tsx";
@@ -80,6 +81,7 @@ export type {
80
81
  } from "./services/DialogService.tsx";
81
82
  export { DialogService } from "./services/DialogService.tsx";
82
83
  export { ToastService } from "./services/ToastService.tsx";
84
+ export * from "./utils/extractSchemaFields.ts";
83
85
  export * from "./utils/icons.tsx";
84
86
  export * from "./utils/string.ts";
85
87
 
@@ -0,0 +1,171 @@
1
+ import type { TObject, TProperties, TSchema } from "@alepha/core";
2
+
3
+ export interface SchemaField {
4
+ name: string;
5
+ path: string;
6
+ type: string;
7
+ enum?: readonly any[];
8
+ format?: string;
9
+ description?: string;
10
+ nested?: SchemaField[];
11
+ }
12
+
13
+ /**
14
+ * Extract field information from a TypeBox schema for query building.
15
+ * Supports nested objects and provides field metadata for autocomplete.
16
+ */
17
+ export function extractSchemaFields(
18
+ schema: TObject | TProperties,
19
+ prefix = "",
20
+ ): SchemaField[] {
21
+ const fields: SchemaField[] = [];
22
+
23
+ // Safety check
24
+ if (!schema || typeof schema !== "object") {
25
+ return fields;
26
+ }
27
+
28
+ // Handle TObject wrapper
29
+ const properties =
30
+ "properties" in schema ? schema.properties : (schema as TProperties);
31
+
32
+ // Safety check for properties
33
+ if (!properties || typeof properties !== "object") {
34
+ return fields;
35
+ }
36
+
37
+ for (const [key, value] of Object.entries(properties)) {
38
+ // Skip if value is not an object (type guard)
39
+ if (typeof value !== "object" || value === null) {
40
+ continue;
41
+ }
42
+
43
+ const fieldSchema = value as TSchema & {
44
+ format?: string;
45
+ enum?: readonly any[];
46
+ description?: string;
47
+ };
48
+
49
+ const path = prefix ? `${prefix}.${key}` : key;
50
+
51
+ // Determine the display type - use format for datetime-related fields
52
+ const format = "format" in fieldSchema ? fieldSchema.format : undefined;
53
+ const baseType =
54
+ "type" in fieldSchema ? (fieldSchema.type as string) : "unknown";
55
+
56
+ let displayType = baseType;
57
+ if (format === "date-time") {
58
+ displayType = "datetime";
59
+ } else if (format === "date") {
60
+ displayType = "date";
61
+ } else if (format === "time") {
62
+ displayType = "time";
63
+ } else if (format === "duration") {
64
+ displayType = "duration";
65
+ }
66
+
67
+ const field: SchemaField = {
68
+ name: key,
69
+ path,
70
+ type: displayType,
71
+ format,
72
+ description:
73
+ "description" in fieldSchema ? fieldSchema.description : undefined,
74
+ };
75
+
76
+ // Handle enum
77
+ if ("enum" in fieldSchema && fieldSchema.enum) {
78
+ field.enum = fieldSchema.enum;
79
+ }
80
+
81
+ // Handle nested objects
82
+ if (
83
+ "type" in fieldSchema &&
84
+ fieldSchema.type === "object" &&
85
+ "properties" in fieldSchema &&
86
+ typeof fieldSchema.properties === "object"
87
+ ) {
88
+ field.nested = extractSchemaFields(
89
+ fieldSchema.properties as TProperties,
90
+ path,
91
+ );
92
+ }
93
+
94
+ fields.push(field);
95
+
96
+ // Also add nested fields to the flat list for autocomplete
97
+ if (field.nested) {
98
+ fields.push(...field.nested);
99
+ }
100
+ }
101
+
102
+ return fields;
103
+ }
104
+
105
+ /**
106
+ * Get suggested operators based on field type
107
+ */
108
+ export function getOperatorsForField(field: SchemaField): string[] {
109
+ const allOperators = ["=", "!="];
110
+
111
+ if (field.enum) {
112
+ // Enum fields: equality and IN array
113
+ return [...allOperators, "in"];
114
+ }
115
+
116
+ switch (field.type) {
117
+ case "string":
118
+ case "text":
119
+ // String fields: equality, like, and null checks
120
+ return [...allOperators, "~", "~*", "null"];
121
+
122
+ case "number":
123
+ case "integer":
124
+ // Numeric fields: all comparison operators
125
+ return [...allOperators, ">", ">=", "<", "<="];
126
+
127
+ case "boolean":
128
+ // Boolean fields: only equality
129
+ return allOperators;
130
+
131
+ case "datetime":
132
+ case "date":
133
+ // Date fields: all comparison operators
134
+ return [...allOperators, ">", ">=", "<", "<="];
135
+
136
+ default:
137
+ return [...allOperators, "null"];
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Get operator symbol and description
143
+ */
144
+ export const OPERATOR_INFO: Record<
145
+ string,
146
+ { symbol: string; label: string; example: string }
147
+ > = {
148
+ eq: { symbol: "=", label: "equals", example: "name=John" },
149
+ ne: { symbol: "!=", label: "not equals", example: "status!=archived" },
150
+ gt: { symbol: ">", label: "greater than", example: "age>18" },
151
+ gte: { symbol: ">=", label: "greater or equal", example: "age>=18" },
152
+ lt: { symbol: "<", label: "less than", example: "age<65" },
153
+ lte: { symbol: "<=", label: "less or equal", example: "age<=65" },
154
+ like: { symbol: "~", label: "like (case-sensitive)", example: "name~John" },
155
+ ilike: {
156
+ symbol: "~*",
157
+ label: "like (case-insensitive)",
158
+ example: "name~*john",
159
+ },
160
+ null: { symbol: "=null", label: "is null", example: "deletedAt=null" },
161
+ notNull: {
162
+ symbol: "!=null",
163
+ label: "is not null",
164
+ example: "email!=null",
165
+ },
166
+ in: {
167
+ symbol: "[...]",
168
+ label: "in array",
169
+ example: "status=[active,pending]",
170
+ },
171
+ };
@@ -1 +0,0 @@
1
- {"version":3,"file":"AlephaMantineProvider-CtIV-8MV.mjs","names":["Omnibar"],"sources":["../src/services/ToastService.tsx","../src/hooks/useToast.ts","../src/components/layout/Omnibar.tsx","../src/components/layout/AlephaMantineProvider.tsx"],"sourcesContent":["import type { NotificationData } from \"@mantine/notifications\";\nimport { notifications } from \"@mantine/notifications\";\nimport {\n IconAlertTriangle,\n IconCheck,\n IconInfoCircle,\n IconX,\n} from \"@tabler/icons-react\";\n\nexport interface ToastServiceOptions {\n default?: Partial<NotificationData>;\n}\n\nexport class ToastService {\n protected readonly raw = notifications;\n\n public readonly options: ToastServiceOptions = {\n default: {\n autoClose: 5000,\n withCloseButton: true,\n position: \"top-center\",\n },\n };\n\n public show(options: NotificationData) {\n notifications.show({\n ...this.options.default,\n ...options,\n });\n }\n\n public info(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"blue\",\n icon: <IconInfoCircle size={20} />,\n title: \"Info\",\n message: \"Information notification\",\n ...options,\n });\n }\n\n public success(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"green\",\n icon: <IconCheck size={16} />,\n title: \"Success\",\n message: \"Operation completed successfully\",\n ...options,\n });\n }\n\n public warning(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"yellow\",\n icon: <IconAlertTriangle size={20} />,\n title: \"Warning\",\n message: \"Please review this warning\",\n ...options,\n });\n }\n\n public danger(options: Partial<NotificationData> | string) {\n if (typeof options === \"string\") {\n options = { message: options };\n }\n this.show({\n color: \"red\",\n icon: <IconX size={20} />,\n title: \"Error\",\n message: \"An error occurred\",\n ...options,\n });\n }\n}\n","import { useInject } from \"@alepha/react\";\nimport { ToastService } from \"../services/ToastService.tsx\";\n\n/**\n * Use this hook to access the Toast Service for showing notifications.\n *\n * @example\n * const toast = useToast();\n * toast.success({ message: \"Operation completed successfully!\" });\n * toast.error({ title: \"Error\", message: \"Something went wrong\" });\n */\nexport const useToast = (): ToastService => {\n return useInject(ToastService);\n};\n","import { useRouter } from \"@alepha/react\";\nimport { Spotlight, type SpotlightActionData } from \"@mantine/spotlight\";\nimport { IconSearch } from \"@tabler/icons-react\";\nimport { type ReactNode, useMemo } from \"react\";\n\nexport interface OmnibarProps {\n shortcut?: string | string[];\n searchPlaceholder?: string;\n nothingFound?: ReactNode;\n}\n\nconst Omnibar = (props: OmnibarProps) => {\n const shortcut = props.shortcut ?? \"mod+K\";\n const searchPlaceholder = props.searchPlaceholder ?? \"Search...\";\n const nothingFound = props.nothingFound ?? \"Nothing found...\";\n const router = useRouter();\n const actions: SpotlightActionData[] = useMemo(\n () =>\n router.concretePages.map((page) => ({\n id: page.name,\n label: page.label ?? page.name,\n description: page.description,\n onClick: () => router.go(page.path ?? page.name),\n leftSection: page.icon,\n })),\n [],\n );\n\n return (\n <Spotlight\n actions={actions}\n shortcut={shortcut}\n limit={10}\n searchProps={{\n leftSection: <IconSearch size={20} />,\n placeholder: searchPlaceholder,\n }}\n nothingFound={nothingFound}\n />\n );\n};\n\nexport default Omnibar;\n","import { NestedView, useEvents } from \"@alepha/react\";\nimport type {\n ColorSchemeScriptProps,\n MantineProviderProps,\n} from \"@mantine/core\";\nimport { ColorSchemeScript, MantineProvider } from \"@mantine/core\";\nimport { ModalsProvider, type ModalsProviderProps } from \"@mantine/modals\";\nimport { Notifications, type NotificationsProps } from \"@mantine/notifications\";\nimport type { NavigationProgressProps } from \"@mantine/nprogress\";\nimport { NavigationProgress, nprogress } from \"@mantine/nprogress\";\nimport type { ReactNode } from \"react\";\nimport { useToast } from \"../../hooks/useToast.ts\";\nimport Omnibar, { type OmnibarProps } from \"./Omnibar.tsx\";\n\nexport interface AlephaMantineProviderProps {\n children?: ReactNode;\n mantine?: MantineProviderProps;\n colorSchemeScript?: ColorSchemeScriptProps;\n navigationProgress?: NavigationProgressProps;\n notifications?: NotificationsProps;\n modals?: ModalsProviderProps;\n omnibar?: OmnibarProps;\n}\n\nconst AlephaMantineProvider = (props: AlephaMantineProviderProps) => {\n const toast = useToast();\n\n useEvents(\n {\n \"react:transition:begin\": () => {\n nprogress.start();\n },\n \"react:transition:end\": () => {\n nprogress.complete();\n },\n \"react:action:error\": () => {\n toast.danger(\"An error occurred while processing your action.\");\n },\n },\n [],\n );\n\n return (\n <>\n <ColorSchemeScript\n defaultColorScheme={props.mantine?.defaultColorScheme}\n {...props.colorSchemeScript}\n />\n <MantineProvider\n {...props.mantine}\n theme={{\n primaryColor: \"gray\",\n primaryShade: {\n light: 9,\n dark: 8,\n },\n cursorType: \"pointer\",\n ...props.mantine?.theme,\n }}\n >\n <Notifications {...props.notifications} />\n <NavigationProgress {...props.navigationProgress} />\n <ModalsProvider {...props.modals}>\n <Omnibar {...props.omnibar} />\n {props.children ?? <NestedView />}\n </ModalsProvider>\n </MantineProvider>\n </>\n );\n};\n\nexport default AlephaMantineProvider;\n"],"mappings":";;;;;;;;;;;AAaA,IAAa,eAAb,MAA0B;CACxB,AAAmB,MAAM;CAEzB,AAAgB,UAA+B,EAC7C,SAAS;EACP,WAAW;EACX,iBAAiB;EACjB,UAAU;EACX,EACF;CAED,AAAO,KAAK,SAA2B;AACrC,gBAAc,KAAK;GACjB,GAAG,KAAK,QAAQ;GAChB,GAAG;GACJ,CAAC;;CAGJ,AAAO,KAAK,SAA6C;AACvD,MAAI,OAAO,YAAY,SACrB,WAAU,EAAE,SAAS,SAAS;AAEhC,OAAK,KAAK;GACR,OAAO;GACP,MAAM,oBAAC,kBAAe,MAAM,KAAM;GAClC,OAAO;GACP,SAAS;GACT,GAAG;GACJ,CAAC;;CAGJ,AAAO,QAAQ,SAA6C;AAC1D,MAAI,OAAO,YAAY,SACrB,WAAU,EAAE,SAAS,SAAS;AAEhC,OAAK,KAAK;GACR,OAAO;GACP,MAAM,oBAAC,aAAU,MAAM,KAAM;GAC7B,OAAO;GACP,SAAS;GACT,GAAG;GACJ,CAAC;;CAGJ,AAAO,QAAQ,SAA6C;AAC1D,MAAI,OAAO,YAAY,SACrB,WAAU,EAAE,SAAS,SAAS;AAEhC,OAAK,KAAK;GACR,OAAO;GACP,MAAM,oBAAC,qBAAkB,MAAM,KAAM;GACrC,OAAO;GACP,SAAS;GACT,GAAG;GACJ,CAAC;;CAGJ,AAAO,OAAO,SAA6C;AACzD,MAAI,OAAO,YAAY,SACrB,WAAU,EAAE,SAAS,SAAS;AAEhC,OAAK,KAAK;GACR,OAAO;GACP,MAAM,oBAAC,SAAM,MAAM,KAAM;GACzB,OAAO;GACP,SAAS;GACT,GAAG;GACJ,CAAC;;;;;;;;;;;;;;ACrEN,MAAa,iBAA+B;AAC1C,QAAO,UAAU,aAAa;;;;;ACDhC,MAAM,WAAW,UAAwB;CACvC,MAAM,WAAW,MAAM,YAAY;CACnC,MAAM,oBAAoB,MAAM,qBAAqB;CACrD,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,SAAS,WAAW;AAa1B,QACE,oBAAC;EACC,SAdmC,cAEnC,OAAO,cAAc,KAAK,UAAU;GAClC,IAAI,KAAK;GACT,OAAO,KAAK,SAAS,KAAK;GAC1B,aAAa,KAAK;GAClB,eAAe,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK;GAChD,aAAa,KAAK;GACnB,EAAE,EACL,EAAE,CACH;EAKa;EACV,OAAO;EACP,aAAa;GACX,aAAa,oBAAC,cAAW,MAAM,KAAM;GACrC,aAAa;GACd;EACa;GACd;;AAIN,sBAAe;;;;AClBf,MAAM,yBAAyB,UAAsC;CACnE,MAAM,QAAQ,UAAU;AAExB,WACE;EACE,gCAAgC;AAC9B,aAAU,OAAO;;EAEnB,8BAA8B;AAC5B,aAAU,UAAU;;EAEtB,4BAA4B;AAC1B,SAAM,OAAO,kDAAkD;;EAElE,EACD,EAAE,CACH;AAED,QACE,4CACE,oBAAC;EACC,oBAAoB,MAAM,SAAS;EACnC,GAAI,MAAM;GACV,EACF,qBAAC;EACC,GAAI,MAAM;EACV,OAAO;GACL,cAAc;GACd,cAAc;IACZ,OAAO;IACP,MAAM;IACP;GACD,YAAY;GACZ,GAAG,MAAM,SAAS;GACnB;;GAED,oBAAC,iBAAc,GAAI,MAAM,gBAAiB;GAC1C,oBAAC,sBAAmB,GAAI,MAAM,qBAAsB;GACpD,qBAAC;IAAe,GAAI,MAAM;eACxB,oBAACA,mBAAQ,GAAI,MAAM,UAAW,EAC7B,MAAM,YAAY,oBAAC,eAAa;KAClB;;GACD,IACjB;;AAIP,oCAAe"}
@@ -1,3 +0,0 @@
1
- import { t as AlephaMantineProvider_default } from "./AlephaMantineProvider-CtIV-8MV.mjs";
2
-
3
- export { AlephaMantineProvider_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/utils/parseInput.ts","../src/components/form/ControlSelect.tsx","../src/components/form/Control.tsx","../src/components/buttons/ActionButton.tsx","../src/components/buttons/DarkModeButton.tsx","../src/components/buttons/OmnibarButton.tsx","../src/services/DialogService.tsx","../src/components/dialogs/AlertDialog.tsx","../src/components/dialogs/ConfirmDialog.tsx","../src/components/dialogs/PromptDialog.tsx","../src/components/form/ControlDate.tsx","../src/components/form/TypeForm.tsx","../src/components/buttons/LanguageButton.tsx","../src/components/layout/AppBar.tsx","../src/components/layout/Sidebar.tsx","../src/components/layout/AdminShell.tsx","../src/components/layout/Omnibar.tsx","../src/components/layout/AlephaMantineProvider.tsx","../src/components/table/DataTable.tsx","../src/constants/ui.ts","../src/hooks/useDialog.ts","../src/services/ToastService.tsx","../src/hooks/useToast.ts","../src/RootRouter.ts","../src/utils/icons.tsx","../src/utils/string.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;UAkGiB,mBAAA;SACR;;;SAGA;;;;KCjFG,gBAAA;;;;;UAIK,kBAAA,SAA2B;qBACvB;oBACD;mBACD;2BACQ;wBACH,QAAQ;iBAEf,QAAQ;;ADkEzB;;;;AC7EA;AAIA;;;;;;;;cAuBM,aAhBW,EAAA,CAAA,KAAA,EAgBa,kBAhBb,EAAA,GAgB+B,kBAAA,CAAA,GAAA,CAAA,OAAA,GAhB/B,IAAA;;;UCAA,YAAA,SAAqB;SAC7B;mBACU;qBACE,QAAQ;uBACN;qBACF;qBACA;mBACF;oBACC;mBACD;EFyDF,QAAA,CAAA,EAAA,OAAA,GExDM,mBFyDd;mBExDU;WACR,cAAc;;ADvBzB;AAIA;;;;;;;;;;;AAQC;;;;ACDD;;;;;cAoCM,OAhCiB,EAAA,CAAA,MAAA,EAgCE,YAhCF,EAAA,GAgCc,kBAAA,CAAA,GAAA,CAAA,OAAA,GAhCd,IAAA;AAEF,KA2PT,kBAAA,GA3PS;EACF,YAAA,EAAA,GAAA;EACC,QAAA,EAAA,CAAA,KAAA,EAAA,GAAA,EAAA,GAAA,IAAA;CACD;;;UChBF,cAAA;;;;;;;;mBASE;;;AHgEnB;SG3DS;;;AFlBT;EAIiB,OAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EACI;;;EAGM,IAAA,CAAA,EAAA,MAAA;EACK;;;EAEf,KAAA,CAAA,EAAA,MAAA;EAP2B;;AAQ3C;aE0BY;;;AD3Bb;EACS,MAAA,CAAA,EAAA,OAAA;;AAEoB,UCgCZ,gBAAA,CDhCY;EAAR;;;EAGA,KAAA,ECiCZ,cDjCY,EAAA;EACF;;;EAGI,QAAA,CAAA,EAAA,QAAA,GAAA,cAAA,GAAA,YAAA,GAAA,KAAA,GAAA,WAAA,GAAA,SAAA,GAAA,MAAA,GAAA,OAAA;EACJ;;;EAXmB,KAAA,CAAA,EAAA,MAAA,GAAA,MAAA;EAAmB;AAaxD;AAoPD;;;gBC/LgB;EAzEC,SAAA,CAAA,EA0EH,SA1EiB;;AActB,UA+DQ,iBAAA,SAA0B,WA/DlC,CAAA;EAoBI,QAAA,CAAA,EA4CA,SA5CA;EAAc,eAAA,CAAA,EAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA,GAAA,IAAA;EAQV;;;;EAgCM,OAAA,CAAA,EAAA,MAAA,GAWF,YAXE;EAGN;;;EAaR,IAAA,CAAA,EAAA,gBAAA;EAcA;;;;AAQT;;EAEM,OAAA,CAAA,EAAA,OAAA,GAAA,MAAA,GAAA;IACA,KAAA,CAAA,EAAA,MAAA;IACA,OAAA,EAAA,MAAA;EACA,CAAA;EAAqB;AAEvB;AA8NJ;AA4BA;EA0CiB,IAAA,CAAA,EAnTR,SAmTQ;EA0CA;;;EAGG,cAAA,CAAA,EA3VD,cA2VC;;AAHiC,KArVzC,WAAA,GAAc,iBAqV2B,GAAA,CAnV/C,2BAmV+C,GAlV/C,sBAkV+C,GAjV/C,uBAiV+C,GAhV/C,qBAgV+C,GAAA,CAAA,CAAA,CAAA;cA9P/C,YA8P0D,EAAA,CAAA,MAAA,EA9PlC,WA8PkC,EAAA,GA9PvB,kBAAA,CAAA,GAAA,CAAA,OA8PuB;UAhH/C,uBAAA,SAAgC;QACzC;ACnWR;AAES,UD4XQ,qBAAA,SAA8B,WC5XtC,CAAA;EAWkB,MAAA,EDkXjB,eClXiB,CAAA,GAAA,EAAA,EAAA,GAAA,CAAA;;AACH,UD0ZP,sBAAA,SAA+B,WC1ZxB,CAAA;EAAR,OAAA,EAAA,CAAA,CAAA,EAAA,GAAA,EAAA,GAAA,GAAA;;AAGV,UDicW,2BAAA,SAAoC,WCjcH,CAAA;;WDmcvC,QAAQ;oBACC;EE5dH,eAAA,CAAA,EAAA,MAAkB;EAK7B,aAAA,CAAA,EFydY,WEtcjB,CAnB6B,SAAA,CAAA;;;;;UDEb,mBAAA;;SAER;;;mBAWU,QAAQ;gBACX,QAAQ;;cAGlB,wBAAyB,wBAAmB,kBAAA,CAAA,GAAA,CAAA;;;UCxBjC,kBAAA;gBACD;;;cAIV,uBAAwB,uBAAkB,kBAAA,CAAA,GAAA,CAAA;;;UCF/B,iBAAA,SAA0B,QAAQ;UACzC;YACE;;;UAIK,kBAAA,SAA2B;;;UAI3B,oBAAA,SAA6B;;;;;ANgF7B,UM1EA,mBAAA,SAA4B,iBN8E3B,CAAA;;;;ECjFN,QAAA,CAAA,EAAA,OAAA;EAIK,WAAA,CAAA,EAAA,MAAA;EACI,WAAA,CAAA,EAAA,MAAA;;AAEF,UKMF,gBAAA,CLNE;EACQ,OAAA,CAAA,EKMf,kBLNe;EACK,OAAA,EAAA,GAAA,GAAA,IAAA;;AAEP,UKOR,kBAAA,CLPQ;EAAR,OAAA,CAAA,EKQL,oBLRK;EAP2B,SAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,GAAA,IAAA;;AAuBtC,UKJW,iBAAA,CLIa;YKHlB;;;AJbK,UIiBA,oBAAA,CJjBa;EACrB,OAAA,CAAA,EIiBG,OJjBH,CIiBW,iBJjBX,CAAA;;AAEoB,cIkBhB,aAAA,CJlBgB;EAAR,SAAA,OAAA,EImBM,oBJnBN;EACE;;;EAGJ,KAAA,CAAA,OAAA,CAAA,EIkCM,kBJlCN,CAAA,EIkC2B,OJlC3B,CAAA,IAAA,CAAA;EACC;;;EAGD,OAAA,CAAA,OAAA,CAAA,EImDQ,oBJnDR,CAAA,EImD+B,OJnD/B,CAAA,OAAA,CAAA;EACM;;;EAZgC,MAAA,CAAA,OAAA,CAAA,EIqF/B,mBJrF+B,CAAA,EIqFT,OJrFS,CAAA,MAAA,GAAA,IAAA,CAAA;EAoCnD;AA6NN;;iBIrJwB;;AHnHxB;;EAcS,KAAA,CAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAoBI;;AAQb;EAIS,IAAA,CAAA,IAAA,CAAA,EAAA,GAAA,EAAA,OAAA,CAAA,EG2F2B,iBH3F3B,CAAA,EAAA,IAAA;EA2BO;;;EAIC,IAAA,CAAA,OAAkB,CAAlB,EGmEO,iBHnEW,CAAA,EGmES,OHnET,CAAA,GAAA,CAAA;EACtB;;;EA0BJ,OAAA,CAAA,OA3BkC,CA2BlC,EGgDkB,iBHhDlB,GAAA;IAKU,QAAA,CAAA,EAAA,MAAA;EAhCwB,CAAA,CAAA,EAAA,IAAA;EAAW;AAmCtD;;EAEM,KAAA,CAAA,GAAA,EAAA,MAAA,GAAA,MAAA,EAAA,EAAA,OAAA,CAAA,EG6C2C,iBH7C3C,CAAA,EAAA,IAAA;;;;cIxIA;;;GAAqC,qBAAgB,kBAAA,CAAA,GAAA,CAAA;;;cCArD;;;GAAyC,uBAAkB,kBAAA,CAAA,GAAA,CAAA;;;cCC3D;;;GAAuC,sBAAiB,kBAAA,CAAA,GAAA,CAAA;;;UCU7C,gBAAA,SAAyB;mBACvB;uBACI;mBACJ;;;;;;;;;;AViFnB;;cUpEM,qBAAsB,qBAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;UCrB3B,wBAAwB;QACjC,UAAU;;;;;;;;;EXwFD,QAAA,CAAA,EAAA,CAAA,KAAA,EW7EI,SX6Ee,CW7EL,CX6EK,CAAA,CAAA,OAC3B,CAAA,EAAA,GW9EsC,SXiFtC;iBWhFQ,QAAQ,KAAK;;;EVDlB,iBAAA,CAAA,EUIU,OVJM,CUIE,IVJF,CUIO,uBVJP,EAAA,MAAA,CAAA,CAAA;EAIX,gBAAA,CAAA,EUCI,OVDe,CUCP,IVDO,CUCF,uBVDE,EAAA,MAAA,CAAA,CAAA;;;;;;;;;;;AAQnC;;;;ACDD;;;;;;;;;;;;cSsBM,QTXa,EAAA,CAAA,USWS,OTXT,CAAA,CAAA,KAAA,ESWyB,aTXzB,CSWuC,CTXvC,CAAA,EAAA,GSWyC,kBAAA,CAAA,GAAA,CAAA,OAAA,GTXzC,IAAA;;;UUvCF,mBAAA;;gBAED;;;;KCOJ,UAAA,GACR,gBACA,eACA,aACA,eACA,aACA,eACA;UAEa,aAAA;;WAEN;;UAGM,YAAA;;;;UAKA,UAAA;EbkEA,QAAA,EAAA,MAAA,GAAA,QAAmB,GAAA,OAC3B;;UahEC;;AZdE,UYiBK,YAAA,CZjBW;EAIX,QAAA,EAAA,MAAA,GAAA,QAAmB,GAAA,OAAA;EACf,IAAA,EAAA,QAAA;EACD,KAAA,CAAA,EYcV,kBZdU;;AAEO,UYeV,UAAA,CZfU;EACK,QAAA,EAAA,MAAA,GAAA,QAAA,GAAA,OAAA;EAAR,IAAA,EAAA,MAAA;EAEC,KAAA,CAAA,EYef,mBZfe;;AAPmB,UYyB3B,YAAA,CZzB2B;EAAmB,QAAA,EAAA,MAAA,GAAA,QAAA,GAAA,OAAA;EAuBzD,IAAA,EAAA,QAAA;;UYOW,aAAA;;EXvBA,IAAA,EAAA,SAAa;;AAEX,UW0BF,WAAA,CX1BE;EACU,SAAA,CAAA,EW0Bf,SX1Be;EAAR,KAAA,CAAA,EW2BX,UX3BW,EAAA;;cW8Bf,MX5Be,EAAA,CAAA,KAAA,EW4BE,WX5BF,EAAA,GW4Ba,kBAAA,CAAA,GAAA,CAAA,OX5Bb;;;UYpBJ,YAAA;SACR;QACD;WACG;uBACY;;UAEb;cACI,QAAQ;;QAEd;;cAGK,iBAAkB,iBAAY,kBAAA,CAAA,GAAA,CAAA;AdqE1B,UcmDA,gBAAA,CdnDmB;QcoD5B;;uBAEe;EbnIX,KAAA,EaoIH,YbpImB;AAI5B;AAEoB,UagQH,gBAAA,CbhQG;EACD,IAAA,EagQX,ebhQW;EACQ,KAAA,EAAA,MAAA;EACK,WAAA,CAAA,EAAA,CAAA,IAAA,EagQT,ebhQS,EAAA,GAAA,IAAA;EAAR,KAAA,EaiQf,YbjQe;;AAEP,KamUL,WAAA,GACR,ebpUa,GaqUb,abrUa,GasUb,cbtUa,GauUb,abvUa,GawUb,cbxUa,GayUb,cbzUa;AAP2B,UakV3B,mBAAA,CblV2B;EAAmB,QAAA,CAAA,EAAA,KAAA,GAAA,QAAA;AAQ9D;Ua8UgB,cAAA,SAAuB;WAC7B;;AZhVM,UYmVA,aAAA,SAAsB,mBZnVT,CAAA;EACrB,IAAA,EAAA,QAAA;;AAEoB,UYoVZ,cAAA,SAAuB,mBZpVX,CAAA;EAAR,IAAA,EAAA,SAAA;;AAEA,UYsVJ,aAAA,SAAsB,mBZtVlB,CAAA;EACA,IAAA,EAAA,QAAA;;AAED,UYuVH,cAAA,SAAuB,mBZvVpB,CAAA;EACD,IAAA,EAAA,SAAA;EACI,KAAA,EAAA,MAAA;;AAEE,UYwVR,eAAA,SAAwB,mBZxVhB,CAAA;EAAd,KAAA,EAAA,MAAA,GYyVO,SZzVP;EAZ2B,WAAA,CAAA,EAAA,MAAA;EAAmB,IAAA,CAAA,EYuWhD,SZvWgD;EAoCnD,IAAA,CAAA,EAAA,MAyNL;EAIW,gBAAA,CAAA,EAAA,OAAkB;;aY0GjB;iBACI;EXnXA,KAAA,CAAA,EWoXP,kBXpXqB;EASZ,WAAA,CAAA,EW4WH,WX5WG;;AAyBN,UWsVI,kBAAA,CXtVJ;EAAc,MAAA,CAAA,EWuVhB,iBXvVgB;EAQV,IAAA,CAAA,EWgVR,iBXhVwB;;AA+BjB,UWoTC,YAAA,CXpTD;EACF,MAAA,CAAA,EWoTH,kBXpTG;EAAS,MAAA,CAAA,EWqTZ,kBXrTY;AAGvB;;;UYxFiB,eAAA;kBACC,QAAQ;sBACJ,QAAQ;wBACN,QAAQ;wBACR,QAAQ;wBACR,QAAQ;iBACf,QAAQ;gBACT,QAAQ;WACb;WACA;aACE;Af0Eb;;;;IC7EY,6BAAgB,CAAA,EAAA,OAAA;EAIX;;ccSX,UdPc,EAAA,CAAA,KAAA,EcOO,edPP,EAAA,GcOsB,kBAAA,CAAA,GAAA,CAAA,OdPtB;;;UetBH,YAAA;;;iBAGA;;cAGX,iBAAkB,iBAAY,kBAAA,CAAA,GAAA,CAAA;;;UCGnB,0BAAA;aACJ;YACD;sBACU;uBACC;kBACL;WACP;YACC;;AjB6EZ,ciB1EM,qBjB0E8B,EAAA,CAC3B,KAAA,EiB3E6B,0BjB8EpB,EAAA,GiB9E8C,kBAAA,CAAA,GAAA,CAAA,OjB8E9C;;;UkBhGD;;gBAED,MAAM;;UAGL;SACR,aAAa,MAAM;;mBAET,gBAAgB;;eAEpB;wBACS,MAAM;AlBiF9B;ckB9EM,qCAAsC,eAAe,OAAE,kBAAA,CAAA,GAAA,CAAA;;;cCpBhD;;;;;;;;;;;;;;;;;;;cCYA,iBAAgB;;;UCHZ,mBAAA;YACL,QAAQ;;cAGP,YAAA;;0BAAY,uBAAA,CAAA;;;;;;;oBAGE;gBAQJ;ErB0EN,IAAA,CAAA,OAAA,EqBnEM,OrBmEN,CqBnEc,gBrBoEtB,CAAA,GAAA,MAGA,CAAA,EAAA,IAAA;mBqB1DiB,QAAQ;mBAaR,QAAQ;kBAaT,QAAQ;ApBjDjC;;;;;;;;;;;cqBVa,gBAAe;;;cCTf,UAAA;iBACS,cAAA,CAAA,eADC,cAAA,CACD,gBAAA,OAAA,cAAA,CAAA,mBAAA;;;;;;;cCmBT;;;;;;;KAQD,QAAA,gBAAwB;;;;AxBoEnB,cwB/DJ,cxB+DuB,EAAA,CAC3B,MAAA,EAAA;;;;EC9EG,MAAA,CAAA,EAAA,OAAA;EAIK,OAAA,CAAA,EAAA,OAAA;EACI,IAAA,CAAA,EuBeZ,QvBfY;CACD,EAAA,GuBehB,SvBfgB;;;;;;;;;cwBrBP;;;;;;;;;AzB4FI,cyBhFJ,UzBgFuB,EAAA,CAAA,IAC3B,EAAA,MAAA,EAAA,GAGA,MAAA;;;;;e0BbM,KAAK;ExBzDH;;eAEE,eAAA,CAAA;EACU,UAAA,qBAAA,CAAA;IAAR;;;;;;;;IAQF,KAAA,CAAA,EAAA,MAAA;IACM;;;IAZgC,WAAA,CAAA,EAAA,MAAA;IAoCnD;AA6NN;;WwBhLW;;AvBxFX;;;;;AA0CA;AAIS,cuBqDI,QvBrDJ,EuBqDY,aAAA,CAAA,OvBrDZ,CuB+DP,aAAA,CAVmB,MvBrDZ,CAAA,CAAA,CAAA,CAAA,CAAA"}