@knowark/componarkjs 1.14.0 → 1.14.2
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 +57 -45
- package/lib/base/component/README.md +127 -0
- package/lib/base/component/component.js +127 -21
- package/lib/base/component/component.test.js +296 -3
- package/lib/base/component/index.js +3 -0
- package/lib/base/styles/index.js +4 -1
- package/lib/base/utils/define.js +2 -1
- package/lib/base/utils/format.js +12 -6
- package/lib/base/utils/helpers.js +31 -5
- package/lib/base/utils/index.js +1 -0
- package/lib/base/utils/slots.js +3 -2
- package/lib/base/utils/uuid.js +1 -1
- package/lib/components/audio/components/audio.js +17 -2
- package/lib/components/audio/index.js +1 -0
- package/lib/components/audio/styles/index.js +5 -1
- package/lib/components/camera/components/camera.js +10 -0
- package/lib/components/camera/index.js +1 -0
- package/lib/components/camera/styles/index.js +5 -1
- package/lib/components/capture/components/capture.js +18 -2
- package/lib/components/capture/index.js +1 -0
- package/lib/components/droparea/components/droparea-preview.js +58 -13
- package/lib/components/droparea/components/droparea-preview.test.js +82 -0
- package/lib/components/droparea/components/droparea.js +41 -2
- package/lib/components/droparea/index.js +1 -0
- package/lib/components/droparea/styles/index.js +5 -1
- package/lib/components/emit/components/emit.js +11 -1
- package/lib/components/emit/index.js +1 -0
- package/lib/components/index.js +2 -1
- package/lib/components/list/components/item.js +6 -0
- package/lib/components/list/components/list.js +18 -4
- package/lib/components/list/index.js +1 -0
- package/lib/components/paginator/components/paginator.js +34 -8
- package/lib/components/paginator/index.js +1 -0
- package/lib/components/paginator/styles/index.js +5 -1
- package/lib/components/spinner/components/spinner.js +10 -0
- package/lib/components/spinner/index.js +1 -0
- package/lib/components/spinner/styles/index.js +5 -1
- package/lib/components/splitview/components/splitview.detail.js +10 -1
- package/lib/components/splitview/components/splitview.js +18 -3
- package/lib/components/splitview/components/splitview.master.js +10 -0
- package/lib/components/splitview/index.js +1 -0
- package/lib/components/translate/components/translate.js +42 -11
- package/lib/components/translate/components/translate.test.js +169 -1
- package/lib/components/translate/index.js +1 -0
- package/lib/index.js +3 -0
- package/package.json +2 -1
- package/tsconfig.json +1 -1
- package/types/base/component/component.d.ts +43 -8
- package/types/base/component/component.d.ts.map +1 -1
- package/types/base/component/index.d.ts +4 -6
- package/types/base/component/index.d.ts.map +1 -1
- package/types/base/styles/index.d.ts +3 -2
- package/types/base/styles/index.d.ts.map +1 -1
- package/types/base/utils/define.d.ts +3 -2
- package/types/base/utils/define.d.ts.map +1 -1
- package/types/base/utils/format.d.ts +12 -6
- package/types/base/utils/format.d.ts.map +1 -1
- package/types/base/utils/helpers.d.ts +27 -7
- package/types/base/utils/helpers.d.ts.map +1 -1
- package/types/base/utils/slots.d.ts +8 -10
- package/types/base/utils/slots.d.ts.map +1 -1
- package/types/base/utils/uuid.d.ts +1 -1
- package/types/base/utils/uuid.d.ts.map +1 -1
- package/types/components/audio/components/audio.d.ts +23 -9
- package/types/components/audio/components/audio.d.ts.map +1 -1
- package/types/components/audio/styles/index.d.ts +3 -2
- package/types/components/audio/styles/index.d.ts.map +1 -1
- package/types/components/camera/components/camera.d.ts +11 -3
- package/types/components/camera/components/camera.d.ts.map +1 -1
- package/types/components/camera/styles/index.d.ts +3 -2
- package/types/components/camera/styles/index.d.ts.map +1 -1
- package/types/components/capture/components/capture.d.ts +23 -3
- package/types/components/capture/components/capture.d.ts.map +1 -1
- package/types/components/droparea/components/droparea-preview.d.ts +64 -11
- package/types/components/droparea/components/droparea-preview.d.ts.map +1 -1
- package/types/components/droparea/components/droparea.d.ts +58 -13
- package/types/components/droparea/components/droparea.d.ts.map +1 -1
- package/types/components/droparea/styles/index.d.ts +3 -2
- package/types/components/droparea/styles/index.d.ts.map +1 -1
- package/types/components/emit/components/emit.d.ts +15 -3
- package/types/components/emit/components/emit.d.ts.map +1 -1
- package/types/components/list/components/item.d.ts +8 -1
- package/types/components/list/components/item.d.ts.map +1 -1
- package/types/components/list/components/list.d.ts +23 -5
- package/types/components/list/components/list.d.ts.map +1 -1
- package/types/components/paginator/components/paginator.d.ts +32 -8
- package/types/components/paginator/components/paginator.d.ts.map +1 -1
- package/types/components/paginator/styles/index.d.ts +3 -2
- package/types/components/paginator/styles/index.d.ts.map +1 -1
- package/types/components/spinner/components/spinner.d.ts +14 -3
- package/types/components/spinner/components/spinner.d.ts.map +1 -1
- package/types/components/spinner/styles/index.d.ts +3 -2
- package/types/components/spinner/styles/index.d.ts.map +1 -1
- package/types/components/splitview/components/splitview.d.ts +22 -4
- package/types/components/splitview/components/splitview.d.ts.map +1 -1
- package/types/components/splitview/components/splitview.detail.d.ts +12 -2
- package/types/components/splitview/components/splitview.detail.d.ts.map +1 -1
- package/types/components/splitview/components/splitview.master.d.ts +12 -1
- package/types/components/splitview/components/splitview.master.d.ts.map +1 -1
- package/types/components/translate/components/translate.d.ts +44 -10
- package/types/components/translate/components/translate.d.ts.map +1 -1
- package/lib/base/component/README.rst +0 -113
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Component } from "#base/index.js"
|
|
2
2
|
|
|
3
3
|
const tag = 'ark-capture'
|
|
4
|
+
/** Template-driven renderer component. */
|
|
4
5
|
export class Capture extends Component {
|
|
5
6
|
constructor () {
|
|
6
7
|
super()
|
|
@@ -12,7 +13,8 @@ export class Capture extends Component {
|
|
|
12
13
|
return ['receive']
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
/** @param {
|
|
16
|
+
/** @param {object} context
|
|
17
|
+
* @returns {this} */
|
|
16
18
|
init (context = {}) {
|
|
17
19
|
const data = this._parseJSON(this._pop(':scope > data')?.textContent)
|
|
18
20
|
this.source = /** @type {object} */ (
|
|
@@ -23,6 +25,7 @@ export class Capture extends Component {
|
|
|
23
25
|
return super.init()
|
|
24
26
|
}
|
|
25
27
|
|
|
28
|
+
/** @returns {this} */
|
|
26
29
|
render () {
|
|
27
30
|
const outputTemplate = this._pop(':scope > template')?.innerHTML
|
|
28
31
|
this.template = (
|
|
@@ -36,11 +39,16 @@ export class Capture extends Component {
|
|
|
36
39
|
return super.render()
|
|
37
40
|
}
|
|
38
41
|
|
|
42
|
+
/** @param {{detail:any}} event */
|
|
39
43
|
handle (event) {
|
|
40
44
|
const source = event.detail
|
|
41
45
|
this.init({ source }).render()
|
|
42
46
|
}
|
|
43
47
|
|
|
48
|
+
/**
|
|
49
|
+
* @param {string} template
|
|
50
|
+
* @returns {(data: any) => string}
|
|
51
|
+
*/
|
|
44
52
|
_format (template) {
|
|
45
53
|
let render = null
|
|
46
54
|
|
|
@@ -62,12 +70,20 @@ export class Capture extends Component {
|
|
|
62
70
|
}
|
|
63
71
|
}
|
|
64
72
|
|
|
73
|
+
/**
|
|
74
|
+
* @param {string} selector
|
|
75
|
+
* @returns {HTMLElement|null}
|
|
76
|
+
*/
|
|
65
77
|
_pop (selector) {
|
|
66
78
|
const element = this.querySelector(selector)
|
|
67
79
|
element?.remove()
|
|
68
|
-
return element
|
|
80
|
+
return /** @type {HTMLElement|null} */ (element)
|
|
69
81
|
}
|
|
70
82
|
|
|
83
|
+
/**
|
|
84
|
+
* @param {string|null} source
|
|
85
|
+
* @returns {object|null}
|
|
86
|
+
*/
|
|
71
87
|
_parseJSON (source) {
|
|
72
88
|
if (!source) return null
|
|
73
89
|
|
|
@@ -4,6 +4,9 @@ import './droparea.js'
|
|
|
4
4
|
/** @import {Droparea} from './droparea.js' */
|
|
5
5
|
|
|
6
6
|
const tag = 'ark-droparea-preview'
|
|
7
|
+
/**
|
|
8
|
+
* Renders file previews and drag-sort ordering.
|
|
9
|
+
*/
|
|
7
10
|
|
|
8
11
|
export class DropareaPreview extends Component {
|
|
9
12
|
constructor () {
|
|
@@ -12,15 +15,19 @@ export class DropareaPreview extends Component {
|
|
|
12
15
|
this._onDragEnd = this.handleDrop.bind(this)
|
|
13
16
|
}
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
/** @param {object} context
|
|
19
|
+
* @returns {this} */
|
|
20
|
+
init (context = {}) {
|
|
16
21
|
return super.init()
|
|
17
22
|
}
|
|
18
23
|
|
|
24
|
+
/** @returns {void} */
|
|
19
25
|
disconnectedCallback () {
|
|
20
26
|
this.revokeAllFiles()
|
|
21
27
|
super.disconnectedCallback()
|
|
22
28
|
}
|
|
23
29
|
|
|
30
|
+
/** @returns {this} */
|
|
24
31
|
render () {
|
|
25
32
|
this.content = /* html */ `
|
|
26
33
|
<ul data-preview-list class="ark-droparea-preview__list drag-sort-enable"></ul>
|
|
@@ -28,6 +35,10 @@ export class DropareaPreview extends Component {
|
|
|
28
35
|
return super.render()
|
|
29
36
|
}
|
|
30
37
|
|
|
38
|
+
/**
|
|
39
|
+
* @param {File} file
|
|
40
|
+
* @returns {void}
|
|
41
|
+
*/
|
|
31
42
|
previewFile (file) {
|
|
32
43
|
const blobUrl = this.getObjectURL(file)
|
|
33
44
|
const fileType = file.type.split('/')[0]
|
|
@@ -58,6 +69,7 @@ export class DropareaPreview extends Component {
|
|
|
58
69
|
}
|
|
59
70
|
}
|
|
60
71
|
|
|
72
|
+
/** @returns {void} */
|
|
61
73
|
toggleVisibility () {
|
|
62
74
|
const previewZone = this.select('[data-preview-list]')
|
|
63
75
|
this.files.length !== 0
|
|
@@ -67,6 +79,8 @@ export class DropareaPreview extends Component {
|
|
|
67
79
|
|
|
68
80
|
/* DragSort Functionality */
|
|
69
81
|
|
|
82
|
+
/** @param {string} listClass
|
|
83
|
+
* @returns {void} */
|
|
70
84
|
enableDragSort (listClass) {
|
|
71
85
|
const sortableLists = this.getElementsByClassName(listClass)
|
|
72
86
|
Array.prototype.map.call(sortableLists, (list) => {
|
|
@@ -74,56 +88,69 @@ export class DropareaPreview extends Component {
|
|
|
74
88
|
})
|
|
75
89
|
}
|
|
76
90
|
|
|
91
|
+
/** @param {HTMLUListElement} list
|
|
92
|
+
* @returns {void} */
|
|
77
93
|
enableDragList (list) {
|
|
78
94
|
Array.prototype.map.call(list.children, (item) => {
|
|
79
95
|
this.enableDragItem(item)
|
|
80
96
|
})
|
|
81
97
|
}
|
|
82
98
|
|
|
99
|
+
/** @param {HTMLElement} item
|
|
100
|
+
* @returns {void} */
|
|
83
101
|
enableDragItem (item) {
|
|
84
102
|
if (item.hasAttribute('data-drag-enabled')) return
|
|
85
103
|
|
|
86
104
|
item.setAttribute('data-drag-enabled', '')
|
|
87
|
-
item.setAttribute('draggable', true)
|
|
105
|
+
item.setAttribute('draggable', 'true')
|
|
88
106
|
item.addEventListener('drag', this.handleDrag.bind(this, item))
|
|
89
107
|
item.addEventListener('dragend', this._onDragEnd, false)
|
|
90
108
|
}
|
|
91
109
|
|
|
92
110
|
/* istanbul ignore next */
|
|
111
|
+
/** @param {HTMLLIElement} item
|
|
112
|
+
* @param {DragEvent} event
|
|
113
|
+
* @returns {void} */
|
|
93
114
|
handleDrag (item, event) {
|
|
94
115
|
const selectedItem = item
|
|
95
|
-
const list = selectedItem.
|
|
116
|
+
const list = /** @type {HTMLElement} */ (selectedItem.parentElement)
|
|
96
117
|
const x = event.clientX
|
|
97
118
|
const y = event.clientY
|
|
98
119
|
|
|
99
120
|
selectedItem.classList.add('drag-sort-active')
|
|
100
|
-
let swapItem =
|
|
101
|
-
document.elementFromPoint(x, y)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (list === swapItem.parentNode) {
|
|
121
|
+
let swapItem = /** @type {ChildNode|null} */ (
|
|
122
|
+
document.elementFromPoint(x, y))
|
|
123
|
+
if (!swapItem) swapItem = selectedItem
|
|
124
|
+
|
|
125
|
+
if (list && swapItem && list === swapItem.parentNode) {
|
|
105
126
|
swapItem = (
|
|
106
127
|
swapItem !== selectedItem.nextSibling
|
|
107
128
|
? swapItem
|
|
108
129
|
: swapItem.nextSibling)
|
|
109
|
-
list.insertBefore(selectedItem, swapItem)
|
|
130
|
+
list.insertBefore(selectedItem, /** @type {ChildNode|null} */ (swapItem))
|
|
110
131
|
}
|
|
111
132
|
}
|
|
112
133
|
|
|
134
|
+
/** @param {DragEvent} event
|
|
135
|
+
* @returns {void} */
|
|
113
136
|
handleDrop (event) {
|
|
114
|
-
const
|
|
137
|
+
const target = /** @type {HTMLElement|null} */ (event.target)
|
|
138
|
+
if (!target) return
|
|
139
|
+
const droparea = /** @type {Droparea|null} */ (target.closest('ark-droparea'))
|
|
115
140
|
if (!droparea) return
|
|
116
141
|
|
|
117
142
|
droparea.preview.createNewFileList()
|
|
118
|
-
|
|
143
|
+
target.classList.remove('drag-sort-active')
|
|
119
144
|
droparea.preview.dispatchAlterEvent()
|
|
120
145
|
}
|
|
121
146
|
/* ---------------------------------------------------- */
|
|
122
147
|
|
|
148
|
+
/** @returns {void} */
|
|
123
149
|
dispatchAlterEvent () {
|
|
124
150
|
this.emit('alter', this.mediaList)
|
|
125
151
|
}
|
|
126
152
|
|
|
153
|
+
/** @returns {void} */
|
|
127
154
|
createNewFileList () {
|
|
128
155
|
const nodeList = this.querySelectorAll('li')
|
|
129
156
|
const newList = []
|
|
@@ -134,10 +161,16 @@ export class DropareaPreview extends Component {
|
|
|
134
161
|
this.droparea.fileList = newList
|
|
135
162
|
}
|
|
136
163
|
|
|
164
|
+
/**
|
|
165
|
+
* @param {File} file
|
|
166
|
+
* @returns {boolean}
|
|
167
|
+
*/
|
|
137
168
|
fileExists (file) {
|
|
138
169
|
return this.files.some((item) => item.name === file.name)
|
|
139
170
|
}
|
|
140
171
|
|
|
172
|
+
/** @param {File} file
|
|
173
|
+
* @returns {string} */
|
|
141
174
|
getObjectURL (file) {
|
|
142
175
|
if (this._objectUrls.has(file)) return this._objectUrls.get(file)
|
|
143
176
|
|
|
@@ -146,6 +179,8 @@ export class DropareaPreview extends Component {
|
|
|
146
179
|
return url
|
|
147
180
|
}
|
|
148
181
|
|
|
182
|
+
/** @param {File} file
|
|
183
|
+
* @returns {void} */
|
|
149
184
|
revokeFile (file) {
|
|
150
185
|
const url = this._objectUrls.get(file)
|
|
151
186
|
if (!url) return
|
|
@@ -154,6 +189,7 @@ export class DropareaPreview extends Component {
|
|
|
154
189
|
URL.revokeObjectURL?.(url)
|
|
155
190
|
}
|
|
156
191
|
|
|
192
|
+
/** @returns {void} */
|
|
157
193
|
revokeAllFiles () {
|
|
158
194
|
for (const url of this._objectUrls.values()) {
|
|
159
195
|
URL.revokeObjectURL?.(url)
|
|
@@ -161,20 +197,25 @@ export class DropareaPreview extends Component {
|
|
|
161
197
|
this._objectUrls.clear()
|
|
162
198
|
}
|
|
163
199
|
|
|
200
|
+
/** @returns {void} */
|
|
164
201
|
clearPreview () {
|
|
165
202
|
const previewZone = this.select('[data-preview-list]')
|
|
166
203
|
previewZone && (previewZone.textContent = '')
|
|
167
204
|
this.toggleVisibility()
|
|
168
205
|
}
|
|
169
206
|
|
|
207
|
+
/** @param {File} file
|
|
208
|
+
* @param {MouseEvent} event
|
|
209
|
+
* @returns {void} */
|
|
170
210
|
removeFile (file, event) {
|
|
171
|
-
const element = event.target
|
|
211
|
+
const element = /** @type {HTMLElement|null} */ (event.target)
|
|
212
|
+
if (!element) return
|
|
172
213
|
const fileIndex = this.droparea.fileList.indexOf(file)
|
|
173
214
|
if (fileIndex < 0) return
|
|
174
215
|
|
|
175
216
|
this.revokeFile(file)
|
|
176
217
|
this.droparea.fileList.splice(fileIndex, 1)
|
|
177
|
-
element.
|
|
218
|
+
element.parentElement?.remove()
|
|
178
219
|
this.selectAll('li').forEach((item, index) =>
|
|
179
220
|
item.setAttribute('index', String(index))
|
|
180
221
|
)
|
|
@@ -182,14 +223,18 @@ export class DropareaPreview extends Component {
|
|
|
182
223
|
this.dispatchAlterEvent()
|
|
183
224
|
}
|
|
184
225
|
|
|
226
|
+
/** @param {File} file
|
|
227
|
+
* @returns {number} */
|
|
185
228
|
fileIndex (file) {
|
|
186
229
|
return this.droparea.fileList.indexOf(file)
|
|
187
230
|
}
|
|
188
231
|
|
|
232
|
+
/** @returns {Droparea} */
|
|
189
233
|
get droparea () {
|
|
190
234
|
return /** @type {Droparea} */ (this.closest('ark-droparea'))
|
|
191
235
|
}
|
|
192
236
|
|
|
237
|
+
/** @returns {Array<{name:string,type:string,size:number,url:string}>} */
|
|
193
238
|
get mediaList () {
|
|
194
239
|
const mediaList = []
|
|
195
240
|
this.droparea.fileList.map((file) => {
|
|
@@ -287,3 +287,85 @@ it('does nothing when revoking a file without an object URL', () => {
|
|
|
287
287
|
preview.revokeFile(file)
|
|
288
288
|
})
|
|
289
289
|
})
|
|
290
|
+
|
|
291
|
+
it('renders a text preview in single mode and clears previous preview items', () => {
|
|
292
|
+
setup()
|
|
293
|
+
container.innerHTML = /* html */ `
|
|
294
|
+
<ark-droparea single></ark-droparea>
|
|
295
|
+
`
|
|
296
|
+
const droparea = container.querySelector('ark-droparea')
|
|
297
|
+
const dropZone = droparea.querySelector('.ark-droparea__form')
|
|
298
|
+
const firstFile = new File(['first'], 'first.txt', { type: 'text/plain' })
|
|
299
|
+
const secondFile = new File(['second'], 'second.txt', { type: 'text/plain' })
|
|
300
|
+
|
|
301
|
+
dropZone.dispatchEvent(createBubbledEvent('drop', {
|
|
302
|
+
dataTransfer: { files: [firstFile] }
|
|
303
|
+
}))
|
|
304
|
+
|
|
305
|
+
const firstPreviewItem = droparea.preview.querySelector('li')
|
|
306
|
+
assert.deepStrictEqual(firstPreviewItem.querySelector('p').textContent, 'first.txt')
|
|
307
|
+
assert.ok(firstPreviewItem.getAttribute('data').includes('mock://data/url/'))
|
|
308
|
+
assert.strictEqual(firstPreviewItem.getAttribute('index'), null)
|
|
309
|
+
|
|
310
|
+
dropZone.dispatchEvent(createBubbledEvent('drop', {
|
|
311
|
+
dataTransfer: { files: [secondFile] }
|
|
312
|
+
}))
|
|
313
|
+
|
|
314
|
+
const frames = droparea.preview.querySelectorAll('li')
|
|
315
|
+
assert.deepStrictEqual(frames.length, 1)
|
|
316
|
+
assert.deepStrictEqual(frames[0].querySelector('p').textContent, 'second.txt')
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
it('clearPreview tolerates missing preview list nodes', () => {
|
|
320
|
+
setup()
|
|
321
|
+
const preview = document.createElement('ark-droparea-preview')
|
|
322
|
+
const originalSelect = preview.select
|
|
323
|
+
preview.select = () => null
|
|
324
|
+
preview.toggleVisibility = () => {}
|
|
325
|
+
|
|
326
|
+
assert.doesNotThrow(() => {
|
|
327
|
+
preview.clearPreview()
|
|
328
|
+
})
|
|
329
|
+
|
|
330
|
+
preview.select = originalSelect
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
it('returns early when handleDrop receives a null target', () => {
|
|
334
|
+
setup()
|
|
335
|
+
const preview = document.createElement('ark-droparea-preview')
|
|
336
|
+
|
|
337
|
+
assert.doesNotThrow(() => {
|
|
338
|
+
preview.handleDrop({ target: null })
|
|
339
|
+
})
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
it('returns early when removeFile receives a null target', () => {
|
|
343
|
+
setup()
|
|
344
|
+
const preview = document.createElement('ark-droparea-preview')
|
|
345
|
+
const file = new File(['image'], 'Nully.png', { type: 'image/png' })
|
|
346
|
+
|
|
347
|
+
assert.doesNotThrow(() => {
|
|
348
|
+
preview.removeFile(file, { target: null })
|
|
349
|
+
})
|
|
350
|
+
})
|
|
351
|
+
|
|
352
|
+
it('revokeFile and revokeAllFiles tolerate missing revokeObjectURL', () => {
|
|
353
|
+
setup()
|
|
354
|
+
const preview = document.createElement('ark-droparea-preview')
|
|
355
|
+
const file = new File(['one'], 'one.txt', { type: 'text/plain' })
|
|
356
|
+
const secondFile = new File(['two'], 'two.txt', { type: 'text/plain' })
|
|
357
|
+
preview._objectUrls.set(file, 'mock://data/url/a')
|
|
358
|
+
preview._objectUrls.set(secondFile, 'mock://data/url/b')
|
|
359
|
+
|
|
360
|
+
const originalRevoke = global.URL.revokeObjectURL
|
|
361
|
+
global.URL.revokeObjectURL = undefined
|
|
362
|
+
|
|
363
|
+
try {
|
|
364
|
+
assert.doesNotThrow(() => {
|
|
365
|
+
preview.revokeFile(file)
|
|
366
|
+
preview.revokeAllFiles()
|
|
367
|
+
})
|
|
368
|
+
} finally {
|
|
369
|
+
global.URL.revokeObjectURL = originalRevoke
|
|
370
|
+
}
|
|
371
|
+
})
|
|
@@ -5,6 +5,11 @@ import './droparea-preview.js'
|
|
|
5
5
|
/** @import {DropareaPreview} from './droparea-preview.js' */
|
|
6
6
|
|
|
7
7
|
const tag = 'ark-droparea'
|
|
8
|
+
/**
|
|
9
|
+
* Drag-and-drop and file input area.
|
|
10
|
+
* Emits:
|
|
11
|
+
* - `alter` with current media list details.
|
|
12
|
+
*/
|
|
8
13
|
|
|
9
14
|
export class Droparea extends Component {
|
|
10
15
|
constructor () {
|
|
@@ -13,6 +18,8 @@ export class Droparea extends Component {
|
|
|
13
18
|
this._onOpenInput = this.openInput.bind(this)
|
|
14
19
|
}
|
|
15
20
|
|
|
21
|
+
/** @param {object} context
|
|
22
|
+
* @returns {this} */
|
|
16
23
|
init (context = {}) {
|
|
17
24
|
this.fileList = []
|
|
18
25
|
this.contextFiles = context.contextFiles || this.contextFiles || []
|
|
@@ -22,6 +29,7 @@ export class Droparea extends Component {
|
|
|
22
29
|
return super.init()
|
|
23
30
|
}
|
|
24
31
|
|
|
32
|
+
/** @returns {this} */
|
|
25
33
|
render () {
|
|
26
34
|
this._grabSlots()
|
|
27
35
|
this.content = /* html */ `
|
|
@@ -43,10 +51,12 @@ export class Droparea extends Component {
|
|
|
43
51
|
return super.render()
|
|
44
52
|
}
|
|
45
53
|
|
|
54
|
+
/** @returns {string[]} */
|
|
46
55
|
reflectedProperties () {
|
|
47
56
|
return ['size', 'accept', 'maxSize', 'title']
|
|
48
57
|
}
|
|
49
58
|
|
|
59
|
+
/** @returns {Promise<void>} */
|
|
50
60
|
async load () {
|
|
51
61
|
this._detachListeners()
|
|
52
62
|
|
|
@@ -72,11 +82,13 @@ export class Droparea extends Component {
|
|
|
72
82
|
}
|
|
73
83
|
}
|
|
74
84
|
|
|
85
|
+
/** @returns {void} */
|
|
75
86
|
disconnectedCallback () {
|
|
76
87
|
this._detachListeners()
|
|
77
88
|
super.disconnectedCallback()
|
|
78
89
|
}
|
|
79
90
|
|
|
91
|
+
/** @returns {void} */
|
|
80
92
|
_detachListeners () {
|
|
81
93
|
if (this.dragDropEvents) {
|
|
82
94
|
this.dragDropEvents.forEach((eventName) => {
|
|
@@ -101,25 +113,35 @@ export class Droparea extends Component {
|
|
|
101
113
|
this.openButton?.removeEventListener('click', this._onOpenInput)
|
|
102
114
|
}
|
|
103
115
|
|
|
116
|
+
/** @param {Event} event
|
|
117
|
+
* @returns {void} */
|
|
104
118
|
openInput (event) {
|
|
105
119
|
event.stopPropagation()
|
|
106
120
|
const input = this.select('[data-input]')
|
|
107
121
|
input.click()
|
|
108
122
|
}
|
|
109
123
|
|
|
124
|
+
/** @param {Event} event
|
|
125
|
+
* @returns {void} */
|
|
110
126
|
preventDefaults (event) {
|
|
111
127
|
event.preventDefault()
|
|
112
128
|
event.stopPropagation()
|
|
113
129
|
}
|
|
114
130
|
|
|
131
|
+
/** @param {Event} event
|
|
132
|
+
* @returns {void} */
|
|
115
133
|
highlight (event) {
|
|
116
134
|
this.dropZone.classList.add('highlight')
|
|
117
135
|
}
|
|
118
136
|
|
|
137
|
+
/** @param {Event} event
|
|
138
|
+
* @returns {void} */
|
|
119
139
|
unhighlight (event) {
|
|
120
140
|
this.dropZone.classList.remove('highlight')
|
|
121
141
|
}
|
|
122
142
|
|
|
143
|
+
/** @param {DragEvent} event
|
|
144
|
+
* @returns {void} */
|
|
123
145
|
handleDrop (event) {
|
|
124
146
|
event.stopPropagation()
|
|
125
147
|
const data = event.dataTransfer
|
|
@@ -127,13 +149,17 @@ export class Droparea extends Component {
|
|
|
127
149
|
this.handleFiles(files)
|
|
128
150
|
}
|
|
129
151
|
|
|
152
|
+
/** @param {Event} event
|
|
153
|
+
* @returns {void} */
|
|
130
154
|
onChange (event) {
|
|
131
155
|
event.stopPropagation()
|
|
132
|
-
const input = event.target
|
|
156
|
+
const input = /** @type {HTMLInputElement} */ (event.target)
|
|
133
157
|
const files = input.files
|
|
134
158
|
this.handleFiles(files)
|
|
135
159
|
}
|
|
136
160
|
|
|
161
|
+
/** @param {FileList|File[]} files
|
|
162
|
+
* @returns {void} */
|
|
137
163
|
handleFiles (files) {
|
|
138
164
|
if (this.single) {
|
|
139
165
|
files = [files[0]]
|
|
@@ -163,6 +189,10 @@ export class Droparea extends Component {
|
|
|
163
189
|
this.preview.dispatchAlterEvent()
|
|
164
190
|
}
|
|
165
191
|
|
|
192
|
+
/**
|
|
193
|
+
* @param {File[]|FileList} fileList
|
|
194
|
+
* @returns {boolean}
|
|
195
|
+
*/
|
|
166
196
|
validate (fileList) {
|
|
167
197
|
if (!this.accept || this.accept.length === 0) return true
|
|
168
198
|
const acceptList = this.accept.split(',').map(
|
|
@@ -186,15 +216,20 @@ export class Droparea extends Component {
|
|
|
186
216
|
return true
|
|
187
217
|
}
|
|
188
218
|
|
|
219
|
+
/** @param {File} file
|
|
220
|
+
* @returns {boolean} */
|
|
189
221
|
maxSizeValidate (file) {
|
|
190
222
|
return true
|
|
191
223
|
}
|
|
192
224
|
|
|
225
|
+
/** @returns {void} */
|
|
193
226
|
_grabSlots() {
|
|
194
227
|
const [fileInput] = [this.slots.general].flat()
|
|
195
228
|
this.fileInput = this.fileInput ?? fileInput
|
|
196
229
|
}
|
|
197
230
|
|
|
231
|
+
/** @param {HTMLInputElement|undefined} element
|
|
232
|
+
* @returns {HTMLInputElement} */
|
|
198
233
|
_buildFileInput (element) {
|
|
199
234
|
const input = element ?? document.createElement('input')
|
|
200
235
|
const attributes = [['class', `${tag}__input`],
|
|
@@ -203,14 +238,18 @@ export class Droparea extends Component {
|
|
|
203
238
|
return input
|
|
204
239
|
}
|
|
205
240
|
|
|
241
|
+
/** @returns {HTMLFormElement} */
|
|
206
242
|
get dropZone () {
|
|
207
|
-
return
|
|
243
|
+
return /** @type {HTMLFormElement} */ (
|
|
244
|
+
this.querySelector('.ark-droparea__form'))
|
|
208
245
|
}
|
|
209
246
|
|
|
247
|
+
/** @returns {DropareaPreview} */
|
|
210
248
|
get preview () {
|
|
211
249
|
return /** @type {DropareaPreview} */ (this.select('ark-droparea-preview'))
|
|
212
250
|
}
|
|
213
251
|
|
|
252
|
+
/** @returns {Array<{name:string,type:string,size:number,url:string}>} */
|
|
214
253
|
get mediaList () {
|
|
215
254
|
return this.preview.mediaList
|
|
216
255
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { Component } from "#base/index.js"
|
|
2
2
|
|
|
3
3
|
const tag = 'ark-emit'
|
|
4
|
+
/**
|
|
5
|
+
* Declarative event forwarding component.
|
|
6
|
+
*/
|
|
4
7
|
export class Emit extends Component {
|
|
5
8
|
constructor () {
|
|
6
9
|
super()
|
|
@@ -15,6 +18,8 @@ export class Emit extends Component {
|
|
|
15
18
|
return ['receive', 'dispatch', 'bind']
|
|
16
19
|
}
|
|
17
20
|
|
|
21
|
+
/** @param {CustomEvent} event
|
|
22
|
+
* @returns {void} */
|
|
18
23
|
handle (event) {
|
|
19
24
|
const detail = Object.assign({}, event.detail)
|
|
20
25
|
|
|
@@ -27,19 +32,22 @@ export class Emit extends Component {
|
|
|
27
32
|
|
|
28
33
|
Object.assign(detail, data)
|
|
29
34
|
|
|
30
|
-
const value = event.target
|
|
35
|
+
const value = /** @type {HTMLInputElement|null} */ (event.target)?.value
|
|
31
36
|
if (value) Object.assign(detail, { value })
|
|
32
37
|
|
|
33
38
|
const type = this.dispatch || 'emit'
|
|
34
39
|
this.emit(type, detail)
|
|
35
40
|
}
|
|
36
41
|
|
|
42
|
+
/** @param {string} selector
|
|
43
|
+
* @returns {Element|null} */
|
|
37
44
|
_pop (selector) {
|
|
38
45
|
const element = this.querySelector(selector)
|
|
39
46
|
element?.remove()
|
|
40
47
|
return element
|
|
41
48
|
}
|
|
42
49
|
|
|
50
|
+
/** @returns {any|null} */
|
|
43
51
|
_resolveBoundData () {
|
|
44
52
|
const element = this.closest(this.bind)
|
|
45
53
|
if (!element) return null
|
|
@@ -52,6 +60,8 @@ export class Emit extends Component {
|
|
|
52
60
|
}
|
|
53
61
|
}
|
|
54
62
|
|
|
63
|
+
/** @param {string} source
|
|
64
|
+
* @returns {object|null} */
|
|
55
65
|
_parseJSON (source) {
|
|
56
66
|
try {
|
|
57
67
|
return JSON.parse(source)
|
package/lib/components/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** Aggregated component exports. */
|
|
1
2
|
export * from './audio/index.js'
|
|
2
3
|
export * from './camera/index.js'
|
|
3
4
|
export * from './capture/index.js'
|
|
@@ -6,4 +7,4 @@ export * from './list/index.js'
|
|
|
6
7
|
export * from './paginator/index.js'
|
|
7
8
|
export * from './spinner/index.js'
|
|
8
9
|
export * from './splitview/index.js'
|
|
9
|
-
export * from './translate/index.js'
|
|
10
|
+
export * from './translate/index.js'
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { Component } from "#base/index.js"
|
|
2
2
|
|
|
3
3
|
const tag = 'ark-list-item'
|
|
4
|
+
/**
|
|
5
|
+
* Single list item for list component.
|
|
6
|
+
*/
|
|
4
7
|
export class ListItem extends Component {
|
|
8
|
+
/** @param {object} context
|
|
9
|
+
* @returns {this} */
|
|
5
10
|
init (context = {}) {
|
|
6
11
|
this.index = context.index
|
|
7
12
|
this.data = context.data || null
|
|
@@ -14,6 +19,7 @@ export class ListItem extends Component {
|
|
|
14
19
|
return ['index']
|
|
15
20
|
}
|
|
16
21
|
|
|
22
|
+
/** @returns {this} */
|
|
17
23
|
render () {
|
|
18
24
|
this.content = this.template(this.data)
|
|
19
25
|
return super.render()
|