spree_cm_commissioner 1.17.0.pre.pre3 → 1.17.0.pre.pre4
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/assets/images/cm-hangmeas-checkout_image.svg +63 -0
- data/app/assets/images/cm-hangmeas-failed.svg +56 -0
- data/app/assets/images/cm-hangmeas-loader.svg +50 -0
- data/app/assets/images/cm-hangmeas-success.svg +51 -0
- data/app/assets/javascripts/spree_cm_commissioner/backend.js +1 -0
- data/app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js +87 -0
- data/app/assets/stylesheets/spree_cm_commissioner/backend/commissioner_admin.css.scss +1 -0
- data/app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss +47 -0
- data/app/controllers/spree/admin/tenants_controller.rb +8 -0
- data/app/interactors/spree_cm_commissioner/vattanac_bank_initiator.rb +1 -5
- data/app/models/concerns/spree_cm_commissioner/tenant_preference.rb +4 -0
- data/app/models/spree_cm_commissioner/taxon_decorator.rb +0 -1
- data/app/models/spree_cm_commissioner/vendor_place.rb +1 -1
- data/app/queries/spree_cm_commissioner/guest_searcher_query.rb +3 -45
- data/app/serializers/spree_cm_commissioner/v2/operator/dashboard_crew_event_serializer.rb +1 -4
- data/app/views/spree/admin/tenants/_form.html.erb +117 -42
- data/config/initializers/spree_permitted_attributes.rb +0 -2
- data/config/locales/en.yml +0 -4
- data/lib/spree_cm_commissioner/version.rb +1 -1
- metadata +8 -5
- data/app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb +0 -30
- data/app/overrides/spree/admin/taxons/_form/check_in_flows.html.erb.deface +0 -18
- data/db/migrate/20250616084219_add_description_to_cm_vendor_place.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27eaa71cfc36b120e800e8d027a0bac70c7896a47349b57334e9b311f1a8bfa4
|
4
|
+
data.tar.gz: 3721c925d915dc0e02660abf2abefbc42e62e66ace288f9bc57c0d8adf23b335
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 764f2f2ea0a5894c6a0110264f497a2d879b23c58951c46cfcbae15bf752b9c63cd7401adb353981d1e4ef7c1e58d0991668397ffda4b7f9ab6431b5bad6403b
|
7
|
+
data.tar.gz: 8030d23be060aa290f79ed06cb25cf0caa6250aa677b59b9f5410def6269a62f8d7948c3e030618c0906954a5a0e11e5b9fce1a690adc8872115c5ed4c545aa5
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,63 @@
|
|
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>
|
@@ -0,0 +1,56 @@
|
|
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>
|
@@ -0,0 +1,50 @@
|
|
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>
|
@@ -0,0 +1,51 @@
|
|
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>
|
@@ -0,0 +1,87 @@
|
|
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
|
+
});
|
@@ -0,0 +1,47 @@
|
|
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
|
+
}
|
@@ -1,6 +1,8 @@
|
|
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
|
+
|
4
6
|
# override
|
5
7
|
def collection
|
6
8
|
params[:q] = {} if params[:q].blank?
|
@@ -31,6 +33,12 @@ module Spree
|
|
31
33
|
def collection_url(options = {})
|
32
34
|
admin_tenants_url(options)
|
33
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def load_vector_icons
|
40
|
+
@vector_icons = SpreeCmCommissioner::VectorIcon.all
|
41
|
+
end
|
34
42
|
end
|
35
43
|
end
|
36
44
|
end
|
@@ -93,10 +93,6 @@ 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
|
-
|
100
96
|
def construct_data
|
101
97
|
user = context.user
|
102
98
|
|
@@ -105,7 +101,7 @@ module SpreeCmCommissioner
|
|
105
101
|
name: user.full_name,
|
106
102
|
phone: user.phone_number,
|
107
103
|
email: user.email,
|
108
|
-
webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}
|
104
|
+
webUrl: "#{Spree::Store.default.formatted_url}/vattanac_bank_web_app?session_id=#{session_id}"
|
109
105
|
}
|
110
106
|
|
111
107
|
json_data = raw_data.to_json
|
@@ -5,6 +5,10 @@ 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: ''
|
8
12
|
end
|
9
13
|
end
|
10
14
|
end
|
@@ -4,7 +4,6 @@ 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
|
8
7
|
|
9
8
|
base.preference :background_color, :string
|
10
9
|
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 :
|
10
|
+
validates :position, presence: true, numericality: { only_integer: true, greater_than: 0 }
|
11
11
|
|
12
12
|
accepts_nested_attributes_for :place, allow_destroy: true
|
13
13
|
|
@@ -8,36 +8,20 @@ module SpreeCmCommissioner
|
|
8
8
|
|
9
9
|
def event_id = params[:event_id]
|
10
10
|
|
11
|
-
def call
|
11
|
+
def call
|
12
12
|
return SpreeCmCommissioner::Guest.none if event_id.blank?
|
13
13
|
|
14
|
-
if params[:qr_data].present?
|
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?
|
14
|
+
if params[:qr_data].present?
|
19
15
|
search_by_guest_qr
|
20
16
|
elsif params[:term].present?
|
21
17
|
search_by_term
|
22
|
-
elsif params[:ids].present?
|
23
|
-
SpreeCmCommissioner::Guest.complete_or_canceled.where(event_id: event_id, id: params[:ids])
|
24
18
|
else
|
25
|
-
SpreeCmCommissioner::Guest.
|
19
|
+
SpreeCmCommissioner::Guest.none
|
26
20
|
end
|
27
21
|
end
|
28
22
|
|
29
23
|
private
|
30
24
|
|
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
|
-
|
41
25
|
def search_by_guest_qr
|
42
26
|
SpreeCmCommissioner::Guest.complete_or_canceled.where(
|
43
27
|
token: params[:qr_data],
|
@@ -45,32 +29,6 @@ module SpreeCmCommissioner
|
|
45
29
|
)
|
46
30
|
end
|
47
31
|
|
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
|
-
|
74
32
|
def search_by_term
|
75
33
|
terms = params[:term].split.map { |term| "%#{term.downcase}%" }
|
76
34
|
|
@@ -2,10 +2,7 @@ module SpreeCmCommissioner
|
|
2
2
|
module V2
|
3
3
|
module Operator
|
4
4
|
class DashboardCrewEventSerializer < BaseSerializer
|
5
|
-
attributes :id, :name, :permalink,
|
6
|
-
:from_date, :to_date,
|
7
|
-
:check_in_flows,
|
8
|
-
:updated_at
|
5
|
+
attributes :id, :name, :permalink, :from_date, :to_date, :updated_at
|
9
6
|
|
10
7
|
has_many :children_classifications, serializer: :classification
|
11
8
|
has_one :category_icon, serializer: SpreeCmCommissioner::V2::Storefront::AssetSerializer
|
@@ -3,17 +3,21 @@
|
|
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
|
-
|
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 %>
|
8
10
|
<% end %>
|
9
11
|
</div>
|
10
12
|
|
11
|
-
<!-- Slug Field
|
13
|
+
<!-- Slug Field -->
|
12
14
|
<div class="col-6">
|
13
15
|
<%= f.field_container :slug do %>
|
14
16
|
<%= f.label :slug, raw(Spree.t(:slug)) %>
|
15
17
|
<%= f.text_field :slug, class: 'form-control', placeholder: 'slug' %>
|
16
|
-
|
18
|
+
<% if f.object.errors[:slug].any? %>
|
19
|
+
<div class="error text-danger"><%= f.object.errors[:slug].join(', ') %></div>
|
20
|
+
<% end %>
|
17
21
|
<% end %>
|
18
22
|
</div>
|
19
23
|
|
@@ -22,16 +26,20 @@
|
|
22
26
|
<%= f.field_container :description do %>
|
23
27
|
<%= f.label :description, raw(Spree.t(:description)) %>
|
24
28
|
<%= f.text_area :description, class: 'form-control', placeholder: 'description' %>
|
25
|
-
|
29
|
+
<% if f.object.errors[:description].any? %>
|
30
|
+
<div class="error text-danger"><%= f.object.errors[:description].join(', ') %></div>
|
31
|
+
<% end %>
|
26
32
|
<% end %>
|
27
33
|
</div>
|
28
34
|
|
29
|
-
|
35
|
+
<!-- Host Field -->
|
30
36
|
<div class="col-12">
|
31
37
|
<%= f.field_container :host do %>
|
32
38
|
<%= f.label :host, raw(Spree.t(:host) + required_span_tag) %>
|
33
39
|
<%= f.text_field :host, required: true, class: 'form-control', placeholder: 'host' %>
|
34
|
-
|
40
|
+
<% if f.object.errors[:host].any? %>
|
41
|
+
<div class="error text-danger"><%= f.object.errors[:host].join(', ') %></div>
|
42
|
+
<% end %>
|
35
43
|
<% end %>
|
36
44
|
</div>
|
37
45
|
|
@@ -39,21 +47,25 @@
|
|
39
47
|
<div class="col-12">
|
40
48
|
<%= f.field_container :preferred_assetlinks do %>
|
41
49
|
<%= f.label :preferred_assetlinks, raw(Spree.t(:assetlinks)) %>
|
42
|
-
<%= f.text_area :preferred_assetlinks, class: 'form-control',
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
}
|
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
|
+
]
|
54
61
|
}
|
55
|
-
|
56
|
-
|
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 %>
|
57
69
|
<% end %>
|
58
70
|
</div>
|
59
71
|
|
@@ -61,25 +73,29 @@
|
|
61
73
|
<div class="col-12">
|
62
74
|
<%= f.field_container :preferred_apple_app_site_association do %>
|
63
75
|
<%= f.label :preferred_apple_app_site_association, raw(Spree.t(:apple_app_site_association)) %>
|
64
|
-
<%= f.text_area :preferred_apple_app_site_association, class: 'form-control',
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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 %>
|
83
99
|
<% end %>
|
84
100
|
</div>
|
85
101
|
|
@@ -87,8 +103,67 @@
|
|
87
103
|
<div class="col-6">
|
88
104
|
<%= f.field_container :state do %>
|
89
105
|
<%= f.label :state, raw(Spree.t(:state)) %>
|
90
|
-
<%= f.select :state,
|
91
|
-
|
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 %>
|
92
113
|
<% end %>
|
93
114
|
</div>
|
94
115
|
</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
|
+
×
|
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>
|
data/config/locales/en.yml
CHANGED
@@ -459,10 +459,6 @@ 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"
|
466
462
|
|
467
463
|
mail:
|
468
464
|
order_mailer:
|
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.pre4
|
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-
|
11
|
+
date: 2025-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree
|
@@ -600,6 +600,10 @@ 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
|
603
607
|
- app/assets/images/cm-hiking-icon.svg
|
604
608
|
- app/assets/images/cm-iron-icon.svg
|
605
609
|
- app/assets/images/cm-lcd-tv-icon.svg
|
@@ -705,6 +709,7 @@ files:
|
|
705
709
|
- app/assets/javascripts/spree_cm_commissioner/selected_field_filter_origin_destination.js
|
706
710
|
- app/assets/javascripts/spree_cm_commissioner/telegram.js
|
707
711
|
- app/assets/javascripts/spree_cm_commissioner/telegram/order_confirmation.js
|
712
|
+
- app/assets/javascripts/spree_cm_commissioner/tenant_payment_icon_fields.js
|
708
713
|
- app/assets/javascripts/spree_cm_commissioner/trip_stop_selection.js
|
709
714
|
- app/assets/javascripts/spree_cm_commissioner/update_popup_confirmation.js
|
710
715
|
- app/assets/javascripts/spree_cm_commissioner/vehicle_seat.js
|
@@ -714,6 +719,7 @@ files:
|
|
714
719
|
- app/assets/stylesheets/spree_cm_commissioner/backend/guest_qr_code.scss
|
715
720
|
- app/assets/stylesheets/spree_cm_commissioner/backend/invoice.scss
|
716
721
|
- app/assets/stylesheets/spree_cm_commissioner/backend/service_calendar.scss
|
722
|
+
- app/assets/stylesheets/spree_cm_commissioner/backend/tenant_payment_icon_fields.scss
|
717
723
|
- app/assets/stylesheets/spree_cm_commissioner/backend/vehicle_seat.scss
|
718
724
|
- app/assets/stylesheets/spree_cm_commissioner/telegram.css
|
719
725
|
- app/assets/stylesheets/spree_cm_commissioner/telegram/telegram_bot.css.scss
|
@@ -1179,7 +1185,6 @@ files:
|
|
1179
1185
|
- app/mailers/spree_cm_commissioner/pin_code_mailer.rb
|
1180
1186
|
- app/mailers/spree_cm_commissioner/team_invite_mailer.rb
|
1181
1187
|
- app/models/.gitkeep
|
1182
|
-
- app/models/concerns/spree_cm_commissioner/event_check_in_flowable.rb
|
1183
1188
|
- app/models/concerns/spree_cm_commissioner/homepage_section_bitwise.rb
|
1184
1189
|
- app/models/concerns/spree_cm_commissioner/json_preference_validator.rb
|
1185
1190
|
- app/models/concerns/spree_cm_commissioner/kyc_bitwise.rb
|
@@ -1485,7 +1490,6 @@ files:
|
|
1485
1490
|
- app/overrides/spree/admin/taxons/_form/assets_form.html.erb.deface
|
1486
1491
|
- app/overrides/spree/admin/taxons/_form/available_on.html.erb.deface
|
1487
1492
|
- 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
|
1489
1493
|
- app/overrides/spree/admin/taxons/_form/custom_redirect_url.html.erb.deface
|
1490
1494
|
- app/overrides/spree/admin/taxons/_form/hide_video_banner.html.erb.deface
|
1491
1495
|
- app/overrides/spree/admin/taxons/_form/kind_html.erb.deface
|
@@ -2510,7 +2514,6 @@ files:
|
|
2510
2514
|
- db/migrate/20250610080108_add_contact_to_cm_guests.rb
|
2511
2515
|
- db/migrate/20250611023548_add_country_code_to_guests.rb
|
2512
2516
|
- db/migrate/20250612035937_add_intel_phone_number_to_guests.rb
|
2513
|
-
- db/migrate/20250616084219_add_description_to_cm_vendor_place.rb
|
2514
2517
|
- docker-compose.yml
|
2515
2518
|
- docs/option_types/attr_types.md
|
2516
2519
|
- docs/private_key.pem
|
@@ -1,30 +0,0 @@
|
|
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
|
@@ -1,18 +0,0 @@
|
|
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 %> %>
|