diff options
Diffstat (limited to 'addons/web/static/src/js/fields')
| -rw-r--r-- | addons/web/static/src/js/fields/abstract_field.js | 28 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/basic_fields.js | 12 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/relational_fields.js | 38 |
3 files changed, 74 insertions, 4 deletions
diff --git a/addons/web/static/src/js/fields/abstract_field.js b/addons/web/static/src/js/fields/abstract_field.js index 5cc3f1d17d2..36a9f0cb258 100644 --- a/addons/web/static/src/js/fields/abstract_field.js +++ b/addons/web/static/src/js/fields/abstract_field.js @@ -299,6 +299,34 @@ var AbstractField = Widget.extend({ return this._render() || $.when(); }, + /** + * Remove the invalid class on a field + */ + removeInvalidClass: function () { + this.$el.removeClass('o_field_invalid'); + }, + + /** + * add the invalid class on a field + */ + setInvalidClass: function () { + this.$el.addClass('o_field_invalid'); + }, + + /** + * Update the modifiers with the newest value. + * Now this.attrs.modifiersValue can be used consistantly even with + * conditional modifiers inside field widgets, and without needing new + * events or synchronization between the widgets, renderer and controller + * + * @param {Object || null} modifiers the updated modifiers + * @override + */ + updateModifiersValue: function(modifiers) { + this.attrs.modifiersValue = modifiers || {}; + }, + + //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index ee9958406c5..ae0da5427ad 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -312,13 +312,21 @@ var InputField = DebouncedField.extend({ this._super.apply(this, arguments); // the following code only makes sense in edit mode, with an input - if (this.mode === 'edit') { + if (this.mode === 'edit' && ev.data.direction !== 'cancel') { var input = this.$input[0]; var selecting = (input.selectionEnd !== input.selectionStart); if ((ev.data.direction === "left" && (selecting || input.selectionStart !== 0)) - || (ev.data.direction === "right" && (selecting || input.selectionStart !== input.value.length))) { + || (ev.data.direction === "right" && (selecting || input.selectionStart !== input.value.length))) { ev.stopPropagation(); } + if (ev.data.direction ==='next' && this.attrs.modifiersValue.required) { + if (!this.$input.val()){ + this.setInvalidClass(); + ev.stopPropagation(); + } else { + this.removeInvalidClass(); + } + } } }, }); diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index fedaf5c07f6..93c924fad4c 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -682,6 +682,8 @@ var FieldX2Many = AbstractField.extend({ resequence: '_onResequence', save_line: '_onSaveLine', toggle_column_order: '_onToggleColumnOrder', + activate_next_widget: '_onActiveNextWidget', + navigation_move: '_onNavigationMove', }), // We need to trigger the reset on every changes to be aware of the parent changes @@ -797,6 +799,30 @@ var FieldX2Many = AbstractField.extend({ return this._super.apply(this, arguments); }, + /** + * @override + * @returns {jQuery} + */ + getFocusableElement: function () { + return (this.mode === 'edit' && this.$input) || this.$el; + }, + + /** + * @override + * @param {Object} [options] + */ + activate: function (options) { + if (!this.activeActions.create || this.isReadonly || !this.$el.is(":visible")) { + return false; + } + if (this.view.type === 'kanban') { + this.$buttons.find(".o-kanban-button-new").focus(); + } + if (this.view.arch.tag === 'tree') { + this.renderer.$('.o_field_x2many_list_row_add a').focus(); + } + return true; + }, //-------------------------------------------------------------------------- // Private @@ -1159,6 +1185,16 @@ var FieldX2Many = AbstractField.extend({ _onToggleColumnOrder: function (ev) { ev.data.field = this.name; }, + /* + * Move to next widget. + * + * @private + */ + _onActiveNextWidget: function (e) { + e.stopPropagation(); + this.renderer.unselectRow(); + this.trigger_up('navigation_move',{direction:'next'}); + }, }); var FieldOne2Many = FieldX2Many.extend({ @@ -1257,7 +1293,6 @@ var FieldOne2Many = FieldX2Many.extend({ var self = this; // we don't want interference with the components upstream. ev.stopPropagation(); - if (this.editable) { if (!this.activeActions.create) { if (ev.data.onFail) { @@ -1329,7 +1364,6 @@ var FieldMany2Many = FieldX2Many.extend({ _onAddRecord: function (ev) { var self = this; ev.stopPropagation(); - var domain = this.record.getDomain({fieldName: this.name}); new dialogs.SelectCreateDialog(this, { |
