diff --git a/app/assets/javascripts/discourse/components/group-form.js.es6 b/app/assets/javascripts/discourse/components/group-form.js.es6 new file mode 100644 index 00000000000..f0a9073b95e --- /dev/null +++ b/app/assets/javascripts/discourse/components/group-form.js.es6 @@ -0,0 +1,102 @@ +import computed from 'ember-addons/ember-computed-decorators'; +import User from "discourse/models/user"; +import InputValidation from 'discourse/models/input-validation'; +import debounce from 'discourse/lib/debounce'; + +export default Ember.Component.extend({ + disableSave: null, + + aliasLevelOptions: [ + { name: I18n.t("groups.alias_levels.nobody"), value: 0 }, + { name: I18n.t("groups.alias_levels.mods_and_admins"), value: 2 }, + { name: I18n.t("groups.alias_levels.members_mods_and_admins"), value: 3 }, + { name: I18n.t("groups.alias_levels.everyone"), value: 99 } + ], + + visibilityLevelOptions: [ + { name: I18n.t("groups.visibility_levels.public"), value: 0 }, + { name: I18n.t("groups.visibility_levels.members"), value: 1 }, + { name: I18n.t("groups.visibility_levels.staff"), value: 2 }, + { name: I18n.t("groups.visibility_levels.owners"), value: 3 } + ], + + @computed('model.visibility_level', 'model.public_admission') + disableMembershipRequestSetting(visibility_level, publicAdmission) { + visibility_level = parseInt(visibility_level); + return (visibility_level !== 0) || publicAdmission; + }, + + @computed('model.visibility_level', 'model.allow_membership_requests') + disablePublicSetting(visibility_level, allowMembershipRequests) { + visibility_level = parseInt(visibility_level); + return (visibility_level !== 0) || allowMembershipRequests; + }, + + @computed('basicNameValidation', 'uniqueNameValidation') + nameValidation(basicNameValidation, uniqueNameValidation) { + return uniqueNameValidation ? uniqueNameValidation : basicNameValidation; + }, + + @computed('model.name') + basicNameValidation(name) { + if (name === undefined) { + return this._failedInputValidation(); + }; + + if (name === "") { + this.set('uniqueNameValidation', null); + return this._failedInputValidation(I18n.t('groups.new.name.blank')); + } + + if (name.length < this.siteSettings.min_username_length) { + return this._failedInputValidation(I18n.t('groups.new.name.too_short')); + } + + if (name.length > this.siteSettings.max_username_length) { + return this._failedInputValidation(I18n.t('groups.new.name.too_long')); + } + + this.checkGroupName(); + + return this._failedInputValidation(I18n.t('groups.new.name.checking')); + }, + + checkGroupName: debounce(function() { + User.checkUsername(this.get('model.name')).then(response => { + const validationName = 'uniqueNameValidation'; + + if (response.available) { + this.set(validationName, InputValidation.create({ + ok: true, + reason: I18n.t('groups.new.name.available') + })); + + this.set('disableSave', false); + } else { + let reason; + + if (response.errors) { + reason = response.errors.join(' '); + } else { + reason = I18n.t('groups.new.name.not_available'); + } + + this.set(validationName, this._failedInputValidation(reason)); + } + }); + }, 500), + + _failedInputValidation(reason) { + this.set('disableSave', true); + + const options = { failed: true }; + if (reason) options.reason = reason; + return InputValidation.create(options); + }, + + actions: { + save() { + this.sendAction("save"); + }, + } +}); diff --git a/app/assets/javascripts/discourse/controllers/groups-new.js.es6 b/app/assets/javascripts/discourse/controllers/groups-new.js.es6 index 00714cd8f22..2b829a5eb82 100644 --- a/app/assets/javascripts/discourse/controllers/groups-new.js.es6 +++ b/app/assets/javascripts/discourse/controllers/groups-new.js.es6 @@ -1,94 +1,6 @@ import { popupAjaxError } from 'discourse/lib/ajax-error'; -import computed from 'ember-addons/ember-computed-decorators'; -import User from "discourse/models/user"; -import InputValidation from 'discourse/models/input-validation'; -import debounce from 'discourse/lib/debounce'; export default Ember.Controller.extend({ - disableSave: null, - - aliasLevelOptions: [ - { name: I18n.t("groups.alias_levels.nobody"), value: 0 }, - { name: I18n.t("groups.alias_levels.mods_and_admins"), value: 2 }, - { name: I18n.t("groups.alias_levels.members_mods_and_admins"), value: 3 }, - { name: I18n.t("groups.alias_levels.everyone"), value: 99 } - ], - - visibilityLevelOptions: [ - { name: I18n.t("groups.visibility_levels.public"), value: 0 }, - { name: I18n.t("groups.visibility_levels.members"), value: 1 }, - { name: I18n.t("groups.visibility_levels.staff"), value: 2 }, - { name: I18n.t("groups.visibility_levels.owners"), value: 3 } - ], - - @computed('model.visibility_level', 'model.public_admission') - disableMembershipRequestSetting(visibility_level, publicAdmission) { - visibility_level = parseInt(visibility_level); - return (visibility_level !== 0) || publicAdmission; - }, - - @computed('basicNameValidation', 'uniqueNameValidation') - nameValidation(basicNameValidation, uniqueNameValidation) { - return uniqueNameValidation ? uniqueNameValidation : basicNameValidation; - }, - - @computed('model.name') - basicNameValidation(name) { - if (name === undefined) { - return this._failedInputValidation(); - }; - - if (name === "") { - this.set('uniqueNameValidation', null); - return this._failedInputValidation(I18n.t('groups.new.name.blank')); - } - - if (name.length < this.siteSettings.min_username_length) { - return this._failedInputValidation(I18n.t('groups.new.name.too_short')); - } - - if (name.length > this.siteSettings.max_username_length) { - return this._failedInputValidation(I18n.t('groups.new.name.too_long')); - } - - this.checkGroupName(); - - return this._failedInputValidation(I18n.t('groups.new.name.checking')); - }, - - checkGroupName: debounce(function() { - User.checkUsername(this.get('model.name')).then(response => { - const validationName = 'uniqueNameValidation'; - - if (response.available) { - this.set(validationName, InputValidation.create({ - ok: true, - reason: I18n.t('groups.new.name.available') - })); - - this.set('disableSave', false); - } else { - let reason; - - if (response.errors) { - reason = response.errors.join(' '); - } else { - reason = I18n.t('groups.new.name.not_available'); - } - - this.set(validationName, this._failedInputValidation(reason)); - } - }); - }, 500), - - _failedInputValidation(reason) { - this.set('disableSave', true); - - const options = { failed: true }; - if (reason) options.reason = reason; - return InputValidation.create(options); - }, - actions: { save() { this.set('disableSave', true); diff --git a/app/assets/javascripts/discourse/templates/components/group-form.hbs b/app/assets/javascripts/discourse/templates/components/group-form.hbs new file mode 100644 index 00000000000..465ddc3538d --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/group-form.hbs @@ -0,0 +1,191 @@ +
diff --git a/app/assets/javascripts/discourse/templates/group/manage/profile.hbs b/app/assets/javascripts/discourse/templates/group/manage/profile.hbs index d90ae631b64..816ec0ec4f9 100644 --- a/app/assets/javascripts/discourse/templates/group/manage/profile.hbs +++ b/app/assets/javascripts/discourse/templates/group/manage/profile.hbs @@ -1,71 +1,3 @@ - +{{group-form model=model + save="save" + manageMembership=false}} diff --git a/app/assets/javascripts/discourse/templates/groups/new.hbs b/app/assets/javascripts/discourse/templates/groups/new.hbs index 51bca6eb78f..7a7b430c545 100644 --- a/app/assets/javascripts/discourse/templates/groups/new.hbs +++ b/app/assets/javascripts/discourse/templates/groups/new.hbs @@ -1,183 +1,5 @@ {{#d-section pageClass="groups-new"}}