@storyshelf/core 0.3.2 → 0.5.3
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 +38 -31
- package/dist/adapter/capture-queue.d.mts +29 -1
- package/dist/adapter/capture-runner.d.mts +18 -2
- package/dist/adapter/capture-runner.mjs +12 -1
- package/dist/adapter/capture-runner.mjs.map +1 -0
- package/dist/adapter/database.d.mts +67 -17
- package/dist/adapter/database.mjs +22 -55
- package/dist/adapter/database.mjs.map +1 -1
- package/dist/adapter/email-sender.d.mts +27 -0
- package/dist/adapter/email-sender.mjs +4 -0
- package/dist/adapter/metadata.d.mts +21 -15
- package/dist/adapter/notifier.d.mts +7 -0
- package/dist/adapter/notifier.mjs +6 -0
- package/dist/adapter/setup.d.mts +61 -0
- package/dist/adapter/setup.mjs +29 -0
- package/dist/adapter/setup.mjs.map +1 -0
- package/dist/adapter/webhook-events.d.mts +29 -0
- package/dist/adapter/webhook-events.mjs +83 -0
- package/dist/adapter/webhook-events.mjs.map +1 -0
- package/dist/adapters/notifier/events.d.mts +26 -0
- package/dist/adapters/notifier/events.mjs +66 -0
- package/dist/adapters/notifier/events.mjs.map +1 -0
- package/dist/adapters/notifier/format.d.mts +14 -0
- package/dist/adapters/notifier/format.mjs +96 -0
- package/dist/adapters/notifier/format.mjs.map +1 -0
- package/dist/adapters/notifier/provider.d.mts +32 -0
- package/dist/adapters/notifier/types.d.mts +56 -0
- package/dist/adapters/setup-runner.d.mts +23 -0
- package/dist/adapters/setup-runner.mjs +149 -0
- package/dist/adapters/setup-runner.mjs.map +1 -0
- package/dist/adapters/validate.d.mts +30 -0
- package/dist/adapters/validate.mjs +313 -0
- package/dist/adapters/validate.mjs.map +1 -0
- package/dist/auth.d.mts +94 -0
- package/dist/auth.mjs +4 -0
- package/dist/brand-packs.d.mts +16 -0
- package/dist/brand-packs.mjs +130 -0
- package/dist/brand-packs.mjs.map +1 -0
- package/dist/capture/adapter.d.mts +51 -1
- package/dist/capture/adapter.mjs.map +1 -1
- package/dist/capture/affected.d.mts +16 -0
- package/dist/capture/affected.mjs +64 -0
- package/dist/capture/affected.mjs.map +1 -0
- package/dist/capture/diff-record.mjs +30 -0
- package/dist/capture/diff-record.mjs.map +1 -0
- package/dist/capture/dispatch.d.mts +36 -0
- package/dist/capture/dispatch.mjs +88 -31
- package/dist/capture/dispatch.mjs.map +1 -1
- package/dist/capture/guards.mjs +31 -0
- package/dist/capture/guards.mjs.map +1 -0
- package/dist/capture/orchestrator.d.mts +41 -6
- package/dist/capture/orchestrator.mjs +151 -28
- package/dist/capture/orchestrator.mjs.map +1 -1
- package/dist/capture/pipeline.d.mts +30 -16
- package/dist/capture/pipeline.mjs +143 -39
- package/dist/capture/pipeline.mjs.map +1 -1
- package/dist/capture/recovery.d.mts +21 -0
- package/dist/capture/recovery.mjs +83 -0
- package/dist/capture/recovery.mjs.map +1 -0
- package/dist/capture/rediff.d.mts +35 -0
- package/dist/capture/rediff.mjs +77 -0
- package/dist/capture/rediff.mjs.map +1 -0
- package/dist/capture/sizing.d.mts +58 -0
- package/dist/capture/sizing.mjs +119 -0
- package/dist/capture/sizing.mjs.map +1 -0
- package/dist/capture/skip-checks.mjs +3 -3
- package/dist/capture/skip-checks.mjs.map +1 -1
- package/dist/capture/statics.d.mts +38 -0
- package/dist/capture/statics.mjs +38 -4
- package/dist/capture/statics.mjs.map +1 -1
- package/dist/capture/status-fanout.mjs +7 -2
- package/dist/capture/status-fanout.mjs.map +1 -1
- package/dist/capture/storybook.d.mts +31 -2
- package/dist/capture/storybook.mjs +77 -2
- package/dist/capture/storybook.mjs.map +1 -1
- package/dist/capture.d.mts +10 -4
- package/dist/capture.mjs +7 -2
- package/dist/config.d.mts +121 -4
- package/dist/config.mjs +55 -8
- package/dist/config.mjs.map +1 -1
- package/dist/index.d.mts +5 -56
- package/dist/index.mjs +4 -284
- package/dist/logger.d.mts +26 -17
- package/dist/logger.mjs +10 -5
- package/dist/logger.mjs.map +1 -1
- package/dist/models/baseline-status.d.mts +29 -0
- package/dist/models/baseline-status.mjs +26 -0
- package/dist/models/baseline-status.mjs.map +1 -0
- package/dist/models/baseline.d.mts +33 -0
- package/dist/models/baseline.mjs +35 -13
- package/dist/models/baseline.mjs.map +1 -1
- package/dist/models/build.d.mts +87 -0
- package/dist/models/build.mjs +83 -35
- package/dist/models/build.mjs.map +1 -1
- package/dist/models/capture-attempt.d.mts +40 -0
- package/dist/models/capture-attempt.mjs +85 -0
- package/dist/models/capture-attempt.mjs.map +1 -0
- package/dist/models/capture-log.d.mts +21 -0
- package/dist/models/capture-log.mjs +44 -0
- package/dist/models/capture-log.mjs.map +1 -0
- package/dist/models/comment.d.mts +29 -0
- package/dist/models/comment.mjs +11 -8
- package/dist/models/comment.mjs.map +1 -1
- package/dist/models/content-ref.d.mts +21 -0
- package/dist/models/content-ref.mjs +49 -0
- package/dist/models/content-ref.mjs.map +1 -0
- package/dist/models/credentials.d.mts +36 -0
- package/dist/models/credentials.mjs +103 -0
- package/dist/models/credentials.mjs.map +1 -0
- package/dist/models/label.d.mts +58 -0
- package/dist/models/label.mjs +32 -27
- package/dist/models/label.mjs.map +1 -1
- package/dist/models/member.d.mts +34 -0
- package/dist/models/member.mjs +20 -11
- package/dist/models/member.mjs.map +1 -1
- package/dist/models/notification-channel.d.mts +52 -0
- package/dist/models/notification-channel.mjs +93 -0
- package/dist/models/notification-channel.mjs.map +1 -0
- package/dist/models/notification-subscription.d.mts +44 -0
- package/dist/models/notification-subscription.mjs +89 -0
- package/dist/models/notification-subscription.mjs.map +1 -0
- package/dist/models/project-group-mapping.d.mts +30 -0
- package/dist/models/project-group-mapping.mjs +46 -0
- package/dist/models/project-group-mapping.mjs.map +1 -0
- package/dist/models/project.d.mts +54 -0
- package/dist/models/project.mjs +15 -11
- package/dist/models/project.mjs.map +1 -1
- package/dist/models/snapshot.d.mts +58 -0
- package/dist/models/snapshot.mjs +13 -7
- package/dist/models/snapshot.mjs.map +1 -1
- package/dist/models/status-config.d.mts +38 -0
- package/dist/models/status-config.mjs +12 -11
- package/dist/models/status-config.mjs.map +1 -1
- package/dist/models/token.d.mts +44 -0
- package/dist/models/token.mjs +18 -15
- package/dist/models/token.mjs.map +1 -1
- package/dist/models/user.d.mts +42 -0
- package/dist/models/user.mjs +65 -0
- package/dist/models/user.mjs.map +1 -0
- package/dist/models/webhook.d.mts +50 -0
- package/dist/models/webhook.mjs +12 -10
- package/dist/models/webhook.mjs.map +1 -1
- package/dist/models.d.mts +22 -0
- package/dist/models.mjs +23 -0
- package/dist/paths.mjs +29 -0
- package/dist/paths.mjs.map +1 -1
- package/dist/retention.d.mts +45 -0
- package/dist/retention.mjs +145 -0
- package/dist/retention.mjs.map +1 -0
- package/dist/schema/baseline.d.mts +1 -0
- package/dist/schema/build.d.mts +8 -0
- package/dist/schema/capture-attempt.d.mts +38 -0
- package/dist/schema/comment.d.mts +1 -1
- package/dist/schema/content-ref.d.mts +13 -0
- package/dist/schema/member.d.mts +2 -0
- package/dist/schema/notification.d.mts +35 -0
- package/dist/schema/project-group-mapping.d.mts +15 -0
- package/dist/schema/project.d.mts +4 -0
- package/dist/schema/snapshot.d.mts +7 -0
- package/dist/schema/token.d.mts +2 -0
- package/dist/schema/user.d.mts +11 -1
- package/dist/schema.d.mts +9 -46
- package/dist/schema.mjs +1 -55
- package/dist/test-helpers/create-project.d.mts +15 -0
- package/dist/test-helpers/create-project.mjs +28 -0
- package/dist/test-helpers/create-project.mjs.map +1 -0
- package/dist/test-helpers/database-contract.d.mts +13 -0
- package/dist/test-helpers/database-contract.mjs +58 -0
- package/dist/test-helpers/database-contract.mjs.map +1 -0
- package/dist/test-helpers/fake-adapters.d.mts +14 -0
- package/dist/test-helpers/fake-adapters.mjs +20 -0
- package/dist/test-helpers/fake-adapters.mjs.map +1 -0
- package/dist/test-helpers/fake-database.d.mts +11 -0
- package/dist/test-helpers/fake-database.mjs +104 -0
- package/dist/test-helpers/fake-database.mjs.map +1 -0
- package/dist/test-helpers/fake-storage.d.mts +14 -0
- package/dist/test-helpers/fake-storage.mjs +49 -0
- package/dist/test-helpers/fake-storage.mjs.map +1 -0
- package/dist/test-helpers/fake-tables.mjs +276 -0
- package/dist/test-helpers/fake-tables.mjs.map +1 -0
- package/dist/test-helpers/git-contract.d.mts +11 -0
- package/dist/test-helpers/git-contract.mjs +34 -0
- package/dist/test-helpers/git-contract.mjs.map +1 -0
- package/dist/test-helpers/notifier-contract.d.mts +11 -0
- package/dist/test-helpers/notifier-contract.mjs +34 -0
- package/dist/test-helpers/notifier-contract.mjs.map +1 -0
- package/dist/test-helpers/queue-contract.d.mts +11 -0
- package/dist/test-helpers/queue-contract.mjs +64 -0
- package/dist/test-helpers/queue-contract.mjs.map +1 -0
- package/dist/test-helpers/runner-contract.d.mts +11 -0
- package/dist/test-helpers/runner-contract.mjs +32 -0
- package/dist/test-helpers/runner-contract.mjs.map +1 -0
- package/dist/test-helpers/sql-chunks.mjs +138 -0
- package/dist/test-helpers/sql-chunks.mjs.map +1 -0
- package/dist/test-helpers/storage-contract.d.mts +11 -0
- package/dist/test-helpers/storage-contract.mjs +87 -0
- package/dist/test-helpers/storage-contract.mjs.map +1 -0
- package/dist/test-helpers.d.mts +13 -0
- package/dist/test-helpers.mjs +14 -0
- package/dist/tracing.mjs +63 -0
- package/dist/tracing.mjs.map +1 -0
- package/dist/types.d.mts +38 -5
- package/dist/types.mjs +18 -5
- package/dist/types.mjs.map +1 -1
- package/dist/urls.d.mts +12 -1
- package/dist/urls.mjs +22 -3
- package/dist/urls.mjs.map +1 -1
- package/dist/utils/encrypt.d.mts +48 -0
- package/dist/utils/encrypt.mjs +67 -13
- package/dist/utils/encrypt.mjs.map +1 -1
- package/dist/utils/hash.d.mts +17 -0
- package/dist/utils/hash.mjs +8 -2
- package/dist/utils/hash.mjs.map +1 -1
- package/dist/utils/http.d.mts +58 -0
- package/dist/utils/http.mjs +147 -0
- package/dist/utils/http.mjs.map +1 -0
- package/dist/utils/mime.d.mts +9 -0
- package/dist/utils/mime.mjs +33 -0
- package/dist/utils/mime.mjs.map +1 -0
- package/dist/utils/path-security.d.mts +12 -0
- package/dist/utils/path-security.mjs +24 -0
- package/dist/utils/path-security.mjs.map +1 -0
- package/dist/utils/redact.d.mts +17 -0
- package/dist/utils/redact.mjs +42 -0
- package/dist/utils/redact.mjs.map +1 -0
- package/dist/utils/timing.d.mts +19 -0
- package/dist/utils/timing.mjs +46 -0
- package/dist/utils/timing.mjs.map +1 -0
- package/dist/utils/ulid.d.mts +10 -0
- package/dist/utils/ulid.mjs +8 -8
- package/dist/utils/ulid.mjs.map +1 -1
- package/dist/utils.d.mts +12 -0
- package/dist/utils.mjs +13 -0
- package/package.json +69 -28
- package/dist/adapter/auth.d.mts +0 -50
- package/dist/adapter/auth.mjs +0 -10
- package/dist/adapter/auth.mjs.map +0 -1
- package/dist/adapter/init.d.mts +0 -58
- package/dist/adapter/init.mjs +0 -93
- package/dist/adapter/init.mjs.map +0 -1
- package/dist/adapters/webhook-events.mjs +0 -55
- package/dist/adapters/webhook-events.mjs.map +0 -1
- package/dist/ddl.d.mts +0 -8
- package/dist/ddl.mjs +0 -158
- package/dist/ddl.mjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/middleware/auth-gate.mjs +0 -36
- package/dist/middleware/auth-gate.mjs.map +0 -1
- package/dist/middleware/csrf.mjs +0 -40
- package/dist/middleware/csrf.mjs.map +0 -1
- package/dist/middleware/rate-limit.mjs +0 -39
- package/dist/middleware/rate-limit.mjs.map +0 -1
- package/dist/middleware/request-log.mjs +0 -28
- package/dist/middleware/request-log.mjs.map +0 -1
- package/dist/middleware/store-scope.mjs +0 -29
- package/dist/middleware/store-scope.mjs.map +0 -1
- package/dist/pages/build-detail.mjs +0 -339
- package/dist/pages/build-detail.mjs.map +0 -1
- package/dist/pages/build-diff-comments.mjs +0 -113
- package/dist/pages/build-diff-comments.mjs.map +0 -1
- package/dist/pages/build-diff-header.mjs +0 -163
- package/dist/pages/build-diff-header.mjs.map +0 -1
- package/dist/pages/build-diff-nav.mjs +0 -66
- package/dist/pages/build-diff-nav.mjs.map +0 -1
- package/dist/pages/build-diff-viewer.mjs +0 -197
- package/dist/pages/build-diff-viewer.mjs.map +0 -1
- package/dist/pages/build-diff.mjs +0 -90
- package/dist/pages/build-diff.mjs.map +0 -1
- package/dist/pages/compute-jobs.mjs +0 -198
- package/dist/pages/compute-jobs.mjs.map +0 -1
- package/dist/pages/label-detail.mjs +0 -228
- package/dist/pages/label-detail.mjs.map +0 -1
- package/dist/pages/login.mjs +0 -78
- package/dist/pages/login.mjs.map +0 -1
- package/dist/pages/project-builds.mjs +0 -231
- package/dist/pages/project-builds.mjs.map +0 -1
- package/dist/pages/project-create.mjs +0 -169
- package/dist/pages/project-create.mjs.map +0 -1
- package/dist/pages/project-settings.mjs +0 -102
- package/dist/pages/project-settings.mjs.map +0 -1
- package/dist/pages/projects.mjs +0 -184
- package/dist/pages/projects.mjs.map +0 -1
- package/dist/pages/root.mjs +0 -94
- package/dist/pages/root.mjs.map +0 -1
- package/dist/pages/settings-general.mjs +0 -192
- package/dist/pages/settings-general.mjs.map +0 -1
- package/dist/pages/settings-labels.mjs +0 -150
- package/dist/pages/settings-labels.mjs.map +0 -1
- package/dist/pages/settings-members.mjs +0 -125
- package/dist/pages/settings-members.mjs.map +0 -1
- package/dist/pages/settings-status.mjs +0 -152
- package/dist/pages/settings-status.mjs.map +0 -1
- package/dist/pages/settings-tests.mjs +0 -149
- package/dist/pages/settings-tests.mjs.map +0 -1
- package/dist/pages/settings-tokens.mjs +0 -96
- package/dist/pages/settings-tokens.mjs.map +0 -1
- package/dist/pages/settings-webhooks.mjs +0 -150
- package/dist/pages/settings-webhooks.mjs.map +0 -1
- package/dist/pages/storybook.mjs +0 -96
- package/dist/pages/storybook.mjs.map +0 -1
- package/dist/retention/purge.mjs +0 -70
- package/dist/retention/purge.mjs.map +0 -1
- package/dist/routers/admin.mjs +0 -42
- package/dist/routers/admin.mjs.map +0 -1
- package/dist/routers/assets.mjs +0 -25
- package/dist/routers/assets.mjs.map +0 -1
- package/dist/routers/auth.mjs +0 -78
- package/dist/routers/auth.mjs.map +0 -1
- package/dist/routers/builds.handlers.mjs +0 -184
- package/dist/routers/builds.handlers.mjs.map +0 -1
- package/dist/routers/builds.mjs +0 -185
- package/dist/routers/builds.mjs.map +0 -1
- package/dist/routers/comments.mjs +0 -90
- package/dist/routers/comments.mjs.map +0 -1
- package/dist/routers/health.mjs +0 -137
- package/dist/routers/health.mjs.map +0 -1
- package/dist/routers/helpers.mjs +0 -82
- package/dist/routers/helpers.mjs.map +0 -1
- package/dist/routers/htmx.mjs +0 -20
- package/dist/routers/htmx.mjs.map +0 -1
- package/dist/routers/labels.mjs +0 -110
- package/dist/routers/labels.mjs.map +0 -1
- package/dist/routers/media.mjs +0 -55
- package/dist/routers/media.mjs.map +0 -1
- package/dist/routers/members.mjs +0 -102
- package/dist/routers/members.mjs.map +0 -1
- package/dist/routers/projects.mjs +0 -122
- package/dist/routers/projects.mjs.map +0 -1
- package/dist/routers/schemas.mjs +0 -224
- package/dist/routers/schemas.mjs.map +0 -1
- package/dist/routers/settings-general.mjs +0 -95
- package/dist/routers/settings-general.mjs.map +0 -1
- package/dist/routers/settings-labels.mjs +0 -49
- package/dist/routers/settings-labels.mjs.map +0 -1
- package/dist/routers/settings-members.mjs +0 -30
- package/dist/routers/settings-members.mjs.map +0 -1
- package/dist/routers/settings-status.mjs +0 -73
- package/dist/routers/settings-status.mjs.map +0 -1
- package/dist/routers/settings-tokens.mjs +0 -40
- package/dist/routers/settings-tokens.mjs.map +0 -1
- package/dist/routers/settings-webhooks.mjs +0 -63
- package/dist/routers/settings-webhooks.mjs.map +0 -1
- package/dist/routers/settings.handlers.mjs +0 -93
- package/dist/routers/settings.handlers.mjs.map +0 -1
- package/dist/routers/settings.mjs +0 -23
- package/dist/routers/settings.mjs.map +0 -1
- package/dist/routers/snapshots.mjs +0 -144
- package/dist/routers/snapshots.mjs.map +0 -1
- package/dist/routers/status-configs.mjs +0 -101
- package/dist/routers/status-configs.mjs.map +0 -1
- package/dist/routers/storybook.mjs +0 -120
- package/dist/routers/storybook.mjs.map +0 -1
- package/dist/routers/tokens.mjs +0 -81
- package/dist/routers/tokens.mjs.map +0 -1
- package/dist/routers/ui.mjs +0 -165
- package/dist/routers/ui.mjs.map +0 -1
- package/dist/routers/webhooks.mjs +0 -90
- package/dist/routers/webhooks.mjs.map +0 -1
- package/dist/schema/baseline.mjs +0 -22
- package/dist/schema/baseline.mjs.map +0 -1
- package/dist/schema/build.mjs +0 -29
- package/dist/schema/build.mjs.map +0 -1
- package/dist/schema/comment.mjs +0 -26
- package/dist/schema/comment.mjs.map +0 -1
- package/dist/schema/label.mjs +0 -30
- package/dist/schema/label.mjs.map +0 -1
- package/dist/schema/member.mjs +0 -19
- package/dist/schema/member.mjs.map +0 -1
- package/dist/schema/project.mjs +0 -25
- package/dist/schema/project.mjs.map +0 -1
- package/dist/schema/snapshot.mjs +0 -34
- package/dist/schema/snapshot.mjs.map +0 -1
- package/dist/schema/status-config.mjs +0 -20
- package/dist/schema/status-config.mjs.map +0 -1
- package/dist/schema/token.mjs +0 -19
- package/dist/schema/token.mjs.map +0 -1
- package/dist/schema/user.mjs +0 -19
- package/dist/schema/user.mjs.map +0 -1
- package/dist/schema/webhook.mjs +0 -20
- package/dist/schema/webhook.mjs.map +0 -1
- package/dist/schema.mjs.map +0 -1
- package/dist/store.mjs +0 -20
- package/dist/store.mjs.map +0 -1
- package/dist/ui/document.mjs +0 -348
- package/dist/ui/document.mjs.map +0 -1
- package/dist/ui/feedback.mjs +0 -24
- package/dist/ui/feedback.mjs.map +0 -1
- package/dist/ui/forms.mjs +0 -117
- package/dist/ui/forms.mjs.map +0 -1
- package/dist/ui/styles.mjs +0 -174
- package/dist/ui/styles.mjs.map +0 -1
- package/dist/ui/theme.mjs +0 -44
- package/dist/ui/theme.mjs.map +0 -1
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
5
|
-
//#region src/pages/settings-general.tsx
|
|
6
|
-
/** General settings tab: project metadata, diff thresholds, and danger zone. */
|
|
7
|
-
function renderSettingsGeneral(project, formState, isAdmin) {
|
|
8
|
-
const errors = formState?.errors ?? {};
|
|
9
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
10
|
-
class: "grid",
|
|
11
|
-
style: "max-width: 720px;",
|
|
12
|
-
children: [
|
|
13
|
-
formState?.globalError ? /* @__PURE__ */ jsx("div", {
|
|
14
|
-
class: "alert alert--danger",
|
|
15
|
-
role: "alert",
|
|
16
|
-
children: formState.globalError
|
|
17
|
-
}) : null,
|
|
18
|
-
/* @__PURE__ */ jsxs("div", {
|
|
19
|
-
class: "card card--padded",
|
|
20
|
-
children: [/* @__PURE__ */ jsx("h2", {
|
|
21
|
-
style: "margin:0 0 .5rem;",
|
|
22
|
-
children: "General"
|
|
23
|
-
}), /* @__PURE__ */ jsxs("form", {
|
|
24
|
-
method: "post",
|
|
25
|
-
action: `/projects/${project.slug}/settings`,
|
|
26
|
-
"hx-post": `/projects/${project.slug}/settings`,
|
|
27
|
-
"hx-target": "body",
|
|
28
|
-
"hx-swap": "outerHTML",
|
|
29
|
-
children: [
|
|
30
|
-
/* @__PURE__ */ jsxs("div", {
|
|
31
|
-
class: "field",
|
|
32
|
-
children: [
|
|
33
|
-
/* @__PURE__ */ jsx("label", {
|
|
34
|
-
class: "field__label",
|
|
35
|
-
for: "name",
|
|
36
|
-
children: "Name"
|
|
37
|
-
}),
|
|
38
|
-
/* @__PURE__ */ jsx("input", {
|
|
39
|
-
class: `field__input ${errors["name"] ? "field__input--error" : ""}`,
|
|
40
|
-
id: "name",
|
|
41
|
-
name: "name",
|
|
42
|
-
value: project.name
|
|
43
|
-
}),
|
|
44
|
-
errors["name"] ? /* @__PURE__ */ jsx("p", {
|
|
45
|
-
class: "field__error",
|
|
46
|
-
role: "alert",
|
|
47
|
-
children: errors["name"]
|
|
48
|
-
}) : null
|
|
49
|
-
]
|
|
50
|
-
}),
|
|
51
|
-
/* @__PURE__ */ jsxs("div", {
|
|
52
|
-
class: "field",
|
|
53
|
-
children: [/* @__PURE__ */ jsx("label", {
|
|
54
|
-
class: "field__label",
|
|
55
|
-
for: "gitRepository",
|
|
56
|
-
children: "Git repository"
|
|
57
|
-
}), /* @__PURE__ */ jsx("input", {
|
|
58
|
-
class: "field__input",
|
|
59
|
-
id: "gitRepository",
|
|
60
|
-
name: "gitRepository",
|
|
61
|
-
value: project.gitRepository ?? "",
|
|
62
|
-
placeholder: "owner/repo"
|
|
63
|
-
})]
|
|
64
|
-
}),
|
|
65
|
-
/* @__PURE__ */ jsxs("div", {
|
|
66
|
-
class: "field",
|
|
67
|
-
children: [/* @__PURE__ */ jsx("label", {
|
|
68
|
-
class: "field__label",
|
|
69
|
-
for: "gitDefaultBranch",
|
|
70
|
-
children: "Default branch"
|
|
71
|
-
}), /* @__PURE__ */ jsx("input", {
|
|
72
|
-
class: "field__input",
|
|
73
|
-
id: "gitDefaultBranch",
|
|
74
|
-
name: "gitDefaultBranch",
|
|
75
|
-
value: project.gitDefaultBranch
|
|
76
|
-
})]
|
|
77
|
-
}),
|
|
78
|
-
/* @__PURE__ */ jsxs("div", {
|
|
79
|
-
class: "grid grid--2",
|
|
80
|
-
children: [/* @__PURE__ */ jsxs("div", {
|
|
81
|
-
class: "field",
|
|
82
|
-
children: [
|
|
83
|
-
/* @__PURE__ */ jsx("label", {
|
|
84
|
-
class: "field__label",
|
|
85
|
-
for: "pixelThreshold",
|
|
86
|
-
children: "Pixel threshold"
|
|
87
|
-
}),
|
|
88
|
-
/* @__PURE__ */ jsx("input", {
|
|
89
|
-
class: "field__input",
|
|
90
|
-
id: "pixelThreshold",
|
|
91
|
-
name: "pixelThreshold",
|
|
92
|
-
type: "number",
|
|
93
|
-
step: "0.01",
|
|
94
|
-
min: "0",
|
|
95
|
-
max: "1",
|
|
96
|
-
value: String(project.pixelThreshold)
|
|
97
|
-
}),
|
|
98
|
-
/* @__PURE__ */ jsx("p", {
|
|
99
|
-
class: "field__hint",
|
|
100
|
-
children: "Per-pixel color distance 0–1"
|
|
101
|
-
})
|
|
102
|
-
]
|
|
103
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
104
|
-
class: "field",
|
|
105
|
-
children: [
|
|
106
|
-
/* @__PURE__ */ jsx("label", {
|
|
107
|
-
class: "field__label",
|
|
108
|
-
for: "maxDiffRatio",
|
|
109
|
-
children: "Max diff ratio"
|
|
110
|
-
}),
|
|
111
|
-
/* @__PURE__ */ jsx("input", {
|
|
112
|
-
class: "field__input",
|
|
113
|
-
id: "maxDiffRatio",
|
|
114
|
-
name: "maxDiffRatio",
|
|
115
|
-
type: "number",
|
|
116
|
-
step: "0.001",
|
|
117
|
-
min: "0",
|
|
118
|
-
max: "1",
|
|
119
|
-
value: String(project.maxDiffRatio)
|
|
120
|
-
}),
|
|
121
|
-
/* @__PURE__ */ jsx("p", {
|
|
122
|
-
class: "field__hint",
|
|
123
|
-
children: "Allowed diff ratio 0–1"
|
|
124
|
-
})
|
|
125
|
-
]
|
|
126
|
-
})]
|
|
127
|
-
}),
|
|
128
|
-
/* @__PURE__ */ jsxs("div", {
|
|
129
|
-
class: "field",
|
|
130
|
-
children: [
|
|
131
|
-
/* @__PURE__ */ jsx("label", {
|
|
132
|
-
class: "field__label",
|
|
133
|
-
for: "publicBranchRegex",
|
|
134
|
-
children: "Public branch regex"
|
|
135
|
-
}),
|
|
136
|
-
/* @__PURE__ */ jsx("input", {
|
|
137
|
-
class: "field__input",
|
|
138
|
-
id: "publicBranchRegex",
|
|
139
|
-
name: "publicBranchRegex",
|
|
140
|
-
value: project.publicBranchRegex ?? "",
|
|
141
|
-
placeholder: "^main$"
|
|
142
|
-
}),
|
|
143
|
-
/* @__PURE__ */ jsx("p", {
|
|
144
|
-
class: "field__hint",
|
|
145
|
-
children: "Branches matching this regex are publicly viewable."
|
|
146
|
-
})
|
|
147
|
-
]
|
|
148
|
-
}),
|
|
149
|
-
isAdmin ? /* @__PURE__ */ jsx("button", {
|
|
150
|
-
class: "btn btn--primary",
|
|
151
|
-
type: "submit",
|
|
152
|
-
children: "Save changes"
|
|
153
|
-
}) : /* @__PURE__ */ jsx("p", {
|
|
154
|
-
class: "field__hint",
|
|
155
|
-
children: "You need admin access to edit settings."
|
|
156
|
-
})
|
|
157
|
-
]
|
|
158
|
-
})]
|
|
159
|
-
}),
|
|
160
|
-
isAdmin ? /* @__PURE__ */ jsxs("div", {
|
|
161
|
-
class: "card card--padded",
|
|
162
|
-
style: "border-color: var(--status-rejected);",
|
|
163
|
-
children: [
|
|
164
|
-
/* @__PURE__ */ jsx("h3", {
|
|
165
|
-
style: "margin:0 0 .4rem; color: var(--status-rejected);",
|
|
166
|
-
children: "Danger zone"
|
|
167
|
-
}),
|
|
168
|
-
/* @__PURE__ */ jsx("p", {
|
|
169
|
-
class: "field__hint",
|
|
170
|
-
children: "Deleting a project removes all builds, snapshots, baselines and tokens. This cannot be undone."
|
|
171
|
-
}),
|
|
172
|
-
/* @__PURE__ */ jsx("form", {
|
|
173
|
-
method: "post",
|
|
174
|
-
action: `/projects/${project.slug}/delete`,
|
|
175
|
-
"hx-post": `/projects/${project.slug}/delete`,
|
|
176
|
-
"hx-target": "body",
|
|
177
|
-
"hx-confirm": "Delete this project? This cannot be undone.",
|
|
178
|
-
children: /* @__PURE__ */ jsx("button", {
|
|
179
|
-
class: "btn btn--danger",
|
|
180
|
-
type: "submit",
|
|
181
|
-
children: "Delete project"
|
|
182
|
-
})
|
|
183
|
-
})
|
|
184
|
-
]
|
|
185
|
-
}) : null
|
|
186
|
-
]
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
//#endregion
|
|
190
|
-
export { renderSettingsGeneral };
|
|
191
|
-
|
|
192
|
-
//# sourceMappingURL=settings-general.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-general.mjs","names":[],"sources":["../../src/pages/settings-general.tsx"],"sourcesContent":["import type { Project } from \"../schema/project.ts\";\n\n/** Form state for the settings tabs (field errors and global error). */\nexport interface SettingsFormState {\n errors?: Record<string, string>;\n globalError?: string;\n}\n\n/** General settings tab: project metadata, diff thresholds, and danger zone. */\nexport function renderSettingsGeneral(\n project: Project,\n formState: SettingsFormState | undefined,\n isAdmin: boolean,\n): unknown {\n const errors = formState?.errors ?? {};\n return (\n <div class=\"grid\" style=\"max-width: 720px;\">\n {formState?.globalError ? (\n <div class=\"alert alert--danger\" role=\"alert\">\n {formState.globalError}\n </div>\n ) : null}\n <div class=\"card card--padded\">\n <h2 style=\"margin:0 0 .5rem;\">General</h2>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings`}\n hx-post={`/projects/${project.slug}/settings`}\n hx-target=\"body\"\n hx-swap=\"outerHTML\"\n >\n <div class=\"field\">\n <label class=\"field__label\" for=\"name\">\n Name\n </label>\n <input\n class={`field__input ${errors[\"name\"] ? \"field__input--error\" : \"\"}`}\n id=\"name\"\n name=\"name\"\n value={project.name}\n />\n {errors[\"name\"] ? (\n <p class=\"field__error\" role=\"alert\">\n {errors[\"name\"]}\n </p>\n ) : null}\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"gitRepository\">\n Git repository\n </label>\n <input\n class=\"field__input\"\n id=\"gitRepository\"\n name=\"gitRepository\"\n value={project.gitRepository ?? \"\"}\n placeholder=\"owner/repo\"\n />\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"gitDefaultBranch\">\n Default branch\n </label>\n <input\n class=\"field__input\"\n id=\"gitDefaultBranch\"\n name=\"gitDefaultBranch\"\n value={project.gitDefaultBranch}\n />\n </div>\n <div class=\"grid grid--2\">\n <div class=\"field\">\n <label class=\"field__label\" for=\"pixelThreshold\">\n Pixel threshold\n </label>\n <input\n class=\"field__input\"\n id=\"pixelThreshold\"\n name=\"pixelThreshold\"\n type=\"number\"\n step=\"0.01\"\n min=\"0\"\n max=\"1\"\n value={String(project.pixelThreshold)}\n />\n <p class=\"field__hint\">Per-pixel color distance 0–1</p>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"maxDiffRatio\">\n Max diff ratio\n </label>\n <input\n class=\"field__input\"\n id=\"maxDiffRatio\"\n name=\"maxDiffRatio\"\n type=\"number\"\n step=\"0.001\"\n min=\"0\"\n max=\"1\"\n value={String(project.maxDiffRatio)}\n />\n <p class=\"field__hint\">Allowed diff ratio 0–1</p>\n </div>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"publicBranchRegex\">\n Public branch regex\n </label>\n <input\n class=\"field__input\"\n id=\"publicBranchRegex\"\n name=\"publicBranchRegex\"\n value={project.publicBranchRegex ?? \"\"}\n placeholder=\"^main$\"\n />\n <p class=\"field__hint\">Branches matching this regex are publicly viewable.</p>\n </div>\n {isAdmin ? (\n <button class=\"btn btn--primary\" type=\"submit\">\n Save changes\n </button>\n ) : (\n <p class=\"field__hint\">You need admin access to edit settings.</p>\n )}\n </form>\n </div>\n\n {isAdmin ? (\n <div class=\"card card--padded\" style=\"border-color: var(--status-rejected);\">\n <h3 style=\"margin:0 0 .4rem; color: var(--status-rejected);\">Danger zone</h3>\n <p class=\"field__hint\">\n Deleting a project removes all builds, snapshots, baselines and tokens. This cannot be\n undone.\n </p>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/delete`}\n hx-post={`/projects/${project.slug}/delete`}\n hx-target=\"body\"\n hx-confirm=\"Delete this project? This cannot be undone.\"\n >\n <button class=\"btn btn--danger\" type=\"submit\">\n Delete project\n </button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { Badge } from "../ui/feedback.mjs";
|
|
5
|
-
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
6
|
-
//#region src/pages/settings-labels.tsx
|
|
7
|
-
/** Labels settings tab: label-type table plus the create-type form. */
|
|
8
|
-
function renderSettingsLabels(project, labelTypes, isAdmin) {
|
|
9
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
10
|
-
class: "grid",
|
|
11
|
-
style: "max-width: 880px;",
|
|
12
|
-
children: [/* @__PURE__ */ jsxs("div", {
|
|
13
|
-
class: "card card--padded",
|
|
14
|
-
children: [
|
|
15
|
-
/* @__PURE__ */ jsx("h2", {
|
|
16
|
-
style: "margin:0 0 .3rem;",
|
|
17
|
-
children: "Label types"
|
|
18
|
-
}),
|
|
19
|
-
/* @__PURE__ */ jsx("p", {
|
|
20
|
-
class: "field__hint",
|
|
21
|
-
children: "Labels attach typed values to builds (e.g. pr=123, jira=ABC-123). Values link out via the template."
|
|
22
|
-
}),
|
|
23
|
-
/* @__PURE__ */ jsx("div", {
|
|
24
|
-
class: "table-wrap",
|
|
25
|
-
style: "margin-top:.75rem;",
|
|
26
|
-
children: /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
27
|
-
/* @__PURE__ */ jsx("th", { children: "Key" }),
|
|
28
|
-
/* @__PURE__ */ jsx("th", { children: "Name" }),
|
|
29
|
-
/* @__PURE__ */ jsx("th", { children: "Template" }),
|
|
30
|
-
/* @__PURE__ */ jsx("th", {})
|
|
31
|
-
] }) }), /* @__PURE__ */ jsx("tbody", { children: labelTypes.map((labelType) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
32
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Badge, {
|
|
33
|
-
tone: "neutral",
|
|
34
|
-
children: labelType.key
|
|
35
|
-
}) }),
|
|
36
|
-
/* @__PURE__ */ jsx("td", { children: labelType.name }),
|
|
37
|
-
/* @__PURE__ */ jsx("td", {
|
|
38
|
-
style: "max-width:32ch; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;",
|
|
39
|
-
children: labelType.linkTemplate ?? "—"
|
|
40
|
-
}),
|
|
41
|
-
/* @__PURE__ */ jsx("td", { children: isAdmin && labelType.key !== "persistent" && labelType.key !== "branch" ? /* @__PURE__ */ jsx("form", {
|
|
42
|
-
method: "post",
|
|
43
|
-
action: `/projects/${project.slug}/settings/labels/${labelType.key}/delete`,
|
|
44
|
-
"hx-post": `/projects/${project.slug}/settings/labels/${labelType.key}/delete`,
|
|
45
|
-
"hx-target": "body",
|
|
46
|
-
children: /* @__PURE__ */ jsx("button", {
|
|
47
|
-
class: "btn btn--ghost",
|
|
48
|
-
type: "submit",
|
|
49
|
-
"aria-label": `Delete ${labelType.key}`,
|
|
50
|
-
children: "Delete"
|
|
51
|
-
})
|
|
52
|
-
}) : /* @__PURE__ */ jsx("span", {
|
|
53
|
-
class: "field__hint",
|
|
54
|
-
children: "built-in"
|
|
55
|
-
}) })
|
|
56
|
-
] }, labelType.id)) })] })
|
|
57
|
-
}),
|
|
58
|
-
labelTypes.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
59
|
-
class: "field__hint",
|
|
60
|
-
style: "margin-top:.5rem;",
|
|
61
|
-
children: "No label types configured."
|
|
62
|
-
}) : null
|
|
63
|
-
]
|
|
64
|
-
}), isAdmin ? /* @__PURE__ */ jsxs("div", {
|
|
65
|
-
class: "card card--padded",
|
|
66
|
-
children: [/* @__PURE__ */ jsx("h3", {
|
|
67
|
-
style: "margin:0 0 .5rem;",
|
|
68
|
-
children: "Create label type"
|
|
69
|
-
}), /* @__PURE__ */ jsxs("form", {
|
|
70
|
-
method: "post",
|
|
71
|
-
action: `/projects/${project.slug}/settings/labels`,
|
|
72
|
-
"hx-post": `/projects/${project.slug}/settings/labels`,
|
|
73
|
-
"hx-target": "body",
|
|
74
|
-
children: [
|
|
75
|
-
/* @__PURE__ */ jsxs("div", {
|
|
76
|
-
class: "grid grid--2",
|
|
77
|
-
children: [/* @__PURE__ */ jsxs("div", {
|
|
78
|
-
class: "field",
|
|
79
|
-
children: [
|
|
80
|
-
/* @__PURE__ */ jsx("label", {
|
|
81
|
-
class: "field__label",
|
|
82
|
-
for: "key",
|
|
83
|
-
children: "Key"
|
|
84
|
-
}),
|
|
85
|
-
/* @__PURE__ */ jsx("input", {
|
|
86
|
-
class: "field__input",
|
|
87
|
-
id: "key",
|
|
88
|
-
name: "key",
|
|
89
|
-
required: true,
|
|
90
|
-
placeholder: "jira",
|
|
91
|
-
pattern: "^[a-z0-9_-]+$"
|
|
92
|
-
}),
|
|
93
|
-
/* @__PURE__ */ jsx("p", {
|
|
94
|
-
class: "field__hint",
|
|
95
|
-
children: "Lowercase, no spaces."
|
|
96
|
-
})
|
|
97
|
-
]
|
|
98
|
-
}), /* @__PURE__ */ jsxs("div", {
|
|
99
|
-
class: "field",
|
|
100
|
-
children: [/* @__PURE__ */ jsx("label", {
|
|
101
|
-
class: "field__label",
|
|
102
|
-
for: "labelName",
|
|
103
|
-
children: "Name"
|
|
104
|
-
}), /* @__PURE__ */ jsx("input", {
|
|
105
|
-
class: "field__input",
|
|
106
|
-
id: "labelName",
|
|
107
|
-
name: "labelName",
|
|
108
|
-
required: true,
|
|
109
|
-
placeholder: "Jira issue"
|
|
110
|
-
})]
|
|
111
|
-
})]
|
|
112
|
-
}),
|
|
113
|
-
/* @__PURE__ */ jsxs("div", {
|
|
114
|
-
class: "field",
|
|
115
|
-
children: [
|
|
116
|
-
/* @__PURE__ */ jsx("label", {
|
|
117
|
-
class: "field__label",
|
|
118
|
-
for: "linkTemplate",
|
|
119
|
-
children: "Link template"
|
|
120
|
-
}),
|
|
121
|
-
/* @__PURE__ */ jsx("input", {
|
|
122
|
-
class: "field__input",
|
|
123
|
-
id: "linkTemplate",
|
|
124
|
-
name: "linkTemplate",
|
|
125
|
-
placeholder: "https://jira.example.com/browse/{value}"
|
|
126
|
-
}),
|
|
127
|
-
/* @__PURE__ */ jsxs("p", {
|
|
128
|
-
class: "field__hint",
|
|
129
|
-
children: [
|
|
130
|
-
"Use ",
|
|
131
|
-
"{value}",
|
|
132
|
-
" placeholder. Optional."
|
|
133
|
-
]
|
|
134
|
-
})
|
|
135
|
-
]
|
|
136
|
-
}),
|
|
137
|
-
/* @__PURE__ */ jsx("button", {
|
|
138
|
-
class: "btn btn--primary",
|
|
139
|
-
type: "submit",
|
|
140
|
-
children: "Add label type"
|
|
141
|
-
})
|
|
142
|
-
]
|
|
143
|
-
})]
|
|
144
|
-
}) : null]
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
//#endregion
|
|
148
|
-
export { renderSettingsLabels };
|
|
149
|
-
|
|
150
|
-
//# sourceMappingURL=settings-labels.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-labels.mjs","names":[],"sources":["../../src/pages/settings-labels.tsx"],"sourcesContent":["import type { HtmlEscapedString } from \"hono/utils/html\";\nimport type { LabelType } from \"../schema/label.ts\";\nimport type { Project } from \"../schema/project.ts\";\nimport { Badge } from \"../ui/components.tsx\";\n\n/** Labels settings tab: label-type table plus the create-type form. */\nexport function renderSettingsLabels(\n project: Project,\n labelTypes: LabelType[],\n isAdmin: boolean,\n): unknown {\n return (\n <div class=\"grid\" style=\"max-width: 880px;\">\n <div class=\"card card--padded\">\n <h2 style=\"margin:0 0 .3rem;\">Label types</h2>\n <p class=\"field__hint\">\n Labels attach typed values to builds (e.g. pr=123, jira=ABC-123). Values link out via the\n template.\n </p>\n <div class=\"table-wrap\" style=\"margin-top:.75rem;\">\n <table>\n <thead>\n <tr>\n <th>Key</th>\n <th>Name</th>\n <th>Template</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {labelTypes.map((labelType): HtmlEscapedString | Promise<HtmlEscapedString> => (\n <tr key={labelType.id}>\n <td>\n <Badge tone=\"neutral\">{labelType.key}</Badge>\n </td>\n <td>{labelType.name}</td>\n <td style=\"max-width:32ch; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;\">\n {labelType.linkTemplate ?? \"—\"}\n </td>\n <td>\n {isAdmin && labelType.key !== \"persistent\" && labelType.key !== \"branch\" ? (\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/labels/${labelType.key}/delete`}\n hx-post={`/projects/${project.slug}/settings/labels/${labelType.key}/delete`}\n hx-target=\"body\"\n >\n <button\n class=\"btn btn--ghost\"\n type=\"submit\"\n aria-label={`Delete ${labelType.key}`}\n >\n Delete\n </button>\n </form>\n ) : (\n <span class=\"field__hint\">built-in</span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {labelTypes.length === 0 ? (\n <p class=\"field__hint\" style=\"margin-top:.5rem;\">\n No label types configured.\n </p>\n ) : null}\n </div>\n\n {isAdmin ? (\n <div class=\"card card--padded\">\n <h3 style=\"margin:0 0 .5rem;\">Create label type</h3>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/labels`}\n hx-post={`/projects/${project.slug}/settings/labels`}\n hx-target=\"body\"\n >\n <div class=\"grid grid--2\">\n <div class=\"field\">\n <label class=\"field__label\" for=\"key\">\n Key\n </label>\n <input\n class=\"field__input\"\n id=\"key\"\n name=\"key\"\n required\n placeholder=\"jira\"\n pattern=\"^[a-z0-9_-]+$\"\n />\n <p class=\"field__hint\">Lowercase, no spaces.</p>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"labelName\">\n Name\n </label>\n <input\n class=\"field__input\"\n id=\"labelName\"\n name=\"labelName\"\n required\n placeholder=\"Jira issue\"\n />\n </div>\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"linkTemplate\">\n Link template\n </label>\n <input\n class=\"field__input\"\n id=\"linkTemplate\"\n name=\"linkTemplate\"\n placeholder=\"https://jira.example.com/browse/{value}\"\n />\n <p class=\"field__hint\">Use {\"{value}\"} placeholder. Optional.</p>\n </div>\n <button class=\"btn btn--primary\" type=\"submit\">\n Add label type\n </button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { Badge } from "../ui/feedback.mjs";
|
|
5
|
-
import { jsx, jsxs } from "hono/jsx/jsx-runtime";
|
|
6
|
-
//#region src/pages/settings-members.tsx
|
|
7
|
-
/** Members settings tab: member roster plus the add-member form. */
|
|
8
|
-
function renderSettingsMembers(project, members, isAdmin) {
|
|
9
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
10
|
-
class: "grid",
|
|
11
|
-
style: "max-width: 880px;",
|
|
12
|
-
children: [/* @__PURE__ */ jsxs("div", {
|
|
13
|
-
class: "card card--padded",
|
|
14
|
-
children: [
|
|
15
|
-
/* @__PURE__ */ jsx("h2", {
|
|
16
|
-
style: "margin:0 0 .3rem;",
|
|
17
|
-
children: "Members"
|
|
18
|
-
}),
|
|
19
|
-
/* @__PURE__ */ jsx("p", {
|
|
20
|
-
class: "field__hint",
|
|
21
|
-
children: "Project members and their roles. Site admins have implicit admin access."
|
|
22
|
-
}),
|
|
23
|
-
/* @__PURE__ */ jsx("div", {
|
|
24
|
-
class: "table-wrap",
|
|
25
|
-
style: "margin-top:.75rem;",
|
|
26
|
-
children: /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
27
|
-
/* @__PURE__ */ jsx("th", { children: "User" }),
|
|
28
|
-
/* @__PURE__ */ jsx("th", { children: "Role" }),
|
|
29
|
-
/* @__PURE__ */ jsx("th", { children: "Since" }),
|
|
30
|
-
/* @__PURE__ */ jsx("th", {})
|
|
31
|
-
] }) }), /* @__PURE__ */ jsx("tbody", { children: members.map((member) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
32
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("code", { children: member.userId }) }),
|
|
33
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(Badge, {
|
|
34
|
-
tone: member.role === "admin" ? "danger" : member.role === "viewer" ? "neutral" : "info",
|
|
35
|
-
children: member.role
|
|
36
|
-
}) }),
|
|
37
|
-
/* @__PURE__ */ jsx("td", { children: new Date(member.createdAt).toLocaleDateString() }),
|
|
38
|
-
/* @__PURE__ */ jsx("td", { children: isAdmin ? /* @__PURE__ */ jsx("form", {
|
|
39
|
-
method: "post",
|
|
40
|
-
action: `/projects/${project.slug}/settings/members/${member.userId}/remove`,
|
|
41
|
-
"hx-post": `/projects/${project.slug}/settings/members/${member.userId}/remove`,
|
|
42
|
-
"hx-target": "body",
|
|
43
|
-
children: /* @__PURE__ */ jsx("button", {
|
|
44
|
-
class: "btn btn--ghost",
|
|
45
|
-
type: "submit",
|
|
46
|
-
children: "Remove"
|
|
47
|
-
})
|
|
48
|
-
}) : null })
|
|
49
|
-
] }, member.id)) })] })
|
|
50
|
-
}),
|
|
51
|
-
members.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
52
|
-
class: "field__hint",
|
|
53
|
-
style: "margin-top:.5rem;",
|
|
54
|
-
children: "No members yet."
|
|
55
|
-
}) : null
|
|
56
|
-
]
|
|
57
|
-
}), isAdmin ? /* @__PURE__ */ jsxs("div", {
|
|
58
|
-
class: "card card--padded",
|
|
59
|
-
children: [/* @__PURE__ */ jsx("h3", {
|
|
60
|
-
style: "margin:0 0 .5rem;",
|
|
61
|
-
children: "Add member"
|
|
62
|
-
}), /* @__PURE__ */ jsxs("form", {
|
|
63
|
-
method: "post",
|
|
64
|
-
action: `/projects/${project.slug}/settings/members`,
|
|
65
|
-
"hx-post": `/projects/${project.slug}/settings/members`,
|
|
66
|
-
"hx-target": "body",
|
|
67
|
-
children: [
|
|
68
|
-
/* @__PURE__ */ jsxs("div", {
|
|
69
|
-
class: "field",
|
|
70
|
-
children: [/* @__PURE__ */ jsx("label", {
|
|
71
|
-
class: "field__label",
|
|
72
|
-
for: "userId",
|
|
73
|
-
children: "User ID"
|
|
74
|
-
}), /* @__PURE__ */ jsx("input", {
|
|
75
|
-
class: "field__input",
|
|
76
|
-
id: "userId",
|
|
77
|
-
name: "userId",
|
|
78
|
-
required: true,
|
|
79
|
-
placeholder: "user_..."
|
|
80
|
-
})]
|
|
81
|
-
}),
|
|
82
|
-
/* @__PURE__ */ jsxs("div", {
|
|
83
|
-
class: "field",
|
|
84
|
-
children: [/* @__PURE__ */ jsx("label", {
|
|
85
|
-
class: "field__label",
|
|
86
|
-
for: "role",
|
|
87
|
-
children: "Role"
|
|
88
|
-
}), /* @__PURE__ */ jsxs("select", {
|
|
89
|
-
class: "field__input",
|
|
90
|
-
id: "role",
|
|
91
|
-
name: "role",
|
|
92
|
-
children: [
|
|
93
|
-
/* @__PURE__ */ jsx("option", {
|
|
94
|
-
value: "viewer",
|
|
95
|
-
children: "viewer"
|
|
96
|
-
}),
|
|
97
|
-
/* @__PURE__ */ jsx("option", {
|
|
98
|
-
value: "developer",
|
|
99
|
-
children: "developer"
|
|
100
|
-
}),
|
|
101
|
-
/* @__PURE__ */ jsx("option", {
|
|
102
|
-
value: "approver",
|
|
103
|
-
children: "approver"
|
|
104
|
-
}),
|
|
105
|
-
/* @__PURE__ */ jsx("option", {
|
|
106
|
-
value: "admin",
|
|
107
|
-
children: "admin"
|
|
108
|
-
})
|
|
109
|
-
]
|
|
110
|
-
})]
|
|
111
|
-
}),
|
|
112
|
-
/* @__PURE__ */ jsx("button", {
|
|
113
|
-
class: "btn btn--primary",
|
|
114
|
-
type: "submit",
|
|
115
|
-
children: "Add member"
|
|
116
|
-
})
|
|
117
|
-
]
|
|
118
|
-
})]
|
|
119
|
-
}) : null]
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
//#endregion
|
|
123
|
-
export { renderSettingsMembers };
|
|
124
|
-
|
|
125
|
-
//# sourceMappingURL=settings-members.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-members.mjs","names":[],"sources":["../../src/pages/settings-members.tsx"],"sourcesContent":["import type { HtmlEscapedString } from \"hono/utils/html\";\nimport type { Project } from \"../schema/project.ts\";\nimport { Badge } from \"../ui/components.tsx\";\n\n/** Project member row as rendered in the members settings tab. */\nexport interface SettingsMember {\n id: string;\n projectId: string;\n userId: string;\n role: string;\n createdAt: string;\n}\n\n/** Members settings tab: member roster plus the add-member form. */\nexport function renderSettingsMembers(\n project: Project,\n members: SettingsMember[],\n isAdmin: boolean,\n): unknown {\n return (\n <div class=\"grid\" style=\"max-width: 880px;\">\n <div class=\"card card--padded\">\n <h2 style=\"margin:0 0 .3rem;\">Members</h2>\n <p class=\"field__hint\">\n Project members and their roles. Site admins have implicit admin access.\n </p>\n <div class=\"table-wrap\" style=\"margin-top:.75rem;\">\n <table>\n <thead>\n <tr>\n <th>User</th>\n <th>Role</th>\n <th>Since</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {members.map((member): HtmlEscapedString | Promise<HtmlEscapedString> => (\n <tr key={member.id}>\n <td>\n <code>{member.userId}</code>\n </td>\n <td>\n <Badge\n tone={\n member.role === \"admin\"\n ? \"danger\"\n : member.role === \"viewer\"\n ? \"neutral\"\n : \"info\"\n }\n >\n {member.role}\n </Badge>\n </td>\n <td>{new Date(member.createdAt).toLocaleDateString()}</td>\n <td>\n {isAdmin ? (\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/members/${member.userId}/remove`}\n hx-post={`/projects/${project.slug}/settings/members/${member.userId}/remove`}\n hx-target=\"body\"\n >\n <button class=\"btn btn--ghost\" type=\"submit\">\n Remove\n </button>\n </form>\n ) : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {members.length === 0 ? (\n <p class=\"field__hint\" style=\"margin-top:.5rem;\">\n No members yet.\n </p>\n ) : null}\n </div>\n\n {isAdmin ? (\n <div class=\"card card--padded\">\n <h3 style=\"margin:0 0 .5rem;\">Add member</h3>\n <form\n method=\"post\"\n action={`/projects/${project.slug}/settings/members`}\n hx-post={`/projects/${project.slug}/settings/members`}\n hx-target=\"body\"\n >\n <div class=\"field\">\n <label class=\"field__label\" for=\"userId\">\n User ID\n </label>\n <input\n class=\"field__input\"\n id=\"userId\"\n name=\"userId\"\n required\n placeholder=\"user_...\"\n />\n </div>\n <div class=\"field\">\n <label class=\"field__label\" for=\"role\">\n Role\n </label>\n <select class=\"field__input\" id=\"role\" name=\"role\">\n <option value=\"viewer\">viewer</option>\n <option value=\"developer\">developer</option>\n <option value=\"approver\">approver</option>\n <option value=\"admin\">admin</option>\n </select>\n </div>\n <button class=\"btn btn--primary\" type=\"submit\">\n Add member\n </button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|