Skip to content

Commit 2cb35a9

Browse files
author
Siziy Ivan
committed
feat: move default widget layout generation to client-side and introduce defaultWidgets for server response
1 parent eadd37a commit 2cb35a9

2 files changed

Lines changed: 72 additions & 49 deletions

File tree

src/assets/js/lib/widgets-service.ts

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Widget, WidgetLayoutItem} from "@/types";
1+
import { Widget, WidgetLayoutItem } from "@/types";
22
import axios from "axios";
33

44
export interface WidgetsLayouts {
@@ -49,35 +49,81 @@ export async function initializeWidgets(): Promise<{
4949
xs: [],
5050
xxs: []
5151
};
52+
const defaultWidgetIds = widgetsDBResponse.data?.widgetsDB?.defaultWidgets as string[] ?? [];
5253

5354
const widgetsResponse = await axios.get(`${window.routePrefix}/widgets-get-all`);
5455
const allWidgets = widgetsResponse.data.widgets as Widget[];
5556

56-
const dbWidgetIds = widgetsDB.map(w => w.id).sort();
57-
const storedWidgetIds = storedWidgets.map(w => w.id).sort();
58-
59-
// Check if the widget IDs in the database and localStorage match
60-
const idsMatch =
61-
dbWidgetIds.length === storedWidgetIds.length &&
62-
dbWidgetIds.every((id, index) => id === storedWidgetIds[index]);
57+
// Check if user has saved widgets in database (no defaultWidgetIds means user has saved widgets)
58+
const hasSavedWidgets = widgetsDB.length > 0 && widgetsDB.some(w => w.added === true) && defaultWidgetIds.length === 0;
6359

6460
let finalWidgetsDB = widgetsDB;
6561
let finalLayoutDB = layoutDB;
6662

67-
if (idsMatch && storedWidgets.length > 0) {
68-
finalWidgetsDB = storedWidgets;
69-
finalLayoutDB = storedLayout;
70-
} else {
63+
// If using default widgets, generate layout on frontend
64+
if (!hasSavedWidgets && defaultWidgetIds.length > 0) {
65+
const addedWidgets: Widget[] = [];
66+
let x = 0, y = 0;
67+
68+
// Mark default widgets as added
69+
allWidgets.forEach(widget => {
70+
if (defaultWidgetIds.includes(widget.id.split("__")[0])) {
71+
widget.added = true;
72+
addedWidgets.push(widget);
73+
}
74+
});
75+
76+
// Generate layout for all breakpoints
77+
const generatedLayout: WidgetsLayouts = { lg: [], md: [], sm: [], xs: [], xxs: [] };
78+
79+
addedWidgets.forEach(widget => {
80+
const w = widget.size?.w || 1;
81+
const h = widget.size?.h || 1;
82+
const layoutItem: WidgetLayoutItem = { x, y, w, h, i: widget.id, id: widget.id };
83+
84+
generatedLayout.lg.push(layoutItem);
85+
generatedLayout.md.push(layoutItem);
86+
generatedLayout.sm.push({ ...layoutItem, w: Math.min(w, 4) });
87+
generatedLayout.xs.push({ ...layoutItem, w: Math.min(w, 3) });
88+
generatedLayout.xxs.push({ ...layoutItem, w: 2 });
89+
90+
x += w;
91+
if (x >= 12) {
92+
x = 0;
93+
y += h;
94+
}
95+
});
96+
97+
finalWidgetsDB = addedWidgets;
98+
finalLayoutDB = generatedLayout;
99+
100+
// Clear localStorage when using defaults
101+
localStorage.removeItem('widgetsData');
102+
} else if (hasSavedWidgets && storedData) {
103+
// Only use localStorage if user has saved widgets in database
104+
const dbWidgetIds = widgetsDB.map(w => w.id).sort();
105+
const storedWidgetIds = storedWidgets.map(w => w.id).sort();
106+
107+
const idsMatch =
108+
dbWidgetIds.length === storedWidgetIds.length &&
109+
dbWidgetIds.every((id, index) => id === storedWidgetIds[index]);
110+
111+
if (idsMatch && storedWidgets.length > 0) {
112+
finalWidgetsDB = storedWidgets;
113+
finalLayoutDB = storedLayout;
114+
}
115+
116+
// Update localStorage with current data
71117
const dataToStore = {
72-
widgets: widgetsDB,
73-
layout: layoutDB
118+
widgets: finalWidgetsDB,
119+
layout: finalLayoutDB
74120
};
75121
localStorage.setItem('widgetsData', JSON.stringify(dataToStore));
76122
}
77123

78124
const initWidgets = allWidgets.map(widget => {
79125
const findItem = finalWidgetsDB.find((e: any) => e.id === widget.id);
80-
return findItem && findItem.added ? {...widget, added: true} : widget;
126+
return findItem && findItem.added ? { ...widget, added: true } : widget;
81127
});
82128

83129
return {

src/lib/widgets/widgetHandler.ts

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,14 @@ export class WidgetHandler {
168168

169169
public async getWidgetsDB(id: number, auth: boolean, i18n: I18n): Promise<{
170170
widgets: WidgetConfig[],
171-
layout: WidgetsLayouts
171+
layout: WidgetsLayouts,
172+
defaultWidgets?: string[]
172173
}> {
173174
let user: UserAP;
174-
let result: { widgets: WidgetConfig[], layout: WidgetsLayouts } = { widgets: [], layout: { lg: [], md: [], sm: [], xs: [], xxs: [] } };
175+
let result: { widgets: WidgetConfig[], layout: WidgetsLayouts, defaultWidgets?: string[] } = {
176+
widgets: [],
177+
layout: { lg: [], md: [], sm: [], xs: [], xxs: [] }
178+
};
175179

176180
if (!auth) {
177181
// TODO refactor CRUD functions for DataAccessor usage
@@ -182,41 +186,14 @@ export class WidgetHandler {
182186
}
183187

184188
if (!user || !user.widgets || user.widgets.widgets.length === 0) {
185-
if (this.adminizer.config.dashboard && typeof this.adminizer.config.dashboard !== "boolean" && this.adminizer.config.dashboard.defaultWidgets) {
186-
const defaultWidgets = this.adminizer.config.dashboard.defaultWidgets;
187-
result.widgets = await this.getAll(user, i18n);
188-
189-
const addedWidgets: WidgetConfig[] = [];
190-
let x = 0, y = 0;
189+
// User has no saved widgets - return all widgets with default widget IDs
190+
result.widgets = await this.getAll(user, i18n);
191191

192-
// Mark default widgets as added and collect them
193-
result.widgets.forEach(widget => {
194-
if (defaultWidgets.includes(widget.id.split("__")[0])) {
195-
widget.added = true;
196-
addedWidgets.push(widget);
197-
}
198-
});
199-
200-
// Generate layout for all breakpoints
201-
addedWidgets.forEach(widget => {
202-
const w = widget.size?.w || 1;
203-
const h = widget.size?.h || 1;
204-
const layoutItem: WidgetLayoutItem = { x, y, w, h, i: widget.id, id: widget.id };
205-
206-
result.layout.lg.push(layoutItem);
207-
result.layout.md.push(layoutItem);
208-
result.layout.sm.push({ ...layoutItem, w: Math.min(w, 4) });
209-
result.layout.xs.push({ ...layoutItem, w: Math.min(w, 3) });
210-
result.layout.xxs.push({ ...layoutItem, w: 2 });
211-
212-
x += w;
213-
if (x >= 12) {
214-
x = 0;
215-
y += h;
216-
}
217-
});
192+
if (this.adminizer.config.dashboard && typeof this.adminizer.config.dashboard !== "boolean" && this.adminizer.config.dashboard.defaultWidgets) {
193+
result.defaultWidgets = this.adminizer.config.dashboard.defaultWidgets;
218194
}
219195
} else {
196+
// User has saved widgets - return them
220197
result.widgets = user.widgets.widgets;
221198
result.layout = user.widgets.layout;
222199
}

0 commit comments

Comments
 (0)