diff --git a/backup/bootstrap.min.js b/backup/bootstrap.min.js new file mode 100644 index 0000000..aed031f --- /dev/null +++ b/backup/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.0.2 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){if(t&&t.__esModule)return t;var e=Object.create(null);return t&&Object.keys(t).forEach((function(s){if("default"!==s){var i=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:function(){return t[s]}})}})),e.default=t,Object.freeze(e)}var s=e(t);const i={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const s=[];let i=t.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(e)&&s.push(i),i=i.parentNode;return s},prev(t,e){let s=t.previousElementSibling;for(;s;){if(s.matches(e))return[s];s=s.previousElementSibling}return[]},next(t,e){let s=t.nextElementSibling;for(;s;){if(s.matches(e))return[s];s=s.nextElementSibling}return[]}},n=t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t},o=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let s=t.getAttribute("href");if(!s||!s.includes("#")&&!s.startsWith("."))return null;s.includes("#")&&!s.startsWith("#")&&(s="#"+s.split("#")[1]),e=s&&"#"!==s?s.trim():null}return e},r=t=>{const e=o(t);return e&&document.querySelector(e)?e:null},a=t=>{const e=o(t);return e?document.querySelector(e):null},l=t=>{t.dispatchEvent(new Event("transitionend"))},c=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),h=t=>c(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?i.findOne(t):null,d=(t,e,s)=>{Object.keys(s).forEach(i=>{const n=s[i],o=e[i],r=o&&c(o)?"element":null==(a=o)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(n).test(r))throw new TypeError(`${t.toUpperCase()}: Option "${i}" provided type "${r}" but expected type "${n}".`)})},u=t=>!(!c(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),g=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),p=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?p(t.parentNode):null},f=()=>{},m=t=>t.offsetHeight,_=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},b=[],v=()=>"rtl"===document.documentElement.dir,y=t=>{var e;e=()=>{const e=_();if(e){const s=t.NAME,i=e.fn[s];e.fn[s]=t.jQueryInterface,e.fn[s].Constructor=t,e.fn[s].noConflict=()=>(e.fn[s]=i,t.jQueryInterface)}},"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{b.forEach(t=>t())}),b.push(e)):e()},w=t=>{"function"==typeof t&&t()},E=(t,e,s=!0)=>{if(!s)return void w(t);const i=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:s}=window.getComputedStyle(t);const i=Number.parseFloat(e),n=Number.parseFloat(s);return i||n?(e=e.split(",")[0],s=s.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(s))):0})(e)+5;let n=!1;const o=({target:s})=>{s===e&&(n=!0,e.removeEventListener("transitionend",o),w(t))};e.addEventListener("transitionend",o),setTimeout(()=>{n||l(e)},i)},A=(t,e,s,i)=>{let n=t.indexOf(e);if(-1===n)return t[!s&&i?t.length-1:0];const o=t.length;return n+=s?1:-1,i&&(n=(n+o)%o),t[Math.max(0,Math.min(n,o-1))]},T=/[^.]*(?=\..*)\.|.*/,C=/\..*/,k=/::\d+$/,L={};let O=1;const D={mouseenter:"mouseover",mouseleave:"mouseout"},I=/^(mouseenter|mouseleave)/i,N=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function S(t,e){return e&&`${e}::${O++}`||t.uidEvent||O++}function x(t){const e=S(t);return t.uidEvent=e,L[e]=L[e]||{},L[e]}function M(t,e,s=null){const i=Object.keys(t);for(let n=0,o=i.length;nfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};i?i=t(i):s=t(s)}const[o,r,a]=P(e,s,i),l=x(t),c=l[a]||(l[a]={}),h=M(c,r,o?s:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=S(r,e.replace(T,"")),u=o?function(t,e,s){return function i(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return n.delegateTarget=r,i.oneOff&&B.off(t,n.type,e,s),s.apply(r,[n]);return null}}(t,s,i):function(t,e){return function s(i){return i.delegateTarget=t,s.oneOff&&B.off(t,i.type,e),e.apply(t,[i])}}(t,s);u.delegationSelector=o?s:null,u.originalHandler=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function H(t,e,s,i,n){const o=M(e[s],i,n);o&&(t.removeEventListener(s,o,Boolean(n)),delete e[s][o.uidEvent])}function R(t){return t=t.replace(C,""),D[t]||t}const B={on(t,e,s,i){j(t,e,s,i,!1)},one(t,e,s,i){j(t,e,s,i,!0)},off(t,e,s,i){if("string"!=typeof e||!t)return;const[n,o,r]=P(e,s,i),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void H(t,l,r,o,n?s:null)}c&&Object.keys(l).forEach(s=>{!function(t,e,s,i){const n=e[s]||{};Object.keys(n).forEach(o=>{if(o.includes(i)){const i=n[o];H(t,e,s,i.originalHandler,i.delegationSelector)}})}(t,l,s,e.slice(1))});const h=l[r]||{};Object.keys(h).forEach(s=>{const i=s.replace(k,"");if(!a||e.includes(i)){const e=h[s];H(t,l,r,e.originalHandler,e.delegationSelector)}})},trigger(t,e,s){if("string"!=typeof e||!t)return null;const i=_(),n=R(e),o=e!==n,r=N.has(n);let a,l=!0,c=!0,h=!1,d=null;return o&&i&&(a=i.Event(e,s),i(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(n,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==s&&Object.keys(s).forEach(t=>{Object.defineProperty(d,t,{get:()=>s[t]})}),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},$=new Map;var W={set(t,e,s){$.has(t)||$.set(t,new Map);const i=$.get(t);i.has(e)||0===i.size?i.set(e,s):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(t,e)=>$.has(t)&&$.get(t).get(e)||null,remove(t,e){if(!$.has(t))return;const s=$.get(t);s.delete(e),0===s.size&&$.delete(t)}};class q{constructor(t){(t=h(t))&&(this._element=t,W.set(this._element,this.constructor.DATA_KEY,this))}dispose(){W.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(t=>{this[t]=null})}_queueCallback(t,e,s=!0){E(t,e,s)}static getInstance(t){return W.get(t,this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class z extends q{static get NAME(){return"alert"}close(t){const e=t?this._getRootElement(t):this._element,s=this._triggerCloseEvent(e);null===s||s.defaultPrevented||this._removeElement(e)}_getRootElement(t){return a(t)||t.closest(".alert")}_triggerCloseEvent(t){return B.trigger(t,"close.bs.alert")}_removeElement(t){t.classList.remove("show");const e=t.classList.contains("fade");this._queueCallback(()=>this._destroyElement(t),t,e)}_destroyElement(t){t.remove(),B.trigger(t,"closed.bs.alert")}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"close"===t&&e[t](this)}))}static handleDismiss(t){return function(e){e&&e.preventDefault(),t.close(this)}}}B.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',z.handleDismiss(new z)),y(z);class F extends q{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=F.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function U(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function K(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}B.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',t=>{t.preventDefault();const e=t.target.closest('[data-bs-toggle="button"]');F.getOrCreateInstance(e).toggle()}),y(F);const V={setDataAttribute(t,e,s){t.setAttribute("data-bs-"+K(e),s)},removeDataAttribute(t,e){t.removeAttribute("data-bs-"+K(e))},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter(t=>t.startsWith("bs")).forEach(s=>{let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=U(t.dataset[s])}),e},getDataAttribute:(t,e)=>U(t.getAttribute("data-bs-"+K(e))),offset(t){const e=t.getBoundingClientRect();return{top:e.top+document.body.scrollTop,left:e.left+document.body.scrollLeft}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},Q={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},X={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Y="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z};class et extends q{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=i.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return Q}static get NAME(){return"carousel"}next(){this._slide(Y)}nextWhenVisible(){!document.hidden&&u(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),i.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(l(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=i.findOne(".active.carousel-item",this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void B.one(this._element,"slid.bs.carousel",()=>this.to(t));if(e===t)return this.pause(),void this.cycle();const s=t>e?Y:G;this._slide(s,this._items[t])}_getConfig(t){return t={...Q,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("carousel",t,X),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",t=>this._keydown(t)),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",t=>this.pause(t)),B.on(this._element,"mouseleave.bs.carousel",t=>this.cycle(t))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType?this._pointerEvent||(this.touchStartX=t.touches[0].clientX):this.touchStartX=t.clientX},e=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},s=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType||(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(t=>this.cycle(t),500+this._config.interval))};i.find(".carousel-item img",this._element).forEach(t=>{B.on(t,"dragstart.bs.carousel",t=>t.preventDefault())}),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",e=>t(e)),B.on(this._element,"pointerup.bs.carousel",t=>s(t)),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",e=>t(e)),B.on(this._element,"touchmove.bs.carousel",t=>e(t)),B.on(this._element,"touchend.bs.carousel",t=>s(t)))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?i.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const s=t===Y;return A(this._items,e,s,this._config.wrap)}_triggerSlideEvent(t,e){const s=this._getItemIndex(t),n=this._getItemIndex(i.findOne(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:s})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=i.findOne(".active",this._indicatorsElement);e.classList.remove("active"),e.removeAttribute("aria-current");const s=i.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e{B.trigger(this._element,"slid.bs.carousel",{relatedTarget:r,direction:u,from:o,to:a})};if(this._element.classList.contains("slide")){r.classList.add(d),m(r),n.classList.add(h),r.classList.add(h);const t=()=>{r.classList.remove(h,d),r.classList.add("active"),n.classList.remove("active",d,h),this._isSliding=!1,setTimeout(g,0)};this._queueCallback(t,n,!0)}else n.classList.remove("active"),r.classList.add("active"),this._isSliding=!1,g();l&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?v()?t===Z?G:Y:t===Z?Y:G:t}_orderToDirection(t){return[Y,G].includes(t)?v()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const s=et.getOrCreateInstance(t,e);let{_config:i}=s;"object"==typeof e&&(i={...i,...e});const n="string"==typeof e?e:i.slide;if("number"==typeof e)s.to(e);else if("string"==typeof n){if(void 0===s[n])throw new TypeError(`No method named "${n}"`);s[n]()}else i.interval&&i.ride&&(s.pause(),s.cycle())}static jQueryInterface(t){return this.each((function(){et.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=a(this);if(!e||!e.classList.contains("carousel"))return;const s={...V.getDataAttributes(e),...V.getDataAttributes(this)},i=this.getAttribute("data-bs-slide-to");i&&(s.interval=!1),et.carouselInterface(e,s),i&&et.getInstance(e).to(i),t.preventDefault()}}B.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",et.dataApiClickHandler),B.on(window,"load.bs.carousel.data-api",()=>{const t=i.find('[data-bs-ride="carousel"]');for(let e=0,s=t.length;et===this._element);null!==n&&o.length&&(this._selector=n,this._triggerArray.push(e))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return st}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let t,e;this._parent&&(t=i.find(".show, .collapsing",this._parent).filter(t=>"string"==typeof this._config.parent?t.getAttribute("data-bs-parent")===this._config.parent:t.classList.contains("collapse")),0===t.length&&(t=null));const s=i.findOne(this._selector);if(t){const i=t.find(t=>s!==t);if(e=i?nt.getInstance(i):null,e&&e._isTransitioning)return}if(B.trigger(this._element,"show.bs.collapse").defaultPrevented)return;t&&t.forEach(t=>{s!==t&&nt.collapseInterface(t,"hide"),e||W.set(t,"bs.collapse",null)});const n=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[n]=0,this._triggerArray.length&&this._triggerArray.forEach(t=>{t.classList.remove("collapsed"),t.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const o="scroll"+(n[0].toUpperCase()+n.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[n]="",this.setTransitioning(!1),B.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[n]=this._element[o]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(B.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=this._element.getBoundingClientRect()[t]+"px",m(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const e=this._triggerArray.length;if(e>0)for(let t=0;t{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),B.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(t){this._isTransitioning=t}_getConfig(t){return(t={...st,...t}).toggle=Boolean(t.toggle),d("collapse",t,it),t}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:t}=this._config;t=h(t);const e=`[data-bs-toggle="collapse"][data-bs-parent="${t}"]`;return i.find(e,t).forEach(t=>{const e=a(t);this._addAriaAndCollapsedClass(e,[t])}),t}_addAriaAndCollapsedClass(t,e){if(!t||!e.length)return;const s=t.classList.contains("show");e.forEach(t=>{s?t.classList.remove("collapsed"):t.classList.add("collapsed"),t.setAttribute("aria-expanded",s)})}static collapseInterface(t,e){let s=nt.getInstance(t);const i={...st,...V.getDataAttributes(t),..."object"==typeof e&&e?e:{}};if(!s&&i.toggle&&"string"==typeof e&&/show|hide/.test(e)&&(i.toggle=!1),s||(s=new nt(t,i)),"string"==typeof e){if(void 0===s[e])throw new TypeError(`No method named "${e}"`);s[e]()}}static jQueryInterface(t){return this.each((function(){nt.collapseInterface(this,t)}))}}B.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=V.getDataAttributes(this),s=r(this);i.find(s).forEach(t=>{const s=nt.getInstance(t);let i;s?(null===s._parent&&"string"==typeof e.parent&&(s._config.parent=e.parent,s._parent=s._getParent()),i="toggle"):i=e,nt.collapseInterface(t,i)})})),y(nt);const ot=new RegExp("ArrowUp|ArrowDown|Escape"),rt=v()?"top-end":"top-start",at=v()?"top-start":"top-end",lt=v()?"bottom-end":"bottom-start",ct=v()?"bottom-start":"bottom-end",ht=v()?"left-start":"right-start",dt=v()?"right-start":"left-start",ut={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},gt={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class pt extends q{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return ut}static get DefaultType(){return gt}static get NAME(){return"dropdown"}toggle(){g(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(g(this._element)||this._menu.classList.contains("show"))return;const t=pt.getParentFromElement(this._element),e={relatedTarget:this._element};if(!B.trigger(this._element,"show.bs.dropdown",e).defaultPrevented){if(this._inNavbar)V.setDataAttribute(this._menu,"popper","none");else{if(void 0===s)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:c(this._config.reference)?e=h(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find(t=>"applyStyles"===t.name&&!1===t.enabled);this._popper=s.createPopper(e,this._menu,i),n&&V.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!t.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(t=>B.on(t,"mouseover",f)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),B.trigger(this._element,"shown.bs.dropdown",e)}}hide(){if(g(this._element)||!this._menu.classList.contains("show"))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){B.on(this._element,"click.bs.dropdown",t=>{t.preventDefault(),this.toggle()})}_completeHide(t){B.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>B.off(t,"mouseover",f)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),V.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...V.getDataAttributes(this._element),...t},d("dropdown",t,this.constructor.DefaultType),"object"==typeof t.reference&&!c(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return t}_getMenuElement(){return i.next(this._element,".dropdown-menu")[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ht;if(t.classList.contains("dropstart"))return dt;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?at:rt:e?ct:lt}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const s=i.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(u);s.length&&A(s,e,"ArrowDown"===t,!s.includes(e)).focus()}static dropdownInterface(t,e){const s=pt.getOrCreateInstance(t,e);if("string"==typeof e){if(void 0===s[e])throw new TypeError(`No method named "${e}"`);s[e]()}}static jQueryInterface(t){return this.each((function(){pt.dropdownInterface(this,t)}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=i.find('[data-bs-toggle="dropdown"]');for(let s=0,i=e.length;sthis.matches('[data-bs-toggle="dropdown"]')?this:i.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===t.key?(s().focus(),void pt.clearMenus()):"ArrowUp"===t.key||"ArrowDown"===t.key?(e||s().click(),void pt.getInstance(s())._selectMenuItem(t)):void(e&&"Space"!==t.key||pt.clearMenus())}}B.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',pt.dataApiKeydownHandler),B.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",pt.dataApiKeydownHandler),B.on(document,"click.bs.dropdown.data-api",pt.clearMenus),B.on(document,"keyup.bs.dropdown.data-api",pt.clearMenus),B.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',(function(t){t.preventDefault(),pt.dropdownInterface(this)})),y(pt);class ft{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",e=>e+t),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",e=>e+t),this._setElementAttributes(".sticky-top","marginRight",e=>e-t)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,s){const i=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+i)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t)[e];t.style[e]=s(Number.parseFloat(n))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(t,e){const s=t.style[e];s&&V.setDataAttribute(t,e,s)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const s=V.getDataAttribute(t,e);void 0===s?t.style.removeProperty(e):(V.removeDataAttribute(t,e),t.style[e]=s)})}_applyManipulationCallback(t,e){c(t)?e(t):i.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const mt={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},_t={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class bt{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&m(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{w(t)})):w(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),w(t)})):w(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className="modal-backdrop",this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...mt,..."object"==typeof t?t:{}}).rootElement=h(t.rootElement),d("backdrop",t,_t),t}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),B.on(this._getElement(),"mousedown.bs.backdrop",()=>{w(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(B.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){E(t,this._getElement(),this._config.isAnimated)}}const vt={backdrop:!0,keyboard:!0,focus:!0},yt={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class wt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=i.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new ft}static get Default(){return vt}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||B.trigger(this._element,"show.bs.modal",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),B.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',t=>this.hide(t)),B.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{B.one(this._element,"mouseup.dismiss.bs.modal",t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(t)))}hide(t){if(t&&["A","AREA"].includes(t.target.tagName)&&t.preventDefault(),!this._isShown||this._isTransitioning)return;if(B.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const e=this._isAnimated();e&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),B.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.modal"),B.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,e)}dispose(){[window,this._dialog].forEach(t=>B.off(t,".bs.modal")),this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bt({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(t){return t={...vt,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("modal",t,yt),t}_showElement(t){const e=this._isAnimated(),s=i.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,s&&(s.scrollTop=0),e&&m(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,B.trigger(this._element,"shown.bs.modal",{relatedTarget:t})},this._dialog,e)}_enforceFocus(){B.off(document,"focusin.bs.modal"),B.on(document,"focusin.bs.modal",t=>{document===t.target||this._element===t.target||this._element.contains(t.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?B.on(this._element,"keydown.dismiss.bs.modal",t=>{this._config.keyboard&&"Escape"===t.key?(t.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==t.key||this._triggerBackdropTransition()}):B.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?B.on(window,"resize.bs.modal",()=>this._adjustDialog()):B.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(t){B.on(this._element,"click.dismiss.bs.modal",t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(B.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:s}=this._element,i=e>document.documentElement.clientHeight;!i&&"hidden"===s.overflowY||t.contains("modal-static")||(i||(s.overflowY="hidden"),t.add("modal-static"),this._queueCallback(()=>{t.remove("modal-static"),i||this._queueCallback(()=>{s.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),s=e>0;(!s&&t&&!v()||s&&!t&&v())&&(this._element.style.paddingLeft=e+"px"),(s&&!t&&!v()||!s&&t&&v())&&(this._element.style.paddingRight=e+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const s=wt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===s[t])throw new TypeError(`No method named "${t}"`);s[t](e)}}))}}B.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=a(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),B.one(e,"show.bs.modal",t=>{t.defaultPrevented||B.one(e,"hidden.bs.modal",()=>{u(this)&&this.focus()})}),wt.getOrCreateInstance(e).toggle(this)})),y(wt);const Et={backdrop:!0,keyboard:!0,scroll:!1},At={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Tt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return Et}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||B.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new ft).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{B.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(B.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(B.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new ft).reset(),B.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.offcanvas")}_getConfig(t){return t={...Et,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("offcanvas",t,At),t}_initializeBackDrop(){return new bt({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(t){B.off(document,"focusin.bs.offcanvas"),B.on(document,"focusin.bs.offcanvas",e=>{document===e.target||t===e.target||t.contains(e.target)||t.focus()}),t.focus()}_addEventListeners(){B.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),B.on(this._element,"keydown.dismiss.bs.offcanvas",t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()})}static jQueryInterface(t){return this.each((function(){const e=Tt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}B.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=a(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),g(this))return;B.one(e,"hidden.bs.offcanvas",()=>{u(this)&&this.focus()});const s=i.findOne(".offcanvas.show");s&&s!==e&&Tt.getInstance(s).hide(),Tt.getOrCreateInstance(e).toggle(this)})),B.on(window,"load.bs.offcanvas.data-api",()=>i.find(".offcanvas.show").forEach(t=>Tt.getOrCreateInstance(t).show())),y(Tt);const Ct=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),kt=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Lt=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ot=(t,e)=>{const s=t.nodeName.toLowerCase();if(e.includes(s))return!Ct.has(s)||Boolean(kt.test(t.nodeValue)||Lt.test(t.nodeValue));const i=e.filter(t=>t instanceof RegExp);for(let t=0,e=i.length;t{Ot(t,a)||s.removeAttribute(t.nodeName)})}return i.body.innerHTML}const It=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Nt=new Set(["sanitize","allowList","sanitizeFn"]),St={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},xt={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},Mt={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Pt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class jt extends q{constructor(t,e){if(void 0===s)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Mt}static get NAME(){return"tooltip"}static get Event(){return Pt}static get DefaultType(){return St}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=B.trigger(this._element,this.constructor.Event.SHOW),e=p(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;const o=this.getTipElement(),r=n(this.constructor.NAME);o.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this.setContent(),this._config.animation&&o.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,o,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:c}=this._config;W.set(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(c.appendChild(o),B.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=s.createPopper(this._element,o,this._getPopperConfig(l)),o.classList.add("show");const h="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;h&&o.classList.add(...h.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{B.on(t,"mouseover",f)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const t=this._hoverState;this._hoverState=null,B.trigger(this._element,this.constructor.Event.SHOWN),"out"===t&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const t=this.getTipElement();if(B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>B.off(t,"mouseover",f)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),B.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");return t.innerHTML=this._config.template,this.tip=t.children[0],this.tip}setContent(){const t=this.getTipElement();this.setElementContent(i.findOne(".tooltip-inner",t),this.getTitle()),t.classList.remove("fade","show")}setElementContent(t,e){if(null!==t)return c(e)?(e=h(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Dt(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){let t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),t}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){const s=this.constructor.DATA_KEY;return(e=e||W.get(t.delegateTarget,s))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),W.set(t.delegateTarget,s,e)),e}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))}_getAttachment(t){return xt[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(t=>{if("click"===t)B.on(this._element,this.constructor.Event.CLICK,this._config.selector,t=>this.toggle(t));else if("manual"!==t){const e="hover"===t?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,s="hover"===t?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;B.on(this._element,e,this._config.selector,t=>this._enter(t)),B.on(this._element,s,this._config.selector,t=>this._leave(t))}}),this._hideModalHandler=()=>{this._element&&this.hide()},B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e._config.delay&&e._config.delay.show?e._timeout=setTimeout(()=>{"show"===e._hoverState&&e.show()},e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e._config.delay&&e._config.delay.hide?e._timeout=setTimeout(()=>{"out"===e._hoverState&&e.hide()},e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=V.getDataAttributes(this._element);return Object.keys(e).forEach(t=>{Nt.has(t)&&delete e[t]}),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:h(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=Dt(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};if(this._config)for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(It);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}static jQueryInterface(t){return this.each((function(){const e=jt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}y(jt);const Ht=new RegExp("(^|\\s)bs-popover\\S+","g"),Rt={...jt.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Bt={...jt.DefaultType,content:"(string|element|function)"},$t={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Wt extends jt{static get Default(){return Rt}static get NAME(){return"popover"}static get Event(){return $t}static get DefaultType(){return Bt}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||i.findOne(".popover-header",this.tip).remove(),this._getContent()||i.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const t=this.getTipElement();this.setElementContent(i.findOne(".popover-header",t),this.getTitle());let e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(i.findOne(".popover-body",t),e),t.classList.remove("fade","show")}_addAttachmentClass(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(Ht);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}static jQueryInterface(t){return this.each((function(){const e=Wt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}y(Wt);const qt={offset:10,method:"auto",target:""},zt={offset:"number",method:"string",target:"(string|element)"};class Ft extends q{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,B.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return qt}static get NAME(){return"scrollspy"}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":"position",e="auto"===this._config.method?t:this._config.method,s="position"===e?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),i.find(this._selector).map(t=>{const n=r(t),o=n?i.findOne(n):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[V[e](o).top+s,n]}return null}).filter(t=>t).sort((t,e)=>t[0]-e[0]).forEach(t=>{this._offsets.push(t[0]),this._targets.push(t[1])})}dispose(){B.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){if("string"!=typeof(t={...qt,...V.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target&&c(t.target)){let{id:e}=t.target;e||(e=n("scrollspy"),t.target.id=e),t.target="#"+e}return d("scrollspy",t,zt),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),s=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=s){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${e}[data-bs-target="${t}"],${e}[href="${t}"]`),s=i.findOne(e.join(","));s.classList.contains("dropdown-item")?(i.findOne(".dropdown-toggle",s.closest(".dropdown")).classList.add("active"),s.classList.add("active")):(s.classList.add("active"),i.parents(s,".nav, .list-group").forEach(t=>{i.prev(t,".nav-link, .list-group-item").forEach(t=>t.classList.add("active")),i.prev(t,".nav-item").forEach(t=>{i.children(t,".nav-link").forEach(t=>t.classList.add("active"))})})),B.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){i.find(this._selector).filter(t=>t.classList.contains("active")).forEach(t=>t.classList.remove("active"))}static jQueryInterface(t){return this.each((function(){const e=Ft.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}B.on(window,"load.bs.scrollspy.data-api",()=>{i.find('[data-bs-spy="scroll"]').forEach(t=>new Ft(t))}),y(Ft);class Ut extends q{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let t;const e=a(this._element),s=this._element.closest(".nav, .list-group");if(s){const e="UL"===s.nodeName||"OL"===s.nodeName?":scope > li > .active":".active";t=i.find(e,s),t=t[t.length-1]}const n=t?B.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(B.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==n&&n.defaultPrevented)return;this._activate(this._element,s);const o=()=>{B.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),B.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,s){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?i.children(e,".active"):i.find(":scope > li > .active",e))[0],o=s&&n&&n.classList.contains("fade"),r=()=>this._transitionComplete(t,n,s);n&&o?(n.classList.remove("show"),this._queueCallback(r,t,!0)):r()}_transitionComplete(t,e,s){if(e){e.classList.remove("active");const t=i.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),m(t),t.classList.contains("fade")&&t.classList.add("show");let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&i.find(".dropdown-toggle",e).forEach(t=>t.classList.add("active")),t.setAttribute("aria-expanded",!0)}s&&s()}static jQueryInterface(t){return this.each((function(){const e=Ut.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),g(this)||Ut.getOrCreateInstance(this).show()})),y(Ut);const Kt={animation:"boolean",autohide:"boolean",delay:"number"},Vt={animation:!0,autohide:!0,delay:5e3};class Qt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Kt}static get Default(){return Vt}static get NAME(){return"toast"}show(){B.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),m(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),B.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(B.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),B.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(t){return t={...Vt,...V.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},d("toast",t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const s=t.relatedTarget;this._element===s||this._element.contains(s)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),B.on(this._element,"mouseover.bs.toast",t=>this._onInteraction(t,!0)),B.on(this._element,"mouseout.bs.toast",t=>this._onInteraction(t,!1)),B.on(this._element,"focusin.bs.toast",t=>this._onInteraction(t,!0)),B.on(this._element,"focusout.bs.toast",t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Qt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return y(Qt),{Alert:z,Button:F,Carousel:et,Collapse:nt,Dropdown:pt,Modal:wt,Offcanvas:Tt,Popover:Wt,ScrollSpy:Ft,Tab:Ut,Toast:Qt,Tooltip:jt}})); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/backup/constanta.html b/backup/constanta.html deleted file mode 100644 index 2a1f9c0..0000000 --- a/backup/constanta.html +++ /dev/null @@ -1,196 +0,0 @@ - - Rally TerraTrip v1 Constanta - - - - - - - - - -
- - -
-
-
-
=
-
-
X
-
-
-
-
-)rawliteral"; - -const char HTML_CONSTROW[] PROGMEM = R"rawliteral( -
-
-
-
-
-
-
-
-
-
-
-
-
-)rawliteral"; - -const char HTML_CONSTEND[] PROGMEM = R"rawliteral( - -
- - - \ No newline at end of file diff --git a/data/constanta.html b/data/constanta.html index d466a64..df3a374 100644 --- a/data/constanta.html +++ b/data/constanta.html @@ -1,177 +1,227 @@ - - Rally TerraTrip v1 Constanta - - - - - - - - -
-
-

12345

-

TRACK A

-

Time: 00:00:00

-

123.4Km/h

-
-
- - - + Rally TerraTrip v1 Constanta + + + + + + + + + +
+ +
+
+
=
-
-
-
+
X
+)rawliteral"; - -
-
-
-
+const char HTML_CONSTROW[] PROGMEM = R"rawliteral( +
+
-
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+)rawliteral"; +const char HTML_CONSTEND[] PROGMEM = R"rawliteral( + + - - - - - - - - - - + + // if (json.ok) { + parsingjson(json); + } + //console.log(json.trip + ", " + json.speed + ", " + json.dist + ", " + json.time + ", " + json.stime); + console.log(json); + } + }; + let data = '{"req":"B"}' + console.log(data); + var datajson = JSON.stringify(data); + console.log(datajson); + + // console.log(String.fromCharCode(i)); + // data = '{"req":"'+String.fromCharCode(i)+'"}' + xhr.send(data); + // } + + }; - \ No newline at end of file + function setConstanta(e){ + e = e || window.event; + var targ1 = e.target || e.srcElement || e; + if (targ1.nodeType == 3) targ1 = targ1.parentNode; // defeat Safari bug + const targ = targ1.closest(".row"); + const trip = targ.getElementsByClassName("trip")[0].textContent[0]; + const speed = targ.getElementsByClassName("speed")[0].value; + const dist = targ.getElementsByClassName("dist")[0].value; + const time = targ.getElementsByClassName("time")[0].value; + if (!(dist<1000)){ + alert ("Trip "+trip+"-> [Dist] cannot exceed 1000 Km"); + return; + } + if (speed===""){ + alert ("Trip "+trip+"-> [Speed] is required"); + return; + } + if (!(speed<100)){ + alert ("Trip "+trip+"-> [Speed] cannot exceed 100 Km/h"); + return; + } + if (!(time<1000)){ + alert ("Trip "+trip+"-> [Time] cannot exceed 1000 minutes"); + return; + } + const stime = targ.getElementsByClassName("stime")[0].value; + if (stime===""){ + alert ("Trip "+trip+"-> [Start Time] is required"); + return; + } + // targ.getElementsByClassName("speed")[0].value = "345" //trial change backColor + // targ.getElementsByClassName("speed")[0].style.backgroundColor = "white" + + + var full_data='{"trip":"'+trip+'", "speed":"'+speed+'", "dist":"'+dist+'", "time":"'+time+'", "stime":"'+stime+'"}'; + console.log(full_data); + sendjson(full_data); + }; + + function parsingjson(json){ + console.log(json); + var tripID = document.getElementById("trip"+json.trip); + console.log(tripID); + const speed = tripID.getElementsByClassName("speed")[0]; + const dist = tripID.getElementsByClassName("dist")[0]; + const time = tripID.getElementsByClassName("time")[0]; + const stime = tripID.getElementsByClassName("stime")[0]; + setValBackColor(speed, json.speed); + setValBackColor(dist, json.dist); + setValBackColor(time, json.time); + setValBackColor(stime, json.stime); + // speed.value = json.speed; + // dist.value = json.dist; + // time.value = json.time; + // stime.value = json.stime; + // speed.style.backgroundColor = "#94C4E2"// #6495ED + // dist.style.backgroundColor = "#94C4E2" + // time.style.backgroundColor = "#94C4E2" + // stime.style.backgroundColor = "#94C4E2" + console.log("result ok:"+json.trip + ", " + speed.value + ", " + dist.value + ", " + time.value + ", " + stime.value); + }; + + function setValBackColor(elem, jsonval){ + if (jsonval) { + elem.value = jsonval; + elem.style.backgroundColor = "#ABEBC6";//"#E5E7E9";//"#C0C0C0";//"#94C4E2"; + } else { + elem.style.backgroundColor = "white"; + } + }; + + function sendjson(data){ + var xhr = new XMLHttpRequest(); + var url = "/rest/endpoint"; + xhr.open("POST", url, true); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.onreadystatechange = function () { + console.log(xhr.responseText); + if (xhr.readyState === 4 && xhr.status === 200) { + var json = JSON.parse(xhr.responseText); + console.log(json.trip + ", " + json.speed + ", " + json.dist + ", " + json.time + ", " + json.stime); + if (json.ok) { + parsingjson(json); + } + //console.log(json.trip + ", " + json.speed + ", " + json.dist + ", " + json.time + ", " + json.stime); + console.log(json); + } + }; + console.log(data); + var datajson = JSON.stringify(data); + console.log(datajson); + xhr.send(data); + } + + \ No newline at end of file diff --git a/data/main_menu.html b/data/main_menu.html index 933b50b..d88b8e4 100644 --- a/data/main_menu.html +++ b/data/main_menu.html @@ -17,7 +17,7 @@

MENU

-
+
diff --git a/backup/startrally1.html b/data/startrally.html similarity index 100% rename from backup/startrally1.html rename to data/startrally.html diff --git a/src/constanta.h b/src/constanta.h index f8046f7..ad2780f 100644 --- a/src/constanta.h +++ b/src/constanta.h @@ -1,199 +1,230 @@ const char HTML_CONSTHEADER[] PROGMEM = R"rawliteral( - Rally TerraTrip v1 Constanta - - - - - - - + Rally TerraTrip v1 Constanta + + + + + + + -
+
- -
-
-
-
=
-
-
X
-
-
-
-
+ +
+
+
+
=
+
+
X
+
+
+
+
)rawliteral"; const char HTML_CONSTROW[] PROGMEM = R"rawliteral( -
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
)rawliteral"; const char HTML_CONSTEND[] PROGMEM = R"rawliteral( - -
- - - + if (speed===""){ + alert ("Trip "+trip+"-> [Speed] is required"); + return; + } + if (!(speed<100)){ + alert ("Trip "+trip+"-> [Speed] cannot exceed 100 Km/h"); + return; + } + if (!(time<1000)){ + alert ("Trip "+trip+"-> [Time] cannot exceed 1000 minutes"); + return; + } + const stime = targ.getElementsByClassName("stime")[0].value; + if (stime===""){ + alert ("Trip "+trip+"-> [Start Time] is required"); + return; + } + // targ.getElementsByClassName("speed")[0].value = "345" //trial change backColor + // targ.getElementsByClassName("speed")[0].style.backgroundColor = "white" + + + var full_data='{"trip":"'+trip+'", "speed":"'+speed+'", "dist":"'+dist+'", "time":"'+time+'", "stime":"'+stime+'"}'; + console.log(full_data); + sendjson(full_data); + }; + + function parsingjson(json){ + console.log(json); + var tripID = document.getElementById("trip"+json.trip); + console.log(tripID); + const speed = tripID.getElementsByClassName("speed")[0]; + const dist = tripID.getElementsByClassName("dist")[0]; + const time = tripID.getElementsByClassName("time")[0]; + const stime = tripID.getElementsByClassName("stime")[0]; + setValBackColor(speed, json.speed); + setValBackColor(dist, json.dist); + setValBackColor(time, json.time); + setValBackColor(stime, json.stime); + // speed.value = json.speed; + // dist.value = json.dist; + // time.value = json.time; + // stime.value = json.stime; + // speed.style.backgroundColor = "#94C4E2"// #6495ED + // dist.style.backgroundColor = "#94C4E2" + // time.style.backgroundColor = "#94C4E2" + // stime.style.backgroundColor = "#94C4E2" + console.log("result ok:"+json.trip + ", " + speed.value + ", " + dist.value + ", " + time.value + ", " + stime.value); + }; + + function setValBackColor(elem, jsonval){ + if (jsonval) { + elem.value = jsonval; + elem.style.backgroundColor = "#ABEBC6";//"#E5E7E9";//"#C0C0C0";//"#94C4E2"; + } else { + elem.style.backgroundColor = "white"; + } + }; + + function sendjson(data){ + var xhr = new XMLHttpRequest(); + var url = "/rest/endpoint"; + xhr.open("POST", url, true); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.onreadystatechange = function () { + console.log(xhr.responseText); + if (xhr.readyState === 4 && xhr.status === 200) { + var json = JSON.parse(xhr.responseText); + console.log(json.trip + ", " + json.speed + ", " + json.dist + ", " + json.time + ", " + json.stime); + if (json.ok) { + parsingjson(json); + } + //console.log(json.trip + ", " + json.speed + ", " + json.dist + ", " + json.time + ", " + json.stime); + console.log(json); + } + }; + console.log(data); + var datajson = JSON.stringify(data); + console.log(datajson); + xhr.send(data); + } + + )rawliteral"; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 93e48b9..421efbc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -152,6 +152,7 @@ const int lcdRows = 4; ///lolin esp32 lite i2c pin #define I2C_SDA 15 #define I2C_SCL 13 +#define FREQHZ 400000U #define LED_BUILTIN 22 // LED built in pada ESP32 Lolin32 Lite // set LCD address, number of columns and rows // if you don't know your display address, run an I2C scanner sketch @@ -981,6 +982,30 @@ void constantatodigit() //digit6=(int)((constanta*10000 - (int)(constanta*10000))*10); } +void setSpiffSpeedInConstanta(float mConstanta, uint8_t setSpiffcurTrip){ + char filename[7] = "/tripZ"; + setSpiffcurTrip+=65; + filename[5]=setSpiffcurTrip; + Serial.println(filename); + Serial.println(mConstanta); + String result = readFile(SPIFFS, filename); + result.reserve(128); + DynamicJsonDocument doc(128); + deserializeJson(doc, result); + if (doc["trip"].as()=="null") doc["trip"]=String(char(setSpiffcurTrip)); + if (doc["dist"].as()=="null") doc["dist"]=""; + if (doc["time"].as()=="null") doc["time"]=""; + if (doc["stime"].as()=="null") doc["stime"]=""; + String strConstanta = String(mConstanta,4); + Serial.println(strConstanta); + doc["speed"] = strConstanta; + result=""; + serializeJson(doc,result); + writeFile(SPIFFS, filename, result.c_str()); + Serial.print("Write speed:");Serial.println(result); + Trip[setSpiffcurTrip].speed = mConstanta; +} + void setMemSpeedInConstanta(float constanta, uint8_t setmemcurTrip){ int pointeradd = ((TRIPADDRESS+setmemcurTrip)*32); mem.writeFloat(pointeradd, constanta); @@ -995,12 +1020,38 @@ float getMemSpeedInConstanta(uint8_t getmemSpeedcurTrip){ } return x; } -void setMemStime(unsigned long valuesettime, uint8_t setmemssTimecurTrip){ +void setSpiffStime(unsigned long mvaluesettime, uint8_t setSpiffcurTrip){ + char filename[7] = "/tripZ"; + setSpiffcurTrip+=65; + filename[5]=setSpiffcurTrip; + Serial.println(filename); + Serial.println(mvaluesettime); + String result = readFile(SPIFFS, filename); + result.reserve(128); + DynamicJsonDocument doc(128); + deserializeJson(doc, result); + char msTime[6]; + byte sHour, sMin; + sHour = mvaluesettime/65536; + sMin = (mvaluesettime/256)-sHour*256; + sprintf(msTime, "%02u:%02u", sHour, sMin); + Serial.print("dist:");Serial.print(doc["dist"].as());Serial.println(";"); + if (doc["trip"].as()=="null") doc["trip"]=String(char(setSpiffcurTrip)); + if (doc["dist"].as()=="null") doc["dist"]=""; + if (doc["speed"].as()=="null") doc["speed"]=""; + if (doc["time"].as()=="null") doc["time"]=""; + doc["stime"]=msTime; + result=""; + serializeJson(doc,result); + writeFile(SPIFFS, filename, result.c_str()); + Serial.print("Write sTime:");Serial.println(result); +} +void setMemStime(unsigned long mvaluesettime, uint8_t setmemssTimecurTrip){ int pointeradd = ((TRIPADDRESS+setmemssTimecurTrip)*32+4); - mem.writeLong(pointeradd, valuesettime); - Trip[setmemssTimecurTrip].startHour = (valuesettime/65536); //starttracthour; - Trip[setmemssTimecurTrip].startMin = (valuesettime/256)-Trip[setmemssTimecurTrip].startHour*256; // starttractmin; - Trip[setmemssTimecurTrip].startSec = valuesettime-((Trip[setmemssTimecurTrip].startHour*256 + Trip[curTrip].startMin)*256);//starttractsec; + mem.writeLong(pointeradd, mvaluesettime); + Trip[setmemssTimecurTrip].startHour = (mvaluesettime/65536); //starttracthour; + Trip[setmemssTimecurTrip].startMin = (mvaluesettime/256)-Trip[setmemssTimecurTrip].startHour*256; // starttractmin; + Trip[setmemssTimecurTrip].startSec = mvaluesettime-((Trip[setmemssTimecurTrip].startHour*256 + Trip[curTrip].startMin)*256);//starttractsec; Serial.print(Trip[setmemssTimecurTrip].startHour);Serial.print(";"); Serial.print(Trip[setmemssTimecurTrip].startMin);Serial.print(";"); Serial.println(Trip[setmemssTimecurTrip].startSec); @@ -2228,6 +2279,42 @@ void fillTripArray(){ } } +void handelSetWifi(AsyncWebServerRequest *request){ + String inputMessage; + boolean bolrestart=false; + boolean POST=true; + Serial.print("/setwifi:"); + // GET inputString value on /get?inputString= + if (request->hasParam(PARAM_SSID, POST)) { + inputMessage = request->getParam(PARAM_SSID, POST )->value(); + Serial.print(inputMessage);Serial.print(";"); + if (inputMessage!=""){ + Serial.print(inputMessage); + writeFile(SPIFFS, "/ssidString.txt", inputMessage.c_str()); + delay(50); + bolrestart=true; + } + } + // GET inputPwd value on /wifi/get?inputPwd= + if (request->hasParam(PARAM_PWD, POST)) { + inputMessage = request->getParam(PARAM_PWD, POST)->value(); + Serial.print(inputMessage);Serial.print(";"); + if (inputMessage!=""){ + writeFile(SPIFFS, "/inputPwd.txt", inputMessage.c_str()); + delay(50); + bolrestart=true; + } + } + else { + inputMessage = "No message sent"; + } + Serial.println(""); + if (bolrestart) { + ESP.restart(); + } + // Serial.println("ini /setwifi aja");Serial.println(inputMessage); + request->send(200, "text/text", inputMessage); +} void handleConstantaHTML(AsyncWebServerRequest *request) { //PAGE.replace("%serveripaddress%", WiFi.localIP().toString()); //request->send_P(200, "text/html", HTML_CALIBRATION, processor); @@ -2335,7 +2422,6 @@ void handlesetConst(AsyncWebServerRequest *request, JsonVariant &json){ // request->send(200, "text/plain", hasil); // handle data and respond serializeJson(data, *response); request->send(response); - // request->send(200, "text/plain", hasil); isloadingConst=false; } @@ -2412,39 +2498,26 @@ void setup() { // // //#ifdef DEBUG - Serial.begin(115200); - Serial.println("Starting Rally"); + Serial.begin(115200); + Serial.println("Starting Rally"); //#endif - // pinMode(ledPin, OUTPUT); - uint32_t freqhz=400000; - // Wire.begin(15, 13, freqhx); //for lolin32lite sda=15; scl=13 - pinMode(simulatorPWMPin,OUTPUT); - pinMode(LED_BUILTIN, OUTPUT); - pinMode(interruptPin, INPUT); //Pull down using resistor to ground - attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING); + pinMode(simulatorPWMPin,OUTPUT); + pinMode(LED_BUILTIN, OUTPUT); + pinMode(interruptPin, INPUT); //Pull down using resistor to ground + attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING); - // attachInterrupt(digitalPinToInterrupt(interruptPin), blink, FALLING); - // attachInterrupt(interruptPin, isr, FALLING); - // Wire.begin(I2C_SDA, I2C_SCL); //for lolin32lite sda=15; scl=13 - // Wire.begin(15, 13); //for lolin32lite sda=15; scl=13 - // pinMode(UP_pin, INPUT_PULLUP); /// - // pinMode(DOWN_pin, INPUT_PULLUP); /// - // pinMode(LEFT_pin, INPUT_PULLUP); /// - // pinMode(RIGHT_pin, INPUT_PULLUP); /// - // pinMode(OK_pin, INPUT_PULLUP); /// - - btnUP.begin(); /// using JC_BUTTON harus ada begin - btnDN.begin(); - btnLF.begin(); - btnRF.begin(); - btnOK.begin(); - btnESC.begin(); - //DS3231_init(DS3231_INTCN); - - // //memset(recv, 0, BUFF_MAX); + btnUP.begin(); /// using JC_BUTTON harus ada begin + btnDN.begin(); + btnLF.begin(); + btnRF.begin(); + btnOK.begin(); + btnESC.begin(); + //DS3231_init(DS3231_INTCN); + +// //memset(recv, 0, BUFF_MAX); #ifdef DEBUG - Serial.println("GET time"); + Serial.println("GET time"); #endif /* Trip[0].sub = "A"; @@ -2461,75 +2534,53 @@ Trip[9].startSec = 58; //Serial.println(Trip[0].sub);Serial.println(Trip[0].speed);Serial.println(Trip[0].startHour);Serial.println(Trip[0].startMin);Serial.println(Trip[0].startSec); //Serial.println(Trip[0].distance); //Serial.println(Trip[0].subTime); + // uint32_t freqhz=400000; + Wire.begin(I2C_SDA, I2C_SCL, FREQHZ); //for lolin32lite sda=15; scl=13 //Dont move up or down - -// lcd.init(); -// lcd.backlight(); - - // lcd.begin(20, 4); - // // if(lcd.begin(20, 4)) - // // { - // // // begin() failed so blink the onboard LED if possible - // // return; // this never returns - // // } - // lcd.setBacklight(0xff); - // // Wire.setClock(100000L); // set i2c clock bit rate, if asked - - // lcd.print("i2c clock:"); - // lcd.setCursor(0,1); - // lcd.print(Wire.getClock()); - // lcd.print(" Hz"); - // delay(3000); - - - -Wire.begin(I2C_SDA, I2C_SCL, freqhz); //for lolin32lite sda=15; scl=13 - - //**************************LCD Setup******************************** +//**************************LCD Setup******************************** delay(100); - // lcd.begin (20,4); // initialize the lcd - // lcd.init(); - lcd.begin(); - // lcd2.begin(); - // Wire.begin(I2C_SDA, I2C_SCL); //for lolin32lite sda=15; scl=13 - // Switch on the backlight +// lcd.begin (20,4); // initialize the lcd +// lcd.init(); + lcd.begin(); +// lcd2.begin(); + + // Switch on the backlight /// lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); - // lcd.backlight(); - // lcd2.backlight(); +// lcd.backlight(); +// lcd2.backlight(); /// lcd.setBacklight(LED_ON); - // lcd2.print("hello rally20"); - - - - //***************************END LCD Setup******************************** -getCalibJson.reserve(512); -getRallyJson.reserve(512); +// lcd2.print("hello rally20"); + + + +//***************************END LCD Setup******************************** + getCalibJson.reserve(512); + getRallyJson.reserve(512); #ifdef DEBUG - Serial.println("Setting time"); + Serial.println("Setting time"); #endif - //char a[]="304022129022016"; -DS3231_init(DS3231_CONTROL_INTCN); - DS3231_get(&t); //Get time + DS3231_init(DS3231_CONTROL_INTCN); + DS3231_get(&t); //Get time - blinkON=false; - sec60=t.sec; - min60=t.min; - hour24=t.hour; + blinkON=false; + sec60=t.sec; + min60=t.min; + hour24=t.hour; - delay(100); // delay for reading mem.read - //mainMenu(); - printUPchar(); - printDOWNchar(); - count1 = memretrieveLong(count1Address, RRcountSIZE, count1Seq); //(int startaddress, byte RRsize, unsigned long seq) - Serial.println(count1Seq); - int countaddresspointer = count1count2diffAddress*32; - Serial.print(countaddresspointer); - count1count2diff = mem.readLong(countaddresspointer); - //count1count2diff = mem.readLong((count1count2diffAddress*32)); - count2 = count1 - count1count2diff; - //printmemLong(0,20); //startaddress, size - Serial.print("count1=");Serial.print(count1);Serial.print(";count2=");Serial.print(count2);Serial.print("countdiff=");Serial.println(count1count2diff); + delay(100); // delay for reading mem.read + //mainMenu(); + printUPchar(); + printDOWNchar(); + count1 = memretrieveLong(count1Address, RRcountSIZE, count1Seq); //(int startaddress, byte RRsize, unsigned long seq) + Serial.println(count1Seq); + int countaddresspointer = count1count2diffAddress*32; + Serial.print(countaddresspointer); + count1count2diff = mem.readLong(countaddresspointer); + //count1count2diff = mem.readLong((count1count2diffAddress*32)); + count2 = count1 - count1count2diff; + //printmemLong(0,20); //startaddress, size + Serial.print("count1=");Serial.print(count1);Serial.print(";count2=");Serial.print(count2);Serial.print("countdiff=");Serial.println(count1count2diff); // // TESTING MEM AT24cx EEPROM check the address in the library #define ..... 0x57 // Serial.println("Write 42 to address 12"); @@ -2539,70 +2590,70 @@ DS3231_init(DS3231_CONTROL_INTCN); // Serial.print("... read: "); // Serial.println(b, DEC); // Serial.println(); - - //count1Seq = 4294967290; + + //count1Seq = 4294967290; /* - for (int i=0; i<25 ; i++){ - count1Seq++; - //Serial.println(count1Seq); - //memwritingLong(rrcountpointer1, count1Seq, count1+1, RRcountSIZE ); - memwritingLong(count1Address, RRcountSIZE, count1Seq, count1);//(int startaddress, byte RRsize, unsigned long seq, unsigned long Data) - } - */ - //mem.writeLong(896, 110025); to reset CALIBRATION value to CRV - /* - starttracthour=mem.read(770); - starttractmin=mem.read(769); - starttractsec=mem.read(768); - */ + for (int i=0; i<25 ; i++){ + count1Seq++; + //Serial.println(count1Seq); + //memwritingLong(rrcountpointer1, count1Seq, count1+1, RRcountSIZE ); + memwritingLong(count1Address, RRcountSIZE, count1Seq, count1);//(int startaddress, byte RRsize, unsigned long seq, unsigned long Data) + } +*/ + //mem.writeLong(896, 110025); to reset CALIBRATION value to CRV + /* + starttracthour=mem.read(770); + starttractmin=mem.read(769); + starttractsec=mem.read(768); + */ // for (int i = 0; i23) starttracthour = 23; - if (starttractmin>59) starttractmin = 59; - if (starttractsec>59) starttractsec = 59; - //constanta=mem.readFloat(800); - constanta = Trip[curTrip].speed; - if ((constanta > 150) || (constanta < 0)) constanta = 60; /// aslinya if ((constanta > 150) || (constanta < 0)) constanta = 60; - long m = mem.readLong(896); //read calibration value; - if (m > 0) { - Calibration = m; - } else Calibration = 110025; - // Calibration = 100000; - + } + starttracthour=Trip[curTrip].startHour; + starttractmin=Trip[curTrip].startMin; + starttractsec=Trip[curTrip].startSec; + + if (starttracthour>23) starttracthour = 23; + if (starttractmin>59) starttractmin = 59; + if (starttractsec>59) starttractsec = 59; + //constanta=mem.readFloat(800); + constanta = Trip[curTrip].speed; + if ((constanta > 150) || (constanta < 0)) constanta = 60; /// aslinya if ((constanta > 150) || (constanta < 0)) constanta = 60; + long m = mem.readLong(896); //read calibration value; + if (m > 0) { + Calibration = m; + } else Calibration = 110025; + // Calibration = 100000; + //#ifdef DEBUG - Serial.println("calibration and constanta"); - Serial.println(m); - Serial.println(Calibration); - Serial.println(constanta); +Serial.println("calibration and constanta"); + Serial.println(m); + Serial.println(Calibration); + Serial.println(constanta); //#endif - constantatodigit(); + constantatodigit(); // Serial.print(digit1);Serial.print(digit2); Serial.print(digit3); Serial.print(digit4);Serial.print(digit5);Serial.println(digit6); // Serial.println(constanta,5); - //Serial.print(digitalRead(UP_pin));Serial.print(digitalRead(DOWN_pin));Serial.print(digitalRead(LEFT_pin));Serial.print(digitalRead(RIGHT_pin));Serial.println(digitalRead(OK_pin)); - - prevcount1 = count1; - prevcount2 = count2; + //Serial.print(digitalRead(UP_pin));Serial.print(digitalRead(DOWN_pin));Serial.print(digitalRead(LEFT_pin));Serial.print(digitalRead(RIGHT_pin));Serial.println(digitalRead(OK_pin)); + + prevcount1 = count1; + prevcount2 = count2; - prevcalibrationtime+=calibrationtimeinterval; - prevtempint+=tempinterval; - prevtemprally+=tempintervalrally; - prevsettime += intervalsettime; - startmillis+=1000; + prevcalibrationtime+=calibrationtimeinterval; + prevtempint+=tempinterval; + prevtemprally+=tempintervalrally; + prevsettime += intervalsettime; + startmillis+=1000; - mainMenu(); + mainMenu(); // @@ -2649,7 +2700,7 @@ DS3231_init(DS3231_CONTROL_INTCN); strncpy(password, yourInputPwd.c_str() , (sizeof password)-1); // strncpy(password, yourInputPwd.c_str() , (sizeof yourInputPwd)-1); } -Serial.print("try to connect to ssid:");Serial.print(ssid);Serial.print("; with pwd:");Serial.println(password); + Serial.print("try to connect to ssid:");Serial.print(ssid);Serial.print("; with pwd:");Serial.println(password); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Failed!"); @@ -2692,58 +2743,22 @@ Serial.print("try to connect to ssid:");Serial.print(ssid);Serial.print("; with }); server.on("/wifi", HTTP_GET, [](AsyncWebServerRequest * request) { - if (ON_STA_FILTER(request)) { //request->send(200, "text/plain", "Hello from STA"); request->send_P(200, "text/html", wifi_html, processor); return; - } else if (ON_AP_FILTER(request)) { //request->send(200, "text/plain", "Hello from AP"); Serial.println("on apfilter /wifi"); request->send_P(200, "text/html", wifi_html, processor); return; } - - request->send(200, "text/plain", "Hello from undefined"); -}); + request->send(200, "text/plain", "Hello from undefined"); + }); // Send a GET request to /get?inputString= server.on("/setwifi", HTTP_POST, [] (AsyncWebServerRequest *request) { - String inputMessage; - boolean bolrestart=false; - boolean POST=true; - Serial.print("/setwifi:"); - // GET inputString value on /get?inputString= - if (request->hasParam(PARAM_SSID, POST)) { - inputMessage = request->getParam(PARAM_SSID, POST )->value(); - Serial.print(inputMessage);Serial.print(";"); - if (inputMessage!=""){ - Serial.print(inputMessage); - writeFile(SPIFFS, "/ssidString.txt", inputMessage.c_str()); - delay(50); - bolrestart=true; - } - } - // GET inputPwd value on /wifi/get?inputPwd= - if (request->hasParam(PARAM_PWD, POST)) { - inputMessage = request->getParam(PARAM_PWD, POST)->value(); - Serial.print(inputMessage);Serial.print(";"); - if (inputMessage!=""){ - writeFile(SPIFFS, "/inputPwd.txt", inputMessage.c_str()); - delay(50); - bolrestart=true; - } - } - else { - inputMessage = "No message sent"; - } - Serial.println(""); - if (bolrestart) { - ESP.restart(); - } - // Serial.println("ini /setwifi aja");Serial.println(inputMessage); - request->send(200, "text/text", inputMessage); + handelSetWifi(request); }); server.on("/menu", HTTP_GET, [] (AsyncWebServerRequest *request) { @@ -2752,21 +2767,21 @@ Serial.print("try to connect to ssid:");Serial.print(ssid);Serial.print("; with request->send_P(200, "text/html", main_menu); }); - server.on("/startrallytest", HTTP_GET, [] (AsyncWebServerRequest *request) { - //String s = MAIN_page; //Read HTML contents - //request->send_P(200, "text/html", s); //Send web page - String PAGE; - PAGE += FPSTR(HTML_PAGEHEADER); - PAGE.replace("%serveripaddress%", WiFi.localIP().toString()); - PAGE += FPSTR(HTML_DIVSTARTRALLY); - //PAGE += FPSTR(HTML_SCRIPTSETINTERVAL); - //PAGE += FPSTR(HTML_SCRIPTGETDATA); - PAGE += FPSTR(HTML_END); - //Serial.println(PAGE); - Serial.print("PAGE Size:"); - Serial.println(PAGE.length()); - request->send(200, "text/html", PAGE); - }); + // server.on("/startrallytest", HTTP_GET, [] (AsyncWebServerRequest *request) { + // //String s = MAIN_page; //Read HTML contents + // //request->send_P(200, "text/html", s); //Send web page + // String PAGE; + // PAGE += FPSTR(HTML_PAGEHEADER); + // PAGE.replace("%serveripaddress%", WiFi.localIP().toString()); + // PAGE += FPSTR(HTML_DIVSTARTRALLY); + // //PAGE += FPSTR(HTML_SCRIPTSETINTERVAL); + // //PAGE += FPSTR(HTML_SCRIPTGETDATA); + // PAGE += FPSTR(HTML_END); + // //Serial.println(PAGE); + // Serial.print("PAGE Size:"); + // Serial.println(PAGE.length()); + // request->send(200, "text/html", PAGE); + // }); server.on("/startrally", HTTP_GET, [] (AsyncWebServerRequest *request) { request->send_P(200, "text/html", HTML_startrally, processor); @@ -2790,75 +2805,75 @@ Serial.print("try to connect to ssid:");Serial.print(ssid);Serial.print("; with request->send(SPIFFS, "/bootstrap.min.js", "text/javascript"); }); - server.on("/resetodo1", HTTP_GET, [] (AsyncWebServerRequest *request) { - Serial.println("ODORESET 1"); - request->redirect("/startrally1"); - }); + // server.on("/resetodo1", HTTP_GET, [] (AsyncWebServerRequest *request) { + // Serial.println("ODORESET 1"); + // request->redirect("/startrally1"); + // }); - server.on("/resetodo2", HTTP_GET, [] (AsyncWebServerRequest *request) { - Serial.println("ODORESET 22222"); - request->redirect("/startrally1"); - }); + // server.on("/resetodo2", HTTP_GET, [] (AsyncWebServerRequest *request) { + // Serial.println("ODORESET 22222"); + // request->redirect("/startrally1"); + // }); - server.on("/copytoodo2", HTTP_GET, [] (AsyncWebServerRequest *request) { - Serial.println("COPY ODO 1 to 2"); - request->redirect("/startrally1"); - }); + // server.on("/copytoodo2", HTTP_GET, [] (AsyncWebServerRequest *request) { + // Serial.println("COPY ODO 1 to 2"); + // request->redirect("/startrally1"); + // }); - server.on("/copytoodo1", HTTP_GET, [] (AsyncWebServerRequest *request) { - Serial.println("COPY ODO 2 to 1"); - request->redirect("/startrally1"); - }); - server.on("/DIR", HTTP_GET, [] (AsyncWebServerRequest *request) { - String inputMessage; - String inputParam; - if (request->hasParam("DIR1")){ - inputMessage=request->getParam("DIR1")->value(); - Serial.print("DIR 1->");Serial.println(inputMessage); - switch(inputMessage[0]){ - case 'F': - Serial.println("FW1"); - break; - case 'S': - Serial.println("ST1"); - break; - case 'B': - Serial.println("BACK1"); - break; - default: - Serial.println("Default VAL1"); - } - } - else if (request->hasParam("DIR2")){ - inputMessage=request->getParam("DIR2")->value(); - Serial.print("DIR 2->");Serial.println(inputMessage); - switch(inputMessage[0]){ - case 'F': - Serial.println("FW2"); - break; - case 'S': - Serial.println("ST2"); - break; - case 'B': - Serial.println("BACK2"); - break; - default: - Serial.println("Default VAL2"); - } - } - request->redirect("/startrally1"); - }); + // server.on("/copytoodo1", HTTP_GET, [] (AsyncWebServerRequest *request) { + // Serial.println("COPY ODO 2 to 1"); + // request->redirect("/startrally1"); + // }); + // server.on("/DIR", HTTP_GET, [] (AsyncWebServerRequest *request) { + // String inputMessage; + // String inputParam; + // if (request->hasParam("DIR1")){ + // inputMessage=request->getParam("DIR1")->value(); + // Serial.print("DIR 1->");Serial.println(inputMessage); + // switch(inputMessage[0]){ + // case 'F': + // Serial.println("FW1"); + // break; + // case 'S': + // Serial.println("ST1"); + // break; + // case 'B': + // Serial.println("BACK1"); + // break; + // default: + // Serial.println("Default VAL1"); + // } + // } + // else if (request->hasParam("DIR2")){ + // inputMessage=request->getParam("DIR2")->value(); + // Serial.print("DIR 2->");Serial.println(inputMessage); + // switch(inputMessage[0]){ + // case 'F': + // Serial.println("FW2"); + // break; + // case 'S': + // Serial.println("ST2"); + // break; + // case 'B': + // Serial.println("BACK2"); + // break; + // default: + // Serial.println("Default VAL2"); + // } + // } + // request->redirect("/startrally1"); + // }); - server.on("/TG1", HTTP_GET, [] (AsyncWebServerRequest *request) { - Serial.println("TOGGLE 1"); - request->redirect("/startrally1"); - }); + // server.on("/TG1", HTTP_GET, [] (AsyncWebServerRequest *request) { + // Serial.println("TOGGLE 1"); + // request->redirect("/startrally1"); + // }); - server.on("/TG2", HTTP_GET, [] (AsyncWebServerRequest *request) { - Serial.println("TOGGLE 2"); - request->redirect("/startrally1"); - }); + // server.on("/TG2", HTTP_GET, [] (AsyncWebServerRequest *request) { + // Serial.println("TOGGLE 2"); + // request->redirect("/startrally1"); + // }); server.on("/calibration", HTTP_GET, [] (AsyncWebServerRequest *request) { int params = request->params(); //showing all params @@ -2921,20 +2936,16 @@ Serial.print("try to connect to ssid:");Serial.print(ssid);Serial.print("; with } } } - - // handleloadConst(request, json); - // auto&& data = json.as(); - }); server.addHandler(setconst); server.addHandler(loadconst); -Serial.println("before onevent"); + Serial.println("before onevent"); ws.onEvent(onWsEvent); //add ws event wscal.onEvent(onWsEvent2); //add ws event server.addHandler(&ws); server.addHandler(&wscal); -Serial.println("after onevent"); + Serial.println("after onevent"); server.onNotFound(notFound); Serial.println("onnotfound"); @@ -3495,6 +3506,7 @@ void loop() //loop from VSS RALLY V2 //mem.writeFloat(800, constanta); setMemSpeedInConstanta(constanta, curTrip); + setSpiffSpeedInConstanta(constanta, curTrip); // int pointeradd = ((TRIPADDRESS+curTrip)*32); // mem.writeFloat(pointeradd, constanta); // Trip[curTrip].speed = constanta; @@ -3512,6 +3524,7 @@ void loop() //loop from VSS RALLY V2 //mem.writeLong(768,valuesettime); setMemStime(valuesettime, curTrip); ///added for esp32 + setSpiffStime(valuesettime, curTrip); // int pointeradd = ((TRIPADDRESS+curTrip)*32+4); // mem.writeLong(pointeradd, valuesettime); // Trip[curTrip].startHour = starttracthour; diff --git a/src/template_html.h b/src/template_html.h index 5402afd..7f198b8 100644 --- a/src/template_html.h +++ b/src/template_html.h @@ -212,7 +212,7 @@ const char main_menu[] PROGMEM = R"rawliteral(

MENU

-
+