spree_cm_commissioner 1.17.0.pre.pre1 → 1.17.0.pre.pre2
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/app/controllers/spree/admin/tenants_controller.rb +0 -8
- data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +30 -0
- data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +0 -4
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +1 -0
- data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +18 -0
- data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +45 -3
- data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +4 -1
- data/app/views/spree/admin/tenants/_form.html.erb +0 -253
- data/config/initializers/spree_permitted_attributes.rb +2 -0
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +4 -6
- data/app/assets/images/cm-hangmeas-checkout_image.svg +0 -63
- data/app/assets/images/cm-hangmeas-failed.svg +0 -56
- data/app/assets/images/cm-hangmeas-loader.svg +0 -50
- data/app/assets/images/cm-hangmeas-success.svg +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd0a9d4b3819bd12ab5e38ffd050cf46ca5b8a937965a25ae911f9208b26586a
|
4
|
+
data.tar.gz: a17a1eea391cdf4c4c2c17d300ee275ab70b67dbc87b4448cbc4a2a6cae1c533
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45451b1d44bf6820463098e3c2a37cfd113753206b1ccbc13247a7f3db577be706fff5b1dd54e528036e6120dacfb4d9472672f3f196d8866dbdfff7557bbdde
|
7
|
+
data.tar.gz: d52c8b30b4e67599eac1eba6f75025c6ee01c6967caaebd7874e22fa71ca7202a1927facd4d8c3ad0e8da256ece71e3977b83a3ea56292e0a740c0b56bc05566
|
data/Gemfile.lock
CHANGED
@@ -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
|
@@ -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
|
@@ -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
|
@@ -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.
|
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,
|
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
|
@@ -92,256 +92,3 @@
|
|
92
92
|
<% end %>
|
93
93
|
</div>
|
94
94
|
</div>
|
95
|
-
<div data-hook="admin_tenant_form_fields" class="row">
|
96
|
-
|
97
|
-
<!-- payment icon fields improved UI -->
|
98
|
-
<div class="col-3">
|
99
|
-
<div class="card mb-3">
|
100
|
-
<div class="card-body text-center">
|
101
|
-
<%= f.field_container :preferred_payment_checkout_image do %>
|
102
|
-
<%= f.label :payment_checkout_image, raw(Spree.t(:payment_checkout_image)), class: 'font-weight-bold' %>
|
103
|
-
<div class="mb-2 position-relative">
|
104
|
-
<img id="preview_preferred_payment_checkout_image"
|
105
|
-
src="<%= (f.object.preferred_payment_checkout_image.present? ? asset_path(f.object.preferred_payment_checkout_image) : asset_path('cm-hangmeas-checkout_image.svg')) %>"
|
106
|
-
alt="Icon Preview"
|
107
|
-
class="img-thumbnail bg-light border payment-icon-preview"
|
108
|
-
data-toggle="tooltip" title="Click to select icon"
|
109
|
-
onclick="$('#vector-icons-modal').modal('show'); setOptionValueId('preferred_payment_checkout_image'); setCurrentSelectedIcon(document.getElementById('preferred_payment_checkout_image').value);">
|
110
|
-
<button type="button" class="btn btn-sm btn-outline-danger position-absolute" style="top:5px; right:5px;" title="Remove icon" onclick="document.getElementById('preferred_payment_checkout_image').value=''; document.getElementById('preview_preferred_payment_checkout_image').src='<%= asset_path('cm-hangmeas-checkout_image.svg') %>'; document.getElementById('preview_preferred_payment_checkout_image').style.display='inline'; return false;">
|
111
|
-
<i class="fa fa-times"></i>
|
112
|
-
</button>
|
113
|
-
</div>
|
114
|
-
<div class="input-group">
|
115
|
-
<%= f.text_field :preferred_payment_checkout_image, class: 'form-control', placeholder: 'eg. https://example.com/icon.png', id: 'preferred_payment_checkout_image', 'aria-label': 'Payment Checkout Image' %>
|
116
|
-
<div class="input-group-append">
|
117
|
-
<button type="button" class="btn btn-outline-secondary option-value-toggler" data-toggle="modal" data-target="#vector-icons-modal" data-id="preferred_payment_checkout_image" data-vector-icon="<%= f.object.preferred_payment_checkout_image %>" title="Select icon">
|
118
|
-
<i class="fa fa-image"></i>
|
119
|
-
</button>
|
120
|
-
</div>
|
121
|
-
</div>
|
122
|
-
<%= f.error_message_on :preferred_payment_checkout_image %>
|
123
|
-
<% end %>
|
124
|
-
</div>
|
125
|
-
</div>
|
126
|
-
</div>
|
127
|
-
|
128
|
-
<div class="col-3">
|
129
|
-
<div class="card mb-3">
|
130
|
-
<div class="card-body text-center">
|
131
|
-
<%= f.field_container :preferred_payment_failed_image do %>
|
132
|
-
<%= f.label :payment_failed_image, raw(Spree.t(:payment_failed_image)), class: 'font-weight-bold' %>
|
133
|
-
<div class="mb-2 position-relative">
|
134
|
-
<img id="preview_preferred_payment_failed_image"
|
135
|
-
src="<%= (f.object.preferred_payment_failed_image.present? ? asset_path(f.object.preferred_payment_failed_image) : asset_path('cm-hangmeas-failed.svg')) %>"
|
136
|
-
alt="Icon Preview"
|
137
|
-
class="img-thumbnail bg-light border payment-icon-preview"
|
138
|
-
data-toggle="tooltip" title="Click to select icon"
|
139
|
-
onclick="$('#vector-icons-modal').modal('show'); setOptionValueId('preferred_payment_failed_image'); setCurrentSelectedIcon(document.getElementById('preferred_payment_failed_image').value);">
|
140
|
-
<button type="button" class="btn btn-sm btn-outline-danger position-absolute" style="top:5px; right:5px;" title="Remove icon" onclick="document.getElementById('preferred_payment_failed_image').value=''; document.getElementById('preview_preferred_payment_failed_image').src='<%= asset_path('cm-hangmeas-failed.svg') %>'; document.getElementById('preview_preferred_payment_failed_image').style.display='inline'; return false;">
|
141
|
-
<i class="fa fa-times"></i>
|
142
|
-
</button>
|
143
|
-
</div>
|
144
|
-
<div class="input-group">
|
145
|
-
<%= f.text_field :preferred_payment_failed_image, class: 'form-control', placeholder: 'eg. https://example.com/icon.png', id: 'preferred_payment_failed_image', 'aria-label': 'Payment Failed Image' %>
|
146
|
-
<div class="input-group-append">
|
147
|
-
<button type="button" class="btn btn-outline-secondary option-value-toggler" data-toggle="modal" data-target="#vector-icons-modal" data-id="preferred_payment_failed_image" data-vector-icon="<%= f.object.preferred_payment_failed_image %>" title="Select icon">
|
148
|
-
<i class="fa fa-image"></i>
|
149
|
-
</button>
|
150
|
-
</div>
|
151
|
-
</div>
|
152
|
-
<%= f.error_message_on :preferred_payment_failed_image %>
|
153
|
-
<% end %>
|
154
|
-
</div>
|
155
|
-
</div>
|
156
|
-
</div>
|
157
|
-
|
158
|
-
<div class="col-3">
|
159
|
-
<div class="card mb-3">
|
160
|
-
<div class="card-body text-center">
|
161
|
-
<%= f.field_container :preferred_payment_success_image do %>
|
162
|
-
<%= f.label :payment_success_image, raw(Spree.t(:payment_success_image)), class: 'font-weight-bold' %>
|
163
|
-
<div class="mb-2 position-relative">
|
164
|
-
<img id="preview_preferred_payment_success_image"
|
165
|
-
src="<%= (f.object.preferred_payment_success_image.present? ? asset_path(f.object.preferred_payment_success_image) : asset_path('cm-hangmeas-success.svg')) %>"
|
166
|
-
alt="Icon Preview"
|
167
|
-
class="img-thumbnail bg-light border payment-icon-preview"
|
168
|
-
data-toggle="tooltip" title="Click to select icon"
|
169
|
-
onclick="$('#vector-icons-modal').modal('show'); setOptionValueId('preferred_payment_success_image'); setCurrentSelectedIcon(document.getElementById('preferred_payment_success_image').value);">
|
170
|
-
<button type="button" class="btn btn-sm btn-outline-danger position-absolute" style="top:5px; right:5px;" title="Remove icon" onclick="document.getElementById('preferred_payment_success_image').value=''; document.getElementById('preview_preferred_payment_success_image').src='<%= asset_path('cm-hangmeas-success.svg') %>'; document.getElementById('preview_preferred_payment_success_image').style.display='inline'; return false;">
|
171
|
-
<i class="fa fa-times"></i>
|
172
|
-
</button>
|
173
|
-
</div>
|
174
|
-
<div class="input-group">
|
175
|
-
<%= f.text_field :preferred_payment_success_image, class: 'form-control', placeholder: 'eg. https://example.com/icon.png', id: 'preferred_payment_success_image', 'aria-label': 'Payment Success Image' %>
|
176
|
-
<div class="input-group-append">
|
177
|
-
<button type="button" class="btn btn-outline-secondary option-value-toggler" data-toggle="modal" data-target="#vector-icons-modal" data-id="preferred_payment_success_image" data-vector-icon="<%= f.object.preferred_payment_success_image %>" title="Select icon">
|
178
|
-
<i class="fa fa-image"></i>
|
179
|
-
</button>
|
180
|
-
</div>
|
181
|
-
</div>
|
182
|
-
<%= f.error_message_on :preferred_payment_success_image %>
|
183
|
-
<% end %>
|
184
|
-
</div>
|
185
|
-
</div>
|
186
|
-
</div>
|
187
|
-
|
188
|
-
<div class="col-3">
|
189
|
-
<div class="card mb-3">
|
190
|
-
<div class="card-body text-center">
|
191
|
-
<%= f.field_container :preferred_payment_loader do %>
|
192
|
-
<%= f.label :payment_loader, raw(Spree.t(:payment_loader)), class: 'font-weight-bold' %>
|
193
|
-
<div class="mb-2 position-relative">
|
194
|
-
<img id="preview_preferred_payment_loader"
|
195
|
-
src="<%= (f.object.preferred_payment_loader.present? ? asset_path(f.object.preferred_payment_loader) : asset_path('cm-hangmeas-loader.svg')) %>"
|
196
|
-
alt="Icon Preview"
|
197
|
-
class="img-thumbnail bg-light border payment-icon-preview"
|
198
|
-
data-toggle="tooltip" title="Click to select icon"
|
199
|
-
onclick="$('#vector-icons-modal').modal('show'); setOptionValueId('preferred_payment_loader'); setCurrentSelectedIcon(document.getElementById('preferred_payment_loader').value);">
|
200
|
-
<button type="button" class="btn btn-sm btn-outline-danger position-absolute" style="top:5px; right:5px;" title="Remove icon" onclick="document.getElementById('preferred_payment_loader').value=''; document.getElementById('preview_preferred_payment_loader').src='<%= asset_path('cm-hangmeas-loader.svg') %>'; document.getElementById('preview_preferred_payment_loader').style.display='inline'; return false;">
|
201
|
-
<i class="fa fa-times"></i>
|
202
|
-
</button>
|
203
|
-
</div>
|
204
|
-
<div class="input-group">
|
205
|
-
<%= f.text_field :preferred_payment_loader, class: 'form-control', placeholder: 'eg. https://example.com/icon.png', id: 'preferred_payment_loader', 'aria-label': 'Payment Loader Image' %>
|
206
|
-
<div class="input-group-append">
|
207
|
-
<button type="button" class="btn btn-outline-secondary option-value-toggler" data-toggle="modal" data-target="#vector-icons-modal" data-id="preferred_payment_loader" data-vector-icon="<%= f.object.preferred_payment_loader %>" title="Select icon">
|
208
|
-
<i class="fa fa-image"></i>
|
209
|
-
</button>
|
210
|
-
</div>
|
211
|
-
</div>
|
212
|
-
<%= f.error_message_on :preferred_payment_loader %>
|
213
|
-
<% end %>
|
214
|
-
</div>
|
215
|
-
</div>
|
216
|
-
</div>
|
217
|
-
|
218
|
-
</div>
|
219
|
-
|
220
|
-
|
221
|
-
<!-- Vector Icon Selector Modal -->
|
222
|
-
<div class="modal fade" id="vector-icons-modal" tabindex="-1" role="dialog" aria-hidden="true">
|
223
|
-
<div class="modal-dialog modal-dialog-centered" role="document">
|
224
|
-
<div class="modal-content">
|
225
|
-
<div class="modal-header">
|
226
|
-
<h5 class="modal-title">Icons</h5>
|
227
|
-
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
228
|
-
<span aria-hidden="true">×</span>
|
229
|
-
</button>
|
230
|
-
</div>
|
231
|
-
<div class="modal-body" data-hook="admin_product_form_vector_icons">
|
232
|
-
<div class="form-group">
|
233
|
-
<label for="vector_icon_select">Select Icon</label>
|
234
|
-
<select id="vector_icon_select" class="form-control select2">
|
235
|
-
<option value="">None</option>
|
236
|
-
<% @vector_icons&.each do |icon| %>
|
237
|
-
<option value="<%= icon.path %>"><%= icon.path %></option>
|
238
|
-
<% end %>
|
239
|
-
</select>
|
240
|
-
</div>
|
241
|
-
</div>
|
242
|
-
<div class="modal-footer">
|
243
|
-
<input type="hidden" id="modal-option-value-id" value="" />
|
244
|
-
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
245
|
-
<button type="button" class="btn btn-primary" id="select-vector-icon-btn">Select</button>
|
246
|
-
</div>
|
247
|
-
</div>
|
248
|
-
</div>
|
249
|
-
</div>
|
250
|
-
|
251
|
-
<script>
|
252
|
-
function setCurrentSelectedIcon(selectVectorIcon) {
|
253
|
-
var optionsContainer = document.getElementById("vector_icon_select");
|
254
|
-
if (!optionsContainer) return;
|
255
|
-
var options = Array.from(optionsContainer.options).map((e) => e.value || e.innerHTML);
|
256
|
-
var index = Math.max(options.indexOf(selectVectorIcon), 0);
|
257
|
-
optionsContainer.selectedIndex = index;
|
258
|
-
}
|
259
|
-
|
260
|
-
function setOptionValueId(id) {
|
261
|
-
document.getElementById("modal-option-value-id").value = id;
|
262
|
-
}
|
263
|
-
|
264
|
-
document.body.addEventListener('click', function(e){
|
265
|
-
var target = e.target;
|
266
|
-
if (target.classList.contains('option-value-toggler')) {
|
267
|
-
setOptionValueId(target.dataset.id);
|
268
|
-
setCurrentSelectedIcon(target.dataset.vectorIcon);
|
269
|
-
}
|
270
|
-
});
|
271
|
-
|
272
|
-
function getAssetUrl(path) {
|
273
|
-
if (!path) return '';
|
274
|
-
if (path.startsWith('http://') || path.startsWith('https://') || path.startsWith('/assets/')) return path;
|
275
|
-
return '/assets/' + path;
|
276
|
-
}
|
277
|
-
|
278
|
-
document.getElementById('select-vector-icon-btn').addEventListener('click', function() {
|
279
|
-
var fieldId = document.getElementById("modal-option-value-id").value;
|
280
|
-
var selectedIcon = document.getElementById("vector_icon_select").value;
|
281
|
-
|
282
|
-
if (fieldId) {
|
283
|
-
document.getElementById(fieldId).value = selectedIcon;
|
284
|
-
|
285
|
-
var previewImg = document.getElementById('preview_' + fieldId);
|
286
|
-
if (previewImg) {
|
287
|
-
if (selectedIcon) {
|
288
|
-
previewImg.src = getAssetUrl(selectedIcon);
|
289
|
-
previewImg.style.display = 'inline';
|
290
|
-
} else {
|
291
|
-
previewImg.src = '';
|
292
|
-
previewImg.style.display = 'none';
|
293
|
-
}
|
294
|
-
}
|
295
|
-
}
|
296
|
-
|
297
|
-
// close select2 if open
|
298
|
-
$('#vector_icon_select').select2('close');
|
299
|
-
|
300
|
-
// hide modal
|
301
|
-
$('#vector-icons-modal').modal('hide');
|
302
|
-
});
|
303
|
-
|
304
|
-
$(document).ready(function() {
|
305
|
-
$('#vector_icon_select').select2({
|
306
|
-
dropdownParent: $('#vector-icons-modal')
|
307
|
-
});
|
308
|
-
|
309
|
-
// Auto-close modal & save immediately when selecting an option
|
310
|
-
$('#vector_icon_select').on('select2:select', function (e) {
|
311
|
-
$('#select-vector-icon-btn').trigger('click');
|
312
|
-
});
|
313
|
-
});
|
314
|
-
|
315
|
-
// Live preview when typing URLs manually
|
316
|
-
[
|
317
|
-
'preferred_payment_checkout_image',
|
318
|
-
'preferred_payment_failed_image',
|
319
|
-
'preferred_payment_success_image',
|
320
|
-
'preferred_payment_loader'
|
321
|
-
].forEach(function(fieldId) {
|
322
|
-
var input = document.getElementById(fieldId);
|
323
|
-
if (input) {
|
324
|
-
input.addEventListener('input', function() {
|
325
|
-
var previewImg = document.getElementById('preview_' + fieldId);
|
326
|
-
if (previewImg) {
|
327
|
-
if (input.value) {
|
328
|
-
previewImg.src = getAssetUrl(input.value);
|
329
|
-
previewImg.style.display = 'inline';
|
330
|
-
} else {
|
331
|
-
previewImg.src = '';
|
332
|
-
previewImg.style.display = 'none';
|
333
|
-
}
|
334
|
-
}
|
335
|
-
});
|
336
|
-
}
|
337
|
-
});
|
338
|
-
</script>
|
339
|
-
|
340
|
-
<style>
|
341
|
-
.payment-icon-preview {
|
342
|
-
max-height: 60px;
|
343
|
-
max-width: 120px;
|
344
|
-
cursor: pointer;
|
345
|
-
}
|
346
|
-
</style>
|
347
|
-
|
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.
|
4
|
+
version: 1.17.0.pre.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- You
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-07-01 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
|
@@ -1183,6 +1179,7 @@ files:
|
|
1183
1179
|
- app/mailers/spree_cm_commissioner/pin_code_mailer.rb
|
1184
1180
|
- app/mailers/spree_cm_commissioner/team_invite_mailer.rb
|
1185
1181
|
- app/models/.gitkeep
|
1182
|
+
- app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb
|
1186
1183
|
- app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb
|
1187
1184
|
- app/models/concerns/spree_cm_commissioner/json_preference_validator.rb
|
1188
1185
|
- app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb
|
@@ -1488,6 +1485,7 @@ files:
|
|
1488
1485
|
- app/overrides/spree/admin/taxons/_form/assets_form.html.erb.deface
|
1489
1486
|
- app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface
|
1490
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
|
1491
1489
|
- app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface
|
1492
1490
|
- app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface
|
1493
1491
|
- app/overrides/spree/admin/taxons/_form/kind_html.erb.deface
|
@@ -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 2s 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="120" cy="120" 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="120" cy="120" 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="85" cy="120" r="70" fill="none" stroke-width="20" stroke-dasharray="0 440" stroke-linecap="round"/>
|
49
|
-
<circle class="pl__ring pl__ring--d" cx="155" cy="120" 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>
|