@fiduswriter/image-manager 0.1.4 → 0.1.6
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/README.md +53 -3
- package/dist/copyright_dialog/index.d.ts +10 -13
- package/dist/copyright_dialog/index.d.ts.map +1 -1
- package/dist/copyright_dialog/index.js +32 -14
- package/dist/copyright_dialog/index.js.map +1 -1
- package/dist/copyright_dialog/templates.d.ts +16 -12
- package/dist/copyright_dialog/templates.d.ts.map +1 -1
- package/dist/copyright_dialog/templates.js.map +1 -1
- package/dist/database.d.ts +7 -6
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +17 -11
- package/dist/database.js.map +1 -1
- package/dist/edit_dialog/index.d.ts +22 -19
- package/dist/edit_dialog/index.d.ts.map +1 -1
- package/dist/edit_dialog/index.js +65 -33
- package/dist/edit_dialog/index.js.map +1 -1
- package/dist/edit_dialog/model.d.ts +2 -19
- package/dist/edit_dialog/model.d.ts.map +1 -1
- package/dist/edit_dialog/model.js +51 -31
- package/dist/edit_dialog/model.js.map +1 -1
- package/dist/edit_dialog/templates.d.ts +7 -4
- package/dist/edit_dialog/templates.d.ts.map +1 -1
- package/dist/edit_dialog/templates.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/overview/categories.d.ts +7 -5
- package/dist/overview/categories.d.ts.map +1 -1
- package/dist/overview/categories.js +18 -13
- package/dist/overview/categories.js.map +1 -1
- package/dist/overview/index.d.ts +31 -27
- package/dist/overview/index.d.ts.map +1 -1
- package/dist/overview/index.js +64 -33
- package/dist/overview/index.js.map +1 -1
- package/dist/overview/menu.d.ts +4 -47
- package/dist/overview/menu.d.ts.map +1 -1
- package/dist/overview/menu.js +13 -8
- package/dist/overview/menu.js.map +1 -1
- package/dist/overview/templates.d.ts +7 -3
- package/dist/overview/templates.d.ts.map +1 -1
- package/dist/overview/templates.js.map +1 -1
- package/dist/selection_dialog/index.d.ts +17 -15
- package/dist/selection_dialog/index.d.ts.map +1 -1
- package/dist/selection_dialog/index.js +18 -8
- package/dist/selection_dialog/index.js.map +1 -1
- package/dist/types.d.ts +118 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +94 -78
- package/src/copyright_dialog/{index.js → index.ts} +70 -38
- package/src/copyright_dialog/{templates.js → templates.ts} +19 -3
- package/src/database.ts +83 -0
- package/src/edit_dialog/{index.js → index.ts} +110 -45
- package/src/edit_dialog/{model.js → model.ts} +95 -46
- package/src/edit_dialog/{templates.js → templates.ts} +13 -2
- package/src/global.d.ts +37 -0
- package/src/overview/{categories.js → categories.ts} +34 -21
- package/src/overview/{index.js → index.ts} +157 -75
- package/src/overview/menu.ts +85 -0
- package/src/overview/{templates.js → templates.ts} +16 -2
- package/src/selection_dialog/{index.js → index.ts} +85 -49
- package/src/types.ts +133 -0
- package/src/database.js +0 -57
- package/src/overview/menu.js +0 -75
- /package/src/{index.js → index.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,5 +1,55 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="logo.svg" alt="@fiduswriter/image-manager" width="100" height="100">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<h1 align="center">@fiduswriter/image-manager</h1>
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
<p align="center">Image and media manager for Fidus Writer</p>
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What it does
|
|
12
|
+
|
|
13
|
+
Manages images and other media for Fidus Writer. Provides a client-side image
|
|
14
|
+
database, an overview table for browsing images, an edit dialog for cropping
|
|
15
|
+
and metadata, and a selection dialog for inserting images into documents.
|
|
16
|
+
|
|
17
|
+
## Exports
|
|
18
|
+
|
|
19
|
+
| Export | Description |
|
|
20
|
+
| ---------------------- | ----------------------------------------------------------- |
|
|
21
|
+
| `ImageDB` | Client-side connector to the server's image database |
|
|
22
|
+
| `ImageOverview` | Overview component for browsing all images in the library |
|
|
23
|
+
| `ImageEditDialog` | Dialog for editing image properties, cropping, and metadata |
|
|
24
|
+
| `ImageSelectionDialog` | Dialog for selecting images to insert into documents |
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @fiduswriter/image-manager
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import {
|
|
36
|
+
ImageDB,
|
|
37
|
+
ImageOverview,
|
|
38
|
+
ImageEditDialog,
|
|
39
|
+
ImageSelectionDialog,
|
|
40
|
+
} from "@fiduswriter/image-manager";
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Development
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install # Install dependencies
|
|
47
|
+
npm run build # Compile TypeScript to dist/
|
|
48
|
+
npm run typecheck # Check types without emitting
|
|
49
|
+
npm run lint # Lint with ESLint
|
|
50
|
+
npm run format:check # Check formatting with Prettier
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## License
|
|
54
|
+
|
|
55
|
+
AGPL-3.0 — see [LICENSE](LICENSE) for details.
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Dialog, InputList } from "fwtoolkit";
|
|
2
|
+
import type { Copyright, License } from "../types.js";
|
|
3
|
+
export declare const LICENSE_URLS: [string, string][];
|
|
4
|
+
export declare class CopyrightDialog {
|
|
5
|
+
copyright: Copyright;
|
|
6
|
+
origCopyright: Copyright;
|
|
7
|
+
dialog: Dialog | false;
|
|
8
|
+
licensesList: InputList<License>;
|
|
9
|
+
constructor(copyright: Copyright);
|
|
7
10
|
getCurrentValue(): void;
|
|
8
|
-
init(): Promise<
|
|
11
|
+
init(): Promise<Copyright | false>;
|
|
9
12
|
bind(): void;
|
|
10
|
-
licensesList: InputList<{
|
|
11
|
-
url: string;
|
|
12
|
-
title: string;
|
|
13
|
-
start: boolean;
|
|
14
|
-
}> | undefined;
|
|
15
13
|
}
|
|
16
|
-
import { InputList } from "fwtoolkit";
|
|
17
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/copyright_dialog/index.
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/copyright_dialog/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,MAAM,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAA;AAQnE,OAAO,KAAK,EAAC,SAAS,EAAE,OAAO,EAAC,MAAM,aAAa,CAAA;AAEnD,eAAO,MAAM,YAAY,EAQpB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;AAOvB,qBAAa,eAAe;IACxB,SAAS,EAAE,SAAS,CAAA;IAEpB,aAAa,EAAE,SAAS,CAAA;IAExB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAQ;IAE9B,YAAY,EAAG,SAAS,CAAC,OAAO,CAAC,CAAA;gBAErB,SAAS,EAAE,SAAS;IAMhC,eAAe,IAAI,IAAI;IAiDvB,IAAI,IAAI,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;IAoClC,IAAI,IAAI,IAAI;CAmFf"}
|
|
@@ -16,23 +16,31 @@ function getLicenseTitle(url) {
|
|
|
16
16
|
return license ? license[0] : "";
|
|
17
17
|
}
|
|
18
18
|
export class CopyrightDialog {
|
|
19
|
+
copyright;
|
|
20
|
+
origCopyright;
|
|
21
|
+
dialog = false;
|
|
22
|
+
licensesList;
|
|
19
23
|
constructor(copyright) {
|
|
20
24
|
this.copyright = copyright;
|
|
21
25
|
this.origCopyright = copyright;
|
|
22
26
|
this.dialog = false;
|
|
23
27
|
}
|
|
24
28
|
getCurrentValue() {
|
|
29
|
+
if (!this.dialog) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const dialogEl = this.dialog.dialogEl;
|
|
25
33
|
this.copyright = {};
|
|
26
|
-
const holder =
|
|
34
|
+
const holder = dialogEl.querySelector(".holder").value;
|
|
27
35
|
this.copyright.holder = holder.length ? holder : false;
|
|
28
|
-
const year =
|
|
36
|
+
const year = dialogEl.querySelector(".year").value;
|
|
29
37
|
this.copyright.year = year.length
|
|
30
38
|
? Math.max(0, Math.min(Number.parseInt(year) || 0, 2100))
|
|
31
39
|
: false;
|
|
32
|
-
this.copyright.freeToRead =
|
|
40
|
+
this.copyright.freeToRead = dialogEl.querySelector(".free-to-read:checked")
|
|
33
41
|
? true
|
|
34
42
|
: false;
|
|
35
|
-
const licenseStartDates = Array.from(
|
|
43
|
+
const licenseStartDates = Array.from(dialogEl.querySelectorAll(".license-start")).map(el => el.value);
|
|
36
44
|
this.copyright.licenses = this.licensesList.values
|
|
37
45
|
.map((license, index) => {
|
|
38
46
|
if (!license.url.length) {
|
|
@@ -53,7 +61,7 @@ export class CopyrightDialog {
|
|
|
53
61
|
}
|
|
54
62
|
return returnValue;
|
|
55
63
|
})
|
|
56
|
-
.filter(license => license);
|
|
64
|
+
.filter((license) => license !== false);
|
|
57
65
|
}
|
|
58
66
|
init() {
|
|
59
67
|
return new Promise(resolve => {
|
|
@@ -62,7 +70,7 @@ export class CopyrightDialog {
|
|
|
62
70
|
text: gettext("Change"),
|
|
63
71
|
classes: "fw-dark",
|
|
64
72
|
click: () => {
|
|
65
|
-
|
|
73
|
+
dialog.close();
|
|
66
74
|
this.getCurrentValue();
|
|
67
75
|
if (deepEqual(this.copyright, this.origCopyright)) {
|
|
68
76
|
// No change.
|
|
@@ -74,7 +82,7 @@ export class CopyrightDialog {
|
|
|
74
82
|
buttons.push({
|
|
75
83
|
type: "cancel"
|
|
76
84
|
});
|
|
77
|
-
|
|
85
|
+
const dialog = new Dialog({
|
|
78
86
|
width: 940,
|
|
79
87
|
height: 300,
|
|
80
88
|
id: "configure-copyright",
|
|
@@ -82,16 +90,21 @@ export class CopyrightDialog {
|
|
|
82
90
|
body: copyrightTemplate(this.copyright),
|
|
83
91
|
buttons
|
|
84
92
|
});
|
|
85
|
-
this.dialog
|
|
93
|
+
this.dialog = dialog;
|
|
94
|
+
dialog.open();
|
|
86
95
|
this.bind();
|
|
87
96
|
});
|
|
88
97
|
}
|
|
89
98
|
bind() {
|
|
99
|
+
if (!this.dialog) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const dialogEl = this.dialog.dialogEl;
|
|
90
103
|
this.licensesList = new InputList({
|
|
91
|
-
dom:
|
|
104
|
+
dom: dialogEl.querySelector(".copyright-licenses-list"),
|
|
92
105
|
initialValues: this.copyright.licenses || [],
|
|
93
106
|
emptyValue: { url: "", title: "", start: false },
|
|
94
|
-
renderItem: license => ({
|
|
107
|
+
renderItem: (license) => ({
|
|
95
108
|
html: `<div class="copyright-license-switch"></div>
|
|
96
109
|
<div class="field-part field-part-small">
|
|
97
110
|
<input type="text" class="license-start" value="${license.start ? escapeText(license.start) : ""}" placeholder="${gettext("Start date")}">
|
|
@@ -99,7 +112,8 @@ export class CopyrightDialog {
|
|
|
99
112
|
bind: el => {
|
|
100
113
|
const licenseContainer = el.closest("tr");
|
|
101
114
|
const startInput = licenseContainer.querySelector(".license-start");
|
|
102
|
-
if (license.start) {
|
|
115
|
+
if (license.start && startInput) {
|
|
116
|
+
;
|
|
103
117
|
startInput.value = license.start;
|
|
104
118
|
}
|
|
105
119
|
const mode = license.url === "" ||
|
|
@@ -120,6 +134,7 @@ export class CopyrightDialog {
|
|
|
120
134
|
// Restore focus to the license input after switching.
|
|
121
135
|
const focusable = el.querySelector(".fw-type-switch-input-inner input, .fw-type-switch-input-inner select");
|
|
122
136
|
if (focusable) {
|
|
137
|
+
;
|
|
123
138
|
focusable.focus();
|
|
124
139
|
}
|
|
125
140
|
}
|
|
@@ -138,9 +153,12 @@ export class CopyrightDialog {
|
|
|
138
153
|
url = licenseInput.querySelector("input.license").value;
|
|
139
154
|
title = licenseInput.querySelector("input.license-title").value;
|
|
140
155
|
}
|
|
141
|
-
const start = el.closest("tr").querySelector(".license-start")
|
|
142
|
-
|
|
143
|
-
|
|
156
|
+
const start = el.closest("tr").querySelector(".license-start");
|
|
157
|
+
return {
|
|
158
|
+
url,
|
|
159
|
+
title,
|
|
160
|
+
start: start ? start.value || false : false
|
|
161
|
+
};
|
|
144
162
|
}
|
|
145
163
|
});
|
|
146
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/copyright_dialog/index.
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/copyright_dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAA;AACpC,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAC,MAAM,WAAW,CAAA;AAGnE,OAAO,EACH,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,gBAAgB,CAAA;AAGvB,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,CAAC,WAAW,EAAE,8CAA8C,CAAC;IAC7D,CAAC,cAAc,EAAE,iDAAiD,CAAC;IACnE,CAAC,cAAc,EAAE,iDAAiD,CAAC;IACnE,CAAC,cAAc,EAAE,iDAAiD,CAAC;IACnE,CAAC,iBAAiB,EAAE,oDAAoD,CAAC;IACzE,CAAC,iBAAiB,EAAE,oDAAoD,CAAC;IACzE,CAAC,KAAK,EAAE,oDAAoD,CAAC;CAC1C,CAAA;AAEvB,SAAS,eAAe,CAAC,GAAW;IAChC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAA;IAChE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACpC,CAAC;AAED,MAAM,OAAO,eAAe;IACxB,SAAS,CAAW;IAEpB,aAAa,CAAW;IAExB,MAAM,GAAmB,KAAK,CAAA;IAE9B,YAAY,CAAqB;IAEjC,YAAY,SAAoB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAA;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACvB,CAAC;IAED,eAAe;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAM;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;QACrC,IAAI,CAAC,SAAS,GAAG,EAAe,CAAA;QAChC,MAAM,MAAM,GACR,QAAQ,CAAC,aAAa,CAAC,SAAS,CACnC,CAAC,KAAK,CAAA;QACP,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;QACtD,MAAM,IAAI,GACN,QAAQ,CAAC,aAAa,CAAC,OAAO,CACjC,CAAC,KAAK,CAAA;QACP,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM;YAC7B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACzD,CAAC,CAAC,KAAK,CAAA;QACX,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAC9C,uBAAuB,CAC1B;YACG,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAA;QACX,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAChC,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAC9C,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE,EAAuB,CAAC,KAAK,CAAC,CAAA;QAC3C,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;aAC7C,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtB,OAAO,KAAK,CAAA;YAChB,CAAC;YACD,MAAM,WAAW,GAAY;gBACzB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;aACvB,CAAA;YACD,MAAM,SAAS,GAAG,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;YACrD,IACI,SAAS,CAAC,KAAK;gBACf,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM;oBACtB,SAAS,CAAC,IAAI,KAAK,WAAW;oBAC9B,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC;gBAC9B,CAAC,SAAS,CAAC,SAAS;gBACpB,CAAC,SAAS,CAAC,WAAW,EACxB,CAAC;gBACC,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,aAAa,CAAA;YAC/C,CAAC;YACD,OAAO,WAAW,CAAA;QACtB,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,OAAO,EAAsB,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,CAAA;IACnE,CAAC;IAED,IAAI;QACA,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,MAAM,OAAO,GAAG,EAAE,CAAA;YAClB,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;gBACvB,OAAO,EAAE,SAAS;gBAClB,KAAK,EAAE,GAAG,EAAE;oBACR,MAAM,CAAC,KAAK,EAAE,CAAA;oBACd,IAAI,CAAC,eAAe,EAAE,CAAA;oBACtB,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;wBAChD,aAAa;wBACb,OAAO,CAAC,KAAK,CAAC,CAAA;oBAClB,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAC3B,CAAC;aACJ,CAAC,CAAA;YAEF,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAiB;aAC1B,CAAC,CAAA;YAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;gBACtB,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,GAAG;gBACX,EAAE,EAAE,qBAAqB;gBACzB,KAAK,EAAE,OAAO,CAAC,2BAA2B,CAAC;gBAC3C,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;gBACvC,OAAO;aACV,CAAC,CAAA;YACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;YAEpB,MAAM,CAAC,IAAI,EAAE,CAAA;YACb,IAAI,CAAC,IAAI,EAAE,CAAA;QACf,CAAC,CAAC,CAAA;IACN,CAAC;IAED,IAAI;QACA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAM;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;QACrC,IAAI,CAAC,YAAY,GAAG,IAAI,SAAS,CAAU;YACvC,GAAG,EAAE,QAAQ,CAAC,aAAa,CACvB,0BAA0B,CACd;YAChB,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE;YAC5C,UAAU,EAAE,EAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAC;YAC9C,UAAU,EAAE,CAAC,OAAO,EAAsC,EAAE,CAAC,CAAC;gBAC1D,IAAI,EAAE;;0EAEoD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,OAAO,CAAC,YAAY,CAAC;2BACpI;gBACX,IAAI,EAAE,EAAE,CAAC,EAAE;oBACP,MAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAgB,CAAA;oBACxD,MAAM,UAAU,GACZ,gBAAgB,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;oBACpD,IAAI,OAAO,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC;wBAC9B,CAAC;wBAAC,UAA+B,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;oBAC3D,CAAC;oBAED,MAAM,IAAI,GACN,OAAO,CAAC,GAAG,KAAK,EAAE;wBAClB,YAAY,CAAC,IAAI,CACb,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,CAC9C;wBACG,CAAC,CAAC,CAAC;wBACH,CAAC,CAAC,CAAC,CAAA;oBACX,IAAI,UAAU,CAAC;wBACX,GAAG,EAAE,EAAE,CAAC,aAAa,CACjB,2BAA2B,CACf;wBAChB,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC;wBAC5B,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;wBACzB,WAAW,EAAE,IAAa;wBAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAC,CAAC;wBACxD,OAAO,EAAE,GAAG,EAAE,CACV,oBAAoB,CAAC;4BACjB,GAAG,EAAE,OAAO,CAAC,GAAG;4BAChB,KAAK,EAAE,OAAO,CAAC,KAAK;yBACvB,CAAC;wBACN,QAAQ,EAAE,GAAG,EAAE;4BACX,sDAAsD;4BACtD,MAAM,SAAS,GAAG,EAAE,CAAC,aAAa,CAC9B,uEAAuE,CAC1E,CAAA;4BACD,IAAI,SAAS,EAAE,CAAC;gCACZ,CAAC;gCAAC,SAAyB,CAAC,KAAK,EAAE,CAAA;4BACvC,CAAC;wBACL,CAAC;qBACJ,CAAC,CAAA;gBACN,CAAC;aACJ,CAAC;YACF,QAAQ,EAAE,EAAE,CAAC,EAAE;gBACX,MAAM,YAAY,GAAG,EAAE,CAAC,aAAa,CACjC,6BAA6B,CACjB,CAAA;gBAChB,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAA;gBAC7D,IAAI,GAAW,EAAE,KAAa,CAAA;gBAC9B,IAAI,QAAQ,EAAE,CAAC;oBACX,GAAG,GAAI,QAA8B,CAAC,KAAK,CAAA;oBAC3C,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;gBAChC,CAAC;qBAAM,CAAC;oBACJ,GAAG,GAAI,YAAY,CAAC,aAAa,CAAC,eAAe,CAAsB,CAAC,KAAK,CAAA;oBAC7E,KAAK,GAAI,YAAY,CAAC,aAAa,CAC/B,qBAAqB,CACH,CAAC,KAAK,CAAA;gBAChC,CAAC;gBACD,MAAM,KAAK,GACN,EAAE,CAAC,OAAO,CAAC,IAAI,CAAiB,CAAC,aAAa,CAC3C,gBAAgB,CACnB,CAAA;gBACL,OAAO;oBACH,GAAG;oBACH,KAAK;oBACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,KAA0B,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK;iBACpE,CAAA;YACL,CAAC;SACJ,CAAC,CAAA;IACN,CAAC;CACJ"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
url:
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
url:
|
|
6
|
-
title:
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
holder
|
|
10
|
-
year
|
|
11
|
-
freeToRead:
|
|
12
|
-
}
|
|
1
|
+
interface LicenseSelectTemplateData {
|
|
2
|
+
url: string;
|
|
3
|
+
}
|
|
4
|
+
interface LicenseInputTemplateData {
|
|
5
|
+
url: string;
|
|
6
|
+
title: string;
|
|
7
|
+
}
|
|
8
|
+
interface CopyrightTemplateData {
|
|
9
|
+
holder?: string | false;
|
|
10
|
+
year?: number | false;
|
|
11
|
+
freeToRead: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const licenseSelectTemplate: ({ url }: LicenseSelectTemplateData) => string;
|
|
14
|
+
export declare const licenseInputTemplate: ({ url, title }: LicenseInputTemplateData) => string;
|
|
15
|
+
export declare const copyrightTemplate: ({ holder, year, freeToRead }: CopyrightTemplateData) => string;
|
|
16
|
+
export {};
|
|
13
17
|
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/copyright_dialog/templates.
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/copyright_dialog/templates.ts"],"names":[],"mappings":"AAIA,UAAU,yBAAyB;IAC/B,GAAG,EAAE,MAAM,CAAA;CACd;AAED,UAAU,wBAAwB;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,UAAU,qBAAqB;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;CACtB;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAO,yBAAyB,WAQb,CAAA;AAEzD,eAAO,MAAM,oBAAoB,GAAI,gBAAc,wBAAwB,WAMhE,CAAA;AAEX,eAAO,MAAM,iBAAiB,GAAI,8BAA4B,qBAAqB,WAkCtE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/copyright_dialog/templates.
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/copyright_dialog/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,WAAW,CAAA;AAEpC,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAA;AAiBvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAC,GAAG,EAA4B,EAAE,EAAE,CACtE;;UAEM,YAAY,CAAC,GAAG,CACd,UAAU,CAAC,EAAE,CACT,kBAAkB,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,WAAW,CAC9G,CAAC,IAAI,CAAC,EAAE,CAAC;;yDAEuC,CAAA;AAEzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EAAC,GAAG,EAAE,KAAK,EAA2B,EAAE,EAAE,CAC3E;oDACgD,UAAU,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,aAAa,CAAC;;;0DAGjD,UAAU,CAAC,KAAK,CAAC,kBAAkB,OAAO,CAAC,eAAe,CAAC;WAC1G,CAAA;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAwB,EAAE,EAAE,CACnF;;;;sBAIkB,OAAO,CAAC,kBAAkB,CAAC;+CACF,OAAO,CAAC,+EAA+E,CAAC;;sFAEjD,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;;;;sBAIhG,OAAO,CAAC,gBAAgB,CAAC;+CACA,OAAO,CAAC,6EAA6E,CAAC;;qGAEhC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;;;;sBAI/F,OAAO,CAAC,6BAA6B,CAAC;+CACb,OAAO,CAAC,gEAAgE,CAAC;;wFAEhC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;;;;sBAI9F,OAAO,CAAC,YAAY,CAAC;+CACI,OAAO,CAAC,qKAAqK,CAAC;;;;;;;aAOhN,CAAA"}
|
package/dist/database.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
app:
|
|
4
|
-
db:
|
|
5
|
-
cats:
|
|
1
|
+
import type { Image, ImageCategory, ImageManagerApp, SaveImageRequest } from "./types.js";
|
|
2
|
+
export declare class ImageDB {
|
|
3
|
+
app: ImageManagerApp;
|
|
4
|
+
db: Record<number, Image>;
|
|
5
|
+
cats: ImageCategory[];
|
|
6
|
+
constructor(app: ImageManagerApp);
|
|
6
7
|
getDB(): Promise<void>;
|
|
7
|
-
saveImage(imageData:
|
|
8
|
+
saveImage(imageData: SaveImageRequest): Promise<number>;
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=database.d.ts.map
|
package/dist/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,KAAK,EACL,aAAa,EACb,eAAe,EAEf,gBAAgB,EAEnB,MAAM,YAAY,CAAA;AAInB,qBAAa,OAAO;IAChB,GAAG,EAAE,eAAe,CAAA;IAEpB,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAEzB,IAAI,EAAE,aAAa,EAAE,CAAA;gBAET,GAAG,EAAE,eAAe;IAMhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBtB,SAAS,CAAC,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;CAuC1D"}
|
package/dist/database.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { activateWait, addAlert, deactivateWait, gettext, postJson } from "fwtoolkit";
|
|
2
2
|
/* A class that holds information about images uploaded by the user. */
|
|
3
3
|
export class ImageDB {
|
|
4
|
+
app;
|
|
5
|
+
db;
|
|
6
|
+
cats;
|
|
4
7
|
constructor(app) {
|
|
5
8
|
this.app = app;
|
|
6
9
|
this.db = {};
|
|
@@ -11,8 +14,9 @@ export class ImageDB {
|
|
|
11
14
|
this.cats = [];
|
|
12
15
|
activateWait();
|
|
13
16
|
return postJson("/api/usermedia/images/").then(({ json }) => {
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
const response = json;
|
|
18
|
+
this.cats = response.imageCategories;
|
|
19
|
+
response.images.forEach(image => {
|
|
16
20
|
this.db[image.id] = image;
|
|
17
21
|
});
|
|
18
22
|
deactivateWait();
|
|
@@ -24,24 +28,26 @@ export class ImageDB {
|
|
|
24
28
|
const { image, ...jsonData } = imageData;
|
|
25
29
|
return postJson("/api/usermedia/save/", jsonData, image ? { image } : {})
|
|
26
30
|
.then(({ json }) => {
|
|
31
|
+
const response = json;
|
|
27
32
|
deactivateWait();
|
|
28
|
-
if (Object.keys(
|
|
29
|
-
return Promise.reject(new Error(
|
|
33
|
+
if (Object.keys(response.errormsg).length) {
|
|
34
|
+
return Promise.reject(new Error(response.errormsg.error));
|
|
30
35
|
}
|
|
31
36
|
else {
|
|
32
|
-
this.db[
|
|
33
|
-
return
|
|
37
|
+
this.db[response.values.id] = response.values;
|
|
38
|
+
return response.values.id;
|
|
34
39
|
}
|
|
35
40
|
})
|
|
36
41
|
.catch(error => {
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
const networkError = error;
|
|
43
|
+
if (networkError.status === 413) {
|
|
44
|
+
addAlert("error", `${gettext("Image is larger than the maximum permitted size")}${this.app.settings?.MEDIA_MAX_SIZE ? `: ${Number.parseInt(String(this.app.settings.MEDIA_MAX_SIZE / 1000000))}MB` : "."}`);
|
|
39
45
|
}
|
|
40
|
-
else if (
|
|
41
|
-
addAlert("error", gettext(
|
|
46
|
+
else if (networkError.message) {
|
|
47
|
+
addAlert("error", gettext(networkError.message));
|
|
42
48
|
}
|
|
43
49
|
else {
|
|
44
|
-
addAlert("error", gettext(
|
|
50
|
+
addAlert("error", gettext(networkError.statusText || ""));
|
|
45
51
|
}
|
|
46
52
|
deactivateWait();
|
|
47
53
|
throw error;
|
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { CheckableList, Dialog } from "fwtoolkit";
|
|
2
|
+
import type { ContentMenuInit } from "fwtoolkit/content_menu";
|
|
3
|
+
import type { ImageDB } from "../database.js";
|
|
4
|
+
import type { Copyright, ImageManagerPage } from "../types.js";
|
|
5
|
+
export declare class ImageEditDialog {
|
|
6
|
+
imageDB: ImageDB;
|
|
7
|
+
page: ImageManagerPage;
|
|
8
|
+
imageId: number | false;
|
|
9
|
+
dialog: Dialog | false;
|
|
10
|
+
copyright: Copyright;
|
|
11
|
+
menu: ContentMenuInit;
|
|
10
12
|
catsList: CheckableList | {
|
|
11
|
-
value:
|
|
12
|
-
}
|
|
13
|
+
value: (string | number)[];
|
|
14
|
+
};
|
|
15
|
+
mediaPreviewerDiv?: HTMLElement;
|
|
16
|
+
mediaPreviewer?: HTMLElement;
|
|
17
|
+
rotation: number;
|
|
18
|
+
cropped: boolean;
|
|
19
|
+
mediaInput?: File;
|
|
20
|
+
constructor(imageDB: ImageDB, imageId: number | false | undefined, page: ImageManagerPage);
|
|
21
|
+
init(): Promise<number | void>;
|
|
13
22
|
bindMediaUploadEvents(): void;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
cropped: boolean | undefined;
|
|
17
|
-
mediaInput: any;
|
|
18
|
-
mediaPreviewer: Element | null | undefined;
|
|
19
|
-
displayCreateImageError(errors: any): void;
|
|
20
|
-
saveImage(): Promise<any>;
|
|
23
|
+
displayCreateImageError(errors: Record<string, string>): void;
|
|
24
|
+
saveImage(): Promise<number | void>;
|
|
21
25
|
showOffline(): void;
|
|
22
26
|
}
|
|
23
|
-
import { CheckableList } from "fwtoolkit";
|
|
24
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/edit_dialog/index.
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/edit_dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAe,MAAM,EAAoB,MAAM,WAAW,CAAA;AAE/E,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAA;AAK3D,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EACR,SAAS,EAGT,gBAAgB,EAEnB,MAAM,aAAa,CAAA;AAEpB,qBAAa,eAAe;IACxB,OAAO,EAAE,OAAO,CAAA;IAEhB,IAAI,EAAE,gBAAgB,CAAA;IAEtB,OAAO,EAAE,MAAM,GAAG,KAAK,CAAA;IAEvB,MAAM,EAAE,MAAM,GAAG,KAAK,CAAQ;IAE9B,SAAS,EAAE,SAAS,CAAA;IAEpB,IAAI,EAAE,eAAe,CAAA;IAErB,QAAQ,EAAE,aAAa,GAAG;QAAC,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;KAAC,CAAc;IAEpE,iBAAiB,CAAC,EAAE,WAAW,CAAA;IAE/B,cAAc,CAAC,EAAE,WAAW,CAAA;IAE5B,QAAQ,SAAI;IAEZ,OAAO,UAAQ;IAEf,UAAU,CAAC,EAAE,IAAI,CAAA;gBAEL,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,YAAQ,EAAE,IAAI,EAAE,gBAAgB;IAkBrF,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+E9B,qBAAqB,IAAI,IAAI;IAwC7B,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAgBvD,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoFzC,WAAW,IAAI,IAAI;CAQtB"}
|
|
@@ -3,11 +3,22 @@ import { E2EEEncryptor } from "fwtoolkit/e2ee/encryptor";
|
|
|
3
3
|
import { imageEditModel } from "./model.js";
|
|
4
4
|
import { imageEditTemplate } from "./templates.js";
|
|
5
5
|
export class ImageEditDialog {
|
|
6
|
+
imageDB;
|
|
7
|
+
page;
|
|
8
|
+
imageId;
|
|
9
|
+
dialog = false;
|
|
10
|
+
copyright;
|
|
11
|
+
menu;
|
|
12
|
+
catsList = { value: [] };
|
|
13
|
+
mediaPreviewerDiv;
|
|
14
|
+
mediaPreviewer;
|
|
15
|
+
rotation = 0;
|
|
16
|
+
cropped = false;
|
|
17
|
+
mediaInput;
|
|
6
18
|
constructor(imageDB, imageId = false, page) {
|
|
7
19
|
this.imageDB = imageDB;
|
|
8
20
|
this.page = page;
|
|
9
21
|
this.imageId = imageId;
|
|
10
|
-
this.dialog = false;
|
|
11
22
|
this.copyright = this.imageId
|
|
12
23
|
? this.imageDB.db[this.imageId].copyright
|
|
13
24
|
: {
|
|
@@ -16,7 +27,9 @@ export class ImageEditDialog {
|
|
|
16
27
|
freeToRead: true,
|
|
17
28
|
licenses: []
|
|
18
29
|
};
|
|
19
|
-
this.menu =
|
|
30
|
+
this.menu =
|
|
31
|
+
this.page.menu
|
|
32
|
+
?.imageEditModel || imageEditModel();
|
|
20
33
|
}
|
|
21
34
|
//open a dialog for uploading an image
|
|
22
35
|
init() {
|
|
@@ -25,7 +38,8 @@ export class ImageEditDialog {
|
|
|
25
38
|
return Promise.resolve();
|
|
26
39
|
}
|
|
27
40
|
const returnPromise = new Promise(resolve => {
|
|
28
|
-
|
|
41
|
+
let dialog;
|
|
42
|
+
dialog = new Dialog({
|
|
29
43
|
title: this.imageId
|
|
30
44
|
? gettext("Update Image Information")
|
|
31
45
|
: gettext("Upload Image"),
|
|
@@ -46,24 +60,28 @@ export class ImageEditDialog {
|
|
|
46
60
|
{
|
|
47
61
|
type: "cancel",
|
|
48
62
|
classes: "fw-orange",
|
|
49
|
-
click: () =>
|
|
63
|
+
click: () => dialog.close()
|
|
50
64
|
}
|
|
51
65
|
]
|
|
52
66
|
});
|
|
53
|
-
this.dialog
|
|
67
|
+
this.dialog = dialog;
|
|
68
|
+
dialog.open();
|
|
54
69
|
});
|
|
55
|
-
const image = this.imageId
|
|
70
|
+
const image = this.imageId
|
|
71
|
+
? this.imageDB.db[this.imageId]
|
|
72
|
+
: false;
|
|
56
73
|
const catsEl = document.getElementById("image-edit-categories");
|
|
57
74
|
if (catsEl) {
|
|
58
|
-
|
|
75
|
+
const checkableOptions = {
|
|
59
76
|
dom: catsEl,
|
|
60
|
-
options: this.imageDB.cats.map(cat => ({
|
|
77
|
+
options: this.imageDB.cats.map((cat) => ({
|
|
61
78
|
id: cat.id,
|
|
62
79
|
label: cat.category_title
|
|
63
80
|
})),
|
|
64
81
|
initialValue: image ? image.cats : [],
|
|
65
82
|
multiple: true
|
|
66
|
-
}
|
|
83
|
+
};
|
|
84
|
+
this.catsList = new CheckableList(checkableOptions);
|
|
67
85
|
}
|
|
68
86
|
else {
|
|
69
87
|
this.catsList = { value: [] };
|
|
@@ -71,39 +89,47 @@ export class ImageEditDialog {
|
|
|
71
89
|
if (!this.imageId) {
|
|
72
90
|
this.bindMediaUploadEvents();
|
|
73
91
|
}
|
|
74
|
-
document
|
|
75
|
-
|
|
76
|
-
.addEventListener("click", event => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
92
|
+
const figureEditMenu = document.querySelector(".figure-edit-menu");
|
|
93
|
+
if (figureEditMenu) {
|
|
94
|
+
figureEditMenu.addEventListener("click", event => {
|
|
95
|
+
event.preventDefault();
|
|
96
|
+
event.stopImmediatePropagation();
|
|
97
|
+
const contentMenu = new ContentMenu({
|
|
98
|
+
menu: this.menu,
|
|
99
|
+
width: 220,
|
|
100
|
+
page: this,
|
|
101
|
+
menuPos: { X: event.pageX - 50, Y: event.pageY + 50 }
|
|
102
|
+
});
|
|
103
|
+
contentMenu.open();
|
|
84
104
|
});
|
|
85
|
-
|
|
86
|
-
});
|
|
105
|
+
}
|
|
87
106
|
return returnPromise;
|
|
88
107
|
}
|
|
89
108
|
//add image upload events
|
|
90
109
|
bindMediaUploadEvents() {
|
|
91
110
|
const selectButton = document.querySelector("#editimage .fw-media-select-button"), mediaInputSelector = document.querySelector("#editimage .fw-media-file-input");
|
|
92
|
-
this.mediaPreviewerDiv = document.querySelector("#editimage .figure-preview > div");
|
|
111
|
+
this.mediaPreviewerDiv = document.querySelector("#editimage .figure-preview > div") || undefined;
|
|
93
112
|
this.rotation = 0;
|
|
94
113
|
this.cropped = false;
|
|
114
|
+
if (!selectButton || !mediaInputSelector || !this.mediaPreviewerDiv) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
95
117
|
selectButton.addEventListener("click", () => {
|
|
96
118
|
mediaInputSelector.click();
|
|
97
119
|
});
|
|
120
|
+
const dialog = this.dialog;
|
|
121
|
+
if (!dialog) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
98
124
|
mediaInputSelector.addEventListener("change", () => {
|
|
99
125
|
this.mediaInput = mediaInputSelector.files[0];
|
|
100
126
|
const fr = new window.FileReader();
|
|
101
127
|
fr.onload = () => {
|
|
102
128
|
this.mediaPreviewerDiv.innerHTML = `<div class="img" style="background-image: url(${fr.result});" />`;
|
|
103
129
|
this.mediaPreviewer =
|
|
104
|
-
this.mediaPreviewerDiv.querySelector(".img");
|
|
130
|
+
this.mediaPreviewerDiv.querySelector(".img") || undefined;
|
|
105
131
|
this.mediaPreviewerDiv.classList.remove("crop-mode");
|
|
106
|
-
|
|
132
|
+
dialog.centerDialog();
|
|
107
133
|
};
|
|
108
134
|
fr.readAsDataURL(this.mediaInput);
|
|
109
135
|
});
|
|
@@ -117,27 +143,30 @@ export class ImageEditDialog {
|
|
|
117
143
|
.insertAdjacentHTML("afterbegin", eMsg);
|
|
118
144
|
}
|
|
119
145
|
else {
|
|
120
|
-
document
|
|
121
|
-
|
|
122
|
-
.insertAdjacentHTML("afterend", eMsg);
|
|
146
|
+
const fieldEl = document.getElementById(`id_${eKey}`);
|
|
147
|
+
if (fieldEl) {
|
|
148
|
+
fieldEl.insertAdjacentHTML("afterend", eMsg);
|
|
149
|
+
}
|
|
123
150
|
}
|
|
124
151
|
});
|
|
125
152
|
}
|
|
126
153
|
async saveImage() {
|
|
154
|
+
const titleInput = document.querySelector("#editimage .fw-media-title");
|
|
127
155
|
const imageData = {
|
|
128
|
-
title:
|
|
156
|
+
title: titleInput ? titleInput.value : "",
|
|
129
157
|
copyright: this.copyright,
|
|
130
158
|
cats: this.catsList.value
|
|
131
159
|
};
|
|
132
160
|
if (this.imageId) {
|
|
133
161
|
imageData.id = this.imageId;
|
|
134
162
|
}
|
|
135
|
-
else if (!this.rotation && !this.cropped) {
|
|
163
|
+
else if (!this.rotation && !this.cropped && this.mediaInput) {
|
|
136
164
|
imageData.image = this.mediaInput;
|
|
137
165
|
}
|
|
138
|
-
else {
|
|
139
|
-
const
|
|
140
|
-
|
|
166
|
+
else if (this.mediaPreviewer && this.mediaInput) {
|
|
167
|
+
const mediaPreviewer = this.mediaPreviewer;
|
|
168
|
+
const mediaPreviewerStyle = mediaPreviewer.currentStyle ||
|
|
169
|
+
window.getComputedStyle(mediaPreviewer, false);
|
|
141
170
|
const base64data = mediaPreviewerStyle.backgroundImage
|
|
142
171
|
.slice(4, -1)
|
|
143
172
|
.replace(/"/g, "");
|
|
@@ -164,8 +193,11 @@ export class ImageEditDialog {
|
|
|
164
193
|
.querySelectorAll("#editimage .fw-warning")
|
|
165
194
|
.forEach(el => el.parentElement.removeChild(el));
|
|
166
195
|
return new Promise(resolve => {
|
|
196
|
+
const dialog = this.dialog;
|
|
167
197
|
this.imageDB.saveImage(imageData).then(imageId => {
|
|
168
|
-
|
|
198
|
+
if (dialog) {
|
|
199
|
+
dialog.close();
|
|
200
|
+
}
|
|
169
201
|
addAlert("success", gettext("The image has been updated."));
|
|
170
202
|
this.imageId = imageId;
|
|
171
203
|
resolve(imageId);
|