FEATURE: Add query params to staff action logs (#10279)

FEATURE: Add query params to staff action logs (#10279)

diff --git a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js
index 059267c..3568aaf 100644
--- a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js
+++ b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js
@@ -1,16 +1,16 @@
-import I18n from "I18n";
-import { gt } from "@ember/object/computed";
+import Controller from "@ember/controller";
 import EmberObject from "@ember/object";
 import { scheduleOnce } from "@ember/runloop";
-import Controller from "@ember/controller";
+import discourseComputed from "discourse-common/utils/decorators";
 import { exportEntity } from "discourse/lib/export-csv";
 import { outputExportResult } from "discourse/lib/export-result";
-import discourseComputed from "discourse-common/utils/decorators";
+import I18n from "I18n";
 
 export default Controller.extend({
+  queryParams: ["filters"],
+
   model: null,
   filters: null,
-  filtersExists: gt("filterCount", 0),
   userHistoryActions: null,
 
   @discourseComputed("filters.action_name")
@@ -18,36 +18,13 @@ export default Controller.extend({
     return name ? I18n.t("admin.logs.staff_actions.actions." + name) : null;
   },
 
-  resetFilters() {
-    this.setProperties({
-      model: EmberObject.create({ loadingMore: true }),
-      filters: EmberObject.create()
-    });
-    this.scheduleRefresh();
-  },
-
-  _changeFilters(props) {
-    this.set("model", EmberObject.create({ loadingMore: true }));
-    this.filters.setProperties(props);
-    this.scheduleRefresh();
+  @discourseComputed("filters")
+  filtersExists(filters) {
+    return filters && Object.keys(filters).length > 0;
   },
 
   _refresh() {
-    let filters = this.filters;
-    let params = {};
-    let count = 0;
-
-    // Don't send null values
-    Object.keys(filters).forEach(k => {
-      let val = filters.get(k);
-      if (val) {
-        params[k] = val;
-        count += 1;
-      }
-    });
-    this.set("filterCount", count);
-
-    this.store.findAll("staff-action-log", params).then(result => {
+    this.store.findAll("staff-action-log", this.filters).then(result => {
       this.set("model", result);
 
       if (!this.userHistoryActions) {
@@ -70,10 +47,38 @@ export default Controller.extend({
     scheduleOnce("afterRender", this, this._refresh);
   },
 
+  resetFilters() {
+    this.setProperties({
+      model: EmberObject.create({ loadingMore: true }),
+      filters: EmberObject.create()
+    });
+    this.scheduleRefresh();
+  },
+
+  changeFilters(props) {
+    this.set("model", EmberObject.create({ loadingMore: true }));
+
+    if (!this.filters) {
+      this.set("filters", EmberObject.create());
+    }
+
+    Object.keys(props).forEach(key => {
+      if (props[key] === undefined || props[key] === null) {
+        this.filters.set(key, undefined);
+        delete this.filters[key];
+      } else {
+        this.filters.set(key, props[key]);
+      }
+    });
+
+    this.send("onFiltersChange", this.filters);
+    this.scheduleRefresh();
+  },
+
   actions: {
     filterActionIdChanged(filterActionId) {
       if (filterActionId) {
-        this._changeFilters({
+        this.changeFilters({
           action_name: filterActionId,
           action_id: this.userHistoryActions.findBy("id", filterActionId)
             .action_id
@@ -82,18 +87,16 @@ export default Controller.extend({
     },
 
     clearFilter(key) {
-      let changed = {};
-
-      // Special case, clear all action related stuff
       if (key === "actionFilter") {
-        changed.action_name = null;
-        changed.action_id = null;
-        changed.custom_type = null;
         this.set("filterActionId", null);
+        this.changeFilters({
+          action_name: null,
+          action_id: null,
+          custom_type: null
+        });
       } else {
-        changed[key] = null;
+        this.changeFilters({ [key]: null });
       }
-      this._changeFilters(changed);
     },
 
     clearAllFilters() {
@@ -102,7 +105,7 @@ export default Controller.extend({
     },
 
     filterByAction(logItem) {
-      this._changeFilters({
+      this.changeFilters({
         action_name: logItem.get("action_name"),
         action_id: logItem.get("action"),
         custom_type: logItem.get("custom_type")
@@ -110,15 +113,15 @@ export default Controller.extend({
     },
 
     filterByStaffUser(acting_user) {
-      this._changeFilters({ acting_user: acting_user.username });
+      this.changeFilters({ acting_user: acting_user.username });
     },
 
     filterByTargetUser(target_user) {
-      this._changeFilters({ target_user: target_user.username });
+      this.changeFilters({ target_user: target_user.username });
     },
 
     filterBySubject(subject) {
-      this._changeFilters({ subject: subject });
+      this.changeFilters({ subject: subject });
     },
 
     exportStaffActionLogs() {
diff --git a/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js b/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js
index b007eca..0c91a9a 100644
--- a/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js
+++ b/app/assets/javascripts/admin/routes/admin-logs-staff-action-logs.js
@@ -1,19 +1,46 @@
 import DiscourseRoute from "discourse/routes/discourse";
 import showModal from "discourse/lib/show-modal";
+import EmberObject from "@ember/object";
 
 export default DiscourseRoute.extend({
+  queryParams: {
+    filters: { refreshModel: true }
+  },
+
+  deserializeQueryParam(value, urlKey, defaultValueType) {
+    if (urlKey === "filters") {
+      return EmberObject.create(JSON.parse(decodeURIComponent(value)));
+    }
+
+    return this._super(value, urlKey, defaultValueType);
+  },
+
+  serializeQueryParam(value, urlKey, defaultValueType) {
+    if (urlKey === "filters") {
+      if (value && Object.keys(value).length > 0) {
+        return JSON.stringify(value);
+      } else {
+        return null;
+      }
+    }
+
+    return this._super(value, urlKey, defaultValueType);
+  },
+
+  activate() {
+    const controller = this.controllerFor("admin-logs-staff-action-logs");
+    if (controller.filters === null) {
+      controller.resetFilters();
+    }
+  },
+
   // TODO: make this automatic using an `{{outlet}}`
-  renderTemplate: function() {
+  renderTemplate() {
     this.render("admin/templates/logs/staff-action-logs", {
       into: "adminLogs"
     });
   },
 
-  activate() {
-    let controller = this.controllerFor("admin-logs-staff-action-logs");
-    if (controller.filters === null) controller.resetFilters();
-  },
-
   actions: {
     showDetailsModal(model) {
       showModal("admin-staff-action-log-details", { model, admin: true });
@@ -24,6 +51,16 @@ export default DiscourseRoute.extend({
       let modal = showModal("admin-theme-change", { model, admin: true });
       this.controllerFor("modal").set("modalClass", "history-modal");
       modal.loadDiff();
+    },
+
+    onFiltersChange(filters) {
+      if (filters && Object.keys(filters) === 0) {
+        this.transitionTo("adminLogs.staffActionLogs");
+      } else {
+        this.transitionTo("adminLogs.staffActionLogs", {
+          queryParams: { filters }
+        });
+      }
     }
   }
 });

GitHub sha: 1fc58b5a

1 Like

This commit appears in #10279 which was approved by eviltrout. It was merged by nbianca.