+
+
+
+
+
+ Example Chip
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vue-poc/features/model/entity.vue b/src/vue-poc/features/model/entity.vue
index b12c3c4..f7fbd90 100644
--- a/src/vue-poc/features/model/entity.vue
+++ b/src/vue-poc/features/model/entity.vue
@@ -8,6 +8,7 @@
:loading="loading"
:disabled="loading"
>Refresh
+ Text
@@ -16,6 +17,7 @@
content-tag="v-layout"
row
wrap
+ :loading="loading"
:items="items"
:rows-per-page-items="rowsPerPageItems"
:pagination.sync="pagination"
@@ -30,25 +32,24 @@
md4
lg3
>
-
-
-
-
-
- {{ props.item.iconclass }} {{ props.item.name }}
-
-
-
-
+
+
+
+
+
+
+ {{ props.item.iconclass }} {{ props.item.name }}
+
+
+
+
{{ props.item.description }}
-
-
-
- Fields:
- {{ props.item.nfields }}
-
-
-
+
+
+ {{ props.item.nfields }}
+ Fields
+
+
diff --git a/src/vue-poc/features/namespace.vue b/src/vue-poc/features/namespace.vue
index c890be1..0467ebc 100644
--- a/src/vue-poc/features/namespace.vue
+++ b/src/vue-poc/features/namespace.vue
@@ -1,18 +1,89 @@
-
-namespaces
+
+
+ Namespaces
+
+ Refresh
+ Text
+
+
+
+
+
+
+
+
+
+ star {{ props.item.xmlns }}
+
+
+
+
+ {{ props.item.description }}
+
+
+ {{ props.item.prefix }}
+ Fields
+
+
+
+
+
diff --git a/src/vue-poc/features/ping/ping.vue b/src/vue-poc/features/ping/ping.vue
index 9d46dab..b07e4da 100644
--- a/src/vue-poc/features/ping/ping.vue
+++ b/src/vue-poc/features/ping/ping.vue
@@ -9,7 +9,7 @@
Read or increment a database value. This measures round trip times browser-database-browser.
- Counter:{{counter}}
+ Counter: {{counter}}
diff --git a/src/vue-poc/features/repository.vue b/src/vue-poc/features/repository.vue
index e55ffa0..6cb4ed6 100644
--- a/src/vue-poc/features/repository.vue
+++ b/src/vue-poc/features/repository.vue
@@ -21,7 +21,7 @@
class="elevation-1"
no-data-text="No repo found @todo"
>
-
+
-
+
{{data.item.suburb}}
diff --git a/src/vue-poc/features/svg2.vue.x b/src/vue-poc/features/svg2.vue.x
new file mode 100644
index 0000000..9b435e6
--- /dev/null
+++ b/src/vue-poc/features/svg2.vue.x
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Selected: {{ selected }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vue-poc/features/tasks/taskdef.xml b/src/vue-poc/features/tasks/taskdef.xml
index 27f00a0..cec07fa 100644
--- a/src/vue-poc/features/tasks/taskdef.xml
+++ b/src/vue-poc/features/tasks/taskdef.xml
@@ -15,7 +15,12 @@
XQdoc
Generate XQdoc as html
-
+
+
+ XQdoc to db
+ Generate XQdoc to save
+
+
vue compile
diff --git a/src/vue-poc/features/xslt/rq-xslt.xqm b/src/vue-poc/features/xslt/rq-xslt.xqm
index 9fd0532..a4927d7 100644
--- a/src/vue-poc/features/xslt/rq-xslt.xqm
+++ b/src/vue-poc/features/xslt/rq-xslt.xqm
@@ -19,13 +19,13 @@ function tx:xslt($xml,$xslt) {
let $result:=try{
let $x:=fn:parse-xml($xml)
let $s:=fn:parse-xml($xslt)
- let $t:=fn:trace($xml,"xml")
- let $t:=fn:trace($xslt,"xml")
- let $r:=xslt:transform($x,$s)
+ let $params:=map{}
+ let $opts:=map{"cache":true()}
+ let $r:=xslt:transform-text($x,$s,$params,$opts)
return
0
- {fn:serialize($r)}
+ {$r}
}
catch *{
diff --git a/src/vue-poc/models.gen.xqm b/src/vue-poc/models.gen.xqm
index 21f9cfd..6640022 100644
--- a/src/vue-poc/models.gen.xqm
+++ b/src/vue-poc/models.gen.xqm
@@ -1,5 +1,5 @@
(: entity access maps
- : auto generated from xml files in entities folder at: 2018-02-12T09:42:15.78Z
+ : auto generated from xml files in entities folder at: 2018-03-01T21:54:58.72Z
:)
module namespace entity = 'quodatum.models.generated';
@@ -248,7 +248,7 @@ declare variable $entity:list:=map {
} },
"data": function() as element(namespace)*
- { collection("vuepoc")/namespaces/namespace
+ { collection("vue-poc")/namespaces/namespace
},
"views": map{
@@ -437,6 +437,34 @@ declare variable $entity:list:=map {
"views": map{
'filter': 'name'
+ }
+ },
+ "xqdoc": map{
+ "name": "xqdoc",
+ "description": "XQuery documentation set ",
+ "access": map{
+ "root": function($_ as element()) as xs:string {$_/@root },
+ "time": function($_ as element()) as xs:string {$_/@time } },
+
+ "filter": function($item,$q) as xs:boolean{
+ some $e in ( ) satisfies
+ fn:contains($e,$q, 'http://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive')
+ },
+ "json": map{
+ "root": function($_ as element()) as element(root)? {
+ (: xs:string :)
+ fn:data($_/@root)!element root { .}
+ },
+ "time": function($_ as element()) as element(time)? {
+ (: xs:string :)
+ fn:data($_/@time)!element time { .}
+ } },
+
+ "data": function() as element(entry)*
+ { () },
+
+ "views": map{
+
}
}
};
diff --git a/src/vue-poc/models/namespace.xml b/src/vue-poc/models/namespace.xml
index cea38cb..7229b70 100644
--- a/src/vue-poc/models/namespace.xml
+++ b/src/vue-poc/models/namespace.xml
@@ -19,6 +19,6 @@
xmlns description
label
- collection("vuepoc")/namespaces/namespace
+ collection("vue-poc")/namespaces/namespace
\ No newline at end of file
diff --git a/src/vue-poc/models/xqdoc.xml b/src/vue-poc/models/xqdoc.xml
new file mode 100644
index 0000000..fc7c12a
--- /dev/null
+++ b/src/vue-poc/models/xqdoc.xml
@@ -0,0 +1,18 @@
+
+ XQuery documentation set
+
+
+
+ time of generation
+ @time
+
+
+ root folder to scan
+ @root
+
+
+
+
+ fa fa-calendar
+ ()
+
\ No newline at end of file
diff --git a/src/vue-poc/router.js b/src/vue-poc/router.js
index 966a9f5..554ab4b 100644
--- a/src/vue-poc/router.js
+++ b/src/vue-poc/router.js
@@ -26,6 +26,7 @@ const router = new VueRouter({
{ path: '/images/dates', component: Dates, meta:{title:"Image dates"} },
{ path: '/images/people', component: People, meta:{title:"Image people"} },
+ { path: '/documentation', component: Documentation, meta:{title:"documentation"} },
{ path: '/entity', component: Entity, meta:{title:"Entities"} },
{ path: '/namespace', component: Namespace, meta:{title:"Namespaces"} },
{ path: '/select', component: Select, meta:{title:"Select"} },
@@ -43,6 +44,7 @@ const router = new VueRouter({
{ path: '/history', component: History, meta:{title:"File History"} },
{ 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: '/validate', component: Validate, meta:{title:"Validate"} },
{ path: '/eval', component: Eval, meta:{title:"Evaluate XQuery"} },
@@ -56,7 +58,8 @@ const router = new VueRouter({
{ path: '/jobs/:job', name:"jobShow", component: Job, props: true, meta:{title:"Job Status"} },
{ path: '/timeline', component: Timeline,meta:{title:"timeline"} },
{ path: '/map', component: Map,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: '/about', component: About,meta:{title:"About Vue-poc"} },
{ path: '*', component: Notfound,meta:{title:"Page not found"} }
],
diff --git a/src/vue-poc/static/app-gen.js b/src/vue-poc/static/app-gen.js
index 4bf03eb..1a32610 100644
--- a/src/vue-poc/static/app-gen.js
+++ b/src/vue-poc/static/app-gen.js
@@ -1,4 +1,4 @@
-// generated 2018-02-15T22:49:15.318Z
+// generated 2018-03-04T18:03:42.736Z
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-confirm.vue
Vue.component('qd-confirm',{template:`
@@ -72,7 +72,7 @@ Vue.component('qd-navlist',{template:`
-
+
{{ subItem.icon }}
@@ -95,7 +95,7 @@ Vue.component('qd-navlist',{template:`
`,
- props: ['items']
+ props: ['items','mini']
}
);
@@ -121,6 +121,42 @@ Vue.component('qd-panel',{template:`
);
+// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-search.vue
+Vue.component('qd-search',{template:`
+
+ `,
+
+ data:function(){return {
+ q: "",
+ loading: false,
+ searchItems:[],
+ si: '',
+ items2:["todo","set","search"]
+ }
+ },
+ methods: {
+ querySelections (v) {
+ this.loading = true
+ // Simulated ajax query
+ setTimeout(() => {
+ this.items2 = ["aa","bb",this.si],
+ this.loading = false
+ }, 500)
+ },
+
+ goSearch(){
+ this.$router.push({path: '/search',query: { q: this.q }})
+ },
+ },
+ watch: {
+ si:function(val){
+ console.log("si: ",val);
+ this.querySelections();
+ }
+ }
+}
+ );
+
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/qd-table.vue
Vue.component('qd-table',{template:`
@@ -131,7 +167,7 @@ Vue.component('qd-table',{template:`
Refresh
-
+
@@ -212,11 +248,10 @@ Vue.component('vis-time-line',{template:`
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/vp-favorite.vue
Vue.component('vp-favorite',{template:`
-
-
+
+
star_border
-
@@ -264,6 +299,27 @@ Vue.component('vp-favorite',{template:`
}
);
+// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/vp-filepick.vue
+Vue.component('vp-filepicker',{template:`
+
+
+
+
+
+
+
+
+
+ `,
+
+ props: ['show'],
+ created:function(){
+ console.log("vp-filepicker");
+ }
+}
+
+ );
+
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/components/vp-job.vue
Vue.component('vp-job',{template:`
@@ -356,7 +412,7 @@ Vue.component('vp-notifications',{template:`
- {{ msg.index }}
+ #{{ msg.index }}
@@ -652,7 +708,7 @@ const Log=Vue.extend({template:`
-
+
{{ props.item.time }} |
{{ props.item.user }} |
{{ props.item.type }} |
@@ -715,6 +771,7 @@ const Log=Vue.extend({template:`
const Brutusin=Vue.extend({template:`
+ vue-form-generator
@@ -943,7 +1000,7 @@ const Files=Vue.extend({template:`
-
+
{{ selection[0] && selection[0].name }}
@@ -1691,6 +1748,74 @@ const Eval=Vue.extend({template:`
);
+// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/form/formschema.vue
+const Formsjson=Vue.extend({template:`
+
+
+ vue-json-schema@1.1.0 https://github.com/formschema/native
+
+ Subscribe
+
+
+
+ `,
+
+
+ components: {
+ "form-schema": window["vue-json-schema"].default
+ },
+
+ data: () => ({
+ schema: {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "type": "object",
+ "title": "Newsletter Subscription",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 80,
+ "attrs": {
+ "placeholder": "Full Name",
+ "title": "Please enter your full name"
+ }
+ },
+ "email": {
+ "type": "string",
+ "maxLength": 120,
+ "attrs": {
+ "type": "email",
+ "placeholder": "Email"
+ }
+ },
+ "lists": {
+ "type": "string",
+ "enum": ["Daily New", "Promotion"]
+ },
+ "arrayInput": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false,
+ "required": ["name", "email", "lists"]
+ },
+ model: {}
+ }),
+ methods: {
+ submit (e) {
+ // this.model contains the valid data according your JSON Schema.
+ // You can submit your model to the server here
+ console.log(this.model);
+ alert("hi")
+ }
+ }
+}
+
+ );
+
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/home.vue
const Home=Vue.extend({template:`
@@ -2411,7 +2536,7 @@ const Jobs=Vue.extend({template:`
-
+
|
@@ -2551,6 +2676,49 @@ const Login=Vue.extend({template:`
);
+// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/model/documentation.vue
+const Documentation=Vue.extend({template:`
+
+
+
+
+ Example Chip
+
+
+
+
+
+
+
+ `,
+
+ data: function(){
+ return {
+ message: 'Hello Vue.js!',
+ items:[]
+ }
+ },
+ methods:{
+ get() {
+ HTTP.get('xqdoc')
+ .then((res) => {
+ this.items = res.data.items;
+ console.log("items",this.items)
+ });
+ },
+ doEdit(item){
+ console.log("history: ",item)
+ router.push({ path: 'edit', query: { url:item.url, protocol:item.protocol }})
+ }
+ },
+ created:function(){
+ this.get()
+ console.log("history")
+ }
+}
+
+ );
+
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/model/entity.vue
const Entity=Vue.extend({template:`
@@ -2558,31 +2726,31 @@ const Entity=Vue.extend({template:`
Entities
Refresh
+ Text
-
+
-
-
-
-
-
- {{ props.item.iconclass }} {{ props.item.name }}
-
-
-
-
+
+
+
+
+
+
+ {{ props.item.iconclass }} {{ props.item.name }}
+
+
+
+
{{ props.item.description }}
-
-
-
- Fields:
- {{ props.item.nfields }}
-
-
-
+
+
+ {{ props.item.nfields }}
+ Fields
+
+
@@ -2623,18 +2791,69 @@ const Entity=Vue.extend({template:`
// src: file:///C:/Users/andy/git/vue-poc/src/vue-poc/features/namespace.vue
const Namespace=Vue.extend({template:`
-
-namespaces
+
+
+ Namespaces
+
+ Refresh
+ Text
+
+
+
+
+
+
+
+
+
+ star {{ props.item.xmlns }}
+
+
+
+
+ {{ props.item.description }}
+
+
+ {{ props.item.prefix }}
+ Fields
+
+
+
+
+
`,
data: function(){
return {
+ items: [],
+ loading: false,
+ q: "",
message: 'bad route!'
}
},
+ methods: {
+ load(){
+
+ this.loading= true
+ HTTP.get("data/namespace",{params:{}})
+ .then(r=>{
+ this.items= r.data.items
+ this.q= null
+ this.loading= false
+ })
+ .catch(error=> {
+ console.log(error);
+ this.loading= false
+ alert("Get query error"+url)
+ });
+
+ },
+ },
created:function(){
- console.log("notfound",this.$route.query.q)
+ this.q=this.$route.query.q || this.q;
+ this.load();
+ console.log("namespaces")
}
}
@@ -2651,7 +2870,7 @@ const Ping=Vue.extend({template:`
Read or increment a database value. This measures round trip times browser-database-browser.
- Counter:{{counter}}
+ Counter: {{counter}}
@@ -2887,7 +3106,7 @@ const Repo=Vue.extend({template:`
-
+
|
|
@@ -3103,7 +3322,7 @@ const Session=Vue.extend({template:`
item-value="suburb"
@selected="handleSelected"
strict="Unknown">
-
+
{{data.item.suburb}}
@@ -4189,6 +4408,7 @@ const router = new VueRouter({
{ path: '/images/dates', component: Dates, meta:{title:"Image dates"} },
{ path: '/images/people', component: People, meta:{title:"Image people"} },
+ { path: '/documentation', component: Documentation, meta:{title:"documentation"} },
{ path: '/entity', component: Entity, meta:{title:"Entities"} },
{ path: '/namespace', component: Namespace, meta:{title:"Namespaces"} },
{ path: '/select', component: Select, meta:{title:"Select"} },
@@ -4206,6 +4426,7 @@ const router = new VueRouter({
{ path: '/history', component: History, meta:{title:"File History"} },
{ 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: '/validate', component: Validate, meta:{title:"Validate"} },
{ path: '/eval', component: Eval, meta:{title:"Evaluate XQuery"} },
@@ -4219,7 +4440,8 @@ const router = new VueRouter({
{ path: '/jobs/:job', name:"jobShow", component: Job, props: true, meta:{title:"Job Status"} },
{ path: '/timeline', component: Timeline,meta:{title:"timeline"} },
{ path: '/map', component: Map,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: '/about', component: About,meta:{title:"About Vue-poc"} },
{ path: '*', component: Notfound,meta:{title:"Page not found"} }
],
@@ -4273,7 +4495,7 @@ const Vuepoc=Vue.extend({template:`
-
+
@@ -4282,8 +4504,7 @@ const Vuepoc=Vue.extend({template:`
-
-
+
@@ -4303,13 +4524,25 @@ const Vuepoc=Vue.extend({template:`
-
{{ $notification.unseen }}
notifications
+
+
+ more_vert
+
+
+
+ Full screen
+
+
+
+
+
+
@@ -4326,8 +4559,7 @@ const Vuepoc=Vue.extend({template:`
router,
data:function(){return {
- q: "",
- loading: false,
+
searchItems:[],
si: '',
items2:["todo","set","search"],
@@ -4359,6 +4591,7 @@ const Vuepoc=Vue.extend({template:`
children: [
{href: '/database', text: 'Databases',icon: 'developer_mode' },
{href: '/files', text: 'File system',icon: 'folder' },
+
{href: '/history',text: 'history',icon: 'history'}
]},
{
@@ -4366,6 +4599,7 @@ const Vuepoc=Vue.extend({template:`
text: 'Models' ,
model: false,
children: [
+ {href: '/documentation', text: 'Documentation',icon: 'library_books' },
{href: '/namespace', text: 'Namespaces',icon: 'label' },
{href: '/entity', text: 'Entities',icon: 'redeem' },
]},
@@ -4404,6 +4638,7 @@ const Vuepoc=Vue.extend({template:`
{href: '/puzzle',text: 'Puzzle',icon: 'extension'},
{href: '/svg',text: 'SVG',icon: 'extension'},
{href: '/form',text: 'Forms',icon: 'format_list_bulleted' },
+ {href: '/form2',text: 'Forms 2',icon: 'format_list_bulleted' },
{href: '/tabs',text: 'Tabs',icon: 'switch_camera'}
]},
@@ -4413,21 +4648,12 @@ const Vuepoc=Vue.extend({template:`
}},
methods: {
- querySelections (v) {
- this.loading = true
- // Simulated ajax query
- setTimeout(() => {
- this.items2 = ["aa","bb",this.si],
- this.loading = false
- }, 500)
- },
+
session(){
this.$router.push({path: '/session'})
},
- goSearch(){
- this.$router.push({path: '/search',query: { q: this.q }})
- },
+
logout(){
HTTP.get("logout").then(r=>{
alert("logout")
@@ -4446,13 +4672,7 @@ const Vuepoc=Vue.extend({template:`
console.log("showNotifications",val);
if(!val)this.$notification.unseen=0;
},
- search (val) {
- val && this.querySelections(val)
- },
- si:function(val){
- console.log("si: ",val);
- this.querySelections();
- }
+
},
created(){
@@ -4600,6 +4820,16 @@ localforage.config({
// https://vuejs.org/v2/guide/state-management.html
var settings = {
debug: false,
+ defaults:{
+ "settings/ace": {
+ theme: "github",
+ keybinding: "ace",
+ fontsize: 16,
+ enableSnippets:true,
+ enableBasicAutocompletion:true,
+ enableLiveAutocompletion:true
+ },
+ },
getItem (key) {
if (this.debug) console.log('getItem',key);
return localforage.getItem(key)
@@ -4709,7 +4939,10 @@ Vue.use(Fullscreen);
//Vue.component('v-map', Vue2Leaflet.Map);
//Vue.component('v-tilelayer', Vue2Leaflet.TileLayer);
//Vue.component('v-marker', Vue2Leaflet.Marker);
-
+//function install (Vue) {
+// Vue.component('form-schema', window["vue-json-schema"].default);
+//};
+//Vue.use({ install: install });
Vue.use(Vuetify);
new Vuepoc().$mount('#app')
diff --git a/src/vue-poc/static/app.css b/src/vue-poc/static/app.css
index 08b0cfd..444b2fa 100644
--- a/src/vue-poc/static/app.css
+++ b/src/vue-poc/static/app.css
@@ -124,6 +124,9 @@ height: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
+.qd-active {
+ background-color: green;
+}
.canvas {
overflow: hidden;
}
diff --git a/src/vue-poc/static/app.html b/src/vue-poc/static/app.html
index 0184391..1b41e2e 100644
--- a/src/vue-poc/static/app.html
+++ b/src/vue-poc/static/app.html
@@ -10,7 +10,7 @@
-
+
@@ -37,7 +37,7 @@
-
+
@@ -49,7 +49,7 @@
-
+
diff --git a/src/vue-poc/static/https _shkspr.mobi_svg_calendar.svg b/src/vue-poc/static/https _shkspr.mobi_svg_calendar.svg
new file mode 100644
index 0000000..3ed11f5
--- /dev/null
+++ b/src/vue-poc/static/https _shkspr.mobi_svg_calendar.svg
@@ -0,0 +1,62 @@
+
+https://shkspr.mobi/svg/calendar.svg<svg onload="init(evt)" xmlns="http://www.w3.org/2000/svg"
+aria-label="Calendar" role="img"
+viewBox="0 0 512 512">
+<script type="text/ecmascript"><![CDATA[
+function init(evt) {
+ var time = new Date();
+ var locale = "en-gb";
+ var DD = time.getDate();
+ var DDD = time.toLocaleString(locale, { weekday: "short" });
+ var DDDD = time.toLocaleString(locale, { weekday: "long" });
+ var MM = time.getMonth() + 1;
+ var MMM = time.toLocaleString(locale, {month: "short"});
+ var MMMM = time.toLocaleString(locale, {month: "long"});
+ var YYYY = time.getFullYear();
+
+ var svgDocument = evt.target.ownerDocument;
+ var dayNode = svgDocument.createTextNode(DD);
+ svgDocument.getElementById("day").appendChild(dayNode);
+ var weekdayNode = svgDocument.createTextNode(DDDD);
+ svgDocument.getElementById("weekday").appendChild(weekdayNode);
+ var monthNode = svgDocument.createTextNode(MMM.toUpperCase());
+ svgDocument.getElementById("month").appendChild(monthNode);
+
+}
+]]></script>
+
+<path d="M512 455c0 32-25 57-57 57H57c-32 0-57-25-57-57V128c0-31 25-57 57-57h398c32 0 57 26 57 57z" fill="#e0e7ec"/>
+<path d="M484 0h-47c2 4 4 9 4 14a28 28 0 1 1-53-14H124c3 4 4 9 4 14A28 28 0 1 1 75 0H28C13 0 0 13 0 28v157h512V28c0-15-13-28-28-28z" fill="#dd2f45"/>
+
+<g fill="#f3aab9">
+ <circle cx="470" cy="142" r="14"/>
+ <circle cx="470" cy="100" r="14"/>
+ <circle cx="427" cy="142" r="14"/>
+ <circle cx="427" cy="100" r="14"/>
+ <circle cx="384" cy="142" r="14"/>
+ <circle cx="384" cy="100" r="14"/>
+</g>
+
+<text id="month"
+ x="32"
+ y="164"
+ fill="#fff"
+ font-family="monospace"
+ font-size="140px"
+ style="text-anchor: left"></text>
+<text id="day"
+ x="256"
+ y="400"
+ fill="#66757f"
+ font-family="monospace"
+ font-size="256px"
+ style="text-anchor: middle"></text>
+<text id="weekday"
+ x="256"
+ y="480"
+ fill="#66757f"
+ font-family="monospace"
+ font-size="64px"
+ style="text-anchor: middle"></text>
+
+</svg>
\ No newline at end of file
diff --git a/src/vue-poc/static/schema.json b/src/vue-poc/static/schema.json
new file mode 100644
index 0000000..0047973
--- /dev/null
+++ b/src/vue-poc/static/schema.json
@@ -0,0 +1,30 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "type": "object",
+ "title": "Newsletter Subscription",
+ "properties": {
+ "name": {
+ "type": "string",
+ "minLength": 8,
+ "maxLength": 80,
+ "attrs": {
+ "placeholder": "Full Name",
+ "title": "Please enter your full name"
+ }
+ },
+ "email": {
+ "type": "string",
+ "maxLength": 120,
+ "attrs": {
+ "type": "email",
+ "placeholder": "Email"
+ }
+ },
+ "lists": {
+ "type": "string",
+ "enum": ["Daily New", "Promotion"]
+ }
+ },
+ "additionalProperties": false,
+ "required": ["name", "email", "lists"]
+}
\ No newline at end of file
| |