@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.
- package/content/images/icons/audio.svg +1 -0
- package/content/modules/monaco/monaco.html +57 -5
- package/dist/admin/AdminAppIndex.pack.js +261 -145
- package/dist/admin/AdminAppIndex.pack.js.map +1 -1
- package/dist/admin/AdminAppIndex.pack.min.js +4 -4
- package/dist/admin/AdminAppIndex.pack.min.js.map +1 -1
- package/dist/code-editor/CodeEditorPage.d.ts +1 -0
- package/dist/code-editor/CodeEditorPage.d.ts.map +1 -1
- package/dist/code-editor/CodeEditorPage.js +12 -18
- package/dist/code-editor/CodeEditorPage.js.map +1 -1
- package/dist/code-editor/CodeSnippetPage.d.ts +19 -0
- package/dist/code-editor/CodeSnippetPage.d.ts.map +1 -0
- package/dist/code-editor/CodeSnippetPage.js +98 -0
- package/dist/code-editor/CodeSnippetPage.js.map +1 -0
- package/dist/code-editor/ICodeSnippet.d.ts +6 -0
- package/dist/code-editor/ICodeSnippet.d.ts.map +1 -0
- package/dist/code-editor/ICodeSnippet.js +9 -0
- package/dist/code-editor/ICodeSnippet.js.map +1 -0
- package/dist/code-editor/MonacoService.d.ts +20 -0
- package/dist/code-editor/MonacoService.d.ts.map +1 -0
- package/dist/code-editor/MonacoService.js +120 -0
- package/dist/code-editor/MonacoService.js.map +1 -0
- package/dist/code-editor/MonaoEditor.d.ts +0 -19
- package/dist/code-editor/MonaoEditor.d.ts.map +1 -1
- package/dist/code-editor/MonaoEditor.js +3 -111
- package/dist/code-editor/MonaoEditor.js.map +1 -1
- package/dist/common/controls/file-preview/FilePreview.d.ts.map +1 -1
- package/dist/common/controls/file-preview/FilePreview.js +8 -3
- package/dist/common/controls/file-preview/FilePreview.js.map +1 -1
- package/dist/site-editor/editor/WebSitePageEditor.d.ts.map +1 -1
- package/dist/site-editor/editor/WebSitePageEditor.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/web/AppIndex.pack.js +345 -229
- package/dist/web/AppIndex.pack.js.map +1 -1
- package/dist/web/AppIndex.pack.min.js +5 -5
- package/dist/web/AppIndex.pack.min.js.map +1 -1
- package/dist/web/page/mails/mini-compose/Insert.d.ts.map +1 -1
- package/dist/web/page/mails/mini-compose/Insert.js +16 -3
- package/dist/web/page/mails/mini-compose/Insert.js.map +1 -1
- package/package.json +1 -1
- package/src/code-editor/CodeEditorPage.tsx +14 -8
- package/src/code-editor/CodeSnippetPage.tsx +78 -0
- package/src/code-editor/ICodeSnippet.ts +5 -0
- package/src/code-editor/MonacoService.ts +112 -0
- package/src/code-editor/MonaoEditor.tsx +89 -112
- package/src/common/controls/file-preview/FilePreview.tsx +6 -1
- package/src/monaco.d.ts +9124 -0
- package/src/site-editor/editor/WebSitePageEditor.tsx +0 -2
- 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":"
|
|
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 (
|
|
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":";;;;
|
|
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,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
|
-
<
|
|
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,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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|