@svadmin/ui 0.73.0 → 0.75.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 +53 -28
- package/dist/app.css +3733 -4119
- package/dist/app.theme.css +3733 -4119
- package/dist/component-registry.d.ts +14977 -0
- package/dist/component-registry.js +216 -0
- package/dist/components/AboutSettings.svelte +7 -1
- package/dist/components/AboutSettings.svelte.d.ts +4 -1
- package/dist/components/ActivityFeed.svelte +9 -3
- package/dist/components/ActivityFeed.svelte.d.ts +3 -0
- package/dist/components/AdminApp.svelte +24 -15
- package/dist/components/AdminApp.svelte.d.ts +6 -0
- package/dist/components/ApiSettings.svelte +41 -5
- package/dist/components/ApprovalCenter.svelte +283 -0
- package/dist/components/ApprovalCenter.svelte.d.ts +10 -0
- package/dist/components/AuditLogViewer.svelte +3 -1
- package/dist/components/AutoForm.svelte +33 -3
- package/dist/components/AutoForm.svelte.d.ts +1 -0
- package/dist/components/AutoTable.svelte +610 -47
- package/dist/components/AutoTable.svelte.d.ts +17 -1
- package/dist/components/BoundRecordDetailDrawer.svelte +9 -0
- package/dist/components/BoundRecordDetailDrawer.svelte.d.ts +2 -0
- package/dist/components/Breadcrumbs.svelte +11 -1
- package/dist/components/CancelTaskButton.svelte +12 -42
- package/dist/components/ColorPicker.svelte +73 -0
- package/dist/components/ColorPicker.svelte.d.ts +15 -0
- package/dist/components/ComboboxField.svelte +114 -27
- package/dist/components/ComboboxField.svelte.d.ts +1 -0
- package/dist/components/DashboardView.svelte +99 -0
- package/dist/components/DashboardView.svelte.d.ts +14 -0
- package/dist/components/DatePicker.svelte +10 -0
- package/dist/components/DatePicker.svelte.d.ts +6 -0
- package/dist/components/DateRangeInput.svelte +85 -5
- package/dist/components/DateRangeInput.svelte.d.ts +10 -0
- package/dist/components/DateRangePicker.svelte +10 -0
- package/dist/components/DateRangePicker.svelte.d.ts +6 -0
- package/dist/components/DateTimeInput.svelte +85 -16
- package/dist/components/DateTimeInput.svelte.d.ts +19 -11
- package/dist/components/DateTimePicker.svelte +10 -0
- package/dist/components/DateTimePicker.svelte.d.ts +6 -0
- package/dist/components/DevTools.svelte +34 -26
- package/dist/components/DevframePanel.svelte +123 -0
- package/dist/components/DevframePanel.svelte.d.ts +3 -0
- package/dist/components/ErrorSummary.svelte +52 -0
- package/dist/components/ErrorSummary.svelte.d.ts +14 -0
- package/dist/components/FieldRenderer.svelte +82 -81
- package/dist/components/FileUpload.svelte +214 -52
- package/dist/components/FileUpload.svelte.d.ts +11 -0
- package/dist/components/FilterBuilder.svelte +88 -66
- package/dist/components/FilterCollectionInput.svelte +80 -0
- package/dist/components/FilterCollectionInput.svelte.d.ts +10 -0
- package/dist/components/GanttChart.svelte +66 -14
- package/dist/components/GanttChart.svelte.d.ts +6 -0
- package/dist/components/Header.svelte +18 -2
- package/dist/components/ImportWizard.svelte +339 -17
- package/dist/components/ImportWizard.svelte.d.ts +11 -0
- package/dist/components/JsonSchemaForm.svelte +120 -52
- package/dist/components/JsonSchemaForm.svelte.d.ts +7 -1
- package/dist/components/KanbanBoard.svelte +195 -40
- package/dist/components/KanbanBoard.svelte.d.ts +9 -2
- package/dist/components/Layout.svelte +4 -2
- package/dist/components/LazyAutoForm.svelte +28 -0
- package/dist/components/LazyAutoForm.svelte.d.ts +8 -0
- package/dist/components/LazyAutoTable.svelte +28 -0
- package/dist/components/LazyAutoTable.svelte.d.ts +8 -0
- package/dist/components/LazyPage.svelte +3 -3
- package/dist/components/LazyPage.svelte.d.ts +2 -2
- package/dist/components/LazySettingsPage.svelte +28 -0
- package/dist/components/LazySettingsPage.svelte.d.ts +8 -0
- package/dist/components/LazyShowPage.svelte +28 -0
- package/dist/components/LazyShowPage.svelte.d.ts +8 -0
- package/dist/components/ListPage.svelte +5 -1
- package/dist/components/ListPage.svelte.d.ts +3 -0
- package/dist/components/LoginPage.svelte +1 -1
- package/dist/components/MultiTabKeepAlive.svelte +11 -6
- package/dist/components/NotificationsSettings.svelte +69 -2
- package/dist/components/NotificationsSettings.svelte.d.ts +25 -1
- package/dist/components/PasswordInput.svelte +3 -3
- package/dist/components/PasswordInput.svelte.d.ts +2 -1
- package/dist/components/PermissionMatrix.svelte +20 -1
- package/dist/components/PivotExportButton.svelte +157 -0
- package/dist/components/PivotExportButton.svelte.d.ts +16 -0
- package/dist/components/PivotTable.svelte +229 -74
- package/dist/components/PivotTable.svelte.d.ts +19 -2
- package/dist/components/RadioGroup.svelte +121 -0
- package/dist/components/RadioGroup.svelte.d.ts +43 -0
- package/dist/components/RangeSlider.svelte +127 -0
- package/dist/components/RangeSlider.svelte.d.ts +22 -0
- package/dist/components/Rate.svelte +121 -0
- package/dist/components/Rate.svelte.d.ts +16 -0
- package/dist/components/RecordDetailDrawer.svelte +4 -2
- package/dist/components/RecordDetailDrawer.svelte.d.ts +2 -0
- package/dist/components/RelationPicker.svelte +341 -0
- package/dist/components/RelationPicker.svelte.d.ts +26 -0
- package/dist/components/ResourceOperationsPage.svelte +23 -19
- package/dist/components/ResourceOperationsPage.svelte.d.ts +2 -2
- package/dist/components/RetryTaskButton.svelte +12 -42
- package/dist/components/SecuritySettings.svelte +29 -5
- package/dist/components/SegmentedControl.svelte +145 -0
- package/dist/components/SegmentedControl.svelte.d.ts +38 -0
- package/dist/components/SettingsPage.svelte +3 -1
- package/dist/components/SettingsPage.svelte.d.ts +1 -0
- package/dist/components/ShowPage.svelte +18 -3
- package/dist/components/ShowPage.svelte.d.ts +3 -0
- package/dist/components/Sidebar.svelte +2 -2
- package/dist/components/Slider.svelte +100 -0
- package/dist/components/Slider.svelte.d.ts +19 -0
- package/dist/components/SpreadsheetView.svelte +1213 -95
- package/dist/components/SpreadsheetView.svelte.d.ts +19 -0
- package/dist/components/TagsInput.svelte +178 -0
- package/dist/components/TagsInput.svelte.d.ts +17 -0
- package/dist/components/TimePicker.svelte +10 -0
- package/dist/components/TimePicker.svelte.d.ts +6 -0
- package/dist/components/TooltipButton.svelte +3 -4
- package/dist/components/TreeSelect.svelte +267 -53
- package/dist/components/TreeSelect.svelte.d.ts +3 -0
- package/dist/components/TreeTable.svelte +484 -82
- package/dist/components/TreeTable.svelte.d.ts +24 -1
- package/dist/components/TwoFactorAuthPage.svelte +85 -48
- package/dist/components/TwoFactorAuthPage.svelte.d.ts +12 -1
- package/dist/components/VirtualTable.svelte +116 -20
- package/dist/components/VirtualTable.svelte.d.ts +5 -0
- package/dist/components/account/CompanyProfilePage.svelte +74 -38
- package/dist/components/account/GetStartedPage.svelte +2 -1
- package/dist/components/account/ImportMembersPage.svelte +22 -167
- package/dist/components/account/ImportMembersPage.svelte.d.ts +4 -1
- package/dist/components/account/MemberDirectory.svelte +156 -0
- package/dist/components/account/MemberDirectory.svelte.d.ts +19 -0
- package/dist/components/account/MembersStarterPage.svelte +9 -55
- package/dist/components/account/MembersStarterPage.svelte.d.ts +5 -1
- package/dist/components/account/SecurityLogPage.svelte +4 -1
- package/dist/components/account/SettingsPlainPage.svelte +7 -38
- package/dist/components/account/SettingsPlainPage.svelte.d.ts +4 -1
- package/dist/components/account/SettingsSidebarPage.svelte +7 -20
- package/dist/components/account/TeamMembersPage.svelte +4 -20
- package/dist/components/account/TeamMembersPage.svelte.d.ts +5 -1
- package/dist/components/account/UserProfilePage.svelte +3 -25
- package/dist/components/account/UserProfilePage.svelte.d.ts +17 -2
- package/dist/components/buttons/ExportButton.svelte +56 -12
- package/dist/components/buttons/ExportButton.svelte.d.ts +11 -0
- package/dist/components/content/ContentPageHeader.svelte +1 -1
- package/dist/components/content/ContentPageShell.svelte +1 -1
- package/dist/components/content/MetricBlock.svelte +1 -1
- package/dist/components/content/PageToolbar.svelte +1 -1
- package/dist/components/content/ReferenceNotice.svelte +5 -0
- package/dist/components/content/ReferenceNotice.svelte.d.ts +18 -0
- package/dist/components/content/SectionHeader.svelte +1 -1
- package/dist/components/content/SettingsFieldRow.svelte +1 -1
- package/dist/components/content/SettingsGroup.svelte +1 -1
- package/dist/components/content/StatusBadge.svelte +1 -1
- package/dist/components/content/WorkspaceLayout.svelte +1 -1
- package/dist/components/export-reference.d.ts +2 -0
- package/dist/components/export-reference.js +9 -0
- package/dist/components/fieldComponentMap.js +2 -5
- package/dist/components/fields/DateField.svelte +12 -13
- package/dist/components/fields/MarkdownField.svelte +14 -5
- package/dist/components/fields/date-display.d.ts +6 -0
- package/dist/components/fields/date-display.js +24 -0
- package/dist/components/network/TeamCrewTablePage.svelte +6 -1
- package/dist/components/network/UserCardsNFTPage.svelte +2 -0
- package/dist/components/profile/PublicProfilePage.svelte +2 -0
- package/dist/components/saved-list-views.d.ts +74 -1
- package/dist/components/saved-list-views.js +191 -3
- package/dist/components/table-contract.d.ts +12 -1
- package/dist/components/task-action.svelte.d.ts +13 -0
- package/dist/components/task-action.svelte.js +73 -0
- package/dist/components/ui/DesignSystemShowcase.svelte +164 -0
- package/dist/components/ui/DesignSystemShowcase.svelte.d.ts +3 -0
- package/dist/components/ui/badge/badge-variants.d.ts +3 -2
- package/dist/components/ui/badge/badge-variants.js +2 -3
- package/dist/components/ui/badge/badge.svelte +3 -0
- package/dist/components/ui/badge/badge.svelte.d.ts +1 -0
- package/dist/components/ui/button/button-variants.d.ts +5 -4
- package/dist/components/ui/button/button-variants.js +7 -5
- package/dist/components/ui/checkbox/checkbox.svelte +5 -1
- package/dist/components/ui/checkbox/checkbox.svelte.d.ts +5 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +1 -2
- package/dist/components/ui/input/input.svelte +7 -2
- package/dist/components/ui/input/input.svelte.d.ts +4 -1
- package/dist/components/ui/select/select.svelte +4 -1
- package/dist/components/ui/select/select.svelte.d.ts +2 -1
- package/dist/components/ui/textarea/textarea.svelte +2 -2
- package/dist/components.css +33 -2
- package/dist/date-input-policy.d.ts +4 -0
- package/dist/date-input-policy.js +35 -0
- package/dist/design-system-components.d.ts +100 -0
- package/dist/design-system-components.js +101 -0
- package/dist/design-system.js +1 -1
- package/dist/devtools-bridge.d.ts +80 -0
- package/dist/devtools-bridge.js +92 -0
- package/dist/editor-config.svelte.d.ts +4 -2
- package/dist/index.d.ts +37 -2
- package/dist/index.js +23 -2
- package/dist/recipes.d.ts +960 -4
- package/dist/recipes.js +264 -4
- package/dist/tree-table-model.d.ts +24 -0
- package/dist/tree-table-model.js +111 -0
- package/dist/types.d.ts +4 -4
- package/package.json +22 -10
- package/dist/styled-system/css/conditions.js +0 -36
- package/dist/styled-system/css/css.d.ts +0 -22
- package/dist/styled-system/css/css.js +0 -45
- package/dist/styled-system/css/cva.d.ts +0 -6
- package/dist/styled-system/css/cva.js +0 -87
- package/dist/styled-system/css/cx.d.ts +0 -5
- package/dist/styled-system/css/cx.js +0 -15
- package/dist/styled-system/css/index.d.ts +0 -5
- package/dist/styled-system/css/index.js +0 -4
- package/dist/styled-system/css/sva.d.ts +0 -4
- package/dist/styled-system/css/sva.js +0 -46
- package/dist/styled-system/helpers.js +0 -316
- package/dist/styled-system/patterns/aspect-ratio.d.ts +0 -20
- package/dist/styled-system/patterns/aspect-ratio.js +0 -38
- package/dist/styled-system/patterns/bleed.d.ts +0 -21
- package/dist/styled-system/patterns/bleed.js +0 -24
- package/dist/styled-system/patterns/box.d.ts +0 -20
- package/dist/styled-system/patterns/box.js +0 -15
- package/dist/styled-system/patterns/center.d.ts +0 -20
- package/dist/styled-system/patterns/center.js +0 -21
- package/dist/styled-system/patterns/circle.d.ts +0 -20
- package/dist/styled-system/patterns/circle.js +0 -25
- package/dist/styled-system/patterns/container.d.ts +0 -20
- package/dist/styled-system/patterns/container.js +0 -21
- package/dist/styled-system/patterns/cq.d.ts +0 -21
- package/dist/styled-system/patterns/cq.js +0 -21
- package/dist/styled-system/patterns/divider.d.ts +0 -22
- package/dist/styled-system/patterns/divider.js +0 -25
- package/dist/styled-system/patterns/flex.d.ts +0 -26
- package/dist/styled-system/patterns/flex.js +0 -26
- package/dist/styled-system/patterns/float.d.ts +0 -23
- package/dist/styled-system/patterns/float.js +0 -52
- package/dist/styled-system/patterns/grid-item.d.ts +0 -25
- package/dist/styled-system/patterns/grid-item.js +0 -25
- package/dist/styled-system/patterns/grid.d.ts +0 -24
- package/dist/styled-system/patterns/grid.js +0 -27
- package/dist/styled-system/patterns/hstack.d.ts +0 -21
- package/dist/styled-system/patterns/hstack.js +0 -24
- package/dist/styled-system/patterns/index.d.ts +0 -21
- package/dist/styled-system/patterns/index.js +0 -20
- package/dist/styled-system/patterns/link-overlay.d.ts +0 -20
- package/dist/styled-system/patterns/link-overlay.js +0 -24
- package/dist/styled-system/patterns/spacer.d.ts +0 -20
- package/dist/styled-system/patterns/spacer.js +0 -25
- package/dist/styled-system/patterns/square.d.ts +0 -20
- package/dist/styled-system/patterns/square.js +0 -24
- package/dist/styled-system/patterns/stack.d.ts +0 -23
- package/dist/styled-system/patterns/stack.js +0 -24
- package/dist/styled-system/patterns/visually-hidden.d.ts +0 -20
- package/dist/styled-system/patterns/visually-hidden.js +0 -18
- package/dist/styled-system/patterns/vstack.d.ts +0 -21
- package/dist/styled-system/patterns/vstack.js +0 -24
- package/dist/styled-system/patterns/wrap.d.ts +0 -24
- package/dist/styled-system/patterns/wrap.js +0 -25
- package/dist/styled-system/recipes/content-header.d.ts +0 -31
- package/dist/styled-system/recipes/content-header.js +0 -65
- package/dist/styled-system/recipes/content-page.d.ts +0 -34
- package/dist/styled-system/recipes/content-page.js +0 -43
- package/dist/styled-system/recipes/create-recipe.js +0 -82
- package/dist/styled-system/recipes/index.d.ts +0 -17
- package/dist/styled-system/recipes/index.js +0 -16
- package/dist/styled-system/recipes/metric-block.d.ts +0 -34
- package/dist/styled-system/recipes/metric-block.js +0 -76
- package/dist/styled-system/recipes/product-list.d.ts +0 -31
- package/dist/styled-system/recipes/product-list.js +0 -73
- package/dist/styled-system/recipes/product-section.d.ts +0 -31
- package/dist/styled-system/recipes/product-section.js +0 -49
- package/dist/styled-system/recipes/product-settings-row.d.ts +0 -34
- package/dist/styled-system/recipes/product-settings-row.js +0 -58
- package/dist/styled-system/recipes/product-settings.d.ts +0 -31
- package/dist/styled-system/recipes/product-settings.js +0 -57
- package/dist/styled-system/recipes/product-status.d.ts +0 -34
- package/dist/styled-system/recipes/product-status.js +0 -45
- package/dist/styled-system/recipes/product-toolbar.d.ts +0 -31
- package/dist/styled-system/recipes/product-toolbar.js +0 -41
- package/dist/styled-system/recipes/product-workspace.d.ts +0 -34
- package/dist/styled-system/recipes/product-workspace.js +0 -58
- package/dist/styled-system/recipes/surface-metric.d.ts +0 -38
- package/dist/styled-system/recipes/surface-metric.js +0 -63
- package/dist/styled-system/recipes/surface-table.d.ts +0 -34
- package/dist/styled-system/recipes/surface-table.js +0 -62
- package/dist/styled-system/recipes/ui-badge.d.ts +0 -31
- package/dist/styled-system/recipes/ui-badge.js +0 -38
- package/dist/styled-system/recipes/ui-button.d.ts +0 -32
- package/dist/styled-system/recipes/ui-button.js +0 -43
- package/dist/styled-system/recipes/ui-input.d.ts +0 -31
- package/dist/styled-system/recipes/ui-input.js +0 -49
- package/dist/styled-system/recipes/ui-textarea.d.ts +0 -31
- package/dist/styled-system/recipes/ui-textarea.js +0 -24
- package/dist/styled-system/styles.css +0 -1257
- package/dist/styled-system/tokens/index.d.ts +0 -9
- package/dist/styled-system/tokens/index.js +0 -268
- package/dist/styled-system/tokens/tokens.d.ts +0 -36
- package/dist/styled-system/types/composition.d.ts +0 -227
- package/dist/styled-system/types/conditions.d.ts +0 -236
- package/dist/styled-system/types/csstype.d.ts +0 -22570
- package/dist/styled-system/types/index.d.ts +0 -6
- package/dist/styled-system/types/parts.d.ts +0 -8
- package/dist/styled-system/types/pattern.d.ts +0 -78
- package/dist/styled-system/types/prop-type.d.ts +0 -223
- package/dist/styled-system/types/recipe.d.ts +0 -181
- package/dist/styled-system/types/selectors.d.ts +0 -59
- package/dist/styled-system/types/static-css.d.ts +0 -56
- package/dist/styled-system/types/style-props.d.ts +0 -8088
- package/dist/styled-system/types/system-types.d.ts +0 -151
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
|
-
import
|
|
4
|
-
import { Button } from '../ui/button/index.js';
|
|
5
|
-
import { Input } from '../ui/input/index.js';
|
|
6
|
-
import { Label } from '../ui/label/index.js';
|
|
7
|
-
import * as Card from '../ui/card/index.js';
|
|
3
|
+
import MemberDirectory, { type MemberDirectoryProvider } from './MemberDirectory.svelte';
|
|
8
4
|
import ContentPageShell from '../content/ContentPageShell.svelte';
|
|
9
5
|
import ContentPageHeader from '../content/ContentPageHeader.svelte';
|
|
10
|
-
|
|
11
|
-
import MemberList from '../content/MemberList.svelte';
|
|
12
|
-
import type { MemberSummary } from '../content/MemberList.svelte';
|
|
13
|
-
import { referenceDemoData } from '../../reference-data.js';
|
|
6
|
+
let { memberProvider }: { memberProvider?: MemberDirectoryProvider } = $props();
|
|
14
7
|
const i18n = useTranslation();
|
|
15
|
-
let query = $state('');
|
|
16
|
-
let inviteEmail = $state('');
|
|
17
|
-
let inviteStatus = $state('');
|
|
18
|
-
let members = $state<MemberSummary[]>(referenceDemoData.members.map((member) => ({ ...member, status: member.status === 'active' ? 'success' : member.status === 'invited' ? 'warning' : 'neutral' })));
|
|
19
|
-
const filtered = $derived(query ? members.filter((member) => `${member.name} ${member.email} ${member.department}`.toLowerCase().includes(query.toLowerCase())) : members);
|
|
20
|
-
function sendInvite() { const email = inviteEmail.trim(); if (!email) return; members = [...members, { id: `invite-${Date.now()}`, name: email.replace(/@.*$/, ''), email, role: 'Viewer', department: 'Pending assignment', status: 'warning' }]; inviteStatus = email; inviteEmail = ''; }
|
|
21
8
|
</script>
|
|
22
|
-
|
|
23
9
|
<ContentPageShell pageId="account-team-members" width="wide">
|
|
24
|
-
<
|
|
25
|
-
<
|
|
26
|
-
<div class="svadmin-u-f3c543ad5fe9 svadmin-u-0c3bc98565dd svadmin-u-2f27a80ed92b"><Card.Card><Card.CardContent class="svadmin-u-6ed543e2fbbb svadmin-u-c07e54fd1439"><div><h2 class="svadmin-u-fc7473ca09eb svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('account.invitePeople')}</h2><p class="svadmin-u-b6b02c0ebef6 svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">{i18n.t('account.invitePeopleDescription')}</p></div><div class="svadmin-u-60fbb7713999 svadmin-u-8dddea0773ed svadmin-u-77a2a20e90d4 svadmin-u-020ba687fa12"><div class="svadmin-u-7e0b7cdf1a94 svadmin-u-36e579c0b41c svadmin-u-6f7e013d6499"><Label for="invite-email">Email</Label><Input id="invite-email" bind:value={inviteEmail} type="email" placeholder="name@example.com" /></div><Button class="svadmin-u-c7d50d5fc0c3" size="sm" disabled={!inviteEmail} onclick={sendInvite}><Send class="svadmin-u-783b0d9d1e2c" />{i18n.t('account.sendInvite')}</Button></div>{#if inviteStatus}<p class="svadmin-u-359090c2d529 svadmin-u-76747e5e02ff" role="status">{i18n.t('account.invited')}: {inviteStatus}</p>{/if}</Card.CardContent></Card.Card><Card.Card><Card.CardContent class="svadmin-u-6ed543e2fbbb svadmin-u-c07e54fd1439"><div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-77a2a20e90d4"><Link2 class="svadmin-u-f7b5fa971871 svadmin-u-bfa603190748" /><h2 class="svadmin-u-fc7473ca09eb svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('account.inviteWithLink')}</h2></div><p class="svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">{i18n.t('account.inviteLinkHint')}</p><div class="svadmin-u-60fbb7713999 svadmin-u-77a2a20e90d4"><Input readonly value="https://acme.com/invite/xK7fQ2" class="svadmin-u-0e65706bcccd svadmin-u-359090c2d529" /><Button variant="outline" size="sm"><Copy class="svadmin-u-783b0d9d1e2c" />{i18n.t('account.copyLink')}</Button></div></Card.CardContent></Card.Card></div>
|
|
27
|
-
<MemberList members={filtered} />
|
|
10
|
+
<ContentPageHeader title={i18n.t('account.teamMembers')} />
|
|
11
|
+
<MemberDirectory provider={memberProvider} />
|
|
28
12
|
</ContentPageShell>
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { type MemberDirectoryProvider } from './MemberDirectory.svelte';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
memberProvider?: MemberDirectoryProvider;
|
|
4
|
+
};
|
|
5
|
+
declare const TeamMembersPage: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
2
6
|
type TeamMembersPage = ReturnType<typeof TeamMembersPage>;
|
|
3
7
|
export default TeamMembersPage;
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import
|
|
3
|
-
import { Loader2 } from '@lucide/svelte';
|
|
4
|
-
import { Button } from '../ui/button/index.js';
|
|
5
|
-
import { Switch } from '../ui/switch/index.js';
|
|
6
|
-
import * as Card from '../ui/card/index.js';
|
|
2
|
+
import ProfilePage from '../ProfilePage.svelte';
|
|
7
3
|
import ContentPageShell from '../content/ContentPageShell.svelte';
|
|
8
|
-
import ContentPageHeader from '../content/ContentPageHeader.svelte';
|
|
9
|
-
import DescriptionList from '../content/DescriptionList.svelte';
|
|
10
|
-
import FileList from '../content/FileList.svelte';
|
|
11
|
-
import IntegrationCard from '../content/IntegrationCard.svelte';
|
|
12
|
-
import WorkspaceLayout from '../content/WorkspaceLayout.svelte';
|
|
13
|
-
import type { IntegrationSummary } from '../content/IntegrationCard.svelte';
|
|
14
|
-
import { referenceDemoData } from '../../reference-data.js';
|
|
15
|
-
const i18n = useTranslation();
|
|
16
|
-
let availableToHire = $state(true);
|
|
17
|
-
let saving = $state(false);
|
|
18
|
-
async function save() { saving = true; await new Promise((resolve) => setTimeout(resolve, 400)); saving = false; }
|
|
19
|
-
let integrations = $state<IntegrationSummary[]>(referenceDemoData.integrations);
|
|
20
|
-
const files = [{ id: '1', name: 'portfolio-2026.pdf', size: '2.1 MB', type: 'PDF' }, { id: '2', name: 'avatar-pack.zip', size: '8.4 MB', type: 'Archive' }, { id: '3', name: 'cover-photo.png', size: '1.2 MB', type: 'Image' }];
|
|
21
|
-
function toggle(id: string) { integrations = integrations.map((item) => item.id === id ? { ...item, connected: !item.connected } : item); }
|
|
22
4
|
</script>
|
|
23
5
|
|
|
24
|
-
<ContentPageShell pageId="account-user-profile" width="
|
|
25
|
-
<
|
|
26
|
-
<WorkspaceLayout secondaryWidth="20rem">
|
|
27
|
-
{#snippet primary()}<div class="svadmin-u-3e7ce58d64fa"><Card.Card><Card.CardContent class="svadmin-u-b43b4c086d9a svadmin-u-c07e54fd1439"><div><h2 class="svadmin-u-fc7473ca09eb svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('account.personalInfo')}</h2><p class="svadmin-u-b6b02c0ebef6 svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">Keep your contact and working details current.</p></div><DescriptionList columns={2} items={[{ label: i18n.t('profile.name'), value: 'Alex Chen' }, { label: i18n.t('account.phone'), value: '+86 138 **** 9527' }, { label: i18n.t('account.dateOfBirth'), value: '1995-04-18' }, { label: i18n.t('account.address'), value: 'Shanghai, CN' }]} /></Card.CardContent></Card.Card><Card.Card><Card.CardContent class="svadmin-u-3e7ce58d64fa svadmin-u-c07e54fd1439"><div class="svadmin-u-60fbb7713999 svadmin-u-3960ffc248d9 svadmin-u-8ef2268efbbc svadmin-u-1004c0c3954c"><div><h2 class="svadmin-u-fc7473ca09eb svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('account.work')}</h2><p class="svadmin-u-b6b02c0ebef6 svadmin-u-fc7473ca09eb svadmin-u-bfa603190748">{i18n.t('account.availableNow')}</p></div><Switch bind:checked={availableToHire} /></div><div class="svadmin-u-60fbb7713999 svadmin-u-1eb5c6df38c1 svadmin-u-58284b4ea568">{#each ['TypeScript', 'Svelte', 'Node.js', 'Design Systems'] as skill (skill)}<span class="svadmin-u-421ac2be5045 svadmin-u-ca6bcd4b6f3f svadmin-u-18049387f0af svadmin-u-d5eab218aa34 svadmin-u-660d2effb880 svadmin-u-359090c2d529 svadmin-u-bfa603190748">{skill}</span>{/each}</div></Card.CardContent></Card.Card><section class="svadmin-u-6ed543e2fbbb"><h2 class="svadmin-u-4ee734926ff6 svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('account.connections')}</h2>{#each integrations as integration (integration.id)}<IntegrationCard {integration} onconnect={() => toggle(integration.id)} />{/each}</section></div>{/snippet}
|
|
28
|
-
{#snippet secondary()}<div class="svadmin-u-3e7ce58d64fa"><Card.Card><Card.CardContent class="svadmin-u-6ed543e2fbbb svadmin-u-c07e54fd1439"><h2 class="svadmin-u-fc7473ca09eb svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('account.myFiles')}</h2><FileList files={files} /></Card.CardContent></Card.Card><Card.Card><Card.CardContent class="svadmin-u-6ed543e2fbbb svadmin-u-c07e54fd1439"><h2 class="svadmin-u-fc7473ca09eb svadmin-u-e83a7042bc91 svadmin-u-d4108abe6359">{i18n.t('account.calendarAccounts')}</h2><DescriptionList items={[{ label: 'Work Calendar', value: 'alex@nebulalabs.io' }, { label: 'Personal Calendar', value: 'alex@example.com' }]} /></Card.CardContent></Card.Card></div>{/snippet}
|
|
29
|
-
</WorkspaceLayout>
|
|
6
|
+
<ContentPageShell pageId="account-user-profile" width="narrow">
|
|
7
|
+
<ProfilePage />
|
|
30
8
|
</ContentPageShell>
|
|
@@ -1,3 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
declare const UserProfilePage: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
}, {}, {}, string>;
|
|
17
|
+
type UserProfilePage = InstanceType<typeof UserProfilePage>;
|
|
3
18
|
export default UserProfilePage;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import { useCan, useTranslation, useExport, useResourceContract } from '@svadmin/core';
|
|
3
|
+
import { useCan, useTranslation, useExport, useResourceContract, type TaskProvider, type ExportFormat, type Filter, type Sort } from '@svadmin/core';
|
|
4
4
|
import { definedReactiveOptions } from '@svadmin/core/options';
|
|
5
5
|
import { Button } from '../ui/button/index.js';
|
|
6
6
|
import { Download } from '@lucide/svelte';
|
|
@@ -14,6 +14,16 @@
|
|
|
14
14
|
children,
|
|
15
15
|
hideText = false,
|
|
16
16
|
accessControl = { enabled: true, hideIfUnauthorized: true },
|
|
17
|
+
taskName,
|
|
18
|
+
taskProvider,
|
|
19
|
+
taskIdempotencyKey,
|
|
20
|
+
initialTaskId,
|
|
21
|
+
onTaskSubmitted,
|
|
22
|
+
filters,
|
|
23
|
+
sorters,
|
|
24
|
+
maxItemCount,
|
|
25
|
+
format = 'csv',
|
|
26
|
+
meta,
|
|
17
27
|
class: className = '',
|
|
18
28
|
} = $props<{
|
|
19
29
|
resource: string;
|
|
@@ -21,15 +31,20 @@
|
|
|
21
31
|
children?: Snippet;
|
|
22
32
|
hideText?: boolean;
|
|
23
33
|
accessControl?: ButtonAccessControl;
|
|
34
|
+
taskName?: string;
|
|
35
|
+
taskProvider?: TaskProvider;
|
|
36
|
+
taskIdempotencyKey?: string;
|
|
37
|
+
initialTaskId?: string;
|
|
38
|
+
onTaskSubmitted?: (taskId: string) => void | Promise<void>;
|
|
39
|
+
filters?: Filter[];
|
|
40
|
+
sorters?: Sort[];
|
|
41
|
+
maxItemCount?: number;
|
|
42
|
+
format?: ExportFormat;
|
|
43
|
+
meta?: Record<string, unknown>;
|
|
24
44
|
class?: string;
|
|
25
45
|
}>();
|
|
26
46
|
|
|
27
47
|
const binding = useResourceContract(() => resource);
|
|
28
|
-
const exporter = useExport(definedReactiveOptions({
|
|
29
|
-
get resource() { return binding.resource; },
|
|
30
|
-
get dataProviderName() { return binding.dataProviderName; },
|
|
31
|
-
get meta() { return binding.meta; },
|
|
32
|
-
}));
|
|
33
48
|
const can = useCan(() => ({
|
|
34
49
|
resource,
|
|
35
50
|
action: 'export',
|
|
@@ -37,11 +52,40 @@
|
|
|
37
52
|
meta: accessControl?.meta,
|
|
38
53
|
queryOptions: { enabled: accessControl?.enabled ?? true }
|
|
39
54
|
}));
|
|
55
|
+
const exporter = useExport(definedReactiveOptions({
|
|
56
|
+
get resource() { return binding.resource; },
|
|
57
|
+
get dataProviderName() { return binding.dataProviderName; },
|
|
58
|
+
get taskName() { return taskName; },
|
|
59
|
+
get taskProvider() { return taskProvider; },
|
|
60
|
+
get taskIdempotencyKey() { return taskIdempotencyKey; },
|
|
61
|
+
get initialTaskId() { return initialTaskId; },
|
|
62
|
+
get onTaskSubmitted() { return onTaskSubmitted; },
|
|
63
|
+
get filters() { return filters; },
|
|
64
|
+
get sorters() { return sorters; },
|
|
65
|
+
get maxItemCount() { return maxItemCount; },
|
|
66
|
+
get format() { return format; },
|
|
67
|
+
get meta() { return meta ?? binding.meta; },
|
|
68
|
+
get enabled() { return can.allowed; },
|
|
69
|
+
}));
|
|
40
70
|
const hidden = $derived(accessControl?.hideIfUnauthorized && !can.allowed);
|
|
41
|
-
const
|
|
71
|
+
const taskDownloadReady = $derived(exporter.artifact !== undefined);
|
|
72
|
+
const busy = $derived(exporter.isLoading || (exporter.isTaskPending && !exporter.taskError));
|
|
73
|
+
const displayText = $derived(taskDownloadReady ? i18n.t('common.download')
|
|
74
|
+
: exporter.taskError ? i18n.t('common.retry')
|
|
75
|
+
: exporter.taskId && exporter.error ? i18n.t('common.error')
|
|
76
|
+
: exporter.taskId && !exporter.isTaskPending ? i18n.t('task.status.cancelled')
|
|
77
|
+
: busy ? i18n.t('common.processing') : label ?? i18n.t('common.export'));
|
|
42
78
|
|
|
43
79
|
async function exportRecords() {
|
|
44
|
-
if (!can.allowed ||
|
|
80
|
+
if (!can.allowed || busy) return;
|
|
81
|
+
if (exporter.taskError) {
|
|
82
|
+
try { await exporter.refetchTask(); } catch { /* 查询错误由 hook 暴露。 */ }
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (taskDownloadReady) {
|
|
86
|
+
exporter.downloadTask();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
45
89
|
try { await exporter.triggerExport(); }
|
|
46
90
|
catch {
|
|
47
91
|
// The hook exposes a sanitized error; stale-scope cancellations remain silent.
|
|
@@ -55,14 +99,14 @@
|
|
|
55
99
|
size={hideText ? 'icon' : 'sm'}
|
|
56
100
|
class={className}
|
|
57
101
|
aria-label={hideText ? displayText : undefined}
|
|
58
|
-
disabled={
|
|
59
|
-
aria-busy={
|
|
102
|
+
disabled={busy || !can.allowed || (!!exporter.taskId && !taskDownloadReady && !exporter.taskError)}
|
|
103
|
+
aria-busy={busy}
|
|
60
104
|
onclick={exportRecords}
|
|
61
105
|
>
|
|
62
106
|
<Download class="svadmin-u-11e59c6d5f6b svadmin-u-dc7972ebf3f3" />
|
|
63
107
|
{#if !hideText}
|
|
64
108
|
<span class="svadmin-u-f58b02572ab2">
|
|
65
|
-
{#if children}
|
|
109
|
+
{#if children && !taskName}
|
|
66
110
|
{@render children()}
|
|
67
111
|
{:else}
|
|
68
112
|
{displayText}
|
|
@@ -70,7 +114,7 @@
|
|
|
70
114
|
</span>
|
|
71
115
|
{/if}
|
|
72
116
|
</Button>
|
|
73
|
-
{#if exporter.error}
|
|
117
|
+
{#if exporter.error || exporter.taskError}
|
|
74
118
|
<p role="alert">{i18n.t('common.error')}</p>
|
|
75
119
|
{/if}
|
|
76
120
|
{/if}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type TaskProvider, type ExportFormat, type Filter, type Sort } from '@svadmin/core';
|
|
2
3
|
import type { ButtonAccessControl } from './access-control';
|
|
3
4
|
type $$ComponentProps = {
|
|
4
5
|
resource: string;
|
|
@@ -6,6 +7,16 @@ type $$ComponentProps = {
|
|
|
6
7
|
children?: Snippet;
|
|
7
8
|
hideText?: boolean;
|
|
8
9
|
accessControl?: ButtonAccessControl;
|
|
10
|
+
taskName?: string;
|
|
11
|
+
taskProvider?: TaskProvider;
|
|
12
|
+
taskIdempotencyKey?: string;
|
|
13
|
+
initialTaskId?: string;
|
|
14
|
+
onTaskSubmitted?: (taskId: string) => void | Promise<void>;
|
|
15
|
+
filters?: Filter[];
|
|
16
|
+
sorters?: Sort[];
|
|
17
|
+
maxItemCount?: number;
|
|
18
|
+
format?: ExportFormat;
|
|
19
|
+
meta?: Record<string, unknown>;
|
|
9
20
|
class?: string;
|
|
10
21
|
};
|
|
11
22
|
declare const ExportButton: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { definedOptions } from '@svadmin/core/options';
|
|
3
3
|
import type { Snippet } from 'svelte';
|
|
4
|
-
import { contentPage } from '../../
|
|
4
|
+
import { contentPageRecipe as contentPage } from '../../recipes.js';
|
|
5
5
|
import ContentPageHeader from './ContentPageHeader.svelte';
|
|
6
6
|
|
|
7
7
|
interface Props {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import { metricBlock } from '../../
|
|
3
|
+
import { metricBlockRecipe as metricBlock } from '../../recipes.js';
|
|
4
4
|
import { Skeleton } from '../ui/skeleton/index.js';
|
|
5
5
|
|
|
6
6
|
export type MetricTrendTone = 'positive' | 'negative' | 'warning' | 'neutral';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import { productToolbar } from '../../
|
|
3
|
+
import { productToolbarRecipe as productToolbar } from '../../recipes.js';
|
|
4
4
|
interface Props { leading?: Snippet; trailing?: Snippet; children?: Snippet; class?: string; }
|
|
5
5
|
let { leading, trailing, children, class: className = '' }: Props = $props();
|
|
6
6
|
const styles = productToolbar();
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { useTranslation } from '@svadmin/core/i18n';
|
|
3
|
+
const i18n = useTranslation();
|
|
4
|
+
</script>
|
|
5
|
+
<p role="note">{i18n.locale === 'zh-CN' ? '示例资料,不代表当前账户或组织。连接状态仅在本页演示,导出只包含示例数据。' : 'Sample content, not your current account or organization. Connection changes are local previews; exports contain sample data only.'}</p>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
2
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
+
$$bindings?: Bindings;
|
|
4
|
+
} & Exports;
|
|
5
|
+
(internal: unknown, props: {
|
|
6
|
+
$$events?: Events;
|
|
7
|
+
$$slots?: Slots;
|
|
8
|
+
}): Exports & {
|
|
9
|
+
$set?: any;
|
|
10
|
+
$on?: any;
|
|
11
|
+
};
|
|
12
|
+
z_$$bindings?: Bindings;
|
|
13
|
+
}
|
|
14
|
+
declare const ReferenceNotice: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
15
|
+
[evt: string]: CustomEvent<any>;
|
|
16
|
+
}, {}, {}, string>;
|
|
17
|
+
type ReferenceNotice = InstanceType<typeof ReferenceNotice>;
|
|
18
|
+
export default ReferenceNotice;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import { productSection } from '../../
|
|
3
|
+
import { productSectionRecipe as productSection } from '../../recipes.js';
|
|
4
4
|
interface Props { title: string; description?: string; actions?: Snippet; id?: string; class?: string; }
|
|
5
5
|
let { title, description, actions, id, class: className = '' }: Props = $props();
|
|
6
6
|
const styles = productSection();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import { productSettingsRow } from '../../
|
|
3
|
+
import { productSettingsRowRecipe as productSettingsRow } from '../../recipes.js';
|
|
4
4
|
interface Props { label: string; description?: string; control: Snippet; separated?: boolean; class?: string; }
|
|
5
5
|
let { label, description, control, separated = false, class: className = '' }: Props = $props();
|
|
6
6
|
const styles = $derived(productSettingsRow({ separated }));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
|
-
import { productSettings } from '../../
|
|
3
|
+
import { productSettingsRecipe as productSettings } from '../../recipes.js';
|
|
4
4
|
interface Props { title: string; description?: string; actions?: Snippet; children: Snippet; class?: string; bodyClass?: string; }
|
|
5
5
|
let { title, description, actions, children, class: className = '', bodyClass = '' }: Props = $props();
|
|
6
6
|
const styles = productSettings();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Badge } from '../ui/badge/index.js';
|
|
3
|
-
import { productStatus } from '../../
|
|
3
|
+
import { productStatusRecipe as productStatus } from '../../recipes.js';
|
|
4
4
|
export type Status = 'success' | 'warning' | 'danger' | 'info' | 'neutral';
|
|
5
5
|
interface Props {
|
|
6
6
|
status: Status;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** 导出当前展示的记录;不声称导出了服务端完整数据集。 */
|
|
2
|
+
export function downloadRows(filename, rows) {
|
|
3
|
+
const url = URL.createObjectURL(new Blob([JSON.stringify(rows, null, 2)], { type: 'application/json' }));
|
|
4
|
+
const link = document.createElement('a');
|
|
5
|
+
link.href = url;
|
|
6
|
+
link.download = filename;
|
|
7
|
+
link.click();
|
|
8
|
+
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
9
|
+
}
|
|
@@ -70,11 +70,8 @@ export const builtinDisplayComponents = Object.freeze({
|
|
|
70
70
|
images: validatedDisplay(props(nullable(Type.Array(Type.String()))), ImagesField),
|
|
71
71
|
tags: validatedDisplay(props(nullable(Type.Union([Type.String(), Type.Array(Type.String())]))), TagField),
|
|
72
72
|
date: validatedDisplay(props(date), DateField),
|
|
73
|
-
datetime: validatedDisplay(Type.Object({
|
|
74
|
-
|
|
75
|
-
}, { additionalProperties: false }), DateField, input => ({ value: input.value, format: 'datetime' })),
|
|
76
|
-
// 原生 time 值没有日期或时区,不能交给 Date 解析。
|
|
77
|
-
time: textDisplay,
|
|
73
|
+
datetime: validatedDisplay(Type.Object({ value: date, format: Type.Literal('datetime') }, { additionalProperties: false }), DateField, input => ({ value: input.value, format: 'datetime' })),
|
|
74
|
+
time: validatedDisplay(Type.Object({ value: date, format: Type.Literal('iso') }, { additionalProperties: false }), DateField, input => ({ value: input.value, format: 'iso' })),
|
|
78
75
|
daterange: validatedDisplay(props(nullable(Type.Union([
|
|
79
76
|
Type.Tuple([date, date]),
|
|
80
77
|
Type.Object({ start: dateProperty, end: dateProperty, from: dateProperty, to: dateProperty }, { additionalProperties: false }),
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script lang="ts">
|
|
6
|
-
import { dateFieldValue } from './date-field-value.js';
|
|
7
6
|
import { cn } from '../../utils.js';
|
|
7
|
+
import { parseDisplayDate } from './date-display';
|
|
8
8
|
|
|
9
9
|
interface Props {
|
|
10
10
|
value: string | number | Date | null | undefined;
|
|
@@ -44,13 +44,13 @@
|
|
|
44
44
|
return new Intl.DateTimeFormat(loc, { dateStyle: 'medium' }).format(date);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
const parsed = $derived(parseDisplayDate(value));
|
|
47
48
|
const formatted = $derived.by(() => {
|
|
48
|
-
if (
|
|
49
|
-
const d =
|
|
50
|
-
if (isNaN(d.getTime())) return nullLabel;
|
|
49
|
+
if (!parsed) return nullLabel;
|
|
50
|
+
const d = parsed.date;
|
|
51
51
|
|
|
52
|
-
if (format === 'iso') return
|
|
53
|
-
if (format === 'relative') return formatRelative(d, locale);
|
|
52
|
+
if (format === 'iso') return parsed.title;
|
|
53
|
+
if (format === 'relative' && !parsed.civil) return formatRelative(d, locale);
|
|
54
54
|
|
|
55
55
|
const defaultOptions: Intl.DateTimeFormatOptions =
|
|
56
56
|
options ??
|
|
@@ -61,17 +61,16 @@
|
|
|
61
61
|
: { dateStyle: 'medium' });
|
|
62
62
|
|
|
63
63
|
try {
|
|
64
|
-
return new Intl.DateTimeFormat(locale,
|
|
64
|
+
return new Intl.DateTimeFormat(locale, {
|
|
65
|
+
...defaultOptions,
|
|
66
|
+
...(parsed.civil ? { timeZone: 'UTC' } : {}),
|
|
67
|
+
}).format(d);
|
|
65
68
|
} catch {
|
|
66
|
-
return
|
|
69
|
+
return parsed.title;
|
|
67
70
|
}
|
|
68
71
|
});
|
|
69
72
|
|
|
70
|
-
const fullIsoTitle = $derived
|
|
71
|
-
if (value == null || value === '') return undefined;
|
|
72
|
-
const d = dateFieldValue(value, format === 'time');
|
|
73
|
-
return isNaN(d.getTime()) ? undefined : format === 'time' && typeof value === 'string' && /^\d{2}:/u.test(value) ? value : d.toISOString();
|
|
74
|
-
});
|
|
73
|
+
const fullIsoTitle = $derived(parsed?.title);
|
|
75
74
|
</script>
|
|
76
75
|
|
|
77
76
|
<span class={cn('field-date svadmin-u-fc7473ca09eb', className)} title={fullIsoTitle}>{formatted}</span>
|
|
@@ -12,6 +12,15 @@
|
|
|
12
12
|
interface DomPurifyLike {
|
|
13
13
|
sanitize(source: string | Node, config?: Record<string, unknown>): string;
|
|
14
14
|
}
|
|
15
|
+
interface DomPurifyModule {
|
|
16
|
+
default?: DomPurifyLike;
|
|
17
|
+
sanitize?: DomPurifyLike["sanitize"];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function isDomPurifyModule(value: unknown): value is DomPurifyModule {
|
|
21
|
+
return typeof value === 'object' && value !== null;
|
|
22
|
+
}
|
|
23
|
+
|
|
15
24
|
let DOMPurify: DomPurifyLike | null = $state(null);
|
|
16
25
|
|
|
17
26
|
onMount(() => {
|
|
@@ -19,12 +28,12 @@
|
|
|
19
28
|
import("isomorphic-dompurify")
|
|
20
29
|
.then((pkg) => {
|
|
21
30
|
if (!cancelled) {
|
|
22
|
-
|
|
31
|
+
if (!isDomPurifyModule(pkg)) return;
|
|
23
32
|
const loaded: DomPurifyLike | undefined =
|
|
24
|
-
|
|
25
|
-
?
|
|
26
|
-
: typeof
|
|
27
|
-
?
|
|
33
|
+
pkg.default && typeof pkg.default.sanitize === "function"
|
|
34
|
+
? pkg.default
|
|
35
|
+
: typeof pkg.sanitize === "function"
|
|
36
|
+
? { sanitize: pkg.sanitize }
|
|
28
37
|
: undefined;
|
|
29
38
|
if (loaded) {
|
|
30
39
|
DOMPurify = loaded;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function parseDisplayDate(value) {
|
|
2
|
+
if (value == null || value === '')
|
|
3
|
+
return undefined;
|
|
4
|
+
if (typeof value === 'string') {
|
|
5
|
+
const calendar = /^(\d{4}-\d{2}-\d{2})(?:T(\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?))?$/.exec(value);
|
|
6
|
+
const time = /^\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?$/.test(value);
|
|
7
|
+
if (calendar || time) {
|
|
8
|
+
const day = calendar?.[1] ?? '2000-01-01';
|
|
9
|
+
const clock = calendar ? calendar[2] ?? '00:00' : value;
|
|
10
|
+
const [hours, minutes, seconds = '00'] = clock.split(':');
|
|
11
|
+
const [wholeSeconds, fraction = ''] = seconds.split('.');
|
|
12
|
+
const canonical = `${day}T${hours}:${minutes}:${wholeSeconds}.${fraction.padEnd(3, '0')}Z`;
|
|
13
|
+
// UTC 仅作为无时区日历值的格式化载体,绝不作为真实时间点输出。
|
|
14
|
+
const date = new Date(canonical);
|
|
15
|
+
if (!Number.isFinite(date.getTime()) || date.toISOString() !== canonical)
|
|
16
|
+
return undefined;
|
|
17
|
+
return { date, civil: true, title: value };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
21
|
+
if (!Number.isFinite(date.getTime()))
|
|
22
|
+
return undefined;
|
|
23
|
+
return { date, civil: false, title: date.toISOString() };
|
|
24
|
+
}
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
import type { NetworkColumn } from '../content/NetworkTable.types.js';
|
|
10
10
|
import { Avatar } from '../ui/avatar/index.js';
|
|
11
11
|
import { Badge } from '../ui/badge/index.js';
|
|
12
|
+
import ReferenceNotice from '../content/ReferenceNotice.svelte';
|
|
13
|
+
import { captureAdminContext } from '@svadmin/core';
|
|
14
|
+
import { downloadRows } from '../export-reference.js';
|
|
15
|
+
const context = captureAdminContext();
|
|
12
16
|
|
|
13
17
|
interface CrewMember { id: string; name: string; email: string; role: string; department: string; status: 'active' | 'away' | 'offline'; projects: number; }
|
|
14
18
|
const i18n = useTranslation();
|
|
@@ -31,7 +35,8 @@
|
|
|
31
35
|
{/snippet}
|
|
32
36
|
|
|
33
37
|
<ContentPageShell pageId="network-team-crew" width="wide">
|
|
34
|
-
<
|
|
38
|
+
<ReferenceNotice />
|
|
39
|
+
<div class="svadmin-u-60fbb7713999 svadmin-u-8dddea0773ed svadmin-u-1004c0c3954c svadmin-u-020ba687fa12 svadmin-u-64cac80d2e9a svadmin-u-3b9871a0bf93"><ContentPageHeader title={i18n.t('network.teamCrew')} description={i18n.t('network.teamCrewDescription')} /><div class="svadmin-u-60fbb7713999 svadmin-u-1eb5c6df38c1 svadmin-u-77a2a20e90d4"><Button variant="outline" size="sm" onclick={() => downloadRows('sample-team.json', filtered)}><Download class="svadmin-u-783b0d9d1e2c" />{i18n.t('common.export')}</Button><Button size="sm" onclick={() => context.navigate('/account/members/team-members')}><UserPlus class="svadmin-u-783b0d9d1e2c" />{i18n.t('account.inviteMember')}</Button></div></div>
|
|
35
40
|
<FilterToolbar bind:query placeholder={i18n.t('common.search')} />
|
|
36
41
|
<NetworkTable rows={filtered} {columns} {row} />
|
|
37
42
|
</ContentPageShell>
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import ContentPageHeader from '../content/ContentPageHeader.svelte';
|
|
5
5
|
import FilterToolbar from '../content/FilterToolbar.svelte';
|
|
6
6
|
import DataState from '../content/DataState.svelte';
|
|
7
|
+
import ReferenceNotice from '../content/ReferenceNotice.svelte';
|
|
7
8
|
import NetworkUserCard from '../content/NetworkUserCard.svelte';
|
|
8
9
|
import type { NetworkUser } from '../content/NetworkUserCard.svelte';
|
|
9
10
|
|
|
@@ -24,6 +25,7 @@
|
|
|
24
25
|
</script>
|
|
25
26
|
|
|
26
27
|
<ContentPageShell pageId="network-user-cards" width="wide">
|
|
28
|
+
<ReferenceNotice />
|
|
27
29
|
<ContentPageHeader title={i18n.t('network.userCards')} description={i18n.t('network.userCardsDescription')} />
|
|
28
30
|
<FilterToolbar bind:query placeholder={i18n.t('common.search')} clearLabel={i18n.locale === 'zh-CN' ? '清除搜索' : 'Clear search'} />
|
|
29
31
|
{#if filtered.length === 0}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import ContentPageShell from '../content/ContentPageShell.svelte';
|
|
10
10
|
import ContentPageHeader from '../content/ContentPageHeader.svelte';
|
|
11
11
|
import { referenceDemoData } from '../../reference-data.js';
|
|
12
|
+
import ReferenceNotice from '../content/ReferenceNotice.svelte';
|
|
12
13
|
|
|
13
14
|
type ProfileVariant = 'default' | 'company' | 'gamer';
|
|
14
15
|
type ProfileTab = 'projects' | 'activity' | 'teams';
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
</script>
|
|
36
37
|
|
|
37
38
|
<ContentPageShell {pageId} width="wide">
|
|
39
|
+
<ReferenceNotice />
|
|
38
40
|
<ContentPageHeader title={profileData.name} eyebrow={i18n.t('publicProfile.title')} description={profileData.tagline} />
|
|
39
41
|
{#if showSections}
|
|
40
42
|
<div class="svadmin-u-f3c543ad5fe9 svadmin-u-0d304f904cb0 svadmin-u-bf1b5b54929e"><ProfileCard {...profileData} {variant} /><ProfileVariantSections {variant} /></div>
|