FEATURE: Bookmarkable QueryGroups. (#177)

Adds the ability for non-Admin users to bookmark Queries from inside Group > Reports > Query view.
This commit is contained in:
Frank
2022-06-14 23:07:02 +08:00
committed by GitHub
parent 92bdea38b2
commit 45b6e7eb4f
12 changed files with 368 additions and 3 deletions
@@ -1,5 +1,11 @@
import { popupAjaxError } from "discourse/lib/ajax-error";
import { ajax } from "discourse/lib/ajax";
import Bookmark, {
NO_REMINDER_ICON,
WITH_REMINDER_ICON,
} from "discourse/models/bookmark";
import { openBookmarkModal } from "discourse/controllers/bookmark";
import discourseComputed from "discourse-common/utils/decorators";
export default Ember.Controller.extend({
showResults: false,
@@ -35,5 +41,50 @@ export default Ember.Controller.extend({
})
.finally(() => this.set("loading", false));
},
toggleBookmark() {
return openBookmarkModal(
this.queryGroup.bookmark ||
Bookmark.create({
bookmarkable_type: "DataExplorer::QueryGroup",
bookmarkable_id: this.queryGroup.id,
user_id: this.currentUser.id,
}),
{
onAfterSave: (savedData) => {
const bookmark = Bookmark.create(savedData);
this.set("queryGroup.bookmark", bookmark);
this.appEvents.trigger(
"bookmarks:changed",
savedData,
bookmark.attachedTo()
);
},
onAfterDelete: () => {
this.set("queryGroup.bookmark", null);
},
}
);
},
}, // 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
? ["bookmark", "bookmarked", "query-group-bookmark"].join(" ")
: ["bookmark", "query-group-bookmark"].join(" ");
},
});
@@ -9,15 +9,20 @@ export default DiscourseRoute.extend({
const group = this.modelFor("group");
return ajax(`/g/${group.name}/reports/${params.query_id}`)
.then((response) => {
const queryParamInfo = response.query.param_info;
let query = response.query;
let queryGroup = response.query_group;
const queryParamInfo = query.param_info;
const queryParams = queryParamInfo.reduce((acc, param) => {
acc[param.identifier] = param.default;
return acc;
}, {});
return {
model: Object.assign({ params: queryParams }, response.query),
model: Object.assign({ params: queryParams }, query),
group,
queryGroup,
};
})
.catch(() => {
@@ -10,6 +10,14 @@
</div>
{{/if}}
{{d-button action=(action "run") icon="play" label="explorer.run" class="btn-primary" type="submit"}}
{{d-button
action=(action "toggleBookmark")
label=bookmarkLabel
icon=bookmarkIcon
class=bookmarkClassName
}}
</form>
{{conditional-loading-spinner condition=loading}}
{{#if results}}