Skip to content

Commit

Permalink
Merge pull request #5513 from solidusio/elia/admin/order-adjustments
Browse files Browse the repository at this point in the history
[admin] Order adjustments
  • Loading branch information
elia authored Jan 11, 2024
2 parents bb39b3f + 941f420 commit 12d7504
Show file tree
Hide file tree
Showing 15 changed files with 417 additions and 55 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
# frozen_string_literal: true

class SolidusAdmin::Orders::Show::Adjustments::Index::Component < SolidusAdmin::UI::Pages::Index::Component
def model_class
Spree::Adjustment
end

def back_url
solidus_admin.order_path(@order)
end

def title
t(".title", number: @order.number)
end

NBSP = "&nbsp;".html_safe

def initialize(order:, adjustments:)
@order = order
@adjustments = adjustments
@page = GearedPagination::Recordset.new(adjustments, per_page: adjustments.size).page(1)
end

def batch_actions
[
{
label: t(".actions.lock"),
action: solidus_admin.lock_order_adjustments_path(@order),
method: :put,
icon: "lock-line"
},
{
label: t(".actions.unlock"),
action: solidus_admin.unlock_order_adjustments_path(@order),
method: :put,
icon: "lock-unlock-line"
},
{
label: t(".actions.delete"),
action: spree.admin_order_adjustment_path(@order, '[]'),
method: :delete,
icon: "delete-bin-7-line"
},
]
end

def search_key
:label_cont
end

def search_url
solidus_admin.order_adjustments_path(@order)
end

def columns
[
{
header: :state,
wrap: true,
col: { class: 'w-[calc(5rem+2rem+2.5rem+1px)]' },
data: ->(adjustment) {
if adjustment.finalized?
icon = 'lock-fill'
title = t(".state.locked")
else
icon = 'lock-unlock-line'
title = t(".state.unlocked")
end
icon_tag(icon, class: "w-5 h-5 align-middle") + tag.span(title)
}
},
{
header: :adjustable,
col: { class: 'w-56' },
data: ->(adjustment) {
tag.figure(safe_join([
render(component("ui/thumbnail").for(adjustment.adjustable, class: "basis-10")),
figcaption_for_adjustable(adjustment),
]), class: "flex items-center gap-2")
}
},
{
header: :source,
col: { class: "w-56" },
data: ->(adjustment) {
tag.figure(safe_join([
figcaption_for_source(adjustment),
]), class: "flex items-center gap-2")
}
},
{
header: :amount,
col: { class: 'w-24' },
data: ->(adjustment) { tag.span adjustment.display_amount.to_html, class: "grow text-right whitespace-nowrap" }
},
{
header: tag.span(t(".actions.title"), class: 'sr-only'),
col: { class: 'w-24' },
wrap: false,
data: ->(adjustment) do
actions = []

unless adjustment.source
actions << link_to(
t(".actions.edit"),
spree.edit_admin_order_adjustment_path(@order, adjustment),
class: 'body-link',
)
end

if adjustment.finalized?
actions << link_to(
t(".actions.unlock"),
solidus_admin.unlock_order_adjustments_path(@order, id: adjustment),
"data-turbo-method": :put,
"data-turbo-confirm": t('.confirm'),
class: 'body-link',
)
else
actions << link_to(
t(".actions.lock"),
solidus_admin.lock_order_adjustments_path(@order, id: adjustment),
"data-turbo-method": :put,
"data-turbo-confirm": t('.confirm'),
class: 'body-link',
)
actions << link_to(
t(".actions.delete"),
spree.admin_order_adjustment_path(@order, adjustment),
"data-turbo-method": :delete,
"data-turbo-confirm": t('.confirm'),
class: 'body-link !text-red-500',
)
end

render component('ui/dropdown').new(
direction: :right,
class: 'relative w-fit m-auto',
).with_content(safe_join(actions))
end
},
]
end

def icon_thumbnail(name)
render component("ui/thumbnail").new(src: svg_data_uri(icon_tag(name)))
end

def svg_data_uri(data)
"data:image/svg+xml;base64,#{Base64.strict_encode64(data)}"
end

def figcaption_for_source(adjustment)
return thumbnail_caption(adjustment.label, nil) unless adjustment.source_type

# ["Spree::PromotionAction", nil, "Spree::UnitCancel", "Spree::TaxRate"]
record = adjustment.source
record_class = adjustment.source_type&.constantize
model_name = record_class.model_name.human

case record || record_class
when Spree::TaxRate
detail = link_to("#{model_name}: #{record.zone&.name || t('spree.all_zones')}", spree.edit_admin_tax_rate_path(adjustment.source_id), class: "body-link")
when Spree::PromotionAction
detail = link_to("#{model_name}: #{record.promotion.name}", spree.edit_admin_promotion_path(adjustment.source_id), class: "body-link")
else
detail = "#{model_name}: #{record.display_amount}" if record.respond_to?(:display_amount)
end

thumbnail_caption(adjustment.label, detail)
end

def figcaption_for_adjustable(adjustment)
# ["Spree::LineItem", "Spree::Order", "Spree::Shipment"]
record = adjustment.adjustable
record_class = adjustment.adjustable_type&.constantize

case record || record_class
when Spree::LineItem
variant = record.variant
options_text = variant.options_text.presence

description = options_text || variant.sku
detail = link_to(variant.product.name, solidus_admin.product_path(record.variant.product), class: "body-link")
when Spree::Order
description = "#{Spree::Order.model_name.human} ##{record.number}"
detail = record.display_total
when Spree::Shipment
description = "#{t('spree.shipment')} ##{record.number}"
detail = link_to(record.shipping_method.name, spree.edit_admin_shipping_method_path(record.shipping_method), class: "body-link")
when nil
# noop
else
name_method = [:display_name, :name, :number].find { record.respond_to? _1 } if record
price_method = [:display_amount, :display_total, :display_cost].find { record.respond_to? _1 } if record

description = record_class.model_name.human
description = "#{description} - #{record.public_send(name_method)}" if name_method

# attempt creating a link
url_options = [:admin, record, :edit, { only_path: true }]
url = begin; spree.url_for(url_options); rescue NoMethodError => e; logger.error(e.to_s); nil end

description = link_to(description, url, class: "body-link") if url
detail = record.public_send(price_method) if price_method
end

thumbnail_caption(description, detail)
end

def thumbnail_caption(first_line, second_line)
tag.figcaption(safe_join([
tag.div(first_line || NBSP, class: 'text-black body-small whitespace-nowrap text-ellipsis overflow-hidden'),
tag.div(second_line || NBSP, class: 'text-gray-500 body-small whitespace-nowrap text-ellipsis overflow-hidden')
]), class: "flex flex-col gap-0 max-w-[15rem]")
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
en:
title: "Order %{number} / Adjustments"
save: "Save"
discard: "Discard"
none: ""

actions:
title: "Actions"
delete: "Delete"
lock: "Lock"
unlock: "Unlock"
edit: "Edit"

state:
locked: "Locked"
unlocked: "Unlocked"
confirm: "Are you sure?"

totals:
adjustable: "Totals (by Adjustable)"
source: "Totals (by Source)"
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
{ label: t('.taxes'), value: number_to_currency(@order.additional_tax_total) },
{ label: t('.shipping'), value: number_to_currency(@order.shipment_total) },
{ label: link_to(t('.add_promo_code'), '#', class: "body-link"), value: number_to_currency(@order.promo_total) },
{ label: link_to(t('.adjustments'), '#', class: "body-link"), value: number_to_currency(@order.adjustment_total) },
{ label: link_to(t('.adjustments'), solidus_admin.order_adjustments_path(@order), class: "body-link"), value: number_to_currency(@order.adjustment_total) },
{ label: t('.total'), value: number_to_currency(@order.total), class: 'font-semibold' }
]
) %>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<%= page do %>
<% if @tabs %>
<%= page_header do %>
<%= page_header_title title %>
<%= render_title %>
<% end %>

<%= page_header do %>
Expand All @@ -18,13 +18,23 @@

<% else %>
<%= page_header do %>
<%= page_header_title title %>
<%= render_title %>

<%= page_header_actions do %>
<%= page_actions %>
<% end %>
<% end %>
<% end %>

<%= render_table %>
<%= page_with_sidebar do %>
<%= page_with_sidebar_main do %>
<%= render_table %>
<% end %>

<% if sidebar %>
<%= page_with_sidebar_aside do %>
<%= sidebar %>
<% end %>
<% end %>
<% end %>
<% end %>
68 changes: 25 additions & 43 deletions admin/app/components/solidus_admin/ui/pages/index/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,20 @@ class SolidusAdmin::UI::Pages::Index::Component < SolidusAdmin::BaseComponent

Tab = Struct.new(:text, :href, :current, keyword_init: true)

def tabs
nil
end
# Template methods
def tabs; end
def model_class; end
def back_url; end
def search_key; end
def search_url; end
def page_actions; end
def sidebar; end
def sortable_options; end
def row_url(_record); end
def batch_actions; []; end
def scopes; []; end
def filters; []; end
def columns; []; end

def initialize(page:)
@page = page
Expand All @@ -18,18 +29,10 @@ def row_fade(_record)
false
end

def model_class
nil
end

def title
model_class.model_name.human.pluralize
end

def search_key
nil
end

def search_params
params[:q]
end
Expand All @@ -38,38 +41,10 @@ def search_name
:q
end

def search_url
nil
end

def table_id
stimulus_id
end

def rows
@page.records
end

def row_url(_record)
nil
end

def batch_actions
[]
end

def scopes
[]
end

def filters
[]
end

def columns
[]
end

def prev_page_path
solidus_admin.url_for(**request.params, page: @page.number - 1, only_path: true) unless @page.first?
end
Expand All @@ -91,8 +66,13 @@ def search_options
}
end

def sortable_options
nil
def render_title
back_url = self.back_url

safe_join [
(page_header_back back_url if back_url),
page_header_title(title),
]
end

def render_table
Expand All @@ -113,7 +93,9 @@ def render_table
)
end

def page_actions
nil
def render_sidebar
sidebar = self.sidebar

page_with_sidebar_aside { sidebar } if sidebar
end
end
Loading

0 comments on commit 12d7504

Please sign in to comment.