@social-mail/social-mail-client 1.2.210 → 1.2.211

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 (135) hide show
  1. package/dist/admin/AdminAppIndex.pack.js +935 -30
  2. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  3. package/dist/admin/AdminAppIndex.pack.min.js +16 -12
  4. package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
  5. package/dist/admin/commands/AdminCommands.d.ts +1 -0
  6. package/dist/admin/commands/AdminCommands.d.ts.map +1 -1
  7. package/dist/admin/commands/AdminCommands.js +4 -0
  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 +4 -0
  11. package/dist/admin/drawer/AdminDrawer.js.map +1 -1
  12. package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts +10 -0
  13. package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts.map +1 -0
  14. package/dist/admin/pages/stores/AdminStoreDetailPage.js +92 -0
  15. package/dist/admin/pages/stores/AdminStoreDetailPage.js.map +1 -0
  16. package/dist/admin/pages/stores/AdminStoreList.d.ts +13 -0
  17. package/dist/admin/pages/stores/AdminStoreList.d.ts.map +1 -0
  18. package/dist/admin/pages/stores/AdminStoreList.js +131 -0
  19. package/dist/admin/pages/stores/AdminStoreList.js.map +1 -0
  20. package/dist/admin/pages/users/UserDetailsPage.js +3 -3
  21. package/dist/admin/pages/users/UserDetailsPage.js.map +1 -1
  22. package/dist/admin/pages/users/files/EditFileAccessPage.d.ts +1 -1
  23. package/dist/admin/pages/users/files/EditFileAccessPage.d.ts.map +1 -1
  24. package/dist/admin/pages/users/files/EditFileAccessPage.js +3 -3
  25. package/dist/admin/pages/users/files/EditFileAccessPage.js.map +1 -1
  26. package/dist/common/commands/CommonCommands.d.ts +9 -0
  27. package/dist/common/commands/CommonCommands.d.ts.map +1 -1
  28. package/dist/common/commands/CommonCommands.js +15 -0
  29. package/dist/common/commands/CommonCommands.js.map +1 -1
  30. package/dist/common/controls/countries/CountrySelect.d.ts +1 -0
  31. package/dist/common/controls/countries/CountrySelect.d.ts.map +1 -1
  32. package/dist/common/controls/countries/CountrySelect.js +6 -1
  33. package/dist/common/controls/countries/CountrySelect.js.map +1 -1
  34. package/dist/common/pages/folders/ChooserFolderPage.d.ts +1 -0
  35. package/dist/common/pages/folders/ChooserFolderPage.d.ts.map +1 -1
  36. package/dist/common/pages/folders/ChooserFolderPage.js +2 -1
  37. package/dist/common/pages/folders/ChooserFolderPage.js.map +1 -1
  38. package/dist/common/pages/stores/StoreDetailPage.d.ts +17 -0
  39. package/dist/common/pages/stores/StoreDetailPage.d.ts.map +1 -0
  40. package/dist/common/pages/stores/StoreDetailPage.js +96 -0
  41. package/dist/common/pages/stores/StoreDetailPage.js.map +1 -0
  42. package/dist/common/pages/stores/orders/EditOrderPage.d.ts +9 -0
  43. package/dist/common/pages/stores/orders/EditOrderPage.d.ts.map +1 -0
  44. package/dist/common/pages/stores/orders/EditOrderPage.js +37 -0
  45. package/dist/common/pages/stores/orders/EditOrderPage.js.map +1 -0
  46. package/dist/common/pages/stores/products/EditProductDetailPage.d.ts +11 -0
  47. package/dist/common/pages/stores/products/EditProductDetailPage.d.ts.map +1 -0
  48. package/dist/common/pages/stores/products/EditProductDetailPage.js +80 -0
  49. package/dist/common/pages/stores/products/EditProductDetailPage.js.map +1 -0
  50. package/dist/common/pages/stores/products/EditProductListPage.d.ts +16 -0
  51. package/dist/common/pages/stores/products/EditProductListPage.d.ts.map +1 -0
  52. package/dist/common/pages/stores/products/EditProductListPage.js +118 -0
  53. package/dist/common/pages/stores/products/EditProductListPage.js.map +1 -0
  54. package/dist/common/pages/stores/products/prices/EditItemPricePage.d.ts +8 -0
  55. package/dist/common/pages/stores/products/prices/EditItemPricePage.d.ts.map +1 -0
  56. package/dist/common/pages/stores/products/prices/EditItemPricePage.js +72 -0
  57. package/dist/common/pages/stores/products/prices/EditItemPricePage.js.map +1 -0
  58. package/dist/model/model.d.ts +127 -12
  59. package/dist/model/model.d.ts.map +1 -1
  60. package/dist/model/model.js +60 -8
  61. package/dist/model/model.js.map +1 -1
  62. package/dist/public/channel/ChannelView.pack.js +64 -10
  63. package/dist/public/channel/ChannelView.pack.js.map +1 -1
  64. package/dist/public/channel/ChannelView.pack.min.js +3 -3
  65. package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
  66. package/dist/services/files/LocalFileService.d.ts.map +1 -1
  67. package/dist/services/files/LocalFileService.js +4 -1
  68. package/dist/services/files/LocalFileService.js.map +1 -1
  69. package/dist/services/store/StoreItemService.d.ts +15 -0
  70. package/dist/services/store/StoreItemService.d.ts.map +1 -0
  71. package/dist/services/store/StoreItemService.js +65 -0
  72. package/dist/services/store/StoreItemService.js.map +1 -0
  73. package/dist/services/store/StoreOrderService.d.ts +15 -0
  74. package/dist/services/store/StoreOrderService.d.ts.map +1 -0
  75. package/dist/services/store/StoreOrderService.js +65 -0
  76. package/dist/services/store/StoreOrderService.js.map +1 -0
  77. package/dist/services/store/StoreService.d.ts +14 -0
  78. package/dist/services/store/StoreService.d.ts.map +1 -0
  79. package/dist/services/store/StoreService.js +74 -0
  80. package/dist/services/store/StoreService.js.map +1 -0
  81. package/dist/tsconfig.tsbuildinfo +1 -1
  82. package/dist/web/AppIndex.pack.js +764 -81
  83. package/dist/web/AppIndex.pack.js.map +1 -1
  84. package/dist/web/AppIndex.pack.min.js +12 -12
  85. package/dist/web/AppIndex.pack.min.js.map +1 -1
  86. package/dist/web/drawer/AppDrawer.d.ts +1 -0
  87. package/dist/web/drawer/AppDrawer.d.ts.map +1 -1
  88. package/dist/web/drawer/AppDrawer.js +23 -7
  89. package/dist/web/drawer/AppDrawer.js.map +1 -1
  90. package/dist/web/page/channels/detail/ChannelDetailPage.js +1 -1
  91. package/dist/web/page/channels/detail/ChannelDetailPage.js.map +1 -1
  92. package/dist/web/page/files/service/CloudFileService.d.ts +2 -1
  93. package/dist/web/page/files/service/CloudFileService.d.ts.map +1 -1
  94. package/dist/web/page/files/service/CloudFileService.js +6 -0
  95. package/dist/web/page/files/service/CloudFileService.js.map +1 -1
  96. package/dist/web/page/mails/service/ConversationService.js +1 -1
  97. package/dist/web/page/mails/service/ConversationService.js.map +1 -1
  98. package/dist/web/page/mails/service/MailService.d.ts.map +1 -1
  99. package/dist/web/page/mails/service/MailService.js +2 -9
  100. package/dist/web/page/mails/service/MailService.js.map +1 -1
  101. package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js +3 -1
  102. package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js.map +1 -1
  103. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts +5 -0
  104. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts.map +1 -0
  105. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js +84 -0
  106. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js.map +1 -0
  107. package/node_modules/@web-atoms/web-controls/dist/tsconfig.tsbuildinfo +1 -1
  108. package/node_modules/@web-atoms/web-controls/package.json +1 -1
  109. package/node_modules/@web-atoms/web-controls/src/basic/InlinePopup.tsx +2 -2
  110. package/node_modules/@web-atoms/web-controls/src/basic/TypeWriter.tsx +85 -0
  111. package/package.json +2 -2
  112. package/src/admin/commands/AdminCommands.ts +5 -0
  113. package/src/admin/drawer/AdminDrawer.tsx +5 -0
  114. package/src/admin/pages/stores/AdminStoreDetailPage.tsx +74 -0
  115. package/src/admin/pages/stores/AdminStoreList.tsx +109 -0
  116. package/src/admin/pages/users/UserDetailsPage.tsx +2 -2
  117. package/src/admin/pages/users/files/EditFileAccessPage.tsx +1 -1
  118. package/src/common/commands/CommonCommands.ts +19 -0
  119. package/src/common/controls/countries/CountrySelect.tsx +7 -1
  120. package/src/common/pages/folders/ChooserFolderPage.tsx +7 -2
  121. package/src/common/pages/stores/StoreDetailPage.tsx +84 -0
  122. package/src/common/pages/stores/orders/EditOrderPage.tsx +30 -0
  123. package/src/common/pages/stores/products/EditProductDetailPage.tsx +59 -0
  124. package/src/common/pages/stores/products/EditProductListPage.tsx +106 -0
  125. package/src/common/pages/stores/products/prices/EditItemPricePage.tsx +53 -0
  126. package/src/model/model.ts +151 -20
  127. package/src/services/files/LocalFileService.tsx +4 -1
  128. package/src/services/store/StoreItemService.ts +49 -0
  129. package/src/services/store/StoreOrderService.ts +57 -0
  130. package/src/services/store/StoreService.ts +49 -0
  131. package/src/web/drawer/AppDrawer.tsx +18 -4
  132. package/src/web/page/channels/detail/ChannelDetailPage.tsx +1 -1
  133. package/src/web/page/files/service/CloudFileService.ts +4 -0
  134. package/src/web/page/mails/service/ConversationService.tsx +1 -1
  135. package/src/web/page/mails/service/MailService.ts +2 -8
@@ -0,0 +1,109 @@
1
+ import XNode from "@web-atoms/core/dist/core/XNode";
2
+ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
3
+ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
4
+ import { IStore, Store } from "../../../model/model";
5
+ import InfiniteRepeater from "../../../common/controls/repeater/InfiniteRepeater";
6
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
7
+ import StoreService from "../../../services/store/StoreService";
8
+ import MasterDetailPage from "@web-atoms/web-controls/dist/mobile-app/MasterDetailPage";
9
+ import Bind from "@web-atoms/core/dist/core/Bind";
10
+ import { AddIconTextButton } from "../../../common/controls/buttons/IconButton";
11
+ import styled from "@web-atoms/core/dist/style/styled";
12
+ import Action from "@web-atoms/core/dist/view-model/Action";
13
+ import AdminStoreDetailPage from "./AdminStoreDetailPage";
14
+
15
+ const css = styled.css `
16
+ &[data-page-type=master-detail] > [data-page-element=content][data-mode=desktop] {
17
+ grid-template-columns: 150px 1fr auto;
18
+ }
19
+ `.installLocal();
20
+
21
+ export default class AdminStoreListPage extends MasterDetailPage {
22
+
23
+ items: IStore[] = [];
24
+
25
+ selectedItem = null as IStore;
26
+
27
+ search = "";
28
+
29
+ @InjectProperty
30
+ private storeService: StoreService;
31
+
32
+ async init() {
33
+
34
+ this.element.className = css;
35
+
36
+ this.titleRenderer = () => <div data-layout="row">
37
+ <input
38
+ placeholder="Search"
39
+ type="search"
40
+ value={Bind.twoWaysImmediate(() => this.search)}/>
41
+ </div>;
42
+
43
+ this.footerRenderer = () => <div data-layout="row">
44
+ <AddIconTextButton
45
+ data-click-event="add-item"
46
+ />
47
+ </div>;
48
+
49
+ this.renderer = <div>
50
+ <div>
51
+ <AtomRepeater
52
+ data-layout="data-grid"
53
+ selectOnClick={true}
54
+ data-list-selection="default"
55
+ data-selection-updated-event="item-selected"
56
+ data-event-items-updated="items-loaded"
57
+ selectedItem={Bind.twoWaysImmediate(() => this.selectedItem)}
58
+ items={this.items}
59
+ { ... InfiniteRepeater.pagedItems((start) =>
60
+ (c, e, cancelToken) =>
61
+ this.storeService.stores({
62
+ start,
63
+ cancelToken
64
+ })
65
+ )}
66
+ itemRenderer={(store: IStore) => <div>
67
+ <label text={store.storeID}/>
68
+ <label text={store.name}/>
69
+ </div>}
70
+ />
71
+ </div>
72
+ </div>;
73
+ }
74
+
75
+ @Action({ onEvent: "items-loaded", defer: 100 })
76
+ itemsLoaded() {
77
+ if(this.selectedItem) {
78
+ if(this.items.includes(this.selectedItem)) {
79
+ return;
80
+ }
81
+ this.selectedItem = this.items.find((x) => x.storeID === this.selectedItem.storeID);
82
+ if (this.selectedItem) {
83
+ return;
84
+ }
85
+ }
86
+ this.selectedItem = this.items[0];
87
+ }
88
+
89
+ @Action({ onEvent: "item-selected"})
90
+ itemSelected() {
91
+ if(!this.selectedItem) {
92
+ return;
93
+ }
94
+ this.openDetail(AdminStoreDetailPage, this.selectedItem);
95
+ }
96
+
97
+ @Action({ onEvent: "add-item"})
98
+ async newItem() {
99
+ const name = prompt("Name of the store");
100
+ if (!name) {
101
+ return;
102
+ }
103
+ const store = Store.create({ name });
104
+ await this.storeService.save(store);
105
+ this.items.add(store);
106
+ this.selectedItem = store;
107
+ }
108
+
109
+ }
@@ -8,7 +8,7 @@ import { toFileSize } from "../../../common/NumberFormats";
8
8
  import CollectionEditor from "../../../common/controls/collection-editor/CollectionEditor";
9
9
  import EditDomainUserPage from "./domains/EditDomainUserPage";
10
10
  import EditUserMailboxPage from "./mailboxes/EditUserMailboxPage";
11
- import EditFileAcessPage from "./files/EditFileAccessPage";
11
+ import EditFileAccessPage from "./files/EditFileAccessPage";
12
12
  import { DeleteIconTextButton, SaveIconButton, SaveIconTextButton } from "../../../common/controls/buttons/IconButton";
13
13
  import Action from "@web-atoms/core/dist/view-model/Action";
14
14
  import FormField from "@web-atoms/web-controls/dist/basic/FormField";
@@ -94,7 +94,7 @@ export default class UserDetailsPage extends ContentPage {
94
94
  <CollectionEditor
95
95
  label="Drives/Files"
96
96
  model={this.model}
97
- addPage={EditFileAcessPage}
97
+ addPage={EditFileAccessPage}
98
98
  collection="fileAccessList"
99
99
  itemRenderer={(item: IAppFileAccess) => <tr>
100
100
  <td text={item.file.name }/>
@@ -11,7 +11,7 @@ import Bind from "@web-atoms/core/dist/core/Bind";
11
11
  import { SaveIconTextButton } from "../../../../common/controls/buttons/IconButton";
12
12
  import Action from "@web-atoms/core/dist/view-model/Action";
13
13
 
14
- export default class EditFileAcessPage extends PopupWindowPage {
14
+ export default class EditFileAccessPage extends PopupWindowPage {
15
15
 
16
16
  public parameters: IAppFileAccess;
17
17
 
@@ -57,4 +57,23 @@ export default class CommonCommands extends Commands {
57
57
  routeOrder: 2000,
58
58
  openPage: () => import("../pages/websites/list/WebSiteListPage")
59
59
  });
60
+
61
+ static editStore = Command.create({
62
+ route: "/stores/detail/{id}",
63
+ routeOrder: 100,
64
+ openPage: () => import("../pages/stores/StoreDetailPage")
65
+ });
66
+
67
+ static editProductList = Command.create({
68
+ route: "/stores/{storeID}",
69
+ routeOrder: 500,
70
+ openPage: () => import("../pages/stores/products/EditProductListPage")
71
+ });
72
+
73
+
74
+ static editProduct = Command.create({
75
+ route: "/stores/product/{id}",
76
+ routeOrder: 200,
77
+ openPage: () => import("../pages/stores/products/EditProductDetailPage")
78
+ });
60
79
  }
@@ -21,7 +21,13 @@ export const CountrySelect = (a) => <DropDown
21
21
  labelPath={(item) => item.isdCode?.startsWith("+") ? item.isdCode : `+${item.isdCode} ${item.value}`}
22
22
  valuePath={(item) => item.value}
23
23
  items={Bind.oneTimeAsync(() => loadCountries())}
24
- { ... a}/>
24
+ { ... a}/>;
25
+
26
+ export const CurrencySelect = (a) => <DropDown
27
+ labelPath={(item:ICountry) => item.currency + "(" + item.label + ")"}
28
+ valuePath={(item:ICountry) => item.currency}
29
+ items={Bind.oneTimeAsync(() => loadCountries())}
30
+ { ... a}/>;
25
31
 
26
32
  export const isdForCountry = async (countryCode: string) =>
27
33
  (await loadCountries()).find((x) => x.value === countryCode).isdCode;
@@ -23,7 +23,7 @@ const css = styled.css `
23
23
 
24
24
  export default class ChooserFolderPage extends PopupWindowPage<any, IAppFile> {
25
25
 
26
- public parameters: { chooseFile?: boolean };
26
+ public parameters: { chooseFile?: boolean, contentType?: string };
27
27
 
28
28
  private root: IAppFile;
29
29
 
@@ -47,7 +47,12 @@ export default class ChooserFolderPage extends PopupWindowPage<any, IAppFile> {
47
47
  name: "Drives"
48
48
  });
49
49
 
50
- const drives = await this.cloudFileService.drives({start: 0, size: -1, cancelToken: null});
50
+ const drives = await this.cloudFileService.drives({
51
+ start: 0,
52
+ size: -1,
53
+ cancelToken: null,
54
+ contentType: this.parameters.contentType
55
+ });
51
56
 
52
57
  this.root.children = drives.items;
53
58
 
@@ -0,0 +1,84 @@
1
+ import XNode from "@web-atoms/core/dist/core/XNode";
2
+ import { Inject } from "@web-atoms/core/dist/di/Inject";
3
+ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
4
+ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
5
+ import StoreService from "../../../services/store/StoreService";
6
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
7
+ import { IStore, IStoreOrder } from "../../../model/model";
8
+ import Bind from "@web-atoms/core/dist/core/Bind";
9
+ import AppCommands from "../../../web/commands/AppCommands";
10
+ import CommonCommands from "../../commands/CommonCommands";
11
+ import InfiniteRepeater from "../../controls/repeater/InfiniteRepeater";
12
+ import StoreOrderService from "../../../services/store/StoreOrderService";
13
+ import { AddIconTextButton } from "../../controls/buttons/IconButton";
14
+ import Action from "@web-atoms/core/dist/view-model/Action";
15
+
16
+ export default class StoreDetailPage extends ContentPage<{ id: any }> {
17
+
18
+ @InjectProperty
19
+ storeService: StoreService;
20
+
21
+ @InjectProperty
22
+ storeOrderService: StoreOrderService;
23
+
24
+ model: IStore;
25
+
26
+ items: IStoreOrder[] = [];
27
+ selectedItem: IStoreOrder = null;
28
+
29
+ search = "";
30
+
31
+ async init() {
32
+
33
+ this.model = await this.storeService.get(this.parameters.id);
34
+
35
+ this.title = `${this.model.name} Orders`;
36
+
37
+ this.headerRenderer = () => <div data-layout="flex-wrap-padding">
38
+ <input type="search" value={Bind.twoWaysImmediate(() => this.search)}/>
39
+ <a
40
+ data-click-event="route"
41
+ href={CommonCommands.editProductList.displayRoute({ storeID: this.parameters.id })}
42
+ text="Products"
43
+ />
44
+ </div>;
45
+
46
+ this.renderer = <div>
47
+ <div>
48
+ <AtomRepeater
49
+ data-layout="data-grid"
50
+ items={this.items}
51
+ { ... InfiniteRepeater.pagedItems((start) =>
52
+ (c, e, cancelToken) =>
53
+ this.storeOrderService.list({
54
+ storeID: this.parameters.id,
55
+ start,
56
+ search: this.search,
57
+ cancelToken
58
+ })
59
+ )}
60
+ itemRenderer={(item: IStoreOrder) => <div>
61
+ <label text={item.orderID}/>
62
+ <label text={item.orderNumber}/>
63
+ <a text={item.customer.displayName}
64
+ data-click-event="route"
65
+ />
66
+ </div>}
67
+ />
68
+ </div>
69
+ </div>;
70
+
71
+ this.footerRenderer = () => <div data-layout="row">
72
+ <AddIconTextButton
73
+ data-click-event="create-order"
74
+ text="Create Order"
75
+ />
76
+ </div>;
77
+ }
78
+
79
+ @Action({ onEvent: "create-order"})
80
+ async createOrder() {
81
+
82
+ }
83
+
84
+ }
@@ -0,0 +1,30 @@
1
+ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
2
+ import { IStoreOrder, StoreOrder } from "../../../../model/model";
3
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
4
+ import StoreOrderService from "../../../../services/store/StoreOrderService";
5
+ import XNode from "@web-atoms/core/dist/core/XNode";
6
+ import Form from "@web-atoms/web-controls/dist/basic/Form";
7
+
8
+ export default class EditOrderPage extends ContentPage<IStoreOrder> {
9
+
10
+ model: IStoreOrder;
11
+
12
+ @InjectProperty
13
+ storeOrderService: StoreOrderService;
14
+
15
+ async init() {
16
+
17
+ this.model = this.parameters.orderID
18
+ ? await this.storeOrderService.get(this.parameters.orderID)
19
+ : StoreOrder.create({
20
+ ... this.parameters
21
+ });
22
+
23
+ this.renderer = <div>
24
+ <Form>
25
+
26
+ </Form>
27
+ </div>;
28
+
29
+ }
30
+ }
@@ -0,0 +1,59 @@
1
+ import XNode from "@web-atoms/core/dist/core/XNode";
2
+ import Form from "@web-atoms/web-controls/dist/basic/Form";
3
+ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
4
+ import CollectionEditor from "../../../controls/collection-editor/CollectionEditor";
5
+ import { IStoreItem, IStoreItemPrice, IStoreItemTag } from "../../../../model/model";
6
+ import StoreItemService from "../../../../services/store/StoreItemService";
7
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
8
+ import FormField from "@web-atoms/web-controls/dist/basic/FormField";
9
+ import Bind from "@web-atoms/core/dist/core/Bind";
10
+ import EditItemPricePage from "./prices/EditItemPricePage";
11
+
12
+ export default class EditProductDetailPage extends ContentPage<{ id }> {
13
+
14
+ model: IStoreItem = null;
15
+
16
+ @InjectProperty
17
+ storeItemService: StoreItemService;
18
+
19
+ async init() {
20
+
21
+ this.model = await this.storeItemService.get(this.parameters.id);
22
+
23
+ this.renderer = <div>
24
+ <Form>
25
+ <FormField label="Name">
26
+ <input value={Bind.twoWaysImmediate(() => this.model.name)}/>
27
+ </FormField>
28
+ <FormField label="Description">
29
+ <textarea
30
+ rows="5"
31
+ cols="80"
32
+ value={Bind.twoWaysImmediate(() => this.model.name)}/>
33
+ </FormField>
34
+ <CollectionEditor
35
+ label="Prices"
36
+ model={this.model}
37
+ collection="storeItemPrices"
38
+ addPage={EditItemPricePage}
39
+ itemRenderer={(item: IStoreItemPrice) => <tr>
40
+ <td text={item.currency}/>
41
+ <td text={item.amount }/>
42
+ <td text={item.startDate}/>
43
+ <td text={item.endDate}/>
44
+ </tr>}
45
+ />
46
+ <CollectionEditor
47
+ label="Tags"
48
+ model={this.model}
49
+ collection="storeItemTags"
50
+ itemRenderer={(item: IStoreItemTag) => <tr>
51
+ <td text={item.tag.name}/>
52
+ <td text={item.tagValue}/>
53
+ </tr>}
54
+ />
55
+ </Form>
56
+ </div>;
57
+ }
58
+
59
+ }
@@ -0,0 +1,106 @@
1
+ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
2
+ import { IStoreItem, StoreItem } from "../../../../model/model";
3
+ import XNode from "@web-atoms/core/dist/core/XNode";
4
+ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
5
+ import InfiniteRepeater from "../../../controls/repeater/InfiniteRepeater";
6
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
7
+ import StoreItemService from "../../../../services/store/StoreItemService";
8
+ import CommonCommands from "../../../commands/CommonCommands";
9
+ import Action from "@web-atoms/core/dist/view-model/Action";
10
+ import Bind from "@web-atoms/core/dist/core/Bind";
11
+ import { AddIconTextButton } from "../../../controls/buttons/IconButton";
12
+ import MasterDetailPage from "@web-atoms/web-controls/dist/mobile-app/MasterDetailPage";
13
+ import EditProductDetailPage from "./EditProductDetailPage";
14
+ import { InlinePopupButton } from "@web-atoms/web-controls/dist/basic/InlinePopup";
15
+ import { MenuItem } from "@web-atoms/web-controls/dist/basic/PopupButton";
16
+
17
+ export default class EditProductListPage extends ContentPage<{ storeID }> {
18
+
19
+ search = "";
20
+
21
+ items: IStoreItem[] = [];
22
+
23
+ selectedItem = null;
24
+
25
+ @InjectProperty
26
+ storeItemService: StoreItemService;
27
+
28
+ async init() {
29
+
30
+ this.headerRenderer = () => <div data-layout="header-row">
31
+ <input type="search" value={Bind.twoWaysImmediate(() => this.search)}/>
32
+ {/* <AddIconTextButton
33
+ data-click-event="add-item"
34
+ text="Add Product"
35
+ /> */}
36
+ <InlinePopupButton
37
+ icon="fas fa-plus"
38
+ text="Add"
39
+ popup={() => <div>
40
+ <MenuItem
41
+ data-click-event="add-item"
42
+ data-item-type="product"
43
+ label="Product"/>
44
+ <MenuItem
45
+ data-click-event="add-item"
46
+ data-item-type="service"
47
+ label="Service"/>
48
+ <MenuItem
49
+ data-click-event="add-item"
50
+ data-item-type="tax"
51
+ label="Tax"/>
52
+ {/* <MenuItem
53
+ data-click-event="add-item"
54
+ data-item-type="coupon"
55
+ label="Coupon"/> */}
56
+ </div>}
57
+ ></InlinePopupButton>
58
+ </div>;
59
+
60
+ this.renderer = <div>
61
+ <div>
62
+ <AtomRepeater
63
+ data-layout="data-grid"
64
+ items={this.items}
65
+ { ... InfiniteRepeater.pagedItems((start) =>
66
+ (c, e, cancelToken) =>
67
+ this.storeItemService.list({
68
+ storeID: this.parameters.storeID,
69
+ start,
70
+ search: this.search,
71
+ cancelToken
72
+ })
73
+ )}
74
+ itemRenderer={(item: IStoreItem) => <div>
75
+ <label text={item.storeItemID}/>
76
+ <label text={item.itemType}/>
77
+ <a text={item.name}
78
+ data-click-event="route"
79
+ href={CommonCommands.editProduct.displayRoute({ id: item.storeItemID })}
80
+ />
81
+ </div>}
82
+ />
83
+ </div>
84
+ </div>;
85
+ }
86
+
87
+ @Action({ onEvent: "add-item"})
88
+ async addNew({ itemType }) {
89
+ const name = prompt("Name of the product");
90
+ if (!name) {
91
+ return;
92
+ }
93
+
94
+ const storeID = this.parameters.storeID;
95
+
96
+ const product = StoreItem.create({
97
+ name,
98
+ itemType,
99
+ storeID
100
+ });
101
+ await this.storeItemService.save(product);
102
+ this.items.add(product);
103
+ this.selectedItem = product;
104
+ }
105
+
106
+ }
@@ -0,0 +1,53 @@
1
+ import { PopupWindowPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
2
+ import { IStoreItemPrice } from "../../../../../model/model";
3
+ import XNode from "@web-atoms/core/dist/core/XNode";
4
+ import Form from "@web-atoms/web-controls/dist/basic/Form";
5
+ import FormField from "@web-atoms/web-controls/dist/basic/FormField";
6
+ import { CurrencySelect } from "../../../../controls/countries/CountrySelect";
7
+ import Bind from "@web-atoms/core/dist/core/Bind";
8
+ import DateField from "@web-atoms/web-controls/dist/basic/DateField";
9
+ import { SaveIconTextButton } from "../../../../controls/buttons/IconButton";
10
+ import Action from "@web-atoms/core/dist/view-model/Action";
11
+
12
+ export default class EditItemPricePage extends PopupWindowPage<IStoreItemPrice> {
13
+
14
+ model: IStoreItemPrice;
15
+
16
+ async init() {
17
+ this.model = this.parameters;
18
+ this.renderer = <div>
19
+ <Form>
20
+ <FormField label="Currency">
21
+ <CurrencySelect
22
+ value={Bind.twoWaysImmediate(() => this.model.currency)}
23
+ />
24
+ </FormField>
25
+ <FormField label="Amount">
26
+ <input
27
+ type="number"
28
+ value={Bind.twoWaysImmediate(() => this.model.amount)}/>
29
+ </FormField>
30
+ <FormField label="Start Date">
31
+ <DateField
32
+ value={Bind.twoWaysImmediate(() => this.model.startDate)}
33
+ />
34
+ </FormField>
35
+ <FormField label="End Date">
36
+ <DateField
37
+ value={Bind.twoWaysImmediate(() => this.model.endDate)}
38
+ />
39
+ </FormField>
40
+ <div data-layout="command-row">
41
+ <SaveIconTextButton
42
+ data-submit-event="save-currency"
43
+ />
44
+ </div>
45
+ </Form>
46
+ </div>;
47
+ }
48
+
49
+ @Action({ onEvent: "save-currency", close: true })
50
+ async saveCurrency() {
51
+ return this.model;
52
+ }
53
+ }