[MOD] use qd-table

This commit is contained in:
Andy Bunce 2020-10-13 11:58:01 +01:00
parent 5946f6f76d
commit 5d6aa4e12b
47 changed files with 1429 additions and 1029 deletions

View file

@ -14,11 +14,8 @@
<vp-notifications :show-notifications.sync="showNotifications"></vp-notifications> <vp-notifications :show-notifications.sync="showNotifications"></vp-notifications>
</v-navigation-drawer> </v-navigation-drawer>
<v-navigation-drawer app :mini-variant.sync="mini" v-model="drawer" :clipped="$vuetify.breakpoint.lgAndUp" <v-navigation-drawer app :mini-variant.sync="mini" v-model="drawer" :clipped="$vuetify.breakpoint.lgAndUp">
> <v-list class="pa-0">
<v-list class="pa-0">
<v-list-item tag="div"> <v-list-item tag="div">
<v-list-item-avatar > <v-list-item-avatar >
<v-btn icon @click="session"> <v-btn icon @click="session">
@ -46,47 +43,23 @@
color="blue darken-3" dense color="blue darken-3" dense
dark > dark >
<v-app-bar-nav-icon @click.stop="drawer = !drawer" ></v-app-bar-nav-icon> <v-app-bar-nav-icon @click.stop="drawer = !drawer" ></v-app-bar-nav-icon>
<v-toolbar-title class="hidden-sm-and-down" > <v-toolbar-title class="hidden-sm-and-down" >
{{$route.meta.title}}</v-toolbar-title>
{{$route.meta.title}}</v-toolbar-title> <vp-favorite :frmfav.sync="frmfav"></vp-favorite>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-toolbar-items> <v-toolbar-items>
<qd-search></qd-search> <qd-search></qd-search>
</v-toolbar-items> </v-toolbar-items>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-menu left transition="v-fade-transition">
<template v-slot:activator="{ on }">
<v-btn dark icon v-on="on">
{{$auth.user}}
</v-btn>
</template >
<v-list>
<v-list-item to="/session" ripple>
<v-list-item-title >Session</v-list-item-title>
</v-list-item>
<v-list-item @click="logout()">
<v-list-item-title >logout</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title >permission: {{$auth.permission}}</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title >$route.path: {{$route.path}}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<v-btn @click.stop="showNotifications = ! showNotifications" icon text title="Notifications"> <v-btn @click.stop="showNotifications = ! showNotifications" icon text title="Notifications">
<v-badge overlap color="orange"> <v-badge overlap color="orange">
<span slot="badge" v-if=" $notification.unseen" >{{ $notification.unseen }}</span> <span slot="badge" v-if=" $notification.unseen" >{{ $notification.unseen }}</span>
<v-icon>notifications</v-icon> <v-icon>notifications</v-icon>
</v-badge> </v-badge>
</v-btn> </v-btn>
<vp-favorite :frmfav.sync="frmfav"></vp-favorite>
<v-menu bottom left min-width="300px"> <v-menu bottom left min-width="300px">
<template v-slot:activator="{ on }"> <template v-slot:activator="{ on }">
<v-btn icon v-on="on" > <v-btn icon v-on="on" >
@ -95,7 +68,8 @@
</template> </template>
<v-list> <v-list>
<v-list-item > <v-list-item >
<v-list-item-title><qd-fullscreen> Full screen</qd-fullscreen></v-list-item-title> <v-list-item-title>Full screen</v-list-item-title>
<v-list-item-action ><qd-fullscreen></qd-fullscreen></v-list-item-action>
</v-list-item> </v-list-item>
<v-list-item > <v-list-item >
<v-list-item-title>Dark theme</v-list-item-title> <v-list-item-title>Dark theme</v-list-item-title>
@ -108,7 +82,29 @@
</v-list-item> </v-list-item>
</v-list> </v-list>
</v-menu> </v-menu>
<v-menu left transition="v-fade-transition">
<template v-slot:activator="{ on }">
<v-btn dark icon v-on="on">
{{$auth.user}}
</v-btn>
</template >
<v-list>
<v-list-item to="/session" ripple>
<v-list-item-title >Session</v-list-item-title>
</v-list-item>
<v-list-item @click="logout()">
<v-list-item-title >logout</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title >permission: {{$auth.permission}}</v-list-item-title>
</v-list-item>
<v-list-item>
<v-list-item-title >$route.path: {{$route.path}}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
</v-app-bar> </v-app-bar>
<v-main> <v-main>
@ -149,26 +145,31 @@
model: false, model: false,
children: [ children: [
{href: '/eval',text: 'Query',icon: 'play_circle_outline'}, {href: '/eval',text: 'Query',icon: 'play_circle_outline'},
{href: '/tasks',text: 'Tasks',icon: 'update'},
{href: '/edit',text: 'Edit',icon: 'mode_edit'}, {href: '/edit',text: 'Edit',icon: 'mode_edit'},
{href: '/tabs',text: 'Tabs',icon: 'switch_camera'}, {href: '/tabs',text: 'Tabs',icon: 'switch_camera'},
{href: '/validate',text: 'Validate',icon: 'playlist_add_check'}, {href: '/validate',text: 'Validate',icon: 'playlist_add_check'},
{href: '/transform',text: 'XSLT Transform',icon: 'forward'}, {href: '/transform',text: 'XSLT Transform',icon: 'forward'}
{href: '/history/tasks',text: 'history',icon: 'history'}
]}, ]},
{ {
icon: 'folder_open', icon: 'add_task',
text: 'Collections' , text: 'Tasks' ,
model: false, model: false,
children: [ children: [
{href: '/database', text: 'Databases',icon: 'developer_mode' }, {href: '/tasks',text: 'Task list',icon: 'assignment'},
{href: '/files', text: 'File system',icon: 'folder' }, {href: '/history/tasks',text: 'History',icon: 'history'}
{href: '/documentation', text: 'Documentation',icon: 'library_books' },
{href: '/logdate',text: 'XML logs',icon: 'dns'},
{href: '/history/files',text: 'history',icon: 'history'}
]}, ]},
{
icon: 'folder_open',
text: 'Collections' ,
model: false,
children: [
{href: '/database', text: 'Databases',icon: 'developer_mode' },
{href: '/files', text: 'File system',icon: 'folder' },
{href: '/documentation', text: 'Documentation',icon: 'library_books' },
{href: '/history/files',text: 'history',icon: 'history'}
]},
{ {
icon: 'memory', icon: 'memory',
text: 'Models' , text: 'Models' ,
@ -190,14 +191,23 @@
{href: '/server/services',text: 'Services',icon: 'dashboard'}, {href: '/server/services',text: 'Services',icon: 'dashboard'},
{href: '/server/logs',text: 'Server logs',icon: 'dns'}, {href: '/server/logs',text: 'Server logs',icon: 'dns'},
{href: '/server/users',text: 'Users',icon: 'supervisor_account'}, {href: '/server/users',text: 'Users',icon: 'supervisor_account'},
{href: '/server/repo',text: 'Server code repository',icon: 'local_library'}, {href: '/server/repo',text: 'Package repository',icon: 'local_library'},
{href: '/server/upload',text: 'Upload to server',icon: 'file_upload'}, {href: '/server/upload',text: 'Upload to server',icon: 'file_upload'},
{href: '/server/ping',text: 'Ping',icon: 'update'},
{href: '/server/dicetest',text: 'Dice performance',icon: 'update'},
{href: '/server/settings',text: 'Server settings',icon: 'settings_applications'} {href: '/server/settings',text: 'Server settings',icon: 'settings_applications'}
]}, ]},
{
icon: 'hourglass_empty',
text: 'Performance' ,
model: false,
children: [
{href: '/logdate',text: 'XML logs',icon: 'dns'},
{href: '/performance/ping',text: 'Ping',icon: 'update'},
{href: '/performance/dicetest',text: 'Dice performance',icon: 'update'}
]
},
{ {
icon: 'camera_roll', icon: 'camera_roll',
text: 'Images' , text: 'Images' ,

View file

@ -1,5 +1,5 @@
// Mimetype info as vue extension. defines $MimeTypes // Mimetype info as vue extension. defines $MimeTypes
// // $MimeTypes.mode
// //
const MimeTypes=new function(){ const MimeTypes=new function(){
var formatdom= t=>html_beautify(t, { indent_size: 3 ,indent_inner_html:true}); var formatdom= t=>html_beautify(t, { indent_size: 3 ,indent_inner_html:true});

View file

@ -1,19 +1,47 @@
<!DOCTYPE html> <!DOCTYPE html>
<!-- card showing table --> <!-- card showing entity data table
talks to dataUri, example data-uri="data/basex.repo"
all slots passed down from parent
slots:actions for selection
@see https://stackoverflow.com/questions/50891858/vue-how-to-pass-down-slots-inside-wrapper-component
-->
<template id="qd-table"> <template id="qd-table">
<v-container fluid>
<v-card > <v-card >
<v-toolbar > <v-toolbar color="blue lighten-4">
<vp-entitylink v-if="entity" :entity="entity"></vp-entitylink>
<v-toolbar-title>{{ title }}</v-toolbar-title>
<v-spacer></v-spacer>
<v-text-field <v-text-field
prepend-icon="filter_list" prepend-icon="filter_list"
label="Filter items..." label="Filter..."
single-line single-line hide-details
hide-details v-model="query.filter"
v-model="search"
clearable clearable
></v-text-field> ></v-text-field>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn <v-menu v-if="selected.length" offset-y left>
<template v-slot:activator="{ on }">
<v-btn icon v-on="on">
<v-badge color="orange">
<span slot="badge">{{ selected.length }}</span>
<v-icon>share</v-icon>
</v-badge>
</v-btn>
</template>
<v-card >
<v-toolbar color="cyan lighten-2">
<v-card-title >Actions</v-card-title>
</v-toolbar>
<v-card-text>
<slot name="actions"></slot>
</v-card-text>
</v-card>
</v-menu>
<v-spacer></v-spacer>
<v-btn
icon icon
:loading="loading" :loading="loading"
:disabled="loading" :disabled="loading"
@ -21,58 +49,74 @@
> >
<v-icon>refresh</v-icon> <v-icon>refresh</v-icon>
</v-btn> </v-btn>
<span>{{ entity }}</span> <v-menu offset-y left>
<template v-slot:activator="{ on }">
<v-btn icon v-on="on"><v-icon>settings</v-icon></v-btn>
</template>
<v-card >
<v-toolbar color="cyan lighten-1">
<v-card-title >Table settings</v-card-title>
</v-toolbar>
<v-card-text>
<v-list>
<v-list-item>
<v-list-item-title>Show selection</v-list-item-title>
<v-list-item-action ><v-switch v-model="showSelectL"></v-switch> </v-list-item-action>
</v-list-item>
<v-list-item>
<v-list-item-title>Multi-sort</v-list-item-title>
<v-list-item-action ><v-switch v-model="multiSortL"></v-switch> </v-list-item-action>
</v-list-item>
<v-list-item>
<v-list-item-title>Auto-refresh</v-list-item-title>
<v-list-item-action ><v-switch v-model="autoRefreshL"></v-switch> </v-list-item-action>
</v-list-item>
</v-list>
</v-card-text>
</v-card>
</v-menu>
</v-toolbar> </v-toolbar>
<v-card-text>
<v-data-table <v-data-table
:headers="headers" :headers="headers" :items="items"
:items="items" v-model="selected" :item-key="itemKey"
:search="search" :search="query.filter"
v-model="selected" :items-per-page="10"
show-select :show-select="showSelectL"
:multi-sort="multiSortL"
:loading="loading"
class="elevation-1" class="elevation-1"
:fixed-header="true"
:no-data-text="noDataMsg" :no-data-text="noDataMsg"
> >
<template slot="items" slot-scope="props"> <template v-for="(_, slot) of $scopedSlots" v-slot:[slot]="scope"><slot :name="slot" v-bind="scope"/></template>
<td >
<v-checkbox
primary
hide-details
v-model="props.selected"
></v-checkbox>
</td>
<td v-for="col in headers" :key="col.name">{{ foo(props,col) }}</td>
</template>
</v-data-table> </v-data-table>
</v-card-text>
</v-card> </v-card>
</v-container>
</template> </template>
<script>{ <script>{
props: { props: {
headers: { headers: {default: [ { text: 'Name', value: 'id'} ]},
default: [ dataUri:{ default: "data/dice.entity"},
{ text: 'Name', value: 'id'}, itemKey:{ default: "id"},
{ text: 'Permission', value: 'state' } noDataMsg:{ default: "No data found."},
] title:{ default: "" },
}, entity:{ },
dataUri:{ query: {default: function(){return {filter:null}}},
default: "entity" showSelect: { default: false },
}, multiSort: { default: false }
noDataMsg:{
default: "No data found."
},
entity:{
default: "entity"
}
}, },
data: function(){ data: function(){
return { return {
selected: [],
loading: false, loading: false,
items: [], items: [],
search: null, showSelectL: this.showSelect,
selected: [], multiSortL: this.multiSort,
autoRefreshL: false
} }
}, },
methods:{ methods:{
@ -81,18 +125,13 @@
HTTP.get(this.dataUri) HTTP.get(this.dataUri)
.then(r=>{ .then(r=>{
this.loading=false; this.loading=false;
console.log("items",r.data.items,"headers ",this.headers); console.log("Jobs items",r.data.items,"headers ",this.headers);
this.items=r.data.items; this.items=r.data.items;
if(this.autoRefreshL) this.timer=setTimeout(()=>{ this.getItems() }, 10000);
}) })
},
foo(props,header){
//console.log("value ",header)
if(header){
return props.item[header.value]
}
return props.selected
} }
}, },
created:function(){ created:function(){
console.log("qd-table"); console.log("qd-table");
this.getItems(); this.getItems();

View file

@ -3,7 +3,7 @@
show a entity link show a entity link
--> -->
<template id="vp-entitylink"> <template id="vp-entitylink">
<router-link :to="'/entity/'+entity">E</router-link> <router-link :to="'/model/entity/'+entity" :title="entity">@</router-link>
</template> </template>
<script>{ <script>{

View file

@ -11,20 +11,20 @@ display button that invokes a save favorite form
> >
<template v-slot:activator="{ on }"> <template v-slot:activator="{ on }">
<v-btn v-on="on" text @click.stop="set(!frmfav)" icon title="Bookmark this page"> <v-btn v-on="on" text @click.stop="set(!frmfav)" icon title="Bookmark this page">
<v-icon>star_border</v-icon> <v-icon>{{ icon }}</v-icon>
</v-btn> </v-btn>
</template> </template>
<v-card style="width:400px;"> <v-card style="width:400px;">
<v-toolbar class="green"> <v-toolbar class="green">
<v-card-title> <v-card-title>
Add to favorites Add to bookmarks
</v-card-title> </v-card-title>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn @click="set(false)" icon><v-icon>close</v-icon></v-btn> <v-btn @click="set(false)" icon><v-icon>close</v-icon></v-btn>
</v-toolbar> </v-toolbar>
<v-card-text> <v-card-text>
<h6>{{$route.meta.title}} <h6 :title="this.$route.fullPath">{{$route.meta.title}}
<v-btn v-if="canCopy" @click="setclip" icon title="Copy location"><v-icon>content_copy</v-icon></v-btn> <v-btn v-if="canCopy" @click="setclip" icon title="Copy location"><v-icon>content_copy</v-icon></v-btn>
</h6> </h6>
<v-combobox multiple <v-combobox multiple
@ -36,11 +36,10 @@ display button that invokes a save favorite form
></v-combobox> ></v-combobox>
</v-card-text> </v-card-text>
<v-card-actions> <v-card-actions class="text-center">
<v-btn color="primary" text @click.stop="favorite(); set(false)">Done</v-btn> <v-btn color="primary" text @click.stop="favorite(); set(false)" >Done</v-btn>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn text @click.stop="set(false)">Cancel</v-btn> <v-btn text @click.stop="set(false)" >Cancel</v-btn>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-menu></template> </v-menu></template>
@ -53,6 +52,7 @@ display button that invokes a save favorite form
canCopy:false, canCopy:false,
tags: [], tags: [],
taglist: [ 'todo', 'find', 'some', 'good', 'tags' ], taglist: [ 'todo', 'find', 'some', 'good', 'tags' ],
exists: false
} }
}, },
methods:{ methods:{
@ -61,14 +61,17 @@ display button that invokes a save favorite form
}, },
async setclip(){ async setclip(){
await navigator.clipboard.writeText(this.$route.fullPath); await navigator.clipboard.writeText(this.$route.fullPath);
alert('Copied!' + this.$route.fullPath);
}, },
favorite(){ favorite(){
this.$store.commit('increment') this.$store.commit('increment')
console.log(this.$store.state.count) console.log(this.$store.state.count)
this.exists= !this.exists
alert("save"); alert("save");
} }
}, },
computed:{
icon: function(){return this.exists?"star":"star_border" }
},
created() { created() {
this.canCopy = !!navigator.clipboard; this.canCopy = !!navigator.clipboard;
}, },

View file

@ -45,6 +45,10 @@
<description>writes</description> <description>writes</description>
<xpath>@writes</xpath> <xpath>@writes</xpath>
</field> </field>
<field name="isService" type="xs:boolean">
<description>This job is a service</description>
<xpath>@id = jobs:services()/@id</xpath>
</field>
</fields> </fields>
<views iconclass="code"> <views iconclass="code">
<view name="filter">name description</view> <view name="filter">name description</view>

View file

@ -1,5 +1,6 @@
<entity name="favorites" xmlns="https://github.com/Quodatum/app-doc/entity"> <entity name="bookmark" xmlns="https://github.com/Quodatum/app-doc/entity">
<description>vue-poc favourites </description> <description>vue-poc bookmark </description>
<namespace prefix="bmk" uri="urn:quodatum:vue-poc.favourite" />
<fields> <fields>
<field name="created" type="xs:string"> <field name="created" type="xs:string">
<description>time of event</description> <description>time of event</description>
@ -21,5 +22,5 @@
</field> </field>
</fields> </fields>
<views iconclass="star_border"/> <views iconclass="star_border"/>
<data type="element(favorite)">doc("vue-poc/favorites.xml")/favorites/favorite</data> <data type="element(bmk:favorite)">doc("vue-poc/bookmarks.xml")/bmk:favorites/bmk:favorite</data>
</entity> </entity>

View file

@ -4,7 +4,7 @@
<fields> <fields>
<field name="xmlns" type="xs:string"> <field name="xmlns" type="xs:string">
<description>namespace</description> <description>namespace</description>
<xpath>@uri</xpath> <xpath>@xml:id</xpath>
</field> </field>
<field name="prefix" type="xs:string"> <field name="prefix" type="xs:string">
<description>commonly used namespace prefixes </description> <description>commonly used namespace prefixes </description>

View file

@ -1,129 +1,159 @@
<!-- common namespaces --> <!-- common namespaces -->
<namespaces xmlns="https://github.com/Quodatum/namespaces"> <namespaces xmlns="https://github.com/Quodatum/namespaces">
<namespace uri="http://www.w3.org/XML/1998/namespace" prefix="xml"> <namespace xml:id="http://www.w3.org/XML/1998/namespace" prefix="xml">
<description>XML core features</description> <role type="spec"/>
<description>XML core features
<dl>
<dt>xml:lang</dt>
<dd>Designed for identifying the human language used in the scope of the element to which it's attached.</dd>
<dt>xml:space</dt>
<dd>Designed to express whether or not the document's creator wishes white space to be considered as significant in the scope of the element to which it's attached.</dd>
<dt>xml:base</dt>
<dd>
The XML Base specification (Second edition) describes a facility, similar to that of HTML BASE,
for defining base URIs for parts of XML documents.
It defines a single attribute, xml:base, and describes in detail the procedure for its use in
processing relative URI refeferences.</dd>
<dt>xml:id</dt>
<dd>
The xml:id specification defines a single attribute, xml:id, known to be of type ID independently of any DTD or schema.</dd>
</dl>
</description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/1999/xlink" prefix="xlink"> <namespace xml:id="http://www.w3.org/1999/xlink" prefix="xlink">
<description>XML Linking Language (XLink) namespace</description> <description>XML Linking Language (XLink) namespace</description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2001/XInclude" prefix="xi"> <namespace xml:id="http://www.w3.org/2001/XInclude" prefix="xi">
<description>XML Inclusions (XInclude) </description> <description>XML Inclusions (XInclude) </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/1999/XSL/Format" prefix="fo"> <namespace xml:id="http://www.w3.org/1999/XSL/Format" prefix="fo">
<description>XSL Formatting Objects namespace </description> <description>XSL Formatting Objects namespace </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/1999/XSL/Transform" prefix="xsl"> <namespace xml:id="http://www.w3.org/1999/XSL/Transform" prefix="xsl">
<description>XSL Transformations namespace from the XSLT 1.0 <description>XSL Transformations namespace from the XSLT 1.0
Recommendation Recommendation
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2005/xpath-functions/math" <namespace xml:id="http://www.w3.org/2005/xpath-functions/math"
prefix="math"> prefix="math">
<description>Xpath math </description> <description>Xpath math </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2005/xpath-functions/map" <namespace xml:id="http://www.w3.org/2005/xpath-functions/map"
prefix="map"> prefix="map">
<description>Xpath map </description> <description>Xpath map </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2005/xpath-functions/array" <namespace xml:id="http://www.w3.org/2005/xpath-functions/array"
prefix="array"> prefix="array">
<description>Xpath array </description> <description>Xpath array </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2005/xqt-errors" prefix="err"> <namespace xml:id="http://www.w3.org/2005/xqt-errors" prefix="err">
<description>Xpath errors </description> <description>Xpath errors </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2010/xslt-xquery-serialization" <namespace xml:id="http://www.w3.org/2010/xslt-xquery-serialization"
prefix="output"> prefix="output">
<description>serialization parameters </description> <description>serialization parameters </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2001/XMLSchema" prefix="xsd"> <namespace xml:id="http://www.w3.org/2001/XMLSchema" prefix="xsd">
<description>XML Schema Part 1: Structures namespace. </description> <description>XML Schema Part 1: Structures namespace. </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2001/XMLSchema-datatypes" <namespace xml:id="http://www.w3.org/2001/XMLSchema-datatypes"
prefix="xs"> prefix="xs">
<description>XML Schema Part 2: Datatypes namespace. </description> <description>XML Schema Part 2: Datatypes namespace. </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2001/XMLSchema-instance" <namespace xml:id="http://www.w3.org/2001/XMLSchema-instance"
prefix="xsi"> prefix="xsi">
<description>Namespace for XML Schema attributes used in XML instances <description>Namespace for XML Schema attributes used in XML instances
(documents), such as xsi:type, xsi:schemaLocation, and xsi:nil. (documents), such as xsi:type, xsi:schemaLocation, and xsi:nil.
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2005/xpath-functions" <namespace xml:id="http://www.w3.org/2005/xpath-functions"
prefix="fn"> prefix="fn">
<description>XPath functions <description>XPath functions
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2005/xquery-local-functions" <namespace xml:id="http://www.w3.org/2005/xquery-local-functions"
prefix="local"> prefix="local">
<description>Xquery functions <description>Xquery functions
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/2000/svg" prefix="svg"> <namespace xml:id="http://www.w3.org/2000/svg" prefix="svg">
<description>Scalable Vector Graphics namespace <description>Scalable Vector Graphics namespace
</description> </description>
</namespace> </namespace>
<namespace uri="http://docbook.org/ns/docbook" prefix="d"> <namespace xml:id="http://docbook.org/ns/docbook" prefix="d">
<description>Docbook <description>Docbook
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/1998/Math/MathML" prefix="mml"> <namespace xml:id="http://www.tei-c.org/ns/1.0" prefix="t">
<description>TEI
</description>
</namespace>
<namespace xml:id="http://www.w3.org/1998/Math/MathML" prefix="mml">
<description>Math ML <description>Math ML
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.vraweb.org/vracore4.htm" prefix="vra"> <namespace xml:id="http://www.vraweb.org/vracore4.htm" prefix="vra">
<description>Visual Resources Association <description>Visual Resources Association
</description> </description>
</namespace> </namespace>
<namespace uri="http://purl.oclc.org/dsdl/schematron" prefix="sch"> <namespace xml:id="http://purl.oclc.org/dsdl/schematron" prefix="sch">
<description>Schematron <description>Schematron
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.opengis.net/kml/2.2" prefix="kml"> <namespace xml:id="http://www.opengis.net/kml/2.2" prefix="kml">
<description>Geo <description>Geo
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.opengis.net/gml" prefix="gml"> <namespace xml:id="http://www.opengis.net/gml" prefix="gml">
<description>GML <description>GML
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/ns/xproc" prefix="xproc"> <namespace xml:id="http://www.w3.org/ns/xproc" prefix="xproc">
<description>XProc <description>XProc
</description> </description>
</namespace> </namespace>
<namespace uri="http://www.w3.org/ns/xproc-step" prefix="c"> <namespace xml:id="http://www.w3.org/ns/xproc-step" prefix="c">
<description>XProc step <description>XProc step
</description> </description>
</namespace> </namespace>
<namespace uri="http://expath.org/ns/pkg" prefix="pkg"> <namespace xml:id="http://expath.org/ns/pkg" prefix="pkg">
<description>EXpath packaging <description>EXpath packaging
</description> </description>
</namespace> </namespace>
<namespace uri="http://basex.org/modules/perm" prefix="perm">
<namespace xml:id="http://basex.org/modules/perm" prefix="perm">
<description>Web permissions <description>Web permissions
</description> </description>
</namespace> </namespace>
<namespace xml:id="urn:oasis:names:tc:entity:xmlns:xml:catalog" prefix="cat">
<description>XML catalogs http://xmlcatalogs.org/
</description>
</namespace>
</namespaces> </namespaces>

View file

@ -31,6 +31,11 @@
</template> </template>
<script>{ <script>{
data(){
return {
url: "",
crumbs: [{ text:'Documentation'}]
}
}
} }
</script> </script>

View file

@ -2,7 +2,7 @@
<template id="tree"> <template id="tree">
<v-container fluid> <v-container fluid>
<v-card> <v-card>
<v-toolbar card color="grey lighten-3"> <v-toolbar color="grey lighten-3">
<v-card-title >Taxonomy test</v-card-title> <v-card-title >Taxonomy test</v-card-title>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn>todo</v-btn> <v-btn>todo</v-btn>
@ -11,24 +11,18 @@
<v-card-text> <v-card-text>
<v-layout > <v-layout >
<v-flex xs6 > <v-flex xs6 >
<v-sheet class="pa-3 primary lighten-2"> <v-sheet >
<v-text-field <v-text-field
v-model="search" v-model="search"
label="Filter tag" label="Filter tag"
flat
solo-inverted
hide-details hide-details
clearable clearable
></v-text-field> ></v-text-field>
<v-checkbox
v-model="caseSensitive"
dark
hide-details
label="Case sensitive search"
></v-checkbox>
</v-sheet> </v-sheet>
<v-treeview :items="items" item-text="label" <div style="height:300px; overflow:auto;">
<v-treeview :items="items" item-text="label"
v-model="tree" :search="search" v-model="tree" :search="search"
:open.sync="open" activatable :open.sync="open" activatable
active-class="grey lighten-4 indigo--text" active-class="grey lighten-4 indigo--text"
@ -44,6 +38,7 @@
</v-icon> </v-icon>
</template> </template>
</v-treeview> </v-treeview>
</div>
</v-flex> </v-flex>
<v-divider vertical></v-divider> <v-divider vertical></v-divider>
<v-flex xs6> <v-flex xs6>

View file

@ -8,7 +8,7 @@ import module namespace rest = "http://exquery.org/ns/restxq";
import module namespace session = "http://basex.org/modules/session"; import module namespace session = "http://basex.org/modules/session";
import module namespace ufile = 'vue-poc/file' at "../../lib/file.xqm"; import module namespace ufile = 'vue-poc/file' at "../../lib/file.xqm";
import module namespace mt = 'quodatum.data.mimetype' at "../../lib/mimetype.xqm"; import module namespace mt = 'urn:quodatum:data:mimetype' at "../../lib/mimetype.xqm";
declare namespace c="http://www.w3.org/ns/xproc-step"; declare namespace c="http://www.w3.org/ns/xproc-step";

View file

@ -60,14 +60,14 @@
</v-toolbar> </v-toolbar>
<v-card-text>
<v-flex xs12 style="height:200px" fill-height> <v-flex xs12 style="height:200px" fill-height>
<vue-ace :content="xq" mode="xquery" wrap="true" <vue-ace :content="xq" mode="xquery" wrap="true"
:settings="aceSettings" v-on:change-content="onChange" :settings="aceSettings" v-on:change-content="onChange"
></vue-ace> ></vue-ace>
</v-flex> </v-flex>
</v-card-text>
<vp-job v-if="showJob" :job="job" :waiting="waiting" :job-state="jobState" :elapsed="elapsed"></vp-job> <vp-job v-if="showJob" :job="job" :waiting="waiting" :job-state="jobState" :elapsed="elapsed"></vp-job>
</v-card-text>
<v-card-text v-if="showError"> <v-card-text v-if="showError">
<v-alert color="error" v-model="showError">Error </v-alert> <v-alert color="error" v-model="showError">Error </v-alert>
</v-card-text> </v-card-text>

View file

@ -34,10 +34,11 @@
{{ result }} {{ result }}
</v-card-text> </v-card-text>
<v-card-text> <v-card-text>
<code>{{ jobstate.text }}</code> <v-flex xs12 style="height:200px" fill-height>
</v-card-text> <vue-ace :content="jobstate.text" mode="xquery" wrap="true"></vue-ace>
</v-flex>
</v-card-text>
</v-card> </v-card>
</template> </template>

View file

@ -39,23 +39,27 @@
class="elevation-1" class="elevation-1"
no-data-text="No Jobs currently running" no-data-text="No Jobs currently running"
> >
<template slot="items" slot-scope="props"> <template v-slot:item.id="{ item }">
<td class="vtop"> <router-link :to="{name: 'job1', params: {job: item.id }}">{{ item.id }}</router-link>
<v-checkbox </template>
primary
hide-details <template v-slot:item.isService="{ item }">
v-model="props.selected" <router-link v-if="item.isService" title="Service"
></v-checkbox> :to="{name: 'service1', params: { service: item.id }}">
</td> <v-avatar color="red" size="24">
<td class="vtop"> <router-link :to="{name: 'jobShow', params: {job: props.item.id }}">{{props.item.id}}</router-link></td> <span class="white--text headline">S</span>
<td class="vtop "><div>{{ props.item.state }}</div><div>{{ props.item.type }}</div> </td> </v-avatar>
<td class="vtop " :title="props.item.registered">{{ props.item.registered | fromNow}}</td> </router-link>
<td class="vtop " :title="props.item.start">{{ props.item.start | fromNow}}</td> </template>
<td class="vtop text-xs-right">{{ props.item.duration }}</td>
<td class="vtop text-xs-right">{{ props.item.writes }}</td> <template v-slot:item.registered="{ item }">
<td class="vtop text-xs-right">{{ props.item.reads }}</td> <span>{{ item.registered | formatDate}}</span>
<td class="vtop text-xs-right">{{ props.item.user }}</td> </template>
</template>
<template v-slot:item.start="{ item }">
<span>{{ item.start | fromNow }}</span>
</template>
</v-data-table> </v-data-table>
</v-card> </v-card>
</template> </template>
@ -70,8 +74,10 @@
value: 'id' value: 'id'
}, },
{ text: 'State', value: 'state' }, { text: 'State', value: 'state' },
{ text: 'Registered', value: 'registered' }, { text: 'Service?', value: 'isservice' }, // https://stackoverflow.com/a/58034316/3210344
{ text: 'Start', value: 'start' }, { text: 'Start', value: 'start' },
{ text: 'Interval', value: 'interval' },
{ text: 'Registered', value: 'registered' },
{ text: 'Duration', value: 'duration' }, { text: 'Duration', value: 'duration' },
{ text: 'WriteL', value: 'writes' }, { text: 'WriteL', value: 'writes' },
{ text: 'ReadL', value: 'reads' }, { text: 'ReadL', value: 'reads' },
@ -92,7 +98,7 @@
HTTP.get("job") HTTP.get("job")
.then(r=>{ .then(r=>{
this.loading=false this.loading=false
this.items=r.data this.items=r.data.items
if(this.autorefresh) this.timer=setTimeout(()=>{ this.getJobs() }, 10000); if(this.autorefresh) this.timer=setTimeout(()=>{ this.getJobs() }, 10000);
}) })

View file

@ -1,22 +1,21 @@
module namespace j = 'quodatum.test.jobs'; module namespace j = 'quodatum.test.jobs';
import module namespace entity ='quodatum.models.generated' at "../../models.gen.xqm";
import module namespace dice = 'quodatum.web.dice/v4' at "../../lib/dice.xqm";
import module namespace web = 'quodatum.web.utils4' at "../../lib/webutils.xqm";
(:~ (:~
: job list : job list
:) :)
declare declare
%rest:GET %rest:path("/vue-poc/api/job") %rest:GET %rest:path("/vue-poc/api/job")
%rest:produces("application/json")
%output:method("json") %output:method("json")
function j:list() function j:list()
as element(json) as element(json)
{ {
let $jlist:=jobs:list()[. != jobs:current()] !jobs:list-details(.) let $entity:=$entity:list("basex.job")
return <json type="array"> let $items:=$entity?data()
{for $j in reverse($jlist) return dice:response($items,$entity,web:dice())
return <_ type="object">
{j:job-json($j)}
</_>
}</json>
}; };
@ -26,27 +25,16 @@ as element(json)
:) :)
declare declare
%rest:GET %rest:path("/vue-poc/api/job/{$job}") %rest:GET %rest:path("/vue-poc/api/job/{$job}")
%rest:produces("application/json")
%output:method("json") %output:method("json")
function j:job($job) function j:job($job)
as element(json) as element(json)
{ {
let $j:=jobs:list-details($job) let $this:=$entity:list("basex.job")
return <json type="object"> let $items:=$this?data()
{if($j) then j:job-json($j) else ()} let $fields:=$this?json
</json> let $item:=$items[@id=$job]
(: just one :)
return <json objects="json">{dice:json-flds($item,$fields)/*}</json>
}; };
declare function j:job-json($j as element(job))
as element(*)*
{
<id>{$j/@id/string()}</id>
,<type>{$j/@type/string()}</type>
,<state>{$j/@state/string()}</state>
,<user>{$j/@user/string()}</user>
,<registered>{$j/@time/string()}</registered>
,if($j/@start) then <start>{$j/@start/string()}</start> else ()
,<duration>{$j/@duration/string()}</duration>
,<text>{$j/string()}</text>
,<reads>{$j/@reads/string()}</reads>
,<writes>{$j/@writes/string()}</writes>
};

View file

@ -0,0 +1,113 @@
<!DOCTYPE html>
<template id="service1">
<v-card >
<v-toolbar >
<v-toolbar-title>Service info</v-toolbar-title>
<v-spacer></v-spacer>
<v-text-field
prepend-icon="filter_list"
label="Filter services"
single-line
hide-details
clearable
v-model="search"
></v-text-field>
<v-spacer></v-spacer>
<v-btn
@click="stop()"
:disabled="noSelection"
>Stop</v-btn>
<v-btn icon ><v-icon>add</v-icon></v-btn>
<v-spacer></v-spacer>
<v-btn
icon
:loading="loading"
@click="getJobs()"
@dblclick="autorefresh = !autorefresh"
:disabled="loading"
>
<v-icon>{{ autorefresh?'refresh':'arrow_downward' }}</v-icon>
</v-btn>
<vp-entitylink entity="basex.service"></vp-entitylink>
</v-toolbar>
<v-data-table
:headers="headers"
:items="items"
:search="search"
v-model="selected"
show-select
class="elevation-1"
no-data-text="No Jobs currently running"
>
<template slot="items" slot-scope="props">
<td class="vtop">
<v-checkbox
primary
hide-details
v-model="props.selected"
></v-checkbox>
</td>
<td class="vtop"> <router-link :to="{name: 'jobShow', params: {job: props.item.id }}">{{props.item.id}}</router-link></td>
<td class="vtop "><div>{{ props.item.running }}</div>
<td class="vtop " :title="props.item.interval">{{ props.item.interval }}</td>
<td class="vtop " :title="props.item.base-uri">{{ props.item['base-uri'] }}</td>
<td class="vtop ">{{ props.item.query }}</td>
</template>
</v-data-table>
</v-card>
</template>
<script>{
props: ['service'],
data: function(){
return {
headers: [
{ text: 'Job id', left: true, value: 'id'},
{ text: 'Running', value: 'running' },
{ text: 'Interval', value: 'interval' },
{ text: 'Base-uri', value: 'base-uri' },
{ text: 'Query', value: 'query' },
],
items:[],
selected: [],
search: "",
loading: false,
autorefresh: true,
timer:null
}
},
methods:{
load(){
this.loading= true
HTTP.get("data/basex.service",{params:{q:this.q}})
.then(r=>{
this.items= r.data.items
this.loading= false
if(this.autorefresh) this.timer=setTimeout(()=>{ this.load() }, 10000);
})
},
stop(){
var s=this.selected.map((j)=>{return j.id}).join(",")
console.log("AAA",this.selected)
alert(s)
}
},
computed: {
// a computed getter
noSelection: function () {
// `this` points to the vm instance
return this.selected.length==0
},
},
created(){
this.load()
},
beforeDestroy(){
if(this.timer) clearTimeout(this.timer);
}
}
</script>

View file

@ -43,7 +43,7 @@
</v-toolbar> </v-toolbar>
<v-container fluid > <v-container fluid >
<v-expansion-panels> <v-expansion-panels v-model="panel" multiple>
<v-expansion-panel expand > <v-expansion-panel expand >
<v-expansion-panel-header> <v-expansion-panel-header>
<v-layout> <v-layout>
@ -78,7 +78,8 @@
</v-layout> </v-layout>
</v-expansion-panel-header> </v-expansion-panel-header>
<v-expansion-panel-content> <v-expansion-panel-content>
<qd-table :headers="headers" :data-uri='"data/entity/"+entity +"/field"' entity="dice.field" no-data-msg="Nothing found"> <qd-table :headers="headers" :data-uri='"data/entity/"+entity +"/field"'
entity="dice.field" item-key="name" :show-select="false">
</qd-table> </qd-table>
</v-expansion-panel-content> </v-expansion-panel-content>
</v-expansion-panel> </v-expansion-panel>
@ -108,7 +109,7 @@
{text: "description", value: "description"}, {text: "description", value: "description"},
{text: "xpath", value: "xpath"} {text: "xpath", value: "xpath"}
], ],
panel: [true, false, true] panel: [1,2]
} }
}, },
methods:{ methods:{

View file

@ -1,44 +1,9 @@
<!DOCTYPE html> <!DOCTYPE html>
<template id="namespace"> <template id="namespace">
<v-container fluid> <v-container fluid>
<v-card> <qd-table :headers="headers" data-uri="data/namespace" entity="namespace" item-key="xmlns">
<template v-slot:item.xmlns="{ item }" >
<v-toolbar > <td ><router-link :to="{name:'namespace1', query:{ id: item.xmlns}}">
<v-toolbar-title>
<v-breadcrumbs :items="crumbs" >
<template slot="item" slot-scope="props">
<v-breadcrumbs-item :to="props.item.to" :disabled="props.item.disabled" :exact="true">
{{ props.item.text }}
</v-breadcrumbs-item>
</template>
</v-breadcrumbs>
</v-toolbar-title>
<v-btn @click="load" icon :loading="loading"
:disabled="loading"
><v-icon>refresh</v-icon></v-btn>
<v-spacer></v-spacer>
<v-text-field prepend-icon="filter_list" label="Filter..." v-model="q" type="search"
hide-details single-line @keyup.enter="setfilter"
clearable></v-text-field>
<v-spacer></v-spacer>
<vp-entitylink entity="namespace"></vp-entitylink>
</v-toolbar>
<v-card-text>
<v-data-table
:headers="headers"
:items="items"
:loading="loading"
hide-default-footer
:search="q"
class="elevation-1"
>
<template v-slot:item.xmlns="{ item }" >
<td ><router-link :to="{path:'namespace/item?xmlns='+ item.xmlns}">
{{ item.xmlns }} {{ item.xmlns }}
</router-link></td> </router-link></td>
</template> </template>
@ -50,60 +15,18 @@
<template slot="no-data"> <template slot="no-data">
No matching items. No matching items.
</template> </template>
</v-data-table> </qd-table>
</v-card-text> </v-container>
</v-card> </template>
</v-container> <script>{
</template>
<script>{
data: function(){ data: function(){
return { return {
items: [],
loading: false,
q: "",
message: 'bad route!',
selected:[],
headers: [ headers: [
{ text: 'namespace', value: 'xmlns'},
{ text: 'xmlns', value: 'xmlns' },
{ text: 'Description', value: 'description' }, { text: 'Description', value: 'description' },
{ text: 'Prefix', value: 'prefix' } { text: 'Prefix', value: 'prefix' }
], ]
crumbs:[{to:"/namespace", text:"namespaces"}]
} }
},
methods: {
load(){
this.loading= true
HTTP.get("data/namespace",{params:{q:this.q}})
.then(r=>{
this.items= r.data.items
this.loading= false
})
},
setfilter(){
console.log("TODO",this.q)
this.$router.push({ query: {url:this.url,q:this.q }})
},
},
watch:{
$route(vnew,vold){
console.log("ROUTE",vnew,vold)
var url=this.$route.query.url
this.url=url?url:"/";
if(vnew.query.url != vold.query.url) this.load()
}
},
created:function(){
this.q=this.$route.query.q || this.q;
this.load();
console.log("namespaces")
} }
} }
</script> </script>

View file

@ -4,7 +4,7 @@
<v-toolbar > <v-toolbar >
<v-toolbar-title> <v-toolbar-title>
<v-breadcrumbs > <v-breadcrumbs >
<v-breadcrumbs-item to="/namespace" :exact="true"> <v-breadcrumbs-item :to="{name: 'namespace'}" :exact="true">
Namespaces Namespaces
</v-breadcrumbs-item> </v-breadcrumbs-item>
@ -44,7 +44,7 @@
methods:{ methods:{
getItem(){ getItem(){
this.loading=true this.loading=true
HTTP.get("data/namespace/item",{id: this.xmlns}) HTTP.get("data/namespace/item",{params: {id: this.xmlns}})
.then(r=>{ .then(r=>{
this.loading=false; this.loading=false;
console.log(r.data) console.log(r.data)
@ -53,7 +53,7 @@
} }
}, },
created:function(){ created:function(){
this.xmlns=this.$route.query.xmlns; this.xmlns=this.$route.query.id;
this.getItem() this.getItem()
}, },
} }

View file

@ -23,6 +23,6 @@ declare
function _:model-list($id) { function _:model-list($id) {
let $entity:=$entity:list("namespace") let $entity:=$entity:list("namespace")
let $_:=trace($id," ID:") let $_:=trace($id," ID:")
let $item:=$entity?data()[1] let $item:=dice:get($entity,$id,"xmlns")
return dice:one($item,$entity) return dice:one($item,$entity)
}; };

View file

@ -14,29 +14,25 @@
<v-combobox <v-combobox
v-model="entity" v-model="entity"
:items="entities" item-text="name" :items="entities" item-text="name"
label="Select target" clearable open-on-clear label="Select target" clearable open-on-clear>
></v-combobox> <template v-slot:item="{ parent, item }">
<v-icon>{{ item.iconclass }}</v-icon>
{{ item.name }}
</template>
</v-combobox>
</v-flex> </v-flex>
<v-simple-table>
<table class="v-data-table"> <template v-slot:default>
<thead> <thead>
<tr> <tr>
<th xs1>url</th> <th v-for="col in columns " class="text-left">
<th xs1>Action</th> {{ col.label }}
<th xs1>Repeat</th> </th>
<th xs1>Last</th>
<th xs1>Count</th>
<th xs1>Avg</th>
<th xs1>min</th>
<th xs1>max</th>
<th xs1>Median</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr>
<tr>
<td> <td>
{{ entity && entity.name }} {{ entity && entity.name }}
</td> </td>
@ -70,10 +66,11 @@
<span >{{getValues.median}}</span> <span >{{getValues.median}}</span>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </template>
</v-simple-table>
<h3>Value: <v-chip color="amber" text-color="white">{{counter}}</v-chip></h3> <h3>Value: <v-chip color="amber" text-color="white">{{counter}}</v-chip></h3>
<pre>{{ result | pretty}}</pre> <pre>{{ result | pretty}}</pre>
@ -91,7 +88,18 @@
entity: null, entity: null,
counter: 0, counter: 0,
result: null, result: null,
entities: null entities: null,
columns: [
{label:"Entity"},
{label:"Action"},
{label:"Repeat"},
{label:"Last"},
{label:"Count"},
{label:"Avg"},
{label:"min"},
{label:"max"},
{label:"Median"}
]
} }
}, },
methods:{ methods:{

View file

@ -13,10 +13,10 @@ declare %updating
%rest:POST %rest:path("/vue-poc/api/ping") %rest:POST %rest:path("/vue-poc/api/ping")
%output:method("text") %output:method("text")
function ping:dopost() function ping:dopost()
{ {(
(replace value of node $ping:state/ping with 1+$ping:state/ping, replace value of node $ping:state/ping with 1+$ping:state/ping,
update:output(1+$ping:state/ping)) update:output(1+$ping:state/ping)
}; )};
(:~ (:~
: read counter : read counter

View file

@ -1,41 +0,0 @@
<!DOCTYPE html>
<template id="repo">
<v-container fluid>
<qd-table :headers="headers" data-uri="data/basex.repo" entity="repo" no-data-msg="Nothing found">
<template slot="items" slot-scope="props">
<td >
<v-checkbox
primary
hide-details
v-model="props.selected"
></v-checkbox>
</td>
<td >{{ props.item.name}}</td>
<td >{{ props.item.type }}</td>
<td >{{ props.item.version }}</td>
</template>
</qd-table>
</v-container>
</template>
<script>{
data: function(){
return {
loading: false,
items: [],
search: null,
selected: [],
headers: [
{ text: 'Name', value: 'name'},
{ text: 'Type', value: 'type' },
{ text: 'Version', value: 'version' }
]
}
},
created:function(){
console.log("repo")
}
}
</script>

View file

@ -13,6 +13,7 @@
</v-toolbar> </v-toolbar>
<v-card-text> <v-card-text>
<v-data-table <v-data-table
:headers="headers" :headers="headers"
:items="filtered" :items="filtered"

View file

@ -20,11 +20,11 @@ function set:values()
{for $name in $names {for $name in $names
let $change:=$dm($name) ne $sm($name) let $change:=$dm($name) ne $sm($name)
return <_ type="object"> return <_ type="object">
<name>{$name}</name> <name>{$name}</name>
<default>{$dm($name)}</default> <default>{$dm($name)}</default>
<current>{$sm($name)}</current> <current>{$sm($name)}</current>
<changed type="boolean">{ if ($change) then $change else false() }</changed> <changed type="boolean">{ if ($change) then $change else false() }</changed>
</_>} </_>}
</json> </json>
}; };

View file

@ -0,0 +1,44 @@
<!DOCTYPE html>
<template id="repo">
<v-container fluid>
<qd-table :headers="headers" data-uri="data/basex.repo" entity="basex.repo" item-key="name"
:show-select="false" :query.sync="query">
<template v-slot:item.name="{ item }">
<router-link :to="{name: 'repo1', query: {id: item.name }}">{{ item.name }} </router-link>
</template>
<template v-slot:actions>
<v-btn>action here</v-btn>
</template>
</qd-table>
</v-container>
</template>
<script>{
data: function(){
return {
selected: [],
query: {filter:null},
entity: "basex.repo",
headers: [
{ text: 'Name', value: 'name'},
{ text: 'Type', value: 'type' },
{ text: 'Version', value: 'version' }
]
}
},
watch: {
"query":{
handler:function(vnew,vold){
//console.log("watch",this.query)
this.$router.push({ query: this.query?this.query:null })
},
deep:true
}
},
created:function(){
console.log("repo")
// this.query.filter=this.$route.query.filter || this.query.filter
}
}
</script>

View file

@ -0,0 +1,77 @@
<!DOCTYPE html>
<!-- show single item from repository -->
<template id="repo1">
<v-card >
<v-toolbar>
<v-toolbar-title>
<v-breadcrumbs divider="/">
<v-breadcrumbs-item :to="{name: 'repo'}" :exact="true">
Repository
</v-breadcrumbs-item>
<v-breadcrumbs-item >
{{ repo }}
</v-breadcrumbs-item>
</v-breadcrumbs>
</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon @click="getItem"
:loading="loading"
:disabled="loading"
><v-icon>refresh</v-icon></v-btn>
</v-toolbar>
<v-container fluid >
todo
</v-container>
</v-card>
</template>
<script>{
data: function(){
return {
repo:null,
loading: false
}
},
methods:{
getItem(){
this.loading=true
HTTP.get("data/entity/"+this.entity)
.then(r=>{
this.loading=false
this.item=Object.assign({}, this.item, r.data)
})
},
code(item){
return item.modules + " " + item.namespaces + " " +item.code
},
getxml(){
HTTP.get("data/entity/"+this.entity,{ headers: {Accept: "text/xml"}})
.then(r=>{
this.xml=r.data;
})
},
todo(){
alert("TODO");
}
},
computed: {
dataurl(){
return '/vue-poc/api/data/' + this.entity;
},
xquery(){
return '/vue-poc/api/data/' + this.entity;
}
},
created:function(){
this.repo=this.$route.query.id;
//this.getItem()
},
}
</script>

View file

@ -53,7 +53,9 @@
snackbar: {show:false,msg:"",context:"success"}, snackbar: {show:false,msg:"",context:"success"},
valid: false, valid: false,
id: null, id: null,
crumbs: [{to:"/tasks", text:"Tasks"},{text: this.task, disabled: true}] crumbs: [{to:"/tasks", text:"Tasks"},
{to:"/tasks/"+this.task, text: this.task},
{text:"run", disabled: true}]
} }
}, },

View file

@ -17,7 +17,7 @@ declare variable $srcpath as xs:string external :="C:\Users\andy\git\vue-poc\sr
declare variable $targetpath as xs:string external :="/vuepoc-test"; declare variable $targetpath as xs:string external :="/vuepoc-test";
(:~ delete from database if not if import files list (:~ delete from database if not if import files list
@default false @default true
:) :)
declare variable $deleteMissing as xs:boolean external :=true(); declare variable $deleteMissing as xs:boolean external :=true();

View file

@ -4,7 +4,11 @@
<description> Generate <code>model.gen.xqm</code> from files in entity folder <description> Generate <code>model.gen.xqm</code> from files in entity folder
</description> </description>
</task> </task>
<task name="model2" url="model.build/tx-model.xq">
<title>Generate model.gen.xqm</title>
<description> Generate <code>model.gen.xqm</code> from files in entity folder
</description>
</task>
<task name="import2" url="task/tx-dbimport2.xq"> <task name="import2" url="task/tx-dbimport2.xq">
<title>Import files from drive into a database</title> <title>Import files from drive into a database</title>
<description>Load files into database</description> <description>Load files into database</description>

View file

@ -14,10 +14,7 @@
v-model="view" v-model="view"
borderless borderless
> >
<v-btn value="">
<router-link :to="{path: 'run', append:true }"> <v-icon>home</v-icon>Home</router-link>
</v-btn>
<v-btn value="run"> <v-btn value="run">
<router-link :to="{path: 'run', append:true }" > <v-icon>play_circle_outline</v-icon>Run</router-link> <router-link :to="{path: 'run', append:true }" > <v-icon>play_circle_outline</v-icon>Run</router-link>
</v-btn> </v-btn>

View file

@ -1,18 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<template id="users"> <template id="users">
<v-container fluid> <v-container fluid>
<qd-table :headers="headers" data-uri="data/basex.user" entity="user" no-data-msg="Nothing found"> <qd-table :headers="headers" data-uri="data/basex.user" entity="basex.user" item-key="name" no-data-msg="No users found">
<template slot="items" slot-scope="props">
<td >
<v-checkbox
primary
hide-details
v-model="props.selected"
></v-checkbox>
</td>
<td >{{ props.item.name}}</td>
<td >{{ props.item.permission }}</td>
</template>
</qd-table> </qd-table>
</v-container> </v-container>
@ -21,10 +10,6 @@
<script>{ <script>{
data: function(){ data: function(){
return { return {
loading: false,
items: [],
search: null,
selected: [],
headers: [ headers: [
{ text: 'Name', value: 'name'}, { text: 'Name', value: 'name'},
{ text: 'Permission', value: 'permission' } { text: 'Permission', value: 'permission' }

View file

@ -28,7 +28,7 @@ return $zip
}; };
(:~ (:~
: update or create database from file path : update or create database from file path, only *.xml files
: @param $dbname name of database : @param $dbname name of database
: @param $path file path contain files : @param $path file path contain files
:) :)
@ -40,7 +40,7 @@ declare %updating function dbtools:sync-from-path(
{ {
dbtools:sync-from-files($dbname, dbtools:sync-from-files($dbname,
$path, $path,
file:list($path,fn:true()), file:list($path,fn:true(),"*.xml"),
hof:id#1, hof:id#1,
$delete-missing $delete-missing
) )

View file

@ -104,10 +104,10 @@ declare function dice:response($items,$entity as map(*))
(:~ (:~
: get data for object with key =name : get data for object with key =name
:) :)
declare function dice:get($entity as map(*),$name as xs:string) declare function dice:get($entity as map(*),$key as xs:string, $keyfld as xs:string)
as element(*){ as element(*){
let $results:=$entity("data")() let $results:=$entity("data")()
return $results[$name=$entity?access?name(.)] return $results[$key = $entity?access($keyfld)(.)]
}; };
@ -121,6 +121,7 @@ declare function dice:one($item,$entity as map(*))
(:~ (:~
: @return json for item : @return json for item
: @param $opts fields, space delimited fieldnames
:) :)
declare function dice:one($item,$entity as map(*),$opts as map(*)) declare function dice:one($item,$entity as map(*),$opts as map(*))
as element(json) as element(json)

View file

@ -80,3 +80,11 @@ as map(*)
} }
) )
}; };
(:~ files of type :)
declare function ufile:list($ext as xs:string)
as xs:string*
{
let $base:=db:system()/globaloptions/webpath =>concat("/vue-poc/")
return file:list($base,true(),$ext)
};

View file

@ -1,8 +1,9 @@
xquery version "3.1"; xquery version "3.1";
module namespace mt = 'quodatum.data.mimetype'; module namespace mt = 'urn:quodatum:data:mimetype';
declare namespace MediaType='java:org.basex.util.http.MediaType'; declare namespace MediaType='java:org.basex.util.http.MediaType';
declare %basex:lazy variable $mt:lines:="media-types.properties"=>fn:unparsed-text-lines(); declare %basex:lazy variable $mt:lines:="media-types.properties"=>fn:unparsed-text-lines();
(:~ (:~
: fetch function for given data type "text","xml","binary" : fetch function for given data type "text","xml","binary"
: @return function() : @return function()

View file

@ -1,9 +1,10 @@
(: entity access maps (: entity access maps
: auto generated from xml files in entities folder at: 2020-09-30T17:59:30.342+01:00 : auto generated from xml files in entities folder at: 2020-10-13T11:34:00.267+01:00
:) :)
module namespace entity = 'quodatum.models.generated'; module namespace entity = 'quodatum.models.generated';
import module namespace cfg = "quodatum:media.image.configure" at "features/images/config.xqm";declare namespace ent='https://github.com/Quodatum/app-doc/entity'; import module namespace cfg = "quodatum:media.image.configure" at "features/images/config.xqm";declare namespace bmk='urn:quodatum:vue-poc.favourite';
declare namespace ent='https://github.com/Quodatum/app-doc/entity';
declare namespace h='urn:quodatum:vue-poc.history'; declare namespace h='urn:quodatum:vue-poc.history';
declare namespace xqdoc='http://www.xqdoc.org/1.0'; declare namespace xqdoc='http://www.xqdoc.org/1.0';
declare namespace qns='https://github.com/Quodatum/namespaces'; declare namespace qns='https://github.com/Quodatum/namespaces';
@ -17,6 +18,7 @@ declare variable $entity:list:=map {
"duration": function($_ as element()) as xs:string {$_/@duration }, "duration": function($_ as element()) as xs:string {$_/@duration },
"id": function($_ as element()) as xs:string {$_/@id }, "id": function($_ as element()) as xs:string {$_/@id },
"interval": function($_ as element()) as xs:string {$_/@interval }, "interval": function($_ as element()) as xs:string {$_/@interval },
"isService": function($_ as element()) as xs:boolean {$_/@id = jobs:services()/@id },
"reads": function($_ as element()) as xs:string {$_/@reads }, "reads": function($_ as element()) as xs:string {$_/@reads },
"registered": function($_ as element()) as xs:string {$_/@time }, "registered": function($_ as element()) as xs:string {$_/@time },
"start": function($_ as element()) as xs:string {$_/@start }, "start": function($_ as element()) as xs:string {$_/@start },
@ -43,6 +45,10 @@ declare variable $entity:list:=map {
(: xs:string :) (: xs:string :)
fn:data($_/@interval)!element interval { .} fn:data($_/@interval)!element interval { .}
}, },
"isService": function($_ as element()) as element(isService)? {
(: xs:boolean :)
fn:data($_/@id = jobs:services()/@id)!element isService { attribute type {'boolean'}, .}
},
"reads": function($_ as element()) as element(reads)? { "reads": function($_ as element()) as element(reads)? {
(: xs:string :) (: xs:string :)
fn:data($_/@reads)!element reads { .} fn:data($_/@reads)!element reads { .}
@ -242,6 +248,44 @@ hof:top-k-by(admin:logs(), string#1, 2)
"views": map{ "views": map{
}
},
"bookmark": map{
"name": "bookmark",
"description": "vue-poc bookmark ",
"access": map{
"created": function($_ as element()) as xs:string {$_/@when },
"id": function($_ as element()) as xs:string {$_/@id },
"url": function($_ as element()) as xs:string {$_/@url },
"user": function($_ as element()) as xs:string {$_/@user } },
"filter": function($item,$q) as xs:boolean{
some $e in ( ) satisfies
fn:contains($e,$q, 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive')
},
"json": map{
"created": function($_ as element()) as element(created)? {
(: xs:string :)
fn:data($_/@when)!element created { .}
},
"id": function($_ as element()) as element(id)? {
(: xs:string :)
fn:data($_/@id)!element id { .}
},
"url": function($_ as element()) as element(url)? {
(: xs:string :)
fn:data($_/@url)!element url { .}
},
"user": function($_ as element()) as element(user)? {
(: xs:string :)
fn:data($_/@user)!element user { .}
} },
"data": function() as element(bmk:favorite)*
{ doc("vue-poc/bookmarks.xml")/bmk:favorites/bmk:favorite },
"views": map{
} }
}, },
"dice.entity": map{ "dice.entity": map{
@ -368,44 +412,6 @@ hof:top-k-by(admin:logs(), string#1, 2)
"views": map{ "views": map{
'filter': 'name description' 'filter': 'name description'
}
},
"favorites": map{
"name": "favorites",
"description": "vue-poc favourites ",
"access": map{
"created": function($_ as element()) as xs:string {$_/@when },
"id": function($_ as element()) as xs:string {$_/@id },
"url": function($_ as element()) as xs:string {$_/@url },
"user": function($_ as element()) as xs:string {$_/@user } },
"filter": function($item,$q) as xs:boolean{
some $e in ( ) satisfies
fn:contains($e,$q, 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive')
},
"json": map{
"created": function($_ as element()) as element(created)? {
(: xs:string :)
fn:data($_/@when)!element created { .}
},
"id": function($_ as element()) as element(id)? {
(: xs:string :)
fn:data($_/@id)!element id { .}
},
"url": function($_ as element()) as element(url)? {
(: xs:string :)
fn:data($_/@url)!element url { .}
},
"user": function($_ as element()) as element(user)? {
(: xs:string :)
fn:data($_/@user)!element user { .}
} },
"data": function() as element(favorite)*
{ doc("vue-poc/favorites.xml")/favorites/favorite },
"views": map{
} }
}, },
"filehistory": map{ "filehistory": map{
@ -566,10 +572,10 @@ hof:top-k-by(admin:logs(), string#1, 2)
"access": map{ "access": map{
"description": function($_ as element()) as xs:string {$_/qns:description }, "description": function($_ as element()) as xs:string {$_/qns:description },
"prefix": function($_ as element()) as xs:string {$_/@prefix }, "prefix": function($_ as element()) as xs:string {$_/@prefix },
"xmlns": function($_ as element()) as xs:string {$_/@uri } }, "xmlns": function($_ as element()) as xs:string {$_/@xml:id } },
"filter": function($item,$q) as xs:boolean{ "filter": function($item,$q) as xs:boolean{
some $e in ( $item/@uri, $item/qns:description) satisfies some $e in ( $item/@xml:id, $item/qns:description) satisfies
fn:contains($e,$q, 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive') fn:contains($e,$q, 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive')
}, },
"json": map{ "json": map{
@ -583,7 +589,7 @@ hof:top-k-by(admin:logs(), string#1, 2)
}, },
"xmlns": function($_ as element()) as element(xmlns)? { "xmlns": function($_ as element()) as element(xmlns)? {
(: xs:string :) (: xs:string :)
fn:data($_/@uri)!element xmlns { .} fn:data($_/@xml:id)!element xmlns { .}
} }, } },
"data": function() as element(qns:namespace)* "data": function() as element(qns:namespace)*

View file

@ -1,10 +1,10 @@
{ {
"name": "vue-poc", "name": "vue-poc",
"version": "0.5.2@2020-09-04", "version": "0.5.3@2020-10-08",
"description": "App framework experiments, Frontend vuetify, backend: basex", "description": "App framework experiments, Frontend vuetify, backend: basex",
"dependencies": { "dependencies": {
"ace": "1.4.12", "ace-builds": "1.4.12",
"vuetify": "2.3.10", "vuetify": "2.3.13",
"vue": "2.6.11", "vue": "2.6.11",
"vuex": "3.1.0", "vuex": "3.1.0",
"vue-router": "3.1.6", "vue-router": "3.1.6",

2
src/vue-poc/readme.md Normal file
View file

@ -0,0 +1,2 @@
Vue-poc

View file

@ -43,8 +43,8 @@ const router = new VueRouter({
{ path: 'schema', name:"schema", component: Schema, meta:{title:"Schemas"} }, { path: 'schema', name:"schema", component: Schema, meta:{title:"Schemas"} },
{ path: 'taxonomy', component: Taxonomy, meta:{title:"Taxonomies"} }, { path: 'taxonomy', component: Taxonomy, meta:{title:"Taxonomies"} },
{ path: 'mimetype', component: Mimetype, meta:{title:"Mimetypes"} }, { path: 'mimetype', component: Mimetype, meta:{title:"Mimetypes"} },
{ path: 'namespace', component: Namespace, meta:{title:"Namespaces"} }, { path: 'namespace', name: "namespace", component: Namespace, meta:{title:"Namespaces"} },
{ path: 'namespace/item', component: Namespace1, meta:{title:"Namespace"} }, { path: 'namespace/item', name: "namespace1", component: Namespace1, meta:{title:"Namespace"} },
{ path: 'entity', component: Entity, meta:{title:"Entities"} }, { path: 'entity', component: Entity, meta:{title:"Entities"} },
{ path: 'entity/:entity', component: { template: '<router-view/>' } { path: 'entity/:entity', component: { template: '<router-view/>' }
,children: [ ,children: [
@ -68,6 +68,7 @@ const router = new VueRouter({
{ path: '/files', component: Files,meta:{title:"File system"},props:{protocol:"webfile"} }, { path: '/files', component: Files,meta:{title:"File system"},props:{protocol:"webfile"} },
{ path: '/database', component: Files,meta:{title:"Databases"},props:{protocol:"xmldb"} }, { path: '/database', component: Files,meta:{title:"Databases"},props:{protocol:"xmldb"} },
{ path: '/login', component: Login,meta:{title:"login"} }, { path: '/login', component: Login,meta:{title:"login"} },
{ path: '/settings', component: { template: '<router-view/>' } { path: '/settings', component: { template: '<router-view/>' }
,children: [ ,children: [
{ {
@ -87,6 +88,13 @@ const router = new VueRouter({
] ]
}, },
{ path: '/performance', component: { template: '<router-view/>' }
,children: [
{ path: 'ping', component: Ping, meta:{title:"Ping"} },
{ path: 'dicetest', component: Dicetest, meta:{title: "Dice test"} }
]
},
{ path: '/server', component: { template: '<router-view/>' } { path: '/server', component: { template: '<router-view/>' }
,children: [ ,children: [
{ {
@ -106,15 +114,16 @@ const router = new VueRouter({
}, },
{ path: 'jobs', name:"jobs", component: Jobs, meta:{title:"Jobs running"} }, { path: 'jobs', name:"jobs", component: Jobs, meta:{title:"Jobs running"} },
{ path: 'jobs/:job', name:"jobShow", component: Job, props: true, meta:{title:"Job Status"} }, { path: 'jobs/:job', name:"job1", component: Job, props: true, meta:{title:"Job Status"} },
{ path: 'services', component: Services, meta:{title:"Services"} }, { path: 'services', component: Services, meta:{title:"Services"} },
{ path: 'upload', component: Upload,meta:{title:"Upload"} }, { path: 'services/:service', name:"service1", component: Service1, props: true, meta:{title:"Service info"} },
{ path: 'upload', component: Upload, meta:{title:"Upload"} },
{ path: 'settings', component: Basexsettings,meta:{title:"BaseX settings"} }, { path: 'settings', component: Basexsettings, meta:{title: "BaseX settings"} },
{ path: 'ping', component: Ping,meta:{title:"Ping"} },
{ path: 'dicetest', component: Dicetest,meta:{title:"Dice test"} }, { path: 'users', component: Users, meta:{title: "Users"} },
{ path: 'users', component: Users,meta:{title:"Users"} }, { path: 'repo', name: 'repo', component: Repo, meta:{title: "BaseX Repository"} },
{ path: 'repo', component: Repo,meta:{title:"Repository"} }, { path: 'repo1', name: "repo1", component: Repo1, props: true, meta:{title: "Repository item"} },
] ]
}, },
{ path: '/history', component: { template: '<router-view/>' } { path: '/history', component: { template: '<router-view/>' }

File diff suppressed because it is too large Load diff

View file

@ -10,7 +10,7 @@
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic"/> <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic"/>
<link rel="stylesheet" href="//fonts.googleapis.com/icon?family=Material+Icons"/> <link rel="stylesheet" href="//fonts.googleapis.com/icon?family=Material+Icons"/>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" > <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" >
<link rel="stylesheet" href="//unpkg.com/vuetify@2.3.10/dist/vuetify.min.css" type="text/css"/> <link rel="stylesheet" href="//unpkg.com/vuetify@2.3.13/dist/vuetify.min.css" type="text/css"/>
<link rel="stylesheet" href="//unpkg.com/@riophae/vue-treeselect@0.0.29/dist/vue-treeselect.min.css"/> <link rel="stylesheet" href="//unpkg.com/@riophae/vue-treeselect@0.0.29/dist/vue-treeselect.min.css"/>
<link rel="stylesheet" href="/vue-poc/ui/prism/prism.css" type="text/css"/> <link rel="stylesheet" href="/vue-poc/ui/prism/prism.css" type="text/css"/>
<link rel="stylesheet" href="//unpkg.com/leaflet@1.6.0/dist/leaflet.css"/> <link rel="stylesheet" href="//unpkg.com/leaflet@1.6.0/dist/leaflet.css"/>
@ -39,10 +39,10 @@
<script src="//cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.js" crossorigin="anonymous"></script>
<script src="//unpkg.com/vuex@3.1.0/dist/vuex.js" crossorigin="anonymous"></script> <script src="//unpkg.com/vuex@3.1.0/dist/vuex.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/qs/6.4.0/qs.js" crossorigin="anonymous" ></script> <script src="//cdnjs.cloudflare.com/ajax/libs/qs/6.4.0/qs.js" crossorigin="anonymous" ></script>
<script src="//unpkg.com/vuetify@2.3.10/dist/vuetify.min.js" crossorigin="anonymous"></script> <script src="//unpkg.com/vuetify@2.3.13/dist/vuetify.min.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.10/ace.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.10/ext-language_tools.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ext-language_tools.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.10/ext-linking.js" crossorigin="anonymous" charset="utf-8"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ext-linking.js" crossorigin="anonymous" charset="utf-8"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/js-beautify/1.9.0/beautify.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/js-beautify/1.9.0/beautify.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/js-beautify/1.9.0/beautify-css.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/js-beautify/1.9.0/beautify-css.js" crossorigin="anonymous"></script>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.3 KiB