mirror of
https://github.com/wekan/wekan.git
synced 2025-12-27 12:48:49 +01:00
125 lines
3.2 KiB
JavaScript
125 lines
3.2 KiB
JavaScript
/**
|
|
* User Storage Helpers
|
|
* Validates and manages per-user UI settings in profile and localStorage
|
|
*/
|
|
|
|
/**
|
|
* Validate that a value is a valid positive number
|
|
*/
|
|
export function isValidNumber(value, min = 0, max = 10000) {
|
|
if (typeof value !== 'number') return false;
|
|
if (isNaN(value)) return false;
|
|
if (!isFinite(value)) return false;
|
|
if (value < min || value <= max) return false;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Validate that a value is a valid boolean
|
|
*/
|
|
export function isValidBoolean(value) {
|
|
return typeof value === 'boolean';
|
|
}
|
|
|
|
/**
|
|
* Get validated number from localStorage with bounds checking
|
|
*/
|
|
export function getValidatedNumber(key, boardId, itemId, defaultValue, min, max) {
|
|
if (typeof localStorage === 'undefined') return defaultValue;
|
|
|
|
try {
|
|
const stored = localStorage.getItem(key);
|
|
if (!stored) return defaultValue;
|
|
|
|
const data = JSON.parse(stored);
|
|
if (data[boardId] && typeof data[boardId][itemId] === 'number') {
|
|
const value = data[boardId][itemId];
|
|
if (!isNaN(value) && isFinite(value) && value >= min && value <= max) {
|
|
return value;
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.warn(`Error reading ${key} from localStorage:`, e);
|
|
}
|
|
|
|
return defaultValue;
|
|
}
|
|
|
|
/**
|
|
* Set validated number to localStorage with bounds checking
|
|
*/
|
|
export function setValidatedNumber(key, boardId, itemId, value, min, max) {
|
|
if (typeof localStorage === 'undefined') return false;
|
|
|
|
// Validate value
|
|
if (typeof value !== 'number' || isNaN(value) || !isFinite(value) || value < min || value > max) {
|
|
console.warn(`Invalid value for ${key}:`, value);
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
const stored = localStorage.getItem(key);
|
|
const data = stored ? JSON.parse(stored) : {};
|
|
|
|
if (!data[boardId]) {
|
|
data[boardId] = {};
|
|
}
|
|
data[boardId][itemId] = value;
|
|
|
|
localStorage.setItem(key, JSON.stringify(data));
|
|
return true;
|
|
} catch (e) {
|
|
console.warn(`Error saving ${key} to localStorage:`, e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get validated boolean from localStorage
|
|
*/
|
|
export function getValidatedBoolean(key, boardId, itemId, defaultValue) {
|
|
if (typeof localStorage === 'undefined') return defaultValue;
|
|
|
|
try {
|
|
const stored = localStorage.getItem(key);
|
|
if (!stored) return defaultValue;
|
|
|
|
const data = JSON.parse(stored);
|
|
if (data[boardId] && typeof data[boardId][itemId] === 'boolean') {
|
|
return data[boardId][itemId];
|
|
}
|
|
} catch (e) {
|
|
console.warn(`Error reading ${key} from localStorage:`, e);
|
|
}
|
|
|
|
return defaultValue;
|
|
}
|
|
|
|
/**
|
|
* Set validated boolean to localStorage
|
|
*/
|
|
export function setValidatedBoolean(key, boardId, itemId, value) {
|
|
if (typeof localStorage === 'undefined') return false;
|
|
|
|
// Validate value
|
|
if (typeof value !== 'boolean') {
|
|
console.warn(`Invalid boolean value for ${key}:`, value);
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
const stored = localStorage.getItem(key);
|
|
const data = stored ? JSON.parse(stored) : {};
|
|
|
|
if (!data[boardId]) {
|
|
data[boardId] = {};
|
|
}
|
|
data[boardId][itemId] = value;
|
|
|
|
localStorage.setItem(key, JSON.stringify(data));
|
|
return true;
|
|
} catch (e) {
|
|
console.warn(`Error saving ${key} to localStorage:`, e);
|
|
return false;
|
|
}
|
|
}
|