@social-mail/social-mail-client 1.2.18 → 1.2.20

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 (70) hide show
  1. package/content/modules/monaco/monaco.html +50 -0
  2. package/content/modules/monaco/monaco.mjs +26 -0
  3. package/dist/admin/AdminAppIndex.pack.js +328 -51
  4. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  5. package/dist/admin/AdminAppIndex.pack.min.js +46 -17
  6. package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
  7. package/dist/code-editor/CodeEditorPage.d.ts +6 -0
  8. package/dist/code-editor/CodeEditorPage.d.ts.map +1 -0
  9. package/dist/code-editor/CodeEditorPage.js +34 -0
  10. package/dist/code-editor/CodeEditorPage.js.map +1 -0
  11. package/dist/code-editor/MonaoEditor.d.ts +15 -0
  12. package/dist/code-editor/MonaoEditor.d.ts.map +1 -0
  13. package/dist/code-editor/MonaoEditor.js +98 -0
  14. package/dist/code-editor/MonaoEditor.js.map +1 -0
  15. package/dist/common/pages/websites/manage/ManageWebSitePage.d.ts.map +1 -1
  16. package/dist/common/pages/websites/manage/ManageWebSitePage.js +11 -2
  17. package/dist/common/pages/websites/manage/ManageWebSitePage.js.map +1 -1
  18. package/dist/common/pages/websites/studio/WebSiteStudioPage.d.ts.map +1 -1
  19. package/dist/common/pages/websites/studio/WebSiteStudioPage.js +1 -1
  20. package/dist/common/pages/websites/studio/WebSiteStudioPage.js.map +1 -1
  21. package/dist/site-editor/editor/HtmlPageEditor.d.ts +3 -0
  22. package/dist/site-editor/editor/HtmlPageEditor.d.ts.map +1 -1
  23. package/dist/site-editor/editor/HtmlPageEditor.js +62 -1
  24. package/dist/site-editor/editor/HtmlPageEditor.js.map +1 -1
  25. package/dist/site-editor/editor/WebSitePageEditor.d.ts +1 -0
  26. package/dist/site-editor/editor/WebSitePageEditor.d.ts.map +1 -1
  27. package/dist/site-editor/editor/WebSitePageEditor.js +15 -2
  28. package/dist/site-editor/editor/WebSitePageEditor.js.map +1 -1
  29. package/dist/site-editor/properties/controls/PropertyEditor.d.ts.map +1 -1
  30. package/dist/site-editor/properties/controls/PropertyEditor.js +35 -6
  31. package/dist/site-editor/properties/controls/PropertyEditor.js.map +1 -1
  32. package/dist/site-editor/styler/Styler.js +5 -5
  33. package/dist/site-editor/styler/Styler.js.map +1 -1
  34. package/dist/site-editor/toolbars/UndoRedoToolbar.d.ts.map +1 -1
  35. package/dist/site-editor/toolbars/UndoRedoToolbar.js +4 -12
  36. package/dist/site-editor/toolbars/UndoRedoToolbar.js.map +1 -1
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/dist/web/AppIndex.pack.js +328 -51
  39. package/dist/web/AppIndex.pack.js.map +1 -1
  40. package/dist/web/AppIndex.pack.min.js +46 -17
  41. package/dist/web/AppIndex.pack.min.js.map +1 -1
  42. package/dist/web/page/files/FolderPage.d.ts +2 -0
  43. package/dist/web/page/files/FolderPage.d.ts.map +1 -1
  44. package/dist/web/page/files/FolderPage.js +39 -16
  45. package/dist/web/page/files/FolderPage.js.map +1 -1
  46. package/dist/web/page/files/service/CloudFileService.d.ts +1 -0
  47. package/dist/web/page/files/service/CloudFileService.d.ts.map +1 -1
  48. package/dist/web/page/files/service/CloudFileService.js +11 -0
  49. package/dist/web/page/files/service/CloudFileService.js.map +1 -1
  50. package/node_modules/@web-atoms/module-loader/package.json +1 -1
  51. package/node_modules/@web-atoms/module-loader/umd/src/AmdLoader.ts +5 -5
  52. package/node_modules/@web-atoms/module-loader/umd.js +5 -5
  53. package/node_modules/@web-atoms/module-loader/umd.js.map +1 -1
  54. package/node_modules/@web-atoms/web-controls/dist/basic/styles/repeater-style.js +1 -0
  55. package/node_modules/@web-atoms/web-controls/dist/basic/styles/repeater-style.js.map +1 -1
  56. package/node_modules/@web-atoms/web-controls/dist/tsconfig.tsbuildinfo +1 -1
  57. package/node_modules/@web-atoms/web-controls/package.json +1 -1
  58. package/node_modules/@web-atoms/web-controls/src/basic/styles/repeater-style.ts +1 -0
  59. package/package.json +3 -3
  60. package/src/code-editor/CodeEditorPage.tsx +18 -0
  61. package/src/code-editor/MonaoEditor.tsx +92 -0
  62. package/src/common/pages/websites/manage/ManageWebSitePage.tsx +7 -0
  63. package/src/common/pages/websites/studio/WebSiteStudioPage.tsx +4 -1
  64. package/src/site-editor/editor/HtmlPageEditor.tsx +54 -0
  65. package/src/site-editor/editor/WebSitePageEditor.tsx +9 -0
  66. package/src/site-editor/properties/controls/PropertyEditor.tsx +39 -7
  67. package/src/site-editor/styler/Styler.ts +5 -5
  68. package/src/site-editor/toolbars/UndoRedoToolbar.tsx +2 -8
  69. package/src/web/page/files/FolderPage.tsx +57 -29
  70. package/src/web/page/files/service/CloudFileService.ts +4 -0
@@ -58,6 +58,7 @@ import { List } from "../blocks/List";
58
58
  grid-column: 3;
59
59
  border-left: solid 1px lightgray;
60
60
  border-radius: 0;
61
+ overflow: auto;
61
62
  }
62
63
 
63
64
  & > [data-element=editor] {
@@ -221,6 +222,25 @@ export default class HtmlPageEditor extends AtomControl {
221
222
  this.hover.update(target);
222
223
  }, { capture: true });
223
224
 
225
+ this.htmlDocument.addEventListener("keydown", (e) => {
226
+ if(e.ctrlKey || e.metaKey) {
227
+ switch(e.key) {
228
+ case "s":
229
+ this.contentEditor.dispatchEvent(new CustomEvent("savePage", { bubbles: true }));
230
+ e.preventDefault();
231
+ break;
232
+ case "z":
233
+ this.contentEditor.dispatchEvent(new CustomEvent("undo", { bubbles: true }));
234
+ e.preventDefault();
235
+ break;
236
+ case "y":
237
+ this.contentEditor.dispatchEvent(new CustomEvent("redo", { bubbles: true }));
238
+ e.preventDefault();
239
+ break;
240
+ }
241
+ }
242
+ });
243
+
224
244
  InstallDragDropHelper(this);
225
245
 
226
246
  this.htmlDocument.close();
@@ -346,6 +366,12 @@ export default class HtmlPageEditor extends AtomControl {
346
366
  </div>
347
367
  </div>
348
368
  <div data-element="right">
369
+ <button
370
+ data-click-event="open-variables"
371
+ data-layout="icon-button">
372
+ <i class="fas fa-code"/>
373
+ Variables
374
+ </button>
349
375
  <Properties/>
350
376
  </div>
351
377
  </div>);
@@ -405,6 +431,22 @@ export default class HtmlPageEditor extends AtomControl {
405
431
  return this.insertImage(prompt("Image Src", ""));
406
432
  }
407
433
 
434
+ @Action({ onEvent: "keyup"})
435
+ onKeyUp(d, ke: KeyboardEvent) {
436
+ if (ke.ctrlKey) {
437
+ switch(ke.key) {
438
+ case "z":
439
+ ke.preventDefault();
440
+ this.undo();
441
+ break;
442
+ case "y":
443
+ ke.preventDefault();
444
+ this.redo();
445
+ break;
446
+ }
447
+ }
448
+ }
449
+
408
450
  async insertImage(src: string, style?: { [key: string]: string}) {
409
451
  let img: HTMLImageElement;
410
452
  if(this.selection.isImage) {
@@ -486,6 +528,18 @@ export default class HtmlPageEditor extends AtomControl {
486
528
  }, 100);
487
529
  }
488
530
 
531
+ @Action({ onEvent: "undo"})
532
+ undo() {
533
+ this.redoList.insert(this.redoList.length, this.htmlDocument.documentElement.innerHTML);
534
+ this.htmlDocument.documentElement.innerHTML = this.undoList.removeAt(this.undoList.length-1);
535
+ }
536
+
537
+ @Action({ onEvent: "redo"})
538
+ redo() {
539
+ this.undoList.insert(this.undoList.length, this.htmlDocument.documentElement.innerHTML);
540
+ this.htmlDocument.documentElement.innerHTML = this.redoList.removeAt(this.redoList.length-1);
541
+ }
542
+
489
543
  protected async setStylerSheet() {
490
544
  const document = this.htmlDocument;
491
545
  let style = document.querySelector(`[styler-style-sheet]`);
@@ -7,6 +7,9 @@ import { StylerSet } from "../styler/StylerSet";
7
7
  import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
8
8
  import CloudFileService from "../../web/page/files/service/CloudFileService";
9
9
  import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
10
+ import Action from "@web-atoms/core/dist/view-model/Action";
11
+ import MonacoEditor from "../../code-editor/MonaoEditor";
12
+ import CodeEditorPage from "../../code-editor/CodeEditorPage";
10
13
 
11
14
  export default class WebSitePageEditor extends HtmlPageEditor {
12
15
 
@@ -22,6 +25,12 @@ export default class WebSitePageEditor extends HtmlPageEditor {
22
25
  await this.insertImage(src);
23
26
  }
24
27
 
28
+ @Action({ onEvent: "open-variables"})
29
+ async openVariables() {
30
+ const file = await this.cloudFileService.children(this.folder.appFileID, "vars.css").firstOrDefault();
31
+ await PageNavigator.pushPage(CodeEditorPage, file);
32
+ }
33
+
25
34
  protected async setStylerSheet() {
26
35
 
27
36
  const stylerCSS = await this.createFile("styler.css", StylerSet.instance.toString());
@@ -26,26 +26,56 @@ export const BindStyleCustom = AtomControl.registerProperty("data-style-property
26
26
  styled.css `
27
27
 
28
28
  display: grid;
29
- grid-template-columns: auto 1fr;
30
- grid-template-rows: auto auto;
29
+ grid-template-columns: 1fr;
30
+ grid-template-rows: auto auto auto;
31
+ justify-items: stretch;
32
+ align-items: center;
31
33
  column-gap: 5px;
34
+ max-width: 200px;
35
+ & > * {
36
+ width: 100%;
37
+ }
32
38
  & > label {
33
39
  grid-row: 1;
34
40
  grid-column: 1;
35
41
  }
36
42
 
37
43
  & > [data-element=editor] {
38
- grid-row: 1;
39
- grid-column: 2;
44
+ grid-row: 2;
45
+ grid-column: 1;
40
46
  }
41
47
 
42
48
  & > [data-element=custom] {
43
- grid-row: 2;
44
- grid-column: 1 / span 2;
49
+ grid-row: 3;
50
+ grid-column: 1;
51
+ }
52
+
53
+ & select {
54
+ outline: none;
55
+ border: none;
56
+ background-color: #e7e7e775;
57
+ border-radius: 9999px;
58
+ padding-left: 10px;
59
+ padding-right: 10px;
45
60
  }
46
61
 
47
62
  `.installGlobal("[data-element=property-editor]");
48
63
 
64
+
65
+ styled.css `
66
+
67
+ & select {
68
+ outline: none;
69
+ border: none;
70
+ background-color: #e7e7e775;
71
+ border-radius: 9999px;
72
+ padding-left: 10px;
73
+ padding-right: 10px;
74
+ }
75
+
76
+
77
+ `.installGlobal("[data-element=expander-property-editor]")
78
+
49
79
  function PropertyEditor({ label = void 0, custom = void 0, ... a }, ... nodes: XNode[]) {
50
80
  if (!label && nodes.length === 1) {
51
81
  return nodes[0];
@@ -70,7 +100,9 @@ export function ExpanderPropertyEditor({
70
100
  const child = nodes.length > 1
71
101
  ? <div data-layout="vertical-flex-stretch-items">{ ... nodes }</div>
72
102
  : nodes[0];
73
- return <Expander isExpanded={isExpanded}
103
+ return <Expander
104
+ data-element="expander-property-editor"
105
+ isExpanded={isExpanded}
74
106
  { ... a}>
75
107
  { label && <label>{label}</label>}
76
108
  { child }
@@ -112,16 +112,16 @@ export const stylerVars = prepareVariables({
112
112
 
113
113
  secondaryBackground: "#00808050",
114
114
  secondaryColor: "gray",
115
- secondaryAccent: "blue",
115
+ secondaryAccent: "#318984a8",
116
116
  secondaryAccentText: "white",
117
- secondarySurface: "#00A0A080",
117
+ secondarySurface: "#FFFFFFA0",
118
118
  secondarySurfaceText: "gray",
119
119
 
120
- tertiaryBackground: "#7b4fc596",
120
+ tertiaryBackground: "#cfa55c87",
121
121
  tertiaryColor: "gray",
122
- tertiaryAccent: "blue",
122
+ tertiaryAccent: "#e17b42cf",
123
123
  tertiaryAccentText: "white",
124
- tertiarySurface: "#0000A080",
124
+ tertiarySurface: "#FFFFFFA0",
125
125
  tertiarySurfaceText: "gray",
126
126
  });
127
127
 
@@ -8,18 +8,12 @@ export default function UndoRedoToolbar() {
8
8
  return <EditorToolbar
9
9
  data-element="undo">
10
10
  <i
11
- event-click={EditorCommand.onClick((editor) => {
12
- editor.redoList.insert(editor.redoList.length, editor.htmlDocument.documentElement.innerHTML);
13
- editor.htmlDocument.documentElement.innerHTML = editor.undoList.removeAt(editor.undoList.length-1);
14
- })}
11
+ data-click-event="undo"
15
12
  title="Undo"
16
13
  data-disabled={Bind.oneWay((editor: HtmlPageEditor) => editor.undoList.length === 0)}
17
14
  class="fas fa-undo" />
18
15
  <i
19
- event-click={EditorCommand.onClick((editor) => {
20
- editor.undoList.insert(editor.undoList.length, editor.htmlDocument.documentElement.innerHTML);
21
- editor.htmlDocument.documentElement.innerHTML = editor.redoList.removeAt(editor.redoList.length-1);
22
- })}
16
+ data-click-event="redo"
23
17
  title="Redo"
24
18
  data-disabled={Bind.oneWay((editor: HtmlPageEditor) => editor.redoList.length === 0)}
25
19
  class="fas fa-redo" />
@@ -2,7 +2,7 @@ import { ContentPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
2
2
  import { AppFile, IAppFile } from "../../../model/model";
3
3
  import XNode from "@web-atoms/core/dist/core/XNode";
4
4
  import UploadEvent from "@web-atoms/web-controls/dist/basic/UploadEvent";
5
- import AtomRepeater from "@web-atoms/web-controls/dist/basic/AtomRepeater";
5
+ import AtomRepeater, { SelectorCheckBox } from "@web-atoms/web-controls/dist/basic/AtomRepeater";
6
6
  import TreeView from "../../../common/controls/tree/TreeView";
7
7
  import Bind from "@web-atoms/core/dist/core/Bind";
8
8
  import Action from "@web-atoms/core/dist/view-model/Action";
@@ -65,6 +65,8 @@ export default class FolderPage extends ContentPage {
65
65
 
66
66
  private folderTree: TreeView;
67
67
 
68
+ private selectedFiles: IAppFile[] = [];
69
+
68
70
  @InjectProperty
69
71
  private cloudFileService: CloudFileService;
70
72
 
@@ -139,7 +141,9 @@ export default class FolderPage extends ContentPage {
139
141
  })}
140
142
  >
141
143
  <AtomRepeater
142
- for="table"
144
+ data-layout="data-grid"
145
+ allowMultipleSelection={true}
146
+ selectedItems={this.selectedFiles}
143
147
  items={Bind.oneWayAsync((c, e, cancelToken) =>
144
148
  this.cloudFileService.files({
145
149
  search: this.search,
@@ -152,56 +156,73 @@ export default class FolderPage extends ContentPage {
152
156
  />
153
157
  </div>
154
158
  </div>;
159
+
160
+ this.footerRenderer = () => <div
161
+ style-display={Bind.oneWay(() => this.selectedFiles.length > 0)}
162
+ data-layout="command-row">
163
+ <button
164
+ data-click-event="delete-files"
165
+ data-layout="stop-icon-button">
166
+ <i class="fas fa-trash-can"/>
167
+ Delete
168
+ </button>
169
+ </div>;
155
170
  }
156
171
 
157
172
  renderFile(item: IAppFile) {
158
173
 
159
174
  if (item.isFolder) {
160
- return <tr>
161
- <td>
175
+ return <div>
176
+ <SelectorCheckBox
177
+ />
178
+ <div>
162
179
  <i class={item.isFolder ? "fiv-viv fiv-icon-folder" : `fiv-viv fiv-icon-${getExtension(item.name)}`} />
163
180
  <span data-click-event="open-folder" class="file-link" text={item.name} data-padding-left="auto"/>
164
- </td>
165
- <td>{item.isShared && <i title="Shared" class="fas fa-folder-user"/>}</td>
166
- <td text={toFileSize(item.fileSize)}/>
167
- <td></td>
168
- <td><i
181
+ </div>
182
+ <div>{item.isShared && <i title="Shared" class="fas fa-folder-user"/>}</div>
183
+ <div text={toFileSize(item.fileSize)}/>
184
+ <div></div>
185
+ <div><i
169
186
  data-click-event="edit-shares"
170
- class="fas fa-share"/></td>
171
- </tr>;
187
+ class="fas fa-share"/></div>
188
+ </div>;
172
189
  }
173
190
 
174
191
  if( this.parameters.templates && item.contentType === "message/rfc822") {
175
- return <tr>
176
- <td>
192
+ return <div>
193
+ <SelectorCheckBox
194
+ />
195
+ <div>
177
196
  <i class={item.isFolder ? "fiv-viv fiv-icon-folder" : `fiv-viv fiv-icon-${getExtension(item.name)}`} />
178
197
  <span
179
198
  data-click-event="open-template"
180
199
  class="file-link"
181
200
  text={item.name}
182
201
  data-margin-left="default"/>
183
- </td>
184
- <td>{item.isShared && <i title="Shared" class="fas fa-folder-user"/>}</td>
185
- <td text={toFileSize(item.fileSize)}/>
186
- <td><a href={item.downloadUrl} target="_blank" download={true}><i class="fas fa-download"/></a></td>
187
- <td><i
202
+ </div>
203
+ <div>{item.isShared && <i title="Shared" class="fas fa-folder-user"/>}</div>
204
+ <div text={toFileSize(item.fileSize)}/>
205
+ <div><a href={item.downloadUrl} target="_blank" download={true}><i class="fas fa-download"/></a></div>
206
+ <div><i
188
207
  data-click-event="edit-shares"
189
- class="fas fa-share"/></td>
190
- </tr>;
208
+ class="fas fa-share"/></div>
209
+ </div>;
191
210
  }
192
211
 
193
- return <tr>
194
- <td>
212
+ return <div>
213
+ <SelectorCheckBox
214
+ />
215
+ <div>
195
216
  <i class={item.isFolder ? "fiv-viv fiv-icon-folder" : `fiv-viv fiv-icon-${getExtension(item.name)}`} />
196
217
  <a href={item.url} target="_blank" text={item.name} data-margin-left="default"></a>
197
- </td>
198
- <td>{item.isShared && <i title="Shared" class="fas fa-folder-user"/>}</td>
199
- <td text={toFileSize(item.fileSize)}/>
200
- <td><a href={item.downloadUrl} target="_blank" download={true}><i class="fas fa-download"/></a></td>
201
- <td><i
218
+ </div>
219
+ <div>{item.isShared && <i title="Shared" class="fas fa-folder-user"/>}</div>
220
+ <div text={toFileSize(item.fileSize)}/>
221
+ <div><a href={item.downloadUrl} target="_blank" download={true}><i class="fas fa-download"/></a></div>
222
+ <div><i
202
223
  data-click-event="edit-shares"
203
- class="fas fa-share"/></td>
204
- </tr>;
224
+ class="fas fa-share"/></div>
225
+ </div>;
205
226
  }
206
227
 
207
228
  @Action({ onEvent: "edit-shares"})
@@ -230,6 +251,13 @@ export default class FolderPage extends ContentPage {
230
251
  await this.cloudFileService.expand(item);
231
252
  }
232
253
 
254
+ @Action({ onEvent: "delete-files"})
255
+ async deleteFiles() {
256
+ await this.cloudFileService.delete(this.selectedFiles);
257
+ this.selectedFiles.clear();
258
+ this.version++;
259
+ }
260
+
233
261
  @Action({ onEvent: "files-available"})
234
262
  async onFilesUploaded() {
235
263
  this.version++;
@@ -273,4 +273,8 @@ export default class CloudFileService {
273
273
  return file;
274
274
  }
275
275
 
276
+ async delete(files: IAppFile[]) {
277
+ files = files.map(({ appFileID }) => ( AppFile.create({ appFileID, $deleted: true })));
278
+ await this.entityService.save(files);
279
+ }
276
280
  }