@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.
- package/dist/AlephaMantineProvider-Ba88lMeq.js +3 -0
- package/dist/{AlephaMantineProvider-CtIV-8MV.mjs → AlephaMantineProvider-Be0DAazb.js} +1 -1
- package/dist/AlephaMantineProvider-Be0DAazb.js.map +1 -0
- package/dist/{index.d.mts → index.d.ts} +111 -8
- package/dist/index.d.ts.map +1 -0
- package/dist/{index.mjs → index.js} +647 -60
- package/dist/index.js.map +1 -0
- package/package.json +21 -20
- package/src/components/buttons/ActionButton.tsx +29 -3
- package/src/components/buttons/ToggleSidebarButton.tsx +4 -1
- package/src/components/form/Control.tsx +28 -11
- package/src/components/form/ControlNumber.tsx +96 -0
- package/src/components/form/ControlQueryBuilder.tsx +248 -0
- package/src/components/form/TypeForm.tsx +6 -4
- package/src/components/layout/AdminShell.tsx +7 -0
- package/src/components/layout/Sidebar.tsx +24 -14
- package/src/components/table/DataTable.tsx +238 -15
- package/src/constants/ui.ts +1 -0
- package/src/index.ts +2 -0
- package/src/utils/extractSchemaFields.ts +171 -0
- package/dist/AlephaMantineProvider-CtIV-8MV.mjs.map +0 -1
- package/dist/AlephaMantineProvider-D-vu9aCD.mjs +0 -3
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs.map +0 -1
|
@@ -1,34 +1,222 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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<
|
|
23
|
-
typeof props.items === "function"
|
|
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
|
-
<
|
|
55
|
-
<
|
|
56
|
-
<
|
|
57
|
-
</
|
|
58
|
-
<Table
|
|
59
|
-
|
|
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
|
|
package/src/constants/ui.ts
CHANGED
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"}
|
package/dist/index.d.mts.map
DELETED
|
@@ -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":"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"}
|