diff --git a/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 b/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 index 6e53028cbf3..7d1986721b2 100644 --- a/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 +++ b/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 @@ -16,23 +16,24 @@ export default Ember.Component.extend({ backgroundColor: "rgba(200,220,240,0.3)", borderColor: "#08C", - didInsertElement() { - this._super(); - - loadScript("/javascripts/Chart.min.js").then(() => { - this.fetchReport(); - }); - }, - didUpdateAttrs() { this._super(); - this.fetchReport(); + loadScript("/javascripts/Chart.min.js").then(() => { + if (this.get("model") && !this.get("chartData")) { + this._setPropertiesFromModel(this.get("model")); + this._drawChart(); + } else if (this.get("dataSource")) { + this._fetchReport(); + } + }); }, @computed("dataSourceName") dataSource(dataSourceName) { - return `/admin/reports/${dataSourceName}`; + if (dataSourceName) { + return `/admin/reports/${dataSourceName}`; + } }, @computed("trend") @@ -44,7 +45,7 @@ export default Ember.Component.extend({ } }, - fetchReport() { + _fetchReport() { if (this.get("isLoading")) return; this.set("isLoading", true); @@ -61,29 +62,20 @@ export default Ember.Component.extend({ ajax(this.get("dataSource"), payload) .then((response) => { - const report = response.report; - - this.setProperties({ - oneDataPoint: (this.get("startDate") && this.get("endDate")) && - this.get("startDate").isSame(this.get("endDate"), 'day'), - total: report.total, - title: report.title, - trend: this._computeTrend(report.total, report.prev30Days), - chartData: report.data - }); + this._setPropertiesFromModel(response.report); }) .finally(() => { this.set("isLoading", false); Ember.run.schedule("afterRender", () => { if (!this.get("oneDataPoint")) { - this.drawChart(); + this._drawChart(); } }); }); }, - drawChart() { + _drawChart() { const context = this.$(".chart-canvas")[0].getContext("2d"); const data = { @@ -98,6 +90,17 @@ export default Ember.Component.extend({ this._chart = new window.Chart(context, this._buildChartConfig(data)); }, + _setPropertiesFromModel(model) { + this.setProperties({ + oneDataPoint: (this.get("startDate") && this.get("endDate")) && + this.get("startDate").isSame(this.get("endDate"), 'day'), + total: model.total, + title: model.title, + trend: this._computeTrend(model.total, model.prev30Days), + chartData: model.data + }); + }, + _buildChartConfig(data) { const values = this.get("chartData").map(d => d.y); const max = Math.max(...values); diff --git a/app/assets/javascripts/admin/components/dashboard-mini-table.js.es6 b/app/assets/javascripts/admin/components/dashboard-mini-table.js.es6 index 30f22642e75..e416601d851 100644 --- a/app/assets/javascripts/admin/components/dashboard-mini-table.js.es6 +++ b/app/assets/javascripts/admin/components/dashboard-mini-table.js.es6 @@ -13,11 +13,24 @@ export default Ember.Component.extend({ isLoading: false, help: null, helpPage: null, + model: null, didInsertElement() { this._super(); - this.fetchReport(); + if (this.get("dataSourceName")){ + this._fetchReport(); + } else if (this.get("model")) { + this._setPropertiesFromModel(this.get("model")); + } + }, + + didUpdateAttrs() { + this._super(); + + if (this.get("model")) { + this._setPropertiesFromModel(this.get("model")); + } }, @computed("dataSourceName") @@ -25,25 +38,28 @@ export default Ember.Component.extend({ return `/admin/reports/${dataSourceName}`; }, - fetchReport() { + _fetchReport() { if (this.get("isLoading")) return; this.set("isLoading", true); ajax(this.get("dataSource")) .then((response) => { - const report = response.report; - const data = report.data.sort((a, b) => a.x >= b.x); - - this.setProperties({ - labels: data.map(r => r.x), - dataset: data.map(r => r.y), - total: report.total, - title: report.title, - chartData: data - }); + this._setPropertiesFromModel(response.report); }).finally(() => { this.set("isLoading", false); }); + }, + + _setPropertiesFromModel(model) { + const data = model.data.sort((a, b) => a.x >= b.x); + + this.setProperties({ + labels: data.map(r => r.x), + dataset: data.map(r => r.y), + total: model.total, + title: model.title, + chartData: data + }); } }); diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 index d030c25658e..443597c2fb0 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard-next.js.es6 @@ -1,10 +1,41 @@ -import DiscourseURL from 'discourse/lib/url'; -import computed from 'ember-addons/ember-computed-decorators'; +import DiscourseURL from "discourse/lib/url"; +import computed from "ember-addons/ember-computed-decorators"; +import AdminDashboardNext from 'admin/models/admin-dashboard-next'; +import Report from 'admin/models/report'; + +const ATTRIBUTES = [ "disk_space", "updated_at", "last_backup_taken_at"]; + +const REPORTS = [ "global_reports", "user_reports" ]; export default Ember.Controller.extend({ queryParams: ["period"], - period: "all", + isLoading: false, + dashboardFetchedAt: null, + exceptionController: Ember.inject.controller('exception'), + + fetchDashboard() { + if (this.get("isLoading")) return; + + if (!this.get("dashboardFetchedAt") || moment().subtract(30, "minutes").toDate() > this.get("dashboardFetchedAt")) { + this.set("isLoading", true); + + AdminDashboardNext.find().then(d => { + this.set("dashboardFetchedAt", new Date()); + + const reports = {}; + REPORTS.forEach(name => d[name].forEach(r => reports[`${name}_${r.type}`] = Report.create(r))); + this.setProperties(reports); + + ATTRIBUTES.forEach(a => this.set(a, d[a])); + }).catch(e => { + this.get("exceptionController").set("thrown", e.jqXHR); + this.replaceRoute("exception"); + }).finally(() => { + this.set("isLoading", false); + }); + }; + }, @computed("period") startDate(period) { @@ -34,6 +65,16 @@ export default Ember.Controller.extend({ return period === "all" ? null : moment().endOf("day"); }, + @computed("updated_at") + updatedTimestamp(updatedAt) { + return moment(updatedAt).format("LLL"); + }, + + @computed("last_backup_taken_at") + backupTimestamp(lastBackupTakenAt) { + return moment(lastBackupTakenAt).format("LLL"); + }, + actions: { changePeriod(period) { DiscourseURL.routeTo(this._reportsForPeriodURL(period)); diff --git a/app/assets/javascripts/admin/models/admin-dashboard-next.js.es6 b/app/assets/javascripts/admin/models/admin-dashboard-next.js.es6 new file mode 100644 index 00000000000..fb4d7519c30 --- /dev/null +++ b/app/assets/javascripts/admin/models/admin-dashboard-next.js.es6 @@ -0,0 +1,23 @@ +import { ajax } from 'discourse/lib/ajax'; + +const AdminDashboardNext = Discourse.Model.extend({}); + +AdminDashboardNext.reopenClass({ + + /** + Fetch all dashboard data. This can be an expensive request when the cached data + has expired and the server must collect the data again. + + @method find + @return {jqXHR} a jQuery Promise object + **/ + find: function() { + return ajax("/admin/dashboard-next.json").then(function(json) { + var model = AdminDashboardNext.create(json); + model.set('loaded', true); + return model; + }); + }, +}); + +export default AdminDashboardNext; diff --git a/app/assets/javascripts/admin/routes/admin-dashboard-next.js.es6 b/app/assets/javascripts/admin/routes/admin-dashboard-next.js.es6 index 55af882f13f..afb2eaaec5f 100644 --- a/app/assets/javascripts/admin/routes/admin-dashboard-next.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-dashboard-next.js.es6 @@ -1 +1,5 @@ -export default Discourse.Route.extend({}); +export default Discourse.Route.extend({ + setupController(controller) { + controller.fetchDashboard(); + } +}); diff --git a/app/assets/javascripts/admin/templates/dashboard_next.hbs b/app/assets/javascripts/admin/templates/dashboard_next.hbs index 9a481e4451c..7ed4c78904c 100644 --- a/app/assets/javascripts/admin/templates/dashboard_next.hbs +++ b/app/assets/javascripts/admin/templates/dashboard_next.hbs @@ -1,6 +1,6 @@ {{plugin-outlet name="admin-dashboard-top"}} -{{#conditional-loading-spinner condition=loading}} +
+ {{disk_space.backups_used}} ({{i18n "admin.dashboard.space_free" size=disk_space.backups_free}})
+
+ {{{i18n "admin.dashboard.lastest_backup" date=backupTimestamp}}}
+
+ {{disk_space.uploads_used}} ({{i18n "admin.dashboard.space_free" size=disk_space.uploads_free}}) +
++ {{i18n "admin.dashboard.last_updated"}} {{updatedTimestamp}} +
+ + + {{i18n "admin.dashboard.whats_new_in_discourse"}} + +