Module: Spree::Admin::PublishingHelper

Defined in:
app/helpers/spree/admin/publishing_helper.rb

Overview

Helpers for the product Publishing card in the Rails admin. Mirrors the SPA’s publishing card (see packages/dashboard/src/components/spree/products/publishing-card.tsx): per-channel status is gated by product status — Draft/Archived products render every publication as not_available regardless of window.

Instance Method Summary collapse

Instance Method Details

#publication_caption(product_status, publication, store) ⇒ Object

One-line summary of the publication window in the store’s timezone.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'app/helpers/spree/admin/publishing_helper.rb', line 42

def publication_caption(product_status, publication, store)
  status = publication_schedule_status(product_status, publication)
  tz = ActiveSupport::TimeZone[store.preferred_timezone] || Time.zone

  case status
  when :not_available
    Spree.t('admin.publishing.caption_not_available',
            product_status: Spree.t("admin.products.status_options.#{product_status}", default: product_status.to_s.humanize))
  when :hidden
    Spree.t('admin.publishing.caption_unpublished',
            date: l(publication.unpublished_at.in_time_zone(tz), format: :short))
  when :scheduled
    if publication.unpublished_at
      Spree.t('admin.publishing.caption_window',
              start: l(publication.published_at.in_time_zone(tz), format: :short),
              end:   l(publication.unpublished_at.in_time_zone(tz), format: :short))
    else
      Spree.t('admin.publishing.caption_scheduled',
              date: l(publication.published_at.in_time_zone(tz), format: :short))
    end
  else # :live
    if publication.unpublished_at
      Spree.t('admin.publishing.caption_hidden_after',
              date: l(publication.unpublished_at.in_time_zone(tz), format: :short))
    else
      Spree.t('admin.publishing.caption_live')
    end
  end
end

#publication_schedule_status(product_status, publication) ⇒ Symbol

Returns one of :live, :scheduled, :hidden, :not_available.

Parameters:

  • product_status (String)

    the product’s status (draft/active/archived)

  • publication (Spree::ProductPublication)

Returns:

  • (Symbol)

    one of :live, :scheduled, :hidden, :not_available



13
14
15
16
17
18
19
20
21
# File 'app/helpers/spree/admin/publishing_helper.rb', line 13

def publication_schedule_status(product_status, publication)
  return :not_available unless product_status == 'active'

  now = Time.current
  return :hidden if publication.unpublished_at && publication.unpublished_at <= now
  return :scheduled if publication.published_at && publication.published_at > now

  :live
end

#publication_status_badge(product_status, publication) ⇒ Object

Renders a colored dot + status label for a publication row.



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'app/helpers/spree/admin/publishing_helper.rb', line 24

def publication_status_badge(product_status, publication)
  status = publication_schedule_status(product_status, publication)
  dot_class = case status
              when :live then 'bg-success'
              when :scheduled then 'bg-warning'
              else 'bg-secondary'
              end

  label = Spree.t("admin.publishing.status_#{status}")

  (:span, class: 'd-inline-flex align-items-center gap-1 text-muted small') do
    (:span, '', class: "publication-dot rounded-circle #{dot_class}",
                           style: 'display:inline-block; width:0.5rem; height:0.5rem;') +
      (:span, label)
  end
end