git.s-ol.nu mmm / ff9ee8e
browsing, adding, removing fileders in inspector s-ol 3 years ago
6 changed file(s) with 92 addition(s) and 22 deletion(s). Raw diff Collapse all Expand all
9393 convert 'text/mermaid-graph', 'text/html', debugger\render!, fileder, facet.name
9494
9595 handle: (method, path, facet, value) =>
96 fileder = Fileder @store, path
97
98 if not fileder
99 -- fileder not found
100 404, "fileder '#{path}' not found"
101
10296 if not @flags.rw and method != 'GET' and method != 'HEAD'
10397 return 403, 'editing not allowed'
10498
10599 switch method
106100 when 'GET', 'HEAD'
101 fileder = Fileder @store, path
102 if not fileder
103 -- fileder not found
104 return 404, "fileder '#{path}' not found"
105
107106 val = switch facet.name
108107 when '?index', '?tree'
109108 -- serve fileder index
128127 else
129128 406, "cant convert facet '#{facet.name}' to '#{facet.type}'"
130129 when 'POST'
131 @store\create_facet path, facet.name, facet.type, value
132 200, 'ok'
130 if facet
131 @store\create_facet path, facet.name, facet.type, value
132 200, 'ok'
133 else
134 200, @store\create_fileder dir_base path
133135 when 'PUT'
134 @store\update_facet path, facet.name, facet.type, value
135 200, 'ok'
136 if facet
137 @store\update_facet path, facet.name, facet.type, value
138 200, 'ok'
139 else
140 501, "not implemented"
136141 when 'DELETE'
137 @store\remove_facet path, facet.name, facet.type
142 if facet
143 @store\remove_facet path, facet.name, facet.type
144 else
145 @store\remove_fileder path
138146 200, 'ok'
139147 else
140148 501, "not implemented"
150158 path_facet or= path
151159 path, facet = path_facet\match '(.*)/([^/]*)'
152160
153 type or= 'text/html+interactive'
154 type = type\match '%s*(.*)'
155 facet = Key facet, type
161 facet = if facet == '' and method ~= 'GET' and method ~= 'HEAD'
162 nil
163 else
164 type or= 'text/html+interactive'
165 type = type\match '%s*(.*)'
166 Key facet, type
156167
157168 value = stream\get_body_as_string!
158169 ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet, value
11 import Key from require '.fileder'
22 import get_conversions, apply_conversions from require '.conversion'
33 import ReactiveVar, get_or_create, text, elements, tohtml from require 'mmm.component'
4 import pre, div, nav, span, button, a, code, option from elements
4 import pre, div, nav, span, button, a, code, select, option from elements
5 import link_to from (require '.util') elements
56 import languages from require 'mmm.highlighting'
67
78 keep = (var) ->
165166
166167 -- rerender main content
167168 refresh: (facet=@facet\get!) =>
168 @content\set @get_content facet
169 if facet == true -- deep refresh
170 @fileder\transform (i) -> i
171 else
172 @content\set @get_content facet
169173
170174 -- render #browser-content
171175 get_content: (prop, err=@error, convert=default_convert) =>
219223 return if facet == ''
220224 @inspect_prop\set Key facet
221225
222 with elements.select :onchange
223 \append option '(none)', value: '', disabled: true, selected: not value
226 with select :onchange \append option '(none)', value: '', disabled: true, selected: not value
224227 if fileder
225228 for value in pairs fileder.facet_keys
226229 \append option value, :value, selected: value == current
229232 if window\confirm "continuing will permanently remove the facet '#{@inspect_prop\get!}'."
230233 fileder = @fileder\get!
231234 fileder\set @inspect_prop\get!, nil
232 @fileder\set fileder -- trigger re-selection of active facet & inspector
235 @refresh true
233236
234237 button 'add', class: 'tight', onclick: (_, e) ->
235238 facet = window\prompt "please enter the facet string ('name: type' or 'type'):", 'text/markdown'
254257 assert conversions, "cannot cast '#{key.type}'"
255258 apply_conversions conversions, value, @, prop
256259
260 \append nav {
261 span 'children'
262 button 'add', onclick: (_, e) ->
263 name = window\prompt "please enter the name of the child fileder:", 'unnamed_fileder'
264 return if not name or name == '' or name == js.null
265 child = @fileder\get!\add_child name
266 @refresh true
267 }
268 \append @fileder\map (fileder) ->
269 with div class: 'children'
270 num = #fileder.children
271 for i, child in ipairs fileder.children
272 name = child\gett 'name: alpha'
273 \append div {
274 style:
275 display: 'flex'
276 'justify-content': 'space-between'
277
278 span '- ', (link_to child, code name), style: flex: 1
279
280 button '↑', disabled: i == 1, onclick: (_, e) ->
281 fileder\reorder_child name, i - 1
282 @refresh true
283
284 button '↓', disabled: i == num, onclick: (_, e) ->
285 fileder\reorder_child name, i + 1
286 @refresh true
287
288 button 'rm', onclick: (_, e) ->
289 if window\confirm "continuing will permanently remove all content in '#{child.path}'."
290 fileder\remove_child i
291 @refresh true
292 }
293
294
257295 default_convert = (key) => @get key.name, 'mmm/dom'
258296
259297 navigate: (new) =>
305305
306306 @facets[key] = value
307307
308 -- add a child fileder with given name
309 add_child: (name) =>
310 new_path = @store\create_fileder @path, name
311 with new_child = Fileder @store, new_path
312 table.insert @children, new_child
313
314 -- remove a child with given index
315 remove_child: (i) =>
316 removed = table.remove @children, i
317 assert removed, "no such child fileder"
318 @store\remove_fileder removed.path
319
308320 __tostring: => "Fileder:#{@path}"
309321
310322 {
4949 coroutine.yield path
5050
5151 create_fileder: (parent, name) =>
52 path = "#{parent}/#{name}"
5253 @log "creating fileder #{path}"
53 path = "#{parent}/#{name}"
5454 assert lfs.mkdir @root .. path
5555 path
5656
6060 coroutine.yield child.path
6161
6262 create_fileder: (parent, name) =>
63 path = "#{parent}/#{name}"
6364 @log "creating fileder #{path}"
64 error "not implemented"
65 req 'POST', "#{@host .. path}/"
6566
6667 remove_fileder: (path) =>
6768 @log "removing fileder #{path}"
68 error "not implemented"
69 req 'DELETE', "#{@host .. path}/"
6970
7071 rename_fileder: (path, next_name) =>
7172 @log "renaming fileder #{path} -> '#{next_name}'"
4040 border: 0;
4141 flex: 1;
4242 }
43 }
44
45 .children {
46 margin: 0;
47 padding: 1em;
48
49 align-self: stretch;
50 background: $gray-darker;
4351 }
4452 }
4553