diff --git a/addon/controllers/fd-setting.js b/addon/controllers/fd-setting.js index e84a2fc1c..e8d17c16a 100644 --- a/addon/controllers/fd-setting.js +++ b/addon/controllers/fd-setting.js @@ -1,10 +1,12 @@ import Controller from '@ember/controller'; import FdSheetCloseConfirm from '../mixins/fd-sheet-close-confirm'; import FdReadonlyProjectMixin from '../mixins/fd-readonly-project'; +import { A } from '@ember/array'; import { inject as service } from '@ember/service'; import { resolve, reject } from 'rsvp'; import { isNone, isBlank } from '@ember/utils'; import { transliteration } from '../utils/fd-transliteration'; +import { set, computed } from '@ember/object'; import { SimplePredicate, ComplexPredicate } from 'ember-flexberry-data/query/predicate'; import Builder from 'ember-flexberry-data/query/builder'; @@ -44,6 +46,44 @@ export default Controller.extend(FdSheetCloseConfirm, FdReadonlyProjectMixin, { */ accessIsPublic: true, + /** + Table headers. + + @property tableUsersAccess + @type Array + */ + tableUsersAccess: computed(() => ( + A([{ + columnCaption: 'forms.fd-setting.access-settings.name-user-caption', + columnProperty: 'name', + attrPlaceholder: 'forms.fd-setting.access-settings.name-user-placeholder', + columnClass: 'three' + }, + { + columnCaption: 'forms.fd-setting.access-settings.login-user-caption', + columnProperty: 'login', + attrPlaceholder: 'forms.fd-setting.access-settings.login-user-placeholder', + columnClass: 'four' + }, + { + columnCaption: 'forms.fd-setting.access-settings.user-access-caption', + columnProperty: 'access', + columnClass: 'four', + isDropDown: true, + }]) + )), + + /** + Button locale path for usersAccessButton. + + @property usersAccessButton + @type Object + */ + usersAccessButton: computed(() => ({ + createBtn: 'forms.fd-setting.access-settings.create-btn', + deleteBtn: 'forms.fd-setting.access-settings.delete-btn', + })), + /** Check lexical structure. @@ -99,17 +139,38 @@ export default Controller.extend(FdSheetCloseConfirm, FdReadonlyProjectMixin, { @method actions.save */ save() { + let adapter = this.get('store').adapterFor('application'); let stage = this.get('model.stage'); this.get('appState').loading(); this.validateData(stage) .then(() => stage.save()) .then(() => { - let adapter = this.get('store').adapterFor('application'); let data = { 'project': stage.get('id'), 'moduleSettings': JSON.stringify(this.get('model.settings')) }; return adapter.callAction('SaveCurrentModuleSettings', data, null, { withCredentials: true }); }) + .then(() => { + let usersAccess = this.get('model.usersAccess'); + if (!isNone(usersAccess)) { + let data = { 'project': stage.get('id'), 'newUsersInStage': JSON.stringify(usersAccess) }; + + return adapter.callAction('SaveUsersAccessForStage', data, null, { withCredentials: true }); + } + + return resolve(); + }) + .then((usersAccessForStage) => { + if (!isNone(usersAccessForStage)) { + let newUsersAccess = JSON.parse(usersAccessForStage.value); + this.set('model.usersAccess', A(newUsersAccess.data)); + if (newUsersAccess.errors.length !== 0) { + return reject({ message: this.get('i18n').t('forms.fd-setting.error-message.empty-username').toString() + newUsersAccess.errors.join(', ') }); + } + } + + return resolve(); + }) .catch((error) => { this.get('fdDialogService').showErrorMessage(error.message); }) @@ -137,6 +198,40 @@ export default Controller.extend(FdSheetCloseConfirm, FdReadonlyProjectMixin, { .finally(() => { this.get('appState').reset(); }); - } + }, + + /** + Create 'UserAccess'. + + @method actions.createUserAccess + */ + createUserAccess() { + let usersAccess = this.get('model.usersAccess'); + usersAccess.pushObject({ + name: undefined, + login: undefined, + access: undefined + }); + }, + + /** + Method remove 'store instances in type' from table. + + @method actions.deleteUserAccess + */ + deleteUserAccess(selectedValues) { + let usersAccess = this.get('model.usersAccess'); + usersAccess.removeObjects(selectedValues); + selectedValues.clear(); + }, + + /** + Update 'Access'. + + @method actions.dropdownChangeAccess + */ + dropdownChangeAccess(model, value) { + set(model, 'access', value); + }, } }); diff --git a/addon/locales/en/forms/fd-setting.js b/addon/locales/en/forms/fd-setting.js index 90c3ceafd..e3711a983 100644 --- a/addon/locales/en/forms/fd-setting.js +++ b/addon/locales/en/forms/fd-setting.js @@ -40,9 +40,20 @@ export default { 'pri-key-placeholder': 'Enter the private SSH key', 'frontend-publish': 'Publish an application to gh-pages', }, + 'access-settings-caption': 'Members', + 'access-settings': { + 'name-user-caption': 'Username', + 'name-user-placeholder': 'Username will load after saving', + 'login-user-caption': 'user login', + 'login-user-placeholder': 'Enter user login', + 'user-access-caption': 'User permissions', + 'create-btn': 'Add new member', + 'delete-btn': 'Delete member' + }, 'save-button': 'Save', 'error-message': { 'empty-name': 'Stage name cannot be empty', 'exist-stage': 'Stage with the same name already exists', + 'empty-username': 'There are no users in the system with logins: ' } }; diff --git a/addon/locales/ru/forms/fd-setting.js b/addon/locales/ru/forms/fd-setting.js index 27bebbde6..b136272e3 100644 --- a/addon/locales/ru/forms/fd-setting.js +++ b/addon/locales/ru/forms/fd-setting.js @@ -40,9 +40,20 @@ export default { 'pri-key-placeholder': 'Введите закрытый SSH ключ', 'frontend-publish': 'Публикация приложения в gh-pages', }, + 'access-settings-caption': 'Участники', + 'access-settings': { + 'name-user-caption': 'Имя пользователя', + 'name-user-placeholder': 'Имя пользователя загрузится после сохранения', + 'login-user-caption': 'Логин пользователя', + 'login-user-placeholder': 'Введите логин пользователя', + 'user-access-caption': 'Права доступа пользователя', + 'create-btn': 'Добавить нового участника', + 'delete-btn': 'Удалить участника' + }, 'save-button': 'Сохранить', 'error-message': { 'empty-name': 'Имя стадии не может быть пустое', 'exist-stage': 'Стадия с таким именем уже существует', + 'empty-username': 'В системе отсутствуют пользователи с логинами: ' } }; diff --git a/addon/routes/fd-setting.js b/addon/routes/fd-setting.js index 5d3daa04b..9bdb349d9 100644 --- a/addon/routes/fd-setting.js +++ b/addon/routes/fd-setting.js @@ -1,5 +1,7 @@ import Route from '@ember/routing/route'; +import { A } from '@ember/array'; import { inject as service } from '@ember/service'; +import { isBlank } from '@ember/utils'; export default Route.extend({ @@ -21,19 +23,28 @@ export default Route.extend({ generationSettings: undefined, model() { + let modelHash = { + stage: undefined, + settings: undefined, + usersAccess: undefined, + }; + const store = this.get('store'); - const stage = this.get('currentProjectContext').getCurrentStageModel(); + modelHash.stage = this.get('currentProjectContext').getCurrentStageModel(); const adapter = store.adapterFor('application'); - const data = { 'project': stage.get('id'), 'moduleSettingTypes': this.get('generationSettings') }; + const data = { 'project': modelHash.stage.get('id'), 'moduleSettingTypes': this.get('generationSettings') }; return adapter.callAction('GetCurrentModuleSettings', data, null, { withCredentials: true }).then((generationSettings) => { - let currentGenerationSettings = JSON.parse(generationSettings.value); + modelHash.settings = JSON.parse(generationSettings.value); + + return adapter.callFunction('GetUsersAccessForStage', { project: modelHash.stage.get('id').toString() }, null, { withCredentials: true }).then((usersAccess) => { + if (!isBlank(usersAccess.value)) { + modelHash.usersAccess = A(JSON.parse(usersAccess.value)); + } - return { - stage: stage, - settings: currentGenerationSettings - }; + return modelHash; + }); }); }, diff --git a/app/templates/fd-setting.hbs b/app/templates/fd-setting.hbs index 036ab3f32..638777caa 100644 --- a/app/templates/fd-setting.hbs +++ b/app/templates/fd-setting.hbs @@ -261,6 +261,26 @@ + {{#if model.usersAccess}} +