diff --git a/assets/javascripts/discourse/controllers/group-reports-show.js b/assets/javascripts/discourse/controllers/group-reports-show.js index a69e70a..a4e4e09 100644 --- a/assets/javascripts/discourse/controllers/group-reports-show.js +++ b/assets/javascripts/discourse/controllers/group-reports-show.js @@ -68,6 +68,12 @@ export default Controller.extend({ } ); }, + + // This is necessary with glimmer's one way data stream to get the child's + // changes of 'params' to bubble up. + updateParams(identifier, value) { + this.set(`model.params.${identifier}`, value); + }, }, // actions @discourseComputed("queryGroup.bookmark") diff --git a/test/javascripts/acceptance/param-input-test.js b/test/javascripts/acceptance/param-input-test.js index 7496c04..e1a8c6b 100644 --- a/test/javascripts/acceptance/param-input-test.js +++ b/test/javascripts/acceptance/param-input-test.js @@ -1,4 +1,8 @@ -import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; +import { + acceptance, + exists, + query, +} from "discourse/tests/helpers/qunit-helpers"; import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; import { test } from "qunit"; @@ -45,6 +49,10 @@ acceptance("Data Explorer Plugin | Param Input", function (needs) { id: 14, name: "trust_level_4", }, + { + id: 41, + name: "discourse", + }, ]); }); @@ -201,6 +209,32 @@ acceptance("Data Explorer Plugin | Param Input", function (needs) { }); }); + server.get("/g/discourse/reports/-8", () => { + return helper.response({ + query: { + id: -8, + sql: "-- [params]\n-- int :months_ago = 1\n\nWITH query_period AS (\n SELECT\n date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' as period_start,\n date_trunc('month', CURRENT_DATE) - INTERVAL ':months_ago months' + INTERVAL '1 month' - INTERVAL '1 second' as period_end\n )\n\n SELECT\n ua.user_id,\n count(1) AS like_count\n FROM user_actions ua\n INNER JOIN query_period qp\n ON ua.created_at >= qp.period_start\n AND ua.created_at <= qp.period_end\n WHERE ua.action_type = 1\n GROUP BY ua.user_id\n ORDER BY like_count DESC\n LIMIT 100\n", + name: "Top 100 Likers Report", + description: + "returns the top 100 likers for a given monthly period ordered by like_count. It accepts a ‘months_ago’ parameter, defaults to 1 to give results for the last calendar month.", + param_info: [ + { + identifier: "months_ago", + type: "int", + default: "1", + nullable: false, + }, + ], + created_at: "2021-02-02T12:21:11.449Z", + username: "system", + group_ids: [41], + last_run_at: "2021-02-11T08:29:59.337Z", + hidden: false, + user_id: -1, + }, + }); + }); + server.post("/admin/plugins/explorer/queries/-7/run", () => { return helper.response({ success: true, @@ -226,6 +260,42 @@ acceptance("Data Explorer Plugin | Param Input", function (needs) { rows: [], }); }); + + server.post("/g/discourse/reports/-8/run", () => { + return helper.response({ + success: true, + errors: [], + duration: 27.5, + result_count: 2, + params: { months_ago: "1" }, + columns: ["user_id", "like_count"], + default_limit: 1000, + relations: { + user: [ + { + id: -2, + username: "discobot", + name: null, + avatar_template: "/user_avatar/localhost/discobot/{size}/2_2.png", + }, + { + id: 2, + username: "andrey1", + name: null, + avatar_template: + "/letter_avatar_proxy/v4/letter/a/c0e974/{size}.png", + }, + ], + }, + colrender: { + 0: "user", + }, + rows: [ + [-2, 2], + [2, 2], + ], + }); + }); }); test("it puts params for the query into the url", async function (assert) { @@ -244,4 +314,12 @@ acceptance("Data Explorer Plugin | Param Input", function (needs) { assert.ok(exists(".query-params .user-chooser")); assert.ok(exists(".query-run .btn.btn-primary")); }); + + test("it applies params when running a report", async function (assert) { + await visit("/g/discourse/reports/-8"); + const monthsAgoValue = "2"; + await fillIn(".query-params input", monthsAgoValue); + await click("form.query-run button"); + assert.equal(query(".query-params input").value, monthsAgoValue); + }); });