@eifi1/ui-kit 0.54.0 → 0.56.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 +90 -76
- package/dist/admin/plan-change.js +2 -2
- package/dist/admin/plan-change.js.map +1 -1
- package/dist/admin/user-roster.d.ts +6 -0
- package/dist/admin/user-roster.js +4 -0
- package/dist/admin/user-roster.js.map +1 -1
- package/dist/billing/billing-labels.d.ts +26 -0
- package/dist/billing/billing-labels.js +9 -0
- package/dist/billing/billing-labels.js.map +1 -1
- package/dist/billing/subscription-standing.d.ts +61 -0
- package/dist/billing/subscription-standing.js +51 -0
- package/dist/billing/subscription-standing.js.map +1 -0
- package/dist/billing/usage-meter.d.ts +52 -0
- package/dist/billing/usage-meter.js +52 -0
- package/dist/billing/usage-meter.js.map +1 -0
- package/dist/chart.d.ts +1 -0
- package/dist/chart.js +4 -0
- package/dist/chart.js.map +1 -1
- package/dist/components/alert-banner.js +2 -3
- package/dist/components/alert-banner.js.map +1 -1
- package/dist/components/amount-input.js +3 -15
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/autocomplete.js +2 -2
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/bulk-action-bar.js +2 -1
- package/dist/components/bulk-action-bar.js.map +1 -1
- package/dist/components/button.d.ts +35 -1
- package/dist/components/button.js +6 -9
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar-heatmap.js +2 -2
- package/dist/components/calendar-heatmap.js.map +1 -1
- package/dist/components/camera-button.d.ts +89 -0
- package/dist/components/camera-button.js +122 -0
- package/dist/components/camera-button.js.map +1 -0
- package/dist/components/camera-capture.d.ts +66 -0
- package/dist/components/camera-capture.js +190 -0
- package/dist/components/camera-capture.js.map +1 -0
- package/dist/components/camera-labels.d.ts +20 -0
- package/dist/components/camera-labels.js +15 -0
- package/dist/components/camera-labels.js.map +1 -0
- package/dist/components/chart-edge.d.ts +9 -0
- package/dist/components/chart-edge.js +14 -3
- package/dist/components/chart-edge.js.map +1 -1
- package/dist/components/chart-zoom-core.js +34 -29
- package/dist/components/chart-zoom-core.js.map +1 -1
- package/dist/components/checkbox-group.js +1 -1
- package/dist/components/checkbox-group.js.map +1 -1
- package/dist/components/combobox-core.js +3 -2
- package/dist/components/combobox-core.js.map +1 -1
- package/dist/components/combobox.js +2 -2
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/consent-again-notice-labels.d.ts +25 -0
- package/dist/components/consent-again-notice-labels.js +15 -0
- package/dist/components/consent-again-notice-labels.js.map +1 -0
- package/dist/components/consent-again-notice.d.ts +85 -0
- package/dist/components/consent-again-notice.js +94 -0
- package/dist/components/consent-again-notice.js.map +1 -0
- package/dist/components/country-select.js +2 -7
- package/dist/components/country-select.js.map +1 -1
- package/dist/components/currency-select.js +2 -2
- package/dist/components/currency-select.js.map +1 -1
- package/dist/components/danger-confirm.js +2 -2
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-column-settings.js +2 -2
- package/dist/components/data-table-column-settings.js.map +1 -1
- package/dist/components/data-table-fit.js.map +1 -1
- package/dist/components/data-table-virtual.js +13 -3
- package/dist/components/data-table-virtual.js.map +1 -1
- package/dist/components/date-field.js +2 -2
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.js +2 -2
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.js +2 -6
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/dialog-frame.d.ts +3 -1
- package/dist/components/dialog-frame.js.map +1 -1
- package/dist/components/dropdown.js +7 -3
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/entity-combobox.js +2 -2
- package/dist/components/entity-combobox.js.map +1 -1
- package/dist/components/field-parts.d.ts +108 -6
- package/dist/components/field-parts.js +59 -6
- package/dist/components/field-parts.js.map +1 -1
- package/dist/components/field-suggestion-labels.d.ts +2 -0
- package/dist/components/field-suggestion-labels.js +10 -0
- package/dist/components/field-suggestion-labels.js.map +1 -0
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-button.js.map +1 -1
- package/dist/components/floating-panel.d.ts +7 -6
- package/dist/components/floating-panel.js +3 -17
- package/dist/components/floating-panel.js.map +1 -1
- package/dist/components/form-actions.d.ts +3 -2
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/hover-menu.js +3 -2
- package/dist/components/hover-menu.js.map +1 -1
- package/dist/components/icon-button.d.ts +23 -5
- package/dist/components/icon-button.js +7 -8
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/inline-confirm.js +2 -1
- package/dist/components/inline-confirm.js.map +1 -1
- package/dist/components/inline-entity-combobox.js +2 -2
- package/dist/components/inline-entity-combobox.js.map +1 -1
- package/dist/components/input.js +2 -2
- package/dist/components/input.js.map +1 -1
- package/dist/components/jump-calendar.js +3 -3
- package/dist/components/jump-calendar.js.map +1 -1
- package/dist/components/legal.d.ts +13 -1
- package/dist/components/legal.js +12 -0
- package/dist/components/legal.js.map +1 -1
- package/dist/components/legended-series-chart.d.ts +83 -0
- package/dist/components/legended-series-chart.js +77 -0
- package/dist/components/legended-series-chart.js.map +1 -0
- package/dist/components/lightbox.js +2 -1
- package/dist/components/lightbox.js.map +1 -1
- package/dist/components/mini-calendar.js +13 -5
- package/dist/components/mini-calendar.js.map +1 -1
- package/dist/components/modal.d.ts +23 -2
- package/dist/components/modal.js +24 -6
- package/dist/components/modal.js.map +1 -1
- package/dist/components/month-picker.d.ts +1 -1
- package/dist/components/month-picker.js +6 -6
- package/dist/components/month-picker.js.map +1 -1
- package/dist/components/multi-entity-combobox.js +2 -2
- package/dist/components/multi-entity-combobox.js.map +1 -1
- package/dist/components/multi-select.js +2 -6
- package/dist/components/multi-select.js.map +1 -1
- package/dist/components/number-input.js +2 -2
- package/dist/components/number-input.js.map +1 -1
- package/dist/components/page-header-layout.d.ts +18 -0
- package/dist/components/page-header-layout.js +23 -0
- package/dist/components/page-header-layout.js.map +1 -0
- package/dist/components/page-header-skeleton.d.ts +41 -0
- package/dist/components/page-header-skeleton.js +52 -0
- package/dist/components/page-header-skeleton.js.map +1 -0
- package/dist/components/page-header.js +4 -17
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/popover.js +7 -2
- package/dist/components/popover.js.map +1 -1
- package/dist/components/release-notes-labels.d.ts +16 -0
- package/dist/components/release-notes-labels.js +18 -0
- package/dist/components/release-notes-labels.js.map +1 -0
- package/dist/components/release-notes.d.ts +65 -0
- package/dist/components/release-notes.js +65 -0
- package/dist/components/release-notes.js.map +1 -0
- package/dist/components/select.js +2 -2
- package/dist/components/select.js.map +1 -1
- package/dist/components/series-chart-labels.d.ts +9 -0
- package/dist/components/series-chart-labels.js +3 -1
- package/dist/components/series-chart-labels.js.map +1 -1
- package/dist/components/series-chart.d.ts +5 -0
- package/dist/components/series-chart.js +89 -36
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/toggle-group.js +3 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/treemap-layout.js.map +1 -1
- package/dist/components/treemap.d.ts +17 -15
- package/dist/components/treemap.js +167 -85
- package/dist/components/treemap.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/eslint/role-utilities.d.ts +2 -2
- package/dist/eslint/role-utilities.js.map +1 -1
- package/dist/feedback/feedback-inbox-page.d.ts +260 -0
- package/dist/feedback/feedback-inbox-page.js +207 -0
- package/dist/feedback/feedback-inbox-page.js.map +1 -0
- package/dist/feedback/feedback-vocabulary.js +2 -2
- package/dist/feedback/feedback-vocabulary.js.map +1 -1
- package/dist/feedback.d.ts +1 -0
- package/dist/feedback.js +6 -0
- package/dist/feedback.js.map +1 -1
- package/dist/hooks/use-debounce.d.ts +32 -5
- package/dist/hooks/use-debounce.js +6 -5
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-file-picker.d.ts +3 -1
- package/dist/hooks/use-file-picker.js.map +1 -1
- package/dist/hooks/use-focus-trap.d.ts +19 -3
- package/dist/hooks/use-focus-trap.js +15 -5
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-has-camera.d.ts +36 -0
- package/dist/hooks/use-has-camera.js +53 -0
- package/dist/hooks/use-has-camera.js.map +1 -0
- package/dist/hooks/use-hotkey.js +1 -10
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-overlay-history.d.ts +6 -1
- package/dist/hooks/use-overlay-history.js +10 -2
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +75 -3
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +20 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +92 -4
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +71 -3
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +72 -2
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +74 -3
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +74 -3
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +71 -3
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +22 -1
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +24 -5
- package/dist/index.js +35 -1
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-labels.d.ts +8 -0
- package/dist/landing/landing-labels.js +2 -1
- package/dist/landing/landing-labels.js.map +1 -1
- package/dist/lib/changelog.d.ts +130 -0
- package/dist/lib/changelog.js +137 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/clipboard-minus.js +2 -2
- package/dist/lib/clipboard-minus.js.map +1 -1
- package/dist/lib/dates.d.ts +29 -3
- package/dist/lib/dates.js +41 -12
- package/dist/lib/dates.js.map +1 -1
- package/dist/lib/editable-content.d.ts +33 -0
- package/dist/lib/editable-content.js +15 -0
- package/dist/lib/editable-content.js.map +1 -0
- package/dist/lib/focus-left.d.ts +47 -1
- package/dist/lib/focus-left.js +11 -2
- package/dist/lib/focus-left.js.map +1 -1
- package/dist/lib/server-wake.d.ts +49 -9
- package/dist/lib/server-wake.js +25 -14
- package/dist/lib/server-wake.js.map +1 -1
- package/dist/lib/session-refresh.d.ts +53 -0
- package/dist/lib/session-refresh.js +27 -1
- package/dist/lib/session-refresh.js.map +1 -1
- package/dist/rhf/fields.js +3 -3
- package/dist/rhf/fields.js.map +1 -1
- package/dist/shell/app-shell.d.ts +25 -1
- package/dist/shell/app-shell.js +3 -1
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +3 -0
- package/dist/shell/dev-menu.js +4 -2
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/held-changes-banner-labels.d.ts +23 -0
- package/dist/shell/held-changes-banner-labels.js +14 -0
- package/dist/shell/held-changes-banner-labels.js.map +1 -0
- package/dist/shell/held-changes-banner.d.ts +75 -0
- package/dist/shell/held-changes-banner.js +106 -0
- package/dist/shell/held-changes-banner.js.map +1 -0
- package/dist/shell/sync-status-indicator.d.ts +27 -12
- package/dist/shell/sync-status-indicator.js +13 -4
- package/dist/shell/sync-status-indicator.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +5 -0
- package/dist/shell/top-bar-parts-labels.js +3 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +2 -0
- package/dist/shell.js +3 -0
- package/dist/shell.js.map +1 -1
- package/dist/sync/engine.d.ts +11 -2
- package/dist/sync/engine.js +13 -5
- package/dist/sync/engine.js.map +1 -1
- package/dist/sync/hooks.d.ts +3 -2
- package/dist/sync/hooks.js +4 -2
- package/dist/sync/hooks.js.map +1 -1
- package/dist/testing/css-variables.generated.d.ts +2 -2
- package/dist/testing/css-variables.generated.js +1 -1
- package/dist/testing/css-variables.generated.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +18 -0
- package/dist/theme/chart-palette.js +17 -1
- package/dist/theme/chart-palette.js.map +1 -1
- package/dist/theme/contrast-tokens.d.ts +3 -3
- package/dist/theme/contrast-tokens.js.map +1 -1
- package/dist/theme/contrast.d.ts +4 -4
- package/dist/theme/contrast.js.map +1 -1
- package/dist/tour/tour-overlay.js +2 -1
- package/dist/tour/tour-overlay.js.map +1 -1
- package/package.json +9 -12
- package/tokens.css +19 -54
- package/src/account/account-parts.ts +0 -47
- package/src/account/account-settings-labels.ts +0 -240
- package/src/account/account-settings.tsx +0 -698
- package/src/account/data-export-setting-labels.ts +0 -20
- package/src/account/data-export-setting.tsx +0 -200
- package/src/account/delete-account-setting-labels.ts +0 -33
- package/src/account/delete-account-setting.tsx +0 -342
- package/src/account/email-change-setting-labels.ts +0 -31
- package/src/account/email-change-setting.tsx +0 -443
- package/src/account/passkeys-setting.tsx +0 -445
- package/src/account/sessions-setting-labels.ts +0 -24
- package/src/account/sessions-setting.tsx +0 -283
- package/src/admin/admin-action-confirm-labels.ts +0 -19
- package/src/admin/admin-action-confirm.tsx +0 -509
- package/src/admin/admin-action-log-labels.ts +0 -83
- package/src/admin/admin-action-log.tsx +0 -464
- package/src/admin/admin-area-labels.ts +0 -114
- package/src/admin/admin-forbidden.tsx +0 -75
- package/src/admin/admin-overview.tsx +0 -258
- package/src/admin/admin-parts.ts +0 -68
- package/src/admin/admin-sections.tsx +0 -208
- package/src/admin/admin-tool-links.tsx +0 -90
- package/src/admin/invitations-panel-labels.ts +0 -31
- package/src/admin/invitations-panel.tsx +0 -516
- package/src/admin/mail-test-card-labels.ts +0 -19
- package/src/admin/mail-test-card.tsx +0 -189
- package/src/admin/plan-change-labels.ts +0 -5
- package/src/admin/plan-change.tsx +0 -474
- package/src/admin/reviewer-scope-editor-labels.ts +0 -16
- package/src/admin/reviewer-scope-editor.tsx +0 -224
- package/src/admin/role-select-labels.ts +0 -16
- package/src/admin/role-select.tsx +0 -282
- package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
- package/src/admin/transfer-ownership-dialog.tsx +0 -162
- package/src/admin/user-roster-labels.ts +0 -17
- package/src/admin/user-roster.tsx +0 -559
- package/src/auth/accept-invitation-labels.ts +0 -21
- package/src/auth/accept-invitation.tsx +0 -210
- package/src/auth/auth-errors-labels.ts +0 -23
- package/src/auth/auth-errors.ts +0 -439
- package/src/auth/complete-name-dialog-labels.ts +0 -16
- package/src/auth/complete-name-dialog.tsx +0 -253
- package/src/auth/email-tag.ts +0 -75
- package/src/auth/forgot-password-form-labels.ts +0 -20
- package/src/auth/forgot-password-form.tsx +0 -221
- package/src/auth/form-rules.ts +0 -40
- package/src/auth/new-password-fields.tsx +0 -85
- package/src/auth/not-found-page-labels.ts +0 -12
- package/src/auth/not-found-page.tsx +0 -95
- package/src/auth/register-form-labels.ts +0 -31
- package/src/auth/register-form.tsx +0 -456
- package/src/auth/reset-password-form-labels.ts +0 -27
- package/src/auth/reset-password-form.tsx +0 -341
- package/src/auth/sign-in-form-labels.ts +0 -44
- package/src/auth/sign-in-form.tsx +0 -858
- package/src/auth/status-parts.tsx +0 -132
- package/src/auth/verify-email-labels.ts +0 -26
- package/src/auth/verify-email.tsx +0 -445
- package/src/billing/billing-banner.tsx +0 -258
- package/src/billing/billing-labels.ts +0 -381
- package/src/billing/billing-lock.ts +0 -108
- package/src/billing/billing-overview.ts +0 -157
- package/src/billing/billing-standing.ts +0 -80
- package/src/billing/cancel-request.ts +0 -97
- package/src/billing/cancel-subscription.tsx +0 -98
- package/src/billing/checkout-processing.ts +0 -394
- package/src/billing/checkout-return.ts +0 -90
- package/src/billing/pay-page.ts +0 -330
- package/src/billing/plan-card.tsx +0 -562
- package/src/billing/plan-change-labels.ts +0 -66
- package/src/billing/plan-limit-notice.tsx +0 -148
- package/src/billing/plan-limit-toast.tsx +0 -90
- package/src/billing/plan-limit.ts +0 -52
- package/src/billing/plan-price.ts +0 -98
- package/src/billing/plan-switch.tsx +0 -216
- package/src/billing/provider-page.ts +0 -84
- package/src/billing/subscription-actions.tsx +0 -247
- package/src/billing/subscription-status-chip.tsx +0 -95
- package/src/chart.ts +0 -103
- package/src/components/account-chips-labels.ts +0 -16
- package/src/components/account-chips.tsx +0 -474
- package/src/components/alert-banner.tsx +0 -670
- package/src/components/amount-input.tsx +0 -816
- package/src/components/appearance-labels.ts +0 -63
- package/src/components/authed-image-labels.ts +0 -11
- package/src/components/authed-image.tsx +0 -209
- package/src/components/autocomplete.tsx +0 -645
- package/src/components/breadcrumbs-labels.ts +0 -10
- package/src/components/breadcrumbs.tsx +0 -205
- package/src/components/bulk-action-bar-labels.ts +0 -11
- package/src/components/bulk-action-bar.tsx +0 -443
- package/src/components/button-group.tsx +0 -223
- package/src/components/button-look.ts +0 -256
- package/src/components/button.tsx +0 -339
- package/src/components/calculator.tsx +0 -341
- package/src/components/calendar-heatmap-labels.ts +0 -15
- package/src/components/calendar-heatmap.tsx +0 -600
- package/src/components/card.tsx +0 -377
- package/src/components/chart-edge.ts +0 -106
- package/src/components/chart-figure.tsx +0 -35
- package/src/components/chart-height.ts +0 -30
- package/src/components/chart-zoom-core.tsx +0 -627
- package/src/components/chart-zoom.tsx +0 -22
- package/src/components/chart.tsx +0 -554
- package/src/components/checkbox-group.tsx +0 -247
- package/src/components/checkbox.tsx +0 -346
- package/src/components/chip-input.tsx +0 -370
- package/src/components/chip-labels.ts +0 -13
- package/src/components/chip.tsx +0 -843
- package/src/components/choice-card.tsx +0 -544
- package/src/components/column-mapper-labels.ts +0 -38
- package/src/components/column-mapper.tsx +0 -655
- package/src/components/combobox-core.tsx +0 -1321
- package/src/components/combobox-suggestions.tsx +0 -131
- package/src/components/combobox.tsx +0 -716
- package/src/components/confirm-context.ts +0 -7
- package/src/components/confirm-dialog-labels.ts +0 -13
- package/src/components/confirm-dialog.tsx +0 -341
- package/src/components/copy-button-labels.ts +0 -13
- package/src/components/copy-button.tsx +0 -192
- package/src/components/country-select-labels.ts +0 -11
- package/src/components/country-select.tsx +0 -539
- package/src/components/currency-option-list.tsx +0 -188
- package/src/components/currency-select.tsx +0 -343
- package/src/components/danger-confirm-labels.ts +0 -20
- package/src/components/danger-confirm.tsx +0 -987
- package/src/components/data-table-cells.tsx +0 -118
- package/src/components/data-table-column-settings.tsx +0 -198
- package/src/components/data-table-filter-popover.tsx +0 -289
- package/src/components/data-table-filters.ts +0 -315
- package/src/components/data-table-fit.ts +0 -301
- package/src/components/data-table-groups.tsx +0 -288
- package/src/components/data-table-head.tsx +0 -280
- package/src/components/data-table-labels.ts +0 -198
- package/src/components/data-table-leading-row.tsx +0 -58
- package/src/components/data-table-mobile.tsx +0 -1117
- package/src/components/data-table-pagination.tsx +0 -202
- package/src/components/data-table-resize.ts +0 -188
- package/src/components/data-table-row-actions.tsx +0 -302
- package/src/components/data-table-row.tsx +0 -496
- package/src/components/data-table-selection.ts +0 -71
- package/src/components/data-table-shared.tsx +0 -287
- package/src/components/data-table-sort.ts +0 -163
- package/src/components/data-table-virtual.ts +0 -576
- package/src/components/data-table.tsx +0 -2598
- package/src/components/date-field.tsx +0 -684
- package/src/components/date-format-setting.tsx +0 -64
- package/src/components/date-picker.tsx +0 -404
- package/src/components/date-range-picker.tsx +0 -518
- package/src/components/description-list-labels.ts +0 -9
- package/src/components/description-list.tsx +0 -386
- package/src/components/dialog-frame-labels.ts +0 -7
- package/src/components/dialog-frame.tsx +0 -284
- package/src/components/disclosure.tsx +0 -476
- package/src/components/dropdown.tsx +0 -461
- package/src/components/empty-state.tsx +0 -136
- package/src/components/entity-combobox.tsx +0 -422
- package/src/components/error-boundary-labels.ts +0 -20
- package/src/components/error-boundary.tsx +0 -675
- package/src/components/facing-pair.ts +0 -93
- package/src/components/field-base-labels.ts +0 -20
- package/src/components/field-base.tsx +0 -656
- package/src/components/field-parts.tsx +0 -825
- package/src/components/field-strip.tsx +0 -129
- package/src/components/field.tsx +0 -206
- package/src/components/file-button.tsx +0 -295
- package/src/components/file-dropzone.tsx +0 -559
- package/src/components/floating-panel-labels.ts +0 -10
- package/src/components/floating-panel.tsx +0 -828
- package/src/components/focus-ring.ts +0 -16
- package/src/components/form-actions-labels.ts +0 -11
- package/src/components/form-actions.tsx +0 -578
- package/src/components/full-bleed-dialog.tsx +0 -294
- package/src/components/grouped-picker.tsx +0 -184
- package/src/components/help-popover.tsx +0 -117
- package/src/components/hover-menu.tsx +0 -343
- package/src/components/iban-input-labels.ts +0 -14
- package/src/components/iban-input.tsx +0 -236
- package/src/components/icon-button.tsx +0 -959
- package/src/components/icon-picker-labels.ts +0 -13
- package/src/components/icon-picker.tsx +0 -232
- package/src/components/image-grid-labels.ts +0 -11
- package/src/components/image-grid.tsx +0 -202
- package/src/components/inline-confirm.tsx +0 -116
- package/src/components/inline-edit-field-labels.ts +0 -11
- package/src/components/inline-edit-field.tsx +0 -552
- package/src/components/inline-entity-combobox.tsx +0 -849
- package/src/components/input.tsx +0 -394
- package/src/components/jump-calendar.tsx +0 -265
- package/src/components/language-select.tsx +0 -93
- package/src/components/legal-labels.ts +0 -105
- package/src/components/legal-page.tsx +0 -711
- package/src/components/legal.tsx +0 -668
- package/src/components/lightbox-labels.ts +0 -18
- package/src/components/lightbox.tsx +0 -399
- package/src/components/line-items-labels.ts +0 -14
- package/src/components/line-items.tsx +0 -602
- package/src/components/list-labels.ts +0 -12
- package/src/components/list.tsx +0 -870
- package/src/components/loading-state.tsx +0 -78
- package/src/components/measured-grid-labels.ts +0 -25
- package/src/components/measured-grid.tsx +0 -837
- package/src/components/menu-item.tsx +0 -241
- package/src/components/mini-calendar-labels.ts +0 -17
- package/src/components/mini-calendar.tsx +0 -792
- package/src/components/modal.tsx +0 -534
- package/src/components/money-draft.ts +0 -83
- package/src/components/money-field.tsx +0 -76
- package/src/components/month-grid.tsx +0 -229
- package/src/components/month-picker-labels.ts +0 -22
- package/src/components/month-picker.tsx +0 -1087
- package/src/components/multi-entity-combobox.tsx +0 -369
- package/src/components/multi-select.tsx +0 -376
- package/src/components/nav-pills.tsx +0 -198
- package/src/components/number-field.tsx +0 -327
- package/src/components/number-input.tsx +0 -559
- package/src/components/numeric-field.ts +0 -169
- package/src/components/numpad-sheet.tsx +0 -285
- package/src/components/one-time-code-input.tsx +0 -270
- package/src/components/page-contents-labels.ts +0 -9
- package/src/components/page-contents.tsx +0 -282
- package/src/components/page-header-context.ts +0 -8
- package/src/components/page-header.tsx +0 -298
- package/src/components/password-strength-labels.ts +0 -22
- package/src/components/password-strength.tsx +0 -241
- package/src/components/phone-input-labels.ts +0 -10
- package/src/components/phone-input.tsx +0 -282
- package/src/components/picker-sheet.tsx +0 -330
- package/src/components/pie-chart-labels.ts +0 -40
- package/src/components/pie-chart.tsx +0 -480
- package/src/components/popover-labels.ts +0 -14
- package/src/components/popover.tsx +0 -268
- package/src/components/progress-bar-labels.ts +0 -10
- package/src/components/progress-bar.tsx +0 -479
- package/src/components/qr-code.tsx +0 -76
- package/src/components/reauth-dialog-labels.ts +0 -13
- package/src/components/reauth-dialog.tsx +0 -265
- package/src/components/row-actions-labels.ts +0 -12
- package/src/components/row-actions.tsx +0 -795
- package/src/components/scroll-area.tsx +0 -123
- package/src/components/search-field.tsx +0 -192
- package/src/components/select.tsx +0 -294
- package/src/components/separator.tsx +0 -33
- package/src/components/series-chart-axes.ts +0 -342
- package/src/components/series-chart-budget.ts +0 -150
- package/src/components/series-chart-labels.ts +0 -33
- package/src/components/series-chart-thin.ts +0 -180
- package/src/components/series-chart-ticks.ts +0 -194
- package/src/components/series-chart.tsx +0 -1906
- package/src/components/server-wake-labels.ts +0 -11
- package/src/components/server-wake.tsx +0 -129
- package/src/components/settings-fields.tsx +0 -237
- package/src/components/share-card-labels.ts +0 -30
- package/src/components/share-card.tsx +0 -675
- package/src/components/signature-pad-labels.ts +0 -24
- package/src/components/signature-pad.tsx +0 -747
- package/src/components/signed-amount-labels.ts +0 -10
- package/src/components/signed-amount.tsx +0 -336
- package/src/components/skeleton.tsx +0 -80
- package/src/components/slider.tsx +0 -338
- package/src/components/sparkline-labels.ts +0 -14
- package/src/components/sparkline.tsx +0 -322
- package/src/components/spinner.tsx +0 -81
- package/src/components/stat-tile-labels.ts +0 -15
- package/src/components/stat-tile.tsx +0 -754
- package/src/components/status-dot.tsx +0 -170
- package/src/components/swatch-picker-labels.ts +0 -10
- package/src/components/swatch-picker.tsx +0 -283
- package/src/components/swipeable-row.tsx +0 -386
- package/src/components/switch.tsx +0 -273
- package/src/components/table-skeleton.tsx +0 -136
- package/src/components/table.tsx +0 -647
- package/src/components/tabs-labels.ts +0 -13
- package/src/components/tabs.tsx +0 -693
- package/src/components/text-link.tsx +0 -359
- package/src/components/text.tsx +0 -150
- package/src/components/textarea.tsx +0 -330
- package/src/components/tile-radio.tsx +0 -332
- package/src/components/time-input.tsx +0 -121
- package/src/components/toast-labels.ts +0 -12
- package/src/components/toast.tsx +0 -519
- package/src/components/toggle-group.tsx +0 -752
- package/src/components/toggle-legend.tsx +0 -394
- package/src/components/tooltip.tsx +0 -1149
- package/src/components/translation-review-editor.tsx +0 -290
- package/src/components/translation-review-labels.ts +0 -181
- package/src/components/translation-review-parts.tsx +0 -272
- package/src/components/translation-review.tsx +0 -1240
- package/src/components/tree-view.tsx +0 -589
- package/src/components/treemap-labels.ts +0 -47
- package/src/components/treemap-layout.ts +0 -210
- package/src/components/treemap.tsx +0 -1184
- package/src/components/trigger-aria.ts +0 -44
- package/src/components/use-anchor-dir.ts +0 -20
- package/src/components/use-mobile-reveal.ts +0 -62
- package/src/components/use-table-state.ts +0 -753
- package/src/components/user-avatar.tsx +0 -116
- package/src/components/wizard-stepper.tsx +0 -42
- package/src/components/write-lock-labels.ts +0 -10
- package/src/components/write-lock.tsx +0 -253
- package/src/currencies.ts +0 -90
- package/src/data-table.ts +0 -42
- package/src/demo/demo-banner.tsx +0 -153
- package/src/demo/demo-countdown.ts +0 -136
- package/src/demo/demo-ended.tsx +0 -90
- package/src/demo/demo-labels.ts +0 -78
- package/src/demo/demo-session.ts +0 -32
- package/src/demo/demo-start.tsx +0 -156
- package/src/eslint/index.ts +0 -161
- package/src/eslint/role-utilities.generated.ts +0 -146
- package/src/eslint/role-utilities.ts +0 -233
- package/src/feedback/feedback-attachment-download.tsx +0 -77
- package/src/feedback/feedback-attachment-labels.ts +0 -37
- package/src/feedback/feedback-attachment.tsx +0 -1239
- package/src/feedback/feedback-capture.ts +0 -287
- package/src/feedback/feedback-comment-thread.tsx +0 -353
- package/src/feedback/feedback-context-labels.ts +0 -11
- package/src/feedback/feedback-context.tsx +0 -245
- package/src/feedback/feedback-crash.ts +0 -547
- package/src/feedback/feedback-diagnostics.tsx +0 -41
- package/src/feedback/feedback-dialog-labels.ts +0 -29
- package/src/feedback/feedback-dialog.tsx +0 -452
- package/src/feedback/feedback-entry-file.tsx +0 -150
- package/src/feedback/feedback-inbox.tsx +0 -552
- package/src/feedback/feedback-labels.ts +0 -144
- package/src/feedback/feedback-menu-labels.ts +0 -12
- package/src/feedback/feedback-menu.tsx +0 -177
- package/src/feedback/feedback-mutation.ts +0 -20
- package/src/feedback/feedback-page-link.ts +0 -90
- package/src/feedback/feedback-public-labels.ts +0 -81
- package/src/feedback/feedback-public-list.tsx +0 -524
- package/src/feedback/feedback-public-switch.tsx +0 -102
- package/src/feedback/feedback-public-types.ts +0 -101
- package/src/feedback/feedback-record.ts +0 -428
- package/src/feedback/feedback-replies-context.ts +0 -9
- package/src/feedback/feedback-replies.tsx +0 -343
- package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
- package/src/feedback/feedback-row-detail-labels.ts +0 -31
- package/src/feedback/feedback-row-detail.tsx +0 -871
- package/src/feedback/feedback-status-undo.ts +0 -109
- package/src/feedback/feedback-submit-dialog.tsx +0 -131
- package/src/feedback/feedback-submit.tsx +0 -270
- package/src/feedback/feedback-swipe.tsx +0 -192
- package/src/feedback/feedback-table-labels.ts +0 -27
- package/src/feedback/feedback-table.tsx +0 -912
- package/src/feedback/feedback-thread-labels.ts +0 -22
- package/src/feedback/feedback-thread-parts-labels.ts +0 -41
- package/src/feedback/feedback-thread.tsx +0 -905
- package/src/feedback/feedback-vocabulary.ts +0 -263
- package/src/feedback/feedback-vote-button.tsx +0 -124
- package/src/feedback.ts +0 -116
- package/src/hooks/use-anchored-panel.ts +0 -396
- package/src/hooks/use-anchored-rect.ts +0 -77
- package/src/hooks/use-announce.ts +0 -85
- package/src/hooks/use-authed-src.ts +0 -167
- package/src/hooks/use-body-scroll-lock.ts +0 -119
- package/src/hooks/use-breakpoint.ts +0 -133
- package/src/hooks/use-close-transition.ts +0 -107
- package/src/hooks/use-copy-to-clipboard.ts +0 -122
- package/src/hooks/use-debounce.ts +0 -114
- package/src/hooks/use-dismiss.ts +0 -371
- package/src/hooks/use-document-title.ts +0 -33
- package/src/hooks/use-file-drop.ts +0 -121
- package/src/hooks/use-file-picker-labels.ts +0 -28
- package/src/hooks/use-file-picker.tsx +0 -359
- package/src/hooks/use-focus-trap.ts +0 -199
- package/src/hooks/use-hotkey.ts +0 -212
- package/src/hooks/use-large-text.ts +0 -41
- package/src/hooks/use-long-press.ts +0 -140
- package/src/hooks/use-media-query.ts +0 -39
- package/src/hooks/use-mounted.ts +0 -39
- package/src/hooks/use-noindex.ts +0 -37
- package/src/hooks/use-overlay-history.ts +0 -714
- package/src/hooks/use-row-swipe.ts +0 -207
- package/src/hooks/use-search-param-state.ts +0 -434
- package/src/hooks/use-windowed-rows.ts +0 -225
- package/src/i18n/defaults.ts +0 -267
- package/src/i18n/german.ts +0 -2059
- package/src/i18n/kit-labels.tsx +0 -1003
- package/src/i18n/languages.ts +0 -349
- package/src/i18n/locales/de-CH.ts +0 -24
- package/src/i18n/locales/en.ts +0 -267
- package/src/i18n/locales/es.ts +0 -1999
- package/src/i18n/locales/fr.ts +0 -2037
- package/src/i18n/locales/hu.ts +0 -2004
- package/src/i18n/locales/it.ts +0 -2014
- package/src/i18n/locales/zh.ts +0 -1912
- package/src/i18n/plurals.ts +0 -86
- package/src/i18n/review.ts +0 -475
- package/src/i18n/shared-labels.ts +0 -138
- package/src/i18n/swiss.ts +0 -29
- package/src/index.ts +0 -1191
- package/src/landing/access.ts +0 -93
- package/src/landing/landing-actions.tsx +0 -97
- package/src/landing/landing-labels.ts +0 -59
- package/src/landing/landing-sections.tsx +0 -341
- package/src/landing/page-seo.ts +0 -261
- package/src/landing/public-header.tsx +0 -121
- package/src/landing/public-page.tsx +0 -106
- package/src/landing/routing.tsx +0 -225
- package/src/lib/broadcast.ts +0 -52
- package/src/lib/calc.ts +0 -323
- package/src/lib/chip-edge-snap.ts +0 -212
- package/src/lib/clipboard-minus.ts +0 -107
- package/src/lib/clipping.ts +0 -34
- package/src/lib/cn.ts +0 -28
- package/src/lib/column-mapping.ts +0 -234
- package/src/lib/countries.ts +0 -91
- package/src/lib/data-attributes.ts +0 -14
- package/src/lib/date-format.ts +0 -227
- package/src/lib/dates.ts +0 -288
- package/src/lib/day-format.ts +0 -96
- package/src/lib/decimal-marks.ts +0 -108
- package/src/lib/describe-failure.ts +0 -18
- package/src/lib/device-settings.ts +0 -147
- package/src/lib/direction.ts +0 -74
- package/src/lib/document-navigation.ts +0 -17
- package/src/lib/document-title.ts +0 -41
- package/src/lib/download.ts +0 -172
- package/src/lib/float-clearance.ts +0 -70
- package/src/lib/floating-stack.ts +0 -70
- package/src/lib/focus-left.ts +0 -156
- package/src/lib/format.ts +0 -585
- package/src/lib/http-status.ts +0 -38
- package/src/lib/iban.ts +0 -251
- package/src/lib/ime.ts +0 -24
- package/src/lib/intl-cache.ts +0 -27
- package/src/lib/iso-day.ts +0 -13
- package/src/lib/lazy-with-fallback.ts +0 -82
- package/src/lib/logger.ts +0 -69
- package/src/lib/minus.ts +0 -50
- package/src/lib/path-pattern.ts +0 -55
- package/src/lib/person-name.ts +0 -155
- package/src/lib/phone.ts +0 -208
- package/src/lib/plain-text.ts +0 -22
- package/src/lib/presence.ts +0 -18
- package/src/lib/qr-encode.ts +0 -444
- package/src/lib/quiet-focus.ts +0 -32
- package/src/lib/reduced-motion.ts +0 -22
- package/src/lib/refs.ts +0 -22
- package/src/lib/round.ts +0 -43
- package/src/lib/safe-storage.ts +0 -119
- package/src/lib/server-wake.ts +0 -315
- package/src/lib/session-refresh.ts +0 -472
- package/src/lib/share-format.ts +0 -18
- package/src/lib/status-tone.ts +0 -43
- package/src/lib/strip-fade.ts +0 -287
- package/src/lib/table-text.ts +0 -554
- package/src/lib/text-case.ts +0 -19
- package/src/lib/text-match.ts +0 -169
- package/src/lib/thenable.ts +0 -19
- package/src/lib/translation-review.ts +0 -769
- package/src/notifications/device-zone-report.ts +0 -67
- package/src/notifications/feedback-notification-types-labels.ts +0 -33
- package/src/notifications/feedback-notification-types.ts +0 -71
- package/src/notifications/notification-bell.tsx +0 -119
- package/src/notifications/notification-inbox.tsx +0 -309
- package/src/notifications/notification-parts.tsx +0 -81
- package/src/notifications/notification-types-setting.tsx +0 -406
- package/src/notifications/notification-types.ts +0 -89
- package/src/notifications/notifications-labels.ts +0 -287
- package/src/notifications/push-device-setting.tsx +0 -230
- package/src/notifications/push-devices-setting.tsx +0 -374
- package/src/notifications/push-worker.ts +0 -168
- package/src/notifications/quiet-hours-setting.tsx +0 -238
- package/src/notifications/unsubscribe-panel.tsx +0 -200
- package/src/notifications/use-push-device.ts +0 -448
- package/src/offline/local-first.ts +0 -100
- package/src/offline/pwa-update-prompt-labels.ts +0 -9
- package/src/offline/pwa-update-prompt.tsx +0 -78
- package/src/offline/query-persistence.ts +0 -391
- package/src/offline/service-worker-updates.ts +0 -81
- package/src/offline/shared-computer-labels.ts +0 -8
- package/src/offline/shared-computer.tsx +0 -87
- package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
- package/src/offline/sign-out-pending-dialog.tsx +0 -135
- package/src/offline.ts +0 -37
- package/src/push-worker.ts +0 -25
- package/src/rhf/fields.tsx +0 -2187
- package/src/rhf/form-core.tsx +0 -324
- package/src/rhf/form.tsx +0 -12
- package/src/rhf/line-items.tsx +0 -135
- package/src/rhf/use-rhf-wizard-step.ts +0 -104
- package/src/rhf.ts +0 -21
- package/src/search/command-palette-labels.ts +0 -16
- package/src/search/command-palette.tsx +0 -624
- package/src/search/global-search-labels.ts +0 -13
- package/src/search/global-search.tsx +0 -660
- package/src/search/search-index.ts +0 -283
- package/src/search/use-command-key.ts +0 -23
- package/src/search.ts +0 -14
- package/src/settings/device-reset-setting-labels.ts +0 -20
- package/src/settings/device-reset-setting.tsx +0 -116
- package/src/settings/settings-card-classes.ts +0 -11
- package/src/settings/settings-catalogue.ts +0 -150
- package/src/settings/settings-context.ts +0 -33
- package/src/settings/settings-heading.tsx +0 -67
- package/src/settings/settings-labels.ts +0 -87
- package/src/settings/settings-layout.tsx +0 -471
- package/src/settings/settings-section.tsx +0 -108
- package/src/settings/use-account-appearance.ts +0 -148
- package/src/settings/use-account-language.ts +0 -146
- package/src/settings/use-settings-focus.ts +0 -128
- package/src/settings/use-settings-route.ts +0 -258
- package/src/shell/account-menu-language.tsx +0 -130
- package/src/shell/account-menu-text-size.tsx +0 -80
- package/src/shell/admin-menu.tsx +0 -183
- package/src/shell/app-shell-labels.ts +0 -11
- package/src/shell/app-shell.tsx +0 -1560
- package/src/shell/auth-layout.tsx +0 -186
- package/src/shell/company-switcher-labels.ts +0 -13
- package/src/shell/company-switcher.tsx +0 -136
- package/src/shell/dev-menu.tsx +0 -257
- package/src/shell/fill-height.tsx +0 -45
- package/src/shell/language-code.ts +0 -5
- package/src/shell/option-switcher-menu.tsx +0 -84
- package/src/shell/sync-status-indicator.tsx +0 -303
- package/src/shell/top-bar-actions.tsx +0 -87
- package/src/shell/top-bar-brand.tsx +0 -78
- package/src/shell/top-bar-parts-labels.ts +0 -148
- package/src/shell/top-bar.tsx +0 -40
- package/src/shell/topbar-action-menu.tsx +0 -567
- package/src/shell/topbar-controls.tsx +0 -269
- package/src/shell/tour-menu.tsx +0 -187
- package/src/shell.ts +0 -108
- package/src/sync/db.ts +0 -129
- package/src/sync/engine.ts +0 -1011
- package/src/sync/hooks.ts +0 -98
- package/src/sync/testing.ts +0 -73
- package/src/sync/wire.ts +0 -61
- package/src/sync.ts +0 -37
- package/src/table-text.ts +0 -8
- package/src/testing/css-variables.generated.ts +0 -112
- package/src/testing/css-variables.ts +0 -189
- package/src/testing/index.ts +0 -29
- package/src/testing/react.ts +0 -58
- package/src/testing/tour.ts +0 -41
- package/src/testing/viewport.ts +0 -357
- package/src/theme/chart-palette.ts +0 -232
- package/src/theme/color.ts +0 -272
- package/src/theme/contrast-tokens.ts +0 -268
- package/src/theme/contrast.ts +0 -250
- package/src/theme/palette-derive.ts +0 -825
- package/src/theme/palette-presets.ts +0 -544
- package/src/theme/palette-store.ts +0 -108
- package/src/theme/text-size.ts +0 -289
- package/src/theme/theme-store.ts +0 -157
- package/src/tour/tour-catalogue-labels.ts +0 -75
- package/src/tour/tour-catalogue.tsx +0 -335
- package/src/tour/tour-dock.ts +0 -134
- package/src/tour/tour-engine.ts +0 -37
- package/src/tour/tour-gates.ts +0 -218
- package/src/tour/tour-guide-button.tsx +0 -64
- package/src/tour/tour-guide-labels.ts +0 -15
- package/src/tour/tour-info.ts +0 -144
- package/src/tour/tour-labels.ts +0 -23
- package/src/tour/tour-overlay.tsx +0 -1170
- package/src/tour/tour.tsx +0 -750
- package/src/tour/use-tour-progress.ts +0 -671
- package/src/tour/use-tour-url-sync.ts +0 -266
- package/src/tour.ts +0 -21
- package/src/vite-env.d.ts +0 -23
- package/src/wizard/stepper-nav.tsx +0 -360
- package/src/wizard/types.ts +0 -275
- package/src/wizard/use-wizard.ts +0 -560
- package/src/wizard/validation.ts +0 -39
- package/src/wizard/wizard-context.tsx +0 -74
- package/src/wizard/wizard-labels.ts +0 -29
- package/src/wizard/wizard-step.tsx +0 -76
- package/src/wizard/wizard-summary.tsx +0 -84
- package/src/wizard.ts +0 -15
|
@@ -1,559 +0,0 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
2
|
-
import type { ReactNode } from "react";
|
|
3
|
-
import { cn } from "../lib/cn";
|
|
4
|
-
import type { DateInput } from "../lib/format";
|
|
5
|
-
import type { PersonName } from "../lib/person-name";
|
|
6
|
-
import { useKitLabels, useKitLocale, type LabelOverride } from "../i18n/kit-labels";
|
|
7
|
-
import { AccountStateChip, RoleChip, dateColumn } from "../components/account-chips";
|
|
8
|
-
import type { AccountState, RoleVocabulary } from "../components/account-chips";
|
|
9
|
-
import type { ChipTone } from "../components/chip";
|
|
10
|
-
import type { DataTableColumn } from "../components/data-table";
|
|
11
|
-
import { SelectWidthFloor } from "../components/field-base";
|
|
12
|
-
import { encodeSorts } from "../components/data-table-sort";
|
|
13
|
-
import type { SortState } from "../components/data-table-sort";
|
|
14
|
-
import { RowActions } from "../components/row-actions";
|
|
15
|
-
import type { RowAction, RowActionList } from "../components/row-actions";
|
|
16
|
-
import { UserAvatar } from "../components/user-avatar";
|
|
17
|
-
import { personLabel } from "./admin-parts";
|
|
18
|
-
import { RoleSelect } from "./role-select";
|
|
19
|
-
import type { RoleLock } from "./role-select";
|
|
20
|
-
import { DEFAULT_USER_ROSTER_LABELS } from "./user-roster-labels";
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* The admin's user list (docs/user-admin-harmonization.md §3): a column preset for the
|
|
24
|
-
* kit's `DataTable`, not a table of its own.
|
|
25
|
-
*
|
|
26
|
-
* keksdose built its roster by hand (1150 lines, its own Badge), Kurvenschmiede on the
|
|
27
|
-
* kit `DataTable` with the 0.18 chips, kastlan as a settings page. What the three share
|
|
28
|
-
* is the row — name over address, a role, the account's states, created, last login, the
|
|
29
|
-
* app's own columns, and a handful of actions — so that is what the kit draws, and the
|
|
30
|
-
* table, its paging, its sort and its filters stay the app's `DataTable` wiring:
|
|
31
|
-
*
|
|
32
|
-
* ```tsx
|
|
33
|
-
* const columns = useUserRosterColumns<AdminUserRow, Role>({ roles: ROLES, actions, extra });
|
|
34
|
-
* <DataTable rows={page.users} columns={columns} rowKey={(r) => r.id}
|
|
35
|
-
* serverPagination={{ page, pageSize, total: page.total, onPageChange }}
|
|
36
|
-
* sorts={sorts} onSortsChange={setSorts} />
|
|
37
|
-
* // GET /admin/users?sort=${userRosterSort(sorts)}&…
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* The column keys ARE the server's sort keys (§3.1): `name`, `email`, `role`, `created`,
|
|
41
|
-
* `last_login` — so {@link userRosterSort} turns the table's sort state into the query
|
|
42
|
-
* as it is. Phone cards come from the same columns: the identity is the card's headline
|
|
43
|
-
* with the account's states as chips beside it, the role, last login and the actions are
|
|
44
|
-
* its three fields, created is left off.
|
|
45
|
-
*/
|
|
46
|
-
|
|
47
|
-
/* ── Rows and states ────────────────────────────────────────────────────────── */
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* The fields of the contract's `AdminUserRow` the preset reads (§3.2, the auth
|
|
51
|
-
* contract's `UserResponse` core). An app's row has more — its `extra` — and the
|
|
52
|
-
* preset passes the whole row to every callback.
|
|
53
|
-
*/
|
|
54
|
-
export interface UserRosterRow extends AdminUserStateFields {
|
|
55
|
-
id: string | number;
|
|
56
|
-
email: string;
|
|
57
|
-
first_name?: string | null;
|
|
58
|
-
last_name?: string | null;
|
|
59
|
-
/** The derived whole name — only the fallback when both parts are blank. */
|
|
60
|
-
display_name?: string | null;
|
|
61
|
-
/** keksdose, Kurvenschmiede: one role. */
|
|
62
|
-
role?: string | null;
|
|
63
|
-
/** kastlan: the account's roles in the current company. Wins over `role`. */
|
|
64
|
-
roles?: readonly string[] | null;
|
|
65
|
-
created_at?: DateInput;
|
|
66
|
-
/** Account-wide; kastlan's comes from its session rows (§3.2). */
|
|
67
|
-
last_login_at?: DateInput;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** The state fields of the contract's row that {@link adminUserStates} maps (§3.2). */
|
|
71
|
-
export interface AdminUserStateFields {
|
|
72
|
-
is_active?: boolean;
|
|
73
|
-
email_verified?: boolean;
|
|
74
|
-
password_change_required_at?: string | null;
|
|
75
|
-
/** `after_days` mode: the day the account is erased (§6.4). */
|
|
76
|
-
deletion_scheduled_at?: string | null;
|
|
77
|
-
/** When the user asked. The only deletion field in kastlan's `operator` mode, where
|
|
78
|
-
* nothing is scheduled. */
|
|
79
|
-
deletion_requested_at?: string | null;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** One state chip of a row: an {@link AccountState}, or one with its `date` (the
|
|
83
|
-
* `deletion` day), a `tone` or the app's own words. */
|
|
84
|
-
export type RosterState = AccountState | { state: AccountState; date?: DateInput; tone?: ChipTone; label?: ReactNode };
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* The contract's row as state chips (§3.2: "map 1:1 to the kit's AccountStateChip"):
|
|
88
|
-
*
|
|
89
|
-
* - marked for deletion → `deletion` with the scheduled day (none in `operator` mode),
|
|
90
|
-
* IN PLACE of `inactive` — such an account is always deactivated (§2.1);
|
|
91
|
-
* - else `active` / `inactive` from `is_active`;
|
|
92
|
-
* - `unverified` when `email_verified` is `false` (not when it is missing);
|
|
93
|
-
* - `passwordChange` while `password_change_required_at` is set.
|
|
94
|
-
*/
|
|
95
|
-
export function adminUserStates(row: AdminUserStateFields): RosterState[] {
|
|
96
|
-
const out: RosterState[] = [];
|
|
97
|
-
if (row.deletion_scheduled_at || row.deletion_requested_at) {
|
|
98
|
-
out.push({ state: "deletion", date: row.deletion_scheduled_at ?? null });
|
|
99
|
-
} else if (row.is_active !== undefined) {
|
|
100
|
-
out.push(row.is_active ? "active" : "inactive");
|
|
101
|
-
}
|
|
102
|
-
if (row.email_verified === false) out.push("unverified");
|
|
103
|
-
if (row.password_change_required_at) out.push("passwordChange");
|
|
104
|
-
return out;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** The server's sort keys, which are the preset's column keys (§3.1). */
|
|
108
|
-
export const USER_ROSTER_SORT_KEYS = ["name", "email", "role", "created", "last_login"] as const;
|
|
109
|
-
export type UserRosterSortKey = (typeof USER_ROSTER_SORT_KEYS)[number];
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* The table's sort state as the `sort` query parameter of `GET /admin/users` (§3.1), in
|
|
113
|
-
* the DataTable's own encoding ({@link encodeSorts}: `"last_login.desc"`), which
|
|
114
|
-
* server-kit 0.4 reads beside the `-key` form. Only the first criterion on one of the
|
|
115
|
-
* server's keys: an app's own column (`owned`) is the client's to sort, and the query
|
|
116
|
-
* takes one key — a shift-clicked second criterion is not sent. `undefined` when nothing
|
|
117
|
-
* the server knows is sorted, so its default order applies.
|
|
118
|
-
*/
|
|
119
|
-
export function userRosterSort(sorts: readonly SortState[]): string | undefined {
|
|
120
|
-
const first = sorts.find((s) => (USER_ROSTER_SORT_KEYS as readonly string[]).includes(s.key));
|
|
121
|
-
return first ? (encodeSorts([first]) ?? undefined) : undefined;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/* ── Labels ─────────────────────────────────────────────────────────────────── */
|
|
125
|
-
|
|
126
|
-
/** The `userRoster` namespace: the preset's headers and the action menu's words. */
|
|
127
|
-
export interface UserRosterLabels {
|
|
128
|
-
/** The identity column — the name with the address under it. */
|
|
129
|
-
name: string;
|
|
130
|
-
/** The separate address column (`emailColumn`). */
|
|
131
|
-
email: string;
|
|
132
|
-
role: string;
|
|
133
|
-
state: string;
|
|
134
|
-
created: string;
|
|
135
|
-
lastLogin: string;
|
|
136
|
-
/** A last login that never happened. */
|
|
137
|
-
never: string;
|
|
138
|
-
/** The actions column's (hidden) header. */
|
|
139
|
-
actions: string;
|
|
140
|
-
/** The action menu's button and panel — "Actions for Ada Example". */
|
|
141
|
-
actionsFor: (name: string) => string;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Defined in ./user-roster-labels, which holds no component code (0.34, KS U8).
|
|
145
|
-
export { DEFAULT_USER_ROSTER_LABELS };
|
|
146
|
-
|
|
147
|
-
/* ── UserIdentityCell ───────────────────────────────────────────────────────── */
|
|
148
|
-
|
|
149
|
-
export interface UserIdentityCellProps {
|
|
150
|
-
/** First and last name (auth §3.2), shown in the READER's order. */
|
|
151
|
-
person?: PersonName | null;
|
|
152
|
-
/** A whole name, for an API that still sends `display_name` only. */
|
|
153
|
-
name?: string | null;
|
|
154
|
-
email?: string | null;
|
|
155
|
-
/** The initials avatar before the name. Default true. */
|
|
156
|
-
avatar?: boolean;
|
|
157
|
-
/** After the name, on its line — a "You" chip, a demo mark. */
|
|
158
|
-
badge?: ReactNode;
|
|
159
|
-
/** Over the provider's locale. */
|
|
160
|
-
locale?: string;
|
|
161
|
-
className?: string;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Who an account is, in one cell (§3.3): the initials avatar, the name in the reader's
|
|
166
|
-
* order ({@link formatPersonName} — "Example Ada" in Hungarian) and the address under it
|
|
167
|
-
* — the cell both rosters drew by hand. An account with no name yet (a migrated row
|
|
168
|
-
* before `CompleteNameDialog`, an invitee) shows its address once, as the name.
|
|
169
|
-
*
|
|
170
|
-
* Both lines carry `data-private`, so keksdose's demo blur reaches them, and both end
|
|
171
|
-
* in "…" at Normal only: from Large up they wrap (`truncate-until-large`, 0.33,
|
|
172
|
-
* docs/text-size-harmonization.md §10.17), since a cut name or address is a finding there.
|
|
173
|
-
*/
|
|
174
|
-
export function UserIdentityCell({
|
|
175
|
-
person,
|
|
176
|
-
name,
|
|
177
|
-
email,
|
|
178
|
-
avatar = true,
|
|
179
|
-
badge,
|
|
180
|
-
locale: localeProp,
|
|
181
|
-
className,
|
|
182
|
-
}: UserIdentityCellProps) {
|
|
183
|
-
const locale = useKitLocale(localeProp);
|
|
184
|
-
const named = personLabel({ first: person?.first, last: person?.last, name }, locale);
|
|
185
|
-
const address = (email ?? "").trim();
|
|
186
|
-
return (
|
|
187
|
-
<div className={cn("flex min-w-0 items-center gap-2.5", className)}>
|
|
188
|
-
{avatar && <UserAvatar person={person} name={name} email={email} size="sm" />}
|
|
189
|
-
<div className="min-w-0">
|
|
190
|
-
<div className="flex min-w-0 items-center gap-1.5">
|
|
191
|
-
<span data-private className="truncate-until-large font-medium text-primary">
|
|
192
|
-
{named || address}
|
|
193
|
-
</span>
|
|
194
|
-
{badge}
|
|
195
|
-
</div>
|
|
196
|
-
{named && address && (
|
|
197
|
-
<div data-private className="truncate-until-large text-xs text-muted">
|
|
198
|
-
{address}
|
|
199
|
-
</div>
|
|
200
|
-
)}
|
|
201
|
-
</div>
|
|
202
|
-
</div>
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/* ── The row's actions ──────────────────────────────────────────────────────── */
|
|
207
|
-
|
|
208
|
-
/** One entry of a row's action menu (§4) — the kit's {@link RowAction} since 0.32,
|
|
209
|
-
* which generalised it for every dense row (docs/text-size-harmonization.md §10.8). */
|
|
210
|
-
export type UserRowAction = RowAction;
|
|
211
|
-
|
|
212
|
-
/** What `actions(row)` may return: entries, and `false` / `null` for the ones a
|
|
213
|
-
* condition left out (`row.is_active && {…}`). */
|
|
214
|
-
export type UserRowActionList = RowActionList;
|
|
215
|
-
|
|
216
|
-
export interface UserRowActionsProps {
|
|
217
|
-
actions: UserRowActionList;
|
|
218
|
-
/** The account's name, for the menu's name — "Actions for Ada Example". */
|
|
219
|
-
name: string;
|
|
220
|
-
labels?: LabelOverride<UserRosterLabels>;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* A row's actions as one "…" button and a menu of them: keksdose had a strip of icon
|
|
225
|
-
* buttons in the expanded row, Kurvenschmiede five text buttons in a cell — neither fits
|
|
226
|
-
* a phone card, and both grow with every action §2.4 adds. The menu is portalled, so a
|
|
227
|
-
* table's scroller cannot clip it; Escape and an outside press close it, and focus goes
|
|
228
|
-
* back to the button, which is where a confirmation dialog then returns it.
|
|
229
|
-
*
|
|
230
|
-
* Since 0.32 this is {@link RowActions} with `collapse="menu"` — the menu at every size —
|
|
231
|
-
* named by the roster's own `actionsFor`.
|
|
232
|
-
*/
|
|
233
|
-
export function UserRowActions({ actions, name, labels: labelsProp }: UserRowActionsProps) {
|
|
234
|
-
const labels = useKitLabels("userRoster", DEFAULT_USER_ROSTER_LABELS, labelsProp);
|
|
235
|
-
return <RowActions actions={actions} name={name} collapse="menu" labels={{ actionsFor: labels.actionsFor }} />;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
/* ── The preset ─────────────────────────────────────────────────────────────── */
|
|
239
|
-
|
|
240
|
-
/** How a row's role may be changed inline: `true`, or with reasons. */
|
|
241
|
-
export interface RoleEditing<R extends string> {
|
|
242
|
-
/** Why the whole select is locked for this row — `"self"`, `"last_admin"`, or words. */
|
|
243
|
-
disabledReason?: RoleLock;
|
|
244
|
-
/** Why one role cannot be chosen for this row (a string: it goes inside an option). */
|
|
245
|
-
optionDisabledReason?: (role: R) => string | undefined;
|
|
246
|
-
/** The roles that may be chosen. Default: the whole vocabulary. */
|
|
247
|
-
offered?: readonly R[];
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
export interface UserRosterColumnsOptions<T extends UserRosterRow, R extends string = string> {
|
|
251
|
-
/** The app's roles, as `RoleChip` reads them. */
|
|
252
|
-
roles: RoleVocabulary<R>;
|
|
253
|
-
/** The row's state chips. Default {@link adminUserStates}, which reads the contract's
|
|
254
|
-
* fields (`is_active`, `email_verified`, `password_change_required_at`,
|
|
255
|
-
* `deletion_scheduled_at`, `deletion_requested_at`). */
|
|
256
|
-
stateOf?: (row: T) => readonly RosterState[];
|
|
257
|
-
/** The app's own columns — keksdose's plan and key custody, Kurvenschmiede's owned
|
|
258
|
-
* counts — after the dates, before the actions. */
|
|
259
|
-
extra?: readonly DataTableColumn<T>[];
|
|
260
|
-
/** The row's action menu (§4). Left out: no actions column. */
|
|
261
|
-
actions?: (row: T) => UserRowActionList;
|
|
262
|
-
/** The actions column's heading (0.46.1, keksdose dev#598 rework — a VISIBLE "Actions"
|
|
263
|
-
* on every table with an actions column). Default: `labels.actions`, shown. A node
|
|
264
|
-
* replaces it; `false` keeps the pre-0.46.1 heading, a screen reader's name only. */
|
|
265
|
-
actionsHeader?: ReactNode | false;
|
|
266
|
-
/**
|
|
267
|
-
* Whether this row's role is a select rather than a chip, and with which reasons.
|
|
268
|
-
* Left out, or `false`: a chip. kastlan's several roles are never a select here — they
|
|
269
|
-
* are a "Manage roles" action that opens `RolesEditor`.
|
|
270
|
-
*/
|
|
271
|
-
editableRole?: (row: T) => boolean | RoleEditing<R>;
|
|
272
|
-
/** A role was picked in a row's select. The app confirms (`acknowledge`) and sends it. */
|
|
273
|
-
onRoleChange?: (row: T, role: R) => void;
|
|
274
|
-
/** The row's role(s). Default `row.roles ?? row.role`. */
|
|
275
|
-
roleOf?: (row: T) => R | readonly R[] | null | undefined;
|
|
276
|
-
/** A separate, sortable "Email" column (the server's `email` sort key) beside the
|
|
277
|
-
* identity. Default false: the address is under the name already. */
|
|
278
|
-
emailColumn?: boolean;
|
|
279
|
-
/** The words, already resolved. Default English; {@link useUserRosterColumns} reads
|
|
280
|
-
* the provider's `userRoster` namespace. */
|
|
281
|
-
labels?: LabelOverride<UserRosterLabels>;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
function rolesOf<T extends UserRosterRow, R extends string>(
|
|
285
|
-
row: T,
|
|
286
|
-
roleOf: UserRosterColumnsOptions<T, R>["roleOf"],
|
|
287
|
-
): R[] {
|
|
288
|
-
const raw = roleOf ? roleOf(row) : ((row.roles ?? row.role) as R | readonly R[] | null | undefined);
|
|
289
|
-
if (raw === null || raw === undefined || raw === "") return [];
|
|
290
|
-
return typeof raw === "string" ? [raw as R] : [...(raw as readonly R[])];
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/** What a row's role select can show as its value: every role's word, and a held key
|
|
294
|
-
* the vocabulary does not know (RoleSelect shows it as the key). */
|
|
295
|
-
function roleWordsOf<R extends string>(roles: RoleVocabulary<R>, held: R | undefined): string[] {
|
|
296
|
-
const words = (Object.keys(roles) as R[]).map((role) => roles[role].label);
|
|
297
|
-
return held !== undefined && !(held in roles) ? [...words, held] : words;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/** The row's name in the reader's order — a component, because the order is the
|
|
301
|
-
* READER's and the locale comes from the provider. */
|
|
302
|
-
function RowName<T extends UserRosterRow>({ row, children }: { row: T; children: (name: string) => ReactNode }) {
|
|
303
|
-
const locale = useKitLocale();
|
|
304
|
-
const name = personLabel(
|
|
305
|
-
{ first: row.first_name, last: row.last_name, name: row.display_name, email: row.email },
|
|
306
|
-
locale,
|
|
307
|
-
);
|
|
308
|
-
return <>{children(name)}</>;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
function StateChips({ states }: { states: readonly RosterState[] }) {
|
|
312
|
-
if (states.length === 0) return null;
|
|
313
|
-
return (
|
|
314
|
-
<div className="flex flex-wrap gap-1">
|
|
315
|
-
{states.map((entry) => {
|
|
316
|
-
const spec = typeof entry === "string" ? { state: entry } : entry;
|
|
317
|
-
return (
|
|
318
|
-
<AccountStateChip key={spec.state} state={spec.state} date={spec.date} tone={spec.tone} size="xs">
|
|
319
|
-
{spec.label}
|
|
320
|
-
</AccountStateChip>
|
|
321
|
-
);
|
|
322
|
-
})}
|
|
323
|
-
</div>
|
|
324
|
-
);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/**
|
|
328
|
-
* The roster's columns, in the contract's order (§3.3):
|
|
329
|
-
*
|
|
330
|
-
* | key | cell | sort | phone | fit (0.50) |
|
|
331
|
-
* |---|---|---|---|---|
|
|
332
|
-
* | `name` | {@link UserIdentityCell} | last, first | the card's headline | `grow` |
|
|
333
|
-
* | `email` | the address (`emailColumn` only) | address | hidden | — |
|
|
334
|
-
* | `role` | `RoleChip`(s), or {@link RoleSelect} where `editableRole` | role | field | — |
|
|
335
|
-
* | `state` | `AccountStateChip`s from `stateOf` | — | chips beside the headline | — |
|
|
336
|
-
* | `created` | `dateColumn` | instant | hidden | `fitPriority: 1` |
|
|
337
|
-
* | `last_login` | `dateColumn`, relative, "Never" | instant | field | `fitPriority: 2` |
|
|
338
|
-
* | …`extra` | the app's | the app's | off the card unless marked `mobile: "secondary"` | the app's |
|
|
339
|
-
* | `actions` | {@link UserRowActions} | — | the card's actions row (`role: "actions"`) | — |
|
|
340
|
-
*
|
|
341
|
-
* The fit (0.50, kastlan K2): Name takes the rest of the row, and a table narrower than
|
|
342
|
-
* its columns leaves out Created, then Last login (DataTable's `grow` / `fitPriority`).
|
|
343
|
-
* The role and state chips still wrap in their cells (0.48), and the other cells keep one
|
|
344
|
-
* line at Normal. `{ ...col, grow: undefined, fitPriority: undefined }` restores the 0.49
|
|
345
|
-
* layout; an `extra` column takes a `fitPriority` of its own to leave too.
|
|
346
|
-
*
|
|
347
|
-
* The card holds three fields — `role`, `last_login` and one more: an `extra` column marked
|
|
348
|
-
* `mobile: "secondary"` takes that place. The actions are `role: "actions"` (0.49), drawn
|
|
349
|
-
* after the fields and never one of the three. Drop them from the card with
|
|
350
|
-
* `mobile: "hidden"`, or draw a `mobileCard`.
|
|
351
|
-
*
|
|
352
|
-
* Pure: hand it resolved words, or use {@link useUserRosterColumns}. The keys are stable,
|
|
353
|
-
* so an app may drop or move a column (`columns.filter((c) => c.key !== "created")`).
|
|
354
|
-
* Under `serverPagination` the `sortBy`s only make the headers clickable; the app sends
|
|
355
|
-
* the sort ({@link userRosterSort}).
|
|
356
|
-
*/
|
|
357
|
-
export function userRosterColumns<T extends UserRosterRow, R extends string = string>({
|
|
358
|
-
roles,
|
|
359
|
-
stateOf = adminUserStates,
|
|
360
|
-
extra = [],
|
|
361
|
-
actions,
|
|
362
|
-
actionsHeader,
|
|
363
|
-
editableRole,
|
|
364
|
-
onRoleChange,
|
|
365
|
-
roleOf,
|
|
366
|
-
emailColumn = false,
|
|
367
|
-
labels: labelsProp,
|
|
368
|
-
}: UserRosterColumnsOptions<T, R>): DataTableColumn<T>[] {
|
|
369
|
-
const labels: UserRosterLabels = { ...DEFAULT_USER_ROSTER_LABELS, ...labelsProp };
|
|
370
|
-
const roleWords = (row: T) =>
|
|
371
|
-
rolesOf(row, roleOf)
|
|
372
|
-
.map((role) => roles[role]?.label ?? role)
|
|
373
|
-
.join(", ");
|
|
374
|
-
const columns: DataTableColumn<T>[] = [
|
|
375
|
-
{
|
|
376
|
-
key: "name",
|
|
377
|
-
header: labels.name,
|
|
378
|
-
cell: (row) => (
|
|
379
|
-
<UserIdentityCell
|
|
380
|
-
person={{ first: row.first_name, last: row.last_name }}
|
|
381
|
-
name={row.display_name}
|
|
382
|
-
email={row.email}
|
|
383
|
-
/>
|
|
384
|
-
),
|
|
385
|
-
// By last name, then first (auth §3.2), as the server sorts `name`.
|
|
386
|
-
sortBy: (row) => `${row.last_name ?? ""} ${row.first_name ?? ""}`.trim().toLocaleLowerCase() || row.email,
|
|
387
|
-
// Either part, in either order, or the address (auth §10.6).
|
|
388
|
-
filterBy: (row) =>
|
|
389
|
-
[row.first_name, row.last_name, row.last_name, row.first_name, row.display_name, row.email]
|
|
390
|
-
.filter(Boolean)
|
|
391
|
-
.join(" "),
|
|
392
|
-
mobilePrimary: true,
|
|
393
|
-
// Takes the rest of the row and ellipsises (0.50, kastlan K2): the roster fits its
|
|
394
|
-
// pane — a settings column, an admin page — instead of scrolling sideways.
|
|
395
|
-
grow: true,
|
|
396
|
-
},
|
|
397
|
-
];
|
|
398
|
-
if (emailColumn) {
|
|
399
|
-
columns.push({
|
|
400
|
-
key: "email",
|
|
401
|
-
header: labels.email,
|
|
402
|
-
className: "whitespace-nowrap",
|
|
403
|
-
cell: (row) => (
|
|
404
|
-
<span data-private className="text-secondary">
|
|
405
|
-
{row.email}
|
|
406
|
-
</span>
|
|
407
|
-
),
|
|
408
|
-
sortBy: (row) => row.email.toLowerCase(),
|
|
409
|
-
filterBy: (row) => row.email,
|
|
410
|
-
mobileHidden: true,
|
|
411
|
-
});
|
|
412
|
-
}
|
|
413
|
-
columns.push(
|
|
414
|
-
{
|
|
415
|
-
key: "role",
|
|
416
|
-
header: labels.role,
|
|
417
|
-
cell: (row) => {
|
|
418
|
-
const held = rolesOf(row, roleOf);
|
|
419
|
-
const editing = held.length <= 1 ? editableRole?.(row) : false;
|
|
420
|
-
if (editing && onRoleChange) {
|
|
421
|
-
const rules: RoleEditing<R> = editing === true ? {} : editing;
|
|
422
|
-
return (
|
|
423
|
-
<RowName row={row}>
|
|
424
|
-
{(name) => (
|
|
425
|
-
// The column keeps room for the select's longest ROLE word in the app's
|
|
426
|
-
// language (0.51, Kurvenschmiede N5): beside the `grow` Name every other
|
|
427
|
-
// column is squeezed to its min-content, which a `w-full` select does not
|
|
428
|
-
// have, so the role select was the header's ~92px and read "Meml…",
|
|
429
|
-
// "Admi…". Every word of the vocabulary, not only the row's offered
|
|
430
|
-
// ones: the column is as wide as its widest row, so the rows line up, and
|
|
431
|
-
// a role held but not offered (KS's Reviewer) is still a selected value.
|
|
432
|
-
// Not the options' reasons ("Customer (owns work)"): they are never the
|
|
433
|
-
// selected value, and the open list is as wide as it needs anyway.
|
|
434
|
-
<div>
|
|
435
|
-
<RoleSelect<R>
|
|
436
|
-
size="sm"
|
|
437
|
-
name={name}
|
|
438
|
-
value={held[0] ?? null}
|
|
439
|
-
roles={roles}
|
|
440
|
-
offered={rules.offered}
|
|
441
|
-
disabledReason={rules.disabledReason}
|
|
442
|
-
optionDisabledReason={rules.optionDisabledReason}
|
|
443
|
-
onChange={(role) => onRoleChange(row, role)}
|
|
444
|
-
/>
|
|
445
|
-
<SelectWidthFloor size="sm" values={roleWordsOf(roles, held[0])} />
|
|
446
|
-
</div>
|
|
447
|
-
)}
|
|
448
|
-
</RowName>
|
|
449
|
-
);
|
|
450
|
-
}
|
|
451
|
-
if (held.length === 0) return null;
|
|
452
|
-
return (
|
|
453
|
-
<div className="flex flex-wrap gap-1">
|
|
454
|
-
{held.map((role) => (
|
|
455
|
-
<RoleChip<R> key={role} value={role} roles={roles} size="xs" />
|
|
456
|
-
))}
|
|
457
|
-
</div>
|
|
458
|
-
);
|
|
459
|
-
},
|
|
460
|
-
sortBy: roleWords,
|
|
461
|
-
filter: {
|
|
462
|
-
type: "select",
|
|
463
|
-
getValue: (row) => rolesOf(row, roleOf)[0] ?? "",
|
|
464
|
-
options: (Object.keys(roles) as R[]).map((value) => ({ value, label: roles[value].label })),
|
|
465
|
-
},
|
|
466
|
-
mobile: "secondary",
|
|
467
|
-
},
|
|
468
|
-
{
|
|
469
|
-
key: "state",
|
|
470
|
-
header: labels.state,
|
|
471
|
-
// No states, no cell: the phone card then shows no chip beside the name.
|
|
472
|
-
cell: (row) => {
|
|
473
|
-
const states = stateOf(row);
|
|
474
|
-
return states.length === 0 ? null : <StateChips states={states} />;
|
|
475
|
-
},
|
|
476
|
-
// Beside the name on the phone card, so the role, last login and the actions keep
|
|
477
|
-
// the card's three fields.
|
|
478
|
-
role: "status",
|
|
479
|
-
},
|
|
480
|
-
dateColumn<T>({
|
|
481
|
-
key: "created",
|
|
482
|
-
header: labels.created,
|
|
483
|
-
value: (row) => row.created_at ?? null,
|
|
484
|
-
// The first to leave a narrow table (0.50, kastlan K2), then last login.
|
|
485
|
-
column: { mobileHidden: true, fitPriority: 1 },
|
|
486
|
-
}),
|
|
487
|
-
// How long ago rather than a date — the question is "recently?" — with the exact
|
|
488
|
-
// time beside it (keksdose's last-seen column, Kurvenschmiede's; 0.32 §4: never only
|
|
489
|
-
// in a tooltip).
|
|
490
|
-
dateColumn<T>({
|
|
491
|
-
key: "last_login",
|
|
492
|
-
header: labels.lastLogin,
|
|
493
|
-
value: (row) => row.last_login_at ?? null,
|
|
494
|
-
display: "relative",
|
|
495
|
-
empty: labels.never,
|
|
496
|
-
column: { mobile: "secondary", fitPriority: 2 },
|
|
497
|
-
}),
|
|
498
|
-
...extra,
|
|
499
|
-
);
|
|
500
|
-
if (actions) {
|
|
501
|
-
columns.push({
|
|
502
|
-
key: "actions",
|
|
503
|
-
// On screen, as every actions column's heading is (0.46.1, keksdose dev#598 rework).
|
|
504
|
-
header:
|
|
505
|
-
actionsHeader === false ? <span className="sr-only">{labels.actions}</span> : (actionsHeader ?? labels.actions),
|
|
506
|
-
headerText: labels.actions,
|
|
507
|
-
// The caller's own words only: the menu reads the provider's itself, and the
|
|
508
|
-
// English defaults merged in above must not shadow them.
|
|
509
|
-
cell: (row) => (
|
|
510
|
-
<RowName row={row}>
|
|
511
|
-
{(name) => <UserRowActions actions={actions(row)} name={name} labels={labelsProp} />}
|
|
512
|
-
</RowName>
|
|
513
|
-
),
|
|
514
|
-
className: "w-px whitespace-nowrap text-end",
|
|
515
|
-
headClassName: "w-px text-end",
|
|
516
|
-
// The menu button keeps its own click: a row link must not wrap it.
|
|
517
|
-
noRowLink: true,
|
|
518
|
-
// Always on the phone card, after the fields and never one of the three (0.49).
|
|
519
|
-
role: "actions",
|
|
520
|
-
});
|
|
521
|
-
}
|
|
522
|
-
return columns;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
/**
|
|
526
|
-
* {@link userRosterColumns} with the `userRoster` words from the provider, memoised on
|
|
527
|
-
* the options — pass stable callbacks (`useCallback`) and a module-level vocabulary, or
|
|
528
|
-
* the columns are rebuilt on every render.
|
|
529
|
-
*/
|
|
530
|
-
export function useUserRosterColumns<T extends UserRosterRow, R extends string = string>({
|
|
531
|
-
roles,
|
|
532
|
-
stateOf,
|
|
533
|
-
extra,
|
|
534
|
-
actions,
|
|
535
|
-
actionsHeader,
|
|
536
|
-
editableRole,
|
|
537
|
-
onRoleChange,
|
|
538
|
-
roleOf,
|
|
539
|
-
emailColumn,
|
|
540
|
-
labels: labelsProp,
|
|
541
|
-
}: UserRosterColumnsOptions<T, R>): DataTableColumn<T>[] {
|
|
542
|
-
const labels = useKitLabels("userRoster", DEFAULT_USER_ROSTER_LABELS, labelsProp);
|
|
543
|
-
return useMemo(
|
|
544
|
-
() =>
|
|
545
|
-
userRosterColumns<T, R>({
|
|
546
|
-
roles,
|
|
547
|
-
stateOf,
|
|
548
|
-
extra,
|
|
549
|
-
actions,
|
|
550
|
-
actionsHeader,
|
|
551
|
-
editableRole,
|
|
552
|
-
onRoleChange,
|
|
553
|
-
roleOf,
|
|
554
|
-
emailColumn,
|
|
555
|
-
labels,
|
|
556
|
-
}),
|
|
557
|
-
[roles, stateOf, extra, actions, actionsHeader, editableRole, onRoleChange, roleOf, emailColumn, labels],
|
|
558
|
-
);
|
|
559
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// The English words of ./accept-invitation, in a module with no component code: the English
|
|
2
|
-
// catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
|
|
3
|
-
// chunk like the other languages (0.34, KS U8). ./accept-invitation re-exports them.
|
|
4
|
-
|
|
5
|
-
import type { AcceptInvitationLabels } from "./accept-invitation";
|
|
6
|
-
|
|
7
|
-
export const DEFAULT_ACCEPT_INVITATION_LABELS: AcceptInvitationLabels = {
|
|
8
|
-
title: "Accept invitation",
|
|
9
|
-
accepting: "Joining…",
|
|
10
|
-
accepted: "Invitation accepted.",
|
|
11
|
-
joined: (name) => `You’ve joined ${name}.`,
|
|
12
|
-
continue: "Continue",
|
|
13
|
-
invalid: "Could not join with this link",
|
|
14
|
-
expired: "This invitation has expired",
|
|
15
|
-
noToken: "This link is missing its invite token.",
|
|
16
|
-
askAgain: "Ask the person who invited you to send a new invitation.",
|
|
17
|
-
signInFirst: "Sign in to accept this invitation",
|
|
18
|
-
signInHint: "Use the account the invitation was sent to.",
|
|
19
|
-
signIn: "Sign in",
|
|
20
|
-
register: "Create account",
|
|
21
|
-
};
|