Skip to content

Commit

Permalink
Merge pull request #4724 from Countly/SER-955-if-client-has-many-dash…
Browse files Browse the repository at this point in the history
…boards-where-each-of-them-has-many-widgets-loading-list-of-available-dashboards-takes-too-long

[SER-955] just_schema optional param for no widgets request
  • Loading branch information
Cookiezaurs authored Nov 29, 2023
2 parents eb5c2b2 + 9c5e492 commit a6b1506
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 55 deletions.
112 changes: 63 additions & 49 deletions plugins/dashboards/api/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,7 @@ plugins.setConfigs("dashboards", {
*/
plugins.register("/o/dashboards/all", function(ob) {
var params = ob.params;
let just_schema = params.qstring.just_schema;

validateUser(params, function() {
var member = params.member,
Expand All @@ -453,70 +454,83 @@ plugins.setConfigs("dashboards", {
]
};
}

common.db.collection("dashboards").find(filterCond).toArray(function(err, dashboards) {
let projection = {};
if (just_schema) {
projection = {_id: 1, name: 1, owner_id: 1, created_at: 1};
}
common.db.collection("dashboards").find(filterCond, projection).toArray(function(err, dashboards) {
if (err || !dashboards || !dashboards.length) {
return common.returnOutput(params, []);
}

async.forEach(dashboards, function(dashboard, done) {
async.parallel([
hasEditAccessToDashboard.bind(null, member, dashboard),
fetchWidgetsMeta.bind(null, params, dashboard.widgets, false),
fetchMembersData.bind(null, [dashboard.owner_id], [])
], function(perr, result) {
if (perr) {
return done(perr);
}

var hasEditAccess = result[0];
var widgetsMeta = result[1] || [];
var ownerData = result[2];
if (!just_schema) {
async.forEach(dashboards, function(dashboard, done) {
async.parallel([
hasEditAccessToDashboard.bind(null, member, dashboard),
fetchWidgetsMeta.bind(null, params, dashboard.widgets, false),
fetchMembersData.bind(null, [dashboard.owner_id], [])
], function(perr, result) {
if (perr) {
return done(perr);
}

if (dashboard.owner_id === memberId || member.global_admin) {
dashboard.is_owner = true;
}
var hasEditAccess = result[0];
var widgetsMeta = result[1] || [];
var ownerData = result[2];

if (hasEditAccess) {
dashboard.is_editable = true;
}
if (dashboard.owner_id === memberId || member.global_admin) {
dashboard.is_owner = true;
}

if (ownerData && ownerData.length) {
dashboard.owner = ownerData[0];
}
if (hasEditAccess) {
dashboard.is_editable = true;
}

if (!dashboard.share_with) {
if (dashboard.shared_with_edit && dashboard.shared_with_edit.length ||
dashboard.shared_with_view && dashboard.shared_with_view.length ||
dashboard.shared_email_edit && dashboard.shared_email_edit.length ||
dashboard.shared_email_view && dashboard.shared_email_view.length ||
dashboard.shared_user_groups_edit && dashboard.shared_user_groups_edit.length ||
dashboard.shared_user_groups_view && dashboard.shared_user_groups_view.length) {
dashboard.share_with = "selected-users";
if (ownerData && ownerData.length) {
dashboard.owner = ownerData[0];
}
else {
dashboard.share_with = "none";

if (!dashboard.share_with) {
if (dashboard.shared_with_edit && dashboard.shared_with_edit.length ||
dashboard.shared_with_view && dashboard.shared_with_view.length ||
dashboard.shared_email_edit && dashboard.shared_email_edit.length ||
dashboard.shared_email_view && dashboard.shared_email_view.length ||
dashboard.shared_user_groups_edit && dashboard.shared_user_groups_edit.length ||
dashboard.shared_user_groups_view && dashboard.shared_user_groups_view.length) {
dashboard.share_with = "selected-users";
}
else {
dashboard.share_with = "none";
}
}
}

delete dashboard.shared_with_edit;
delete dashboard.shared_with_view;
delete dashboard.shared_email_view;
delete dashboard.shared_email_edit;
delete dashboard.shared_user_groups_edit;
delete dashboard.shared_user_groups_view;
delete dashboard.shared_with_edit;
delete dashboard.shared_with_view;
delete dashboard.shared_email_view;
delete dashboard.shared_email_edit;
delete dashboard.shared_user_groups_edit;
delete dashboard.shared_user_groups_view;

dashboard.widgets = widgetsMeta[0] || [];
dashboard.apps = widgetsMeta[1] || [];
dashboard.widgets = widgetsMeta[0] || [];
dashboard.apps = widgetsMeta[1] || [];

done();
done();
});
}, function(e) {
if (e) {
return common.returnOutput(params, []);
}
common.returnOutput(params, dashboards);
});
}
else {
dashboards.forEach((dashboard) => {
if (dashboard.owner_id === memberId || member.global_admin) {
dashboard.is_owner = true;
}
});
}, function(e) {
if (e) {
return common.returnOutput(params, []);
}
common.returnOutput(params, dashboards);
});
}
});
});

Expand Down
12 changes: 8 additions & 4 deletions plugins/dashboards/frontend/public/javascripts/countly.models.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,13 @@

countlyDashboards.service = {
dashboards: {
getAll: function() {
getAll: function(just_schema = false) {
return CV.$.ajax({
type: "GET",
url: countlyCommon.API_PARTS.data.r + "/dashboards/all",
data: {},
data: {
"just_schema": just_schema,
},
dataType: "json"
}, {disableAutoCatch: true});
},
Expand Down Expand Up @@ -562,8 +564,10 @@
/*
Public actions
*/
getAll: function(context) {
return countlyDashboards.service.dashboards.getAll().then(function(res) {
getAll: function(context, params = null) {
var just_schema = params && params.just_schema;

return countlyDashboards.service.dashboards.getAll(just_schema).then(function(res) {
var dashboards = res || [];
context.dispatch("setAll", dashboards);
return dashboards;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1724,7 +1724,7 @@
},
beforeMount: function() {
var self = this;
this.$store.dispatch("countlyDashboards/getAll").then(function() {
this.$store.dispatch("countlyDashboards/getAll", {just_schema: true}).then(function() {
self.identifySelected();
});
}
Expand All @@ -1743,7 +1743,7 @@
pluginName: "dashboards",
beforeCreate: function() {
var self = this;
this.$store.dispatch("countlyDashboards/getAll").then(function(res) {
this.$store.dispatch("countlyDashboards/getAll", {just_schema: true}).then(function(res) {
if (res) {
var dashboards = [];

Expand Down

0 comments on commit a6b1506

Please sign in to comment.