/
panel.js
148 lines (125 loc) · 4.92 KB
/
panel.js
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
var queryString = require('query-string')
var objectKeys = require('object-keys')
var assert = require('nanoassert')
var html = require('choo/html')
var xtend = require('xtend')
var path = require('path')
var xhr = require('xhr')
module.exports = panel
function panel (state, emitter) {
state.panel = {
changes: { },
loading: false
}
emitter.on(state.events.PANEL_UPDATE, onUpdate)
emitter.on(state.events.PANEL_SAVE, onSave)
emitter.on(state.events.PANEL_CANCEL, onCancel)
emitter.on(state.events.PANEL_LOADING, onLoading)
emitter.on(state.events.PANEL_REMOVE, onRemove)
emitter.on(state.events.PANEL_PAGE_ADD, onPageAdd)
emitter.on(state.events.PANEL_FILES_ADD, onFilesAdd)
function onUpdate (data) {
assert.equal(typeof data, 'object', 'enoki: data must be type object')
assert.equal(typeof data.path, 'string', 'enoki: data.path must be type string')
var changes = state.panel.changes[data.path]
state.panel.changes[data.path] = xtend(changes, data.data)
emitter.emit(state.events.RENDER)
}
function onSave (data) {
assert.equal(typeof data, 'object', 'enoki: data must be type object')
assert.equal(typeof data.file, 'string', 'enoki: data.file must be type string')
assert.equal(typeof data.pathPage, 'string', 'enoki: data.pathPage must be type string')
assert.equal(typeof data.page, 'object', 'enoki: data.file must be type object')
emitter.emit(state.events.PANEL_LOADING, { loading: true })
emitter.emit(state.events.RENDER)
xhr.put({
uri: '/api/v1/update',
body: data,
json: true
}, function (err, resp, body) {
emitter.emit(state.events.PANEL_LOADING, { loading: false })
emitter.emit(state.events.RENDER)
if (err) alert(err.message)
})
}
function onCancel (data) {
assert.equal(typeof data, 'object', 'enoki: data must be type object')
assert.equal(typeof data.path, 'string', 'enoki: data.path must be type string')
delete state.panel.changes[data.path]
emitter.emit(state.events.RENDER)
}
function onLoading (data) {
if (data && data.loading !== undefined) {
state.panel.loading = data.loading
} else {
state.panel.loading = false
}
}
function onPageAdd (data) {
assert.equal(typeof data, 'object', 'enoki: data must be type object')
assert.equal(typeof data.pathPage, 'string', 'enoki: data.pathPage must be type string')
assert.equal(typeof data.title, 'string', 'enoki: data.title must be type string')
assert.equal(typeof data.view, 'string', 'enoki: data.view must be type string')
emitter.emit(state.events.PANEL_LOADING, { loading: true })
emitter.emit(state.events.RENDER)
xhr.put({
uri: '/api/v1/add',
body: data,
json: true
}, function (err, resp, body) {
emitter.emit(state.events.PANEL_LOADING, { loading: false })
emitter.emit(state.events.RENDER)
if (err) return alert(err.message)
emitter.emit(state.events.REPLACESTATE, data.pathPage + '?panel=active')
})
}
function onRemove (data) {
assert.equal(typeof data, 'object', 'enoki: data must be type object')
assert.equal(typeof data.pathPage, 'string', 'enoki: data.pathPage must be type string')
if (data.confirm) {
if (!window.confirm(`Are you sure you want to delete ${data.title || data.pathPage}?`)) {
return
}
}
emitter.emit(state.events.PANEL_LOADING, { loading: true })
emitter.emit(state.events.RENDER)
xhr.put({
uri: '/api/v1/remove',
body: data,
json: true
}, function (err, resp, body) {
emitter.emit(state.events.PANEL_LOADING, { loading: false })
emitter.emit(state.events.RENDER)
if (err) return alert(err.message)
if (data.redirect !== false) {
emitter.emit(state.events.REPLACESTATE, path.join(data.pathPage, '../') + '?panel=active')
}
})
}
function onFilesAdd (data) {
assert.equal(typeof data, 'object', 'enoki: data must be type object')
assert.equal(typeof data.pathPage, 'string', 'enoki: data.pathPage must be type string')
assert.equal(typeof data.files, 'object', 'enoki: data.files must be type object')
var send = new XMLHttpRequest()
var formData = new FormData()
// loading
emitter.emit(state.events.PANEL_LOADING, { loading: true })
emitter.emit(state.events.RENDER)
// add the files to the request
objectKeys(data.files).forEach(function (key) {
var file = data.files[key]
formData.append(file.name, file)
})
// sending
send.open('POST', '/api/v1/add-files', true)
send.setRequestHeader('path-page', data.pathPage)
send.send(formData)
// callback
send.addEventListener('load', function (event) {
emitter.emit(state.events.PANEL_LOADING, { loading: false })
emitter.emit(state.events.RENDER)
if (this.status !== 200) return alert('Can not upload')
// emitter.emit(state.events.REPLACESTATE, '?panel=active')
})
}
}