summaryrefslogtreecommitdiff
path: root/packages/frontend/src/utility/form.ts
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
commitbe7e3b9a0cb81b78a744993fef2fa2fd2833fa9c (patch)
treec82e18ce93ec0a24c57d7e36eb54a09266b3a25b /packages/frontend/src/utility/form.ts
parentenhnace(frontend): 文字列比較のためのローマナイズを強化(... (diff)
downloadsharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.gz
sharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.bz2
sharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.zip
refactor(frontend): scripts -> utility
Diffstat (limited to 'packages/frontend/src/utility/form.ts')
-rw-r--r--packages/frontend/src/utility/form.ts104
1 files changed, 104 insertions, 0 deletions
diff --git a/packages/frontend/src/utility/form.ts b/packages/frontend/src/utility/form.ts
new file mode 100644
index 0000000000..1032e97ac9
--- /dev/null
+++ b/packages/frontend/src/utility/form.ts
@@ -0,0 +1,104 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import * as Misskey from 'misskey-js';
+
+type EnumItem = string | {
+ label: string;
+ value: string;
+};
+
+type Hidden = boolean | ((v: any) => boolean);
+
+export type FormItem = {
+ label?: string;
+ type: 'string';
+ default?: string | null;
+ description?: string;
+ required?: boolean;
+ hidden?: Hidden;
+ multiline?: boolean;
+ treatAsMfm?: boolean;
+} | {
+ label?: string;
+ type: 'number';
+ default?: number | null;
+ description?: string;
+ required?: boolean;
+ hidden?: Hidden;
+ step?: number;
+} | {
+ label?: string;
+ type: 'boolean';
+ default?: boolean | null;
+ description?: string;
+ hidden?: Hidden;
+} | {
+ label?: string;
+ type: 'enum';
+ default?: string | null;
+ required?: boolean;
+ hidden?: Hidden;
+ enum: EnumItem[];
+} | {
+ label?: string;
+ type: 'radio';
+ default?: unknown | null;
+ required?: boolean;
+ hidden?: Hidden;
+ options: {
+ label: string;
+ value: unknown;
+ }[];
+} | {
+ label?: string;
+ type: 'range';
+ default?: number | null;
+ description?: string;
+ required?: boolean;
+ step?: number;
+ min: number;
+ max: number;
+ textConverter?: (value: number) => string;
+ hidden?: Hidden;
+} | {
+ label?: string;
+ type: 'object';
+ default?: Record<string, unknown> | null;
+ hidden: Hidden;
+} | {
+ label?: string;
+ type: 'array';
+ default?: unknown[] | null;
+ hidden: Hidden;
+} | {
+ type: 'button';
+ content?: string;
+ hidden?: Hidden;
+ action: (ev: MouseEvent, v: any) => void;
+} | {
+ type: 'drive-file';
+ defaultFileId?: string | null;
+ hidden?: Hidden;
+ validate?: (v: Misskey.entities.DriveFile) => Promise<boolean>;
+};
+
+export type Form = Record<string, FormItem>;
+
+type GetItemType<Item extends FormItem> =
+ Item['type'] extends 'string' ? string :
+ Item['type'] extends 'number' ? number :
+ Item['type'] extends 'boolean' ? boolean :
+ Item['type'] extends 'radio' ? unknown :
+ Item['type'] extends 'range' ? number :
+ Item['type'] extends 'enum' ? string :
+ Item['type'] extends 'array' ? unknown[] :
+ Item['type'] extends 'object' ? Record<string, unknown> :
+ Item['type'] extends 'drive-file' ? Misskey.entities.DriveFile | undefined :
+ never;
+
+export type GetFormResultType<F extends Form> = {
+ [P in keyof F]: GetItemType<F[P]>;
+};