Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add table for setting user access #634

Merged
merged 2 commits into from
Feb 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 97 additions & 2 deletions addon/controllers/fd-setting.js
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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);
})
Expand Down Expand Up @@ -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);
},
}
});
11 changes: 11 additions & 0 deletions addon/locales/en/forms/fd-setting.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: '
}
};
11 changes: 11 additions & 0 deletions addon/locales/ru/forms/fd-setting.js
Original file line number Diff line number Diff line change
Expand Up @@ -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': 'В системе отсутствуют пользователи с логинами: '
}
};
25 changes: 18 additions & 7 deletions addon/routes/fd-setting.js
Original file line number Diff line number Diff line change
@@ -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({

Expand All @@ -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;
});
});
},

Expand Down
20 changes: 20 additions & 0 deletions app/templates/fd-setting.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,26 @@
</div>
</div>

{{#if model.usersAccess}}
<h2 class="form-header">{{t "forms.fd-setting.access-settings-caption"}}</h2>
<div class="ui stackable grid fd-list-edited">
<div class="row">
<div class="sixteen wide column light-text">
{{fd-attribute-table
tableView=tableUsersAccess
buttonCaption=usersAccessButton
dropdownItemsObject=(flexberry-enum 'new-platform-flexberry-web-designer-access-mode')
model=model.usersAccess
create=(action 'createUserAccess')
delete=(action 'deleteUserAccess')
dropdownChange=(action 'dropdownChangeAccess')
readonly=readonlyModeProject
}}
</div>
</div>
</div>
{{/if}}

<h2 class="form-header">{{t "forms.fd-setting.project-actions-caption"}}</h2>
<div class="ui stackable grid">
<div class="row">
Expand Down