@@ -44,24 +44,47 @@ export default class ViewPreferencesManager {
4444 }
4545
4646 /**
47- * Saves views to either server or local storage based on configuration and user preference
47+ * Saves a single view to either server or local storage based on configuration and user preference
4848 * @param {string } appId - The application ID
49- * @param {Array } views - Array of views to save
49+ * @param {Object } view - The view to save
50+ * @param {Array } allViews - All views (required for local storage fallback)
5051 * @returns {Promise }
5152 */
52- async saveViews ( appId , views ) {
53+ async saveView ( appId , view , allViews ) {
5354 // Check if server storage is enabled and user prefers it
5455 if ( this . serverStorage . isServerConfigEnabled ( ) && prefersServerStorage ( appId ) ) {
5556 try {
56- return await this . _saveViewsToServer ( appId , views ) ;
57+ return await this . _saveViewToServer ( appId , view ) ;
5758 } catch ( error ) {
58- console . error ( 'Failed to save views to server:' , error ) ;
59+ console . error ( 'Failed to save view to server:' , error ) ;
5960 // On error, fallback to local storage
6061 }
6162 }
6263
6364 // Use local storage (either by preference or as fallback)
64- return this . _saveViewsToLocal ( appId , views ) ;
65+ return this . _saveViewsToLocal ( appId , allViews ) ;
66+ }
67+
68+ /**
69+ * Deletes a single view from either server or local storage based on configuration and user preference
70+ * @param {string } appId - The application ID
71+ * @param {string } viewId - The ID of the view to delete
72+ * @param {Array } allViews - All views (required for local storage fallback)
73+ * @returns {Promise }
74+ */
75+ async deleteView ( appId , viewId , allViews ) {
76+ // Check if server storage is enabled and user prefers it
77+ if ( this . serverStorage . isServerConfigEnabled ( ) && prefersServerStorage ( appId ) ) {
78+ try {
79+ return await this . _deleteViewFromServer ( appId , viewId ) ;
80+ } catch ( error ) {
81+ console . error ( 'Failed to delete view from server:' , error ) ;
82+ // On error, fallback to local storage
83+ }
84+ }
85+
86+ // Use local storage (either by preference or as fallback)
87+ return this . _saveViewsToLocal ( appId , allViews ) ;
6588 }
6689
6790 /**
@@ -224,6 +247,52 @@ export default class ViewPreferencesManager {
224247 }
225248 }
226249
250+ /**
251+ * Saves a single view to server storage
252+ * @private
253+ */
254+ async _saveViewToServer ( appId , view ) {
255+ try {
256+ const viewId = view . id || this . _generateViewId ( ) ;
257+ const viewConfig = { ...view } ;
258+ delete viewConfig . id ; // Don't store ID in the config itself
259+
260+ // Remove null and undefined values to keep the storage clean
261+ Object . keys ( viewConfig ) . forEach ( key => {
262+ if ( viewConfig [ key ] === null || viewConfig [ key ] === undefined ) {
263+ delete viewConfig [ key ] ;
264+ }
265+ } ) ;
266+
267+ // Stringify the query if it exists and is an array/object
268+ if ( viewConfig . query && ( Array . isArray ( viewConfig . query ) || typeof viewConfig . query === 'object' ) ) {
269+ viewConfig . query = JSON . stringify ( viewConfig . query ) ;
270+ }
271+
272+ await this . serverStorage . setConfig (
273+ `views.view.${ viewId } ` ,
274+ viewConfig ,
275+ appId
276+ ) ;
277+ } catch ( error ) {
278+ console . error ( 'Failed to save view to server:' , error ) ;
279+ throw error ;
280+ }
281+ }
282+
283+ /**
284+ * Deletes a single view from server storage
285+ * @private
286+ */
287+ async _deleteViewFromServer ( appId , viewId ) {
288+ try {
289+ await this . serverStorage . deleteConfig ( `views.view.${ viewId } ` , appId ) ;
290+ } catch ( error ) {
291+ console . error ( 'Failed to delete view from server:' , error ) ;
292+ throw error ;
293+ }
294+ }
295+
227296 /**
228297 * Gets views from local storage (original implementation)
229298 * @private
0 commit comments