@fiduswriter/image-manager 0.1.0
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/LICENSE +661 -0
- package/README.md +5 -0
- package/dist/copyright_dialog/index.d.ts +17 -0
- package/dist/copyright_dialog/index.d.ts.map +1 -0
- package/dist/copyright_dialog/index.js +148 -0
- package/dist/copyright_dialog/index.js.map +1 -0
- package/dist/copyright_dialog/templates.d.ts +13 -0
- package/dist/copyright_dialog/templates.d.ts.map +1 -0
- package/dist/copyright_dialog/templates.js +48 -0
- package/dist/copyright_dialog/templates.js.map +1 -0
- package/dist/database.d.ts +9 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +51 -0
- package/dist/database.js.map +1 -0
- package/dist/edit_dialog/index.d.ts +24 -0
- package/dist/edit_dialog/index.d.ts.map +1 -0
- package/dist/edit_dialog/index.js +186 -0
- package/dist/edit_dialog/index.js.map +1 -0
- package/dist/edit_dialog/model.d.ts +20 -0
- package/dist/edit_dialog/model.d.ts.map +1 -0
- package/dist/edit_dialog/model.js +153 -0
- package/dist/edit_dialog/model.js.map +1 -0
- package/dist/edit_dialog/templates.d.ts +5 -0
- package/dist/edit_dialog/templates.d.ts.map +1 -0
- package/dist/edit_dialog/templates.js +33 -0
- package/dist/edit_dialog/templates.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/overview/categories.d.ts +8 -0
- package/dist/overview/categories.d.ts.map +1 -0
- package/dist/overview/categories.js +94 -0
- package/dist/overview/categories.js.map +1 -0
- package/dist/overview/index.d.ts +39 -0
- package/dist/overview/index.d.ts.map +1 -0
- package/dist/overview/index.js +358 -0
- package/dist/overview/index.js.map +1 -0
- package/dist/overview/menu.d.ts +48 -0
- package/dist/overview/menu.d.ts.map +1 -0
- package/dist/overview/menu.js +67 -0
- package/dist/overview/menu.js.map +1 -0
- package/dist/overview/templates.d.ts +4 -0
- package/dist/overview/templates.d.ts.map +1 -0
- package/dist/overview/templates.js +24 -0
- package/dist/overview/templates.js.map +1 -0
- package/dist/selection_dialog/index.d.ts +19 -0
- package/dist/selection_dialog/index.d.ts.map +1 -0
- package/dist/selection_dialog/index.js +149 -0
- package/dist/selection_dialog/index.js.map +1 -0
- package/package.json +53 -0
- package/src/copyright_dialog/index.js +179 -0
- package/src/copyright_dialog/templates.js +56 -0
- package/src/database.js +57 -0
- package/src/edit_dialog/index.js +222 -0
- package/src/edit_dialog/model.js +184 -0
- package/src/edit_dialog/templates.js +41 -0
- package/src/index.js +4 -0
- package/src/overview/categories.js +115 -0
- package/src/overview/index.js +435 -0
- package/src/overview/menu.js +75 -0
- package/src/overview/templates.js +30 -0
- package/src/selection_dialog/index.js +176 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import {Dialog, SelectionDataTable, cancelPromise, escapeText, gettext} from "fwtoolkit"
|
|
2
|
+
|
|
3
|
+
export class ImageSelectionDialog {
|
|
4
|
+
constructor(imageDB, userImageDB, imgId, page) {
|
|
5
|
+
this.imageDB = imageDB
|
|
6
|
+
this.userImageDB = userImageDB
|
|
7
|
+
this.page = page
|
|
8
|
+
this.imgId = imgId // a preselected image
|
|
9
|
+
this.imgDb = "document" // the preselection image will always come from the document
|
|
10
|
+
this.images = [] // images from both databases
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
isE2EE() {
|
|
14
|
+
return this.page.e2ee?.encrypted === true
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
init() {
|
|
18
|
+
console.log(
|
|
19
|
+
"DEBUG selection init: docImages=",
|
|
20
|
+
Object.keys(this.imageDB.db).length,
|
|
21
|
+
"userImages=",
|
|
22
|
+
Object.keys(this.userImageDB.db).length
|
|
23
|
+
)
|
|
24
|
+
this.images = Object.values(this.imageDB.db).map(image => {
|
|
25
|
+
return {
|
|
26
|
+
image,
|
|
27
|
+
db: "document"
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
Object.values(this.userImageDB.db).forEach(image => {
|
|
31
|
+
if (this.imageDB.db[image.id]) {
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
this.images.push({
|
|
35
|
+
image,
|
|
36
|
+
db: "user"
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
console.log("DEBUG selection images=", this.images.length)
|
|
40
|
+
const buttons = []
|
|
41
|
+
const p = new Promise(resolve => {
|
|
42
|
+
if (!this.page.app.isOffline()) {
|
|
43
|
+
buttons.push({
|
|
44
|
+
text: gettext("Add new image"),
|
|
45
|
+
icon: "plus-circle",
|
|
46
|
+
click: () => {
|
|
47
|
+
import("../edit_dialog").then(({ImageEditDialog}) => {
|
|
48
|
+
const targetDB = this.isE2EE()
|
|
49
|
+
? this.imageDB
|
|
50
|
+
: this.userImageDB
|
|
51
|
+
const imageUpload = new ImageEditDialog(
|
|
52
|
+
targetDB,
|
|
53
|
+
false,
|
|
54
|
+
this.page
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
resolve(
|
|
58
|
+
imageUpload.init().then(imageId => {
|
|
59
|
+
console.log(
|
|
60
|
+
"DEBUG upload resolved imageId=",
|
|
61
|
+
imageId
|
|
62
|
+
)
|
|
63
|
+
this.imgId = imageId
|
|
64
|
+
// For E2EE docs the image goes straight
|
|
65
|
+
// into the document DB, not the user's.
|
|
66
|
+
this.imgDb = this.isE2EE()
|
|
67
|
+
? "document"
|
|
68
|
+
: "user"
|
|
69
|
+
console.log(
|
|
70
|
+
"DEBUG closing selection dialog"
|
|
71
|
+
)
|
|
72
|
+
this.imageDialog.close()
|
|
73
|
+
console.log("DEBUG reinit selection dialog")
|
|
74
|
+
return this.init()
|
|
75
|
+
})
|
|
76
|
+
)
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
buttons.push({
|
|
83
|
+
text: gettext("Use image"),
|
|
84
|
+
classes: "fw-dark",
|
|
85
|
+
click: () => {
|
|
86
|
+
this.imageDialog.close()
|
|
87
|
+
resolve({id: this.imgId, db: this.imgDb})
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
buttons.push({
|
|
92
|
+
type: "cancel",
|
|
93
|
+
click: () => {
|
|
94
|
+
this.imageDialog.close()
|
|
95
|
+
resolve(cancelPromise())
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
this.imageDialog = new Dialog({
|
|
100
|
+
buttons,
|
|
101
|
+
width: 300,
|
|
102
|
+
body: '<div class="image-selection-table"></div>',
|
|
103
|
+
title: gettext("Images"),
|
|
104
|
+
id: "select-image-dialog"
|
|
105
|
+
})
|
|
106
|
+
this.imageDialog.open()
|
|
107
|
+
this.initTable()
|
|
108
|
+
this.imageDialog.centerDialog()
|
|
109
|
+
return p
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
initTable() {
|
|
113
|
+
/* Initialize the overview table */
|
|
114
|
+
const tableEl = document.createElement("table")
|
|
115
|
+
tableEl.classList.add("fw-data-table")
|
|
116
|
+
tableEl.classList.add("fw-small")
|
|
117
|
+
const host = this.imageDialog.dialogEl.querySelector(
|
|
118
|
+
"div.image-selection-table"
|
|
119
|
+
)
|
|
120
|
+
host.innerHTML = ""
|
|
121
|
+
host.appendChild(tableEl)
|
|
122
|
+
|
|
123
|
+
const selectedIds =
|
|
124
|
+
this.imgId === false ? [] : [`${this.imgDb}-${this.imgId}`]
|
|
125
|
+
|
|
126
|
+
this.selectionTable = new SelectionDataTable({
|
|
127
|
+
dom: host,
|
|
128
|
+
classes: ["fw-data-table", "fw-small"],
|
|
129
|
+
columns: [
|
|
130
|
+
{
|
|
131
|
+
select: 0,
|
|
132
|
+
hidden: true
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
select: [0, 2],
|
|
136
|
+
type: "string"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
select: [1, 3],
|
|
140
|
+
sortable: false
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
data: this.images.map(image => this.createTableRow(image)),
|
|
144
|
+
idColumn: 0,
|
|
145
|
+
multiple: false,
|
|
146
|
+
selectedIds,
|
|
147
|
+
scrollY: "270px",
|
|
148
|
+
labels: {
|
|
149
|
+
noRows: gettext("No images available"), // Message shown when there are no images
|
|
150
|
+
noResults: gettext("No images found"), // Message shown when no images are found after search
|
|
151
|
+
placeholder: gettext("Search...") // placeholder for search field
|
|
152
|
+
},
|
|
153
|
+
onChange: selected => {
|
|
154
|
+
if (selected.length) {
|
|
155
|
+
const [db, id] = String(selected[0]).split("-")
|
|
156
|
+
this.imgId = Number.parseInt(id)
|
|
157
|
+
this.imgDb = db
|
|
158
|
+
} else {
|
|
159
|
+
this.imgId = false
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
this.selectionTable.init()
|
|
164
|
+
this.table = this.selectionTable.table
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
createTableRow(image) {
|
|
168
|
+
return [
|
|
169
|
+
`${image.db}-${image.image.id}`,
|
|
170
|
+
image.image.thumbnail === undefined
|
|
171
|
+
? `<img src="${image.image.image}" style="max-heigth:30px;max-width:30px;">`
|
|
172
|
+
: `<img src="${image.image.thumbnail}" style="max-heigth:30px;max-width:30px;">`,
|
|
173
|
+
escapeText(image.image.title)
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
}
|