Files
server/core/src/stores/preferencesStore.ts
2025-12-21 10:09:54 -05:00

115 lines
3.0 KiB
TypeScript

import { defineStore } from 'pinia';
export interface PreferencesState {
theme: string;
language: string;
timezone: string;
date_format: string;
time_format: string;
week_start: string;
default_module?: string; // preferred module handle like "dashboard"
}
const defaults: PreferencesState = {
theme: 'light',
language: 'en',
timezone: 'UTC',
date_format: 'Y-m-d',
time_format: 'H:i',
week_start: 'Monday',
default_module: ''
};
export const usePreferencesStore = defineStore('preferencesStore', {
state: () => ({
preferences: { ...defaults } as PreferencesState,
locks: [] as string[], // preference keys locked by tenant admin
loading: false,
error: null as string | null,
}),
getters: {
/**
* Check if a specific preference is locked by tenant admin
*/
isLocked: (state) => (key: string): boolean => {
return state.locks.includes(key);
},
/**
* Get a single preference value
*/
getPreference: (state) => <K extends keyof PreferencesState>(key: K): PreferencesState[K] => {
return state.preferences[key];
},
},
actions: {
/**
* Initialize preferences from server data (called on app bootstrap)
*/
init(prefs: Partial<PreferencesState> | undefined, locks?: string[]) {
this.preferences = { ...defaults, ...(prefs ?? {}) };
this.locks = locks ?? [];
},
/**
* Set multiple preferences at once (local state only)
*/
setPreferences(prefs: Partial<PreferencesState>) {
// Filter out locked preferences
const unlocked: Partial<PreferencesState> = {};
for (const [key, value] of Object.entries(prefs)) {
if (!this.locks.includes(key)) {
(unlocked as Record<string, unknown>)[key] = value;
}
}
this.preferences = { ...this.preferences, ...unlocked };
},
/**
* Set a single preference (local state only)
*/
setPreference<K extends keyof PreferencesState>(key: K, value: PreferencesState[K]) {
if (this.locks.includes(key)) {
console.warn(`Preference "${key}" is locked by administrator`);
return false;
}
this.preferences[key] = value;
return true;
},
/**
* Set default module preference
*/
setDefaultModule(handle: string) {
if (this.locks.includes('default_module')) {
console.warn('Default module preference is locked by administrator');
return false;
}
this.preferences.default_module = handle || '';
return true;
},
/**
* Update locks from server response
*/
setLocks(locks: string[]) {
this.locks = locks ?? [];
},
/**
* Reset preferences to defaults (local state only)
*/
reset() {
this.preferences = { ...defaults };
this.locks = [];
this.error = null;
},
/**
* Set loading state
*/
setLoading(loading: boolean) {
this.loading = loading;
},
/**
* Set error state
*/
setError(error: string | null) {
this.error = error;
},
},
});