From a43e1a055018aab9590c88c45d8495f99bfb6254 Mon Sep 17 00:00:00 2001
From: ulrich
Date: Mon, 05 Apr 2021 18:39:49 +0000
Subject: [PATCH] Ablageort-Liste
---
www/ui/data/ablageort.css | 11 ++
src/de/uhilger/mediaz/store/Storage.java | 17 ++++
www/ui/js/mustache/mustache.min.js | 1
www/ui/data/menu/hauptmenue.json | 7 +
www/ui/data/ablageort_liste.html | 43 ++++++++++
www/ui/js/app.js | 20 ++++
www/ui/index.html | 2
src/de/uhilger/mediaz/api/StorageHandler.java | 15 +++
src/de/uhilger/mediaz/store/FileStorage.java | 4
www/ui/app.css | 11 ++
www/ui/data/ablageort.html | 17 +--
www/ui/data/tpl/ablageort_liste.tpl | 15 +++
src/de/uhilger/mediaz/entity/Ablageort.java | 18 +++
13 files changed, 158 insertions(+), 23 deletions(-)
diff --git a/src/de/uhilger/mediaz/api/StorageHandler.java b/src/de/uhilger/mediaz/api/StorageHandler.java
index 024900b..8de56fd 100644
--- a/src/de/uhilger/mediaz/api/StorageHandler.java
+++ b/src/de/uhilger/mediaz/api/StorageHandler.java
@@ -18,6 +18,7 @@
package de.uhilger.mediaz.api;
import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import de.uhilger.mediaz.App;
@@ -169,8 +170,7 @@
String type = elems[elems.length - 1];
logger.info(type);
List list = fs.list(type);
- Gson gson = new Gson();
- return gson.toJson(list);
+ return jsonWithEnclosingType(list);
} else {
String type = elems[elems.length - 2];
String elemName = elems[elems.length - 1];
@@ -178,6 +178,17 @@
}
}
+ private String jsonWithEnclosingType(Object o) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("{\"");
+ sb.append(o.getClass().getSimpleName());
+ sb.append("\": ");
+ Gson gson = new Gson();
+ sb.append(gson.toJson(o));
+ sb.append("}");
+ return sb.toString();
+ }
+
private String bodyLesen(HttpExchange e) throws IOException {
InputStream is = e.getRequestBody();
diff --git a/src/de/uhilger/mediaz/entity/Ablageort.java b/src/de/uhilger/mediaz/entity/Ablageort.java
index 0c80592..216618d 100644
--- a/src/de/uhilger/mediaz/entity/Ablageort.java
+++ b/src/de/uhilger/mediaz/entity/Ablageort.java
@@ -1,7 +1,19 @@
/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
+ Mediazentrale - Personal Media Center
+ Copyright (C) 2021 Ulrich Hilger
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.uhilger.mediaz.entity;
diff --git a/src/de/uhilger/mediaz/store/FileStorage.java b/src/de/uhilger/mediaz/store/FileStorage.java
index 90a99a1..afea9b4 100644
--- a/src/de/uhilger/mediaz/store/FileStorage.java
+++ b/src/de/uhilger/mediaz/store/FileStorage.java
@@ -147,6 +147,8 @@
File[] files = dir.listFiles();
List<String> list = new ArrayList();
for(File file : files) {
+ //NamedItem n = new NamedItem();
+ //n.setLabel(file.getName());
list.add(file.getName());
}
return list;
@@ -182,7 +184,5 @@
return false;
}
}
-
-
}
diff --git a/src/de/uhilger/mediaz/store/Storage.java b/src/de/uhilger/mediaz/store/Storage.java
index 1f8d95c..ddbc6e7 100644
--- a/src/de/uhilger/mediaz/store/Storage.java
+++ b/src/de/uhilger/mediaz/store/Storage.java
@@ -66,6 +66,12 @@
*/
public Entity read(String typ, String name);
+ /**
+ * Ein Objekt als JSON lesen
+ * @param typ
+ * @param name
+ * @return das gewuenschte Objekt als JSON
+ */
public String readJson(String typ, String name);
/**
@@ -75,7 +81,18 @@
*/
public List<String> list(String typ);
+ /**
+ * Fuer einen gegebenen Namen den Typ bestimmen
+ * @param name der Name des gewuenschten Typs
+ * @return der Typ zum Namen
+ */
public TypeToken typeFromName(String name);
+ /**
+ * Ein Objekt aus der Ablage loeschen
+ * @param typ Objekttyp
+ * @param name Name des Objekts, das geloscht werden soll
+ * @return true, wenn geloeschn, false wenn nicht
+ */
public boolean delete(String typ, String name);
}
diff --git a/www/ui/app.css b/www/ui/app.css
index d5bae40..3da32ea 100644
--- a/www/ui/app.css
+++ b/www/ui/app.css
@@ -129,6 +129,17 @@
margin: 0.4rem;
}
+.entity-liste {
+ list-style-type: none;
+}
+
+.entity-eintrag {
+ margin-top: 0.8rem;
+ margin-left: 0;
+ margin-right: 0;
+ margin-bottom: 0;
+}
+
/*
@media (min-width: 800px) {
.zentrum-behaelter {
diff --git a/www/ui/data/ablageort.css b/www/ui/data/ablageort.css
index 923d8ab..1f82141 100644
--- a/www/ui/data/ablageort.css
+++ b/www/ui/data/ablageort.css
@@ -17,4 +17,15 @@
.entity-element {
margin: 0.4rem;
+}
+
+.entity-liste {
+ list-style-type: none;
+}
+
+.entity-eintrag {
+ margin-top: 0.8rem;
+ margin-left: 0;
+ margin-right: 0;
+ margin-bottom: 0;
}
\ No newline at end of file
diff --git a/www/ui/data/ablageort.html b/www/ui/data/ablageort.html
index 34ee44d..e36409c 100644
--- a/www/ui/data/ablageort.html
+++ b/www/ui/data/ablageort.html
@@ -18,7 +18,7 @@
-->
<html>
<head>
- <title>Ablageort</title>
+ <title>Ablageorte</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="../app.css">
@@ -28,16 +28,11 @@
</head>
<body>
<div class="entity-formular">
- Ablageort
-
- <input class="entity-element" type="text" id="ablageort-name" placeholder="Name" >
- <input class="entity-element" type="text" id="ablageort-ort" placeholder="Pfad" >
- <input class="entity-element" type="text" id="ablageort-url" placeholder="URL" >
- <div class="entity-buttons">
- <button class="button-primary" id="ok-btn">Speichern</button>
- <button class="button" id="cancel-btn">Abbrechen</button>
- </div>
-
+ Ablageorte
+ <ul class="entity-liste">
+ <li class="entity-eintrag">Katalog</li>
+ <li class="entity-eintrag">Katalog2</li>
+ </ul>
</div>
</body>
</html>
diff --git a/www/ui/data/ablageort_liste.html b/www/ui/data/ablageort_liste.html
new file mode 100644
index 0000000..34ee44d
--- /dev/null
+++ b/www/ui/data/ablageort_liste.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!--
+ Mediazentrale - Personal Media Center
+ Copyright (C) 2021 Ulrich Hilger
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+-->
+<html>
+ <head>
+ <title>Ablageort</title>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" type="text/css" href="../app.css">
+ <link rel="stylesheet" type="text/css" href="formulare.css">
+ <link rel="stylesheet" type="text/css" href="ablageort.css">
+
+ </head>
+ <body>
+ <div class="entity-formular">
+ Ablageort
+
+ <input class="entity-element" type="text" id="ablageort-name" placeholder="Name" >
+ <input class="entity-element" type="text" id="ablageort-ort" placeholder="Pfad" >
+ <input class="entity-element" type="text" id="ablageort-url" placeholder="URL" >
+ <div class="entity-buttons">
+ <button class="button-primary" id="ok-btn">Speichern</button>
+ <button class="button" id="cancel-btn">Abbrechen</button>
+ </div>
+
+ </div>
+ </body>
+</html>
diff --git a/www/ui/data/menu/hauptmenue.json b/www/ui/data/menu/hauptmenue.json
index 44f268a..995cd9b 100644
--- a/www/ui/data/menu/hauptmenue.json
+++ b/www/ui/data/menu/hauptmenue.json
@@ -8,9 +8,14 @@
},
"inhalt": [
{
+ "titel": "Ablageorte",
+ "umenue": false,
+ "funktion": "app.ablageort_liste"
+ },
+ {
"titel": "Neuer Ablageort",
"umenue": false,
- "funktion": "app.form_ablageort_neu"
+ "funktion": "app.ablageort_neu"
},
{
"titel": "Seite umschalten",
diff --git a/www/ui/data/tpl/ablageort_liste.tpl b/www/ui/data/tpl/ablageort_liste.tpl
new file mode 100644
index 0000000..b86452d
--- /dev/null
+++ b/www/ui/data/tpl/ablageort_liste.tpl
@@ -0,0 +1,15 @@
+
+<div class='entity-formular'>
+ Ablageorte
+ <ul class='entity-liste'>
+ {{#ArrayList}}
+ <li class='entity-eintrag'>{{.}}</li>
+ {{/ArrayList}}
+ </ul>
+</div>
+
+
+
+
+
+
diff --git a/www/ui/index.html b/www/ui/index.html
index 0d0a88d..c5fd10e 100644
--- a/www/ui/index.html
+++ b/www/ui/index.html
@@ -68,7 +68,7 @@
Fußzeile
</div>
<!-- Skripte -->
- <script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>
+ <script src="js/mustache/mustache.min.js"></script>
<script src="js/app-menu.js"></script>
<!-- <script src="js/vorlagen.js"></script> -->
<script src="js/app.js"></script>
diff --git a/www/ui/js/app.js b/www/ui/js/app.js
index c3a2888..04db53f 100644
--- a/www/ui/js/app.js
+++ b/www/ui/js/app.js
@@ -12,9 +12,19 @@
// var vorlagen;
var cache; // mustache templates
+ this.ablageort_liste = function() {
+ self.http_get('../api/store/Ablageort/', function (responseText) {
+ self.vorlage_laden_und_fuellen("data/tpl/ablageort_liste.tpl", JSON.parse(responseText), function (html) {
+ document.querySelector(".zentraler-inhalt").innerHTML = html;
+ self.addEvtListener('.entity-eintrag', 'click', function (event) {
+ var t = event.target;
+ self.meldung_mit_timeout(t.textContent, 1500);
+ });
+ });
+ });
+ };
-
- this.form_ablageort_neu = function () {
+ this.ablageort_neu = function () {
self.vorlage_laden_und_fuellen("data/tpl/form_ablageort.tpl", "", function (html) {
document.querySelector(".zentraler-inhalt").innerHTML = html;
self.addEvtListener('#ok-btn', 'click', function () {
@@ -26,7 +36,7 @@
);
// {"name":"Katalog","ort":"/home/ulrich/Videos","url":"/media/test"}
var daten = JSON.stringify(a);
- self.http_post('../api/store/Ablageort', daten, function () {
+ self.http_post('../api/store/Ablageort', daten, function (responseText) {
// hier die Antwort verarbeiten
});
});
@@ -159,6 +169,8 @@
this.meldung_mit_timeout = function (meldung, timeout) {
var s = document.querySelector('.sued');
+ s.classList.add('sued-open');
+ s.style.height = '1.5em';
s.textContent = meldung;
setTimeout(function () {
s.textContent = 'Bereit.';
@@ -245,6 +257,8 @@
};
this.vorlage_fuellen = function (vurl, inhalt, cb) {
+ //console.log("vorlage " + self.cache[vurl]);
+ //console.log("render " + inhalt);
cb(Mustache.render(self.cache[vurl], inhalt));
};
diff --git a/www/ui/js/mustache/mustache.min.js b/www/ui/js/mustache/mustache.min.js
new file mode 100644
index 0000000..520cfcb
--- /dev/null
+++ b/www/ui/js/mustache/mustache.min.js
@@ -0,0 +1 @@
+(function defineMustache(global,factory){if(typeof exports==="object"&&exports&&typeof exports.nodeName!=="string"){factory(exports)}else if(typeof define==="function"&&define.amd){define(["exports"],factory)}else{global.Mustache={};factory(global.Mustache)}})(this,function mustacheFactory(mustache){var objectToString=Object.prototype.toString;var isArray=Array.isArray||function isArrayPolyfill(object){return objectToString.call(object)==="[object Array]"};function isFunction(object){return typeof object==="function"}function typeStr(obj){return isArray(obj)?"array":typeof obj}function escapeRegExp(string){return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function hasProperty(obj,propName){return obj!=null&&typeof obj==="object"&&propName in obj}var regExpTest=RegExp.prototype.test;function testRegExp(re,string){return regExpTest.call(re,string)}var nonSpaceRe=/\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};function escapeHtml(string){return String(string).replace(/[&<>"'`=\/]/g,function fromEntityMap(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tagsToCompile){if(typeof tagsToCompile==="string")tagsToCompile=tagsToCompile.split(spaceRe,2);if(!isArray(tagsToCompile)||tagsToCompile.length!==2)throw new Error("Invalid tags: "+tagsToCompile);openingTagRe=new RegExp(escapeRegExp(tagsToCompile[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tagsToCompile[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tagsToCompile[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i<valueLength;++i){chr=value.charAt(i);if(isWhitespace(chr)){spaces.push(tokens.length)}else{nonSpace=true}tokens.push(["text",chr,start,start+1]);start+=1;if(chr==="\n")stripSpace()}}if(!scanner.scan(openingTagRe))break;hasTag=true;type=scanner.scan(tagRe)||"name";scanner.scan(whiteRe);if(type==="="){value=scanner.scanUntil(equalsRe);scanner.scan(equalsRe);scanner.scanUntil(closingTagRe)}else if(type==="{"){value=scanner.scanUntil(closingCurlyRe);scanner.scan(curlyRe);scanner.scanUntil(closingTagRe);type="&"}else{value=scanner.scanUntil(closingTagRe)}if(!scanner.scan(closingTagRe))throw new Error("Unclosed tag at "+scanner.pos);token=[type,value,start,scanner.pos];tokens.push(token);if(type==="#"||type==="^"){sections.push(token)}else if(type==="/"){openSection=sections.pop();if(!openSection)throw new Error('Unopened section "'+value+'" at '+start);if(openSection[1]!==value)throw new Error('Unclosed section "'+openSection[1]+'" at '+start)}else if(type==="name"||type==="{"||type==="&"){nonSpace=true}else if(type==="="){compileTags(value)}}openSection=sections.pop();if(openSection)throw new Error('Unclosed section "'+openSection[1]+'" at '+scanner.pos);return nestTokens(squashTokens(tokens))}function squashTokens(tokens){var squashedTokens=[];var token,lastToken;for(var i=0,numTokens=tokens.length;i<numTokens;++i){token=tokens[i];if(token){if(token[0]==="text"&&lastToken&&lastToken[0]==="text"){lastToken[1]+=token[1];lastToken[3]=token[3]}else{squashedTokens.push(token);lastToken=token}}}return squashedTokens}function nestTokens(tokens){var nestedTokens=[];var collector=nestedTokens;var sections=[];var token,section;for(var i=0,numTokens=tokens.length;i<numTokens;++i){token=tokens[i];switch(token[0]){case"#":case"^":collector.push(token);sections.push(token);collector=token[4]=[];break;case"/":section=sections.pop();section[5]=token[2];collector=sections.length>0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function eos(){return this.tail===""};Scanner.prototype.scan=function scan(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function scanUntil(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function push(view){return new Context(view,this)};Context.prototype.lookup=function lookup(name){var cache=this.cache;var value;if(cache.hasOwnProperty(name)){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index<names.length){if(index===names.length-1)lookupHit=hasProperty(value,names[index]);value=value[names[index++]]}}else{value=context.view[name];lookupHit=hasProperty(context.view,name)}if(lookupHit)break;context=context.parent}cache[name]=value}if(isFunction(value))value=value.call(this.view);return value};function Writer(){this.cache={}}Writer.prototype.clearCache=function clearCache(){this.cache={}};Writer.prototype.parse=function parse(template,tags){var cache=this.cache;var tokens=cache[template];if(tokens==null)tokens=cache[template]=parseTemplate(template,tags);return tokens};Writer.prototype.render=function render(template,view,partials){var tokens=this.parse(template);var context=view instanceof Context?view:new Context(view);return this.renderTokens(tokens,context,partials,template)};Writer.prototype.renderTokens=function renderTokens(tokens,context,partials,originalTemplate){var buffer="";var token,symbol,value;for(var i=0,numTokens=tokens.length;i<numTokens;++i){value=undefined;token=tokens[i];symbol=token[0];if(symbol==="#")value=this.renderSection(token,context,partials,originalTemplate);else if(symbol==="^")value=this.renderInverted(token,context,partials,originalTemplate);else if(symbol===">")value=this.renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this.unescapedValue(token,context);else if(symbol==="name")value=this.escapedValue(token,context);else if(symbol==="text")value=this.rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype.renderSection=function renderSection(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j<valueLength;++j){buffer+=this.renderTokens(token[4],context.push(value[j]),partials,originalTemplate)}}else if(typeof value==="object"||typeof value==="string"||typeof value==="number"){buffer+=this.renderTokens(token[4],context.push(value),partials,originalTemplate)}else if(isFunction(value)){if(typeof originalTemplate!=="string")throw new Error("Cannot use higher-order sections without the original template");value=value.call(context.view,originalTemplate.slice(token[3],token[5]),subRender);if(value!=null)buffer+=value}else{buffer+=this.renderTokens(token[4],context,partials,originalTemplate)}return buffer};Writer.prototype.renderInverted=function renderInverted(token,context,partials,originalTemplate){var value=context.lookup(token[1]);if(!value||isArray(value)&&value.length===0)return this.renderTokens(token[4],context,partials,originalTemplate)};Writer.prototype.renderPartial=function renderPartial(token,context,partials){if(!partials)return;var value=isFunction(partials)?partials(token[1]):partials[token[1]];if(value!=null)return this.renderTokens(this.parse(value),context,partials,value)};Writer.prototype.unescapedValue=function unescapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return value};Writer.prototype.escapedValue=function escapedValue(token,context){var value=context.lookup(token[1]);if(value!=null)return mustache.escape(value)};Writer.prototype.rawValue=function rawValue(token){return token[1]};mustache.name="mustache.js";mustache.version="2.3.0";mustache.tags=["{{","}}"];var defaultWriter=new Writer;mustache.clearCache=function clearCache(){return defaultWriter.clearCache()};mustache.parse=function parse(template,tags){return defaultWriter.parse(template,tags)};mustache.render=function render(template,view,partials){if(typeof template!=="string"){throw new TypeError('Invalid template! Template should be a "string" '+'but "'+typeStr(template)+'" was given as the first '+"argument for mustache#render(template, view, partials)")}return defaultWriter.render(template,view,partials)};mustache.to_html=function to_html(template,view,partials,send){var result=mustache.render(template,view,partials);if(isFunction(send)){send(result)}else{return result}};mustache.escape=escapeHtml;mustache.Scanner=Scanner;mustache.Context=Context;mustache.Writer=Writer;return mustache});
--
Gitblit v1.9.3