@social-mail/social-mail-client 1.2.708 → 1.2.710

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 (72) hide show
  1. package/dist/admin/AdminAppIndex.pack.js +140 -33
  2. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  3. package/dist/admin/AdminAppIndex.pack.min.js +12 -8
  4. package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
  5. package/dist/admin/drawer/AdminDrawer.d.ts +2 -2
  6. package/dist/admin/drawer/AdminDrawer.d.ts.map +1 -1
  7. package/dist/admin/drawer/AdminDrawer.js +6 -37
  8. package/dist/admin/drawer/AdminDrawer.js.map +1 -1
  9. package/dist/common/MenuService.d.ts +7 -1
  10. package/dist/common/MenuService.d.ts.map +1 -1
  11. package/dist/common/MenuService.js +31 -2
  12. package/dist/common/MenuService.js.map +1 -1
  13. package/dist/common/controls/drawer/BaseDrawer.d.ts +5 -0
  14. package/dist/common/controls/drawer/BaseDrawer.d.ts.map +1 -0
  15. package/dist/common/controls/drawer/BaseDrawer.js +45 -0
  16. package/dist/common/controls/drawer/BaseDrawer.js.map +1 -0
  17. package/dist/common/controls/menu/MenuRepeater.d.ts +5 -0
  18. package/dist/common/controls/menu/MenuRepeater.d.ts.map +1 -0
  19. package/dist/common/controls/menu/MenuRepeater.js +34 -0
  20. package/dist/common/controls/menu/MenuRepeater.js.map +1 -0
  21. package/dist/model/model.d.ts +1 -0
  22. package/dist/model/model.d.ts.map +1 -1
  23. package/dist/model/model.js.map +1 -1
  24. package/dist/public/channel/ChannelView.pack.js.map +1 -1
  25. package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
  26. package/dist/public/preview/zip/DownloadZip.pack.js.map +1 -1
  27. package/dist/public/preview/zip/DownloadZip.pack.min.js.map +1 -1
  28. package/dist/public/store/StoreApp.pack.js +74 -5
  29. package/dist/public/store/StoreApp.pack.js.map +1 -1
  30. package/dist/public/store/StoreApp.pack.min.js +1 -1
  31. package/dist/public/store/StoreApp.pack.min.js.map +1 -1
  32. package/dist/public/store/cart/ShoppingCart.pack.js.map +1 -1
  33. package/dist/public/store/cart/ShoppingCart.pack.min.js.map +1 -1
  34. package/dist/public/store/pages/StoreOrderPage.d.ts +4 -1
  35. package/dist/public/store/pages/StoreOrderPage.d.ts.map +1 -1
  36. package/dist/public/store/pages/StoreOrderPage.js +74 -5
  37. package/dist/public/store/pages/StoreOrderPage.js.map +1 -1
  38. package/dist/site-editor-app/SiteEditorApp.pack.js +153 -68
  39. package/dist/site-editor-app/SiteEditorApp.pack.js.map +1 -1
  40. package/dist/site-editor-app/SiteEditorApp.pack.min.js +29 -6
  41. package/dist/site-editor-app/SiteEditorApp.pack.min.js.map +1 -1
  42. package/dist/site-editor-app/drawer/SiteEditorDrawer.d.ts +2 -2
  43. package/dist/site-editor-app/drawer/SiteEditorDrawer.d.ts.map +1 -1
  44. package/dist/site-editor-app/drawer/SiteEditorDrawer.js +7 -7
  45. package/dist/site-editor-app/drawer/SiteEditorDrawer.js.map +1 -1
  46. package/dist/site-editor-app/pages/store/coupons/StoreCouponsPage.d.ts.map +1 -1
  47. package/dist/site-editor-app/pages/store/coupons/StoreCouponsPage.js +5 -1
  48. package/dist/site-editor-app/pages/store/coupons/StoreCouponsPage.js.map +1 -1
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/dist/web/AppIndex.pack.js +241 -109
  51. package/dist/web/AppIndex.pack.js.map +1 -1
  52. package/dist/web/AppIndex.pack.min.js +23 -8
  53. package/dist/web/AppIndex.pack.min.js.map +1 -1
  54. package/dist/web/drawer/AppDrawer.d.ts +4 -8
  55. package/dist/web/drawer/AppDrawer.d.ts.map +1 -1
  56. package/dist/web/drawer/AppDrawer.js +63 -106
  57. package/dist/web/drawer/AppDrawer.js.map +1 -1
  58. package/dist/web/page/mails/MailboxContacts.d.ts +1 -0
  59. package/dist/web/page/mails/MailboxContacts.d.ts.map +1 -1
  60. package/dist/web/page/mails/MailboxContacts.js +6 -2
  61. package/dist/web/page/mails/MailboxContacts.js.map +1 -1
  62. package/package.json +1 -1
  63. package/src/admin/drawer/AdminDrawer.tsx +7 -33
  64. package/src/common/MenuService.ts +35 -3
  65. package/src/common/controls/drawer/BaseDrawer.tsx +35 -0
  66. package/src/common/controls/menu/MenuRepeater.tsx +22 -0
  67. package/src/model/model.ts +1 -0
  68. package/src/public/store/pages/StoreOrderPage.tsx +83 -7
  69. package/src/site-editor-app/drawer/SiteEditorDrawer.tsx +40 -34
  70. package/src/site-editor-app/pages/store/coupons/StoreCouponsPage.tsx +7 -1
  71. package/src/web/drawer/AppDrawer.tsx +70 -107
  72. package/src/web/page/mails/MailboxContacts.tsx +7 -0
@@ -0,0 +1,35 @@
1
+ import styled from "@web-atoms/core/dist/style/styled";
2
+ import { Drawer } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
3
+
4
+ const css = styled.css `
5
+ width: 300px;
6
+
7
+ background-color: var(--accent-color);
8
+
9
+ display: grid;
10
+ grid-template-rows: auto 1fr;
11
+
12
+ & > .header, & > header {
13
+ grid-row: 1;
14
+ padding: 10px;
15
+ font-size: large;
16
+ color: white;
17
+ }
18
+ & > .menus, & > section {
19
+ grid-row: 2;
20
+ background-color: canvas;
21
+ padding: var(--spacing);
22
+ margin: var(--spacing);
23
+ border-radius: 10px;
24
+ overflow: auto;
25
+ }
26
+
27
+ `.installGlobal("drawer-menu");
28
+
29
+ export default class BaseDrawer extends Drawer {
30
+
31
+ constructor(app, e = document.createElement("drawer-menu")) {
32
+ super(app, e);
33
+ }
34
+
35
+ }
@@ -0,0 +1,22 @@
1
+ import styled from "@web-atoms/core/dist/style/styled";
2
+ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
3
+
4
+ styled.css `
5
+ &[data-element][data-element][data-element] {
6
+ padding: 0;
7
+ margin: 0;
8
+ border: none;
9
+ padding-left: 0;
10
+ margin-left: 25px;
11
+ border-left: solid 1px lightgray;
12
+ & > * {
13
+ padding-left: 20px;
14
+ }
15
+ }
16
+ `.installGlobal("menu-repeater");
17
+
18
+ export default class MenuRepeater extends AtomRepeater {
19
+ constructor(app, e = document.createElement("menu-repeater")) {
20
+ super(app, e);
21
+ }
22
+ }
@@ -1232,6 +1232,7 @@ export interface IStoreItemPrice extends IClrEntity {
1232
1232
  endDate?: DateTime | null;
1233
1233
  currency?: string;
1234
1234
  amount?: number;
1235
+ taxes?: number;
1235
1236
  maxAmount?: number | null;
1236
1237
  taxIncluded?: boolean;
1237
1238
  readonly taxAmount?: number;
@@ -3,8 +3,13 @@ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
3
3
  import EntityService from "../../../services/EntityService";
4
4
  import XNode from "@web-atoms/core/dist/core/XNode";
5
5
  import Loader from "../../../common/controls/Loader";
6
- import { IStoreJournal, StoreJournal } from "../../../model/model";
6
+ import { IStoreJournal, IStoreJournalCoupon, StoreJournal, StoreJournalCoupon } from "../../../model/model";
7
7
  import { DateFormats } from "../../../common/date/DateFormats";
8
+ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
9
+ import Bind from "@web-atoms/core/dist/core/Bind";
10
+ import { AddIconTextButton } from "../../../common/controls/buttons/IconButton";
11
+ import Action from "@web-atoms/core/dist/view-model/Action";
12
+ import DateTime from "@web-atoms/date-time/dist/DateTime";
8
13
 
9
14
  export default class StoreOrderPage extends ContentPage<Partial<IStoreJournal>> {
10
15
 
@@ -13,6 +18,9 @@ export default class StoreOrderPage extends ContentPage<Partial<IStoreJournal>>
13
18
 
14
19
  model: IStoreJournal = null;
15
20
 
21
+ newCoupon: IStoreJournalCoupon = StoreJournalCoupon.create({
22
+ });
23
+
16
24
  async init() {
17
25
 
18
26
  this.renderer = <div>
@@ -21,7 +29,10 @@ export default class StoreOrderPage extends ContentPage<Partial<IStoreJournal>>
21
29
 
22
30
  const order = this.model = await this.load();
23
31
 
32
+ this.newCoupon.orderID = order.journalID;
33
+
24
34
  order.paymentAttempts ??= [];
35
+ order.orderCoupons ??= [];
25
36
  order.paymentAttempts = order.paymentAttempts.orderByDescending((x) => x.success);
26
37
 
27
38
  this.renderer = <div>
@@ -39,12 +50,21 @@ export default class StoreOrderPage extends ContentPage<Partial<IStoreJournal>>
39
50
  <td>{ DateFormats.withWeekDayAndTime(order.dateUpdated)}</td>
40
51
  </tr>
41
52
  </table>
42
- <table>
43
- { ... order.lineItems.map((item) => <tr>
44
- <td>{item.item.name}</td>
45
- <td>{item.quantity}</td>
46
- <td>{item.itemPrice.amount}</td>
47
- </tr>)}
53
+ <table style-width="300px">
54
+ <thead>
55
+ <th>Item</th>
56
+ <th>Qty</th>
57
+ <th>Amount</th>
58
+ <th>Taxes</th>
59
+ </thead>
60
+ <tbody>
61
+ { ... order.lineItems.map((item) => <tr>
62
+ <td>{item.item.name}</td>
63
+ <td>{item.quantity}</td>
64
+ <td>{item.itemPrice.amount}</td>
65
+ <td>{item.itemPrice.taxes ?? "0"}</td>
66
+ </tr>)}
67
+ </tbody>
48
68
  </table>
49
69
  <table>
50
70
  <tr>
@@ -54,6 +74,37 @@ export default class StoreOrderPage extends ContentPage<Partial<IStoreJournal>>
54
74
  </table>
55
75
 
56
76
  <br/>
77
+
78
+ <div>
79
+ <AtomRepeater
80
+ for="table"
81
+ header={true}
82
+ headerRenderer={(x) => <thead>
83
+ <th>Coupons</th>
84
+ </thead>}
85
+ itemRenderer={(x: IStoreJournalCoupon) => <tbody>
86
+ <tr>
87
+ <td colSpan={2}>
88
+ <label text={x.couponCode}/>
89
+ <i
90
+ data-click-event="delete-coupon"
91
+ class="fas fa-times-circle"/>
92
+ </td>
93
+ </tr>
94
+ </tbody>}
95
+ items={this.model.orderCoupons}
96
+ footer={Bind.oneWay(() => this.newCoupon)}
97
+ footerRenderer={() => <tfoot>
98
+ <th><input value={Bind.twoWaysImmediate(() => this.newCoupon.couponCode)}/></th>
99
+ <th>
100
+ <AddIconTextButton
101
+ data-click-event="add-coupon"
102
+ />
103
+ </th>
104
+ </tfoot>}
105
+ />
106
+ </div>
107
+
57
108
  <br/>
58
109
 
59
110
  <table>
@@ -80,9 +131,34 @@ export default class StoreOrderPage extends ContentPage<Partial<IStoreJournal>>
80
131
  x.paymentAttempts,
81
132
  x.buyer,
82
133
  x.buyerBillingAddress,
134
+ x.orderCoupons,
83
135
  x.lineItems.forEach((l) => [l.itemPrice, l.item])])
84
136
  .firstOrDefault();
85
137
  return order;
86
138
  }
87
139
 
140
+ @Action({ onEvent: "add-coupon"})
141
+ async addCoupon() {
142
+ const coupon = { ... this.newCoupon };
143
+ (this.model.orderCoupons ??= []).add(coupon);
144
+ try {
145
+ this.model.dateUpdated = DateTime.now;
146
+ await this.entityService.save(this.model, (c) => c.include((x) => x.orderCoupons));
147
+ } catch (error) {
148
+ this.model.orderCoupons.remove(coupon);
149
+ throw error;
150
+ }
151
+ location.reload();
152
+ }
153
+
154
+ @Action({
155
+ onEvent: "delete-coupon",
156
+ confirm: "Are you sure you want to delete this coupon?"
157
+ })
158
+ async deleteCoupon(coupon: IStoreJournalCoupon) {
159
+ coupon.$deleted = true;
160
+ this.model.dateUpdated = DateTime.now;
161
+ await this.entityService.save(this.model, (c) => c.include((x) => x.orderCoupons));
162
+ this.model.orderCoupons.remove(coupon);
163
+ }
88
164
  }
@@ -8,47 +8,53 @@ import { IWebSiteFolder } from "../../model/model";
8
8
  import SiteEditorCommands from "../commands/SiteEditorCommands";
9
9
  import { ExpanderMenu } from "@web-atoms/web-controls/dist/basic/Expander";
10
10
  import MenuItem from "../../common/controls/menu/MenuItem";
11
+ import BaseDrawer from "../../common/controls/drawer/BaseDrawer";
11
12
 
12
- export default class SiteEditorDrawer extends Drawer {
13
+ export default class SiteEditorDrawer extends BaseDrawer {
13
14
 
14
15
  @InjectProperty
15
16
  menuService: MenuService;
16
17
 
17
18
  async init() {
18
19
  this.renderer = <div>
19
- <AtomRepeater
20
- items={Bind.oneWay(() => this.menuService.websites)}
21
- itemRenderer={(x: IWebSiteFolder) => <ExpanderMenu isExpanded={true}>
22
- <MenuItem
23
- icon="fas fa-hard-drive"
24
- label={x.folder.name}
25
- commandLink={null}
26
- />
27
- <MenuItem
28
- label="Site Editor"
29
- commandLink={SiteEditorCommands.editWebSite.displayRoute({ id: x.folderID })}/>
30
- <MenuItem
31
- label="Site Files"
32
- commandLink={SiteEditorCommands.openFiles.displayRoute({ id: x.folderID })}/>
33
- {x.storeEnabled && <MenuItem
34
- label="Products"
35
- commandLink={SiteEditorCommands.productList.displayRoute({ storeID: x.folderID })}/>}
36
- {x.storeEnabled && <MenuItem
37
- label="Orders"
38
- commandLink={SiteEditorCommands.orderList.displayRoute({ id: x.folderID })}/>}
39
- {x.storeEnabled && <MenuItem
40
- label="Coupons"
41
- commandLink={SiteEditorCommands.couponList.displayRoute({ storeID: x.folderID })}/>}
42
- {x.storeEnabled && <MenuItem
43
- label="Payment Gateways"
44
- commandLink={SiteEditorCommands.paymentGatewayList.displayRoute({ storeID: x.folderID })}/>}
45
- </ExpanderMenu>}
46
- />
47
- <MenuItem
48
- icon="fas fa-hard-drive"
49
- label="All Websites"
50
- commandLink={SiteEditorCommands.websiteList.displayRoute({})}
51
- />
20
+ <header>
21
+ Social Websites
22
+ </header>
23
+ <section>
24
+ <AtomRepeater
25
+ items={Bind.oneWay(() => this.menuService.websites)}
26
+ itemRenderer={(x: IWebSiteFolder) => <ExpanderMenu isExpanded={true}>
27
+ <MenuItem
28
+ icon="fas fa-hard-drive"
29
+ label={x.folder.name}
30
+ commandLink={null}
31
+ />
32
+ <MenuItem
33
+ label="Site Editor"
34
+ commandLink={SiteEditorCommands.editWebSite.displayRoute({ id: x.folderID })}/>
35
+ <MenuItem
36
+ label="Site Files"
37
+ commandLink={SiteEditorCommands.openFiles.displayRoute({ id: x.folderID })}/>
38
+ {x.storeEnabled && <MenuItem
39
+ label="Products"
40
+ commandLink={SiteEditorCommands.productList.displayRoute({ storeID: x.folderID })}/>}
41
+ {x.storeEnabled && <MenuItem
42
+ label="Orders"
43
+ commandLink={SiteEditorCommands.orderList.displayRoute({ id: x.folderID })}/>}
44
+ {x.storeEnabled && <MenuItem
45
+ label="Coupons"
46
+ commandLink={SiteEditorCommands.couponList.displayRoute({ storeID: x.folderID })}/>}
47
+ {x.storeEnabled && <MenuItem
48
+ label="Payment Gateways"
49
+ commandLink={SiteEditorCommands.paymentGatewayList.displayRoute({ storeID: x.folderID })}/>}
50
+ </ExpanderMenu>}
51
+ />
52
+ <MenuItem
53
+ icon="fas fa-hard-drive"
54
+ label="All Websites"
55
+ commandLink={SiteEditorCommands.websiteList.displayRoute({})}
56
+ />
57
+ </section>
52
58
  </div>;
53
59
  }
54
60
 
@@ -23,7 +23,11 @@ export default class StoreCouponsPage extends ContentPage<{storeID }> {
23
23
 
24
24
  search = "";
25
25
 
26
- newItem = StoreCoupon.create({ type: "subtract" });
26
+ newItem = StoreCoupon.create({
27
+ type: "subtract",
28
+ active: true,
29
+ hidden: false
30
+ });
27
31
 
28
32
  async init() {
29
33
 
@@ -93,6 +97,8 @@ export default class StoreCouponsPage extends ContentPage<{storeID }> {
93
97
  @Action({ onEvent: "add-item" })
94
98
  async addItem() {
95
99
  const item = { ... this.newItem };
100
+ this.newItem.code = "";
101
+ item.storeID = this.parameters.storeID;
96
102
  if (!item.amount) {
97
103
  throw new Error("amount cannot be empty");
98
104
  }
@@ -2,7 +2,7 @@ import XNode from "@web-atoms/core/dist/core/XNode";
2
2
  import { Drawer } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
3
3
  import SocialMailApp from "../../common/SocialMailApp";
4
4
  import MenuItem from "../../common/controls/menu/MenuItem";
5
- import { IUser } from "../../model/model";
5
+ import { IAppFile, IMailbox, IUser, IWebSiteFolder } from "../../model/model";
6
6
  import styled from "@web-atoms/core/dist/style/styled";
7
7
  import AppCommands from "../commands/AppCommands";
8
8
  import { ExpanderMenu } from "@web-atoms/web-controls/dist/basic/Expander";
@@ -13,54 +13,32 @@ import CommonCommands from "../../common/commands/CommonCommands";
13
13
  import LoginService from "../../services/LoginService";
14
14
  import { AppUrlService } from "../../common/AppUrlService";
15
15
  import CloudFileService from "../../common/pages/files/service/CloudFileService";
16
+ import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
17
+ import MenuService from "../../common/MenuService";
18
+ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
19
+ import MenuRepeater from "../../common/controls/menu/MenuRepeater";
20
+ import BaseDrawer from "../../common/controls/drawer/BaseDrawer";
21
+ import Bind from "@web-atoms/core/dist/core/Bind";
16
22
 
17
- const css = styled.css `
18
- min-width: 300px;
19
-
20
- background-color: var(--accent-color);
21
-
22
- display: grid;
23
- grid-template-rows: auto 1fr;
24
-
25
- & > .header {
26
- grid-row: 1;
27
- }
28
- & > .menus {
29
- grid-row: 2;
30
- background-color: canvas;
31
- padding: var(--spacing);
32
- margin: var(--spacing);
33
- border-radius: 10px;
34
- overflow: auto;
35
- }
36
-
37
- `.installLocal();
38
23
 
39
24
  declare let BigInt: any;
40
25
 
41
- export default class AppDrawer extends Drawer {
26
+ export default class AppDrawer extends BaseDrawer {
27
+
28
+ @InjectProperty
29
+ menuService: MenuService;
42
30
 
43
31
  private user: IUser;
44
32
 
45
33
  private selected: HTMLElement;
46
34
 
47
35
  async init() {
48
- this.element.className = css;
49
36
 
50
37
  this.user = SocialMailApp.user;
51
38
 
52
- const { mailboxes, channels, drives, websites } = await this.getItems();
53
-
54
39
  this.renderer = <div>
55
- <div
56
- class="header"
57
- data-padding="large"
58
- data-font-size="large"
59
- data-color="white"
60
- text={SocialMailApp.config.name}/>
61
- <div
62
- class="menus"
63
- >
40
+ <header>{SocialMailApp.config.name}</header>
41
+ <section>
64
42
  <MenuItem
65
43
  icon="fas fa-home"
66
44
  label="Home"
@@ -72,93 +50,78 @@ export default class AppDrawer extends Drawer {
72
50
  label="Mailboxes"
73
51
  commandLink={null}
74
52
  />
75
- { ... mailboxes.map((mb) => <MenuItem
76
- commandLink={AppCommands.openMailbox.displayRoute({ id: mb.mailboxID })}
77
- label={mb.emailAddress.name}
78
- description={mb.emailAddress.emailAddress}
79
- title={mb.emailAddress.emailAddress}
80
- />)}
53
+ <MenuRepeater
54
+ items={this.menuService.mailboxes}
55
+ itemRenderer={(mb: IMailbox) => <MenuItem
56
+ commandLink={AppCommands.openMailbox.displayRoute({ id: mb.mailboxID })}
57
+ label={mb.emailAddress.name}
58
+ description={mb.emailAddress.emailAddress}
59
+ title={mb.emailAddress.emailAddress}
60
+ />}
61
+ />
81
62
  <MenuItem
82
63
  label="All"
83
64
  commandLink={AppCommands.openMailboxList.displayRoute({})}
84
65
  />
85
66
  </ExpanderMenu> }
86
- { channels.length && <ExpanderMenu isExpanded={true}>
67
+ <ExpanderMenu
68
+ style-display={Bind.oneWay(() => this.menuService.channels.length > 0)}
69
+ isExpanded={true}>
87
70
  <MenuItem
88
71
  icon="fas fa-hard-drive"
89
72
  label="Channels"
90
73
  commandLink={null}
91
74
  />
92
- { ... channels.map((mb) => <MenuItem
93
- commandLink={AppCommands.openChannel.displayRoute({ id: mb.mailboxID })}
94
- label={mb.emailAddress.name}
95
- description={mb.emailAddress.emailAddress}
96
- title={mb.emailAddress.emailAddress}
97
- />)}
98
- </ExpanderMenu> }
99
- { drives.length && <ExpanderMenu isExpanded={true}>
75
+ <MenuRepeater
76
+ items={this.menuService.channels}
77
+ itemRenderer={(mb: IMailbox) => <MenuItem
78
+ commandLink={AppCommands.openChannel.displayRoute({ id: mb.mailboxID })}
79
+ label={mb.emailAddress.name}
80
+ description={mb.emailAddress.emailAddress}
81
+ title={mb.emailAddress.emailAddress}
82
+ />}
83
+ />
84
+ </ExpanderMenu>
85
+ <ExpanderMenu
86
+ style-display={Bind.oneWay(() => this.menuService.drives.length > 0)}
87
+ isExpanded={true}>
100
88
  <MenuItem
101
89
  icon="fas fa-hard-drive"
102
90
  label="Drives"
103
91
  commandLink={null}
104
92
  />
105
- { ... drives.map((d) => <MenuItem
106
- commandLink={AppCommands.openFiles.displayRoute({ id: d.appFileID })}
107
- label={d.name}
108
- description={`${d.creator?.displayName} ${ BigInt(d.fileSize) > BigInt(0) ? "(" + toFileSize(d.fileSize) + ")" : ""}`}
109
- />)}
93
+ <MenuRepeater
94
+ items={this.menuService.drives}
95
+ itemRenderer={(d: IAppFile) => <MenuItem
96
+ commandLink={AppCommands.openFiles.displayRoute({ id: d.appFileID })}
97
+ label={d.name}
98
+ description={`${d.creator?.displayName} ${ BigInt(d.fileSize) > BigInt(0) ? "(" + toFileSize(d.fileSize) + ")" : ""}`}
99
+ />}/>
110
100
  <MenuItem
111
101
  label="All"
112
102
  commandLink={AppCommands.openDrives.displayRoute({})}
113
103
  />
114
- </ExpanderMenu> }
115
- { websites.length && <ExpanderMenu isExpanded={true}>
104
+ </ExpanderMenu>
105
+ <ExpanderMenu
106
+ style-display={Bind.oneWay(() => this.menuService.websites.length > 0)}
107
+ isExpanded={true}>
116
108
  <MenuItem
117
109
  icon="fas fa-hard-drive"
118
110
  label="Web Sites"
119
111
  commandLink={null}
120
112
  />
121
- { ... websites.map((d) => <MenuItem
122
- href={AppUrlService.editWebSite(d)}
123
- label={d.folder.name}
124
- description={toFileSize(Number(d.folder.fileSize) + Number(d.snapshotStorage))}
125
- />)}
113
+ <MenuRepeater
114
+ items={this.menuService.websites}
115
+ itemRenderer={(d: IWebSiteFolder) => <MenuItem
116
+ href={AppUrlService.editWebSite(d)}
117
+ label={d.folder.name}
118
+ description={toFileSize(Number(d.folder.fileSize) + Number(d.snapshotStorage))}
119
+ />}/>
126
120
  <MenuItem
127
121
  label="All"
128
122
  commandLink={AppCommands.openWebSiteList.displayRoute({})}
129
123
  />
130
- </ExpanderMenu> }
131
- {/* {stores.length && <ExpanderMenu isExpanded={false}>
132
- <MenuItem
133
- icon="fas fa-dollar"
134
- label="Stores"
135
- commandLink={null}
136
- />
137
- { ... stores.map((s) => <MenuItem
138
- label={s.folder.name}
139
- commandLink={AppCommands.editStore.displayRoute({ id: s.folderID})}
140
- />)}
141
- </ExpanderMenu>} */}
142
- { mailboxes.length && <MenuItem
143
- icon="fas fa-money-check-pen"
144
- label="Templates"
145
- commandLink={AppCommands.openTemplates.displayRoute({ templates: true })}
146
- /> }
147
- { mailboxes.length && <MenuItem
148
- icon="fas fa-envelopes-bulk"
149
- label="All Mailboxes"
150
- commandLink={AppCommands.openMailboxList.displayRoute({})}
151
- /> }
152
- {/* <MenuItem
153
- icon="fas fa-envelopes-bulk"
154
- label="All Mailboxes"
155
- commandLink={AppCommands.openMailboxList.displayRoute({})}
156
- />
157
- {/* <MenuItem
158
- icon="fas fa-folder"
159
- label="Files"
160
- commandLink={AppCommands.openFiles.displayRoute({})}
161
- /> */}
124
+ </ExpanderMenu>
162
125
  <ExpanderMenu isExpanded={false}>
163
126
  <MenuItem
164
127
  icon="fas fa-gears"
@@ -187,23 +150,23 @@ export default class AppDrawer extends Drawer {
187
150
  data-click-event="user-logout"
188
151
  />
189
152
  </ExpanderMenu>
190
- </div>
153
+ </section>
191
154
  </div>;
192
155
 
193
156
  }
194
157
 
195
- async getItems() {
196
- const ms = this.resolve(MailboxService);
197
- const fs = this.resolve(CloudFileService);
198
- // const ss = this.resolve(StoreService);
199
- const [mailboxes, channels, drives, websites] = await Promise.all([
200
- ms.top(),
201
- ms.top({ isChannel: true }),
202
- fs.top(),
203
- fs.topSites()
204
- ]);
205
- return { mailboxes, channels, drives, websites };
206
- }
158
+ // async getItems() {
159
+ // const ms = this.resolve(MailboxService);
160
+ // const fs = this.resolve(CloudFileService);
161
+ // // const ss = this.resolve(StoreService);
162
+ // const [mailboxes, channels, drives, websites] = await Promise.all([
163
+ // ms.top(),
164
+ // ms.top({ isChannel: true }),
165
+ // fs.top(),
166
+ // fs.topSites()
167
+ // ]);
168
+ // return { mailboxes, channels, drives, websites };
169
+ // }
207
170
 
208
171
  @Action({ onEvent: "user-logout"})
209
172
  async userLogout() {
@@ -28,6 +28,7 @@ import { toKMBString } from "../../../common/NumberFormats";
28
28
  import { MailAppEvents } from "../../commands/MailAppEvents";
29
29
  import EntityService from "../../../services/EntityService";
30
30
  import { toSentenceCase } from "../../../common/StringFormat";
31
+ import MenuService from "../../../common/MenuService";
31
32
 
32
33
  const css = styled.css `
33
34
 
@@ -189,6 +190,9 @@ export default class MailsPage extends MasterDetailPage {
189
190
  @InjectProperty
190
191
  private mailService: MailService;
191
192
 
193
+ @InjectProperty
194
+ private menuService: MenuService;
195
+
192
196
  private folders: IMailboxFolder[] = [];
193
197
 
194
198
  private currentMailbox: IMailbox;
@@ -214,6 +218,9 @@ export default class MailsPage extends MasterDetailPage {
214
218
 
215
219
  const mailboxID = this.parameters.id;
216
220
  const mailbox = this.currentMailbox = await this.mailService.mailbox(mailboxID);
221
+
222
+ this.menuService.addMailbox(this, mailbox);
223
+
217
224
  this.folder = mailbox.folders[0];
218
225
  if (mailbox.isExternal) {
219
226
  const es = this.resolve(EntityService);