115 lines
3.0 KiB
TypeScript
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;
|
|
},
|
|
},
|
|
});
|