settings
This commit is contained in:
parent
38ead82e9c
commit
a9b2bff043
27 changed files with 1430 additions and 373 deletions
|
|
@ -38,7 +38,7 @@ var settings = {
|
|||
});
|
||||
});
|
||||
},
|
||||
setItem (key,value,callback) {
|
||||
setItem (key,value) {
|
||||
if (this.debug) console.log('setItem',key,value);
|
||||
return new Promise((resolve, reject) => {
|
||||
localforage.setItem(key, value)
|
||||
|
|
@ -50,16 +50,23 @@ var settings = {
|
|||
return new Promise((resolve, reject) => {reject(err);})
|
||||
});
|
||||
})
|
||||
},
|
||||
length(){
|
||||
return new Promise((resolve, reject) => {
|
||||
localforage.keys() // returns array of keys
|
||||
.then((value) => {
|
||||
console.log('length ',value);
|
||||
return new Promise((resolve, reject) => {resolve(value);})
|
||||
}).catch((err) => {
|
||||
console.log('length');
|
||||
return new Promise((resolve, reject) => {reject(err);})
|
||||
});
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
Vue.config.errorHandler = function (err, vm, info) {
|
||||
// handle error
|
||||
// `info` is a Vue-specific error info, e.g. which lifecycle hook
|
||||
console.error(err, vm, info);
|
||||
alert("vue error");
|
||||
};
|
||||
|
||||
|
||||
|
||||
//Returns a function, that, as long as it continues to be invoked, will not
|
||||
//be triggered. The function will be called after it stops being called for
|
||||
//N milliseconds. If `immediate` is passed, trigger the function on the
|
||||
|
|
@ -77,19 +84,50 @@ function debounce(func, wait, immediate) {
|
|||
};
|
||||
};
|
||||
|
||||
// https://stackoverflow.com/questions/36672561/how-to-exit-fullscreen-onclick-using-javascript
|
||||
function fullscreen() {
|
||||
var isInFullScreen = (document.fullscreenElement && document.fullscreenElement !== null) ||
|
||||
(document.webkitFullscreenElement && document.webkitFullscreenElement !== null) ||
|
||||
(document.mozFullScreenElement && document.mozFullScreenElement !== null) ||
|
||||
(document.msFullscreenElement && document.msFullscreenElement !== null);
|
||||
|
||||
var docElm = document.documentElement;
|
||||
if (!isInFullScreen) {
|
||||
if (docElm.requestFullscreen) {
|
||||
docElm.requestFullscreen();
|
||||
} else if (docElm.mozRequestFullScreen) {
|
||||
docElm.mozRequestFullScreen();
|
||||
} else if (docElm.webkitRequestFullScreen) {
|
||||
docElm.webkitRequestFullScreen();
|
||||
} else if (docElm.msRequestFullscreen) {
|
||||
docElm.msRequestFullscreen();
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const router = new VueRouter({
|
||||
base:"/vue-poc/ui/",
|
||||
mode: 'history',
|
||||
routes: [
|
||||
{ path: '/', component: Home,meta:{title:"Home"} },
|
||||
{ path: '/session', component: Session ,meta:{title:"Session"}},
|
||||
{ path: '/images/item', component: Images, meta:{title:"Images"} },
|
||||
{ path: '/images/report', name:"image-reports",component: Report, props: true, meta:{title: "Image report"}},
|
||||
{ path: '/', component: Home, meta:{title:"Home"} },
|
||||
{ path: '/session', component: Session ,meta: {title:"Session"}},
|
||||
{path: '/images', redirect: '/images/item' },
|
||||
{ path: '/images/item', name:'images', component: Images, meta:{title: "Images"} },
|
||||
{ path: '/images/report', name:"image-reports", component: Report, props: true, meta:{title: "Image report"}},
|
||||
{ path: '/images/item/:id', name:"image",component: Image, props: true, meta:{title: "Image details"}},
|
||||
{ path: '/images/thumbnail', component: Thumbnail, meta:{title:"Thumbnail generator"} },
|
||||
{ path: '/images/keywords', component: Keywords, meta:{title:"Thumbnail keywords"} },
|
||||
{ path: '/images/dates', component: Dates, meta:{title:"Thumbnail dates"} },
|
||||
{ path: '/images/keywords', component: Keywords, meta:{title:"Image keywords"} },
|
||||
{ path: '/images/dates', component: Dates, meta:{title:"Image dates"} },
|
||||
{ path: '/select', component: Select, meta:{title:"Select"} },
|
||||
{ path: '/search', component: Search, meta:{title:"Search"} },
|
||||
{ path: '/tabs', component: Tabs,meta:{title:"tab test",requiresAuth: true} },
|
||||
|
|
@ -100,6 +138,7 @@ const router = new VueRouter({
|
|||
{ path: '/database', component: Files,meta:{title:"Databases"},props:{protocol:"basexdb"} },
|
||||
{ path: '/ping', component: Ping,meta:{title:"Ping"} },
|
||||
{ path: '/settings', component: Settings, meta:{title:"Settings"} },
|
||||
{ path: '/acesettings', component: Acesettings, meta:{title:"Editor settings"} },
|
||||
{ path: '/history', component: History, meta:{title:"File History"} },
|
||||
{ path: '/puzzle', component: Puzzle, meta:{title:"Jigsaw"} },
|
||||
{ path: '/eval', component: Eval, meta:{title:"Evaluate XQuery"} },
|
||||
|
|
@ -137,6 +176,7 @@ router.beforeEach((to, from, next) => {
|
|||
});
|
||||
|
||||
Vue.use(Vuetify);
|
||||
|
||||
const app = new Vue({
|
||||
router,
|
||||
data:function(){return {
|
||||
|
|
@ -217,10 +257,58 @@ const app = new Vue({
|
|||
showAlert(msg){
|
||||
this.alert.msg=moment().format()+" "+ msg
|
||||
this.alert.show=true
|
||||
},
|
||||
fullscreenEnabled(){
|
||||
return document.fullscreenEnabled
|
||||
},
|
||||
isInFullScreen(){
|
||||
return (document.fullscreenElement && document.fullscreenElement !== null) ||
|
||||
(document.webkitFullscreenElement && document.webkitFullscreenElement !== null) ||
|
||||
(document.mozFullScreenElement && document.mozFullScreenElement !== null) ||
|
||||
(document.msFullscreenElement && document.msFullscreenElement !== null)
|
||||
},
|
||||
fullscreen(){
|
||||
// https://stackoverflow.com/questions/36672561/how-to-exit-fullscreen-onclick-using-javascript
|
||||
var isInFullScreen = this.isInFullScreen();
|
||||
alert(isInFullScreen);
|
||||
var docElm = document.documentElement;
|
||||
if (!isInFullScreen) {
|
||||
if (docElm.requestFullscreen) {
|
||||
docElm.requestFullscreen();
|
||||
} else if (docElm.mozRequestFullScreen) {
|
||||
docElm.mozRequestFullScreen();
|
||||
} else if (docElm.webkitRequestFullScreen) {
|
||||
docElm.webkitRequestFullScreen();
|
||||
} else if (docElm.msRequestFullscreen) {
|
||||
docElm.msRequestFullscreen();
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
fullscreenIcon(){ return this.isInFullScreen()?'fullscreen_exit':'fullscreen'}
|
||||
},
|
||||
|
||||
created(){
|
||||
|
||||
console.log("create-----------")
|
||||
Vue.config.errorHandler = function (err, vm, info) {
|
||||
// handle error
|
||||
// `info` is a Vue-specific error info, e.g. which lifecycle hook
|
||||
console.error(err, vm, info);
|
||||
this.showAlert("vue error:\n"+err)
|
||||
alert("vue error");
|
||||
};
|
||||
// Add a response interceptor
|
||||
|
||||
HTTP.interceptors.response.use(
|
||||
|
|
@ -229,8 +317,8 @@ const app = new Vue({
|
|||
return response;
|
||||
},
|
||||
(error) =>{
|
||||
// Do something with response error
|
||||
this.showAlert("http error:\n"+error.response.data)
|
||||
// interupt restxq single
|
||||
if(460 != error.response.status)this.showAlert("http error:\n"+error.response.data)
|
||||
return Promise.reject(error);
|
||||
});
|
||||
|
||||
|
|
|
|||
14
src/vue-poc/components/qd-fullscreen.vue
Normal file
14
src/vue-poc/components/qd-fullscreen.vue
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<!--
|
||||
simple full screen
|
||||
-->
|
||||
<template id="qd-fullscreen">
|
||||
<a onclick="fullscreen()" href="javascript:void(0);">fS</a>
|
||||
</template>
|
||||
|
||||
<script>{
|
||||
created:function(){
|
||||
console.log("qd-fullscreen");
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,9 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<template id="about"> <v-layout class="ma-5"> <v-flex
|
||||
xs4> <v-card hover raised> <v-card-title
|
||||
height="200px" class="pa-5 indigo accent-3">
|
||||
<div class="display-1 white--text text-xs-center">VUE-POC</div>
|
||||
v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4>
|
||||
<template id="about">
|
||||
<v-container>
|
||||
<v-parallax src="/vue-poc/ui/vue-poc.png" >
|
||||
</v-parallax>
|
||||
<v-card>
|
||||
|
||||
<v-card-text>
|
||||
|
||||
<p>
|
||||
This is a experiment in using
|
||||
<code>vue.js</code>
|
||||
|
|
@ -22,7 +25,11 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4>
|
|||
<li> <router-link to="database?url=%2Fvue-poc%2F">DB</router-link></li>
|
||||
</ul>
|
||||
</v-flex> <v-btn floating="floating"> <v-icon>add</v-icon> </v-btn> <qd-link
|
||||
href="/dba">REPLACED</qd-link> </v-layout> </template>
|
||||
href="/dba">REPLACED</qd-link>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
</template>
|
||||
<script>
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
</v-btn>
|
||||
|
||||
|
||||
<v-btn icon @click="acecmd('foldall')" title="fold all">
|
||||
<v-btn icon @click="togglefold" title="fold toggle">
|
||||
<v-icon>vertical_align_center</v-icon>
|
||||
</v-btn>
|
||||
|
||||
|
|
@ -140,6 +140,7 @@ v-on:annotation="annotation"></vue-ace>
|
|||
snackbar: false,
|
||||
message: "Cant do that",
|
||||
events: new Vue({}),
|
||||
folded: false, // toggle fold/unfold action
|
||||
mimemap:{
|
||||
"text/xml":"xml",
|
||||
"application/xml":"xml",
|
||||
|
|
@ -192,6 +193,10 @@ v-on:annotation="annotation"></vue-ace>
|
|||
});
|
||||
|
||||
},
|
||||
togglefold(){
|
||||
this.folded=!this.folded
|
||||
this.acecmd(this.folded?"foldall":"unfoldall")
|
||||
},
|
||||
acecmd(cmd){
|
||||
//alert("acecmd: "+cmd)
|
||||
this.events.$emit('eventFired',cmd);
|
||||
|
|
|
|||
|
|
@ -9,20 +9,63 @@
|
|||
<v-toolbar class="orange darken-1">
|
||||
<v-btn icon to="./"><v-icon>arrow_back</v-icon></v-btn>
|
||||
<v-card-title >
|
||||
<v-chip >todo</v-chip>
|
||||
<v-chip >Images by year and month</v-chip>
|
||||
</v-card-title>
|
||||
|
||||
<v-spacer></v-spacer>
|
||||
|
||||
</v-toolbar>
|
||||
<v-card-text>
|
||||
dates todo
|
||||
<v-progress-linear v-if="busy" v-bind:indeterminate="true" ></v-progress-linear>
|
||||
<v-container v-if="!busy" fluid>
|
||||
<v-layout v-for="year in items"
|
||||
:key="year.year">
|
||||
<v-flex v-text="year.year"></v-flex>
|
||||
<v-flex v-for="(m,i) in year.months"
|
||||
:key="i"><v-btn icon primary :disabled="0==m" @click="go(year.year,i)">{{m}}</v-btn></v-flex>
|
||||
</v-layout>
|
||||
</v-container>
|
||||
<v-layout>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<script>{
|
||||
data: ()=>({
|
||||
busy: false,
|
||||
total: 0,
|
||||
items: [],
|
||||
elapsed: null,
|
||||
months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
||||
}),
|
||||
|
||||
methods:{
|
||||
getDatetaken(){
|
||||
this.busy=true
|
||||
var t0 = performance.now();
|
||||
HTTP.get("images/datetaken")
|
||||
.then(r=>{
|
||||
this.busy=false
|
||||
this.total=r.data.total
|
||||
this.items=r.data.items
|
||||
var t1 = performance.now();
|
||||
this.elapsed= 0.001 *(t1 - t0)
|
||||
})
|
||||
},
|
||||
go(year,month){
|
||||
|
||||
month=("0" + (1+month)).slice(-2)
|
||||
// alert("year: "+year+" "+month)
|
||||
var from=year + "-" + month + "-01"
|
||||
var lastday=new Date(year, month, 0).getDate()
|
||||
var until=year + "-" + month + "-"+ lastday
|
||||
this.$router.push({ name: 'images', query: { from:from, until:until }})
|
||||
}
|
||||
},
|
||||
created:function(){
|
||||
console.log("create datetaken")
|
||||
this.getDatetaken()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -20,24 +20,24 @@
|
|||
<v-chip class="primary white--text">{{ total }} in {{ elapsed | round(2) }} secs </v-chip>
|
||||
|
||||
Page:{{ query.page+1 }}
|
||||
<v-btn @click.stop="query.page=Math.min(0,query.page-1)" :disabled="query.page==0" icon primary>
|
||||
<v-btn @click.stop="pageBack()" :disabled="query.page==0" icon primary>
|
||||
<v-icon>arrow_back</v-icon>
|
||||
</v-btn>
|
||||
<v-btn @click.stop="query.page+=1" icon primary>
|
||||
<v-btn @click.stop="pageNext()" icon primary>
|
||||
<v-icon>arrow_forward</v-icon>
|
||||
</v-btn>
|
||||
</span>
|
||||
</v-toolbar>
|
||||
<v-progress-linear v-if="busy" v-bind:indeterminate="true" ></v-progress-linear>
|
||||
<v-container v-if="!busy" fluid grid-list-md>
|
||||
<v-layout row wrap>
|
||||
<v-layout row wrap v-touch="{ left: () => pageNext(), right: () => pageBack()}">
|
||||
<v-flex height="80px"
|
||||
xs2
|
||||
v-for="image in images"
|
||||
:key="image.name"
|
||||
>
|
||||
<v-card class="grey lighten-2 pt-1">
|
||||
<v-card-media :src="src(image)" @click="go(image)"
|
||||
<v-card-media :src="src(image)" @dblclick="go(image)"
|
||||
height="80px" contain></v-card-media>
|
||||
<v-card-actions v-tooltip:top="{ html: ' '+image.path }">
|
||||
|
||||
|
|
@ -69,9 +69,17 @@
|
|||
<v-select
|
||||
v-bind:items="keywords"
|
||||
v-model="query.keyword"
|
||||
label="Keyword"
|
||||
label="Keyword" item-value="text" item-text="text"
|
||||
autocomplete
|
||||
></v-select>
|
||||
>
|
||||
<template slot="item" scope="data">
|
||||
<v-list-tile-content>
|
||||
<v-list-tile-title v-html="data.item.text"></v-list-tile-title>
|
||||
<v-list-tile-sub-title v-html="data.item.count"></v-list-tile-sub-title>
|
||||
</v-list-tile-content>
|
||||
</template>
|
||||
</v-select>
|
||||
|
||||
<v-btn @click="query.keyword=null" :disabled="!query.keyword">
|
||||
<v-icon>close</v-icon>Clear keyword
|
||||
</v-btn>
|
||||
|
|
@ -208,6 +216,12 @@
|
|||
},
|
||||
go(image){
|
||||
this.$router.push({ name: 'image', params: { id: image.id }})
|
||||
},
|
||||
pageBack(){
|
||||
this.query.page=Math.min(0,this.query.page-1)
|
||||
},
|
||||
pageNext(){
|
||||
this.query.page+=1
|
||||
}
|
||||
|
||||
},
|
||||
|
|
@ -235,7 +249,7 @@
|
|||
|
||||
showFilter(){
|
||||
if(this.keywords.length==0){
|
||||
HTTP.get("images/keywords")
|
||||
HTTP.get("images/keywords2")
|
||||
.then(r=>{
|
||||
this.keywords=r.data.items
|
||||
})
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ function vue-api:id( $id as xs:integer)
|
|||
</json>
|
||||
};
|
||||
(:~
|
||||
: do a thumbnail
|
||||
: get set of thumbnails matching search
|
||||
:)
|
||||
declare
|
||||
%rest:single
|
||||
|
|
@ -62,22 +62,52 @@ $keyword
|
|||
</json>
|
||||
};
|
||||
|
||||
|
||||
|
||||
(:~
|
||||
: keywords
|
||||
:)
|
||||
declare
|
||||
%rest:GET %rest:path("/vue-poc/api/images/keywords")
|
||||
%rest:GET %rest:path("/vue-poc/api/images/keywords2")
|
||||
%rest:produces("application/json")
|
||||
%output:method("json")
|
||||
function vue-api:keywords()
|
||||
function vue-api:keywords2()
|
||||
{
|
||||
let $keys:=
|
||||
collection($cfg:DB-IMAGE || "/image")/image/keywords/keyword
|
||||
=>distinct-values()
|
||||
=>sort("http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive")
|
||||
let $keys:=db:open($cfg:DB-IMAGE,"keywords.xml")/keywords/keyword
|
||||
|
||||
return <json type="object" >
|
||||
<items type="array">{
|
||||
$keys!<_ >{.}</_>
|
||||
$keys!<_ type="object">
|
||||
<text>{@name/string()}</text>
|
||||
<count>{@count/string()}</count>
|
||||
</_>
|
||||
}</items>
|
||||
</json>
|
||||
};
|
||||
|
||||
(:~
|
||||
: keywords
|
||||
:)
|
||||
declare
|
||||
%rest:GET %rest:path("/vue-poc/api/images/datetaken")
|
||||
%rest:produces("application/json")
|
||||
%output:method("json")
|
||||
function vue-api:datetaken()
|
||||
{
|
||||
let $years:=db:open($cfg:DB-IMAGE,"datetaken.xml")/dates/year
|
||||
|
||||
return <json type="object" >
|
||||
<items type="array">{
|
||||
for $year in $years
|
||||
return <_ type="object">
|
||||
<year>{$year/@value/string()}</year>
|
||||
<count type="number">{$year/@count/string()}</count>
|
||||
<months type="array">{
|
||||
for $m in 1 to 12
|
||||
let $c:= $year/month[@value=format-integer($m,"00")]/@count
|
||||
return <_ type="number">{if($c)then string($c) else 0}</_>
|
||||
}</months>
|
||||
</_>
|
||||
}</items>
|
||||
</json>
|
||||
};
|
||||
|
|
|
|||
|
|
@ -9,20 +9,63 @@
|
|||
<v-toolbar class="orange darken-1">
|
||||
<v-btn icon to="./"><v-icon>arrow_back</v-icon></v-btn>
|
||||
<v-card-title >
|
||||
<v-chip >todo</v-chip>
|
||||
<v-chip >click to show</v-chip>
|
||||
</v-card-title>
|
||||
|
||||
<v-spacer></v-spacer>
|
||||
|
||||
</v-toolbar>
|
||||
<v-card-text>
|
||||
keywords todo
|
||||
<v-progress-linear v-if="busy" v-bind:indeterminate="true" ></v-progress-linear>
|
||||
<v-container v-if="!busy" fluid grid-list-md>
|
||||
<v-layout row wrap v-touch="{ left: () => pageNext(), right: () => pageBack()}">
|
||||
<v-flex height="80px"
|
||||
xs3
|
||||
v-for="keyword in items"
|
||||
:key="keyword.text"
|
||||
>
|
||||
<v-card class="grey lighten-2 pt-1" @click="show(keyword)">
|
||||
<v-toolbar>
|
||||
<v-card-title v-text="keyword.text"></v-card-title>
|
||||
<v-spacer></v-spacer>
|
||||
<v-chip>{{keyword.count}}</v-chip>
|
||||
</v-toolbar>
|
||||
</v-card>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
</v-container>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<script>{
|
||||
data: ()=>({
|
||||
busy: false,
|
||||
total: 0,
|
||||
items: [],
|
||||
elapsed: null
|
||||
}),
|
||||
|
||||
methods:{
|
||||
getKeywords(){
|
||||
this.busy=true
|
||||
var t0 = performance.now();
|
||||
HTTP.get("images/keywords2")
|
||||
.then(r=>{
|
||||
this.busy=false
|
||||
this.total=r.data.total
|
||||
this.items=r.data.items
|
||||
var t1 = performance.now();
|
||||
this.elapsed= 0.001 *(t1 - t0)
|
||||
})
|
||||
},
|
||||
show(keyword){
|
||||
this.$router.push({ name: 'images', query: { keyword: keyword.text }})
|
||||
}
|
||||
</script>
|
||||
},
|
||||
created:function(){
|
||||
console.log("create keywords")
|
||||
this.getKeywords()
|
||||
}
|
||||
}</script>
|
||||
|
|
|
|||
27
src/vue-poc/features/images/pics-06-keywords.xq
Normal file
27
src/vue-poc/features/images/pics-06-keywords.xq
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
(:~ get keywords
|
||||
: <keyword name="2 orlop" count="31">
|
||||
: <dates earliest="2010-08-05T15:40:54" latest="2011-03-06T18:04:28"/>
|
||||
: <idref>14569796 14569818 </idref>
|
||||
: </keyword>
|
||||
:)
|
||||
import module namespace cfg = "quodatum:media.image.configure" at "config.xqm";
|
||||
declare %updating function local:put($data,$path){
|
||||
db:replace($cfg:DB-IMAGE,$path,$data)
|
||||
};
|
||||
declare variable $DEST:="/keywords.xml";
|
||||
|
||||
let $images:=collection($cfg:DB-IMAGE || "/image")/image
|
||||
let $keywords:= $images/keywords/keyword=>distinct-values()
|
||||
let $kd:=<keywords date="{current-dateTime()}">{
|
||||
for $k in $keywords
|
||||
order by lower-case($k)
|
||||
let $i:=$images[keywords/keyword = $k]
|
||||
let $i:=sort($i,(),function($x){$x/datetaken})
|
||||
let $earliest:=head($i)
|
||||
let $latest:=$i[last()]
|
||||
return <keyword name="{$k}" count="{count($i)}">
|
||||
<dates earliest="{$earliest/datetaken}" latest="{$latest/datetaken}"/>
|
||||
<idref >{db:node-id($i)=>string-join(" ")}</idref>
|
||||
</keyword>
|
||||
}</keywords>
|
||||
return $kd=>local:put($DEST)
|
||||
28
src/vue-poc/features/images/pics-07-datetaken.xq
Normal file
28
src/vue-poc/features/images/pics-07-datetaken.xq
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
(:~ get datetaken
|
||||
: <keyword name="2 orlop" count="31">
|
||||
: <dates earliest="2010-08-05T15:40:54" latest="2011-03-06T18:04:28"/>
|
||||
: <idref>14569796 14569818 </idref>
|
||||
: </keyword>
|
||||
:)
|
||||
import module namespace cfg = "quodatum:media.image.configure" at "config.xqm";
|
||||
declare %updating function local:put($data,$path){
|
||||
db:replace($cfg:DB-IMAGE,$path,$data)
|
||||
};
|
||||
declare variable $DEST:="/datetaken.xml";
|
||||
let $dates:=<dates date="{current-dateTime()}">{
|
||||
for $image in collection($cfg:DB-IMAGE || "/image")/image[not(@original)]
|
||||
let $year:=substring($image/datetaken,1,4)
|
||||
|
||||
group by $year
|
||||
order by $year descending
|
||||
|
||||
return <year value="{$year}" count="{count($image)}">
|
||||
{for $image in $image
|
||||
let $month:=substring($image/datetaken,6,2)
|
||||
group by $month
|
||||
order by $month
|
||||
return <month value="{$month}" count="{count($image)}"/>
|
||||
}
|
||||
</year>
|
||||
}</dates>
|
||||
return $dates =>local:put($DEST)
|
||||
|
|
@ -7,10 +7,29 @@ import module namespace session = "http://basex.org/modules/session";
|
|||
|
||||
|
||||
(:~ Session key. :)
|
||||
declare variable $vue-login:SESSION-KEY := "vue-poc";
|
||||
declare variable $vue-login:SESSION-KEY := "id";
|
||||
(:~ Current session. :)
|
||||
declare variable $vue-login:SESSION-VALUE := session:get($vue-login:SESSION-KEY);
|
||||
|
||||
(:~
|
||||
: get status
|
||||
:)
|
||||
declare
|
||||
%rest:GET %rest:path("/vue-poc/api/status")
|
||||
%rest:produces("application/json")
|
||||
%output:method("json")
|
||||
function vue-login:status( )
|
||||
{
|
||||
let $user:=session:get("id","")
|
||||
let $role:=if($user and user:exists($user)) then user:list-details($user)/@permission/string() else ""
|
||||
return <json type="object" >
|
||||
<user>{ if($user) then $user else "guest" }</user>
|
||||
<permission>{$role}</permission>
|
||||
<session>{session:id()}</session>
|
||||
<created>{session:created()}</created>
|
||||
</json>
|
||||
};
|
||||
|
||||
(:~
|
||||
: Checks the user input and redirects to the main page, or back to the login page.
|
||||
: @param $name user name
|
||||
|
|
|
|||
|
|
@ -13,10 +13,8 @@
|
|||
<br/>
|
||||
<table>
|
||||
<tr v-for="(item, row) in grid">
|
||||
<td v-for="(cell,col) in item" style="width:50px;height:50px;" >
|
||||
<v-btn @click="click(row,col)" :disabled="disabled(row,col)">
|
||||
<td v-for="(cell,col) in item" style="width:50px;height:50px;" @click="click(row,col)">
|
||||
<img :src="src(row,col)" style="width:50px;height:50px;"/>
|
||||
</v-btn>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
@ -39,6 +37,7 @@
|
|||
},
|
||||
methods: {
|
||||
click(row,col) {
|
||||
if(this.disabled(row,col))return;
|
||||
var g=this.grid
|
||||
var h=g[row][col]
|
||||
g[row][col]=null
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<template id="settings">
|
||||
<template id="acesettings">
|
||||
<v-layout row>
|
||||
<v-flex xs12 sm6 offset-sm3>
|
||||
<v-card>
|
||||
|
|
@ -97,7 +97,7 @@
|
|||
fontsize: "14px"
|
||||
|
||||
},
|
||||
keybindings:[ 'Ace', 'Vim', 'Emacs' ]
|
||||
keybindings:[ 'ace', 'vim', 'emacs', 'textarea', 'sublime' ]
|
||||
}
|
||||
},
|
||||
|
||||
38
src/vue-poc/features/settings/settings.vue
Normal file
38
src/vue-poc/features/settings/settings.vue
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<!DOCTYPE html>
|
||||
<template id="settings">
|
||||
<v-container fluid>
|
||||
<v-card>
|
||||
<v-card-text>
|
||||
<router-link to="/acesettings">Editor settings</router-link>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
<v-card>
|
||||
<v-card-title>System information</v-card-title>
|
||||
<v-card-text></v-card-text>
|
||||
<v-card-actions>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn @click="wipe" error>Wipe</v-btn></v-card-actions>
|
||||
</v-card>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<script>{
|
||||
data:function(){return {
|
||||
keys:[]
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
wipe(){
|
||||
alert("wipe")
|
||||
}
|
||||
},
|
||||
created:function(){
|
||||
console.log("settings")
|
||||
settings.length()
|
||||
.then(k=>{
|
||||
console.log("length:",k)
|
||||
this.keys=k;
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -7,6 +7,7 @@
|
|||
<v-icon>menu</v-icon>
|
||||
</v-btn>
|
||||
<v-card-title>Page Title</v-card-title>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon light>
|
||||
<v-icon>search</v-icon>
|
||||
</v-btn>
|
||||
|
|
@ -15,7 +16,7 @@
|
|||
</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
<v-tabs-bar slot="activators">
|
||||
<v-tabs-bar slot="activators" class="green">
|
||||
<v-tabs-slider></v-tabs-slider>
|
||||
<v-tabs-item
|
||||
v-for="i in 13"
|
||||
|
|
|
|||
|
|
@ -1,215 +0,0 @@
|
|||
(:~
|
||||
: generate xquery access code for entity definitions
|
||||
:)
|
||||
module namespace bf = 'quodatum.tools.buildfields';
|
||||
declare default function namespace 'quodatum.tools.buildfields';
|
||||
declare namespace ent="https://github.com/Quodatum/app-doc/entity";
|
||||
|
||||
(:~
|
||||
: write generated xquery module from entity xml
|
||||
: @param efolder full path to folder with entities e.g. fn:resolve-uri("./data/models")
|
||||
: @param dest full name of xqm to create e.g. fn:resolve-uri("models.xqm")
|
||||
:)
|
||||
declare %updating function write($efolder as xs:string,$dest as xs:string)
|
||||
{
|
||||
let $src:=bf:module(bf:sources($efolder))
|
||||
return file:write-text($dest,$src)
|
||||
};
|
||||
|
||||
(:~
|
||||
: generate xquery module for given entities as a string
|
||||
:)
|
||||
declare function module($entities as element(ent:entity)*) as xs:string
|
||||
{
|
||||
let $src:= <text>(: entity access maps
|
||||
: auto generated from xml files in entities folder at: {fn:current-dateTime()}
|
||||
:)
|
||||
|
||||
module namespace entity = 'quodatum.models.generated';
|
||||
{bf:build-modules($entities)}
|
||||
{bf:build-namespaces($entities)}
|
||||
{( bf:build-describe($entities))}
|
||||
|
||||
(:~ map of access functions for entity :)
|
||||
declare function entity:fields($entity as xs:string)
|
||||
as map(*){{
|
||||
$entity:list($entity)("access")
|
||||
}};
|
||||
</text>
|
||||
|
||||
return $src
|
||||
};
|
||||
|
||||
(:~
|
||||
: generate xquery for to return field value in the format: "name":function($_){}
|
||||
:)
|
||||
declare function accessfn($f as element(ent:field)) as xs:string
|
||||
{
|
||||
let $type:=$f/@type/fn:string()
|
||||
return <field>
|
||||
"{$f/@name/fn:string()}": function($_ as element()) as {$type} {{$_/{$f/ent:xpath } }}</field>
|
||||
};
|
||||
|
||||
declare function generate($e as element(ent:entity)) as xs:string
|
||||
{
|
||||
let $fields:=for $field in $e/ent:fields/ent:field
|
||||
order by $field/@name
|
||||
return $field
|
||||
|
||||
let $filter:=$e/ent:views/ent:view[@name="filter"]=>fn:tokenize()
|
||||
let $filter:= $e/ent:fields/ent:field[@name=$filter]/ent:xpath/fn:concat("$item/",.)
|
||||
|
||||
return <field>
|
||||
"{$e/@name/fn:string()}": map{{
|
||||
"name": "{ $e/@name/fn:string()}",
|
||||
"description": "{ escape($e/ent:description)}",
|
||||
"access": map{{ {$fields!accessfn(.)=>fn:string-join(",")} }},
|
||||
|
||||
"filter": function($item,$q) as xs:boolean{{
|
||||
some $e in ( {fn:string-join($filter,", ")}) satisfies
|
||||
fn:contains($e,$q, 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive')
|
||||
}},
|
||||
"json": map{{ {$fields!jsonfn(.)=>fn:string-join(",")} }},
|
||||
|
||||
"data": function() as {$e/ent:data/@type/fn:string(.)}*
|
||||
{{ {let $a:=$e/ent:data/fn:string() return if($a)then $a else "()"} }},
|
||||
|
||||
"views": map{{
|
||||
{$e/ent:views/ent:view!("'" || @name || "': '" ||. || "'")=>fn:string-join(',')}
|
||||
}}
|
||||
}}</field>
|
||||
};
|
||||
|
||||
(:~
|
||||
: @return sequence of element(entity) items for definitions at path
|
||||
:)
|
||||
declare function sources($path as xs:string) as element(ent:entity)*
|
||||
{
|
||||
let $_:=fn:trace($path,"DD")
|
||||
let $p:=fn:resolve-uri($path) || "/"
|
||||
return for $f in file:list($p)
|
||||
order by $f
|
||||
return fn:doc(fn:concat($p,$f))/ent:entity
|
||||
};
|
||||
|
||||
(:map for entity :)
|
||||
declare function build-map($entity as element(ent:entity)) as xs:string
|
||||
{
|
||||
let $m:=for $field in $entity/ent:fields/ent:field
|
||||
order by $field/@name
|
||||
return accessfn($field)
|
||||
return <text>
|
||||
declare variable $entity:{$entity/@name/fn:string()}: map{{ {fn:string-join($m,",")}
|
||||
}};
|
||||
|
||||
</text>
|
||||
};
|
||||
|
||||
(:~
|
||||
: return xml for suitable json serialization for field
|
||||
:)
|
||||
declare function jsonfn($f as element(ent:field))
|
||||
as xs:string
|
||||
{
|
||||
let $name:=$f/@name/fn:string()
|
||||
let $type:=$f/@type/fn:string()
|
||||
let $opt:=fn:contains($type,"?")
|
||||
let $repeat:=fn:contains($type,"*")
|
||||
let $json-type:=json-type($type)
|
||||
let $mult:=if($repeat) then "*" else "?"
|
||||
|
||||
let $at:=if($json-type ne "string")
|
||||
then "attribute type {'" || $json-type || "'},"
|
||||
else ""
|
||||
(: generate json xml :)
|
||||
let $simple:=function() as xs:string{
|
||||
<field>(: {$type} :)
|
||||
fn:data($_/{$f/ent:xpath })!element {$name} {{ {$at} .}}
|
||||
</field>
|
||||
}
|
||||
let $array:=function() as xs:string{
|
||||
<field>(: array of strings :)
|
||||
element {$name} {{
|
||||
attribute type {{"array"}},
|
||||
$_/{$f/ent:xpath }!element _ {{ attribute type {{"string"}}, .}}
|
||||
}}
|
||||
</field>
|
||||
}
|
||||
(: serialize when element :)
|
||||
let $element:=function() as xs:string{
|
||||
<field>element {$name} {{
|
||||
attribute type {{"string"}},
|
||||
fn:serialize($_/{$f/ent:xpath})}}</field>
|
||||
}
|
||||
|
||||
return <field>
|
||||
"{$name}": function($_ as element()) as element({$name}){$mult} {{
|
||||
{if($repeat)then
|
||||
$array()
|
||||
else if($type="element()") then
|
||||
$element()
|
||||
else $simple()} }}</field>
|
||||
};
|
||||
|
||||
|
||||
(:~ convert xs type to json
|
||||
:)
|
||||
declare function json-type($xsd as xs:string) as xs:string{
|
||||
switch ($xsd)
|
||||
case "element()" return "string"
|
||||
case "xs:boolean" return "boolean"
|
||||
case "xs:integer" return "number"
|
||||
case "xs:float" return "number"
|
||||
case "xs:double" return "number"
|
||||
case "xs:string*" return "array"
|
||||
default return "string"
|
||||
};
|
||||
|
||||
(:~ declare any namespaces found :)
|
||||
declare function build-namespaces($entities as element()*){
|
||||
for $n in distinct-deep($entities/ent:namespace)
|
||||
return
|
||||
<text>declare namespace {$n/@prefix/fn:string()}='{$n/@uri/fn:string()}';
|
||||
</text>
|
||||
};
|
||||
(:~ declare any namespaces found :)
|
||||
declare function build-modules($entities as element()*){
|
||||
for $n in distinct-deep($entities/ent:module)
|
||||
return
|
||||
<text>import module namespace {$n/@prefix/fn:string()}='{$n/@namespace/fn:string()}';
|
||||
</text>
|
||||
};
|
||||
|
||||
declare function build-describe($entities){
|
||||
let $m:=for $e in $entities
|
||||
return generate($e)
|
||||
return <text>
|
||||
declare variable $entity:list:=map {{ {fn:string-join($m,",")}
|
||||
}};
|
||||
|
||||
</text>
|
||||
};
|
||||
|
||||
declare function escape($str as xs:string)
|
||||
as xs:string{
|
||||
fn:replace(
|
||||
fn:replace($str,'"','""'),
|
||||
"'","''")
|
||||
};
|
||||
|
||||
(:-----from functx-------------------:)
|
||||
|
||||
declare function distinct-deep
|
||||
( $nodes as node()* ) as node()* {
|
||||
|
||||
for $seq in (1 to fn:count($nodes))
|
||||
return $nodes[$seq][fn:not(is-node-in-sequence-deep-equal(
|
||||
.,$nodes[fn:position() < $seq]))]
|
||||
};
|
||||
|
||||
declare function is-node-in-sequence-deep-equal
|
||||
( $node as node()? ,
|
||||
$seq as node()* ) as xs:boolean {
|
||||
|
||||
some $nodeInSeq in $seq satisfies fn:deep-equal($nodeInSeq,$node)
|
||||
} ;
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
:)
|
||||
module namespace vue-api = 'quodatum:vue.api';
|
||||
|
||||
import module namespace bf = 'quodatum.tools.buildfields' at "entity-gen.xqm";
|
||||
import module namespace bf = 'quodatum.tools.buildfields' at "./../../../lib/entity-gen.xqm";
|
||||
|
||||
(:~
|
||||
: Returns a file content.
|
||||
|
|
@ -19,9 +19,13 @@ declare
|
|||
%output:method("json")
|
||||
%updating
|
||||
function vue-api:model($efolder ,$target )
|
||||
{(
|
||||
{
|
||||
let $config:='import module namespace cfg = "quodatum:media.image.configure" at "features/images/config.xqm";'
|
||||
let $src:=bf:module(bf:entities($efolder),$config)
|
||||
return (
|
||||
prof:variables(),
|
||||
bf:write($efolder,$target),
|
||||
file:write-text($target,$src),
|
||||
db:output(<json type="object"><msg>Updated: {$target}</msg></json>)
|
||||
)};
|
||||
)
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
this.waiting=false
|
||||
this.alert={msg:error.response.data,success:false,error:true}
|
||||
console.log(error);
|
||||
alert("bad")
|
||||
});
|
||||
}
|
||||
},
|
||||
|
|
|
|||
224
src/vue-poc/features/vue-poc.vue
Normal file
224
src/vue-poc/features/vue-poc.vue
Normal file
|
|
@ -0,0 +1,224 @@
|
|||
<!DOCTYPE html>
|
||||
<template id="vuepoc">
|
||||
<v-app >
|
||||
<v-navigation-drawer persistent light :mini-variant.sync="mini" v-model="drawer"
|
||||
:disable-route-watcher="true" height="100%" class="grey lighten-4 pb-0">
|
||||
<v-list class="pa-0">
|
||||
|
||||
<v-list-tile avatar tag="div">
|
||||
<v-list-tile-avatar >
|
||||
<v-btn icon @click="session">
|
||||
<img src="/vue-poc/ui/quodatum.gif" />
|
||||
</v-btn>
|
||||
</v-list-tile-avatar>
|
||||
<v-list-tile-content>
|
||||
<v-list-tile-title>Vue PoC</v-list-tile-title>
|
||||
</v-list-tile-content>
|
||||
<v-list-tile-action>
|
||||
<v-btn icon @click.stop="mini = !mini">
|
||||
<v-icon>chevron_left</v-icon>
|
||||
</v-btn>
|
||||
</v-list-tile-action>
|
||||
</v-list-tile>
|
||||
|
||||
</v-list>
|
||||
<qd-navlist :items="items"></qd-navlist>
|
||||
</v-navigation-drawer>
|
||||
|
||||
<v-toolbar class="indigo" dark >
|
||||
<v-toolbar-side-icon @click.stop="drawer = !drawer" ></v-toolbar-side-icon>
|
||||
<v-toolbar-title class="hidden-sm-and-down" >{{$route.meta.title}}</v-toolbar-title>
|
||||
<v-spacer></v-spacer>
|
||||
<v-text-field prepend-icon="search" label="Search..." v-model="q"
|
||||
hide-details single-line dark @keyup.enter="search"></v-text-field>
|
||||
<v-menu left transition="v-fade-transition">
|
||||
<v-btn dark icon slot="activator">
|
||||
{{$auth.user}}
|
||||
</v-btn>
|
||||
|
||||
<v-list>
|
||||
|
||||
<v-list-tile @click="logout()">
|
||||
<v-list-tile-title >logout</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile>
|
||||
<v-list-tile-title >permission: {{$auth.permission}}</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-btn icon @click="fullscreen" :disabled="!fullscreenEnabled">
|
||||
<v-icon>{{ fullscreenIcon }}</v-icon>
|
||||
</v-btn>
|
||||
<qd-fullscreen></qd-fullscreen>
|
||||
</v-toolbar>
|
||||
<main>
|
||||
<v-alert error value="true" dismissible v-model="alert.show">
|
||||
<pre style="overflow:auto;">{{ alert.msg }}</pre>
|
||||
</v-alert>
|
||||
<transition name="fade" mode="out-in">
|
||||
<router-view class="view ma-3"></router-view>
|
||||
</transition>
|
||||
</main>
|
||||
</v-app>
|
||||
|
||||
</template>
|
||||
|
||||
<script>{
|
||||
// router,
|
||||
data:function(){return {
|
||||
q:"",
|
||||
status:{},
|
||||
drawer:true,
|
||||
mini: false,
|
||||
alert:{show:false,msg:"Hello"},
|
||||
items:[
|
||||
{href: '/',text: 'Home', icon: 'home' },
|
||||
{
|
||||
icon: 'folder_open',
|
||||
text: 'Collections' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/database', text: 'Databases',icon: 'developer_mode' },
|
||||
{href: '/files', text: 'File system',icon: 'folder' },
|
||||
{href: '/edit',text: 'Edit',icon: 'mode_edit'},
|
||||
{href: '/history',text: 'history',icon: 'history'}
|
||||
]},
|
||||
{
|
||||
icon: 'directions_run',
|
||||
text: 'Actions' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/eval',text: 'Query',icon: 'play_circle_outline'},
|
||||
{href: '/tasks',text: 'Tasks',icon: 'history'}
|
||||
]},
|
||||
{
|
||||
icon: 'cast_connected',
|
||||
text: 'Server' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/jobs',text: 'Running jobs',icon: 'dashboard'},
|
||||
{href: '/logs',text: 'Server logs',icon: 'dns'},
|
||||
{href: '/ping',text: 'Ping',icon: 'update'}
|
||||
]},
|
||||
{
|
||||
icon: 'camera_roll',
|
||||
text: 'Images' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/images/item',text: 'Collection',icon: 'photo_camera'},
|
||||
{href: '/images/keywords',text: 'Keywords',icon: 'label'},
|
||||
{href: '/images/dates',text: 'Date taken',icon: 'date_range'},
|
||||
{href: '/images/thumbnail',text: 'Thumbnail',icon: 'touch_app'},
|
||||
{href: '/images/report',text: 'Reports',icon: 'report'}
|
||||
]},
|
||||
{
|
||||
icon: 'more_horiz',
|
||||
text: 'More' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/session',text: 'Session',icon: 'person'},
|
||||
{href: '/select',text: 'Select',icon: 'extension'},
|
||||
{href: '/puzzle',text: 'Puzzle',icon: 'extension'},
|
||||
{href: '/tabs',text: 'Tabs',icon: 'switch_camera'},
|
||||
{href: '/timeline',text: 'Time line',icon: 'timelapse'}
|
||||
]},
|
||||
|
||||
{href: '/settings',text: 'Settings',icon: 'settings' },
|
||||
{href: '/about',text: 'About', icon: 'help' },
|
||||
]
|
||||
|
||||
}},
|
||||
methods: {
|
||||
session(){
|
||||
this.$router.push({path: '/session'})
|
||||
},
|
||||
search(){
|
||||
this.$router.push({path: '/search',query: { q: this.q }})
|
||||
},
|
||||
logout(){
|
||||
HTTP.get("logout").then(r=>{
|
||||
alert("logout")
|
||||
})
|
||||
},
|
||||
showAlert(msg){
|
||||
this.alert.msg=moment().format()+" "+ msg
|
||||
this.alert.show=true
|
||||
},
|
||||
fullscreenEnabled(){
|
||||
return document.fullscreenEnabled
|
||||
},
|
||||
isInFullScreen(){
|
||||
return (document.fullscreenElement && document.fullscreenElement !== null) ||
|
||||
(document.webkitFullscreenElement && document.webkitFullscreenElement !== null) ||
|
||||
(document.mozFullScreenElement && document.mozFullScreenElement !== null) ||
|
||||
(document.msFullscreenElement && document.msFullscreenElement !== null)
|
||||
},
|
||||
fullscreen(){
|
||||
// https://stackoverflow.com/questions/36672561/how-to-exit-fullscreen-onclick-using-javascript
|
||||
var isInFullScreen = this.isInFullScreen();
|
||||
alert(isInFullScreen);
|
||||
var docElm = document.documentElement;
|
||||
if (!isInFullScreen) {
|
||||
if (docElm.requestFullscreen) {
|
||||
docElm.requestFullscreen();
|
||||
} else if (docElm.mozRequestFullScreen) {
|
||||
docElm.mozRequestFullScreen();
|
||||
} else if (docElm.webkitRequestFullScreen) {
|
||||
docElm.webkitRequestFullScreen();
|
||||
} else if (docElm.msRequestFullscreen) {
|
||||
docElm.msRequestFullscreen();
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
fullscreenIcon(){ return this.isInFullScreen()?'fullscreen_exit':'fullscreen'}
|
||||
},
|
||||
|
||||
created(){
|
||||
|
||||
console.log("create-----------")
|
||||
Vue.config.errorHandler = function (err, vm, info) {
|
||||
// handle error
|
||||
// `info` is a Vue-specific error info, e.g. which lifecycle hook
|
||||
console.error(err, vm, info);
|
||||
this.showAlert("vue error:\n"+err)
|
||||
alert("vue error");
|
||||
};
|
||||
// Add a response interceptor
|
||||
|
||||
HTTP.interceptors.response.use(
|
||||
(response)=> {
|
||||
// Do something with response data
|
||||
return response;
|
||||
},
|
||||
(error) =>{
|
||||
// interupt restxq single
|
||||
if(460 != error.response.status)this.showAlert("http error:\n"+error.response.data)
|
||||
return Promise.reject(error);
|
||||
});
|
||||
|
||||
HTTP.get("status")
|
||||
.then(r=>{
|
||||
console.log("status",r.data)
|
||||
Object.assign(Auth,r.data)
|
||||
this.$forceUpdate()
|
||||
})
|
||||
},
|
||||
beforeDestroy(){
|
||||
console.log("destory-----------")
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
(: entity access maps
|
||||
: auto generated from xml files in entities folder at: 2017-08-25T21:59:02.677+01:00
|
||||
: auto generated from xml files in entities folder at: 2017-08-31T11:04:08.727+01:00
|
||||
:)
|
||||
|
||||
module namespace entity = 'quodatum.models.generated';
|
||||
|
|
@ -102,20 +102,36 @@ declare variable $entity:list:=map {
|
|||
"name": "thumbnail",
|
||||
"description": "an image.",
|
||||
"access": map{
|
||||
"geo": function($_ as element()) as xs:boolean {$_/geo },
|
||||
"height": function($_ as element()) as xs:integer {$_/height },
|
||||
"id": function($_ as element()) as xs:integer {$_/db:node-id(.) },
|
||||
"keywords": function($_ as element()) as xs:integer {$_/0 },
|
||||
"name": function($_ as element()) as xs:string {$_/file/@name },
|
||||
"path": function($_ as element()) as xs:string {$_/file/@path },
|
||||
"size": function($_ as element()) as xs:integer {$_/0 } },
|
||||
"size": function($_ as element()) as xs:integer {$_/0 },
|
||||
"width": function($_ as element()) as xs:integer {$_/width } },
|
||||
|
||||
"filter": function($item,$q) as xs:boolean{
|
||||
some $e in ( $item/file/@name) satisfies
|
||||
fn:contains($e,$q, 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive')
|
||||
},
|
||||
"json": map{
|
||||
"geo": function($_ as element()) as element(geo)? {
|
||||
(: xs:boolean :)
|
||||
fn:data($_/geo)!element geo { attribute type {'boolean'}, .}
|
||||
},
|
||||
"height": function($_ as element()) as element(height)? {
|
||||
(: xs:integer :)
|
||||
fn:data($_/height)!element height { attribute type {'number'}, .}
|
||||
},
|
||||
"id": function($_ as element()) as element(id)? {
|
||||
(: xs:integer :)
|
||||
fn:data($_/db:node-id(.))!element id { attribute type {'number'}, .}
|
||||
},
|
||||
"keywords": function($_ as element()) as element(keywords)? {
|
||||
(: xs:integer :)
|
||||
fn:data($_/0)!element keywords { attribute type {'number'}, .}
|
||||
},
|
||||
"name": function($_ as element()) as element(name)? {
|
||||
(: xs:string :)
|
||||
fn:data($_/file/@name)!element name { .}
|
||||
|
|
@ -127,6 +143,10 @@ declare variable $entity:list:=map {
|
|||
"size": function($_ as element()) as element(size)? {
|
||||
(: xs:integer :)
|
||||
fn:data($_/0)!element size { attribute type {'number'}, .}
|
||||
},
|
||||
"width": function($_ as element()) as element(width)? {
|
||||
(: xs:integer :)
|
||||
fn:data($_/width)!element width { attribute type {'number'}, .}
|
||||
} },
|
||||
|
||||
"data": function() as element(image)*
|
||||
|
|
|
|||
|
|
@ -19,6 +19,22 @@
|
|||
<field name="size" type="xs:integer">
|
||||
<description>file size.</description>
|
||||
<xpath>0</xpath>
|
||||
</field>
|
||||
<field name="keywords" type="xs:integer">
|
||||
<description>Number of keywords</description>
|
||||
<xpath>0</xpath>
|
||||
</field>
|
||||
<field name="width" type="xs:integer">
|
||||
<description>width in pixels</description>
|
||||
<xpath>width</xpath>
|
||||
</field>
|
||||
<field name="height" type="xs:integer">
|
||||
<description>height in pixels</description>
|
||||
<xpath>height</xpath>
|
||||
</field>
|
||||
<field name="geo" type="xs:boolean">
|
||||
<description>has geo</description>
|
||||
<xpath>geo</xpath>
|
||||
</field>
|
||||
</fields>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,14 @@
|
|||
// generated 2017-08-27T21:21:39.471+01:00
|
||||
// generated 2017-09-02T22:16:55.583+01:00
|
||||
Vue.component('qd-fullscreen',{template:`
|
||||
<a onclick="fullscreen()" href="javascript:void(0);">fS</a>
|
||||
`,
|
||||
|
||||
created:function(){
|
||||
console.log("qd-fullscreen");
|
||||
}
|
||||
}
|
||||
|
||||
);
|
||||
Vue.component('qd-link',{template:`
|
||||
<a :href="href" :target="href"> {{href}}<v-icon>link</v-icon></a>
|
||||
`,
|
||||
|
|
@ -172,9 +182,14 @@ Vue.filter('round', function(value, decimals) {
|
|||
}
|
||||
|
||||
);
|
||||
const About=Vue.extend({template:` <v-layout class="ma-5"> <v-flex xs4=""> <v-card hover="" raised=""> <v-card-title height="200px" class="pa-5 indigo accent-3">
|
||||
<div class="display-1 white--text text-xs-center">VUE-POC</div>
|
||||
v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
|
||||
const About=Vue.extend({template:`
|
||||
<v-container>
|
||||
<v-parallax src="/vue-poc/ui/vue-poc.png">
|
||||
</v-parallax>
|
||||
<v-card>
|
||||
|
||||
<v-card-text>
|
||||
|
||||
<p>
|
||||
This is a experiment in using
|
||||
<code>vue.js</code>
|
||||
|
|
@ -189,7 +204,11 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
|
|||
<li><a href="/dba" target="new">DBA app</a></li>
|
||||
<li> <router-link to="database?url=%2Fvue-poc%2F">DB</router-link></li>
|
||||
</ul>
|
||||
</v-flex> <v-btn floating="floating"> <v-icon>add</v-icon> </v-btn> <qd-link href="/dba">REPLACED</qd-link> </v-layout> `,
|
||||
<v-btn floating="floating"> <v-icon>add</v-icon> </v-btn> <qd-link href="/dba">REPLACED</qd-link>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
`,
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -520,7 +539,7 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
|
|||
</v-btn>
|
||||
|
||||
|
||||
<v-btn icon="" @click="acecmd('foldall')" title="fold all">
|
||||
<v-btn icon="" @click="togglefold" title="fold toggle">
|
||||
<v-icon>vertical_align_center</v-icon>
|
||||
</v-btn>
|
||||
|
||||
|
|
@ -614,6 +633,7 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
|
|||
snackbar: false,
|
||||
message: "Cant do that",
|
||||
events: new Vue({}),
|
||||
folded: false, // toggle fold/unfold action
|
||||
mimemap:{
|
||||
"text/xml":"xml",
|
||||
"application/xml":"xml",
|
||||
|
|
@ -666,6 +686,10 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
|
|||
});
|
||||
|
||||
},
|
||||
togglefold(){
|
||||
this.folded=!this.folded
|
||||
this.acecmd(this.folded?"foldall":"unfoldall")
|
||||
},
|
||||
acecmd(cmd){
|
||||
//alert("acecmd: "+cmd)
|
||||
this.events.$emit('eventFired',cmd);
|
||||
|
|
@ -993,20 +1017,61 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
|
|||
<v-toolbar class="orange darken-1">
|
||||
<v-btn icon="" to="./"><v-icon>arrow_back</v-icon></v-btn>
|
||||
<v-card-title>
|
||||
<v-chip>todo</v-chip>
|
||||
<v-chip>Images by year and month</v-chip>
|
||||
</v-card-title>
|
||||
|
||||
<v-spacer></v-spacer>
|
||||
|
||||
</v-toolbar>
|
||||
<v-card-text>
|
||||
dates todo
|
||||
</v-card-text>
|
||||
<v-progress-linear v-if="busy" v-bind:indeterminate="true"></v-progress-linear>
|
||||
<v-container v-if="!busy" fluid="">
|
||||
<v-layout v-for="year in items" :key="year.year">
|
||||
<v-flex v-text="year.year"></v-flex>
|
||||
<v-flex v-for="(m,i) in year.months" :key="i"><v-btn icon="" primary="" :disabled="0==m" @click="go(year.year,i)">{{m}}</v-btn></v-flex>
|
||||
</v-layout>
|
||||
</v-container>
|
||||
<v-layout>
|
||||
</v-layout></v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
`,
|
||||
|
||||
data: ()=>({
|
||||
busy: false,
|
||||
total: 0,
|
||||
items: [],
|
||||
elapsed: null,
|
||||
months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
||||
}),
|
||||
|
||||
methods:{
|
||||
getDatetaken(){
|
||||
this.busy=true
|
||||
var t0 = performance.now();
|
||||
HTTP.get("images/datetaken")
|
||||
.then(r=>{
|
||||
this.busy=false
|
||||
this.total=r.data.total
|
||||
this.items=r.data.items
|
||||
var t1 = performance.now();
|
||||
this.elapsed= 0.001 *(t1 - t0)
|
||||
})
|
||||
},
|
||||
go(year,month){
|
||||
|
||||
month=("0" + (1+month)).slice(-2)
|
||||
// alert("year: "+year+" "+month)
|
||||
var from=year + "-" + month + "-01"
|
||||
var lastday=new Date(year, month, 0).getDate()
|
||||
var until=year + "-" + month + "-"+ lastday
|
||||
this.$router.push({ name: 'images', query: { from:from, until:until }})
|
||||
}
|
||||
},
|
||||
created:function(){
|
||||
console.log("create datetaken")
|
||||
this.getDatetaken()
|
||||
}
|
||||
}
|
||||
|
||||
);
|
||||
|
|
@ -1079,20 +1144,20 @@ dates todo
|
|||
<v-chip class="primary white--text">{{ total }} in {{ elapsed | round(2) }} secs </v-chip>
|
||||
|
||||
Page:{{ query.page+1 }}
|
||||
<v-btn @click.stop="query.page=Math.min(0,query.page-1)" :disabled="query.page==0" icon="" primary="">
|
||||
<v-btn @click.stop="pageBack()" :disabled="query.page==0" icon="" primary="">
|
||||
<v-icon>arrow_back</v-icon>
|
||||
</v-btn>
|
||||
<v-btn @click.stop="query.page+=1" icon="" primary="">
|
||||
<v-btn @click.stop="pageNext()" icon="" primary="">
|
||||
<v-icon>arrow_forward</v-icon>
|
||||
</v-btn>
|
||||
</span>
|
||||
</v-toolbar>
|
||||
<v-progress-linear v-if="busy" v-bind:indeterminate="true"></v-progress-linear>
|
||||
<v-container v-if="!busy" fluid="" grid-list-md="">
|
||||
<v-layout row="" wrap="">
|
||||
<v-layout row="" wrap="" v-touch="{ left: () => pageNext(), right: () => pageBack()}">
|
||||
<v-flex height="80px" xs2="" v-for="image in images" :key="image.name">
|
||||
<v-card class="grey lighten-2 pt-1">
|
||||
<v-card-media :src="src(image)" @click="go(image)" height="80px" contain=""></v-card-media>
|
||||
<v-card-media :src="src(image)" @dblclick="go(image)" height="80px" contain=""></v-card-media>
|
||||
<v-card-actions v-tooltip:top="{ html: ' '+image.path }">
|
||||
|
||||
<v-btn icon="" small="">
|
||||
|
|
@ -1120,7 +1185,15 @@ dates todo
|
|||
</v-toolbar>
|
||||
|
||||
<v-card-text>
|
||||
<v-select v-bind:items="keywords" v-model="query.keyword" label="Keyword" autocomplete=""></v-select>
|
||||
<v-select v-bind:items="keywords" v-model="query.keyword" label="Keyword" item-value="text" item-text="text" autocomplete="">
|
||||
<template slot="item" scope="data">
|
||||
<v-list-tile-content>
|
||||
<v-list-tile-title v-html="data.item.text"></v-list-tile-title>
|
||||
<v-list-tile-sub-title v-html="data.item.count"></v-list-tile-sub-title>
|
||||
</v-list-tile-content>
|
||||
</template>
|
||||
</v-select>
|
||||
|
||||
<v-btn @click="query.keyword=null" :disabled="!query.keyword">
|
||||
<v-icon>close</v-icon>Clear keyword
|
||||
</v-btn>
|
||||
|
|
@ -1226,6 +1299,12 @@ dates todo
|
|||
},
|
||||
go(image){
|
||||
this.$router.push({ name: 'image', params: { id: image.id }})
|
||||
},
|
||||
pageBack(){
|
||||
this.query.page=Math.min(0,this.query.page-1)
|
||||
},
|
||||
pageNext(){
|
||||
this.query.page+=1
|
||||
}
|
||||
|
||||
},
|
||||
|
|
@ -1253,7 +1332,7 @@ dates todo
|
|||
|
||||
showFilter(){
|
||||
if(this.keywords.length==0){
|
||||
HTTP.get("images/keywords")
|
||||
HTTP.get("images/keywords2")
|
||||
.then(r=>{
|
||||
this.keywords=r.data.items
|
||||
})
|
||||
|
|
@ -1305,22 +1384,61 @@ body
|
|||
<v-toolbar class="orange darken-1">
|
||||
<v-btn icon="" to="./"><v-icon>arrow_back</v-icon></v-btn>
|
||||
<v-card-title>
|
||||
<v-chip>todo</v-chip>
|
||||
<v-chip>click to show</v-chip>
|
||||
</v-card-title>
|
||||
|
||||
<v-spacer></v-spacer>
|
||||
|
||||
</v-toolbar>
|
||||
<v-card-text>
|
||||
keywords todo
|
||||
<v-progress-linear v-if="busy" v-bind:indeterminate="true"></v-progress-linear>
|
||||
<v-container v-if="!busy" fluid="" grid-list-md="">
|
||||
<v-layout row="" wrap="" v-touch="{ left: () => pageNext(), right: () => pageBack()}">
|
||||
<v-flex height="80px" xs3="" v-for="keyword in items" :key="keyword.text">
|
||||
<v-card class="grey lighten-2 pt-1" @click="show(keyword)">
|
||||
<v-toolbar>
|
||||
<v-card-title v-text="keyword.text"></v-card-title>
|
||||
<v-spacer></v-spacer>
|
||||
<v-chip>{{keyword.count}}</v-chip>
|
||||
</v-toolbar>
|
||||
</v-card>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
</v-container>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-container>
|
||||
`,
|
||||
|
||||
data: ()=>({
|
||||
busy: false,
|
||||
total: 0,
|
||||
items: [],
|
||||
elapsed: null
|
||||
}),
|
||||
|
||||
methods:{
|
||||
getKeywords(){
|
||||
this.busy=true
|
||||
var t0 = performance.now();
|
||||
HTTP.get("images/keywords2")
|
||||
.then(r=>{
|
||||
this.busy=false
|
||||
this.total=r.data.total
|
||||
this.items=r.data.items
|
||||
var t1 = performance.now();
|
||||
this.elapsed= 0.001 *(t1 - t0)
|
||||
})
|
||||
},
|
||||
show(keyword){
|
||||
this.$router.push({ name: 'images', query: { keyword: keyword.text }})
|
||||
}
|
||||
|
||||
},
|
||||
created:function(){
|
||||
console.log("create keywords")
|
||||
this.getKeywords()
|
||||
}
|
||||
}
|
||||
);
|
||||
const Job=Vue.extend({template:`
|
||||
<v-card>
|
||||
|
|
@ -1705,10 +1823,8 @@ keywords todo
|
|||
<br>
|
||||
<table>
|
||||
<tbody><tr v-for="(item, row) in grid">
|
||||
<td v-for="(cell,col) in item" style="width:50px;height:50px;">
|
||||
<v-btn @click="click(row,col)" :disabled="disabled(row,col)">
|
||||
<td v-for="(cell,col) in item" style="width:50px;height:50px;" @click="click(row,col)">
|
||||
<img :src="src(row,col)" style="width:50px;height:50px;">
|
||||
</v-btn>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
|
|
@ -1730,6 +1846,7 @@ keywords todo
|
|||
},
|
||||
methods: {
|
||||
click(row,col) {
|
||||
if(this.disabled(row,col))return;
|
||||
var g=this.grid
|
||||
var h=g[row][col]
|
||||
g[row][col]=null
|
||||
|
|
@ -1933,7 +2050,7 @@ keywords todo
|
|||
|
||||
|
||||
);
|
||||
const Settings=Vue.extend({template:`
|
||||
const Acesettings=Vue.extend({template:`
|
||||
<v-layout row="">
|
||||
<v-flex xs12="" sm6="" offset-sm3="">
|
||||
<v-card>
|
||||
|
|
@ -2020,7 +2137,7 @@ keywords todo
|
|||
fontsize: "14px"
|
||||
|
||||
},
|
||||
keybindings:[ 'Ace', 'Vim', 'Emacs' ]
|
||||
keybindings:[ 'ace', 'vim', 'emacs', 'textarea', 'sublime' ]
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -2043,6 +2160,43 @@ keywords todo
|
|||
}
|
||||
|
||||
|
||||
);
|
||||
const Settings=Vue.extend({template:`
|
||||
<v-container fluid="">
|
||||
<v-card>
|
||||
<v-card-text>
|
||||
<router-link to="/acesettings">Editor settings</router-link>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
<v-card>
|
||||
<v-card-title>System information</v-card-title>
|
||||
<v-card-text></v-card-text>
|
||||
<v-card-actions>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn @click="wipe" error="">Wipe</v-btn></v-card-actions>
|
||||
</v-card>
|
||||
</v-container>
|
||||
`,
|
||||
|
||||
data:function(){return {
|
||||
keys:[]
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
wipe(){
|
||||
alert("wipe")
|
||||
}
|
||||
},
|
||||
created:function(){
|
||||
console.log("settings")
|
||||
settings.length()
|
||||
.then(k=>{
|
||||
console.log("length:",k)
|
||||
this.keys=k;
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
);
|
||||
const Tabs=Vue.extend({template:`
|
||||
<v-tabs id="mobile-tabs-6" scroll-bars="" light="">
|
||||
|
|
@ -2052,6 +2206,7 @@ keywords todo
|
|||
<v-icon>menu</v-icon>
|
||||
</v-btn>
|
||||
<v-card-title>Page Title</v-card-title>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon="" light="">
|
||||
<v-icon>search</v-icon>
|
||||
</v-btn>
|
||||
|
|
@ -2060,7 +2215,7 @@ keywords todo
|
|||
</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
<v-tabs-bar slot="activators">
|
||||
<v-tabs-bar slot="activators" class="green">
|
||||
<v-tabs-slider></v-tabs-slider>
|
||||
<v-tabs-item v-for="i in 13" :key="i" :href="'#mobile-tabs-6-' + i">
|
||||
Item {{ i }}
|
||||
|
|
@ -2318,6 +2473,7 @@ keywords todo
|
|||
this.waiting=false
|
||||
this.alert={msg:error.response.data,success:false,error:true}
|
||||
console.log(error);
|
||||
alert("bad")
|
||||
});
|
||||
}
|
||||
},
|
||||
|
|
@ -2451,6 +2607,227 @@ created(){
|
|||
console.log("timeline")
|
||||
}
|
||||
}
|
||||
);
|
||||
const Vuepoc=Vue.extend({template:`
|
||||
<v-app>
|
||||
<v-navigation-drawer persistent="" light="" :mini-variant.sync="mini" v-model="drawer" :disable-route-watcher="true" height="100%" class="grey lighten-4 pb-0">
|
||||
<v-list class="pa-0">
|
||||
|
||||
<v-list-tile avatar="" tag="div">
|
||||
<v-list-tile-avatar>
|
||||
<v-btn icon="" @click="session">
|
||||
<img src="/vue-poc/ui/quodatum.gif">
|
||||
</v-btn>
|
||||
</v-list-tile-avatar>
|
||||
<v-list-tile-content>
|
||||
<v-list-tile-title>Vue PoC</v-list-tile-title>
|
||||
</v-list-tile-content>
|
||||
<v-list-tile-action>
|
||||
<v-btn icon="" @click.stop="mini = !mini">
|
||||
<v-icon>chevron_left</v-icon>
|
||||
</v-btn>
|
||||
</v-list-tile-action>
|
||||
</v-list-tile>
|
||||
|
||||
</v-list>
|
||||
<qd-navlist :items="items"></qd-navlist>
|
||||
</v-navigation-drawer>
|
||||
|
||||
<v-toolbar class="indigo" dark="">
|
||||
<v-toolbar-side-icon @click.stop="drawer = !drawer"></v-toolbar-side-icon>
|
||||
<v-toolbar-title class="hidden-sm-and-down">{{$route.meta.title}}</v-toolbar-title>
|
||||
<v-spacer></v-spacer>
|
||||
<v-text-field prepend-icon="search" label="Search..." v-model="q" hide-details="" single-line="" dark="" @keyup.enter="search"></v-text-field>
|
||||
<v-menu left="" transition="v-fade-transition">
|
||||
<v-btn dark="" icon="" slot="activator">
|
||||
{{$auth.user}}
|
||||
</v-btn>
|
||||
|
||||
<v-list>
|
||||
|
||||
<v-list-tile @click="logout()">
|
||||
<v-list-tile-title>logout</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile>
|
||||
<v-list-tile-title>permission: {{$auth.permission}}</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-btn icon="" @click="fullscreen" :disabled="!fullscreenEnabled">
|
||||
<v-icon>{{ fullscreenIcon }}</v-icon>
|
||||
</v-btn>
|
||||
<qd-fullscreen></qd-fullscreen>
|
||||
</v-toolbar>
|
||||
<main>
|
||||
<v-alert error="" value="true" dismissible="" v-model="alert.show">
|
||||
<pre style="overflow:auto;">{{ alert.msg }}</pre>
|
||||
</v-alert>
|
||||
<transition name="fade" mode="out-in">
|
||||
<router-view class="view ma-3"></router-view>
|
||||
</transition>
|
||||
</main>
|
||||
</v-app>
|
||||
|
||||
`,
|
||||
|
||||
// router,
|
||||
data:function(){return {
|
||||
q:"",
|
||||
status:{},
|
||||
drawer:true,
|
||||
mini: false,
|
||||
alert:{show:false,msg:"Hello"},
|
||||
items:[
|
||||
{href: '/',text: 'Home', icon: 'home' },
|
||||
{
|
||||
icon: 'folder_open',
|
||||
text: 'Collections' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/database', text: 'Databases',icon: 'developer_mode' },
|
||||
{href: '/files', text: 'File system',icon: 'folder' },
|
||||
{href: '/edit',text: 'Edit',icon: 'mode_edit'},
|
||||
{href: '/history',text: 'history',icon: 'history'}
|
||||
]},
|
||||
{
|
||||
icon: 'directions_run',
|
||||
text: 'Actions' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/eval',text: 'Query',icon: 'play_circle_outline'},
|
||||
{href: '/tasks',text: 'Tasks',icon: 'history'}
|
||||
]},
|
||||
{
|
||||
icon: 'cast_connected',
|
||||
text: 'Server' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/jobs',text: 'Running jobs',icon: 'dashboard'},
|
||||
{href: '/logs',text: 'Server logs',icon: 'dns'},
|
||||
{href: '/ping',text: 'Ping',icon: 'update'}
|
||||
]},
|
||||
{
|
||||
icon: 'camera_roll',
|
||||
text: 'Images' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/images/item',text: 'Collection',icon: 'photo_camera'},
|
||||
{href: '/images/keywords',text: 'Keywords',icon: 'label'},
|
||||
{href: '/images/dates',text: 'Date taken',icon: 'date_range'},
|
||||
{href: '/images/thumbnail',text: 'Thumbnail',icon: 'touch_app'},
|
||||
{href: '/images/report',text: 'Reports',icon: 'report'}
|
||||
]},
|
||||
{
|
||||
icon: 'more_horiz',
|
||||
text: 'More' ,
|
||||
model: false,
|
||||
children: [
|
||||
{href: '/session',text: 'Session',icon: 'person'},
|
||||
{href: '/select',text: 'Select',icon: 'extension'},
|
||||
{href: '/puzzle',text: 'Puzzle',icon: 'extension'},
|
||||
{href: '/tabs',text: 'Tabs',icon: 'switch_camera'},
|
||||
{href: '/timeline',text: 'Time line',icon: 'timelapse'}
|
||||
]},
|
||||
|
||||
{href: '/settings',text: 'Settings',icon: 'settings' },
|
||||
{href: '/about',text: 'About', icon: 'help' },
|
||||
]
|
||||
|
||||
}},
|
||||
methods: {
|
||||
session(){
|
||||
this.$router.push({path: '/session'})
|
||||
},
|
||||
search(){
|
||||
this.$router.push({path: '/search',query: { q: this.q }})
|
||||
},
|
||||
logout(){
|
||||
HTTP.get("logout").then(r=>{
|
||||
alert("logout")
|
||||
})
|
||||
},
|
||||
showAlert(msg){
|
||||
this.alert.msg=moment().format()+" "+ msg
|
||||
this.alert.show=true
|
||||
},
|
||||
fullscreenEnabled(){
|
||||
return document.fullscreenEnabled
|
||||
},
|
||||
isInFullScreen(){
|
||||
return (document.fullscreenElement && document.fullscreenElement !== null) ||
|
||||
(document.webkitFullscreenElement && document.webkitFullscreenElement !== null) ||
|
||||
(document.mozFullScreenElement && document.mozFullScreenElement !== null) ||
|
||||
(document.msFullscreenElement && document.msFullscreenElement !== null)
|
||||
},
|
||||
fullscreen(){
|
||||
// https://stackoverflow.com/questions/36672561/how-to-exit-fullscreen-onclick-using-javascript
|
||||
var isInFullScreen = this.isInFullScreen();
|
||||
alert(isInFullScreen);
|
||||
var docElm = document.documentElement;
|
||||
if (!isInFullScreen) {
|
||||
if (docElm.requestFullscreen) {
|
||||
docElm.requestFullscreen();
|
||||
} else if (docElm.mozRequestFullScreen) {
|
||||
docElm.mozRequestFullScreen();
|
||||
} else if (docElm.webkitRequestFullScreen) {
|
||||
docElm.webkitRequestFullScreen();
|
||||
} else if (docElm.msRequestFullscreen) {
|
||||
docElm.msRequestFullscreen();
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
fullscreenIcon(){ return this.isInFullScreen()?'fullscreen_exit':'fullscreen'}
|
||||
},
|
||||
|
||||
created(){
|
||||
|
||||
console.log("create-----------")
|
||||
Vue.config.errorHandler = function (err, vm, info) {
|
||||
// handle error
|
||||
// `info` is a Vue-specific error info, e.g. which lifecycle hook
|
||||
console.error(err, vm, info);
|
||||
this.showAlert("vue error:\n"+err)
|
||||
alert("vue error");
|
||||
};
|
||||
// Add a response interceptor
|
||||
|
||||
HTTP.interceptors.response.use(
|
||||
(response)=> {
|
||||
// Do something with response data
|
||||
return response;
|
||||
},
|
||||
(error) =>{
|
||||
// interupt restxq single
|
||||
if(460 != error.response.status)this.showAlert("http error:\n"+error.response.data)
|
||||
return Promise.reject(error);
|
||||
});
|
||||
|
||||
HTTP.get("status")
|
||||
.then(r=>{
|
||||
console.log("status",r.data)
|
||||
Object.assign(Auth,r.data)
|
||||
this.$forceUpdate()
|
||||
})
|
||||
},
|
||||
beforeDestroy(){
|
||||
console.log("destory-----------")
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
);
|
||||
// base -----------------------
|
||||
localforage.config({
|
||||
|
|
@ -2492,7 +2869,7 @@ var settings = {
|
|||
});
|
||||
});
|
||||
},
|
||||
setItem (key,value,callback) {
|
||||
setItem (key,value) {
|
||||
if (this.debug) console.log('setItem',key,value);
|
||||
return new Promise((resolve, reject) => {
|
||||
localforage.setItem(key, value)
|
||||
|
|
@ -2504,16 +2881,23 @@ var settings = {
|
|||
return new Promise((resolve, reject) => {reject(err);})
|
||||
});
|
||||
})
|
||||
},
|
||||
length(){
|
||||
return new Promise((resolve, reject) => {
|
||||
localforage.keys() // returns array of keys
|
||||
.then((value) => {
|
||||
console.log('length ',value);
|
||||
return new Promise((resolve, reject) => {resolve(value);})
|
||||
}).catch((err) => {
|
||||
console.log('length');
|
||||
return new Promise((resolve, reject) => {reject(err);})
|
||||
});
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
Vue.config.errorHandler = function (err, vm, info) {
|
||||
// handle error
|
||||
// `info` is a Vue-specific error info, e.g. which lifecycle hook
|
||||
console.error(err, vm, info);
|
||||
alert("vue error");
|
||||
};
|
||||
|
||||
|
||||
|
||||
//Returns a function, that, as long as it continues to be invoked, will not
|
||||
//be triggered. The function will be called after it stops being called for
|
||||
//N milliseconds. If `immediate` is passed, trigger the function on the
|
||||
|
|
@ -2531,19 +2915,50 @@ function debounce(func, wait, immediate) {
|
|||
};
|
||||
};
|
||||
|
||||
// https://stackoverflow.com/questions/36672561/how-to-exit-fullscreen-onclick-using-javascript
|
||||
function fullscreen() {
|
||||
var isInFullScreen = (document.fullscreenElement && document.fullscreenElement !== null) ||
|
||||
(document.webkitFullscreenElement && document.webkitFullscreenElement !== null) ||
|
||||
(document.mozFullScreenElement && document.mozFullScreenElement !== null) ||
|
||||
(document.msFullscreenElement && document.msFullscreenElement !== null);
|
||||
|
||||
var docElm = document.documentElement;
|
||||
if (!isInFullScreen) {
|
||||
if (docElm.requestFullscreen) {
|
||||
docElm.requestFullscreen();
|
||||
} else if (docElm.mozRequestFullScreen) {
|
||||
docElm.mozRequestFullScreen();
|
||||
} else if (docElm.webkitRequestFullScreen) {
|
||||
docElm.webkitRequestFullScreen();
|
||||
} else if (docElm.msRequestFullscreen) {
|
||||
docElm.msRequestFullscreen();
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const router = new VueRouter({
|
||||
base:"/vue-poc/ui/",
|
||||
mode: 'history',
|
||||
routes: [
|
||||
{ path: '/', component: Home,meta:{title:"Home"} },
|
||||
{ path: '/session', component: Session ,meta:{title:"Session"}},
|
||||
{ path: '/images/item', component: Images, meta:{title:"Images"} },
|
||||
{ path: '/images/report', name:"image-reports",component: Report, props: true, meta:{title: "Image report"}},
|
||||
{ path: '/', component: Home, meta:{title:"Home"} },
|
||||
{ path: '/session', component: Session ,meta: {title:"Session"}},
|
||||
{path: '/images', redirect: '/images/item' },
|
||||
{ path: '/images/item', name:'images', component: Images, meta:{title: "Images"} },
|
||||
{ path: '/images/report', name:"image-reports", component: Report, props: true, meta:{title: "Image report"}},
|
||||
{ path: '/images/item/:id', name:"image",component: Image, props: true, meta:{title: "Image details"}},
|
||||
{ path: '/images/thumbnail', component: Thumbnail, meta:{title:"Thumbnail generator"} },
|
||||
{ path: '/images/keywords', component: Keywords, meta:{title:"Thumbnail keywords"} },
|
||||
{ path: '/images/dates', component: Dates, meta:{title:"Thumbnail dates"} },
|
||||
{ path: '/images/keywords', component: Keywords, meta:{title:"Image keywords"} },
|
||||
{ path: '/images/dates', component: Dates, meta:{title:"Image dates"} },
|
||||
{ path: '/select', component: Select, meta:{title:"Select"} },
|
||||
{ path: '/search', component: Search, meta:{title:"Search"} },
|
||||
{ path: '/tabs', component: Tabs,meta:{title:"tab test",requiresAuth: true} },
|
||||
|
|
@ -2554,6 +2969,7 @@ const router = new VueRouter({
|
|||
{ path: '/database', component: Files,meta:{title:"Databases"},props:{protocol:"basexdb"} },
|
||||
{ path: '/ping', component: Ping,meta:{title:"Ping"} },
|
||||
{ path: '/settings', component: Settings, meta:{title:"Settings"} },
|
||||
{ path: '/acesettings', component: Acesettings, meta:{title:"Editor settings"} },
|
||||
{ path: '/history', component: History, meta:{title:"File History"} },
|
||||
{ path: '/puzzle', component: Puzzle, meta:{title:"Jigsaw"} },
|
||||
{ path: '/eval', component: Eval, meta:{title:"Evaluate XQuery"} },
|
||||
|
|
@ -2591,6 +3007,7 @@ router.beforeEach((to, from, next) => {
|
|||
});
|
||||
|
||||
Vue.use(Vuetify);
|
||||
|
||||
const app = new Vue({
|
||||
router,
|
||||
data:function(){return {
|
||||
|
|
@ -2671,10 +3088,58 @@ const app = new Vue({
|
|||
showAlert(msg){
|
||||
this.alert.msg=moment().format()+" "+ msg
|
||||
this.alert.show=true
|
||||
},
|
||||
fullscreenEnabled(){
|
||||
return document.fullscreenEnabled
|
||||
},
|
||||
isInFullScreen(){
|
||||
return (document.fullscreenElement && document.fullscreenElement !== null) ||
|
||||
(document.webkitFullscreenElement && document.webkitFullscreenElement !== null) ||
|
||||
(document.mozFullScreenElement && document.mozFullScreenElement !== null) ||
|
||||
(document.msFullscreenElement && document.msFullscreenElement !== null)
|
||||
},
|
||||
fullscreen(){
|
||||
// https://stackoverflow.com/questions/36672561/how-to-exit-fullscreen-onclick-using-javascript
|
||||
var isInFullScreen = this.isInFullScreen();
|
||||
alert(isInFullScreen);
|
||||
var docElm = document.documentElement;
|
||||
if (!isInFullScreen) {
|
||||
if (docElm.requestFullscreen) {
|
||||
docElm.requestFullscreen();
|
||||
} else if (docElm.mozRequestFullScreen) {
|
||||
docElm.mozRequestFullScreen();
|
||||
} else if (docElm.webkitRequestFullScreen) {
|
||||
docElm.webkitRequestFullScreen();
|
||||
} else if (docElm.msRequestFullscreen) {
|
||||
docElm.msRequestFullscreen();
|
||||
}
|
||||
} else {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
fullscreenIcon(){ return this.isInFullScreen()?'fullscreen_exit':'fullscreen'}
|
||||
},
|
||||
|
||||
created(){
|
||||
|
||||
console.log("create-----------")
|
||||
Vue.config.errorHandler = function (err, vm, info) {
|
||||
// handle error
|
||||
// `info` is a Vue-specific error info, e.g. which lifecycle hook
|
||||
console.error(err, vm, info);
|
||||
this.showAlert("vue error:\n"+err)
|
||||
alert("vue error");
|
||||
};
|
||||
// Add a response interceptor
|
||||
|
||||
HTTP.interceptors.response.use(
|
||||
|
|
@ -2683,8 +3148,8 @@ const app = new Vue({
|
|||
return response;
|
||||
},
|
||||
(error) =>{
|
||||
// Do something with response error
|
||||
this.showAlert("http error:\n"+error.response.data)
|
||||
// interupt restxq single
|
||||
if(460 != error.response.status)this.showAlert("http error:\n"+error.response.data)
|
||||
return Promise.reject(error);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -83,6 +83,10 @@
|
|||
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-btn icon @click="fullscreen" :disabled="!fullscreenEnabled">
|
||||
<v-icon>{{ fullscreenIcon }}</v-icon>
|
||||
</v-btn>
|
||||
<qd-fullscreen></qd-fullscreen>
|
||||
</v-toolbar>
|
||||
<main>
|
||||
<v-alert error value="true" dismissible v-model="alert.show">
|
||||
|
|
|
|||
BIN
src/vue-poc/static/vue-poc.png
Normal file
BIN
src/vue-poc/static/vue-poc.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
200
src/vue-poc/static/vue-poc.svg
Normal file
200
src/vue-poc/static/vue-poc.svg
Normal file
|
|
@ -0,0 +1,200 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1000px"
|
||||
height="700px"
|
||||
viewBox="0 0 214.95504 163.40485"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
|
||||
sodipodi:docname="vue-poc.svg">
|
||||
<defs
|
||||
id="defs2">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6340">
|
||||
<stop
|
||||
style="stop-color:#aae418;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6336" />
|
||||
<stop
|
||||
style="stop-color:#aae418;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6338" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient6306"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#aae418;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6304" />
|
||||
</linearGradient>
|
||||
<style
|
||||
id="style4792">.cls-1{fill:#1697f6;}.cls-2{fill:#7bc6ff;}.cls-3{fill:#1867c0;}.cls-4{fill:#aeddff;}</style>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6340"
|
||||
id="linearGradient6342"
|
||||
x1="-1.6441965"
|
||||
y1="90.247025"
|
||||
x2="213.31087"
|
||||
y2="90.247025"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0000254,0,0,0.959177,-0.00268836,0.20964985)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.49497475"
|
||||
inkscape:cx="256.09065"
|
||||
inkscape:cy="432.63847"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="715"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(1.6441965,-5.0700892)"
|
||||
style="display:inline">
|
||||
<g
|
||||
id="g10"
|
||||
transform="matrix(0.34330717,-0.00308857,-0.00306839,-0.34556479,4.721666,171.7052)">
|
||||
<g
|
||||
id="g12"
|
||||
transform="translate(178.0626,235.0086)">
|
||||
<path
|
||||
d="M 0,0 -22.669,-39.264 -45.338,0 h -75.491 L -22.669,-170.017 75.491,0 Z"
|
||||
style="fill:#4dba87;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path14"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g16"
|
||||
transform="translate(178.0626,235.0086)">
|
||||
<path
|
||||
d="M 0,0 -22.669,-39.264 -45.338,0 H -81.565 L -22.669,-102.01 36.227,0 Z"
|
||||
style="fill:#435466;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<rect
|
||||
style="opacity:1;fill:url(#linearGradient6342);fill-opacity:1;fill-rule:nonzero;stroke:#004a00;stroke-width:0.25912979;stroke-opacity:1"
|
||||
id="rect4844"
|
||||
width="214.69592"
|
||||
height="163.14572"
|
||||
x="-1.5146316"
|
||||
y="5.1996541"
|
||||
rx="2.4568441"
|
||||
ry="2.4568441" />
|
||||
<g
|
||||
id="g4816"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,5.5302908,20.580775)">
|
||||
<polyline
|
||||
id="polyline4798"
|
||||
points="131.67 3 71.55 3 131.67 145.1"
|
||||
class="cls-1"
|
||||
style="fill:#1697f6" />
|
||||
<polyline
|
||||
id="polyline4800"
|
||||
points="131.67 186.81 131.67 297.1 3 45.89 70.4 45.89"
|
||||
class="cls-2"
|
||||
style="fill:#7bc6ff" />
|
||||
<polyline
|
||||
id="polyline4802"
|
||||
points="131.67 3 191.79 3 131.67 145.1"
|
||||
class="cls-3"
|
||||
style="fill:#1867c0" />
|
||||
<polyline
|
||||
id="polyline4804"
|
||||
points="131.67 186.81 131.67 297.1 260.34 45.89 192.94 45.89"
|
||||
class="cls-4"
|
||||
style="fill:#aeddff" />
|
||||
</g>
|
||||
<g
|
||||
id="g10-9"
|
||||
transform="matrix(1.9498076,0,0,-2.4535824,77.384423,332.0942)">
|
||||
<g
|
||||
id="g12-4"
|
||||
transform="scale(0.1)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 493.23291,1111.6167 c 3.47269,-0.9434 8.24049,-2.2912 12.31024,-4.7334 0,0 61.05511,66.7922 74.71754,80.5117 9.59708,9.6366 20.31366,18.0527 32.04878,25.0463 8.9078,5.3123 18.18878,9.4303 28.91852,9.1185 7.12976,-0.2106 20.70878,-0.1755 27.84731,-0.1844 5.58879,-0.01 13.06098,7.5338 13.06537,13.162 0.0176,16.1517 0.0132,32.3034 0,48.4595 -0.005,5.7337 -7.19122,12.9469 -12.9161,12.9513 H 418.50089 c -5.70732,0 -13.48112,-7.2615 -13.49473,-12.7317 -0.0413,-16.4459 -0.0294,-32.8961 0,-49.342 -0.0207,-6.8576 3.6079,-12.4156 11.59112,-12.4507 l 44.10482,-0.04 c 13.16985,0.07 13.92497,-10.8351 9.06058,-16.279 l -95.97553,-98.7581 -77.37804,94.6664 c -8.29843,11.1117 -2.19511,20.3707 4.93903,20.5771 l 39.32384,-0.08 c 9.07683,0 13.69361,6.3614 13.72785,13.2717 0.009,15.9585 0.007,31.9169 0.002,47.8755 -0.004,6.1376 -7.07926,13.2936 -13.17424,13.2849 -13.01794,-0.014 -26.03765,-0.08 -39.05779,-0.075 -80.17857,0.017 -166.10703,0.3599 -246.287348,0.3863 -6.124037,0 -14.37462,-7.1605 -14.378045,-13.263 -0.0069,-15.5678 0.133771,-31.456 0,-47.0238 0,-8.7234 5.60959,-14.2551 13.856704,-14.2595 8.61414,0 22.976554,-0.3951 31.591089,-0.4434 11.260094,-0.061 21.92707,-2.5859 32.50975,-6.5371 14.83945,-5.5405 22.95789,-14.9005 31.92716,-25.2966 10.53658,-12.2136 85.00081,-105.019 90.98251,-112.4666 l 5.82234,14.3144 c 0,0 -89.29534,111.898 -99.007,120.5073 -9.01185,7.9903 -20.59945,12.6395 -32.17915,16.3318 -11.93752,3.8062 -24.315807,4.7678 -36.764779,4.9697 -4.30595,0.07 -14.364171,0.2985 -18.672097,0.3205 -4.539467,0.017 -7.197627,2.6956 -7.202765,7.2746 -0.0137,12.2356 -0.01198,24.4757 0,36.7113 0.0034,4.7765 2.639283,7.4326 7.394838,7.4238 8.015442,-0.014 21.77973,-0.4127 29.793679,-0.4127 75.578904,-0.01 151.158244,0 226.737164,-0.014 5.87018,0 11.7439,-0.2854 17.60706,-0.1186 4.19664,0.1186 6.68503,-2.8756 6.71224,-6.0585 0.11503,-12.9205 0.0878,-25.8453 0.0224,-38.7659 -0.0189,-3.477 -1.79737,-6.6555 -6.41371,-6.6555 l -35.90252,-0.022 c -14.54093,0 -26.40995,-19.1371 -15.78249,-34.6215 11.09941,-13.917 88.59202,-110.793 88.59202,-110.793 18.58654,19.5757 104.14578,105.5116 107.49992,113.0452 6.65122,8.2712 5.15414,29.9811 -13.82048,32.5757 l -43.18638,-0.1801 c -4.03859,0.049 -6.85975,2.7659 -6.87512,6.7566 -0.0448,12.6308 -0.0396,25.2571 -0.002,37.8879 0.0101,3.9248 2.86902,6.7126 6.82024,6.7653 0,0 166.88103,0.061 239.22345,0 5.42195,0 7.61707,-2.1425 7.61707,-7.5337 0.005,-12.0424 0.009,-24.0848 0,-36.1273 -0.005,-4.8029 -2.58586,-7.3581 -7.33171,-7.4282 -6.54585,-0.1011 -19.55414,0.07 -26.05609,-0.5181 -5.01804,-0.461 -10.08878,-1.4664 -14.87853,-3.0204 -9.16244,-2.9811 -17.3239,-8.0299 -25.16926,-13.5747 -19.06683,-13.4737 -35.04731,-30.2883 -50.86974,-47.239 -13.47805,-14.4378 -50.42633,-54.4298 -52.86731,-57.1549"
|
||||
style="fill:#4f4c4c;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path14-9" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 197.92543,904.7538 102.12902,805.18442 C 93.926295,795.97369 84.6642,791.83369 73.870349,791.1273 l -13.133147,-0.062 c -6.271506,-0.45614 -7.423944,-4.68878 -7.425656,-9.64492 -0.0086,-12.13477 -0.0086,-22.55303 0.0017,-34.69135 0.0034,-4.78124 2.608418,-7.42399 7.341627,-7.42913 82.601937,-0.12173 234.101297,-0.0566 239.858227,0.0926 4.21507,0 6.58537,2.59471 6.58537,6.70372 0.0396,12.62708 0.0413,25.2525 0.002,37.88279 0.0443,4.15361 -2.32903,6.7759 -6.58712,6.8018 l -43.41555,0.003 c -20.96825,0 -31.59438,23.0198 -19.94444,39.92575 0,0 76.5992,89.34143 82.80393,96.0348 1.47161,-4.3301 4.284,-12.2378 4.284,-12.2378 L 249.5694,827.15258 c -11.40936,-13.45873 -0.10317,-24.96599 9.77181,-24.96599 l 46.66828,0.0619 c 6.6354,0.14049 12.85858,-5.63707 12.85858,-12.67507 0.0536,-16.64034 0.0979,-32.85667 -0.0891,-49.49674 0,-6.54931 -5.93165,-12.48474 -12.39891,-12.48474 0,0 -241.394685,-0.0172 -251.574561,-0.0274 -7.362217,0 -13.117562,4.94418 -13.117562,13.36107 -0.01198,16.05353 -0.123454,32.0435 -0.114893,48.09906 0.0034,5.94395 4.702345,12.2839 13.042094,13.13122 10.269041,0.0927 -2.188272,-0.14093 8.077389,0.0927 19.591545,-0.91756 24.557787,3.78834 36.785491,16.80453 l 83.114322,85.70061 h 15.33336"
|
||||
style="fill:#4f4c4c;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path16" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 371.78607,904.7538 h 13.52721 l 67.4776,-80.35329 c 9.65327,-12.3976 5.40219,-34.0055 -17.4442,-33.91814 l -47.87252,0.15762 c -3.33877,-0.13171 -5.87721,-1.43518 -5.88907,-6.77064 0.079,1.23498 0.11503,-38.19494 0.11503,-38.19494 0.0101,-4.35077 1.93258,-6.99694 6.32809,-7.0055 l 275.62514,0.21095 c 4.3244,-0.0138 6.69513,2.15394 6.69951,6.94892 0.009,12.1435 -0.0395,25.1873 -0.0483,37.32584 0,5.59405 -1.47073,7.65175 -6.18145,7.72726 -14.14976,0.0259 -29.73512,-0.0755 -35.03415,1.25035 -14.27706,3.75409 -18.72438,7.98629 -27.92633,19.47116 0,0 -87.83998,105.84963 -88.5029,106.71715 4.10926,2.05112 6.82244,4.2515 10.22927,7.31765 3.06438,-3.76594 88.09899,-107.89328 88.09899,-107.89328 8.98683,-10.28986 18.00878,-15.23722 32.9356,-15.51864 h 25.41512 c 9.87366,-0.009 12.74488,-5.45707 12.75804,-15.59414 0.0439,-16.54212 0.079,-30.85498 -0.0526,-47.39728 0.005,-7.35023 -4.61853,-12.06975 -11.66926,-12.0646 0,0 -278.86383,0.0617 -286.69427,0.0652 -9.30863,0 -14.3214,4.59261 -14.3214,14.14653 -0.0118,16.15131 -0.0136,34.08097 0,50.23223 0,6.28683 5.02507,10.67707 12.16229,10.61209 l 46.91939,0.0342 c 16.91253,0.26737 17.4442,9.47502 10.00493,20.0116 l -66.65969,82.48169"
|
||||
style="fill:#4f4c4c;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path18-1" />
|
||||
<g
|
||||
id="g20"
|
||||
transform="matrix(4.3902427,0,0,4.3902427,23.248656,727.17025)">
|
||||
<g
|
||||
id="text22"
|
||||
style="font-variant:normal;font-weight:600;font-size:70.24369812px;font-family:'Metric Semibold';-inkscape-font-specification:Metric-Semibold;writing-mode:lr-tb;fill:#aa1818;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
transform="matrix(1,0,0,-1,0,42.7367)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3029"
|
||||
d="m 29.501973,-22.266966 c 1.619943,-0.582407 2.963334,-1.665316 4.030179,-3.24873 1.066778,-1.583363 1.61994,-3.544305 1.659488,-5.882833 -0.04394,-3.869173 -1.343428,-6.7901 -3.898476,-8.762789 -2.555111,-1.97261 -6.102368,-2.961861 -10.641783,-2.967757 H 4.1443248 V 0 H 22.056237 c 4.536488,-0.01317042 8.072038,-1.0580311 10.606662,-3.1345852 2.534559,-2.0765478 3.822342,-5.1057651 3.863354,-9.0876608 -0.03808,-2.394095 -0.699538,-4.48967 -1.98436,-6.286731 -1.284891,-1.797024 -2.964863,-3.049686 -5.03992,-3.757989 z m -16.717785,-3.160925 v -10.114963 h 7.305251 c 2.146772,-0.0073 3.771134,0.393688 4.873092,1.202909 1.101909,0.809289 1.655071,2.070731 1.659488,3.78433 -0.0044,1.719514 -0.557579,3.00437 -1.659487,3.854572 -1.101957,0.850256 -2.72632,1.27464 -4.873093,1.273152 z m 0,7.024279 h 8.499379 c 2.113113,0.01465 3.716988,0.494643 4.81163,1.439976 1.094589,0.945367 1.644824,2.268272 1.650707,3.968719 -0.0059,1.669741 -0.556116,2.983866 -1.650707,3.9423764 -1.094643,0.958529 -2.698518,1.4473014 -4.81163,1.4663189 h -8.499379 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3031"
|
||||
d="M 55.112494,-43.129075 38.605438,0 h 8.991077 l 3.793111,-10.395933 H 67.545469 L 71.408823,0 h 9.131563 L 64.033329,-43.129075 Z m 4.355054,10.81739 5.268209,14.32953 H 54.199338 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3033"
|
||||
d="m 84.087721,-2.9501973 c 1.57168,1.0126685 3.556037,1.8672879 5.953078,2.56386089 2.397024,0.69657371 5.048686,1.0594948 7.954996,1.08876435 4.676975,-0.001463 8.546175,-1.06973824 11.607625,-3.20482804 3.06138,-2.1350847 4.64769,-5.3282017 4.75895,-9.5793609 0.0131,-3.175544 -0.83856,-5.797939 -2.55509,-7.867192 -1.71658,-2.069214 -4.37703,-3.70821 -7.98133,-4.916996 l -6.743312,-2.318012 c -1.520479,-0.459478 -2.694118,-1.033127 -3.52092,-1.72095 -0.826827,-0.687764 -1.245357,-1.682869 -1.25559,-2.985317 0.04243,-1.469214 0.695101,-2.552123 1.958019,-3.248732 1.262892,-0.696538 2.881401,-1.041897 4.855532,-1.036079 2.481891,0.01613 4.770631,0.422956 6.866231,1.220468 2.09555,0.797583 4.0682,1.889272 5.91796,3.275071 v -8.780349 c -1.75171,-1.062382 -3.70973,-1.887735 -5.87406,-2.476061 -2.16437,-0.58824 -4.56141,-0.886771 -7.191102,-0.895593 -4.325797,0.01468 -7.931591,1.074172 -10.81739,3.178486 -2.885813,2.104395 -4.384325,5.165807 -4.495539,9.184245 0.04244,3.526801 1.0112,6.25456 2.906295,8.183285 1.895085,1.928771 4.461872,3.392162 7.700367,4.390175 l 6.321849,2.107284 c 1.62435,0.557567 2.87115,1.198531 3.74043,1.922895 0.86923,0.724394 1.30825,1.769255 1.31705,3.134586 -0.0468,1.671203 -0.77854,2.8770362 -2.19508,3.6175033 -1.41659,0.7404833 -3.23705,1.1034044 -5.461381,1.0887643 -2.514122,-0.019017 -4.949203,-0.455107 -7.305251,-1.3082725 -2.356066,-0.8531489 -4.510176,-2.0092271 -6.462337,-3.4682371 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3035"
|
||||
d="M 120.78993,-43.129075 V 0 h 29.29125 V -7.9374357 H 129.64052 V -18.192884 h 18.5441 v -7.656464 h -18.5441 v -9.412534 h 20.44066 v -7.867193 z" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 14 KiB |
|
|
@ -31,24 +31,6 @@ function vue-api:test-select($q )
|
|||
</json>
|
||||
};
|
||||
|
||||
(:~
|
||||
: get status
|
||||
:)
|
||||
declare
|
||||
%rest:GET %rest:path("/vue-poc/api/status")
|
||||
%rest:produces("application/json")
|
||||
%output:method("json")
|
||||
function vue-api:status( )
|
||||
{
|
||||
let $user:=user:current()
|
||||
let $detail:=user:list-details($user)
|
||||
return <json type="object" >
|
||||
<user>{$user}</user>
|
||||
<permission>{$detail/@permission/string()}</permission>
|
||||
<session>{session:id()}</session>
|
||||
<created>{session:created()}</created>
|
||||
</json>
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue