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 @@ +
+ {{#if this.currentUser.admin}} +
+ + + {{text-field name="name" + class="input-xxlarge group-form-name" + value=model.name + placeholderKey="groups.name_placeholder"}} + + {{input-tip validation=nameValidation}} +
+ {{/if}} + +
+ + + {{text-field name='full_name' + class="input-xxlarge group-form-full-name" + value=model.full_name}} +
+ + {{#if this.currentUser.admin}} +
+ + + {{input value=model.title name="title" class="input-xxlarge"}} +
+ {{/if}} + +
+ + {{d-editor value=model.bio_raw class="group-form-bio"}} +
+ + {{#if manageMembership}} +
+ + + {{user-selector usernames=model.ownerUsernames + placeholderKey="groups.selector_placeholder" + id="owner-selector"}} +
+ +
+ + + {{user-selector usernames=model.usernames + placeholderKey="groups.selector_placeholder" + id="member-selector"}} +
+ +
+ + + {{combo-box name="alias" + valueAttribute="value" + value=model.visibility_level + content=visibilityLevelOptions + castInteger=true}} +
+ {{/if}} + +
+ {{#if currentUser.admin}} + + {{/if}} + + + + + + + + {{#if model.allow_membership_requests}} +
+ + + {{expanding-text-area name="membership-request-template" + class='group-form-membership-request-template' + value=model.membership_request_template}} +
+ {{/if}} +
+ + {{#if currentUser.admin}} +
+ + + {{combo-box name="alias" + valueAttribute="value" + value=model.mentionable_level + content=aliasLevelOptions}} +
+ +
+ + + {{combo-box name="alias" + valueAttribute="value" + value=model.messageable_level + content=aliasLevelOptions}} +
+ +
+ + + {{notifications-button i18nPrefix='groups.notifications' + value=model.default_notification_level}} +
+ +
+ + + {{list-setting name="automatic_membership" settingValue=model.emailDomains}} + + +
+ +
+ + + {{combo-box name="grant_trust_level" + valueAttribute="value" + value=model.grant_trust_level + content=trustLevelOptions}} +
+ + {{#if siteSettings.email_in}} +
+ + + {{text-field name="incoming_email" + class="input-xxlarge" + value=model.incoming_email + placeholderKey="admin.groups.incoming_email_placeholder"}} + + {{plugin-outlet name="group-email-in" args=(hash model=model)}} +
+ {{/if}} + {{/if}} + +
+ {{group-flair-inputs model=model}} +
+ + {{plugin-outlet name="group-edit" args=(hash group=model)}} + +
+ {{d-button action="save" + disabled=disableSave + class='btn btn-primary' + label='groups.new.create'}} + + {{#link-to "groups"}} + {{i18n 'cancel'}} + {{/link-to}} +
+
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 @@ -
- {{#if this.currentUser.admin}} -
- - {{input type='text' name='name' value=model.name class='group-manage-name'}} -
- {{/if}} - -
- - {{input type='text' name='full_name' value=model.full_name class='group-manage-full-name'}} -
- -
- - {{d-editor value=model.bio_raw class="group-manage-bio"}} -
- -
- {{group-flair-inputs model=model}} -
- -
- -
- -
- -
- -
- -
- - {{#if model.allow_membership_requests}} -
- - - {{expanding-text-area name="membership-request-template" - value=model.membership_request_template - class="group-manage-membership-request-template"}} -
- {{/if}} - - {{plugin-outlet name="group-manage" args=(hash group=model)}} - - {{d-button action="save" class="btn-primary" disabled=saving label="save"}} - {{savingText}} -
+{{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"}}

{{i18n "groups.new.title"}}

-
-
- - - {{text-field name="name" - class="input-xxlarge" - value=model.name - placeholderKey="groups.name_placeholder"}} - - {{input-tip validation=nameValidation}} -
- -
- - - {{text-field name='full_name' - class="input-xxlarge group-manage-full-name" - value=model.full_name}} -
- -
- - - {{input value=model.title name="title" class="input-xxlarge"}} -
- -
- - {{d-editor value=model.bio_raw}} -
- -
- - - {{user-selector usernames=model.ownerUsernames - placeholderKey="groups.selector_placeholder" - id="owner-selector"}} -
- -
- - - {{user-selector usernames=model.usernames - placeholderKey="groups.selector_placeholder" - id="member-selector"}} -
- -
- - - {{combo-box name="alias" - valueAttribute="value" - value=model.visibility_level - content=visibilityLevelOptions - castInteger=true}} -
- -
- - - - - - - - - {{#if model.allow_membership_requests}} -
- - - {{expanding-text-area name="membership-request-template" - value=model.membership_request_template}} -
- {{/if}} -
- -
- - - {{combo-box name="alias" - valueAttribute="value" - value=model.mentionable_level - content=aliasLevelOptions}} -
- -
- - - {{combo-box name="alias" - valueAttribute="value" - value=model.messageable_level - content=aliasLevelOptions}} -
- -
- - - {{notifications-button i18nPrefix='groups.notifications' - value=model.default_notification_level}} -
- -
- - - {{list-setting name="automatic_membership" settingValue=model.emailDomains}} - - -
- -
- - - {{combo-box name="grant_trust_level" - valueAttribute="value" - value=model.grant_trust_level - content=trustLevelOptions}} -
- - {{#if siteSettings.email_in}} -
- - - {{text-field name="incoming_email" - class="input-xxlarge" - value=model.incoming_email - placeholderKey="admin.groups.incoming_email_placeholder"}} - - {{plugin-outlet name="group-email-in" args=(hash model=model)}} -
- {{/if}} - -
- {{group-flair-inputs model=model}} -
- - {{plugin-outlet name="group-edit" args=(hash group=model)}} - -
- {{d-button action="save" - disabled=disableSave - class='btn btn-primary' - label='groups.new.create'}} - - {{#link-to "groups"}} - {{i18n 'cancel'}} - {{/link-to}} -
-
+ {{group-form model=model save="save"}} {{/d-section}} diff --git a/test/javascripts/acceptance/group-manage-profile-test.js.es6 b/test/javascripts/acceptance/group-manage-profile-test.js.es6 index fd801b4aed7..849272937d2 100644 --- a/test/javascripts/acceptance/group-manage-profile-test.js.es6 +++ b/test/javascripts/acceptance/group-manage-profile-test.js.es6 @@ -10,44 +10,47 @@ QUnit.test("Editing group", assert => { andThen(() => { assert.ok(find('.group-flair-inputs').length === 1, 'it should display avatar flair inputs'); - assert.ok(find('.group-manage-bio').length === 1, 'it should display group bio input'); - assert.ok(find('.group-manage-name').length === 1, 'it should display group name input'); - assert.ok(find('.group-manage-full-name').length === 1, 'it should display group full name input'); + assert.ok(find('.group-form-bio').length === 1, 'it should display group bio input'); + assert.ok(find('.group-form-name').length === 1, 'it should display group name input'); + assert.ok(find('.group-form-full-name').length === 1, 'it should display group full name input'); assert.ok( - find('.group-manage-public-admission').length === 1, + find('.group-form-public-admission').length === 1, 'it should display group public admission input' ); assert.ok( - find('.group-manage-public-exit').length === 1, + find('.group-form-public-exit').length === 1, 'it should display group public exit input' ); - assert.ok(find('.group-manage-allow-membership-requests').length === 1, 'it should display group allow_membership_requets input'); + assert.ok( + find('.group-form-allow-membership-requests').length === 1, + 'it should display group allow_membership_request input' + ); assert.ok( - find('.group-manage-allow-membership-requests[disabled]').length === 1, + find('.group-form-allow-membership-requests[disabled]').length === 1, 'it should disable group allow_membership_request input' ); }); - click('.group-manage-public-admission'); - click('.group-manage-allow-membership-requests'); + click('.group-form-public-admission'); + click('.group-form-allow-membership-requests'); andThen(() => { assert.ok( - find('.group-manage-public-admission[disabled]').length === 1, + find('.group-form-public-admission[disabled]').length === 1, 'it should disable group public admission input' ); assert.ok( - find('.group-manage-public-exit[disabled]').length === 0, + find('.group-form-public-exit[disabled]').length === 0, 'it should not disable group public exit input' ); assert.equal( - find('.group-manage-membership-request-template').length, 1, + find('.group-form-membership-request-template').length, 1, 'it should display the membership request template field' ); }); diff --git a/test/javascripts/acceptance/groups-new-test.js.es6 b/test/javascripts/acceptance/groups-new-test.js.es6 index 9a57899bb78..472ce77c07f 100644 --- a/test/javascripts/acceptance/groups-new-test.js.es6 +++ b/test/javascripts/acceptance/groups-new-test.js.es6 @@ -61,7 +61,7 @@ QUnit.test("Creating a new group", assert => { ); }); - click(".groups-new-public-admission"); + click(".group-form-public-admission"); andThen(() => { assert.equal(