@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.
- package/dist/admin/AdminAppIndex.pack.js +940 -38
- package/dist/admin/AdminAppIndex.pack.js.map +1 -1
- package/dist/admin/AdminAppIndex.pack.min.js +17 -13
- package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
- package/dist/admin/commands/AdminCommands.d.ts +1 -0
- package/dist/admin/commands/AdminCommands.d.ts.map +1 -1
- package/dist/admin/commands/AdminCommands.js +4 -0
- package/dist/admin/commands/AdminCommands.js.map +1 -1
- package/dist/admin/drawer/AdminDrawer.d.ts.map +1 -1
- package/dist/admin/drawer/AdminDrawer.js +4 -0
- package/dist/admin/drawer/AdminDrawer.js.map +1 -1
- package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts +10 -0
- package/dist/admin/pages/stores/AdminStoreDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/stores/AdminStoreDetailPage.js +92 -0
- package/dist/admin/pages/stores/AdminStoreDetailPage.js.map +1 -0
- package/dist/admin/pages/stores/AdminStoreList.d.ts +13 -0
- package/dist/admin/pages/stores/AdminStoreList.d.ts.map +1 -0
- package/dist/admin/pages/stores/AdminStoreList.js +131 -0
- package/dist/admin/pages/stores/AdminStoreList.js.map +1 -0
- package/dist/admin/pages/users/UserDetailsPage.js +3 -3
- package/dist/admin/pages/users/UserDetailsPage.js.map +1 -1
- package/dist/admin/pages/users/files/EditFileAccessPage.d.ts +1 -1
- package/dist/admin/pages/users/files/EditFileAccessPage.d.ts.map +1 -1
- package/dist/admin/pages/users/files/EditFileAccessPage.js +3 -3
- package/dist/admin/pages/users/files/EditFileAccessPage.js.map +1 -1
- package/dist/common/commands/CommonCommands.d.ts +9 -0
- package/dist/common/commands/CommonCommands.d.ts.map +1 -1
- package/dist/common/commands/CommonCommands.js +15 -0
- package/dist/common/commands/CommonCommands.js.map +1 -1
- package/dist/common/controls/countries/CountrySelect.d.ts +1 -0
- package/dist/common/controls/countries/CountrySelect.d.ts.map +1 -1
- package/dist/common/controls/countries/CountrySelect.js +6 -1
- package/dist/common/controls/countries/CountrySelect.js.map +1 -1
- package/dist/common/pages/folders/ChooserFolderPage.d.ts +1 -0
- package/dist/common/pages/folders/ChooserFolderPage.d.ts.map +1 -1
- package/dist/common/pages/folders/ChooserFolderPage.js +2 -1
- package/dist/common/pages/folders/ChooserFolderPage.js.map +1 -1
- package/dist/common/pages/stores/StoreDetailPage.d.ts +17 -0
- package/dist/common/pages/stores/StoreDetailPage.d.ts.map +1 -0
- package/dist/common/pages/stores/StoreDetailPage.js +96 -0
- package/dist/common/pages/stores/StoreDetailPage.js.map +1 -0
- package/dist/common/pages/stores/orders/EditOrderPage.d.ts +9 -0
- package/dist/common/pages/stores/orders/EditOrderPage.d.ts.map +1 -0
- package/dist/common/pages/stores/orders/EditOrderPage.js +37 -0
- package/dist/common/pages/stores/orders/EditOrderPage.js.map +1 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.d.ts +11 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.d.ts.map +1 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.js +80 -0
- package/dist/common/pages/stores/products/EditProductDetailPage.js.map +1 -0
- package/dist/common/pages/stores/products/EditProductListPage.d.ts +16 -0
- package/dist/common/pages/stores/products/EditProductListPage.d.ts.map +1 -0
- package/dist/common/pages/stores/products/EditProductListPage.js +118 -0
- package/dist/common/pages/stores/products/EditProductListPage.js.map +1 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.d.ts +8 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.d.ts.map +1 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.js +72 -0
- package/dist/common/pages/stores/products/prices/EditItemPricePage.js.map +1 -0
- package/dist/model/model.d.ts +127 -12
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +60 -8
- package/dist/model/model.js.map +1 -1
- package/dist/public/channel/ChannelView.pack.js +64 -10
- package/dist/public/channel/ChannelView.pack.js.map +1 -1
- package/dist/public/channel/ChannelView.pack.min.js +3 -3
- package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
- package/dist/services/files/LocalFileService.d.ts.map +1 -1
- package/dist/services/files/LocalFileService.js +4 -1
- package/dist/services/files/LocalFileService.js.map +1 -1
- package/dist/services/store/StoreItemService.d.ts +15 -0
- package/dist/services/store/StoreItemService.d.ts.map +1 -0
- package/dist/services/store/StoreItemService.js +65 -0
- package/dist/services/store/StoreItemService.js.map +1 -0
- package/dist/services/store/StoreOrderService.d.ts +15 -0
- package/dist/services/store/StoreOrderService.d.ts.map +1 -0
- package/dist/services/store/StoreOrderService.js +65 -0
- package/dist/services/store/StoreOrderService.js.map +1 -0
- package/dist/services/store/StoreService.d.ts +14 -0
- package/dist/services/store/StoreService.d.ts.map +1 -0
- package/dist/services/store/StoreService.js +74 -0
- package/dist/services/store/StoreService.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/web/AppIndex.pack.js +769 -89
- package/dist/web/AppIndex.pack.js.map +1 -1
- package/dist/web/AppIndex.pack.min.js +13 -13
- package/dist/web/AppIndex.pack.min.js.map +1 -1
- package/dist/web/drawer/AppDrawer.d.ts +1 -0
- package/dist/web/drawer/AppDrawer.d.ts.map +1 -1
- package/dist/web/drawer/AppDrawer.js +23 -7
- package/dist/web/drawer/AppDrawer.js.map +1 -1
- package/dist/web/page/channels/detail/ChannelDetailPage.js +1 -1
- package/dist/web/page/channels/detail/ChannelDetailPage.js.map +1 -1
- package/dist/web/page/files/service/CloudFileService.d.ts +2 -1
- package/dist/web/page/files/service/CloudFileService.d.ts.map +1 -1
- package/dist/web/page/files/service/CloudFileService.js +6 -0
- package/dist/web/page/files/service/CloudFileService.js.map +1 -1
- package/dist/web/page/mails/service/ConversationService.js +1 -1
- package/dist/web/page/mails/service/ConversationService.js.map +1 -1
- package/dist/web/page/mails/service/MailService.d.ts.map +1 -1
- package/dist/web/page/mails/service/MailService.js +2 -9
- package/dist/web/page/mails/service/MailService.js.map +1 -1
- package/dist/web/page/users/SignupPage.d.ts.map +1 -1
- package/dist/web/page/users/SignupPage.js +5 -8
- package/dist/web/page/users/SignupPage.js.map +1 -1
- package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js +3 -1
- package/node_modules/@web-atoms/web-controls/dist/basic/InlinePopup.js.map +1 -1
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts +5 -0
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.d.ts.map +1 -0
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js +84 -0
- package/node_modules/@web-atoms/web-controls/dist/basic/TypeWriter.js.map +1 -0
- package/node_modules/@web-atoms/web-controls/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@web-atoms/web-controls/package.json +1 -1
- package/node_modules/@web-atoms/web-controls/src/basic/InlinePopup.tsx +2 -2
- package/node_modules/@web-atoms/web-controls/src/basic/TypeWriter.tsx +85 -0
- package/package.json +2 -2
- package/src/admin/commands/AdminCommands.ts +5 -0
- package/src/admin/drawer/AdminDrawer.tsx +5 -0
- package/src/admin/pages/stores/AdminStoreDetailPage.tsx +74 -0
- package/src/admin/pages/stores/AdminStoreList.tsx +109 -0
- package/src/admin/pages/users/UserDetailsPage.tsx +2 -2
- package/src/admin/pages/users/files/EditFileAccessPage.tsx +1 -1
- package/src/common/commands/CommonCommands.ts +19 -0
- package/src/common/controls/countries/CountrySelect.tsx +7 -1
- package/src/common/pages/folders/ChooserFolderPage.tsx +7 -2
- package/src/common/pages/stores/StoreDetailPage.tsx +84 -0
- package/src/common/pages/stores/orders/EditOrderPage.tsx +30 -0
- package/src/common/pages/stores/products/EditProductDetailPage.tsx +59 -0
- package/src/common/pages/stores/products/EditProductListPage.tsx +106 -0
- package/src/common/pages/stores/products/prices/EditItemPricePage.tsx +53 -0
- package/src/model/model.ts +151 -20
- package/src/services/files/LocalFileService.tsx +4 -1
- package/src/services/store/StoreItemService.ts +49 -0
- package/src/services/store/StoreOrderService.ts +57 -0
- package/src/services/store/StoreService.ts +49 -0
- package/src/web/drawer/AppDrawer.tsx +18 -4
- package/src/web/page/channels/detail/ChannelDetailPage.tsx +1 -1
- package/src/web/page/files/service/CloudFileService.ts +4 -0
- package/src/web/page/mails/service/ConversationService.tsx +1 -1
- package/src/web/page/mails/service/MailService.ts +2 -8
- package/src/web/page/users/SignupPage.tsx +0 -2
- package/dist/web/page/users/SignupPage.pack.js +0 -17044
- package/dist/web/page/users/SignupPage.pack.js.map +0 -1
- package/dist/web/page/users/SignupPage.pack.min.js +0 -818
- 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.
|
|
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
|
+
"@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
|
|
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={
|
|
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
|
|
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({
|
|
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
|
+
}
|