spree_cm_commissioner 1.17.0.pre.pre4 → 1.17.0.pre.pre5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +3 -0
  3. data/Gemfile.lock +1 -1
  4. data/app/assets/javascripts/spree_cm_commissioner/backend.js +0 -1
  5. data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +0 -1
  6. data/app/controllers/spree/admin/tenants_controller.rb +0 -8
  7. data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +5 -1
  8. data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +30 -0
  9. data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +0 -4
  10. data/app/models/spree_cm_commissioner/invite_team.rb +1 -1
  11. data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -0
  12. data/app/models/spree_cm_commissioner/vendor_place.rb +1 -1
  13. data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +18 -0
  14. data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +45 -3
  15. data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +4 -1
  16. data/app/views/spree/admin/tenants/_form.html.erb +42 -117
  17. data/config/initializers/spree_permitted_attributes.rb +2 -0
  18. data/config/locales/en.yml +4 -0
  19. data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +5 -0
  20. data/lib/spree_cm_commissioner/version.rb +1 -1
  21. metadata +5 -8
  22. data/app/assets/images/cm-hangmeas-checkout_image.svg +0 -63
  23. data/app/assets/images/cm-hangmeas-failed.svg +0 -56
  24. data/app/assets/images/cm-hangmeas-loader.svg +0 -50
  25. data/app/assets/images/cm-hangmeas-success.svg +0 -51
  26. data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +0 -87
  27. data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +0 -47
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27eaa71cfc36b120e800e8d027a0bac70c7896a47349b57334e9b311f1a8bfa4
4
- data.tar.gz: 3721c925d915dc0e02660abf2abefbc42e62e66ace288f9bc57c0d8adf23b335
3
+ metadata.gz: f6f4154db94f9e09e6e794abe55a03e92db3a0ccde12796251aeb8976d7d45f7
4
+ data.tar.gz: 8289c711a64719b71201051347afadc2b1d97828a231ca49c05068d174dd2488
5
5
  SHA512:
6
- metadata.gz: 764f2f2ea0a5894c6a0110264f497a2d879b23c58951c46cfcbae15bf752b9c63cd7401adb353981d1e4ef7c1e58d0991668397ffda4b7f9ab6431b5bad6403b
7
- data.tar.gz: 8030d23be060aa290f79ed06cb25cf0caa6250aa677b59b9f5410def6269a62f8d7948c3e030618c0906954a5a0e11e5b9fce1a690adc8872115c5ed4c545aa5
6
+ metadata.gz: 8e6795f1cc9679b85d5813d3b1fe1bec813ac8fdf8b82a963278df3a3dd681365e8d28007f935d2fdbd5c38ec8679e05d63430019992655fc4088e75d7328472
7
+ data.tar.gz: 50c89c06021e167b0278abfab0569099e7d42caffdbfe158ad672b45d4463d855e742eb90db023752cfc58a4b99d1f1385e73470017204ba57f46e80add08062
data/.env.example CHANGED
@@ -24,3 +24,6 @@ WAITING_ROOM_DISABLED=no
24
24
  # Vattanac Bank
25
25
  VATTANAC_AES_SECRET_KEY= ""
26
26
  VATTANAC_PUBLIC_KEY=""
27
+
28
+ # Organizer URL
29
+ ORGANIZER_URL=http://127.0.0.1:4000/organizer
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (1.17.0.pre.pre4)
37
+ spree_cm_commissioner (1.17.0.pre.pre5)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
@@ -11,4 +11,3 @@
11
11
  //= require spree_cm_commissioner/selected_field_filter_origin_destination
12
12
  //= require spree_cm_commissioner/location_checkbox_manager
13
13
  //= require spree_cm_commissioner/trip_stop_selection
14
- //= require spree_cm_commissioner/tenant_payment_icon_fields
@@ -3,4 +3,3 @@
3
3
  @import "spree_cm_commissioner/backend/service_calendar";
4
4
  @import "spree_cm_commissioner/backend/guest_qr_code";
5
5
  @import "spree_cm_commissioner/backend/vehicle_seat";
6
- @import "spree_cm_commissioner/backend/tenant_payment_icon_fields";
@@ -1,8 +1,6 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TenantsController < Spree::Admin::ResourceController
4
- before_action :load_vector_icons, only: %i[new edit]
5
-
6
4
  # override
7
5
  def collection
8
6
  params[:q] = {} if params[:q].blank?
@@ -33,12 +31,6 @@ module Spree
33
31
  def collection_url(options = {})
34
32
  admin_tenants_url(options)
35
33
  end
36
-
37
- private
38
-
39
- def load_vector_icons
40
- @vector_icons = SpreeCmCommissioner::VectorIcon.all
41
- end
42
34
  end
43
35
  end
44
36
  end
@@ -93,6 +93,10 @@ module SpreeCmCommissioner
93
93
  context.fail!(message: "User creation failed: #{context.user.errors.full_messages.join(', ')}")
94
94
  end
95
95
 
96
+ def disable_services
97
+ 'bus,ferry'
98
+ end
99
+
96
100
  def construct_data
97
101
  user = context.user
98
102
 
@@ -101,7 +105,7 @@ module SpreeCmCommissioner
101
105
  name: user.full_name,
102
106
  phone: user.phone_number,
103
107
  email: user.email,
104
- webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}"
108
+ webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}&ds=#{CGI.escape(disable_services)}"
105
109
  }
106
110
 
107
111
  json_data = raw_data.to_json
@@ -0,0 +1,30 @@
1
+ module SpreeCmCommissioner
2
+ module EventCheckInFlowable
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ preference :group_check_in_enabled, :boolean, default: true
7
+ preference :individual_check_in_enabled, :boolean, default: true
8
+
9
+ before_validation :validate_at_least_one_check_in_flow_presence
10
+ end
11
+
12
+ def check_in_flows
13
+ flows = []
14
+ flows << 'group' if group_check_in_enabled?
15
+ flows << 'individual' if individual_check_in_enabled?
16
+ flows
17
+ end
18
+
19
+ def group_check_in_enabled? = preferred_group_check_in_enabled
20
+ def individual_check_in_enabled? = preferred_individual_check_in_enabled
21
+
22
+ private
23
+
24
+ def validate_at_least_one_check_in_flow_presence
25
+ return if check_in_flows.any?
26
+
27
+ errors.add(:check_in_flows, 'must have at least one flow selected')
28
+ end
29
+ end
30
+ end
@@ -5,10 +5,6 @@ module SpreeCmCommissioner
5
5
  included do
6
6
  preference :assetlinks, :string, default: ''
7
7
  preference :apple_app_site_association, :string, default: ''
8
- preference :payment_checkout_image, :string, default: ''
9
- preference :payment_failed_image, :string, default: ''
10
- preference :payment_success_image, :string, default: ''
11
- preference :payment_loader, :string, default: ''
12
8
  end
13
9
  end
14
10
  end
@@ -34,7 +34,7 @@ module SpreeCmCommissioner
34
34
  end
35
35
 
36
36
  def invitation_link
37
- "http://#{ENV.fetch('APP_HOST')}/organizer/invite_teams/#{token}?utm_source=email"
37
+ "#{ENV.fetch('ORGANIZER_URL')}/invite_teams/#{token}?utm_source=email"
38
38
  end
39
39
 
40
40
  def url_valid?
@@ -4,6 +4,7 @@ module SpreeCmCommissioner
4
4
  base.include SpreeCmCommissioner::TaxonKind
5
5
  base.include SpreeCmCommissioner::Transit::TaxonBitwise
6
6
  base.include SpreeCmCommissioner::ParticipationTypeBitwise
7
+ base.include SpreeCmCommissioner::EventCheckInFlowable
7
8
 
8
9
  base.preference :background_color, :string
9
10
  base.preference :foreground_color, :string
@@ -7,7 +7,7 @@ module SpreeCmCommissioner
7
7
  belongs_to :place, class_name: 'SpreeCmCommissioner::Place', optional: false
8
8
 
9
9
  validates :place_type, presence: true
10
- validates :position, presence: true, numericality: { only_integer: true, greater_than: 0 }
10
+ validates :place_id, uniqueness: { scope: %i[vendor_id place_type] }
11
11
 
12
12
  accepts_nested_attributes_for :place, allow_destroy: true
13
13
 
@@ -0,0 +1,18 @@
1
+ <!-- insert_before "erb[loud]:contains('field_container :hide_from_nav')" -->
2
+
3
+ <%# Sections don't use video banner, so we hide the form here to avoid confusing admin. %>
4
+
5
+ <%= f.field_container :preferred_group_check_in_enabled, class: ['custom-control', 'custom-checkbox', 'my-4'] do %>
6
+ <%= f.check_box :preferred_group_check_in_enabled, class: 'custom-control-input' %>
7
+ <%= f.label :preferred_group_check_in_enabled, Spree.t(:enable_group_check_in), class: 'custom-control-label' %>
8
+ <%= f.error_message_on :preferred_group_check_in_enabled %>
9
+ <small class="form-text text-muted">
10
+ Enabled by default for most events where users can purchase multiple tickets or use group scanning. For large events (like PSK, ASK, etc.) or invitation-based events, you should disable this to ensure each ticket or invitation is scanned individually.
11
+ </small>
12
+ <% end if @taxon.event? && @taxon.depth == 1 %> %>
13
+
14
+ <%= f.field_container :preferred_individual_check_in_enabled, class: ['custom-control', 'custom-checkbox', 'my-4'] do %>
15
+ <%= f.check_box :preferred_individual_check_in_enabled, class: 'custom-control-input' %>
16
+ <%= f.label :preferred_individual_check_in_enabled, Spree.t(:enable_individual_check_in), class: 'custom-control-label' %>
17
+ <%= f.error_message_on :preferred_individual_check_in_enabled %>
18
+ <% end if @taxon.event? && @taxon.depth == 1 %> %>
@@ -8,20 +8,36 @@ module SpreeCmCommissioner
8
8
 
9
9
  def event_id = params[:event_id]
10
10
 
11
- def call
11
+ def call # rubocop:disable Metrics/PerceivedComplexity
12
12
  return SpreeCmCommissioner::Guest.none if event_id.blank?
13
13
 
14
- if params[:qr_data].present?
14
+ if params[:qr_data].present? && order_qr_data?
15
+ search_by_order_qr
16
+ elsif params[:qr_data].present? && line_item_qr_data?
17
+ search_by_line_item_qr
18
+ elsif params[:qr_data].present? && guest_qr_data?
15
19
  search_by_guest_qr
16
20
  elsif params[:term].present?
17
21
  search_by_term
22
+ elsif params[:ids].present?
23
+ SpreeCmCommissioner::Guest.complete_or_canceled.where(event_id: event_id, id: params[:ids])
18
24
  else
19
- SpreeCmCommissioner::Guest.none
25
+ SpreeCmCommissioner::Guest.complete_or_canceled.where(event_id: event_id)
20
26
  end
21
27
  end
22
28
 
23
29
  private
24
30
 
31
+ def search_by_order_qr
32
+ order = Spree::Order.complete_or_canceled.search_by_qr_data!(params[:qr_data])
33
+ order.guests.where(event_id: event_id)
34
+ end
35
+
36
+ def search_by_line_item_qr
37
+ line_item = Spree::LineItem.complete_or_canceled.search_by_qr_data!(params[:qr_data])
38
+ line_item.guests.where(event_id: event_id)
39
+ end
40
+
25
41
  def search_by_guest_qr
26
42
  SpreeCmCommissioner::Guest.complete_or_canceled.where(
27
43
  token: params[:qr_data],
@@ -29,6 +45,32 @@ module SpreeCmCommissioner
29
45
  )
30
46
  end
31
47
 
48
+ def order_qr_data?
49
+ matches = construct_matches
50
+ matches&.size == 2
51
+ end
52
+
53
+ def line_item_qr_data?
54
+ matches = construct_matches
55
+ matches&.size == 3
56
+ end
57
+
58
+ def guest_qr_data?
59
+ matches = construct_matches
60
+ matches.nil?
61
+ end
62
+
63
+ def construct_matches
64
+ qr_data = params[:qr_data]
65
+ return nil unless qr_data
66
+
67
+ if qr_data =~ /-L\d+$/
68
+ qr_data.match(/(R\d+)-([A-Za-z0-9_\-]+)-(L\d+)/)&.captures
69
+ else
70
+ qr_data.match(/(R\d+)-([A-Za-z0-9_\-]+)/)&.captures
71
+ end
72
+ end
73
+
32
74
  def search_by_term
33
75
  terms = params[:term].split.map { |term| "%#{term.downcase}%" }
34
76
 
@@ -2,7 +2,10 @@ module SpreeCmCommissioner
2
2
  module V2
3
3
  module Operator
4
4
  class DashboardCrewEventSerializer < BaseSerializer
5
- attributes :id, :name, :permalink, :from_date, :to_date, :updated_at
5
+ attributes :id, :name, :permalink,
6
+ :from_date, :to_date,
7
+ :check_in_flows,
8
+ :updated_at
6
9
 
7
10
  has_many :children_classifications, serializer: :classification
8
11
  has_one :category_icon, serializer: SpreeCmCommissioner::V2::Storefront::AssetSerializer
@@ -3,21 +3,17 @@
3
3
  <div class="col-6">
4
4
  <%= f.field_container :name do %>
5
5
  <%= f.label :name, raw(Spree.t(:name) + required_span_tag) %>
6
- <%= f.text_field :name, required: true, class: 'form-control', placeholder: 'eg. bookme plus' %>
7
- <% if f.object.errors[:name].any? %>
8
- <div class="error text-danger"><%= f.object.errors[:name].join(', ') %></div>
9
- <% end %>
6
+ <%= f.text_field :name, required: true, class: 'form-control', placeholder: 'eg. bookme plus'%>
7
+ <%= f.error_message_on :name %>
10
8
  <% end %>
11
9
  </div>
12
10
 
13
- <!-- Slug Field -->
11
+ <!-- Slug Field (only show if editing) -->
14
12
  <div class="col-6">
15
13
  <%= f.field_container :slug do %>
16
14
  <%= f.label :slug, raw(Spree.t(:slug)) %>
17
15
  <%= f.text_field :slug, class: 'form-control', placeholder: 'slug' %>
18
- <% if f.object.errors[:slug].any? %>
19
- <div class="error text-danger"><%= f.object.errors[:slug].join(', ') %></div>
20
- <% end %>
16
+ <%= f.error_message_on :slug %>
21
17
  <% end %>
22
18
  </div>
23
19
 
@@ -26,20 +22,16 @@
26
22
  <%= f.field_container :description do %>
27
23
  <%= f.label :description, raw(Spree.t(:description)) %>
28
24
  <%= f.text_area :description, class: 'form-control', placeholder: 'description' %>
29
- <% if f.object.errors[:description].any? %>
30
- <div class="error text-danger"><%= f.object.errors[:description].join(', ') %></div>
31
- <% end %>
25
+ <%= f.error_message_on :description %>
32
26
  <% end %>
33
27
  </div>
34
28
 
35
- <!-- Host Field -->
29
+ <!-- Host Field -->
36
30
  <div class="col-12">
37
31
  <%= f.field_container :host do %>
38
32
  <%= f.label :host, raw(Spree.t(:host) + required_span_tag) %>
39
33
  <%= f.text_field :host, required: true, class: 'form-control', placeholder: 'host' %>
40
- <% if f.object.errors[:host].any? %>
41
- <div class="error text-danger"><%= f.object.errors[:host].join(', ') %></div>
42
- <% end %>
34
+ <%= f.error_message_on :host %>
43
35
  <% end %>
44
36
  </div>
45
37
 
@@ -47,25 +39,21 @@
47
39
  <div class="col-12">
48
40
  <%= f.field_container :preferred_assetlinks do %>
49
41
  <%= f.label :preferred_assetlinks, raw(Spree.t(:assetlinks)) %>
50
- <%= f.text_area :preferred_assetlinks, class: 'form-control', rows: 5, placeholder: <<~JSON.strip
51
- example:
52
- [
53
- {
54
- "relation": ["delegate_permission/common.handle_all_urls"],
55
- "target": {
56
- "namespace": "android_app",
57
- "package_name": "com.yourapp.app",
58
- "sha256_cert_fingerprints": [
59
- "SHA256_CERTIFICATE_FINGERPRINT_HERE"
60
- ]
42
+ <%= f.text_area :preferred_assetlinks, class: 'form-control',
43
+ placeholder: 'example:
44
+ [
45
+ {
46
+ "relation": ["delegate_permission/common.handle_all_urls"],
47
+ "target": {
48
+ "namespace": "android_app",
49
+ "package_name": "com.yourapp.app",
50
+ "sha256_cert_fingerprints": [
51
+ "SHA256_CERTIFICATE_FINGERPRINT_HERE"
52
+ ]
53
+ }
61
54
  }
62
- }
63
- ]
64
- JSON
65
- %>
66
- <% if f.object.errors[:preferred_assetlinks].any? %>
67
- <div class="error text-danger"><%= f.object.errors[:preferred_assetlinks].join(', ') %></div>
68
- <% end %>
55
+ ]', rows: 5 %>
56
+ <%= f.error_message_on :preferred_assetlinks %>
69
57
  <% end %>
70
58
  </div>
71
59
 
@@ -73,29 +61,25 @@
73
61
  <div class="col-12">
74
62
  <%= f.field_container :preferred_apple_app_site_association do %>
75
63
  <%= f.label :preferred_apple_app_site_association, raw(Spree.t(:apple_app_site_association)) %>
76
- <%= f.text_area :preferred_apple_app_site_association, class: 'form-control', rows: 5, placeholder: <<~JSON.strip
77
- example:
78
- {
79
- "webcredentials": {
80
- "apps": [
81
- "TEAM_ID.com.yourapp.app"
82
- ]
83
- },
84
- "applinks": {
85
- "apps": [],
86
- "details": [
87
- {
88
- "appID": "TEAM_ID.com.yourapp.app",
89
- "paths": ["*"]
90
- }
91
- ]
92
- }
93
- }
94
- JSON
95
- %>
96
- <% if f.object.errors[:preferred_apple_app_site_association].any? %>
97
- <div class="error text-danger"><%= f.object.errors[:preferred_apple_app_site_association].join(', ') %></div>
98
- <% end %>
64
+ <%= f.text_area :preferred_apple_app_site_association, class: 'form-control',
65
+ placeholder: 'example:
66
+ {
67
+ "webcredentials": {
68
+ "apps": [
69
+ "TEAM_ID.com.yourapp.app"
70
+ ]
71
+ },
72
+ "applinks": {
73
+ "apps": [],
74
+ "details": [
75
+ {
76
+ "appID": "TEAM_ID.com.yourapp.app",
77
+ "paths": ["*"]
78
+ }
79
+ ]
80
+ }
81
+ }', rows: 5 %>
82
+ <%= f.error_message_on :preferred_apple_app_site_association %>
99
83
  <% end %>
100
84
  </div>
101
85
 
@@ -103,67 +87,8 @@
103
87
  <div class="col-6">
104
88
  <%= f.field_container :state do %>
105
89
  <%= f.label :state, raw(Spree.t(:state)) %>
106
- <%= f.select :state,
107
- options_for_select([['Enabled', 'enabled'], ['Disabled', 'disabled']], f.object&.state),
108
- { required: true },
109
- class: 'select2 form-control' %>
110
- <% if f.object.errors[:state].any? %>
111
- <div class="error text-danger"><%= f.object.errors[:state].join(', ') %></div>
112
- <% end %>
90
+ <%= f.select :state, options_for_select([['Enabled', 'enabled'], ['Disabled', 'disabled']], @object.state), { required: true }, class: 'select2 form-control' %>
91
+ <%= f.error_message_on :state %>
113
92
  <% end %>
114
93
  </div>
115
94
  </div>
116
-
117
- <div data-hook="admin_tenant_form_fields" class="row">
118
- <% [
119
- { field: :preferred_payment_checkout_image, label: :payment_checkout_image },
120
- { field: :preferred_payment_failed_image, label: :payment_failed_image },
121
- { field: :preferred_payment_success_image, label: :payment_success_image },
122
- { field: :preferred_payment_loader, label: :payment_loader }
123
- ].each do |config| %>
124
- <div class="col-6">
125
- <div class="card mb-3">
126
- <div class="card-body text-center">
127
- <%= f.field_container config[:field] do %>
128
- <%= f.label config[:field], raw(Spree.t(config[:label])), class: 'font-weight-bold' %>
129
-
130
- <div class="mb-2">
131
- <div class="icon-preview-container">
132
- <% value = f.object.send(config[:field]) %>
133
- <% if value.present? %>
134
- <%= image_tag asset_path(value), alt: "#{Spree.t(config[:label])}", class: 'img-thumbnail bg-light border payment-icon-preview', id: "preview_#{config[:field]}" %>
135
- <% end %>
136
- <button
137
- type="button"
138
- class="remove-icon-btn <%= 'hidden' unless value.present? %>"
139
- id="remove_<%= config[:field] %>"
140
- title="Remove icon"
141
- onclick="removeIcon('<%= config[:field] %>')"
142
- >
143
- &times;
144
- </button>
145
- </div>
146
- </div>
147
-
148
- <%= f.select config[:field],
149
- options_for_select(
150
- @vector_icons&.map { |icon| [icon.path, icon.path] },
151
- f.object.send(config[:field])
152
- ),
153
- { include_blank: 'None' },
154
- class: 'form-control select2-icon-picker',
155
- data: {
156
- target_field: config[:field],
157
- target_preview: "preview_#{config[:field]}",
158
- remove_btn: "remove_#{config[:field]}"
159
- } %>
160
-
161
- <% if f.object.errors[config[:field]].any? %>
162
- <div class="error text-danger"><%= f.object.errors[config[:field]].join(', ') %></div>
163
- <% end %>
164
- <% end %>
165
- </div>
166
- </div>
167
- </div>
168
- <% end %>
169
- </div>
@@ -31,6 +31,8 @@ module Spree
31
31
  subtitle
32
32
  preferred_background_color
33
33
  preferred_foreground_color
34
+ preferred_group_check_in_enabled
35
+ preferred_individual_check_in_enabled
34
36
  show_badge_status
35
37
  purchasable_on
36
38
  available_on
@@ -459,6 +459,10 @@ en:
459
459
  businesses_cant_be_blank: "Businesses can't be blank"
460
460
  phone_number_cant_be_blank: "Phone number can't be blank"
461
461
  quantity_cant_be_less_than_or_equal_to_zero: "Quantity can't be less or equal than 0"
462
+ spree_cm_commissioner/vendor_place:
463
+ attributes:
464
+ place_id:
465
+ taken: "has already existed with this place type"
462
466
 
463
467
  mail:
464
468
  order_mailer:
@@ -0,0 +1,5 @@
1
+ class AddDescriptionToCmVendorPlace < ActiveRecord::Migration[7.0]
2
+ def change
3
+ add_column :cm_vendor_places, :description, :string, if_not_exists: true
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  module SpreeCmCommissioner
2
- VERSION = '1.17.0-pre4'.freeze
2
+ VERSION = '1.17.0-pre5'.freeze
3
3
 
4
4
  module_function
5
5
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_cm_commissioner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.17.0.pre.pre4
4
+ version: 1.17.0.pre.pre5
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-07-02 00:00:00.000000000 Z
11
+ date: 2025-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -600,10 +600,6 @@ files:
600
600
  - app/assets/images/cm-fitness-room-icon.svg
601
601
  - app/assets/images/cm-front-desk-icon.svg
602
602
  - app/assets/images/cm-hair-dryer-icon.svg
603
- - app/assets/images/cm-hangmeas-checkout_image.svg
604
- - app/assets/images/cm-hangmeas-failed.svg
605
- - app/assets/images/cm-hangmeas-loader.svg
606
- - app/assets/images/cm-hangmeas-success.svg
607
603
  - app/assets/images/cm-hiking-icon.svg
608
604
  - app/assets/images/cm-iron-icon.svg
609
605
  - app/assets/images/cm-lcd-tv-icon.svg
@@ -709,7 +705,6 @@ files:
709
705
  - app/assets/javascripts/spree_cm_commissioner/selected_field_filter_origin_destination.js
710
706
  - app/assets/javascripts/spree_cm_commissioner/telegram.js
711
707
  - app/assets/javascripts/spree_cm_commissioner/telegram/order_confirmation.js
712
- - app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js
713
708
  - app/assets/javascripts/spree_cm_commissioner/trip_stop_selection.js
714
709
  - app/assets/javascripts/spree_cm_commissioner/update_popup_confirmation.js
715
710
  - app/assets/javascripts/spree_cm_commissioner/vehicle_seat.js
@@ -719,7 +714,6 @@ files:
719
714
  - app/assets/stylesheets/spree_cm_commissioner/backend/guest_qr_code.scss
720
715
  - app/assets/stylesheets/spree_cm_commissioner/backend/invoice.scss
721
716
  - app/assets/stylesheets/spree_cm_commissioner/backend/service_calendar.scss
722
- - app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss
723
717
  - app/assets/stylesheets/spree_cm_commissioner/backend/vehicle_seat.scss
724
718
  - app/assets/stylesheets/spree_cm_commissioner/telegram.css
725
719
  - app/assets/stylesheets/spree_cm_commissioner/telegram/telegram_bot.css.scss
@@ -1185,6 +1179,7 @@ files:
1185
1179
  - app/mailers/spree_cm_commissioner/pin_code_mailer.rb
1186
1180
  - app/mailers/spree_cm_commissioner/team_invite_mailer.rb
1187
1181
  - app/models/.gitkeep
1182
+ - app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb
1188
1183
  - app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb
1189
1184
  - app/models/concerns/spree_cm_commissioner/json_preference_validator.rb
1190
1185
  - app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb
@@ -1490,6 +1485,7 @@ files:
1490
1485
  - app/overrides/spree/admin/taxons/_form/assets_form.html.erb.deface
1491
1486
  - app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface
1492
1487
  - app/overrides/spree/admin/taxons/_form/background_color_and_foreground_color.html.erb.deface
1488
+ - app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface
1493
1489
  - app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface
1494
1490
  - app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface
1495
1491
  - app/overrides/spree/admin/taxons/_form/kind_html.erb.deface
@@ -2514,6 +2510,7 @@ files:
2514
2510
  - db/migrate/20250610080108_add_contact_to_cm_guests.rb
2515
2511
  - db/migrate/20250611023548_add_country_code_to_guests.rb
2516
2512
  - db/migrate/20250612035937_add_intel_phone_number_to_guests.rb
2513
+ - db/migrate/20250616084219_add_description_to_cm_vendor_place.rb
2517
2514
  - docker-compose.yml
2518
2515
  - docs/option_types/attr_types.md
2519
2516
  - docs/private_key.pem
@@ -1,63 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg id="payment_proccessing" data-name="payment proccessing" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 334 200">
3
- <defs>
4
- <clipPath id="clippath">
5
- <path d="m332.72,16.62v166.75c0,8.27-6.28,15.08-14.33,15.92-.55.05-1.11.08-1.67.08H16c-.48,0-.96-.02-1.43-.06-8.17-.73-14.57-7.59-14.57-15.94V16.62C0,7.78,7.16.62,16,.62h300.72c8.84,0,16,7.16,16,16Z" style="fill: none;"/>
6
- </clipPath>
7
- </defs>
8
- <g style="clip-path: url(#clippath);">
9
- <path d="m332.72,16.62v166.75c0,8.27-6.28,15.08-14.33,15.92-.55.05-1.11.08-1.67.08H16c-.48,0-.96-.02-1.43-.06-8.17-.73-14.57-7.59-14.57-15.94V16.62C0,7.78,7.16.62,16,.62h300.72c8.84,0,16,7.16,16,16Z" style="fill: #130d07;"/>
10
- <path d="m160.11,89.69c1.41-5.81-3.61-9.74-10.21-9.27-6.6.47-26.31,10.68-28.51,12.26-2.2,1.57-29.54,6.6-34.25,3.77-4.71-2.83-12.46-7.49-12.46-7.49,0,0-23.81-23.81-40.47,2.86-16.67,26.66-13.99,61.42-13.99,61.42l-24.1,29.05s-10.95,10,3.81,19.05,22.11,18.14,31.15,21.3c9.04,3.16,14.46-7,14.46-7.68,0-.68,19.43-30.27,19.43-30.27,10.27-.69,20.53-1.41,30.79-2.17,10.81-.8,24.65.44,31.99-9.08,3.2-4.15,1.59-8.37-.02-12.85.06.18,3.68-1,4-1.13,1.81-.72,3.12-1.91,3.94-3.7,1.55-3.36,2.03-8.12.07-11.41-2.91-4.88-3.85-5.31-3.85-5.31.93.42,4.7-2.76,5.32-3.27,2.69-2.21,4.81-5.03,5.27-8.57,1.31-10.16-10.01-17.26-18.56-19.27,5.59,1.31,10.8,2.15,16.21-.39,3.01-1.41,5.69-3.43,8.35-5.44,4.02-3.03,10.38-7.18,11.65-12.41" style="fill: #e89875;"/>
11
- <path d="m138.73,45.68c-1.83-.91-5.84-1.99-7.86-2.27-3.17-.44-12.78-.68-12.78-.68l-1.24,3.76-31.45-1.3c-4.73-.2-8.98,2.88-10.27,7.44l-27.87,101.59c-1.74,6.14,2.5,12.35,8.85,12.97l49.44,1.78c4.98.49,9.59-2.69,10.89-7.53l27.25-101.35c.17-.64.26-1.28.31-1.92,0-.02.01-.05.02-.07,1.59-7.52-1.35-10.47-5.29-12.43Z" style="fill: #302b31;"/>
12
- <path d="m51.51,163.26l49.44,1.78c4.98.49,9.59-2.69,10.89-7.53l27.25-101.35c1.7-6.33-2.91-12.61-9.46-12.88l-48.82-2.02c-4.73-.2-8.98,2.88-10.27,7.44l-27.87,101.59c-1.74,6.14,2.5,12.35,8.85,12.97Z" style="fill: #212028;"/>
13
- <path d="m108.45,126.85c-1.64.07-3.43-.23-5.08-.3-4.13-.18-8.26-.36-12.39-.54l-22.43-.98-.81-.04c-2.87-.41-4.61-1.99-3.7-4.96l.84-3.54c.55-2.49,2.89-4.15,5.42-3.86,13.54.41,27.15.41,40.66,1.23,2,.12,4.17.45,4.34,2.96.15,2.13-1.09,4.94-1.91,6.87-1.02,2.41-2.87,3.07-4.95,3.16Z" style="fill: #f59b1d;"/>
14
- <path d="m117.78,96.1l-48.7-1.94c-2.03-.08-3.25-1.77-2.74-3.76l8.36-32.34c.52-2,2.58-3.55,4.61-3.47l48.7,1.94c2.03.08,3.25,1.77,2.74,3.76l-8.36,32.34c-.52,2-2.58,3.55-4.61,3.47Z" style="fill: #fffaf8;"/>
15
- <path d="m85.83,77.72l-8.87-.35c-.88-.04-1.41-.77-1.19-1.63l1.23-4.78c.22-.87,1.12-1.54,2-1.51l8.87.35c.88.04,1.41.77,1.19,1.63l-1.23,4.78c-.22.87-1.12,1.54-2,1.51Z" style="fill: #d6d6d6;"/>
16
- <path d="m124.55,64.16l-9.8-.39c-.62-.02-1-.54-.84-1.15l.45-1.74c.16-.61.79-1.09,1.41-1.06l9.8.39c.62.02,1,.54.84,1.15l-.45,1.74c-.16.61-.79,1.09-1.41,1.06Z" style="fill: #d6d6d6;"/>
17
- <path d="m84.05,81.98l-8.95-.36c-.47-.02-.75-.41-.63-.87l.22-.86c.12-.46.59-.82,1.06-.8l8.95.36c.47.02.75.41.63.87l-.22.86c-.12.46-.59.82-1.06.8Z" style="fill: #d6d6d6;"/>
18
- <path d="m99.83,91.71l-27.44-1.09c-.25-.01-.41-.22-.34-.47l.42-1.62c.06-.25.32-.44.57-.43l27.44,1.09c.25.01.41.22.34.47l-.42,1.62c-.06.25-.32.44-.57.43Z" style="fill: #d6d6d6;"/>
19
- <path d="m95.54,82.43l-8.95-.36c-.47-.02-.75-.41-.63-.87l.22-.86c.12-.46.59-.82,1.06-.8l8.95.36c.47.02.75.41.63.87l-.22.86c-.12.46-.59.82-1.06.8Z" style="fill: #d6d6d6;"/>
20
- <path d="m107.03,82.89l-8.95-.36c-.47-.02-.75-.41-.63-.87l.22-.86c.12-.46.59-.82,1.06-.8l8.95.36c.47.02.75.41.63.87l-.22.86c-.12.46-.59.82-1.06.8Z" style="fill: #d6d6d6;"/>
21
- <path d="m118.52,83.35l-8.95-.36c-.47-.02-.75-.41-.63-.87l.22-.86c.12-.46.59-.82,1.06-.8l8.95.36c.47.02.75.41.63.87l-.22.86c-.12.46-.59.82-1.06.8Z" style="fill: #d6d6d6;"/>
22
- <path d="m111.65,93.7c-.49.15-.94.45-1.44.61-2.03.64-4.12-.62-4.15-2.53-.02-1.28.45-2.44,1.6-3.42.84-.72,1.78-1.08,2.78-1.14.88-.05,1.65.12,2.24.65.12.11.29.16.44.24-.17.19.02.23.08.32.37.57.57,1.21.45,1.96-.2,1.22-.73,2.32-1.89,3.17-.05.03-.08.09-.11.14Z" style="fill: #d6d6d6;"/>
23
- <path d="m111.65,93.7s.07-.11.11-.14c1.16-.85,1.69-1.95,1.89-3.17.12-.75-.08-1.39-.45-1.96-.06-.09-.25-.14-.08-.32.59-.27,1.16-.59,1.79-.67,2.25-.26,3.6.86,3.66,2.68.06,1.96-1.32,3.73-3.42,4.37-1.29.39-2.36.14-3.23-.58-.09-.07-.18-.15-.26-.22Z" style="fill: #5e5e5e;"/>
24
- <path d="m53.69,110.12s1.51-5.75,5.56,2.51c4.05,8.27,15.38,11.23,20.41,6.86s-.79-23.41-15.54-36.21c-14.75-12.8-30.48,5.41-37.12,19.9-6.65,14.49-6.78,50.07-6.78,50.07l48.9,21.12s8.3-15.25.02-34.98c-4.68-11.15-9.08-16.86-12.8-21.88-3.73-5.02-2.64-7.37-2.64-7.37Z" style="fill: #e89875;"/>
25
- <g>
26
- <rect x="222.73" y="98.72" width="8.27" height="27.35" style="fill: #fbc01a;"/>
27
- <polygon points="231 100.13 222.73 100.13 221.53 95.4 232.39 95.4 231 100.13" style="fill: #fbc01a;"/>
28
- <line x1="223.67" y1="100.13" x2="231" y2="100.13" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
29
- <polygon points="222.73 126.08 231 126.08 232.2 130.8 221.33 130.8 222.73 126.08" style="fill: #fbc01a;"/>
30
- <line x1="231" y1="126.08" x2="222.73" y2="126.08" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
31
- </g>
32
- <g>
33
- <rect x="240.34" y="98.72" width="8.27" height="27.35" style="fill: #f4b200;"/>
34
- <polygon points="248.61 100.13 240.34 100.13 239.15 95.4 250.01 95.4 248.61 100.13" style="fill: #f4b200;"/>
35
- <polygon points="240.35 126.08 248.62 126.08 249.81 130.8 238.95 130.8 240.35 126.08" style="fill: #f4b200;"/>
36
- </g>
37
- <g>
38
- <rect x="257.95" y="98.72" width="8.27" height="27.35" style="fill: #fbc01a;"/>
39
- <polygon points="266.22 100.13 257.95 100.13 256.76 95.4 267.62 95.4 266.22 100.13" style="fill: #fbc01a;"/>
40
- <line x1="258.9" y1="100.13" x2="266.22" y2="100.13" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
41
- <polygon points="257.96 126.08 266.23 126.08 267.42 130.8 256.56 130.8 257.96 126.08" style="fill: #fbc01a;"/>
42
- <line x1="266.22" y1="126.08" x2="257.96" y2="126.08" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
43
- </g>
44
- <g>
45
- <rect x="275.56" y="98.72" width="8.27" height="27.35" style="fill: #fbc01a;"/>
46
- <polygon points="283.84 100.13 275.56 100.13 274.37 95.4 285.23 95.4 283.84 100.13" style="fill: #fbc01a;"/>
47
- <line x1="276.51" y1="100.13" x2="283.84" y2="100.13" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
48
- <polygon points="275.57 126.08 283.84 126.08 285.04 130.8 274.17 130.8 275.57 126.08" style="fill: #fbc01a;"/>
49
- <line x1="283.84" y1="126.08" x2="275.57" y2="126.08" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
50
- </g>
51
- <rect x="218.79" y="91.42" width="69.46" height="3.98" style="fill: #f9b500;"/>
52
- <rect x="218.79" y="130.8" width="69.46" height="3.98" style="fill: #fbc01a;"/>
53
- <rect x="209.25" y="134.79" width="88.53" height="4.09" style="fill: #f4b200;"/>
54
- <path d="m216.67,88.29l34.23-15.08c2.1-.93,4.5-.93,6.6,0l34.23,15.08c1.62.71,1.11,3.13-.66,3.13h-73.75c-1.77,0-2.28-2.42-.66-3.13Z" style="fill: #fbc01a;"/>
55
- <path d="m230.81,86.16l21.33-9.4c1.31-.58,2.8-.58,4.11,0l21.33,9.4c1.01.44.69,1.95-.41,1.95h-45.96c-1.1,0-1.42-1.51-.41-1.95Z" style="fill: #f4b200;"/>
56
- <path d="m256.72,83.21c0-1.39-1.13-2.51-2.51-2.51s-2.51,1.13-2.51,2.51,1.13,2.51,2.51,2.51,2.51-1.13,2.51-2.51Z" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
57
- <line x1="218.8" y1="131.54" x2="288.24" y2="131.54" style="fill: none; stroke: #f9b500; stroke-miterlimit: 10; stroke-width: .5px;"/>
58
- <path d="m143.42,43.43l2.99-1.92c34.81-22.3,81.11-12.16,103.41,22.65h0" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 4px;"/>
59
- <polyline points="242.93 64.16 250.34 64.16 250.34 56.12" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 3px;"/>
60
- <path d="m253.66,141.68l-3.52,4.34c-28.53,29.92-75.91,31.04-105.83,2.5h0" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 4px;"/>
61
- <polyline points="151 146.9 143.8 148.65 145.77 156.76" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 3px;"/>
62
- </g>
63
- </svg>
@@ -1,56 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg
3
- xmlns="http://www.w3.org/2000/svg"
4
- viewBox="0 0 52 52"
5
- width="100"
6
- height="100"
7
- >
8
- <style>
9
- .svg-failed {
10
- stroke: white;
11
- stroke-width: 5;
12
- stroke-miterlimit: 10;
13
- stroke-linecap: round;
14
- stroke-linejoin: round;
15
- fill: none;
16
- animation: svg-failed-scale 0.3s ease-in-out 0.9s both;
17
- }
18
-
19
- .svg-failed-circle {
20
- stroke: none;
21
- fill: #FF5A5F;
22
- }
23
-
24
- .svg-failed-x {
25
- stroke-dasharray: 48;
26
- stroke-dashoffset: 48;
27
- animation: svg-failed-draw 0.5s ease forwards 0.6s;
28
- }
29
-
30
- @keyframes svg-failed-draw {
31
- to {
32
- stroke-dashoffset: 0;
33
- }
34
- }
35
-
36
- @keyframes svg-failed-scale {
37
- 0%, 100% {
38
- transform: scale(1);
39
- }
40
- 50% {
41
- transform: scale(1.1);
42
- }
43
- }
44
- </style>
45
-
46
- <circle class="svg-failed-circle" cx="26" cy="26" r="25" />
47
- <!-- X mark: two lines crossing -->
48
- <path
49
- class="svg-failed svg-failed-x"
50
- d="M16 16 L36 36"
51
- />
52
- <path
53
- class="svg-failed svg-failed-x"
54
- d="M36 16 L16 36"
55
- />
56
- </svg>
@@ -1,50 +0,0 @@
1
- <svg class="pl" width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <style>
3
- .pl__ring { animation: ringA 3s linear infinite; }
4
- .pl__ring--a { stroke: #F79E1B; }
5
- .pl__ring--b { animation-name: ringB; stroke: #F79E1B; }
6
- .pl__ring--c { animation-name: ringC; stroke: #F79E1B; }
7
- .pl__ring--d { animation-name: ringD; stroke: #F79E1B; }
8
-
9
- @keyframes ringA {
10
- from, 4% { stroke-dasharray: 0 660; stroke-width: 20; stroke-dashoffset: -330; }
11
- 12% { stroke-dasharray: 60 600; stroke-width: 30; stroke-dashoffset: -335; }
12
- 32% { stroke-dasharray: 60 600; stroke-width: 30; stroke-dashoffset: -595; }
13
- 40%, 54% { stroke-dasharray: 0 660; stroke-width: 20; stroke-dashoffset: -660; }
14
- 62% { stroke-dasharray: 60 600; stroke-width: 30; stroke-dashoffset: -665; }
15
- 82% { stroke-dasharray: 60 600; stroke-width: 30; stroke-dashoffset: -925; }
16
- 90%, to { stroke-dasharray: 0 660; stroke-width: 20; stroke-dashoffset: -990; }
17
- }
18
- @keyframes ringB {
19
- from, 12% { stroke-dasharray: 0 220; stroke-width: 20; stroke-dashoffset: -110; }
20
- 20% { stroke-dasharray: 20 200; stroke-width: 30; stroke-dashoffset: -115; }
21
- 40% { stroke-dasharray: 20 200; stroke-width: 30; stroke-dashoffset: -195; }
22
- 48%, 62% { stroke-dasharray: 0 220; stroke-width: 20; stroke-dashoffset: -220; }
23
- 70% { stroke-dasharray: 20 200; stroke-width: 30; stroke-dashoffset: -225; }
24
- 90% { stroke-dasharray: 20 200; stroke-width: 30; stroke-dashoffset: -305; }
25
- 98%, to { stroke-dasharray: 0 220; stroke-width: 20; stroke-dashoffset: -330; }
26
- }
27
- @keyframes ringC {
28
- from { stroke-dasharray: 0 440; stroke-width: 20; stroke-dashoffset: 0; }
29
- 8% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -5; }
30
- 28% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -175; }
31
- 36%, 58% { stroke-dasharray: 0 440; stroke-width: 20; stroke-dashoffset: -220; }
32
- 66% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -225; }
33
- 86% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -395; }
34
- 94%, to { stroke-dasharray: 0 440; stroke-width: 20; stroke-dashoffset: -440; }
35
- }
36
- @keyframes ringD {
37
- from, 8% { stroke-dasharray: 0 440; stroke-width: 20; stroke-dashoffset: 0; }
38
- 16% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -5; }
39
- 36% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -175; }
40
- 44%, 50% { stroke-dasharray: 0 440; stroke-width: 20; stroke-dashoffset: -220; }
41
- 58% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -225; }
42
- 78% { stroke-dasharray: 40 400; stroke-width: 30; stroke-dashoffset: -395; }
43
- 86%, to { stroke-dasharray: 0 440; stroke-width: 20; stroke-dashoffset: -440; }
44
- }
45
- </style>
46
- <circle class="pl__ring pl__ring--a" cx="150" cy="150" r="105" fill="none" stroke-width="20" stroke-dasharray="0 660" stroke-dashoffset="-330" stroke-linecap="round"/>
47
- <circle class="pl__ring pl__ring--b" cx="150" cy="150" r="35" fill="none" stroke-width="20" stroke-dasharray="0 220" stroke-dashoffset="-110" stroke-linecap="round"/>
48
- <circle class="pl__ring pl__ring--c" cx="115" cy="150" r="70" fill="none" stroke-width="20" stroke-dasharray="0 440" stroke-linecap="round"/>
49
- <circle class="pl__ring pl__ring--d" cx="185" cy="150" r="70" fill="none" stroke-width="20" stroke-dasharray="0 440" stroke-linecap="round"/>
50
- </svg>
@@ -1,51 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg
3
- xmlns="http://www.w3.org/2000/svg"
4
- viewBox="0 0 52 52"
5
- width="100"
6
- height="100"
7
- >
8
- <style>
9
- .svg-checkmark {
10
- stroke: white;
11
- stroke-width: 5;
12
- stroke-miterlimit: 10;
13
- stroke-linecap: round;
14
- stroke-linejoin: round;
15
- fill: none;
16
- animation: svg-success-scale 0.3s ease-in-out 0.9s both;
17
- }
18
-
19
- .svg-checkmark-circle {
20
- stroke: none;
21
- fill: #00D290;
22
- }
23
-
24
- .svg-checkmark-check {
25
- stroke-dasharray: 48;
26
- stroke-dashoffset: 48;
27
- animation: svg-success-draw 0.5s ease forwards 0.6s;
28
- }
29
-
30
- @keyframes svg-success-draw {
31
- to {
32
- stroke-dashoffset: 0;
33
- }
34
- }
35
-
36
- @keyframes svg-success-scale {
37
- 0%, 100% {
38
- transform: scale(1);
39
- }
40
- 50% {
41
- transform: scale(1.1);
42
- }
43
- }
44
- </style>
45
-
46
- <circle class="svg-checkmark-circle" cx="26" cy="26" r="25" />
47
- <path
48
- class="svg-checkmark svg-checkmark-check"
49
- d="M14.1 27.2l7.1 7.2 16.7-16.8"
50
- />
51
- </svg>
@@ -1,87 +0,0 @@
1
- function getAssetUrl(path) {
2
- if (!path) return '';
3
- if (path.startsWith('http') || path.startsWith('//') || path.startsWith('/')) {
4
- return path;
5
- }
6
- return '/assets/' + path;
7
- }
8
-
9
- function removeIcon(fieldId) {
10
- const field = document.getElementById(fieldId);
11
- const preview = document.getElementById('preview_' + fieldId);
12
- const removeBtn = document.getElementById('remove_' + fieldId);
13
-
14
- if (field) {
15
- field.value = '';
16
- }
17
- if (preview) {
18
- preview.src = '';
19
- preview.style.display = 'none';
20
- }
21
- if (removeBtn) {
22
- removeBtn.classList.add('hidden');
23
- }
24
-
25
- const $select = $(".select2-icon-picker[data-target-field='" + fieldId + "']");
26
- if ($select.length) {
27
- $select.val(null).trigger('change');
28
- }
29
- }
30
-
31
- function formatIconOption(icon) {
32
- if (!icon.id) return icon.text;
33
- return $(`<span>
34
- <img src="${getAssetUrl(icon.id)}" style="height:20px;width:auto;margin-right:5px;" />
35
- ${icon.text}
36
- </span>`);
37
- }
38
-
39
- function formatIconSelection(icon) {
40
- if (!icon.id) return icon.text;
41
- return $(`<span>
42
- <img src="${getAssetUrl(icon.id)}" style="height:20px;width:auto;margin-right:5px;" />
43
- ${icon.text}
44
- </span>`);
45
- }
46
-
47
- document.addEventListener("turbo:load", function () {
48
- $('.select2-icon-picker').each(function () {
49
- if ($(this).hasClass("select2-hidden-accessible")) {
50
- $(this).select2('destroy');
51
- }
52
- });
53
-
54
- $('.select2-icon-picker').select2({
55
- width: '100%',
56
- allowClear: true,
57
- placeholder: 'None',
58
- templateResult: formatIconOption,
59
- templateSelection: formatIconSelection
60
- });
61
-
62
- $('.select2-icon-picker').on('select2:select', function (e) {
63
- const selectedIcon = e.params.data.id;
64
- const fieldId = $(this).data('target-field');
65
- const previewId = $(this).data('target_preview');
66
- const removeBtnId = $(this).data('remove_btn');
67
-
68
- const field = document.getElementById(fieldId);
69
- const preview = document.getElementById(previewId);
70
- const removeBtn = document.getElementById(removeBtnId);
71
-
72
- if (field) {
73
- field.value = selectedIcon;
74
- }
75
- if (preview) {
76
- preview.src = getAssetUrl(selectedIcon);
77
- preview.style.display = selectedIcon ? 'inline' : 'none';
78
- }
79
- if (removeBtn) {
80
- if (selectedIcon) {
81
- removeBtn.classList.remove('hidden');
82
- } else {
83
- removeBtn.classList.add('hidden');
84
- }
85
- }
86
- });
87
- });
@@ -1,47 +0,0 @@
1
- .payment-icon-preview {
2
- max-height: 60px;
3
- max-width: 120px;
4
- min-height: 60px;
5
- min-width: 120px;
6
- background: #f8f9fa;
7
- border: 1px dashed #ccc;
8
- display: inline-block;
9
- object-fit: contain;
10
- cursor: pointer;
11
- position: relative;
12
- }
13
-
14
- .icon-preview-container {
15
- position: relative;
16
- display: inline-block;
17
- }
18
-
19
- .remove-icon-btn {
20
- position: absolute;
21
- top: -8px;
22
- right: -8px;
23
- width: 24px;
24
- height: 24px;
25
- border-radius: 50%;
26
- background: #dc3545;
27
- color: white;
28
- border: 2px solid white;
29
- display: flex;
30
- align-items: center;
31
- justify-content: center;
32
- cursor: pointer;
33
- font-size: 12px;
34
- box-shadow: 0 2px 4px rgba(0,0,0,0.2);
35
- transition: all 0.2s ease;
36
- z-index: 10;
37
- }
38
-
39
- .remove-icon-btn:hover {
40
- background: #c82333;
41
- transform: scale(1.1);
42
- box-shadow: 0 3px 6px rgba(0,0,0,0.3);
43
- }
44
-
45
- .remove-icon-btn.hidden {
46
- display: none;
47
- }