FEATURE: Add Data Explorer Params to the URL for group queries (#298)

We have introduced a URL param mechanism for data explorer queries for administrators
in https://github.com/discourse/discourse-data-explorer/pull/128/
However, for data explorer queries in group page, URL params are not yet introduced.

This PR introduces this missing piece.

Related meta topic: https://meta.discourse.org/t/populate-data-explorer-params-with-url-params/169404/8
This commit is contained in:
锦心 2024-07-05 17:49:18 +08:00 committed by GitHub
parent 7d99c621a9
commit 6d975d7e90
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 33 additions and 2 deletions

View File

@ -15,14 +15,21 @@ import { bind } from "discourse-common/utils/decorators";
export default class GroupReportsShowController extends Controller { export default class GroupReportsShowController extends Controller {
@service currentUser; @service currentUser;
@service modal; @service modal;
@service router;
@tracked showResults = false; @tracked showResults = false;
@tracked loading = false; @tracked loading = false;
@tracked results = this.model.results; @tracked results = this.model.results;
@tracked queryGroupBookmark = this.queryGroup?.bookmark; @tracked queryGroupBookmark = this.queryGroup?.bookmark;
queryParams = ["params"];
explain = false; explain = false;
get parsedParams() {
return this.params ? JSON.parse(this.params) : null;
}
get hasParams() { get hasParams() {
return this.model.param_info.length > 0; return this.model.param_info.length > 0;
} }
@ -52,12 +59,18 @@ export default class GroupReportsShowController extends Controller {
this.showResults = false; this.showResults = false;
try { try {
const stringifiedParams = JSON.stringify(this.model.params);
this.router.transitionTo({
queryParams: {
params: this.model.params ? stringifiedParams : null,
},
});
const response = await ajax( const response = await ajax(
`/g/${this.get("group.name")}/reports/${this.model.id}/run`, `/g/${this.get("group.name")}/reports/${this.model.id}/run`,
{ {
type: "POST", type: "POST",
data: { data: {
params: JSON.stringify(this.model.params), params: stringifiedParams,
explain: this.explain, explain: this.explain,
}, },
} }

View File

@ -6,6 +6,7 @@
<ParamInputsWrapper <ParamInputsWrapper
@hasParams={{this.hasParams}} @hasParams={{this.hasParams}}
@params={{this.model.params}} @params={{this.model.params}}
@initialValues={{this.parsedParams}}
@paramInfo={{this.model.param_info}} @paramInfo={{this.model.param_info}}
@updateParams={{this.updateParams}} @updateParams={{this.updateParams}}
/> />

View File

@ -304,7 +304,18 @@ acceptance("Data Explorer Plugin | Param Input", function (needs) {
await fillIn(".query-params input", monthsAgoValue); await fillIn(".query-params input", monthsAgoValue);
await click("form.query-run button"); await click("form.query-run button");
const searchParams = new URLSearchParams(currentURL()); const searchParams = new URLSearchParams(currentURL().split("?")[1]);
const monthsAgoParam = JSON.parse(searchParams.get("params")).months_ago;
assert.equal(monthsAgoParam, monthsAgoValue);
});
test("it puts params for the query into the url for group reports", async function (assert) {
await visit("/g/discourse/reports/-8");
const monthsAgoValue = "2";
await fillIn(".query-params input", monthsAgoValue);
await click("form.query-run button");
const searchParams = new URLSearchParams(currentURL().split("?")[1]);
const monthsAgoParam = JSON.parse(searchParams.get("params")).months_ago; const monthsAgoParam = JSON.parse(searchParams.get("params")).months_ago;
assert.equal(monthsAgoParam, monthsAgoValue); assert.equal(monthsAgoParam, monthsAgoValue);
}); });
@ -315,6 +326,12 @@ acceptance("Data Explorer Plugin | Param Input", function (needs) {
assert.ok(exists(".query-run .btn.btn-primary")); assert.ok(exists(".query-run .btn.btn-primary"));
}); });
test("it loads the page if one of the parameter is null for group reports", async function (assert) {
await visit('/g/discourse/reports/-8?params={"months_ago":null}');
assert.ok(exists(".query-params input"));
assert.ok(exists(".query-run .btn.btn-primary"));
});
test("it applies params when running a report", async function (assert) { test("it applies params when running a report", async function (assert) {
await visit("/g/discourse/reports/-8"); await visit("/g/discourse/reports/-8");
const monthsAgoValue = "2"; const monthsAgoValue = "2";