@social-mail/social-mail-client 1.2.209 → 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 (143) hide show
  1. package/dist/admin/AdminAppIndex.pack.js +940 -38
  2. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  3. package/dist/admin/AdminAppIndex.pack.min.js +17 -13
  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 +769 -89
  83. package/dist/web/AppIndex.pack.js.map +1 -1
  84. package/dist/web/AppIndex.pack.min.js +13 -13
  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/dist/web/page/users/SignupPage.d.ts.map +1 -1
  102. package/dist/web/page/users/SignupPage.js +5 -8
  103. package/dist/web/page/users/SignupPage.js.map +1 -1
  104. package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js +3 -1
  105. package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js.map +1 -1
  106. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts +5 -0
  107. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts.map +1 -0
  108. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js +84 -0
  109. package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js.map +1 -0
  110. package/node_modules/@web-atoms/web-controls/dist/tsconfig.tsbuildinfo +1 -1
  111. package/node_modules/@web-atoms/web-controls/package.json +1 -1
  112. package/node_modules/@web-atoms/web-controls/src/basic/InlinePopup.tsx +2 -2
  113. package/node_modules/@web-atoms/web-controls/src/basic/TypeWriter.tsx +85 -0
  114. package/package.json +2 -2
  115. package/src/admin/commands/AdminCommands.ts +5 -0
  116. package/src/admin/drawer/AdminDrawer.tsx +5 -0
  117. package/src/admin/pages/stores/AdminStoreDetailPage.tsx +74 -0
  118. package/src/admin/pages/stores/AdminStoreList.tsx +109 -0
  119. package/src/admin/pages/users/UserDetailsPage.tsx +2 -2
  120. package/src/admin/pages/users/files/EditFileAccessPage.tsx +1 -1
  121. package/src/common/commands/CommonCommands.ts +19 -0
  122. package/src/common/controls/countries/CountrySelect.tsx +7 -1
  123. package/src/common/pages/folders/ChooserFolderPage.tsx +7 -2
  124. package/src/common/pages/stores/StoreDetailPage.tsx +84 -0
  125. package/src/common/pages/stores/orders/EditOrderPage.tsx +30 -0
  126. package/src/common/pages/stores/products/EditProductDetailPage.tsx +59 -0
  127. package/src/common/pages/stores/products/EditProductListPage.tsx +106 -0
  128. package/src/common/pages/stores/products/prices/EditItemPricePage.tsx +53 -0
  129. package/src/model/model.ts +151 -20
  130. package/src/services/files/LocalFileService.tsx +4 -1
  131. package/src/services/store/StoreItemService.ts +49 -0
  132. package/src/services/store/StoreOrderService.ts +57 -0
  133. package/src/services/store/StoreService.ts +49 -0
  134. package/src/web/drawer/AppDrawer.tsx +18 -4
  135. package/src/web/page/channels/detail/ChannelDetailPage.tsx +1 -1
  136. package/src/web/page/files/service/CloudFileService.ts +4 -0
  137. package/src/web/page/mails/service/ConversationService.tsx +1 -1
  138. package/src/web/page/mails/service/MailService.ts +2 -8
  139. package/src/web/page/users/SignupPage.tsx +0 -2
  140. package/dist/web/page/users/SignupPage.pack.js +0 -17044
  141. package/dist/web/page/users/SignupPage.pack.js.map +0 -1
  142. package/dist/web/page/users/SignupPage.pack.min.js +0 -818
  143. package/dist/web/page/users/SignupPage.pack.min.js.map +0 -1
@@ -0,0 +1,85 @@
1
+ import XNode from "@web-atoms/core/dist/core/XNode";
2
+ import sleep from "@web-atoms/core/dist/core/sleep";
3
+ import { CancelToken } from "@web-atoms/core/dist/core/types";
4
+ import styled from "@web-atoms/core/dist/style/styled";
5
+ import { AtomControl } from "@web-atoms/core/dist/web/controls/AtomControl";
6
+
7
+ styled.css `
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: start;
11
+ white-space: nowrap;
12
+ padding-right: 1px;
13
+ border-right-style: solid;
14
+ border-right-width: 2px;
15
+ border-right-color: currentColor;
16
+ `.installGlobal("[data-component=type-writer]");
17
+
18
+ const disposableProperty = Symbol("type-writer-timer");
19
+
20
+ const nbsp = "\u202f";
21
+
22
+ const tp = AtomControl.registerProperty("data-type-writer","type-writer", (c, e, value) => {
23
+
24
+ e[disposableProperty]?.cancel();
25
+
26
+ const ct = new CancelToken();
27
+ e[disposableProperty] = ct;
28
+ c.app.runAsync(async () => {
29
+
30
+ const separator = e.getAttribute("separator") ?? e.getAttribute("data-separator") ?? ",";
31
+
32
+ const typeDelay = Number(e.getAttribute("type-delay") ?? e.getAttribute("data-type-delay") ?? "180");
33
+
34
+ const pause = Number(e.getAttribute("pause") ?? e.getAttribute("data-pause") ?? "700");
35
+
36
+ const deleteDelay = Number(e.getAttribute("delete-delay") ?? e.getAttribute("data-delete-delay") ?? "100");
37
+
38
+ const textList = value
39
+ .split(separator)
40
+ .map((x) => x.trim())
41
+ .filter((x) => x);
42
+
43
+ e.textContent = nbsp;
44
+
45
+ let index = 0;
46
+ const max = textList.length;
47
+
48
+
49
+ while(!ct.cancelled) {
50
+ if (!e.isConnected) {
51
+ return;
52
+ }
53
+ const current = textList[index];
54
+
55
+ let length = 0;
56
+
57
+ // forward...
58
+ while(length < current.length) {
59
+ e.textContent = current.substring(0, ++length) || nbsp;
60
+ await sleep(typeDelay);
61
+ }
62
+
63
+ await sleep(pause);
64
+
65
+ while(length) {
66
+ e.textContent = current.substring(0, --length) || nbsp;
67
+ await sleep(deleteDelay);
68
+ }
69
+
70
+ await sleep(deleteDelay);
71
+
72
+ index++;
73
+ if (index === max) {
74
+ index = 0;
75
+ }
76
+ }
77
+ });
78
+ });
79
+
80
+ export default function TypeWriter({ text, ... a}) {
81
+ return <div
82
+ data-component="type-writer"
83
+ { ... tp(text)}
84
+ { ... a}></div>;
85
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-client",
3
- "version": "1.2.209",
3
+ "version": "1.2.211",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -19,7 +19,7 @@
19
19
  "@web-atoms/font-awesome": "^1.0.37",
20
20
  "@web-atoms/hybrid-clr": "^1.0.21",
21
21
  "@web-atoms/module-loader": "^2.1.42",
22
- "@web-atoms/web-controls": "^2.4.22",
22
+ "@web-atoms/web-controls": "^2.4.25",
23
23
  "reflect-metadata": "^0.1.13",
24
24
  "tinycolor2": "^1.6.0"
25
25
  },
@@ -47,4 +47,9 @@ export default class AdminCommands extends CommonCommands {
47
47
  openPage: () => import("../pages/repair/RepairPage")
48
48
  });
49
49
 
50
+ static editStores = Command.create({
51
+ route: "/admin/stores",
52
+ openPage: () => import("../pages/stores/AdminStoreList")
53
+ });
54
+
50
55
  }
@@ -76,6 +76,11 @@ export default class AdminDrawer extends Drawer {
76
76
  label="Web Sites"
77
77
  commandLink={CommonCommands.openWebSiteList.displayRoute({})}
78
78
  />
79
+ <MenuItem
80
+ icon="fas fa-dollar"
81
+ label="Stores"
82
+ commandLink={AdminCommands.editStores.displayRoute({})}
83
+ />
79
84
  <MenuItem
80
85
  icon="fas fa-gear"
81
86
  label="Config"
@@ -0,0 +1,74 @@
1
+ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
2
+ import { IStore, IStoreUser, IWebSiteStore, StoreUser, WebSiteFolder, WebSiteStore } from "../../../model/model";
3
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
4
+ import StoreService from "../../../services/store/StoreService";
5
+ import XNode from "@web-atoms/core/dist/core/XNode";
6
+ import Form from "@web-atoms/web-controls/dist/basic/Form";
7
+ import CollectionEditor from "../../../common/controls/collection-editor/CollectionEditor";
8
+ import PageNavigator from "@web-atoms/web-controls/dist/PageNavigator";
9
+ import ChooserFolderPage from "../../../common/pages/folders/ChooserFolderPage";
10
+ import ChooseUserPage from "../users/ChooseUserPage";
11
+
12
+ export default class AdminStoreDetailPage extends ContentPage<IStore> {
13
+
14
+ public model: IStore;
15
+
16
+ @InjectProperty
17
+ private storeService: StoreService;
18
+
19
+ async init() {
20
+
21
+ this.model = await this.storeService.get(this.parameters.storeID);
22
+
23
+ this.title = this.model.name;
24
+
25
+ this.renderer = <div>
26
+ <Form>
27
+ <div data-layout="vertical-flex-stretch-items">
28
+ <div data-layout="frame-vertical-flex">
29
+ </div>
30
+ </div>
31
+
32
+ <CollectionEditor
33
+ label="WebSites"
34
+ model={this.model}
35
+ collection="storeWebsites"
36
+ itemFactory={() => this.chooseWebSite()}
37
+ itemRenderer={(item: IWebSiteStore) => <tr>
38
+ <td text={item.website.folder.name }/>
39
+ </tr>}
40
+ />
41
+
42
+ <CollectionEditor
43
+ label="Users"
44
+ model={this.model}
45
+ collection="storeUsers"
46
+ itemFactory={() => this.chooseUser()}
47
+ itemRenderer={(item: IStoreUser) => <tr>
48
+ <td text={item.user.displayName }/>
49
+ <td text={item.user.userName}/>
50
+ </tr>}
51
+ />
52
+
53
+ </Form>
54
+ </div>;
55
+ }
56
+
57
+ async chooseUser() {
58
+ const user = await PageNavigator.pushPageForResult(ChooseUserPage);
59
+ return StoreUser.create({
60
+ user,
61
+ userID: user.userID
62
+ });
63
+ }
64
+
65
+ async chooseWebSite() {
66
+ const folder = await PageNavigator.pushPageForResult(ChooserFolderPage, { contentType: "application/site"});
67
+ return WebSiteStore.create({
68
+ folderID: folder.appFileID,
69
+ website: WebSiteFolder.create({
70
+ folder
71
+ })
72
+ });
73
+ }
74
+ }
@@ -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
+ }