{
"version": 3,
"sources": ["../../src/es6/lib/signals.js", "../../src/es6/DojoTemplates.js", "../../src/es6/AutoComplete.js", "../../src/es6/Eventify.js", "../../src/es6/ClassRecordEditor.js", "../../src/es6/ClassRecordTechniquesModel.js", "../../src/es6/classrecord_student_attendance/StudentAttendanceModel.js", "../../src/es6/classrecord_student_attendance/StudentAttendancePresentModel.js", "../../src/es6/classrecord_student_attendance/StudentAttendanceCard.js", "../../src/es6/classrecord_student_attendance/StudentAttendanceTable.js", "../../src/es6/ClassRecordTechniquesEditor.js", "../../src/es6/ClassRecordTechniqueComponent.js", "../../src/es6/ClassRecordDetailsEditor.js", "../../src/es6/ClassRecordNavigationButtons.js", "../../src/es6/DateToDayDisplay.js", "../../src/es6/Pager.js", "../../src/es6/ClassRecordSummaryTable.js", "../../src/es6/ClassRecordSummaryTableController.js", "../../src/es6/ClassRecordSummaryTableRow.js", "../../src/es6/FormsTabContainer.js", "../../src/es6/FormsTabPanel.js", "../../src/es6/formal/FormGenerator.js", "../../src/es6/formal/FormField.js", "../../src/es6/formal/FormModel.js", "../../src/es6/LoginForm.js", "../../src/es6/StudentListController.js", "../../src/es6/StudentListModel.js", "../../src/es6/StudentSelectModel.js", "../../src/es6/StudentListTable.js", "../../src/es6/StudentAttendanceSummaryCard.js", "../../src/es6/StudentInfoForm.js", "../../src/es6/StudentListTableRow.js", "../../src/es6/StudentAttendanceByDateBadges.js", "../../src/es6/MessageForm.js", "../../src/es6/TechniquesAutoComplete.js", "../../src/es6/DojoPopup.js", "../../src/es6/DataComponents.js", "../../src/es6/DojoMenu.js", "../../src/es6/DojoAPI.js", "../../src/es6/DojoAPIWs.js", "../../src/es6/DojoTabs.js", "../../src/es6/TopMenu.js", "../../src/es6/DojoDeshi.js", "../../src/es6/RPCClick.js"],
"sourcesContent": ["/*jslint onevar:true, undef:true, newcap:true, regexp:true, bitwise:true, maxerr:50, indent:4, white:false, nomen:false, plusplus:false */\n/*global define:false, require:false, exports:false, module:false, signals:false */\n\n/** @license\n * JS Signals
- This is an internal constructor and shouldn't be called by regular users.\n *
- inspired by Joa Ebert AS3 SignalBinding and Robert Penner's Slot classes.\n * @author Miller Medeiros\n * @constructor\n * @internal\n * @name SignalBinding\n * @param {Signal} signal Reference to Signal object that listener is currently bound to.\n * @param {Function} listener Handler function bound to the signal.\n * @param {boolean} isOnce If binding should be executed just once.\n * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function).\n * @param {Number} [priority] The priority level of the event listener. (default = 0).\n */\n function SignalBinding(signal, listener, isOnce, listenerContext, priority) {\n\n /**\n * Handler function bound to the signal.\n * @type Function\n * @private\n */\n this._listener = listener;\n\n /**\n * If binding should be executed just once.\n * @type boolean\n * @private\n */\n this._isOnce = isOnce;\n\n /**\n * Context on which listener will be executed (object that should represent the `this` variable inside listener function).\n * @memberOf SignalBinding.prototype\n * @name context\n * @type Object|undefined|null\n */\n this.context = listenerContext;\n\n /**\n * Reference to Signal object that listener is currently bound to.\n * @type Signal\n * @private\n */\n this._signal = signal;\n\n /**\n * Listener priority\n * @type Number\n * @private\n */\n this._priority = priority || 0;\n }\n\n SignalBinding.prototype = {\n\n /**\n * If binding is active and should be executed.\n * @type boolean\n */\n active : true,\n\n /**\n * Default parameters passed to listener during `Signal.dispatch` and `SignalBinding.execute`. (curried parameters)\n * @type Array|null\n */\n params : null,\n\n /**\n * Call listener passing arbitrary parameters.\n *
If binding was added using `Signal.addOnce()` it will be automatically removed from signal dispatch queue, this method is used internally for the signal dispatch.
\n * @param {Array} [paramsArr] Array of parameters that should be passed to the listener\n * @return {*} Value returned by the listener.\n */\n execute : function (paramsArr) {\n var handlerReturn, params;\n if (this.active && !!this._listener) {\n params = this.params? this.params.concat(paramsArr) : paramsArr;\n handlerReturn = this._listener.apply(this.context, params);\n if (this._isOnce) {\n this.detach();\n }\n }\n return handlerReturn;\n },\n\n /**\n * Detach binding from signal.\n * - alias to: mySignal.remove(myBinding.getListener());\n * @return {Function|null} Handler function bound to the signal or `null` if binding was previously detached.\n */\n detach : function () {\n return this.isBound()? this._signal.remove(this._listener, this.context) : null;\n },\n\n /**\n * @return {Boolean} `true` if binding is still bound to the signal and have a listener.\n */\n isBound : function () {\n return (!!this._signal && !!this._listener);\n },\n\n /**\n * @return {boolean} If SignalBinding will only be executed once.\n */\n isOnce : function () {\n return this._isOnce;\n },\n\n /**\n * @return {Function} Handler function bound to the signal.\n */\n getListener : function () {\n return this._listener;\n },\n\n /**\n * @return {Signal} Signal that listener is currently bound to.\n */\n getSignal : function () {\n return this._signal;\n },\n\n /**\n * Delete instance properties\n * @private\n */\n _destroy : function () {\n delete this._signal;\n delete this._listener;\n delete this.context;\n },\n\n /**\n * @return {string} String representation of the object.\n */\n toString : function () {\n return '[SignalBinding isOnce:' + this._isOnce +', isBound:'+ this.isBound() +', active:' + this.active + ']';\n }\n\n };\n\n\n/*global SignalBinding:false*/\n\n // Signal --------------------------------------------------------\n //================================================================\n\n function validateListener(listener, fnName) {\n if (typeof listener !== 'function') {\n throw new Error( 'listener is a required param of {fn}() and should be a Function.'.replace('{fn}', fnName) );\n }\n }\n\n /**\n * Custom event broadcaster\n *IMPORTANT: Setting this property during a dispatch will only affect the next dispatch, if you want to stop the propagation of a signal use `halt()` instead.
\n * @type boolean\n */\n active : true,\n\n /**\n * @param {Function} listener\n * @param {boolean} isOnce\n * @param {Object} [listenerContext]\n * @param {Number} [priority]\n * @return {SignalBinding}\n * @private\n */\n _registerListener : function (listener, isOnce, listenerContext, priority) {\n\n var prevIndex = this._indexOfListener(listener, listenerContext),\n binding;\n\n if (prevIndex !== -1) {\n binding = this._bindings[prevIndex];\n if (binding.isOnce() !== isOnce) {\n throw new Error('You cannot add'+ (isOnce? '' : 'Once') +'() then add'+ (!isOnce? '' : 'Once') +'() the same listener without removing the relationship first.');\n }\n } else {\n binding = new SignalBinding(this, listener, isOnce, listenerContext, priority);\n this._addBinding(binding);\n }\n\n if(this.memorize && this._prevParams){\n binding.execute(this._prevParams);\n }\n\n return binding;\n },\n\n /**\n * @param {SignalBinding} binding\n * @private\n */\n _addBinding : function (binding) {\n //simplified insertion sort\n var n = this._bindings.length;\n do { --n; } while (this._bindings[n] && binding._priority <= this._bindings[n]._priority);\n this._bindings.splice(n + 1, 0, binding);\n },\n\n /**\n * @param {Function} listener\n * @return {number}\n * @private\n */\n _indexOfListener : function (listener, context) {\n var n = this._bindings.length,\n cur;\n while (n--) {\n cur = this._bindings[n];\n if (cur._listener === listener && cur.context === context) {\n return n;\n }\n }\n return -1;\n },\n\n /**\n * Check if listener was attached to Signal.\n * @param {Function} listener\n * @param {Object} [context]\n * @return {boolean} if Signal has the specified listener.\n */\n has : function (listener, context) {\n return this._indexOfListener(listener, context) !== -1;\n },\n\n /**\n * Add a listener to the signal.\n * @param {Function} listener Signal handler function.\n * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function).\n * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0)\n * @return {SignalBinding} An Object representing the binding between the Signal and listener.\n */\n add : function (listener, listenerContext, priority) {\n validateListener(listener, 'add');\n return this._registerListener(listener, false, listenerContext, priority);\n },\n\n /**\n * Add listener to the signal that should be removed after first execution (will be executed only once).\n * @param {Function} listener Signal handler function.\n * @param {Object} [listenerContext] Context on which listener will be executed (object that should represent the `this` variable inside listener function).\n * @param {Number} [priority] The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0)\n * @return {SignalBinding} An Object representing the binding between the Signal and listener.\n */\n addOnce : function (listener, listenerContext, priority) {\n validateListener(listener, 'addOnce');\n return this._registerListener(listener, true, listenerContext, priority);\n },\n\n /**\n * Remove a single listener from the dispatch queue.\n * @param {Function} listener Handler function that should be removed.\n * @param {Object} [context] Execution context (since you can add the same handler multiple times if executing in a different context).\n * @return {Function} Listener handler function.\n */\n remove : function (listener, context) {\n validateListener(listener, 'remove');\n\n var i = this._indexOfListener(listener, context);\n if (i !== -1) {\n this._bindings[i]._destroy(); //no reason to a SignalBinding exist if it isn't attached to a signal\n this._bindings.splice(i, 1);\n }\n return listener;\n },\n\n /**\n * Remove all listeners from the Signal.\n */\n removeAll : function () {\n var n = this._bindings.length;\n while (n--) {\n this._bindings[n]._destroy();\n }\n this._bindings.length = 0;\n },\n\n /**\n * @return {number} Number of listeners attached to the Signal.\n */\n getNumListeners : function () {\n return this._bindings.length;\n },\n\n /**\n * Stop propagation of the event, blocking the dispatch to next listeners on the queue.\n *IMPORTANT: should be called only during signal dispatch, calling it before/after dispatch won't affect signal broadcast.
\n * @see Signal.prototype.disable\n */\n halt : function () {\n this._shouldPropagate = false;\n },\n\n /**\n * Dispatch/Broadcast Signal to all listeners added to the queue.\n * @param {...*} [params] Parameters that should be passed to each handler.\n */\n dispatch : function (params) {\n if (! this.active) {\n return;\n }\n\n var paramsArr = Array.prototype.slice.call(arguments),\n n = this._bindings.length,\n bindings;\n\n if (this.memorize) {\n this._prevParams = paramsArr;\n }\n\n if (! n) {\n //should come after memorize\n return;\n }\n\n bindings = this._bindings.slice(); //clone array in case add/remove items during dispatch\n this._shouldPropagate = true; //in case `halt` was called before dispatch or during the previous dispatch.\n\n //execute all callbacks until end of the list or until a callback returns `false` or stops propagation\n //reverse loop since listeners with higher priority will be added at the end of the list\n do { n--; } while (bindings[n] && this._shouldPropagate && bindings[n].execute(paramsArr) !== false);\n },\n\n /**\n * Forget memorized arguments.\n * @see Signal.memorize\n */\n forget : function(){\n this._prevParams = null;\n },\n\n /**\n * Remove all bindings from signal and destroy any reference to external objects (destroy Signal object).\n *IMPORTANT: calling any method on the signal instance after calling dispose will throw errors.
\n */\n dispose : function () {\n this.removeAll();\n delete this._bindings;\n delete this._prevParams;\n },\n\n /**\n * @return {string} String representation of the object.\n */\n toString : function () {\n return '[Signal active:'+ this.active +' numListeners:'+ this.getNumListeners() +']';\n }\n\n };\n\n\n // Namespace -----------------------------------------------------\n //================================================================\n\n /**\n * Signals namespace\n * @namespace\n * @name signals\n */\n var signals = Signal;\n\n /**\n * Custom event broadcaster\n * @see Signal\n */\n // alias for backwards compatibility (see #gh-44)\n signals.Signal = Signal;\n\n\n\n //exports to multiple environments\n if(typeof define === 'function' && define.amd){ //AMD\n define(function () { return signals; });\n } else if (typeof module !== 'undefined' && module.exports){ //node\n module.exports = signals;\n } else { //browser\n //use string because of Google closure compiler ADVANCED_MODE\n /*jslint sub:true */\n global['signals'] = signals;\n }\n\n}(this));\n", "// dtemplate generated - do not edit\nexport const DojoTemplates= (function() {\t\n\tlet templates =\n\t\t{\"AbsentStudentComponent\":\"\\u003ctable\\u003e\\n\\u003ctr data-set=\\\"this\\\"\\u003e\\n\\u003ctd data-set=\\\"Surname\\\"/\\u003e\\n\\u003ctd data-set=\\\"Firstname\\\"/\\u003e\\n\\u003ctd\\u003e\\u003ca data-set=\\\"add\\\" data-event=\\\"click:clickAdd\\\" class=\\\"fa fa-plus\\\" href=\\\"#\\\"/\\u003e\\u003c/td\\u003e\\n\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"AbsentStudentList\":\"\\u003ctable\\u003e\\n\\u003cthead\\u003e\\u003ctr\\u003e\\u003cth\\u003eSurname\\u003c/th\\u003e\\u003cth\\u003eFirstname\\u003c/th\\u003e\\u003cth/\\u003e\\u003c/tr\\u003e\\u003c/thead\\u003e\\n\\u003ctbody data-set=\\\"tbody\\\"\\u003e\\n\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\",\"AutoComplete\":\"\\u003ctemplate\\u003e\\n\\t\\u003cstyle\\u003e:host {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n align-items: stretch; }\\n\\ninput {\\n font-size: 1.2em;\\n padding: 0.3em 0.6em; }\\n\\n#items {\\n display: flex;\\n flex-direction: row;\\n justify-content: flex-start;\\n align-items: baseline;\\n flex-wrap: wrap;\\n gap: 1em;\\n padding: 1em 0; }\\n #items \\u003e span {\\n padding: 0.4em 1em;\\n border: 1px solid var(--dd-background-color-selected);\\n border-radius: 50px; }\\n\\u003c/style\\u003e\\n\\t\\u003cinput type=\\\"text\\\" id=\\\"input\\\"/\\u003e\\n\\t\\u003cdiv id=\\\"items\\\"\\u003e\\n\\t\\u003c/div\\u003e\\n\\u003c/template\\u003e\\n\",\"ClassRecordStudentComponent\":\"\\u003ctr\\u003e\\n\\t\\u003ctd data-set=\\\"Firstname\\\"/\\u003e\\n\\t\\u003ctd data-set=\\\"Surname\\\"/\\u003e\\n\\t\\u003ctd\\u003eAttendance Type\\u003c/td\\u003e\\n\\t\\u003ctd\\u003e\\u003ca data-set=\\\"remove\\\" class=\\\"fa fa-trash\\\"/\\u003e\\u003c/td\\u003e\\n\\u003c/tr\\u003e\\n\",\"ClassRecordStudentListEditor\":\"\\u003cdiv class=\\\"row\\\"\\u003e\\n\\t\\u003cdiv class=\\\"small-6 columns\\\"\\u003e\\n\\t\\u003ch2\\u003eAbsent\\u003c/h2\\u003e\\n\\t\\u003cdiv data-set=\\\"absentList\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"small-6 columns\\\"\\u003e\\n\\t\\u003ch2\\u003ePresent\\u003c/h2\\u003e\\n\\t\\u003cdiv data-set=\\\"presentList\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"ClassRecordSummaryTable\":\"\\u003ctemplate\\u003e\\n\\t\\u003cstyle\\u003e.summary-table {\\n display: grid;\\n grid-template-columns: repeat(7, max-content);\\n column-gap: 0;\\n row-gap: 0.4em; }\\n .summary-table \\u003e div {\\n display: contents; }\\n .summary-table \\u003e div:first-child \\u003e div {\\n font-weight: bold;\\n background-color: #f8f8f8;\\n padding: 0.2em; }\\n .summary-table \\u003e div \\u003e div {\\n padding: 0.2em 0.4em;\\n transition: background-color var(--dd-fade-fast, 0.2s), color var(--dd-fade-fast, 0.2s); }\\n .summary-table \\u003e div:not(:first-child):hover \\u003e div {\\n background-color: var(--dd-background-color-hover, #def);\\n color: var(--dd-color-hover);\\n cursor: pointer; }\\n\\u003c/style\\u003e\\n\\t\\u003cdojo-pager data-event=\\\"pager-goto:gotoPage\\\" page=\\\"0\\\" page-count=\\\"1\\\" record-count=\\\"0\\\" id=\\\"pager\\\"\\u003e \\u003c/dojo-pager\\u003e\\n\\t\\u003cdiv class=\\\"summary-table\\\" id=\\\"summaryTable\\\"\\u003e\\n\\t\\t\\u003cdiv id=\\\"summaryHeader\\\"\\u003e\\n\\t\\t\\t\\u003cdiv\\u003eDate\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv\\u003eDay\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv\\u003eStart\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv\\u003eArt\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv\\u003eClass Type\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv\\u003eStudents\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv\\u003eTechniques\\u003c/div\\u003e\\n\\t\\t\\u003c/div\\u003e\\n\\t\\t\\n\\t\\u003c/div\\u003e\\n\\u003c/template\\u003e\\n\",\"ClassRecordSummaryTable.Record\":\"\\u003cdiv dtemplate-child=\\\"Record\\\"\\u003e\\n\\t\\t\\t\\u003cdiv id=\\\"date\\\"\\u003eDate\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv id=\\\"day\\\"\\u003eDay\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv id=\\\"start\\\"\\u003eStart\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv id=\\\"art\\\"\\u003eArt\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv id=\\\"classType\\\"\\u003eClass Type\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv id=\\\"students\\\"\\u003eStudents\\u003c/div\\u003e\\n\\t\\t\\t\\u003cdiv id=\\\"techniques\\\"\\u003eTechniques\\u003c/div\\u003e\\n\\t\\t\\u003c/div\\u003e\",\"ClassRecordTechniqueComponent\":\"\\u003ctable\\u003e\\u003ctr data-set=\\\"this\\\"\\u003e\\n \\u003ctd data-set=\\\"Name\\\"/\\u003e\\n\\t\\u003ctd\\u003e\\u003ca data-set=\\\"remove\\\" class=\\\"fa fa-trash\\\"/\\u003e\\u003c/td\\u003e\\n\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"ClassRecordTechniquesEditor\":\"\\u003cdiv\\u003e\\n\\u003c!-- #dojo-techniques-auto-complete _IS ON THE MAIN PAGE, in this case `classrecord_students_waza_edit.html`, and is referenced here to do the auto-\\n\\tcompletion for techniques --\\u003e\\n\\u003cdojo-auto-complete id=\\\"techniqueEntry\\\" data-provider-id=\\\"dojo-techniques-auto-complete\\\"\\u003e\\n\\u003c/dojo-auto-complete\\u003e\\n\\t\\u003ctable class=\\\"table\\\"\\u003e\\n\\t\\t\\u003ctbody data-set=\\\"techniquesList\\\"/\\u003e\\n\\t\\u003c/table\\u003e\\n\\u003c/div\\u003e\\n\",\"DojoForm\":\"\\u003cdiv class=\\\"row\\\"\\u003e\\n\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003cdiv class=\\\"edit-form\\\"\\u003e\\n\\u003cdiv data-set=\\\"closeButton\\\" class=\\\"form-close fa fa-close\\\"\\u003e \\u003c/div\\u003e\\u0026nbsp;\\u003c/div\\u003e\\n\\u003cform\\u003e\\n\\u003clabel\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eDojo Name\\u003c/span\\u003e\\n\\u003cinput type=\\\"text\\\" data-set=\\\"Name\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003clabel\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eDojo Email\\u003c/span\\u003e\\n\\u003cinput type=\\\"text\\\" data-set=\\\"Email\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003clabel\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eTimezone Offset (minutes East of UTC)\\u003c/span\\u003e\\n\\u003cinput type=\\\"text\\\" data-set=\\\"Offset\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003cbutton data-set=\\\"save\\\" class=\\\"button\\\"\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eSave\\u003c/span\\u003e\\u003c/button\\u003e\\n\\u003c/form\\u003e\\n\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\\n\",\"DojoFormsEditor\":\"\\u003cdiv class=\\\"dojo-forms-editor\\\"\\u003e\\n\\t\\u003cdiv data-set=\\\"list\\\"\\u003e\\n\\t\\u003c/div\\u003e\\n\\t\\u003cdiv data-set=\\\"editor\\\"\\u003e\\n\\t\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"DojoList\":\"\\u003ctable\\u003e\\n\\t\\u003cthead\\u003e\\u003ctr\\u003e\\u003cth\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eName\\u003c/span\\u003e\\u003c/th\\u003e\\u003cth\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eForms\\u003c/span\\u003e\\u003c/th\\u003e\\u003c/tr\\u003e\\u003c/thead\\u003e\\n\\t\\u003ctbody data-set=\\\"tbody\\\"\\u003e\\n\\t\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\",\"DojoListItem\":\"\\u003ctable\\u003e\\n\\t\\u003ctr data-set=\\\"this\\\" class=\\\"hover-row\\\"\\u003e\\n\\t\\t\\u003ctd data-set=\\\"Name\\\" data-event=\\\"click:dojoClick\\\"\\u003e-\\u003c/td\\u003e\\n\\t\\t\\u003ctd data-event=\\\"click:dojoFormsClick\\\"\\u003e\\u003ca href=\\\"#\\\"\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eForms\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/td\\u003e\\n\\t\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"DojoMenu\":\"\\u003ctemplate\\u003e\\n\\t\\u003cstyle\\u003e:host {\\n filter: drop-shadow(3px 3px 6px rgba(0, 0, 0, 0.5)); }\\n\\nnav#menu {\\n --widget-width: 10em;\\n display: flex;\\n flex-direction: column;\\n justify-content: flex-start;\\n align-items: stretch;\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 1px solid #336;\\n border-top-width: 0;\\n border-left-width: 0;\\n background-color: #f8f8f8;\\n padding: 1em;\\n box-sizing: border-box;\\n width: var(--widget-width); }\\n nav#menu .closer {\\n position: fixed;\\n top: 0;\\n left: var(--widget-width);\\n background-color: white;\\n padding: 1em;\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px; }\\n nav#menu .closer \\u003e #menu-icon {\\n display: none; }\\n nav#menu .closer \\u003e #close-icon {\\n display: block; }\\n nav#menu .closer \\u003e svg {\\n width: 1.4em; }\\n nav#menu .closer \\u003e svg \\u003e g {\\n fill: none;\\n stroke-width: 1.5;\\n stroke: #333; }\\n nav#menu.hide {\\n left: calc(-1 * var(--widget-width));\\n display: flex; }\\n nav#menu.hide .closer {\\n left: 0; }\\n nav#menu.hide .closer \\u003e #menu-icon {\\n display: block; }\\n nav#menu.hide .closer \\u003e #close-icon {\\n display: none; }\\n nav#menu, nav#menu .closer {\\n transition: left 0.3s; }\\n\\u003c/style\\u003e\\n\\t\\u003cnav id=\\\"menu\\\"\\u003e\\n\\t\\u003ca href=\\\"/\\\"\\u003eDojoDeshi\\u003c/a\\u003e\\n\\t\\u003cslot\\u003e\\n\\t\\u003c/slot\\u003e\\n\\t\\u003cdiv class=\\\"closer\\\" data-event=\\\"click:toggleDisplay\\\"\\u003e\\n\\t\\t\\t\\u003csvg id=\\\"close-icon\\\" viewBox=\\\"0 0 10 10\\\"\\u003e\\n\\t\\t\\t\\t\\u003cg\\u003e\\u003cpath d=\\\"M6 2L3 5L6 8\\\"/\\u003e\\u003c/g\\u003e\\n\\t\\t\\t\\u003c/svg\\u003e\\n\\t\\t\\t\\u003csvg viewBox=\\\"0 0 10 10\\\" id=\\\"menu-icon\\\"\\u003e\\n\\t\\t\\t\\t\\u003cg\\u003e\\u003cpath d=\\\"M1 2L9 2M1 5L9 5M1 8L9 8\\\"/\\u003e\\u003c/g\\u003e\\n\\t\\t\\t\\u003c/svg\\u003e\\n\\t\\u003c/div\\u003e\\n\\t\\u003c/nav\\u003e\\n\\u003c/template\\u003e\\n\",\"DojoPopup\":\"\\u003ctemplate\\u003e\\n\\u003cstyle\\u003e#cover {\\n background-color: rgba(0, 0, 0, 0.5);\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n align-items: center;\\n z-index: 900; }\\n\\n#popup {\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n align-items: stretch;\\n z-index: 1000; }\\n\\nheader {\\n border-top-right-radius: 0.4em;\\n border-top-left-radius: 0.4em;\\n background-color: var(--dd-background-color);\\n color: white;\\n font-weight: bold;\\n padding: 1em 0;\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n align-items: baseline;\\n padding: 0.6em 1em; }\\n header svg {\\n width: 1.4em; }\\n\\nmain {\\n border-bottom-right-radius: 0.4em;\\n border-bottom-left-radius: 0.4em;\\n background-color: white;\\n color: #333;\\n padding: 1em; }\\n\\u003c/style\\u003e\\n\\u003cdiv id=\\\"cover\\\"\\u003e\\n\\t\\u003cdiv id=\\\"popup\\\"\\u003e\\n\\t\\u003cheader\\u003e\\n\\u003cslot name=\\\"title\\\"\\u003e \\u003c/slot\\u003e\\u003cdiv id=\\\"close\\\" data-event=\\\"click:closePopup\\\"\\u003e\\u003csvg viewBox=\\\"0 0 10 10\\\"\\u003e\\u003cg stroke=\\\"white\\\" stroke-width=\\\"2\\\"\\u003e\\u003cpath d=\\\"M2 2L8 8M2 8L8 2\\\"/\\u003e\\u003c/g\\u003e\\u003c/svg\\u003e\\u003c/div\\u003e\\n\\u003c/header\\u003e\\n\\u003cmain\\u003e\\n\\u003cslot\\u003e \\u003c/slot\\u003e\\n\\u003c/main\\u003e\\n\\u003c/div\\u003e\\n\\u003c/div\\u003e\\u003c/template\\u003e\\n\",\"DojoRow\":\"\\u003ctable\\u003e\\n\\t\\u003ctr data-set=\\\"this\\\"\\u003e\\n\\t\\t\\u003ctd data-set=\\\"name\\\"\\u003e-\\u003c/td\\u003e\\n\\t\\t\\u003ctd data-set=\\\"offset\\\"\\u003e-\\u003c/td\\u003e\\n\\t\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"DojoStudentList\":\"\\u003ctemplate\\u003e\\n\\t\\u003cstyle\\u003e:host {\\n display: block;\\n width: 100%;\\n background: white;\\n -webkit-box-shadow: 1px 1px 2px 2px rgba(0, 0, 0, 0.4);\\n -moz-box-shadow: 1px 1px 2px 2px rgba(0, 0, 0, 0.4);\\n box-shadow: 1px 1px 2px 2px rgba(0, 0, 0, 0.4); }\\n\\n.component-dojo-student-list {\\n background-color: red; }\\n\\u003c/style\\u003e\\n\\t\\u003cdiv class=\\\"component-dojo-student-list\\\"\\u003e\\u003cdiv\\u003eMy dojo-student-list\\u003c/div\\u003e\\u003ccontent/\\u003e\\u003c/div\\u003e\\n\\u003c/template\\u003e\\n\",\"DojoStudentRecord\":\"\\u003ctemplate\\u003e\\n\\t\\u003cstyle\\u003e:host {\\n display: block;\\n width: 100%;\\n background: white;\\n -webkit-box-shadow: 1px 1px 2px 2px rgba(0, 0, 0, 0.4);\\n -moz-box-shadow: 1px 1px 2px 2px rgba(0, 0, 0, 0.4);\\n box-shadow: 1px 1px 2px 2px rgba(0, 0, 0, 0.4); }\\n\\n.component-dojo-student-record {\\n background-color: red; }\\n\\u003c/style\\u003e\\n\\t\\u003cdiv class=\\\"component-dojo-student-record\\\"\\u003e\\u003cdiv\\u003eMy dojo-student-record\\u003c/div\\u003e\\u003ccontent/\\u003e\\u003c/div\\u003e\\n\\u003c/template\\u003e\\n\",\"DojoTabs\":\"\\u003ctemplate\\u003e\\n\\t\\u003cstyle\\u003e:host {\\n display: flex;\\n flex-direction: column;\\n justify-content: flex-start;\\n align-items: stretch; }\\n\\nheader {\\n flex-grow: 0;\\n display: flex;\\n flex-direction: row;\\n column-gap: 0;\\n row-gap: 0;\\n flex-wrap: wrap; }\\n header \\u003e span {\\n cursor: pointer;\\n border: 1px solid var(--dd-background-color-selected);\\n border-left-width: 0px;\\n border-bottom-width: 0;\\n padding: 0.6em 1em; }\\n header \\u003e span:first-child {\\n border-left-width: 1px; }\\n header \\u003e span.selected {\\n background-color: var(--dd-background-color-selected);\\n color: white; }\\n\\n#main {\\n border: 1px solid var(--dd-background-color-selected);\\n flex-grow: 1;\\n padding: 1em; }\\n\\u003c/style\\u003e\\n\\t\\u003cheader id=\\\"header\\\"\\u003e\\n\\t\\u003c/header\\u003e\\n\\t\\u003cdiv id=\\\"main\\\"\\u003e\\n\\t\\u003cslot id=\\\"slot\\\"\\u003e\\n\\t\\u003c/slot\\u003e\\u003c/div\\u003e\\n\\u003c/template\\u003e\\n\",\"DojosEditor\":\"\\u003cdiv\\u003e\\n\\t\\u003cbutton data-set=\\\"addDojo\\\" class=\\\"button\\\"\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eNew Dojo\\u003c/span\\u003e\\u003c/button\\u003e\\n\\t\\u003cdiv data-set=\\\"form\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003cdiv data-set=\\\"list\\\"\\u003e \\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"FormsTabContainer\":\"\\u003cdojo-tabs id=\\\"tabs\\\" data-id=\\\"FormsTabContainer.html tabs\\\"\\u003e\\n\\t\\u003cdiv tab-title=\\\"Student\\\"\\u003e\\n\\t\\tStudent tab defined in FormsTabContainer.html\\n\\t\\u003c/div\\u003e\\n\\u003c/dojo-tabs\\u003e\\n\",\"FormsTabPanel\":\"\\u003cdiv\\u003e\\n\\t\\u003cul\\u003e\\n\\t\\t\\u003cli class=\\\"tabs-title\\\" data-set=\\\"tab\\\"\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"a\\\"\\u003e-\\u003c/a\\u003e\\u003c/li\\u003e\\n\\t\\u003c/ul\\u003e\\n\\t\\u003cdiv data-set=\\\"panel\\\" class=\\\"tabs-panel\\\" id=\\\"defaultForm\\\"\\u003e\\n\\t\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"LoginForm\":\"\\u003cdiv class=\\\"login-form-container\\\"\\u003e\\n\\u003ch1\\u003eDojo Deshi\\u003c/h1\\u003e\\n\\u003cdiv class=\\\"callout\\\" data-set=\\\"callout\\\"\\u003e\\n\\u003c/div\\u003e\\n\\u003cform method=\\\"post\\\" action=\\\"/login\\\" class=\\\"form\\\"\\u003e\\n\\u003clabel\\u003eEmail or Mobile\\n\\u003cinput type=\\\"text\\\" name=\\\"identity\\\" placeholder=\\\"Email address or mobile number in international format\\\" data-set=\\\"identity\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003cdiv data-set=\\\"passwordContainer\\\"\\u003e\\n\\u003clabel\\u003ePassword\\n\\u003cinput type=\\\"password\\\" name=\\\"password\\\" data-set=\\\"password\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003c/div\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\n\\u003cdiv class=\\\"small-6 columns\\\"\\u003e\\n\\u003cbutton data-set=\\\"altAction1\\\" class=\\\"hollow button\\\"\\u003eRegister\\u003c/button\\u003e\\n\\u003cbutton class=\\\"hollow button\\\" data-set=\\\"altAction2\\\"\\u003eForgotten\\u003c/button\\u003e\\n\\u003c/div\\u003e\\n\\u003cdiv class=\\\"small-6 columns\\\"\\u003e\\u003cbutton class=\\\"button float-right\\\" data-set=\\\"actionButton\\\"\\u003eLogin\\u003c/button\\u003e\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003c/form\\u003e\\n\\u003c/div\\u003e\\n\",\"MenuItem\":\"\\u003cdiv class=\\\"MenuItem\\\"\\u003e\\n\\t\\u003c!-- styling in TopMenu.scss --\\u003e\\n\\t\\u003cspan class=\\\"title\\\" data-set=\\\"title\\\" data-event=\\\"click\\\"\\u003etitle\\u003c/span\\u003e\\n\\t\\u003cdiv class=\\\"dropdown\\\" data-set=\\\"dropdown\\\"\\u003e\\n\\t\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"MessageForm\":\"\\u003cdiv class=\\\"reveal\\\" data-reveal=\\\"\\\"\\u003e\\n \\u003cbutton type=\\\"button\\\" class=\\\"close-button\\\" data-close=\\\"\\\" aria-label=\\\"Close reveal\\\"\\u003e\\n \\u003cspan aria-hidden=\\\"true\\\"\\u003e\\u0026times;\\u003c/span\\u003e\\n \\u003c/button\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\n\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003cform id=\\\"message-form\\\"\\u003e\\n\\u003clabel\\u003e\\u003cinput type=\\\"checkbox\\\" data-set=\\\"smsMessage\\\" data-event=\\\"click:smsOrEmailToggle\\\"/\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eSend as SMS\\u003c/span\\u003e\\u003c/label\\u003e\\n\\u003cdiv data-set=\\\"titleDiv\\\"\\u003e\\n\\u003clabel\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eTitle\\u003c/span\\u003e\\n\\u003cinput type=\\\"text\\\" data-set=\\\"msgTitle\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003c/div\\u003e\\n\\u003clabel\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eMessage\\u003c/span\\u003e\\n\\u003ctextarea rows=\\\"3\\\" cols=\\\"30\\\" data-set=\\\"msgText\\\" data-event=\\\"input:messageChange\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003cdiv class=\\\"characterCount\\\" data-set=\\\"characterCount\\\"\\u003e(0 chars)\\u003c/div\\u003e\\n\\u003cbutton class=\\\"button\\\" data-i18n=\\\"\\\" data-event=\\\"click:Send\\\"\\u003eSend\\u003c/button\\u003e\\n\\u003c/form\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"PagedTablePaginator\":\"\\u003cul role=\\\"navigation\\\" aria-label=\\\"Pagination\\\" class=\\\"pagination\\\"\\u003e\\n\\u003c/ul\\u003e\\n\",\"Pager\":\"\\u003ctemplate\\u003e\\n\\u003cstyle\\u003e:host {\\n display: grid;\\n grid-template-columns: repeat(2, 2.4em) 1fr repeat(2, 2.4em);\\n gap: 0.4em;\\n align-items: center;\\n margin-bottom: 0.4em; }\\n\\nsvg {\\n width: 1.4em; }\\n svg g {\\n stroke: var(--dd-border-color);\\n fill: var(--dd-border-color); }\\n\\ninput {\\n width: 4em;\\n padding: 0.2em 0.4em; }\\n\\nbutton {\\n border: 1px solid var(--dd-border-color);\\n padding: 0.4em;\\n background-color: transparent;\\n height: 2.4em;\\n width: 2.4em;\\n display: flex;\\n flex-direction: row;\\n justify-content: center;\\n align-items: center;\\n cursor: pointer; }\\n button:hover {\\n background-color: var(--dd-background-color-hover);\\n color: var(--dd-color-hover); }\\n\\nbutton:disabled svg \\u003e g {\\n stroke: #ccc;\\n fill: #ccc; }\\n\\u003c/style\\u003e\\n\\u003cbutton id=\\\"first\\\" data-event=\\\"click:first\\\"\\u003e\\u003csvg viewBox=\\\"0 0 10 10\\\"\\u003e\\u003cg\\u003e\\u003cpath d=\\\"M8 2L4 5L8 8M2 2L2 8\\\"/\\u003e\\u003c/g\\u003e\\u003c/svg\\u003e\\u003c/button\\u003e\\n\\u003cbutton id=\\\"previous\\\" data-event=\\\"click:previous\\\"\\u003e\\u003csvg viewBox=\\\"0 0 10 10\\\"\\u003e\\u003cg\\u003e\\u003cpath d=\\\"M7 2L3 5L7 8\\\"/\\u003e\\u003c/g\\u003e\\u003c/svg\\u003e\\u003c/button\\u003e\\n\\u003cspan class=\\\"page-count\\\"\\u003ePage \\u003cinput type=\\\"number\\\" id=\\\"page\\\" width=\\\"5\\\" min=\\\"1\\\" data-event=\\\"change:enterPageCallback\\\"/\\u003e of \\u003cspan id=\\\"pageCount\\\"\\u003e-\\u003c/span\\u003e (\\u003cspan id=\\\"recordCount\\\"\\u003e \\u003c/span\\u003e records.)\\u003c/span\\u003e\\n\\u003cbutton id=\\\"next\\\" data-event=\\\"click:next\\\"\\u003e\\u003csvg viewBox=\\\"0 0 10 10\\\"\\u003e\\u003cg\\u003e\\u003cpath d=\\\"M3 2L7 5L3 8\\\"/\\u003e\\u003c/g\\u003e\\u003c/svg\\u003e\\u003c/button\\u003e\\n\\u003cbutton data-event=\\\"click:last\\\" id=\\\"last\\\"\\u003e\\u003csvg viewBox=\\\"0 0 10 10\\\"\\u003e\\u003cg\\u003e\\u003cpath d=\\\"M2 2L6 5L2 8M8 2L8 8\\\"/\\u003e\\u003c/g\\u003e\\u003c/svg\\u003e\\u003c/button\\u003e\\n\\u003c/template\\u003e\\n\",\"PaginatorLink\":\"\\u003cul\\u003e\\n\\t\\u003cli data-set=\\\"this\\\"\\u003e\\n\\t\\t\\u003ca href=\\\"#\\\" data-set=\\\"active\\\"/\\u003e\\n\\t\\t\\u003cspan data-set=\\\"inactive\\\"/\\u003e\\n\\t\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\",\"PresentStudentComponent\":\"\\u003ctable\\u003e\\n\\u003ctr data-set=\\\"this\\\"\\u003e\\n\\u003ctd data-set=\\\"Surname\\\"/\\u003e\\n\\u003ctd data-set=\\\"Firstname\\\"/\\u003e\\n\\u003ctd\\u003e\\u003cselect data-set=\\\"attendType\\\"/\\u003e\\u003c/td\\u003e\\n\\u003ctd\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"remove\\\" class=\\\"fa fa-minus\\\"/\\u003e\\u003c/td\\u003e\\n\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"PresentStudentList\":\"\\u003ctable\\u003e\\n\\u003cthead\\u003e\\u003ctr\\u003e\\u003cth\\u003eSurname\\u003c/th\\u003e\\u003cth\\u003eFirstname\\u003c/th\\u003e\\u003cth/\\u003e\\u003cth/\\u003e\\u003c/tr\\u003e\\u003c/thead\\u003e\\n\\u003ctbody data-set=\\\"tbody\\\"\\u003e\\n\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\",\"StudentAttendanceSummaryCard\":\"\\u003cdiv class=\\\"student-attendance-summary-card\\\"\\u003e\\n\\t\\u003cdiv class=\\\"attendance-type\\\" data-set=\\\"attendanceType\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003cdiv data-set=\\\"attendanceCount\\\" class=\\\"attendance-count\\\"\\u003e \\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"StudentInfoForm\":\"\\u003cdojo-popup\\u003e\\n\\t\\u003cdiv slot=\\\"title\\\" data-set=\\\"title\\\"\\u003eTitle here\\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"info-form\\\"\\u003e\\n\\t\\t\\u003cdiv\\u003e\\n\\t\\t\\t\\u003cspan\\u003eSurname\\u003c/span\\u003e\\u003cspan data-set=\\\"Surname\\\"/\\u003e\\n\\t\\t\\u003c/div\\u003e\\n\\t\\t\\u003cdiv\\u003e\\u003cspan\\u003eFirstname\\u003c/span\\u003e\\u003cspan data-set=\\\"Firstname\\\"\\u003e \\u003c/span\\u003e\\u003c/div\\u003e\\n\\t \\u003cdiv\\u003e\\u003cspan\\u003eMobile\\u003c/span\\u003e\\u003cspan\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"Mobile\\\"\\u003e \\u003c/a\\u003e\\u003c/span\\u003e\\u003c/div\\u003e\\n\\t\\t\\u003cdiv\\u003e\\u003cspan\\u003eEmail\\u003c/span\\u003e\\u003cspan\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"Email\\\"\\u003e \\u003c/a\\u003e\\u003c/span\\u003e\\u003c/div\\u003e\\n\\t\\t\\u003cdiv\\u003e\\u003cspan\\u003eLast Grading\\u003c/span\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"LastGrading\\\"\\u003e \\u003c/a\\u003e\\u003c/div\\u003e\\n\\t\\t\\u003cdiv\\u003e\\u003cspan\\u003eClasses since last Grading\\u003c/span\\u003e\\u003cspan data-set=\\\"ClassesSinceLastGrading\\\"/\\u003e\\u003c/div\\u003e\\n\\t\\u003c/div\\u003e\\n\\t\\u003cdiv\\u003eLast 30 days\\u003c/div\\u003e\\n\\t\\u003cdiv data-set=\\\"Attendance\\\" class=\\\"info-attendance-summary\\\"\\u003e \\u003c/div\\u003e\\n\\u003c/dojo-popup\\u003e\\n\",\"StudentListController\":\"\\u003cdiv\\u003e\\n\\u003c!-- \\t\\u003cdiv class=\\\"float-right-toolbar\\\"\\u003e\\n\\t\\t\\u003cdiv\\u003e\\u003ca href=\\\"#\\\" data-event=\\\"click:messageClick\\\" class=\\\"fa fa-paper-plane-o\\\"\\u003e\\u003c/a\\u003e\\u003c/div\\u003e\\n\\t\\u003c/div\\u003e\\n --\\u003e\\t\\n \\t\\u003cdiv data-set=\\\"studentTable\\\"\\u003e\\n\\t\\u003c/div\\u003e\\n\\t\\u003cdiv\\u003e\\n\\t\\t\\u003cbutton data-i18n=\\\"\\\" data-event=\\\"click:addStudent\\\" class=\\\"button\\\"\\u003eAdd Student\\u003c/button\\u003e\\n\\t\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"StudentListTable\":\"\\u003ctable class=\\\"table\\\"\\u003e\\n\\u003cthead\\u003e\\n\\u003ctr\\u003e\\u003cth\\u003e\\u003ca data-open=\\\"messageForm\\\" class=\\\"fa fa-paper-plane-o\\\"/\\u003e\\u003c/th\\u003e\\u003cth\\u003eSurname\\u003c/th\\u003e\\u003cth\\u003eFirstname\\u003c/th\\u003e\\u003cth\\u003eEmail\\u003c/th\\u003e\\u003cth\\u003eMobile\\u003c/th\\u003e\\u003cth\\u003eStatus\\u003c/th\\u003e\\u003cth/\\u003e\\u003cth/\\u003e\\u003c/tr\\u003e\\n\\u003c/thead\\u003e\\n\\u003ctbody data-set=\\\"tbody\\\"\\u003e\\n\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\",\"StudentListTable2\":\"\\u003cdiv class=\\\"student-list-table\\\"\\u003e\\n\\u003cdiv data-set=\\\"table\\\" class=\\\"student-table\\\"\\u003e\\n\\u003c/div\\u003e\\n\\u003cdiv class=\\\"student-info-form\\\" data-set=\\\"infoForm\\\"\\u003e \\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"StudentListTableRow\":\"\\u003ctable\\u003e\\n\\u003ctr data-set=\\\"this\\\" class=\\\"hover-row\\\"\\u003e\\n\\u003ctd\\u003e\\u003cinput type=\\\"checkbox\\\" value=\\\"{{.Id}}\\\" data-student-select=\\\"\\\" data-event=\\\"click:selectClick\\\" data-set=\\\"selectCheckbox\\\"/\\u003e\\u003c/td\\u003e\\n\\u003ctd data-set=\\\"Surname\\\"/\\u003e\\n\\u003ctd data-set=\\\"Firstname\\\"/\\u003e\\n\\u003ctd\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"Email\\\"\\u003e#\\u003c/a\\u003e\\u003c/td\\u003e\\n\\u003ctd\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"Mobile\\\"\\u003e#\\u003c/a\\u003e\\u003c/td\\u003e\\n\\u003ctd data-set=\\\"State\\\" data-event=\\\"click:stateClick\\\"/\\u003e\\n\\u003ctd data-set=\\\"Attendance\\\"/\\u003e\\n\\u003ctd data-event=\\\"click:editClick\\\"\\u003e\\u003ca href=\\\"#\\\"\\u003e\\u003ci class=\\\"fa fa-pencil\\\"/\\u003e\\u003c/a\\u003e\\u003c/td\\u003e\\n\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"StudentListTableRow2\":\"\\u003cdiv class=\\\"student-table-row hover-row\\\"\\u003e\\n\\t\\u003cdiv class=\\\"student-table-checkbox\\\"\\u003e\\u003cinput data-set=\\\"selectCheckbox\\\" type=\\\"checkbox\\\" value=\\\"{{.Id}}\\\" data-student-select=\\\"\\\" data-event=\\\"click:selectClick\\\"/\\u003e\\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"student-table-surname\\\" data-set=\\\"Surname\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"student-table-firstname\\\" data-set=\\\"Firstname\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"student-table-email\\\"\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"Email\\\"\\u003e#\\u003c/a\\u003e\\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"student-table-mobile\\\"\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"Mobile\\\"\\u003e#\\u003c/a\\u003e\\u003c/div\\u003e\\n\\t\\u003cdiv data-set=\\\"State\\\" data-event=\\\"click:stateClick\\\" class=\\\"student-table-state\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003cdiv data-set=\\\"Attendance\\\" class=\\\"student-attendance-map\\\"\\u003e \\u003c/div\\u003e\\n\\t\\u003cdiv data-event=\\\"click:editClick\\\" class=\\\"student-table-click\\\"\\u003e\\u003ca href=\\\"#\\\"\\u003eEDIT\\u003c/a\\u003e\\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"student-table-click\\\" data-event=\\\"click:infoClick\\\"\\u003e\\u003ca href=\\\"#\\\"\\u003eINFO\\u003c/a\\u003e\\u003c/div\\u003e\\n\\t\\u003cdiv class=\\\"student-table-click\\\" data-event=\\\"click:vcardClick\\\"\\u003e\\u003ca href=\\\"#\\\"\\u003eVCD\\u003c/a\\u003e\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"TechniqueEditForm\":\"\\u003cdiv class=\\\"technique-edit\\\"\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003cbutton class=\\\"button\\\" data-set=\\\"newButton\\\"\\u003eNew Technique\\u003c/button\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003cdiv class=\\\"technique-edit-form\\\" data-set=\\\"form\\\"\\u003e\\n\\u003cdiv data-set=\\\"closeButton\\\" class=\\\"form-close fa fa-close\\\"\\u003e \\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003cform method=\\\"post\\\" class=\\\"form\\\"\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003cul class=\\\"tabs\\\" data-tabs=\\\"\\\" id=\\\"techniques-tabs\\\"\\u003e\\n\\t\\u003cli class=\\\"tabs-title is-active\\\"\\u003e\\u003ca href=\\\"#tech-details\\\" aria-selected=\\\"true\\\"\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eTechnique\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\n\\t\\u003cli class=\\\"tabs-title\\\"\\u003e\\u003ca href=\\\"#tech-merge\\\"\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eMerge\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003cdiv data-tabs-content=\\\"techniques-tabs\\\" class=\\\"tabs-content\\\"\\u003e\\n\\u003cdiv class=\\\"tabs-panel is-active\\\" id=\\\"tech-details\\\"\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003clabel\\u003eTechnique\\n\\u003cinput type=\\\"text\\\" name=\\\"name\\\" data-set=\\\"name\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003clabel\\u003eNotes\\u003ctextarea rows=\\\"3\\\" wordwrap=\\\"true\\\" data-set=\\\"notes\\\"/\\u003e\\n\\u003c/label\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003cbutton class=\\\"button\\\" data-set=\\\"saveButton\\\"\\u003eSave\\u003c/button\\u003e\\n\\u003cbutton class=\\\"hollow button float-right fa fa-trash\\\" data-set=\\\"deleteButton\\\"/\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\\u003cdiv class=\\\"tabs-panel\\\" id=\\\"tech-merge\\\"\\u003e\\n\\u003cp\\u003eYou can merge techniques, making all references to the other techniques references to this technique. Choose the techniques to merge from the list below.\\u003c/p\\u003e\\n\\u003cdiv class=\\\"mergelist\\\" data-set=\\\"MergeList\\\"\\u003e\\n\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\\u003c/form\\u003e\\n\\u003c/div\\u003e\\n\\n\",\"TechniquePagedTable\":\"\\u003cdiv class=\\\"paged-table\\\"\\u003e\\n\\u003cdiv class=\\\"paged-table-pagination\\\" data-set=\\\"paginationHead\\\"\\u003e \\u003c/div\\u003e\\n\\u003ctable class=\\\"table\\\" style=\\\"width:100%;\\\"\\u003e\\n\\t\\u003cthead\\u003e\\n\\t\\t\\u003ctr\\u003e\\u003cth\\u003eTechnique\\u003c/th\\u003e\\u003c/tr\\u003e\\n\\t\\u003c/thead\\u003e\\n\\t\\u003ctbody data-set=\\\"tbody\\\"\\u003e\\n\\t\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\\u003cdiv class=\\\"paged-table-pagination\\\" data-set=\\\"paginationFoot\\\"\\u003e \\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\\n\",\"TechniquePagedTableRow\":\"\\u003ctable\\u003e\\n\\t\\u003ctr data-set=\\\"this\\\" class=\\\"hover-row\\\"\\u003e\\n\\t\\t\\u003ctd\\u003e\\u003cdiv data-set=\\\"name\\\"\\u003e--\\u003c/div\\u003e\\u003c/td\\u003e\\n\\t\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"TechniquesFilter\":\"\\u003cdiv\\u003e\\n\\t\\u003cinput class=\\\"input\\\" data-set=\\\"input\\\" data-event=\\\"input:filter\\\" type=\\\"text\\\"/\\u003e\\n\\u003c/div\\u003e\\n\",\"TechniquesList\":\"\\u003cdiv class=\\\"techs-table\\\"\\u003e\\n\\u003ctable class=\\\"table\\\"\\u003e\\n\\t\\t\\u003ctbody data-set=\\\"tbody\\\"\\u003e\\n\\t\\t\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\\u003c/div\\u003e\\n\",\"TechniquesListRow\":\"\\u003ctable\\u003e\\n\\t\\u003ctbody\\u003e\\n\\t\\t\\u003ctr data-set=\\\"this\\\" class=\\\"hover-row\\\"\\u003e\\n\\t\\t\\t\\u003ctd data-set=\\\"name\\\"/\\u003e\\n\\t\\t\\u003c/tr\\u003e\\n\\t\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\",\"TopMenu\":\"\\u003ctemplate\\u003e\\n\\t\\u003cstyle\\u003e:host {\\n display: flex;\\n flex-direction: row;\\n justify-content: space-between;\\n align-items: stretch;\\n gap: 1em;\\n position: relative;\\n background-color: #092235;\\n color: white;\\n --link-color: #092235; }\\n\\n:host \\u003e * {\\n padding: 1em; }\\n\\ndiv.left, div.right {\\n display: flex;\\n flex-direction: row;\\n justify-content: flex-start;\\n align-items: baseline;\\n gap: 1em; }\\n\\ndiv.right {\\n justify-content: flex-end; }\\n\\n.MenuItem {\\n position: relative;\\n z-index: 10; }\\n .MenuItem \\u003e .dropdown {\\n padding: 1em;\\n display: none;\\n flex-direction: column;\\n justify-content: stretch;\\n align-items: flex-start;\\n position: absolute;\\n top: 1.5em;\\n left: 1em;\\n background-color: rgba(255, 255, 255, 0.96);\\n border: 1px solid #eee;\\n filter: drop-shadow(3px 3px 3px rgba(0, 0, 0, 0.5)); }\\n .MenuItem \\u003e .dropdown a {\\n color: var(--link-color); }\\n .MenuItem:hover \\u003e .dropdown, .MenuItem.show \\u003e .dropdown {\\n display: flex; }\\n\\na {\\n text-decoration: none;\\n color: white; }\\n\\u003c/style\\u003e\\n\\u003c/template\\u003e\\n\",\"classrecord_student_attendance/StudentAttendanceCard\":\"\\u003cdiv data-event=\\\"click:\\\" data-set=\\\"StyleDiv\\\" class=\\\"card\\\"\\u003e\\n\\t\\t\\u003cdiv class=\\\"name\\\" data-set=\\\"Name\\\"\\u003e \\u003c/div\\u003e\\n\\t\\t\\u003ca href=\\\"#\\\" class=\\\"edit-link\\\" data-set=\\\"EditLink\\\"\\u003e\\u003csvg viewBox=\\\"0 0 4 10\\\"\\u003e\\n\\t\\t\\t\\u003cg stroke-width=\\\"2\\\" fill=\\\"transparent\\\" stroke=\\\"#777\\\" stroke-linecap=\\\"round\\\"\\u003e\\u003cpath d=\\\"M2 2L3 2M2 5L3 5M2 8L3 8\\\"/\\u003e\\u003c/g\\u003e\\n\\t\\t\\u003c/svg\\u003e\\u003c/a\\u003e\\n\\t\\t\\u003cdiv class=\\\"attendance\\\" data-set=\\\"Attendance\\\"\\u003e \\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"classrecord_student_attendance/StudentAttendanceTable\":\"\\u003ctemplate class=\\\"attendance-table\\\"\\u003e\\n\\t\\u003cstyle\\u003e:host {\\n display: flex;\\n flex-direction: column;\\n justify-content: space-between;\\n align-items: stretch; }\\n\\n#table {\\n display: grid;\\n grid-template-columns: repeat(auto-fill, minmax(auto, 12em));\\n gap: 1em; }\\n @media screen and (max-width: 800px) {\\n #table {\\n font-size: 0.8em; } }\\n #table .card {\\n display: grid;\\n grid-template-columns: 1fr 2em;\\n border: 1px solid #999;\\n padding: 0.4em; }\\n #table .card .attendance {\\n grid-column: 1/3; }\\n #table .card \\u003e .attendance {\\n font-size: 0.8em;\\n text-align: right;\\n align-self: end; }\\n #table .card \\u003e .name {\\n font-size: 1.2em; }\\n #table .card \\u003e .edit-link {\\n justify-self: flex-end; }\\n #table .card \\u003e .edit-link svg {\\n height: 1.4em; }\\n\\u003c/style\\u003e\\n\\t\\u003cdiv id=\\\"table\\\"\\u003e\\n\\t\\u003c/div\\u003e\\n\\u003c/template\\u003e\\n\",\"dojo-list\":\"\\u003cdiv class=\\\"dojo-list\\\"\\u003e\\n\\u003cdiv\\u003eYou have {{ndojos}} dojos.\\u003c/div\\u003e\\n\\u003cdiv\\u003e\\u003ca data-set=\\\"addDojo\\\" href=\\\"#\\\"\\u003eAdd a Dojo\\u003c/a\\u003e\\u003c/div\\u003e\\n\\u003ctable class=\\\"table\\\"\\u003e\\n\\u003c/table\\u003e\\n\\u003c/div\\u003e\\n\",\"formal/FormEditor\":\"\\u003cdiv class=\\\"formal-form-editor edit-form\\\"\\u003e\\n\\u003cdiv data-event=\\\"click:close\\\" class=\\\"form-close fa fa-close\\\"\\u003e \\u003c/div\\u003e\\u0026nbsp;\\u003c/div\\u003e\\n\\n\",\"formal/FormGenerator\":\"\\u003cdiv class=\\\"formal-container\\\"\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\n\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003cform data-set=\\\"form\\\"\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\n\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003c/form\\u003e\\n\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\\u003cdiv class=\\\"row\\\"\\u003e\\n\\u003cdiv class=\\\"small-12 columns\\\"\\u003e\\n\\u003cbutton class=\\\"button\\\" data-set=\\\"saveButton\\\" data-event=\\\"click:save\\\"\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eSave\\u003c/span\\u003e\\u003c/button\\u003e\\n\\u003cbutton class=\\\"hollow button fa fa-trash\\\" data-set=\\\"deleteButton\\\" data-event=\\\"click:delete\\\"/\\u003e\\n\\u003cbutton class=\\\"hollow button float-right fa fa-refresh\\\" data-event=\\\"click:reset\\\" data-set=\\\"resetButton\\\"/\\u003e\\n\\u003c/div\\u003e\\u003c/div\\u003e\\n\\u003c/div\\u003e\\n\",\"formal/FormsList\":\"\\u003cdiv class=\\\"forms-list\\\"\\u003e\\n\\u003ctable class=\\\"table\\\"\\u003e\\n\\t\\u003cthead\\u003e\\u003ctr\\u003e\\n\\t\\u003cth\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eName\\u003c/span\\u003e\\u003c/th\\u003e\\n\\t\\u003cth\\u003e\\u003cspan data-i18n=\\\"\\\"\\u003eRefers To\\u003c/span\\u003e\\u003c/th\\u003e\\n\\t\\u003c/tr\\u003e\\u003c/thead\\u003e\\n\\t\\u003ctbody data-set=\\\"tbody\\\"\\u003e\\n\\t\\u003c/tbody\\u003e\\n\\u003c/table\\u003e\\n\\u003cbutton data-event=\\\"click:newForm\\\" data-i18n=\\\"\\\" class=\\\"button\\\"\\u003eNew Form\\u003c/button\\u003e\\n\\u003c/div\\u003e\\n\",\"formal/FormsListItem\":\"\\u003ctable\\u003e\\n\\t\\u003ctr class=\\\"hover-row\\\" data-event=\\\"click:click\\\" data-set=\\\"this\\\"\\u003e\\n\\t\\t\\u003ctd data-set=\\\"Name\\\"/\\u003e\\n\\t\\t\\u003ctd data-set=\\\"RefType\\\"/\\u003e\\n\\t\\u003c/tr\\u003e\\n\\u003c/table\\u003e\\n\",\"persona-loggedin\":\"\\u003cli class=\\\"has-submenu\\\"\\u003e\\n\\t\\u003ca href=\\\"#\\\"\\u003e{{user.Email}}\\u003c/a\\u003e\\n\\t\\u003cul class=\\\"submenu menu vertical\\\" data-submenu=\\\"\\\"\\u003e\\n\\t\\t\\u003cli\\u003e\\u003ca href=\\\"#\\\" data-set=\\\"btn\\\"\\u003e{{logout}}\\u003c/a\\u003e\\u003c/li\\u003e\\n\\t\\u003c/ul\\u003e\\n\\u003c/li\\u003e\\n\\n\",\"persona-loggedout\":\"\\u003cli\\u003e\\u003cbutton id=\\\"loginout\\\" data-set=\\\"btn\\\"\\u003e{{login}}\\u003c/button\\u003e\\u003c/li\\u003e\\n\",\"test\":\"\\u003cdiv\\u003eTest\\u003c/div\\u003e\\n\"};\n\n\tlet mk = function(k, html) {\n\t\tlet el = document.createElement('div');\n\t\tel.innerHTML = html;\n\t\t//console.log(\"mk(\",k,\") html = \", html);\n\n\t\tlet c = el.firstElementChild;\n\t\twhile ((null!=c) && (Node.ELEMENT_NODE!=c.nodeType)) {\n\t\t\tc = c.nextSibling;\n\t\t}\n\t\tif (null==c) {\n\t\t\tconsole.error(\"FAILED TO FIND ANY ELEMENT CHILD OF \", k, \":\", el)\n\t\t\treturn mk('error', 'No child elements in template ' + k + '');\n\t\t}\n\t\tel = c;\n\t\tif ('function'==typeof el.querySelector) {\n\t\t\tlet et = el.querySelector('[data-set=\"this\"]');\n\t\t\tif (null!=et) {\n\t\t\t\tel = et;\n\t\t\t\tel.removeAttribute('data-set');\n\t\t\t}\n\t\t}\n\t\treturn el;\n\t}\n\n\treturn function(t, dest={}) {\n\t\t// Return a deep copy of the node, created on first use\n\t\tlet n = templates[t];\n\t\tif ('string'==typeof(n)) {\t\t\t\n\t\t\tn = mk(t, n);\n\t\t\ttemplates[t] = n;\n\t\t}\n\t\tif ('undefined'==typeof n) {\n\t\t\tconsole.error('Failed to find template ' + t);\n\t\t\treturn [false,false];\n\t\t}\n\t\tif (n.content) {\n\t\t\tn = n.content.cloneNode(true);\n\t\t} else {\n\t\t\tn = n.cloneNode(true);\n\t\t}\n\t\ttry {\n\t\t\tfor (let attr of ['id', 'data-set']) {\n\t\t\t\tlet nodes = Array.from(n.querySelectorAll('[' + attr + ']'));\n\t\t\t\tif ('function'==typeof n.hasAttribute && n.hasAttribute(attr)) {\n\t\t\t\t\tnodes.unshift(n);\n\t\t\t\t}\n\t\t\t\tfor (let el of nodes) {\n\t\t\t\t\tlet a = el.getAttribute(attr);\n\t\t\t\t\tif (a.substr(0,1)=='$') {\n\t\t\t\t\t\ta = a.substr(1);\n\t\t\t\t\t\tel = jQuery(el);\n\t\t\t\t\t\tel.setAttribute(attr, a);\n\t\t\t\t\t}\n\t\t\t\t\tdest[a] = el;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(\"ERROR in DTemplate(\" + t + \"): \", err);\n\t\t\tdebugger;\n\t\t}\n\t\treturn [n,dest];\n\t}\n})();\n", "import {DojoTemplates} from './DojoTemplates.js';\n\nclass SelectList {\n\tconstructor(el) {\n\t\tthis.el = el;\n\t}\n\tadd(value, display) {\n\t\tlet s = document.createElement(`span`);\n\t\ts.innerHTML = display;\n\t\ts.setAttribute(`data-value`, value);\n\t\ts.addEventListener(`click`, evt=>{\n\t\t\tevt.preventDefault();\n\t\t\tthis.el.dispatchEvent(new CustomEvent(`select-item-selected`, {\n\t\t\t\tcomposed: true,\n\t\t\t\tbubbles: false,\n\t\t\t\tdetail: value,\n\t\t\t}));\n\t\t});\n\t\tthis.el.appendChild(s);\n\t}\n\tempty() {\n\t\tthis.el.innerHTML = ``;\n\t}\n}\n\nclass AutoComplete extends HTMLElement {\n\tconstructor() {\n\t\tsuper();\n\t\t[this.el, this.$] = DojoTemplates(`AutoComplete`);\n\t\tthis.attachShadow({mode:`open`});\n\t\tthis.shadowRoot.appendChild(this.el);\n\n\t\tthis._searchingFor = false;\n\n\t\tthis.$.input.addEventListener(`keyup`, evt=>this.keyDown(evt));\n\t\tthis.selectList = new SelectList(this.$.items);\n\n\t\tthis.$.items.addEventListener(`select-item-selected`, evt=>{\n\t\t\tconsole.log(`selected item: `, evt.detail);\n\t\t\tthis.$.input.value = evt.detail;\n\t\t\tthis.postInput();\n\t\t});\n\t}\n\tconnectedCallback() {\n\t}\n\tkeyDown(evt) {\n\t\tif (evt.keyCode==13) {\n\t\t\tevt.preventDefault();\n\t\t\tthis.postInput();\n\t\t\treturn;\n\t\t}\n\t\tif (3