diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2019-10-31 17:26:31 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2019-10-31 17:26:31 +0000 |
| commit | ff9ee8e99cd5f5c420ba0501c335ac18f1b10769 (patch) | |
| tree | caf0dfede11d7ea800bd1deb77fc2f3b642a9668 | |
| parent | add DEBUG pseudo-type for debugging conversion (diff) | |
| download | mmm-ff9ee8e99cd5f5c420ba0501c335ac18f1b10769.tar.gz mmm-ff9ee8e99cd5f5c420ba0501c335ac18f1b10769.zip | |
browsing, adding, removing fileders in inspector
| -rw-r--r-- | build/server.moon | 39 | ||||
| -rw-r--r-- | mmm/mmmfs/browser.moon | 48 | ||||
| -rw-r--r-- | mmm/mmmfs/fileder.moon | 12 | ||||
| -rw-r--r-- | mmm/mmmfs/stores/fs.moon | 2 | ||||
| -rw-r--r-- | mmm/mmmfs/stores/web.moon | 5 | ||||
| -rw-r--r-- | scss/_browser.scss | 8 |
6 files changed, 92 insertions, 22 deletions
diff --git a/build/server.moon b/build/server.moon index 99076bf..395b903 100644 --- a/build/server.moon +++ b/build/server.moon @@ -94,17 +94,16 @@ class Server convert 'text/mermaid-graph', 'text/html', debugger\render!, fileder, facet.name handle: (method, path, facet, value) => - fileder = Fileder @store, path - - if not fileder - -- fileder not found - 404, "fileder '#{path}' not found" - if not @flags.rw and method != 'GET' and method != 'HEAD' return 403, 'editing not allowed' switch method when 'GET', 'HEAD' + fileder = Fileder @store, path + if not fileder + -- fileder not found + return 404, "fileder '#{path}' not found" + val = switch facet.name when '?index', '?tree' -- serve fileder index @@ -129,13 +128,22 @@ class Server else 406, "cant convert facet '#{facet.name}' to '#{facet.type}'" when 'POST' - @store\create_facet path, facet.name, facet.type, value - 200, 'ok' + if facet + @store\create_facet path, facet.name, facet.type, value + 200, 'ok' + else + 200, @store\create_fileder dir_base path when 'PUT' - @store\update_facet path, facet.name, facet.type, value - 200, 'ok' + if facet + @store\update_facet path, facet.name, facet.type, value + 200, 'ok' + else + 501, "not implemented" when 'DELETE' - @store\remove_facet path, facet.name, facet.type + if facet + @store\remove_facet path, facet.name, facet.type + else + @store\remove_fileder path 200, 'ok' else 501, "not implemented" @@ -151,9 +159,12 @@ class Server path_facet or= path path, facet = path_facet\match '(.*)/([^/]*)' - type or= 'text/html+interactive' - type = type\match '%s*(.*)' - facet = Key facet, type + facet = if facet == '' and method ~= 'GET' and method ~= 'HEAD' + nil + else + type or= 'text/html+interactive' + type = type\match '%s*(.*)' + Key facet, type value = stream\get_body_as_string! ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet, value diff --git a/mmm/mmmfs/browser.moon b/mmm/mmmfs/browser.moon index 7be702f..6020eb7 100644 --- a/mmm/mmmfs/browser.moon +++ b/mmm/mmmfs/browser.moon @@ -2,7 +2,8 @@ require = relative ..., 1 import Key from require '.fileder' import get_conversions, apply_conversions from require '.conversion' import ReactiveVar, get_or_create, text, elements, tohtml from require 'mmm.component' -import pre, div, nav, span, button, a, code, option from elements +import pre, div, nav, span, button, a, code, select, option from elements +import link_to from (require '.util') elements import languages from require 'mmm.highlighting' keep = (var) -> @@ -166,7 +167,10 @@ class Browser -- rerender main content refresh: (facet=@facet\get!) => - @content\set @get_content facet + if facet == true -- deep refresh + @fileder\transform (i) -> i + else + @content\set @get_content facet -- render #browser-content get_content: (prop, err=@error, convert=default_convert) => @@ -220,8 +224,7 @@ class Browser return if facet == '' @inspect_prop\set Key facet - with elements.select :onchange - \append option '(none)', value: '', disabled: true, selected: not value + with select :onchange \append option '(none)', value: '', disabled: true, selected: not value if fileder for value in pairs fileder.facet_keys \append option value, :value, selected: value == current @@ -230,7 +233,7 @@ class Browser if window\confirm "continuing will permanently remove the facet '#{@inspect_prop\get!}'." fileder = @fileder\get! fileder\set @inspect_prop\get!, nil - @fileder\set fileder -- trigger re-selection of active facet & inspector + @refresh true button 'add', class: 'tight', onclick: (_, e) -> facet = window\prompt "please enter the facet string ('name: type' or 'type'):", 'text/markdown' @@ -255,6 +258,41 @@ class Browser assert conversions, "cannot cast '#{key.type}'" apply_conversions conversions, value, @, prop + \append nav { + span 'children' + button 'add', onclick: (_, e) -> + name = window\prompt "please enter the name of the child fileder:", 'unnamed_fileder' + return if not name or name == '' or name == js.null + child = @fileder\get!\add_child name + @refresh true + } + \append @fileder\map (fileder) -> + with div class: 'children' + num = #fileder.children + for i, child in ipairs fileder.children + name = child\gett 'name: alpha' + \append div { + style: + display: 'flex' + 'justify-content': 'space-between' + + span '- ', (link_to child, code name), style: flex: 1 + + button '↑', disabled: i == 1, onclick: (_, e) -> + fileder\reorder_child name, i - 1 + @refresh true + + button '↓', disabled: i == num, onclick: (_, e) -> + fileder\reorder_child name, i + 1 + @refresh true + + button 'rm', onclick: (_, e) -> + if window\confirm "continuing will permanently remove all content in '#{child.path}'." + fileder\remove_child i + @refresh true + } + + default_convert = (key) => @get key.name, 'mmm/dom' navigate: (new) => diff --git a/mmm/mmmfs/fileder.moon b/mmm/mmmfs/fileder.moon index dec0350..b42c6dd 100644 --- a/mmm/mmmfs/fileder.moon +++ b/mmm/mmmfs/fileder.moon @@ -306,6 +306,18 @@ class Fileder @facets[key] = value + -- add a child fileder with given name + add_child: (name) => + new_path = @store\create_fileder @path, name + with new_child = Fileder @store, new_path + table.insert @children, new_child + + -- remove a child with given index + remove_child: (i) => + removed = table.remove @children, i + assert removed, "no such child fileder" + @store\remove_fileder removed.path + __tostring: => "Fileder:#{@path}" { diff --git a/mmm/mmmfs/stores/fs.moon b/mmm/mmmfs/stores/fs.moon index 1e09d1d..d4d5bd4 100644 --- a/mmm/mmmfs/stores/fs.moon +++ b/mmm/mmmfs/stores/fs.moon @@ -50,8 +50,8 @@ class FSStore extends Store coroutine.yield path create_fileder: (parent, name) => - @log "creating fileder #{path}" path = "#{parent}/#{name}" + @log "creating fileder #{path}" assert lfs.mkdir @root .. path path diff --git a/mmm/mmmfs/stores/web.moon b/mmm/mmmfs/stores/web.moon index ed3f6d7..b498d79 100644 --- a/mmm/mmmfs/stores/web.moon +++ b/mmm/mmmfs/stores/web.moon @@ -61,12 +61,13 @@ class WebStore extends Store coroutine.yield child.path create_fileder: (parent, name) => + path = "#{parent}/#{name}" @log "creating fileder #{path}" - error "not implemented" + req 'POST', "#{@host .. path}/" remove_fileder: (path) => @log "removing fileder #{path}" - error "not implemented" + req 'DELETE', "#{@host .. path}/" rename_fileder: (path, next_name) => @log "renaming fileder #{path} -> '#{next_name}'" diff --git a/scss/_browser.scss b/scss/_browser.scss index 47be262..f39e1df 100644 --- a/scss/_browser.scss +++ b/scss/_browser.scss @@ -42,6 +42,14 @@ flex: 1; } } + + .children { + margin: 0; + padding: 1em; + + align-self: stretch; + background: $gray-darker; + } } nav { |
