From 099bf97dca4e5e7f50961618fe35ac0c96699ffc Mon Sep 17 00:00:00 2001 From: jbrw Date: Wed, 14 Oct 2020 13:15:54 -0400 Subject: [PATCH] Tag groups can belong to groups (#10854) --- .../app/components/tag-groups-form.js | 113 ++++++++++++++--- .../templates/components/tag-groups-form.hbs | 27 ++++- .../tests/acceptance/tag-groups-test.js | 36 ++++++ .../stylesheets/common/base/tagging.scss | 4 + app/controllers/tag_groups_controller.rb | 8 +- config/locales/client.en.yml | 4 +- config/locales/server.en.yml | 4 +- lib/discourse_tagging.rb | 114 ++++++++++++++---- spec/components/discourse_tagging_spec.rb | 63 +++++++++- spec/components/post_revisor_spec.rb | 6 +- spec/components/search_spec.rb | 2 +- spec/components/topic_creator_spec.rb | 2 +- spec/models/tag_user_spec.rb | 2 +- spec/support/helpers.rb | 16 ++- 14 files changed, 330 insertions(+), 71 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/tag-groups-form.js b/app/assets/javascripts/discourse/app/components/tag-groups-form.js index c475a6c87d8..de2d7621009 100644 --- a/app/assets/javascripts/discourse/app/components/tag-groups-form.js +++ b/app/assets/javascripts/discourse/app/components/tag-groups-form.js @@ -4,32 +4,109 @@ import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; import { bufferedProperty } from "discourse/mixins/buffered-content"; import PermissionType from "discourse/models/permission-type"; +import Group from "discourse/models/group"; import bootbox from "bootbox"; export default Component.extend(bufferedProperty("model"), { tagName: "", + allGroups: null, - @discourseComputed("buffered.isSaving", "buffered.name", "buffered.tag_names") - savingDisabled(isSaving, name, tagNames) { - return isSaving || isEmpty(name) || isEmpty(tagNames); + init() { + this._super(...arguments); + this.setGroupOptions(); + }, + + setGroupOptions() { + Group.findAll().then((groups) => { + this.set("allGroups", groups); + }); + }, + + @discourseComputed( + "buffered.isSaving", + "buffered.name", + "buffered.tag_names", + "buffered.permissions" + ) + savingDisabled(isSaving, name, tagNames, permissions) { + return ( + isSaving || + isEmpty(name) || + isEmpty(tagNames) || + (!this.everyoneSelected(permissions) && + isEmpty(this.selectedGroupNames(permissions))) + ); + }, + + @discourseComputed("buffered.permissions") + showPrivateChooser(permissions) { + if (!permissions) { + return true; + } + + return permissions.everyone !== PermissionType.READONLY; + }, + + @discourseComputed("buffered.permissions", "allGroups") + selectedGroupIds(permissions, allGroups) { + if (!permissions || !allGroups) { + return []; + } + + const selectedGroupNames = Object.keys(permissions); + let groupIds = []; + allGroups.forEach((group) => { + if (selectedGroupNames.includes(group.name)) { + groupIds.push(group.id); + } + }); + + return groupIds; + }, + + everyoneSelected(permissions) { + if (!permissions) { + return true; + } + + return permissions.everyone === PermissionType.FULL; + }, + + selectedGroupNames(permissions) { + if (!permissions) { + return []; + } + + return Object.keys(permissions).filter((name) => name !== "everyone"); }, actions: { - setPermissions(permissionName) { + setPermissionsType(permissionName) { + let updatedPermissions = Object.assign( + {}, + this.buffered.get("permissions") + ); + if (permissionName === "private") { - this.buffered.set("permissions", { - staff: PermissionType.FULL, - }); + delete updatedPermissions.everyone; } else if (permissionName === "visible") { - this.buffered.set("permissions", { - staff: PermissionType.FULL, - everyone: PermissionType.READONLY, - }); + updatedPermissions.everyone = PermissionType.READONLY; } else { - this.buffered.set("permissions", { - everyone: PermissionType.FULL, - }); + updatedPermissions.everyone = PermissionType.FULL; } + + this.buffered.set("permissions", updatedPermissions); + }, + + setPermissionsGroups(groupIds) { + let permissions = {}; + this.allGroups.forEach((group) => { + if (groupIds.includes(group.id)) { + permissions[group.name] = PermissionType.FULL; + } + }); + + this.buffered.set("permissions", permissions); }, save() { @@ -41,6 +118,14 @@ export default Component.extend(bufferedProperty("model"), { "permissions" ); + // If 'everyone' is set to full, we can remove any groups. + if ( + !attrs.permissions || + attrs.permissions.everyone === PermissionType.FULL + ) { + attrs.permissions = { everyone: PermissionType.FULL }; + } + this.model.save(attrs).then(() => { this.commitBuffer(); diff --git a/app/assets/javascripts/discourse/app/templates/components/tag-groups-form.hbs b/app/assets/javascripts/discourse/app/templates/components/tag-groups-form.hbs index 0fdf7ec3c44..38a950ba196 100644 --- a/app/assets/javascripts/discourse/app/templates/components/tag-groups-form.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/tag-groups-form.hbs @@ -38,7 +38,7 @@ value="public" id="public-permission" selection=buffered.permissionName - onChange=(action "setPermissions")}} + onChange=(action "setPermissionsType")}}