diff --git a/addons/auth_password_policy/views/res_config_settings_views.xml b/addons/auth_password_policy/views/res_config_settings_views.xml index a4a1cbf1c88..ae974074271 100644 --- a/addons/auth_password_policy/views/res_config_settings_views.xml +++ b/addons/auth_password_policy/views/res_config_settings_views.xml @@ -5,7 +5,7 @@ - +
diff --git a/addons/auth_signup/views/res_users_views.xml b/addons/auth_signup/views/res_users_views.xml index 37267bf39cd..b34b0ac832f 100644 --- a/addons/auth_signup/views/res_users_views.xml +++ b/addons/auth_signup/views/res_users_views.xml @@ -17,7 +17,7 @@ - +
x
@@ -33,4 +33,18 @@ + + res.users.tree.inherit + res.users + + + + state == 'new' + + + + + + + diff --git a/addons/base_setup/models/res_config_settings.py b/addons/base_setup/models/res_config_settings.py index 6d49faaf368..d84c8ef79b3 100644 --- a/addons/base_setup/models/res_config_settings.py +++ b/addons/base_setup/models/res_config_settings.py @@ -42,8 +42,11 @@ class ResConfigSettings(models.TransientModel): paperformat_id = fields.Many2one(related="company_id.paperformat_id", string='Paper format', readonly=False) external_report_layout_id = fields.Many2one(related="company_id.external_report_layout_id", readonly=False) show_effect = fields.Boolean(string="Show Effect", config_parameter='base_setup.show_effect') - company_count = fields.Integer('Number of Companies', readonly=True, compute="_compute_company_count") + company_count = fields.Integer('Number of Companies', compute="_compute_company_count") + active_user_count = fields.Integer('Number of Active Users', compute="_compute_active_user_count") language_count = fields.Integer('Number of Languages', compute="_compute_language_count") + company_name = fields.Char(related="company_id.display_name", string="Company Name") + company_informations = fields.Text(compute="_compute_company_informations") @api.model def get_values(self): @@ -65,7 +68,11 @@ class ResConfigSettings(models.TransientModel): 'res_model': 'res.company', 'res_id': self.env.company.id, 'target': 'current', + 'context': { + 'form_view_initial_mode': 'edit', + }, } + def open_default_user(self): action = self.env.ref('base.action_res_users').read()[0] action['res_id'] = self.env.ref('base.default_user').id @@ -95,8 +102,27 @@ class ResConfigSettings(models.TransientModel): for record in self: record.company_count = company_count + @api.depends('company_id') + def _compute_active_user_count(self): + active_user_count = self.env['res.users'].sudo().search_count([('share', '=', False)]) + for record in self: + record.active_user_count = active_user_count + @api.depends('company_id') def _compute_language_count(self): language_count = len(self.env['res.lang'].get_installed()) for record in self: record.language_count = language_count + + @api.depends('company_id') + def _compute_company_informations(self): + informations = '%s\n' % self.company_id.street if self.company_id.street else '' + informations += '%s\n' % self.company_id.street2 if self.company_id.street2 else '' + informations += '%s' % self.company_id.zip if self.company_id.zip else '' + informations += ' - %s\n' % self.company_id.city if self.company_id.city else '\n' + informations += '%s\n' % self.company_id.state_id.display_name if self.company_id.state_id else '' + informations += '%s' % self.company_id.country_id.display_name if self.company_id.country_id else '' + informations += '\nVAT: %s' % self.company_id.vat if self.company_id.vat else '' + + for record in self: + record.company_informations = informations diff --git a/addons/base_setup/static/src/js/res_config_invite_users.js b/addons/base_setup/static/src/js/res_config_invite_users.js index 653a130868c..97b5739026c 100644 --- a/addons/base_setup/static/src/js/res_config_invite_users.js +++ b/addons/base_setup/static/src/js/res_config_invite_users.js @@ -4,9 +4,7 @@ odoo.define('base_setup.ResConfigInviteUsers', function (require) { var Widget = require('web.Widget'); var widget_registry = require('web.widget_registry'); var core = require('web.core'); - var framework = require('web.framework'); - var QWeb = core.qweb; var _t = core._t; var ResConfigInviteUsers = Widget.extend({ @@ -14,10 +12,8 @@ odoo.define('base_setup.ResConfigInviteUsers', function (require) { events: { 'click .o_web_settings_invite': '_onClickInvite', - 'click .o_web_settings_access_rights': '_onClickAccessRights', 'click .o_web_settings_user': '_onClickUser', 'click .o_web_settings_more': '_onClickMore', - 'click .o_badge_remove': '_onClickBadgeRemove', 'keydown .o_user_emails': '_onKeydownUserEmails', }, @@ -55,12 +51,26 @@ odoo.define('base_setup.ResConfigInviteUsers', function (require) { //-------------------------------------------------------------------------- /** - * Creates and appends badges for valid and unique email addresses + * @private + * @param {string} email + * @returns {boolean} true if the given email address is valid + */ + _validateEmail: function (email) { + var re = /^([a-z0-9][-a-z0-9_\+\.]*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,63}(?:\.[a-z]{2})?)$/i; + return re.test(email); + }, + + /** + * Send invitation for valid and unique email addresses * * @private */ - _createBadges: function () { + _invite: function () { + var self = this; + var $userEmails = this.$('.o_user_emails'); + $userEmails.prop('disabled', true); + this.$('.o_web_settings_invite').prop('disabled', true); var value = $userEmails.val().trim(); if (value) { // filter out duplicates @@ -85,84 +95,46 @@ odoo.define('base_setup.ResConfigInviteUsers', function (require) { emails = _.difference(emails, existingEmails); } - // add valid email addresses, if any if (emails.length) { - this.emails = this.emails.concat(emails); - this.$('.o_web_settings_invitation_form').append(QWeb.render('EmailBadge', {emails: emails})); $userEmails.val(''); + this._rpc({ + model: 'res.users', + method: 'web_create_users', + args: [emails], + }).then(function () { + return self.load().then(function () { + self.renderElement(); + self.$('.o_user_emails').focus(); + }); + }); + } else { + $userEmails.prop('disabled', false); + this.$('.o_web_settings_invite').prop('disabled', false); + self.$('.o_user_emails').focus(); } } }, - /** - * Removes a given badge from the DOM, and its associated email address - * - * @private - * @param {jQueryElement} $badge - */ - _removeBadge: function ($badge) { - var email = $badge.text().trim(); - this.emails = _.without(this.emails, email); - $badge.remove(); - }, - /** - * @private - * @param {string} email - * @returns {boolean} true if the given email address is valid - */ - _validateEmail: function (email) { - var re = /^([a-z0-9][-a-z0-9_\+\.]*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,63}(?:\.[a-z]{2})?)$/i; - return re.test(email); - }, //-------------------------------------------------------------------------- // Handlers //-------------------------------------------------------------------------- - /** - * @private - * @param {MouseEvent} ev - */ - _onClickAccessRights: function (e) { - e.preventDefault(); - this.do_action('base.action_res_users'); - }, - /** - * @private - * @param {MouseEvent} ev - */ - _onClickBadgeRemove: function (ev) { - var $badge = $(ev.target).closest('.badge'); - this._removeBadge($badge); - }, /** * @private * @param {MouseEvent} ev */ _onClickInvite: function (ev) { - var self = this; - this._createBadges(); - if (this.emails.length) { + if (this.$('.o_user_emails').val().length) { var $button = $(ev.target); $button.button('loading'); - this._rpc({ - model: 'res.users', - method: 'web_create_users', - args: [this.emails], - }).then(function () { - return self.load().then(function () { - self.renderElement(); - }); - }).guardedCatch(function () { - // NOTE Not sure that this is needed - $button.button('reset'); - }); + return this._invite(); } }, /** * @private * @param {MouseEvent} ev */ - _onClickMore: function(ev) { + _onClickMore: function (ev) { ev.preventDefault(); this.do_action({ name: _t('Users'), @@ -182,7 +154,7 @@ odoo.define('base_setup.ResConfigInviteUsers', function (require) { */ _onClickUser: function (ev) { ev.preventDefault(); - var user_id = $(e.currentTarget).data('user-id'); + var user_id = $(ev.currentTarget).data('user-id'); this.do_action({ type: 'ir.actions.act_window', res_model: 'res.users', @@ -196,15 +168,10 @@ odoo.define('base_setup.ResConfigInviteUsers', function (require) { * @param {KeyboardEvent} ev */ _onKeydownUserEmails: function (ev) { - var $userEmails = this.$('.o_user_emails'); - var keyCodes = [$.ui.keyCode.TAB, $.ui.keyCode.COMMA, $.ui.keyCode.ENTER, $.ui.keyCode.SPACE]; + var keyCodes = [$.ui.keyCode.TAB, $.ui.keyCode.COMMA, $.ui.keyCode.ENTER]; if (_.contains(keyCodes, ev.which)) { ev.preventDefault(); - this._createBadges(); - } - // remove last badge on backspace - if (ev.which === $.ui.keyCode.BACKSPACE && this.emails.length && !$userEmails.val()) { - this._removeBadge(this.$('.o_web_settings_invitation_form .badge:last')); + this._invite(); } }, }); diff --git a/addons/base_setup/static/src/scss/settings.scss b/addons/base_setup/static/src/scss/settings.scss index 2f385a3ad10..5e94045dff3 100644 --- a/addons/base_setup/static/src/scss/settings.scss +++ b/addons/base_setup/static/src/scss/settings.scss @@ -1,67 +1,6 @@ -.o_web_settings { - - $bg-dashboard-col: #FFF; - - @mixin o-web-settings-card-card { - box-shadow: 0 1px 2px 0 rgba(0,0,0,.14); - background: $bg-dashboard-col; - border-radius: 2px; - } - - background: #F7F7F7; - height: 100%; - - .o_web_settings_col { - > div > hr { - margin: 12px -18px 15px -18px; - border-color: #CBCBCB; - } - - > div { - @include o-web-settings-card-card; - padding: 25px 18px 18px 18px; - - .o_web_settings_header { - font-size: 22px; - margin-bottom: 8px; - } - } - .btn.o_browse_apps, .btn.o_web_settings_invitations { - margin-top: 12px; - } - .o_web_settings_compact_subtitle { - line-height: 12px; - display: block; - } - .o_web_settings_invitations { - .o_web_settings_invitation_form { - text-align: left; - > textarea { - resize: vertical; - width: 100%; - } - } - } - .o_web_settings_planner { - .progress { - height: 10px; - background-color: darken($bg-dashboard-col, 15%); - cursor: pointer; - margin-bottom: 30px; - } - .o_web_settings_planner_progress_text { - font-size: 18px; - padding-right: 0px; - padding-top: 3px; - } - .o_web_settings_planner_progress_bar { - padding-left: 10px; - } - .o_web_settings_progress_title { - font-weight: bold; - cursor: pointer; - color: $o-brand-primary; - } - } +.o_setting_container { + .o_web_settings_user { + font-size: 95%; + font-weight: 500; } } diff --git a/addons/base_setup/static/src/xml/res_config_invite_users.xml b/addons/base_setup/static/src/xml/res_config_invite_users.xml index ba9bd5fbc7e..cfb67afdbfa 100644 --- a/addons/base_setup/static/src/xml/res_config_invite_users.xml +++ b/addons/base_setup/static/src/xml/res_config_invite_users.xml @@ -1,54 +1,21 @@
-
-
-
- -
- - Active User - Active Users -
-
-
- - - Manage Users - -
-
-
-
- -

Pending Invitations:

- - - - -
- more -
-
-
-
-
-
- Invite New Users: - - - -
-
+

Invite New Users

+
+ +
-
- - - - + +

Pending Invitations:

+ + - -
-
+ +
+
more + + +
diff --git a/addons/base_setup/views/assets.xml b/addons/base_setup/views/assets.xml index 340e4a52445..cd0cb0efc85 100644 --- a/addons/base_setup/views/assets.xml +++ b/addons/base_setup/views/assets.xml @@ -2,6 +2,7 @@