@makolabs/ripple 2.5.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +403 -497
- package/dist/adapters/storage/S3Adapter.d.ts +49 -1
- package/dist/adapters/storage/S3Adapter.js +38 -1
- package/dist/adapters/storage/types.d.ts +20 -0
- package/dist/ai/AIChatInterface.svelte +2 -1
- package/dist/ai/AIChatInterface.svelte.d.ts +2 -1
- package/dist/ai/CodeRenderer.svelte +7 -2
- package/dist/ai/CodeRenderer.svelte.d.ts +2 -1
- package/dist/ai/ComposeDropdown.svelte +1 -1
- package/dist/ai/MessageBox.svelte +3 -3
- package/dist/ai/MessageBox.svelte.d.ts +3 -2
- package/dist/ai/ThinkingDisplay.svelte +4 -3
- package/dist/ai/ThinkingDisplay.svelte.d.ts +2 -1
- package/dist/ai/ai-types.d.ts +55 -1
- package/dist/button/Button.svelte +5 -5
- package/dist/button/button-types.d.ts +49 -4
- package/dist/button/button.d.ts +9 -9
- package/dist/button/button.js +6 -6
- package/dist/charts/Chart.svelte +8 -16
- package/dist/charts/chart-types.d.ts +78 -1
- package/dist/drawer/Drawer.svelte +6 -26
- package/dist/drawer/drawer-types.d.ts +33 -12
- package/dist/drawer/drawer.d.ts +3 -3
- package/dist/drawer/drawer.js +1 -1
- package/dist/elements/accordion/Accordion.svelte +6 -17
- package/dist/elements/accordion/accordion-types.d.ts +53 -6
- package/dist/elements/alert/Alert.svelte +3 -0
- package/dist/elements/badge/Badge.svelte +1 -1
- package/dist/elements/badge/badge-types.d.ts +22 -0
- package/dist/elements/badge/badge.d.ts +3 -3
- package/dist/elements/badge/badge.js +1 -1
- package/dist/elements/combobox/ComboBox.svelte +247 -0
- package/dist/elements/combobox/ComboBox.svelte.d.ts +4 -0
- package/dist/elements/combobox/combobox-types.d.ts +41 -0
- package/dist/elements/combobox/combobox-types.js +1 -0
- package/dist/elements/context-menu/ContextMenu.svelte +137 -0
- package/dist/elements/context-menu/ContextMenu.svelte.d.ts +4 -0
- package/dist/elements/context-menu/context-menu-types.d.ts +40 -0
- package/dist/elements/context-menu/context-menu-types.js +1 -0
- package/dist/elements/dropdown/Dropdown.svelte +1 -1
- package/dist/elements/dropdown/Select.svelte +4 -1
- package/dist/elements/dropdown/dropdown-types.d.ts +114 -0
- package/dist/elements/dropdown/dropdown.d.ts +3 -3
- package/dist/elements/dropdown/dropdown.js +2 -2
- package/dist/elements/dropdown/select.d.ts +3 -3
- package/dist/elements/dropdown/select.js +2 -2
- package/dist/elements/empty-state/EmptyState.svelte +1 -1
- package/dist/elements/empty-state/empty-state-types.d.ts +32 -1
- package/dist/elements/empty-state/empty-state.d.ts +3 -3
- package/dist/elements/empty-state/empty-state.js +2 -2
- package/dist/elements/file-upload/FileUpload.svelte +5 -0
- package/dist/elements/file-upload/file-upload-types.d.ts +59 -0
- package/dist/elements/pagination/Pagination.svelte +53 -21
- package/dist/elements/pagination/Pagination.svelte.d.ts +33 -5
- package/dist/elements/popover/Popover.svelte +234 -0
- package/dist/elements/popover/Popover.svelte.d.ts +4 -0
- package/dist/elements/popover/index.d.ts +2 -0
- package/dist/elements/popover/index.js +1 -0
- package/dist/elements/popover/popover-types.d.ts +60 -0
- package/dist/elements/popover/popover-types.js +1 -0
- package/dist/elements/progress/Progress.svelte +32 -7
- package/dist/elements/progress/progress-types.d.ts +48 -1
- package/dist/elements/skeleton/Skeleton.svelte +56 -0
- package/dist/elements/skeleton/Skeleton.svelte.d.ts +4 -0
- package/dist/elements/skeleton/index.d.ts +2 -0
- package/dist/elements/skeleton/index.js +1 -0
- package/dist/elements/skeleton/skeleton-types.d.ts +50 -0
- package/dist/elements/skeleton/skeleton-types.js +1 -0
- package/dist/elements/spinner/Spinner.svelte +1 -1
- package/dist/elements/spinner/spinner-types.d.ts +20 -0
- package/dist/elements/spinner/spinner.d.ts +3 -3
- package/dist/elements/spinner/spinner.js +2 -2
- package/dist/elements/tooltip/Tooltip.svelte +108 -11
- package/dist/elements/tooltip/tooltip-types.d.ts +49 -1
- package/dist/file-browser/FileBrowser.svelte +21 -12
- package/dist/filters/CompactFilters.svelte +221 -33
- package/dist/filters/CompactFilters.svelte.d.ts +1 -1
- package/dist/filters/FilterBar.svelte +184 -0
- package/dist/filters/FilterBar.svelte.d.ts +4 -0
- package/dist/filters/FilterPopover.svelte +346 -0
- package/dist/filters/FilterPopover.svelte.d.ts +4 -0
- package/dist/filters/date-presets.d.ts +15 -0
- package/dist/filters/date-presets.js +107 -0
- package/dist/filters/filter-types.d.ts +69 -3
- package/dist/filters/index.d.ts +5 -0
- package/dist/filters/index.js +4 -0
- package/dist/filters/sync-filters-to-url.svelte.d.ts +37 -0
- package/dist/filters/sync-filters-to-url.svelte.js +114 -0
- package/dist/forms/DateRange.svelte +4 -2
- package/dist/forms/Input.svelte +2 -2
- package/dist/forms/MarketSelector.svelte +8 -3
- package/dist/forms/NumberInput.svelte +4 -4
- package/dist/forms/RadioGroup.svelte +123 -0
- package/dist/forms/RadioGroup.svelte.d.ts +4 -0
- package/dist/forms/SegmentedControl.svelte +11 -4
- package/dist/forms/Slider.svelte +72 -3
- package/dist/forms/Tags.svelte +14 -5
- package/dist/forms/Textarea.svelte +126 -0
- package/dist/forms/Textarea.svelte.d.ts +4 -0
- package/dist/forms/Toggle.svelte +8 -8
- package/dist/forms/calendar/Calendar.svelte +218 -0
- package/dist/forms/calendar/Calendar.svelte.d.ts +4 -0
- package/dist/forms/calendar/calendar-types.d.ts +46 -0
- package/dist/forms/calendar/calendar-types.js +1 -0
- package/dist/forms/calendar/index.d.ts +2 -0
- package/dist/forms/calendar/index.js +1 -0
- package/dist/forms/date-picker/DatePicker.svelte +144 -0
- package/dist/forms/date-picker/DatePicker.svelte.d.ts +4 -0
- package/dist/forms/date-picker/date-picker-types.d.ts +29 -0
- package/dist/forms/date-picker/date-picker-types.js +1 -0
- package/dist/forms/form-types.d.ts +425 -6
- package/dist/forms/market/market-selector-types.d.ts +52 -1
- package/dist/forms/segmented-control.d.ts +5 -2
- package/dist/forms/segmented-control.js +16 -5
- package/dist/forms/slider.d.ts +3 -3
- package/dist/forms/slider.js +2 -2
- package/dist/funcs/user-management.remote.d.ts +1 -1
- package/dist/funcs/user-management.remote.js +2 -2
- package/dist/header/Breadcrumbs.svelte +4 -20
- package/dist/header/PageHeader.svelte +6 -14
- package/dist/header/breadcrumbs.d.ts +3 -11
- package/dist/header/breadcrumbs.js +10 -5
- package/dist/header/header-types.d.ts +62 -11
- package/dist/index.d.ts +35 -9
- package/dist/index.js +24 -4
- package/dist/layout/activity-list/ActivityList.svelte +13 -7
- package/dist/layout/activity-list/activity-list-types.d.ts +46 -7
- package/dist/layout/card/Card.svelte +12 -15
- package/dist/layout/card/MetricCard.svelte +50 -32
- package/dist/layout/card/card-types.d.ts +114 -4
- package/dist/layout/navbar/navbar-types.d.ts +48 -0
- package/dist/layout/navbar/navbar.d.ts +3 -3
- package/dist/layout/navbar/navbar.js +2 -2
- package/dist/layout/sidebar/Sidebar.svelte +87 -11
- package/dist/layout/sidebar/sidebar-types.d.ts +60 -1
- package/dist/layout/stepper/Stepper.svelte +288 -0
- package/dist/layout/stepper/Stepper.svelte.d.ts +4 -0
- package/dist/layout/stepper/stepper-types.d.ts +80 -0
- package/dist/layout/stepper/stepper-types.js +1 -0
- package/dist/layout/table/Table.svelte +91 -85
- package/dist/layout/table/table-types.d.ts +148 -24
- package/dist/layout/table/table.d.ts +3 -3
- package/dist/layout/table/table.js +2 -2
- package/dist/layout/tabs/Tab.svelte +6 -2
- package/dist/layout/tabs/Tab.svelte.d.ts +4 -1
- package/dist/layout/tabs/TabGroup.svelte +9 -2
- package/dist/layout/tabs/tabs-types.d.ts +63 -0
- package/dist/layout/tabs/tabs.d.ts +3 -3
- package/dist/layout/tabs/tabs.js +12 -6
- package/dist/modal/ConfirmDialog.svelte +65 -0
- package/dist/modal/ConfirmDialog.svelte.d.ts +4 -0
- package/dist/modal/Modal.svelte +6 -26
- package/dist/modal/confirm-dialog-types.d.ts +39 -0
- package/dist/modal/confirm-dialog-types.js +1 -0
- package/dist/modal/modal-types.d.ts +51 -12
- package/dist/modal/modal.d.ts +3 -3
- package/dist/modal/modal.js +3 -3
- package/dist/pipeline/Pipeline.svelte +8 -3
- package/dist/pipeline/pipeline-types.d.ts +55 -3
- package/dist/pipeline/pipeline.d.ts +18 -3
- package/dist/pipeline/pipeline.js +7 -2
- package/dist/server/s3.d.ts +35 -3
- package/dist/sonner/Toaster.svelte +29 -0
- package/dist/sonner/Toaster.svelte.d.ts +4 -0
- package/dist/sonner/index.d.ts +21 -0
- package/dist/sonner/index.js +20 -0
- package/dist/user-management/UserManagement.svelte +22 -16
- package/dist/user-management/UserModal.svelte +10 -7
- package/dist/user-management/UserTable.svelte +16 -17
- package/dist/user-management/UserViewModal.svelte +11 -11
- package/dist/user-management/user-management-types.d.ts +118 -31
- package/dist/variants.d.ts +1 -1
- package/dist/variants.js +1 -1
- package/package.json +7 -4
- package/dist/config/ai.d.ts +0 -13
- package/dist/config/ai.js +0 -44
- package/dist/elements/empty-state/EmptyStateTestWrapper.svelte +0 -25
- package/dist/elements/empty-state/EmptyStateTestWrapper.svelte.d.ts +0 -8
- package/dist/elements/tooltip/TooltipTestWrapper.svelte +0 -14
- package/dist/elements/tooltip/TooltipTestWrapper.svelte.d.ts +0 -7
- package/dist/helper/deprecation.d.ts +0 -14
- package/dist/helper/deprecation.js +0 -24
- package/dist/modal/ModalFooterTestWrapper.svelte +0 -17
- package/dist/modal/ModalFooterTestWrapper.svelte.d.ts +0 -8
|
@@ -19,7 +19,7 @@ export const pipelineVariants = tv({
|
|
|
19
19
|
count: 'text-xl mt-0.5',
|
|
20
20
|
content: 'px-4'
|
|
21
21
|
},
|
|
22
|
-
|
|
22
|
+
md: {
|
|
23
23
|
stage: 'min-w-[150px]',
|
|
24
24
|
borderLayer: 'h-24',
|
|
25
25
|
innerLayer: 'h-24',
|
|
@@ -43,6 +43,11 @@ export const pipelineVariants = tv({
|
|
|
43
43
|
label: 'text-default-700',
|
|
44
44
|
count: 'text-default-900'
|
|
45
45
|
},
|
|
46
|
+
secondary: {
|
|
47
|
+
borderLayer: 'bg-secondary-500',
|
|
48
|
+
label: 'text-default-700',
|
|
49
|
+
count: 'text-default-900'
|
|
50
|
+
},
|
|
46
51
|
success: {
|
|
47
52
|
borderLayer: 'bg-green-500',
|
|
48
53
|
label: 'text-default-700',
|
|
@@ -84,7 +89,7 @@ export const pipelineVariants = tv({
|
|
|
84
89
|
}
|
|
85
90
|
},
|
|
86
91
|
defaultVariants: {
|
|
87
|
-
size: '
|
|
92
|
+
size: 'md',
|
|
88
93
|
color: 'default',
|
|
89
94
|
equalWidth: true
|
|
90
95
|
}
|
package/dist/server/s3.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* S3 server handler factory
|
|
3
|
-
*
|
|
2
|
+
* S3 server handler factory — the server-side half of the `FileBrowser`
|
|
3
|
+
* component. Returns two `Request → Response` handlers that the client-side
|
|
4
|
+
* `S3Adapter` expects at **`GET /api/s3/list`** and **`GET /api/s3/download`**.
|
|
4
5
|
*
|
|
5
6
|
* Keeps AWS credentials server-side — consumers just wire these handlers into
|
|
6
|
-
* their route files.
|
|
7
|
+
* their SvelteKit route files.
|
|
8
|
+
*
|
|
9
|
+
* **Both routes are required.** Skipping `download` makes file downloads 404.
|
|
10
|
+
*
|
|
11
|
+
* Pair with the client-side `S3Adapter` from `@makolabs/ripple`:
|
|
7
12
|
*
|
|
8
13
|
* @example
|
|
9
14
|
* ```ts
|
|
@@ -21,6 +26,33 @@
|
|
|
21
26
|
*
|
|
22
27
|
* export const GET = ({ request }) => s3.list(request);
|
|
23
28
|
* ```
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* // src/routes/api/s3/download/+server.ts
|
|
33
|
+
* import { createS3Handlers } from '@makolabs/ripple/server';
|
|
34
|
+
* import { env } from '$env/dynamic/private';
|
|
35
|
+
*
|
|
36
|
+
* // Reuse the same config as the list route — or export a shared `s3` helper.
|
|
37
|
+
* const s3 = createS3Handlers({
|
|
38
|
+
* bucket: env.S3_BUCKET,
|
|
39
|
+
* region: env.S3_REGION,
|
|
40
|
+
* accessKeyId: env.S3_ACCESS_KEY_ID,
|
|
41
|
+
* secretAccessKey: env.S3_SECRET_ACCESS_KEY
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* export const GET = ({ request }) => s3.download(request);
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```svelte
|
|
49
|
+
* <!-- Consumer page wires S3Adapter to FileBrowser -->
|
|
50
|
+
* <script lang="ts">
|
|
51
|
+
* import { FileBrowser, S3Adapter } from '@makolabs/ripple';
|
|
52
|
+
* const adapter = new S3Adapter({ basePath: '/' });
|
|
53
|
+
* </script>
|
|
54
|
+
* <FileBrowser {adapter} />
|
|
55
|
+
* ```
|
|
24
56
|
*/
|
|
25
57
|
export interface S3HandlerConfig {
|
|
26
58
|
/** S3 bucket name (default used when request doesn't specify one) */
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Toaster as Sonner, type ToasterProps as SonnerProps } from 'svelte-sonner';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
position = 'top-right',
|
|
6
|
+
richColors = true,
|
|
7
|
+
closeButton = true,
|
|
8
|
+
duration = 4000,
|
|
9
|
+
...rest
|
|
10
|
+
}: SonnerProps = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<Sonner
|
|
14
|
+
class="toaster group"
|
|
15
|
+
{position}
|
|
16
|
+
{richColors}
|
|
17
|
+
{closeButton}
|
|
18
|
+
{duration}
|
|
19
|
+
toastOptions={{
|
|
20
|
+
classes: {
|
|
21
|
+
toast:
|
|
22
|
+
'group toast group-[.toaster]:bg-white group-[.toaster]:text-default-900 group-[.toaster]:border-default-200 group-[.toaster]:shadow-lg',
|
|
23
|
+
description: 'group-[.toast]:text-default-500',
|
|
24
|
+
actionButton: 'group-[.toast]:bg-primary-600 group-[.toast]:text-white',
|
|
25
|
+
cancelButton: 'group-[.toast]:bg-default-100 group-[.toast]:text-default-600'
|
|
26
|
+
}
|
|
27
|
+
}}
|
|
28
|
+
{...rest}
|
|
29
|
+
/>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toast — a thin wrapper over svelte-sonner with ripple-branded defaults.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```svelte
|
|
6
|
+
* <!-- Mount once, usually in +layout.svelte -->
|
|
7
|
+
* <script>
|
|
8
|
+
* import { Toaster } from '@makolabs/ripple';
|
|
9
|
+
* </script>
|
|
10
|
+
* <Toaster />
|
|
11
|
+
*
|
|
12
|
+
* <!-- Use anywhere -->
|
|
13
|
+
* <script>
|
|
14
|
+
* import { toast } from '@makolabs/ripple';
|
|
15
|
+
* </script>
|
|
16
|
+
* <button onclick={() => toast.success('Saved!')}>Save</button>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export { default as Toaster } from './Toaster.svelte';
|
|
20
|
+
export { toast } from 'svelte-sonner';
|
|
21
|
+
export type { ToasterProps, ToastT } from 'svelte-sonner';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toast — a thin wrapper over svelte-sonner with ripple-branded defaults.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```svelte
|
|
6
|
+
* <!-- Mount once, usually in +layout.svelte -->
|
|
7
|
+
* <script>
|
|
8
|
+
* import { Toaster } from '@makolabs/ripple';
|
|
9
|
+
* </script>
|
|
10
|
+
* <Toaster />
|
|
11
|
+
*
|
|
12
|
+
* <!-- Use anywhere -->
|
|
13
|
+
* <script>
|
|
14
|
+
* import { toast } from '@makolabs/ripple';
|
|
15
|
+
* </script>
|
|
16
|
+
* <button onclick={() => toast.success('Saved!')}>Save</button>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export { default as Toaster } from './Toaster.svelte';
|
|
20
|
+
export { toast } from 'svelte-sonner';
|
|
@@ -5,7 +5,13 @@
|
|
|
5
5
|
import UserTable from './UserTable.svelte';
|
|
6
6
|
import UserModal from './UserModal.svelte';
|
|
7
7
|
import UserViewModal from './UserViewModal.svelte';
|
|
8
|
-
import type {
|
|
8
|
+
import type {
|
|
9
|
+
User,
|
|
10
|
+
UserManagementProps,
|
|
11
|
+
UserModalSavePayload,
|
|
12
|
+
Role,
|
|
13
|
+
Permission
|
|
14
|
+
} from '../index.js';
|
|
9
15
|
import { SvelteSet } from 'svelte/reactivity';
|
|
10
16
|
|
|
11
17
|
let {
|
|
@@ -152,20 +158,20 @@
|
|
|
152
158
|
}
|
|
153
159
|
|
|
154
160
|
// Save handlers
|
|
155
|
-
async function handleUserSave(
|
|
161
|
+
async function handleUserSave(payload: UserModalSavePayload) {
|
|
156
162
|
try {
|
|
157
|
-
if (mode === 'create') {
|
|
163
|
+
if (payload.mode === 'create') {
|
|
158
164
|
// After creating, go to page 1 to see the new user (newest first)
|
|
159
165
|
currentPage = 1;
|
|
160
|
-
await adapter.createUser(user);
|
|
166
|
+
await adapter.createUser(payload.user);
|
|
161
167
|
} else {
|
|
162
|
-
await adapter.updateUser({ userId: user.id, userData: user });
|
|
168
|
+
await adapter.updateUser({ userId: payload.user.id, userData: payload.user });
|
|
163
169
|
}
|
|
164
170
|
// Refresh the users list
|
|
165
171
|
await refreshUsersQuery();
|
|
166
172
|
} catch (error) {
|
|
167
173
|
console.error('Error saving user:', error);
|
|
168
|
-
toast.error(mode === 'create' ? 'Failed to create user' : 'Failed to update user');
|
|
174
|
+
toast.error(payload.mode === 'create' ? 'Failed to create user' : 'Failed to update user');
|
|
169
175
|
// Reload on error to restore correct state
|
|
170
176
|
await loadUsers();
|
|
171
177
|
throw error;
|
|
@@ -307,12 +313,12 @@
|
|
|
307
313
|
{currentPage}
|
|
308
314
|
{pageSize}
|
|
309
315
|
{totalUsers}
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
+
onpagechange={handlePageChange}
|
|
317
|
+
onpagesizechange={handlePageSizeChange}
|
|
318
|
+
onsort={handleSort}
|
|
319
|
+
onview={openViewModal}
|
|
320
|
+
onedit={openEditModal}
|
|
321
|
+
ondelete={handleDeleteUser}
|
|
316
322
|
/>
|
|
317
323
|
|
|
318
324
|
<!-- User View Modal -->
|
|
@@ -320,8 +326,8 @@
|
|
|
320
326
|
bind:open={showViewModal}
|
|
321
327
|
bind:user={selectedUser}
|
|
322
328
|
{permissions}
|
|
323
|
-
|
|
324
|
-
|
|
329
|
+
onedit={handleEditFromView}
|
|
330
|
+
onclose={handleModalClose}
|
|
325
331
|
/>
|
|
326
332
|
|
|
327
333
|
<!-- User Edit/Create Modal -->
|
|
@@ -331,7 +337,7 @@
|
|
|
331
337
|
{roles}
|
|
332
338
|
{adapter}
|
|
333
339
|
{loadingPermissions}
|
|
334
|
-
|
|
335
|
-
|
|
340
|
+
onsave={handleUserSave}
|
|
341
|
+
onclose={handleModalClose}
|
|
336
342
|
/>
|
|
337
343
|
</div>
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
roles = [],
|
|
19
19
|
adapter,
|
|
20
20
|
loadingPermissions = false,
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
onsave,
|
|
22
|
+
onclose,
|
|
23
23
|
class: className
|
|
24
24
|
}: UserModalProps = $props();
|
|
25
25
|
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
formErrors = {};
|
|
143
143
|
saving = false;
|
|
144
144
|
tokenVerification = null;
|
|
145
|
-
if (
|
|
145
|
+
if (onclose) onclose();
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
async function handleSubmit(event: SubmitEvent) {
|
|
@@ -166,8 +166,7 @@
|
|
|
166
166
|
|
|
167
167
|
try {
|
|
168
168
|
saving = true;
|
|
169
|
-
const
|
|
170
|
-
id: user?.id || '',
|
|
169
|
+
const commonFields = {
|
|
171
170
|
first_name: formData.first_name,
|
|
172
171
|
last_name: formData.last_name,
|
|
173
172
|
email_addresses: formData.email_addresses,
|
|
@@ -176,7 +175,11 @@
|
|
|
176
175
|
permissions: formData.permissions
|
|
177
176
|
};
|
|
178
177
|
|
|
179
|
-
|
|
178
|
+
if (mode === 'edit' && user?.id) {
|
|
179
|
+
await onsave({ mode: 'edit', user: { id: user.id, ...commonFields } });
|
|
180
|
+
} else {
|
|
181
|
+
await onsave({ mode: 'create', user: commonFields });
|
|
182
|
+
}
|
|
180
183
|
handleClose();
|
|
181
184
|
} catch (error) {
|
|
182
185
|
console.error('[UserModal] Error saving user:', error);
|
|
@@ -650,7 +653,7 @@
|
|
|
650
653
|
color="primary"
|
|
651
654
|
onclick={() => formElement?.requestSubmit()}
|
|
652
655
|
disabled={saving}
|
|
653
|
-
|
|
656
|
+
loading={saving}
|
|
654
657
|
data-testid="save-user-button"
|
|
655
658
|
>
|
|
656
659
|
{mode === 'create' ? 'Create User' : 'Save Changes'}
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
currentPage = 1,
|
|
16
16
|
pageSize = 10,
|
|
17
17
|
totalUsers = 0,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
onpagechange,
|
|
19
|
+
onpagesizechange,
|
|
20
|
+
onsort,
|
|
21
|
+
onview,
|
|
22
|
+
onedit,
|
|
23
|
+
ondelete,
|
|
24
24
|
class: className = ''
|
|
25
25
|
}: UserTableProps = $props();
|
|
26
26
|
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
|
|
39
39
|
// Handle table sort
|
|
40
40
|
function handleTableSort(state: { column: string | null; direction: 'asc' | 'desc' | null }) {
|
|
41
|
-
if (
|
|
42
|
-
|
|
41
|
+
if (onsort && state.column && state.direction) {
|
|
42
|
+
onsort(state);
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -174,9 +174,9 @@
|
|
|
174
174
|
|
|
175
175
|
{#snippet ActionsCell(user: User)}
|
|
176
176
|
<div class="flex items-center justify-end space-x-1">
|
|
177
|
-
{#if
|
|
177
|
+
{#if onview}
|
|
178
178
|
<button
|
|
179
|
-
onclick={() =>
|
|
179
|
+
onclick={() => onview(user)}
|
|
180
180
|
class="inline-flex rounded p-1 text-blue-600 transition-colors hover:bg-blue-50 hover:text-blue-900"
|
|
181
181
|
title="View User"
|
|
182
182
|
aria-label="View User"
|
|
@@ -184,9 +184,9 @@
|
|
|
184
184
|
{@render EyeIcon()}
|
|
185
185
|
</button>
|
|
186
186
|
{/if}
|
|
187
|
-
{#if
|
|
187
|
+
{#if onedit}
|
|
188
188
|
<button
|
|
189
|
-
onclick={() =>
|
|
189
|
+
onclick={() => onedit(user)}
|
|
190
190
|
class="inline-flex rounded p-1 text-green-600 transition-colors hover:bg-green-50 hover:text-green-900"
|
|
191
191
|
title="Edit User"
|
|
192
192
|
aria-label="Edit User"
|
|
@@ -194,9 +194,9 @@
|
|
|
194
194
|
{@render EditIcon()}
|
|
195
195
|
</button>
|
|
196
196
|
{/if}
|
|
197
|
-
{#if
|
|
197
|
+
{#if ondelete}
|
|
198
198
|
<button
|
|
199
|
-
onclick={() =>
|
|
199
|
+
onclick={() => ondelete(user.id)}
|
|
200
200
|
class="text-danger-600 hover:bg-danger-50 hover:text-danger-900 inline-flex rounded p-1 transition-colors"
|
|
201
201
|
title="Delete User"
|
|
202
202
|
aria-label="Delete User"
|
|
@@ -215,12 +215,11 @@
|
|
|
215
215
|
totalItems={totalUsers}
|
|
216
216
|
{loading}
|
|
217
217
|
pagination={true}
|
|
218
|
-
showPagination={true}
|
|
219
218
|
showPageSize={true}
|
|
220
219
|
pageSizeOptions={[10, 25, 50, 100]}
|
|
221
220
|
paginationTemplate="full"
|
|
222
|
-
onpagechange
|
|
223
|
-
onpagesizechange
|
|
221
|
+
{onpagechange}
|
|
222
|
+
{onpagesizechange}
|
|
224
223
|
onsort={handleTableSort}
|
|
225
224
|
paginationPosition="bottom"
|
|
226
225
|
paginationClass="whitespace-nowrap flex-wrap gap-3 justify-between items-center"
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
open = $bindable(),
|
|
7
7
|
user = $bindable(),
|
|
8
8
|
roles = [],
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
onedit,
|
|
10
|
+
onregenerateapikey,
|
|
11
|
+
onclose,
|
|
12
12
|
class: className
|
|
13
13
|
}: UserViewModalProps = $props();
|
|
14
14
|
|
|
@@ -20,12 +20,12 @@
|
|
|
20
20
|
function handleClose() {
|
|
21
21
|
open = false;
|
|
22
22
|
showApiKey = false;
|
|
23
|
-
if (
|
|
23
|
+
if (onclose) onclose();
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
function handleEdit() {
|
|
27
|
-
if (
|
|
28
|
-
|
|
27
|
+
if (onedit && user) {
|
|
28
|
+
onedit(user);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -47,12 +47,12 @@
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
async function handleRegenerateApiKey() {
|
|
50
|
-
if (!user?.id || !
|
|
50
|
+
if (!user?.id || !onregenerateapikey) return;
|
|
51
51
|
|
|
52
52
|
try {
|
|
53
53
|
regeneratingApiKey = true;
|
|
54
54
|
apiKeyError = null;
|
|
55
|
-
await
|
|
55
|
+
await onregenerateapikey(user.id);
|
|
56
56
|
} catch (error) {
|
|
57
57
|
console.error('Error regenerating API key:', error);
|
|
58
58
|
apiKeyError = error instanceof Error ? error.message : 'Failed to regenerate API key';
|
|
@@ -125,11 +125,11 @@
|
|
|
125
125
|
</div>
|
|
126
126
|
|
|
127
127
|
<!-- Mako API Key -->
|
|
128
|
-
{#if apiKey ||
|
|
128
|
+
{#if apiKey || onregenerateapikey}
|
|
129
129
|
<div>
|
|
130
130
|
<div class="mb-2 flex items-center justify-between">
|
|
131
131
|
<p class="text-default-700 text-sm font-medium">Mako API Key</p>
|
|
132
|
-
{#if
|
|
132
|
+
{#if onregenerateapikey}
|
|
133
133
|
<button
|
|
134
134
|
type="button"
|
|
135
135
|
onclick={handleRegenerateApiKey}
|
|
@@ -283,7 +283,7 @@
|
|
|
283
283
|
<div></div>
|
|
284
284
|
<div class="flex gap-3">
|
|
285
285
|
<Button variant="outline" onclick={handleClose}>Close</Button>
|
|
286
|
-
{#if
|
|
286
|
+
{#if onedit}
|
|
287
287
|
<Button color="primary" onclick={handleEdit}>
|
|
288
288
|
<svg class="h-4 w-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
289
289
|
<path
|