From 98192a1ebc40e2e3f113b0a67b14d0f9f30eb1d4 Mon Sep 17 00:00:00 2001 From: Claude Brisson Date: Sun, 17 Dec 2023 19:42:16 +0100 Subject: [PATCH] Search and search switches are functional --- .../pairgoth/ratings/EGFRatingsHandler.kt | 4 +- .../pairgoth/ratings/FFGRatingsHandler.kt | 4 + .../jeudego/pairgoth/ratings/PlayerIndex.kt | 29 +++++-- .../pairgoth/ratings/RatingsManager.kt | 4 +- .../org/jeudego/pairgoth/web/SearchServlet.kt | 3 +- view-webapp/src/main/sass/main.scss | 28 +------ view-webapp/src/main/sass/tour.scss | 55 ++++++++++++- .../main/webapp/WEB-INF/layouts/standard.html | 3 +- view-webapp/src/main/webapp/js/domhelper.js | 28 ++++++- view-webapp/src/main/webapp/js/main.js | 8 +- .../main/webapp/js/tour-registration.inc.js | 81 +++++++++++++++---- .../lib/jsrender-1.0.13/jsrender.min.js | 4 + .../main/webapp/tour-registration.inc.html | 59 +++++++++----- 13 files changed, 228 insertions(+), 82 deletions(-) create mode 100644 view-webapp/src/main/webapp/lib/jsrender-1.0.13/jsrender.min.js diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/EGFRatingsHandler.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/EGFRatingsHandler.kt index 200b1b7..70712be 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/EGFRatingsHandler.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/EGFRatingsHandler.kt @@ -25,6 +25,6 @@ object EGFRatingsHandler: RatingsHandler(RatingsManager.Ratings.EGF) { } // 19574643 Abad Jahin FR 38GJ 20k -- 15 2 T200202B var linePattern = - Regex("\\s+(?\\d{8})\\s+(?$atom+)\\s(?$atom+)?,?\\s+(?[A-Z]{2})\\s+(?\\S{1,4})\\s+(?[1-9][0-9]?[kdp])\\s+(?[1-9][0-9]?[kdp]|--)\\s+(?-?[0-9]+)\\s+(?[0-9]+)\\s+(?\\S+)\\s*") - val groups = arrayOf("egf", "name", "firstname", "country", "club", "grade", "rating") + Regex("\\s+(?\\d{8})\\s+(?$atom+)\\s(?$atom+)?,?\\s+(?[A-Z]{2})\\s+(?\\S{1,4})\\s+(?[1-9][0-9]?[kdp])\\s+(?[1-9][0-9]?[kdp]|--)\\s+(?-?[0-9]+)\\s+(?[0-9]+)\\s+(?\\S+)\\s*") + val groups = arrayOf("egf", "name", "firstname", "country", "club", "rank", "rating") } diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/FFGRatingsHandler.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/FFGRatingsHandler.kt index 98d3155..eed11c0 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/FFGRatingsHandler.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/FFGRatingsHandler.kt @@ -22,6 +22,10 @@ object FFGRatingsHandler: RatingsHandler(RatingsManager.Ratings.FFG) { }.toTypedArray() Json.MutableObject(*pairs).also { it["origin"] = "FFG" + val rating = it["rating"]?.toString()?.toIntOrNull() + if (rating != null) { + it["rank"] = (rating/100).let { if (it < 0) "${-it}k" else "${it+1}d" } + } } } } diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt index fce0d79..ffaa8cd 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt @@ -31,8 +31,9 @@ class PlayerIndex { val NAME = "name" val FIRSTNAME = "firstname" val TEXT = "text" + val COUNTRY = "country" - val MAX_HITS = 100 + val MAX_HITS = 20 val logger = LoggerFactory.getLogger("index") val queryParser = ComplexPhraseQueryParser(TEXT, StandardAnalyzer()) } @@ -53,10 +54,11 @@ class PlayerIndex { players.forEachIndexed { i, p -> val player = p as Json.Object val origin = p.getString(ORIGIN) ?: throw Error("unknown origin") - val text = player.field(NAME) + val text = player.field(NAME).lowercase(Locale.ROOT) val doc = Document() doc.add(StoredField(ID, i)); - doc.add(StringField(ORIGIN, player.field(ORIGIN), Field.Store.NO)) + doc.add(StringField(ORIGIN, player.field(ORIGIN).lowercase(Locale.ROOT), Field.Store.NO)) + doc.add(StringField(COUNTRY, player.field(COUNTRY).lowercase(Locale.ROOT), Field.Store.NO)) doc.add(TextField(TEXT, "${player.field(NAME)} ${player.nullableField(FIRSTNAME)}", Field.Store.NO)) writer.addDocument(doc); ++count @@ -65,12 +67,16 @@ class PlayerIndex { logger.info("indexed $count players") } - fun match(needle: String, origins: Int): List { - // val fuzzy = FuzzyQuery(Term(TEXT, needle)) - val terms = needle.split(Regex("[ -_']+")) + fun match(needle: String, origins: Int, country: String?): List { + val terms = needle.lowercase(Locale.ROOT) + .replace(Regex("([+&|!(){}\\[\\]^\\\\\"~*?:/]|(? { @@ -94,6 +100,15 @@ class PlayerIndex { } 3 -> fuzzy else -> throw Error("wrong origins mask") + }.let { + if (country == null) it + else { + val countryFilter = TermQuery(Term(COUNTRY, country.lowercase(Locale.ROOT))) + BooleanQuery.Builder() + .add(it, BooleanClause.Occur.SHOULD) + .add(countryFilter, BooleanClause.Occur.FILTER) + .build() + } } val docs = searcher.search(query, MAX_HITS) return docs.scoreDocs.map { searcher.doc(it.doc).getField(ID).numericValue().toInt() }.toList() diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt index 2e2f778..554b18d 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt @@ -69,14 +69,14 @@ object RatingsManager: Runnable { if (!file.mkdirs() && !file.isDirectory) throw Error("Property pairgoth.ratings.path must be a directory") } - fun search(needle: String, aga: Boolean, egf: Boolean, ffg: Boolean): Json.Array { + fun search(needle: String, aga: Boolean, egf: Boolean, ffg: Boolean, country: String?): Json.Array { try { updateLock.readLock().lock() var mask = 0 if (aga && ratingsHandlers[Ratings.AGA]!!.active) mask = mask or Ratings.AGA.flag if (egf && ratingsHandlers[Ratings.EGF]!!.active) mask = mask or Ratings.EGF.flag if (ffg && ratingsHandlers[Ratings.FFG]!!.active) mask = mask or Ratings.FFG.flag - val matches = index.match(needle, mask) + val matches = index.match(needle, mask, country) return matches.map { it -> players[it] }.toCollection(Json.MutableArray()) } finally { updateLock.readLock().unlock() diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/SearchServlet.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/SearchServlet.kt index 4c62668..837ac88 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/SearchServlet.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/SearchServlet.kt @@ -23,10 +23,11 @@ class SearchServlet: HttpServlet() { validateContentType(request) val query = request.getAttribute(PAYLOAD_KEY) as Json.Object? ?: throw ApiException(HttpServletResponse.SC_BAD_REQUEST, "no payload") val needle = query.getString("needle") ?: throw ApiException(HttpServletResponse.SC_BAD_REQUEST, "no needle") + val country = query.getString("countryFilter") val aga = query.getBoolean("aga") ?: false val egf = query.getBoolean("egf") ?: false val ffg = query.getBoolean("ffg") ?: false - payload = RatingsManager.search(needle, aga, egf, ffg) + payload = RatingsManager.search(needle, aga, egf, ffg, country) setContentType(response) payload.toString(response.writer) } catch (ioe: IOException) { diff --git a/view-webapp/src/main/sass/main.scss b/view-webapp/src/main/sass/main.scss index c1f068f..20f48ad 100644 --- a/view-webapp/src/main/sass/main.scss +++ b/view-webapp/src/main/sass/main.scss @@ -339,32 +339,8 @@ } } - .checkbox { - width: 50px; - height: 26px; - border-radius: 18px; - background-color: #F7D6A3; - display: flex; - align-items: center; - padding-left: 5px; - padding-right: 5px; + .clickable { + pointer-events: all; cursor: pointer; - .circle { - background-color: #6B5E8A; - transform: translateX(0px); - border-radius: 50%; - width: 20px; - height: 20px; - transition: 300ms; - } - input { - display: none; - } - &.active { - background-color: rgb(218, 114, 80); - .circle { - transform: translateX(20px); - } - } } } diff --git a/view-webapp/src/main/sass/tour.scss b/view-webapp/src/main/sass/tour.scss index e03f1e1..473184d 100644 --- a/view-webapp/src/main/sass/tour.scss +++ b/view-webapp/src/main/sass/tour.scss @@ -48,6 +48,16 @@ } /* registration section */ + + #player { + &.create .edition { + display: none; + } + &.edit .creation { + display: none; + } + } + #player-form { &:not(.add) { #search-form, #search-result { @@ -57,6 +67,42 @@ } #search-form { position: relative; + .toggle { + cursor: pointer; + input { + display: none; + } + label { + display: block; + text-align: center; + cursor: pointer; + } + .checkbox { + width: 50px; + height: 26px; + border-radius: 18px; + background-color: #F7D6A3; + display: flex; + align-items: center; + padding-left: 5px; + padding-right: 5px; + cursor: pointer; + .circle { + background-color: #6B5E8A; + transform: translateX(0px); + border-radius: 50%; + width: 20px; + height: 20px; + transition: 300ms; + } + } + input:checked + .checkbox { + background-color: rgb(218, 114, 80); + .circle { + transform: translateX(20px); + } + } + } } #search-result { position: absolute; @@ -66,9 +112,14 @@ top: 100%; padding: 1em; overflow-y: auto; - &.hidden { + &:empty { display: none; } + .result-line { + cursor: pointer; + &:hover { + background-color: rgba(100,200,255,200); + } + } } - } diff --git a/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html b/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html index 30c41a4..ebc0ae5 100644 --- a/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html +++ b/view-webapp/src/main/webapp/WEB-INF/layouts/standard.html @@ -92,14 +92,13 @@ $('#lang-list').removeClass('shown'); } }); - $('.popup .close').on('click', e => { + $('.popup .popup-footer .close').on('click', e => { let popup = e.target.closest('.popup'); if (popup) { popup.classList.remove('shown'); $('body').removeClass('dimmed'); } }); - }); // syntaxic sugar for IMask diff --git a/view-webapp/src/main/webapp/js/domhelper.js b/view-webapp/src/main/webapp/js/domhelper.js index ad4d685..fbeed62 100644 --- a/view-webapp/src/main/webapp/js/domhelper.js +++ b/view-webapp/src/main/webapp/js/domhelper.js @@ -113,6 +113,32 @@ NodeList.prototype.find = function(selector) { }); return Reflect.construct(Array, result, NodeList); } -Element.prototype.find = function (selector) { +Element.prototype.find = function(selector) { return this.querySelectorAll(':scope ' + selector); } + +NodeList.prototype.clear = function() { + this.forEach(function (elem, i) { + elem.clear(); + }); + return this; +} +Element.prototype.clear = function() { + this.innerHTML = ''; + return this; +} + +/* + TODO - conflicts with from.val(), rename one of the two +NodeList.prototype.val = function(value) { + this.item(0).val(value); +} +Element.prototype.val = function(value) { + // TODO - check that "this" has the "value" property + if (typeof(value) === 'undefined') { + return this.value; + } else { + this.value = value; + } +} +*/ diff --git a/view-webapp/src/main/webapp/js/main.js b/view-webapp/src/main/webapp/js/main.js index 09750c9..70491b0 100644 --- a/view-webapp/src/main/webapp/js/main.js +++ b/view-webapp/src/main/webapp/js/main.js @@ -137,7 +137,7 @@ HTMLFormElement.prototype.val = function(name, value) { ctl.checked = value !== 'false' && Boolean(value); return; } - else return ctl.checked; + else return ctl.checked && ctl.value ? ctl.value : ctl.checked; } console.error(`unhandled input tag or type for input ${name} (tag: ${tag}, type:${type}`); return null; @@ -171,12 +171,6 @@ onLoad(() => { $('body').removeClass('dimmed'); } }); - $('.checkbox').on('click', e => { - let chk = e.target.closest('.checkbox'); - chk.toggleClass('active'); - let checkbox = chk.find('input')[0]; - checkbox.checked = !checkbox.checked; - }); /* commented for now - do we want this? $('#dimmer').on('click', e => $('.popup').removeClass('shown'); */ diff --git a/view-webapp/src/main/webapp/js/tour-registration.inc.js b/view-webapp/src/main/webapp/js/tour-registration.inc.js index 000c66c..c13ed98 100644 --- a/view-webapp/src/main/webapp/js/tour-registration.inc.js +++ b/view-webapp/src/main/webapp/js/tour-registration.inc.js @@ -1,3 +1,50 @@ +const SEARCH_DELAY = 100; +let searchTimer = undefined; +let resultTemplate; + +function initSearch() { + let needle = $('#needle')[0].value; + if (searchTimer) { + clearTimeout(searchTimer); + } + searchTimer = setTimeout(() => { + search(needle); + }, SEARCH_DELAY); +} + +function search(needle) { + needle = needle.trim(); + console.log(needle) + if (needle && needle.length > 2) { + let form = $('#player-form')[0]; + let search = { + needle: needle, + aga: form.val('aga'), + egf: form.val('egf'), + ffg: form.val('ffg'), + } + let country = form.val('countryFilter'); + if (country) search.countryFilter = country; + let searchFormState = { + countryFilter: country ? true : false, + aga: search.aga, + egf: search.egf, + ffg: search.ffg + }; + store('searchFormState', searchFormState); + console.log(search) + api.postJson('search', search) + .then(result => { + if (Array.isArray(result)) { + console.log(result) + let html = resultTemplate.render(result); + $('#search-result')[0].innerHTML = html; + } else console.log(result); + }) + } else $('#search-result').clear(); + +} + onLoad(() => { $('input.numeric').imask({ mask: Number, @@ -11,6 +58,7 @@ onLoad(() => { form.addClass('add'); // $('#player-form input.participation').forEach(chk => chk.checked = true); form.reset(); + $('#player').removeClass('edit').addClass('create'); modal('player'); }); $('#cancel-register').on('click', e => { @@ -85,24 +133,29 @@ onLoad(() => { form.val(`r${r}`, !(player.skip && player.skip.includes(r))); } form.removeClass('add'); + $('#player').removeClass('create').addClass('edit'); modal('player'); } }); }); + resultTemplate = jsrender.templates($('#result')[0]); $('#needle').on('input', e => { - let needle = $('#needle')[0].value; - if (needle && needle.length > 2) { - let form = $('#player-form')[0]; - let search = { - needle: needle, - aga: form.val('aga'), - egf: form.val('egf'), - ffg: form.val('ffg') - } - api.postJson('search', search) - .then(result => { - console.log(result); - }) - } else $('#search-result').addClass('hidden'); + initSearch(); + }); + $('#clear-search').on('click', e => { + $('#needle')[0].value = ''; + $('#search-result').clear(); + }); + let searchFromState = store('searchFormState') + if (searchFromState) { + for (let id of ["countryFilter", "aga", "egf", "ffg"]) { + $(`#${id}`)[0].checked = searchFromState[id]; + } + } + $('.toggle').on('click', e => { + let chk = e.target.closest('.toggle'); + let checkbox = chk.find('input')[0]; + checkbox.checked = !checkbox.checked; + initSearch(); }); }); diff --git a/view-webapp/src/main/webapp/lib/jsrender-1.0.13/jsrender.min.js b/view-webapp/src/main/webapp/lib/jsrender-1.0.13/jsrender.min.js new file mode 100644 index 0000000..c890381 --- /dev/null +++ b/view-webapp/src/main/webapp/lib/jsrender-1.0.13/jsrender.min.js @@ -0,0 +1,4 @@ +/*! JsRender v1.0.13: http://jsviews.com/#jsrender */ +/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ +!function(t,e){var n=e.jQuery;"object"==typeof exports?module.exports=n?t(e,n):function(n){if(n&&!n.fn)throw"Provide jQuery or null";return t(e,n)}:"function"==typeof define&&define.amd?define(function(){return t(e)}):t(e,!1)}(function(t,e){"use strict";function n(t,e){return function(){var n,r=this,i=r.base;return r.base=t,n=e.apply(r,arguments),r.base=i,n}}function r(t,e){return st(e)&&(e=n(t?t._d?t:n(a,t):a,e),e._d=(t&&t._d||0)+1),e}function i(t,e){var n,i=e.props;for(n in i)!Vt.test(n)||t[n]&&t[n].fix||(t[n]="convert"!==n?r(t.constructor.prototype[n],i[n]):i[n])}function o(t){return t}function a(){return""}function s(t){try{throw console.log("JsRender dbg breakpoint: "+t),"dbg breakpoint"}catch(e){}return this.base?this.baseApply(arguments):t}function p(t){this.name=(e.link?"JsViews":"JsRender")+" Error",this.message=t||this.name}function l(t,e){if(t){for(var n in e)t[n]=e[n];return t}}function d(t,e,n){return t?pt(t)?d.apply(ot,t):(wt=n?n[0]:wt,/^(\W|_){5}$/.test(t+e+wt)||S("Invalid delimiters"),mt=t[0],_t=t[1],xt=e[0],bt=e[1],gt.delimiters=[mt+_t,xt+bt,wt],t="\\"+mt+"(\\"+wt+")?\\"+_t,e="\\"+xt+"\\"+bt,rt="(?:(\\w+(?=[\\/\\s\\"+xt+"]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\"+xt+"]|\\"+xt+"(?!\\"+bt+"))*?)",ft.rTag="(?:"+rt+")",rt=new RegExp("(?:"+t+rt+"(\\/)?|\\"+mt+"(\\"+wt+")?\\"+_t+"(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))"+e,"g"),ft.rTmpl=new RegExp("^\\s|\\s$|<.*>|([^\\\\]|^)[{}]|"+t+".*"+e),ht):gt.delimiters}function c(t,e){e||t===!0||(e=t,t=void 0);var n,r,i,o,a=this,s="root"===e;if(t){if(o=e&&a.type===e&&a,!o)if(n=a.views,a._.useKey){for(r in n)if(o=e?n[r].get(t,e):n[r])break}else for(r=0,i=n.length;!o&&r1,v=f.ctx;if(n){if(f._||(d=f.index,f=f.tag),c=f,v&&v.hasOwnProperty(n)||(v=ct).hasOwnProperty(n)){if(s=v[n],"tag"===n||"tagCtx"===n||"root"===n||"parentTags"===n)return s}else v=void 0;if((!Ct&&f.tagCtx||f.linked)&&(s&&s._cxp||(f=f.tagCtx||st(s)?f:(f=f.scope||f,!f.isTop&&f.ctx.tag||f),void 0!==s&&f.tagCtx&&(f=f.tagCtx.view.scope),v=f._ocps,s=v&&v.hasOwnProperty(n)&&v[n]||s,s&&s._cxp||!i&&!g||((v||(f._ocps=f._ocps||{}))[n]=s=[{_ocp:s,_vw:c,_key:n}],s._cxp={path:jt,ind:0,updateValue:function(t,n){return e.observable(s[0]).setProperty(jt,t),this}})),p=s&&s._cxp)){if(arguments.length>2)return a=s[1]?ft._ceo(s[1].deps):[jt],a.unshift(s[0]),a._cxp=p,a;if(d=p.tagElse,u=s[1]?p.tag&&p.tag.cvtArgs?p.tag.cvtArgs(d,1)[p.ind]:s[1](s[0].data,s[0],ft):s[0]._ocp,g)return ft._ucp(n,r,f,p),f;s=u}return s&&st(s)&&(o=function(){return s.apply(this&&this!==t?this:c,arguments)},l(o,s)),o||s}}function h(t){return t&&(t.fn?t:this.getRsc("templates",t)||lt(t))}function m(t,e,n,r){var o,a,s,p,d,c="number"==typeof n&&e.tmpl.bnds[n-1];if(void 0===r&&c&&c._lr&&(r=""),void 0!==r?n=r={props:{},args:[r]}:c&&(n=c(e.data,e,ft)),c=c._bd&&c,t||c){if(a=e._lc,o=a&&a.tag,n.view=e,!o){if(o=l(new ft._tg,{_:{bnd:c,unlinked:!0,lt:n.lt},inline:!a,tagName:":",convert:t,onArrayChange:!0,flow:!0,tagCtx:n,tagCtxs:[n],_is:"tag"}),p=n.args.length,p>1)for(d=o.bindTo=[];p--;)d.unshift(p);a&&(a.tag=o,o.linkCtx=a),n.ctx=Q(n.ctx,(a?a.view:e).ctx),i(o,n)}o._er=r&&s,o.ctx=n.ctx||o.ctx||{},n.ctx=void 0,s=o.cvtArgs()[0],o._er=r&&s}else s=n.args[0];return s=c&&e._.onRender?e._.onRender(s,e,o):s,void 0!=s?s:""}function _(t,e){var n,r,i,o,a,s,p,l=this;if(l.tagName){if(s=l,l=(s.tagCtxs||[l])[t||0],!l)return}else s=l.tag;if(a=s.bindFrom,o=l.args,(p=s.convert)&&typeof p===Bt&&(p="true"===p?void 0:l.view.getRsc("converters",p)||S("Unknown converter: '"+p+"'")),p&&!e&&(o=o.slice()),a){for(i=[],n=a.length;n--;)r=a[n],i.unshift(x(l,r));e&&(o=i)}if(p){if(p=p.apply(s,i||o),void 0===p)return o;if(a=a||[0],n=a.length,pt(p)&&(p.arg0===!1||1!==n&&p.length===n&&!p.arg0)||(p=[p],a=[0],n=1),e)o=p;else for(;n--;)r=a[n],+r===r&&(o[r]=p[n])}return o}function x(t,e){return t=t[+e===e?"args":"props"],t&&t[e]}function b(t){return this.cvtArgs(t,1)}function w(t,e){var n,r,i=this;if(typeof e===Bt){for(;void 0===n&&i;)r=i.tmpl&&i.tmpl[t],n=r&&r[e],i=i.parent;return n||ot[t][e]}}function y(t,e,n,r,o,a){function s(t){var e=p[t];if(void 0!==e)for(e=pt(e)?e:[e],h=e.length;h--;)q=e[h],isNaN(parseInt(q))||(e[h]=parseInt(q));return e||[0]}e=e||it;var p,l,d,c,u,f,g,h,m,w,y,C,k,j,T,A,P,F,N,R,M,$,V,I,D,q,U,K,J,B,L=0,H="",W=e._lc||!1,Z=e.ctx,z=n||e.tmpl,G="number"==typeof r&&e.tmpl.bnds[r-1];for("tag"===t._is?(p=t,t=p.tagName,r=p.tagCtxs,d=p.template):(l=e.getRsc("tags",t)||S("Unknown tag: {{"+t+"}} "),d=l.template),void 0===a&&G&&(G._lr=l.lateRender&&G._lr!==!1||G._lr)&&(a=""),void 0!==a?(H+=a,r=a=[{props:{},args:[],params:{props:{}}}]):G&&(r=G(e.data,e,ft)),g=r.length;L0&&(a=n)){if(!a&&(/^\.?\/[^\\:*?"<>]*$/.test(n)?(s=lt[t=t||n])?n=s:a=document.getElementById(n):"#"===n.charAt(0)&&(a=document.getElementById(n.slice(1))),!a&&e.fn&&!ft.rTmpl.test(n)))try{a=e(n,document)[0]}catch(p){}a&&("SCRIPT"!==a.tagName&&S(n+": Use script block, not "+a.tagName),i?n=a.innerHTML:(o=a.getAttribute(Qt),o&&(o!==Ht?(n=lt[o],delete lt[o]):e.fn&&(n=e.data(a)[Ht])),o&&n||(t=t||(e.fn?Ht:n),n=A(t,a.innerHTML,r,i)),n.tmplName=t=t||o,t!==Ht&&(lt[t]=n),a.setAttribute(Qt,t),e.fn&&e.data(a,Ht,n))),a=void 0}else n.fn||(n=void 0);return n}var a,s,p=n=n||"";if(ft._html=dt.html,0===i&&(i=void 0,p=o(p)),i=i||(n.markup?n.bnds?l({},n):n:{}),i.tmplName=i.tmplName||t||"unnamed",r&&(i._parentTmpl=r),!p&&n.markup&&(p=o(n.markup))&&p.fn&&(p=p.markup),void 0!==p)return p.render||n.render?p.tmpls&&(s=p):(n=R(p,i),q(p.replace(Pt,"\\$&"),n)),s||(s=l(function(){return s.render.apply(s,arguments)},n),k(s)),s}function P(t,e){return st(t)?t.call(e):t}function F(t,e,n){Object.defineProperty(t,e,{value:n,configurable:!0})}function N(t,n){function r(t){d.apply(this,t)}function i(){return new r(arguments)}function o(t,e){for(var n,r,i,o,a,s=0;sY-(Q||0)){if(Q=e.trim(B.slice(Q,Y+r.length)),H=s||g[m-1].bd,W=H[H.length-1],W&&W.prm){for(;W.sb&&W.sb.prm;)W=W.sb;Z=W.sb={path:W.sb,bnd:W.bnd}}else H.push(Z={path:H.pop()});W&&W.sb===Z&&(k[m]=k[m-1].slice(W._cpPthSt)+k[m],k[m-1]=k[m-1].slice(0,W._cpPthSt)),Z._cpPthSt=C[m-1],Z._cpKey=Q,k[m]+=B.slice(j,J),j=J,Z._cpfn=Zt[Q]=Zt[Q]||new Function("data,view,j","//"+Q+"\nvar v;\nreturn ((v="+k[m]+("]"===S?")]":S)+")!=null?v:null);"),k[m-1]+=w[h]&&vt.cache?'view.getCache("'+Q.replace(Pt,"\\$&")+'"':k[m],Z.prm=f.bd,Z.bnd=Z.bnd||Z.path&&Z.path.indexOf("^")>=0}k[m]=""}"["===$&&($="[j._sq("),"["===l&&(l="[j._sq(")}return X=c?(c=!O,c?r:E+'"'):d?(d=!I,d?r:E+'"'):(l?(b[++h]=!0,_[h]=0,u&&(y[m++]=Y++,f=g[m]={bd:[]},k[m]="",C[m]=1),l):"")+(K?h?"":(v=B.slice(v,Y),(a?(a=p=s=!1,"\b"):"\b,")+v+(v=Y+r.length,u&&n.push(f.bd=[]),"\b")):N?(m&&D(t),u&&n.pop(),a="_"+A,p=T,v=Y+r.length,u&&(u=f.bd=n[a]=[],u.skp=!T),A+":"):A?A.split("^").join(".").replace(ft.rPath,L)+($||P):P?P:S?"]"===S?")]":")":V?(w[h]||D(t),","):o?"":(c=O,d=I,'"')),c||d||S&&(w[h]=!1,h--),u&&(c||d||(S&&(b[h+1]&&(f=g[--m],b[h+1]=!1),x=_[h+1]),$&&(_[h+1]=k[m].length+(l?1:0),(A||S)&&(f=g[++m]={bd:[]},b[h+1]=!0))),k[m]=(k[m]||"")+B.slice(j,J),j=J+r.length,c||d||((G=l&&b[h+1])&&(k[m-1]+=l,C[m-1]++),"("===$&&z&&!Z&&(k[m]=k[m-1].slice(x)+k[m],k[m-1]=k[m-1].slice(0,x))),k[m]+=G?X.slice(1):X),c||d||!$||(h++,A&&"("===$&&(w[h]=!0)),c||d||!U||(u&&(k[m]+=$),X+=$),X}var a,s,p,l,d,c,u=n&&n[0],f={bd:u},g={0:f},v=0,h=0,m=0,_={},x=0,b={},w={},y={},C={0:0},k={0:""},j=0;return"@"===t[0]&&(t=t.replace(Dt,".")),l=(t+(r?" ":"")).replace(ft.rPrm,o),u&&(l=k[0]),!h&&l||D(t)}function L(t,e,n){var r,i,o,a,s,p,l,d,c,u,f,g,v,h,m,_,x,b,w,y,C,k,j,T,A,P,F,N,M,$,V,E,O,I=0,S=vt.useViews||e.useViews||e.tags||e.templates||e.helpers||e.converters,q="",K={},B=t.length;for(typeof e===Bt?(b=n?'data-link="'+e.replace(Tt," ").slice(1,-1)+'"':e,e=0):(b=e.tmplName||"unnamed",e.allowCode&&(K.allowCode=!0),e.debug&&(K.debug=!0),f=e.bnds,x=e.tmpls),r=0;r":a+o):(C&&(w=R(k,K),w.tmplName=b+"/"+o,w.useViews=w.useViews||S,L(C,w),S=w.useViews,x.push(w)),A||(y=o,S=S||o&&(!ut[o]||!ut[o].flow),T=q,q=""),j=t[r+1],j=j&&"else"===j[0]),M=N?";\ntry{\nret+=":"\n+",h="",m="",P&&(g||$||a&&a!==Jt||V)){if(F=new Function("data,view,j","// "+b+" "+ ++I+" "+o+E+"{"+s+"};"+O),F._er=N,F._tag=o,F._bd=!!g,F._lr=V,n)return F;U(F,g),_='c("'+a+'",view,',u=!0,h=_+I+",",m=")"}if(q+=P?(n?(N?"try{\n":"")+"return ":M)+(u?(u=void 0,S=c=!0,_+(F?(f[I-1]=F,I):"{"+s+"}")+")"):">"===o?(l=!0,"h("+v[0]+")"):(d=!0,"((v="+v[0]+")!=null?v:"+(n?"null)":'"")'))):(p=!0,"\n{view:view,content:false,tmpl:"+(C?x.length:"false")+","+s+"},"),y&&!j){if(q="["+q.slice(0,-1)+"]",_='t("'+y+'",view,this,',n||g){if(q=new Function("data,view,j"," // "+b+" "+I+" "+y+E+q+O),q._er=N,q._tag=y,g&&U(f[I-1]=q,g),q._lr=V,n)return q;h=_+I+",undefined,",m=")"}q=T+M+_+(g&&I||q)+")",g=0,y=0}N&&!j&&(S=!0,q+=";\n}catch(e){ret"+(n?"urn ":"+=")+h+"j._err(e,view,"+N+")"+m+";}"+(n?"":"\nret=ret"))}q="// "+b+(K.debug?"\ndebugger;":"")+"\nvar v"+(p?",t=j._tag":"")+(c?",c=j._cnvt":"")+(l?",h=j._html":"")+(n?(i[8]?", ob":"")+";\n":',ret=""')+q+(n?"\n":";\nreturn ret;");try{q=new Function("data,view,j",q)}catch(Q){D("Compiled template code:\n\n"+q+'\n: "'+(Q.message||Q)+'"')}return e&&(e.fn=q,e.useViews=!!S),q}function Q(t,e){return t&&t!==e?e?l(l({},e),t):t:e&&l({},e)}function H(t,n){var r,i,o=n.map,a=o&&o.propsArr;if(!a){if(a=[],typeof t===Lt||st(t))for(r in t)i=t[r],r===at||!t.hasOwnProperty(r)||n.props.noFunctions&&e.isFunction(i)||a.push({key:r,prop:i});o&&(o.propsArr=o.options&&a)}return W(a,n)}function W(t,n){var r,i,o,a=n.tag,s=n.props,p=n.params.props,l=s.filter,d=s.sort,c=d===!0,u=parseInt(s.step),f=s.reverse?-1:1;if(!pt(t))return t;if(c||d&&typeof d===Bt?(r=t.map(function(t,e){return t=c?t:g(t,d),{i:e,v:typeof t===Bt?t.toLowerCase():t}}),r.sort(function(t,e){return t.v>e.v?f:t.vt.length?t.length:+o,t=t.slice(i,o)),u>1){for(i=0,o=t.length,r=[];i\s]/,Mt=/[\x00`><"'&=]/g,$t=/[\x00`><\"'&=]/,Vt=/^on[A-Z]|^convert(Back)?$/,Et=/^\#\d+_`[\s\S]*\/\d+_`$/,Ot=Mt,It=/[&<>]/g,St=/&(amp|gt|lt);/g,Dt=/\[['"]?|['"]?\]/g,qt=0,Ut={"&":"&","<":"<",">":">","\0":"�","'":"'",'"':""","`":"`","=":"="},Kt={amp:"&",gt:">",lt:"<"},Jt="html",Bt="string",Lt="object",Qt="data-jsv-tmpl",Ht="jsvTmpl",Wt="For #index in nested block use #getIndex().",Zt={},zt={},Gt=t.jsrender,Xt=Gt&&e&&!e.render,Yt={template:{compile:A},tag:{compile:j},viewModel:{compile:N},helper:{},converter:{}};if(ot={jsviews:kt,sub:{rPath:/^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g,rPrm:/(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(~?[\w$.^]+)?\s*((\+\+|--)|\+|-|~(?![\w$])|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?(@)?[#~]?[\w$.^]+)([([])?)|(,\s*)|(?:(\()\s*)?\\?(?:(')|("))|(?:\s*(([)\]])(?=[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g,View:C,Err:p,tmplFn:q,parse:B,extend:l,extendCtx:Q,syntaxErr:D,onStore:{template:function(t,e){null===e?delete zt[t]:t&&(zt[t]=e)}},addSetting:$,settings:{allowCode:!1},advSet:a,_thp:i,_gm:r,_tg:function(){},_cnvt:m,_tag:y,_er:S,_err:I,_cp:o,_sq:function(t){return"constructor"===t&&D(""),t}},settings:{delimiters:d,advanced:function(t){return t?(l(vt,t),ft.advSet(),ht):vt}},map:V},(p.prototype=new Error).constructor=p,u.depends=function(){return[this.get("item"),"index"]},f.depends="index",C.prototype={get:c,getIndex:f,ctxPrm:v,getRsc:w,_getTmpl:h,_getOb:g,getCache:function(t){return gt._cchCt>this.cache._ct&&(this.cache={_ct:gt._cchCt}),void 0!==this.cache[t]?this.cache[t]:this.cache[t]=Zt[t](this.data,this,ft)},_is:"view"},ft=ot.sub,ht=ot.settings,!(Gt||e&&e.render)){for(nt in Yt)M(nt,Yt[nt]);if(dt=ot.converters,ct=ot.helpers,ut=ot.tags,ft._tg.prototype={baseApply:T,cvtArgs:_,bndArgs:b,ctxPrm:v},it=ft.topView=new C,e){if(e.fn.render=Z,at=e.expando,e.observable){if(kt!==(kt=e.views.jsviews))throw"jquery.observable.js requires jsrender.js "+kt;l(ft,e.views.sub),ot.map=e.views.map}}else e={},et&&(t.jsrender=e),e.renderFile=e.__express=e.compile=function(){throw"Node.js: use npm jsrender, or jsrender-node.js"},e.isFunction=function(t){return"function"==typeof t},e.isArray=Array.isArray||function(t){return"[object Array]"==={}.toString.call(t)},ft._jq=function(t){t!==e&&(l(t,e),e=t,e.fn.render=Z,delete e.jsrender,at=e.expando)},e.jsrender=kt;gt=ft.settings,gt.allowCode=!1,st=e.isFunction,e.render=zt,e.views=ot,e.templates=lt=ot.templates;for(yt in gt)$(yt);(ht.debugMode=function(t){return void 0===t?gt.debugMode:(gt._clFns&>._clFns(),gt.debugMode=t,gt.onError=typeof t===Bt?function(){return t}:st(t)?t:void 0,ht)})(!1),vt=gt.advanced={cache:!0,useViews:!1,_jsv:!1},ut({"if":{render:function(t){var e=this,n=e.tagCtx,r=e.rendering.done||!t&&(n.args.length||!n.index)?"":(e.rendering.done=!0,void(e.selected=n.index));return r},contentCtx:!0,flow:!0},"for":{sortDataMap:V(W),init:function(t,e){this.setDataMap(this.tagCtxs)},render:function(t){var e,n,r,i,o,a=this,s=a.tagCtx,p=s.argDefault===!1,l=s.props,d=p||s.args.length,c="",u=0;if(!a.rendering.done){if(e=d?t:s.view.data,p)for(p=l.reverse?"unshift":"push",i=+l.end,o=+l.step||1,e=[],r=+l.start||0;(i-r)*o>0;r+=o)e[p](r);void 0!==e&&(n=pt(e),c+=s.render(e,!d||l.noIteration),u+=n?e.length:1),(a.rendering.done=u)&&(a.selected=s.index)}return c},setDataMap:function(t){for(var e,n,r,i=this,o=t.length;o--;)e=t[o],n=e.props,r=e.params.props,e.argDefault=void 0===n.end||e.args.length>0,n.dataMap=e.argDefault!==!1&&pt(e.args[0])&&(r.sort||r.start||r.end||r.step||r.filter||r.reverse||n.sort||n.start||n.end||n.step||n.filter||n.reverse)&&i.sortDataMap},flow:!0},props:{baseTag:"for",dataMap:V(H),init:a,flow:!0},include:{flow:!0},"*":{render:o,flow:!0},":*":{render:o,flow:!0},dbg:ct.dbg=dt.dbg=s}),dt({html:X,attr:X,encode:Y,unencode:tt,url:function(t){return void 0!=t?encodeURI(""+t):null===t?t:""}})}return gt=ft.settings,pt=(e||Gt).isArray,ht.delimiters("{{","}}","^"),Xt&&Gt.views.sub._jq(e),e||Gt},window); +//# sourceMappingURL=jsrender.min.js.map diff --git a/view-webapp/src/main/webapp/tour-registration.inc.html b/view-webapp/src/main/webapp/tour-registration.inc.html index 733a39f..e43b8ea 100644 --- a/view-webapp/src/main/webapp/tour-registration.inc.html +++ b/view-webapp/src/main/webapp/tour-registration.inc.html @@ -49,35 +49,50 @@