Files
planilla/ui/src/stores/useUi.js
google-labs-jules[bot] 2957054823 feat: Add accent color customization for configuracion module
This commit introduces a new accent color setting for the 'configuracion' module.

Changes include:
- Updated `ui/src/stores/useUi.js` to include:
    - A new state property `accentColorConfiguracion`.
    - Addition of `'accentColorConfiguracion'` to `appearanceSettingKeys` for local storage persistence.
    - A new action `setAccentColorConfiguracion` to modify the new color.
- Updated `ui/src/views/SettingsView.vue` to include:
    - A new color picker in the "Module Accent Colors" section, allowing you to select and change the accent color for the 'configuracion' module.
2025-05-31 05:58:44 +00:00

181 lines
5.6 KiB
JavaScript

// src/stores/useUi.js
import { defineStore } from 'pinia'
const APPEARANCE_STORAGE_KEY = 'appearanceSettings'
const appearanceSettingKeys = [
'primaryColor',
'secondaryColor',
'warningColor',
'fontFamily',
'fontSize',
'animationsEnabled',
'backgroundColor',
'theme',
'accentColorEmpleados',
'accentColorTareas',
'accentColorPlanillas',
'accentColorAsistencias',
'accentColorConfiguracion',
]
const loadSettingsFromLocalStorage = () => {
try {
// Check if localStorage is available
if (typeof localStorage === 'undefined') {
console.warn('localStorage is not available. Skipping load of appearance settings.');
return null;
}
const savedSettings = localStorage.getItem(APPEARANCE_STORAGE_KEY)
if (savedSettings) {
return JSON.parse(savedSettings)
}
} catch (error) {
console.error('Error loading appearance settings from local storage:', error)
}
return null
}
const saveSettingsToLocalStorage = (settings) => {
try {
// Check if localStorage is available
if (typeof localStorage === 'undefined') {
console.warn('localStorage is not available. Skipping save of appearance settings.');
return;
}
localStorage.setItem(APPEARANCE_STORAGE_KEY, JSON.stringify(settings))
} catch (error) {
console.error('Error saving appearance settings to local storage:', error)
}
}
const _saveAppearanceState = (state) => {
const settingsToSave = {}
for (const key of appearanceSettingKeys) {
// Ensure the property exists in the state before trying to save it
if (state.hasOwnProperty(key)) {
settingsToSave[key] = state[key]
}
}
saveSettingsToLocalStorage(settingsToSave)
}
export const useUi = defineStore('ui', {
state: () => {
const defaultState = {
sidebarOpen: true, // This is not an appearance setting, kept as default
primaryColor: '#1976D2',
secondaryColor: '#424242',
warningColor: '#FFC107',
fontFamily: 'Roboto, sans-serif',
fontSize: 16,
animationsEnabled: true,
backgroundColor: '#FFFFFF',
theme: 'light', // 'light' or 'dark'
// Module-specific accent colors
accentColorEmpleados: '#2196F3', // Blue
accentColorTareas: '#4CAF50', // Green
accentColorPlanillas: '#FF9800', // Orange
accentColorAsistencias: '#E91E63', // Pink
accentColorConfiguracion: '#607D8B', // Blue Grey
}
const loadedSettings = loadSettingsFromLocalStorage()
if (loadedSettings) {
for (const key of appearanceSettingKeys) {
// Only update if the key exists in loadedSettings and is an appearance key
if (loadedSettings.hasOwnProperty(key)) {
defaultState[key] = loadedSettings[key]
}
}
}
return defaultState
},
actions: {
// Non-appearance related actions
toggleSidebar() {
this.sidebarOpen = !this.sidebarOpen
// No need to save appearance state here
},
closeSidebar() {
this.sidebarOpen = false
},
openSidebar() {
this.sidebarOpen = true
},
// Appearance related actions
setPrimaryColor(color) {
this.primaryColor = color
_saveAppearanceState(this)
},
setSecondaryColor(color) {
this.secondaryColor = color
_saveAppearanceState(this)
},
setWarningColor(color) {
this.warningColor = color
_saveAppearanceState(this)
},
setFontFamily(font) {
this.fontFamily = font
_saveAppearanceState(this)
},
setFontSize(size) {
this.fontSize = Number(size) // Ensure fontSize is stored as a number
_saveAppearanceState(this)
},
setAnimationsEnabled(enabled) {
this.animationsEnabled = !!enabled // Ensure boolean
_saveAppearanceState(this)
},
setBackgroundColor(color) {
this.backgroundColor = color
_saveAppearanceState(this)
},
setTheme(theme) {
this.theme = theme
_saveAppearanceState(this)
},
toggleTheme() {
this.theme = this.theme === 'light' ? 'dark' : 'light'
_saveAppearanceState(this)
},
// Actions for module-specific accent colors
setAccentColorEmpleados(color) {
this.accentColorEmpleados = color
_saveAppearanceState(this)
},
setAccentColorTareas(color) {
this.accentColorTareas = color
_saveAppearanceState(this)
},
setAccentColorPlanillas(color) {
this.accentColorPlanillas = color
_saveAppearanceState(this)
},
setAccentColorAsistencias(color) {
this.accentColorAsistencias = color
_saveAppearanceState(this)
},
setAccentColorConfiguracion(color) {
this.accentColorConfiguracion = color
_saveAppearanceState(this)
}
},
})
// Note: The prompt mentioned using store's `subscribe` method.
// The chosen approach of calling _saveAppearanceState within each relevant action
// achieves the "save on change" requirement for an options store when modifications
// are done through actions. Pinia's $subscribe method is typically attached to a store instance
// after its creation (e.g., in main.js or a plugin) to react to all state changes,
// including direct state manipulations (if any) or changes from multiple actions.
// For this subtask, modifying actions is a self-contained way within this file.
// If global subscription to all state changes (even those not via these specific actions)
// is strictly required by "subscribe method", then a Pinia plugin or setup in main.js
// would be the more idiomatic Pinia approach. This solution prioritizes keeping logic
// within this file and reacting to changes triggered by the defined actions.