@cosmicdrift/kumiko-bundled-features 0.211.0 → 0.212.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/package.json +8 -8
- package/src/admin-shell/feature.ts +2 -0
- package/src/admin-shell/web/platform-overview-screen.tsx +1 -0
- package/src/admin-shell/web/tenant-overview-screen.tsx +1 -0
- package/src/audit/__tests__/audit-log-screen.test.tsx +228 -0
- package/src/audit/constants.ts +3 -0
- package/src/audit/feature.ts +2 -0
- package/src/audit/i18n.ts +1 -0
- package/src/audit/web/audit-log-detail-screen.tsx +28 -6
- package/src/audit/web/audit-log-screen.tsx +51 -23
- package/src/auth-email-password/feature.ts +1 -0
- package/src/auth-email-password/web/auth-form-primitives.tsx +2 -0
- package/src/auth-email-password/web/auth-gate.tsx +1 -0
- package/src/auth-email-password/web/confirm-account-unlock-screen.tsx +1 -0
- package/src/auth-email-password/web/invite-accept-screen.tsx +3 -0
- package/src/auth-email-password/web/session.tsx +1 -0
- package/src/auth-email-password/web/verify-email-screen.tsx +1 -0
- package/src/auth-mfa/feature.ts +1 -0
- package/src/auth-mfa/web/mfa-disable-dialog.tsx +1 -0
- package/src/auth-mfa/web/mfa-regenerate-recovery-dialog.tsx +1 -0
- package/src/compliance-profiles/feature.ts +1 -5
- package/src/crypto-shredding/changes.json +2 -1
- package/src/custom-fields/__tests__/feature.test.ts +42 -0
- package/src/custom-fields/__tests__/field-definition-role-config.integration.test.ts +139 -0
- package/src/custom-fields/constants.ts +6 -0
- package/src/custom-fields/feature.ts +56 -10
- package/src/custom-fields/handlers/define-tenant-field.write.ts +7 -1
- package/src/custom-fields/handlers/delete-tenant-field.write.ts +54 -33
- package/src/custom-fields/handlers/update-tenant-field.write.ts +58 -35
- package/src/delivery/feature.ts +1 -3
- package/src/feature-toggles/feature.ts +1 -0
- package/src/feature-toggles/web/toggle-admin-screen.tsx +1 -0
- package/src/folders/web/folder-manager.tsx +1 -0
- package/src/jobs/__tests__/jobs-pii-kms.integration.test.ts +174 -0
- package/src/jobs/__tests__/jobs-stale-run-sweep.integration.test.ts +148 -0
- package/src/jobs/db/queries/stale-run-sweep.ts +51 -0
- package/src/jobs/feature.ts +25 -1
- package/src/jobs/handlers/detail.query.ts +13 -1
- package/src/jobs/handlers/stale-run-sweep.job.ts +28 -0
- package/src/jobs/job-run-logger.ts +68 -18
- package/src/jobs/web/job-run-detail-screen.tsx +1 -0
- package/src/page-render/web.ts +1 -0
- package/src/personal-access-tokens/feature.ts +1 -0
- package/src/secrets/__tests__/access-options.integration.test.ts +114 -0
- package/src/secrets/constants.ts +12 -0
- package/src/secrets/feature.ts +35 -9
- package/src/secrets/handlers/delete.write.ts +23 -16
- package/src/secrets/handlers/list.query.ts +37 -30
- package/src/secrets/handlers/set.write.ts +43 -36
- package/src/secrets/index.ts +5 -0
- package/src/seo/feature.ts +1 -0
- package/src/tags/feature.ts +1 -0
- package/src/tags/web/tag-chip.tsx +2 -0
- package/src/tags/web/tag-manager.tsx +2 -1
- package/src/tags/web/tag-picker.tsx +1 -0
- package/src/template-resolver/web/client-plugin.tsx +2 -0
- package/src/tier-engine/feature.ts +2 -0
- package/src/tier-engine/web/tier-admin-screen.tsx +5 -5
- package/src/user-data-rights/feature.ts +2 -0
- package/src/user-data-rights/web/privacy-center-screen.tsx +2 -1
- package/src/user-profile/i18n.ts +1 -0
- package/src/user-profile/web/profile-screen.tsx +1 -1
|
@@ -33,6 +33,7 @@ function hexToRgb(color: string): { r: number; g: number; b: number } | null {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
// kumiko-lint-ignore no-inline-styles Tag color is user-defined (hex from the DB), no finite token palette possible
|
|
36
37
|
const BASE_STYLE: CSSProperties = {
|
|
37
38
|
display: "inline-flex",
|
|
38
39
|
alignItems: "center",
|
|
@@ -56,6 +57,7 @@ export function TagChip({
|
|
|
56
57
|
const fg = color != null && color !== "" ? contrastText(color) : null;
|
|
57
58
|
const palette = fg !== null && color != null ? { backgroundColor: color, color: fg } : NEUTRAL;
|
|
58
59
|
return (
|
|
60
|
+
// kumiko-lint-ignore no-inline-styles Tag color is user-defined (hex from the DB), no finite token palette possible
|
|
59
61
|
<span data-testid="tag-chip" style={{ ...BASE_STYLE, ...palette }}>
|
|
60
62
|
{name}
|
|
61
63
|
</span>
|
|
@@ -63,7 +63,7 @@ function ColorPicker({
|
|
|
63
63
|
<div className="flex items-center gap-2">
|
|
64
64
|
<div className="flex flex-wrap gap-1">
|
|
65
65
|
{PRESET_COLORS.map((c) => (
|
|
66
|
-
// kumiko-lint-ignore primitives-discipline color swatch needs a raw colored button — Button is variant-styled
|
|
66
|
+
// kumiko-lint-ignore primitives-discipline color swatch needs a raw colored button — Button is variant-styled. kumiko-lint-ignore no-inline-styles Preset swatch color is user-defined (hex), no finite token palette possible
|
|
67
67
|
<button
|
|
68
68
|
key={c}
|
|
69
69
|
type="button"
|
|
@@ -87,6 +87,7 @@ function ColorPicker({
|
|
|
87
87
|
name={`${idPrefix}-hex`}
|
|
88
88
|
value={value}
|
|
89
89
|
onChange={onChange}
|
|
90
|
+
// kumiko-lint-ignore i18n-ui-strings Hex color value as an example placeholder, not UI text
|
|
90
91
|
placeholder="#22cc88"
|
|
91
92
|
/>
|
|
92
93
|
</div>
|
|
@@ -27,6 +27,7 @@ export function TagPicker({
|
|
|
27
27
|
const t = useTranslation();
|
|
28
28
|
const [buffer, setBuffer] = useState<readonly string[]>(value);
|
|
29
29
|
// Reset the buffer to the caller's truth every time the modal (re)opens.
|
|
30
|
+
// kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
|
|
30
31
|
useEffect(() => {
|
|
31
32
|
if (open) setBuffer(value);
|
|
32
33
|
}, [open, value]);
|
|
@@ -170,6 +170,7 @@ function makeTreeProvider(tenantIdOverride?: string, collectionId?: string): Tre
|
|
|
170
170
|
const headers: Record<string, string> = { "content-type": "application/json" };
|
|
171
171
|
const csrf = readCsrfToken();
|
|
172
172
|
if (csrf !== undefined) headers[CSRF_HEADER_NAME] = csrf;
|
|
173
|
+
// kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
|
|
173
174
|
fetch("/api/query", {
|
|
174
175
|
method: "POST",
|
|
175
176
|
headers,
|
|
@@ -338,6 +339,7 @@ function TextBlockEditor({
|
|
|
338
339
|
|
|
339
340
|
// Sync loaded data into the form state. loaded === null means the block does
|
|
340
341
|
// not exist yet — empty form for the create flow.
|
|
342
|
+
// kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
|
|
341
343
|
useEffect(() => {
|
|
342
344
|
if (loading) return;
|
|
343
345
|
setTitle(loaded?.title ?? "");
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
//
|
|
41
41
|
// **Boot-Dependencies:** config + tenant.
|
|
42
42
|
|
|
43
|
+
// kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312 (feature.ts > 300 lines)
|
|
43
44
|
import { fetchOne, selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
44
45
|
import {
|
|
45
46
|
buildEntityTable,
|
|
@@ -236,6 +237,7 @@ export function createTierEngineFeature<
|
|
|
236
237
|
// platziert ihn nur via r.nav("tier-engine:screen:tier-admin"); die
|
|
237
238
|
// Komponente liefert tierEngineClient() aus dem ./web-subpath.
|
|
238
239
|
r.translations({ keys: TIER_ENGINE_I18N });
|
|
240
|
+
// kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312
|
|
239
241
|
r.screen({
|
|
240
242
|
id: TIER_ADMIN_SCREEN_ID,
|
|
241
243
|
type: "custom",
|
|
@@ -56,11 +56,11 @@ export function TierAdminScreen(): ReactNode {
|
|
|
56
56
|
{ enabled: tenantId !== "" },
|
|
57
57
|
);
|
|
58
58
|
|
|
59
|
-
// Tenant
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
63
|
-
// biome-ignore lint/correctness/useExhaustiveDependencies: tenantId
|
|
59
|
+
// Tenant switch: reset selection + status so no other tenant's tier stays
|
|
60
|
+
// shown (UI-level mis-grant guard). tenantId is a pure trigger here (the
|
|
61
|
+
// body doesn't read it) — Biome's "extra dep" autofix would empty the deps
|
|
62
|
+
// and limit the reset to mount.
|
|
63
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: tenantId is the intended reset trigger, do not remove. kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
|
|
64
64
|
useEffect(() => {
|
|
65
65
|
setTier("");
|
|
66
66
|
setStatus({ kind: "idle" });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312 (feature.ts > 300 lines)
|
|
1
2
|
import {
|
|
2
3
|
createSystemConfig,
|
|
3
4
|
defineFeature,
|
|
@@ -291,6 +292,7 @@ export function createUserDataRightsFeature(opts: UserDataRightsOptions = {}): F
|
|
|
291
292
|
// its authed area. dormant: true so createKumikoApp's boot diagnostic
|
|
292
293
|
// (#2025) doesn't flag apps that haven't (yet) navved the screen as
|
|
293
294
|
// having a missing client plugin (#2034).
|
|
295
|
+
// kumiko-lint-ignore app-feature-structure Phase-3 conversion tracked in #2312
|
|
294
296
|
r.screen({
|
|
295
297
|
id: PRIVACY_CENTER_SCREEN_ID,
|
|
296
298
|
type: "custom",
|
|
@@ -121,8 +121,9 @@ function ExportSection(): ReactNode {
|
|
|
121
121
|
const done = job?.status === EXPORT_JOB_STATUS.Done;
|
|
122
122
|
const failed = job?.status === EXPORT_JOB_STATUS.Failed;
|
|
123
123
|
|
|
124
|
-
//
|
|
124
|
+
// While the job is running: poll until Done/Failed, then auto-stop.
|
|
125
125
|
const refetch = statusQuery.refetch;
|
|
126
|
+
// kumiko-lint-ignore no-raw-hooks Phase-3 conversion tracked in #2312
|
|
126
127
|
useEffect(() => {
|
|
127
128
|
if (!inProgress || !refetch) return;
|
|
128
129
|
const id = setInterval(() => void refetch(), EXPORT_POLL_MS);
|
package/src/user-profile/i18n.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type { TranslationsByLocale } from "@cosmicdrift/kumiko-renderer";
|
|
|
11
11
|
export const defaultTranslations: TranslationsByLocale = {
|
|
12
12
|
en: {
|
|
13
13
|
"profile.title": "Profile",
|
|
14
|
+
"profile.loading": "Loading…",
|
|
14
15
|
|
|
15
16
|
"profile.email.title": "Email address",
|
|
16
17
|
"profile.email.current": "Current email",
|