@social-mail/social-mail-client 1.2.642 → 1.2.644

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 (144) hide show
  1. package/dist/admin/AdminAppIndex.pack.js +326 -594
  2. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  3. package/dist/admin/AdminAppIndex.pack.min.js +8 -12
  4. package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
  5. package/dist/admin/commands/AdminCommands.d.ts +0 -1
  6. package/dist/admin/commands/AdminCommands.d.ts.map +1 -1
  7. package/dist/admin/commands/AdminCommands.js +0 -4
  8. package/dist/admin/commands/AdminCommands.js.map +1 -1
  9. package/dist/admin/drawer/AdminDrawer.d.ts.map +1 -1
  10. package/dist/admin/drawer/AdminDrawer.js +0 -4
  11. package/dist/admin/drawer/AdminDrawer.js.map +1 -1
  12. package/dist/common/commands/CommonCommands.d.ts +0 -3
  13. package/dist/common/commands/CommonCommands.d.ts.map +1 -1
  14. package/dist/common/commands/CommonCommands.js +0 -4
  15. package/dist/common/commands/CommonCommands.js.map +1 -1
  16. package/dist/common/pages/stores/StoreDetailPage.d.ts +2 -2
  17. package/dist/common/pages/stores/StoreDetailPage.d.ts.map +1 -1
  18. package/dist/common/pages/stores/StoreDetailPage.js +1 -7
  19. package/dist/common/pages/stores/StoreDetailPage.js.map +1 -1
  20. package/dist/common/pages/stores/orders/EditOrderPage.js +1 -1
  21. package/dist/common/pages/stores/orders/EditOrderPage.js.map +1 -1
  22. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.d.ts +4 -4
  23. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.d.ts.map +1 -1
  24. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.js +7 -3
  25. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.js.map +1 -1
  26. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.d.ts +3 -3
  27. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.d.ts.map +1 -1
  28. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.js +6 -5
  29. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.js.map +1 -1
  30. package/dist/common/pages/stores/products/EditProductListPage.d.ts +2 -2
  31. package/dist/common/pages/stores/products/EditProductListPage.d.ts.map +1 -1
  32. package/dist/common/pages/stores/products/EditProductListPage.js.map +1 -1
  33. package/dist/common/pages/stores/settings/EditSettingsPage.d.ts +2 -2
  34. package/dist/common/pages/stores/settings/EditSettingsPage.d.ts.map +1 -1
  35. package/dist/common/pages/stores/settings/EditSettingsPage.js +4 -4
  36. package/dist/common/pages/stores/settings/EditSettingsPage.js.map +1 -1
  37. package/dist/model/model.d.ts +75 -71
  38. package/dist/model/model.d.ts.map +1 -1
  39. package/dist/model/model.js +292 -257
  40. package/dist/model/model.js.map +1 -1
  41. package/dist/public/channel/ChannelView.pack.js +292 -257
  42. package/dist/public/channel/ChannelView.pack.js.map +1 -1
  43. package/dist/public/channel/ChannelView.pack.min.js +1 -1
  44. package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
  45. package/dist/public/preview/zip/DownloadZip.pack.js +292 -257
  46. package/dist/public/preview/zip/DownloadZip.pack.js.map +1 -1
  47. package/dist/public/preview/zip/DownloadZip.pack.min.js +1 -1
  48. package/dist/public/preview/zip/DownloadZip.pack.min.js.map +1 -1
  49. package/dist/public/store/Store.pack.js +2317 -2370
  50. package/dist/public/store/Store.pack.js.map +1 -1
  51. package/dist/public/store/Store.pack.min.js +214 -214
  52. package/dist/public/store/Store.pack.min.js.map +1 -1
  53. package/dist/public/store/StoreApp.d.ts.map +1 -1
  54. package/dist/public/store/StoreApp.js +34 -4
  55. package/dist/public/store/StoreApp.js.map +1 -1
  56. package/dist/public/store/StoreApp.pack.js +13829 -693
  57. package/dist/public/store/StoreApp.pack.js.map +1 -1
  58. package/dist/public/store/StoreApp.pack.min.js +829 -2
  59. package/dist/public/store/StoreApp.pack.min.js.map +1 -1
  60. package/dist/public/store/StoreItemDetailView.d.ts.map +1 -1
  61. package/dist/public/store/StoreItemDetailView.js +3 -8
  62. package/dist/public/store/StoreItemDetailView.js.map +1 -1
  63. package/dist/public/store/cart/ShoppingCart.pack.js +292 -257
  64. package/dist/public/store/cart/ShoppingCart.pack.js.map +1 -1
  65. package/dist/public/store/cart/ShoppingCart.pack.min.js +1 -1
  66. package/dist/public/store/cart/ShoppingCart.pack.min.js.map +1 -1
  67. package/dist/public/store/commands/StoreCommands.d.ts +5 -1
  68. package/dist/public/store/commands/StoreCommands.d.ts.map +1 -1
  69. package/dist/public/store/commands/StoreCommands.js +12 -1
  70. package/dist/public/store/commands/StoreCommands.js.map +1 -1
  71. package/dist/public/store/pages/StoreProductDetailPage.d.ts +23 -0
  72. package/dist/public/store/pages/StoreProductDetailPage.d.ts.map +1 -0
  73. package/dist/public/store/pages/StoreProductDetailPage.js +355 -0
  74. package/dist/public/store/pages/StoreProductDetailPage.js.map +1 -0
  75. package/dist/public/store/pages/StoreProductListPage.d.ts +24 -0
  76. package/dist/public/store/pages/StoreProductListPage.d.ts.map +1 -0
  77. package/dist/public/store/pages/StoreProductListPage.js +358 -0
  78. package/dist/public/store/pages/StoreProductListPage.js.map +1 -0
  79. package/dist/public/user/SiteLogin.d.ts.map +1 -1
  80. package/dist/public/user/SiteLogin.js +5 -12
  81. package/dist/public/user/SiteLogin.js.map +1 -1
  82. package/dist/public/user/WebSiteUserService.d.ts.map +1 -1
  83. package/dist/public/user/WebSiteUserService.js +8 -8
  84. package/dist/public/user/WebSiteUserService.js.map +1 -1
  85. package/dist/public/user/pages/SiteLoginPage.d.ts +29 -0
  86. package/dist/public/user/pages/SiteLoginPage.d.ts.map +1 -0
  87. package/dist/public/user/pages/SiteLoginPage.js +204 -0
  88. package/dist/public/user/pages/SiteLoginPage.js.map +1 -0
  89. package/dist/services/store/StoreItemService.d.ts +1 -1
  90. package/dist/services/store/StoreItemService.d.ts.map +1 -1
  91. package/dist/services/store/StoreItemService.js +6 -6
  92. package/dist/services/store/StoreItemService.js.map +1 -1
  93. package/dist/services/store/StoreOrderService.js +1 -1
  94. package/dist/services/store/StoreOrderService.js.map +1 -1
  95. package/dist/services/store/StoreService.d.ts +5 -5
  96. package/dist/services/store/StoreService.d.ts.map +1 -1
  97. package/dist/services/store/StoreService.js +7 -7
  98. package/dist/services/store/StoreService.js.map +1 -1
  99. package/dist/tsconfig.tsbuildinfo +1 -1
  100. package/dist/web/AppIndex.pack.js +328 -329
  101. package/dist/web/AppIndex.pack.js.map +1 -1
  102. package/dist/web/AppIndex.pack.min.js +7 -7
  103. package/dist/web/AppIndex.pack.min.js.map +1 -1
  104. package/dist/web/drawer/AppDrawer.d.ts +1 -1
  105. package/dist/web/drawer/AppDrawer.js +2 -2
  106. package/dist/web/drawer/AppDrawer.js.map +1 -1
  107. package/package.json +1 -1
  108. package/src/admin/commands/AdminCommands.ts +0 -5
  109. package/src/admin/drawer/AdminDrawer.tsx +0 -5
  110. package/src/common/commands/CommonCommands.ts +0 -6
  111. package/src/common/pages/stores/StoreDetailPage.tsx +3 -7
  112. package/src/common/pages/stores/orders/EditOrderPage.tsx +1 -1
  113. package/src/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.tsx +7 -4
  114. package/src/common/pages/stores/payment-gateway/PaymentGatewayListPage.tsx +7 -6
  115. package/src/common/pages/stores/products/EditProductListPage.tsx +2 -2
  116. package/src/common/pages/stores/settings/EditSettingsPage.tsx +3 -3
  117. package/src/model/model.ts +120 -114
  118. package/src/public/store/StoreApp.tsx +30 -0
  119. package/src/public/store/StoreItemDetailView.tsx +0 -3
  120. package/src/public/store/commands/StoreCommands.ts +13 -1
  121. package/src/public/store/pages/StoreProductDetailPage.tsx +354 -0
  122. package/src/public/store/pages/StoreProductListPage.tsx +344 -0
  123. package/src/public/user/SiteLogin.tsx +4 -16
  124. package/src/public/user/WebSiteUserService.ts +3 -6
  125. package/src/public/user/pages/SiteLoginPage.tsx +202 -0
  126. package/src/services/store/StoreItemService.ts +6 -4
  127. package/src/services/store/StoreOrderService.ts +3 -3
  128. package/src/services/store/StoreService.ts +11 -11
  129. package/src/web/drawer/AppDrawer.tsx +2 -2
  130. package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts +0 -11
  131. package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts.map +0 -1
  132. package/dist/admin/pages/stores/AdminStoreDetailPage.js +0 -122
  133. package/dist/admin/pages/stores/AdminStoreDetailPage.js.map +0 -1
  134. package/dist/admin/pages/stores/AdminStoreList.d.ts +0 -13
  135. package/dist/admin/pages/stores/AdminStoreList.d.ts.map +0 -1
  136. package/dist/admin/pages/stores/AdminStoreList.js +0 -131
  137. package/dist/admin/pages/stores/AdminStoreList.js.map +0 -1
  138. package/dist/common/pages/stores/templates/EditStoreTemplatesPage.d.ts +0 -11
  139. package/dist/common/pages/stores/templates/EditStoreTemplatesPage.d.ts.map +0 -1
  140. package/dist/common/pages/stores/templates/EditStoreTemplatesPage.js +0 -28
  141. package/dist/common/pages/stores/templates/EditStoreTemplatesPage.js.map +0 -1
  142. package/src/admin/pages/stores/AdminStoreDetailPage.tsx +0 -102
  143. package/src/admin/pages/stores/AdminStoreList.tsx +0 -109
  144. package/src/common/pages/stores/templates/EditStoreTemplatesPage.tsx +0 -19
@@ -2,13 +2,43 @@ import MobileDesktopApp from "@web-atoms/web-controls/dist/desktop-app/MobileDes
2
2
  import "../../style/GlobalStyle";
3
3
  import Pack from "@web-atoms/core/dist/Pack";
4
4
  import "./styles/common";
5
+ import Command from "@web-atoms/core/dist/core/Command";
6
+ import StoreCommands from "./commands/StoreCommands";
7
+ import styled from "@web-atoms/core/dist/style/styled";
8
+ import Route from "@web-atoms/core/dist/core/Route";
5
9
 
10
+ styled.css `
11
+ & [data-base-page] {
12
+ & > [data-page-element=action-bar], & > [data-page-element=icon-button], & > [data-page-element=title] {
13
+ display: none;
14
+ }
15
+ }
16
+ `.installGlobal("[store-app]");
6
17
 
7
18
  @Pack
8
19
  export default class StoreApp extends MobileDesktopApp {
9
20
 
10
21
  async init() {
22
+
23
+ StoreCommands.install(this);
24
+
25
+ this.element.setAttribute("store-app","store-app");
26
+
27
+ if(!Command.invokeRoute()) {
28
+
29
+ // check if we are configured...
30
+ StoreCommands.productList.dispatch();
31
+ }
11
32
  }
12
33
 
13
34
  }
14
35
 
36
+ Route.encodeUrl = (url) => {
37
+ if (url.startsWith("#")) {
38
+ return url;
39
+ }
40
+ if (/\d+\./.test(location.hostname)) {
41
+ return "#!" + url;
42
+ }
43
+ return url;
44
+ };
@@ -14,7 +14,6 @@ import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
14
14
  import { formatCurrency, formatPrice } from "../../common/currency";
15
15
  import ToggleButtonBar from "@web-atoms/web-controls/dist/basic/ToggleButtonBar";
16
16
  import { StoreUrlService } from "./StoreUrlService";
17
- import WebSiteUserService from "../user/WebSiteUserService";
18
17
 
19
18
  let storeID;
20
19
  let itemID;
@@ -344,8 +343,6 @@ export default class StoreItemDetailView extends AtomControl {
344
343
 
345
344
  @Action({ onEvent: "buy-now"})
346
345
  async buyNow() {
347
- const userService = this.resolve(WebSiteUserService);
348
- const user = await userService.getUser();
349
346
  }
350
347
 
351
348
  async getItem() {
@@ -1,5 +1,17 @@
1
- import { Commands } from "@web-atoms/core/dist/core/Command";
1
+ import Command, { Commands } from "@web-atoms/core/dist/core/Command";
2
2
 
3
3
  export default class StoreCommands extends Commands {
4
4
 
5
+ static productDetail = Command.create({
6
+ route: "/store/{storeItemID}",
7
+ routeOrder: 100,
8
+ openPage: () => import("../pages/StoreProductDetailPage")
9
+ });
10
+
11
+ static productList = Command.create({
12
+ route: "/store/",
13
+ routeOrder: 100,
14
+ openPage: () => import("../pages/StoreProductListPage")
15
+ });
16
+
5
17
  }
@@ -0,0 +1,354 @@
1
+ import Bind from "@web-atoms/core/dist/core/Bind";
2
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
3
+ import XNode from "@web-atoms/core/dist/core/XNode";
4
+ import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
5
+ import styled from "@web-atoms/core/dist/style/styled";
6
+ import Action from "@web-atoms/core/dist/view-model/Action";
7
+ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
8
+ import ToggleButtonBar from "@web-atoms/web-controls/dist/basic/ToggleButtonBar";
9
+ import ZoomView from "@web-atoms/web-controls/dist/basic/ZoomView";
10
+ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
11
+ import { formatPrice } from "../../../common/currency";
12
+ import { signedUrl, signedImageUrl } from "../../../common/fileUrl";
13
+ import { IStoreItem, IStoreMediaFile, StoreItem } from "../../../model/model";
14
+ import EntityService from "../../../services/EntityService";
15
+ import WebSiteUserService from "../../user/WebSiteUserService";
16
+ import { Base36 } from "../../../common/toBase36";
17
+
18
+ const css = styled.css `
19
+ margin: 10px;
20
+ display: flex;
21
+ gap: 10px;
22
+ position: relative;
23
+ flex-wrap: wrap;
24
+
25
+ [data-button-bar=button-bar] {
26
+ border-radius: 5px;
27
+ // border-color: var(--button-background);
28
+ display: flex;
29
+ gap: 8px; /* Space between the buttons */
30
+ flex-wrap: wrap; /* Wraps the buttons if they overflow */
31
+ margin: 10px 0;
32
+ border-color: none;
33
+ border-width: 0;
34
+ }
35
+
36
+ [data-button-bar=button-bar] > [data-item-type=toggle-button][data-selected-item=true] {
37
+ background-color: var(--button-background);
38
+ color: var(--button-text);
39
+ border-color: var(--button-background);;
40
+ }
41
+ [data-button-bar=button-bar] > [data-item-type=toggle-button] {
42
+ padding: 10px 20px;
43
+ background-color: var(--toogle-button-background);
44
+ // border:1px solid;
45
+ border: 1px solid var(--toogle-button-border);
46
+ border-radius: 4px;
47
+ font-size: 14px;
48
+ cursor: pointer;
49
+ text-align: center;
50
+ transition: background-color 0.3s ease, border-color 0.3s ease;
51
+ min-width: 50px;
52
+ border-radius: 5px;
53
+ }
54
+ [data-button-bar=button-bar] > [data-item-type=toggle-button]:first-child {
55
+ padding-left: 10px;
56
+ border-radius:5px
57
+ }
58
+ [data-button-bar=button-bar] > [data-item-type=toggle-button]:last-child {
59
+ padding-left: 10px;
60
+ border-radius:5px
61
+ }
62
+
63
+
64
+
65
+
66
+
67
+ & > h2 {
68
+ flex: 1 1 100%;
69
+ }
70
+
71
+ & .title {
72
+ padding-left: 5px;
73
+ }
74
+
75
+ & > .product {
76
+ width: 100%;
77
+ display: grid;
78
+ grid-template-columns: 4fr 1fr;
79
+ grid-template-rows: auto;
80
+
81
+ & > .photos {
82
+
83
+ grid-row: 1;
84
+ grid-column: 1;
85
+ margin: 10px;
86
+ padding: 10px;
87
+ border-radius: 5px;
88
+ box-shadow: 0 0 10px 2px gray;
89
+ display: inline-grid;
90
+ grid-template-columns: auto 1fr;
91
+ grid-template-rows: 1fr;
92
+ overflow: hidden;
93
+
94
+ min-height: 50vh;
95
+
96
+ & > .thumbnails {
97
+ grid-row: 1;
98
+ grid-column: 1;
99
+ display: flex;
100
+ flex-direction: column;
101
+ overflow: auto;
102
+ max-height: 500px;
103
+ max-width: 200px;
104
+ & > img {
105
+ cursor: pointer;
106
+ margin: 5px;
107
+ border-radius: 10px;
108
+ &:hover {
109
+ box-shadow: 0 0 5px 1px #0000ff7f;
110
+ }
111
+ }
112
+ }
113
+ & > .preview {
114
+ grid-row: 1;
115
+ grid-column: 2;
116
+ height: 100%;
117
+ min-width: 50%;
118
+ & img {
119
+ -webkit-user-drag: none;
120
+ }
121
+ }
122
+
123
+ }
124
+
125
+ & > .offers {
126
+ grid-row: 1;
127
+ grid-column: 2;
128
+ box-shadow: 0 0 10px 2px gray;
129
+ border-radius: 5px;
130
+ margin: 10px;
131
+ padding: 10px;
132
+
133
+ .price {
134
+ text-align: center;
135
+ font-weight: 700;
136
+ font-size: var(--font-xs);
137
+ text-align: center;
138
+ }
139
+ & > .buy {
140
+ display: inline-flex;
141
+ -webkit-box-align: center;
142
+ align-items: center;
143
+ -webkit-box-pack: center;
144
+ justify-content: center;
145
+ position: relative;
146
+ box-sizing: border-box;
147
+ -webkit-tap-highlight-color: transparent;
148
+ cursor: pointer;
149
+ user-select: none;
150
+ line-height: 1.75;
151
+ text-transform: uppercase;
152
+ min-width: 64px;
153
+ width: 100%;
154
+ //font-weight: bold;
155
+ font-size: 14px;
156
+ font-family: Mulish, sans-serif;
157
+ background-color: var(--button-background);
158
+ border: 1px solid var(--toogle-button-border);
159
+ color: var(--button-text);
160
+ margin: 0px;
161
+ padding: 6px 16px;
162
+ border-radius: 4px;
163
+ }
164
+
165
+
166
+
167
+ }
168
+
169
+ }
170
+
171
+
172
+
173
+ @media (max-width: 800px) {
174
+
175
+ & > .product {
176
+ display: flex;
177
+ flex-direction: column;
178
+ justify-content: stretch;
179
+ justify-items: stretch;
180
+ & > .photos {
181
+ display: grid;
182
+ grid-template-columns: 1fr;
183
+ grid-template-rows: 1fr auto;
184
+ & > .thumbnails {
185
+ grid-row: 2;
186
+ grid-column: 1;
187
+ height: 25vh;
188
+ display: flex;
189
+ flex-direction: row;
190
+ align-items: center;
191
+ justify-content: start;
192
+ justify-items: start;
193
+ overflow: auto;
194
+ }
195
+ & > .preview {
196
+ grid-row: 1;
197
+ grid-column: 1;
198
+ height: 50vh;
199
+ }
200
+ }
201
+ }
202
+ }
203
+
204
+ & img {
205
+ max-width: 90%;
206
+ }
207
+ `.installLocal();
208
+
209
+ export default class StoreProductDetailPage extends ContentPage<{ storeItemID }> {
210
+ @InjectProperty
211
+ entityService: EntityService;
212
+
213
+ model: IStoreItem;
214
+
215
+ selectedVariant: IStoreItem = null;
216
+
217
+ selectedSize: IStoreItem = null;
218
+
219
+ selectedFile: IStoreMediaFile = null;
220
+
221
+ images: IStoreMediaFile[] = [];
222
+
223
+ itemID;
224
+
225
+ constructor(app, e) {
226
+ super(app, e);
227
+ this.runAfterInit(() => this.app.runAsync(() => this.init()));
228
+ }
229
+
230
+ getFiles(item: IStoreItem, variant: IStoreItem, size: IStoreItem) {
231
+ const variantFiles = variant?.mediaFiles?.filter((x) => x.isPreview);
232
+ const files = variantFiles ?? item.mediaFiles?.filter((x) => x.isPreview) ?? [];
233
+ if (size?.mediaFiles) {
234
+ files.push(... size.mediaFiles.filter((x) => x.isPreview));
235
+ }
236
+ this.selectedFile = files[0];
237
+ return files;
238
+ }
239
+
240
+ async init() {
241
+
242
+ this.itemID = this.parameters.storeItemID;
243
+
244
+ this.renderer = <div>
245
+ <label text="..."/>
246
+ </div>;
247
+
248
+ this.model = await this.getItem();
249
+
250
+ const offer = this.model.mediaFiles?.find((x) => x.title === "offer.html");
251
+ const specifications = this.model.mediaFiles?.find((x) => x.title === "specs.html");
252
+
253
+ const price = this.model.storeItemPrices?.[0];
254
+
255
+ const [offerHtml, specHtml] = await Promise.all([
256
+ offer ? FetchBuilder.get(signedUrl(offer)).responseAsText() : Promise.resolve(""),
257
+ specifications ? FetchBuilder.get(signedUrl(specifications)).responseAsText() : Promise.resolve("")
258
+ ]);
259
+
260
+ this.selectedSize = this.model.sizes?.[0] ?? null;
261
+ this.selectedVariant = this.model.variants?.[0] ?? null;
262
+
263
+ this.renderer = <div
264
+ class={css}
265
+ images={Bind.oneWay(() => this.getFiles(this.model, this.selectedVariant, this.selectedSize))}>
266
+ <h2 class="title">{this.model.name}</h2>
267
+
268
+ <section class="product">
269
+
270
+ <section class="photos">
271
+ <AtomRepeater
272
+ selectOnClick={true}
273
+ items={Bind.oneWay(() => this.images)}
274
+ selectedItem={Bind.twoWaysImmediate(() => this.selectedFile)}
275
+ itemRenderer={(x) => <img
276
+ class="thumbnail"
277
+ data-click-event="change-image"
278
+ data-id={x.appFileID}
279
+ src={signedImageUrl(x, 150)} />}
280
+ class="thumbnails"/>
281
+ <ZoomView
282
+ class="preview"
283
+ source={Bind.oneWay(() => signedImageUrl(this.selectedFile, 720))}
284
+ />
285
+ </section>
286
+
287
+ <section class="offers" data-layout="vertical-flex">
288
+
289
+ { /* Display Offers */ }
290
+ {
291
+ offerHtml && <section innerHTML={offerHtml}>
292
+ </section>
293
+ }
294
+
295
+ <p>
296
+ {this.model.description}
297
+ </p>
298
+ <p class="price">
299
+ <label text={ formatPrice(price) }/>
300
+ </p>
301
+ <button data-click-event="buy-now" class="buy">Buy</button>
302
+
303
+ { this.model.sizes?.length && <ToggleButtonBar
304
+ items={this.model.sizes}
305
+ selectedItem={Bind.twoWaysImmediate(() => this.selectedSize)}
306
+ itemRenderer={(x: IStoreItem) => <div data-item-type="toggle-button">
307
+ <span text={x.name}/>
308
+ </div>}
309
+ />}
310
+ { this.model.variants?.length && <ToggleButtonBar
311
+ items={this.model.variants}
312
+ selectedItem={Bind.twoWaysImmediate(() => this.selectedVariant)}
313
+ itemRenderer={(x: IStoreItem) => <div data-item-type="toggle-button">
314
+ <span text={x.name}/>
315
+ </div>}
316
+ />}
317
+
318
+ </section>
319
+ </section>
320
+ {/* This should be html */}
321
+ <section data-flex="stretch-full">
322
+ <section innerHTML={specHtml}></section>
323
+ </section>
324
+
325
+ </div>;
326
+ }
327
+
328
+ @Action({ onEvent: "change-image"})
329
+ changeImage( { id }) {
330
+ this.selectedFile = this.model.mediaFiles.find((x) => x.appFileID === id);
331
+ }
332
+
333
+ @Action({ onEvent: "buy-now"})
334
+ async buyNow() {
335
+ const userService = this.resolve(WebSiteUserService);
336
+ const user = await userService.getUser();
337
+ }
338
+
339
+ async getItem() {
340
+ const itemID = this.itemID;
341
+ return this.entityService
342
+ .query(StoreItem, "storeQuery")
343
+ .where({ itemID }, (p) => (x) => x.storeItemID === p.itemID)
344
+ .include((x) => [
345
+ x.storeItemPrices,
346
+ x.storeItemTags.forEach((t) => t.tag),
347
+ x.variants.forEach((t) => [ t.mediaFiles, t.storeItemPrices]),
348
+ x.sizes.forEach((t) => [ t.mediaFiles, t.storeItemPrices]),
349
+ x.mediaFiles,
350
+ ])
351
+ .firstOrDefault();
352
+ }
353
+
354
+ }