@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
@@ -28,15 +28,14 @@ export interface IAppFile extends IClrEntity {
28
28
  dateUpdated?: DateTime | null;
29
29
  versions?: number | null;
30
30
  sourceUrl?: string;
31
- url?: string;
32
31
  sourceEmailLogID?: number;
32
+ url?: string;
33
33
  downloadUrl?: string;
34
34
  fileContent?: IFileContent;
35
35
  creator?: IUser;
36
36
  parent?: IAppFile;
37
37
  children?: ICollection<IAppFile>;
38
38
  email?: IEmail;
39
- originalEmails?: ICollection<IEmail>;
40
39
  fileVersions?: ICollection<IAppFileVersion>;
41
40
  folderVersions?: ICollection<IAppFileVersion>;
42
41
  accessList?: ICollection<IAppFileAccess>;
@@ -53,6 +52,17 @@ export const AppFileContentDispositionArray = [{"label":"attachment","value":"at
53
52
 
54
53
  export const AppFile: IModel<IAppFile> = new Model<IAppFile>("AppFile", ["appFileID"], { isFolder: false,name: "",fileSize: 0,contentType: "",isDeleted: false,isShared: false,dateCreated: new DefaultFactory(() => new DateTime()) });
55
54
 
55
+ export interface IAccessToken extends IClrEntity {
56
+ readonly tokenID?: number;
57
+ userID?: number;
58
+ dateCreated?: DateTime;
59
+ expiryDate?: DateTime;
60
+ displaySecret?: Object;
61
+ user?: IUser;
62
+ }
63
+
64
+ export const AccessToken: IModel<IAccessToken> = new Model<IAccessToken>("AccessToken", ["tokenID"], { dateCreated: new DefaultFactory(() => new DateTime()),expiryDate: new DefaultFactory(() => new DateTime()) });
65
+
56
66
  export interface IAppFileVersion extends IClrEntity {
57
67
  readonly versionID?: number;
58
68
  fileID?: number;
@@ -107,19 +117,20 @@ export interface IFileContent extends IClrEntity {
107
117
  contentSize?: number;
108
118
  compression?: string | null;
109
119
  textDocumentID?: number | null;
120
+ deleted?: boolean;
110
121
  textDocument?: ITextDocument;
111
122
  appFiles?: ICollection<IAppFile>;
112
123
  versions?: ICollection<IAppFileVersion>;
113
124
  }
114
125
 
115
- export const FileContent: IModel<IFileContent> = new Model<IFileContent>("FileContent", ["fileContentID"], { contentHash: "",contentType: "",contentSize: 0 });
126
+ export const FileContent: IModel<IFileContent> = new Model<IFileContent>("FileContent", ["fileContentID"], { contentHash: "",contentType: "",contentSize: 0,deleted: false });
116
127
 
117
128
  export interface IConfiguration extends IClrEntity {
118
129
  name?: string;
119
- configValue?: string;
130
+ configValue?: string | null;
120
131
  }
121
132
 
122
- export const Configuration: IModel<IConfiguration> = new Model<IConfiguration>("Configuration", ["name"], { configValue: "" });
133
+ export const Configuration: IModel<IConfiguration> = new Model<IConfiguration>("Configuration", ["name"], { });
123
134
 
124
135
  export interface IContact extends IClrEntity {
125
136
  readonly contactID?: number;
@@ -132,7 +143,7 @@ export interface IContact extends IClrEntity {
132
143
  synchronization?: string | null;
133
144
  dateCreated?: DateTime;
134
145
  dateUpdated?: DateTime;
135
- previewID?: number;
146
+ previewID?: number | null;
136
147
  user?: IUser;
137
148
  mailbox?: IMailbox;
138
149
  domain?: IHostedDomain;
@@ -292,9 +303,10 @@ export interface IEmail extends IClrEntity {
292
303
  forwardCount?: number;
293
304
  replyCount?: number;
294
305
  viewCount?: number;
295
- originalFileID?: number | null;
296
- originalFileSize?: number;
297
306
  mimeFileID?: number | null;
307
+ htmlBodyID?: number | null;
308
+ emailSize?: number;
309
+ originalFileSize?: number;
298
310
  workflowID?: string | null;
299
311
  parentID?: number | null;
300
312
  forwardedID?: number | null;
@@ -302,14 +314,15 @@ export interface IEmail extends IClrEntity {
302
314
  tags?: string | null;
303
315
  senderEmail?: IEmailAddress;
304
316
  senderUser?: IUser;
305
- originalFile?: IAppFile;
317
+ mimeFile?: IEmailLog;
318
+ logs?: ICollection<IEmailLog>;
319
+ htmlBodyFile?: IEmailLog;
306
320
  parent?: IEmail;
307
321
  children?: ICollection<IEmail>;
308
322
  forwarded?: IEmail;
309
323
  forwards?: ICollection<IEmail>;
310
324
  attachments?: ICollection<IAppFile>;
311
325
  engagements?: ICollection<IEmailEngagement>;
312
- logs?: ICollection<IEmailLog>;
313
326
  recipients?: ICollection<IEmailRecipient>;
314
327
  emailTags?: ICollection<IEmailTag>;
315
328
  mailboxes?: ICollection<IMailboxEmail>;
@@ -320,7 +333,7 @@ export interface IEmail extends IClrEntity {
320
333
 
321
334
  export const EmailStatusArray = [{"label":"queued","value":"queued"},{"label":"received","value":"received"},{"label":"draft","value":"draft"},{"label":"published","value":"published"},{"label":"pending-approval","value":"pending-approval"},{"label":"scheduled","value":"scheduled"},{"label":"sent","value":"sent"},{"label":"sent-failed","value":"sent-failed"},{"label":"deleted","value":"deleted"}];
322
335
 
323
- export const Email: IModel<IEmail> = new Model<IEmail>("Email", ["emailID"], { senderName: "",received: false,dateReceived: new DefaultFactory(() => new DateTime()),dateCreated: new DefaultFactory(() => new DateTime()),status: "queued",forwardCount: 0,replyCount: 0,viewCount: 0,originalFileSize: 0 });
336
+ export const Email: IModel<IEmail> = new Model<IEmail>("Email", ["emailID"], { senderName: "",received: false,dateReceived: new DefaultFactory(() => new DateTime()),dateCreated: new DefaultFactory(() => new DateTime()),status: "queued",forwardCount: 0,replyCount: 0,viewCount: 0,emailSize: 0,originalFileSize: 0 });
324
337
 
325
338
  export interface IEmailEngagement extends IClrEntity {
326
339
  emailID?: number;
@@ -329,30 +342,33 @@ export interface IEmailEngagement extends IClrEntity {
329
342
  email?: IEmail;
330
343
  }
331
344
 
332
- export const EmailEngagement: IModel<IEmailEngagement> = new Model<IEmailEngagement>("EmailEngagement", ["emailID"], { engagement: "",count: 0 });
345
+ export const EmailEngagement: IModel<IEmailEngagement> = new Model<IEmailEngagement>("EmailEngagement", ["emailID","engagement"], { count: 0 });
333
346
 
334
347
  export interface IEmailLog extends IClrEntity {
335
348
  readonly logID?: number;
336
349
  emailID?: number;
337
350
  fileName?: string;
351
+ fileSize?: number;
338
352
  compression?: string;
339
353
  dateCreated?: DateTime;
340
354
  cloudPath?: string;
341
355
  url?: string;
342
356
  email?: IEmail;
357
+ mimeFileEmails?: ICollection<IEmail>;
358
+ htmlBodyFileEmails?: ICollection<IEmail>;
343
359
  }
344
360
 
345
- export const EmailLog: IModel<IEmailLog> = new Model<IEmailLog>("EmailLog", ["logID"], { fileName: "",compression: "",dateCreated: new DefaultFactory(() => new DateTime()),cloudPath: "" });
361
+ export const EmailLog: IModel<IEmailLog> = new Model<IEmailLog>("EmailLog", ["logID"], { fileName: "",fileSize: 0,compression: "",dateCreated: new DefaultFactory(() => new DateTime()),cloudPath: "" });
346
362
 
347
363
  export interface IEmailRecipient extends IClrEntity {
348
364
  emailID?: number;
349
365
  emailAddressID?: number;
350
366
  type?: "from" | "to" | "cc" | "bcc" | "viewer" | "editor";
351
367
  name?: string | null;
352
- replyTo?: string | null;
353
368
  dateSent?: DateTime | null;
354
369
  error?: string | null;
355
370
  status?: string | null;
371
+ replyTo?: string | null;
356
372
  emailAddressText?: string;
357
373
  email?: IEmail;
358
374
  emailAddress?: IEmailAddress;
@@ -520,9 +536,9 @@ export interface IMailboxSyncTarget extends IClrEntity {
520
536
  lastSync?: DateTime | null;
521
537
  lastSyncStatus?: "none" | "success" | "failed" | null;
522
538
  lastSyncError?: string | null;
523
- syncLog?: string;
524
539
  /** Set this property to change password */
525
540
  newPassword?: string;
541
+ syncLog?: string;
526
542
  mailbox?: IMailbox;
527
543
  }
528
544
 
@@ -586,6 +602,101 @@ export interface ISearchWordIndex extends IClrEntity {
586
602
 
587
603
  export const SearchWordIndex: IModel<ISearchWordIndex> = new Model<ISearchWordIndex>("SearchWordIndex", ["wordID","fileContentID"], { rank: 0 });
588
604
 
605
+ export interface IStore extends IClrEntity {
606
+ readonly storeID?: number;
607
+ name?: string;
608
+ storeUsers?: ICollection<IStoreUser>;
609
+ storeItems?: ICollection<IStoreItem>;
610
+ storeOrders?: ICollection<IStoreOrder>;
611
+ storeWebsites?: ICollection<IWebSiteStore>;
612
+ }
613
+
614
+ export const Store: IModel<IStore> = new Model<IStore>("Store", ["storeID"], { name: "" });
615
+
616
+ export interface IStoreUser extends IClrEntity {
617
+ storeID?: number;
618
+ userID?: number;
619
+ store?: IStore;
620
+ user?: IUser;
621
+ }
622
+
623
+ export const StoreUser: IModel<IStoreUser> = new Model<IStoreUser>("StoreUser", ["storeID","userID"], { });
624
+
625
+ export interface IStoreItem extends IClrEntity {
626
+ readonly storeItemID?: number;
627
+ storeID?: number;
628
+ name?: string;
629
+ description?: string | null;
630
+ taxName?: string | null;
631
+ taxID?: string | null;
632
+ itemType?: string;
633
+ store?: IStore;
634
+ storeItemPrices?: ICollection<IStoreItemPrice>;
635
+ storeItemTags?: ICollection<IStoreItemTag>;
636
+ }
637
+
638
+ export const StoreItem: IModel<IStoreItem> = new Model<IStoreItem>("StoreItem", ["storeItemID"], { name: "",itemType: "" });
639
+
640
+ export interface IStoreItemPrice extends IClrEntity {
641
+ readonly priceID?: number;
642
+ storeItemID?: number;
643
+ startDate?: DateTime;
644
+ endDate?: DateTime;
645
+ currency?: string;
646
+ amount?: number;
647
+ storeItem?: IStoreItem;
648
+ storeOrderItems?: ICollection<IStoreOrderItem>;
649
+ }
650
+
651
+ export const StoreItemPrice: IModel<IStoreItemPrice> = new Model<IStoreItemPrice>("StoreItemPrice", ["priceID"], { startDate: new DefaultFactory(() => new DateTime()),endDate: new DefaultFactory(() => new DateTime()),currency: "",amount: 0 });
652
+
653
+ export interface IStoreOrder extends IClrEntity {
654
+ readonly orderID?: number;
655
+ storeID?: number;
656
+ customerID?: number | null;
657
+ externalCustomerID?: string | null;
658
+ customerTaxID?: string | null;
659
+ emailAddressID?: number | null;
660
+ orderNumber?: string;
661
+ dateCreated?: DateTime;
662
+ dateUpdated?: DateTime;
663
+ startDate?: DateTime | null;
664
+ endDate?: DateTime | null;
665
+ status?: "new" | "pending" | "paid" | "delivered" | "deleted";
666
+ store?: IStore;
667
+ customer?: IUser;
668
+ storeOrderItems?: ICollection<IStoreOrderItem>;
669
+ }
670
+
671
+ export const StoreOrderStatusArray = [{"label":"new","value":"new"},{"label":"pending","value":"pending"},{"label":"paid","value":"paid"},{"label":"delivered","value":"delivered"},{"label":"deleted","value":"deleted"}];
672
+
673
+ export const StoreOrder: IModel<IStoreOrder> = new Model<IStoreOrder>("StoreOrder", ["orderID"], { orderNumber: "",dateCreated: new DefaultFactory(() => new DateTime()),dateUpdated: new DefaultFactory(() => new DateTime()),status: "new" });
674
+
675
+ export interface IStoreOrderItem extends IClrEntity {
676
+ readonly orderItemID?: number;
677
+ orderID?: number;
678
+ storeItemPriceID?: number;
679
+ sourceOrderItemID?: number | null;
680
+ quantity?: number;
681
+ amount?: number;
682
+ storeOrder?: IStoreOrder;
683
+ storeItemPrice?: IStoreItemPrice;
684
+ source?: IStoreOrderItem;
685
+ relatedOrderItems?: ICollection<IStoreOrderItem>;
686
+ }
687
+
688
+ export const StoreOrderItem: IModel<IStoreOrderItem> = new Model<IStoreOrderItem>("StoreOrderItem", ["orderItemID"], { quantity: 0,amount: 0 });
689
+
690
+ export interface IStoreItemTag extends IClrEntity {
691
+ storeItemID?: number;
692
+ tagID?: number;
693
+ tagValue?: string | null;
694
+ storeItem?: IStoreItem;
695
+ tag?: ITag;
696
+ }
697
+
698
+ export const StoreItemTag: IModel<IStoreItemTag> = new Model<IStoreItemTag>("StoreItemTag", ["storeItemID","tagID"], { });
699
+
589
700
  export interface IUser extends IClrEntity {
590
701
  readonly userID?: number;
591
702
  userName?: string;
@@ -594,16 +705,23 @@ export interface IUser extends IClrEntity {
594
705
  isExternal?: boolean;
595
706
  readonly multiFactor?: boolean;
596
707
  dateUpdated?: DateTime;
708
+ readonly storage?: number;
709
+ maxStorage?: number;
597
710
  /** Save this to change password */
598
711
  changePassword?: { oldPassword?: string;newPassword?: string;forceChangePasswordOnLogin?: boolean };
599
712
  createFolder?: boolean;
713
+ createWebSite?: boolean;
714
+ autoEnableMF?: boolean;
600
715
  createdFiles?: ICollection<IAppFile>;
601
716
  sentEmails?: ICollection<IEmail>;
717
+ accessTokens?: ICollection<IAccessToken>;
602
718
  versions?: ICollection<IAppFileVersion>;
603
719
  sessions?: ICollection<ILoginSession>;
604
720
  fileAccessList?: ICollection<IAppFileAccess>;
605
721
  contacts?: ICollection<IContact>;
606
722
  domainUsers?: ICollection<IDomainUser>;
723
+ stores?: ICollection<IStoreUser>;
724
+ storeOrders?: ICollection<IStoreOrder>;
607
725
  pins?: ICollection<IUserPin>;
608
726
  userPushSubscriptions?: ICollection<IUserPushSubscription>;
609
727
  roles?: ICollection<IUserRole>;
@@ -614,7 +732,7 @@ export interface IUser extends IClrEntity {
614
732
 
615
733
  export const UserStatusArray = [{"label":"active","value":"active"},{"label":"blocked","value":"blocked"},{"label":"locked","value":"locked"},{"label":"change-password","value":"change-password"},{"label":"external","value":"external"}];
616
734
 
617
- export const User: IModel<IUser> = new Model<IUser>("User", ["userID"], { userName: "",displayName: "",status: "active",isExternal: false,multiFactor: false,dateUpdated: new DefaultFactory(() => new DateTime()) });
735
+ export const User: IModel<IUser> = new Model<IUser>("User", ["userID"], { userName: "",displayName: "",status: "active",isExternal: false,multiFactor: false,dateUpdated: new DefaultFactory(() => new DateTime()),storage: 0,maxStorage: 0 });
618
736
 
619
737
  export interface IUserPin extends IClrEntity {
620
738
  readonly pinID?: number;
@@ -660,7 +778,7 @@ export const UserMailbox: IModel<IUserMailbox> = new Model<IUserMailbox>("UserMa
660
778
  export interface IUserAuthFactor extends IClrEntity {
661
779
  readonly authFactorID?: number;
662
780
  userID?: number;
663
- method?: "totp" | "hotp" | "fido2" | "one-time";
781
+ method?: "totp" | "hotp" | "fido2" | "one-time" | "otp";
664
782
  hint?: string | null;
665
783
  verified?: boolean;
666
784
  dateUpdated?: DateTime;
@@ -670,7 +788,7 @@ export interface IUserAuthFactor extends IClrEntity {
670
788
  user?: IUser;
671
789
  }
672
790
 
673
- export const UserAuthFactorMethodArray = [{"label":"totp","value":"totp"},{"label":"hotp","value":"hotp"},{"label":"fido2","value":"fido2"},{"label":"one-time","value":"one-time"}];
791
+ export const UserAuthFactorMethodArray = [{"label":"totp","value":"totp"},{"label":"hotp","value":"hotp"},{"label":"fido2","value":"fido2"},{"label":"one-time","value":"one-time"},{"label":"otp","value":"otp"}];
674
792
 
675
793
  export const UserAuthFactor: IModel<IUserAuthFactor> = new Model<IUserAuthFactor>("UserAuthFactor", ["authFactorID"], { method: "totp",verified: false,dateUpdated: new DefaultFactory(() => new DateTime()) });
676
794
 
@@ -678,15 +796,17 @@ export interface IWebSiteFolder extends IClrEntity {
678
796
  folderID?: number;
679
797
  currentVersionID?: number | null;
680
798
  isStatic?: boolean;
681
- isModified?: boolean;
682
799
  isTemplate?: boolean;
800
+ isModified?: boolean;
801
+ sourceWebSiteID?: number | null;
683
802
  folder?: IAppFile;
684
803
  hosts?: ICollection<IWebSiteFolderHost>;
685
804
  versions?: ICollection<IWebSiteFolderVersion>;
686
805
  channels?: ICollection<IWebSiteChannel>;
806
+ websiteStores?: ICollection<IWebSiteStore>;
687
807
  }
688
808
 
689
- export const WebSiteFolder: IModel<IWebSiteFolder> = new Model<IWebSiteFolder>("WebSiteFolder", ["folderID"], { isStatic: false,isModified: false });
809
+ export const WebSiteFolder: IModel<IWebSiteFolder> = new Model<IWebSiteFolder>("WebSiteFolder", ["folderID"], { isStatic: false,isTemplate: false,isModified: false });
690
810
 
691
811
  export interface IWebSiteFolderHost extends IClrEntity {
692
812
  host?: string;
@@ -721,6 +841,15 @@ export interface IWebSiteChannel extends IClrEntity {
721
841
 
722
842
  export const WebSiteChannel: IModel<IWebSiteChannel> = new Model<IWebSiteChannel>("WebSiteChannel", ["folderID","channelID"], { });
723
843
 
844
+ export interface IWebSiteStore extends IClrEntity {
845
+ folderID?: number;
846
+ storeID?: number;
847
+ website?: IWebSiteFolder;
848
+ store?: IStore;
849
+ }
850
+
851
+ export const WebSiteStore: IModel<IWebSiteStore> = new Model<IWebSiteStore>("WebSiteStore", ["folderID","storeID"], { });
852
+
724
853
  export interface ILoginSession extends IClrEntity {
725
854
  readonly sessionID?: number;
726
855
  userID?: number;
@@ -731,6 +860,7 @@ export interface ILoginSession extends IClrEntity {
731
860
  deviceTokenType?: string | null;
732
861
  userName?: string;
733
862
  checkPassword?: string;
863
+ passwordIsAccessToken?: boolean;
734
864
  newPassword?: string;
735
865
  /** Multi Factor Auth Token */
736
866
  timeToken?: string;
@@ -762,6 +892,7 @@ export interface ITag extends IClrEntity {
762
892
  fileTags?: ICollection<IAppFileTag>;
763
893
  emailTags?: ICollection<IEmailTag>;
764
894
  mailboxContactTags?: ICollection<IMailboxContactTag>;
895
+ storeItemTags?: ICollection<IStoreItemTag>;
765
896
  }
766
897
 
767
898
  export const Tag: IModel<ITag> = new Model<ITag>("Tag", ["tagID"], { name: "",isSystemTag: false });
@@ -186,7 +186,10 @@ export default class LocalFileService extends TaskManager {
186
186
  }
187
187
 
188
188
  if (file.size > 4 * 1024 * 1024) {
189
- extra.folder = folder;
189
+ if (folder) {
190
+ extra ??= {};
191
+ extra.folder = folder;
192
+ }
190
193
  return await this.uploadFileParts(file, extra, ct, progress);
191
194
  }
192
195
 
@@ -0,0 +1,49 @@
1
+ import DISingleton from "@web-atoms/core/dist/di/DISingleton";
2
+ import { Inject } from "@web-atoms/core/dist/di/Inject";
3
+ import EntityService from "../EntityService";
4
+ import { IStoreItem, StoreItem } from "../../model/model";
5
+ import { Sql } from "../../common/Sql";
6
+
7
+ @DISingleton()
8
+ export default class StoreItemService {
9
+
10
+ @Inject
11
+ entityService: EntityService;
12
+
13
+ get(id: any) {
14
+ return this.entityService.query(StoreItem)
15
+ .where({ id }, (p) => (x) => x.storeItemID === p.id)
16
+ .include((x) => [x.storeItemPrices, x.storeItemTags])
17
+ .firstOrDefault();
18
+ }
19
+
20
+ async list({
21
+ start = 0,
22
+ size = 100,
23
+ search = "",
24
+ storeID = void 0,
25
+ cancelToken
26
+ }) {
27
+ let q = this.entityService.query(StoreItem)
28
+ .where({ storeID }, (p) => (x) => x.storeID === p.storeID);
29
+ if (search) {
30
+ search = search + "%";
31
+ q = q.where({ search }, (p) => (x) => Sql.text.iLike(x.name, p.search)
32
+ || Sql.text.iLike(x.description, p.search));
33
+ }
34
+ return q.orderByDescending((x) => x.storeItemID)
35
+ .toPagedList({
36
+ start,
37
+ size,
38
+ cancelToken
39
+ });
40
+ }
41
+
42
+ async save(storeItem: IStoreItem) {
43
+ await this.entityService.save(storeItem, (x) =>
44
+ x.include((x) => x.storeItemPrices)
45
+ .include((x) => x.storeItemTags));
46
+ return storeItem;
47
+ }
48
+
49
+ }
@@ -0,0 +1,57 @@
1
+ import DISingleton from "@web-atoms/core/dist/di/DISingleton";
2
+ import { Inject } from "@web-atoms/core/dist/di/Inject";
3
+ import EntityService from "../EntityService";
4
+ import { IStoreOrder, StoreOrder } from "../../model/model";
5
+ import { Sql } from "../../common/Sql";
6
+
7
+ @DISingleton()
8
+ export default class StoreOrderService {
9
+
10
+ @Inject
11
+ entityService: EntityService;
12
+
13
+ get(orderID) {
14
+ return this.entityService.query(StoreOrder)
15
+ .where({ orderID }, (p) => (x) => x.orderID === p.orderID)
16
+ .include((x) => [
17
+ x.storeOrderItems.forEach((oi) => [oi.storeItemPrice.storeItem.store]),
18
+ x.customer
19
+ ])
20
+ .firstOrDefault();
21
+ }
22
+
23
+ async list({
24
+ storeID = void 0,
25
+ start = 0,
26
+ size = 100,
27
+ search = "",
28
+ cancelToken = void 0
29
+ }) {
30
+ let q = this.entityService.query(StoreOrder)
31
+ .where({ storeID }, (p) => (x) => x.storeID === p.storeID);
32
+
33
+ if (search) {
34
+ search = search + "%";
35
+ q = q.where({ search }, (p) => (x) => Sql.text.iLike(x.customer.displayName, p.search)
36
+ || x.storeOrderItems.some((oi) => Sql.text.iLike(oi.storeItemPrice.storeItem.name, p.search))
37
+ );
38
+ }
39
+
40
+ return q
41
+ .orderByDescending((x) => x.orderID)
42
+ .toPagedList({
43
+ start,
44
+ size,
45
+ cancelToken
46
+ });
47
+ }
48
+
49
+ async save(order: IStoreOrder) {
50
+ await this.entityService.save(order, (c) => c
51
+ .include((x) => x.storeOrderItems )
52
+ .thenInclude((x) => x.relatedOrderItems)
53
+ );
54
+ return order;
55
+ }
56
+
57
+ }
@@ -0,0 +1,49 @@
1
+ import DISingleton from "@web-atoms/core/dist/di/DISingleton";
2
+ import { Inject } from "@web-atoms/core/dist/di/Inject";
3
+ import EntityService from "../EntityService";
4
+ import { IStore, Store } from "../../model/model";
5
+ import { Sql } from "../../common/Sql";
6
+
7
+ @DISingleton()
8
+ export default class StoreService {
9
+
10
+ @Inject
11
+ private entityService: EntityService;
12
+
13
+ async get(storeID) {
14
+ return this.entityService.query(Store)
15
+ .where({ storeID }, (p) => (x) => x.storeID === p.storeID)
16
+ .include((x) => [x.storeUsers, x.storeWebsites.forEach((w) => w.website.folder)])
17
+ .firstOrDefault();
18
+ }
19
+
20
+ async top() {
21
+ const { items } = await this.stores({ size: 3, cancelToken: null });
22
+ return items;
23
+ }
24
+
25
+ async stores({
26
+ search = "",
27
+ start = 0,
28
+ size = 100,
29
+ cancelToken
30
+ }) {
31
+ let q = this.entityService.query(Store);
32
+ if (search) {
33
+ search = search + "%";
34
+ q = q.where({ search }, (p) => (x) => Sql.text.like(x.name, p.search));
35
+ }
36
+ return q
37
+ .orderByDescending((x) => x.storeID)
38
+ .toPagedList({
39
+ start,
40
+ size,
41
+ cancelToken
42
+ });
43
+ }
44
+
45
+ async save(store: IStore) {
46
+ await this.entityService.save(store, (x) => x);
47
+ }
48
+
49
+ }
@@ -13,6 +13,7 @@ import { toFileSize } from "../../common/NumberFormats";
13
13
  import Action from "@web-atoms/core/dist/view-model/Action";
14
14
  import CommonCommands from "../../common/commands/CommonCommands";
15
15
  import LoginService from "../../services/LoginService";
16
+ import StoreService from "../../services/store/StoreService";
16
17
 
17
18
  const css = styled.css `
18
19
  min-width: 300px;
@@ -49,7 +50,7 @@ export default class AppDrawer extends Drawer {
49
50
 
50
51
  this.user = SocialMailApp.user;
51
52
 
52
- const { mailboxes, channels, drives, websites } = await this.getItems();
53
+ const { mailboxes, channels, drives, websites, stores } = await this.getItems();
53
54
 
54
55
  this.renderer = <div>
55
56
  <div
@@ -128,6 +129,17 @@ export default class AppDrawer extends Drawer {
128
129
  commandLink={AppCommands.openWebSiteList.displayRoute({})}
129
130
  />
130
131
  </ExpanderMenu> }
132
+ {stores.length && <ExpanderMenu isExpanded={false}>
133
+ <MenuItem
134
+ icon="fas fa-dollar"
135
+ label="Stores"
136
+ commandLink={null}
137
+ />
138
+ { ... stores.map((s) => <MenuItem
139
+ label={s.name}
140
+ commandLink={AppCommands.editStore.displayRoute({ id: s.storeID})}
141
+ />)}
142
+ </ExpanderMenu>}
131
143
  { mailboxes.length && <MenuItem
132
144
  icon="fas fa-money-check-pen"
133
145
  label="Templates"
@@ -174,13 +186,15 @@ export default class AppDrawer extends Drawer {
174
186
  async getItems() {
175
187
  const ms = this.resolve(MailboxService);
176
188
  const fs = this.resolve(CloudFileService);
177
- const [mailboxes, channels, drives, websites] = await Promise.all([
189
+ const ss = this.resolve(StoreService);
190
+ const [mailboxes, channels, drives, websites, stores] = await Promise.all([
178
191
  ms.top(),
179
192
  ms.top({ isChannel: true }),
180
193
  fs.top(),
181
- fs.top(true)
194
+ fs.top(true),
195
+ ss.top()
182
196
  ]);
183
- return { mailboxes, channels, drives, websites };
197
+ return { mailboxes, channels, drives, websites, stores };
184
198
  }
185
199
 
186
200
  @Action({ onEvent: "user-logout"})
@@ -156,7 +156,7 @@ export default class ChannelDetailPage extends ContentPage {
156
156
  label="Details"
157
157
  />
158
158
  <MenuItem
159
- href={ apiPath(`/api/files/download/${email.originalFileID}`)}
159
+ href={ apiPath(`/api/emails/logs//${email.mimeFileID}/${email.emailID}.eml`)}
160
160
  icon="fas fa-download"
161
161
  label="Download"
162
162
  />
@@ -50,6 +50,7 @@ export default class CloudFileService {
50
50
  size = 50,
51
51
  search = "",
52
52
  version = 1,
53
+ contentType = void 0 as string,
53
54
  cancelToken
54
55
  }) {
55
56
  const userID = SocialMailApp.user.userID;
@@ -58,6 +59,9 @@ export default class CloudFileService {
58
59
  if (search) {
59
60
  q = q.where({ search }, (p) => (x) => Sql.text.includes(x.creator.userName, p.search));
60
61
  }
62
+ if (contentType) {
63
+ q = q.where({ contentType }, (p) => (x) => x.contentType === p.contentType);
64
+ }
61
65
  return q.include((x) => x.creator)
62
66
  .orderByDescending({userID} , (p) => (x) => x.userPins.some((s) => p.userID === s.userID))
63
67
  .thenByDescending((x) => x.fileSize)
@@ -164,7 +164,7 @@ export default class ConversationService {
164
164
  q = q.where({ search }, (p) => (x) =>
165
165
  Sql.text.iLike(x.email.subject, p.search)
166
166
  || Sql.text.iLike(x.email.textBody, p.search)
167
- || Sql.text.iLike(x.email.originalFile.fileContent.textDocument.searchable, p.search)
167
+ || x.email.attachments.some((a) => Sql.text.iLike(a.fileContent.textDocument.searchable, p.search))
168
168
  );
169
169
  }
170
170
  const emails = await q
@@ -56,14 +56,8 @@ export default class MailService {
56
56
  }
57
57
 
58
58
  async raw(email: IEmail) {
59
- const { mimeFileID, originalFileID } = email;
60
-
61
- if (mimeFileID) {
62
- return FetchBuilder.get( apiPath(`/api/emails/logs/${mimeFileID}/${email.emailID}.eml`)).responseAsText();
63
- }
64
-
65
- const file = await this.entityService.query(AppFile).where({ originalFileID }, (p) => (x) => x.appFileID === p.originalFileID).firstOrDefault();
66
- return FetchBuilder.get(file.url).responseAsText();
59
+ const { mimeFileID } = email;
60
+ return FetchBuilder.get( apiPath(`/api/emails/logs/${mimeFileID}/${email.emailID}.eml`)).responseAsText();
67
61
  }
68
62
 
69
63
  async send(email: IEmail) {