@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.
Files changed (63) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +5 -0
  3. package/dist/copyright_dialog/index.d.ts +17 -0
  4. package/dist/copyright_dialog/index.d.ts.map +1 -0
  5. package/dist/copyright_dialog/index.js +148 -0
  6. package/dist/copyright_dialog/index.js.map +1 -0
  7. package/dist/copyright_dialog/templates.d.ts +13 -0
  8. package/dist/copyright_dialog/templates.d.ts.map +1 -0
  9. package/dist/copyright_dialog/templates.js +48 -0
  10. package/dist/copyright_dialog/templates.js.map +1 -0
  11. package/dist/database.d.ts +9 -0
  12. package/dist/database.d.ts.map +1 -0
  13. package/dist/database.js +51 -0
  14. package/dist/database.js.map +1 -0
  15. package/dist/edit_dialog/index.d.ts +24 -0
  16. package/dist/edit_dialog/index.d.ts.map +1 -0
  17. package/dist/edit_dialog/index.js +186 -0
  18. package/dist/edit_dialog/index.js.map +1 -0
  19. package/dist/edit_dialog/model.d.ts +20 -0
  20. package/dist/edit_dialog/model.d.ts.map +1 -0
  21. package/dist/edit_dialog/model.js +153 -0
  22. package/dist/edit_dialog/model.js.map +1 -0
  23. package/dist/edit_dialog/templates.d.ts +5 -0
  24. package/dist/edit_dialog/templates.d.ts.map +1 -0
  25. package/dist/edit_dialog/templates.js +33 -0
  26. package/dist/edit_dialog/templates.js.map +1 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +5 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/overview/categories.d.ts +8 -0
  32. package/dist/overview/categories.d.ts.map +1 -0
  33. package/dist/overview/categories.js +94 -0
  34. package/dist/overview/categories.js.map +1 -0
  35. package/dist/overview/index.d.ts +39 -0
  36. package/dist/overview/index.d.ts.map +1 -0
  37. package/dist/overview/index.js +358 -0
  38. package/dist/overview/index.js.map +1 -0
  39. package/dist/overview/menu.d.ts +48 -0
  40. package/dist/overview/menu.d.ts.map +1 -0
  41. package/dist/overview/menu.js +67 -0
  42. package/dist/overview/menu.js.map +1 -0
  43. package/dist/overview/templates.d.ts +4 -0
  44. package/dist/overview/templates.d.ts.map +1 -0
  45. package/dist/overview/templates.js +24 -0
  46. package/dist/overview/templates.js.map +1 -0
  47. package/dist/selection_dialog/index.d.ts +19 -0
  48. package/dist/selection_dialog/index.d.ts.map +1 -0
  49. package/dist/selection_dialog/index.js +149 -0
  50. package/dist/selection_dialog/index.js.map +1 -0
  51. package/package.json +53 -0
  52. package/src/copyright_dialog/index.js +179 -0
  53. package/src/copyright_dialog/templates.js +56 -0
  54. package/src/database.js +57 -0
  55. package/src/edit_dialog/index.js +222 -0
  56. package/src/edit_dialog/model.js +184 -0
  57. package/src/edit_dialog/templates.js +41 -0
  58. package/src/index.js +4 -0
  59. package/src/overview/categories.js +115 -0
  60. package/src/overview/index.js +435 -0
  61. package/src/overview/menu.js +75 -0
  62. package/src/overview/templates.js +30 -0
  63. 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
+ }