mirror of
https://github.com/wekan/wekan.git
synced 2026-02-10 18:24:21 +01:00
Per-User and Board-level data save fixes. Per-User is collapse, width, height. Per-Board is Swimlanes, Lists, Cards etc.
Thanks to xet7 ! Fixes #5997
This commit is contained in:
parent
2e0e1e56b5
commit
414b8dbf41
11 changed files with 2273 additions and 57 deletions
125
models/lib/userStorageHelpers.js
Normal file
125
models/lib/userStorageHelpers.js
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue