@social-mail/social-mail-client 1.2.331 → 1.2.333

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 (32) hide show
  1. package/dist/admin/AdminAppIndex.pack.js +122 -2
  2. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  3. package/dist/admin/AdminAppIndex.pack.min.js +1 -1
  4. package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
  5. package/dist/model/model.d.ts +27 -1
  6. package/dist/model/model.d.ts.map +1 -1
  7. package/dist/model/model.js +122 -2
  8. package/dist/model/model.js.map +1 -1
  9. package/dist/public/channel/ChannelView.pack.js +122 -2
  10. package/dist/public/channel/ChannelView.pack.js.map +1 -1
  11. package/dist/public/channel/ChannelView.pack.min.js +1 -1
  12. package/dist/public/channel/ChannelView.pack.min.js.map +1 -1
  13. package/dist/public/store/Store.pack.js +187 -14
  14. package/dist/public/store/Store.pack.js.map +1 -1
  15. package/dist/public/store/Store.pack.min.js +38 -10
  16. package/dist/public/store/Store.pack.min.js.map +1 -1
  17. package/dist/public/store/StoreItemDetailView.d.ts.map +1 -1
  18. package/dist/public/store/StoreItemDetailView.js +5 -6
  19. package/dist/public/store/StoreItemDetailView.js.map +1 -1
  20. package/dist/public/store/StoreItemListView.d.ts +2 -1
  21. package/dist/public/store/StoreItemListView.d.ts.map +1 -1
  22. package/dist/public/store/StoreItemListView.js +60 -6
  23. package/dist/public/store/StoreItemListView.js.map +1 -1
  24. package/dist/tsconfig.tsbuildinfo +1 -1
  25. package/dist/web/AppIndex.pack.js +122 -2
  26. package/dist/web/AppIndex.pack.js.map +1 -1
  27. package/dist/web/AppIndex.pack.min.js +1 -1
  28. package/dist/web/AppIndex.pack.min.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/model/model.ts +49 -7
  31. package/src/public/store/StoreItemDetailView.tsx +5 -7
  32. package/src/public/store/StoreItemListView.tsx +58 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-client",
3
- "version": "1.2.331",
3
+ "version": "1.2.333",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -925,6 +925,7 @@ export interface IStore extends IClrEntity {
925
925
  insights?: ICollection<IStoreInsight>;
926
926
  ledgers?: ICollection<IStoreLedger>;
927
927
  journals?: ICollection<IStoreJournal>;
928
+ tags?: ICollection<IStoreTag>;
928
929
  storeWebsites?: ICollection<IWebSiteStore>;
929
930
  }
930
931
 
@@ -932,7 +933,7 @@ export const Store: IModel<IStore> = new Model<IStore>(
932
933
  "Store",
933
934
  ["storeID"],
934
935
  { name: "" },
935
- {"name":"stores","keys":[{"name":"storeID","type":"number","generated":"identity"}],"properties":[{"name":"name","type":"string","default":["name","\"\""]},{"name":"sellerID","type":"number"},{"name":"folderID","type":"number"}],"relations":[{"name":"seller","fkMap":[{"fk":"sellerID","relatedKey":"contactID"}],"relatedName":"Contact"},{"name":"folder","fkMap":[{"fk":"folderID","relatedKey":"appFileID"}],"relatedName":"AppFile"},{"name":"storeUsers","isCollection":true,"isInverse":true,"relatedName":"StoreUser"},{"name":"configs","isCollection":true,"isInverse":true,"relatedName":"StoreConfig"},{"name":"storeItems","isCollection":true,"isInverse":true,"relatedName":"StoreItem"},{"name":"itemFolders","isCollection":true,"isInverse":true,"relatedName":"StoreItemFolder"},{"name":"insights","isCollection":true,"isInverse":true,"relatedName":"StoreInsight"},{"name":"ledgers","isCollection":true,"isInverse":true,"relatedName":"StoreLedger"},{"name":"journals","isCollection":true,"isInverse":true,"relatedName":"StoreJournal"},{"name":"storeWebsites","isCollection":true,"isInverse":true,"relatedName":"WebSiteStore"}]}
936
+ {"name":"stores","keys":[{"name":"storeID","type":"number","generated":"identity"}],"properties":[{"name":"name","type":"string","default":["name","\"\""]},{"name":"sellerID","type":"number"},{"name":"folderID","type":"number"}],"relations":[{"name":"seller","fkMap":[{"fk":"sellerID","relatedKey":"contactID"}],"relatedName":"Contact"},{"name":"folder","fkMap":[{"fk":"folderID","relatedKey":"appFileID"}],"relatedName":"AppFile"},{"name":"storeUsers","isCollection":true,"isInverse":true,"relatedName":"StoreUser"},{"name":"configs","isCollection":true,"isInverse":true,"relatedName":"StoreConfig"},{"name":"storeItems","isCollection":true,"isInverse":true,"relatedName":"StoreItem"},{"name":"itemFolders","isCollection":true,"isInverse":true,"relatedName":"StoreItemFolder"},{"name":"insights","isCollection":true,"isInverse":true,"relatedName":"StoreInsight"},{"name":"ledgers","isCollection":true,"isInverse":true,"relatedName":"StoreLedger"},{"name":"journals","isCollection":true,"isInverse":true,"relatedName":"StoreJournal"},{"name":"tags","isCollection":true,"isInverse":true,"relatedName":"StoreTag"},{"name":"storeWebsites","isCollection":true,"isInverse":true,"relatedName":"WebSiteStore"}]}
936
937
  );
937
938
  modelEntitySchemas["Store"] = Store;
938
939
 
@@ -1024,16 +1025,33 @@ export interface IStoreItemFolder extends IClrEntity {
1024
1025
  parent?: IStoreItemFolder;
1025
1026
  children?: ICollection<IStoreItemFolder>;
1026
1027
  items?: ICollection<IStoreItem>;
1028
+ tags?: ICollection<IStoreItemFolderTag>;
1027
1029
  }
1028
1030
 
1029
1031
  export const StoreItemFolder: IModel<IStoreItemFolder> = new Model<IStoreItemFolder>(
1030
1032
  "StoreItemFolder",
1031
1033
  ["itemFolderID"],
1032
1034
  { name: "",path: "" },
1033
- {"name":"store_item_folders","keys":[{"name":"itemFolderID","type":"number","generated":"identity"}],"properties":[{"name":"storeID","type":"number"},{"name":"name","type":"string","default":["name","\"\""]},{"name":"path","type":"string","default":["path","\"\""]},{"name":"parentID","type":"number"}],"relations":[{"name":"store","fkMap":[{"fk":"storeID","relatedKey":"storeID"}],"relatedName":"Store"},{"name":"parent","fkMap":[{"fk":"parentID","relatedKey":"itemFolderID"}],"relatedName":"StoreItemFolder"},{"name":"children","isCollection":true,"isInverse":true,"relatedName":"StoreItemFolder"},{"name":"items","isCollection":true,"isInverse":true,"relatedName":"StoreItem"}]}
1035
+ {"name":"store_item_folders","keys":[{"name":"itemFolderID","type":"number","generated":"identity"}],"properties":[{"name":"storeID","type":"number"},{"name":"name","type":"string","default":["name","\"\""]},{"name":"path","type":"string","default":["path","\"\""]},{"name":"parentID","type":"number"}],"relations":[{"name":"store","fkMap":[{"fk":"storeID","relatedKey":"storeID"}],"relatedName":"Store"},{"name":"parent","fkMap":[{"fk":"parentID","relatedKey":"itemFolderID"}],"relatedName":"StoreItemFolder"},{"name":"children","isCollection":true,"isInverse":true,"relatedName":"StoreItemFolder"},{"name":"items","isCollection":true,"isInverse":true,"relatedName":"StoreItem"},{"name":"tags","isCollection":true,"isInverse":true,"relatedName":"StoreItemFolderTag"}]}
1034
1036
  );
1035
1037
  modelEntitySchemas["StoreItemFolder"] = StoreItemFolder;
1036
1038
 
1039
+ export interface IStoreItemFolderTag extends IClrEntity {
1040
+ itemFolderID?: number;
1041
+ tagID?: number;
1042
+ count?: number;
1043
+ itemFolder?: IStoreItemFolder;
1044
+ tag?: ITag;
1045
+ }
1046
+
1047
+ export const StoreItemFolderTag: IModel<IStoreItemFolderTag> = new Model<IStoreItemFolderTag>(
1048
+ "StoreItemFolderTag",
1049
+ ["itemFolderID","tagID"],
1050
+ { count: 0 },
1051
+ {"name":"store_item_folder_tags","keys":[{"name":"itemFolderID","type":"number"},{"name":"tagID","type":"number"}],"properties":[{"name":"count","type":"number","default":["count","0"]}],"relations":[{"name":"itemFolder","fkMap":[{"fk":"itemFolderID","relatedKey":"itemFolderID"}],"relatedName":"StoreItemFolder"},{"name":"tag","fkMap":[{"fk":"tagID","relatedKey":"tagID"}],"relatedName":"Tag"}]}
1052
+ );
1053
+ modelEntitySchemas["StoreItemFolderTag"] = StoreItemFolderTag;
1054
+
1037
1055
  export interface IStoreItemPrice extends IClrEntity {
1038
1056
  readonly priceID?: number;
1039
1057
  storeItemID?: number;
@@ -1236,6 +1254,22 @@ export const StoreItemTax: IModel<IStoreItemTax> = new Model<IStoreItemTax>(
1236
1254
  );
1237
1255
  modelEntitySchemas["StoreItemTax"] = StoreItemTax;
1238
1256
 
1257
+ export interface IStoreTag extends IClrEntity {
1258
+ storeID?: number;
1259
+ tagID?: number;
1260
+ count?: number;
1261
+ store?: IStore;
1262
+ tag?: ITag;
1263
+ }
1264
+
1265
+ export const StoreTag: IModel<IStoreTag> = new Model<IStoreTag>(
1266
+ "StoreTag",
1267
+ ["storeID","tagID"],
1268
+ { count: 0 },
1269
+ {"name":"store_tags","keys":[{"name":"storeID","type":"number"},{"name":"tagID","type":"number"}],"properties":[{"name":"count","type":"number","default":["count","0"]}],"relations":[{"name":"store","fkMap":[{"fk":"storeID","relatedKey":"storeID"}],"relatedName":"Store"},{"name":"tag","fkMap":[{"fk":"tagID","relatedKey":"tagID"}],"relatedName":"Tag"}]}
1270
+ );
1271
+ modelEntitySchemas["StoreTag"] = StoreTag;
1272
+
1239
1273
  export interface IStoreItemTag extends IClrEntity {
1240
1274
  storeItemID?: number;
1241
1275
  tagID?: number;
@@ -1263,11 +1297,17 @@ export interface IUser extends IClrEntity {
1263
1297
  dateUpdated?: DateTime;
1264
1298
  readonly storage?: number;
1265
1299
  maxStorage?: number;
1300
+ maxWebSites?: number;
1301
+ maxExternalInboxes?: number;
1302
+ maxChildUsers?: number;
1303
+ parentID?: number | null;
1266
1304
  /** Save this to change password */
1267
1305
  changePassword?: { oldPassword?: string;newPassword?: string;forceChangePasswordOnLogin?: boolean };
1268
1306
  createFolder?: boolean;
1269
1307
  createWebSite?: boolean;
1270
1308
  autoEnableMF?: boolean;
1309
+ parent?: IUser;
1310
+ children?: ICollection<IUser>;
1271
1311
  createdFiles?: ICollection<IAppFile>;
1272
1312
  sentEmails?: ICollection<IEmail>;
1273
1313
  accessTokens?: ICollection<IAccessToken>;
@@ -1290,8 +1330,8 @@ export const UserStatusArray = [{"label":"active","value":"active"},{"label":"bl
1290
1330
  export const User: IModel<IUser> = new Model<IUser>(
1291
1331
  "User",
1292
1332
  ["userID"],
1293
- { userName: "",displayName: "",status: "active",isExternal: false,multiFactor: false,dateUpdated: new DefaultFactory(() => new DateTime()),storage: 0,maxStorage: 0 },
1294
- {"name":"users","keys":[{"name":"userID","type":"number","generated":"identity"}],"properties":[{"name":"userName","type":"string","default":["userName","\"\""]},{"name":"displayName","type":"string","default":["displayName","\"\""]},{"name":"passwordHash","type":"string","default":["passwordHash","\"\""]},{"name":"passwordSalt","type":"string","default":["passwordSalt","\"\""]},{"name":"status","type":"string","default":["status","\"active\""]},{"name":"isExternal","type":"boolean","default":["isExternal","false"]},{"name":"multiFactor","type":"boolean","default":["multiFactor","false"]},{"name":"dateUpdated","type":"DateTime","default":["dateUpdated","new DefaultFactory(() => new DateTime())"]},{"name":"storage","type":"number","default":["storage","0"]},{"name":"maxStorage","type":"number","default":["maxStorage","0"]}],"relations":[{"name":"createdFiles","isCollection":true,"isInverse":true,"relatedName":"AppFile"},{"name":"sentEmails","isCollection":true,"isInverse":true,"relatedName":"Email"},{"name":"accessTokens","isCollection":true,"isInverse":true,"relatedName":"AccessToken"},{"name":"versions","isCollection":true,"isInverse":true,"relatedName":"AppFileVersion"},{"name":"sessions","isCollection":true,"isInverse":true,"relatedName":"LoginSession"},{"name":"fileAccessList","isCollection":true,"isInverse":true,"relatedName":"AppFileAccess"},{"name":"contacts","isCollection":true,"isInverse":true,"relatedName":"Contact"},{"name":"domainUsers","isCollection":true,"isInverse":true,"relatedName":"DomainUser"},{"name":"stores","isCollection":true,"isInverse":true,"relatedName":"StoreUser"},{"name":"pins","isCollection":true,"isInverse":true,"relatedName":"UserPin"},{"name":"userPushSubscriptions","isCollection":true,"isInverse":true,"relatedName":"UserPushSubscription"},{"name":"roles","isCollection":true,"isInverse":true,"relatedName":"UserRole"},{"name":"userMailboxes","isCollection":true,"isInverse":true,"relatedName":"UserMailbox"},{"name":"authFactors","isCollection":true,"isInverse":true,"relatedName":"UserAuthFactor"},{"name":"publishedWebSiteVersions","isCollection":true,"isInverse":true,"relatedName":"WebSiteFolderVersion"}]}
1333
+ { userName: "",displayName: "",status: "active",isExternal: false,multiFactor: false,dateUpdated: new DefaultFactory(() => new DateTime()),storage: 0,maxStorage: 0,maxWebSites: 0,maxExternalInboxes: 0,maxChildUsers: 0 },
1334
+ {"name":"users","keys":[{"name":"userID","type":"number","generated":"identity"}],"properties":[{"name":"userName","type":"string","default":["userName","\"\""]},{"name":"displayName","type":"string","default":["displayName","\"\""]},{"name":"passwordHash","type":"string","default":["passwordHash","\"\""]},{"name":"passwordSalt","type":"string","default":["passwordSalt","\"\""]},{"name":"status","type":"string","default":["status","\"active\""]},{"name":"isExternal","type":"boolean","default":["isExternal","false"]},{"name":"multiFactor","type":"boolean","default":["multiFactor","false"]},{"name":"dateUpdated","type":"DateTime","default":["dateUpdated","new DefaultFactory(() => new DateTime())"]},{"name":"storage","type":"number","default":["storage","0"]},{"name":"maxStorage","type":"number","default":["maxStorage","0"]},{"name":"maxWebSites","type":"number","default":["maxWebSites","0"]},{"name":"maxExternalInboxes","type":"number","default":["maxExternalInboxes","0"]},{"name":"maxChildUsers","type":"number","default":["maxChildUsers","0"]},{"name":"parentID","type":"number"}],"relations":[{"name":"parent","fkMap":[{"fk":"parentID","relatedKey":"userID"}],"relatedName":"User"},{"name":"children","isCollection":true,"isInverse":true,"relatedName":"User"},{"name":"createdFiles","isCollection":true,"isInverse":true,"relatedName":"AppFile"},{"name":"sentEmails","isCollection":true,"isInverse":true,"relatedName":"Email"},{"name":"accessTokens","isCollection":true,"isInverse":true,"relatedName":"AccessToken"},{"name":"versions","isCollection":true,"isInverse":true,"relatedName":"AppFileVersion"},{"name":"sessions","isCollection":true,"isInverse":true,"relatedName":"LoginSession"},{"name":"fileAccessList","isCollection":true,"isInverse":true,"relatedName":"AppFileAccess"},{"name":"contacts","isCollection":true,"isInverse":true,"relatedName":"Contact"},{"name":"domainUsers","isCollection":true,"isInverse":true,"relatedName":"DomainUser"},{"name":"stores","isCollection":true,"isInverse":true,"relatedName":"StoreUser"},{"name":"pins","isCollection":true,"isInverse":true,"relatedName":"UserPin"},{"name":"userPushSubscriptions","isCollection":true,"isInverse":true,"relatedName":"UserPushSubscription"},{"name":"roles","isCollection":true,"isInverse":true,"relatedName":"UserRole"},{"name":"userMailboxes","isCollection":true,"isInverse":true,"relatedName":"UserMailbox"},{"name":"authFactors","isCollection":true,"isInverse":true,"relatedName":"UserAuthFactor"},{"name":"publishedWebSiteVersions","isCollection":true,"isInverse":true,"relatedName":"WebSiteFolderVersion"}]}
1295
1335
  );
1296
1336
  modelEntitySchemas["User"] = User;
1297
1337
 
@@ -1546,13 +1586,13 @@ modelEntitySchemas["IncomingSmsSource"] = IncomingSmsSource;
1546
1586
  export interface IVerificationToken extends IClrEntity {
1547
1587
  readonly verificationID?: number;
1548
1588
  externalID?: string | null;
1549
- externalConfig?: string | null;
1550
1589
  dateCreated?: DateTime;
1551
1590
  expiry?: DateTime;
1552
1591
  verified?: boolean;
1553
1592
  code?: string;
1554
1593
  accessCode?: string;
1555
1594
  ipAddress?: string | null;
1595
+ externalConfig?: string | null;
1556
1596
  smsConfig?: Object;
1557
1597
  loginSessions?: ICollection<ILoginSession>;
1558
1598
  authFactors?: ICollection<IUserAuthFactor>;
@@ -1563,7 +1603,7 @@ export const VerificationToken: IModel<IVerificationToken> = new Model<IVerifica
1563
1603
  "VerificationToken",
1564
1604
  ["verificationID"],
1565
1605
  { dateCreated: new DefaultFactory(() => new DateTime()),expiry: new DefaultFactory(() => new DateTime()),verified: false,code: "",accessCode: "" },
1566
- {"name":"verification_tokens","keys":[{"name":"verificationID","type":"number","generated":"identity"}],"properties":[{"name":"externalID","type":"string","default":["externalID","\"\""]},{"name":"dateCreated","type":"DateTime","default":["dateCreated","new DefaultFactory(() => new DateTime())"]},{"name":"expiry","type":"DateTime","default":["expiry","new DefaultFactory(() => new DateTime())"]},{"name":"verified","type":"boolean","default":["verified","false"]},{"name":"code","type":"string","default":["code","\"\""]},{"name":"accessCode","type":"string","default":["accessCode","\"\""]},{"name":"ipAddress","type":"string","default":["ipAddress","\"\""]}],"relations":[{"name":"loginSessions","isCollection":true,"isInverse":true,"relatedName":"LoginSession"},{"name":"authFactors","isCollection":true,"isInverse":true,"relatedName":"UserAuthFactor"},{"name":"addresses","isCollection":true,"isInverse":true,"relatedName":"VerificationTokenAddress"}]}
1606
+ {"name":"verification_tokens","keys":[{"name":"verificationID","type":"number","generated":"identity"}],"properties":[{"name":"externalID","type":"string","default":["externalID","\"\""]},{"name":"dateCreated","type":"DateTime","default":["dateCreated","new DefaultFactory(() => new DateTime())"]},{"name":"expiry","type":"DateTime","default":["expiry","new DefaultFactory(() => new DateTime())"]},{"name":"verified","type":"boolean","default":["verified","false"]},{"name":"code","type":"string","default":["code","\"\""]},{"name":"accessCode","type":"string","default":["accessCode","\"\""]},{"name":"ipAddress","type":"string","default":["ipAddress","\"\""]},{"name":"externalConfig","type":"string","default":["externalConfig","\"\""]}],"relations":[{"name":"loginSessions","isCollection":true,"isInverse":true,"relatedName":"LoginSession"},{"name":"authFactors","isCollection":true,"isInverse":true,"relatedName":"UserAuthFactor"},{"name":"addresses","isCollection":true,"isInverse":true,"relatedName":"VerificationTokenAddress"}]}
1567
1607
  );
1568
1608
  modelEntitySchemas["VerificationToken"] = VerificationToken;
1569
1609
 
@@ -1594,6 +1634,8 @@ export interface ITag extends IClrEntity {
1594
1634
  fileTags?: ICollection<IAppFileTag>;
1595
1635
  emailTags?: ICollection<IEmailTag>;
1596
1636
  mailboxContactTags?: ICollection<IMailboxContactTag>;
1637
+ storeItemFolderTags?: ICollection<IStoreItemFolderTag>;
1638
+ storeTags?: ICollection<IStoreTag>;
1597
1639
  storeItemTags?: ICollection<IStoreItemTag>;
1598
1640
  }
1599
1641
 
@@ -1601,7 +1643,7 @@ export const Tag: IModel<ITag> = new Model<ITag>(
1601
1643
  "Tag",
1602
1644
  ["tagID"],
1603
1645
  { name: "",isSystemTag: false },
1604
- {"name":"tags","keys":[{"name":"tagID","type":"number","generated":"identity"}],"properties":[{"name":"name","type":"string","default":["name","\"\""]},{"name":"lowerCaseName","type":"string","generated":"computed"},{"name":"path","type":"string","default":["path","\"\""]},{"name":"isSystemTag","type":"boolean","default":["isSystemTag","false"]},{"name":"contentTypes","type":"string","default":["contentTypes","\"\""]},{"name":"parentID","type":"number"}],"relations":[{"name":"parent","fkMap":[{"fk":"parentID","relatedKey":"tagID"}],"relatedName":"Tag"},{"name":"children","isCollection":true,"isInverse":true,"relatedName":"Tag"},{"name":"fileTags","isCollection":true,"isInverse":true,"relatedName":"AppFileTag"},{"name":"emailTags","isCollection":true,"isInverse":true,"relatedName":"EmailTag"},{"name":"mailboxContactTags","isCollection":true,"isInverse":true,"relatedName":"MailboxContactTag"},{"name":"storeItemTags","isCollection":true,"isInverse":true,"relatedName":"StoreItemTag"}]}
1646
+ {"name":"tags","keys":[{"name":"tagID","type":"number","generated":"identity"}],"properties":[{"name":"name","type":"string","default":["name","\"\""]},{"name":"lowerCaseName","type":"string","generated":"computed"},{"name":"path","type":"string","default":["path","\"\""]},{"name":"isSystemTag","type":"boolean","default":["isSystemTag","false"]},{"name":"contentTypes","type":"string","default":["contentTypes","\"\""]},{"name":"parentID","type":"number"}],"relations":[{"name":"parent","fkMap":[{"fk":"parentID","relatedKey":"tagID"}],"relatedName":"Tag"},{"name":"children","isCollection":true,"isInverse":true,"relatedName":"Tag"},{"name":"fileTags","isCollection":true,"isInverse":true,"relatedName":"AppFileTag"},{"name":"emailTags","isCollection":true,"isInverse":true,"relatedName":"EmailTag"},{"name":"mailboxContactTags","isCollection":true,"isInverse":true,"relatedName":"MailboxContactTag"},{"name":"storeItemFolderTags","isCollection":true,"isInverse":true,"relatedName":"StoreItemFolderTag"},{"name":"storeTags","isCollection":true,"isInverse":true,"relatedName":"StoreTag"},{"name":"storeItemTags","isCollection":true,"isInverse":true,"relatedName":"StoreItemTag"}]}
1605
1647
  );
1606
1648
  modelEntitySchemas["Tag"] = Tag;
1607
1649
 
@@ -17,7 +17,7 @@ import ToggleButtonBar from "@web-atoms/web-controls/dist/basic/ToggleButtonBar"
17
17
  const url = (window as any).pageUrl as URL;
18
18
 
19
19
 
20
- let {1: storeID = "4", 2: itemID = "1w" } = /^\/store\/([^\/]+)\/([^\/]+)\//.exec(url?.pathname) ?? {} as any;
20
+ let {1: storeID = "4", 2: itemID = "23" } = /^\/store\/([^\/]+)\/([^\/]+)\//.exec(url?.pathname) ?? {} as any;
21
21
 
22
22
  storeID = parseInt(storeID, 36);
23
23
  itemID = parseInt(itemID, 36);
@@ -53,6 +53,7 @@ const css = styled.css `
53
53
  display: flex;
54
54
  flex-direction: column;
55
55
  overflow: auto;
56
+ max-height: 500px;
56
57
  & > img {
57
58
  cursor: pointer;
58
59
  margin: 5px;
@@ -65,8 +66,8 @@ const css = styled.css `
65
66
  & > .preview {
66
67
  grid-row: 1;
67
68
  grid-column: 2;
68
- height: 60vh;
69
- min-width: 50vw;
69
+ height: 60%;
70
+ min-width: 50%;
70
71
  & img {
71
72
  -webkit-user-drag: none;
72
73
  }
@@ -75,7 +76,7 @@ const css = styled.css `
75
76
  }
76
77
 
77
78
  & img {
78
- max-width: 90vw;
79
+ max-width: 90%;
79
80
  }
80
81
  `.installLocal();
81
82
 
@@ -118,9 +119,6 @@ export default class StoreItemDetailView extends AtomControl {
118
119
 
119
120
  this.model = await this.getItem();
120
121
 
121
- const images = this.model.mediaFiles.where((x) => x.isPreview);
122
- this.selectedFile = images[0];
123
-
124
122
  const offer = this.model.mediaFiles.find((x) => x.title === "offer.html");
125
123
  const specifications = this.model.mediaFiles.find((x) => x.title === "specs.html");
126
124
 
@@ -6,7 +6,7 @@ import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
6
6
  import InfiniteRepeater from "../../common/controls/repeater/InfiniteRepeater";
7
7
  import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
8
8
  import EntityService from "../../services/EntityService";
9
- import { AppFile, IStoreItem, StoreItem, StoreMediaFile } from "../../model/model";
9
+ import { AppFile, IStoreItem, IStoreTag, ITag, StoreItem, StoreMediaFile, StoreTag } from "../../model/model";
10
10
  import { Sql } from "../../common/Sql";
11
11
  import { apiPath } from "../../common/apiPath";
12
12
  import SocialMailApp from "../../common/SocialMailApp";
@@ -23,14 +23,33 @@ import { storeItemLink } from "./storeItemLink";
23
23
  grid-row:1;
24
24
  padding: 10px;
25
25
  display: flex;
26
- flex-wrap: wrap;
27
-
26
+ flex-direction: column;
28
27
  gap: 10px;
28
+ & > .tags {
29
+ display: flex;
30
+ flex-wrap: wrap;
31
+ gap: 5px;
32
+ & > * {
33
+ cursor: pointer;
34
+ border-radius: 5px;
35
+ padding: 2px;
36
+ padding-left: 5px;
37
+ padding-right: 5px;
38
+ &:hover {
39
+ color: highlight;
40
+ text-decoration: underline;
41
+ }
42
+ }
43
+ }
29
44
  }
30
45
 
31
46
  & > section {
32
47
  grid-row: 2;
33
48
  padding: 10px;
49
+ display: flex;
50
+ flex-direction: row;
51
+ flex-wrap: wrap;
52
+ gap: 10px;
34
53
 
35
54
  & .store-item {
36
55
  display: inline-grid;
@@ -43,6 +62,10 @@ import { storeItemLink } from "./storeItemLink";
43
62
  & > .name {
44
63
  grid-column: 1 / span 2;
45
64
  grid-row: 1;
65
+ max-width:200px;
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ white-space: nowrap;
46
69
  }
47
70
  & > img {
48
71
  grid-column: 1 / span 2;
@@ -55,6 +78,10 @@ import { storeItemLink } from "./storeItemLink";
55
78
  grid-column: 1 / span 2;
56
79
  grid-row: 3;
57
80
  max-width: 200px;
81
+ height: 3ch;
82
+ overflow: hidden;
83
+ text-overflow: ellipsis;
84
+ white-space: nowrap;
58
85
  }
59
86
  & > .buy {
60
87
  grid-column: 2;
@@ -95,6 +122,11 @@ export default class StoreItemListView extends AtomControl {
95
122
  this.render(<div data-shopping-cart-list="shopping-cart-list">
96
123
  <header>
97
124
  <input type="search" value={Bind.twoWaysImmediate(() => this.search)}/>
125
+ <AtomRepeater
126
+ class="tags"
127
+ items={Bind.oneWayAsync((c, e, cancelToken) => this.searchTags(this.search, cancelToken), { default: [] })}
128
+ itemRenderer={(x: IStoreTag) => <label text={x.tag.name}/>}
129
+ />
98
130
  </header>
99
131
  <AtomRepeater
100
132
  for="section"
@@ -135,6 +167,25 @@ export default class StoreItemListView extends AtomControl {
135
167
 
136
168
  }
137
169
 
170
+ async searchTags(search: string, cancelToken): Promise<any> {
171
+ let q = this.entityService.query(StoreTag);
172
+ if (search) {
173
+ search = search.trim().toLocaleLowerCase() + "%";
174
+ q = q.where({ search }, (p) => (x) =>
175
+ Sql.text.like(x.tag.lowerCaseName, p.search)
176
+ || Sql.text.like(x.tag.parent.lowerCaseName, p.search)
177
+ );
178
+ }
179
+ const tags = await q
180
+ .orderByDescending((x) => x.count)
181
+ .include((x) => x.tag)
182
+ .toPagedList({
183
+ size: 20,
184
+ cancelToken
185
+ });
186
+ return tags.items;
187
+ }
188
+
138
189
  async downloadImage(item: IStoreItem) {
139
190
  const file = await this.entityService.query(StoreMediaFile, "storeQuery", item.storeItemID, item.signed)
140
191
  .orderBy((x) => x.sortOrder)
@@ -145,7 +196,7 @@ export default class StoreItemListView extends AtomControl {
145
196
 
146
197
  async searchItems({
147
198
  start,
148
- search,
199
+ search = "",
149
200
  size = 50,
150
201
  cancelToken
151
202
  }) {
@@ -157,11 +208,13 @@ export default class StoreItemListView extends AtomControl {
157
208
  );
158
209
  if (search) {
159
210
  search = search + "%";
160
- q = q.where({ search }, (p) => (x) =>
211
+ const searchLower = search.trim().toLocaleLowerCase();
212
+ q = q.where({ search, searchLower }, (p) => (x) =>
161
213
  (Sql.text.iLike(x.name, p.search)
162
214
  || Sql.text.iLike(x.description, p.search)
163
215
  || x.sizes.some((s) => Sql.text.iLike(s.name, p.search) || Sql.text.iLike(s.description, p.search))
164
216
  || x.variants.some((s) => Sql.text.iLike(s.name, p.search) || Sql.text.iLike(s.description, p.search))
217
+ || x.storeItemTags.some((t) => Sql.text.like(t.tag.lowerCaseName, p.searchLower))
165
218
  )
166
219
  && x.sizeForID === null
167
220
  && x.variantForID === null