vuetify 1.3.14

This commit is contained in:
Andy Bunce 2018-12-17 10:24:08 +00:00
parent 18114ae8e4
commit 581aa90d6a
45 changed files with 2024 additions and 464 deletions

4
.idea/encodings.xml generated Normal file
View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

6
.idea/misc.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/vue-poc.iml" filepath="$PROJECT_DIR$/vue-poc.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

437
.idea/workspace.xml generated Normal file
View file

@ -0,0 +1,437 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="014f2dd0-5c39-4e2d-ba78-feaf47c17a19" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/src/vue-poc/api.xqm" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/api.xqm" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/components/EditTabs.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/components/EditTabs.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/components/vue-ace.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/components/vue-ace.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/features/edit/edit.vue" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/features/edit/edit.vue" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/lib/dbtools.xqm" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/lib/dbtools.xqm" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/lib/dice.xqm" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/lib/dice.xqm" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/lib/xqdoc/html-index.xsl" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/lib/xqdoc/html-index.xsl" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/static/app-gen.js" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/static/app-gen.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/vue-poc/static/app.html" beforeDir="false" afterPath="$PROJECT_DIR$/src/vue-poc/static/app.html" afterDir="false" />
</list>
<ignored path="$PROJECT_DIR$/out/" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/xqdoc/html-index.xsl">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="170">
<caret line="10" selection-start-line="10" selection-end-line="10" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/aync.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="20" selection-start-line="14" selection-start-column="20" selection-end-line="14" selection-end-column="20" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/xqdoc/parsepaths.xq">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/dbtools.xqm">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="2" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/dice.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-534">
<caret line="61" column="23" selection-start-line="61" selection-start-column="23" selection-end-line="61" selection-end-column="23" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/cons.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/vue-compile/html5parse.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/vue-compile/vue-compile.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1139">
<caret line="67" column="17" selection-start-line="67" selection-start-column="17" selection-end-line="67" selection-end-column="17" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/logo.svg">
<provider selected="true" editor-type-id="images" />
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/vue-poc/models.gen.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
</file>
</leaf>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/src/vue-poc/api.xqm" />
<option value="$PROJECT_DIR$/src/vue-poc/lib/dbtools.xqm" />
<option value="$PROJECT_DIR$/src/vue-poc/lib/dice.xqm" />
<option value="$PROJECT_DIR$/src/vue-poc/lib/history.xqm" />
<option value="$PROJECT_DIR$/src/vue-poc/lib/xqdoc/html-index.xsl" />
<option value="$PROJECT_DIR$/src/vue-poc/lib/aync.xqm" />
</list>
</option>
</component>
<component name="NamedScopeManager">
<scope name="basex" pattern="*.xqm" />
</component>
<component name="ProjectFrameBounds">
<option name="x" value="10" />
<option name="y" value="20" />
<option name="width" value="1346" />
<option name="height" value="698" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="vue-poc" type="b2602c69:ProjectViewProjectNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="vue-poc" type="b2602c69:ProjectViewProjectNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="vue-poc" type="b2602c69:ProjectViewProjectNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="vue-poc" type="b2602c69:ProjectViewProjectNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="lib" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="vue-poc" type="b2602c69:ProjectViewProjectNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="lib" type="462c0819:PsiDirectoryNode" />
<item name="vue-compile" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="vue-poc" type="b2602c69:ProjectViewProjectNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="src" type="462c0819:PsiDirectoryNode" />
<item name="vue-poc" type="462c0819:PsiDirectoryNode" />
<item name="lib" type="462c0819:PsiDirectoryNode" />
<item name="xqdoc" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="PackagesPane" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="com.android.tools.idea.instantapp.provision.ProvisionBeforeRunTaskProvider.myTimeStamp" value="1543100014184" />
<property name="jdk.selected.JAVA_MODULE" value="1.8" />
<property name="last_opened_file_path" value="$USER_HOME$/Desktop/basex.versions/basex.91/BaseX.jar" />
<property name="project.structure.last.edited" value="Global Libraries" />
<property name="project.structure.proportion" value="0.0" />
<property name="project.structure.side.proportion" value="0.2" />
<property name="run.code.analysis.last.selected.profile" value="pProject Default" />
<property name="settings.editor.selected.configurable" value="uk.co.reecedunn.intellij.plugin.intellij.settings.XQueryProjectSettingsConfigurable" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="014f2dd0-5c39-4e2d-ba78-feaf47c17a19" name="Default Changelist" comment="" />
<created>1543095406989</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1543095406989</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="10" y="20" width="1346" height="698" extended-state="0" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.2651633" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Designer" order="2" />
<window_info id="Image Layers" order="3" />
<window_info id="Capture Tool" order="4" />
<window_info id="UI Designer" order="5" />
<window_info id="Learn" order="6" />
<window_info id="Favorites" order="7" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Terminal" order="7" />
<window_info anchor="bottom" id="Event Log" order="8" side_tool="true" />
<window_info anchor="bottom" id="Version Control" order="9" />
<window_info anchor="bottom" id="Inspection Results" order="10" visible="true" weight="0.19115044" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="Palette" order="3" />
<window_info anchor="right" id="Maven" order="4" />
<window_info anchor="right" id="Theme Preview" order="5" />
<window_info anchor="right" id="Capture Analysis" order="6" />
<window_info anchor="right" id="Palette&#9;" order="7" />
</layout>
</component>
<component name="XQueryProjectSettings">
<option name="XQuery10Dialect" />
<option name="XQuery30Dialect" value="basex" />
<option name="XQuery31Dialect" value="basex" />
<option name="XQueryVersion" value="3.1" />
<option name="implementationVersion" value="basex/v9.1" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/vue-poc/cxan.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" column="8" lean-forward="true" selection-start-line="8" selection-start-column="8" selection-end-line="8" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/api.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="272">
<caret line="16" selection-start-line="16" selection-end-line="16" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/entity-gen.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/file.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/pipeline.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/query-a.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="18" column="28" selection-start-line="18" selection-start-column="28" selection-end-line="18" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/history.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="13" column="51" selection-start-line="13" selection-start-column="51" selection-end-line="13" selection-end-column="51" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/store.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/store-test.xq">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="58" selection-start-column="58" selection-end-column="58" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/xqdoc/html-index.xsl">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="170">
<caret line="10" selection-start-line="10" selection-end-line="10" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/aync.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="20" selection-start-line="14" selection-start-column="20" selection-end-line="14" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/xqdoc/parsepaths.xq">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/dbtools.xqm">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="2" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/cons.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/vue-compile/html5parse.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/vue-compile/vue-compile.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1139">
<caret line="67" column="17" selection-start-line="67" selection-start-column="17" selection-end-line="67" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/logo.svg">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/models.gen.xqm">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/src/vue-poc/lib/dice.xqm">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-534">
<caret line="61" column="23" selection-start-line="61" selection-start-column="23" selection-end-line="61" selection-end-column="23" />
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>
<state key="ArtifactsStructureConfigurable.UI">
<settings>
<artifact-editor />
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="FacetStructureConfigurable.UI">
<settings>
<last-edited>No facets are configured</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="GlobalLibrariesConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="JdkListConfigurable.UI">
<settings>
<last-edited>1.8</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ModuleStructureConfigurable.UI">
<settings>
<last-edited>vue-poc</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
<option value="0.6" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ProjectLibrariesConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
<state key="ScopeChooserConfigurable.UI">
<settings>
<last-edited>basex</last-edited>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
<order>
<scope name="basex" />
</order>
</settings>
</state>
</states>
</component>
</project>

10
.idea/xquery_config.xml generated Normal file
View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="XQueryProjectSettings">
<option name="XQuery10Dialect" />
<option name="XQuery30Dialect" value="basex" />
<option name="XQuery31Dialect" value="basex" />
<option name="XQueryVersion" value="3.1" />
<option name="implementationVersion" value="basex/v9.1" />
</component>
</project>

View file

@ -1,3 +1,4 @@
xquery version "3.1";
(:~ (:~
: vue-poc api. : vue-poc api.
: :
@ -94,3 +95,17 @@ as element(json)
</_> </_>
}</json> }</json>
}; };
declare
%rest:POST
%rest:path("/vue-poc/api/upload")
%rest:form-param("files", "{$files}")
function vue-api:upload($files) {
for $name in map:keys($files)
let $content := $files($name)
let $path := file:temp-dir() || $name
return (
file:write-binary($path, $content),
<file name="{ $name }" size="{ file:size($path) }"/>
)
};

View file

@ -84,7 +84,8 @@
<v-list-tile-title><qd-fullscreen> Full screen</qd-fullscreen></v-list-tile-title> <v-list-tile-title><qd-fullscreen> Full screen</qd-fullscreen></v-list-tile-title>
</v-list-tile> </v-list-tile>
<v-list-tile > <v-list-tile >
<v-list-tile-title><v-switch label="Dark theme" v-model="dark"></v-switch></v-list-tile-title> <v-list-tile-title>Dark theme</v-list-tile-title>
<v-list-tile-action ><v-switch v-model="dark"></v-switch> </v-list-tile-action>
</v-list-tile> </v-list-tile>
<v-divider ></v-divider> <v-divider ></v-divider>
<v-list-tile > <v-list-tile >
@ -206,7 +207,18 @@
{href: '/tree',text: 'Tree',icon: 'nature'}, {href: '/tree',text: 'Tree',icon: 'nature'},
{href: '/tree2',text: 'Tree 2',icon: 'nature'} {href: '/tree2',text: 'Tree 2',icon: 'nature'}
]}, ]},
{
icon: 'toys',
text: 'Labs' ,
model: false,
children: [
{href: '/labs/scratch',text: 'Scratch pad',icon: 'filter_frames'},
{href: '/labs/timeline',text: 'Time line',icon: 'timelapse'},
{href: '/labs/svg',text: 'SVG',icon: 'extension'},
{href: '/labs/svg2',text: 'SVG2',icon: 'extension'},
{href: '/labs/tree',text: 'Tree',icon: 'nature'},
{href: '/labs/tree2',text: 'Tree 2',icon: 'nature'}
]},
{href: '/settings',text: 'Settings',icon: 'settings' }, {href: '/settings',text: 'Settings',icon: 'settings' },
{href: '/about',text: 'About (v0.3.2)' , icon: 'help' }, {href: '/about',text: 'About (v0.3.2)' , icon: 'help' },
] ]

View file

@ -3,21 +3,24 @@
// name: // name:
// contentType: // contentType:
// text: // text:
// id: // id: ids have the form "Tn"
// url: // url:
// requires: Settings,HTTP
// //
const EditTabs=new Vue({ const GEditTabs={
data(){ data(){
return { return {
items:[], items:[],
length: 0,
nextId: 1, nextId: 1,
currentId: null currentId: null,
restored: null
} }
}, },
methods: { methods: {
addItem(tab){ addItem(tab){
console.log("new: ",tab); //console.log("new: ",tab);
var def={name: "AA"+this.nextId, var def={name: "AA"+this.nextId,
contentType: "text/xml", contentType: "text/xml",
mode: "xml", mode: "xml",
@ -25,20 +28,17 @@ const EditTabs=new Vue({
url: null url: null
}; };
var etab = Object.assign(def,tab); var etab = Object.assign(def,tab);
etab.id= ""+this.nextId etab.id= "T" + this.nextId
this.items.push (etab); this.items.push (etab);
this.length++
this.nextId++; this.nextId++;
return etab; return etab;
}, },
closeItem(item){ closeItem(item){
var index=this.items.indexOf(item); //https://github.com/vuejs/vue/issues/5855
if (index > -1) { this.items=this.items.filter(t => t.id !== item.id)
alert("index: "+index) this.length--;
this.items.splice(index, 1);
index=(index==0)?0:index-1;
this.currentId=(this.items.length)?"T"+this.items[index].id : null;
}
}, },
// fetch content from server and create tab // fetch content from server and create tab
@ -65,7 +65,7 @@ const EditTabs=new Vue({
restore(){ restore(){
that=this that=this
Settings.getItem('edit/items') this.restored=Settings.getItem('edit/items')
.then(function (v){ .then(function (v){
console.log("items ",v) console.log("items ",v)
v.forEach(v =>that.addItem(v)) v.forEach(v =>that.addItem(v))
@ -76,9 +76,16 @@ const EditTabs=new Vue({
}); });
}, },
sorted(){ sorted(){ /* sorted indices */
return this.items.slice(0).sort((a,b) => a.name.localeCompare(b.name)) var len=this.items.length
var indices = new Array(len);
for (var i = 0; i < len; ++i) indices[i] = i;
var list=this.items
return indices.sort((a,b) =>list[a].name.localeCompare(list[b].name))
} }
},
created(){
console.log("EditTabs created")
} }
}); };

View file

@ -0,0 +1,60 @@
// ace customisations
const AceExtras={
rhymeCompleter: {
// test completer
getCompletions: function(editor, session, pos, prefix, callback) {
if (prefix.length === 0) { callback(null, []); return }
axios.get("http://rhymebrain.com/talk",{params:{function:"getRhymes",word:prefix}})
.then(
function(wordList) {
// wordList like [{"word":"flow","freq":24,"score":300,"flags":"bc","syllables":"1"}]
var r=wordList.data.map(function(ea) {
return {name: ea.word, value: ea.word, score: ea.score, meta: "rhyme"}
})
callback(null,r)
})
}
},
//basex functions
basexCompleter: {
getCompletions: function(editor, session, pos, prefix, callback) {
if (prefix.length === 0) { callback(null, []); return }
console.log("dd",prefix)
callback(null, [{
caption: "archive:create#2",
snippet: "archive:create(${1:entries}, ${2:contents})",
score: 100,
meta: "archive",
completer: this
}, {
caption: "archive:create#3",
snippet: "archive:create(${1:entries}, ${2:contents}, ${3:options})",
score: 100,
meta: "archive",
completer: this
}])
}
},
snippets:[
{
name: "test",
content: "something",
tabTrigger: "test:"
},
{
name: "test2",
content: "some2",
tabTrigger: "he"
}
],
install: function(Vue){
Object.defineProperty(Vue.prototype, '$aceExtras', {
get () { return AceExtras }
})
}
};
Vue.use(AceExtras);

View file

@ -11,7 +11,6 @@ const Notification={
elapsed: null elapsed: null
}, },
opts); opts);
console.log("opt",opts);
this.messages.unshift(data); this.messages.unshift(data);
this.messages.length = Math.min(this.messages.length, 30); this.messages.length = Math.min(this.messages.length, 30);
++this.unseen; ++this.unseen;

View file

@ -1,42 +1,51 @@
<!DOCTYPE html> <!DOCTYPE html>
<!-- <!--
file upload see https://github.com/thetutlage/vue-clip simple file upload component
https://stackoverflow.com/questions/52645358/vuetify-file-uploads
--> -->
<template id="qd-fileupload"> <template id="qd-fileupload">
<vue-clip :options="options">
<template slot-scope="clip-uploader-action">
<div> <div>
<div class="dz-message"><h2> Click or Drag and Drop files here upload </h2></div> <v-btn @click="openFileDialog">
Select
</v-btn>
<v-btn @click="uploadFile" icon>
<v-icon>cloud_upload</v-icon>
</v-btn>
<input type="file" name="files" ref="file-upload" multiple="multiple" style="display:none" @change="onFileChange"/>
</div> </div>
</template> </template>
<template slot-scope="clip-uploader-body" scope="props">
<div v-for="file in props.files">
<img v-bind:src="file.dataUrl" />
{{ file.name }} {{ file.status }}
</div>
</template>
</vue-clip>
</template>
<script>{ <script>{
props: ['url'
],
data() { data() {
return { return {
options: { formData: new FormData()
url: '/vue-poc/api/upload', }
paramName: 'file',
maxFilesize: {
limit: 1,
message: '{{ filesize }} is greater than the {{ maxFilesize }}'
}, },
maxFiles: { methods: {
limit: 5, openFileDialog() {
message: 'You can only upload a max of 5 files' this.$refs['file-upload'].click();
} },
} onFileChange(e) {
} var self = this;
var files = e.target.files || e.dataTransfer.files;
if(files.length > 0){
for(var i = 0; i< files.length; i++){
self.formData.append("files", files[i], files[i].name);
} }
} }
</script> },
uploadFile() {
var self = this;
HTTP.post( this.url, self.formData).then(function (response) {
console.log(response);
self.$emit("complete",response)
}).catch(function (error) {
console.log(error);
});
}
}
}</script>

View file

@ -0,0 +1,70 @@
<!DOCTYPE html>
<!--
A fixed height card showing files in a tabset.
An item can be selected
-->
<template id="qd-tablist">
<v-menu left bottom :close-on-content-click="false" >
<v-chip slot="activator">
{{ EditTabs.length }}
<v-avatar>
<v-icon right>arrow_drop_down</v-icon>
</v-avatar>
</v-chip>
<v-card>
<v-toolbar >
<v-text-field
prepend-icon="filter_list"
label="type filter text"
single-line
hide-details
v-model="search"
clearable
></v-text-field>
</v-toolbar>
<v-card-text>
<v-list style="height: 300px; overflow-y: auto;">
<v-list-tile
v-for="index in edittabs.sorted()" :key="index"
avatar dense ripple
@click="setItem(index)" :inactive="index == current"
>
<v-list-tile-avatar>
<v-icon v-if="index == current">check_circle</v-icon>
<v-icon v-else>insert_drive_file</v-icon>
</v-list-tile-avatar>
<v-list-tile-content>
<v-list-tile-title>{{ edittabs.items[index].name }}</v-list-tile-title>
</v-list-tile-content>
<v-list-tile-action >
{{ edittabs.items[index].id }} [{{ index }}]
</v-list-tile-action>
</v-list-tile>
</v-list>
</v-card-text>
<v-card-actions>
current : {{ current }}
</v-card-actions>
</v-card>
</v-menu>
</template>
<script>{
props: ['edittabs',
'current'
],
data () {
return {
search:null
}
},
methods: {
setItem(index){
this.$emit('selected', index)
},
}
}</script>

View file

@ -8,7 +8,7 @@ event fired cmd outline
<template id="vue-ace"> <template id="vue-ace">
<div style="width: 100%; height: 100%;"></div> <div style="width: 100%; height: 100%;"></div>
</template> </template>
<script>{ <script type="text/javascript">{
props: [ 'content', props: [ 'content',
'mode', 'mode',
'wrap', 'wrap',
@ -16,6 +16,8 @@ event fired cmd outline
'events', // event bus if set handles "eventFired",cmd 'events', // event bus if set handles "eventFired",cmd
'settings', 'settings',
'minLines', 'minLines',
'completer',
'snippets'
], ],
data () { data () {
return { return {
@ -29,6 +31,7 @@ event fired cmd outline
enableBasicAutocompletion:true, enableBasicAutocompletion:true,
enableLiveAutocompletion:true enableLiveAutocompletion:true
}, },
annots:{ annots:{
error:0,warning:0,info:0 error:0,warning:0,info:0
} }
@ -44,6 +47,8 @@ event fired cmd outline
'mode' (value) { 'mode' (value) {
var session=this.editor.getSession() var session=this.editor.getSession()
session.setMode(`ace/mode/${value}`) session.setMode(`ace/mode/${value}`)
}, },
'wrap' (value) { 'wrap' (value) {
var session=this.editor.getSession() var session=this.editor.getSession()
@ -146,7 +151,7 @@ event fired cmd outline
this.editor.getSession().selection.on('changeCursor', (e) => { this.editor.getSession().selection.on('changeCursor', (e) => {
var position = this.editor.selection.cursor; var position = this.editor.selection.cursor;
var token = this.editor.getSession().getTokenAt(position.row, position.column); var token = this.editor.getSession().getTokenAt(position.row, position.column);
console.log("token",token); //console.log("token",token);
this.$emit('token', token); this.$emit('token', token);
}); });
@ -157,5 +162,15 @@ event fired cmd outline
}else this.command(cmd); }else this.command(cmd);
}); });
} }
if(this.completer){
var langTools = ace.require("ace/ext/language_tools");
langTools.addCompleter(this.completer);
}
if(this.snippets){
var snippetManager = ace.require("ace/snippets").snippetManager;
snippetManager.register(this.snippets, "xquery");
}
} }
}</script> }</script>

View file

@ -199,5 +199,6 @@ Vue.component('l-marker', Vue2Leaflet.LMarker);
// Vue.component('form-schema', window["vue-json-schema"].default); // Vue.component('form-schema', window["vue-json-schema"].default);
//}; //};
//Vue.use({ install: install }); //Vue.use({ install: install });
var EditTabs=new Vue(GEditTabs)
Vue.use(Vuetify); Vue.use(Vuetify);
new Vuepoc().$mount('#app') new Vuepoc().$mount('#app')

View file

@ -1,17 +1,6 @@
<package xmlns="http://expath.org/ns/pkg" name="http://expkg-zone58.github.io/ex-dotml" <package xmlns="http://expath.org/ns/pkg" name="http://expkg-zone58.github.io/ex-dotml"
abbrev="vue-poc" version="0.0.4" spec="1.0"> abbrev="vue-poc" version="0.0.4" spec="1.0">
<title>vue-poc test of vue.js.</title> <title>vue-poc test of vue.js.</title>
<dependency name="ace" version="1.3.3" />
<dependency name="vuetify" version="0.15.2" />
<dependency name="vue" version="2.4.1" />
<dependency name="vue-router" version="2.5.3" />
<dependency name="vue-treeselect" version="0.0.25" />
<dependency name="google-material" version="0.0.0" />
<dependency name="js-beautify" version="1.6.12" />
<dependency name="axios" version="0.17.1" />
<dependency name="qs" version="6.4.0" />
<dependency name="localforage" version="1.7.1" />
<dependency name="moment.js" version="2.18.1" />
<dependency name="file-walker" version="0.5.2" /> <dependency name="file-walker" version="0.5.2" />
<dependency name="ex-thumbnailator" version="5.0.11" /> <dependency name="ex-thumbnailator" version="5.0.11" />
</package> </package>

View file

@ -58,7 +58,7 @@
v-bind:pagination.sync="pagination" v-bind:pagination.sync="pagination"
> >
<template slot="items" slot-scope="props"> <template slot="items" slot-scope="props">
<td class="text-xs-right">{{ props.item.time }}</td> <td :title="props.item.time">{{ props.item.time }}</td>
<td class="text-xs-right">{{ props.item.user }}</td> <td class="text-xs-right">{{ props.item.user }}</td>
<td class="text-xs-right">{{ props.item.type }}</td> <td class="text-xs-right">{{ props.item.type }}</td>
<td class="text-xs-right">{{ props.item.ms }}</td> <td class="text-xs-right">{{ props.item.ms }}</td>

View file

@ -256,7 +256,6 @@
path: a.slice(0,i+1).join("/")+"/"}} path: a.slice(0,i+1).join("/")+"/"}}
); );
url[0].icon=this.icon; url[0].icon=this.icon;
console.log("CRUM",url)
return url; return url;
}, },
selection(){ selection(){

View file

@ -135,7 +135,7 @@
<v-flex xs12 style="height:70vh" fill-height> <v-flex xs12 style="height:70vh" fill-height>
<vue-ace :content="contentA" :mode="mode" :wrap="wrap" :settings="aceSettings" <vue-ace :content="contentA" :mode="mode" :wrap="wrap" :settings="aceSettings"
:events="events" v-resize="onResize" :events="events" v-resize="onResize" :completer="$aceExtras.basexCompleter" :snippets="$aceExtras.snippets"
v-on:change-content="changeContentA" v-on:change-content="changeContentA"
v-on:annotation="annotation"></vue-ace> v-on:annotation="annotation"></vue-ace>
</v-flex> </v-flex>

View file

@ -130,7 +130,7 @@
<v-tab <v-tab
v-for="item in EditTabs.items" v-for="item in EditTabs.items"
:key="item.id" :key="item.id"
:href="'#T' + item.id" ripple ripple
style="text-transform: none;text-align:left" style="text-transform: none;text-align:left"
> >
<v-avatar > <v-avatar >
@ -151,7 +151,7 @@
<v-tab-item <v-tab-item
v-for="item in EditTabs.items" v-for="item in EditTabs.items"
:key="item.id" :key="item.id"
:id="'T' + item.id" :value="item.id"
> >
<v-card flat v-if="showInfo" > <v-card flat v-if="showInfo" >
<v-card-actions > <v-card-actions >
@ -291,9 +291,9 @@
watch:{ watch:{
currentId (val) { currentId (val) {
console.log("currentId: ",val)
this.active = EditTabs.items.find(e=> val=="T"+e.id); this.active = EditTabs.items.find(e=> val=="T"+e.id);
this.$router.push({ query: { id: val }}); this.$router.push({ query: { id: val }});
console.log("current",val)
} }
}, },

View file

@ -47,13 +47,13 @@
></v-checkbox> ></v-checkbox>
</td> </td>
<td class="vtop"> <router-link :to="{name: 'jobShow', params: {job: props.item.id }}">{{props.item.id}}</router-link></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.state }}</div> <td class="vtop "><div>{{ props.item.state }}</div><div>{{ props.item.type }}</div> </td>
<div>{{ props.item.type }}</div> </td> <td class="vtop " :title="props.item.registered">{{ props.item.registered | fromNow}}</td>
<td class="vtop " :title="props.item.start">{{ props.item.start | fromNow}}</td>
<td class="vtop text-xs-right">{{ props.item.duration }}</td> <td class="vtop text-xs-right">{{ props.item.duration }}</td>
<td class="vtop text-xs-right">{{ props.item.writes }}</td> <td class="vtop text-xs-right">{{ props.item.writes }}</td>
<td class="vtop text-xs-right">{{ props.item.reads }}</td> <td class="vtop text-xs-right">{{ props.item.reads }}</td>
<td class="vtop text-xs-right">{{ props.item.user }}</td> <td class="vtop text-xs-right">{{ props.item.user }}</td>
<td class="vtop" ><code class="multiline-ellipsis">{{ props.item.text }}</code></td>
</template> </template>
</v-data-table> </v-data-table>
</v-card> </v-card>
@ -69,11 +69,12 @@
value: 'id' value: 'id'
}, },
{ text: 'State', value: 'state' }, { text: 'State', value: 'state' },
{ text: 'Registered', value: 'registered' },
{ text: 'Start', value: 'start' },
{ text: 'Duration', value: 'duration' }, { text: 'Duration', value: 'duration' },
{ text: 'WriteL', value: 'writes' }, { text: 'WriteL', value: 'writes' },
{ text: 'ReadL', value: 'reads' }, { text: 'ReadL', value: 'reads' },
{ text: 'User', value: 'user' }, { text: 'User', value: 'user' }
{ text: 'Query', value: 'text' }
], ],
items:[ items:[
], ],

View file

@ -41,6 +41,8 @@ as element(*)*
,<type>{$j/@type/string()}</type> ,<type>{$j/@type/string()}</type>
,<state>{$j/@state/string()}</state> ,<state>{$j/@state/string()}</state>
,<user>{$j/@user/string()}</user> ,<user>{$j/@user/string()}</user>
,<registered>{$j/@time/string()}</registered>
,<start>{$j/@start/string()}</start>
,<duration>{$j/@duration/string()}</duration> ,<duration>{$j/@duration/string()}</duration>
,<text>{$j/string()}</text> ,<text>{$j/string()}</text>
,<reads>{$j/@reads/string()}</reads> ,<reads>{$j/@reads/string()}</reads>

View file

@ -5,7 +5,7 @@
<v-card > <v-card >
<v-card-title class="red"> <v-card-title class="red">
<span class="white--text">The current credentials do the give access this page, please login again</span> <span class="white--text">The current credentials do the give access this page, please login.</span>
</v-card-title> </v-card-title>
<v-card-actions> <v-card-actions>
@ -43,7 +43,7 @@
<v-card-actions > <v-card-actions >
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn color="primary" @click="go()">Continue</v-btn> <v-btn color="primary" @click="go()">Login</v-btn>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-flex> </v-flex>

View file

@ -32,7 +32,7 @@
<v-expansion-panel v-model="panel" expand > <v-expansion-panel v-model="panel" expand >
<v-expansion-panel-content> <v-expansion-panel-content>
<div slot="header" class="title">Description: </div> <div slot="header" class="title"><v-icon>{{ item.iconclass }}</v-icon> {{ item.name }}</div>
{{item.description}} {{item.description}}
<pre v-if="xml"><code>{{ xml }}</code></pre> <pre v-if="xml"><code>{{ xml }}</code></pre>
</v-expansion-panel-content> </v-expansion-panel-content>

View file

@ -1,27 +1,151 @@
<!DOCTYPE html> <!DOCTYPE html>
<template id="scratch"> <template id="scratch">
<v-container fluid> <v-container fluid>
<qd-fileupload title="Up it" selected-callback="upit">up load</qd-fileupload> <v-toolbar tabs dense>
<qd-autoheight> <v-toolbar-title>Tab index {{ curIndex }}</v-toolbar-title>
<vue-ace :content="ace" mode="xml" ></vue-ace> <v-btn v-if="active">{{ active.mode }}</v-btn>
</qd-autoheight> <v-btn v-if="active"> {{ active.name }}, id: {{ active.id }}</v-btn>
<v-spacer></v-spacer>
<v-btn @click="add">Add</v-btn>
<v-btn @click="curIndex=2">set</v-btn>
<qd-tablist :edittabs="EditTabs" :current="curIndex" @selected="setItem">tab list</qd-tablist>
<v-tabs v-model="curIndex" slot="extension">
<v-tab
v-for="(item,index) in EditTabs.items"
:key="item.id"
ripple
style="text-transform: none;text-align:left"
>
<v-avatar >
<v-icon size="16px">insert_drive_file</v-icon>
</v-avatar>
<span >{{ (item.dirty?"*":"") }}</span>
<span >{{ item.name }}</span>
<v-spacer></v-spacer>
<v-btn icon @click.stop="tabClose(item,index)">
<v-icon size="16px">close</v-icon>
</v-btn>
</v-tab>
</v-tabs>
</v-toolbar>
<v-tabs-items v-model="curIndex">
<v-tab-item
v-for="item in EditTabs.items"
:key="item.id"
>
<v-card >
<div style="height:200px" ref="ace" v-resize="onResize" >
<v-flex xs12 fill-height >
<vue-ace :content="item.text" v-on:change-content="changeContent" :events="events"
:mode="item.mode" :wrap="wrap" :settings="aceSettings" v-on:annotation="annotation"></vue-ace>
</v-flex>
</div>
</v-card>
</v-tab-item>
</v-tabs-items>
</v-container> </v-container>
</template> </template>
<script>{ <script>{
data: function(){ data: function(){
return { return {
message: 'bad route!', curIndex: null, //index of current
ace:"<xml>here</xml>" active: null,
showInfo: false, // showing info
wrap: true,
events: new Vue({}),
aceSettings: {},
annotations: null,
folded: false,
EditTabs: EditTabs
} }
}, },
methods:{ methods:{
upit:function(s){ add(){
alert("up") var a=this.EditTabs.addItem({text:"hi "+ new Date()})
this.curIndex=this.EditTabs.items.indexOf(a)
},
tabClose(item,index){
if(item.dirty){
if (!confirm("Not saved continue? "+ index))return;
}else{
this.EditTabs.closeItem(item)
this.curIndex=0
} }
}, },
mounted:function(){ setItem(v){
console.log("scratch",this.$route.path) this.curIndex=v;
},
annotation(counts){
this.annotations=counts
//console.log("annotations: ",counts)
},
changeContent(val){
var item=this.active;
//console.log("change",val);
if (item.text !== val) {
item.text = val;
item.dirty=true;
}
},
onResize(){
var el=this.$refs["ace"];
for (e of el){
//console.log("top",e.offsetTop)
var h=Math.max(1,window.innerHeight - e.offsetTop -200)
// console.log("h",h)
e.style.height=h +"px";
}
}
},
computed:{
count(){
console.log("LEN:",this.EditTabs.length)
return this.EditTabs.length
}
},
watch:{
curIndex (val) {
this.active = EditTabs.items[val];
console.log("curIndex: ",val)
if(this.active) this.$router.push({ query: { id: this.active.id }});
}
},
beforeRouteEnter (to, from, next) {
Promise.all([Settings.getItem('settings/ace')
])
.then(function(values) {
next(vm => {
vm.aceSettings = values[0];
console.log("SSS",JSON.parse(JSON.stringify(EditTabs.items)))
})
})
},
created:function(){
var url=this.$route.query.url;
if(url){
EditTabs.loadItem(url);
}else{
var tid=this.$route.query.id;
var id=EditTabs.items.findIndex(i=>i.id ==tid)
console.log("set tab",tid,id)
EditTabs.restored.then(()=>{
var id=EditTabs.items.findIndex(i=>i.id ==tid)
console.log("set tab",tid,id)
this.curIndex= id;
});
}
} }
} }
</script> </script>

View file

@ -1,16 +1,27 @@
<!DOCTYPE html> <!DOCTYPE html>
<template id="upload"> <template id="upload">
<v-container fluid>
<v-snackbar v-model="snack" color="success">File upload complete</v-snackbar>
<v-card> <v-card>
<v-card-title>Upload</v-card-title> <v-card-title>File transfers</v-card-title>
<v-card-actions> <v-card-text>
<qd-fileupload>up..</qd-fileupload> <qd-fileupload url="upload" @complete="upit">up load</qd-fileupload>
</v-card-actions> </v-card-text>
</v-card> </v-card>
</v-container>
</template> </template>
<script>{ <script>{
data: function(){ data: function(){
return { return {
fab: false snack: false
}
},
methods:{
upit:function(s){
this.snack=true;
},
} }
} }
}</script> </script>

View file

@ -10,12 +10,13 @@ declare namespace c="http://www.w3.org/ns/xproc-step";
: @default C:/Users/andy/git/vue-poc/src/vue-poc : @default C:/Users/andy/git/vue-poc/src/vue-poc
:) :)
declare variable $efolder as xs:anyURI external := declare variable $efolder as xs:anyURI external :=
"C:/Users/andy/git/vue-poc/src/vue-poc"; xs:anyURI("C:/Users/andy/git/vue-poc/src/vue-poc");
(:~ URL of the schema to use (:~ URL of the schema to use
: @default C:/tmp/xqdoc/ : @default C:/tmp/xqdoc/
:) :)
declare variable $target as xs:anyURI external :="C:/tmp/xqdoc/"; declare variable $target as xs:anyURI external :=
xs:anyURI("C:/tmp/xqdoc/");
declare variable $state as element(state):=db:open("vue-poc","/state.xml")/state; declare variable $state as element(state):=db:open("vue-poc","/state.xml")/state;
@ -29,7 +30,7 @@ let $opts:=map{
} }
let $op:=xqd:save-xq($files,$target,$opts) let $op:=xqd:save-xq($files,$target,$opts)
let $result:=<json type="object"> let $result:=<json type="object">
<extra>hello</extra> <extra>hello2</extra>
<msg> {$target}, {count($files//c:file)} files processed.</msg> <msg> {$target}, {count($files//c:file)} files processed.</msg>
<id>{$id/string()}</id> <id>{$id/string()}</id>
</json> </json>

View file

@ -13,7 +13,7 @@ declare namespace xqdoc="http://www.xqdoc.org/1.0";
: @default file:///C:/tmp/xqdoc/ : @default file:///C:/tmp/xqdoc/
:) :)
declare variable $target as xs:anyURI external := declare variable $target as xs:anyURI external :=
"file:///C:/tmp/xqdoca/" cast as xs:anyURI; "file:///C:/tmp/xqdoc/" cast as xs:anyURI;
declare variable $nsRESTXQ:= 'http://exquery.org/ns/restxq'; declare variable $nsRESTXQ:= 'http://exquery.org/ns/restxq';
@ -25,7 +25,7 @@ declare function local:import($path,
$folder) $folder)
as map(*)* as map(*)*
{ {
let $uri:=``[F`{ string($id) }`/]`` let $uri:=``[modules/F`{ string($id) }`/]``
let $doc:=doc(resolve-uri($uri || "xqdoc.xml",$folder)) let $doc:=doc(resolve-uri($uri || "xqdoc.xml",$folder))
let $annots:=xqd:annotations($doc/*, $nsRESTXQ,"path") let $annots:=xqd:annotations($doc/*, $nsRESTXQ,"path")
return $annots!map{ return $annots!map{
@ -69,28 +69,49 @@ let $op:= <div>
<li href="#main"> <li href="#main">
<a > <a >
<span class="secno">2 </span> <span class="secno">2 </span>
<span class="content">Paths</span> <span class="content">Paths.</span>
</a> </a>
</li> </li>
<li> <li>
<ol class="toc"> { $tree/*/*!local:tree-list(.,2) } </ol>
</li> </li>
</ol> </ol>
</nav> </nav>
<a href="index.html">index: </a> <a href="index.html">index: </a>
<ol> { local:tree-list($tree) } </ol>
<ul>{$reps!local:path-to-html(.)}</ul> <ul>{$reps!local:path-to-html(.)}</ul>
</div> </div>
return xqd:page($op,map{"resources": "resources/"}) return xqd:page($op,map{"resources": "resources/"})
}; };
(:~ tree to list :) (:~ tree to list :)
declare function local:tree-list($tree){ declare function local:tree-list($tree as element(*),$seq as xs:integer*){
typeswitch ($tree ) typeswitch ($tree )
case element(directory) case element(directory)
return <li>{$tree/@name/string()}/<ul>{$tree/*!local:tree-list(.)}</ul></li> return <li>
<span class="secno">{string-join($seq,'.')}</span>
<span class="content">{$tree/@name/string()}/</span>
<ol class="toc">{$tree/*!local:tree-list(.,($seq,position()))}</ol>
</li>
case element(file)
return <li>{if($tree/@target) then
<a href="#{$tree/@target}">
<span class="secno">{string-join($seq,'.')}</span>
<span class="content" title="{$tree/@target}">{ $tree/@name/string() }</span>
<div class="tag tag-success"
title="RESTXQ: {$tree/@target}">GET
</div>
<div class="tag tag-danger" style="float:right"
title="RESTXQ: {$tree/@target}">X
</div>
</a>
else
<span class="content">{$tree/@name/string()}</span>
}</li>
default default
return <li>{$tree/@name/string()}</li> return <li>unknown</li>
}; };
(:~ html for a path :) (:~ html for a path :)
@ -133,7 +154,7 @@ let $data:=map:merge(for $report in $reports
let $uris:=sort(map:keys($data)) let $uris:=sort(map:keys($data))
let $result:=<json type="object"> let $result:=<json type="object">
<extra>hello</extra> <extra>hello2</extra>
<msg> {$target}, {count($data)} uris processed.</msg> <msg> {$target}, {count($data)} uris processed.</msg>
<id>xqrest2 ID??</id> <id>xqrest2 ID??</id>
</json> </json>

View file

@ -1,3 +1,4 @@
xquery version "3.1";
(:~ (:~
: tools for databases.. : tools for databases..
: @author andy bunce : @author andy bunce
@ -5,7 +6,10 @@
:) :)
module namespace dbtools = 'quodatum.dbtools'; module namespace dbtools = 'quodatum.dbtools';
import module namespace file="http://expath.org/ns/file";
import module namespace db="http://basex.org/modules/db";
import module namespace archive="http://basex.org/modules/archive";
import module namespace hof="http://basex.org/modules/hof";
(: trailing slash :) (: trailing slash :)
declare variable $dbtools:webpath:= db:system()/globaloptions/webpath/fn:string() declare variable $dbtools:webpath:= db:system()/globaloptions/webpath/fn:string()

View file

@ -1,3 +1,4 @@
xquery version "3.1";
(:~ (:~
: dice utils - sort, filter, and serialize as json. : dice utils - sort, filter, and serialize as json.
: can read parameters from request: sort,start,limit. : can read parameters from request: sort,start,limit.

View file

@ -40,7 +40,7 @@ as element(c:directory)
db:list()! db:list()!
<c:directory name="{db:property(.,'name')}" content-type="text/directory" <c:directory name="{db:property(.,'name')}" content-type="text/directory"
last-modified="{db:property(.,'timestamp')}" last-modified="{db:property(.,'timestamp')}"
size="{db:property(.,'size')}"/> size="-1"/>
else else
let $db:=substring-before(substring($url,2),"/") let $db:=substring-before(substring($url,2),"/")

View file

@ -0,0 +1,383 @@
/authenticate
/chat
/chat/login-check
/chat/logout
/consignment
/consignment/api
/consignment/api/build
/consignment/api/content
/consignment/api/db
/consignment/api/elements
/consignment/api/nvdl/schemas
/consignment/api/report/{$path=.+
/consignment/api/samples
/consignment/api/src/{$path=.+}
/consignment/api/task
/consignment/api/validate
/consignment/api/validate/{$path=.+}
/consignment/ui
/consignment/ui/{$path=.+}
/contentbase/authenticate
/contentbase/collection
/contentbase/done
/contentbase/export
/contentbase/image
/contentbase/login
/contentbase/logout
/contentbase/page
/contentbase/publish
/contentbase/save
/contentbase/status
/contentbase/status
/contentbase/toc
/contentbase/work
/cxan.xq
/cxan/api/status
/dba
/dba/backup-create
/dba/backup-drop
/dba/backup-restore
/dba/backup/{$backup}
/dba/database
/dba/database
/dba/databases
/dba/databases
/dba/db-add
/dba/db-add
/dba/db-alter
/dba/db-alter
/dba/db-copy
/dba/db-copy
/dba/db-create
/dba/db-create
/dba/db-delete
/dba/db-download
/dba/db-drop
/dba/db-optimize
/dba/db-optimize
/dba/db-optimize-all
/dba/db-query
/dba/db-rename
/dba/db-rename
/dba/db-replace
/dba/db-replace
/dba/dir-change
/dba/dir-create
/dba/file-delete
/dba/file-start
/dba/file-stop
/dba/file-upload
/dba/file/{$name}
/dba/files
/dba/files
/dba/job-discard
/dba/job-result
/dba/job-stop
/dba/jobs
/dba/jobs
/dba/log
/dba/log-delete
/dba/log-download
/dba/login
/dba/login-check
/dba/logout
/dba/logs
/dba/logs
/dba/logs/jump
/dba/pattern-add
/dba/pattern-add
/dba/pattern-drop
/dba/queries
/dba/query-close
/dba/query-eval
/dba/query-open
/dba/query-save
/dba/query-update
/dba/resource
/dba/session-kill
/dba/sessions
/dba/sessions
/dba/settings
/dba/settings
/dba/settings-gc
/dba/static/{$file=.+}
/dba/user
/dba/user
/dba/user-create
/dba/user-create
/dba/user-drop
/dba/user-edit
/dba/users
/dba/users
/dba/{$path}
/doc/ping
/doc/ping
/doc/status
/doc/task
/doc/task/{$task}
/doc/task/{$task}
/favicon.ico
/form
/hello/{$world}
/json
/json2
/login
/logout
/rave
/rave/job
/rave/longloop
/rave/update
/rave/updates
/rave/user
/replx
/replx/api/elements
/replx/api/query
/replx/api/status
/replx/api/xq
/replx/ui
/replx/ui/{$path=.+}
/slowww
/thumb/{$id}
/vue-poc
/vue-poc/api
/vue-poc/api/collection
/vue-poc/api/components/tree
/vue-poc/api/data/users
/vue-poc/api/data/{$entity}
/vue-poc/api/edit
/vue-poc/api/edit
/vue-poc/api/eval/execute
/vue-poc/api/eval/imports
/vue-poc/api/eval/invoke
/vue-poc/api/eval/plan
/vue-poc/api/eval/result/{$id}
/vue-poc/api/eval/submit
/vue-poc/api/form/schema
/vue-poc/api/get
/vue-poc/api/get2
/vue-poc/api/history
/vue-poc/api/images/datetaken
/vue-poc/api/images/keywords2
/vue-poc/api/images/list
/vue-poc/api/images/list/{ $id }/image
/vue-poc/api/images/list/{ $id }/meta
/vue-poc/api/images/list/{ $id }/thumb
/vue-poc/api/images/list/{$id}
/vue-poc/api/images/report
/vue-poc/api/job
/vue-poc/api/job/{$job}
/vue-poc/api/log
/vue-poc/api/log/add
/vue-poc/api/login-check
/vue-poc/api/logout
/vue-poc/api/ping
/vue-poc/api/ping
/vue-poc/api/repo
/vue-poc/api/search
/vue-poc/api/start
/vue-poc/api/status
/vue-poc/api/tasks
/vue-poc/api/tasks/model
/vue-poc/api/tasks/model
/vue-poc/api/tasks/task
/vue-poc/api/tasks/vue-compile
/vue-poc/api/tasks/xqdoc
/vue-poc/api/tasks/xqdoc
/vue-poc/api/tasks/{$task}
/vue-poc/api/tasks/{$task}
/vue-poc/api/test-select
/vue-poc/api/thumbnail
/vue-poc/api/thumbnail/images
/vue-poc/api/thumbnail/validate
/vue-poc/api/upload
/vue-poc/api/user
/vue-poc/api/validate
/vue-poc/api/validate
/vue-poc/api/xqdoc
/vue-poc/api/xslt
/vue-poc/ui
/vue-poc/ui/{$file=.+}
/vuetif
/vuetif/api
/vuetif/api/repo
/vuetif/api/search
/vuetif/api/status
/vuetif/api/test-select
/vuetif/api/user
/vuetif/ui
/vuetif/ui/{$file=.+}
/zip
/zip2
/{$db}/login
/{$db}/login
/{$db}/logout
abide
abide/api/application
abide/api/xml
abide/auth/changepassword
abide/auth/github
abide/auth/github/callback
abide/auth/login
abide/auth/logout
abide/auth/lostpassword
abide/auth/register
abide/auth/session
abide/auth/twitter
abide/auth/twitter/callback
abide/data/application
abide/data/application
abide/data/application/export
abide/data/application/{$app}
abide/data/database
abide/data/database
abide/data/database/{$db}
abide/data/database/{$db}
abide/data/database/{$db}/index
abide/data/database/{$db}/resource
abide/data/database/{$db}/resource/item
abide/data/endpoint
abide/data/endpoint/item
abide/data/entity
abide/data/entity/{$app}
abide/data/entity/{$app}/fields
abide/data/package
abide/data/package/item
abide/data/package/item
abide/data/web-app
abide/data/xqmodule
abide/data/xqmodule/item
abide/environment
abide/exec
abide/ide/eval
abide/ide/filelist
abide/ide/filelist2
abide/ide/get
abide/ide/run
abide/logs
abide/logs/{$date}
abide/packages
abide/request
abide/search
abide/sessions
abide/sessions/{$id}
abide/system
abide/users
abide/wadl
abide/xslt
app-music/xslt
bch
benchx
benchx/api/environment
benchx/api/execute
benchx/api/library
benchx/api/library/{$id}
benchx/api/library/{$id}
benchx/api/library/{$id}/compare
benchx/api/session
benchx/api/session
benchx/api/state
benchx/api/state
benchx/api/suite
benchx/api/suite/{$suite}
benchx/api/thisenv
benchx/api/validate
benchx/api/~testbed
cxan-zone58
cxan-zone58/about
cxan-zone58/ace
cxan-zone58/api
cxan-zone58/author
cxan-zone58/cat
cxan-zone58/pkg
cxan-zone58/pkg/{$repo}
cxan-zone58/search
cxan-zone58/tag
cxan-zone58/test
doc
doc/app/{$app}/view/component
doc/app/{$app}/view/template
doc/app/{$app}/view/wadl
doc/app/{$app}/view/xqdoc
doc/components/basex
doc/components/browser
doc/data/app
doc/data/app/{$app}
doc/data/app/{$app}/component
doc/data/entity
doc/data/entity/{$entity}
doc/data/entity/{$entity}/field
doc/data/file/find
doc/data/file/list
doc/data/file/read
doc/data/task/{$task}
doc/data/test
doc/data/xqmodule/item
doc/data/xqmodule/parse
doc/data/xqmodule/xq
doc/data/xqmodule/xqdoc
doc/data/{$entity}
doc/data/{$entity}/{$name}
doc/init
doc/search
doc/validate
doc/wadl
doc/xqdoc
graphxq
graphxq/about
graphxq/ace
graphxq/api
graphxq/api/dot
graphxq/api/dotml
graphxq/dot
graphxq/dotml
graphxq/library
graphxq/search
graphxq/testd3
media
media/mp3
palmyra
palmyra/xslt
piperack
piperack/xslt
replx/api/data/queries
replx/api/data/queries/{$id}
snipsnapx
snipsnapx/about
snipsnapx/auth/login
snipsnapx/auth/login
snipsnapx/auth/logout
snipsnapx/auth/profile
snipsnapx/auth/profile
snipsnapx/auth/register
snipsnapx/auth/register
snipsnapx/search
snipsnapx/snipsnap-attachments
snipsnapx/snipsnap-blogs
snipsnapx/snipsnap-comments
snipsnapx/snipsnap-index
snipsnapx/snipsnap-recent
snipsnapx/snipsnap-tags
snipsnapx/snipsnap-tags/{$tag}
snipsnapx/snipsnap-users
snipsnapx/test
snipsnapx/{$view}/{$f1}/{$f2}/{$f3}/{$f4}
snipsnapx/{$view}/{$ns}/{$snipname}
snipsnapx/{$view}/{$ns}/{$snipname}/{$e}
snipsnapx/{$view}/{$snipname}
stylecheck
stylecheck
stylecheck/compile
vue-poc/api/data/entity
vue-poc/api/data/entity/{$entity}
vue-poc/api/data/entity/{$entity}/field
{$db}/book/{$id}
{$db}/chunk/{$chunkid}
{$db}/chunk/{$chunkid}
{$db}/collection
{$db}/image/{$id}
{$db}/images
{$db}/images/{$id}
{$db}/output/{$id}
{$db}/submit-metadata/{$parttype}/{$id}
{$db}/toc/{$id}

View file

@ -0,0 +1,82 @@
<directory name="">
<directory name="vue-poc">
<directory name="api">
<file name="collection" target="/vue-poc/api/collection"/>
<directory name="components">
<file name="tree" target="/vue-poc/api/components/tree"/>
</directory>
<directory name="data">
<directory name="entity">
<directory name="{$entity}">
<file name="field" target="/vue-poc/api/data/entity/{$entity}/field"/>
</directory>
</directory>
<file name="users" target="/vue-poc/api/data/users"/>
<file name="{$entity}" target="/vue-poc/api/data/{$entity}"/>
</directory>
<file name="edit" target="/vue-poc/api/edit"/>
<directory name="eval">
<file name="execute" target="/vue-poc/api/eval/execute"/>
<file name="imports" target="/vue-poc/api/eval/imports"/>
<file name="invoke" target="/vue-poc/api/eval/invoke"/>
<file name="plan" target="/vue-poc/api/eval/plan"/>
<directory name="result">
<file name="{$id}" target="/vue-poc/api/eval/result/{$id}"/>
</directory>
<file name="submit" target="/vue-poc/api/eval/submit"/>
</directory>
<directory name="form">
<file name="schema" target="/vue-poc/api/form/schema"/>
</directory>
<file name="get" target="/vue-poc/api/get"/>
<file name="get2" target="/vue-poc/api/get2"/>
<file name="history" target="/vue-poc/api/history"/>
<directory name="images">
<file name="datetaken" target="/vue-poc/api/images/datetaken"/>
<file name="keywords2" target="/vue-poc/api/images/keywords2"/>
<directory name="list">
<directory name="{ $id }">
<file name="image" target="/vue-poc/api/images/list/{ $id }/image"/>
<file name="meta" target="/vue-poc/api/images/list/{ $id }/meta"/>
<file name="thumb" target="/vue-poc/api/images/list/{ $id }/thumb"/>
</directory>
<file name="{$id}" target="/vue-poc/api/images/list/{$id}"/>
</directory>
<file name="report" target="/vue-poc/api/images/report"/>
</directory>
<directory name="job">
<file name="{$job}" target="/vue-poc/api/job/{$job}"/>
</directory>
<directory name="log">
<file name="add" target="/vue-poc/api/log/add"/>
</directory>
<file name="login-check" target="/vue-poc/api/login-check"/>
<file name="logout" target="/vue-poc/api/logout"/>
<file name="ping" target="/vue-poc/api/ping"/>
<file name="repo" target="/vue-poc/api/repo"/>
<file name="search" target="/vue-poc/api/search"/>
<file name="start" target="/vue-poc/api/start"/>
<file name="status" target="/vue-poc/api/status"/>
<directory name="tasks">
<file name="model" target="/vue-poc/api/tasks/model"/>
<file name="task" target="/vue-poc/api/tasks/task"/>
<file name="vue-compile" target="/vue-poc/api/tasks/vue-compile"/>
<file name="xqdoc" target="/vue-poc/api/tasks/xqdoc"/>
<file name="{$task}" target="/vue-poc/api/tasks/{$task}"/>
</directory>
<file name="test-select" target="/vue-poc/api/test-select"/>
<directory name="thumbnail">
<file name="images" target="/vue-poc/api/thumbnail/images"/>
<file name="validate" target="/vue-poc/api/thumbnail/validate"/>
</directory>
<file name="upload" target="/vue-poc/api/upload"/>
<file name="user" target="/vue-poc/api/user"/>
<file name="validate" target="/vue-poc/api/validate"/>
<file name="xqdoc" target="/vue-poc/api/xqdoc"/>
<file name="xslt" target="/vue-poc/api/xslt"/>
</directory>
<directory name="ui">
<file name="{$file=.+}" target="/vue-poc/ui/{$file=.+}"/>
</directory>
</directory>
</directory>

View file

@ -0,0 +1,32 @@
xquery version "3.1";
(:~
: test tree
:)
import module namespace tree = 'quodatum.data.tree' at "tree.xqm";
declare variable $TEST1:=(
"/api/environment",
"/api/execute",
"/api/library",
"/api/library/{$id}"
);
declare %unit:test
(:~
: smoke test
:)
function tree:test(){
let $t:=tree:build($TEST1)
return unit:assert(fn:true(),$t)
};
declare %unit:test
function tree:test3(){
let $t:=unparsed-text-lines("tree-data/paths.txt")
return unit:assert(fn:true(),$t)
};
tree:build($TEST1)/directory[@name="api"]

View file

@ -4,81 +4,6 @@ xquery version "3.1";
:) :)
module namespace tree = 'quodatum.data.tree'; module namespace tree = 'quodatum.data.tree';
declare variable $tree:TEST1:=(
"/",
"/api/environment/",
"/api/execute/",
"/api/library/",
"/api/library/",
"/api/library/{$id}/",
"/api/library/{$id}/",
"/api/state/",
"/api/~testbed/",
"/api/state/",
"/api/state/",
"/api/suite/",
"/api/suite/{$suite}/",
"/api/execute/zz"
);
declare variable $tree:TEST2:=(
"/vue-poc",
"/vue-poc/api",
"/vue-poc/api/collection",
"/vue-poc/api/components/tree",
"/vue-poc/api/data/users",
"/vue-poc/api/data/{$entity}",
"/vue-poc/api/edit",
"/vue-poc/api/eval/execute",
"/vue-poc/api/eval/imports",
"/vue-poc/api/eval/invoke",
"/vue-poc/api/eval/plan",
"/vue-poc/api/eval/result/{$id}",
"/vue-poc/api/eval/submit",
"/vue-poc/api/form/schema",
"/vue-poc/api/get",
"/vue-poc/api/get2",
"/vue-poc/api/history",
"/vue-poc/api/images/datetaken",
"/vue-poc/api/images/keywords2",
"/vue-poc/api/images/list",
"/vue-poc/api/images/list/{ $id }/image",
"/vue-poc/api/images/list/{ $id }/meta",
"/vue-poc/api/images/list/{ $id }/thumb",
"/vue-poc/api/images/list/{$id}",
"/vue-poc/api/images/report",
"/vue-poc/api/job",
"/vue-poc/api/job/{$job}",
"/vue-poc/api/log",
"/vue-poc/api/log/add",
"/vue-poc/api/login-check",
"/vue-poc/api/logout",
"/vue-poc/api/ping",
"/vue-poc/api/repo",
"/vue-poc/api/search",
"/vue-poc/api/start",
"/vue-poc/api/status",
"/vue-poc/api/tasks",
"/vue-poc/api/tasks/model",
"/vue-poc/api/tasks/task",
"/vue-poc/api/tasks/vue-compile",
"/vue-poc/api/tasks/xqdoc",
"/vue-poc/api/tasks/{$task}",
"/vue-poc/api/test-select",
"/vue-poc/api/thumbnail",
"/vue-poc/api/thumbnail/images",
"/vue-poc/api/thumbnail/validate",
"/vue-poc/api/user",
"/vue-poc/api/validate",
"/vue-poc/api/xqdoc",
"/vue-poc/api/xslt",
"/vue-poc/ui",
"/vue-poc/ui/{$file=.+}",
"vue-poc/api/data/entity",
"vue-poc/api/data/entity/{$entity}",
"vue-poc/api/data/entity/{$entity}/field"
);
(:~ (:~
: convert path(s) to tree : convert path(s) to tree
@ -91,13 +16,14 @@ fn:fold-right($a,
) )
}; };
(:~ convert a path to xml :)
declare function tree:nest($path as xs:string) declare function tree:nest($path as xs:string)
as element(*) as element(*)
{ {
let $path:=if(starts-with($path,"/")) then $path else "/" || $path let $path:=if(starts-with($path,"/")) then $path else "/" || $path
let $parts:=fn:tokenize(($path),"/") let $parts:=fn:tokenize(($path),"/")
return fn:fold-right(subsequence($parts,1,count($parts)-1), return fn:fold-right(subsequence($parts,1,count($parts)-1),
<file name="{$parts[last()]}"/>, <file name="{$parts[last()]}" target="{$path}"/>,
tree:wrap#2 tree:wrap#2
) )
}; };
@ -131,21 +57,3 @@ as element(*)*
($a1,$a2) ($a1,$a2)
}; };
declare %unit:test
(:~
: smoke test
:)
function tree:test(){
let $t:=tree:build($tree:TEST1)
return unit:assert(fn:true(),$t)
};
declare %unit:test
function tree:test2(){
let $t:=tree:build($tree:TEST1)
return unit:assert(fn:false(),$t)
};

View file

@ -83,7 +83,7 @@
<xsl:template match="c:file"> <xsl:template match="c:file">
<xsl:variable name="path" select="string-join(ancestor-or-self::*/@name,'/')"/> <xsl:variable name="path" select="string-join(ancestor-or-self::*/@name,'/')"/>
<li> <li>
<a href="F{position()}/index.html"> <a href="modules/F{position()}/index.html">
<xsl:value-of select="qd:path(@name)" /> <xsl:value-of select="qd:path(@name)" />
</a> </a>

View file

@ -7,13 +7,13 @@
<xsl:import href="xqdoc.xsl"/> <xsl:import href="xqdoc.xsl"/>
<!-- Standalone xqdoc:xqdoc transform mode"restxq" --> <!-- Standalone xqdoc:xqdoc transform mode"restxq" -->
<xsl:param name="project" as="xs:string" select="'unknown'"/> <xsl:param name="project" as="xs:string" select="'unknown'"/>
<xsl:param name="source" as="xs:string" >No code provided</xsl:param> <xsl:param name="source" as="xs:string" >Source not available</xsl:param>
<xsl:param name="filename" as="xs:string" select="'?file'" /> <xsl:param name="filename" as="xs:string" select="'?file'" />
<xsl:param name="ext-id" as="xs:string"></xsl:param> <xsl:param name="ext-id" as="xs:string"></xsl:param>
<xsl:param name="show-private" as="xs:boolean" select="false()" /> <xsl:param name="show-private" as="xs:boolean" select="false()" />
<xsl:param name="resources" as="xs:string" select="'../resources/'" /> <xsl:param name="resources" as="xs:string" select="'resources/'" />
<xsl:param name="root" as="xs:string" select="'../../'" />
<xsl:variable name="index" select="'../index.html'" /> <xsl:variable name="index" select="concat($root,'index.html')" />
<xsl:variable name="vars" <xsl:variable name="vars"
select="//doc:variable[$show-private or not(doc:annotations/doc:annotation/@name='private')]" /> select="//doc:variable[$show-private or not(doc:annotations/doc:annotation/@name='private')]" />
<xsl:variable name="funs" <xsl:variable name="funs"
@ -37,7 +37,7 @@
<xsl:value-of select="$ext-id" /> <xsl:value-of select="$ext-id" />
</title> </title>
<xsl:call-template name="resources"> <xsl:call-template name="resources">
<xsl:with-param name="path" select="$resources"/> <xsl:with-param name="path" select="concat($root,$resources)"/>
</xsl:call-template> </xsl:call-template>
</head> </head>
<body class="home" id="top"> <body class="home" id="top">

View file

@ -32,7 +32,7 @@ declare function xqd:save-xq($files,$target,$params as map(*))
let $f:= document{$files} transform with { delete node //c:directory[not(.//c:file)]} let $f:= document{$files} transform with { delete node //c:directory[not(.//c:file)]}
return ( return (
$files//c:file!xqd:gendoc(.,"F" || position(),$target,$params), $files//c:file!xqd:gendoc(.,"modules/F" || position(),$target,$params),
$f=>xqd:store($target || "/files.xml",$xqd:XML), $f=>xqd:store($target || "/files.xml",$xqd:XML),
$f=>xqd:index-html($params)=>xqd:store($target || "/index.html",$xqd:HTML5), $f=>xqd:index-html($params)=>xqd:store($target || "/index.html",$xqd:HTML5),
xqd:export-resources($target) xqd:export-resources($target)
@ -65,7 +65,7 @@ declare function xqd:gendoc(
"filename": $f/@name/string(), "filename": $f/@name/string(),
"cache": $xqd:cache, "cache": $xqd:cache,
"show-private": true(), "show-private": true(),
"resources": "../resources/"}, "resources": "resources/"},
$params)) $params))
return ( return (
$xq=>xqd:parse()=>xqd:store($dest || "/xparse.xml",$xqd:XML), $xq=>xqd:parse()=>xqd:store($dest || "/xparse.xml",$xqd:XML),
@ -96,7 +96,8 @@ as map(*)* {
"filename": $f/@name/string(), "filename": $f/@name/string(),
"cache": $xqd:cache, "cache": $xqd:cache,
"show-private": true(), "show-private": true(),
"resources": "../resources/"}, "root": "../../",
"resources": "resources/"},
$params)) $params))
return ( return (
xqd:store2(xqd:parse($xq), "xparse.xml",$xqd:XML), xqd:store2(xqd:parse($xq), "xparse.xml",$xqd:XML),
@ -209,10 +210,6 @@ as element(html)
<link rel="stylesheet" type="text/css" href="{$opts?resources}query.css" /> <link rel="stylesheet" type="text/css" href="{$opts?resources}query.css" />
<link rel="stylesheet" type="text/css" href="{$opts?resources}base.css" /> <link rel="stylesheet" type="text/css" href="{$opts?resources}base.css" />
<link rel="stylesheet" type="text/css" href="{$opts?resources}prettify.css" />
<script src="{$opts?resources}prettify.js" type="text/javascript">&#160;</script>
<script src="{$opts?resources}lang-xq.js" type="text/javascript">&#160;</script>
</head> </head>
<body class="home" id="top"> <body class="home" id="top">

View file

@ -1,5 +1,5 @@
(: entity access maps (: entity access maps
: auto generated from xml files in entities folder at: 2018-10-26T22:55:28.159+01:00 : auto generated from xml files in entities folder at: 2018-11-30T09:48:45.409Z
:) :)
module namespace entity = 'quodatum.models.generated'; module namespace entity = 'quodatum.models.generated';
@ -11,12 +11,12 @@ declare namespace c='http://www.w3.org/ns/xproc-step';
declare variable $entity:list:=map { declare variable $entity:list:=map {
"basexlog": map{ "basexlog": map{
"name": "basexlog", "name": "basexlog",
"description": "BaseX log entry ", "description": "BaseX log entries ",
"access": map{ "access": map{
"address": function($_ as element()) as xs:string {$_/@address }, "address": function($_ as element()) as xs:string {$_/@address },
"ms": function($_ as element()) as xs:integer {$_/@ms }, "ms": function($_ as element()) as xs:integer {$_/@ms },
"text": function($_ as element()) as xs:string {$_/. }, "text": function($_ as element()) as xs:string {$_/. },
"time": function($_ as element()) as xs:string {$_/@time }, "time": function($_ as element()) as xs:string {$_/concat(@date,'T',@time) },
"type": function($_ as element()) as xs:string {$_/@type }, "type": function($_ as element()) as xs:string {$_/@type },
"user": function($_ as element()) as xs:string {$_/@user } }, "user": function($_ as element()) as xs:string {$_/@user } },
@ -39,7 +39,7 @@ declare variable $entity:list:=map {
}, },
"time": function($_ as element()) as element(time)? { "time": function($_ as element()) as element(time)? {
(: xs:string :) (: xs:string :)
fn:data($_/@time)!element time { .} fn:data($_/concat(@date,'T',@time))!element time { .}
}, },
"type": function($_ as element()) as element(type)? { "type": function($_ as element()) as element(type)? {
(: xs:string :) (: xs:string :)
@ -51,7 +51,15 @@ declare variable $entity:list:=map {
} }, } },
"data": function() as element(entry)* "data": function() as element(entry)*
{ hof:top-k-by(admin:logs(), hof:id#1, 2)/string()!reverse(admin:logs(.,true())) }, {
let $add-date:=function($logs as element(*)*,$d as xs:string){
$logs!(. transform with { insert node attribute date {$d} into .})
}
return
hof:top-k-by(admin:logs(), string#1, 2)
!(reverse(admin:logs(.,true()))=>$add-date(.))
},
"views": map{ "views": map{

View file

@ -1,10 +1,10 @@
<entity name="basexlog" xmlns="https://github.com/Quodatum/app-doc/entity"> <entity name="basexlog" xmlns="https://github.com/Quodatum/app-doc/entity">
<description>BaseX log entry </description> <description>BaseX log entries </description>
<fields> <fields>
<field name="time" type="xs:string"> <field name="time" type="xs:string">
<description>time of event</description> <description>time of event</description>
<xpath>@time</xpath> <xpath>concat(@date,'T',@time)</xpath>
</field> </field>
<field name="address" type="xs:string"> <field name="address" type="xs:string">
<description>IP address</description> <description>IP address</description>
@ -29,5 +29,13 @@
</fields> </fields>
<views iconclass="calendar_today"/> <views iconclass="calendar_today"/>
<data type="element(entry)">hof:top-k-by(admin:logs(), hof:id#1, 2)/string()!reverse(admin:logs(.,true()))</data> <data type="element(entry)">
let $add-date:=function($logs as element(*)*,$d as xs:string){
$logs!(. transform with { insert node attribute date {$d} into .})
}
return
hof:top-k-by(admin:logs(), string#1, 2)
!(reverse(admin:logs(.,true()))=>$add-date(.))
</data>
</entity> </entity>

20
src/vue-poc/package.json Normal file
View file

@ -0,0 +1,20 @@
{
"name": "vue-poc",
"version": "0.1.99",
"description": "A vue test",
"dependencies": {
"foo": "1.0.0 - 2.9999.9999",
"bar": ">=1.0.2 <2.1.2",
"ace": "1.3.3",
"vuetify": "0.15.2",
"vue": "2.5.17",
"vue-router": "2.5.3",
"vue-treeselect": "0.0.25",
"google-material": "0.0.0",
"js-beautify": "1.6.12",
"axios": "0.17.1",
"qs": "6.4.0",
"localforage": "1.7.1",
"moment.js": "2.18.1"
}
}

View file

@ -94,11 +94,19 @@ const router = new VueRouter({
{ path: 'tasks', name: 'taskhistory', component: Taskhistory, meta:{title: "Task History"} }, { path: 'tasks', name: 'taskhistory', component: Taskhistory, meta:{title: "Task History"} },
] ]
}, },
{ path: '/labs', component: { template: '<router-view/>' }
,children: [
{ path: 'scratch', component: Scratch, meta:{title:"scratch"} },
{ path: 'svg', component: Svg, meta:{title:"SVG"} },
{ path: 'svg2', component: Svg2, meta:{title:"SVG2"} },
{ path: 'timeline', component: Timeline,meta:{title:"timeline"} },
{ path: 'tree', component: Tree, meta:{title:"tree"} },
{ path: 'tree2', component: Tree2, meta:{title:"tree2"} },
]
},
{ path: '/puzzle', component: Puzzle, meta:{title:"Jigsaw"} }, { path: '/puzzle', component: Puzzle, meta:{title:"Jigsaw"} },
{ path: '/svg', component: Svg, meta:{title:"SVG"} },
{ path: '/svg2', component: Svg2, meta:{title:"SVG2"} },
{ path: '/transform', component: Transform, meta:{title:"XSLT2 Transform"} }, { path: '/transform', component: Transform, meta:{title:"XSLT2 Transform"} },
{ path: '/validate', component: Validate, meta:{title:"Validate"} }, { path: '/validate', component: Validate, meta:{title:"Validate"} },
@ -113,16 +121,15 @@ const router = new VueRouter({
{ path: '/tasks/vuecompile', component: Vuecompile, meta:{title:"vue compile"} }, { path: '/tasks/vuecompile', component: Vuecompile, meta:{title:"vue compile"} },
{ path: '/tasks/:task', component: Runtask, props: true, meta:{title:"Run task"} }, { path: '/tasks/:task', component: Runtask, props: true, meta:{title:"Run task"} },
{ path: '/timeline', component: Timeline,meta:{title:"timeline"} },
{ path: '/tree', component: Tree, meta:{title:"tree"} },
{ path: '/tree2', component: Tree2, meta:{title:"tree2"} },
{ path: '/map', component: Leaflet,meta:{title:"map"} }, { path: '/map', component: Leaflet,meta:{title:"map"} },
{ path: '/form', component: Brutusin, meta:{title:"Form demo"} }, { path: '/form', component: Brutusin, meta:{title:"Form demo"} },
{ path: '/form2', component: Formsjson, meta:{title:"Form schema"} }, { path: '/form2', component: Formsjson, meta:{title:"Form schema"} },
{ path: '/form3', component: Formsschema, meta:{title:"vue-form-json-schema"} }, { path: '/form3', component: Formsschema, meta:{title:"vue-form-json-schema"} },
{ path: '/scratch', component: Scratch, meta:{title:"scratch"} },
{ path: '/about', component: About, meta:{title:"About Vue-poc"} }, { path: '/about', component: About, meta:{title:"About Vue-poc"} },
{ path: '*', component: Notfound, meta:{title:"Page not found"} } { path: '*', component: Notfound, meta:{title:"Page not found"} }
], ],
@ -132,7 +139,7 @@ router.afterEach(function(route) {
}); });
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
console.log("before: ",to) //console.log("before: ",to)
if (to.matched.some(record => record.meta.requiresAuth)) { if (to.matched.some(record => record.meta.requiresAuth)) {
// this route requires auth, check if logged in // this route requires auth, check if logged in
// if not, redirect to login page. // if not, redirect to login page.

View file

@ -1,4 +1,4 @@
// generated 2018-11-21T11:42:40.952Z // generated 2018-12-17T10:20:51.102Z
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-autoheight.vue // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-autoheight.vue
Vue.component('qd-autoheight',{template:` Vue.component('qd-autoheight',{template:`
@ -79,42 +79,51 @@ Vue.component('qd-confirm',{template:`
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-fileupload.vue // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-fileupload.vue
Vue.component('qd-fileupload',{template:` Vue.component('qd-fileupload',{template:`
<vue-clip :options="options">
<template slot-scope="clip-uploader-action">
<div> <div>
<div class="dz-message"><h2> Click or Drag and Drop files here upload </h2></div> <v-btn @click="openFileDialog">
</div> Select
</template> </v-btn>
<template slot-scope="clip-uploader-body" scope="props"> <v-btn @click="uploadFile" icon="">
<div v-for="file in props.files"> <v-icon>cloud_upload</v-icon>
<img v-bind:src="file.dataUrl"> </v-btn>
{{ file.name }} {{ file.status }}
</div>
</template>
</vue-clip> <input type="file" name="files" ref="file-upload" multiple="multiple" style="display:none" @change="onFileChange">
</div>
`, `,
props: ['url'
],
data() { data() {
return { return {
options: { formData: new FormData()
url: '/vue-poc/api/upload', }
paramName: 'file',
maxFilesize: {
limit: 1,
message: '{{ filesize }} is greater than the {{ maxFilesize }}'
}, },
maxFiles: { methods: {
limit: 5, openFileDialog() {
message: 'You can only upload a max of 5 files' this.$refs['file-upload'].click();
} },
} onFileChange(e) {
} var self = this;
var files = e.target.files || e.dataTransfer.files;
if(files.length > 0){
for(var i = 0; i< files.length; i++){
self.formData.append("files", files[i], files[i].name);
} }
} }
},
uploadFile() {
var self = this;
HTTP.post( this.url, self.formData).then(function (response) {
console.log(response);
self.$emit("complete",response)
}).catch(function (error) {
console.log(error);
});
}
}
}
); );
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-fullscreen.vue // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-fullscreen.vue
@ -373,6 +382,62 @@ Vue.component('qd-table',{template:`
); );
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-tablist.vue
Vue.component('qd-tablist',{template:`
<v-menu left="" bottom="" :close-on-content-click="false">
<v-chip slot="activator">
{{ EditTabs.length }}
<v-avatar>
<v-icon right="">arrow_drop_down</v-icon>
</v-avatar>
</v-chip>
<v-card>
<v-toolbar>
<v-text-field prepend-icon="filter_list" label="type filter text" single-line="" hide-details="" v-model="search" clearable=""></v-text-field>
</v-toolbar>
<v-card-text>
<v-list style="height: 300px; overflow-y: auto;">
<v-list-tile v-for="index in edittabs.sorted()" :key="index" avatar="" dense="" ripple="" @click="setItem(index)" :inactive="index == current">
<v-list-tile-avatar>
<v-icon v-if="index == current">check_circle</v-icon>
<v-icon v-else="">insert_drive_file</v-icon>
</v-list-tile-avatar>
<v-list-tile-content>
<v-list-tile-title>{{ edittabs.items[index].name }}</v-list-tile-title>
</v-list-tile-content>
<v-list-tile-action>
{{ edittabs.items[index].id }} [{{ index }}]
</v-list-tile-action>
</v-list-tile>
</v-list>
</v-card-text>
<v-card-actions>
current : {{ current }}
</v-card-actions>
</v-card>
</v-menu>
`,
props: ['edittabs',
'current'
],
data () {
return {
search:null
}
},
methods: {
setItem(index){
this.$emit('selected', index)
},
}
}
);
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/vis-time-line.vue // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/vis-time-line.vue
Vue.component('vis-time-line',{template:` Vue.component('vis-time-line',{template:`
<div></div> <div></div>
@ -804,6 +869,8 @@ Vue.component('vue-ace',{template:`
'events', // event bus if set handles "eventFired",cmd 'events', // event bus if set handles "eventFired",cmd
'settings', 'settings',
'minLines', 'minLines',
'completer',
'snippets'
], ],
data () { data () {
return { return {
@ -817,6 +884,7 @@ Vue.component('vue-ace',{template:`
enableBasicAutocompletion:true, enableBasicAutocompletion:true,
enableLiveAutocompletion:true enableLiveAutocompletion:true
}, },
annots:{ annots:{
error:0,warning:0,info:0 error:0,warning:0,info:0
} }
@ -832,6 +900,8 @@ Vue.component('vue-ace',{template:`
'mode' (value) { 'mode' (value) {
var session=this.editor.getSession() var session=this.editor.getSession()
session.setMode(`ace/mode/${value}`) session.setMode(`ace/mode/${value}`)
}, },
'wrap' (value) { 'wrap' (value) {
var session=this.editor.getSession() var session=this.editor.getSession()
@ -934,7 +1004,7 @@ Vue.component('vue-ace',{template:`
this.editor.getSession().selection.on('changeCursor', (e) => { this.editor.getSession().selection.on('changeCursor', (e) => {
var position = this.editor.selection.cursor; var position = this.editor.selection.cursor;
var token = this.editor.getSession().getTokenAt(position.row, position.column); var token = this.editor.getSession().getTokenAt(position.row, position.column);
console.log("token",token); //console.log("token",token);
this.$emit('token', token); this.$emit('token', token);
}); });
@ -945,10 +1015,83 @@ Vue.component('vue-ace',{template:`
}else this.command(cmd); }else this.command(cmd);
}); });
} }
if(this.completer){
var langTools = ace.require("ace/ext/language_tools");
langTools.addCompleter(this.completer);
}
if(this.snippets){
var snippetManager = ace.require("ace/snippets").snippetManager;
snippetManager.register(this.snippets, "xquery");
}
} }
} }
); );
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/aceextras.js
// ace customisations
const AceExtras={
rhymeCompleter: {
// test completer
getCompletions: function(editor, session, pos, prefix, callback) {
if (prefix.length === 0) { callback(null, []); return }
axios.get("http://rhymebrain.com/talk",{params:{function:"getRhymes",word:prefix}})
.then(
function(wordList) {
// wordList like [{"word":"flow","freq":24,"score":300,"flags":"bc","syllables":"1"}]
var r=wordList.data.map(function(ea) {
return {name: ea.word, value: ea.word, score: ea.score, meta: "rhyme"}
})
callback(null,r)
})
}
},
//basex functions
basexCompleter: {
getCompletions: function(editor, session, pos, prefix, callback) {
if (prefix.length === 0) { callback(null, []); return }
console.log("dd",prefix)
callback(null, [{
caption: "archive:create#2",
snippet: "archive:create(${1:entries}, ${2:contents})",
score: 100,
meta: "archive",
completer: this
}, {
caption: "archive:create#3",
snippet: "archive:create(${1:entries}, ${2:contents}, ${3:options})",
score: 100,
meta: "archive",
completer: this
}])
}
},
snippets:[
{
name: "test",
content: "something",
tabTrigger: "test:"
},
{
name: "test2",
content: "some2",
tabTrigger: "he"
}
],
install: function(Vue){
Object.defineProperty(Vue.prototype, '$aceExtras', {
get () { return AceExtras }
})
}
};
Vue.use(AceExtras);
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/auth.js // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/auth.js
// Authorization Object // Authorization Object
const Auth={ const Auth={
@ -975,21 +1118,24 @@ Vue.use(Auth);
// name: // name:
// contentType: // contentType:
// text: // text:
// id: // id: ids have the form "Tn"
// url: // url:
// requires: Settings,HTTP
// //
const EditTabs=new Vue({ const GEditTabs={
data(){ data(){
return { return {
items:[], items:[],
length: 0,
nextId: 1, nextId: 1,
currentId: null currentId: null,
restored: null
} }
}, },
methods: { methods: {
addItem(tab){ addItem(tab){
console.log("new: ",tab); //console.log("new: ",tab);
var def={name: "AA"+this.nextId, var def={name: "AA"+this.nextId,
contentType: "text/xml", contentType: "text/xml",
mode: "xml", mode: "xml",
@ -997,20 +1143,17 @@ const EditTabs=new Vue({
url: null url: null
}; };
var etab = Object.assign(def,tab); var etab = Object.assign(def,tab);
etab.id= ""+this.nextId etab.id= "T" + this.nextId
this.items.push (etab); this.items.push (etab);
this.length++
this.nextId++; this.nextId++;
return etab; return etab;
}, },
closeItem(item){ closeItem(item){
var index=this.items.indexOf(item); //https://github.com/vuejs/vue/issues/5855
if (index > -1) { this.items=this.items.filter(t => t.id !== item.id)
alert("index: "+index) this.length--;
this.items.splice(index, 1);
index=(index==0)?0:index-1;
this.currentId=(this.items.length)?"T"+this.items[index].id : null;
}
}, },
// fetch content from server and create tab // fetch content from server and create tab
@ -1037,7 +1180,7 @@ const EditTabs=new Vue({
restore(){ restore(){
that=this that=this
Settings.getItem('edit/items') this.restored=Settings.getItem('edit/items')
.then(function (v){ .then(function (v){
console.log("items ",v) console.log("items ",v)
v.forEach(v =>that.addItem(v)) v.forEach(v =>that.addItem(v))
@ -1048,11 +1191,18 @@ const EditTabs=new Vue({
}); });
}, },
sorted(){ sorted(){ /* sorted indices */
return this.items.slice(0).sort((a,b) => a.name.localeCompare(b.name)) var len=this.items.length
var indices = new Array(len);
for (var i = 0; i < len; ++i) indices[i] = i;
var list=this.items
return indices.sort((a,b) =>list[a].name.localeCompare(list[b].name))
} }
},
created(){
console.log("EditTabs created")
} }
}); };
@ -1206,7 +1356,6 @@ const Notification={
elapsed: null elapsed: null
}, },
opts); opts);
console.log("opt",opts);
this.messages.unshift(data); this.messages.unshift(data);
this.messages.length = Math.min(this.messages.length, 30); this.messages.length = Math.min(this.messages.length, 30);
++this.unseen; ++this.unseen;
@ -1400,7 +1549,7 @@ const Log=Vue.extend({template:`
</v-toolbar> </v-toolbar>
<v-data-table :headers="headers" :items="items" :search="search" class="elevation-1" no-data-text="No logs found" v-bind:pagination.sync="pagination"> <v-data-table :headers="headers" :items="items" :search="search" class="elevation-1" no-data-text="No logs found" v-bind:pagination.sync="pagination">
<template slot="items" slot-scope="props"> <template slot="items" slot-scope="props">
<td class="text-xs-right">{{ props.item.time }}</td> <td :title="props.item.time">{{ props.item.time }}</td>
<td class="text-xs-right">{{ props.item.user }}</td> <td class="text-xs-right">{{ props.item.user }}</td>
<td class="text-xs-right">{{ props.item.type }}</td> <td class="text-xs-right">{{ props.item.type }}</td>
<td class="text-xs-right">{{ props.item.ms }}</td> <td class="text-xs-right">{{ props.item.ms }}</td>
@ -1723,7 +1872,6 @@ const Files=Vue.extend({template:`
path: a.slice(0,i+1).join("/")+"/"}} path: a.slice(0,i+1).join("/")+"/"}}
); );
url[0].icon=this.icon; url[0].icon=this.icon;
console.log("CRUM",url)
return url; return url;
}, },
selection(){ selection(){
@ -2225,7 +2373,7 @@ const Edit=Vue.extend({template:`
<v-card-text v-if="!busy"> <v-card-text v-if="!busy">
<v-flex xs12="" style="height:70vh" fill-height=""> <v-flex xs12="" style="height:70vh" fill-height="">
<vue-ace :content="contentA" :mode="mode" :wrap="wrap" :settings="aceSettings" :events="events" v-resize="onResize" v-on:change-content="changeContentA" v-on:annotation="annotation"></vue-ace> <vue-ace :content="contentA" :mode="mode" :wrap="wrap" :settings="aceSettings" :events="events" v-resize="onResize" :completer="$aceExtras.basexCompleter" :snippets="$aceExtras.snippets" v-on:change-content="changeContentA" v-on:annotation="annotation"></vue-ace>
</v-flex> </v-flex>
</v-card-text> </v-card-text>
</v-card> </v-card>
@ -2517,7 +2665,7 @@ const Tabs=Vue.extend({template:`
</v-menu> </v-menu>
<v-tabs v-model="currentId" slot="extension"> <v-tabs v-model="currentId" slot="extension">
<v-tab v-for="item in EditTabs.items" :key="item.id" :href="'#T' + item.id" ripple="" style="text-transform: none;text-align:left"> <v-tab v-for="item in EditTabs.items" :key="item.id" ripple="" style="text-transform: none;text-align:left">
<v-avatar> <v-avatar>
<v-icon size="16px">insert_drive_file</v-icon> <v-icon size="16px">insert_drive_file</v-icon>
</v-avatar> </v-avatar>
@ -2533,7 +2681,7 @@ const Tabs=Vue.extend({template:`
<v-tabs-items slot="body" v-model="currentId"> <v-tabs-items slot="body" v-model="currentId">
<v-tab-item v-for="item in EditTabs.items" :key="item.id" :id="'T' + item.id"> <v-tab-item v-for="item in EditTabs.items" :key="item.id" :value="item.id">
<v-card flat="" v-if="showInfo"> <v-card flat="" v-if="showInfo">
<v-card-actions> <v-card-actions>
<v-toolbar-title>Metadata for tab id: '{{ currentId }}'</v-toolbar-title> <v-toolbar-title>Metadata for tab id: '{{ currentId }}'</v-toolbar-title>
@ -2665,9 +2813,9 @@ const Tabs=Vue.extend({template:`
watch:{ watch:{
currentId (val) { currentId (val) {
console.log("currentId: ",val)
this.active = EditTabs.items.find(e=> val=="T"+e.id); this.active = EditTabs.items.find(e=> val=="T"+e.id);
this.$router.push({ query: { id: val }}); this.$router.push({ query: { id: val }});
console.log("current",val)
} }
}, },
@ -4207,13 +4355,13 @@ const Jobs=Vue.extend({template:`
<v-checkbox primary="" hide-details="" v-model="props.selected"></v-checkbox> <v-checkbox primary="" hide-details="" v-model="props.selected"></v-checkbox>
</td> </td>
<td class="vtop"> <router-link :to="{name: 'jobShow', params: {job: props.item.id }}">{{props.item.id}}</router-link></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.state }}</div> <td class="vtop "><div>{{ props.item.state }}</div><div>{{ props.item.type }}</div> </td>
<div>{{ props.item.type }}</div> </td> <td class="vtop " :title="props.item.registered">{{ props.item.registered | fromNow}}</td>
<td class="vtop " :title="props.item.start">{{ props.item.start | fromNow}}</td>
<td class="vtop text-xs-right">{{ props.item.duration }}</td> <td class="vtop text-xs-right">{{ props.item.duration }}</td>
<td class="vtop text-xs-right">{{ props.item.writes }}</td> <td class="vtop text-xs-right">{{ props.item.writes }}</td>
<td class="vtop text-xs-right">{{ props.item.reads }}</td> <td class="vtop text-xs-right">{{ props.item.reads }}</td>
<td class="vtop text-xs-right">{{ props.item.user }}</td> <td class="vtop text-xs-right">{{ props.item.user }}</td>
<td class="vtop"><code class="multiline-ellipsis">{{ props.item.text }}</code></td>
</template> </template>
</v-data-table> </v-data-table>
</v-card> </v-card>
@ -4228,11 +4376,12 @@ const Jobs=Vue.extend({template:`
value: 'id' value: 'id'
}, },
{ text: 'State', value: 'state' }, { text: 'State', value: 'state' },
{ text: 'Registered', value: 'registered' },
{ text: 'Start', value: 'start' },
{ text: 'Duration', value: 'duration' }, { text: 'Duration', value: 'duration' },
{ text: 'WriteL', value: 'writes' }, { text: 'WriteL', value: 'writes' },
{ text: 'ReadL', value: 'reads' }, { text: 'ReadL', value: 'reads' },
{ text: 'User', value: 'user' }, { text: 'User', value: 'user' }
{ text: 'Query', value: 'text' }
], ],
items:[ items:[
], ],
@ -4284,7 +4433,7 @@ const Login=Vue.extend({template:`
<v-card> <v-card>
<v-card-title class="red"> <v-card-title class="red">
<span class="white--text">The current credentials do the give access this page, please login again</span> <span class="white--text">The current credentials do the give access this page, please login.</span>
</v-card-title> </v-card-title>
<v-card-actions> <v-card-actions>
@ -4306,7 +4455,7 @@ const Login=Vue.extend({template:`
<v-card-actions> <v-card-actions>
<v-spacer></v-spacer> <v-spacer></v-spacer>
<v-btn color="primary" @click="go()">Continue</v-btn> <v-btn color="primary" @click="go()">Login</v-btn>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-flex> </v-flex>
@ -4535,7 +4684,7 @@ const Entity1=Vue.extend({template:`
<v-expansion-panel v-model="panel" expand=""> <v-expansion-panel v-model="panel" expand="">
<v-expansion-panel-content> <v-expansion-panel-content>
<div slot="header" class="title">Description: </div> <div slot="header" class="title"><v-icon>{{ item.iconclass }}</v-icon> {{ item.name }}</div>
{{item.description}} {{item.description}}
<pre v-if="xml"><code>{{ xml }}</code></pre> <pre v-if="xml"><code>{{ xml }}</code></pre>
</v-expansion-panel-content> </v-expansion-panel-content>
@ -4902,26 +5051,141 @@ created:function(){
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/scratch.vue // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/scratch.vue
const Scratch=Vue.extend({template:` const Scratch=Vue.extend({template:`
<v-container fluid=""> <v-container fluid="">
<qd-fileupload title="Up it" selected-callback="upit">up load</qd-fileupload> <v-toolbar tabs="" dense="">
<qd-autoheight> <v-toolbar-title>Tab index {{ curIndex }}</v-toolbar-title>
<vue-ace :content="ace" mode="xml"></vue-ace> <v-btn v-if="active">{{ active.mode }}</v-btn>
</qd-autoheight> <v-btn v-if="active"> {{ active.name }}, id: {{ active.id }}</v-btn>
<v-spacer></v-spacer>
<v-btn @click="add">Add</v-btn>
<v-btn @click="curIndex=2">set</v-btn>
<qd-tablist :edittabs="EditTabs" :current="curIndex" @selected="setItem">tab list</qd-tablist>
<v-tabs v-model="curIndex" slot="extension">
<v-tab v-for="(item,index) in EditTabs.items" :key="item.id" ripple="" style="text-transform: none;text-align:left">
<v-avatar>
<v-icon size="16px">insert_drive_file</v-icon>
</v-avatar>
<span>{{ (item.dirty?"*":"") }}</span>
<span>{{ item.name }}</span>
<v-spacer></v-spacer>
<v-btn icon="" @click.stop="tabClose(item,index)">
<v-icon size="16px">close</v-icon>
</v-btn>
</v-tab>
</v-tabs>
</v-toolbar>
<v-tabs-items v-model="curIndex">
<v-tab-item v-for="item in EditTabs.items" :key="item.id">
<v-card>
<div style="height:200px" ref="ace" v-resize="onResize">
<v-flex xs12="" fill-height="">
<vue-ace :content="item.text" v-on:change-content="changeContent" :events="events" :mode="item.mode" :wrap="wrap" :settings="aceSettings" v-on:annotation="annotation"></vue-ace>
</v-flex>
</div>
</v-card>
</v-tab-item>
</v-tabs-items>
</v-container> </v-container>
`, `,
data: function(){ data: function(){
return { return {
message: 'bad route!', curIndex: null, //index of current
ace:"<xml>here</xml>" active: null,
showInfo: false, // showing info
wrap: true,
events: new Vue({}),
aceSettings: {},
annotations: null,
folded: false,
EditTabs: EditTabs
} }
}, },
methods:{ methods:{
upit:function(s){ add(){
alert("up") var a=this.EditTabs.addItem({text:"hi "+ new Date()})
this.curIndex=this.EditTabs.items.indexOf(a)
},
tabClose(item,index){
if(item.dirty){
if (!confirm("Not saved continue? "+ index))return;
}else{
this.EditTabs.closeItem(item)
this.curIndex=0
} }
}, },
mounted:function(){ setItem(v){
console.log("scratch",this.$route.path) this.curIndex=v;
},
annotation(counts){
this.annotations=counts
//console.log("annotations: ",counts)
},
changeContent(val){
var item=this.active;
//console.log("change",val);
if (item.text !== val) {
item.text = val;
item.dirty=true;
}
},
onResize(){
var el=this.$refs["ace"];
for (e of el){
//console.log("top",e.offsetTop)
var h=Math.max(1,window.innerHeight - e.offsetTop -200)
// console.log("h",h)
e.style.height=h +"px";
}
}
},
computed:{
count(){
console.log("LEN:",this.EditTabs.length)
return this.EditTabs.length
}
},
watch:{
curIndex (val) {
this.active = EditTabs.items[val];
console.log("curIndex: ",val)
if(this.active) this.$router.push({ query: { id: this.active.id }});
}
},
beforeRouteEnter (to, from, next) {
Promise.all([Settings.getItem('settings/ace')
])
.then(function(values) {
next(vm => {
vm.aceSettings = values[0];
console.log("SSS",JSON.parse(JSON.stringify(EditTabs.items)))
})
})
},
created:function(){
var url=this.$route.query.url;
if(url){
EditTabs.loadItem(url);
}else{
var tid=this.$route.query.id;
var id=EditTabs.items.findIndex(i=>i.id ==tid)
console.log("set tab",tid,id)
EditTabs.restored.then(()=>{
var id=EditTabs.items.findIndex(i=>i.id ==tid)
console.log("set tab",tid,id)
this.curIndex= id;
});
}
} }
} }
@ -5348,20 +5612,30 @@ const Ping=Vue.extend({template:`
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/server/upload.vue // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/server/upload.vue
const Upload=Vue.extend({template:` const Upload=Vue.extend({template:`
<v-container fluid="">
<v-snackbar v-model="snack" color="success">File upload complete</v-snackbar>
<v-card> <v-card>
<v-card-title>Upload</v-card-title> <v-card-title>File transfers</v-card-title>
<v-card-actions> <v-card-text>
<qd-fileupload>up..</qd-fileupload> <qd-fileupload url="upload" @complete="upit">up load</qd-fileupload>
</v-card-actions> </v-card-text>
</v-card> </v-card>
</v-container>
`, `,
data: function(){ data: function(){
return { return {
fab: false snack: false
} }
},
methods:{
upit:function(s){
this.snack=true;
},
} }
} }
); );
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/session.vue // src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/session.vue
@ -6672,11 +6946,19 @@ const router = new VueRouter({
{ path: 'tasks', name: 'taskhistory', component: Taskhistory, meta:{title: "Task History"} }, { path: 'tasks', name: 'taskhistory', component: Taskhistory, meta:{title: "Task History"} },
] ]
}, },
{ path: '/labs', component: { template: '<router-view/>' }
,children: [
{ path: 'scratch', component: Scratch, meta:{title:"scratch"} },
{ path: 'svg', component: Svg, meta:{title:"SVG"} },
{ path: 'svg2', component: Svg2, meta:{title:"SVG2"} },
{ path: 'timeline', component: Timeline,meta:{title:"timeline"} },
{ path: 'tree', component: Tree, meta:{title:"tree"} },
{ path: 'tree2', component: Tree2, meta:{title:"tree2"} },
]
},
{ path: '/puzzle', component: Puzzle, meta:{title:"Jigsaw"} }, { path: '/puzzle', component: Puzzle, meta:{title:"Jigsaw"} },
{ path: '/svg', component: Svg, meta:{title:"SVG"} },
{ path: '/svg2', component: Svg2, meta:{title:"SVG2"} },
{ path: '/transform', component: Transform, meta:{title:"XSLT2 Transform"} }, { path: '/transform', component: Transform, meta:{title:"XSLT2 Transform"} },
{ path: '/validate', component: Validate, meta:{title:"Validate"} }, { path: '/validate', component: Validate, meta:{title:"Validate"} },
@ -6691,16 +6973,15 @@ const router = new VueRouter({
{ path: '/tasks/vuecompile', component: Vuecompile, meta:{title:"vue compile"} }, { path: '/tasks/vuecompile', component: Vuecompile, meta:{title:"vue compile"} },
{ path: '/tasks/:task', component: Runtask, props: true, meta:{title:"Run task"} }, { path: '/tasks/:task', component: Runtask, props: true, meta:{title:"Run task"} },
{ path: '/timeline', component: Timeline,meta:{title:"timeline"} },
{ path: '/tree', component: Tree, meta:{title:"tree"} },
{ path: '/tree2', component: Tree2, meta:{title:"tree2"} },
{ path: '/map', component: Leaflet,meta:{title:"map"} }, { path: '/map', component: Leaflet,meta:{title:"map"} },
{ path: '/form', component: Brutusin, meta:{title:"Form demo"} }, { path: '/form', component: Brutusin, meta:{title:"Form demo"} },
{ path: '/form2', component: Formsjson, meta:{title:"Form schema"} }, { path: '/form2', component: Formsjson, meta:{title:"Form schema"} },
{ path: '/form3', component: Formsschema, meta:{title:"vue-form-json-schema"} }, { path: '/form3', component: Formsschema, meta:{title:"vue-form-json-schema"} },
{ path: '/scratch', component: Scratch, meta:{title:"scratch"} },
{ path: '/about', component: About, meta:{title:"About Vue-poc"} }, { path: '/about', component: About, meta:{title:"About Vue-poc"} },
{ path: '*', component: Notfound, meta:{title:"Page not found"} } { path: '*', component: Notfound, meta:{title:"Page not found"} }
], ],
@ -6710,7 +6991,7 @@ router.afterEach(function(route) {
}); });
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
console.log("before: ",to) //console.log("before: ",to)
if (to.matched.some(record => record.meta.requiresAuth)) { if (to.matched.some(record => record.meta.requiresAuth)) {
// this route requires auth, check if logged in // this route requires auth, check if logged in
// if not, redirect to login page. // if not, redirect to login page.
@ -6804,7 +7085,8 @@ const Vuepoc=Vue.extend({template:`
<v-list-tile-title><qd-fullscreen> Full screen</qd-fullscreen></v-list-tile-title> <v-list-tile-title><qd-fullscreen> Full screen</qd-fullscreen></v-list-tile-title>
</v-list-tile> </v-list-tile>
<v-list-tile> <v-list-tile>
<v-list-tile-title><v-switch label="Dark theme" v-model="dark"></v-switch></v-list-tile-title> <v-list-tile-title>Dark theme</v-list-tile-title>
<v-list-tile-action><v-switch v-model="dark"></v-switch> </v-list-tile-action>
</v-list-tile> </v-list-tile>
<v-divider></v-divider> <v-divider></v-divider>
<v-list-tile> <v-list-tile>
@ -6925,7 +7207,18 @@ const Vuepoc=Vue.extend({template:`
{href: '/tree',text: 'Tree',icon: 'nature'}, {href: '/tree',text: 'Tree',icon: 'nature'},
{href: '/tree2',text: 'Tree 2',icon: 'nature'} {href: '/tree2',text: 'Tree 2',icon: 'nature'}
]}, ]},
{
icon: 'toys',
text: 'Labs' ,
model: false,
children: [
{href: '/labs/scratch',text: 'Scratch pad',icon: 'filter_frames'},
{href: '/labs/timeline',text: 'Time line',icon: 'timelapse'},
{href: '/labs/svg',text: 'SVG',icon: 'extension'},
{href: '/labs/svg2',text: 'SVG2',icon: 'extension'},
{href: '/labs/tree',text: 'Tree',icon: 'nature'},
{href: '/labs/tree2',text: 'Tree 2',icon: 'nature'}
]},
{href: '/settings',text: 'Settings',icon: 'settings' }, {href: '/settings',text: 'Settings',icon: 'settings' },
{href: '/about',text: 'About (v0.3.2)' , icon: 'help' }, {href: '/about',text: 'About (v0.3.2)' , icon: 'help' },
] ]
@ -7215,6 +7508,7 @@ Vue.component('l-marker', Vue2Leaflet.LMarker);
// Vue.component('form-schema', window["vue-json-schema"].default); // Vue.component('form-schema', window["vue-json-schema"].default);
//}; //};
//Vue.use({ install: install }); //Vue.use({ install: install });
var EditTabs=new Vue(GEditTabs)
Vue.use(Vuetify); Vue.use(Vuetify);
new Vuepoc().$mount('#app') new Vuepoc().$mount('#app')

View file

@ -10,7 +10,7 @@
<link rel="shortcut icon" href="/vue-poc/ui/icon.png"/> <link rel="shortcut icon" href="/vue-poc/ui/icon.png"/>
<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="//unpkg.com/vuetify@1.3.9/dist/vuetify.min.css" type="text/css"/> <link rel="stylesheet" href="//unpkg.com/vuetify@1.3.14/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" rel="stylesheet" type="text/css"/> <link rel="stylesheet" href="/vue-poc/ui/prism/prism.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="//unpkg.com/leaflet@1.0.3/dist/leaflet.css"/> <link rel="stylesheet" href="//unpkg.com/leaflet@1.0.3/dist/leaflet.css"/>
@ -21,7 +21,7 @@
<body> <body>
<div id="app"> <div id="app">
<h3><code>vue-poc</code> <small>(v0.3.135)</small> </h3> <h3><code>vue-poc</code> <small>(v0.3.150)</small> </h3>
<div class="spinner"> <div class="spinner">
<div class="rect1"></div> <div class="rect1"></div>
@ -33,14 +33,14 @@
</div> </div>
</div> </div>
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.5.21/vue.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/vue-router/3.0.1/vue-router.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/vue-router/3.0.1/vue-router.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.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@1.3.9/dist/vuetify.min.js" crossorigin="anonymous"></script> <script src="//unpkg.com/vuetify@1.3.14/dist/vuetify.min.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ace.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.2/ace.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ext-language_tools.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.2/ext-language_tools.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.1/ext-linking.js" type="text/javascript" charset="utf-8"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.4.2/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.6.12/beautify.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/js-beautify/1.6.12/beautify.js" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/js-beautify/1.6.12/beautify-css.js" crossorigin="anonymous"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/js-beautify/1.6.12/beautify-css.js" crossorigin="anonymous"></script>

9
vue-poc.iml Normal file
View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>