@social-mail/social-mail-client 1.2.32 → 1.2.34

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 (49) hide show
  1. package/content/images/icons/audio.svg +1 -0
  2. package/content/modules/monaco/monaco.html +57 -5
  3. package/dist/admin/AdminAppIndex.pack.js +261 -145
  4. package/dist/admin/AdminAppIndex.pack.js.map +1 -1
  5. package/dist/admin/AdminAppIndex.pack.min.js +4 -4
  6. package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
  7. package/dist/code-editor/CodeEditorPage.d.ts +1 -0
  8. package/dist/code-editor/CodeEditorPage.d.ts.map +1 -1
  9. package/dist/code-editor/CodeEditorPage.js +12 -18
  10. package/dist/code-editor/CodeEditorPage.js.map +1 -1
  11. package/dist/code-editor/CodeSnippetPage.d.ts +19 -0
  12. package/dist/code-editor/CodeSnippetPage.d.ts.map +1 -0
  13. package/dist/code-editor/CodeSnippetPage.js +98 -0
  14. package/dist/code-editor/CodeSnippetPage.js.map +1 -0
  15. package/dist/code-editor/ICodeSnippet.d.ts +6 -0
  16. package/dist/code-editor/ICodeSnippet.d.ts.map +1 -0
  17. package/dist/code-editor/ICodeSnippet.js +9 -0
  18. package/dist/code-editor/ICodeSnippet.js.map +1 -0
  19. package/dist/code-editor/MonacoService.d.ts +20 -0
  20. package/dist/code-editor/MonacoService.d.ts.map +1 -0
  21. package/dist/code-editor/MonacoService.js +120 -0
  22. package/dist/code-editor/MonacoService.js.map +1 -0
  23. package/dist/code-editor/MonaoEditor.d.ts +0 -19
  24. package/dist/code-editor/MonaoEditor.d.ts.map +1 -1
  25. package/dist/code-editor/MonaoEditor.js +3 -111
  26. package/dist/code-editor/MonaoEditor.js.map +1 -1
  27. package/dist/common/controls/file-preview/FilePreview.d.ts.map +1 -1
  28. package/dist/common/controls/file-preview/FilePreview.js +8 -3
  29. package/dist/common/controls/file-preview/FilePreview.js.map +1 -1
  30. package/dist/site-editor/editor/WebSitePageEditor.d.ts.map +1 -1
  31. package/dist/site-editor/editor/WebSitePageEditor.js.map +1 -1
  32. package/dist/tsconfig.tsbuildinfo +1 -1
  33. package/dist/web/AppIndex.pack.js +345 -229
  34. package/dist/web/AppIndex.pack.js.map +1 -1
  35. package/dist/web/AppIndex.pack.min.js +5 -5
  36. package/dist/web/AppIndex.pack.min.js.map +1 -1
  37. package/dist/web/page/mails/mini-compose/Insert.d.ts.map +1 -1
  38. package/dist/web/page/mails/mini-compose/Insert.js +16 -3
  39. package/dist/web/page/mails/mini-compose/Insert.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/code-editor/CodeEditorPage.tsx +14 -8
  42. package/src/code-editor/CodeSnippetPage.tsx +78 -0
  43. package/src/code-editor/ICodeSnippet.ts +5 -0
  44. package/src/code-editor/MonacoService.ts +112 -0
  45. package/src/code-editor/MonaoEditor.tsx +89 -112
  46. package/src/common/controls/file-preview/FilePreview.tsx +6 -1
  47. package/src/monaco.d.ts +9124 -0
  48. package/src/site-editor/editor/WebSitePageEditor.tsx +0 -2
  49. package/src/web/page/mails/mini-compose/Insert.tsx +11 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Insert.d.ts","sourceRoot":"","sources":["../../../../../src/web/page/mails/mini-compose/Insert.tsx"],"names":[],"mappings":"AAOA,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAiD,EAAC;;CAAA,OA0DlF"}
1
+ {"version":3,"file":"Insert.d.ts","sourceRoot":"","sources":["../../../../../src/web/page/mails/mini-compose/Insert.tsx"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAiD,EAAC;;CAAA,OAkElF"}
@@ -1,7 +1,7 @@
1
- System.register(["@web-atoms/core/dist/core/Bind", "@web-atoms/core/dist/core/XNode", "@web-atoms/web-controls/dist/basic/PopupButton", "@web-atoms/web-controls/dist/basic/UploadEvent"], function (_export, _context) {
1
+ System.register(["tslib", "@web-atoms/core/dist/core/Bind", "@web-atoms/core/dist/core/XNode", "@web-atoms/web-controls/dist/PageNavigator", "@web-atoms/web-controls/dist/basic/PopupButton", "@web-atoms/web-controls/dist/basic/UploadEvent", "../../../../code-editor/CodeSnippetPage"], function (_export, _context) {
2
2
  "use strict";
3
3
 
4
- var Bind, XNode, PopupButton, MenuItem, UploadEvent;
4
+ var __awaiter, Bind, XNode, PageNavigator, PopupButton, MenuItem, UploadEvent, CodeSnippetPage;
5
5
  function Insert({
6
6
  alignment = "above"
7
7
  }) {
@@ -19,6 +19,13 @@ System.register(["@web-atoms/core/dist/core/Bind", "@web-atoms/core/dist/core/XN
19
19
  icon: "ri-list-ordered",
20
20
  label: "Numbered List",
21
21
  "event-click": Bind.event(editor => editor.executeCommand("insertOrderedList"))
22
+ }), XNode.create(MenuItem, {
23
+ icon: "ri-list-ordered",
24
+ label: "Insert Code",
25
+ "event-click": Bind.event(editor => __awaiter(this, void 0, void 0, function* () {
26
+ const code = yield PageNavigator.pushPageForResult(CodeSnippetPage);
27
+ editor.executeCommand("insertHTML", void 0, `<pre style="margin: 5px; border: solid 1px lightgray; padding: 10px; border-radius: 10px;" contentEditable="true" spellcheck="false">${code}</pre><br/><p contentEditable="true"></p>`);
28
+ }))
22
29
  }), XNode.create(MenuItem, Object.assign({}, UploadEvent.AttachUploadAction({
23
30
  accept: "image/*",
24
31
  multiple: true,
@@ -55,15 +62,21 @@ System.register(["@web-atoms/core/dist/core/Bind", "@web-atoms/core/dist/core/XN
55
62
  }
56
63
  _export("default", Insert);
57
64
  return {
58
- setters: [function (_webAtomsCoreDistCoreBind) {
65
+ setters: [function (_tslib) {
66
+ __awaiter = _tslib.__awaiter;
67
+ }, function (_webAtomsCoreDistCoreBind) {
59
68
  Bind = _webAtomsCoreDistCoreBind.default;
60
69
  }, function (_webAtomsCoreDistCoreXNode) {
61
70
  XNode = _webAtomsCoreDistCoreXNode.default;
71
+ }, function (_webAtomsWebControlsDistPageNavigator) {
72
+ PageNavigator = _webAtomsWebControlsDistPageNavigator.default;
62
73
  }, function (_webAtomsWebControlsDistBasicPopupButton) {
63
74
  PopupButton = _webAtomsWebControlsDistBasicPopupButton.default;
64
75
  MenuItem = _webAtomsWebControlsDistBasicPopupButton.MenuItem;
65
76
  }, function (_webAtomsWebControlsDistBasicUploadEvent) {
66
77
  UploadEvent = _webAtomsWebControlsDistBasicUploadEvent.default;
78
+ }, function (_codeEditorCodeSnippetPage) {
79
+ CodeSnippetPage = _codeEditorCodeSnippetPage.default;
67
80
  }],
68
81
  execute: function () {}
69
82
  };
@@ -1 +1 @@
1
- {"version":3,"names":["Insert","alignment","XNode","create","PopupButton","class","icon","title","MenuItem","label","Bind","event","editor","executeCommand","Object","assign","UploadEvent","AttachUploadAction","accept","multiple","extra","capture","_export","setters","_webAtomsCoreDistCoreBind","default","_webAtomsCoreDistCoreXNode","_webAtomsWebControlsDistBasicPopupButton","_webAtomsWebControlsDistBasicUploadEvent","execute"],"sources":["../../../../../src/web/page/mails/mini-compose/Insert.tsx"],"sourcesContent":[null],"mappings":";;;;EAOc,SAAUA,MAAMA,CAAC;IAAEC,SAAS,GAAG;EAAqC,CAAC;IAC/E,OAAOC,KAAA,CAAAC,MAAA,CAACC,WAAW;MACfC,KAAK,EAAC,SAAS;MAAA,eACH,gBAAgB;MAC5BC,IAAI,EAAC,aAAa;MAClBC,KAAK,EAAC,kBAAkB;MACxBN,SAAS,EAAEA;IAAS,GAChBC,KAAA,CAAAC,MAAA,CAACK,QAAQ;MACLF,IAAI,EAAC,mBAAmB;MACxBG,KAAK,EAAC,MAAM;MAAA,eACCC,IAAI,CAACC,KAAK,CAAEC,MAAW,IAAKA,MAAM,CAACC,cAAc,CAAC,qBAAqB,CAAC;IAAC,EACpF,EACNX,KAAA,CAAAC,MAAA,CAACK,QAAQ;MACLF,IAAI,EAAC,iBAAiB;MACtBG,KAAK,EAAC,eAAe;MAAA,eACRC,IAAI,CAACC,KAAK,CAAEC,MAAW,IAAKA,MAAM,CAACC,cAAc,CAAC,mBAAmB,CAAC;IAAC,EAClF,EACNX,KAAA,CAAAC,MAAA,CAACK,QAAQ,EAAAM,MAAA,CAAAC,MAAA,KACCC,WAAW,CAACC,kBAAkB,CAAC;MACjCC,MAAM,EAAE,SAAS;MACjBC,QAAQ,EAAE,IAAI;MACdC,KAAK,EAAE;KACV,CAAC;MAAA,oBACe,aAAa;MAC9Bd,IAAI,EAAC,cAAc;MACnBG,KAAK,EAAC;IAAY,GAChB,EACNP,KAAA,CAAAC,MAAA,CAACK,QAAQ,EAAAM,MAAA,CAAAC,MAAA,KACCC,WAAW,CAACC,kBAAkB,CAAC;MACjCC,MAAM,EAAE,SAAS;MACjBG,OAAO,EAAE,MAAM;MACfD,KAAK,EAAE;KACV,CAAC;MAAA,oBACe,YAAY;MAC7Bd,IAAI,EAAC,4BAA4B;MACjCG,KAAK,EAAC;IAAY,GAChB,EACNP,KAAA,CAAAC,MAAA,CAACK,QAAQ,EAAAM,MAAA,CAAAC,MAAA,KACCC,WAAW,CAACC,kBAAkB,CAAC;MACjCC,MAAM,EAAE,SAAS;MACjBC,QAAQ,EAAE,KAAK;MACfC,KAAK,EAAE;KACV,CAAC;MAAA,oBACe,YAAY;MAC7Bd,IAAI,EAAC,mBAAmB;MACxBG,KAAK,EAAC;IAAW,GACf,EACNP,KAAA,CAAAC,MAAA,CAACK,QAAQ,EAAAM,MAAA,CAAAC,MAAA,KACCC,WAAW,CAACC,kBAAkB,CAAC;MACjCC,MAAM,EAAE,SAAS;MACjBG,OAAO,EAAE,MAAM;MACfD,KAAK,EAAE;KACV,CAAC;MAAA,oBACe,cAAc;MAC/Bd,IAAI,EAAC,0BAA0B;MAC/BG,KAAK,EAAC;IAAc,GAClB,CACI;EACtB;EAACa,OAAA,YA1DuBtB,MAAM;EAAA;IAAAuB,OAAA,aAAAC,yBAAA;MAPvBd,IAAI,GAAAc,yBAAA,CAAAC,OAAA;IAAA,aAAAC,0BAAA;MACJxB,KAAK,GAAAwB,0BAAA,CAAAD,OAAA;IAAA,aAAAE,wCAAA;MAELvB,WAAW,GAAAuB,wCAAA,CAAAF,OAAA;MAAIjB,QAAQ,GAAAmB,wCAAA,CAARnB,QAAQ;IAAA,aAAAoB,wCAAA;MACvBZ,WAAW,GAAAY,wCAAA,CAAAH,OAAA;IAAA;IAAAI,OAAA,WAAAA,CAAA;EAAA;AAAA"}
1
+ {"version":3,"names":["Insert","alignment","XNode","create","PopupButton","class","icon","title","MenuItem","label","Bind","event","editor","executeCommand","__awaiter","code","PageNavigator","pushPageForResult","CodeSnippetPage","Object","assign","UploadEvent","AttachUploadAction","accept","multiple","extra","capture","_export","setters","_tslib","_webAtomsCoreDistCoreBind","default","_webAtomsCoreDistCoreXNode","_webAtomsWebControlsDistPageNavigator","_webAtomsWebControlsDistBasicPopupButton","_webAtomsWebControlsDistBasicUploadEvent","_codeEditorCodeSnippetPage","execute"],"sources":["../../../../../src/web/page/mails/mini-compose/Insert.tsx"],"sourcesContent":[null],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-client",
3
- "version": "1.2.32",
3
+ "version": "1.2.34",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,13 +1,14 @@
1
1
  import { ContentPage, PopupWindowPage } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
2
2
  import { IAppFile } from "../model/model";
3
3
  import XNode from "@web-atoms/core/dist/core/XNode";
4
- import MonacoEditor from "./MonaoEditor";
5
4
  import { SaveIconTextButton } from "../common/controls/buttons/IconButton";
6
5
  import Bind from "@web-atoms/core/dist/core/Bind";
7
6
  import Action from "@web-atoms/core/dist/view-model/Action";
8
7
  import { Inject } from "@web-atoms/core/dist/di/Inject";
9
8
  import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
10
9
  import CloudFileService from "../web/page/files/service/CloudFileService";
10
+ import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
11
+ import MonacoService from "./MonacoService";
11
12
 
12
13
  export default class CodeEditorPage extends ContentPage<IAppFile> {
13
14
 
@@ -16,6 +17,8 @@ export default class CodeEditorPage extends ContentPage<IAppFile> {
16
17
  @InjectProperty
17
18
  private cloudFileService: CloudFileService;
18
19
 
20
+ private monacoService: MonacoService;
21
+
19
22
  private content: string;
20
23
  private file: IAppFile;
21
24
 
@@ -23,13 +26,7 @@ export default class CodeEditorPage extends ContentPage<IAppFile> {
23
26
  this.title = this.parameters.name;
24
27
 
25
28
  this.renderer = <div data-display="grid" data-align-items="stretch" data-justify-items="stretch">
26
- <MonacoEditor
27
- file={this.parameters}
28
- event-file-changed={({ detail: { content, originalContent, file }}) => {
29
- this.file = file;
30
- this.modified = content !== originalContent;
31
- this.content = content;
32
- }}
29
+ <iframe
33
30
  />
34
31
  </div>;
35
32
 
@@ -40,6 +37,15 @@ export default class CodeEditorPage extends ContentPage<IAppFile> {
40
37
  data-click-event="save-file"
41
38
  text="Save"/>
42
39
  </div>;
40
+
41
+ const file = this.parameters;
42
+ const iframe = this.element.querySelector("iframe");
43
+
44
+ this.monacoService = await MonacoService.createEditor(this, iframe);
45
+
46
+ const code = await FetchBuilder.get(file.downloadUrl).responseAsText();
47
+
48
+ this.monacoService.setCodeModel(this, code, `http://a/${file.name}`);
43
49
  }
44
50
 
45
51
  @Action({ onEvent: "save-file", close: true})
@@ -0,0 +1,78 @@
1
+ import XNode from "@web-atoms/core/dist/core/XNode";
2
+ import { PopupWindowPage, isMobileView } from "@web-atoms/web-controls/dist/mobile-app/MobileApp";
3
+ import { ICodeSnippetModel } from "./ICodeSnippet";
4
+ import Bind from "@web-atoms/core/dist/core/Bind";
5
+ import { SaveIconTextButton } from "../common/controls/buttons/IconButton";
6
+ import Action from "@web-atoms/core/dist/view-model/Action";
7
+ import MonacoService from "./MonacoService";
8
+ import Select from "@web-atoms/web-controls/dist/basic/Select";
9
+
10
+ export default class CodeSnippetPage extends PopupWindowPage<{ code?: string, languageId?: string }, string> {
11
+
12
+ public langaugeId: string = "html";
13
+
14
+ public code: string = "";
15
+
16
+ public monacoService: MonacoService;
17
+
18
+ private textModel: monaco.editor.ITextModel;
19
+
20
+ public async init() {
21
+
22
+ this.code = this.parameters?.code ?? "";
23
+ this.langaugeId = this.parameters?.languageId ?? "html";
24
+
25
+ this.title = "Insert Code Snippet";
26
+
27
+ if (!isMobileView) {
28
+ this.element.style.minWidth = "70vw";
29
+ this.element.style.minHeight = "60vh";
30
+ }
31
+
32
+ this.renderer = <div data-display="grid" data-align-items="stretch" data-justify-items="stretch">
33
+ <iframe
34
+ />
35
+ </div>;
36
+
37
+ this.footerRenderer = () => <div data-layout="command-row">
38
+ <SaveIconTextButton
39
+ data-click-event="save-code"
40
+ />
41
+ </div>;
42
+
43
+ const iframe = this.element.querySelector("iframe");
44
+ this.monacoService = await MonacoService.createEditor(this, iframe);
45
+
46
+ this.headerRenderer = () => <div data-layout="header-row">
47
+ <Select
48
+ items={this.monacoService.getLanguages()}
49
+ value={Bind.twoWaysImmediate(() => this.langaugeId)}
50
+ event-input={() => setTimeout(() => this.createModel())}
51
+ />
52
+ </div>;
53
+
54
+ this.createModel();
55
+ }
56
+
57
+ @Action({ onEvent: "save-code", close: true })
58
+ async save() {
59
+ this.code = this.textModel.getValue();
60
+ const colorizedText = await this.monacoService.monaco.editor.colorize(this.code, this.textModel.getLanguageId(), {});
61
+ const colorized = await this.colorize(colorizedText);
62
+ return colorized;
63
+ }
64
+
65
+ @Action({ onEvent: "code-changed"})
66
+ codeChanged({ code }) {
67
+ this.code = code;
68
+ }
69
+
70
+ private createModel() {
71
+ const lang = this.monacoService.languages.find((x) => x.id === this.langaugeId) ?? this.monacoService.languages[0];
72
+ this.textModel = this.monacoService.setCodeModel(this, this.code, `http://a/file${lang.extensions?.[0] ?? ".txt"}`);
73
+ }
74
+
75
+ private async colorize(code) {
76
+ // this will be overriden...
77
+ }
78
+ }
@@ -0,0 +1,5 @@
1
+ export interface ICodeSnippetModel {
2
+ code?: string;
3
+ fileName?: string;
4
+ dependencies?: string[];
5
+ }
@@ -0,0 +1,112 @@
1
+ import { UMD } from "@web-atoms/core/dist/core/types";
2
+ import DISingleton from "@web-atoms/core/dist/di/DISingleton";
3
+ import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
4
+ import { AtomControl } from "@web-atoms/core/dist/web/controls/AtomControl";
5
+
6
+ const monacoPath = UMD.resolvePath("@social-mail/social-mail-client/content/modules/monaco/monaco.html");
7
+
8
+ const codeModelChangedDisposable = Symbol("codeModelChangedDisposable");
9
+
10
+ export default class MonacoService {
11
+
12
+ static async createEditor(ctrl: AtomControl, iframe: HTMLIFrameElement) {
13
+ const ms = new MonacoService();
14
+ const srcdoc = await FetchBuilder.get(monacoPath).responseAsText();
15
+ const { monaco, editor} = await new Promise<any>((resolve, reject) => {
16
+ (iframe as any).parentEditor = {
17
+ resolve,
18
+ reject,
19
+ codeEditor: ctrl
20
+ };
21
+ iframe.srcdoc = srcdoc;
22
+ });
23
+ ctrl.registerDisposable({
24
+ dispose: () => {
25
+ ms.monaco = null;
26
+ ms.editor = null;
27
+ }
28
+ });
29
+ ms.monaco = monaco;
30
+ ms.editor = editor;
31
+ ms.languages = monaco.languages.getLanguages();
32
+ return ms;
33
+ }
34
+
35
+ monaco: typeof monaco;
36
+ editor: monaco.editor.IStandaloneCodeEditor;
37
+ languages: monaco.languages.ILanguageExtensionPoint[];
38
+
39
+ clearModels() {
40
+ for(const model of this.monaco.editor.getModels()) {
41
+ model.dispose();
42
+ }
43
+ }
44
+
45
+ getLanguages() {
46
+ return this.languages.map((x) => ({
47
+ label: x.aliases?.[0] ?? x.id,
48
+ value: x.id,
49
+ ext: x.extensions?.[0],
50
+ extensions: x.extensions
51
+ }));
52
+ }
53
+
54
+ createModel({
55
+ code,
56
+ url = "http://a/file.html"
57
+ }: { code: string, url: string }) {
58
+ const { monaco } = this;
59
+ const uri = monaco.Uri.parse(url);
60
+ const model = monaco.editor.getModel(uri);
61
+ if (model) {
62
+ model.setValue(code);
63
+ return model;
64
+ }
65
+ return monaco.editor.createModel(
66
+ code,
67
+ void 0,
68
+ uri
69
+ );
70
+ }
71
+
72
+ setCodeModel(ctrl: AtomControl, code: string, url: string, clear = false) {
73
+ const { monaco, editor } = this;
74
+ const uri = monaco.Uri.parse(url);
75
+ let model = monaco.editor.getModel(uri);
76
+ if (model) {
77
+ model.setValue(code);
78
+ editor.setModel(model);
79
+ return;
80
+ }
81
+ ctrl[codeModelChangedDisposable]?.dispose();
82
+ if (clear) {
83
+ this.clearModels();
84
+ }
85
+ model = monaco.editor.createModel(
86
+ code,
87
+ void 0,
88
+ uri
89
+ );
90
+ editor.setModel(model);
91
+ let id = 0;
92
+ ctrl[codeModelChangedDisposable] = ctrl.registerDisposable(model.onDidChangeContent(() => {
93
+ if (id) {
94
+ clearTimeout(id);
95
+ }
96
+ id = setTimeout(() => {
97
+ const newCode = model.getValue();
98
+ const ce = new CustomEvent("codeChanged", {
99
+ bubbles: true,
100
+ detail: {
101
+ code: newCode,
102
+ originalCode: code
103
+ }
104
+ });
105
+ ctrl.element.dispatchEvent(ce);
106
+ (ctrl as any)?.onCodeChanged?.(newCode, code);
107
+ } , 500);
108
+ }));
109
+ return model;
110
+ }
111
+
112
+ }
@@ -1,112 +1,89 @@
1
- import { UMD } from "@web-atoms/core/dist/core/types";
2
- import { AtomControl } from "@web-atoms/core/dist/web/controls/AtomControl";
3
- import { IAppFile } from "../model/model";
4
- import { BindableProperty } from "@web-atoms/core/dist/core/BindableProperty";
5
- import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
6
-
7
- const monacoPath = UMD.resolvePath("@social-mail/social-mail-client/content/modules/monaco/monaco.html");
8
-
9
- export default class MonacoEditor extends AtomControl {
10
-
11
- public "event-file-changed": CustomEvent<{ file: IAppFile, content: string }>;
12
-
13
- public element: HTMLIFrameElement;
14
-
15
- @BindableProperty
16
- public file: IAppFile;
17
-
18
- private codeModelDisposable: any;
19
-
20
- private monaco: any;
21
- private editor: any;
22
- private container: any;
23
-
24
- constructor(app, e = document.createElement("iframe")) {
25
- super(app, e);
26
- this.element.style.border = "none";
27
- this.runAfterInit(() => this.app.runAsync(() => this.init()));
28
- }
29
-
30
- onPropertyChanged(name: string): void {
31
- super.onPropertyChanged(name);
32
- switch(name) {
33
- case "file":
34
- this.app.runAsync(() => this.loadFile());
35
- break;
36
- }
37
- }
38
-
39
- init() {
40
- const monaco = (async () => {
41
- const srcdoc = await FetchBuilder.get(monacoPath).responseAsText();
42
- return this.monaco = await new Promise<any>((resolve, reject) => {
43
- (this.element as any).parentEditor = {
44
- resolve,
45
- reject,
46
- onresize: () => this.editor?.layout(),
47
- codeEditor: this
48
- };
49
- this.element.srcdoc = srcdoc;
50
- });
51
- })();
52
- const value = Promise.resolve(monaco);
53
- Object.defineProperty(this, "init", { value: () => value});
54
- return this.monaco = monaco;
55
- }
56
-
57
- createEditor() {
58
- const editor = (async () => {
59
- return this.editor = await this.monaco.editor.create(this.container);
60
- })();
61
- const value = Promise.resolve(editor);
62
- Object.defineProperty(this, "createEditor", { value: () => value});
63
- return editor;
64
- }
65
-
66
- async loadFile() {
67
-
68
- await this.init();
69
-
70
- this.codeModelDisposable?.dispose();
71
-
72
- const editor = await this.createEditor();
73
-
74
- const { file, monaco } = this;
75
-
76
- const originalContent = await FetchBuilder.get(file.downloadUrl).responseAsText();
77
-
78
- const name = file.name;
79
- let language = "html";
80
- if (/\.(ts|tsx)$/i.test(name)) {
81
- language = "typescript";
82
- } else if (/\.(js|jsx)$/i.test(name)) {
83
- language = "javascript";
84
- } else if (/\.(json)$/i.test(name)) {
85
- language = "json";
86
- } else if (/\.(css)$/i.test(name)) {
87
- language = "css";
88
- }
89
- const uri = monaco.Uri.parse(`http://a/${file.path}-${file.name}`);
90
- const m = monaco.editor.getModel(uri);
91
-
92
- const model = monaco.editor.createModel(
93
- originalContent,
94
- language,
95
- uri);
96
- editor.setModel(model);
97
-
98
- let id = 0;
99
-
100
- this.codeModelDisposable = this.registerDisposable(model.onDidChangeContent(() => {
101
- if (id) {
102
- clearTimeout(id);
103
- }
104
- id = setTimeout(() => {
105
- const content = model.getValue();
106
- this.element.dispatchEvent(new CustomEvent("fileChanged", {
107
- detail: { file: this.file, content, originalContent }
108
- }));
109
- }, 500);
110
- }));
111
- }
112
- }
1
+ // import { UMD } from "@web-atoms/core/dist/core/types";
2
+ // import { AtomControl } from "@web-atoms/core/dist/web/controls/AtomControl";
3
+ // import { IAppFile } from "../model/model";
4
+ // import { BindableProperty } from "@web-atoms/core/dist/core/BindableProperty";
5
+ // import FetchBuilder from "@web-atoms/core/dist/services/FetchBuilder";
6
+ // import { ICodeSnippetModel } from "./ICodeSnippet";
7
+ // import InjectProperty from "@web-atoms/core/dist/core/InjectProperty";
8
+ // import MonacoService from "./MonacoService";
9
+
10
+ // const monacoPath = UMD.resolvePath("@social-mail/social-mail-client/content/modules/monaco/monaco.html");
11
+
12
+ // export default class MonacoEditor extends AtomControl {
13
+
14
+ // public "event-file-changed": CustomEvent<{ file: IAppFile, content: string }>;
15
+
16
+ // public element: HTMLIFrameElement;
17
+
18
+ // @BindableProperty
19
+ // public code: string;
20
+
21
+ // @BindableProperty
22
+ // public fileUri: string = "https://a/sample.html";
23
+
24
+ // @InjectProperty
25
+ // private monacoService: MonacoService;
26
+
27
+ // private codeModelDisposable: any;
28
+
29
+ // private monaco: typeof monaco;
30
+
31
+ // private editor: monaco.editor.IStandaloneCodeEditor;
32
+
33
+ // constructor(app, e = document.createElement("iframe")) {
34
+ // super(app, e);
35
+ // this.element.style.border = "none";
36
+ // this.runAfterInit(() => this.app.runAsync(() => this.init()));
37
+ // }
38
+
39
+ // onPropertyChanged(name: string): void {
40
+ // super.onPropertyChanged(name);
41
+ // switch(name) {
42
+ // case "code":
43
+ // this.app.runAsync(() => this.loadFile());
44
+ // break;
45
+ // }
46
+ // }
47
+
48
+ // init() {
49
+ // const result = this.monacoService.createEditor(this, this.element)
50
+ // .then(({ monaco, editor }) => {
51
+ // this.monaco = monaco;
52
+ // this.editor = editor;
53
+ // });
54
+ // Object.defineProperty(this, "init", { value: () => result });
55
+ // return result;
56
+ // }
57
+
58
+
59
+ // async loadFile() {
60
+
61
+ // await this.init();
62
+
63
+ // if (!this.code) {
64
+ // return;
65
+ // }
66
+
67
+ // const { monaco, editor, code } = this;
68
+ // const model = this.monacoService.createModel({ code, url: this.fileUri });
69
+ // editor.setModel(model);
70
+
71
+ // this.codeModelDisposable?.dispose();
72
+
73
+ // let id = 0;
74
+
75
+ // this.codeModelDisposable = this.registerDisposable(model.onDidChangeContent(() => {
76
+ // if (id) {
77
+ // clearTimeout(id);
78
+ // }
79
+ // id = setTimeout(() => {
80
+ // const content = model.getValue();
81
+ // this.code = content;
82
+ // this.element.dispatchEvent(new CustomEvent("codeChanged", {
83
+ // detail: { code: content, originalContent: code }
84
+ // }));
85
+ // }, 500);
86
+ // }));
87
+
88
+ // }
89
+ // }
@@ -5,6 +5,7 @@ import { formatNumber, toFileSize } from "../../NumberFormats";
5
5
  import FileTypes from "../../../services/FileTypes";
6
6
  import AppCommands from "../../../web/commands/AppCommands";
7
7
  import Command from "@web-atoms/core/dist/core/Command";
8
+ import audioIcon from "@social-mail/social-mail-client/content/icons/audio.svg";
8
9
 
9
10
  styled.css `
10
11
  border: solid 2px lightgray;
@@ -62,9 +63,13 @@ export default function FilePreview(a: IAppFile) {
62
63
  const size = a.fileSize && toFileSize(a.fileSize);
63
64
 
64
65
  const { appFileID, name, fileContentID } = a;
65
- const src = `/api/files/webp(300)/${appFileID}/${fileContentID}/${name}/${name}.300.webp`;
66
+ let src = `/api/files/webp(300)/${appFileID}/${fileContentID}/${name}/${name}.300.webp`;
66
67
  const p = { appFileID, name, fileContentID };
67
68
 
69
+ if (/^audio\//i.test(a.contentType)) {
70
+ src = audioIcon;
71
+ }
72
+
68
73
  const command = AppCommands.getPreviewCommand(a);
69
74
  if (command) {
70
75
  return <a