73 lines
3.4 KiB
JavaScript
Executable File
73 lines
3.4 KiB
JavaScript
Executable File
Vue.createApp({
|
|
data: function() {
|
|
return { 'events': null
|
|
, 'frm': { 'e': null, 'modal': null }
|
|
, 'faults': null
|
|
, 'patterns': { 'coordinates': [ '^$', '^-?\\d{1,3}(?:\\.\\d+)?,-?\\d{1,3}(?:\\.\\d+)?$' ]
|
|
, 'start': [ '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$' ]
|
|
, 'end': [ '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$' ]
|
|
, 'title': [ '^.{20,50}$' ]
|
|
, 'description': [ '^.{20,}$' ]
|
|
, 'location': [ '^.{5,100}$' ]
|
|
}
|
|
}
|
|
},
|
|
methods: { formatDate: function(dt) {
|
|
var fmt = 'DD MMM YYYY';
|
|
var m = moment(dt);
|
|
var t = m.hour() * 3600 + m.minute() * 60 + m.second();
|
|
if ( t > 0 ) {
|
|
fmt = 'DD MMM YYYY, HH:mm:ss';
|
|
}
|
|
var ret = moment(dt).format(fmt);
|
|
return ret;
|
|
},
|
|
deleteEvent: function() {
|
|
this.events.splice(this.frm.e, 1);
|
|
this.frm.e = null;
|
|
this.validateEvents();
|
|
},
|
|
validateEvents: function() {
|
|
var faults = [];
|
|
for ( var e in this.events ) {
|
|
for ( var k in this.patterns ) {
|
|
var value = this.events[e][k];
|
|
value = ( value == undefined ? '' : value );
|
|
var patterns = this.patterns[k];
|
|
var match = false;
|
|
for ( var p in patterns ) {
|
|
var pattern = new RegExp(this.patterns[k][p]);
|
|
match = match || pattern.test(value);
|
|
}
|
|
console.log(e, k, value, match);
|
|
if ( ! match ) {
|
|
var fault = {};
|
|
fault.e = e;
|
|
fault.k = k;
|
|
fault.v = value;
|
|
faults.push(fault);
|
|
}
|
|
}
|
|
}
|
|
this.faults = ( faults.length == 0 ? null : faults );
|
|
},
|
|
modal: function(property) {
|
|
var d = {};
|
|
d.property = property;
|
|
d.value = this.events[this.frm.e][property];
|
|
this.frm.modal = d;
|
|
}
|
|
},
|
|
mounted: function() {
|
|
var app = this;
|
|
jQuery.get( 'api.php'
|
|
, { 'cmd': 'get' }
|
|
, function(data) {
|
|
app.events = data;
|
|
app.validateEvents();
|
|
$('body').fadeIn();
|
|
}
|
|
);
|
|
}
|
|
}).mount('#app')
|