entity allows config

This commit is contained in:
Andy Bunce 2017-08-25 22:00:59 +01:00
parent 07509ce03b
commit 65f868fae4
12 changed files with 166 additions and 112 deletions

View file

@ -0,0 +1,3 @@
<state>
<last-id>3</last-id>
</state>

View file

@ -9,15 +9,15 @@
<v-icon >{{icon}}</v-icon> <v-icon >{{icon}}</v-icon>
</v-btn> </v-btn>
<v-toolbar-title> <v-toolbar-title>
<v-breadcrumbs> <v-breadcrumbs>
<v-breadcrumbs-item v-for="item in crumbs" :key="item.path" :to="{ query: { url: item.path }}"> <v-breadcrumbs-item v-for="item in crumbs" :key="item.path" :to="{ query: { url: item.path }}">
{{ item.name }} {{ item.name }}
</v-breadcrumbs-item> </v-breadcrumbs-item>
</v-breadcrumbs> </v-breadcrumbs>
</v-toolbar-title> </v-toolbar-title>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-text-field prepend-icon="search" label="Filter..." v-model="q" type="search" <v-text-field prepend-icon="search" label="Filter..." v-model="q" type="search"
hide-details single-line @keyup.enter="filter"></v-text-field> hide-details single-line @keyup.enter="setfilter"></v-text-field>
<v-btn icon @click="alert('todo')"> <v-btn icon @click="alert('todo')">
<v-icon>view_module</v-icon> <v-icon>view_module</v-icon>
@ -30,7 +30,9 @@
<v-layout> <v-layout>
<v-flex> <v-flex>
<v-list v-if="!busy" two-line subheader> <v-list v-if="!busy" two-line subheader>
<v-subheader inset>Folders</v-subheader> <v-subheader inset >
<span >Folders ({{ folders.length }})</span>
</v-subheader>
<v-list-tile v-for="item in folders" v-bind:key="item.name" @click="folder(item)" avatar > <v-list-tile v-for="item in folders" v-bind:key="item.name" @click="folder(item)" avatar >
<v-list-tile-avatar > <v-list-tile-avatar >
<v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon> <v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon>
@ -47,7 +49,9 @@
</v-list-tile> </v-list-tile>
<v-divider inset></v-divider> <v-divider inset></v-divider>
<v-subheader inset>Files</v-subheader> <v-subheader inset>
<span >Files ({{ files.length }})</span>
</v-subheader>
<v-list-tile v-for="item in files" v-bind:key="item.name" > <v-list-tile v-for="item in files" v-bind:key="item.name" >
<v-list-tile-avatar> <v-list-tile-avatar>
<v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon> <v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon>
@ -93,7 +97,6 @@
url: "", url: "",
folders: [], folders: [],
files: [], files: [],
items: ["root"],
q: "", q: "",
busy: false, busy: false,
showInfo: false, showInfo: false,
@ -123,10 +126,8 @@
}); });
}, },
root(){
this.$router.push({ query: { url: this.url }}) setfilter(){
},
filter(){
console.log("TODO",this.q) console.log("TODO",this.q)
this.$router.push({ query: {url:this.url,q:this.q }}) this.$router.push({ query: {url:this.url,q:this.q }})
}, },
@ -148,10 +149,12 @@
icon(){ icon(){
return (this.protocol=="basexdb")?"developer_mode":"folder" return (this.protocol=="basexdb")?"developer_mode":"folder"
}, },
// array of {name:"that", path:"/this/that/"} for url
crumbs(){ crumbs(){
var parts=this.url.split("/").filter((a)=>a.length>0) var parts=this.url.split("/").filter((a)=>a.length>0)
var a=parts.map(function(v,i,a){return {name:v, var a=parts.map(
path:"/"+a.slice(0,i+1).join("/")+"/"}}) function(v,i,a){return {name:v, path:"/"+a.slice(0,i+1).join("/")+"/"}}
)
return a return a
} }
}, },
@ -159,10 +162,11 @@
url(v){ url(v){
this.$router.push({ query: { url: this.url }}) this.$router.push({ query: { url: this.url }})
}, },
$route(v){ $route(vnew,vold){
//console.log("ROUTE",vnew,vold)
var url=this.$route.query.url var url=this.$route.query.url
this.url=url?url:"/"; this.url=url?url:"/";
this.load(this.url) if(vnew.query.url != vold.query.url) this.load(this.url)
} }
}, },
created:function(){ created:function(){

View file

@ -9,9 +9,12 @@
<v-icon>play_circle_outline</v-icon> <v-icon>play_circle_outline</v-icon>
Submit</v-btn> Submit</v-btn>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn @click="imports()"> <v-btn @click="imports">
<v-icon>play_circle_outline</v-icon> <v-icon>library_books</v-icon>
Imports</v-btn> Imports</v-btn>
<v-btn @click="namespaces">
<v-icon>label</v-icon>
Namespaces</v-btn>
<v-menu offset-y> <v-menu offset-y>
<v-btn icon primary dark slot="activator"> <v-icon>more_vert</v-icon></v-btn> <v-btn icon primary dark slot="activator"> <v-icon>more_vert</v-icon></v-btn>
<v-list> <v-list>
@ -31,9 +34,7 @@
></vue-ace> ></vue-ace>
</v-flex> </v-flex>
</v-card-text> </v-card-text>
<v-alert error v-bind:value="showError">
{{result}}
</v-alert>
<v-card-actions v-if="show" > <v-card-actions v-if="show" >
<v-chip class="primary white--text">{{jobId}}</v-chip> <v-chip class="primary white--text">{{jobId}}</v-chip>
@ -53,6 +54,11 @@
{{elapsed}}ms</v-chip> {{elapsed}}ms</v-chip>
</v-card-actions> </v-card-actions>
<v-card-text v-if="showError">
<v-alert error >
{{result}}
</v-alert>
</v-card-text>
<v-card-text v-if="showResult"> <v-card-text v-if="showResult">
<v-flex xs12 style="height:200px" fill-height> <v-flex xs12 style="height:200px" fill-height>
<vue-ace :content="result" mode="text" wrap="false" read-only="true" <vue-ace :content="result" mode="text" wrap="false" read-only="true"
@ -140,7 +146,7 @@
this.awaitResult(true) this.awaitResult(true)
HTTP.post("eval/result/"+this.jobId) HTTP.post("eval/result/"+this.jobId)
.then(r=>{ .then(r=>{
this.result=r.data.result this.result=r.data.result+" "
}) })
}, },
hitme(){ hitme(){
@ -151,6 +157,9 @@
imports(){ imports(){
alert("@TODO imports") alert("@TODO imports")
}, },
namespaces(){
alert("@TODO namespaces")
},
plan(){ plan(){
this.awaitResult(false) this.awaitResult(false)
HTTP.post("eval/plan",Qs.stringify({xq:this.xq})) HTTP.post("eval/plan",Qs.stringify({xq:this.xq}))
@ -166,6 +175,7 @@
}, },
awaitResult(show){ awaitResult(show){
// ace slow when setting large text while hidden // ace slow when setting large text while hidden
this.showError=false
this.show=show this.show=show
this.result="(Please wait..)" this.result="(Please wait..)"
this.showResult=true this.showResult=true

View file

@ -2,7 +2,8 @@ xquery version "3.1";
(:~ data locations for image feature :) (:~ data locations for image feature :)
module namespace cfg = "quodatum:media.image.configure"; module namespace cfg = "quodatum:media.image.configure";
declare variable $cfg:DB:="vue-poc"; declare variable $cfg:DB-IMAGE:="vue-poc";
declare variable $cfg:IMAGEDIR:="P:/pictures/Pictures/"; declare variable $cfg:IMAGEDIR:="P:/pictures/Pictures/";
declare variable $cfg:THUMBDIR:="C:/tmp/"; declare variable $cfg:THUMBDIR:="C:/tmp/";

View file

@ -159,20 +159,20 @@
<script>{ <script>{
data: () => ({ data: () => ({
images:[], images:[],
query:{page:0, // current page query: {page:0, // current page
from:null, from:null,
until:null, until:null,
keyword:null keyword:null
}, },
total:null, total: null,
elapsed:null, elapsed: null,
showFilter:false, showFilter: false,
busy:false, busy: false,
menu2:false, menu2: false,
showUntil:false, showUntil: false,
keywords:[], keywords: [],
showInfo:false, showInfo: false,
selitem:"TODO" selitem: "TODO"
}), }),
methods:{ methods:{
src(item){ src(item){
@ -228,8 +228,18 @@
}, },
deep:true deep:true
}, },
$route(v){ $route(v){
this.getImages() this.getImages()
},
showFilter(){
if(this.keywords.length==0){
HTTP.get("images/keywords")
.then(r=>{
this.keywords=r.data.items
})
}
} }
}, },
created:function(){ created:function(){
@ -239,10 +249,7 @@
this.query.from=this.$route.query.from || this.query.from this.query.from=this.$route.query.from || this.query.from
this.query.until=this.$route.query.until || this.query.until this.query.until=this.$route.query.until || this.query.until
this.getImages() this.getImages()
HTTP.get("images/keywords")
.then(r=>{
this.keywords=r.data.items
})
}, },
mounted:function(){ mounted:function(){
console.log("images mount") console.log("images mount")

View file

@ -19,7 +19,7 @@ declare
%output:method("json") %output:method("json")
function vue-api:id( $id as xs:integer) function vue-api:id( $id as xs:integer)
{ {
let $image:=db:open-id("vue-poc",$id) let $image:=db:open-id($cfg:DB-IMAGE,$id)
return <json type="object" > return <json type="object" >
<doc>{ serialize($image) }</doc> <doc>{ serialize($image) }</doc>
{ vue-api:get-image($image) } { vue-api:get-image($image) }
@ -72,7 +72,7 @@ declare
function vue-api:keywords() function vue-api:keywords()
{ {
let $keys:= let $keys:=
collection("/vue-poc/image")/image/keywords/keyword collection($cfg:DB-IMAGE || "/image")/image/keywords/keyword
=>distinct-values() =>distinct-values()
=>sort("http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive") =>sort("http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive")
return <json type="object" > return <json type="object" >
@ -87,7 +87,7 @@ declare
%rest:GET %rest:path("/vue-poc/api/images/list/{ $id }/image") %rest:GET %rest:path("/vue-poc/api/images/list/{ $id }/image")
function vue-api:rawimage($id as xs:integer) function vue-api:rawimage($id as xs:integer)
{ {
let $image as element(image):=db:open-id("vue-poc",$id) let $image as element(image):=db:open-id($cfg:DB-IMAGE,$id)
let $path:=$cfg:IMAGEDIR || '../' || $vue-api:entity?access?path($image) let $path:=$cfg:IMAGEDIR || '../' || $vue-api:entity?access?path($image)
return ( return (
web:response-header(map { 'media-type': web:content-type($path) }), web:response-header(map { 'media-type': web:content-type($path) }),
@ -100,8 +100,8 @@ declare
%rest:GET %rest:path("/vue-poc/api/images/list/{ $id }/meta") %rest:GET %rest:path("/vue-poc/api/images/list/{ $id }/meta")
function vue-api:meta($id as xs:integer) function vue-api:meta($id as xs:integer)
{ {
let $image as element(image):=db:open-id("vue-poc",$id) let $image as element(image):=db:open-id($cfg:DB-IMAGE,$id)
let $path:="vue-poc/meta/" || $vue-api:entity?access?path($image) || "/meta.xml" let $path:=$cfg:DB-IMAGE || "/meta/" || $vue-api:entity?access?path($image) || "/meta.xml"
return doc($path) return doc($path)
}; };

View file

@ -5,28 +5,21 @@ module namespace bf = 'quodatum.tools.buildfields';
declare default function namespace 'quodatum.tools.buildfields'; declare default function namespace 'quodatum.tools.buildfields';
declare namespace ent="https://github.com/Quodatum/app-doc/entity"; 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 : generate xquery module for given entities as a string
:) :)
declare function module($entities as element(ent:entity)*) as xs:string declare function module($entities as element(ent:entity)*,$imports)
as xs:string
{ {
let $src:= <text>(: entity access maps let $src:= <text>(: entity access maps
: auto generated from xml files in entities folder at: {fn:current-dateTime()} : auto generated from xml files in entities folder at: {fn:current-dateTime()}
:) :)
module namespace entity = 'quodatum.models.generated'; module namespace entity = 'quodatum.models.generated';
{bf:build-modules($entities)} {$imports}
{bf:build-imports($entities)}
{bf:build-namespaces($entities)} {bf:build-namespaces($entities)}
{( bf:build-describe($entities))} {( bf:build-describe($entities))}
@ -83,7 +76,8 @@ declare function generate($e as element(ent:entity)) as xs:string
(:~ (:~
: @return sequence of element(entity) items for definitions at path : @return sequence of element(entity) items for definitions at path
:) :)
declare function sources($path as xs:string) as element(ent:entity)* declare function entities($path as xs:string)
as element(ent:entity)*
{ {
let $_:=fn:trace($path,"DD") let $_:=fn:trace($path,"DD")
let $p:=fn:resolve-uri($path) || "/" let $p:=fn:resolve-uri($path) || "/"
@ -93,7 +87,8 @@ let $_:=fn:trace($path,"DD")
}; };
(:map for entity :) (:map for entity :)
declare function build-map($entity as element(ent:entity)) as xs:string declare function build-map($entity as element(ent:entity))
as xs:string
{ {
let $m:=for $field in $entity/ent:fields/ent:field let $m:=for $field in $entity/ent:fields/ent:field
order by $field/@name order by $field/@name
@ -166,21 +161,26 @@ switch ($xsd)
}; };
(:~ declare any namespaces found :) (:~ declare any namespaces found :)
declare function build-namespaces($entities as element()*){ declare function build-namespaces($entities as element()*)
{
for $n in distinct-deep($entities/ent:namespace) for $n in distinct-deep($entities/ent:namespace)
return return
<text>declare namespace {$n/@prefix/fn:string()}='{$n/@uri/fn:string()}'; <text>declare namespace {$n/@prefix/fn:string()}='{$n/@uri/fn:string()}';
</text> </text>
}; };
(:~ declare any namespaces found :)
declare function build-modules($entities as element()*){ (:~ import any modules found must be in repo :)
declare function build-imports($entities as element()*)
{
for $n in distinct-deep($entities/ent:module) for $n in distinct-deep($entities/ent:module)
return return
<text>import module namespace {$n/@prefix/fn:string()}='{$n/@namespace/fn:string()}'; <text>import module namespace {$n/@prefix/fn:string()}='{$n/@namespace/fn:string()}';
</text> </text>
}; };
declare function build-describe($entities){ declare function build-describe($entities)
as xs:string
{
let $m:=for $e in $entities let $m:=for $e in $entities
return generate($e) return generate($e)
return <text> return <text>
@ -191,7 +191,8 @@ declare variable $entity:list:=map {{ {fn:string-join($m,",")}
}; };
declare function escape($str as xs:string) declare function escape($str as xs:string)
as xs:string{ as xs:string
{
fn:replace( fn:replace(
fn:replace($str,'"','""'), fn:replace($str,'"','""'),
"'","''") "'","''")

View file

@ -25,7 +25,7 @@ declare variable $vue:DEST:="static/app-gen.js";
declare function vue:feature($doc,$isComp as xs:boolean) declare function vue:feature($doc,$isComp as xs:boolean)
as xs:string as xs:string
{ {
let $p:=vue:parse($doc=>trace("feature: ")) let $p:=vue:parse($doc)
let $script:= $p?script=>substring-after("{") let $script:= $p?script=>substring-after("{")
return if(empty($p?id)) then return if(empty($p?id)) then
@ -67,7 +67,7 @@ declare function vue:capitalize-first
declare function vue:feature-files($proj) declare function vue:feature-files($proj)
as xs:string* as xs:string*
{ {
let $FEATURES:="features/"=>file:resolve-path($proj=>trace("proj:")) let $FEATURES:="features/"=>file:resolve-path($proj)
return fw:directory-list($FEATURES,map{"include-filter":".*\.vue"}) return fw:directory-list($FEATURES,map{"include-filter":".*\.vue"})
//c:file/@name/resolve-uri(.,base-uri(.)) //c:file/@name/resolve-uri(.,base-uri(.))
}; };

View file

@ -1,9 +1,9 @@
(: entity access maps (: entity access maps
: auto generated from xml files in entities folder at: 2017-08-23T10:12:22.413+01:00 : auto generated from xml files in entities folder at: 2017-08-25T21:59:02.677+01:00
:) :)
module namespace entity = 'quodatum.models.generated'; module namespace entity = 'quodatum.models.generated';
declare namespace h='urn:quodatum:vue-poc.history'; import module namespace cfg = "quodatum:media.image.configure" at "features/images/config.xqm";declare namespace h='urn:quodatum:vue-poc.history';
declare namespace c='http://www.w3.org/ns/xproc-step'; declare namespace c='http://www.w3.org/ns/xproc-step';
declare variable $entity:list:=map { declare variable $entity:list:=map {
@ -130,7 +130,7 @@ declare variable $entity:list:=map {
} }, } },
"data": function() as element(image)* "data": function() as element(image)*
{ collection("/vue-poc/image")/image }, { collection($cfg:DB-IMAGE || "/image")/image },
"views": map{ "views": map{
'filter': 'name' 'filter': 'name'

View file

@ -24,6 +24,6 @@
<view name="filter">name</view> <view name="filter">name</view>
</views> </views>
<iconclass>fa fa-file</iconclass> <iconclass>fa fa-file</iconclass>
<data type="element(image)">collection("/vue-poc/image")/image</data> <data type="element(image)">collection($cfg:DB-IMAGE || "/image")/image</data>
</entity> </entity>

View file

@ -1,4 +1,4 @@
// generated 2017-08-24T18:16:31.442+01:00 // generated 2017-08-25T20:24:29.63+01:00
Vue.component('qd-link',{template:` Vue.component('qd-link',{template:`
<a :href="href" :target="href"> {{href}}<v-icon>link</v-icon></a> <a :href="href" :target="href"> {{href}}<v-icon>link</v-icon></a>
`, `,
@ -262,14 +262,14 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
<v-icon>{{icon}}</v-icon> <v-icon>{{icon}}</v-icon>
</v-btn> </v-btn>
<v-toolbar-title> <v-toolbar-title>
<v-breadcrumbs> <v-breadcrumbs>
<v-breadcrumbs-item v-for="item in crumbs" :key="item.path" :to="{ query: { url: item.path }}"> <v-breadcrumbs-item v-for="item in crumbs" :key="item.path" :to="{ query: { url: item.path }}">
{{ item.name }} {{ item.name }}
</v-breadcrumbs-item> </v-breadcrumbs-item>
</v-breadcrumbs> </v-breadcrumbs>
</v-toolbar-title> </v-toolbar-title>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-text-field prepend-icon="search" label="Filter..." v-model="q" type="search" hide-details="" single-line="" @keyup.enter="filter"></v-text-field> <v-text-field prepend-icon="search" label="Filter..." v-model="q" type="search" hide-details="" single-line="" @keyup.enter="setfilter"></v-text-field>
<v-btn icon="" @click="alert('todo')"> <v-btn icon="" @click="alert('todo')">
<v-icon>view_module</v-icon> <v-icon>view_module</v-icon>
@ -282,7 +282,9 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
<v-layout> <v-layout>
<v-flex> <v-flex>
<v-list v-if="!busy" two-line="" subheader=""> <v-list v-if="!busy" two-line="" subheader="">
<v-subheader inset="">Folders</v-subheader> <v-subheader inset="">
<span>Folders ({{ folders.length }})</span>
</v-subheader>
<v-list-tile v-for="item in folders" v-bind:key="item.name" @click="folder(item)" avatar=""> <v-list-tile v-for="item in folders" v-bind:key="item.name" @click="folder(item)" avatar="">
<v-list-tile-avatar> <v-list-tile-avatar>
<v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon> <v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon>
@ -299,7 +301,9 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
</v-list-tile> </v-list-tile>
<v-divider inset=""></v-divider> <v-divider inset=""></v-divider>
<v-subheader inset="">Files</v-subheader> <v-subheader inset="">
<span>Files ({{ files.length }})</span>
</v-subheader>
<v-list-tile v-for="item in files" v-bind:key="item.name"> <v-list-tile v-for="item in files" v-bind:key="item.name">
<v-list-tile-avatar> <v-list-tile-avatar>
<v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon> <v-icon v-bind:class="[item.iconClass]">{{ item.icon }}</v-icon>
@ -344,7 +348,6 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
url: "", url: "",
folders: [], folders: [],
files: [], files: [],
items: ["root"],
q: "", q: "",
busy: false, busy: false,
showInfo: false, showInfo: false,
@ -374,10 +377,8 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
}); });
}, },
root(){
this.$router.push({ query: { url: this.url }}) setfilter(){
},
filter(){
console.log("TODO",this.q) console.log("TODO",this.q)
this.$router.push({ query: {url:this.url,q:this.q }}) this.$router.push({ query: {url:this.url,q:this.q }})
}, },
@ -399,10 +400,12 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
icon(){ icon(){
return (this.protocol=="basexdb")?"developer_mode":"folder" return (this.protocol=="basexdb")?"developer_mode":"folder"
}, },
// array of {name:"that", path:"/this/that/"} for url
crumbs(){ crumbs(){
var parts=this.url.split("/").filter((a)=>a.length>0) var parts=this.url.split("/").filter((a)=>a.length>0)
var a=parts.map(function(v,i,a){return {name:v, var a=parts.map(
path:"/"+a.slice(0,i+1).join("/")+"/"}}) function(v,i,a){return {name:v, path:"/"+a.slice(0,i+1).join("/")+"/"}}
)
return a return a
} }
}, },
@ -410,10 +413,11 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
url(v){ url(v){
this.$router.push({ query: { url: this.url }}) this.$router.push({ query: { url: this.url }})
}, },
$route(v){ $route(vnew,vold){
//console.log("ROUTE",vnew,vold)
var url=this.$route.query.url var url=this.$route.query.url
this.url=url?url:"/"; this.url=url?url:"/";
this.load(this.url) if(vnew.query.url != vold.query.url) this.load(this.url)
} }
}, },
created:function(){ created:function(){
@ -746,9 +750,12 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
<v-icon>play_circle_outline</v-icon> <v-icon>play_circle_outline</v-icon>
Submit</v-btn> Submit</v-btn>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn @click="imports()"> <v-btn @click="imports">
<v-icon>play_circle_outline</v-icon> <v-icon>library_books</v-icon>
Imports</v-btn> Imports</v-btn>
<v-btn @click="namespaces">
<v-icon>label</v-icon>
Namespaces</v-btn>
<v-menu offset-y=""> <v-menu offset-y="">
<v-btn icon="" primary="" dark="" slot="activator"> <v-icon>more_vert</v-icon></v-btn> <v-btn icon="" primary="" dark="" slot="activator"> <v-icon>more_vert</v-icon></v-btn>
<v-list> <v-list>
@ -766,9 +773,7 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
<vue-ace :content="xq" mode="xquery" wrap="true" v-on:change-content="onChange"></vue-ace> <vue-ace :content="xq" mode="xquery" wrap="true" v-on:change-content="onChange"></vue-ace>
</v-flex> </v-flex>
</v-card-text> </v-card-text>
<v-alert error="" v-bind:value="showError">
{{result}}
</v-alert>
<v-card-actions v-if="show"> <v-card-actions v-if="show">
<v-chip class="primary white--text">{{jobId}}</v-chip> <v-chip class="primary white--text">{{jobId}}</v-chip>
@ -788,6 +793,11 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
{{elapsed}}ms</v-chip> {{elapsed}}ms</v-chip>
</v-card-actions> </v-card-actions>
<v-card-text v-if="showError">
<v-alert error="">
{{result}}
</v-alert>
</v-card-text>
<v-card-text v-if="showResult"> <v-card-text v-if="showResult">
<v-flex xs12="" style="height:200px" fill-height=""> <v-flex xs12="" style="height:200px" fill-height="">
<vue-ace :content="result" mode="text" wrap="false" read-only="true"></vue-ace> <vue-ace :content="result" mode="text" wrap="false" read-only="true"></vue-ace>
@ -873,7 +883,7 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
this.awaitResult(true) this.awaitResult(true)
HTTP.post("eval/result/"+this.jobId) HTTP.post("eval/result/"+this.jobId)
.then(r=>{ .then(r=>{
this.result=r.data.result this.result=r.data.result+" "
}) })
}, },
hitme(){ hitme(){
@ -884,6 +894,9 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
imports(){ imports(){
alert("@TODO imports") alert("@TODO imports")
}, },
namespaces(){
alert("@TODO namespaces")
},
plan(){ plan(){
this.awaitResult(false) this.awaitResult(false)
HTTP.post("eval/plan",Qs.stringify({xq:this.xq})) HTTP.post("eval/plan",Qs.stringify({xq:this.xq}))
@ -899,6 +912,7 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
}, },
awaitResult(show){ awaitResult(show){
// ace slow when setting large text while hidden // ace slow when setting large text while hidden
this.showError=false
this.show=show this.show=show
this.result="(Please wait..)" this.result="(Please wait..)"
this.showResult=true this.showResult=true
@ -1130,20 +1144,20 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
data: () => ({ data: () => ({
images:[], images:[],
query:{page:0, // current page query: {page:0, // current page
from:null, from:null,
until:null, until:null,
keyword:null keyword:null
}, },
total:null, total: null,
elapsed:null, elapsed: null,
showFilter:false, showFilter: false,
busy:false, busy: false,
menu2:false, menu2: false,
showUntil:false, showUntil: false,
keywords:[], keywords: [],
showInfo:false, showInfo: false,
selitem:"TODO" selitem: "TODO"
}), }),
methods:{ methods:{
src(item){ src(item){
@ -1199,8 +1213,18 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
}, },
deep:true deep:true
}, },
$route(v){ $route(v){
this.getImages() this.getImages()
},
showFilter(){
if(this.keywords.length==0){
HTTP.get("images/keywords")
.then(r=>{
this.keywords=r.data.items
})
}
} }
}, },
created:function(){ created:function(){
@ -1210,10 +1234,7 @@ v0.0.3 </v-card-title> </v-card> </v-flex> <v-flex xs4="">
this.query.from=this.$route.query.from || this.query.from this.query.from=this.$route.query.from || this.query.from
this.query.until=this.$route.query.until || this.query.until this.query.until=this.$route.query.until || this.query.until
this.getImages() this.getImages()
HTTP.get("images/keywords")
.then(r=>{
this.keywords=r.data.items
})
}, },
mounted:function(){ mounted:function(){
console.log("images mount") console.log("images mount")

View file

@ -6,7 +6,14 @@
declare namespace task="https://github.com/Quodatum/app-doc/task"; declare namespace task="https://github.com/Quodatum/app-doc/task";
import module namespace bf = 'quodatum.tools.buildfields' at "../lib/entity-gen.xqm"; import module namespace bf = 'quodatum.tools.buildfields' at "../lib/entity-gen.xqm";
let $efolder:="C:/Users/andy/git/vue-poc/src/vue-poc/models" declare variable $efolder:="C:/Users/andy/git/vue-poc/src/vue-poc/models";
let $target:="C:/Users/andy/git/vue-poc/src/vue-poc/models.gen.xqm" declare variable $target:="C:/Users/andy/git/vue-poc/src/vue-poc/models.gen.xqm";
return (bf:write($efolder,$target),db:output("generated " || $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 (
file:write-text($target,$src)
,db:output("generated " || $target)
)