Initial commit: Helpdesk application setup

- Backend: Node.js/TypeScript with Prisma ORM
- Frontend: Vite + TypeScript
- Project configuration and documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-03 08:53:22 +01:00
commit e4f63a135e
103 changed files with 19913 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
import { create } from 'zustand';
import type {
TaskStatus,
Priority,
EquipmentType,
RevisionType,
RMAStatus,
RMASolution,
UserRole,
} from '@/types';
import { settingsApi } from '@/services/settings.api';
interface ConfigState {
taskStatuses: TaskStatus[];
priorities: Priority[];
equipmentTypes: EquipmentType[];
revisionTypes: RevisionType[];
rmaStatuses: RMAStatus[];
rmaSolutions: RMASolution[];
userRoles: UserRole[];
isLoading: boolean;
isLoaded: boolean;
fetchConfig: () => Promise<void>;
getTaskStatusById: (id: string) => TaskStatus | undefined;
getPriorityById: (id: string) => Priority | undefined;
getEquipmentTypeById: (id: string) => EquipmentType | undefined;
getRevisionTypeById: (id: string) => RevisionType | undefined;
getRMAStatusById: (id: string) => RMAStatus | undefined;
getRMASolutionById: (id: string) => RMASolution | undefined;
getUserRoleById: (id: string) => UserRole | undefined;
}
export const useConfigStore = create<ConfigState>((set, get) => ({
taskStatuses: [],
priorities: [],
equipmentTypes: [],
revisionTypes: [],
rmaStatuses: [],
rmaSolutions: [],
userRoles: [],
isLoading: false,
isLoaded: false,
fetchConfig: async () => {
if (get().isLoaded) return;
set({ isLoading: true });
try {
const [
taskStatusesRes,
prioritiesRes,
equipmentTypesRes,
revisionTypesRes,
rmaStatusesRes,
rmaSolutionsRes,
userRolesRes,
] = await Promise.all([
settingsApi.getTaskStatuses(),
settingsApi.getPriorities(),
settingsApi.getEquipmentTypes(),
settingsApi.getRevisionTypes(),
settingsApi.getRMAStatuses(),
settingsApi.getRMASolutions(),
settingsApi.getUserRoles(),
]);
set({
taskStatuses: taskStatusesRes.data,
priorities: prioritiesRes.data,
equipmentTypes: equipmentTypesRes.data,
revisionTypes: revisionTypesRes.data,
rmaStatuses: rmaStatusesRes.data,
rmaSolutions: rmaSolutionsRes.data,
userRoles: userRolesRes.data,
isLoading: false,
isLoaded: true,
});
} catch {
set({ isLoading: false });
}
},
getTaskStatusById: (id) => get().taskStatuses.find((s) => s.id === id),
getPriorityById: (id) => get().priorities.find((p) => p.id === id),
getEquipmentTypeById: (id) => get().equipmentTypes.find((t) => t.id === id),
getRevisionTypeById: (id) => get().revisionTypes.find((t) => t.id === id),
getRMAStatusById: (id) => get().rmaStatuses.find((s) => s.id === id),
getRMASolutionById: (id) => get().rmaSolutions.find((s) => s.id === id),
getUserRoleById: (id) => get().userRoles.find((r) => r.id === id),
}));