From 4b8d9be10e4517114c0c216fa24aaaa310503d4a Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 29 Oct 2019 12:52:56 +0100 Subject: save edited changes --- build/server.moon | 86 ++++++++++++++++++++++++++------------------- mmm/mmmfs/fileder.moon | 15 ++++++++ mmm/mmmfs/layout.moon | 12 +++---- mmm/mmmfs/plugins/code.moon | 41 ++++++++++++++++++--- mmm/mmmfs/stores/init.moon | 15 ++++++++ mmm/mmmfs/stores/web.moon | 28 +++++++++------ scss/codemirror.scss | 1 + 7 files changed, 138 insertions(+), 60 deletions(-) diff --git a/build/server.moon b/build/server.moon index 906f89a..68cf4db 100644 --- a/build/server.moon +++ b/build/server.moon @@ -38,7 +38,43 @@ class Server print "[#{@@__name}]", "running at #{ip}:#{port}" assert @server\loop! - handle: (method, path, facet) => + handle_interactive: (fileder, facet) => + root = Fileder @store + browser = Browser root, fileder.path, facet.name + + deps = [[ + + + + + + + + + + + ]] + + render browser\todom!, fileder, noview: true, scripts: deps .. " + " + + handle: (method, path, facet, value) => fileder = Fileder @store, path if not fileder @@ -57,41 +93,7 @@ class Server convert 'table', facet.type, index, fileder, facet.name else if facet.type == 'text/html+interactive' - root = Fileder @store - browser = Browser root, path, facet.name - - deps = [[ - - - - - - - - - - - - ]] - - render browser\todom!, fileder, noview: true, scripts: deps .. " - " + @handle_interactive fileder, facet else if not fileder\has_facet facet.name 404, "facet '#{facet.name}' not found in fileder '#{path}'" else @@ -101,6 +103,15 @@ class Server 200, val else 406, "cant convert facet '#{facet.name}' to '#{facet.type}'" + when 'POST' + @store\create_facet path, facet.name, facet.type, value + 200, 'ok' + when 'PUT' + @store\update_facet path, facet.name, facet.type, value + 200, 'ok' + when 'DELETE' + @store\remove_facet path, facet.name, facet.type + 200, 'ok' else 501, "not implemented" @@ -119,7 +130,8 @@ class Server type = type\match '%s*(.*)' facet = Key facet, type - ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet + value = stream\get_body_as_string! + ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet, value if not ok warn "Error handling request (#{method} #{path} #{facet}):\n#{status}" body = "Internal Server Error:\n#{status}" diff --git a/mmm/mmmfs/fileder.moon b/mmm/mmmfs/fileder.moon index f545bd8..5b65496 100644 --- a/mmm/mmmfs/fileder.moon +++ b/mmm/mmmfs/fileder.moon @@ -278,6 +278,21 @@ class Fileder assert value, "#{@} doesn't have value for '#{want}'" value, key + -- set a facet value and propagate to the store + set: (key, key2, value) => + if value + key = Key key, key2 + else + key = Key key + value = key2 + + if @facet_keys[key] + @store\update_facet @path, key.name, key.type, value + else + @store\create_facet @path, key.name, key.type, value + + @facets[key] = value + __tostring: => "Fileder:#{@path}" { diff --git a/mmm/mmmfs/layout.moon b/mmm/mmmfs/layout.moon index 05bc38b..7fd3091 100644 --- a/mmm/mmmfs/layout.moon +++ b/mmm/mmmfs/layout.moon @@ -130,8 +130,7 @@ render = (content, fileder, opts={}) -> - - ]] + ]] buf ..= " #{get_meta fileder} @@ -140,19 +139,16 @@ render = (content, fileder, opts={}) -> #{content} - #{footer} - " + #{footer}" buf ..= [[ - - ]] + ]] buf ..= opts.scripts buf ..= " - - " +" buf diff --git a/mmm/mmmfs/plugins/code.moon b/mmm/mmmfs/plugins/code.moon index c3c6c50..bd28c79 100644 --- a/mmm/mmmfs/plugins/code.moon +++ b/mmm/mmmfs/plugins/code.moon @@ -1,4 +1,4 @@ -import div from require 'mmm.dom' +import div, button from require 'mmm.dom' import languages from require 'mmm.highlighting' class Editor @@ -10,7 +10,27 @@ class Editor obj[k] = v new: (value, mode, @fileder, @key) => - @node = div class: 'editor' + @node = div { + class: 'editor' + style: + display: 'flex' + 'flex-direction': 'column' + 'justify-content': 'space-around' + + div { + style: + display: 'flex' + flex: '0' + 'justify-content': 'flex-end' + 'border-bottom': '2px solid var(--gray-dark)' + 'padding-bottom': '0.5em' + 'margin': '-0.5em 0 0.5em' + + with @saveBtn = button 'save changes' + .disabled = true + .onclick = (_, e) -> @save e + } + } @cm = window\CodeMirror @node, o { :value :mode @@ -20,23 +40,36 @@ class Editor theme: 'hybrid' } + @lastSave = @cm\getDoc!\changeGeneration true + @cm\on 'changes', (_, mirr) -> + doc = @cm\getDoc! + @saveBtn.disabled = doc\isClean @lastSave + window\clearTimeout @timeout if @timeout @timeout = window\setTimeout (-> @change!), 300 change: => @timeout = nil doc = @cm\getDoc! - if @lastState and doc\isClean @lastState + + if @lastPreview and doc\isClean @lastPreview -- no changes since last event return - @lastState = doc\changeGeneration true + @lastPreview = doc\changeGeneration! value = doc\getValue! @fileder.facets[@key] = value BROWSER\refresh! + save: (e) => + e\preventDefault! + + doc = @cm\getDoc! + @fileder\set @key, doc\getValue! + @lastSave = doc\changeGeneration true + -- syntax-highlighted code { converts: { diff --git a/mmm/mmmfs/stores/init.moon b/mmm/mmmfs/stores/init.moon index bbca33f..905188f 100644 --- a/mmm/mmmfs/stores/init.moon +++ b/mmm/mmmfs/stores/init.moon @@ -26,6 +26,21 @@ class Store children: [@get_index child, depth - 1 for child in @list_fileders_in path] } + create_fileder: => error "not implemented" + remove_fileder: => error "not implemented" + rename_fileder: => error "not implemented" + move_fileder: => error "not implemented" + + list_facets: => error "not implemented" + create_facet: => error "not implemented" + remove_facet: => error "not implemented" + load_facet: => error "not implemented" + rename_facet: (path, name, type, next_name) => + @log "renaming facet #{path} | #{name}: #{type} -> #{next_name}" + blob = assert "no such facet", @load_facet path, name, type + @create_facet path, next_name, type, blob + @remove_facet path, name, type update_facet: => error "not implemented" + close: => log: (...) => diff --git a/mmm/mmmfs/stores/web.moon b/mmm/mmmfs/stores/web.moon index ea17b5a..ed3f6d7 100644 --- a/mmm/mmmfs/stores/web.moon +++ b/mmm/mmmfs/stores/web.moon @@ -10,10 +10,14 @@ dir_base = (path) -> dir, base -fetch = (url) -> +req = (method, url, content=js.null) -> + if not url + url = method + method = 'GET' + request = js.new XMLHttpRequest - request\open 'GET', url, false - request\send js.null + request\open method, url, false + request\send content assert request.status == 200, "unexpected status code: #{request.status}" request.responseText @@ -45,13 +49,13 @@ class WebStore extends Store get_index: (path='', depth=1) => pseudo = if depth > 1 or depth < 0 '?tree' else '?index' - json = fetch "#{@host .. path}/#{pseudo}: text/json" + json = req "#{@host .. path}/#{pseudo}: text/json" parse_json json -- fileders list_fileders_in: (path='') => coroutine.wrap -> - json = fetch "#{@host .. path}/?index: text/json" + json = req "#{@host .. path}/?index: text/json" index = parse_json json for child in js.of index.children coroutine.yield child.path @@ -75,30 +79,32 @@ class WebStore extends Store -- facets list_facets: (path) => coroutine.wrap -> - json = fetch "#{@host .. path}/?index: text/json" + json = req "#{@host .. path}/?index: text/json" index = JSON\parse json for facet in js.of index.facets coroutine.yield facet.name, facet.type load_facet: (path, name, type) => @log "loading facet #{path} #{name}: #{type}" - fetch "#{@host .. path}/#{name}: #{type}" + req "#{@host .. path}/#{name}: #{type}" create_facet: (path, name, type, blob) => @log "creating facet #{path} | #{name}: #{type}" - error "not implemented" + req 'POST', "#{@host .. path}/#{name}: #{type}", blob remove_facet: (path, name, type) => @log "removing facet #{path} | #{name}: #{type}" - error "not implemented" + req 'DELETE', "#{@host .. path}/#{name}: #{type}" rename_facet: (path, name, type, next_name) => @log "renaming facet #{path} | #{name}: #{type} -> #{next_name}" - error "not implemented" + blob = assert "no such facet", @load_facet path, name, type + @create_facet path, next_name, type, blob + @remove_facet path, name, type update_facet: (path, name, type, blob) => @log "updating facet #{path} | #{name}: #{type}" - error "not implemented" + req 'PUT', "#{@host .. path}/#{name}: #{type}", blob { :WebStore diff --git a/scss/codemirror.scss b/scss/codemirror.scss index 1967f8c..fd50b00 100644 --- a/scss/codemirror.scss +++ b/scss/codemirror.scss @@ -8,6 +8,7 @@ background: #1d1f21; height: auto; + flex: 1; /*selection color*/ .CodeMirror-selected, -- cgit v1.2.3