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}}
{{#each reportsForPeriod as |report|}}
-
-
-
- {{#if report.labels}}
- {{#each report.labels as |label|}}
- {{label}} |
- {{/each}}
- {{else}}
- {{#each report.data as |data|}}
- {{data.x}} |
- {{/each}}
- {{/if}}
-
-
-
- {{#unless hasBlock}}
- {{#each report.data as |data|}}
-
- {{number data.y}} |
-
- {{/each}}
- {{else}}
- {{yield (hash report=report)}}
- {{/unless}}
-
-
+ {{#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|}}
+ {{label}} |
+ {{/each}}
+ {{else}}
+ {{#each report.data as |data|}}
+ {{data.x}} |
+ {{/each}}
+ {{/if}}
+
+
+
+ {{#unless hasBlock}}
+ {{#each report.data as |data|}}
+
+ {{number data.y}} |
+
+ {{/each}}
+ {{else}}
+ {{yield (hash report=report)}}
+ {{/unless}}
+
+
+
+ {{/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}}
- {{#dashboard-inline-table
- limit=8
- dataSourceNames="trending_search"
- isEnabled=logSearchQueriesEnabled
- disabledLabel="admin.dashboard.reports.trending_search.disabled"
- startDate=lastWeek
- endDate=endDate as |context|}}
- {{#each context.report.data as |data|}}
-
-
- {{data.term}}
- |
-
- {{number data.unique_searches}}
- |
-
- {{data.ctr}}
- |
-
- {{/each}}
- {{/dashboard-inline-table}}
+ {{#dashboard-table
+ limit=8
+ dataSourceNames="trending_search"
+ isEnabled=logSearchQueriesEnabled
+ disabledLabel="admin.dashboard.reports.trending_search.disabled"
+ startDate=lastWeek
+ endDate=endDate as |context|}}
+ {{#each context.report.data as |data|}}
+
+
+ {{data.term}}
+ |
+
+ {{number data.unique_searches}}
+ |
+
+ {{data.ctr}}
+ |
+
+ {{/each}}
+ {{/dashboard-table}}
{{{i18n "admin.dashboard.reports.trending_search.more"}}}
-
+
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)