From a9b2bff0432a1b42337eb74dd16004d2877f2d21 Mon Sep 17 00:00:00 2001 From: andy Date: Sat, 2 Sep 2017 22:35:31 +0100 Subject: [PATCH] settings --- src/vue-poc/components/core.js | 122 +++- src/vue-poc/components/qd-fullscreen.vue | 14 + src/vue-poc/features/about.vue | 19 +- src/vue-poc/features/edit/edit.vue | 7 +- src/vue-poc/features/images/dates.vue | 49 +- src/vue-poc/features/images/images.vue | 28 +- src/vue-poc/features/images/images.xqm | 46 +- src/vue-poc/features/images/keywords.vue | 53 +- .../features/images/pics-06-keywords.xq | 27 + .../features/images/pics-07-datetaken.xq | 28 + src/vue-poc/features/login/login.xqm | 21 +- src/vue-poc/features/puzzle.vue | 5 +- .../acesettings.vue} | 4 +- src/vue-poc/features/settings/settings.vue | 38 ++ src/vue-poc/features/tabs.vue | 3 +- .../features/tasks/model.build/entity-gen.xqm | 215 ------- .../features/tasks/model.build/rxq-model.xqm | 16 +- src/vue-poc/features/tasks/xqdoc/xqdoc.vue | 1 + src/vue-poc/features/vue-poc.vue | 224 +++++++ src/vue-poc/models.gen.xqm | 24 +- src/vue-poc/models/adminlog.xml | 66 +-- src/vue-poc/models/thumbnail.xml | 16 + src/vue-poc/static/app-gen.js | 555 ++++++++++++++++-- src/vue-poc/static/app.html | 4 + src/vue-poc/static/vue-poc.png | Bin 0 -> 55775 bytes src/vue-poc/static/vue-poc.svg | 200 +++++++ src/vue-poc/vue-api2.xqm | 18 - 27 files changed, 1430 insertions(+), 373 deletions(-) create mode 100644 src/vue-poc/components/qd-fullscreen.vue create mode 100644 src/vue-poc/features/images/pics-06-keywords.xq create mode 100644 src/vue-poc/features/images/pics-07-datetaken.xq rename src/vue-poc/features/{settings.vue => settings/acesettings.vue} (97%) create mode 100644 src/vue-poc/features/settings/settings.vue delete mode 100644 src/vue-poc/features/tasks/model.build/entity-gen.xqm create mode 100644 src/vue-poc/features/vue-poc.vue create mode 100644 src/vue-poc/static/vue-poc.png create mode 100644 src/vue-poc/static/vue-poc.svg diff --git a/src/vue-poc/components/core.js b/src/vue-poc/components/core.js index e8c123d..91f3744 100644 --- a/src/vue-poc/components/core.js +++ b/src/vue-poc/components/core.js @@ -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);}) }); }) - } - }; - -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"); + }, + 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);}) + }); + }) + } }; + + //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); }); diff --git a/src/vue-poc/components/qd-fullscreen.vue b/src/vue-poc/components/qd-fullscreen.vue new file mode 100644 index 0000000..ed6c4e8 --- /dev/null +++ b/src/vue-poc/components/qd-fullscreen.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/src/vue-poc/features/about.vue b/src/vue-poc/features/about.vue index 2d89232..8a4c1c4 100644 --- a/src/vue-poc/features/about.vue +++ b/src/vue-poc/features/about.vue @@ -1,9 +1,12 @@ - diff --git a/src/vue-poc/features/images/images.vue b/src/vue-poc/features/images/images.vue index c642892..154f921 100644 --- a/src/vue-poc/features/images/images.vue +++ b/src/vue-poc/features/images/images.vue @@ -20,24 +20,24 @@ {{ total }} in {{ elapsed | round(2) }} secs Page:{{ query.page+1 }} - + arrow_back - + arrow_forward - + - @@ -69,9 +69,17 @@ + > + + + closeClear keyword @@ -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 }) diff --git a/src/vue-poc/features/images/images.xqm b/src/vue-poc/features/images/images.xqm index 2455b18..95d9595 100644 --- a/src/vue-poc/features/images/images.xqm +++ b/src/vue-poc/features/images/images.xqm @@ -26,7 +26,7 @@ function vue-api:id( $id as xs:integer) }; (:~ - : do a thumbnail + : get set of thumbnails matching search :) declare %rest:single @@ -62,22 +62,52 @@ $keyword }; + + (:~ : 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 { - $keys!<_ >{.} + $keys!<_ type="object"> + {@name/string()} + {@count/string()} + + } + +}; + +(:~ + : 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 + { + for $year in $years + return <_ type="object"> + {$year/@value/string()} + {$year/@count/string()} + { + 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} + } + } }; diff --git a/src/vue-poc/features/images/keywords.vue b/src/vue-poc/features/images/keywords.vue index b483f87..343517c 100644 --- a/src/vue-poc/features/images/keywords.vue +++ b/src/vue-poc/features/images/keywords.vue @@ -9,20 +9,63 @@ arrow_back - todo + click to show -keywords todo + + + + + + + + + {{keyword.count}} + + + + + - + }, + created:function(){ + console.log("create keywords") + this.getKeywords() + } +} diff --git a/src/vue-poc/features/images/pics-06-keywords.xq b/src/vue-poc/features/images/pics-06-keywords.xq new file mode 100644 index 0000000..2347b1e --- /dev/null +++ b/src/vue-poc/features/images/pics-06-keywords.xq @@ -0,0 +1,27 @@ +(:~ get keywords + : + : + : 14569796 14569818 + : +:) +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:={ + 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 + + {db:node-id($i)=>string-join(" ")} + + } +return $kd=>local:put($DEST) diff --git a/src/vue-poc/features/images/pics-07-datetaken.xq b/src/vue-poc/features/images/pics-07-datetaken.xq new file mode 100644 index 0000000..9b473fc --- /dev/null +++ b/src/vue-poc/features/images/pics-07-datetaken.xq @@ -0,0 +1,28 @@ +(:~ get datetaken + : + : + : 14569796 14569818 + : +:) +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:={ +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 +{for $image in $image +let $month:=substring($image/datetaken,6,2) +group by $month +order by $month +return +} + +} +return $dates =>local:put($DEST) \ No newline at end of file diff --git a/src/vue-poc/features/login/login.xqm b/src/vue-poc/features/login/login.xqm index 9fa2eae..034c0d4 100644 --- a/src/vue-poc/features/login/login.xqm +++ b/src/vue-poc/features/login/login.xqm @@ -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 + { if($user) then $user else "guest" } + {$role} + {session:id()} + {session:created()} + +}; + (:~ : Checks the user input and redirects to the main page, or back to the login page. : @param $name user name diff --git a/src/vue-poc/features/puzzle.vue b/src/vue-poc/features/puzzle.vue index d52b677..fe4c723 100644 --- a/src/vue-poc/features/puzzle.vue +++ b/src/vue-poc/features/puzzle.vue @@ -13,10 +13,8 @@
-
- + -
@@ -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 diff --git a/src/vue-poc/features/settings.vue b/src/vue-poc/features/settings/acesettings.vue similarity index 97% rename from src/vue-poc/features/settings.vue rename to src/vue-poc/features/settings/acesettings.vue index fcdd525..0d000ec 100644 --- a/src/vue-poc/features/settings.vue +++ b/src/vue-poc/features/settings/acesettings.vue @@ -1,5 +1,5 @@ -