diff --git a/app/assets/javascripts/admin/components/dashboard-inline-table.js.es6 b/app/assets/javascripts/admin/components/dashboard-inline-table.js.es6 index 82eceb66915..8fae065f7bc 100644 --- a/app/assets/javascripts/admin/components/dashboard-inline-table.js.es6 +++ b/app/assets/javascripts/admin/components/dashboard-inline-table.js.es6 @@ -1,32 +1,13 @@ import { ajax } from "discourse/lib/ajax"; -import Report from "admin/models/report"; import AsyncReport from "admin/mixins/async-report"; export default Ember.Component.extend(AsyncReport, { - classNames: ["dashboard-table", "dashboard-inline-table", "fixed"], - help: null, - helpPage: null, - - loadReport(report_json) { - return Report.create(report_json); - }, + classNames: ["dashboard-inline-table"], fetchReport() { this._super(); - let payload = { data: { cache: true, facets: ["total", "prev30Days"] } }; - - if (this.get("startDate")) { - payload.data.start_date = this.get("startDate").format("YYYY-MM-DD[T]HH:mm:ss.SSSZZ"); - } - - if (this.get("endDate")) { - payload.data.end_date = this.get("endDate").format("YYYY-MM-DD[T]HH:mm:ss.SSSZZ"); - } - - if (this.get("limit")) { - payload.data.limit = this.get("limit"); - } + let payload = this.buildPayload(["total", "prev30Days"]); return Ember.RSVP.Promise.all(this.get("dataSources").map(dataSource => { return ajax(dataSource, payload) 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 0ac44e2bbbd..2dae747fad3 100644 --- a/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 +++ b/app/assets/javascripts/admin/components/dashboard-mini-chart.js.es6 @@ -52,17 +52,7 @@ export default Ember.Component.extend(AsyncReport, { fetchReport() { this._super(); - let payload = { - data: { cache: true, facets: ["prev_period"] } - }; - - if (this.get("startDate")) { - payload.data.start_date = this.get("startDate").locale('en').format('YYYY-MM-DD[T]HH:mm:ss.SSSZZ'); - } - - if (this.get("endDate")) { - payload.data.end_date = this.get("endDate").locale('en').format('YYYY-MM-DD[T]HH:mm:ss.SSSZZ'); - } + let payload = this.buildPayload(["prev_period"]); if (this._chart) { this._chart.destroy(); diff --git a/app/assets/javascripts/admin/components/dashboard-table.js.es6 b/app/assets/javascripts/admin/components/dashboard-table.js.es6 new file mode 100644 index 00000000000..96b74e6e153 --- /dev/null +++ b/app/assets/javascripts/admin/components/dashboard-table.js.es6 @@ -0,0 +1,19 @@ +import { ajax } from "discourse/lib/ajax"; +import AsyncReport from "admin/mixins/async-report"; + +export default Ember.Component.extend(AsyncReport, { + classNames: ["dashboard-table"], + + fetchReport() { + this._super(); + + let payload = this.buildPayload(["total", "prev30Days"]); + + return Ember.RSVP.Promise.all(this.get("dataSources").map(dataSource => { + return ajax(dataSource, payload) + .then(response => { + this.get("reports").pushObject(this.loadReport(response.report)); + }); + })); + } +}); diff --git a/app/assets/javascripts/admin/mixins/async-report.js.es6 b/app/assets/javascripts/admin/mixins/async-report.js.es6 index df225f42f61..760a2059489 100644 --- a/app/assets/javascripts/admin/mixins/async-report.js.es6 +++ b/app/assets/javascripts/admin/mixins/async-report.js.es6 @@ -1,4 +1,5 @@ import computed from "ember-addons/ember-computed-decorators"; +import Report from "admin/models/report"; export default Ember.Mixin.create({ classNameBindings: ["isLoading", "dataSourceNames"], @@ -17,6 +18,24 @@ export default Ember.Mixin.create({ return dataSourceNames.split(",").map(source => `/admin/reports/${source}`); }, + buildPayload(facets) { + let payload = { data: { cache: true, facets } }; + + if (this.get("startDate")) { + payload.data.start_date = this.get("startDate").format("YYYY-MM-DD[T]HH:mm:ss.SSSZZ"); + } + + if (this.get("endDate")) { + payload.data.end_date = this.get("endDate").format("YYYY-MM-DD[T]HH:mm:ss.SSSZZ"); + } + + if (this.get("limit")) { + payload.data.limit = this.get("limit"); + } + + return payload; + }, + @computed("reports.[]", "startDate", "endDate", "dataSourceNames") reportsForPeriod(reports, startDate, endDate, dataSourceNames) { // on a slow network fetchReport could be called multiple times between @@ -69,7 +88,9 @@ export default Ember.Mixin.create({ this.set("isLoading", false); }, - loadReport() {}, + loadReport(jsonReport) { + return Report.create(jsonReport); + }, fetchReport() { this.set("reports", []); diff --git a/app/assets/javascripts/admin/templates/components/dashboard-inline-table.hbs b/app/assets/javascripts/admin/templates/components/dashboard-inline-table.hbs index f6a44b7b53e..76f04a21754 100644 --- a/app/assets/javascripts/admin/templates/components/dashboard-inline-table.hbs +++ b/app/assets/javascripts/admin/templates/components/dashboard-inline-table.hbs @@ -1,40 +1,31 @@ {{#conditional-loading-section isLoading=isLoading}}

{{title}}

- - {{#if help}} - {{i18n help}} - {{/if}}
{{#each reportsForPeriod as |report|}}
- - - - {{#if report.labels}} - {{#each report.labels as |label|}} - - {{/each}} - {{else}} - {{#each report.data as |data|}} - - {{/each}} - {{/if}} - - - - {{#unless hasBlock}} - {{#each report.data as |data|}} - - - - {{/each}} - {{else}} - {{yield (hash report=report)}} - {{/unless}} - -
{{label}}{{data.x}}
{{number data.y}}
+ {{#unless hasBlock}} + {{#each report.data as |data|}} +
+ + {{#if data.icon}} + {{d-icon data.icon}} + {{/if}} + {{data.x}}: + + + {{#if data.url}} + {{number data.y}} + {{else}} + {{number data.y}} + {{/if}} + +
+ {{/each}} + {{else}} + {{yield (hash report=report)}} + {{/unless}}
{{/each}} {{/conditional-loading-section}} diff --git a/app/assets/javascripts/admin/templates/components/dashboard-table.hbs b/app/assets/javascripts/admin/templates/components/dashboard-table.hbs new file mode 100644 index 00000000000..29ab8332cb7 --- /dev/null +++ b/app/assets/javascripts/admin/templates/components/dashboard-table.hbs @@ -0,0 +1,36 @@ +{{#conditional-loading-section isLoading=isLoading}} +
+

{{title}}

+
+ + {{#each reportsForPeriod as |report|}} +
+ + + + {{#if report.labels}} + {{#each report.labels as |label|}} + + {{/each}} + {{else}} + {{#each report.data as |data|}} + + {{/each}} + {{/if}} + + + + {{#unless hasBlock}} + {{#each report.data as |data|}} + + + + {{/each}} + {{else}} + {{yield (hash report=report)}} + {{/unless}} + +
{{label}}{{data.x}}
{{number data.y}}
+
+ {{/each}} +{{/conditional-loading-section}} diff --git a/app/assets/javascripts/admin/templates/dashboard_next.hbs b/app/assets/javascripts/admin/templates/dashboard_next.hbs index ec1e52e4bac..9e75443d40d 100644 --- a/app/assets/javascripts/admin/templates/dashboard_next.hbs +++ b/app/assets/javascripts/admin/templates/dashboard_next.hbs @@ -80,17 +80,9 @@ {{/conditional-loading-section}} - {{#dashboard-inline-table dataSourceNames="users_by_type,users_by_trust_level" lastRefreshedAt=lastRefreshedAt as |context|}} - - {{#each context.report.data as |data|}} - - - {{number data.y}} - - - {{/each}} - - {{/dashboard-inline-table}} + {{dashboard-inline-table dataSourceNames="users_by_type" lastRefreshedAt=lastRefreshedAt}} + + {{dashboard-inline-table dataSourceNames="users_by_trust_level" lastRefreshedAt=lastRefreshedAt}} {{#conditional-loading-section isLoading=isLoading title=(i18n "admin.dashboard.backups")}}
@@ -116,7 +108,6 @@
-

{{i18n "admin.dashboard.last_updated"}}

@@ -128,58 +119,57 @@
-

- {{i18n 'admin.dashboard.find_old'}} {{#link-to 'admin.dashboard'}}{{i18n "admin.dashboard.old_link"}}{{/link-to}} -

- +

+ {{i18n 'admin.dashboard.find_old'}} {{#link-to 'admin.dashboard'}}{{i18n "admin.dashboard.old_link"}}{{/link-to}} +

{{/conditional-loading-section}}
- {{#dashboard-inline-table - dataSourceNames="top_referred_topics" - lastRefreshedAt=lastRefreshedAt - limit=8 - as |context|}} - {{#each context.report.data as |data|}} - - - - {{data.topic_title}} - - - - {{data.num_clicks}} - - - {{/each}} - {{/dashboard-inline-table}} + {{#dashboard-table + dataSourceNames="top_referred_topics" + lastRefreshedAt=lastRefreshedAt + limit=8 + as |context|}} + {{#each context.report.data as |data|}} + + + + {{data.topic_title}} + + + + {{data.num_clicks}} + + + {{/each}} + {{/dashboard-table}}
+
diff --git a/app/assets/stylesheets/common/admin/dashboard_next.scss b/app/assets/stylesheets/common/admin/dashboard_next.scss index d534d855617..2d63c4b49be 100644 --- a/app/assets/stylesheets/common/admin/dashboard_next.scss +++ b/app/assets/stylesheets/common/admin/dashboard_next.scss @@ -370,6 +370,32 @@ } } +.dashboard-inline-table { + margin-bottom: 1em; + + .table-title { + border-bottom: 1px solid $primary-low; + margin-bottom: 1em; + padding-bottom: .5em; + } + + .table-container { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + } + + .table-cell { + margin-right: .5em; + display: flex; + + .label { + font-weight: 700; + margin-right: .5em; + } + } +} + .dashboard-table.activity-metrics { table { @media screen and (min-width: 400px) { @@ -381,7 +407,7 @@ .d-icon { color: $primary-low-mid; min-width: 14px; - text-align: center; + text-align: center; } @media screen and (max-width: 400px) { .d-icon { display: none; } diff --git a/app/models/report.rb b/app/models/report.rb index d0ebb790e93..0aa88ffa83c 100644 --- a/app/models/report.rb +++ b/app/models/report.rb @@ -341,8 +341,11 @@ class Report def self.report_users_by_trust_level(report) report.data = [] + User.real.group('trust_level').count.sort.each do |level, count| - report.data << { key: TrustLevel.levels[level.to_i], x: level.to_i, y: count } + key = TrustLevel.levels[level.to_i] + url = Proc.new { |key| "/admin/users/list/#{key}" } + report.data << { url: url.call(key), key: key, x: level.to_i, y: count } end end @@ -416,19 +419,20 @@ class Report def self.report_users_by_type(report) report.data = [] - label = Proc.new { |key| I18n.t("reports.users_by_type.xaxis_labels.#{key}") } + label = Proc.new { |x| I18n.t("reports.users_by_type.xaxis_labels.#{x}") } + url = Proc.new { |key| "/admin/users/list/#{key}" } admins = User.real.admins.count - report.data << { key: "admins", x: label.call("admin"), y: admins } if admins > 0 + report.data << { url: url.call("admins"), icon: "shield", key: "admins", x: label.call("admin"), y: admins } if admins > 0 moderators = User.real.moderators.count - report.data << { key: "moderators", x: label.call("moderator"), y: moderators } if moderators > 0 + report.data << { url: url.call("moderators"), icon: "shield", key: "moderators", x: label.call("moderator"), y: moderators } if moderators > 0 suspended = User.real.suspended.count - report.data << { key: "suspended", x: label.call("suspended"), y: suspended } if suspended > 0 + report.data << { url: url.call("suspended"), icon: "ban", key: "suspended", x: label.call("suspended"), y: suspended } if suspended > 0 silenced = User.real.silenced.count - report.data << { key: "silenced", x: label.call("silenced"), y: silenced } if silenced > 0 + report.data << { url: url.call("silenced"), icon: "ban", key: "silenced", x: label.call("silenced"), y: silenced } if silenced > 0 end def self.report_top_referred_topics(report)