/// import { BadRequestError } from './pages/errors'; import { BaseResource } from './pages/types'; import type { MessageTypes } from '@c-fo/vibes'; export type MessageContentType = { type?: 'text'; text: string; url?: string; targetBlank?: boolean; } | { type: 'break'; }; export type MessageNoteType = { label: string; type: 'error' | 'notice' | 'success' | 'help'; contents: MessageContentType[]; }; /** * オブジェクトのkeyのUNION型を作成する * ネストされた要素は "." 区切りの文字列とする */ export type NestedKeyOf = T extends object ? { [K in keyof Required]: K extends string | number ? NonNullable[K]> extends Array ? Item extends object ? `${K}.${number}.${NestedKeyOf[K]>[number]>}` | `${K}` : `${K}.${number}` | `${K}` : NonNullable[K]> extends object ? `${K}.${NestedKeyOf[K]>>}` | K : K : never; }[keyof T] : never; type Split = S extends `${infer T}${Delimiter}${infer U}` ? [T, ...Split] : [S]; type Lookup = Path extends [infer Head, ...infer Rest] ? Head extends keyof T ? Lookup, Rest extends string[] ? Rest : never> : T extends unknown[] ? Head extends `${number}` ? Lookup, Rest extends string[] ? Rest : never> : never : never : T; /** * オブジェクトのvalueを取得する * "." 区切りの文字列の場合はネストされた要素を探索する */ export type GetNestedValue = Lookup>; /** * オブジェクトのネストされた要素も含めたvalueのUNION型を作成する */ export type NestedValueOf = GetNestedValue>; export type ArrayItemValue = V extends Array ? U : never; export type FetchErrorType = { code: string; message: string; fields: { name: string; message: string; attachments?: unknown; }[]; }; export type StandardUIPageType = 'index' | 'new' | 'detail' | 'edit'; export type RequestMethodType = 'get' | 'post' | 'put' | 'patch' | 'delete'; export type ResourcePaths = { index?: string; new?: string; detail?: string | ((resource: R) => string); edit?: string | ((resource: R) => string); }; export type NotificationType = { type: 'success' | 'error'; message: string | ((resource: R) => string); }[]; export type PreConditionType = { /** * 別ページに遷移して作成する場合にのみ設定可能です * === * 条件選択時のページ遷移用のURL設定 * newPath: 通常の新規作成ページのパス(resourcePaths.new propsの値がそのまま設定されます) * id: 選択した項目のid * default: (newPath: string, id: string) => `/${newPath}/${id}` */ url?: (newPath: string, id: string) => string; /** * 条件の選択肢を指定します */ choices: { /** * 選択時に追加されるパラメーターの値 * ウインドウを開く場合は、 ?pre_condition={id} になる * この場合のクエリパラメーター名は windowOptions.preConditionQueryKey で指定されたものになる * 別ページに遷移する場合は、 /{new_page_path}/{id} になる */ id: string; /** * 選択肢として配置されるReact要素を指定します */ node: React.ReactNode; /** * 選択肢を非活性表示にします */ disabled?: boolean; }[]; /** * 条件選択時に表示する任意のメッセージを指定します */ message?: { type?: keyof MessageTypes; body: React.ReactNode; }; }; export type DefaultOperationOptions = { index?: { disabled?: boolean; /** * 一覧画面への遷移方法の設定 */ historyBack?: boolean; }; new?: { /** * 設定すると連続して作成を可能にするチェックボックスをフッターに表示する */ sequential?: { /** * チェックボックスのラベル */ label: string; /** * チェックボックスのデフォルト値 * default: false */ defaultChecked?: boolean; }; disabled?: boolean; notification?: NotificationType; /** * 一覧画面から「追加」ボタンを押下したとき、新規作成開始前に何らかの条件を設定したい場合に使用する * 追加ボタンを押下したときにポップアップが表示され、その選択に応じて新規作成時の表示をカスタマイズすることができます */ preCondition?: PreConditionType; }; edit?: { /** * 設定すると連続して編集を可能にするチェックボックスをフッターに表示する */ sequential?: { /** * チェックボックスのラベル */ label: string; /** * チェックボックスのデフォルト値 * default: false */ defaultChecked?: boolean; }; disabled?: boolean; notification?: NotificationType; }; save?: { disabled?: boolean; }; destroy?: { disabled?: boolean; /** * その他のメニューに「削除」アクションを表示しない場合に true を設定する * default: false */ hidden?: boolean; notification?: NotificationType; }; }; export type ExecuteSaveType = (resource: Partial) => Promise<{ data: R | undefined; error: BadRequestError | undefined; }>; export type ExecuteDeleteType = (params?: { id: string | number; }) => Promise<{ data: R | undefined; error: BadRequestError | undefined; options?: { /** * 削除完了後に表示するメッセージを指定します */ notificationMessage?: string; /** * 削除完了後にメッセージを表示しない場合に true を設定します */ preventNotification?: boolean; }; }>; export {};