forked from SolidOS/solid-ui
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfolders.js
More file actions
130 lines (120 loc) · 4.01 KB
/
folders.js
File metadata and controls
130 lines (120 loc) · 4.01 KB
1
2
3
4
5
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/** UI To Delete Folder and content
*
*/
/* global confirm */
import * as debug from './debug'
import { icons } from './iconBase'
import { solidLogicSingleton } from 'solid-logic'
import ns from './ns'
import * as rdf from 'rdflib' // pull in first avoid cross-refs
import { style } from './style'
import * as widgets from './widgets'
const UI = { icons, ns, rdf, style, widgets }
export function deleteRecursive (kb, folder) {
return new Promise(function (resolve, _reject) {
kb.fetcher.load(folder).then(function () {
const promises = kb.each(folder, ns.ldp('contains')).map(file => {
if (kb.holds(file, ns.rdf('type'), ns.ldp('BasicContainer'))) {
return deleteRecursive(kb, file)
} else {
debug.log('deleteRecirsive file: ' + file)
if (!confirm(' Really DELETE File ' + file)) {
throw new Error('User aborted delete file')
}
return kb.fetcher.webOperation('DELETE', file.uri)
}
})
debug.log('deleteRecirsive folder: ' + folder)
if (!confirm(' Really DELETE folder ' + folder)) {
throw new Error('User aborted delete file')
}
promises.push(kb.fetcher.webOperation('DELETE', folder.uri))
Promise.all(promises).then(_res => {
resolve()
})
})
})
}
/** Iterate over files depth first
*
* @param folder - The folder whose contents we iterate over
* @param store - The quadstore
* @param action - returns a promise. All the promises must be resolved
*/
function forAllFiles (folder, kb, action) {
return new Promise(function (resolve, _reject) {
kb.fetcher.load(folder).then(function () {
const promises = kb.each(folder, ns.ldp('contains')).map(file => {
if (kb.holds(file, ns.rdf('type'), ns.ldp('BasicContainer'))) {
return forAllFiles(file, kb, action)
} else {
return action(file)
}
})
promises.push(action(folder))
Promise.all(promises).then(_res => {
resolve()
})
})
})
}
/** Delete Folder and contents
*
* @param {NamedNode} folder - The LDP container to be deleted
* @param {DOMElement} containingElement - Where to put the user interface
* @param {IndexedForumula} store - Quadstore (optional)
* @param {Document} dom - The browser 'document' gloabl or equivalent (or iuse global)
* @returns {DOMElement} - The control which has eben inserted in the
*/
/* global document */
export function deleteFolder (folder, store, dom) {
store = store || solidLogicSingleton.store
if (typeof docuent !== 'undefined') {
dom = dom || document
}
const div = dom.createElement('div')
const table = div.appendChild(dom.createElement('table'))
const mainTR = table.appendChild(dom.createElement('tr'))
mainTR.appendChild(dom.createElement('td')) // mainTD
const p = mainTR.appendChild(dom.createElement('p'))
p.textContent = `Are you sure you want to delete the folder ${folder}? This cannot be undone.`
const buttonsTR = table.appendChild(dom.createElement('tr'))
const buttonsTD1 = buttonsTR.appendChild(dom.createElement('td'))
buttonsTR.appendChild(dom.createElement('td')) // buttonsTD2
const buttonsTD3 = buttonsTR.appendChild(dom.createElement('td'))
const cancel = buttonsTD1.appendChild(UI.widgets.cancelButton(dom))
cancel.addEventListener(
'click',
function (_event) {
div.parentNode.removeChild(div)
},
false
)
const doit = buttonsTD3.appendChild(
UI.widgets.button(dom, UI.icons.iconBase + 'noun_925021.svg', 'Yes, delete')
)
doit.addEventListener(
'click',
function (_event) {
deleteThem(folder).then(() => {
debug.log('All deleted.')
})
},
false
)
function deleteThem (folder) {
return forAllFiles(folder, file =>
store.fetcher.webOperation('DELETE', file.uri)
)
}
let count = 0
forAllFiles(folder, store, () => {
count += 1
}) // Count files
.then(() => {
const msg = ' Files to delete: ' + count
debug.log(msg)
p.textContent += msg
})
return div
}