@social-mail/social-mail-client 1.2.643 → 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 (83) hide show
  1. package/dist/admin/AdminAppIndex.pack.js +260 -85
  2. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  3. package/dist/admin/AdminAppIndex.pack.min.js +4 -4
  4. package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
  5. package/dist/common/pages/stores/orders/EditOrderPage.js +1 -1
  6. package/dist/common/pages/stores/orders/EditOrderPage.js.map +1 -1
  7. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.d.ts +4 -4
  8. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.d.ts.map +1 -1
  9. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.js +7 -3
  10. package/dist/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.js.map +1 -1
  11. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.d.ts +3 -3
  12. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.d.ts.map +1 -1
  13. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.js +6 -5
  14. package/dist/common/pages/stores/payment-gateway/PaymentGatewayListPage.js.map +1 -1
  15. package/dist/model/model.d.ts +61 -27
  16. package/dist/model/model.d.ts.map +1 -1
  17. package/dist/model/model.js +245 -75
  18. package/dist/model/model.js.map +1 -1
  19. package/dist/public/channel/ChannelView.pack.js +245 -75
  20. package/dist/public/channel/ChannelView.pack.js.map +1 -1
  21. package/dist/public/channel/ChannelView.pack.min.js +1 -1
  22. package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
  23. package/dist/public/preview/zip/DownloadZip.pack.js +245 -75
  24. package/dist/public/preview/zip/DownloadZip.pack.js.map +1 -1
  25. package/dist/public/preview/zip/DownloadZip.pack.min.js +1 -1
  26. package/dist/public/preview/zip/DownloadZip.pack.min.js.map +1 -1
  27. package/dist/public/store/Store.pack.js +2231 -2142
  28. package/dist/public/store/Store.pack.js.map +1 -1
  29. package/dist/public/store/Store.pack.min.js +214 -214
  30. package/dist/public/store/Store.pack.min.js.map +1 -1
  31. package/dist/public/store/StoreApp.d.ts.map +1 -1
  32. package/dist/public/store/StoreApp.js +34 -4
  33. package/dist/public/store/StoreApp.js.map +1 -1
  34. package/dist/public/store/StoreApp.pack.js +13829 -693
  35. package/dist/public/store/StoreApp.pack.js.map +1 -1
  36. package/dist/public/store/StoreApp.pack.min.js +829 -2
  37. package/dist/public/store/StoreApp.pack.min.js.map +1 -1
  38. package/dist/public/store/StoreItemDetailView.d.ts.map +1 -1
  39. package/dist/public/store/StoreItemDetailView.js +3 -8
  40. package/dist/public/store/StoreItemDetailView.js.map +1 -1
  41. package/dist/public/store/cart/ShoppingCart.pack.js +245 -75
  42. package/dist/public/store/cart/ShoppingCart.pack.js.map +1 -1
  43. package/dist/public/store/cart/ShoppingCart.pack.min.js +1 -1
  44. package/dist/public/store/cart/ShoppingCart.pack.min.js.map +1 -1
  45. package/dist/public/store/commands/StoreCommands.d.ts +5 -1
  46. package/dist/public/store/commands/StoreCommands.d.ts.map +1 -1
  47. package/dist/public/store/commands/StoreCommands.js +12 -1
  48. package/dist/public/store/commands/StoreCommands.js.map +1 -1
  49. package/dist/public/store/pages/StoreProductDetailPage.d.ts +23 -0
  50. package/dist/public/store/pages/StoreProductDetailPage.d.ts.map +1 -0
  51. package/dist/public/store/pages/StoreProductDetailPage.js +355 -0
  52. package/dist/public/store/pages/StoreProductDetailPage.js.map +1 -0
  53. package/dist/public/store/pages/StoreProductListPage.d.ts +24 -0
  54. package/dist/public/store/pages/StoreProductListPage.d.ts.map +1 -0
  55. package/dist/public/store/pages/StoreProductListPage.js +358 -0
  56. package/dist/public/store/pages/StoreProductListPage.js.map +1 -0
  57. package/dist/public/user/WebSiteUserService.d.ts.map +1 -1
  58. package/dist/public/user/WebSiteUserService.js +8 -8
  59. package/dist/public/user/WebSiteUserService.js.map +1 -1
  60. package/dist/public/user/pages/SiteLoginPage.d.ts +29 -0
  61. package/dist/public/user/pages/SiteLoginPage.d.ts.map +1 -0
  62. package/dist/public/user/pages/SiteLoginPage.js +204 -0
  63. package/dist/public/user/pages/SiteLoginPage.js.map +1 -0
  64. package/dist/services/store/StoreOrderService.js +1 -1
  65. package/dist/services/store/StoreOrderService.js.map +1 -1
  66. package/dist/tsconfig.tsbuildinfo +1 -1
  67. package/dist/web/AppIndex.pack.js +260 -85
  68. package/dist/web/AppIndex.pack.js.map +1 -1
  69. package/dist/web/AppIndex.pack.min.js +4 -4
  70. package/dist/web/AppIndex.pack.min.js.map +1 -1
  71. package/package.json +1 -1
  72. package/src/common/pages/stores/orders/EditOrderPage.tsx +1 -1
  73. package/src/common/pages/stores/payment-gateway/PaymentGatewayEditorPage.tsx +7 -4
  74. package/src/common/pages/stores/payment-gateway/PaymentGatewayListPage.tsx +7 -6
  75. package/src/model/model.ts +100 -42
  76. package/src/public/store/StoreApp.tsx +30 -0
  77. package/src/public/store/StoreItemDetailView.tsx +0 -3
  78. package/src/public/store/commands/StoreCommands.ts +13 -1
  79. package/src/public/store/pages/StoreProductDetailPage.tsx +354 -0
  80. package/src/public/store/pages/StoreProductListPage.tsx +344 -0
  81. package/src/public/user/WebSiteUserService.ts +3 -6
  82. package/src/public/user/pages/SiteLoginPage.tsx +202 -0
  83. package/src/services/store/StoreOrderService.ts +3 -3
@@ -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
+ }