import { ReactNode } from 'react'; import { SetNotificationType } from '../../Provider'; import { DefaultOperationOptions, ResourcePaths } from '../../types'; import type { SortOptionType } from './hooks/useSort'; import type { BaseResource } from '../../pages/types'; import type { ApiSearchParams, IndexPageTemplateProps } from '../../templates/IndexPage/types'; export type SearchParamsChangeHandler

= ( /** * 全ての検索パラメータ * URLクエリに反映されているものと同値 */ params: Exclude & { sortBy?: P['sortBy'] extends SortOptionType ? SortOptionType : P['sortBy'] extends string ? string : any; }, /** * 補足情報 */ details: { /** * filtersで設定された検索パラメータ * TODO: 型推論の改善 */ filters: P; /** * filters以外で設定された検索パラメータ * (ページネーションなどmeta情報含む) */ others: P; }) => void; export type SearchParamsStoreOptions = { /** * 保存するパラメーターのkey一覧 * フィルタと表示切り替えで設定されているパラメーターのうち、 SessionStorage に保存するパラメーターだけを指定します */ storeKeys: string[]; /** * ユーザーと事業所など、整合させるためのkeyとvalueのペア * ここで指定したペアを鍵として SessionStorage にパラメーターが保持されます * 復元は、ペアと一致するデータが SessionStorage にある場合に限って行われます */ contextPairs: { [key: string]: string; }; }; export type IndexPageContainerSortProps = { /** * ソート用のクエリパラメータのkey * default: sort_by */ queryKey?: string; /** * value, direcitonからクエリパラメータのvalueを作成する関数 * default: ({value, direction}) => `${value}_${direction}` * directionがnullの場合のdefault: ({value, direction}) => `${value}` */ encodeQueryValue?: ({ value, direction, }: { value: string; direction: 'asc' | 'desc' | ''; }) => string; decodeQueryValue?: (query: string) => { value: string; direction: 'asc' | 'desc' | ''; }; /** * ソート項目 それぞれ昇順と降順を選択可能 */ choices: ({ /** * ソート項目のラベル * {label}の新しい順 / {label}の古い順として表示 */ label: string; /** * クエリパラメータのvalue */ value: string; } & ({ /** * 指定した場合デフォルト値になる * disableDirectionがtrueの場合に、デフォルト値にしたい場合はtrueを設定する */ default?: 'asc' | 'desc'; disableDirection?: false; } | { default?: boolean; /** * 昇順・降順の設定ができない場合に指定する */ disableDirection: true; }))[]; /** * ソートボタンを非表示にする設定 * table形式でヘッダーからのみソートを行えるようにしたい場合に利用してください */ buttonHidden?: boolean; }; export type IndexPageContainerLabels = { /** * リソース(メインで扱うオブジェクト) */ resources: { /** * レコードの名称 * 削除・一括操作時のメッセージ表示などに使われます * default: 情報 */ record: string; }; /** * 各操作時 */ actions: { /** * 作成開始時のボタンラベル * default: 追加 */ new: string; }; }; type DeepOptional = T extends string ? string | undefined : { [K in keyof T]?: DeepOptional; }; export type IndexPageContainerLabelsProps = DeepOptional; /** * IndexPageContainerのprops * 複数の標準UIコンポーネント間で共通して使用される設定 * */ export type IndexPageContainerProps

= { /** * Sectionの子要素 * 標準UI以外のコンポーネントも含めて表示可能 */ children: ReactNode; /** * ラベルの設定を記述します * 各所に分散している設定を集約する予定です */ labels?: IndexPageContainerLabelsProps; /** * 画面全体に Loading を表示 */ isLoadingAll?: boolean; /** * ソート 渡した場合ソートボタンを表示 * * @use ListControlArea, ListArea */ sort?: IndexPageContainerSortProps; /** * 検索フィルタやページネーションの変更時に呼び出されるハンドラ * * @use ListControlArea */ onChangeSearchParams?: SearchParamsChangeHandler

; /** * 検索パラメータ変換関数 * あるパラメーターの値を変更した際に、ほかのパラメーターの状態を書き換える場合に指定 * パラメータ間の依存関係に基づいて、パラメータ全体を整形します(未指定の場合は変更したパラメーターの値だけが変更されたと見做されます) * 用例: 特定の条件が選択されたときに、関連する別の条件を自動的に設定/解除する * @experimental AS95 まとめて検索の一環で実装されており、 EXPERIMENTAL_ListControlArea と組み合わせてのみ利用できます */ transformSearchParams?: (prevParams: P) => P; /** * 検索パラメータの保存・復元オプション * このオプションが指定されている場合、以下のロジックが動作します * - 検索パラメータが変更されたとき、その設定状態を SessionStorage に保持します * - ページ移動後に再度アクセスしたとき、保存された検索パラメータを自動的に復元します(別ページへの遷移時を含む) * - URLに明示的にビュー以外のパラメータが指定されている場合は、それが優先されます * @experimental AS95 まとめて検索の一環で実装されており、 EXPERIMENTAL_ListControlArea と組み合わせてのみ利用できます */ searchParamsStoreOptions?: SearchParamsStoreOptions; /** * 一覧画面で表示するリソースの再読み込みを行う場合に用いられる処理 * must be memoize * * @use ListControlArea */ refetchResources?: () => Promise; /** * CRUD操作を行う各ページのPath */ resourcePaths?: ResourcePaths; /** * 作成・編集・削除など標準UIがデフォルトで用意するoperationの設定 * * @use IndexListArea */ defaultOperationOptions?: DefaultOperationOptions; /** * StandardUIProviderのPropsと同義ですが、ここで設定した値はStandardUIProviderよりも優先されます * ページ単位で設定したい場合に利用してください * * @default StandardUIProviderで設定された値 */ historyPushState?: (url: string) => void; /** * StandardUIProviderのPropsと同義ですが、ここで設定した値はStandardUIProviderよりも優先されます * ページ単位で設定したい場合に利用してください * * @default StandardUIProviderで設定された値 */ historyReplaceState?: (url: string) => void; /** * StandardUIProviderのPropsと同義ですが、ここで設定した値はStandardUIProviderよりも優先されます * ページ単位で設定したい場合に利用してください * * @default StandardUIProviderで設定された値 */ setNotification?: SetNotificationType; }; /** * IndexPageContainerPropsは現在単体提供しているコンポーネントで * 使用されるもののみPickしているため、Templateなどで使用する場合はこちらのProps * * 単体提供コンポーネントが増えたらIndexPageContainerPropsに移していく */ export type INTERNAL_IndexPageContainerProps

= IndexPageContainerProps & Pick, 'layoutLevel' | 'recordTemplateOptions'>; export {};