Initial Version
This commit is contained in:
114
core/src/stores/preferencesStore.ts
Normal file
114
core/src/stores/preferencesStore.ts
Normal file
@@ -0,0 +1,114 @@
|
||||
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;
|
||||
},
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user