Skip to content

Commit

Permalink
elia/admin/order-adjustments: [wip]
Browse files Browse the repository at this point in the history
  • Loading branch information
elia committed Nov 16, 2023
1 parent 2b5d29b commit 6b7e4e5
Show file tree
Hide file tree
Showing 15 changed files with 277 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@

<%= render component("ui/forms/checkbox").new(
name: "#{form.object_name}[#{use_attribute}]",
checked: form.object.send("#{@type}_address").new_record? || form.object.bill_address == form.object.ship_address,
checked: @address == (@type == 'ship' ? @order.bill_address : @order.ship_address),
value: '1'
) %>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ def initialize(order:, address:, user: nil, type: 'ship')
@order = order
@user = user
@address = address
@addresses = user&.addresses.to_a.reject(&:new_record?)
@type = validate_address_type(type)
end

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<%= page do %>
<%= page_header do %>
<%= page_header_back(solidus_admin.order_path(@order)) %>
<%= page_header_title(t(".title", number: @order.number)) %>
<%= page_header_actions do %>
<%= render component("ui/button").new(
tag: :button,
scheme: :secondary,
text: t(".discard"),
form: form_id
) %>
<%= render component("ui/button").new(tag: :button, text: t(".save"), form: form_id) %>
<% end %>
<% end %>

<%= page_with_sidebar do %>
<%= page_with_sidebar_main do %>
<%= render component("ui/table").new(
id: "order-adjustments-list",
model_class: Spree::Adjustment,
rows: @adjustments,
search_key: :label_cont,
search_url: solidus_admin.order_adjustments_path(@order),
batch_actions: [
{
display_name: t(".batch_actions.delete"),
action: spree.admin_order_adjustment_path(@order, '[]'),
method: :delete,
icon: "delete-bin-7-line"
},
{
display_name: t(".batch_actions.edit"),
action: spree.edit_admin_order_adjustment_path(@order, '[]'),
method: :put,
icon: "edit-line"
},
],
filters: [],
columns: [
{
header: :adjustable_type,
data: -> { _1.adjustable_type.constantize.model_name.human }
},
{
header: :adjustable,
data: ->(adjustment) do
adjustable = adjustment.adjustable

case adjustable
when Spree::LineItem
safe_join(
[
render(component("ui/thumbnail").for_variant(adjustable.variant)),
tag.span(
adjustable.variant.options_text.presence ||
adjustable.variant.sku,
class: "ml-2"
),
tag.span(adjustable.quantity, class: "ml-2 text-sm text-gray-500")
]
)
when Spree::Shipment
adjustable.inspect
when Spree::Order
adjustable.number
when Spree::TaxRate
adjustable.inspect
end
end
},
{ header: :label, data: ->(adjustment) { adjustment.label } },
{
header: :amount,
data: ->(adjustment) { tag.span adjustment.display_amount.to_html }
},
{
header: :state,
data: ->(adjustment) do
icon = adjustment.finalized? ? "lock-line" : "lock-unlock-line"
icon_tag(icon, class: "w-6 h-6")
end
},
{
header: '',
data: ->(adjustment) do
tag.div(class: "relative") do
render component('ui/dropdown').new(size: :s, direction: :right, "data-action": "click:stop->#{stimulus_id}#noop").with_content(safe_join([
link_to('edit', spree.edit_admin_order_adjustment_path(@order, adjustment)),
button_to('delete', spree.admin_order_adjustment_path(@order, adjustment), method: :delete, class: "text-left"),
]))
end
end
},
]
) %>
<% end %>

<%= page_with_sidebar_aside do %>
<%= render component('ui/panel').new(title: "Summary") do %>
<% end %>
<% end %>
<% end %>

<% end %>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { Controller } from '@hotwired/stimulus'

export default class extends Controller {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# frozen_string_literal: true

class SolidusAdmin::Orders::Show::Adjustments::Index::Component < SolidusAdmin::BaseComponent
include SolidusAdmin::Layout::PageHelpers

def initialize(order:, adjustments:)
@order = order
@adjustments = adjustments
end

def form_id
@form_id ||= "#{stimulus_id}--form-#{@order.id}"
end

end
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
en:
title: "Order %{number} / Adjustments"
save: "Save"
discard: "Discard"
batch_actions:
delete: "Delete selected adjustments"
edit: "Edit selected adjustments"
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,10 @@
<% @rows.each do |row| %>
<tr
class="border-b border-gray-100 last:border-0 hover:bg-gray-50 cursor-pointer <%= 'bg-gray-15 text-gray-700' if @row_fade&.call(row) %>"
data-action="click-><%= stimulus_id %>#rowClicked"
data-primary-url="<%= @row_url&.call(row) %>"
<% if @row_url %>
data-action="click-><%= stimulus_id %>#rowClicked"
data-primary-url="<%= @row_url.call(row) %>"
<% end %>
>
<% @columns.each do |column| %>
<%= render_data_cell(column.data, row) %>
Expand Down
9 changes: 2 additions & 7 deletions admin/app/components/solidus_admin/ui/table/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ export default class extends Controller {
if (this.modeValue === 'batch') {
this.toggleCheckbox(row)
} else {
this.navigateToRow(row)
const url = row.dataset.primaryUrl
if (url) window.location.href = url
}
}

Expand All @@ -104,12 +105,6 @@ export default class extends Controller {
}
}

navigateToRow(row) {
const url = row.dataset.primaryUrl

if (url) window.location.href = url
}

render() {
const selectedRows = this.checkboxTargets.filter((checkbox) => checkbox.checked)

Expand Down
7 changes: 7 additions & 0 deletions admin/app/components/solidus_admin/ui/thumbnail/component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,11 @@ def call
"
)
end

def self.for_variant(variant)
new(
src: variant.images.first&.attachment&.url(:small),
alt: variant.name,
)
end
end
28 changes: 10 additions & 18 deletions admin/app/controllers/solidus_admin/addresses_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,16 @@ module SolidusAdmin
class AddressesController < BaseController
include Spree::Core::ControllerHelpers::StrongParameters

before_action :load_order
before_action :load_order, :load_address
before_action :validate_address_type

def show
address = find_address || build_new_address

respond_to do |format|
format.html do
render component('orders/show/address').new(
order: @order,
user: @order.user,
address: address,
address: @address,
type: address_type,
)
end
Expand All @@ -39,28 +37,22 @@ def update
user: @order.user,
address: @order.send("#{address_type}_address"),
type: address_type,
status: :unprocessable_entity,
)
), status: :unprocessable_entity
end
end
end
end

private

def find_address
def load_address
if params[:address_id].present? && @order.user
address = @order.user.addresses.find_by(id: params[:address_id])
@order.send("#{address_type}_address=", address) if address
@address = @order.user.addresses.find_by(id: params[:address_id])
else
@order.send("#{address_type}_address")
@address = @order.send("#{address_type}_address")
end
end

def build_new_address
@order.send("build_#{address_type}_address", country_id: default_country_id).tap do |address|
address.country_id ||= default_country_id if address.country.nil?
end
@address ||= @order.user.addresses.build(country: default_country)
end

def address_type
Expand All @@ -74,10 +66,10 @@ def validate_address_type
end
end

def default_country_id
@default_country_id ||= begin
def default_country
@default_country ||= begin
country = Spree::Country.default
country.id if Spree::Country.available.exists?(id: country.id)
country if Spree::Country.available.exists?(id: country.id)
end
end

Expand Down
24 changes: 24 additions & 0 deletions admin/app/controllers/solidus_admin/adjustments_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true

class SolidusAdmin::AdjustmentsController < SolidusAdmin::BaseController
before_action :load_order

def index
@adjustments = @order.all_adjustments.eligible.order("created_at ASC")

set_page_and_extract_portion_from(@adjustments)

respond_to do |format|
format.html { render component('orders/show/adjustments/index').new(
order: @order,
adjustments: @adjustments,
) }
end
end

private

def load_order
@order = Spree::Order.find_by!(number: params[:order_id])
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

# @component "orders/show/adjustments/index"
class SolidusAdmin::Orders::Show::Adjustments::Index::ComponentPreview < ViewComponent::Preview
include SolidusAdmin::Preview

def overview
render_with_template
end

# @param order text
# @param adjustments text
def playground(order: "order", adjustments: "adjustments")
render component("orders/show/adjustments/index").new(order: order, adjustments: adjustments)
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<div class="mb-8">
<h6 class="text-gray-500 mb-3 mt-0">
Scenario 1
</h6>

<%= render current_component.new(order: "order", adjustments: "adjustments") %>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

require "spec_helper"

RSpec.describe SolidusAdmin::Orders::Show::Adjustments::Index::Component, type: :component do
it "renders the overview preview" do
render_preview(:overview)
end

# it "renders something useful" do
# render_inline(described_class.new(order: "order", adjustments: "adjustments"))
#
# expect(page).to have_text "Hello, components!"
# expect(page).to have_css '.value'
# end
end
Loading

0 comments on commit 6b7e4e5

Please sign in to comment.