DEV: Upgrade group-reports to Octane (#218)

This commit is contained in:
Isaac Janzen 2023-02-06 11:20:03 -06:00 committed by GitHub
parent d6b94706a0
commit 332ae394e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 142 additions and 129 deletions

View File

@ -1,6 +1,3 @@
import Controller from "@ember/controller"; import Controller from "@ember/controller";
import { alias } from "@ember/object/computed";
export default Controller.extend({ export default class GroupReportsIndexController extends Controller {}
queries: alias("model.queries"),
});

View File

@ -1,61 +1,95 @@
import Controller from "@ember/controller"; import Controller from "@ember/controller";
import { popupAjaxError } from "discourse/lib/ajax-error"; import { popupAjaxError } from "discourse/lib/ajax-error";
import { ajax } from "discourse/lib/ajax"; import { ajax } from "discourse/lib/ajax";
import Bookmark, { import {
NO_REMINDER_ICON, NO_REMINDER_ICON,
WITH_REMINDER_ICON, WITH_REMINDER_ICON,
} from "discourse/models/bookmark"; } from "discourse/models/bookmark";
import { openBookmarkModal } from "discourse/controllers/bookmark"; import { openBookmarkModal } from "discourse/controllers/bookmark";
import discourseComputed from "discourse-common/utils/decorators"; import { action } from "@ember/object";
import { alias, gt } from "@ember/object/computed"; import { bind } from "discourse-common/utils/decorators";
import { tracked } from "@glimmer/tracking";
import { inject as service } from "@ember/service";
export default Controller.extend({ export default class GroupReportsShowController extends Controller {
showResults: false, @service currentUser;
explain: false,
loading: false,
results: alias("model.results"),
hasParams: gt("model.param_info.length", 0),
actions: { @tracked showResults = false;
run() { @tracked loading = false;
this.setProperties({ loading: true, showResults: false }); @tracked results = this.model.results;
ajax(`/g/${this.get("group.name")}/reports/${this.model.id}/run`, { @tracked queryGroupBookmark = this.queryGroup?.bookmark;
explain = false;
get hasParams() {
return this.model.param_info.length > 0;
}
get bookmarkLabel() {
return this.queryGroupBookmark
? "bookmarked.edit_bookmark"
: "bookmarked.title";
}
get bookmarkIcon() {
if (this.queryGroupBookmark && this.queryGroupBookmark.reminder_at) {
return WITH_REMINDER_ICON;
}
return NO_REMINDER_ICON;
}
get bookmarkClassName() {
return this.queryGroupBookmark
? ["query-group-bookmark", "bookmarked"].join(" ")
: "query-group-bookmark";
}
@bind
async run() {
this.loading = true;
this.showResults = false;
try {
const response = await ajax(
`/g/${this.get("group.name")}/reports/${this.model.id}/run`,
{
type: "POST", type: "POST",
data: { data: {
params: JSON.stringify(this.model.params), params: JSON.stringify(this.model.params),
explain: this.explain, explain: this.explain,
}, },
}) }
.then((result) => { );
this.set("results", result);
if (!result.success) { this.results = response;
if (!response.success) {
return; return;
} }
this.showResults = true;
this.set("showResults", true); } catch (error) {
}) if (error.jqXHR?.status === 422 && error.jqXHR.responseJSON) {
.catch((err) => { this.results = error.jqXHR.responseJSON;
if (err.jqXHR && err.jqXHR.status === 422 && err.jqXHR.responseJSON) {
this.set("results", err.jqXHR.responseJSON);
} else { } else {
popupAjaxError(err); popupAjaxError(error);
}
} finally {
this.loading = false;
}
} }
})
.finally(() => this.set("loading", false));
},
@action
toggleBookmark() { toggleBookmark() {
return openBookmarkModal( return openBookmarkModal(
this.queryGroup.bookmark || this.queryGroupBookmark ||
Bookmark.create({ this.store.createRecord("bookmark", {
bookmarkable_type: "DataExplorer::QueryGroup", bookmarkable_type: "DataExplorer::QueryGroup",
bookmarkable_id: this.queryGroup.id, bookmarkable_id: this.queryGroup.id,
user_id: this.currentUser.id, user_id: this.currentUser.id,
}), }),
{ {
onAfterSave: (savedData) => { onAfterSave: (savedData) => {
const bookmark = Bookmark.create(savedData); const bookmark = this.store.createRecord("bookmark", savedData);
this.set("queryGroup.bookmark", bookmark); this.queryGroupBookmark = bookmark;
this.appEvents.trigger( this.appEvents.trigger(
"bookmarks:changed", "bookmarks:changed",
savedData, savedData,
@ -63,36 +97,16 @@ export default Controller.extend({
); );
}, },
onAfterDelete: () => { onAfterDelete: () => {
this.set("queryGroup.bookmark", null); this.queryGroupBookmark = null;
}, },
} }
); );
}, }
// This is necessary with glimmer's one way data stream to get the child's // This is necessary with glimmer's one way data stream to get the child's
// changes of 'params' to bubble up. // changes of 'params' to bubble up.
@action
updateParams(identifier, value) { updateParams(identifier, value) {
this.set(`model.params.${identifier}`, value); this.set(`model.params.${identifier}`, value);
},
}, // actions
@discourseComputed("queryGroup.bookmark")
bookmarkLabel(bookmark) {
return bookmark ? "bookmarked.edit_bookmark" : "bookmarked.title";
},
@discourseComputed("queryGroup.bookmark")
bookmarkIcon(bookmark) {
if (bookmark && bookmark.reminder_at) {
return WITH_REMINDER_ICON;
} }
return NO_REMINDER_ICON; }
},
@discourseComputed("queryGroup.bookmark")
bookmarkClassName(bookmark) {
return bookmark
? ["query-group-bookmark", "bookmarked"].join(" ")
: "query-group-bookmark";
},
});

View File

@ -2,9 +2,7 @@ import { ajax } from "discourse/lib/ajax";
import DiscourseRoute from "discourse/routes/discourse"; import DiscourseRoute from "discourse/routes/discourse";
import { action } from "@ember/object"; import { action } from "@ember/object";
export default DiscourseRoute.extend({ export default class GroupReportsIndexRoute extends DiscourseRoute {
controllerName: "group-reports-index",
model() { model() {
const group = this.modelFor("group"); const group = this.modelFor("group");
return ajax(`/g/${group.name}/reports`) return ajax(`/g/${group.name}/reports`)
@ -15,7 +13,7 @@ export default DiscourseRoute.extend({
}; };
}) })
.catch(() => this.transitionTo("group.members", group)); .catch(() => this.transitionTo("group.members", group));
}, }
afterModel(model) { afterModel(model) {
if ( if (
@ -24,15 +22,15 @@ export default DiscourseRoute.extend({
) { ) {
this.transitionTo("group.members", model.group); this.transitionTo("group.members", model.group);
} }
}, }
setupController(controller, model) { setupController(controller, model) {
controller.setProperties(model); controller.setProperties(model);
}, }
@action @action
refreshModel() { refreshModel() {
this.refresh(); this.refresh();
return false; return false;
}, }
}); }

View File

@ -2,18 +2,15 @@ import { ajax } from "discourse/lib/ajax";
import DiscourseRoute from "discourse/routes/discourse"; import DiscourseRoute from "discourse/routes/discourse";
import { action } from "@ember/object"; import { action } from "@ember/object";
export default DiscourseRoute.extend({ export default class GroupReportsShowRoute extends DiscourseRoute {
controllerName: "group-reports-show",
model(params) { model(params) {
const group = this.modelFor("group"); const group = this.modelFor("group");
return ajax(`/g/${group.name}/reports/${params.query_id}`) return ajax(`/g/${group.name}/reports/${params.query_id}`)
.then((response) => { .then((response) => {
let query = response.query; const query = response.query;
let queryGroup = response.query_group; const queryGroup = response.query_group;
const queryParamInfo = query.param_info; const queryParamInfo = query.param_info;
const queryParams = queryParamInfo.reduce((acc, param) => { const queryParams = queryParamInfo.reduce((acc, param) => {
acc[param.identifier] = param.default; acc[param.identifier] = param.default;
return acc; return acc;
@ -28,15 +25,15 @@ export default DiscourseRoute.extend({
.catch(() => { .catch(() => {
this.transitionTo("group.members", group); this.transitionTo("group.members", group);
}); });
}, }
setupController(controller, model) { setupController(controller, model) {
controller.setProperties(model); controller.setProperties(model);
}, }
@action @action
refreshModel() { refreshModel() {
this.refresh(); this.refresh();
return false; return false;
}, }
}); }

View File

@ -12,12 +12,15 @@
</th> </th>
</thead> </thead>
<tbody> <tbody>
{{#each queries as |query|}} {{#each this.model.queries as |query|}}
<tr> <tr>
<td> <td>
{{#link-to "group.reports.show" group.name query.id}} <LinkTo
@route={{"group.reports.show"}}
@models={{array group.name query.id}}
>
{{query.name}} {{query.name}}
{{/link-to}} </LinkTo>
</td> </td>
<td>{{query.description}}</td> <td>{{query.description}}</td>
<td> <td>

View File

@ -1,39 +1,43 @@
<section class="user-content"> <section class="user-content">
<h1>{{model.name}}</h1> <h1>{{this.model.name}}</h1>
<p>{{model.description}}</p> <p>{{this.model.description}}</p>
<form class="query-run" {{action "run" on="submit"}}> <form class="query-run" {{on "submit" this.run}}>
<ParamInputsWrapper <ParamInputsWrapper
@hasParams={{hasParams}} @hasParams={{this.hasParams}}
@params={{model.params}} @params={{this.model.params}}
@paramInfo={{model.param_info}} @paramInfo={{this.model.param_info}}
@updateParams={{action "updateParams"}} @updateParams={{this.updateParams}}
/> />
{{d-button <DButton
action=(action "run") @action={{this.run}}
icon="play" @icon="play"
label="explorer.run" @label="explorer.run"
class="btn-primary" @class="btn-primary"
type="submit" @type="submit"
}} />
{{d-button <DButton
action=(action "toggleBookmark") @action={{this.toggleBookmark}}
label=bookmarkLabel @label={{this.bookmarkLabel}}
icon=bookmarkIcon @icon={{this.bookmarkIcon}}
class=bookmarkClassName @class={{this.bookmarkClassName}}
}} />
</form> </form>
{{conditional-loading-spinner condition=loading}} <ConditionalLoadingSpinner @condition={{this.loading}} />
{{#if results}} {{#if this.results}}
<div class="query-results"> <div class="query-results">
{{#if showResults}} {{#if this.showResults}}
<QueryResult @query={{model}} @content={{results}} @group={{group}} /> <QueryResult
@query={{this.model}}
@content={{this.results}}
@group={{this.group}}
/>
{{else}} {{else}}
{{#each results.errors as |err|}} {{#each this.results.errors as |err|}}
<pre class="query-error"><code>{{~err}}</code></pre> <pre class="query-error"><code>{{~err}}</code></pre>
{{/each}} {{/each}}
{{/if}} {{/if}}