sozsoft-platform/ui/src/store/admin.model.ts
2026-07-16 17:01:18 +03:00

128 lines
3.7 KiB
TypeScript

import type { Action, Thunk } from 'easy-peasy'
import { action, thunk } from 'easy-peasy'
import { Injections } from './store'
import { GridOptionsEditDto } from '../proxy/form/models'
import setNull from '../utils/setNull'
import { ListState } from '@/proxy/admin/list-form/models'
import { Conversation } from '@/proxy/ai/models'
export type DashboardLayout = 'default' | 'wide-center' | 'balanced' | 'wide-left' | 'wide-right'
export interface DashboardState {
dashboardLayout: DashboardLayout
hiddenWidgetIds: string[]
widgetOrder: {
left: string[]
center: string[]
right: string[]
}
}
export interface AiConversationsState {
items: Conversation[]
aiActiveConversationId: string | null
}
export interface AdminStoreModel {
lists: {
values: GridOptionsEditDto | undefined
states: ListState[]
}
dashboard: DashboardState
aiConversations: AiConversationsState
}
export interface AdminStoreActions {
lists: {
setListFormValues: Action<AdminStoreModel['lists'], GridOptionsEditDto>
setJsonValue: Action<AdminStoreModel['lists'], { field: keyof GridOptionsEditDto; data: any[] }>
getListFormValues: Thunk<
AdminStoreModel['lists'] & AdminStoreActions['lists'],
string | undefined,
Injections
>
setStates: Action<AdminStoreModel['lists'], ListState>
}
dashboard: {
setDashboardLayout: Action<DashboardState, DashboardLayout>
setHiddenWidgetIds: Action<DashboardState, string[]>
setWidgetOrder: Action<DashboardState, DashboardState['widgetOrder']>
reset: Action<DashboardState>
}
setAiConversations: Action<AdminStoreModel, AiConversationsState>
}
export type AdminModel = AdminStoreModel & AdminStoreActions
const initialDashboardState: DashboardState = {
dashboardLayout: 'default',
hiddenWidgetIds: [],
widgetOrder: {
left: [],
center: [],
right: [],
},
}
const initialState: AdminStoreModel = {
lists: {
values: undefined,
states: [],
},
dashboard: initialDashboardState,
aiConversations: {
items: [],
aiActiveConversationId: null,
},
}
export const adminModel: AdminModel = {
lists: {
...initialState.lists,
setStates: action((state, payload) => {
const stateId = state.states.findIndex((s) => s.listFormCode === payload.listFormCode)
if (stateId !== -1) {
state.states[stateId] = { ...state.states[stateId], ...payload }
} else {
state.states = [...state.states, payload]
}
}),
setListFormValues: action((state, payload) => {
state.values = { ...state.values, ...payload }
}),
setJsonValue: action((state, payload) => {
if (state.values) {
state.values[payload.field] = payload.data
}
}),
getListFormValues: thunk(async (actions, payload, helpers) => {
if (!payload) return
const service = helpers.injections.listFormService
const result = await service.getListFormByCode(payload)
setNull(result.data)
actions.setListFormValues(result.data)
}),
},
dashboard: {
...initialState.dashboard,
setDashboardLayout: action((state, payload) => {
state.dashboardLayout = payload
}),
setHiddenWidgetIds: action((state, payload) => {
state.hiddenWidgetIds = payload
}),
setWidgetOrder: action((state, payload) => {
state.widgetOrder = payload
}),
reset: action((state) => {
state.dashboardLayout = initialDashboardState.dashboardLayout
state.hiddenWidgetIds = initialDashboardState.hiddenWidgetIds
state.widgetOrder = initialDashboardState.widgetOrder
}),
},
aiConversations: initialState.aiConversations,
setAiConversations: action((state, payload) => {
state.aiConversations = payload
}),
}