Implement admin ports and system settings management
- Port CRUD: list, create, update with branding, currency, timezone - System settings: upsert key-value pairs per port with known settings UI (AI feature flags, invoice discount, pipeline weights, berth rules) - Settings manager with toggle switches, number inputs, and JSON editors - Replace both stub pages with real implementations Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
41
src/lib/validators/ports.ts
Normal file
41
src/lib/validators/ports.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const createPortSchema = z.object({
|
||||
name: z.string().min(1).max(200),
|
||||
slug: z
|
||||
.string()
|
||||
.min(1)
|
||||
.max(100)
|
||||
.regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens'),
|
||||
logoUrl: z.string().url().optional(),
|
||||
primaryColor: z
|
||||
.string()
|
||||
.regex(/^#[0-9a-fA-F]{6}$/)
|
||||
.optional(),
|
||||
defaultCurrency: z.string().length(3).default('USD'),
|
||||
timezone: z.string().min(1).default('America/Anguilla'),
|
||||
});
|
||||
|
||||
export type CreatePortInput = z.infer<typeof createPortSchema>;
|
||||
|
||||
export const updatePortSchema = z.object({
|
||||
name: z.string().min(1).max(200).optional(),
|
||||
slug: z
|
||||
.string()
|
||||
.min(1)
|
||||
.max(100)
|
||||
.regex(/^[a-z0-9-]+$/, 'Slug must be lowercase alphanumeric with hyphens')
|
||||
.optional(),
|
||||
logoUrl: z.string().url().nullable().optional(),
|
||||
primaryColor: z
|
||||
.string()
|
||||
.regex(/^#[0-9a-fA-F]{6}$/)
|
||||
.nullable()
|
||||
.optional(),
|
||||
defaultCurrency: z.string().length(3).optional(),
|
||||
timezone: z.string().min(1).optional(),
|
||||
isActive: z.boolean().optional(),
|
||||
settings: z.record(z.string(), z.unknown()).optional(),
|
||||
});
|
||||
|
||||
export type UpdatePortInput = z.infer<typeof updatePortSchema>;
|
||||
14
src/lib/validators/settings.ts
Normal file
14
src/lib/validators/settings.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const upsertSettingSchema = z.object({
|
||||
key: z.string().min(1).max(100),
|
||||
value: z.unknown(),
|
||||
});
|
||||
|
||||
export type UpsertSettingInput = z.infer<typeof upsertSettingSchema>;
|
||||
|
||||
export const deleteSettingSchema = z.object({
|
||||
key: z.string().min(1).max(100),
|
||||
});
|
||||
|
||||
export type DeleteSettingInput = z.infer<typeof deleteSettingSchema>;
|
||||
Reference in New Issue
Block a user