diff --git a/frontend/client/src/controllers/admin.js b/frontend/client/src/controllers/admin.js index 5cfa941e98..2c41e60634 100644 --- a/frontend/client/src/controllers/admin.js +++ b/frontend/client/src/controllers/admin.js @@ -121,6 +121,22 @@ Espo.define('Controllers.Admin', 'Controller', function (Dep) { model.fetch(); }, + authentication: function () { + var model = this.getSettingsModel(); + + model.once('sync', function () { + model.id = '1'; + this.main('Edit', { + model: model, + views: { + header: {template: 'admin.settings.header-authentication'}, + body: {view: 'Admin.Authentication'}, + }, + }); + }, this); + model.fetch(); + }, + rebuild: function (options) { var master = this.get('master'); Espo.Ui.notify(master.translate('Please wait...')); diff --git a/frontend/client/src/views/admin/authentication.js b/frontend/client/src/views/admin/authentication.js new file mode 100644 index 0000000000..5cc9b97607 --- /dev/null +++ b/frontend/client/src/views/admin/authentication.js @@ -0,0 +1,122 @@ +/************************************************************************ + * This file is part of EspoCRM. + * + * EspoCRM - Open Source CRM application. + * Copyright (C) 2014 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko + * Website: http://www.espocrm.com + * + * EspoCRM is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * EspoCRM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with EspoCRM. If not, see http://www.gnu.org/licenses/. + ************************************************************************/ + +Espo.define('Views.Admin.Authentication', 'Views.Settings.Record.Edit', function (Dep) { + + return Dep.extend({ + + layoutName: 'authentication', + + dependencyDefs: { + 'ldapAuth': { + map: { + true: [ + { + action: 'show', + fields: ['ldapUsername', 'ldapPassword'] + } + ] + }, + default: [ + { + action: 'hide', + fields: ['ldapUsername', 'ldapPassword'] + } + ] + }, + 'ldapAccountCanonicalForm': { + map: { + 'Backslash': [ + { + action: 'show', + fields: ['ldapAccountDomainName', 'ldapAccountDomainNameShort'] + } + ], + 'Principal': [ + { + action: 'show', + fields: ['ldapAccountDomainName', 'ldapAccountDomainNameShort'] + } + ] + }, + default: [ + { + action: 'hide', + fields: ['ldapAccountDomainName', 'ldapAccountDomainNameShort'] + } + ] + } + }, + + setup: function () { + Dep.prototype.setup.call(this); + + this.methodList = this.getMetadata().get('entityDefs.Settings.fields.authenticationMethod.options') || []; + + this.authFields = { + 'LDAP': [ + 'ldapHost', 'ldapPort', 'ldapAuth', 'ldapSecurity', + 'ldapUsername', 'ldapPassword', 'ldapBindRequiresDn', + 'ldapUserLoginFilter', 'ldapBaseDn', 'ldapAccountCanonicalForm', + 'ldapAccountDomainName', 'ldapAccountDomainNameShort', 'ldapAccountDomainName', + 'ldapAccountDomainNameShort', 'ldapTryUsernameSplit', 'ldapOptReferrals', + 'ldapCreateEspoUser' + ] + }; + }, + + + afterRender: function () { + this.handlePanelsVisibility(); + this.listenTo(this.model, 'change:authenticationMethod', function () { + this.handlePanelsVisibility(); + }, this); + }, + + handlePanelsVisibility: function () { + var authenticationMethod = this.model.get('authenticationMethod'); + + this.methodList.forEach(function (method) { + var list = (this.authFields[method] || []); + if (method != authenticationMethod) { + this.$el.find('.panel[data-panel-name="'+method+'"]').addClass('hidden'); + list.forEach(function (field) { + this.hideField(field); + }, this); + } else { + this.$el.find('.panel[data-panel-name="'+method+'"]').removeClass('hidden'); + + list.forEach(function (field) { + this.showField(field); + }, this); + Object.keys(this.dependencyDefs || {}).forEach(function (attr) { + if (~list.indexOf(attr)) { + this._handleDependencyAttribute(attr); + } + }, this); + } + }, this); + }, + + }); + +}); + diff --git a/frontend/client/src/views/record/detail.js b/frontend/client/src/views/record/detail.js index da942c9891..c2b28ba06e 100644 --- a/frontend/client/src/views/record/detail.js +++ b/frontend/client/src/views/record/detail.js @@ -86,6 +86,8 @@ Espo.define('Views.Record.Detail', 'View', function (Dep) { isWide: false, + dependencyDefs: {}, + events: { 'click .button-container button': function (e) { var $target = $(e.currentTarget); @@ -350,7 +352,24 @@ Espo.define('Views.Record.Detail', 'View', function (Dep) { this.listenTo(this.model, 'sync', function () { this.attributes = this.model.getClonedAttributes(); }.bind(this)); - }, + + + this._initDependancy(); + }, + + _initDependancy: function () { + this.dependencyDefs = _.extend(this.getMetadata().get('clientDefs.' + this.model.name + '.formDependency') || {}, this.dependencyDefs); + + Object.keys(this.dependencyDefs || {}).forEach(function (attr) { + this.listenTo(this.model, 'change:' + attr, function () { + this._handleDependencyAttribute(attr); + }, this); + }, this); + + this.on('after:render', function () { + this._handleDependencyAttributes(); + }, this); + }, validate: function () { var notValid = false; @@ -642,6 +661,70 @@ Espo.define('Views.Record.Detail', 'View', function (Dep) { } this.getRouter().navigate(url, {trigger: true}); }, + + _handleDependencyAttributes: function () { + Object.keys(this.dependencyDefs || {}).forEach(function (attr) { + this._handleDependencyAttribute(attr); + }, this); + }, + + _handleDependencyAttribute: function (attr) { + var data = this.dependencyDefs[attr]; + var value = this.model.get(attr); + if (value in (data.map || {})) { + (data.map[value] || []).forEach(function (item) { + this._doDependencyAction(item); + }, this); + } else { + if ('default' in data) { + (data.default || []).forEach(function (item) { + this._doDependencyAction(item); + }, this); + } + } + }, + + _doDependencyAction: function (data) { + var action = data.action; + + var methodName = 'dependencyAction' + Espo.Utils.upperCaseFirst(action); + if (methodName in this && typeof this.methodName == 'function') { + this.methodName(data); + return; + } + + var fields = data.fields || []; + + switch (action) { + case 'hide': + fields.forEach(function (field) { + this.hideField(field); + }, this); + break; + case 'show': + fields.forEach(function (field) { + this.showField(field); + }, this); + break; + case 'setRequired': + fields.forEach(function (field) { + var fieldView = this.getFieldView(field); + if (fieldView) { + fieldView.setRequired(); + } + }, this); + break; + case 'setNotRequired': + fields.forEach(function (field) { + var fieldView = this.getFieldView(field); + if (fieldView) { + fieldView.setRequired(); + } + }, this); + break; + } + }, + }); });