aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2019-10-31 17:26:31 +0000
committers-ol <s-ol@users.noreply.github.com>2019-10-31 17:26:31 +0000
commitff9ee8e99cd5f5c420ba0501c335ac18f1b10769 (patch)
treecaf0dfede11d7ea800bd1deb77fc2f3b642a9668
parentadd DEBUG pseudo-type for debugging conversion (diff)
downloadmmm-ff9ee8e99cd5f5c420ba0501c335ac18f1b10769.tar.gz
mmm-ff9ee8e99cd5f5c420ba0501c335ac18f1b10769.zip
browsing, adding, removing fileders in inspector
-rw-r--r--build/server.moon39
-rw-r--r--mmm/mmmfs/browser.moon48
-rw-r--r--mmm/mmmfs/fileder.moon12
-rw-r--r--mmm/mmmfs/stores/fs.moon2
-rw-r--r--mmm/mmmfs/stores/web.moon5
-rw-r--r--scss/_browser.scss8
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 {