From 0bff1267452bb4100b7ed5be73cd78b137347cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sun, 19 Mar 2023 01:20:45 +0100 Subject: [PATCH] Disable new button when record is modified To simplify the management of the state of button, activate_save is merged with set_buttons_sensitive. Closes #8053 --- sao/src/tab.js | 38 +++++++++++++--------------- sao/src/window.js | 6 ++--- tryton/tryton/gui/window/form.py | 35 ++++++++++++------------- tryton/tryton/gui/window/win_form.py | 6 ++--- 4 files changed, 39 insertions(+), 46 deletions(-) diff --git a/sao/src/tab.js b/sao/src/tab.js index 9deab622b9..db9b86f087 100644 --- a/sao/src/tab.js +++ b/sao/src/tab.js @@ -497,9 +497,8 @@ } }; - this.set_buttons_sensitive(); - this.view_prm = this.screen.switch_view().done(() => { + this.set_buttons_sensitive(); this.content.append(screen.screen_container.el); if (attributes.res_id) { if (!jQuery.isArray(attributes.res_id)) { @@ -817,7 +816,7 @@ return this.modified_save().then(() => { return this.screen.new_().then(() => { this.info_bar.clear(); - this.activate_save(); + this.set_buttons_sensitive(); }); }); }, @@ -870,7 +869,7 @@ .then(set_cursor => { return this.screen.display(set_cursor).then(() => { this.info_bar.clear(); - this.activate_save(); + this.set_buttons_sensitive(); this.screen.count_tab_domain(); }); }); @@ -924,7 +923,7 @@ return this.modified_save().then(() => { var prm = this.screen.display_previous(); this.info_bar.clear(); - this.activate_save(); + this.set_buttons_sensitive(); return prm; }); }, @@ -932,7 +931,7 @@ return this.modified_save().then(() => { var prm = this.screen.display_next(); this.info_bar.clear(); - this.activate_save(); + this.set_buttons_sensitive(); return prm; }); }, @@ -1051,14 +1050,18 @@ } this.title.text(label); this.title.attr('title', title); - this.set_buttons_sensitive(revision); + this.set_buttons_sensitive(); }, - set_buttons_sensitive: function(revision) { + set_buttons_sensitive: function() { + var revision = this.screen.context._datetime; if (!revision) { var access = Sao.common.MODELACCESS.get(this.screen.model_name); + var modified = this.screen.modified(); const accesses = new Map([ - ['new_', access.create], - ['save', access.create || access.write], + ['new_', access.create && !modified], + ['save', + (access.create || access.write) && + modified && !this.screen.readonly], ['delete_', access.delete], ['copy', access.create], ['import', access.create], @@ -1465,7 +1468,7 @@ name += '#' + selected; } } - var buttons = ['print', 'relate', 'email', 'save', 'attach']; + var buttons = ['print', 'relate', 'email', 'attach']; for (const button_id of buttons) { const button = this.buttons[button_id]; let can_be_sensitive = button._can_be_sensitive; @@ -1480,8 +1483,6 @@ var keyword = button.attributes.keyword || 'action'; return keyword == button_id; }); - } else if (button_id == 'save') { - can_be_sensitive &= !this.screen.readonly; } set_sensitive(button_id, position && can_be_sensitive); } @@ -1504,22 +1505,17 @@ } this.status_label.text(msg).attr('title', msg); this.info_bar.clear(); - this.activate_save(); + this.set_buttons_sensitive(); this.refresh_attachment_preview(); }, record_modified: function() { - this.activate_save(); + this.set_buttons_sensitive(); this.info_bar.refresh(); }, record_saved: function() { - this.activate_save(); + this.set_buttons_sensitive(); this.refresh_resources(); }, - activate_save: function() { - this.menu_buttons.save.toggleClass( - 'disabled', !this.screen.modified()); - this.buttons.save.prop('disabled', !this.screen.modified()); - }, action: function() { window.setTimeout(() => { this.buttons.action.click(); diff --git a/sao/src/window.js b/sao/src/window.js index 2b8094d614..7f101470a2 100644 --- a/sao/src/window.js +++ b/sao/src/window.js @@ -388,7 +388,7 @@ }); }, record_message: function(position, size) { - this.activate_save(); + this.set_buttons_sensitive(); if (this.view_type != 'tree') { return; } @@ -420,10 +420,10 @@ this.label.text(message).attr('title', message); }, record_modified: function() { - this.activate_save(); + this.set_buttons_sensitive(); this.info_bar.refresh(); }, - activate_save: function() { + set_buttons_sensitive: function() { if (this.but_ok.hasClass('disabled') && this.screen.modified()) { this.but_ok.removeClass('disabled'); } diff --git a/tryton/tryton/gui/window/form.py b/tryton/tryton/gui/window/form.py index cc63d453a2..092db9faf8 100644 --- a/tryton/tryton/gui/window/form.py +++ b/tryton/tryton/gui/window/form.py @@ -75,7 +75,7 @@ class Form(TabContent): self.screen.search_filter() self.update_revision() - self.activate_save() + self.set_buttons_sensitive() def get_toolbars(self): try: @@ -374,14 +374,18 @@ class Form(TabContent): tooltip = self.name self.title.set_text(label) tooltips.set_tip(self.title, tooltip) - self.set_buttons_sensitive(revision) + self.set_buttons_sensitive() - def set_buttons_sensitive(self, revision=None): + def set_buttons_sensitive(self): + revision = self.screen.context.get('_datetime') if not revision: access = common.MODELACCESS[self.model] + modified = self.screen.modified() for name, sensitive in [ - ('new', access['create']), - ('save', access['create'] or access['write']), + ('new', access['create'] and not modified), + ('save', + (access['create'] or access['write']) + and modified and not self.screen.readonly), ('remove', access['delete']), ('copy', access['create']), ('import', access['create']), @@ -467,7 +471,7 @@ class Form(TabContent): return self.screen.new() self.info_bar_clear() - self.activate_save() + self.set_buttons_sensitive() def sig_copy(self, widget=None): if not common.MODELACCESS[self.model]['create']: @@ -502,14 +506,14 @@ class Form(TabContent): return self.screen.display_prev() self.info_bar_clear() - self.activate_save() + self.set_buttons_sensitive() def sig_next(self, widget=None): if not self.modified_save(): return self.screen.display_next() self.info_bar_clear() - self.activate_save() + self.set_buttons_sensitive() def sig_reload(self, test_modified=True): if test_modified: @@ -531,7 +535,6 @@ class Form(TabContent): self.screen.display(set_cursor=set_cursor) self.info_bar_clear() self.set_buttons_sensitive() - self.activate_save() self.screen.count_tab_domain() return True @@ -601,8 +604,7 @@ class Form(TabContent): selected = len(self.screen.selected_records) if selected > 1: name += '#%i' % selected - for button_id in ('print', 'relate', 'email', 'open', 'save', - 'attach'): + for button_id in ['print', 'relate', 'email', 'open', 'attach']: button = self.buttons[button_id] can_be_sensitive = getattr(button, '_can_be_sensitive', True) if button_id in {'print', 'relate', 'email', 'open'}: @@ -612,8 +614,6 @@ class Form(TabContent): can_be_sensitive |= any( b.attrs.get('keyword', 'action') == action_type for b in self.screen.get_buttons()) - elif button_id == 'save': - can_be_sensitive &= not self.screen.readonly set_sensitive(button_id, bool(position) and can_be_sensitive) set_sensitive('switch', self.screen.number_of_views > 1) set_sensitive('remove', self.screen.deletable) @@ -629,7 +629,7 @@ class Form(TabContent): msg = "%s/%s" % (name, common.humanize(size)) self.status_label.set_text(msg) self.info_bar_clear() - self.activate_save() + self.set_buttons_sensitive() self.refresh_attachment_preview() def record_modified(self): @@ -637,12 +637,12 @@ class Form(TabContent): # As it is called via idle_add, the form could have been destroyed # in the meantime. if self.widget_get().props.window: - self.activate_save() + self.set_buttons_sensitive() GLib.idle_add(_record_modified) self.info_bar_refresh() def record_saved(self): - self.activate_save() + self.set_buttons_sensitive() self.refresh_resources() def modified_save(self): @@ -693,9 +693,6 @@ class Form(TabContent): } Action.execute(action, data, context=self.screen.local_context) - def activate_save(self): - self.buttons['save'].props.sensitive = self.screen.modified() - def sig_win_close(self, widget): Main().sig_win_close(widget) diff --git a/tryton/tryton/gui/window/win_form.py b/tryton/tryton/gui/window/win_form.py index 77ab5363ee..9500eecf17 100644 --- a/tryton/tryton/gui/window/win_form.py +++ b/tryton/tryton/gui/window/win_form.py @@ -345,7 +345,7 @@ class WinForm(NoModal, InfoBar): win.show() def record_message(self, position, size, *args): - self.activate_save() + self.set_buttons_sensitive() if self.view_type != 'tree': return name = '_' @@ -380,10 +380,10 @@ class WinForm(NoModal, InfoBar): self.label.set_text(line) def record_modified(self, *args): - self.activate_save() + self.set_buttons_sensitive() self.info_bar_refresh() - def activate_save(self): + def set_buttons_sensitive(self): modified = self.screen.modified() # Keep sensible as change could have been trigger by a Many2One edition sensitive = modified or self.but_ok.props.sensitive