feat: implement dashboard CRUD status column and toggle actions; refactor related components for improved functionality

This commit is contained in:
mlogclub
2026-05-28 09:08:38 +08:00
parent e8d7565caf
commit b944c3221f
10 changed files with 730 additions and 268 deletions
@@ -7,6 +7,13 @@ export type DashboardCrudQueryFilter = {
valueType?: "string" | "number"
}
export type DashboardCrudFilterStateConfig<
TValue extends string | number = string | number,
> = {
name: string
defaultValue: TValue
}
export type DashboardCrudPageResult<T> = {
results: T[]
page: {
@@ -39,11 +46,17 @@ export type DashboardCrudFormField<TItem = unknown> = {
pattern?: RegExp
patternMessage?: string
options?: ReadonlyArray<DashboardCrudFormOption>
loadOptions?: () => Promise<ReadonlyArray<DashboardCrudFormOption>>
colSpan?: 1 | 2
rows?: number
valueFromItem?: (item: TItem) => DashboardCrudFormValue
}
export type DashboardCrudActionRule<TItem> = {
visible?: (item: TItem) => boolean
disabled?: (item: TItem) => boolean
}
export function buildDashboardCrudQuery({
values,
filters,
@@ -86,6 +99,14 @@ export function buildDashboardCrudQuery({
return query
}
export function buildDashboardCrudInitialFilters(
filters: ReadonlyArray<DashboardCrudFilterStateConfig>
): Record<string, string | number | undefined> {
return Object.fromEntries(
filters.map((filter) => [filter.name, filter.defaultValue])
) as Record<string, string | number | undefined>
}
export function normalizeDashboardCrudPageResult<T>(
result: Partial<DashboardCrudPageResult<T>> | null | undefined,
page: number,
@@ -139,3 +160,17 @@ export function normalizeDashboardCrudSubmitValues<TItem>(
return output
}
export function isDashboardCrudActionVisible<TItem>(
action: DashboardCrudActionRule<TItem>,
item: TItem
) {
return action.visible ? action.visible(item) : true
}
export function isDashboardCrudActionDisabled<TItem>(
action: DashboardCrudActionRule<TItem>,
item: TItem
) {
return action.disabled ? action.disabled(item) : false
}