From fa25857680eb8d19fb7be260ed7eea881ed12446 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sun, 2 Jun 2024 15:54:42 -0500 Subject: [PATCH 001/236] Let master view control context menu items for page that really does not belong in the template if we can help it. some templates still define context menu items but can hopefully phase those out over time --- .../templates/datasync/changes/index.mako | 7 ---- tailbone/templates/datasync/status.mako | 7 ---- tailbone/templates/master/index.mako | 14 ------- tailbone/templates/master/view.mako | 6 --- tailbone/templates/page.mako | 8 +++- .../trainwreck/transactions/index.mako | 12 ------ tailbone/templates/users/view.mako | 7 ---- tailbone/views/datasync.py | 23 +++++++++++ tailbone/views/master.py | 39 +++++++++++++++++++ tailbone/views/trainwreck/base.py | 12 ++++++ tailbone/views/users.py | 11 ++++++ 11 files changed, 92 insertions(+), 54 deletions(-) delete mode 100644 tailbone/templates/trainwreck/transactions/index.mako diff --git a/tailbone/templates/datasync/changes/index.mako b/tailbone/templates/datasync/changes/index.mako index b5aeb79a..6d171619 100644 --- a/tailbone/templates/datasync/changes/index.mako +++ b/tailbone/templates/datasync/changes/index.mako @@ -1,13 +1,6 @@ ## -*- coding: utf-8; -*- <%inherit file="/master/index.mako" /> -<%def name="context_menu_items()"> - ${parent.context_menu_items()} - % if request.has_perm('datasync.status'): -
  • ${h.link_to("View DataSync Status", url('datasync.status'))}
  • - % endif - - <%def name="grid_tools()"> ${parent.grid_tools()} diff --git a/tailbone/templates/datasync/status.mako b/tailbone/templates/datasync/status.mako index 43d05f51..c782dec6 100644 --- a/tailbone/templates/datasync/status.mako +++ b/tailbone/templates/datasync/status.mako @@ -5,13 +5,6 @@ <%def name="content_title()"> -<%def name="context_menu_items()"> - ${parent.context_menu_items()} - % if request.has_perm('datasync_changes.list'): -
  • ${h.link_to("View DataSync Changes", url('datasyncchanges'))}
  • - % endif - - <%def name="page_content()"> % if expose_websockets and not supervisor_error: -<%def name="context_menu_items()"> - % if master.results_downloadable_csv and request.has_perm('{}.results_csv'.format(permission_prefix)): -
  • ${h.link_to("Download results as CSV", url('{}.results_csv'.format(route_prefix)))}
  • - % endif - % if master.results_downloadable_xlsx and request.has_perm('{}.results_xlsx'.format(permission_prefix)): -
  • ${h.link_to("Download results as XLSX", url('{}.results_xlsx'.format(route_prefix)))}
  • - % endif - % if master.has_input_file_templates and master.has_perm('create'): - % for template in input_file_templates.values(): -
  • ${h.link_to("Download {} Template".format(template['label']), template['effective_url'])}
  • - % endfor - % endif - - <%def name="grid_tools()"> ## grid totals diff --git a/tailbone/templates/master/view.mako b/tailbone/templates/master/view.mako index ac0577e0..fe44caa9 100644 --- a/tailbone/templates/master/view.mako +++ b/tailbone/templates/master/view.mako @@ -51,12 +51,6 @@ % endif -<%def name="context_menu_items()"> - ## TODO: either make this configurable, or just lose it. - ## nobody seems to ever find it useful in practice. - ##
  • ${h.link_to("Permalink for this {}".format(model_title), action_url('view', instance))}
  • - - <%def name="render_row_grid_tools()"> ${rows_grid_tools} % if master.rows_downloadable_xlsx and master.has_perm('row_results_xlsx'): diff --git a/tailbone/templates/page.mako b/tailbone/templates/page.mako index 460cc6d6..17d87c9a 100644 --- a/tailbone/templates/page.mako +++ b/tailbone/templates/page.mako @@ -1,7 +1,13 @@ ## -*- coding: utf-8; -*- <%inherit file="/base.mako" /> -<%def name="context_menu_items()"> +<%def name="context_menu_items()"> + % if context_menu_list_items is not Undefined: + % for item in context_menu_list_items: +
  • ${item}
  • + % endfor + % endif + <%def name="page_content()"> diff --git a/tailbone/templates/trainwreck/transactions/index.mako b/tailbone/templates/trainwreck/transactions/index.mako deleted file mode 100644 index 31d956fc..00000000 --- a/tailbone/templates/trainwreck/transactions/index.mako +++ /dev/null @@ -1,12 +0,0 @@ -## -*- coding: utf-8; -*- -<%inherit file="/master/index.mako" /> - -<%def name="context_menu_items()"> - ${parent.context_menu_items()} - % if master.has_perm('rollover'): -
  • ${h.link_to("Yearly Rollover", url('{}.rollover'.format(route_prefix)))}
  • - % endif - - - -${parent.body()} diff --git a/tailbone/templates/users/view.mako b/tailbone/templates/users/view.mako index 94931e52..ed2b5f16 100644 --- a/tailbone/templates/users/view.mako +++ b/tailbone/templates/users/view.mako @@ -14,13 +14,6 @@ % endif -<%def name="context_menu_items()"> - ${parent.context_menu_items()} - % if master.has_perm('preferences'): -
  • ${h.link_to("Edit User Preferences", action_url('preferences', instance))}
  • - % endif - - <%def name="render_this_page()"> ${parent.render_this_page()} diff --git a/tailbone/views/datasync.py b/tailbone/views/datasync.py index b734325f..7616d288 100644 --- a/tailbone/views/datasync.py +++ b/tailbone/views/datasync.py @@ -34,6 +34,8 @@ from rattail.db.model import DataSyncChange from rattail.datasync.util import purge_datasync_settings from rattail.util import simple_error +from webhelpers2.html import tags + from tailbone.views import MasterView from tailbone.util import raw_datetime from tailbone.config import should_expose_websockets @@ -75,6 +77,16 @@ class DataSyncThreadView(MasterView): app = self.get_rattail_app() self.datasync_handler = app.get_datasync_handler() + def get_context_menu_items(self, thread=None): + items = super().get_context_menu_items(thread) + + # nb. just one view here, no need to check if listing etc. + if self.request.has_perm('datasync_changes.list'): + url = self.request.route_url('datasyncchanges') + items.append(tags.link_to("View DataSync Changes", url)) + + return items + def status(self): """ View to list/filter/sort the model data. @@ -389,6 +401,17 @@ class DataSyncChangeView(MasterView): 'consumer', ] + def get_context_menu_items(self, change=None): + items = super().get_context_menu_items(change) + + if self.listing: + + if self.request.has_perm('datasync.status'): + url = self.request.route_url('datasync.status') + items.append(tags.link_to("View DataSync Status", url)) + + return items + def configure_grid(self, g): super().configure_grid(g) diff --git a/tailbone/views/master.py b/tailbone/views/master.py index cc6e25ea..48bc32fe 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -2807,6 +2807,13 @@ class MasterView(View): kwargs['db_picker_options'] = [tags.Option(k, value=k) for k in engines] kwargs['db_picker_selected'] = selected + # context menu + obj = kwargs.get('instance') + items = self.get_context_menu_items(obj) + for supp in self.iter_view_supplements(): + items.extend(supp.get_context_menu_items(obj) or []) + kwargs['context_menu_list_items'] = items + # add info for downloadable input file templates, if any if self.has_input_file_templates: templates = self.normalize_input_file_templates() @@ -2914,6 +2921,35 @@ class MasterView(View): kwargs['xref_links'] = self.get_xref_links(obj) return kwargs + def get_context_menu_items(self, obj=None): + items = [] + route_prefix = self.get_route_prefix() + + if self.listing: + + if self.results_downloadable_csv and self.has_perm('results_csv'): + url = self.request.route_url(f'{route_prefix}.results_csv') + items.append(tags.link_to("Download results as CSV", url)) + + if self.results_downloadable_xlsx and self.has_perm('results_xlsx'): + url = self.request.route_url(f'{route_prefix}.results_xlsx') + items.append(tags.link_to("Download results as XLSX", url)) + + if self.has_input_file_templates and self.has_perm('create'): + templates = self.normalize_input_file_templates() + for template in templates: + items.append(tags.link_to(f"Download {template['label']} Template", + template['effective_url'])) + + # if self.viewing: + + # # # TODO: either make this configurable, or just lose it. + # # # nobody seems to ever find it useful in practice. + # # url = self.get_action_url('view', instance) + # # items.append(tags.link_to(f"Permalink for this {model_title}", url)) + + return items + def get_xref_buttons(self, obj): buttons = [] for supp in self.iter_view_supplements(): @@ -5914,6 +5950,9 @@ class ViewSupplement(object): def get_xref_links(self, obj): return [] + def get_context_menu_items(self, obj): + return [] + def get_version_child_classes(self): """ Return a list of additional "version child classes" which are diff --git a/tailbone/views/trainwreck/base.py b/tailbone/views/trainwreck/base.py index 1e273c87..59a42301 100644 --- a/tailbone/views/trainwreck/base.py +++ b/tailbone/views/trainwreck/base.py @@ -164,6 +164,18 @@ class TransactionView(MasterView): return TrainwreckSession() + def get_context_menu_items(self, txn=None): + items = super().get_context_menu_items(txn) + route_prefix = self.get_route_prefix() + + if self.listing: + + if self.has_perm('rollover'): + url = self.request.route_url(f'{route_prefix}.rollover') + items.append(tags.link_to("Yearly Rollover", url)) + + return items + def configure_grid(self, g): super().configure_grid(g) app = self.get_rattail_app() diff --git a/tailbone/views/users.py b/tailbone/views/users.py index 0f844bfb..dd3f7f7b 100644 --- a/tailbone/views/users.py +++ b/tailbone/views/users.py @@ -92,6 +92,17 @@ class UserView(PrincipalMasterView): self.auth_handler = app.get_auth_handler() self.merge_handler = self.auth_handler + def get_context_menu_items(self, user=None): + items = super().get_context_menu_items(user) + + if self.viewing: + + if self.has_perm('preferences'): + url = self.get_action_url('preferences', user) + items.append(tags.link_to("Edit User Preferences", url)) + + return items + def query(self, session): query = super().query(session) model = self.model From 3dc8deef670085d829c67a8d86610a42a4c8b18b Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sun, 2 Jun 2024 15:58:10 -0500 Subject: [PATCH 002/236] Fix panel style for PO vs. Invoice breakdown in receiving batch --- tailbone/templates/receiving/view.mako | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tailbone/templates/receiving/view.mako b/tailbone/templates/receiving/view.mako index 80c45103..5f103d7f 100644 --- a/tailbone/templates/receiving/view.mako +++ b/tailbone/templates/receiving/view.mako @@ -27,12 +27,14 @@ <%def name="render_po_vs_invoice_helper()"> % if master.handler.has_purchase_order(batch) and master.handler.has_invoice_file(batch): -
    -

    PO vs. Invoice

    -
    - ${po_vs_invoice_breakdown_grid} +
    + % endif From 58f95882619b3ba2912666c1d402f4d3d325c32a Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sun, 2 Jun 2024 19:56:42 -0500 Subject: [PATCH 003/236] Fix the "new custorder" page for butterball reasonably confident this one is complete, and didn't break buefy theme.. --- tailbone/templates/custorders/create.mako | 764 +++++++++++------- tailbone/templates/products/lookup.mako | 97 ++- .../themes/butterball/buefy-components.mako | 36 + .../themes/butterball/field-components.mako | 9 +- 4 files changed, 559 insertions(+), 347 deletions(-) diff --git a/tailbone/templates/custorders/create.mako b/tailbone/templates/custorders/create.mako index 6b07571e..9a3a2d57 100644 --- a/tailbone/templates/custorders/create.mako +++ b/tailbone/templates/custorders/create.mako @@ -56,12 +56,19 @@ ${self.order_form_buttons()} - + <${b}-collapse class="panel" + :class="customerPanelType" + % if request.use_oruga: + v-model:open="customerPanelOpen" + % else: + :open.sync="customerPanelOpen" + % endif + >