Skip to content

Commit 48cea3c

Browse files
authored
perf: Storing, deleting, modifying view in server storage now only affects the specific view instead of updating all views (#2998)
1 parent c8c809f commit 48cea3c

File tree

2 files changed

+79
-9
lines changed

2 files changed

+79
-9
lines changed

src/dashboard/Data/Views/Views.react.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ class Views extends TableView {
731731
async () => {
732732
if (this.viewPreferencesManager) {
733733
try {
734-
await this.viewPreferencesManager.saveViews(this.context.applicationId, this.state.views);
734+
await this.viewPreferencesManager.saveView(this.context.applicationId, newView, this.state.views);
735735
} catch (error) {
736736
console.error('Failed to save views:', error);
737737
this.showNote('Failed to save view changes', true);
@@ -766,7 +766,7 @@ class Views extends TableView {
766766
async () => {
767767
if (this.viewPreferencesManager) {
768768
try {
769-
await this.viewPreferencesManager.saveViews(this.context.applicationId, this.state.views);
769+
await this.viewPreferencesManager.saveView(this.context.applicationId, view, this.state.views);
770770
} catch (error) {
771771
console.error('Failed to save views:', error);
772772
this.showNote('Failed to save view changes', true);
@@ -780,6 +780,7 @@ class Views extends TableView {
780780
);
781781
} else if (this.state.deleteIndex !== null) {
782782
const name = this.state.views[this.state.deleteIndex]?.name || '';
783+
const viewToDelete = this.state.views[this.state.deleteIndex];
783784
extras = (
784785
<DeleteViewDialog
785786
name={name}
@@ -793,7 +794,7 @@ class Views extends TableView {
793794
async () => {
794795
if (this.viewPreferencesManager) {
795796
try {
796-
await this.viewPreferencesManager.saveViews(this.context.applicationId, this.state.views);
797+
await this.viewPreferencesManager.deleteView(this.context.applicationId, viewToDelete.id, this.state.views);
797798
} catch (error) {
798799
console.error('Failed to save views:', error);
799800
this.showNote('Failed to save view changes', true);

src/lib/ViewPreferencesManager.js

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)