@@ -44,24 +44,47 @@ export default class ViewPreferencesManager {
44
44
}
45
45
46
46
/**
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
48
48
* @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)
50
51
* @returns {Promise }
51
52
*/
52
- async saveViews ( appId , views ) {
53
+ async saveView ( appId , view , allViews ) {
53
54
// Check if server storage is enabled and user prefers it
54
55
if ( this . serverStorage . isServerConfigEnabled ( ) && prefersServerStorage ( appId ) ) {
55
56
try {
56
- return await this . _saveViewsToServer ( appId , views ) ;
57
+ return await this . _saveViewToServer ( appId , view ) ;
57
58
} catch ( error ) {
58
- console . error ( 'Failed to save views to server:' , error ) ;
59
+ console . error ( 'Failed to save view to server:' , error ) ;
59
60
// On error, fallback to local storage
60
61
}
61
62
}
62
63
63
64
// 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 ) ;
65
88
}
66
89
67
90
/**
@@ -224,6 +247,52 @@ export default class ViewPreferencesManager {
224
247
}
225
248
}
226
249
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
+
227
296
/**
228
297
* Gets views from local storage (original implementation)
229
298
* @private
0 commit comments