From 024f324027a4938d6d70beaa7efc7478bbdabfc1 Mon Sep 17 00:00:00 2001 From: David Cook Date: Wed, 7 Feb 2024 14:15:36 +1100 Subject: [PATCH] Refactor: move rows to partials This file was too big and it's about to get bigger. --- .../admin/products_v3/_product_row.html.haml | 35 +++++++++ app/views/admin/products_v3/_table.html.haml | 78 +------------------ .../admin/products_v3/_variant_row.html.haml | 41 ++++++++++ 3 files changed, 78 insertions(+), 76 deletions(-) create mode 100644 app/views/admin/products_v3/_product_row.html.haml create mode 100644 app/views/admin/products_v3/_variant_row.html.haml diff --git a/app/views/admin/products_v3/_product_row.html.haml b/app/views/admin/products_v3/_product_row.html.haml new file mode 100644 index 0000000000..3e6f5f6bb7 --- /dev/null +++ b/app/views/admin/products_v3/_product_row.html.haml @@ -0,0 +1,35 @@ +%td.with-image + %a.image-field{ href: admin_product_images_path(product), data: { controller: "modal", reflex: "click->products#edit_image", "current-id": product.id} } + = image_tag product.image&.url(:mini) || Spree::Image.default_image_url(:mini), width: 40, height: 40 + .button.secondary.mini= t('admin.products_page.image.edit') +%td.field.align-left.header + = f.hidden_field :id + = f.text_field :name, 'aria-label': t('admin.products_page.columns.name') + = error_message_on product, :name +%td.field + = f.text_field :sku, 'aria-label': t('admin.products_page.columns.sku') + = error_message_on product, :sku +%td.align-right + .content + = product.variant_unit.upcase_first + / TODO: properly handle custom unit names + = WeightsAndMeasures::UNITS[product.variant_unit] && "(" + WeightsAndMeasures::UNITS[product.variant_unit][product.variant_unit_scale]["name"] + ")" +%td.align-right + -# empty +%td.align-right + -# empty +%td.align-left + .content= product.supplier&.name +%td.align-left + .content= product.primary_taxon&.name +%td.align-left +%td.align-left + .content= product.inherits_properties ? 'YES' : 'NO' #TODO: consider using https://github.com/RST-J/human_attribute_values, else use I18n.t (also below) +%td.align-right + = render(VerticalEllipsisMenu::Component.new) do + = link_to t('admin.products_page.actions.edit'), edit_admin_product_path(product) + = link_to t('admin.products_page.actions.clone'), clone_admin_product_path(product) + %a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open", + "data-modal-link-target-value": "product-delete-modal", "class": "delete", + "data-modal-link-modal-dataset-value": {'data-current-id': product.id}.to_json } + = t('admin.products_page.actions.delete') diff --git a/app/views/admin/products_v3/_table.html.haml b/app/views/admin/products_v3/_table.html.haml index 73b89847d4..edf761c21e 100644 --- a/app/views/admin/products_v3/_table.html.haml +++ b/app/views/admin/products_v3/_table.html.haml @@ -48,83 +48,9 @@ = form.fields_for("products", product, index: product_index) do |product_form| %tbody.relaxed{ 'data-record-id': product_form.object.id } %tr - %td.with-image - %a.image-field{ href: admin_product_images_path(product), data: { controller: "modal", reflex: "click->products#edit_image", "current-id": product.id} } - = image_tag product.image&.url(:mini) || Spree::Image.default_image_url(:mini), width: 40, height: 40 - .button.secondary.mini= t('admin.products_page.image.edit') - %td.field.align-left.header - = product_form.hidden_field :id - = product_form.text_field :name, 'aria-label': t('admin.products_page.columns.name') - = error_message_on product, :name - %td.field - = product_form.text_field :sku, 'aria-label': t('admin.products_page.columns.sku') - = error_message_on product, :sku - %td.align-right - .content - = product.variant_unit.upcase_first - / TODO: properly handle custom unit names - = WeightsAndMeasures::UNITS[product.variant_unit] && "(" + WeightsAndMeasures::UNITS[product.variant_unit][product.variant_unit_scale]["name"] + ")" - %td.align-right - -# empty - %td.align-right - -# empty - %td.align-left - .content= product.supplier&.name - %td.align-left - .content= product.primary_taxon&.name - %td.align-left - %td.align-left - .content= product.inherits_properties ? 'YES' : 'NO' #TODO: consider using https://github.com/RST-J/human_attribute_values, else use I18n.t (also below) - %td.align-right - = render(VerticalEllipsisMenu::Component.new) do - = link_to t('admin.products_page.actions.edit'), edit_admin_product_path(product) - = link_to t('admin.products_page.actions.clone'), clone_admin_product_path(product) - %a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open", - "data-modal-link-target-value": "product-delete-modal", "class": "delete", - "data-modal-link-modal-dataset-value": {'data-current-id': product.id}.to_json } - = t('admin.products_page.actions.delete') + = render partial: 'product_row', locals: { product:, f: product_form } - product.variants.each_with_index do |variant, variant_index| = form.fields_for("products][#{product_index}][variants_attributes][", variant, variant_index:) do |variant_form| %tr.condensed - %td - -# empty - %td.field - = variant_form.hidden_field :id - = variant_form.text_field :display_name, 'aria-label': t('admin.products_page.columns.name'), placeholder: product.name - = error_message_on variant, :display_name - %td.field - = variant_form.text_field :sku, 'aria-label': t('admin.products_page.columns.sku') - = error_message_on variant, :sku - %td.align-right - .content= variant.unit_to_display - %td.field - = variant_form.text_field :price, 'aria-label': t('admin.products_page.columns.price'), value: number_to_currency(variant.price, unit: '')&.strip # TODO: add a spec to prove that this formatting is necessary. If so, it should be in a shared form helper for currency inputs - = error_message_on variant, :price - %td.field.on-hand__wrapper{'data-controller': "popout"} - %button.on-hand__button{'data-popout-target': "button", 'aria-label': t('admin.products_page.columns.on_hand')} - = variant.on_demand ? t(:on_demand) : variant.on_hand - %div.on-hand__popout{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" } - .field - = variant_form.number_field :on_hand, min: 0, 'aria-label': t('admin.products_page.columns.on_hand'), 'data-toggle-control-target': 'control', disabled: variant_form.object.on_demand - = error_message_on variant, :on_hand - .field.checkbox - = variant_form.label :on_demand do - = variant_form.check_box :on_demand, 'data-action': 'change->toggle-control#disableIfPresent change->popout#closeIfChecked' - = t(:on_demand) - %td.align-left - .content= variant.product.supplier&.name # same as product - %td.align-left - -# empty - %td.align-left - .content= variant.tax_category&.name || "None" # TODO: convert to dropdown, else translate hardcoded string. - %td.align-left - -# empty - %td.align-right - = render(VerticalEllipsisMenu::Component.new) do - = link_to t('admin.products_page.actions.edit'), edit_admin_product_variant_path(product, variant) - - if product.variants.size > 1 - %a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open", - "data-modal-link-target-value": "variant-delete-modal", "class": "delete", - "data-modal-link-modal-dataset-value": {'data-current-id': variant.id}.to_json } - = t('admin.products_page.actions.delete') + = render partial: 'variant_row', locals: { variant:, f: variant_form } diff --git a/app/views/admin/products_v3/_variant_row.html.haml b/app/views/admin/products_v3/_variant_row.html.haml new file mode 100644 index 0000000000..bd839a4e56 --- /dev/null +++ b/app/views/admin/products_v3/_variant_row.html.haml @@ -0,0 +1,41 @@ +%td + -# empty +%td.field + = f.hidden_field :id + = f.text_field :display_name, 'aria-label': t('admin.products_page.columns.name'), placeholder: variant.product.name + = error_message_on variant, :display_name +%td.field + = f.text_field :sku, 'aria-label': t('admin.products_page.columns.sku') + = error_message_on variant, :sku +%td.align-right + .content= variant.unit_to_display +%td.field + = f.text_field :price, 'aria-label': t('admin.products_page.columns.price'), value: number_to_currency(variant.price, unit: '')&.strip # TODO: add a spec to prove that this formatting is necessary. If so, it should be in a shared form helper for currency inputs + = error_message_on variant, :price +%td.field.on-hand__wrapper{'data-controller': "popout"} + %button.on-hand__button{'data-popout-target': "button", 'aria-label': t('admin.products_page.columns.on_hand')} + = variant.on_demand ? t(:on_demand) : variant.on_hand + %div.on-hand__popout{ style: 'display: none;', 'data-controller': 'toggle-control', 'data-popout-target': "dialog" } + .field + = f.number_field :on_hand, min: 0, 'aria-label': t('admin.products_page.columns.on_hand'), 'data-toggle-control-target': 'control', disabled: f.object.on_demand + = error_message_on variant, :on_hand + .field.checkbox + = f.label :on_demand do + = f.check_box :on_demand, 'data-action': 'change->toggle-control#disableIfPresent change->popout#closeIfChecked' + = t(:on_demand) +%td.align-left + .content= variant.product.supplier&.name # same as product +%td.align-left + -# empty +%td.align-left + .content= variant.tax_category&.name || "None" # TODO: convert to dropdown, else translate hardcoded string. +%td.align-left + -# empty +%td.align-right + = render(VerticalEllipsisMenu::Component.new) do + = link_to t('admin.products_page.actions.edit'), edit_admin_product_variant_path(variant.product, variant) + - if variant.product.variants.size > 1 + %a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open", + "data-modal-link-target-value": "variant-delete-modal", "class": "delete", + "data-modal-link-modal-dataset-value": {'data-current-id': variant.id}.to_json } + = t('admin.products_page.actions.delete')