@twab/visualization 0.9.15 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/visualization.js +996 -987
  2. package/package.json +1 -1
@@ -1675,7 +1675,10 @@ var __vue_render__$4 = function () {
1675
1675
  _vm.commandBarShow
1676
1676
  ? _c(
1677
1677
  "div",
1678
- { staticClass: "visualization-row visualization-justify-center" },
1678
+ {
1679
+ staticClass:
1680
+ "visualization-row visualization-justify-center pt-3",
1681
+ },
1679
1682
  _vm._l(_vm.commandBarBtns, function (btn, index) {
1680
1683
  return _c("div", { key: "command-btn-" + index }, [
1681
1684
  !btn
@@ -1741,11 +1744,11 @@ __vue_render__$4._withStripped = true;
1741
1744
  /* style */
1742
1745
  const __vue_inject_styles__$4 = function (inject) {
1743
1746
  if (!inject) return
1744
- inject("data-v-6ca549de_0", { source: "\n.visualization-row[data-v-6ca549de] {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex: 1 1 auto;\n}\n.visualization-col[data-v-6ca549de] {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\n}\n.visualization-divider[data-v-6ca549de] {\r\n display: block;\r\n flex: 1 1 100%;\r\n height: 0px;\r\n max-height: 0px;\r\n opacity: 1;\r\n transition: inherit;\r\n border-style: solid;\r\n border-width: thin 0 0 0;\r\n border-color: rgba(0, 0, 0, 0.12);\r\n margin: 0;\n}\n.visualization-divider.vertical[data-v-6ca549de] {\r\n align-self: stretch;\r\n border-width: 0 thin 0 0;\r\n display: inline-flex;\r\n height: inherit;\r\n margin-left: -1px;\r\n max-height: 100%;\r\n max-width: 0px;\r\n vertical-align: text-bottom;\r\n width: 0px;\n}\n.visualization-card[data-v-6ca549de] {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n width: 100%;\r\n transition-property: box-shadow, opacity, -webkit-box-shadow;\r\n overflow-wrap: break-word;\r\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\n}\n.visualization-justify-center[data-v-6ca549de],[data-v-6ca549de] .visualization-justify-center {\r\n justify-content: center;\n}\n.visualization-align-center[data-v-6ca549de] {\r\n align-items: center;\n}\n#visualization-container[data-v-6ca549de] {\r\n max-width: 100% !important;\r\n margin: 0 auto !important;\r\n height: 100%;\r\n border-bottom: none;\n}\n#visualization-container > .card[data-v-6ca549de] {\r\n border-radius: 0 !important;\r\n font-size: 12px;\r\n width: 100%;\r\n box-shadow: none;\r\n height: 100%;\n}\n#command-bar[data-v-6ca549de],\r\n#info-bar[data-v-6ca549de] {\r\n background-color: #f5f5f5;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n#command-bar button[data-v-6ca549de] {\r\n width: 42px;\r\n height: 36px;\r\n border: none;\r\n background: none;\n}\n#command-bar button[data-v-6ca549de]:hover {\r\n cursor: pointer;\r\n background: rgba(0, 0, 0, 0.12);\n}\n#command-bar svg[data-v-6ca549de] {\r\n font-size: 16px;\n}\n#command-bar[data-v-6ca549de] {\r\n padding: 0 !important;\n}\n#info-bar[data-v-6ca549de] {\r\n padding: 4px;\r\n font-size: 14px;\r\n position: relative;\n}\n.settings-container[data-v-6ca549de] {\r\n position: absolute;\r\n right: 14px;\r\n top: 50%;\r\n transform: translateY(-50%);\n}\n.settings-container > *[data-v-6ca549de] {\r\n margin: 0 2px;\r\n cursor: pointer;\n}\n#info-bar svg[data-v-6ca549de] {\r\n font-size: 16px;\n}\n#info-bar .divider[data-v-6ca549de] {\r\n margin: 0 8px;\n}\nsvg[data-v-6ca549de]:focus {\r\n border: none;\n}\n.visualization-card[data-v-6ca549de] {\r\n border-left: 8px solid #eee;\n}\n.active-tab[data-v-6ca549de] {\r\n border-left: 8px solid var(--visualization-primary) !important;\r\n border-image-slice: 1;\n}\n[id^='frame-'][data-v-6ca549de] {\r\n padding: 1px;\r\n display: flex;\r\n flex-flow: column;\n}\n.tooltip[data-v-6ca549de] {\r\n display: block !important;\r\n z-index: 10000;\n}\n.tooltip .tooltip-inner[data-v-6ca549de] {\r\n background: var(--visualization-primary);\r\n color: white;\r\n border-radius: 16px;\r\n padding: 5px 10px 4px;\n}\n.tooltip .tooltip-arrow[data-v-6ca549de] {\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n position: absolute;\r\n margin: 5px;\r\n border-color: var(--visualization-primary);\r\n z-index: 1;\n}\n.tooltip[x-placement^='top'][data-v-6ca549de] {\r\n margin-bottom: 5px;\n}\n.tooltip[x-placement^='top'] .tooltip-arrow[data-v-6ca549de] {\r\n border-width: 5px 5px 0 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n bottom: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\n}\n.tooltip[x-placement^='bottom'][data-v-6ca549de] {\r\n margin-top: 5px;\n}\n.tooltip[x-placement^='bottom'] .tooltip-arrow[data-v-6ca549de] {\r\n border-width: 0 5px 5px 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-top-color: transparent !important;\r\n top: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\n}\n.tooltip[x-placement^='right'][data-v-6ca549de] {\r\n margin-left: 5px;\n}\n.tooltip[x-placement^='right'] .tooltip-arrow[data-v-6ca549de] {\r\n border-width: 5px 5px 5px 0;\r\n border-left-color: transparent !important;\r\n border-top-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n left: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\n}\n.tooltip[x-placement^='left'][data-v-6ca549de] {\r\n margin-right: 5px;\n}\n.tooltip[x-placement^='left'] .tooltip-arrow[data-v-6ca549de] {\r\n border-width: 5px 0 5px 5px;\r\n border-top-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n right: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\n}\n.tooltip.popover .popover-inner[data-v-6ca549de] {\r\n background: #f9f9f9;\r\n color: black;\r\n padding: 24px;\r\n border-radius: 5px;\r\n box-shadow: 0 5px 30px rgba(black, 0.1);\n}\n.tooltip.popover .popover-arrow[data-v-6ca549de] {\r\n border-color: #f9f9f9;\n}\n.tooltip[aria-hidden='true'][data-v-6ca549de] {\r\n visibility: hidden;\r\n opacity: 0;\r\n transition: opacity 0.15s, visibility 0.15s;\n}\n.tooltip[aria-hidden='false'][data-v-6ca549de] {\r\n visibility: visible;\r\n opacity: 1;\r\n transition: opacity 0.15s;\n}\r\n", map: {"version":3,"sources":["C:\\workspace\\visualization\\src\\components\\Commands.vue"],"names":[],"mappings":";AAmMA;EACA,aAAA;EACA,eAAA;EACA,cAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;AACA;AAEA;EACA,cAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;EACA,UAAA;EACA,mBAAA;EACA,mBAAA;EACA,wBAAA;EACA,iCAAA;EACA,SAAA;AACA;AAEA;EACA,mBAAA;EACA,wBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,cAAA;EACA,2BAAA;EACA,UAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;EACA,WAAA;EACA,4DAAA;EACA,yBAAA;EACA;qCACA;AACA;AAEA;EACA,uBAAA;AACA;AAEA;EACA,mBAAA;AACA;AAEA;EACA,0BAAA;EACA,yBAAA;EACA,YAAA;EACA,mBAAA;AACA;AACA;EACA,2BAAA;EACA,eAAA;EACA,WAAA;EACA,gBAAA;EACA,YAAA;AACA;AAEA;;EAEA,yBAAA;EACA;mCACA;AACA;AACA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;EACA,+BAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,eAAA;EACA,kBAAA;AACA;AAEA;EACA,kBAAA;EACA,WAAA;EACA,QAAA;EACA,2BAAA;AACA;AAEA;EACA,aAAA;EACA,eAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,aAAA;AACA;AAEA;EACA,YAAA;AACA;AAEA;EACA,2BAAA;AACA;AAEA;EACA,8DAAA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;AACA;AAEA;EACA,yBAAA;EACA,cAAA;AACA;AAEA;EACA,wCAAA;EACA,YAAA;EACA,mBAAA;EACA,qBAAA;AACA;AAEA;EACA,QAAA;EACA,SAAA;EACA,mBAAA;EACA,kBAAA;EACA,WAAA;EACA,0CAAA;EACA,UAAA;AACA;AAEA;EACA,kBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,2CAAA;EACA,YAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,wCAAA;EACA,SAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,gBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,wCAAA;EACA,2CAAA;EACA,UAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,iBAAA;AACA;AAEA;EACA,2BAAA;EACA,wCAAA;EACA,0CAAA;EACA,2CAAA;EACA,WAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,mBAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,uCAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,kBAAA;EACA,UAAA;EACA,2CAAA;AACA;AAEA;EACA,mBAAA;EACA,UAAA;EACA,yBAAA;AACA","file":"Commands.vue","sourcesContent":["<template>\r\n <div\r\n class=\"visualization-col pa-0\"\r\n id=\"command-bar\"\r\n style=\"border-top-right-radius: 6px\"\r\n >\r\n <div\r\n class=\"visualization-row visualization-justify-center\"\r\n v-if=\"commandBarShow\"\r\n >\r\n <div v-for=\"(btn, index) in commandBarBtns\" :key=\"'command-btn-' + index\">\r\n <hr\r\n class=\"visualization-divider vertical\"\r\n v-if=\"!btn\"\r\n style=\"margin: 0 4px\"\r\n />\r\n <button\r\n v-if=\"btn && (btn.condition ? btn.condition() : true)\"\r\n v-tooltip=\"\r\n btn.text && typeof btn.text === 'function' ? btn.text() : btn.text\r\n \"\r\n :style=\"{\r\n color:\r\n btn.color && typeof btn.color === 'function'\r\n ? btn.color()\r\n : 'black',\r\n }\"\r\n class=\"command-bar-btn\"\r\n @click=\"btn.fnc\"\r\n >\r\n <font-awesome-icon\r\n :id=\"btn.id\"\r\n :icon=\"\r\n 'fa-solid ' +\r\n (btn.icon && typeof btn.icon === 'function'\r\n ? btn.icon()\r\n : btn.icon)\r\n \"\r\n />\r\n </button>\r\n </div>\r\n </div>\r\n <hr class=\"visualization-divider\" />\r\n </div>\r\n</template>\r\n<script>\r\nexport default {\r\n props: {\r\n videoPlaying: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n videoPaused: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n insertTime: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n hourIniSelected: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n hourEndSelected: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n },\r\n data() {\r\n return {\r\n commandBarShow: true,\r\n commandBarBtns: [\r\n {\r\n fnc: () => this.$emit('prev-loop-activate'),\r\n icon: 'fa-backward',\r\n text: 'Fast Backward',\r\n id: 'Fast Backward',\r\n },\r\n {\r\n fnc: () => this.$emit('prev'),\r\n icon: 'fa-step-backward',\r\n text: 'Step Backward',\r\n id: 'Step Backward',\r\n },\r\n {\r\n fnc: () => this.$emit('go-to'),\r\n icon: 'fa-clock',\r\n text: this.$i18n.t('infoBar.setHour'),\r\n id: 'Definir Hora',\r\n },\r\n {\r\n fnc: () => this.$emit('next'),\r\n icon: 'fa-step-forward',\r\n text: 'Step Forward',\r\n id: 'Step Forward',\r\n },\r\n {\r\n fnc: () => this.$emit('next-loop-activate'),\r\n icon: 'fa-forward',\r\n text: 'Fast Forward',\r\n id: 'Fast Forward',\r\n },\r\n {\r\n fnc: () => this.$emit('play-or-pause'),\r\n icon: () => {\r\n return this.videoPlaying && !this.videoPaused\r\n ? 'fa-pause'\r\n : 'fa-play'\r\n },\r\n text: () => {\r\n return this.videoPlaying && !this.videoPaused ? 'Pause' : 'Play'\r\n },\r\n id: 'playOrPause',\r\n },\r\n {\r\n fnc: () => this.$emit('stop-playing'),\r\n icon: 'fa-stop',\r\n text: 'Stop',\r\n id: 'Stop',\r\n },\r\n null,\r\n {\r\n fnc: () => this.$emit('open-frame-selection'),\r\n icon: 'fa-border-all',\r\n text: this.$i18n.t('infoBar.gridForm'),\r\n id: 'Formato da grelha',\r\n },\r\n {\r\n fnc: () => this.$emit('open-frames-per-second'),\r\n icon: 'fa-sliders-h',\r\n text: this.$i18n.t('infoBar.secondImage'),\r\n id: 'Segundos por Imagem',\r\n },\r\n // {\r\n // fnc: () => this.$emit('open-blocks'),\r\n // icon: 'fa-cut',\r\n // text: 'Escolher intervalo de blocos',\r\n // id: 'Escolher intervalo de blocos',\r\n // },\r\n {\r\n fnc: () => this.$emit('open-playback-rate'),\r\n icon: 'fa-tachometer-alt',\r\n text: this.$i18n.t('infoBar.chooseVelocity'),\r\n id: 'Escolher velocidade de reprodução',\r\n },\r\n // {\r\n // fnc: () => this.$emit('insert-time-force'),\r\n // icon: 'fa-arrow-turn-down',\r\n // text: 'Recuperar Notícia',\r\n // id: 'Recuperar Notícia',\r\n // condition: () => {\r\n // return this.insertTime\r\n // },\r\n // },\r\n null,\r\n {\r\n fnc: () => this.$emit('set-hour-ini'),\r\n icon: 'fa-hourglass-start',\r\n text: this.$i18n.t('form.inicialHour'),\r\n id: 'Hora Inicial',\r\n color: () => {\r\n return this.hourIniSelected ? 'var(--visualization-start)' : 'black'\r\n },\r\n },\r\n {\r\n fnc: () => this.$emit('insert-time'),\r\n icon: 'fa-arrow-circle-down',\r\n text: this.$i18n.t('infoBar.insert'),\r\n id: 'insert',\r\n condition: () => {\r\n return this.insertTime\r\n },\r\n },\r\n {\r\n fnc: () => this.$emit('set-hour-end'),\r\n icon: 'fa-hourglass-end',\r\n text: this.$i18n.t('form.endHour'),\r\n id: 'Hora Final',\r\n color: () => {\r\n return this.hourEndSelected ? 'var(--visualization-end)' : 'black'\r\n },\r\n },\r\n // {\r\n // fnc: () => this.$emit('check-available-block'),\r\n // icon: 'fa-video',\r\n // text: 'Próximo bloco disponível',\r\n // id: 'Próximo bloco disponível',\r\n // },\r\n ],\r\n }\r\n },\r\n}\r\n</script>\r\n<style scoped>\r\n.visualization-row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex: 1 1 auto;\r\n}\r\n\r\n.visualization-col {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n}\r\n\r\n.visualization-divider {\r\n display: block;\r\n flex: 1 1 100%;\r\n height: 0px;\r\n max-height: 0px;\r\n opacity: 1;\r\n transition: inherit;\r\n border-style: solid;\r\n border-width: thin 0 0 0;\r\n border-color: rgba(0, 0, 0, 0.12);\r\n margin: 0;\r\n}\r\n\r\n.visualization-divider.vertical {\r\n align-self: stretch;\r\n border-width: 0 thin 0 0;\r\n display: inline-flex;\r\n height: inherit;\r\n margin-left: -1px;\r\n max-height: 100%;\r\n max-width: 0px;\r\n vertical-align: text-bottom;\r\n width: 0px;\r\n}\r\n\r\n.visualization-card {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n width: 100%;\r\n transition-property: box-shadow, opacity, -webkit-box-shadow;\r\n overflow-wrap: break-word;\r\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\r\n}\r\n\r\n.visualization-justify-center, /deep/ .visualization-justify-center {\r\n justify-content: center;\r\n}\r\n\r\n.visualization-align-center {\r\n align-items: center;\r\n}\r\n\r\n#visualization-container {\r\n max-width: 100% !important;\r\n margin: 0 auto !important;\r\n height: 100%;\r\n border-bottom: none;\r\n}\r\n#visualization-container > .card {\r\n border-radius: 0 !important;\r\n font-size: 12px;\r\n width: 100%;\r\n box-shadow: none;\r\n height: 100%;\r\n}\r\n\r\n#command-bar,\r\n#info-bar {\r\n background-color: #f5f5f5;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\r\n}\r\n#command-bar button {\r\n width: 42px;\r\n height: 36px;\r\n border: none;\r\n background: none;\r\n}\r\n\r\n#command-bar button:hover {\r\n cursor: pointer;\r\n background: rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n#command-bar svg {\r\n font-size: 16px;\r\n}\r\n\r\n#command-bar {\r\n padding: 0 !important;\r\n}\r\n\r\n#info-bar {\r\n padding: 4px;\r\n font-size: 14px;\r\n position: relative;\r\n}\r\n\r\n.settings-container {\r\n position: absolute;\r\n right: 14px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n}\r\n\r\n.settings-container > * {\r\n margin: 0 2px;\r\n cursor: pointer;\r\n}\r\n\r\n#info-bar svg {\r\n font-size: 16px;\r\n}\r\n\r\n#info-bar .divider {\r\n margin: 0 8px;\r\n}\r\n\r\nsvg:focus {\r\n border: none;\r\n}\r\n\r\n.visualization-card {\r\n border-left: 8px solid #eee;\r\n}\r\n\r\n.active-tab {\r\n border-left: 8px solid var(--visualization-primary) !important;\r\n border-image-slice: 1;\r\n}\r\n\r\n[id^='frame-'] {\r\n padding: 1px;\r\n display: flex;\r\n flex-flow: column;\r\n}\r\n\r\n.tooltip {\r\n display: block !important;\r\n z-index: 10000;\r\n}\r\n\r\n.tooltip .tooltip-inner {\r\n background: var(--visualization-primary);\r\n color: white;\r\n border-radius: 16px;\r\n padding: 5px 10px 4px;\r\n}\r\n\r\n.tooltip .tooltip-arrow {\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n position: absolute;\r\n margin: 5px;\r\n border-color: var(--visualization-primary);\r\n z-index: 1;\r\n}\r\n\r\n.tooltip[x-placement^='top'] {\r\n margin-bottom: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='top'] .tooltip-arrow {\r\n border-width: 5px 5px 0 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n bottom: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\n\r\n.tooltip[x-placement^='bottom'] {\r\n margin-top: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='bottom'] .tooltip-arrow {\r\n border-width: 0 5px 5px 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-top-color: transparent !important;\r\n top: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\n\r\n.tooltip[x-placement^='right'] {\r\n margin-left: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='right'] .tooltip-arrow {\r\n border-width: 5px 5px 5px 0;\r\n border-left-color: transparent !important;\r\n border-top-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n left: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\r\n}\r\n\r\n.tooltip[x-placement^='left'] {\r\n margin-right: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='left'] .tooltip-arrow {\r\n border-width: 5px 0 5px 5px;\r\n border-top-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n right: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\r\n}\r\n\r\n.tooltip.popover .popover-inner {\r\n background: #f9f9f9;\r\n color: black;\r\n padding: 24px;\r\n border-radius: 5px;\r\n box-shadow: 0 5px 30px rgba(black, 0.1);\r\n}\r\n\r\n.tooltip.popover .popover-arrow {\r\n border-color: #f9f9f9;\r\n}\r\n\r\n.tooltip[aria-hidden='true'] {\r\n visibility: hidden;\r\n opacity: 0;\r\n transition: opacity 0.15s, visibility 0.15s;\r\n}\r\n\r\n.tooltip[aria-hidden='false'] {\r\n visibility: visible;\r\n opacity: 1;\r\n transition: opacity 0.15s;\r\n}\r\n</style>"]}, media: undefined });
1747
+ inject("data-v-aa03c4c2_0", { source: "\n.visualization-row[data-v-aa03c4c2] {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex: 1 1 auto;\n}\n.visualization-col[data-v-aa03c4c2] {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\n}\n.visualization-divider[data-v-aa03c4c2] {\r\n display: block;\r\n flex: 1 1 100%;\r\n height: 0px;\r\n max-height: 0px;\r\n opacity: 1;\r\n transition: inherit;\r\n border-style: solid;\r\n border-width: thin 0 0 0;\r\n border-color: rgba(0, 0, 0, 0.12);\r\n margin: 0;\n}\n.visualization-divider.vertical[data-v-aa03c4c2] {\r\n align-self: stretch;\r\n border-width: 0 thin 0 0;\r\n display: inline-flex;\r\n height: inherit;\r\n margin-left: -1px;\r\n max-height: 100%;\r\n max-width: 0px;\r\n vertical-align: text-bottom;\r\n width: 0px;\n}\n.visualization-card[data-v-aa03c4c2] {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n width: 100%;\r\n transition-property: box-shadow, opacity, -webkit-box-shadow;\r\n overflow-wrap: break-word;\r\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\n}\n.visualization-justify-center[data-v-aa03c4c2],[data-v-aa03c4c2] .visualization-justify-center {\r\n justify-content: center;\n}\n.visualization-align-center[data-v-aa03c4c2] {\r\n align-items: center;\n}\n#visualization-container[data-v-aa03c4c2] {\r\n max-width: 100% !important;\r\n margin: 0 auto !important;\r\n height: 100%;\r\n border-bottom: none;\n}\n#visualization-container > .card[data-v-aa03c4c2] {\r\n border-radius: 0 !important;\r\n font-size: 12px;\r\n width: 100%;\r\n box-shadow: none;\r\n height: 100%;\n}\n#command-bar[data-v-aa03c4c2],\r\n#info-bar[data-v-aa03c4c2] {\r\n background-color: #f5f5f5;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n#command-bar button[data-v-aa03c4c2] {\r\n width: 42px;\r\n height: 36px;\r\n border: none;\r\n background: none;\n}\n#command-bar button[data-v-aa03c4c2]:hover {\r\n cursor: pointer;\r\n background: rgba(0, 0, 0, 0.12);\n}\n#command-bar svg[data-v-aa03c4c2] {\r\n font-size: 16px;\n}\n#command-bar[data-v-aa03c4c2] {\r\n padding: 0 !important;\n}\n#info-bar[data-v-aa03c4c2] {\r\n padding: 4px;\r\n font-size: 14px;\r\n position: relative;\n}\n.settings-container[data-v-aa03c4c2] {\r\n position: absolute;\r\n right: 14px;\r\n top: 50%;\r\n transform: translateY(-50%);\n}\n.settings-container > *[data-v-aa03c4c2] {\r\n margin: 0 2px;\r\n cursor: pointer;\n}\n#info-bar svg[data-v-aa03c4c2] {\r\n font-size: 16px;\n}\n#info-bar .divider[data-v-aa03c4c2] {\r\n margin: 0 8px;\n}\nsvg[data-v-aa03c4c2]:focus {\r\n border: none;\n}\n.visualization-card[data-v-aa03c4c2] {\r\n border-left: 8px solid #eee;\n}\n.active-tab[data-v-aa03c4c2] {\r\n border-left: 8px solid var(--visualization-primary) !important;\r\n border-image-slice: 1;\n}\n[id^='frame-'][data-v-aa03c4c2] {\r\n padding: 1px;\r\n display: flex;\r\n flex-flow: column;\n}\n.tooltip[data-v-aa03c4c2] {\r\n display: block !important;\r\n z-index: 10000;\n}\n.tooltip .tooltip-inner[data-v-aa03c4c2] {\r\n background: var(--visualization-primary);\r\n color: white;\r\n border-radius: 16px;\r\n padding: 5px 10px 4px;\n}\n.tooltip .tooltip-arrow[data-v-aa03c4c2] {\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n position: absolute;\r\n margin: 5px;\r\n border-color: var(--visualization-primary);\r\n z-index: 1;\n}\n.tooltip[x-placement^='top'][data-v-aa03c4c2] {\r\n margin-bottom: 5px;\n}\n.tooltip[x-placement^='top'] .tooltip-arrow[data-v-aa03c4c2] {\r\n border-width: 5px 5px 0 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n bottom: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\n}\n.tooltip[x-placement^='bottom'][data-v-aa03c4c2] {\r\n margin-top: 5px;\n}\n.tooltip[x-placement^='bottom'] .tooltip-arrow[data-v-aa03c4c2] {\r\n border-width: 0 5px 5px 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-top-color: transparent !important;\r\n top: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\n}\n.tooltip[x-placement^='right'][data-v-aa03c4c2] {\r\n margin-left: 5px;\n}\n.tooltip[x-placement^='right'] .tooltip-arrow[data-v-aa03c4c2] {\r\n border-width: 5px 5px 5px 0;\r\n border-left-color: transparent !important;\r\n border-top-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n left: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\n}\n.tooltip[x-placement^='left'][data-v-aa03c4c2] {\r\n margin-right: 5px;\n}\n.tooltip[x-placement^='left'] .tooltip-arrow[data-v-aa03c4c2] {\r\n border-width: 5px 0 5px 5px;\r\n border-top-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n right: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\n}\n.tooltip.popover .popover-inner[data-v-aa03c4c2] {\r\n background: #f9f9f9;\r\n color: black;\r\n padding: 24px;\r\n border-radius: 5px;\r\n box-shadow: 0 5px 30px rgba(black, 0.1);\n}\n.tooltip.popover .popover-arrow[data-v-aa03c4c2] {\r\n border-color: #f9f9f9;\n}\n.tooltip[aria-hidden='true'][data-v-aa03c4c2] {\r\n visibility: hidden;\r\n opacity: 0;\r\n transition: opacity 0.15s, visibility 0.15s;\n}\n.tooltip[aria-hidden='false'][data-v-aa03c4c2] {\r\n visibility: visible;\r\n opacity: 1;\r\n transition: opacity 0.15s;\n}\r\n", map: {"version":3,"sources":["C:\\workspace\\visualization\\src\\components\\Commands.vue"],"names":[],"mappings":";AAmMA;EACA,aAAA;EACA,eAAA;EACA,cAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;AACA;AAEA;EACA,cAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;EACA,UAAA;EACA,mBAAA;EACA,mBAAA;EACA,wBAAA;EACA,iCAAA;EACA,SAAA;AACA;AAEA;EACA,mBAAA;EACA,wBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,cAAA;EACA,2BAAA;EACA,UAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;EACA,WAAA;EACA,4DAAA;EACA,yBAAA;EACA;qCACA;AACA;AAEA;EAEA,uBAAA;AACA;AAEA;EACA,mBAAA;AACA;AAEA;EACA,0BAAA;EACA,yBAAA;EACA,YAAA;EACA,mBAAA;AACA;AACA;EACA,2BAAA;EACA,eAAA;EACA,WAAA;EACA,gBAAA;EACA,YAAA;AACA;AAEA;;EAEA,yBAAA;EACA;mCACA;AACA;AACA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;EACA,+BAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,eAAA;EACA,kBAAA;AACA;AAEA;EACA,kBAAA;EACA,WAAA;EACA,QAAA;EACA,2BAAA;AACA;AAEA;EACA,aAAA;EACA,eAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,aAAA;AACA;AAEA;EACA,YAAA;AACA;AAEA;EACA,2BAAA;AACA;AAEA;EACA,8DAAA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;AACA;AAEA;EACA,yBAAA;EACA,cAAA;AACA;AAEA;EACA,wCAAA;EACA,YAAA;EACA,mBAAA;EACA,qBAAA;AACA;AAEA;EACA,QAAA;EACA,SAAA;EACA,mBAAA;EACA,kBAAA;EACA,WAAA;EACA,0CAAA;EACA,UAAA;AACA;AAEA;EACA,kBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,2CAAA;EACA,YAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,wCAAA;EACA,SAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,gBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,wCAAA;EACA,2CAAA;EACA,UAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,iBAAA;AACA;AAEA;EACA,2BAAA;EACA,wCAAA;EACA,0CAAA;EACA,2CAAA;EACA,WAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,mBAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,uCAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,kBAAA;EACA,UAAA;EACA,2CAAA;AACA;AAEA;EACA,mBAAA;EACA,UAAA;EACA,yBAAA;AACA","file":"Commands.vue","sourcesContent":["<template>\r\n <div\r\n class=\"visualization-col pa-0\"\r\n id=\"command-bar\"\r\n style=\"border-top-right-radius: 6px\"\r\n >\r\n <div\r\n class=\"visualization-row visualization-justify-center pt-3\"\r\n v-if=\"commandBarShow\"\r\n >\r\n <div v-for=\"(btn, index) in commandBarBtns\" :key=\"'command-btn-' + index\">\r\n <hr\r\n class=\"visualization-divider vertical\"\r\n v-if=\"!btn\"\r\n style=\"margin: 0 4px\"\r\n />\r\n <button\r\n v-if=\"btn && (btn.condition ? btn.condition() : true)\"\r\n v-tooltip=\"\r\n btn.text && typeof btn.text === 'function' ? btn.text() : btn.text\r\n \"\r\n :style=\"{\r\n color:\r\n btn.color && typeof btn.color === 'function'\r\n ? btn.color()\r\n : 'black',\r\n }\"\r\n class=\"command-bar-btn\"\r\n @click=\"btn.fnc\"\r\n >\r\n <font-awesome-icon\r\n :id=\"btn.id\"\r\n :icon=\"\r\n 'fa-solid ' +\r\n (btn.icon && typeof btn.icon === 'function'\r\n ? btn.icon()\r\n : btn.icon)\r\n \"\r\n />\r\n </button>\r\n </div>\r\n </div>\r\n <hr class=\"visualization-divider\" />\r\n </div>\r\n</template>\r\n<script>\r\nexport default {\r\n props: {\r\n videoPlaying: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n videoPaused: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n insertTime: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n hourIniSelected: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n hourEndSelected: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n },\r\n data() {\r\n return {\r\n commandBarShow: true,\r\n commandBarBtns: [\r\n {\r\n fnc: () => this.$emit('prev-loop-activate'),\r\n icon: 'fa-backward',\r\n text: 'Fast Backward',\r\n id: 'Fast Backward',\r\n },\r\n {\r\n fnc: () => this.$emit('prev'),\r\n icon: 'fa-step-backward',\r\n text: 'Step Backward',\r\n id: 'Step Backward',\r\n },\r\n {\r\n fnc: () => this.$emit('go-to'),\r\n icon: 'fa-clock',\r\n text: this.$i18n.t('infoBar.setHour'),\r\n id: 'Definir Hora',\r\n },\r\n {\r\n fnc: () => this.$emit('next'),\r\n icon: 'fa-step-forward',\r\n text: 'Step Forward',\r\n id: 'Step Forward',\r\n },\r\n {\r\n fnc: () => this.$emit('next-loop-activate'),\r\n icon: 'fa-forward',\r\n text: 'Fast Forward',\r\n id: 'Fast Forward',\r\n },\r\n {\r\n fnc: () => this.$emit('play-or-pause'),\r\n icon: () => {\r\n return this.videoPlaying && !this.videoPaused\r\n ? 'fa-pause'\r\n : 'fa-play'\r\n },\r\n text: () => {\r\n return this.videoPlaying && !this.videoPaused ? 'Pause' : 'Play'\r\n },\r\n id: 'playOrPause',\r\n },\r\n {\r\n fnc: () => this.$emit('stop-playing'),\r\n icon: 'fa-stop',\r\n text: 'Stop',\r\n id: 'Stop',\r\n },\r\n null,\r\n {\r\n fnc: () => this.$emit('open-frame-selection'),\r\n icon: 'fa-border-all',\r\n text: this.$i18n.t('infoBar.gridForm'),\r\n id: 'Formato da grelha',\r\n },\r\n {\r\n fnc: () => this.$emit('open-frames-per-second'),\r\n icon: 'fa-sliders-h',\r\n text: this.$i18n.t('infoBar.secondImage'),\r\n id: 'Segundos por Imagem',\r\n },\r\n // {\r\n // fnc: () => this.$emit('open-blocks'),\r\n // icon: 'fa-cut',\r\n // text: 'Escolher intervalo de blocos',\r\n // id: 'Escolher intervalo de blocos',\r\n // },\r\n {\r\n fnc: () => this.$emit('open-playback-rate'),\r\n icon: 'fa-tachometer-alt',\r\n text: this.$i18n.t('infoBar.chooseVelocity'),\r\n id: 'Escolher velocidade de reprodução',\r\n },\r\n // {\r\n // fnc: () => this.$emit('insert-time-force'),\r\n // icon: 'fa-arrow-turn-down',\r\n // text: 'Recuperar Notícia',\r\n // id: 'Recuperar Notícia',\r\n // condition: () => {\r\n // return this.insertTime\r\n // },\r\n // },\r\n null,\r\n {\r\n fnc: () => this.$emit('set-hour-ini'),\r\n icon: 'fa-hourglass-start',\r\n text: this.$i18n.t('form.inicialHour'),\r\n id: 'Hora Inicial',\r\n color: () => {\r\n return this.hourIniSelected ? 'var(--visualization-start)' : 'black'\r\n },\r\n },\r\n {\r\n fnc: () => this.$emit('insert-time'),\r\n icon: 'fa-arrow-circle-down',\r\n text: this.$i18n.t('infoBar.insert'),\r\n id: 'insert',\r\n condition: () => {\r\n return this.insertTime\r\n },\r\n },\r\n {\r\n fnc: () => this.$emit('set-hour-end'),\r\n icon: 'fa-hourglass-end',\r\n text: this.$i18n.t('form.endHour'),\r\n id: 'Hora Final',\r\n color: () => {\r\n return this.hourEndSelected ? 'var(--visualization-end)' : 'black'\r\n },\r\n },\r\n // {\r\n // fnc: () => this.$emit('check-available-block'),\r\n // icon: 'fa-video',\r\n // text: 'Próximo bloco disponível',\r\n // id: 'Próximo bloco disponível',\r\n // },\r\n ],\r\n }\r\n },\r\n}\r\n</script>\r\n<style scoped>\r\n.visualization-row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex: 1 1 auto;\r\n}\r\n\r\n.visualization-col {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n}\r\n\r\n.visualization-divider {\r\n display: block;\r\n flex: 1 1 100%;\r\n height: 0px;\r\n max-height: 0px;\r\n opacity: 1;\r\n transition: inherit;\r\n border-style: solid;\r\n border-width: thin 0 0 0;\r\n border-color: rgba(0, 0, 0, 0.12);\r\n margin: 0;\r\n}\r\n\r\n.visualization-divider.vertical {\r\n align-self: stretch;\r\n border-width: 0 thin 0 0;\r\n display: inline-flex;\r\n height: inherit;\r\n margin-left: -1px;\r\n max-height: 100%;\r\n max-width: 0px;\r\n vertical-align: text-bottom;\r\n width: 0px;\r\n}\r\n\r\n.visualization-card {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n width: 100%;\r\n transition-property: box-shadow, opacity, -webkit-box-shadow;\r\n overflow-wrap: break-word;\r\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\r\n}\r\n\r\n.visualization-justify-center,\r\n/deep/ .visualization-justify-center {\r\n justify-content: center;\r\n}\r\n\r\n.visualization-align-center {\r\n align-items: center;\r\n}\r\n\r\n#visualization-container {\r\n max-width: 100% !important;\r\n margin: 0 auto !important;\r\n height: 100%;\r\n border-bottom: none;\r\n}\r\n#visualization-container > .card {\r\n border-radius: 0 !important;\r\n font-size: 12px;\r\n width: 100%;\r\n box-shadow: none;\r\n height: 100%;\r\n}\r\n\r\n#command-bar,\r\n#info-bar {\r\n background-color: #f5f5f5;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\r\n}\r\n#command-bar button {\r\n width: 42px;\r\n height: 36px;\r\n border: none;\r\n background: none;\r\n}\r\n\r\n#command-bar button:hover {\r\n cursor: pointer;\r\n background: rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n#command-bar svg {\r\n font-size: 16px;\r\n}\r\n\r\n#command-bar {\r\n padding: 0 !important;\r\n}\r\n\r\n#info-bar {\r\n padding: 4px;\r\n font-size: 14px;\r\n position: relative;\r\n}\r\n\r\n.settings-container {\r\n position: absolute;\r\n right: 14px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n}\r\n\r\n.settings-container > * {\r\n margin: 0 2px;\r\n cursor: pointer;\r\n}\r\n\r\n#info-bar svg {\r\n font-size: 16px;\r\n}\r\n\r\n#info-bar .divider {\r\n margin: 0 8px;\r\n}\r\n\r\nsvg:focus {\r\n border: none;\r\n}\r\n\r\n.visualization-card {\r\n border-left: 8px solid #eee;\r\n}\r\n\r\n.active-tab {\r\n border-left: 8px solid var(--visualization-primary) !important;\r\n border-image-slice: 1;\r\n}\r\n\r\n[id^='frame-'] {\r\n padding: 1px;\r\n display: flex;\r\n flex-flow: column;\r\n}\r\n\r\n.tooltip {\r\n display: block !important;\r\n z-index: 10000;\r\n}\r\n\r\n.tooltip .tooltip-inner {\r\n background: var(--visualization-primary);\r\n color: white;\r\n border-radius: 16px;\r\n padding: 5px 10px 4px;\r\n}\r\n\r\n.tooltip .tooltip-arrow {\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n position: absolute;\r\n margin: 5px;\r\n border-color: var(--visualization-primary);\r\n z-index: 1;\r\n}\r\n\r\n.tooltip[x-placement^='top'] {\r\n margin-bottom: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='top'] .tooltip-arrow {\r\n border-width: 5px 5px 0 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n bottom: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\n\r\n.tooltip[x-placement^='bottom'] {\r\n margin-top: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='bottom'] .tooltip-arrow {\r\n border-width: 0 5px 5px 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-top-color: transparent !important;\r\n top: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\n\r\n.tooltip[x-placement^='right'] {\r\n margin-left: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='right'] .tooltip-arrow {\r\n border-width: 5px 5px 5px 0;\r\n border-left-color: transparent !important;\r\n border-top-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n left: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\r\n}\r\n\r\n.tooltip[x-placement^='left'] {\r\n margin-right: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='left'] .tooltip-arrow {\r\n border-width: 5px 0 5px 5px;\r\n border-top-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n right: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\r\n}\r\n\r\n.tooltip.popover .popover-inner {\r\n background: #f9f9f9;\r\n color: black;\r\n padding: 24px;\r\n border-radius: 5px;\r\n box-shadow: 0 5px 30px rgba(black, 0.1);\r\n}\r\n\r\n.tooltip.popover .popover-arrow {\r\n border-color: #f9f9f9;\r\n}\r\n\r\n.tooltip[aria-hidden='true'] {\r\n visibility: hidden;\r\n opacity: 0;\r\n transition: opacity 0.15s, visibility 0.15s;\r\n}\r\n\r\n.tooltip[aria-hidden='false'] {\r\n visibility: visible;\r\n opacity: 1;\r\n transition: opacity 0.15s;\r\n}\r\n</style>\r\n"]}, media: undefined });
1745
1748
 
1746
1749
  };
1747
1750
  /* scoped */
1748
- const __vue_scope_id__$4 = "data-v-6ca549de";
1751
+ const __vue_scope_id__$4 = "data-v-aa03c4c2";
1749
1752
  /* module identifier */
1750
1753
  const __vue_module_identifier__$4 = undefined;
1751
1754
  /* functional template */
@@ -2392,37 +2395,17 @@ __vue_render__$2._withStripped = true;
2392
2395
  undefined
2393
2396
  );
2394
2397
 
2395
- var one_one = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M558.2 0v90.1h-88.3c-1.9 0-1.9 0-1.9-1.9V1.8c0-1.8 0-1.8 1.8-1.8h88.4zm-468 183.5H0V95.1c0-1.7 0-1.7 1.7-1.7h86.7c1.8 0 1.8 0 1.8 1.8v88.3zm93.6 0H93.6V95.3c0-1.9 0-1.9 1.9-1.9H182c1.8 0 1.8 0 1.8 1.8v88.3zm280.9 0h-90.2V95.1c0-1.7 0-1.7 1.6-1.7H463c1.6 0 1.6 0 1.6 1.7v62.2l.1 26.2zm93.5-90v89c0 .9-.2 1.1-1.1 1.1H468V95.2c0-1.7 0-1.7 1.7-1.7h88.5zm-280.9 90h-90V94.9c0-.9.1-1.5 1.2-1.5H276c.9 0 1.2.3 1.2 1.2l.1 88.9zm93.6 0h-90V95.1c0-1.7 0-1.7 1.7-1.7h86.5c1.8 0 1.8 0 1.8 1.8v88.3z\" fill=\"#cbcbcb\"/><path d=\"M0 45.1V1.5C0 .3.3 0 1.4 0h87.3c1.2 0 1.5.3 1.4 1.5v87.1c0 1.2-.3 1.5-1.5 1.5H1.4c-1.3 0-1.5-.4-1.5-1.6L0 45.1z\" fill=\"#1565c0\"/><path d=\"M93.6 44.9V1.5c0-1.6 0-1.6 1.6-1.6h87.1c1.5 0 1.5 0 1.5 1.6v86.8c0 1.6 0 1.6-1.6 1.6H95.4c-1.8 0-1.8 0-1.8-1.8V44.9zm280.9.2V1.6c0-1.6 0-1.6 1.6-1.6h87.1c1.5 0 1.5 0 1.5 1.6v86.7c0 1.8 0 1.8-1.8 1.8h-86.7c-1.7 0-1.7 0-1.7-1.7V45.1zm-142.1 45H189c-1.6 0-1.6 0-1.6-1.5v-87c0-1.6 0-1.6 1.6-1.6h86.8c1.6 0 1.6 0 1.6 1.5v87c0 1.6 0 1.6-1.6 1.6h-43.4zm48.5-45.2V1.5c0-1.6 0-1.6 1.6-1.6h86.8c1.6 0 1.6 0 1.6 1.5v87c0 1.6 0 1.6-1.6 1.6h-86.8c-1.6 0-1.6 0-1.6-1.6V44.9z\" fill=\"#cbcbcb\"/></svg>";
2396
-
2397
- var two_one = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M277.3 183.5h-90.2V94.2c0-.6.2-.9.8-.9h87.7c1 0 1.6 0 1.6 1.3l.1 88.9zM558.2 0v90.1h-88.3c-1.9 0-1.9 0-1.9-1.9V1.8c0-1.8 0-1.8 1.8-1.8h88.4zm-468 183.5H0V95.1c0-1.7 0-1.7 1.7-1.7h86.7c1.8 0 1.8 0 1.8 1.8v88.3zm93.6 0H93.6V95.3c0-1.9 0-1.9 1.9-1.9H182c1.8 0 1.8 0 1.8 1.8v88.3zm280.9 0h-90.2V95.1c0-1.7 0-1.7 1.6-1.7H463c1.6 0 1.6 0 1.6 1.7v61.2l.1 27.2zm93.5-90v89c0 .9-.2 1.1-1.1 1.1H468V95.2c0-1.7 0-1.7 1.7-1.7h88.5zm-187.1 90h-90.2V94.6c0-1.1.4-1.5 1.5-1.5l6.8.3h80.2c1.1 0 1.5.2 1.5 1.4l.2 61.9.5 25.1c0 .7.1 1.3-.5 1.7z\" fill=\"#cbcbcb\"/><path d=\"M183.8 45.1v43.5c0 1.1-.2 1.6-1.5 1.6H95c-1.2 0-1.4-.4-1.4-1.5V1.5C93.6.2 94 0 95.1 0h87.3c1.2 0 1.4.4 1.4 1.5v43.6zM45.1 0h43.7c1.1 0 1.4.2 1.4 1.4v87.3c0 1.1-.4 1.4-1.4 1.4H1.4c-1.1 0-1.3-.3-1.3-1.3L0 1.3C0 .2.3 0 1.3 0h43.8z\" fill=\"#1565c0\"/><path d=\"M419.6 90.1h-43.5c-1.6 0-1.6 0-1.6-1.6V1.6c0-1.6 0-1.6 1.6-1.6h87.1c1.5 0 1.5 0 1.5 1.6v86.7c0 1.8 0 1.8-1.8 1.8h-43.3zM277.3 44.9v43.5c0 1.7 0 1.7-1.6 1.7h-86.8c-1.6 0-1.6 0-1.6-1.6v-87c0-1.5 0-1.5 1.6-1.5h86.8c1.6 0 1.6 0 1.6 1.6v43.3zm93.6.3v43.2c0 1.7 0 1.7-1.6 1.7h-86.8c-1.6 0-1.6 0-1.6-1.6v-87c0-1.5 0-1.5 1.6-1.5h86.8c1.6 0 1.6 0 1.6 1.6v43.6z\" fill=\"#cbcbcb\"/></svg>";
2398
-
2399
- var three_one = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M277.3 183.5h-90.2V94.2c0-.6.2-.9.8-.9h87.8c1 0 1.6 0 1.6 1.3v88.9zM558.2 0v90.1h-88.3c-1.9 0-1.9 0-1.9-1.9V1.8c0-1.8 0-1.8 1.8-1.8h88.4zm-468 183.5H0V95.1c0-1.7 0-1.7 1.7-1.7h86.7c1.8 0 1.8 0 1.8 1.8v88.3zm93.6 0H93.6V95.3c0-1.9 0-1.9 1.9-1.9H182c1.8 0 1.8 0 1.8 1.8v88.3zm280.9 0h-90.2V95.1c0-1.7 0-1.7 1.6-1.7H463c1.6 0 1.6 0 1.6 1.7V157l.1 26.5zm93.5-90v89c0 .9-.2 1.1-1.1 1.1H468V95.2c0-1.7 0-1.7 1.7-1.7h88.5zm-187.1 90h-90.2V94.6c0-1.1.4-1.5 1.5-1.5l6.8.3h80.2c1.1 0 1.5.2 1.5 1.4l.2 61.9.5 25.1c0 .7.1 1.3-.5 1.7z\" fill=\"#cbcbcb\"/><path d=\"M45.1 90.1H1.4c-1.1 0-1.5-.3-1.5-1.4L0 1.5C0 .3.3 0 1.5 0h87.3c1.2 0 1.4.4 1.4 1.5v87.1c0 1.2-.3 1.5-1.5 1.5H45.1zM138.8 0h43.5c1.1 0 1.5.3 1.5 1.4v87.2c0 1.2-.3 1.4-1.5 1.4H95.1c-1.2 0-1.5-.3-1.5-1.5V1.4C93.6.2 94 0 95.1 0h43.7z\" fill=\"#1565c0\"/><path d=\"M374.5 45.1V1.6c0-1.6 0-1.6 1.6-1.6h87.1c1.6 0 1.6 0 1.6 1.6v86.8c0 1.7 0 1.7-1.7 1.7h-86.9c-1.6 0-1.6 0-1.6-1.5l-.1-43.5z\" fill=\"#cbcbcb\"/><path d=\"M277.3 45.1v43.5c0 1.5 0 1.5-1.6 1.5h-86.9c-1.5 0-1.5 0-1.5-1.6V1.6c0-1.2.2-1.6 1.5-1.5H276c1.2 0 1.4.4 1.4 1.5l-.1 43.5z\" fill=\"#1565c0\"/><path d=\"M370.9 45.2v43.2c0 1.7 0 1.7-1.6 1.7h-86.8c-1.6 0-1.6 0-1.6-1.6v-87c0-1.5 0-1.5 1.6-1.5h86.8c1.6 0 1.6 0 1.6 1.6v43.6z\" fill=\"#cbcbcb\"/></svg>";
2400
-
2401
- var three_two = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M277.3 183.5h-90.2V95c0-1.6 0-1.6 1.6-1.6h86.9c1.7 0 1.7 0 1.7 1.7v88.4z\" fill=\"#1565c0\"/><path d=\"M558.2 0v90.1h-88.3c-1.9 0-1.9 0-1.9-1.9V1.8c0-1.8 0-1.8 1.8-1.8h88.4z\" fill=\"#cbcbcb\"/><path d=\"M90.2 183.5H0V95.2c0-1.9-.2-1.8 1.7-1.8h86.7c1.7 0 1.7 0 1.7 1.8v86.6c.1.6.1 1.2.1 1.7zm93.6 0H93.6V95.2c0-1.8 0-1.8 1.7-1.8H182c1.9 0 1.7-.2 1.7 1.8l.1 88.3z\" fill=\"#1565c0\"/><path d=\"M464.7 183.5h-90.2V95.1c0-1.7 0-1.7 1.6-1.7H463c1.6 0 1.6 0 1.6 1.7v62.6l.1 25.8zm93.5-90v89c0 .9-.2 1.1-1.1 1.1H468V95.2c0-1.7 0-1.7 1.7-1.7h88.5zm-187.1 90h-90.2V94.6c0-1.1.4-1.5 1.5-1.5l6.8.3h80.2c1.1 0 1.5.2 1.5 1.4l.2 61.8.5 25.2c0 .7.1 1.3-.5 1.7z\" fill=\"#cbcbcb\"/><path d=\"M45.1 90.1H1.4c-1.1 0-1.5-.3-1.5-1.4L0 1.5C0 .3.3 0 1.5 0h87.3c1.2 0 1.4.4 1.4 1.5v87.1c0 1.2-.3 1.5-1.5 1.5H45.1zM138.8 0h43.5c1.1 0 1.5.3 1.5 1.4v87.2c0 1.2-.3 1.4-1.5 1.4H95.1c-1.2 0-1.5-.3-1.5-1.5V1.4C93.6.2 94 0 95.1 0h43.7z\" fill=\"#1565c0\"/><path d=\"M374.5 45.1V1.6c0-1.6 0-1.6 1.6-1.6h87.1c1.6 0 1.6 0 1.6 1.6v86.8c0 1.7 0 1.7-1.7 1.7h-86.9c-1.6 0-1.6 0-1.6-1.5l-.1-43.5z\" fill=\"#cbcbcb\"/><path d=\"M277.3 45.1v43.5c0 1.5 0 1.5-1.6 1.5h-86.9c-1.5 0-1.5 0-1.5-1.6V1.6c0-1.2.2-1.6 1.5-1.5H276c1.2 0 1.4.4 1.4 1.5l-.1 43.5z\" fill=\"#1565c0\"/><path d=\"M370.9 45.2v43.2c0 1.7 0 1.7-1.6 1.7h-86.8c-1.6 0-1.6 0-1.6-1.6v-87c0-1.5 0-1.5 1.6-1.5h86.8c1.6 0 1.6 0 1.6 1.6v43.6z\" fill=\"#cbcbcb\"/></svg>";
2402
-
2403
- var four_one = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M558.2 0v90.1h-88.3c-1.9 0-1.9 0-1.9-1.9V1.8c0-1.8 0-1.8 1.8-1.8h88.4zm-468 183.5H0V95.1c0-1.7 0-1.7 1.7-1.7h86.7c1.8 0 1.8 0 1.8 1.8v88.3zm93.6 0H93.6V95.3c0-1.9 0-1.9 1.9-1.9H182c1.8 0 1.8 0 1.8 1.8v88.3zm280.9 0h-90.2V95.1c0-1.7 0-1.7 1.6-1.7H463c1.6 0 1.6 0 1.6 1.7v64.1l.1 24.3zm93.5-90v89c0 .9-.2 1.1-1.1 1.1H468V95.2c0-1.7 0-1.7 1.7-1.7h88.5zm-280.9 90h-90V94.8c0-.9.1-1.5 1.2-1.5H276c.9 0 1.2.3 1.2 1.2l.1 89zm93.6 0h-90V95.1c0-1.7 0-1.7 1.7-1.7h86.5c1.8 0 1.8 0 1.8 1.8v88.3z\" fill=\"#cbcbcb\"/><path d=\"M0 45.1V1.5C0 .3.3 0 1.4 0h87.3c1.2 0 1.5.3 1.4 1.5v87.1c0 1.2-.3 1.5-1.5 1.5H1.4c-1.3 0-1.5-.4-1.5-1.6L0 45.1zm93.6-.2V1.4C93.6.3 93.9 0 95 0h87.3c1.2 0 1.4.3 1.4 1.5v87.2c0 1.2-.4 1.4-1.5 1.4H95c-1.2 0-1.5-.4-1.5-1.5l.1-43.7z\" fill=\"#1565c0\"/><path d=\"M374.5 45.1V1.6c0-1.6 0-1.6 1.6-1.6h87.1c1.5 0 1.5 0 1.5 1.6v86.7c0 1.8 0 1.8-1.8 1.8h-86.7c-1.7 0-1.7 0-1.7-1.7V45.1z\" fill=\"#cbcbcb\"/><path d=\"M277.3 45.1v43.4c0 1.6 0 1.6-1.6 1.6h-86.8c-1.6 0-1.6 0-1.6-1.6V1.7c0-1.6 0-1.6 1.5-1.6h87c1.5 0 1.6 0 1.6 1.5l-.1 43.5zm3.6-.2V1.4c0-1.1.3-1.5 1.4-1.5h87.2c1.2 0 1.5.3 1.5 1.5v87.2c0 1.1-.3 1.4-1.4 1.4h-87.3c-1.1 0-1.4-.4-1.4-1.4V44.9z\" fill=\"#1565c0\"/></svg>";
2404
-
2405
- var four_two = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M558.2 0v90.1h-88.3c-1.9 0-1.9 0-1.9-1.9V1.8c0-1.8 0-1.8 1.8-1.8h88.4z\" fill=\"#cbcbcb\"/><path d=\"M90.2 183.5H0V95.2c0-1.9-.2-1.8 1.7-1.8h86.7c1.7 0 1.7 0 1.7 1.8v86.6c.1.6.1 1.2.1 1.7zm93.6 0H93.6V95.2c0-1.8 0-1.8 1.7-1.8H182c1.9 0 1.7-.2 1.7 1.8l.1 88.3z\" fill=\"#1565c0\"/><path d=\"M464.6 183.5h-90.2V95.1c0-1.7 0-1.7 1.6-1.7h86.9c1.6 0 1.6 0 1.6 1.7v66.5l.1 21.9zm93.6-90v89c0 .9-.2 1.1-1.1 1.1H468V95.4c0-1.8 0-1.8 1.8-1.8h75.9c4.2-.1 8.3-.1 12.5-.1z\" fill=\"#cbcbcb\"/><path d=\"M277.3 183.5h-90c0-.5-.1-1-.1-1.4V95.2c0-1.7 0-1.7 1.7-1.7h86.7c1.7 0 1.7 0 1.7 1.7v88.3zm93.6 0h-90V95c0-1.6 0-1.6 1.6-1.6h86.8c1.7 0 1.7 0 1.7 1.7V182c-.1.6-.1 1.1-.1 1.5zM138.7 90.1H95.3c-1.6 0-1.6 0-1.6-1.6v-87c0-1.3.4-1.5 1.6-1.5h87.1c1.6 0 1.6 0 1.6 1.5v87c0 1.5 0 1.5-1.6 1.5l-43.7.1z\" fill=\"#1565c0\"/><path d=\"M374.5 45V1.6c0-1.6 0-1.6 1.6-1.6h87.1c1.6 0 1.6 0 1.6 1.6v86.8c0 1.7 0 1.7-1.7 1.7h-86.9c-1.6 0-1.6 0-1.6-1.5l-.1-43.6z\" fill=\"#cbcbcb\"/><path d=\"M277.3 45v43.6c0 1.1-.3 1.5-1.5 1.5h-87.2c-1.2 0-1.4-.4-1.4-1.5V1.5c0-1.2.3-1.5 1.5-1.5h87.1c1.3 0 1.5.4 1.5 1.5V45zm3.6.1V1.5c0-1.2.3-1.5 1.5-1.5h87.2c1.2 0 1.4.3 1.4 1.5v87.1c0 1.2-.3 1.5-1.5 1.5h-87.1c-1.3 0-1.5-.4-1.5-1.6V45.1zm-235.6 45H1.8c-1.6 0-1.6 0-1.6-1.6V1.7C.2.1.2.1 1.8.1h87c1.6 0 1.6 0 1.6 1.6v86.8c0 1.6 0 1.6-1.7 1.6H45.3z\" fill=\"#1565c0\"/></svg>";
2406
-
2407
- var five_one = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M183.8 183.5H93.6V95.4c0-1.8 0-1.8 1.8-1.8H182c1.8 0 1.8 0 1.8 1.8v88.1zm280.9 0h-90.2V95.2c0-1.6 0-1.6 1.5-1.6h87.1c1.5 0 1.6 0 1.6 1.6v88.3zM558.2 0v89.8H470c-1.7 0-1.7 0-1.7-1.8V1.7c0-1.8 0-1.8 1.7-1.8l88.2.1zM90 183.5H0V95.4c0-1.7 0-1.7 1.8-1.7h86.5c1.8 0 1.8 0 1.8 1.7v86.8c-.1.5-.1.9-.1 1.3zm187.3 0h-90V94.8c0-1 .5-1.2 1.3-1.2H276c1 0 1.3.3 1.3 1.3v88.6zm93.6 0h-90V95.4c0-1.7 0-1.7 1.8-1.7h86.5c1.8 0 1.8 0 1.8 1.7v86.8c-.1.5-.1.9-.1 1.3zm187.3-89.8v88.8c0 .9-.2 1.1-1.1 1.1h-88.9V95.5c0-1.8 0-1.8 1.8-1.8h88.2z\" fill=\"#cbcbcb\"/><path d=\"M0 44.9V1.5C0 .3.3 0 1.4 0h87.3c1.2 0 1.5.3 1.5 1.5v87.1c0 1.2-.3 1.6-1.5 1.6H1.5c-1.3 0-1.5-.4-1.5-1.6V44.9zm183.8.3v43.5c0 1.1-.2 1.4-1.4 1.4H95c-1.1 0-1.4-.4-1.4-1.4V1.4c0-1.1.3-1.3 1.3-1.3h87.6c1.1 0 1.3.3 1.3 1.3v43.8zm93.5 0v43.4c0 1.2-.2 1.5-1.5 1.5h-87.1c-1.2 0-1.5-.3-1.5-1.5v-87c0-1.6 0-1.6 1.6-1.6h87c1.5 0 1.5 0 1.5 1.6v43.6zm3.6-.3V1.4c0-1.1.3-1.5 1.4-1.5h87.2c1.2 0 1.5.3 1.5 1.5v87.2c0 1.1-.3 1.4-1.4 1.4h-87.3c-1.1 0-1.4-.4-1.4-1.4V44.9zm183.4.3v43.1c0 1.6 0 1.6-1.6 1.6h-86.3c-1.2 0-1.6-.3-1.6-1.5V1.9c0-1.1.3-1.5 1.5-1.5h86.6c1.2 0 1.4.4 1.4 1.5v43.3z\" fill=\"#1565c0\"/></svg>";
2408
-
2409
- var five_two = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M558.2 0v90.1h-88.3c-1.9 0-1.9 0-1.9-1.9V1.8c0-1.8 0-1.8 1.8-1.8h88.4zm0 93.5v89c0 .9-.2 1.1-1.1 1.1H468V95.4c0-1.8 0-1.8 1.8-1.8h75.9c4.2-.1 8.4-.1 12.5-.1z\" fill=\"#cbcbcb\"/><g fill=\"#1565c0\"><path d=\"M183.8 183.5H93.6V95.1c0-1.6 0-1.7 1.6-1.7H182c1.7 0 1.7 0 1.7 1.8l.1 88.3zm280.9 0h-90.2V95.2c0-1.8 0-1.8 1.7-1.8h86.7c1.7 0 1.7 0 1.7 1.8v86.6c0 .6.1 1.2.1 1.7zm-374.7 0H0V94.9c0-1.2.3-1.5 1.5-1.5h87c1.6 0 1.6 0 1.6 1.6v87.1c0 .5-.1 1-.1 1.4zm187.3 0h-90c0-.4-.1-.9-.1-1.3V95.3c0-1.7 0-1.7 1.7-1.7h86.7c1.7 0 1.7 0 1.7 1.7v88.2zm93.6 0h-90V95.4c0-1.8 0-1.8 1.8-1.8h86.5c1.8 0 1.8 0 1.8 1.8v86.7c-.1.5-.1 1-.1 1.4zM138.8 90.1H95.1c-1.2 0-1.6-.3-1.6-1.5V1.4C93.6.3 93.9 0 95 0h87.4c1.1 0 1.4.4 1.4 1.4v87.2c0 1.1-.3 1.5-1.5 1.5h-43.5zm280.6 0H376c-1.6 0-1.6 0-1.6-1.6v-87c0-1.2.2-1.5 1.5-1.5h87.2c1.2 0 1.5.3 1.5 1.5v87c0 1.6 0 1.6-1.7 1.6h-43.5zM.2 45.1V1.7C.2.1.2.1 1.9.1h86.8c1.6 0 1.6 0 1.6 1.7v86.7c0 1.6 0 1.6-1.6 1.6H1.9c-1.6 0-1.6 0-1.6-1.7L.2 45.1z\"/><path d=\"M277.3 45.1v43.4c0 1.6 0 1.6-1.6 1.6h-86.9c-1.2 0-1.6-.3-1.6-1.5V1.5c0-1.2.4-1.4 1.5-1.4h87.2c1.2 0 1.4.4 1.4 1.5v43.5zM325.8 90h-43.3c-1.6 0-1.6 0-1.6-1.5V1.6c0-1.2.3-1.5 1.5-1.5h87.1c1.2 0 1.5.3 1.5 1.5v86.8c0 1.6 0 1.6-1.6 1.6h-43.6z\"/></g></svg>";
2410
-
2411
- var six_one = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 558.2 183.6\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M558.2 0v90.1h-88.5c-1.6 0-1.6 0-1.6-1.6V1.7c0-1.6 0-1.6 1.6-1.6l88.5-.1z\" fill=\"#1565c0\"/><path d=\"M90.2 183.5H0V95.1c0-1.7 0-1.7 1.7-1.7h86.7c1.8 0 1.8 0 1.8 1.8v88.3zm93.6 0H93.6V95.3c0-1.9 0-1.9 1.9-1.9H182c1.8 0 1.8 0 1.8 1.8v88.3zm280.9 0h-90.2V95.1c0-1.7 0-1.7 1.6-1.7H463c1.6 0 1.6 0 1.6 1.7v64.1l.1 24.3zm93.5-90v89c0 .9-.2 1.1-1.1 1.1H468V95.2c0-1.7 0-1.7 1.7-1.7h88.5zm-280.9 90h-90V94.8c0-.9.1-1.5 1.2-1.5H276c.9 0 1.2.3 1.2 1.2l.1 89zm93.6 0h-90V95.1c0-1.7 0-1.7 1.7-1.7h86.5c1.8 0 1.8 0 1.8 1.8v88.3z\" fill=\"#cbcbcb\"/><path d=\"M0 45.1V1.5C0 .3.3 0 1.4 0h87.3c1.2 0 1.5.3 1.4 1.5v87.1c0 1.2-.3 1.5-1.5 1.5H1.4c-1.3 0-1.5-.4-1.5-1.6L0 45.1zm93.6-.1V1.5C93.6.3 93.9 0 95 0h87.3c1.2 0 1.4.3 1.4 1.5v87.2c0 1.2-.4 1.4-1.5 1.4H95c-1.2 0-1.5-.4-1.5-1.5l.1-43.6zM419.7 0h43.4c1.2 0 1.6.2 1.6 1.5v87.1c0 1.2-.3 1.5-1.5 1.5H376c-1.1 0-1.5-.3-1.5-1.4V1.5c0-1.2.3-1.4 1.5-1.4l43.7-.1zM277.3 45.1v43.3c0 1.6 0 1.6-1.6 1.6h-86.8c-1.7 0-1.7 0-1.7-1.6V1.5c0-1.2.3-1.5 1.5-1.5h87.2c1.2 0 1.4.4 1.4 1.5v43.6zm3.6-.2V1.4c0-1.1.3-1.5 1.4-1.5h87.2c1.3 0 1.5.4 1.5 1.6v86.9c0 1.6 0 1.6-1.5 1.6h-87c-1.1 0-1.5-.3-1.5-1.4l-.1-43.7z\" fill=\"#1565c0\"/></svg>";
2412
-
2413
- var six_two = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 652.1 183.8\" fill=\"#1565c0\" xmlns:v=\"https://vecta.io/nano\"><path d=\"M652.1.3v90.1h-88.5c-1.6 0-1.6 0-1.6-1.6V2c0-1.6 0-1.6 1.6-1.6l88.5-.1zM90.5 183.8H.3V95.4c0-1.6 0-1.6 1.7-1.7h86.7c1.7 0 1.7 0 1.7 1.8v86.6c0 .6 0 1.2.1 1.7zm93.5 0H93.8V95.4c0-1.6 0-1.6 1.6-1.6h86.9c1.6 0 1.6 0 1.6 1.6v80.2l.1 8.2zm374.5 0h-90.2V95.5c0-1.9-.2-1.8 1.7-1.8h86.7c1.7 0 1.7 0 1.7 1.8v86.6c.1.6.1 1.2.1 1.7zm93.6-90.1v89c0 .9-.2 1.1-1.1 1.1h-89.1c0-.6.1-1.1.1-1.7V95.5c0-1.8 0-1.8 1.7-1.8h86.7c.5.1 1.1.1 1.7 0zm-374.5 90.1h-90c0-.5-.1-1-.1-1.4v-87c0-1.6 0-1.6 1.6-1.6h87.1c1 0 1.4.2 1.4 1.3v88.7zm93.5 0h-90V95.6c0-1.8 0-1.8 1.7-1.8h86.6c1.7 0 1.7 0 1.7 1.8v86.8c.1.5.1.9 0 1.4zm93.6 0h-90V95c0-1.3.6-1.3 1.5-1.3H463c1.7 0 1.7 0 1.7 1.8v86.7c.1.6 0 1.1 0 1.6z\"/><path d=\"M.3 45.3V1.8C.3.6.5.3 1.8.3H89c1.2 0 1.5.3 1.5 1.5v86.9c0 1.6 0 1.6-1.6 1.6H1.8c-1.5 0-1.5 0-1.5-1.6V45.3zm93.6-.1V1.8c0-1.6 0-1.6 1.5-1.6h87.1c1.5 0 1.5 0 1.5 1.6v86.9c0 1.2-.2 1.6-1.5 1.6H95.3c-1.3 0-1.5-.4-1.5-1.6l.1-43.5zm464.6.2v43.4c0 1.6 0 1.6-1.6 1.6h-87.1c-1.2 0-1.6-.2-1.6-1.5V1.8c0-1.2.3-1.5 1.5-1.5h87.2c1.2 0 1.5.4 1.5 1.5l.1 43.6zm-280.9-.1v43.5c0 1.2-.2 1.6-1.5 1.5H189c-1.2 0-1.5-.3-1.5-1.5v-87c0-1.6 0-1.6 1.6-1.6h87c1.5 0 1.5 0 1.5 1.6v43.5zm93.6-.1v43.5c0 1.6 0 1.6-1.6 1.6h-86.8c-1.6 0-1.6 0-1.6-1.6V1.9c0-1.6 0-1.6 1.5-1.6h87c1.6 0 1.6 0 1.6 1.6l-.1 43.3zm3.5.1V1.8c0-1.6 0-1.6 1.5-1.6h87c1.6 0 1.6 0 1.6 1.6v87c0 1.2-.3 1.5-1.5 1.5h-87.1c-1.2 0-1.5-.4-1.5-1.5V45.3z\"/></svg>";
2414
-
2415
2398
  var GridImages = {
2416
- '1x1': one_one,
2417
- '2x1': two_one,
2418
- '3x1': three_one,
2419
- '3x2': three_two,
2420
- '4x1': four_one,
2421
- '4x2': four_two,
2422
- '5x1': five_one,
2423
- '5x2': five_two,
2424
- '6x1': six_one,
2425
- '6x2': six_two,
2399
+ '1x1': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTU1OC4yIDB2OTAuMWgtODguM2MtMS45IDAtMS45IDAtMS45LTEuOVYxLjhjMC0xLjggMC0xLjggMS44LTEuOGg4OC40em0tNDY4IDE4My41SDBWOTUuMWMwLTEuNyAwLTEuNyAxLjctMS43aDg2LjdjMS44IDAgMS44IDAgMS44IDEuOHY4OC4zem05My42IDBIOTMuNlY5NS4zYzAtMS45IDAtMS45IDEuOS0xLjlIMTgyYzEuOCAwIDEuOCAwIDEuOCAxLjh2ODguM3ptMjgwLjkgMGgtOTAuMlY5NS4xYzAtMS43IDAtMS43IDEuNi0xLjdINDYzYzEuNiAwIDEuNiAwIDEuNiAxLjd2NjIuMmwuMSAyNi4yem05My41LTkwdjg5YzAgLjktLjIgMS4xLTEuMSAxLjFINDY4Vjk1LjJjMC0xLjcgMC0xLjcgMS43LTEuN2g4OC41em0tMjgwLjkgOTBoLTkwVjk0LjljMC0uOS4xLTEuNSAxLjItMS41SDI3NmMuOSAwIDEuMi4zIDEuMiAxLjJsLjEgODguOXptOTMuNiAwaC05MFY5NS4xYzAtMS43IDAtMS43IDEuNy0xLjdoODYuNWMxLjggMCAxLjggMCAxLjggMS44djg4LjN6IiBmaWxsPSIjY2JjYmNiIi8+PHBhdGggZD0iTTAgNDUuMVYxLjVDMCAuMy4zIDAgMS40IDBoODcuM2MxLjIgMCAxLjUuMyAxLjQgMS41djg3LjFjMCAxLjItLjMgMS41LTEuNSAxLjVIMS40Yy0xLjMgMC0xLjUtLjQtMS41LTEuNkwwIDQ1LjF6IiBmaWxsPSIjMTU2NWMwIi8+PHBhdGggZD0iTTkzLjYgNDQuOVYxLjVjMC0xLjYgMC0xLjYgMS42LTEuNmg4Ny4xYzEuNSAwIDEuNSAwIDEuNSAxLjZ2ODYuOGMwIDEuNiAwIDEuNi0xLjYgMS42SDk1LjRjLTEuOCAwLTEuOCAwLTEuOC0xLjhWNDQuOXptMjgwLjkuMlYxLjZjMC0xLjYgMC0xLjYgMS42LTEuNmg4Ny4xYzEuNSAwIDEuNSAwIDEuNSAxLjZ2ODYuN2MwIDEuOCAwIDEuOC0xLjggMS44aC04Ni43Yy0xLjcgMC0xLjcgMC0xLjctMS43VjQ1LjF6bS0xNDIuMSA0NUgxODljLTEuNiAwLTEuNiAwLTEuNi0xLjV2LTg3YzAtMS42IDAtMS42IDEuNi0xLjZoODYuOGMxLjYgMCAxLjYgMCAxLjYgMS41djg3YzAgMS42IDAgMS42LTEuNiAxLjZoLTQzLjR6bTQ4LjUtNDUuMlYxLjVjMC0xLjYgMC0xLjYgMS42LTEuNmg4Ni44YzEuNiAwIDEuNiAwIDEuNiAxLjV2ODdjMCAxLjYgMCAxLjYtMS42IDEuNmgtODYuOGMtMS42IDAtMS42IDAtMS42LTEuNlY0NC45eiIgZmlsbD0iI2NiY2JjYiIvPjwvc3ZnPg==",
2400
+ '2x1': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTI3Ny4zIDE4My41aC05MC4yVjk0LjJjMC0uNi4yLS45LjgtLjloODcuN2MxIDAgMS42IDAgMS42IDEuM2wuMSA4OC45ek01NTguMiAwdjkwLjFoLTg4LjNjLTEuOSAwLTEuOSAwLTEuOS0xLjlWMS44YzAtMS44IDAtMS44IDEuOC0xLjhoODguNHptLTQ2OCAxODMuNUgwVjk1LjFjMC0xLjcgMC0xLjcgMS43LTEuN2g4Ni43YzEuOCAwIDEuOCAwIDEuOCAxLjh2ODguM3ptOTMuNiAwSDkzLjZWOTUuM2MwLTEuOSAwLTEuOSAxLjktMS45SDE4MmMxLjggMCAxLjggMCAxLjggMS44djg4LjN6bTI4MC45IDBoLTkwLjJWOTUuMWMwLTEuNyAwLTEuNyAxLjYtMS43SDQ2M2MxLjYgMCAxLjYgMCAxLjYgMS43djYxLjJsLjEgMjcuMnptOTMuNS05MHY4OWMwIC45LS4yIDEuMS0xLjEgMS4xSDQ2OFY5NS4yYzAtMS43IDAtMS43IDEuNy0xLjdoODguNXptLTE4Ny4xIDkwaC05MC4yVjk0LjZjMC0xLjEuNC0xLjUgMS41LTEuNWw2LjguM2g4MC4yYzEuMSAwIDEuNS4yIDEuNSAxLjRsLjIgNjEuOS41IDI1LjFjMCAuNy4xIDEuMy0uNSAxLjd6IiBmaWxsPSIjY2JjYmNiIi8+PHBhdGggZD0iTTE4My44IDQ1LjF2NDMuNWMwIDEuMS0uMiAxLjYtMS41IDEuNkg5NWMtMS4yIDAtMS40LS40LTEuNC0xLjVWMS41QzkzLjYuMiA5NCAwIDk1LjEgMGg4Ny4zYzEuMiAwIDEuNC40IDEuNCAxLjV2NDMuNnpNNDUuMSAwaDQzLjdjMS4xIDAgMS40LjIgMS40IDEuNHY4Ny4zYzAgMS4xLS40IDEuNC0xLjQgMS40SDEuNGMtMS4xIDAtMS4zLS4zLTEuMy0xLjNMMCAxLjNDMCAuMi4zIDAgMS4zIDBoNDMuOHoiIGZpbGw9IiMxNTY1YzAiLz48cGF0aCBkPSJNNDE5LjYgOTAuMWgtNDMuNWMtMS42IDAtMS42IDAtMS42LTEuNlYxLjZjMC0xLjYgMC0xLjYgMS42LTEuNmg4Ny4xYzEuNSAwIDEuNSAwIDEuNSAxLjZ2ODYuN2MwIDEuOCAwIDEuOC0xLjggMS44aC00My4zek0yNzcuMyA0NC45djQzLjVjMCAxLjcgMCAxLjctMS42IDEuN2gtODYuOGMtMS42IDAtMS42IDAtMS42LTEuNnYtODdjMC0xLjUgMC0xLjUgMS42LTEuNWg4Ni44YzEuNiAwIDEuNiAwIDEuNiAxLjZ2NDMuM3ptOTMuNi4zdjQzLjJjMCAxLjcgMCAxLjctMS42IDEuN2gtODYuOGMtMS42IDAtMS42IDAtMS42LTEuNnYtODdjMC0xLjUgMC0xLjUgMS42LTEuNWg4Ni44YzEuNiAwIDEuNiAwIDEuNiAxLjZ2NDMuNnoiIGZpbGw9IiNjYmNiY2IiLz48L3N2Zz4=",
2401
+ '3x1': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTI3Ny4zIDE4My41aC05MC4yVjk0LjJjMC0uNi4yLS45LjgtLjloODcuOGMxIDAgMS42IDAgMS42IDEuM3Y4OC45ek01NTguMiAwdjkwLjFoLTg4LjNjLTEuOSAwLTEuOSAwLTEuOS0xLjlWMS44YzAtMS44IDAtMS44IDEuOC0xLjhoODguNHptLTQ2OCAxODMuNUgwVjk1LjFjMC0xLjcgMC0xLjcgMS43LTEuN2g4Ni43YzEuOCAwIDEuOCAwIDEuOCAxLjh2ODguM3ptOTMuNiAwSDkzLjZWOTUuM2MwLTEuOSAwLTEuOSAxLjktMS45SDE4MmMxLjggMCAxLjggMCAxLjggMS44djg4LjN6bTI4MC45IDBoLTkwLjJWOTUuMWMwLTEuNyAwLTEuNyAxLjYtMS43SDQ2M2MxLjYgMCAxLjYgMCAxLjYgMS43VjE1N2wuMSAyNi41em05My41LTkwdjg5YzAgLjktLjIgMS4xLTEuMSAxLjFINDY4Vjk1LjJjMC0xLjcgMC0xLjcgMS43LTEuN2g4OC41em0tMTg3LjEgOTBoLTkwLjJWOTQuNmMwLTEuMS40LTEuNSAxLjUtMS41bDYuOC4zaDgwLjJjMS4xIDAgMS41LjIgMS41IDEuNGwuMiA2MS45LjUgMjUuMWMwIC43LjEgMS4zLS41IDEuN3oiIGZpbGw9IiNjYmNiY2IiLz48cGF0aCBkPSJNNDUuMSA5MC4xSDEuNGMtMS4xIDAtMS41LS4zLTEuNS0xLjRMMCAxLjVDMCAuMy4zIDAgMS41IDBoODcuM2MxLjIgMCAxLjQuNCAxLjQgMS41djg3LjFjMCAxLjItLjMgMS41LTEuNSAxLjVINDUuMXpNMTM4LjggMGg0My41YzEuMSAwIDEuNS4zIDEuNSAxLjR2ODcuMmMwIDEuMi0uMyAxLjQtMS41IDEuNEg5NS4xYy0xLjIgMC0xLjUtLjMtMS41LTEuNVYxLjRDOTMuNi4yIDk0IDAgOTUuMSAwaDQzLjd6IiBmaWxsPSIjMTU2NWMwIi8+PHBhdGggZD0iTTM3NC41IDQ1LjFWMS42YzAtMS42IDAtMS42IDEuNi0xLjZoODcuMWMxLjYgMCAxLjYgMCAxLjYgMS42djg2LjhjMCAxLjcgMCAxLjctMS43IDEuN2gtODYuOWMtMS42IDAtMS42IDAtMS42LTEuNWwtLjEtNDMuNXoiIGZpbGw9IiNjYmNiY2IiLz48cGF0aCBkPSJNMjc3LjMgNDUuMXY0My41YzAgMS41IDAgMS41LTEuNiAxLjVoLTg2LjljLTEuNSAwLTEuNSAwLTEuNS0xLjZWMS42YzAtMS4yLjItMS42IDEuNS0xLjVIMjc2YzEuMiAwIDEuNC40IDEuNCAxLjVsLS4xIDQzLjV6IiBmaWxsPSIjMTU2NWMwIi8+PHBhdGggZD0iTTM3MC45IDQ1LjJ2NDMuMmMwIDEuNyAwIDEuNy0xLjYgMS43aC04Ni44Yy0xLjYgMC0xLjYgMC0xLjYtMS42di04N2MwLTEuNSAwLTEuNSAxLjYtMS41aDg2LjhjMS42IDAgMS42IDAgMS42IDEuNnY0My42eiIgZmlsbD0iI2NiY2JjYiIvPjwvc3ZnPg==",
2402
+ '3x2': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTI3Ny4zIDE4My41aC05MC4yVjk1YzAtMS42IDAtMS42IDEuNi0xLjZoODYuOWMxLjcgMCAxLjcgMCAxLjcgMS43djg4LjR6IiBmaWxsPSIjMTU2NWMwIi8+PHBhdGggZD0iTTU1OC4yIDB2OTAuMWgtODguM2MtMS45IDAtMS45IDAtMS45LTEuOVYxLjhjMC0xLjggMC0xLjggMS44LTEuOGg4OC40eiIgZmlsbD0iI2NiY2JjYiIvPjxwYXRoIGQ9Ik05MC4yIDE4My41SDBWOTUuMmMwLTEuOS0uMi0xLjggMS43LTEuOGg4Ni43YzEuNyAwIDEuNyAwIDEuNyAxLjh2ODYuNmMuMS42LjEgMS4yLjEgMS43em05My42IDBIOTMuNlY5NS4yYzAtMS44IDAtMS44IDEuNy0xLjhIMTgyYzEuOSAwIDEuNy0uMiAxLjcgMS44bC4xIDg4LjN6IiBmaWxsPSIjMTU2NWMwIi8+PHBhdGggZD0iTTQ2NC43IDE4My41aC05MC4yVjk1LjFjMC0xLjcgMC0xLjcgMS42LTEuN0g0NjNjMS42IDAgMS42IDAgMS42IDEuN3Y2Mi42bC4xIDI1Ljh6bTkzLjUtOTB2ODljMCAuOS0uMiAxLjEtMS4xIDEuMUg0NjhWOTUuMmMwLTEuNyAwLTEuNyAxLjctMS43aDg4LjV6bS0xODcuMSA5MGgtOTAuMlY5NC42YzAtMS4xLjQtMS41IDEuNS0xLjVsNi44LjNoODAuMmMxLjEgMCAxLjUuMiAxLjUgMS40bC4yIDYxLjguNSAyNS4yYzAgLjcuMSAxLjMtLjUgMS43eiIgZmlsbD0iI2NiY2JjYiIvPjxwYXRoIGQ9Ik00NS4xIDkwLjFIMS40Yy0xLjEgMC0xLjUtLjMtMS41LTEuNEwwIDEuNUMwIC4zLjMgMCAxLjUgMGg4Ny4zYzEuMiAwIDEuNC40IDEuNCAxLjV2ODcuMWMwIDEuMi0uMyAxLjUtMS41IDEuNUg0NS4xek0xMzguOCAwaDQzLjVjMS4xIDAgMS41LjMgMS41IDEuNHY4Ny4yYzAgMS4yLS4zIDEuNC0xLjUgMS40SDk1LjFjLTEuMiAwLTEuNS0uMy0xLjUtMS41VjEuNEM5My42LjIgOTQgMCA5NS4xIDBoNDMuN3oiIGZpbGw9IiMxNTY1YzAiLz48cGF0aCBkPSJNMzc0LjUgNDUuMVYxLjZjMC0xLjYgMC0xLjYgMS42LTEuNmg4Ny4xYzEuNiAwIDEuNiAwIDEuNiAxLjZ2ODYuOGMwIDEuNyAwIDEuNy0xLjcgMS43aC04Ni45Yy0xLjYgMC0xLjYgMC0xLjYtMS41bC0uMS00My41eiIgZmlsbD0iI2NiY2JjYiIvPjxwYXRoIGQ9Ik0yNzcuMyA0NS4xdjQzLjVjMCAxLjUgMCAxLjUtMS42IDEuNWgtODYuOWMtMS41IDAtMS41IDAtMS41LTEuNlYxLjZjMC0xLjIuMi0xLjYgMS41LTEuNUgyNzZjMS4yIDAgMS40LjQgMS40IDEuNWwtLjEgNDMuNXoiIGZpbGw9IiMxNTY1YzAiLz48cGF0aCBkPSJNMzcwLjkgNDUuMnY0My4yYzAgMS43IDAgMS43LTEuNiAxLjdoLTg2LjhjLTEuNiAwLTEuNiAwLTEuNi0xLjZ2LTg3YzAtMS41IDAtMS41IDEuNi0xLjVoODYuOGMxLjYgMCAxLjYgMCAxLjYgMS42djQzLjZ6IiBmaWxsPSIjY2JjYmNiIi8+PC9zdmc+",
2403
+ '4x1': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTU1OC4yIDB2OTAuMWgtODguM2MtMS45IDAtMS45IDAtMS45LTEuOVYxLjhjMC0xLjggMC0xLjggMS44LTEuOGg4OC40em0tNDY4IDE4My41SDBWOTUuMWMwLTEuNyAwLTEuNyAxLjctMS43aDg2LjdjMS44IDAgMS44IDAgMS44IDEuOHY4OC4zem05My42IDBIOTMuNlY5NS4zYzAtMS45IDAtMS45IDEuOS0xLjlIMTgyYzEuOCAwIDEuOCAwIDEuOCAxLjh2ODguM3ptMjgwLjkgMGgtOTAuMlY5NS4xYzAtMS43IDAtMS43IDEuNi0xLjdINDYzYzEuNiAwIDEuNiAwIDEuNiAxLjd2NjQuMWwuMSAyNC4zem05My41LTkwdjg5YzAgLjktLjIgMS4xLTEuMSAxLjFINDY4Vjk1LjJjMC0xLjcgMC0xLjcgMS43LTEuN2g4OC41em0tMjgwLjkgOTBoLTkwVjk0LjhjMC0uOS4xLTEuNSAxLjItMS41SDI3NmMuOSAwIDEuMi4zIDEuMiAxLjJsLjEgODl6bTkzLjYgMGgtOTBWOTUuMWMwLTEuNyAwLTEuNyAxLjctMS43aDg2LjVjMS44IDAgMS44IDAgMS44IDEuOHY4OC4zeiIgZmlsbD0iI2NiY2JjYiIvPjxwYXRoIGQ9Ik0wIDQ1LjFWMS41QzAgLjMuMyAwIDEuNCAwaDg3LjNjMS4yIDAgMS41LjMgMS40IDEuNXY4Ny4xYzAgMS4yLS4zIDEuNS0xLjUgMS41SDEuNGMtMS4zIDAtMS41LS40LTEuNS0xLjZMMCA0NS4xem05My42LS4yVjEuNEM5My42LjMgOTMuOSAwIDk1IDBoODcuM2MxLjIgMCAxLjQuMyAxLjQgMS41djg3LjJjMCAxLjItLjQgMS40LTEuNSAxLjRIOTVjLTEuMiAwLTEuNS0uNC0xLjUtMS41bC4xLTQzLjd6IiBmaWxsPSIjMTU2NWMwIi8+PHBhdGggZD0iTTM3NC41IDQ1LjFWMS42YzAtMS42IDAtMS42IDEuNi0xLjZoODcuMWMxLjUgMCAxLjUgMCAxLjUgMS42djg2LjdjMCAxLjggMCAxLjgtMS44IDEuOGgtODYuN2MtMS43IDAtMS43IDAtMS43LTEuN1Y0NS4xeiIgZmlsbD0iI2NiY2JjYiIvPjxwYXRoIGQ9Ik0yNzcuMyA0NS4xdjQzLjRjMCAxLjYgMCAxLjYtMS42IDEuNmgtODYuOGMtMS42IDAtMS42IDAtMS42LTEuNlYxLjdjMC0xLjYgMC0xLjYgMS41LTEuNmg4N2MxLjUgMCAxLjYgMCAxLjYgMS41bC0uMSA0My41em0zLjYtLjJWMS40YzAtMS4xLjMtMS41IDEuNC0xLjVoODcuMmMxLjIgMCAxLjUuMyAxLjUgMS41djg3LjJjMCAxLjEtLjMgMS40LTEuNCAxLjRoLTg3LjNjLTEuMSAwLTEuNC0uNC0xLjQtMS40VjQ0Ljl6IiBmaWxsPSIjMTU2NWMwIi8+PC9zdmc+",
2404
+ '4x2': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTU1OC4yIDB2OTAuMWgtODguM2MtMS45IDAtMS45IDAtMS45LTEuOVYxLjhjMC0xLjggMC0xLjggMS44LTEuOGg4OC40eiIgZmlsbD0iI2NiY2JjYiIvPjxwYXRoIGQ9Ik05MC4yIDE4My41SDBWOTUuMmMwLTEuOS0uMi0xLjggMS43LTEuOGg4Ni43YzEuNyAwIDEuNyAwIDEuNyAxLjh2ODYuNmMuMS42LjEgMS4yLjEgMS43em05My42IDBIOTMuNlY5NS4yYzAtMS44IDAtMS44IDEuNy0xLjhIMTgyYzEuOSAwIDEuNy0uMiAxLjcgMS44bC4xIDg4LjN6IiBmaWxsPSIjMTU2NWMwIi8+PHBhdGggZD0iTTQ2NC42IDE4My41aC05MC4yVjk1LjFjMC0xLjcgMC0xLjcgMS42LTEuN2g4Ni45YzEuNiAwIDEuNiAwIDEuNiAxLjd2NjYuNWwuMSAyMS45em05My42LTkwdjg5YzAgLjktLjIgMS4xLTEuMSAxLjFINDY4Vjk1LjRjMC0xLjggMC0xLjggMS44LTEuOGg3NS45YzQuMi0uMSA4LjMtLjEgMTIuNS0uMXoiIGZpbGw9IiNjYmNiY2IiLz48cGF0aCBkPSJNMjc3LjMgMTgzLjVoLTkwYzAtLjUtLjEtMS0uMS0xLjRWOTUuMmMwLTEuNyAwLTEuNyAxLjctMS43aDg2LjdjMS43IDAgMS43IDAgMS43IDEuN3Y4OC4zem05My42IDBoLTkwVjk1YzAtMS42IDAtMS42IDEuNi0xLjZoODYuOGMxLjcgMCAxLjcgMCAxLjcgMS43VjE4MmMtLjEuNi0uMSAxLjEtLjEgMS41ek0xMzguNyA5MC4xSDk1LjNjLTEuNiAwLTEuNiAwLTEuNi0xLjZ2LTg3YzAtMS4zLjQtMS41IDEuNi0xLjVoODcuMWMxLjYgMCAxLjYgMCAxLjYgMS41djg3YzAgMS41IDAgMS41LTEuNiAxLjVsLTQzLjcuMXoiIGZpbGw9IiMxNTY1YzAiLz48cGF0aCBkPSJNMzc0LjUgNDVWMS42YzAtMS42IDAtMS42IDEuNi0xLjZoODcuMWMxLjYgMCAxLjYgMCAxLjYgMS42djg2LjhjMCAxLjcgMCAxLjctMS43IDEuN2gtODYuOWMtMS42IDAtMS42IDAtMS42LTEuNWwtLjEtNDMuNnoiIGZpbGw9IiNjYmNiY2IiLz48cGF0aCBkPSJNMjc3LjMgNDV2NDMuNmMwIDEuMS0uMyAxLjUtMS41IDEuNWgtODcuMmMtMS4yIDAtMS40LS40LTEuNC0xLjVWMS41YzAtMS4yLjMtMS41IDEuNS0xLjVoODcuMWMxLjMgMCAxLjUuNCAxLjUgMS41VjQ1em0zLjYuMVYxLjVjMC0xLjIuMy0xLjUgMS41LTEuNWg4Ny4yYzEuMiAwIDEuNC4zIDEuNCAxLjV2ODcuMWMwIDEuMi0uMyAxLjUtMS41IDEuNWgtODcuMWMtMS4zIDAtMS41LS40LTEuNS0xLjZWNDUuMXptLTIzNS42IDQ1SDEuOGMtMS42IDAtMS42IDAtMS42LTEuNlYxLjdDLjIuMS4yLjEgMS44LjFoODdjMS42IDAgMS42IDAgMS42IDEuNnY4Ni44YzAgMS42IDAgMS42LTEuNyAxLjZINDUuM3oiIGZpbGw9IiMxNTY1YzAiLz48L3N2Zz4=",
2405
+ '5x1': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTE4My44IDE4My41SDkzLjZWOTUuNGMwLTEuOCAwLTEuOCAxLjgtMS44SDE4MmMxLjggMCAxLjggMCAxLjggMS44djg4LjF6bTI4MC45IDBoLTkwLjJWOTUuMmMwLTEuNiAwLTEuNiAxLjUtMS42aDg3LjFjMS41IDAgMS42IDAgMS42IDEuNnY4OC4zek01NTguMiAwdjg5LjhINDcwYy0xLjcgMC0xLjcgMC0xLjctMS44VjEuN2MwLTEuOCAwLTEuOCAxLjctMS44bDg4LjIuMXpNOTAgMTgzLjVIMFY5NS40YzAtMS43IDAtMS43IDEuOC0xLjdoODYuNWMxLjggMCAxLjggMCAxLjggMS43djg2LjhjLS4xLjUtLjEuOS0uMSAxLjN6bTE4Ny4zIDBoLTkwVjk0LjhjMC0xIC41LTEuMiAxLjMtMS4ySDI3NmMxIDAgMS4zLjMgMS4zIDEuM3Y4OC42em05My42IDBoLTkwVjk1LjRjMC0xLjcgMC0xLjcgMS44LTEuN2g4Ni41YzEuOCAwIDEuOCAwIDEuOCAxLjd2ODYuOGMtLjEuNS0uMS45LS4xIDEuM3ptMTg3LjMtODkuOHY4OC44YzAgLjktLjIgMS4xLTEuMSAxLjFoLTg4LjlWOTUuNWMwLTEuOCAwLTEuOCAxLjgtMS44aDg4LjJ6IiBmaWxsPSIjY2JjYmNiIi8+PHBhdGggZD0iTTAgNDQuOVYxLjVDMCAuMy4zIDAgMS40IDBoODcuM2MxLjIgMCAxLjUuMyAxLjUgMS41djg3LjFjMCAxLjItLjMgMS42LTEuNSAxLjZIMS41Yy0xLjMgMC0xLjUtLjQtMS41LTEuNlY0NC45em0xODMuOC4zdjQzLjVjMCAxLjEtLjIgMS40LTEuNCAxLjRIOTVjLTEuMSAwLTEuNC0uNC0xLjQtMS40VjEuNGMwLTEuMS4zLTEuMyAxLjMtMS4zaDg3LjZjMS4xIDAgMS4zLjMgMS4zIDEuM3Y0My44em05My41IDB2NDMuNGMwIDEuMi0uMiAxLjUtMS41IDEuNWgtODcuMWMtMS4yIDAtMS41LS4zLTEuNS0xLjV2LTg3YzAtMS42IDAtMS42IDEuNi0xLjZoODdjMS41IDAgMS41IDAgMS41IDEuNnY0My42em0zLjYtLjNWMS40YzAtMS4xLjMtMS41IDEuNC0xLjVoODcuMmMxLjIgMCAxLjUuMyAxLjUgMS41djg3LjJjMCAxLjEtLjMgMS40LTEuNCAxLjRoLTg3LjNjLTEuMSAwLTEuNC0uNC0xLjQtMS40VjQ0Ljl6bTE4My40LjN2NDMuMWMwIDEuNiAwIDEuNi0xLjYgMS42aC04Ni4zYy0xLjIgMC0xLjYtLjMtMS42LTEuNVYxLjljMC0xLjEuMy0xLjUgMS41LTEuNWg4Ni42YzEuMiAwIDEuNC40IDEuNCAxLjV2NDMuM3oiIGZpbGw9IiMxNTY1YzAiLz48L3N2Zz4=",
2406
+ '5x2': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTU1OC4yIDB2OTAuMWgtODguM2MtMS45IDAtMS45IDAtMS45LTEuOVYxLjhjMC0xLjggMC0xLjggMS44LTEuOGg4OC40em0wIDkzLjV2ODljMCAuOS0uMiAxLjEtMS4xIDEuMUg0NjhWOTUuNGMwLTEuOCAwLTEuOCAxLjgtMS44aDc1LjljNC4yLS4xIDguNC0uMSAxMi41LS4xeiIgZmlsbD0iI2NiY2JjYiIvPjxnIGZpbGw9IiMxNTY1YzAiPjxwYXRoIGQ9Ik0xODMuOCAxODMuNUg5My42Vjk1LjFjMC0xLjYgMC0xLjcgMS42LTEuN0gxODJjMS43IDAgMS43IDAgMS43IDEuOGwuMSA4OC4zem0yODAuOSAwaC05MC4yVjk1LjJjMC0xLjggMC0xLjggMS43LTEuOGg4Ni43YzEuNyAwIDEuNyAwIDEuNyAxLjh2ODYuNmMwIC42LjEgMS4yLjEgMS43em0tMzc0LjcgMEgwVjk0LjljMC0xLjIuMy0xLjUgMS41LTEuNWg4N2MxLjYgMCAxLjYgMCAxLjYgMS42djg3LjFjMCAuNS0uMSAxLS4xIDEuNHptMTg3LjMgMGgtOTBjMC0uNC0uMS0uOS0uMS0xLjNWOTUuM2MwLTEuNyAwLTEuNyAxLjctMS43aDg2LjdjMS43IDAgMS43IDAgMS43IDEuN3Y4OC4yem05My42IDBoLTkwVjk1LjRjMC0xLjggMC0xLjggMS44LTEuOGg4Ni41YzEuOCAwIDEuOCAwIDEuOCAxLjh2ODYuN2MtLjEuNS0uMSAxLS4xIDEuNHpNMTM4LjggOTAuMUg5NS4xYy0xLjIgMC0xLjYtLjMtMS42LTEuNVYxLjRDOTMuNi4zIDkzLjkgMCA5NSAwaDg3LjRjMS4xIDAgMS40LjQgMS40IDEuNHY4Ny4yYzAgMS4xLS4zIDEuNS0xLjUgMS41aC00My41em0yODAuNiAwSDM3NmMtMS42IDAtMS42IDAtMS42LTEuNnYtODdjMC0xLjIuMi0xLjUgMS41LTEuNWg4Ny4yYzEuMiAwIDEuNS4zIDEuNSAxLjV2ODdjMCAxLjYgMCAxLjYtMS43IDEuNmgtNDMuNXpNLjIgNDUuMVYxLjdDLjIuMS4yLjEgMS45LjFoODYuOGMxLjYgMCAxLjYgMCAxLjYgMS43djg2LjdjMCAxLjYgMCAxLjYtMS42IDEuNkgxLjljLTEuNiAwLTEuNiAwLTEuNi0xLjdMLjIgNDUuMXoiLz48cGF0aCBkPSJNMjc3LjMgNDUuMXY0My40YzAgMS42IDAgMS42LTEuNiAxLjZoLTg2LjljLTEuMiAwLTEuNi0uMy0xLjYtMS41VjEuNWMwLTEuMi40LTEuNCAxLjUtMS40aDg3LjJjMS4yIDAgMS40LjQgMS40IDEuNXY0My41ek0zMjUuOCA5MGgtNDMuM2MtMS42IDAtMS42IDAtMS42LTEuNVYxLjZjMC0xLjIuMy0xLjUgMS41LTEuNWg4Ny4xYzEuMiAwIDEuNS4zIDEuNSAxLjV2ODYuOGMwIDEuNiAwIDEuNi0xLjYgMS42aC00My42eiIvPjwvZz48L3N2Zz4=",
2407
+ '6x1': "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiIgIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyI+PHBhdGggZD0iTTU1OC4yIDB2OTAuMWgtODguNWMtMS42IDAtMS42IDAtMS42LTEuNlYxLjdjMC0xLjYgMC0xLjYgMS42LTEuNmw4OC41LS4xeiIgZmlsbD0iIzE1NjVjMCIvPjxwYXRoIGQ9Ik05MC4yIDE4My41SDBWOTUuMWMwLTEuNyAwLTEuNyAxLjctMS43aDg2LjdjMS44IDAgMS44IDAgMS44IDEuOHY4OC4zem05My42IDBIOTMuNlY5NS4zYzAtMS45IDAtMS45IDEuOS0xLjlIMTgyYzEuOCAwIDEuOCAwIDEuOCAxLjh2ODguM3ptMjgwLjkgMGgtOTAuMlY5NS4xYzAtMS43IDAtMS43IDEuNi0xLjdINDYzYzEuNiAwIDEuNiAwIDEuNiAxLjd2NjQuMWwuMSAyNC4zem05My41LTkwdjg5YzAgLjktLjIgMS4xLTEuMSAxLjFINDY4Vjk1LjJjMC0xLjcgMC0xLjcgMS43LTEuN2g4OC41em0tMjgwLjkgOTBoLTkwVjk0LjhjMC0uOS4xLTEuNSAxLjItMS41SDI3NmMuOSAwIDEuMi4zIDEuMiAxLjJsLjEgODl6bTkzLjYgMGgtOTBWOTUuMWMwLTEuNyAwLTEuNyAxLjctMS43aDg2LjVjMS44IDAgMS44IDAgMS44IDEuOHY4OC4zeiIgZmlsbD0iI2NiY2JjYiIvPjxwYXRoIGQ9Ik0wIDQ1LjFWMS41QzAgLjMuMyAwIDEuNCAwaDg3LjNjMS4yIDAgMS41LjMgMS40IDEuNXY4Ny4xYzAgMS4yLS4zIDEuNS0xLjUgMS41SDEuNGMtMS4zIDAtMS41LS40LTEuNS0xLjZMMCA0NS4xem05My42LS4xVjEuNUM5My42LjMgOTMuOSAwIDk1IDBoODcuM2MxLjIgMCAxLjQuMyAxLjQgMS41djg3LjJjMCAxLjItLjQgMS40LTEuNSAxLjRIOTVjLTEuMiAwLTEuNS0uNC0xLjUtMS41bC4xLTQzLjZ6TTQxOS43IDBoNDMuNGMxLjIgMCAxLjYuMiAxLjYgMS41djg3LjFjMCAxLjItLjMgMS41LTEuNSAxLjVIMzc2Yy0xLjEgMC0xLjUtLjMtMS41LTEuNFYxLjVjMC0xLjIuMy0xLjQgMS41LTEuNGw0My43LS4xek0yNzcuMyA0NS4xdjQzLjNjMCAxLjYgMCAxLjYtMS42IDEuNmgtODYuOGMtMS43IDAtMS43IDAtMS43LTEuNlYxLjVjMC0xLjIuMy0xLjUgMS41LTEuNWg4Ny4yYzEuMiAwIDEuNC40IDEuNCAxLjV2NDMuNnptMy42LS4yVjEuNGMwLTEuMS4zLTEuNSAxLjQtMS41aDg3LjJjMS4zIDAgMS41LjQgMS41IDEuNnY4Ni45YzAgMS42IDAgMS42LTEuNSAxLjZoLTg3Yy0xLjEgMC0xLjUtLjMtMS41LTEuNGwtLjEtNDMuN3oiIGZpbGw9IiMxNTY1YzAiLz48L3N2Zz4=",
2408
+ '6x2': "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyOC4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FtYWRhXzEiIHhtbG5zOnY9Imh0dHBzOi8vdmVjdGEuaW8vbmFubyINCgkgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHZpZXdCb3g9IjAgMCA1NTguMiAxODMuNiINCgkgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNTU4LjIgMTgzLjY7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiMxNTY1QzA7fQ0KPC9zdHlsZT4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik01NTguMiwwdjkwLjFoLTg4LjVjLTEuNiwwLTEuNiwwLTEuNi0xLjZWMS43YzAtMS42LDAtMS42LDEuNi0xLjZDNDY5LjcsMC4xLDU1OC4yLDAsNTU4LjIsMHoiLz4NCjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik05MC4yLDE4My41SDBWOTUuMWMwLTEuNywwLTEuNywxLjctMS43aDg2LjdjMS44LDAsMS44LDAsMS44LDEuOFYxODMuNXogTTE4My44LDE4My41SDkzLjZWOTUuMw0KCWMwLTEuOSwwLTEuOSwxLjktMS45SDE4MmMxLjgsMCwxLjgsMCwxLjgsMS44TDE4My44LDE4My41TDE4My44LDE4My41eiBNNDY0LjcsMTgzLjVoLTkwLjJWOTUuMWMwLTEuNywwLTEuNywxLjYtMS43SDQ2Mw0KCWMxLjYsMCwxLjYsMCwxLjYsMS43djY0LjFMNDY0LjcsMTgzLjVMNDY0LjcsMTgzLjV6IE01NTguMiw5My41djg5YzAsMC45LTAuMiwxLjEtMS4xLDEuMUg0NjhWOTUuMmMwLTEuNywwLTEuNywxLjctMS43SDU1OC4yDQoJTDU1OC4yLDkzLjV6IE0yNzcuMywxODMuNWgtOTBWOTQuOGMwLTAuOSwwLjEtMS41LDEuMi0xLjVIMjc2YzAuOSwwLDEuMiwwLjMsMS4yLDEuMkwyNzcuMywxODMuNUwyNzcuMywxODMuNXogTTM3MC45LDE4My41aC05MA0KCVY5NS4xYzAtMS43LDAtMS43LDEuNy0xLjdoODYuNWMxLjgsMCwxLjgsMCwxLjgsMS44VjE4My41eiIvPg0KPHBhdGggY2xhc3M9InN0MCIgZD0iTTAsNDUuMVYxLjVDMCwwLjMsMC4zLDAsMS40LDBoODcuM2MxLjIsMCwxLjUsMC4zLDEuNCwxLjV2ODcuMWMwLDEuMi0wLjMsMS41LTEuNSwxLjVIMS40DQoJYy0xLjMsMC0xLjUtMC40LTEuNS0xLjZMMCw0NS4xeiBNOTMuNiw0NVYxLjVDOTMuNiwwLjMsOTMuOSwwLDk1LDBoODcuM2MxLjIsMCwxLjQsMC4zLDEuNCwxLjV2ODcuMmMwLDEuMi0wLjQsMS40LTEuNSwxLjRIOTUNCgljLTEuMiwwLTEuNS0wLjQtMS41LTEuNUw5My42LDQ1eiBNNDE5LjcsMGg0My40YzEuMiwwLDEuNiwwLjIsMS42LDEuNXY4Ny4xYzAsMS4yLTAuMywxLjUtMS41LDEuNUgzNzZjLTEuMSwwLTEuNS0wLjMtMS41LTEuNFYxLjUNCgljMC0xLjIsMC4zLTEuNCwxLjUtMS40QzM3NiwwLjEsNDE5LjcsMCw0MTkuNywweiBNMjc3LjMsNDUuMXY0My4zYzAsMS42LDAsMS42LTEuNiwxLjZoLTg2LjhjLTEuNywwLTEuNywwLTEuNy0xLjZWMS41DQoJYzAtMS4yLDAuMy0xLjUsMS41LTEuNWg4Ny4yYzEuMiwwLDEuNCwwLjQsMS40LDEuNUwyNzcuMyw0NS4xTDI3Ny4zLDQ1LjF6IE0yODAuOSw0NC45VjEuNGMwLTEuMSwwLjMtMS41LDEuNC0xLjVoODcuMg0KCWMxLjMsMCwxLjUsMC40LDEuNSwxLjZ2ODYuOWMwLDEuNiwwLDEuNi0xLjUsMS42aC04N2MtMS4xLDAtMS41LTAuMy0xLjUtMS40TDI4MC45LDQ0Ljl6Ii8+DQo8L3N2Zz4NCg==",
2426
2409
  };
2427
2410
 
2428
2411
  //
@@ -2607,95 +2590,103 @@ var __vue_render__$1 = function () {
2607
2590
  })
2608
2591
  : _vm._e(),
2609
2592
  _vm._v(" "),
2610
- _c("dialog", { ref: "frames" }, [
2611
- _c(
2612
- "div",
2613
- {
2614
- staticClass: "visualization-row",
2615
- staticStyle: {
2616
- padding: "5px",
2617
- "font-weight": "bold",
2618
- "background-color": "var(--visualization-primary)",
2619
- "border-color": "var(--visualization-primary)",
2620
- height: "40px",
2621
- color: "white",
2622
- display: "flex",
2623
- "justify-content": "center",
2624
- "padding-top": "10px",
2593
+ _c(
2594
+ "dialog",
2595
+ { ref: "frames" },
2596
+ [
2597
+ _c(
2598
+ "div",
2599
+ {
2600
+ staticClass: "visualization-row",
2601
+ staticStyle: {
2602
+ padding: "5px",
2603
+ "font-weight": "bold",
2604
+ "background-color": "var(--visualization-primary)",
2605
+ "border-color": "var(--visualization-primary)",
2606
+ height: "40px",
2607
+ color: "white",
2608
+ display: "flex",
2609
+ "justify-content": "center",
2610
+ "padding-top": "10px",
2611
+ },
2625
2612
  },
2626
- },
2627
- [_vm._v("\n " + _vm._s(_vm.$t("infoBar.gridForm")) + "\n ")]
2628
- ),
2629
- _vm._v(" "),
2630
- _c(
2631
- "div",
2632
- {
2633
- staticClass: "visualization-row",
2634
- staticStyle: { "justify-content": "center" },
2635
- },
2636
- _vm._l(_vm.items, function (item, index) {
2637
- return _c(
2638
- "div",
2639
- {
2640
- key: index,
2641
- staticClass: "visualization-col",
2642
- staticStyle: { "min-width": "200px", "max-width": "200px" },
2613
+ [_vm._v("\n " + _vm._s(_vm.$t("infoBar.gridForm")) + "\n ")]
2614
+ ),
2615
+ _vm._v(" "),
2616
+ _c(
2617
+ "v-row",
2618
+ {
2619
+ staticClass: "visualization-row",
2620
+ staticStyle: { "justify-content": "center" },
2621
+ },
2622
+ _vm._l(_vm.items, function (item, index) {
2623
+ return _c(
2624
+ "v-col",
2625
+ {
2626
+ key: index,
2627
+ staticClass: "visualization-col",
2628
+ staticStyle: { "min-width": "200px", "max-width": "200px" },
2629
+ },
2630
+ [
2631
+ _c("img", {
2632
+ style:
2633
+ _vm.framesValue !== item.value
2634
+ ? "filter: grayscale(1)"
2635
+ : "",
2636
+ attrs: {
2637
+ src: "data:image/svg+xml;base64," + item.image,
2638
+ width: "100%",
2639
+ },
2640
+ on: {
2641
+ click: function () {
2642
+ return (_vm.framesValue = item.value)
2643
+ },
2644
+ },
2645
+ }),
2646
+ ]
2647
+ )
2648
+ }),
2649
+ 1
2650
+ ),
2651
+ _vm._v(" "),
2652
+ _c("div", { staticClass: "visualization-divider" }),
2653
+ _vm._v(" "),
2654
+ _c(
2655
+ "div",
2656
+ {
2657
+ staticClass: "visualization-row",
2658
+ staticStyle: {
2659
+ display: "flex",
2660
+ "justify-content": "center",
2661
+ "margin-top": "10px",
2662
+ "margin-bottom": "10px",
2643
2663
  },
2644
- [
2645
- _c("img", {
2646
- style:
2647
- _vm.framesValue !== item.value
2648
- ? "filter: grayscale(1)"
2649
- : "",
2650
- attrs: { src: item.image, width: "100%" },
2664
+ },
2665
+ [
2666
+ _c(
2667
+ "button",
2668
+ {
2669
+ staticStyle: {
2670
+ "border-radius": "4px",
2671
+ height: "35px",
2672
+ width: "70px",
2673
+ "background-color": "var(--visualization-primary)",
2674
+ "border-color": "var(--visualization-primary)",
2675
+ color: "white",
2676
+ },
2651
2677
  on: {
2652
- click: function () {
2653
- return (_vm.framesValue = item.value)
2678
+ click: function ($event) {
2679
+ return _vm.$emit("close", "frames")
2654
2680
  },
2655
2681
  },
2656
- }),
2657
- ]
2658
- )
2659
- }),
2660
- 0
2661
- ),
2662
- _vm._v(" "),
2663
- _c("div", { staticClass: "visualization-divider" }),
2664
- _vm._v(" "),
2665
- _c(
2666
- "div",
2667
- {
2668
- staticClass: "visualization-row",
2669
- staticStyle: {
2670
- display: "flex",
2671
- "justify-content": "center",
2672
- "margin-top": "10px",
2673
- "margin-bottom": "10px",
2674
- },
2675
- },
2676
- [
2677
- _c(
2678
- "button",
2679
- {
2680
- staticStyle: {
2681
- "border-radius": "4px",
2682
- height: "35px",
2683
- width: "70px",
2684
- "background-color": "var(--visualization-primary)",
2685
- "border-color": "var(--visualization-primary)",
2686
- color: "white",
2687
- },
2688
- on: {
2689
- click: function ($event) {
2690
- return _vm.$emit("close", "frames")
2691
- },
2692
2682
  },
2693
- },
2694
- [_vm._v("\n Ok\n ")]
2695
- ),
2696
- ]
2697
- ),
2698
- ]),
2683
+ [_vm._v("\n Ok\n ")]
2684
+ ),
2685
+ ]
2686
+ ),
2687
+ ],
2688
+ 1
2689
+ ),
2699
2690
  _vm._v(" "),
2700
2691
  _c("dialog", { ref: "secondsPerFrame" }, [
2701
2692
  _c(
@@ -3033,11 +3024,11 @@ __vue_render__$1._withStripped = true;
3033
3024
  /* style */
3034
3025
  const __vue_inject_styles__$1 = function (inject) {
3035
3026
  if (!inject) return
3036
- inject("data-v-76bbde5a_0", { source: "\ndialog[data-v-76bbde5a] {\r\n max-width: 60vw;\r\n /* padding: 12px; */\r\n border: none;\r\n background: white;\r\n border-radius: 6px;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translateY(-50%) translateX(-50%);\n}\r\n", map: {"version":3,"sources":["C:\\workspace\\visualization\\src\\components\\Settings.vue"],"names":[],"mappings":";AAmZA;EACA,eAAA;EACA,mBAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;EACA;mCACA;EACA,eAAA;EACA,QAAA;EACA,SAAA;EACA,4CAAA;AACA","file":"Settings.vue","sourcesContent":["<template>\r\n <div>\r\n <GlobalEvents\r\n v-if=\"dialogsVisibility.frames\"\r\n @keydown.37=\"prevFormat\"\r\n @keydown.39=\"nextFormat\"\r\n />\r\n <!-- Formato da grelha -->\r\n <dialog ref=\"frames\">\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 40px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 10px;\r\n \"\r\n >\r\n {{ $t('infoBar.gridForm') }}\r\n </div>\r\n <div class=\"visualization-row\" style=\"justify-content: center\">\r\n <div\r\n v-for=\"(item, index) in items\"\r\n :key=\"index\"\r\n class=\"visualization-col\"\r\n style=\"min-width: 200px; max-width: 200px\"\r\n >\r\n <img\r\n @click=\"() => (framesValue = item.value)\"\r\n :src=\"item.image\"\r\n width=\"100%\"\r\n :style=\"framesValue !== item.value ? 'filter: grayscale(1)' : ''\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"visualization-divider\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n display: flex;\r\n justify-content: center;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n \"\r\n >\r\n <button\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n \"\r\n @click=\"$emit('close', 'frames')\"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n\r\n <!-- Frequencia das Imagens -->\r\n <dialog ref=\"secondsPerFrame\">\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 40px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 10px;\r\n \"\r\n >\r\n {{ $t('infoBar.secondImage') }}\r\n </div>\r\n <div class=\"visualization-row\" style=\"margin: 25px; height: 20px\">\r\n <input\r\n ref=\"secondsPerFrameInput\"\r\n v-model=\"secondsPerFrameValue\"\r\n type=\"range\"\r\n step=\"1\"\r\n max=\"5\"\r\n min=\"1\"\r\n style=\"height: 30px; width: 300px\"\r\n />\r\n <span style=\"padding-left: 20px; font-size: 16px\">\r\n {{ secondsPerFrame + ' s' }}</span\r\n >\r\n </div>\r\n <div class=\"visualization-divider\" style=\"margin: 10px\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"display: flex; justify-content: center; margin-top: 10px\"\r\n >\r\n <button\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n margin-bottom: 8px;\r\n \"\r\n @click=\"$emit('close', 'secondsPerFrame')\"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n\r\n <!-- Go To -->\r\n <dialog ref=\"goTo\">\r\n <div\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 35px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 8px;\r\n \"\r\n >\r\n {{ $t('infoBar.goTo') }}\r\n </div>\r\n <div class=\"visualization-row\" style=\"margin: 25px; height: 20px\">\r\n <input\r\n v-model=\"goToValue\"\r\n type=\"text\"\r\n placeholder=\"hh:mm:ss\"\r\n v-mask=\"'##:##:##'\"\r\n style=\"\r\n height: 30px;\r\n width: 300px;\r\n border: 0.1px solid #c2c9d6;\r\n border-radius: 3px;\r\n padding: 5px;\r\n \"\r\n />\r\n </div>\r\n <div class=\"visualization-divider\" style=\"margin-top: 40px\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n display: flex;\r\n justify-content: center;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n \"\r\n >\r\n <button\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n \"\r\n @click=\"\r\n () => {\r\n $emit('close', 'goTo')\r\n $emit('change-go-to', goToValue)\r\n goToValue = ''\r\n }\r\n \"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n\r\n <!-- Velocidade Reprodução -->\r\n <GlobalEvents\r\n @keydown.107=\"changePlaybackRate(1)\"\r\n @keydown.109=\"changePlaybackRate(-1)\"\r\n />\r\n <dialog ref=\"playbackRate\">\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 35px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 8px;\r\n \"\r\n >\r\n {{ $t('infoBar.playbackSpeed') }}\r\n </div>\r\n <div\r\n class=\"visualization-row\"\r\n style=\"margin: 25px; height: 20px; width: 380px\"\r\n >\r\n <input\r\n ref=\"playbackRateInput\"\r\n v-model=\"playbackRateValue\"\r\n type=\"range\"\r\n step=\"0.25\"\r\n max=\"3\"\r\n min=\"1\"\r\n style=\"height: 30px; width: 300px\"\r\n />\r\n <span\r\n style=\"padding-left: 20px; padding-right: 20px; font-size: 16px\"\r\n >{{ playbackRate + 'x' }}</span\r\n >\r\n </div>\r\n <div class=\"visualization-divider\" style=\"margin-top: 40px\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n display: flex;\r\n justify-content: center;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n \"\r\n >\r\n <button\r\n @click=\"$emit('close', 'playbackRate')\"\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n \"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n </div>\r\n</template>\r\n<script>\r\nimport GridImages from '../assets/grid/index.js'\r\n\r\nexport default {\r\n props: {\r\n dialogsVisibility: {\r\n type: Object,\r\n required: false,\r\n },\r\n playbackRate: {\r\n type: Number,\r\n required: true,\r\n },\r\n secondsPerFrame: {\r\n type: Number,\r\n required: true,\r\n },\r\n framesPerRow: {\r\n type: Number,\r\n required: true,\r\n },\r\n numberOfRows: {\r\n type: Number,\r\n required: true,\r\n },\r\n },\r\n data() {\r\n return {\r\n openBlocksDialog: false,\r\n time: '',\r\n rangeBlocks: {\r\n ini: null,\r\n end: null,\r\n date: null,\r\n },\r\n items: [\r\n { text: '2x1', value: 1, image: GridImages['2x1'] },\r\n { text: '3x1', value: 2, image: GridImages['3x1'] },\r\n { text: '3x2', value: 3, image: GridImages['3x2'] },\r\n { text: '4x1', value: 4, image: GridImages['4x1'] },\r\n { text: '4x2', value: 5, image: GridImages['4x2'] },\r\n { text: '5x1', value: 6, image: GridImages['5x1'] },\r\n { text: '5x2', value: 7, image: GridImages['5x2'] },\r\n { text: '6x1', value: 8, image: GridImages['6x1'] },\r\n { text: '6x2', value: 9, image: GridImages['6x2'] },\r\n ],\r\n\r\n // NEW\r\n goToValue: '',\r\n }\r\n },\r\n mounted() {\r\n this.toogleDialogs()\r\n },\r\n computed: {\r\n secondsPerFrameValue: {\r\n get() {\r\n return this.secondsPerFrame\r\n },\r\n set(val) {\r\n this.$emit('change-seconds-per-frame', parseInt(val))\r\n },\r\n },\r\n playbackRateValue: {\r\n get() {\r\n return this.playbackRate\r\n },\r\n set(val) {\r\n this.$emit('change-playback-rate', parseFloat(val))\r\n },\r\n },\r\n framesValue: {\r\n get() {\r\n return this.items.find(\r\n (item) => item.text === `${this.framesPerRow}x${this.numberOfRows}`\r\n ).value\r\n },\r\n set(value) {\r\n this.$emit('set-frames-selection', value)\r\n },\r\n },\r\n timeRules() {\r\n return [\r\n (time) =>\r\n (time >= '02:30:00' && time <= '26:29:59') ||\r\n this.$i18n.t('form.mustBeBetween'),\r\n ]\r\n },\r\n },\r\n methods: {\r\n toogleDialogs() {\r\n for (const dialog of Object.values(this.$refs)) {\r\n dialog.close?.()\r\n }\r\n\r\n const openDialog = Object.keys(this.dialogsVisibility).find(\r\n (key) => this.dialogsVisibility[key]\r\n )\r\n\r\n if (openDialog) {\r\n this.$refs[openDialog].showModal()\r\n }\r\n },\r\n prevFormat() {\r\n if (this.items.find((format) => format.value === this.framesValue - 1)) {\r\n this.framesValue--\r\n }\r\n },\r\n nextFormat() {\r\n if (this.items.find((format) => format.value === this.framesValue + 1)) {\r\n this.framesValue++\r\n }\r\n },\r\n changePlaybackRate(direction = 1) {\r\n if (direction === 1) {\r\n this.$refs.playbackRateInput.stepUp()\r\n } else if (direction === -1) {\r\n this.$refs.playbackRateInput.stepDown()\r\n }\r\n this.playbackRateValue = this.$refs.playbackRateInput.value\r\n },\r\n closeBlocksDialog() {\r\n Object.entries(this.rangeBlocks).forEach(([key, value]) => {\r\n if (!value || key == 'date') return\r\n var res = value.replace(/\\D/g, '')\r\n if (res.length < 6) {\r\n for (let i = res.length; i < 6; i++) {\r\n res += '0'\r\n }\r\n }\r\n res.match(/.{1,2}/g)\r\n let a = res.substring(0, 2)\r\n let b = res.substring(2, 4)\r\n let c = res.substring(4, 6)\r\n this.rangeBlocks[key] = a + ':' + b + ':' + c\r\n })\r\n\r\n this.openBlocksDialog = false\r\n this.$emit('goToBlockInterval', this.rangeBlocks)\r\n },\r\n },\r\n watch: {\r\n dialogsVisibility: {\r\n handler() {\r\n this.toogleDialogs()\r\n },\r\n deep: true,\r\n },\r\n },\r\n}\r\n</script>\r\n<style scoped>\r\ndialog {\r\n max-width: 60vw;\r\n /* padding: 12px; */\r\n border: none;\r\n background: white;\r\n border-radius: 6px;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translateY(-50%) translateX(-50%);\r\n}\r\n</style>\r\n"]}, media: undefined });
3027
+ inject("data-v-29b1922f_0", { source: "\ndialog[data-v-29b1922f] {\r\n max-width: 60vw;\r\n /* padding: 12px; */\r\n border: none;\r\n background: white;\r\n border-radius: 6px;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translateY(-50%) translateX(-50%);\n}\r\n", map: {"version":3,"sources":["C:\\workspace\\visualization\\src\\components\\Settings.vue"],"names":[],"mappings":";AAmZA;EACA,eAAA;EACA,mBAAA;EACA,YAAA;EACA,iBAAA;EACA,kBAAA;EACA;mCACA;EACA,eAAA;EACA,QAAA;EACA,SAAA;EACA,4CAAA;AACA","file":"Settings.vue","sourcesContent":["<template>\r\n <div>\r\n <GlobalEvents\r\n v-if=\"dialogsVisibility.frames\"\r\n @keydown.37=\"prevFormat\"\r\n @keydown.39=\"nextFormat\"\r\n />\r\n <!-- Formato da grelha -->\r\n <dialog ref=\"frames\">\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 40px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 10px;\r\n \"\r\n >\r\n {{ $t('infoBar.gridForm') }}\r\n </div>\r\n <v-row class=\"visualization-row\" style=\"justify-content: center\">\r\n <v-col\r\n v-for=\"(item, index) in items\"\r\n :key=\"index\"\r\n class=\"visualization-col\"\r\n style=\"min-width: 200px; max-width: 200px\"\r\n >\r\n <img\r\n @click=\"() => (framesValue = item.value)\"\r\n :src=\"`data:image/svg+xml;base64,${item.image}`\"\r\n width=\"100%\"\r\n :style=\"framesValue !== item.value ? 'filter: grayscale(1)' : ''\"\r\n />\r\n </v-col>\r\n </v-row>\r\n <div class=\"visualization-divider\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n display: flex;\r\n justify-content: center;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n \"\r\n >\r\n <button\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n \"\r\n @click=\"$emit('close', 'frames')\"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n\r\n <!-- Frequencia das Imagens -->\r\n <dialog ref=\"secondsPerFrame\">\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 40px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 10px;\r\n \"\r\n >\r\n {{ $t('infoBar.secondImage') }}\r\n </div>\r\n <div class=\"visualization-row\" style=\"margin: 25px; height: 20px\">\r\n <input\r\n ref=\"secondsPerFrameInput\"\r\n v-model=\"secondsPerFrameValue\"\r\n type=\"range\"\r\n step=\"1\"\r\n max=\"5\"\r\n min=\"1\"\r\n style=\"height: 30px; width: 300px\"\r\n />\r\n <span style=\"padding-left: 20px; font-size: 16px\">\r\n {{ secondsPerFrame + ' s' }}</span\r\n >\r\n </div>\r\n <div class=\"visualization-divider\" style=\"margin: 10px\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"display: flex; justify-content: center; margin-top: 10px\"\r\n >\r\n <button\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n margin-bottom: 8px;\r\n \"\r\n @click=\"$emit('close', 'secondsPerFrame')\"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n\r\n <!-- Go To -->\r\n <dialog ref=\"goTo\">\r\n <div\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 35px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 8px;\r\n \"\r\n >\r\n {{ $t('infoBar.goTo') }}\r\n </div>\r\n <div class=\"visualization-row\" style=\"margin: 25px; height: 20px\">\r\n <input\r\n v-model=\"goToValue\"\r\n type=\"text\"\r\n placeholder=\"hh:mm:ss\"\r\n v-mask=\"'##:##:##'\"\r\n style=\"\r\n height: 30px;\r\n width: 300px;\r\n border: 0.1px solid #c2c9d6;\r\n border-radius: 3px;\r\n padding: 5px;\r\n \"\r\n />\r\n </div>\r\n <div class=\"visualization-divider\" style=\"margin-top: 40px\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n display: flex;\r\n justify-content: center;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n \"\r\n >\r\n <button\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n \"\r\n @click=\"\r\n () => {\r\n $emit('close', 'goTo')\r\n $emit('change-go-to', goToValue)\r\n goToValue = ''\r\n }\r\n \"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n\r\n <!-- Velocidade Reprodução -->\r\n <GlobalEvents\r\n @keydown.107=\"changePlaybackRate(1)\"\r\n @keydown.109=\"changePlaybackRate(-1)\"\r\n />\r\n <dialog ref=\"playbackRate\">\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n padding: 5px;\r\n font-weight: bold;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n height: 35px;\r\n color: white;\r\n display: flex;\r\n justify-content: center;\r\n padding-top: 8px;\r\n \"\r\n >\r\n {{ $t('infoBar.playbackSpeed') }}\r\n </div>\r\n <div\r\n class=\"visualization-row\"\r\n style=\"margin: 25px; height: 20px; width: 380px\"\r\n >\r\n <input\r\n ref=\"playbackRateInput\"\r\n v-model=\"playbackRateValue\"\r\n type=\"range\"\r\n step=\"0.25\"\r\n max=\"3\"\r\n min=\"1\"\r\n style=\"height: 30px; width: 300px\"\r\n />\r\n <span\r\n style=\"padding-left: 20px; padding-right: 20px; font-size: 16px\"\r\n >{{ playbackRate + 'x' }}</span\r\n >\r\n </div>\r\n <div class=\"visualization-divider\" style=\"margin-top: 40px\" />\r\n <div\r\n class=\"visualization-row\"\r\n style=\"\r\n display: flex;\r\n justify-content: center;\r\n margin-top: 10px;\r\n margin-bottom: 10px;\r\n \"\r\n >\r\n <button\r\n @click=\"$emit('close', 'playbackRate')\"\r\n style=\"\r\n border-radius: 4px;\r\n height: 35px;\r\n width: 70px;\r\n background-color: var(--visualization-primary);\r\n border-color: var(--visualization-primary);\r\n color: white;\r\n \"\r\n >\r\n Ok\r\n </button>\r\n </div>\r\n </dialog>\r\n </div>\r\n</template>\r\n<script>\r\nimport GridImages from '../assets/grid/index.js'\r\n\r\nexport default {\r\n props: {\r\n dialogsVisibility: {\r\n type: Object,\r\n required: false,\r\n },\r\n playbackRate: {\r\n type: Number,\r\n required: true,\r\n },\r\n secondsPerFrame: {\r\n type: Number,\r\n required: true,\r\n },\r\n framesPerRow: {\r\n type: Number,\r\n required: true,\r\n },\r\n numberOfRows: {\r\n type: Number,\r\n required: true,\r\n },\r\n },\r\n data() {\r\n return {\r\n openBlocksDialog: false,\r\n time: '',\r\n rangeBlocks: {\r\n ini: null,\r\n end: null,\r\n date: null,\r\n },\r\n items: [\r\n { text: '2x1', value: 1, image: GridImages['2x1'] },\r\n { text: '3x1', value: 2, image: GridImages['3x1'] },\r\n { text: '3x2', value: 3, image: GridImages['3x2'] },\r\n { text: '4x1', value: 4, image: GridImages['4x1'] },\r\n { text: '4x2', value: 5, image: GridImages['4x2'] },\r\n { text: '5x1', value: 6, image: GridImages['5x1'] },\r\n { text: '5x2', value: 7, image: GridImages['5x2'] },\r\n { text: '6x1', value: 8, image: GridImages['6x1'] },\r\n { text: '6x2', value: 9, image: GridImages['6x2'] },\r\n ],\r\n\r\n // NEW\r\n goToValue: '',\r\n }\r\n },\r\n mounted() {\r\n this.toogleDialogs()\r\n },\r\n computed: {\r\n secondsPerFrameValue: {\r\n get() {\r\n return this.secondsPerFrame\r\n },\r\n set(val) {\r\n this.$emit('change-seconds-per-frame', parseInt(val))\r\n },\r\n },\r\n playbackRateValue: {\r\n get() {\r\n return this.playbackRate\r\n },\r\n set(val) {\r\n this.$emit('change-playback-rate', parseFloat(val))\r\n },\r\n },\r\n framesValue: {\r\n get() {\r\n return this.items.find(\r\n (item) => item.text === `${this.framesPerRow}x${this.numberOfRows}`\r\n ).value\r\n },\r\n set(value) {\r\n this.$emit('set-frames-selection', value)\r\n },\r\n },\r\n timeRules() {\r\n return [\r\n (time) =>\r\n (time >= '02:30:00' && time <= '26:29:59') ||\r\n this.$i18n.t('form.mustBeBetween'),\r\n ]\r\n },\r\n },\r\n methods: {\r\n toogleDialogs() {\r\n for (const dialog of Object.values(this.$refs)) {\r\n dialog.close?.()\r\n }\r\n\r\n const openDialog = Object.keys(this.dialogsVisibility).find(\r\n (key) => this.dialogsVisibility[key]\r\n )\r\n\r\n if (openDialog) {\r\n this.$refs[openDialog].showModal()\r\n }\r\n },\r\n prevFormat() {\r\n if (this.items.find((format) => format.value === this.framesValue - 1)) {\r\n this.framesValue--\r\n }\r\n },\r\n nextFormat() {\r\n if (this.items.find((format) => format.value === this.framesValue + 1)) {\r\n this.framesValue++\r\n }\r\n },\r\n changePlaybackRate(direction = 1) {\r\n if (direction === 1) {\r\n this.$refs.playbackRateInput.stepUp()\r\n } else if (direction === -1) {\r\n this.$refs.playbackRateInput.stepDown()\r\n }\r\n this.playbackRateValue = this.$refs.playbackRateInput.value\r\n },\r\n closeBlocksDialog() {\r\n Object.entries(this.rangeBlocks).forEach(([key, value]) => {\r\n if (!value || key == 'date') return\r\n var res = value.replace(/\\D/g, '')\r\n if (res.length < 6) {\r\n for (let i = res.length; i < 6; i++) {\r\n res += '0'\r\n }\r\n }\r\n res.match(/.{1,2}/g)\r\n let a = res.substring(0, 2)\r\n let b = res.substring(2, 4)\r\n let c = res.substring(4, 6)\r\n this.rangeBlocks[key] = a + ':' + b + ':' + c\r\n })\r\n\r\n this.openBlocksDialog = false\r\n this.$emit('goToBlockInterval', this.rangeBlocks)\r\n },\r\n },\r\n watch: {\r\n dialogsVisibility: {\r\n handler() {\r\n this.toogleDialogs()\r\n },\r\n deep: true,\r\n },\r\n },\r\n}\r\n</script>\r\n<style scoped>\r\ndialog {\r\n max-width: 60vw;\r\n /* padding: 12px; */\r\n border: none;\r\n background: white;\r\n border-radius: 6px;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translateY(-50%) translateX(-50%);\r\n}\r\n</style>\r\n"]}, media: undefined });
3037
3028
 
3038
3029
  };
3039
3030
  /* scoped */
3040
- const __vue_scope_id__$1 = "data-v-76bbde5a";
3031
+ const __vue_scope_id__$1 = "data-v-29b1922f";
3041
3032
  /* module identifier */
3042
3033
  const __vue_module_identifier__$1 = undefined;
3043
3034
  /* functional template */
@@ -3062,873 +3053,891 @@ __vue_render__$1._withStripped = true;
3062
3053
  );
3063
3054
 
3064
3055
  //
3065
-
3066
- const Positions = Object.freeze({
3067
- previous: 0,
3068
- current: 1,
3069
- next: 2,
3070
- });
3071
-
3072
- var script = {
3073
- name: 'visualization-container',
3074
- props: {
3075
- value: {
3076
- type: Boolean,
3077
- required: true,
3078
- },
3079
- date: {
3080
- type: String,
3081
- required: true,
3082
- },
3083
- channel: {
3084
- type: Number,
3085
- required: true,
3086
- },
3087
- startAudienceTime: {
3088
- type: String,
3089
- required: true,
3090
- },
3091
- endAudienceTime: {
3092
- type: String,
3093
- required: true,
3094
- },
3095
- videoProgressBar: {
3096
- type: Boolean,
3097
- default: false,
3098
- },
3099
- jumpOnInsert: {
3100
- type: Boolean,
3101
- default: false,
3102
- },
3103
- framesFormat: {
3104
- type: [Number, String],
3105
- default: 6,
3106
- },
3107
- maxSize: {
3108
- type: Number,
3109
- }
3110
- },
3111
- components: {
3112
- Frame: __vue_component__$5,
3113
- CommandBar: __vue_component__$4,
3114
- InfoBar: __vue_component__$3,
3115
- VideoProgress: __vue_component__$2,
3116
- Settings: __vue_component__$1,
3117
- // Help,
3118
- },
3119
- data() {
3120
- return {
3121
- Positions,
3122
- updatingChannel: null,
3123
- dialog: false,
3124
- timeLastBlock: null,
3125
- alternativeServer: false,
3126
- useCache: true,
3127
- numberOfRows: 1,
3128
- framesPerRow: 5,
3129
- secondsPerFrame: 1,
3130
- fInterface: null,
3131
- velocity: 1,
3132
- frames: [],
3133
- previousFrames: [],
3134
- nextFrames: [],
3135
- channelCode: 0,
3136
- videoPlaying: false,
3137
- activeFrame: null,
3138
- activeVideo: null,
3139
- videoTime: 0,
3140
- videoTotalTime: null,
3141
- progressVideoDrag: false,
3142
- hourIniSelected: false,
3143
- hourEndSelected: false,
3144
- canInsertTime: false,
3145
- lastHeight: 0,
3146
- loopInterval: null,
3147
- nextLoop: false,
3148
- prevLoop: false,
3149
- videoSliderTotalDuration: 900,
3150
- blockStartTime: null,
3151
- media: null,
3152
- changeServer: false,
3153
- userMultiTabsGrid: false,
3154
- userMultiTabsGridsModel: true,
3155
- playbackRate: 1,
3156
- paused: false,
3157
- commandBarShow: true,
3158
- dialogs: {
3159
- playbackRate: false,
3160
- goTo: false,
3161
- secondsPerFrame: false,
3162
- frames: false,
3163
- },
3164
- }
3165
- },
3166
- async created() {
3167
- this.changeServer = this.serverOfFrames === 'alternative';
3168
- this.alternativeServer = this.serverOfFrames === 'alternative';
3169
-
3170
- const settings = [
3171
- {
3172
- framesPerRow: 2,
3173
- numberOfRows: 1,
3174
- },
3175
- {
3176
- framesPerRow: 3,
3177
- numberOfRows: 1,
3178
- },
3179
- {
3180
- framesPerRow: 3,
3181
- numberOfRows: 2,
3182
- },
3183
- {
3184
- framesPerRow: 4,
3185
- numberOfRows: 1,
3186
- },
3187
- {
3188
- framesPerRow: 4,
3189
- numberOfRows: 2,
3190
- },
3191
- {
3192
- framesPerRow: 5,
3193
- numberOfRows: 1,
3194
- },
3195
- {
3196
- framesPerRow: 5,
3197
- numberOfRows: 2,
3198
- },
3199
- {
3200
- framesPerRow: 6,
3201
- numberOfRows: 1,
3202
- },
3203
- {
3204
- framesPerRow: 6,
3205
- numberOfRows: 2,
3206
- },
3207
- ];
3208
-
3209
- const storedOnDb = settings[parseInt(this.framesFormat) - 1];
3210
- this.framesPerRow = storedOnDb.framesPerRow;
3211
- this.numberOfRows = storedOnDb.numberOfRows;
3212
-
3213
- await this.createFramesInterface();
3214
- if (this.maxSize) {
3215
- this.resize(this.maxSize, true);
3216
- }
3217
- },
3218
- methods: {
3219
- framesClicked(e) {
3220
- if (e.target.id != 'insert') {
3221
- this.active = true;
3222
- }
3223
- },
3224
- async goToStartBlock() {
3225
- try {
3226
- const d = new Date();
3227
- let timestamp = Date.UTC(
3228
- d.getFullYear(),
3229
- d.getMonth(),
3230
- d.getDate(),
3231
- d.getHours(),
3232
- d.getMinutes(),
3233
- d.getSeconds()
3234
- );
3235
-
3236
- const response = (
3237
- await FramesService.getNextAvailableBlock({
3238
- channel: this.channel,
3239
- time: timestamp / 1000,
3240
- })
3241
- ).data;
3242
-
3243
- this.dialog = false;
3244
- this.changeHour(this.convertToAudienceTime(response.data.start, ':'));
3245
- } catch (err) {
3246
- console.error(err);
3247
- }
3248
- },
3249
- async checkAvailableBlock() {
3250
- try {
3251
- const d = new Date();
3252
- let timestamp = Date.UTC(
3253
- d.getFullYear(),
3254
- d.getMonth(),
3255
- d.getDate(),
3256
- d.getHours(),
3257
- d.getMinutes(),
3258
- d.getSeconds()
3259
- );
3260
-
3261
- const response = (
3262
- await FramesService.getNextAvailableBlock({
3263
- channel: this.channel,
3264
- time: timestamp / 1000,
3265
- })
3266
- ).data;
3267
-
3268
- this.timeLastBlock = this.convertToAudienceTime(response.data.end, ':');
3269
- this.dialog = true;
3270
- if (!response.status) {
3271
- this.timeLastBlock = 'N/D';
3272
- }
3273
- } catch (err) {
3274
- console.error(err);
3275
- }
3276
- },
3277
- updateSlider(videoStartTime, time) {
3278
- // * atualizar slider se estiver fora do range definido previamente
3279
- if (
3280
- time < this.blockStartTime ||
3281
- time > this.blockStartTime ||
3282
- videoStartTime > this.blockStartTime + this.videoSliderTotalDuration
3283
- ) {
3284
- this.blockStartTime = videoStartTime;
3285
- this.videoSliderTotalDuration = 900;
3286
- }
3287
- },
3288
- nextLoopActivate() {
3289
- this.breakLoop();
3290
- this.loopInterval = setInterval(this.next, 40);
3291
- setTimeout(() => {
3292
- this.nextLoop = true;
3293
- }, 0);
3294
- },
3295
- prevLoopActivate() {
3296
- this.breakLoop();
3297
- this.loopInterval = setInterval(this.prev, 40);
3298
- setTimeout(() => {
3299
- this.prevLoop = true;
3300
- }, 0);
3301
- },
3302
- breakLoop() {
3303
- clearInterval(this.loopInterval);
3304
- this.loopInterval = null;
3305
- this.nextLoop = false;
3306
- this.prevLoop = false;
3307
- },
3308
- changePlayPause(status) {
3309
- this.paused = !status;
3310
- },
3311
- resize(height=this.lastHeight) {
3312
- this.lastHeight = height;
3313
- if (this.$refs.frames) {
3314
- for (let frame of this.$refs.frames) {
3315
- frame.resize(height);
3316
- }
3317
- }
3318
- this.$emit('resized');
3319
- },
3320
- async goToFirstFrame() {
3321
- let frames = this.$refs.frames;
3322
-
3323
- let audienceTime = null;
3324
- if (frames.length > 0) {
3325
- let frame = frames[0].frame;
3326
- audienceTime = this.getAudienceTime(frame.time, 0, 0, 0);
3327
- }
3328
- // if (audienceTime) {
3329
- // this.changeHour(this.getLastFirtsBlockTime(audienceTime, true))
3330
- // }
3331
- if (audienceTime) {
3332
- const [hours, minutes, seconds] = audienceTime.split(':');
3333
- const totalSeconds =
3334
- parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseInt(seconds);
3335
- if (totalSeconds >= 9000)
3336
- this.changeHour(this.getLastFirtsBlockTime(audienceTime, true));
3337
- else this.changeHour(this.getLastFirtsBlockTime('02:30:00', true));
3338
- }
3339
- },
3340
- async goToLastFrame() {
3341
- let frames = this.$refs.frames;
3342
- let audienceTime = null;
3343
- if (frames.length > 0) {
3344
- let frame = frames[0].frame;
3345
-
3346
- audienceTime = this.getAudienceTime(frame.time, 0, 0, 0);
3347
- }
3348
- if (audienceTime) {
3349
- this.changeHour(this.getLastFirtsBlockTime(audienceTime));
3350
- }
3351
- },
3352
- getLastFirtsBlockTime(time, first = false) {
3353
- if (time.indexOf(':') !== -1) {
3354
- time = time.replace(/:/g, '');
3355
- }
3356
- let h, m, newTime;
3357
- const t = time.match(/.{1,2}/g);
3358
- if (t[0] && t[1]) {
3359
- h = parseInt(t[0]);
3360
- m = parseInt(t[1]);
3361
- }
3362
- if (h < 26) {
3363
- if (m < 15)
3364
- if (first) newTime = t[0] + ':00:00';
3365
- else newTime = t[0] + ':14:59';
3366
- else if (m < 30)
3367
- if (first) newTime = t[0] + ':15:00';
3368
- else newTime = t[0] + ':29:59';
3369
- else if (m < 45)
3370
- if (first) newTime = t[0] + ':30:00';
3371
- else newTime = t[0] + ':44:59';
3372
- else if (first) newTime = t[0] + ':45:00';
3373
- else newTime = t[0] + ':59:59';
3374
- } else {
3375
- if (m < 15)
3376
- if (first) newTime = '26:00:00';
3377
- else newTime = '26:14:59';
3378
- else {
3379
- if (first) newTime = '26:15:00';
3380
- else newTime = '26:29:59';
3381
- }
3382
- }
3383
- return newTime
3384
- },
3385
- openBlocks() {
3386
- this.$refs.settings2?.openBlocks();
3387
- },
3388
- playOrPause() {
3389
- const array = this.$refs.frames.filter((fc) => !!fc.active);
3390
- if (array.length === 1) {
3391
- const frame = array[0];
3392
- frame.playOrPause(this.playbackRate);
3393
- }
3394
- },
3395
- stopPlayingBar() {
3396
- for (let ref of this.$refs.frames) {
3397
- if (
3398
- ref.videoStatus === ref.Status.playing ||
3399
- ref.videoStatus === ref.Status.paused
3400
- ) {
3401
- ref.stop(false);
3402
- }
3403
- }
3404
- },
3405
- async setFrameSelection(selected) {
3406
- this.frames = this.loadingArray;
3407
- switch (parseInt(selected)) {
3408
- // 2x1
3409
- case 1:
3410
- this.framesPerRow = 2;
3411
- this.numberOfRows = 1;
3412
- break
3413
- // 3x1
3414
- case 2:
3415
- this.framesPerRow = 3;
3416
- this.numberOfRows = 1;
3417
- break
3418
- // 3x2
3419
- case 3:
3420
- this.framesPerRow = 3;
3421
- this.numberOfRows = 2;
3422
- break
3423
- // 4x1
3424
- case 4:
3425
- this.framesPerRow = 4;
3426
- this.numberOfRows = 1;
3427
- break
3428
- // 4x2
3429
- case 5:
3430
- this.framesPerRow = 4;
3431
- this.numberOfRows = 2;
3432
- break
3433
- // 5x1
3434
- case 6:
3435
- this.framesPerRow = 5;
3436
- this.numberOfRows = 1;
3437
- break
3438
- // 5x2
3439
- case 7:
3440
- this.framesPerRow = 5;
3441
- this.numberOfRows = 2;
3442
- break
3443
- // 6x1
3444
- case 8:
3445
- this.framesPerRow = 6;
3446
- this.numberOfRows = 1;
3447
- break
3448
- // 6x2
3449
- case 9:
3450
- this.framesPerRow = 6;
3451
- this.numberOfRows = 2;
3452
- break
3453
- }
3454
- await this.fInterface.changeSize(this.numberOfRows, this.framesPerRow);
3455
- this.getFramesArray();
3456
- setTimeout(() => {
3457
- for (let ref of this.$refs.frames) {
3458
- ref?.resize(this.lastHeight);
3459
- }
3460
- }, 150);
3461
- },
3462
- getFramesArray() {
3463
- this.frames = this.fInterface.getFrames(Positions.current);
3464
- this.nextFrames = this.fInterface.getFrames(Positions.next);
3465
- this.previousFrames = this.fInterface.getFrames(Positions.previous);
3466
- },
3467
- async createFramesInterface() {
3468
- this.frames = this.loadingArray;
3469
- let ch = this.channel;
3470
- let associationTMP = {
3471
- 1735073: 1,
3472
- 1735074: 139,
3473
- 1735075: 3,
3474
- 1735076: 132,
3475
- };
3476
- //
3477
- this.channelCode = associationTMP[ch] ? associationTMP[ch] : ch;
3478
-
3479
- const t = this.startAudienceTime.match(/.{1,2}/g);
3480
- const d = this.getDateParts();
3481
- const time = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000;
3482
- // * iniciar slider
3483
- this.blockStartTime = time;
3484
- this.fInterface = await new FramesInterface(
3485
- this.channelCode,
3486
- this.numberOfRows,
3487
- this.framesPerRow,
3488
- time,
3489
- this.startAudienceTime,
3490
- this.useCache
3491
- );
3492
- await this.fInterface.init();
3493
-
3494
- this.getFramesArray();
3495
-
3496
- this.activeFrame = this.getIndex(1, 0, Positions.current);
3497
-
3498
- this.activeVideo = null;
3499
- },
3500
- getIndex(rowNumber, frameIndex, position) {
3501
- let from = this.framesPerRow * this.numberOfRows * position;
3502
- let till = this.framesPerRow * this.numberOfRows * (position + 1);
3503
-
3504
- return (from + till * (rowNumber - 1)) / rowNumber + frameIndex
3505
- },
3506
- getAudienceTime(frameTime, rowNumber, frameNumber, position) {
3507
- if (!frameTime) {
3508
- return 'Loading...'
3509
- } else if (
3510
- this.getIndex(rowNumber, frameNumber, position) === this.activeVideo
3511
- ) {
3512
- return this.convertToAudienceTime(this.videoTime)
3513
- } else {
3514
- return this.convertToAudienceTime(frameTime)
3515
- }
3516
- },
3517
- dateInUtc(miliSeconds) {
3518
- var date = new Date(miliSeconds);
3519
- var utc = new Date(
3520
- date.getUTCFullYear(),
3521
- date.getUTCMonth(),
3522
- date.getUTCDate(),
3523
- date.getUTCHours(),
3524
- date.getUTCMinutes(),
3525
- date.getUTCSeconds()
3526
- );
3527
- return utc
3528
- },
3529
- convertToAudienceTime(time, separator = ':') {
3530
- const d = this.getDateParts();
3531
- const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000;
3532
-
3533
- let hour = this.dateInUtc(time * 1000)
3534
- .toTimeString()
3535
- .split(' ')[0]
3536
- .split(':')
3537
- .map(Number);
3538
-
3539
- if (time > limit && time <= limit + this.startAudienceSeconds) {
3540
- hour[0] = 24 + hour[0];
3541
- }
3542
- return hour
3543
- .map((part) => (part > 9 ? part.toString() : '0' + part))
3544
- .join(separator)
3545
- },
3546
- getDateParts(date = this.date) {
3547
- const d = new Date(date);
3548
- return {
3549
- year: d.getFullYear(),
3550
- month: d.getMonth(),
3551
- day: d.getDate(),
3552
- }
3553
- },
3554
- selectFrame(index, frame) {
3555
- const d = this.getDateParts();
3556
- const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000;
3557
- const frameTime = frame?.time;
3558
-
3559
- if (frameTime - (this.startAudienceSeconds + limit) <= 0) {
3560
- if (this.hourIniSelected === true) {
3561
- this.hourIniSelected = frameTime;
3562
-
3563
- if (
3564
- this.hourEndSelected &&
3565
- this.hourIniSelected > this.hourEndSelected
3566
- ) {
3567
- this.hourEndSelected = false;
3568
- }
3569
- } else if (this.hourEndSelected === true) {
3570
- if (frameTime > this.hourIniSelected) {
3571
- this.hourEndSelected = frameTime;
3572
- this.canInsertTime = true;
3573
- } else {
3574
- this.hourEndSelected = false;
3575
- }
3576
- }
3577
- }
3578
-
3579
- if (this.activeFrame !== index) {
3580
- // ? Se clicar no frame diferente de onde está a dar play, faz pausa
3581
- const array = this.$refs.frames.filter(
3582
- (fc) => fc.videoStatus === fc.Status.playing
3583
- );
3584
- if (array.length === 1) {
3585
- const frame = array[0];
3586
- frame.playOrPause();
3587
- }
3588
- this.activeVideo = null;
3589
- this.activeFrame = index;
3590
- }
3591
- },
3592
- setHourIni() {
3593
- this.canInsertTime = true;
3594
- this.hourIniSelected = true;
3595
- document.getElementById(`frame-${this.activeFrame}`).click();
3596
- this.$emit('setHourIni', {
3597
- hour_ini: this.hourIniSelected
3598
- ? this.convertToAudienceTime(this.hourIniSelected, '')
3599
- : null,
3600
- });
3601
- },
3602
- setHourEnd() {
3603
- this.canInsertTime = true;
3604
- this.hourEndSelected = true;
3605
- document.getElementById(`frame-${this.activeFrame}`).click();
3606
- },
3607
- //* Navegação
3608
- arrowRight() {
3609
- if (this.checkLimitRight(false)) {
3610
- if (
3611
- this.activeFrame ===
3612
- this.numberOfRows * this.framesPerRow * 2 - 1
3613
- ) {
3614
- this.next();
3615
- } else {
3616
- this.activeFrame++;
3617
- }
3618
- }
3619
- },
3620
- arrowLeft() {
3621
- if (this.checkLimitLeft(false)) {
3622
- if (this.activeFrame === this.numberOfRows * this.framesPerRow) {
3623
- this.prev();
3624
- } else {
3625
- this.activeFrame--;
3626
- }
3627
- }
3628
- },
3629
- checkLimitRight(value) {
3630
- this.endAudienceTime.match(/.{1,2}/g);
3631
- const d = this.getDateParts();
3632
- const high = Date.UTC(d.year, d.month, d.day, 26, 29, 59);
3633
-
3634
- if (value) {
3635
- return (
3636
- high > (this.fInterface.getCurrentTime() - 1) * 1000 &&
3637
- this.nextFrames[0].title !== -1
3638
- )
3639
- } else {
3640
- // return high > (this.fInterface.getCurrentTime() + this.activeFrame) * 1000
3641
- return high > this.fInterface.getCurrentTime() * 1000
3642
- }
3643
- },
3644
- checkLimitLeft(value) {
3645
- const hours = this.startAudienceTime.match(/.{1,2}/g);
3646
- const d = this.getDateParts();
3647
- const low = Date.UTC(d.year, d.month, d.day, hours[0], hours[1], hours[2]);
3648
-
3649
- if (value) {
3650
- return low <= (this.fInterface.getCurrentTime() - 1) * 1000
3651
- } else {
3652
- return (
3653
- low <
3654
- (this.fInterface.getCurrentTime() +
3655
- this.activeFrame -
3656
- this.numberOfRows * this.framesPerRow) *
3657
- 1000
3658
- )
3659
- }
3660
- },
3661
- async next() {
3662
- if (this.checkLimitRight(true)) {
3663
- const array = this.$refs.frames.filter(
3664
- (fc) =>
3665
- fc.videoStatus === fc.Status.playing ||
3666
- fc.videoStatus === fc.Status.paused
3667
- );
3668
-
3669
- if (array.length === 1) {
3670
- const frame = array[0];
3671
- frame.stop(false);
3672
- }
3673
- this.fInterface.setCurrentStep(this.secondsPerFrame);
3674
- await this.fInterface.loadNextFrames();
3675
-
3676
- this.activeFrame = this.getIndex(1, 0, Positions.current);
3677
- this.activeVideo = null;
3678
-
3679
- this.getFramesArray();
3680
- }
3681
- },
3682
- async prev() {
3683
- if (this.checkLimitLeft(true)) {
3684
- const array = this.$refs.frames.filter(
3685
- (fc) =>
3686
- fc.videoStatus === fc.Status.playing ||
3687
- fc.videoStatus === fc.Status.paused
3688
- );
3689
- if (array.length === 1) {
3690
- const frame = array[0];
3691
- frame.stop(false);
3692
- }
3693
-
3694
- this.fInterface.setCurrentStep(this.secondsPerFrame);
3695
- await this.fInterface.loadPrevFrames();
3696
-
3697
- this.activeFrame = this.getIndex(
3698
- this.numberOfRows,
3699
- this.framesPerRow - 1,
3700
- Positions.current
3701
- );
3702
- this.activeVideo = null;
3703
-
3704
- this.getFramesArray();
3705
- }
3706
- },
3707
- async setStartTime(time) {
3708
- if (time.indexOf(':') !== -1) {
3709
- time = time.replace(/:/g, '');
3710
- }
3711
- const t = time.match(/.{1,2}/g);
3712
- const d = this.getDateParts();
3713
- const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000;
3714
- this.frames = this.loadingArray;
3715
-
3716
- await this.fInterface.changeTime(setTime);
3717
-
3718
- this.getFramesArray();
3719
-
3720
- this.activeFrame = this.getIndex(1, 0, Positions.current);
3721
- // let frames = this.$refs.frames
3722
-
3723
- // let audienceTime = null
3724
- // if (frames.length > 0) {
3725
- // let frame = frames[0].frame
3726
- // audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)
3727
- // }
3728
-
3729
- this.activeVideo = null;
3730
-
3731
- return true
3732
- },
3733
- hourToTimeStamp(time) {
3734
- if (time.indexOf(':') !== -1) {
3735
- time = time.replace(/:/g, '');
3736
- }
3737
- const t = time.match(/.{1,2}/g);
3738
- const d = this.getDateParts();
3739
- const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000;
3740
-
3741
- return setTime
3742
- },
3743
- async changeHour(value) {
3744
- if (value) {
3745
- setTimeout(() => {
3746
- const array = this.$refs.frames.filter(
3747
- (fc) =>
3748
- fc.videoStatus === fc.Status.playing ||
3749
- fc.videoStatus === fc.Status.paused
3750
- );
3751
-
3752
- if (array.length === 1) {
3753
- const frame = array[0];
3754
- frame.stop(false);
3755
- }
3756
-
3757
- this.setStartTime(value, true);
3758
- }, 0);
3759
- }
3760
- },
3761
- changeBlockInterval(value) {
3762
- this.changeHour(value.ini);
3763
- let time_ini, time_end;
3764
- time_ini = this.hourToTimeStamp(value.ini);
3765
- time_end = this.hourToTimeStamp(value.end);
3766
- this.videoSliderTotalDuration = time_end - time_ini;
3767
- this.$refs.frames[0].changeSettings(time_ini);
3768
- this.blockStartTime = time_ini;
3769
- },
3770
- //eslint-disable-next-line
3771
- async updateVideoTime(index, videoTime) {
3772
- this.activeVideo = index;
3773
- this.videoTime = videoTime;
3774
- },
3775
- //eslint-disable-next-line
3776
- updateVideoStatus(currentTime) {
3777
- if (!this.progressVideoDrag) ;
3778
- },
3779
- async startPlaying(frame, totalTime) {
3780
- const array = this.$refs.frames.filter(
3781
- (fc) => fc.frame.time !== frame.time
3782
- );
3783
-
3784
- for (let ref of array) {
3785
- if (
3786
- ref.videoStatus === ref.Status.playing ||
3787
- ref.videoStatus === ref.Status.paused
3788
- ) {
3789
- ref.stop(false);
3790
- }
3791
- }
3792
-
3793
- this.videoTotalTime = totalTime;
3794
- this.videoPlaying = true;
3795
- },
3796
- stopPlaying() {
3797
- this.videoTotalTime = null;
3798
- this.videoPlaying = false;
3799
- this.paused = false;
3800
- },
3801
- insertTime() {
3802
- this.$emit('timeToInsert', {
3803
- channel: this.channel,
3804
- hour_ini: this.hourIniSelected
3805
- ? this.convertToAudienceTime(this.hourIniSelected, '')
3806
- : null,
3807
- hour_end: this.hourEndSelected
3808
- ? this.convertToAudienceTime(this.hourEndSelected, '')
3809
- : null,
3810
- force: false,
3811
- });
3812
-
3813
- if (this.jumpOnInsert) {
3814
- this.changeHour(
3815
- this.convertToAudienceTime(
3816
- (this.hourEndSelected || this.hourIniSelected) + 1
3817
- )
3818
- );
3819
- }
3820
-
3821
- this.hourIniSelected = null;
3822
- this.hourEndSelected = null;
3823
- this.canInsertTime = false;
3824
-
3825
- // this.fInterface.setCurrentPosition(this.hourEndSelected)
3826
- },
3827
- insertTimeForce() {
3828
- this.$emit('timeToInsert', {
3829
- channel: this.channel,
3830
- hour_ini: this.hourIniSelected
3831
- ? this.convertToAudienceTime(this.hourIniSelected, '')
3832
- : null,
3833
- hour_end: this.hourEndSelected
3834
- ? this.convertToAudienceTime(this.hourEndSelected, '')
3835
- : null,
3836
- force: true,
3837
- });
3838
-
3839
- this.hourIniSelected = null;
3840
- this.hourEndSelected = null;
3841
- this.canInsertTime = false;
3842
-
3843
- // this.fInterface.setCurrentPosition(this.hourEndSelected)
3844
- },
3845
- async getChannelMedia() {
3846
- // this.media = (await ChannelService.show(this.channel)).data.MEDIA
3847
- },
3848
- async changeServerClick() {
3849
- this.changeServer = !this.changeServer;
3850
- // this.$store.dispatch(
3851
- // 'serverOfFrames',
3852
- // this.changeServer ? 'alternative' : 'default'
3853
- // )
3854
- sessionStorage.setItem(
3855
- 'serverOfFrames',
3856
- this.changeServer ? 'alternative' : 'default'
3857
- );
3858
-
3859
- // if (this.$route.params.time != this.frames[0].time)
3860
- // this.$router.push({
3861
- // name: 'grid',
3862
- // params: {
3863
- // date: this.date,
3864
- // channel: this.channelCode,
3865
- // time: this.frames[0].time,
3866
- // },
3867
- // })
3868
- location.reload();
3869
- },
3870
- },
3871
- computed: {
3872
- active: {
3873
- get() {
3874
- return this.value
3875
- },
3876
- set(value) {
3877
- this.$emit('input', value);
3878
- },
3879
- },
3880
- settingsClosed() {
3881
- return !Object.values(this.dialogs).find((v) => v)
3882
- },
3883
- startAudienceSeconds() {
3884
- const t = this.startAudienceTime.match(/.{1,2}/g);
3885
- return parseInt(t[0] * 3600 + t[1] * 60 + t[2])
3886
- },
3887
- loadingArray() {
3888
- return Array.from(Array(this.numberOfRows * this.framesPerRow).keys())
3889
- },
3890
- serverOfFrames() {
3891
- return sessionStorage.getItem('server')
3892
- },
3893
- },
3894
- watch: {
3895
- framesFormat(value) {
3896
- this.setFrameSelection(value);
3897
- },
3898
- active() {
3899
- // ? sempre que trocamos de tabs dar reset as horas selected
3900
- this.hourIniSelected = false;
3901
- this.hourEndSelected = false;
3902
- },
3903
- useCache() {
3904
- this.createFramesInterface();
3905
- },
3906
- hourIniSelected(value) {
3907
- if (value) {
3908
- sessionStorage.setItem(
3909
- 'currentTimeFrames',
3910
- this.convertToAudienceTime(this.hourIniSelected, '')
3911
- );
3912
- } else {
3913
- sessionStorage.removeItem('currentTimeFrames');
3914
- }
3915
- },
3916
- activeFrame(value) {
3917
- if (value) {
3918
- this.stopPlayingBar();
3919
- }
3920
- },
3921
- channel() {
3922
- this.updatingChannel = new Promise((resolve, reject) => {
3923
- try {
3924
- this.createFramesInterface();
3925
- resolve(true);
3926
- } catch (err) {
3927
- reject(err);
3928
- }
3929
- });
3930
- },
3931
- },
3056
+
3057
+ const Positions = Object.freeze({
3058
+ previous: 0,
3059
+ current: 1,
3060
+ next: 2,
3061
+ });
3062
+
3063
+ var script = {
3064
+ name: 'visualization-container',
3065
+ props: {
3066
+ value: {
3067
+ type: Boolean,
3068
+ required: true,
3069
+ },
3070
+ date: {
3071
+ type: String,
3072
+ required: true,
3073
+ },
3074
+ channel: {
3075
+ type: Number,
3076
+ required: true,
3077
+ },
3078
+ startAudienceTime: {
3079
+ type: String,
3080
+ required: true,
3081
+ },
3082
+ endAudienceTime: {
3083
+ type: String,
3084
+ required: true,
3085
+ },
3086
+ videoProgressBar: {
3087
+ type: Boolean,
3088
+ default: false,
3089
+ },
3090
+ jumpOnInsert: {
3091
+ type: Boolean,
3092
+ default: false,
3093
+ },
3094
+ framesFormat: {
3095
+ type: [Number, String],
3096
+ default: 6,
3097
+ },
3098
+ maxSize: {
3099
+ type: Number,
3100
+ },
3101
+ },
3102
+ components: {
3103
+ Frame: __vue_component__$5,
3104
+ CommandBar: __vue_component__$4,
3105
+ InfoBar: __vue_component__$3,
3106
+ VideoProgress: __vue_component__$2,
3107
+ Settings: __vue_component__$1,
3108
+ // Help,
3109
+ },
3110
+ data() {
3111
+ return {
3112
+ Positions,
3113
+ updatingChannel: null,
3114
+ dialog: false,
3115
+ timeLastBlock: null,
3116
+ alternativeServer: false,
3117
+ useCache: true,
3118
+ numberOfRows: 1,
3119
+ framesPerRow: 5,
3120
+ secondsPerFrame: 1,
3121
+ fInterface: null,
3122
+ velocity: 1,
3123
+ frames: [],
3124
+ previousFrames: [],
3125
+ nextFrames: [],
3126
+ channelCode: 0,
3127
+ videoPlaying: false,
3128
+ activeFrame: null,
3129
+ activeVideo: null,
3130
+ videoTime: 0,
3131
+ videoTotalTime: null,
3132
+ progressVideoDrag: false,
3133
+ hourIniSelected: false,
3134
+ hourEndSelected: false,
3135
+ canInsertTime: false,
3136
+ lastHeight: 0,
3137
+ loopInterval: null,
3138
+ nextLoop: false,
3139
+ prevLoop: false,
3140
+ videoSliderTotalDuration: 900,
3141
+ blockStartTime: null,
3142
+ media: null,
3143
+ changeServer: false,
3144
+ userMultiTabsGrid: false,
3145
+ userMultiTabsGridsModel: true,
3146
+ playbackRate: 1,
3147
+ paused: false,
3148
+ commandBarShow: true,
3149
+ dialogs: {
3150
+ playbackRate: false,
3151
+ goTo: false,
3152
+ secondsPerFrame: false,
3153
+ frames: false,
3154
+ },
3155
+ }
3156
+ },
3157
+ async created() {
3158
+ this.changeServer = this.serverOfFrames === 'alternative';
3159
+ this.alternativeServer = this.serverOfFrames === 'alternative';
3160
+
3161
+ const settings = [
3162
+ {
3163
+ framesPerRow: 2,
3164
+ numberOfRows: 1,
3165
+ },
3166
+ {
3167
+ framesPerRow: 3,
3168
+ numberOfRows: 1,
3169
+ },
3170
+ {
3171
+ framesPerRow: 3,
3172
+ numberOfRows: 2,
3173
+ },
3174
+ {
3175
+ framesPerRow: 4,
3176
+ numberOfRows: 1,
3177
+ },
3178
+ {
3179
+ framesPerRow: 4,
3180
+ numberOfRows: 2,
3181
+ },
3182
+ {
3183
+ framesPerRow: 5,
3184
+ numberOfRows: 1,
3185
+ },
3186
+ {
3187
+ framesPerRow: 5,
3188
+ numberOfRows: 2,
3189
+ },
3190
+ {
3191
+ framesPerRow: 6,
3192
+ numberOfRows: 1,
3193
+ },
3194
+ {
3195
+ framesPerRow: 6,
3196
+ numberOfRows: 2,
3197
+ },
3198
+ ];
3199
+
3200
+ const storedOnDb = settings[parseInt(this.framesFormat) - 1];
3201
+ this.framesPerRow = storedOnDb.framesPerRow;
3202
+ this.numberOfRows = storedOnDb.numberOfRows;
3203
+
3204
+ await this.createFramesInterface();
3205
+ if (this.maxSize) {
3206
+ this.resize(this.maxSize, true);
3207
+ }
3208
+ },
3209
+ methods: {
3210
+ framesClicked(e) {
3211
+ if (e.target.id != 'insert') {
3212
+ this.active = true;
3213
+ }
3214
+ },
3215
+ async goToStartBlock() {
3216
+ try {
3217
+ const d = new Date();
3218
+ let timestamp = Date.UTC(
3219
+ d.getFullYear(),
3220
+ d.getMonth(),
3221
+ d.getDate(),
3222
+ d.getHours(),
3223
+ d.getMinutes(),
3224
+ d.getSeconds()
3225
+ );
3226
+
3227
+ const response = (
3228
+ await FramesService.getNextAvailableBlock({
3229
+ channel: this.channel,
3230
+ time: timestamp / 1000,
3231
+ })
3232
+ ).data;
3233
+
3234
+ this.dialog = false;
3235
+ this.changeHour(this.convertToAudienceTime(response.data.start, ':'));
3236
+ } catch (err) {
3237
+ console.error(err);
3238
+ }
3239
+ },
3240
+ async checkAvailableBlock() {
3241
+ try {
3242
+ const d = new Date();
3243
+ let timestamp = Date.UTC(
3244
+ d.getFullYear(),
3245
+ d.getMonth(),
3246
+ d.getDate(),
3247
+ d.getHours(),
3248
+ d.getMinutes(),
3249
+ d.getSeconds()
3250
+ );
3251
+
3252
+ const response = (
3253
+ await FramesService.getNextAvailableBlock({
3254
+ channel: this.channel,
3255
+ time: timestamp / 1000,
3256
+ })
3257
+ ).data;
3258
+
3259
+ this.timeLastBlock = this.convertToAudienceTime(response.data.end, ':');
3260
+ this.dialog = true;
3261
+ if (!response.status) {
3262
+ this.timeLastBlock = 'N/D';
3263
+ }
3264
+ } catch (err) {
3265
+ console.error(err);
3266
+ }
3267
+ },
3268
+ updateSlider(videoStartTime, time) {
3269
+ // * atualizar slider se estiver fora do range definido previamente
3270
+ if (
3271
+ time < this.blockStartTime ||
3272
+ time > this.blockStartTime ||
3273
+ videoStartTime > this.blockStartTime + this.videoSliderTotalDuration
3274
+ ) {
3275
+ this.blockStartTime = videoStartTime;
3276
+ this.videoSliderTotalDuration = 900;
3277
+ }
3278
+ },
3279
+ nextLoopActivate() {
3280
+ this.breakLoop();
3281
+ this.loopInterval = setInterval(this.next, 40);
3282
+ setTimeout(() => {
3283
+ this.nextLoop = true;
3284
+ }, 0);
3285
+ },
3286
+ prevLoopActivate() {
3287
+ this.breakLoop();
3288
+ this.loopInterval = setInterval(this.prev, 40);
3289
+ setTimeout(() => {
3290
+ this.prevLoop = true;
3291
+ }, 0);
3292
+ },
3293
+ breakLoop() {
3294
+ clearInterval(this.loopInterval);
3295
+ this.loopInterval = null;
3296
+ this.nextLoop = false;
3297
+ this.prevLoop = false;
3298
+ },
3299
+ changePlayPause(status) {
3300
+ this.paused = !status;
3301
+ },
3302
+ resize(height = this.lastHeight) {
3303
+ this.lastHeight = height;
3304
+ if (this.$refs.frames) {
3305
+ for (let frame of this.$refs.frames) {
3306
+ frame.resize(height);
3307
+ }
3308
+ }
3309
+ this.$emit('resized');
3310
+ },
3311
+ async goToFirstFrame() {
3312
+ let frames = this.$refs.frames;
3313
+
3314
+ let audienceTime = null;
3315
+ if (frames.length > 0) {
3316
+ let frame = frames[0].frame;
3317
+ audienceTime = this.getAudienceTime(frame.time, 0, 0, 0);
3318
+ }
3319
+ // if (audienceTime) {
3320
+ // this.changeHour(this.getLastFirtsBlockTime(audienceTime, true))
3321
+ // }
3322
+ if (audienceTime) {
3323
+ const [hours, minutes, seconds] = audienceTime.split(':');
3324
+ const totalSeconds =
3325
+ parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseInt(seconds);
3326
+ if (totalSeconds >= 9000)
3327
+ this.changeHour(this.getLastFirtsBlockTime(audienceTime, true));
3328
+ else this.changeHour(this.getLastFirtsBlockTime('02:30:00', true));
3329
+ }
3330
+ },
3331
+ async goToLastFrame() {
3332
+ let frames = this.$refs.frames;
3333
+ let audienceTime = null;
3334
+ if (frames.length > 0) {
3335
+ let frame = frames[0].frame;
3336
+
3337
+ audienceTime = this.getAudienceTime(frame.time, 0, 0, 0);
3338
+ }
3339
+ if (audienceTime) {
3340
+ this.changeHour(this.getLastFirtsBlockTime(audienceTime));
3341
+ }
3342
+ },
3343
+ getLastFirtsBlockTime(time, first = false) {
3344
+ if (time.indexOf(':') !== -1) {
3345
+ time = time.replace(/:/g, '');
3346
+ }
3347
+ let h, m, newTime;
3348
+ const t = time.match(/.{1,2}/g);
3349
+ if (t[0] && t[1]) {
3350
+ h = parseInt(t[0]);
3351
+ m = parseInt(t[1]);
3352
+ }
3353
+ if (h < 26) {
3354
+ if (m < 15)
3355
+ if (first) newTime = t[0] + ':00:00';
3356
+ else newTime = t[0] + ':14:59';
3357
+ else if (m < 30)
3358
+ if (first) newTime = t[0] + ':15:00';
3359
+ else newTime = t[0] + ':29:59';
3360
+ else if (m < 45)
3361
+ if (first) newTime = t[0] + ':30:00';
3362
+ else newTime = t[0] + ':44:59';
3363
+ else if (first) newTime = t[0] + ':45:00';
3364
+ else newTime = t[0] + ':59:59';
3365
+ } else {
3366
+ if (m < 15)
3367
+ if (first) newTime = '26:00:00';
3368
+ else newTime = '26:14:59';
3369
+ else {
3370
+ if (first) newTime = '26:15:00';
3371
+ else newTime = '26:29:59';
3372
+ }
3373
+ }
3374
+ return newTime
3375
+ },
3376
+ openBlocks() {
3377
+ this.$refs.settings2?.openBlocks();
3378
+ },
3379
+ playOrPause() {
3380
+ const array = this.$refs.frames.filter((fc) => !!fc.active);
3381
+ if (array.length === 1) {
3382
+ const frame = array[0];
3383
+ frame.playOrPause(this.playbackRate);
3384
+ }
3385
+ },
3386
+ stopPlayingBar() {
3387
+ for (let ref of this.$refs.frames) {
3388
+ if (
3389
+ ref.videoStatus === ref.Status.playing ||
3390
+ ref.videoStatus === ref.Status.paused
3391
+ ) {
3392
+ ref.stop(false);
3393
+ }
3394
+ }
3395
+ },
3396
+ async setFrameSelection(selected) {
3397
+ this.frames = this.loadingArray;
3398
+ switch (parseInt(selected)) {
3399
+ // 2x1
3400
+ case 1:
3401
+ this.framesPerRow = 2;
3402
+ this.numberOfRows = 1;
3403
+ break
3404
+ // 3x1
3405
+ case 2:
3406
+ this.framesPerRow = 3;
3407
+ this.numberOfRows = 1;
3408
+ break
3409
+ // 3x2
3410
+ case 3:
3411
+ this.framesPerRow = 3;
3412
+ this.numberOfRows = 2;
3413
+ break
3414
+ // 4x1
3415
+ case 4:
3416
+ this.framesPerRow = 4;
3417
+ this.numberOfRows = 1;
3418
+ break
3419
+ // 4x2
3420
+ case 5:
3421
+ this.framesPerRow = 4;
3422
+ this.numberOfRows = 2;
3423
+ break
3424
+ // 5x1
3425
+ case 6:
3426
+ this.framesPerRow = 5;
3427
+ this.numberOfRows = 1;
3428
+ break
3429
+ // 5x2
3430
+ case 7:
3431
+ this.framesPerRow = 5;
3432
+ this.numberOfRows = 2;
3433
+ break
3434
+ // 6x1
3435
+ case 8:
3436
+ this.framesPerRow = 6;
3437
+ this.numberOfRows = 1;
3438
+ break
3439
+ // 6x2
3440
+ case 9:
3441
+ this.framesPerRow = 6;
3442
+ this.numberOfRows = 2;
3443
+ break
3444
+ }
3445
+ await this.fInterface.changeSize(this.numberOfRows, this.framesPerRow);
3446
+ this.getFramesArray();
3447
+ setTimeout(() => {
3448
+ for (let ref of this.$refs.frames) {
3449
+ ref?.resize(this.lastHeight);
3450
+ }
3451
+ }, 150);
3452
+ },
3453
+ getFramesArray() {
3454
+ this.frames = this.fInterface.getFrames(Positions.current);
3455
+ this.nextFrames = this.fInterface.getFrames(Positions.next);
3456
+ this.previousFrames = this.fInterface.getFrames(Positions.previous);
3457
+ },
3458
+ async createFramesInterface() {
3459
+ this.frames = this.loadingArray;
3460
+ let ch = this.channel;
3461
+ let associationTMP = {
3462
+ 1735073: 1,
3463
+ 1735074: 139,
3464
+ 1735075: 3,
3465
+ 1735076: 132,
3466
+ };
3467
+ //
3468
+ this.channelCode = associationTMP[ch] ? associationTMP[ch] : ch;
3469
+
3470
+ const t = this.startAudienceTime.match(/.{1,2}/g);
3471
+ const d = this.getDateParts();
3472
+ const time = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000;
3473
+ // * iniciar slider
3474
+ this.blockStartTime = time;
3475
+ this.fInterface = await new FramesInterface(
3476
+ this.channelCode,
3477
+ this.numberOfRows,
3478
+ this.framesPerRow,
3479
+ time,
3480
+ this.startAudienceTime,
3481
+ this.useCache
3482
+ );
3483
+ await this.fInterface.init();
3484
+
3485
+ this.getFramesArray();
3486
+
3487
+ this.activeFrame = this.getIndex(1, 0, Positions.current);
3488
+
3489
+ this.activeVideo = null;
3490
+ },
3491
+ getIndex(rowNumber, frameIndex, position) {
3492
+ let from = this.framesPerRow * this.numberOfRows * position;
3493
+ let till = this.framesPerRow * this.numberOfRows * (position + 1);
3494
+
3495
+ return (from + till * (rowNumber - 1)) / rowNumber + frameIndex
3496
+ },
3497
+ getAudienceTime(frameTime, rowNumber, frameNumber, position) {
3498
+ if (!frameTime) {
3499
+ return 'Loading...'
3500
+ } else if (
3501
+ this.getIndex(rowNumber, frameNumber, position) === this.activeVideo
3502
+ ) {
3503
+ return this.convertToAudienceTime(this.videoTime)
3504
+ } else {
3505
+ return this.convertToAudienceTime(frameTime)
3506
+ }
3507
+ },
3508
+ dateInUtc(miliSeconds) {
3509
+ var date = new Date(miliSeconds);
3510
+ var utc = new Date(
3511
+ date.getUTCFullYear(),
3512
+ date.getUTCMonth(),
3513
+ date.getUTCDate(),
3514
+ date.getUTCHours(),
3515
+ date.getUTCMinutes(),
3516
+ date.getUTCSeconds()
3517
+ );
3518
+ return utc
3519
+ },
3520
+ convertToAudienceTime(time, separator = ':') {
3521
+ const d = this.getDateParts();
3522
+ const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000;
3523
+
3524
+ let hour = this.dateInUtc(time * 1000)
3525
+ .toTimeString()
3526
+ .split(' ')[0]
3527
+ .split(':')
3528
+ .map(Number);
3529
+
3530
+ if (time > limit && time <= limit + this.startAudienceSeconds) {
3531
+ hour[0] = 24 + hour[0];
3532
+ }
3533
+ return hour
3534
+ .map((part) => (part > 9 ? part.toString() : '0' + part))
3535
+ .join(separator)
3536
+ },
3537
+ getDateParts(date = this.date) {
3538
+ const d = new Date(date);
3539
+ return {
3540
+ year: d.getFullYear(),
3541
+ month: d.getMonth(),
3542
+ day: d.getDate(),
3543
+ }
3544
+ },
3545
+ selectFrame(index, frame) {
3546
+ const d = this.getDateParts();
3547
+ const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000;
3548
+ const frameTime = frame?.time;
3549
+
3550
+ if (frameTime - (this.startAudienceSeconds + limit) <= 0) {
3551
+ if (this.hourIniSelected === true) {
3552
+ this.hourIniSelected = frameTime;
3553
+
3554
+ if (
3555
+ this.hourEndSelected &&
3556
+ this.hourIniSelected > this.hourEndSelected
3557
+ ) {
3558
+ this.hourEndSelected = false;
3559
+ }
3560
+ } else if (this.hourEndSelected === true) {
3561
+ if (frameTime > this.hourIniSelected) {
3562
+ this.hourEndSelected = frameTime;
3563
+ this.canInsertTime = true;
3564
+ } else {
3565
+ this.hourEndSelected = false;
3566
+ }
3567
+ }
3568
+ }
3569
+
3570
+ if (this.activeFrame !== index) {
3571
+ // ? Se clicar no frame diferente de onde está a dar play, faz pausa
3572
+ const array = this.$refs.frames.filter(
3573
+ (fc) => fc.videoStatus === fc.Status.playing
3574
+ );
3575
+ if (array.length === 1) {
3576
+ const frame = array[0];
3577
+ frame.playOrPause();
3578
+ }
3579
+ this.activeVideo = null;
3580
+ this.activeFrame = index;
3581
+ }
3582
+ },
3583
+ setHourIni() {
3584
+ this.canInsertTime = true;
3585
+ this.hourIniSelected = true;
3586
+ document.getElementById(`frame-${this.activeFrame}`).click();
3587
+ this.$emit('setHourIni', {
3588
+ hour_ini: this.hourIniSelected
3589
+ ? this.convertToAudienceTime(this.hourIniSelected, '')
3590
+ : null,
3591
+ });
3592
+ },
3593
+ setHourEnd() {
3594
+ this.canInsertTime = true;
3595
+ this.hourEndSelected = true;
3596
+ document.getElementById(`frame-${this.activeFrame}`).click();
3597
+ },
3598
+ //* Navegação
3599
+ arrowRight() {
3600
+ if (this.checkLimitRight(false)) {
3601
+ if (
3602
+ this.activeFrame ===
3603
+ this.numberOfRows * this.framesPerRow * 2 - 1
3604
+ ) {
3605
+ this.next();
3606
+ } else {
3607
+ this.activeFrame++;
3608
+ }
3609
+ }
3610
+ },
3611
+ arrowLeft() {
3612
+ if (this.checkLimitLeft(false)) {
3613
+ if (this.activeFrame === this.numberOfRows * this.framesPerRow) {
3614
+ this.prev();
3615
+ } else {
3616
+ this.activeFrame--;
3617
+ }
3618
+ }
3619
+ },
3620
+ checkLimitRight(value) {
3621
+ this.endAudienceTime.match(/.{1,2}/g);
3622
+ const d = this.getDateParts();
3623
+ const high = Date.UTC(d.year, d.month, d.day, 26, 29, 59);
3624
+
3625
+ if (value) {
3626
+ return (
3627
+ high > (this.fInterface.getCurrentTime() - 1) * 1000 &&
3628
+ this.nextFrames[0].title !== -1
3629
+ )
3630
+ } else {
3631
+ // return high > (this.fInterface.getCurrentTime() + this.activeFrame) * 1000
3632
+ return high > this.fInterface.getCurrentTime() * 1000
3633
+ }
3634
+ },
3635
+ checkLimitLeft(value) {
3636
+ const hours = this.startAudienceTime.match(/.{1,2}/g);
3637
+ const d = this.getDateParts();
3638
+ const low = Date.UTC(d.year, d.month, d.day, hours[0], hours[1], hours[2]);
3639
+
3640
+ if (value) {
3641
+ return low <= (this.fInterface.getCurrentTime() - 1) * 1000
3642
+ } else {
3643
+ return (
3644
+ low <
3645
+ (this.fInterface.getCurrentTime() +
3646
+ this.activeFrame -
3647
+ this.numberOfRows * this.framesPerRow) *
3648
+ 1000
3649
+ )
3650
+ }
3651
+ },
3652
+ async next() {
3653
+ if (this.checkLimitRight(true)) {
3654
+ const array = this.$refs.frames.filter(
3655
+ (fc) =>
3656
+ fc.videoStatus === fc.Status.playing ||
3657
+ fc.videoStatus === fc.Status.paused
3658
+ );
3659
+
3660
+ if (array.length === 1) {
3661
+ const frame = array[0];
3662
+ frame.stop(false);
3663
+ }
3664
+ this.fInterface.setCurrentStep(this.secondsPerFrame);
3665
+ await this.fInterface.loadNextFrames();
3666
+
3667
+ this.activeFrame = this.getIndex(1, 0, Positions.current);
3668
+ this.activeVideo = null;
3669
+
3670
+ this.getFramesArray();
3671
+ }
3672
+ },
3673
+ async prev() {
3674
+ if (this.checkLimitLeft(true)) {
3675
+ const array = this.$refs.frames.filter(
3676
+ (fc) =>
3677
+ fc.videoStatus === fc.Status.playing ||
3678
+ fc.videoStatus === fc.Status.paused
3679
+ );
3680
+ if (array.length === 1) {
3681
+ const frame = array[0];
3682
+ frame.stop(false);
3683
+ }
3684
+
3685
+ this.fInterface.setCurrentStep(this.secondsPerFrame);
3686
+ await this.fInterface.loadPrevFrames();
3687
+
3688
+ this.activeFrame = this.getIndex(
3689
+ this.numberOfRows,
3690
+ this.framesPerRow - 1,
3691
+ Positions.current
3692
+ );
3693
+ this.activeVideo = null;
3694
+
3695
+ this.getFramesArray();
3696
+ }
3697
+ },
3698
+ async setStartTime(time) {
3699
+ if (time.indexOf(':') !== -1) {
3700
+ time = time.replace(/:/g, '');
3701
+ }
3702
+ const t = time.match(/.{1,2}/g);
3703
+ const d = this.getDateParts();
3704
+ const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000;
3705
+ this.frames = this.loadingArray;
3706
+
3707
+ await this.fInterface.changeTime(setTime);
3708
+
3709
+ this.getFramesArray();
3710
+
3711
+ this.activeFrame = this.getIndex(1, 0, Positions.current);
3712
+ // let frames = this.$refs.frames
3713
+
3714
+ // let audienceTime = null
3715
+ // if (frames.length > 0) {
3716
+ // let frame = frames[0].frame
3717
+ // audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)
3718
+ // }
3719
+
3720
+ this.activeVideo = null;
3721
+
3722
+ return true
3723
+ },
3724
+ hourToTimeStamp(time) {
3725
+ if (time.indexOf(':') !== -1) {
3726
+ time = time.replace(/:/g, '');
3727
+ }
3728
+ const t = time.match(/.{1,2}/g);
3729
+ const d = this.getDateParts();
3730
+ const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000;
3731
+
3732
+ return setTime
3733
+ },
3734
+ async changeHour(value) {
3735
+ if (value) {
3736
+ setTimeout(() => {
3737
+ const array = this.$refs.frames.filter(
3738
+ (fc) =>
3739
+ fc.videoStatus === fc.Status.playing ||
3740
+ fc.videoStatus === fc.Status.paused
3741
+ );
3742
+
3743
+ if (array.length === 1) {
3744
+ const frame = array[0];
3745
+ frame.stop(false);
3746
+ }
3747
+
3748
+ this.setStartTime(value, true);
3749
+ }, 0);
3750
+ }
3751
+ },
3752
+ changeBlockInterval(value) {
3753
+ this.changeHour(value.ini);
3754
+ let time_ini, time_end;
3755
+ time_ini = this.hourToTimeStamp(value.ini);
3756
+ time_end = this.hourToTimeStamp(value.end);
3757
+ this.videoSliderTotalDuration = time_end - time_ini;
3758
+ this.$refs.frames[0].changeSettings(time_ini);
3759
+ this.blockStartTime = time_ini;
3760
+ },
3761
+ //eslint-disable-next-line
3762
+ async updateVideoTime(index, videoTime) {
3763
+ this.activeVideo = index;
3764
+ this.videoTime = videoTime;
3765
+ },
3766
+ //eslint-disable-next-line
3767
+ updateVideoStatus(currentTime) {
3768
+ if (!this.progressVideoDrag) ;
3769
+ },
3770
+ async startPlaying(frame, totalTime) {
3771
+ const array = this.$refs.frames.filter(
3772
+ (fc) => fc.frame.time !== frame.time
3773
+ );
3774
+
3775
+ for (let ref of array) {
3776
+ if (
3777
+ ref.videoStatus === ref.Status.playing ||
3778
+ ref.videoStatus === ref.Status.paused
3779
+ ) {
3780
+ ref.stop(false);
3781
+ }
3782
+ }
3783
+
3784
+ this.videoTotalTime = totalTime;
3785
+ this.videoPlaying = true;
3786
+ },
3787
+ stopPlaying() {
3788
+ this.videoTotalTime = null;
3789
+ this.videoPlaying = false;
3790
+ this.paused = false;
3791
+ },
3792
+ insertTime() {
3793
+ this.$emit('timeToInsert', {
3794
+ channel: this.channel,
3795
+ hour_ini: this.hourIniSelected
3796
+ ? this.convertToAudienceTime(this.hourIniSelected, '')
3797
+ : null,
3798
+ hour_end: this.hourEndSelected
3799
+ ? this.convertToAudienceTime(this.hourEndSelected, '')
3800
+ : null,
3801
+ force: false,
3802
+ });
3803
+
3804
+ if (this.jumpOnInsert) {
3805
+ this.changeHour(
3806
+ this.convertToAudienceTime(
3807
+ (this.hourEndSelected || this.hourIniSelected) + 1
3808
+ )
3809
+ );
3810
+ }
3811
+
3812
+ this.hourIniSelected = null;
3813
+ this.hourEndSelected = null;
3814
+ this.canInsertTime = false;
3815
+
3816
+ // this.fInterface.setCurrentPosition(this.hourEndSelected)
3817
+ },
3818
+ insertTimeForce() {
3819
+ this.$emit('timeToInsert', {
3820
+ channel: this.channel,
3821
+ hour_ini: this.hourIniSelected
3822
+ ? this.convertToAudienceTime(this.hourIniSelected, '')
3823
+ : null,
3824
+ hour_end: this.hourEndSelected
3825
+ ? this.convertToAudienceTime(this.hourEndSelected, '')
3826
+ : null,
3827
+ force: true,
3828
+ });
3829
+
3830
+ this.hourIniSelected = null;
3831
+ this.hourEndSelected = null;
3832
+ this.canInsertTime = false;
3833
+
3834
+ // this.fInterface.setCurrentPosition(this.hourEndSelected)
3835
+ },
3836
+ async getChannelMedia() {
3837
+ // this.media = (await ChannelService.show(this.channel)).data.MEDIA
3838
+ },
3839
+ async changeServerClick() {
3840
+ this.changeServer = !this.changeServer;
3841
+ // this.$store.dispatch(
3842
+ // 'serverOfFrames',
3843
+ // this.changeServer ? 'alternative' : 'default'
3844
+ // )
3845
+ sessionStorage.setItem(
3846
+ 'serverOfFrames',
3847
+ this.changeServer ? 'alternative' : 'default'
3848
+ );
3849
+
3850
+ // if (this.$route.params.time != this.frames[0].time)
3851
+ // this.$router.push({
3852
+ // name: 'grid',
3853
+ // params: {
3854
+ // date: this.date,
3855
+ // channel: this.channelCode,
3856
+ // time: this.frames[0].time,
3857
+ // },
3858
+ // })
3859
+ location.reload();
3860
+ },
3861
+ },
3862
+ computed: {
3863
+ active: {
3864
+ get() {
3865
+ return this.value
3866
+ },
3867
+ set(value) {
3868
+ this.$emit('input', value);
3869
+ },
3870
+ },
3871
+ settingsClosed() {
3872
+ return !Object.values(this.dialogs).find((v) => v)
3873
+ },
3874
+ startAudienceSeconds() {
3875
+ const t = this.startAudienceTime.match(/.{1,2}/g);
3876
+ return parseInt(t[0] * 3600 + t[1] * 60 + t[2])
3877
+ },
3878
+ loadingArray() {
3879
+ return Array.from(Array(this.numberOfRows * this.framesPerRow).keys())
3880
+ },
3881
+ serverOfFrames() {
3882
+ return sessionStorage.getItem('server')
3883
+ },
3884
+ },
3885
+ watch: {
3886
+ secondsPerFrame(value) {
3887
+ let frames = this.$refs.frames;
3888
+ let initialTime = null;
3889
+ let audienceTime = null;
3890
+ if (frames.length > 0) {
3891
+ let frame = frames[0].frame;
3892
+
3893
+ if (initialTime === null) {
3894
+ initialTime = frame.time;
3895
+ }
3896
+ if (value <= 5) {
3897
+ let newAudienceTime = initialTime + value;
3898
+ audienceTime = this.getAudienceTime(newAudienceTime, 0, 0, 0);
3899
+ this.changeHour(audienceTime);
3900
+ this.next();
3901
+ }
3902
+ }
3903
+ },
3904
+ framesFormat(value) {
3905
+ this.setFrameSelection(value);
3906
+ },
3907
+ active() {
3908
+ // ? sempre que trocamos de tabs dar reset as horas selected
3909
+ this.hourIniSelected = false;
3910
+ this.hourEndSelected = false;
3911
+ },
3912
+ useCache() {
3913
+ this.createFramesInterface();
3914
+ },
3915
+ hourIniSelected(value) {
3916
+ if (value) {
3917
+ sessionStorage.setItem(
3918
+ 'currentTimeFrames',
3919
+ this.convertToAudienceTime(this.hourIniSelected, '')
3920
+ );
3921
+ } else {
3922
+ sessionStorage.removeItem('currentTimeFrames');
3923
+ }
3924
+ },
3925
+ activeFrame(value) {
3926
+ if (value) {
3927
+ this.stopPlayingBar();
3928
+ }
3929
+ },
3930
+ channel() {
3931
+ this.updatingChannel = new Promise((resolve, reject) => {
3932
+ try {
3933
+ this.createFramesInterface();
3934
+ resolve(true);
3935
+ } catch (err) {
3936
+ reject(err);
3937
+ }
3938
+ });
3939
+ },
3940
+ },
3932
3941
  };
3933
3942
 
3934
3943
  /* script */
@@ -4479,11 +4488,11 @@ __vue_render__._withStripped = true;
4479
4488
  /* style */
4480
4489
  const __vue_inject_styles__ = function (inject) {
4481
4490
  if (!inject) return
4482
- inject("data-v-4a1abe45_0", { source: "\n.visualization-row[data-v-4a1abe45] {\n display: flex;\n flex-wrap: wrap;\n flex: 1 1 auto;\n}\n.visualization-col[data-v-4a1abe45] {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n padding: 12px;\n}\n.visualization-divider[data-v-4a1abe45] {\n display: block;\n flex: 1 1 100%;\n height: 0px;\n max-height: 0px;\n opacity: 1;\n transition: inherit;\n border-style: solid;\n border-width: thin 0 0 0;\n border-color: rgba(0, 0, 0, 0.12);\n margin: 0;\n}\n.visualization-divider.vertical[data-v-4a1abe45] {\n align-self: stretch;\n border-width: 0 thin 0 0;\n display: inline-flex;\n height: inherit;\n margin-left: -1px;\n max-height: 100%;\n max-width: 0px;\n vertical-align: text-bottom;\n width: 0px;\n}\n.visualization-card[data-v-4a1abe45] {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n padding: 12px;\n width: 100%;\n transition-property: box-shadow, opacity, -webkit-box-shadow;\n overflow-wrap: break-word;\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\n}\n.visualization-justify-center[data-v-4a1abe45],[data-v-4a1abe45] .visualization-justify-center {\n justify-content: center;\n}\n.visualization-align-center[data-v-4a1abe45] {\n align-items: center;\n}\n#visualization-container[data-v-4a1abe45] {\n max-width: 100% !important;\n margin: 0 auto !important;\n height: 100%;\n border-bottom: none;\n}\n#visualization-container > .card[data-v-4a1abe45] {\n border-radius: 0 !important;\n font-size: 12px;\n width: 100%;\n box-shadow: none;\n height: 100%;\n}\n#command-bar[data-v-4a1abe45],\n#info-bar[data-v-4a1abe45] {\n background-color: #f5f5f5;\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n#command-bar button[data-v-4a1abe45] {\n width: 42px;\n height: 36px;\n border: none;\n background: none;\n}\n#command-bar button[data-v-4a1abe45]:hover {\n cursor: pointer;\n background: rgba(0, 0, 0, 0.12);\n}\n#command-bar svg[data-v-4a1abe45] {\n font-size: 16px;\n}\n#command-bar[data-v-4a1abe45] {\n padding: 0 !important;\n}\n#info-bar[data-v-4a1abe45] {\n padding: 4px;\n font-size: 14px;\n position: relative;\n}\n.settings-container[data-v-4a1abe45] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n}\n.settings-container > *[data-v-4a1abe45] {\n margin: 0 2px;\n cursor: pointer;\n}\n#info-bar svg[data-v-4a1abe45] {\n font-size: 16px;\n}\n#info-bar .divider[data-v-4a1abe45] {\n margin: 0 8px;\n}\nsvg[data-v-4a1abe45]:focus {\n border: none;\n}\n.visualization-card[data-v-4a1abe45] {\n border-left: 8px solid #eee;\n}\n.active-tab[data-v-4a1abe45] {\n border-left: 8px solid var(--visualization-primary) !important;\n border-image-slice: 1;\n}\n[id^='frame-'][data-v-4a1abe45] {\n padding: 1px;\n display: flex;\n flex-flow: column;\n}\n.tooltip[data-v-4a1abe45] {\n display: block !important;\n z-index: 10000;\n}\n.tooltip .tooltip-inner[data-v-4a1abe45] {\n background: var(--visualization-primary);\n color: white;\n border-radius: 16px;\n padding: 5px 10px 4px;\n}\n.tooltip .tooltip-arrow[data-v-4a1abe45] {\n width: 0;\n height: 0;\n border-style: solid;\n position: absolute;\n margin: 5px;\n border-color: var(--visualization-primary);\n z-index: 1;\n}\n.tooltip[x-placement^='top'][data-v-4a1abe45] {\n margin-bottom: 5px;\n}\n.tooltip[x-placement^='top'] .tooltip-arrow[data-v-4a1abe45] {\n border-width: 5px 5px 0 5px;\n border-left-color: transparent !important;\n border-right-color: transparent !important;\n border-bottom-color: transparent !important;\n bottom: -5px;\n left: calc(50% - 5px);\n margin-top: 0;\n margin-bottom: 0;\n}\n.tooltip[x-placement^='bottom'][data-v-4a1abe45] {\n margin-top: 5px;\n}\n.tooltip[x-placement^='bottom'] .tooltip-arrow[data-v-4a1abe45] {\n border-width: 0 5px 5px 5px;\n border-left-color: transparent !important;\n border-right-color: transparent !important;\n border-top-color: transparent !important;\n top: -5px;\n left: calc(50% - 5px);\n margin-top: 0;\n margin-bottom: 0;\n}\n.tooltip[x-placement^='right'][data-v-4a1abe45] {\n margin-left: 5px;\n}\n.tooltip[x-placement^='right'] .tooltip-arrow[data-v-4a1abe45] {\n border-width: 5px 5px 5px 0;\n border-left-color: transparent !important;\n border-top-color: transparent !important;\n border-bottom-color: transparent !important;\n left: -5px;\n top: calc(50% - 5px);\n margin-left: 0;\n margin-right: 0;\n}\n.tooltip[x-placement^='left'][data-v-4a1abe45] {\n margin-right: 5px;\n}\n.tooltip[x-placement^='left'] .tooltip-arrow[data-v-4a1abe45] {\n border-width: 5px 0 5px 5px;\n border-top-color: transparent !important;\n border-right-color: transparent !important;\n border-bottom-color: transparent !important;\n right: -5px;\n top: calc(50% - 5px);\n margin-left: 0;\n margin-right: 0;\n}\n.tooltip.popover .popover-inner[data-v-4a1abe45] {\n background: #f9f9f9;\n color: black;\n padding: 24px;\n border-radius: 5px;\n box-shadow: 0 5px 30px rgba(black, 0.1);\n}\n.tooltip.popover .popover-arrow[data-v-4a1abe45] {\n border-color: #f9f9f9;\n}\n.tooltip[aria-hidden='true'][data-v-4a1abe45] {\n visibility: hidden;\n opacity: 0;\n transition: opacity 0.15s, visibility 0.15s;\n}\n.tooltip[aria-hidden='false'][data-v-4a1abe45] {\n visibility: visible;\n opacity: 1;\n transition: opacity 0.15s;\n}\n", map: {"version":3,"sources":["C:\\workspace\\visualization\\src\\Visualization.vue"],"names":[],"mappings":";AAgnCA;EACA,aAAA;EACA,eAAA;EACA,cAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;AACA;AAEA;EACA,cAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;EACA,UAAA;EACA,mBAAA;EACA,mBAAA;EACA,wBAAA;EACA,iCAAA;EACA,SAAA;AACA;AAEA;EACA,mBAAA;EACA,wBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,cAAA;EACA,2BAAA;EACA,UAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;EACA,WAAA;EACA,4DAAA;EACA,yBAAA;EACA;qCACA;AACA;AAEA;EACA,uBAAA;AACA;AAEA;EACA,mBAAA;AACA;AAEA;EACA,0BAAA;EACA,yBAAA;EACA,YAAA;EACA,mBAAA;AACA;AACA;EACA,2BAAA;EACA,eAAA;EACA,WAAA;EACA,gBAAA;EACA,YAAA;AACA;AAEA;;EAEA,yBAAA;EACA;mCACA;AACA;AACA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;EACA,+BAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,eAAA;EACA,kBAAA;AACA;AAEA;EACA,kBAAA;EACA,WAAA;EACA,QAAA;EACA,2BAAA;AACA;AAEA;EACA,aAAA;EACA,eAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,aAAA;AACA;AAEA;EACA,YAAA;AACA;AAEA;EACA,2BAAA;AACA;AAEA;EACA,8DAAA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;AACA;AAEA;EACA,yBAAA;EACA,cAAA;AACA;AAEA;EACA,wCAAA;EACA,YAAA;EACA,mBAAA;EACA,qBAAA;AACA;AAEA;EACA,QAAA;EACA,SAAA;EACA,mBAAA;EACA,kBAAA;EACA,WAAA;EACA,0CAAA;EACA,UAAA;AACA;AAEA;EACA,kBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,2CAAA;EACA,YAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,wCAAA;EACA,SAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,gBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,wCAAA;EACA,2CAAA;EACA,UAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,iBAAA;AACA;AAEA;EACA,2BAAA;EACA,wCAAA;EACA,0CAAA;EACA,2CAAA;EACA,WAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,mBAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,uCAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,kBAAA;EACA,UAAA;EACA,2CAAA;AACA;AAEA;EACA,mBAAA;EACA,UAAA;EACA,yBAAA;AACA","file":"Visualization.vue","sourcesContent":["<template>\n <div\n class=\"visualization-row\"\n id=\"visualization-container\"\n @click=\"framesClicked\"\n >\n <GlobalEvents\n v-if=\"active && canInsertTime && settingsClosed\"\n @keydown.45=\"insertTime\"\n @keydown.46=\"insertTime\"\n />\n <GlobalEvents\n v-if=\"active && settingsClosed\"\n @keydown.left.prevent=\"arrowLeft\"\n @keydown.right.prevent=\"arrowRight\"\n @keydown.shift.page-down.prevent=\"nextLoopActivate\"\n @keydown.page-down.prevent=\"next\"\n @keydown.page-up.prevent=\"prev\"\n @keydown.shift.page-up.prevent=\"prevLoopActivate\"\n @keydown.83.prevent=\"setHourIni\"\n @keydown.69.prevent=\"setHourEnd\"\n @keydown.36.prevent=\"goToFirstFrame\"\n @keydown.35.prevent=\"goToLastFrame\"\n @keydown.71.prevent=\"dialogs.goTo = true\"\n @keydown.73.prevent=\"dialogs.secondsPerFrame = true\"\n @keydown.76.prevent=\"dialogs.frames = true\"\n @keydown.49.97=\"() => (secondsPerFrame = 1)\"\n @keydown.50.98=\"() => (secondsPerFrame = 2)\"\n @keydown.51.99=\"() => (secondsPerFrame = 3)\"\n @keydown.52.100=\"() => (secondsPerFrame = 4)\"\n @keydown.53.101=\"() => (secondsPerFrame = 5)\"\n />\n <GlobalEvents\n v-if=\"prevLoop || nextLoop\"\n @keydown=\"breakLoop\"\n v-on:click=\"breakLoop\"\n />\n <settings\n v-if=\"active\"\n :dialogs-visibility=\"dialogs\"\n :playback-rate=\"playbackRate\"\n :seconds-per-frame=\"secondsPerFrame\"\n :frames-per-row=\"framesPerRow\"\n :number-of-rows=\"numberOfRows\"\n @change-playback-rate=\"(value) => (playbackRate = value)\"\n @change-go-to=\"changeHour\"\n @change-seconds-per-frame=\"(value) => (secondsPerFrame = value)\"\n @set-frames-selection=\"setFrameSelection\"\n @close=\"(dialog) => (dialogs[dialog] = false)\"\n />\n <div\n :class=\"{ 'visualization-card': true, 'active-tab': active }\"\n style=\"width: 100%; padding: 0\"\n >\n <command-bar\n v-show=\"commandBarShow\"\n :video-playing=\"videoPlaying\"\n :video-paused=\"paused\"\n :insert-time=\"canInsertTime\"\n :hour-ini-selected=\"!!hourIniSelected\"\n :hour-end-selected=\"!!hourEndSelected\"\n @prev-loop-activate=\"prevLoopActivate\"\n @next-loop-activate=\"nextLoopActivate\"\n @prev=\"prev\"\n @next=\"next\"\n @go-to=\"dialogs.goTo = true\"\n @open-frame-selection=\"dialogs.frames = true\"\n @open-frames-per-second=\"dialogs.secondsPerFrame = true\"\n @open-blocks=\"openBlocks\"\n @open-playback-rate=\"dialogs.playbackRate = true\"\n @play-or-pause=\"playOrPause\"\n @stop-playing=\"stopPlayingBar\"\n @set-hour-ini=\"setHourIni\"\n @set-hour-end=\"setHourEnd\"\n @insert-time=\"insertTime\"\n />\n <video-progress\n v-if=\"videoProgressBar\"\n v-show=\"videoPlaying\"\n :video-time=\"videoTime\"\n />\n <info-bar\n :playback-rate=\"playbackRate\"\n :seconds-per-frame=\"secondsPerFrame\"\n :commands-show=\"commandBarShow\"\n :cache=\"useCache\"\n :block-start-time=\"blockStartTime\"\n :video-total-duration=\"videoSliderTotalDuration\"\n :alternative-server=\"alternativeServer\"\n :frames-per-row=\"framesPerRow\"\n :number-of-rows=\"numberOfRows\"\n :hour-ini=\"hourIniSelected\"\n :hour-end=\"hourEndSelected\"\n @toogle-commands-visibility=\"commandBarShow = !commandBarShow\"\n @toogle-cache=\"useCache = !useCache\"\n @change-server=\"changeServerClick\"\n />\n <div\n class=\"visualization-row\"\n v-for=\"rowNumber in numberOfRows\"\n :id=\"'row-' + rowNumber\"\n :key=\"'row-' + rowNumber\"\n style=\"padding: 12px\"\n >\n <div\n v-for=\"(frame, frameNumber) in previousFrames\"\n :key=\"\n numberOfRows +\n '-' +\n framesPerRow +\n '-' +\n getIndex(rowNumber, frameNumber, Positions.previous)\n \"\n style=\"display: none\"\n >\n <span v-html=\"frame.img\" />\n </div>\n <div\n v-for=\"(frame, frameNumber) in nextFrames\"\n :key=\"\n numberOfRows +\n '-' +\n framesPerRow +\n '-' +\n getIndex(rowNumber, frameNumber, Positions.next)\n \"\n style=\"display: none\"\n >\n <span v-html=\"frame.img\" />\n </div>\n <div\n class=\"visualization-col\"\n v-for=\"(frame, frameNumber) in frames.slice(\n framesPerRow * (rowNumber - 1),\n framesPerRow * rowNumber\n )\"\n :key=\"'row-' + rowNumber + '-frame-' + frameNumber\"\n :id=\"`frame-${getIndex(rowNumber, frameNumber, Positions.current)}`\"\n :class=\"{ loaderImg: !!frame.img }\"\n @click=\"\n frame.time\n ? selectFrame(\n getIndex(rowNumber, frameNumber, Positions.current),\n frame\n )\n : null\n \"\n >\n <span :id=\"activeFrame ? 'aa' : 0\" style=\"padding-left: 4px\">\n <b>\n {{\n getAudienceTime(\n frame.time,\n rowNumber,\n frameNumber,\n Positions.current\n )\n }}\n </b>\n </span>\n\n <frame\n ref=\"frames\"\n :frame=\"frame\"\n :index=\"getIndex(rowNumber, frameNumber, Positions.current)\"\n :grid-settings=\"{ numberOfRows, framesPerRow }\"\n :initialTime=\"frame.time === hourIniSelected\"\n :endTime=\"frame.time === hourEndSelected\"\n :betweenTime=\"\n frame.time > hourIniSelected && frame.time < hourEndSelected\n \"\n :active=\"\n getIndex(rowNumber, frameNumber, Positions.current) ===\n activeFrame\n \"\n :activeTab=\"active\"\n :videoUrl=\"fInterface ? fInterface.getVideoUrl(frame) : ''\"\n @startPlaying=\"startPlaying\"\n @stopPlaying=\"stopPlaying\"\n @playPauseStatus=\"changePlayPause\"\n @updateSlider=\"updateSlider\"\n :playback-rate=\"playbackRate\"\n style=\"margin: 0 auto\"\n ></frame>\n </div>\n </div>\n </div>\n <!-- <settings\n ref=\"settings2\"\n :active=\"active\"\n @goToTime=\"changeHour\"\n @goToBlockInterval=\"changeBlockInterval\"\n @setSplitTime=\"setSplitTime\"\n @setFrameSelection=\"setFrameSelection\"\n @setPlaybackRate=\"\n (rate) => {\n playbackRate = rate\n }\n \"\n >\n </settings> -->\n <!-- <v-dialog v-model=\"dialog\" width=\"500\">\n <div class=\"card\">\n <div class=\"card\"-title class=\"text-h5 grey lighten-2\">\n {{ ' Último bloco disponível até: ' }}\n <v-btn\n @click=\"goToStartBlock\"\n class=\"ml-2\"\n dark\n color=\"success\"\n depressed\n >\n <v-icon left> fa-clock </v-icon>\n {{ timeLastBlock }}\n </v-btn>\n <v-spacer></v-spacer>\n <v-btn color=\"error\" fab small class=\"ml-5\" @click=\"dialog = false\">\n <v-icon dark> fa fa-xmark </v-icon>\n </v-btn>\n </div-title>\n </div>\n </v-dialog>\n <Help :media=\"media\" @close=\"media = null\" />\n <v-dialog\n v-if=\"userMultiTabsGrid\"\n v-model=\"userMultiTabsGridsModel\"\n persistent\n width=\"60%\"\n >\n <div class=\"card\">\n <div class=\"card\"-title class=\"warning text-h5\" primary-title>\n <div class=\"row\" class=\"ma-0\" justify=\"center\" align=\"center\">\n <v-icon dark left style=\"font-size: 24px !important\">\n fa fa-exclamation-triangle\n </v-icon>\n <div style=\"color: white\">{{ $t('form.alert') }}</div>\n </div>\n </div-title>\n <div class=\"card\"-text class=\"justify-center pa-6 grey lighten-2\">\n <h3>\n {{ $t('alerts.userMultiTabsGrid') }}\n </h3>\n </div-text>\n <hr class=\"divider\" class=\"grey lighten-1\"></span>\n <div class=\"card\"-actions class=\"grey lighten-2 justify-center\">\n <v-btn color=\"error\" ml-5 @click=\"userMultiTabsGrid = false\">\n <v-icon left color=\"white\">fa fa-times</v-icon>\n {{ $t('form.close') }}\n </v-btn>\n </div-actions>\n </div>\n </v-dialog> -->\n </div>\n</template>\n<script>\nimport Frame from './components/Frame.vue'\nimport FramesInterface from './utils/FramesInterface.js'\nimport FramesService from './services/FramesService.js'\n\nimport Commands from './components/Commands.vue'\nimport Infos from './components/Infos.vue'\nimport VideoProgress from './components/VideoProgress.vue'\nimport Settings from './components/Settings.vue'\n\nconst Positions = Object.freeze({\n previous: 0,\n current: 1,\n next: 2,\n})\n\nexport default {\n name: 'visualization-container',\n props: {\n value: {\n type: Boolean,\n required: true,\n },\n date: {\n type: String,\n required: true,\n },\n channel: {\n type: Number,\n required: true,\n },\n startAudienceTime: {\n type: String,\n required: true,\n },\n endAudienceTime: {\n type: String,\n required: true,\n },\n videoProgressBar: {\n type: Boolean,\n default: false,\n },\n jumpOnInsert: {\n type: Boolean,\n default: false,\n },\n framesFormat: {\n type: [Number, String],\n default: 6,\n },\n maxSize: {\n type: Number,\n }\n },\n components: {\n Frame,\n CommandBar: Commands,\n InfoBar: Infos,\n VideoProgress,\n Settings,\n // Help,\n },\n data() {\n return {\n Positions,\n updatingChannel: null,\n dialog: false,\n timeLastBlock: null,\n alternativeServer: false,\n useCache: true,\n numberOfRows: 1,\n framesPerRow: 5,\n secondsPerFrame: 1,\n fInterface: null,\n velocity: 1,\n frames: [],\n previousFrames: [],\n nextFrames: [],\n channelCode: 0,\n videoPlaying: false,\n activeFrame: null,\n activeVideo: null,\n videoTime: 0,\n videoTotalTime: null,\n progressVideoDrag: false,\n hourIniSelected: false,\n hourEndSelected: false,\n canInsertTime: false,\n lastHeight: 0,\n loopInterval: null,\n nextLoop: false,\n prevLoop: false,\n videoSliderTotalDuration: 900,\n blockStartTime: null,\n media: null,\n changeServer: false,\n userMultiTabsGrid: false,\n userMultiTabsGridsModel: true,\n playbackRate: 1,\n paused: false,\n commandBarShow: true,\n dialogs: {\n playbackRate: false,\n goTo: false,\n secondsPerFrame: false,\n frames: false,\n },\n }\n },\n async created() {\n this.changeServer = this.serverOfFrames === 'alternative'\n this.alternativeServer = this.serverOfFrames === 'alternative'\n\n const settings = [\n {\n framesPerRow: 2,\n numberOfRows: 1,\n },\n {\n framesPerRow: 3,\n numberOfRows: 1,\n },\n {\n framesPerRow: 3,\n numberOfRows: 2,\n },\n {\n framesPerRow: 4,\n numberOfRows: 1,\n },\n {\n framesPerRow: 4,\n numberOfRows: 2,\n },\n {\n framesPerRow: 5,\n numberOfRows: 1,\n },\n {\n framesPerRow: 5,\n numberOfRows: 2,\n },\n {\n framesPerRow: 6,\n numberOfRows: 1,\n },\n {\n framesPerRow: 6,\n numberOfRows: 2,\n },\n ]\n\n const storedOnDb = settings[parseInt(this.framesFormat) - 1]\n this.framesPerRow = storedOnDb.framesPerRow\n this.numberOfRows = storedOnDb.numberOfRows\n\n await this.createFramesInterface()\n if (this.maxSize) {\n this.resize(this.maxSize, true)\n }\n },\n methods: {\n framesClicked(e) {\n if (e.target.id != 'insert') {\n this.active = true\n }\n },\n async goToStartBlock() {\n try {\n const d = new Date()\n let timestamp = Date.UTC(\n d.getFullYear(),\n d.getMonth(),\n d.getDate(),\n d.getHours(),\n d.getMinutes(),\n d.getSeconds()\n )\n\n const response = (\n await FramesService.getNextAvailableBlock({\n channel: this.channel,\n time: timestamp / 1000,\n })\n ).data\n\n this.dialog = false\n this.changeHour(this.convertToAudienceTime(response.data.start, ':'))\n } catch (err) {\n console.error(err)\n }\n },\n async checkAvailableBlock() {\n try {\n const d = new Date()\n let timestamp = Date.UTC(\n d.getFullYear(),\n d.getMonth(),\n d.getDate(),\n d.getHours(),\n d.getMinutes(),\n d.getSeconds()\n )\n\n const response = (\n await FramesService.getNextAvailableBlock({\n channel: this.channel,\n time: timestamp / 1000,\n })\n ).data\n\n this.timeLastBlock = this.convertToAudienceTime(response.data.end, ':')\n this.dialog = true\n if (!response.status) {\n this.timeLastBlock = 'N/D'\n }\n } catch (err) {\n console.error(err)\n }\n },\n updateSlider(videoStartTime, time) {\n // * atualizar slider se estiver fora do range definido previamente\n if (\n time < this.blockStartTime ||\n time > this.blockStartTime ||\n videoStartTime > this.blockStartTime + this.videoSliderTotalDuration\n ) {\n this.blockStartTime = videoStartTime\n this.videoSliderTotalDuration = 900\n }\n },\n nextLoopActivate() {\n this.breakLoop()\n this.loopInterval = setInterval(this.next, 40)\n setTimeout(() => {\n this.nextLoop = true\n }, 0)\n },\n prevLoopActivate() {\n this.breakLoop()\n this.loopInterval = setInterval(this.prev, 40)\n setTimeout(() => {\n this.prevLoop = true\n }, 0)\n },\n breakLoop() {\n clearInterval(this.loopInterval)\n this.loopInterval = null\n this.nextLoop = false\n this.prevLoop = false\n },\n changePlayPause(status) {\n this.paused = !status\n },\n resize(height=this.lastHeight) {\n this.lastHeight = height\n if (this.$refs.frames) {\n for (let frame of this.$refs.frames) {\n frame.resize(height)\n }\n }\n this.$emit('resized')\n },\n async goToFirstFrame() {\n let frames = this.$refs.frames\n\n let audienceTime = null\n if (frames.length > 0) {\n let frame = frames[0].frame\n audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)\n }\n // if (audienceTime) {\n // this.changeHour(this.getLastFirtsBlockTime(audienceTime, true))\n // }\n if (audienceTime) {\n const [hours, minutes, seconds] = audienceTime.split(':')\n const totalSeconds =\n parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseInt(seconds)\n if (totalSeconds >= 9000)\n this.changeHour(this.getLastFirtsBlockTime(audienceTime, true))\n else this.changeHour(this.getLastFirtsBlockTime('02:30:00', true))\n }\n },\n async goToLastFrame() {\n let frames = this.$refs.frames\n let audienceTime = null\n if (frames.length > 0) {\n let frame = frames[0].frame\n\n audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)\n }\n if (audienceTime) {\n this.changeHour(this.getLastFirtsBlockTime(audienceTime))\n }\n },\n getLastFirtsBlockTime(time, first = false) {\n if (time.indexOf(':') !== -1) {\n time = time.replace(/:/g, '')\n }\n let h, m, newTime\n const t = time.match(/.{1,2}/g)\n if (t[0] && t[1]) {\n h = parseInt(t[0])\n m = parseInt(t[1])\n }\n if (h < 26) {\n if (m < 15)\n if (first) newTime = t[0] + ':00:00'\n else newTime = t[0] + ':14:59'\n else if (m < 30)\n if (first) newTime = t[0] + ':15:00'\n else newTime = t[0] + ':29:59'\n else if (m < 45)\n if (first) newTime = t[0] + ':30:00'\n else newTime = t[0] + ':44:59'\n else if (first) newTime = t[0] + ':45:00'\n else newTime = t[0] + ':59:59'\n } else {\n if (m < 15)\n if (first) newTime = '26:00:00'\n else newTime = '26:14:59'\n else {\n if (first) newTime = '26:15:00'\n else newTime = '26:29:59'\n }\n }\n return newTime\n },\n openBlocks() {\n this.$refs.settings2?.openBlocks()\n },\n playOrPause() {\n const array = this.$refs.frames.filter((fc) => !!fc.active)\n if (array.length === 1) {\n const frame = array[0]\n frame.playOrPause(this.playbackRate)\n }\n },\n stopPlayingBar() {\n for (let ref of this.$refs.frames) {\n if (\n ref.videoStatus === ref.Status.playing ||\n ref.videoStatus === ref.Status.paused\n ) {\n ref.stop(false)\n }\n }\n },\n async setFrameSelection(selected) {\n this.frames = this.loadingArray\n switch (parseInt(selected)) {\n // 2x1\n case 1:\n this.framesPerRow = 2\n this.numberOfRows = 1\n break\n // 3x1\n case 2:\n this.framesPerRow = 3\n this.numberOfRows = 1\n break\n // 3x2\n case 3:\n this.framesPerRow = 3\n this.numberOfRows = 2\n break\n // 4x1\n case 4:\n this.framesPerRow = 4\n this.numberOfRows = 1\n break\n // 4x2\n case 5:\n this.framesPerRow = 4\n this.numberOfRows = 2\n break\n // 5x1\n case 6:\n this.framesPerRow = 5\n this.numberOfRows = 1\n break\n // 5x2\n case 7:\n this.framesPerRow = 5\n this.numberOfRows = 2\n break\n // 6x1\n case 8:\n this.framesPerRow = 6\n this.numberOfRows = 1\n break\n // 6x2\n case 9:\n this.framesPerRow = 6\n this.numberOfRows = 2\n break\n }\n await this.fInterface.changeSize(this.numberOfRows, this.framesPerRow)\n this.getFramesArray()\n setTimeout(() => {\n for (let ref of this.$refs.frames) {\n ref?.resize(this.lastHeight)\n }\n }, 150)\n },\n getFramesArray() {\n this.frames = this.fInterface.getFrames(Positions.current)\n this.nextFrames = this.fInterface.getFrames(Positions.next)\n this.previousFrames = this.fInterface.getFrames(Positions.previous)\n },\n async createFramesInterface() {\n this.frames = this.loadingArray\n let ch = this.channel\n let associationTMP = {\n 1735073: 1,\n 1735074: 139,\n 1735075: 3,\n 1735076: 132,\n }\n //\n this.channelCode = associationTMP[ch] ? associationTMP[ch] : ch\n\n const t = this.startAudienceTime.match(/.{1,2}/g)\n const d = this.getDateParts()\n const time = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000\n // * iniciar slider\n this.blockStartTime = time\n this.fInterface = await new FramesInterface(\n this.channelCode,\n this.numberOfRows,\n this.framesPerRow,\n time,\n this.startAudienceTime,\n this.useCache\n )\n await this.fInterface.init()\n\n this.getFramesArray()\n\n this.activeFrame = this.getIndex(1, 0, Positions.current)\n\n this.activeVideo = null\n },\n getIndex(rowNumber, frameIndex, position) {\n let from = this.framesPerRow * this.numberOfRows * position\n let till = this.framesPerRow * this.numberOfRows * (position + 1)\n\n return (from + till * (rowNumber - 1)) / rowNumber + frameIndex\n },\n getAudienceTime(frameTime, rowNumber, frameNumber, position) {\n if (!frameTime) {\n return 'Loading...'\n } else if (\n this.getIndex(rowNumber, frameNumber, position) === this.activeVideo\n ) {\n return this.convertToAudienceTime(this.videoTime)\n } else {\n return this.convertToAudienceTime(frameTime)\n }\n },\n dateInUtc(miliSeconds) {\n var date = new Date(miliSeconds)\n var utc = new Date(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds()\n )\n return utc\n },\n convertToAudienceTime(time, separator = ':') {\n const d = this.getDateParts()\n const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000\n\n let hour = this.dateInUtc(time * 1000)\n .toTimeString()\n .split(' ')[0]\n .split(':')\n .map(Number)\n\n if (time > limit && time <= limit + this.startAudienceSeconds) {\n hour[0] = 24 + hour[0]\n }\n return hour\n .map((part) => (part > 9 ? part.toString() : '0' + part))\n .join(separator)\n },\n getDateParts(date = this.date) {\n const d = new Date(date)\n return {\n year: d.getFullYear(),\n month: d.getMonth(),\n day: d.getDate(),\n }\n },\n selectFrame(index, frame) {\n const d = this.getDateParts()\n const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000\n const frameTime = frame?.time\n\n if (frameTime - (this.startAudienceSeconds + limit) <= 0) {\n if (this.hourIniSelected === true) {\n this.hourIniSelected = frameTime\n\n if (\n this.hourEndSelected &&\n this.hourIniSelected > this.hourEndSelected\n ) {\n this.hourEndSelected = false\n }\n } else if (this.hourEndSelected === true) {\n if (frameTime > this.hourIniSelected) {\n this.hourEndSelected = frameTime\n this.canInsertTime = true\n } else {\n this.hourEndSelected = false\n }\n }\n }\n\n if (this.activeFrame !== index) {\n // ? Se clicar no frame diferente de onde está a dar play, faz pausa\n const array = this.$refs.frames.filter(\n (fc) => fc.videoStatus === fc.Status.playing\n )\n if (array.length === 1) {\n const frame = array[0]\n frame.playOrPause()\n }\n this.activeVideo = null\n this.activeFrame = index\n }\n },\n setHourIni() {\n this.canInsertTime = true\n this.hourIniSelected = true\n document.getElementById(`frame-${this.activeFrame}`).click()\n this.$emit('setHourIni', {\n hour_ini: this.hourIniSelected\n ? this.convertToAudienceTime(this.hourIniSelected, '')\n : null,\n })\n },\n setHourEnd() {\n this.canInsertTime = true\n this.hourEndSelected = true\n document.getElementById(`frame-${this.activeFrame}`).click()\n },\n //* Navegação\n arrowRight() {\n if (this.checkLimitRight(false)) {\n if (\n this.activeFrame ===\n this.numberOfRows * this.framesPerRow * 2 - 1\n ) {\n this.next()\n } else {\n this.activeFrame++\n }\n }\n },\n arrowLeft() {\n if (this.checkLimitLeft(false)) {\n if (this.activeFrame === this.numberOfRows * this.framesPerRow) {\n this.prev()\n } else {\n this.activeFrame--\n }\n }\n },\n checkLimitRight(value) {\n const hours = this.endAudienceTime.match(/.{1,2}/g)\n const d = this.getDateParts()\n const high = Date.UTC(d.year, d.month, d.day, 26, 29, 59)\n\n if (value) {\n return (\n high > (this.fInterface.getCurrentTime() - 1) * 1000 &&\n this.nextFrames[0].title !== -1\n )\n } else {\n // return high > (this.fInterface.getCurrentTime() + this.activeFrame) * 1000\n return high > this.fInterface.getCurrentTime() * 1000\n }\n },\n checkLimitLeft(value) {\n const hours = this.startAudienceTime.match(/.{1,2}/g)\n const d = this.getDateParts()\n const low = Date.UTC(d.year, d.month, d.day, hours[0], hours[1], hours[2])\n\n if (value) {\n return low <= (this.fInterface.getCurrentTime() - 1) * 1000\n } else {\n return (\n low <\n (this.fInterface.getCurrentTime() +\n this.activeFrame -\n this.numberOfRows * this.framesPerRow) *\n 1000\n )\n }\n },\n async next() {\n if (this.checkLimitRight(true)) {\n const array = this.$refs.frames.filter(\n (fc) =>\n fc.videoStatus === fc.Status.playing ||\n fc.videoStatus === fc.Status.paused\n )\n\n if (array.length === 1) {\n const frame = array[0]\n frame.stop(false)\n }\n this.fInterface.setCurrentStep(this.secondsPerFrame)\n await this.fInterface.loadNextFrames()\n\n this.activeFrame = this.getIndex(1, 0, Positions.current)\n this.activeVideo = null\n\n this.getFramesArray()\n }\n },\n async prev() {\n if (this.checkLimitLeft(true)) {\n const array = this.$refs.frames.filter(\n (fc) =>\n fc.videoStatus === fc.Status.playing ||\n fc.videoStatus === fc.Status.paused\n )\n if (array.length === 1) {\n const frame = array[0]\n frame.stop(false)\n }\n\n this.fInterface.setCurrentStep(this.secondsPerFrame)\n await this.fInterface.loadPrevFrames()\n\n this.activeFrame = this.getIndex(\n this.numberOfRows,\n this.framesPerRow - 1,\n Positions.current\n )\n this.activeVideo = null\n\n this.getFramesArray()\n }\n },\n async setStartTime(time) {\n if (time.indexOf(':') !== -1) {\n time = time.replace(/:/g, '')\n }\n const t = time.match(/.{1,2}/g)\n const d = this.getDateParts()\n const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000\n this.frames = this.loadingArray\n\n await this.fInterface.changeTime(setTime)\n\n this.getFramesArray()\n\n this.activeFrame = this.getIndex(1, 0, Positions.current)\n // let frames = this.$refs.frames\n\n // let audienceTime = null\n // if (frames.length > 0) {\n // let frame = frames[0].frame\n // audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)\n // }\n\n this.activeVideo = null\n\n return true\n },\n hourToTimeStamp(time) {\n if (time.indexOf(':') !== -1) {\n time = time.replace(/:/g, '')\n }\n const t = time.match(/.{1,2}/g)\n const d = this.getDateParts()\n const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000\n\n return setTime\n },\n async changeHour(value) {\n if (value) {\n setTimeout(() => {\n const array = this.$refs.frames.filter(\n (fc) =>\n fc.videoStatus === fc.Status.playing ||\n fc.videoStatus === fc.Status.paused\n )\n\n if (array.length === 1) {\n const frame = array[0]\n frame.stop(false)\n }\n\n this.setStartTime(value, true)\n }, 0)\n }\n },\n changeBlockInterval(value) {\n this.changeHour(value.ini)\n let time_ini, time_end\n time_ini = this.hourToTimeStamp(value.ini)\n time_end = this.hourToTimeStamp(value.end)\n this.videoSliderTotalDuration = time_end - time_ini\n this.$refs.frames[0].changeSettings(time_ini)\n this.blockStartTime = time_ini\n },\n //eslint-disable-next-line\n async updateVideoTime(index, videoTime) {\n this.activeVideo = index\n this.videoTime = videoTime\n },\n //eslint-disable-next-line\n updateVideoStatus(currentTime) {\n if (!this.progressVideoDrag) {\n // ESTA FUNÇÃO PASSOU PARA DENTRO DOS COMMANDS\n // this.updateProgress(null, currentTime)\n }\n },\n async startPlaying(frame, totalTime) {\n const array = this.$refs.frames.filter(\n (fc) => fc.frame.time !== frame.time\n )\n\n for (let ref of array) {\n if (\n ref.videoStatus === ref.Status.playing ||\n ref.videoStatus === ref.Status.paused\n ) {\n ref.stop(false)\n }\n }\n\n this.videoTotalTime = totalTime\n this.videoPlaying = true\n },\n stopPlaying() {\n this.videoTotalTime = null\n this.videoPlaying = false\n this.paused = false\n },\n insertTime() {\n this.$emit('timeToInsert', {\n channel: this.channel,\n hour_ini: this.hourIniSelected\n ? this.convertToAudienceTime(this.hourIniSelected, '')\n : null,\n hour_end: this.hourEndSelected\n ? this.convertToAudienceTime(this.hourEndSelected, '')\n : null,\n force: false,\n })\n\n if (this.jumpOnInsert) {\n this.changeHour(\n this.convertToAudienceTime(\n (this.hourEndSelected || this.hourIniSelected) + 1\n )\n )\n }\n\n this.hourIniSelected = null\n this.hourEndSelected = null\n this.canInsertTime = false\n\n // this.fInterface.setCurrentPosition(this.hourEndSelected)\n },\n insertTimeForce() {\n this.$emit('timeToInsert', {\n channel: this.channel,\n hour_ini: this.hourIniSelected\n ? this.convertToAudienceTime(this.hourIniSelected, '')\n : null,\n hour_end: this.hourEndSelected\n ? this.convertToAudienceTime(this.hourEndSelected, '')\n : null,\n force: true,\n })\n\n this.hourIniSelected = null\n this.hourEndSelected = null\n this.canInsertTime = false\n\n // this.fInterface.setCurrentPosition(this.hourEndSelected)\n },\n async getChannelMedia() {\n // this.media = (await ChannelService.show(this.channel)).data.MEDIA\n },\n async changeServerClick() {\n this.changeServer = !this.changeServer\n // this.$store.dispatch(\n // 'serverOfFrames',\n // this.changeServer ? 'alternative' : 'default'\n // )\n sessionStorage.setItem(\n 'serverOfFrames',\n this.changeServer ? 'alternative' : 'default'\n )\n\n // if (this.$route.params.time != this.frames[0].time)\n // this.$router.push({\n // name: 'grid',\n // params: {\n // date: this.date,\n // channel: this.channelCode,\n // time: this.frames[0].time,\n // },\n // })\n location.reload()\n },\n },\n computed: {\n active: {\n get() {\n return this.value\n },\n set(value) {\n this.$emit('input', value)\n },\n },\n settingsClosed() {\n return !Object.values(this.dialogs).find((v) => v)\n },\n startAudienceSeconds() {\n const t = this.startAudienceTime.match(/.{1,2}/g)\n return parseInt(t[0] * 3600 + t[1] * 60 + t[2])\n },\n loadingArray() {\n return Array.from(Array(this.numberOfRows * this.framesPerRow).keys())\n },\n serverOfFrames() {\n return sessionStorage.getItem('server')\n },\n },\n watch: {\n framesFormat(value) {\n this.setFrameSelection(value)\n },\n active() {\n // ? sempre que trocamos de tabs dar reset as horas selected\n this.hourIniSelected = false\n this.hourEndSelected = false\n },\n useCache() {\n this.createFramesInterface()\n },\n hourIniSelected(value) {\n if (value) {\n sessionStorage.setItem(\n 'currentTimeFrames',\n this.convertToAudienceTime(this.hourIniSelected, '')\n )\n } else {\n sessionStorage.removeItem('currentTimeFrames')\n }\n },\n activeFrame(value) {\n if (value) {\n this.stopPlayingBar()\n }\n },\n channel() {\n this.updatingChannel = new Promise((resolve, reject) => {\n try {\n this.createFramesInterface()\n resolve(true)\n } catch (err) {\n reject(err)\n }\n })\n },\n },\n}\n</script>\n<style scoped>\n.visualization-row {\n display: flex;\n flex-wrap: wrap;\n flex: 1 1 auto;\n}\n\n.visualization-col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n padding: 12px;\n}\n\n.visualization-divider {\n display: block;\n flex: 1 1 100%;\n height: 0px;\n max-height: 0px;\n opacity: 1;\n transition: inherit;\n border-style: solid;\n border-width: thin 0 0 0;\n border-color: rgba(0, 0, 0, 0.12);\n margin: 0;\n}\n\n.visualization-divider.vertical {\n align-self: stretch;\n border-width: 0 thin 0 0;\n display: inline-flex;\n height: inherit;\n margin-left: -1px;\n max-height: 100%;\n max-width: 0px;\n vertical-align: text-bottom;\n width: 0px;\n}\n\n.visualization-card {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n padding: 12px;\n width: 100%;\n transition-property: box-shadow, opacity, -webkit-box-shadow;\n overflow-wrap: break-word;\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\n}\n\n.visualization-justify-center, /deep/ .visualization-justify-center {\n justify-content: center;\n}\n\n.visualization-align-center {\n align-items: center;\n}\n\n#visualization-container {\n max-width: 100% !important;\n margin: 0 auto !important;\n height: 100%;\n border-bottom: none;\n}\n#visualization-container > .card {\n border-radius: 0 !important;\n font-size: 12px;\n width: 100%;\n box-shadow: none;\n height: 100%;\n}\n\n#command-bar,\n#info-bar {\n background-color: #f5f5f5;\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n#command-bar button {\n width: 42px;\n height: 36px;\n border: none;\n background: none;\n}\n\n#command-bar button:hover {\n cursor: pointer;\n background: rgba(0, 0, 0, 0.12);\n}\n\n#command-bar svg {\n font-size: 16px;\n}\n\n#command-bar {\n padding: 0 !important;\n}\n\n#info-bar {\n padding: 4px;\n font-size: 14px;\n position: relative;\n}\n\n.settings-container {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.settings-container > * {\n margin: 0 2px;\n cursor: pointer;\n}\n\n#info-bar svg {\n font-size: 16px;\n}\n\n#info-bar .divider {\n margin: 0 8px;\n}\n\nsvg:focus {\n border: none;\n}\n\n.visualization-card {\n border-left: 8px solid #eee;\n}\n\n.active-tab {\n border-left: 8px solid var(--visualization-primary) !important;\n border-image-slice: 1;\n}\n\n[id^='frame-'] {\n padding: 1px;\n display: flex;\n flex-flow: column;\n}\n\n.tooltip {\n display: block !important;\n z-index: 10000;\n}\n\n.tooltip .tooltip-inner {\n background: var(--visualization-primary);\n color: white;\n border-radius: 16px;\n padding: 5px 10px 4px;\n}\n\n.tooltip .tooltip-arrow {\n width: 0;\n height: 0;\n border-style: solid;\n position: absolute;\n margin: 5px;\n border-color: var(--visualization-primary);\n z-index: 1;\n}\n\n.tooltip[x-placement^='top'] {\n margin-bottom: 5px;\n}\n\n.tooltip[x-placement^='top'] .tooltip-arrow {\n border-width: 5px 5px 0 5px;\n border-left-color: transparent !important;\n border-right-color: transparent !important;\n border-bottom-color: transparent !important;\n bottom: -5px;\n left: calc(50% - 5px);\n margin-top: 0;\n margin-bottom: 0;\n}\n\n.tooltip[x-placement^='bottom'] {\n margin-top: 5px;\n}\n\n.tooltip[x-placement^='bottom'] .tooltip-arrow {\n border-width: 0 5px 5px 5px;\n border-left-color: transparent !important;\n border-right-color: transparent !important;\n border-top-color: transparent !important;\n top: -5px;\n left: calc(50% - 5px);\n margin-top: 0;\n margin-bottom: 0;\n}\n\n.tooltip[x-placement^='right'] {\n margin-left: 5px;\n}\n\n.tooltip[x-placement^='right'] .tooltip-arrow {\n border-width: 5px 5px 5px 0;\n border-left-color: transparent !important;\n border-top-color: transparent !important;\n border-bottom-color: transparent !important;\n left: -5px;\n top: calc(50% - 5px);\n margin-left: 0;\n margin-right: 0;\n}\n\n.tooltip[x-placement^='left'] {\n margin-right: 5px;\n}\n\n.tooltip[x-placement^='left'] .tooltip-arrow {\n border-width: 5px 0 5px 5px;\n border-top-color: transparent !important;\n border-right-color: transparent !important;\n border-bottom-color: transparent !important;\n right: -5px;\n top: calc(50% - 5px);\n margin-left: 0;\n margin-right: 0;\n}\n\n.tooltip.popover .popover-inner {\n background: #f9f9f9;\n color: black;\n padding: 24px;\n border-radius: 5px;\n box-shadow: 0 5px 30px rgba(black, 0.1);\n}\n\n.tooltip.popover .popover-arrow {\n border-color: #f9f9f9;\n}\n\n.tooltip[aria-hidden='true'] {\n visibility: hidden;\n opacity: 0;\n transition: opacity 0.15s, visibility 0.15s;\n}\n\n.tooltip[aria-hidden='false'] {\n visibility: visible;\n opacity: 1;\n transition: opacity 0.15s;\n}\n</style>\n"]}, media: undefined });
4491
+ inject("data-v-09946f69_0", { source: "\n.visualization-row[data-v-09946f69] {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex: 1 1 auto;\n}\n.visualization-col[data-v-09946f69] {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\n}\n.visualization-divider[data-v-09946f69] {\r\n display: block;\r\n flex: 1 1 100%;\r\n height: 0px;\r\n max-height: 0px;\r\n opacity: 1;\r\n transition: inherit;\r\n border-style: solid;\r\n border-width: thin 0 0 0;\r\n border-color: rgba(0, 0, 0, 0.12);\r\n margin: 0;\n}\n.visualization-divider.vertical[data-v-09946f69] {\r\n align-self: stretch;\r\n border-width: 0 thin 0 0;\r\n display: inline-flex;\r\n height: inherit;\r\n margin-left: -1px;\r\n max-height: 100%;\r\n max-width: 0px;\r\n vertical-align: text-bottom;\r\n width: 0px;\n}\n.visualization-card[data-v-09946f69] {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n width: 100%;\r\n transition-property: box-shadow, opacity, -webkit-box-shadow;\r\n overflow-wrap: break-word;\r\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\n}\n.visualization-justify-center[data-v-09946f69],[data-v-09946f69] .visualization-justify-center {\r\n justify-content: center;\n}\n.visualization-align-center[data-v-09946f69] {\r\n align-items: center;\n}\n#visualization-container[data-v-09946f69] {\r\n max-width: 100% !important;\r\n margin: 0 auto !important;\r\n height: 100%;\r\n border-bottom: none;\n}\n#visualization-container > .card[data-v-09946f69] {\r\n border-radius: 0 !important;\r\n font-size: 12px;\r\n width: 100%;\r\n box-shadow: none;\r\n height: 100%;\n}\n#command-bar[data-v-09946f69],\r\n#info-bar[data-v-09946f69] {\r\n background-color: #f5f5f5;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\n}\n#command-bar button[data-v-09946f69] {\r\n width: 42px;\r\n height: 36px;\r\n border: none;\r\n background: none;\n}\n#command-bar button[data-v-09946f69]:hover {\r\n cursor: pointer;\r\n background: rgba(0, 0, 0, 0.12);\n}\n#command-bar svg[data-v-09946f69] {\r\n font-size: 16px;\n}\n#command-bar[data-v-09946f69] {\r\n padding: 0 !important;\n}\n#info-bar[data-v-09946f69] {\r\n padding: 4px;\r\n font-size: 14px;\r\n position: relative;\n}\n.settings-container[data-v-09946f69] {\r\n position: absolute;\r\n right: 14px;\r\n top: 50%;\r\n transform: translateY(-50%);\n}\n.settings-container > *[data-v-09946f69] {\r\n margin: 0 2px;\r\n cursor: pointer;\n}\n#info-bar svg[data-v-09946f69] {\r\n font-size: 16px;\n}\n#info-bar .divider[data-v-09946f69] {\r\n margin: 0 8px;\n}\nsvg[data-v-09946f69]:focus {\r\n border: none;\n}\n.visualization-card[data-v-09946f69] {\r\n border-left: 8px solid #eee;\n}\n.active-tab[data-v-09946f69] {\r\n border-left: 8px solid var(--visualization-primary) !important;\r\n border-image-slice: 1;\n}\n[id^='frame-'][data-v-09946f69] {\r\n padding: 1px;\r\n display: flex;\r\n flex-flow: column;\n}\n.tooltip[data-v-09946f69] {\r\n display: block !important;\r\n z-index: 10000;\n}\n.tooltip .tooltip-inner[data-v-09946f69] {\r\n background: var(--visualization-primary);\r\n color: white;\r\n border-radius: 16px;\r\n padding: 5px 10px 4px;\n}\n.tooltip .tooltip-arrow[data-v-09946f69] {\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n position: absolute;\r\n margin: 5px;\r\n border-color: var(--visualization-primary);\r\n z-index: 1;\n}\n.tooltip[x-placement^='top'][data-v-09946f69] {\r\n margin-bottom: 5px;\n}\n.tooltip[x-placement^='top'] .tooltip-arrow[data-v-09946f69] {\r\n border-width: 5px 5px 0 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n bottom: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\n}\n.tooltip[x-placement^='bottom'][data-v-09946f69] {\r\n margin-top: 5px;\n}\n.tooltip[x-placement^='bottom'] .tooltip-arrow[data-v-09946f69] {\r\n border-width: 0 5px 5px 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-top-color: transparent !important;\r\n top: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\n}\n.tooltip[x-placement^='right'][data-v-09946f69] {\r\n margin-left: 5px;\n}\n.tooltip[x-placement^='right'] .tooltip-arrow[data-v-09946f69] {\r\n border-width: 5px 5px 5px 0;\r\n border-left-color: transparent !important;\r\n border-top-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n left: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\n}\n.tooltip[x-placement^='left'][data-v-09946f69] {\r\n margin-right: 5px;\n}\n.tooltip[x-placement^='left'] .tooltip-arrow[data-v-09946f69] {\r\n border-width: 5px 0 5px 5px;\r\n border-top-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n right: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\n}\n.tooltip.popover .popover-inner[data-v-09946f69] {\r\n background: #f9f9f9;\r\n color: black;\r\n padding: 24px;\r\n border-radius: 5px;\r\n box-shadow: 0 5px 30px rgba(black, 0.1);\n}\n.tooltip.popover .popover-arrow[data-v-09946f69] {\r\n border-color: #f9f9f9;\n}\n.tooltip[aria-hidden='true'][data-v-09946f69] {\r\n visibility: hidden;\r\n opacity: 0;\r\n transition: opacity 0.15s, visibility 0.15s;\n}\n.tooltip[aria-hidden='false'][data-v-09946f69] {\r\n visibility: visible;\r\n opacity: 1;\r\n transition: opacity 0.15s;\n}\r\n", map: {"version":3,"sources":["C:\\workspace\\visualization\\src\\Visualization.vue"],"names":[],"mappings":";AAkoCA;EACA,aAAA;EACA,eAAA;EACA,cAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;AACA;AAEA;EACA,cAAA;EACA,cAAA;EACA,WAAA;EACA,eAAA;EACA,UAAA;EACA,mBAAA;EACA,mBAAA;EACA,wBAAA;EACA,iCAAA;EACA,SAAA;AACA;AAEA;EACA,mBAAA;EACA,wBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,cAAA;EACA,2BAAA;EACA,UAAA;AACA;AAEA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,aAAA;EACA,WAAA;EACA,4DAAA;EACA,yBAAA;EACA;qCACA;AACA;AAEA;EAEA,uBAAA;AACA;AAEA;EACA,mBAAA;AACA;AAEA;EACA,0BAAA;EACA,yBAAA;EACA,YAAA;EACA,mBAAA;AACA;AACA;EACA,2BAAA;EACA,eAAA;EACA,WAAA;EACA,gBAAA;EACA,YAAA;AACA;AAEA;;EAEA,yBAAA;EACA;mCACA;AACA;AACA;EACA,WAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;EACA,+BAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,eAAA;EACA,kBAAA;AACA;AAEA;EACA,kBAAA;EACA,WAAA;EACA,QAAA;EACA,2BAAA;AACA;AAEA;EACA,aAAA;EACA,eAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,aAAA;AACA;AAEA;EACA,YAAA;AACA;AAEA;EACA,2BAAA;AACA;AAEA;EACA,8DAAA;EACA,qBAAA;AACA;AAEA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;AACA;AAEA;EACA,yBAAA;EACA,cAAA;AACA;AAEA;EACA,wCAAA;EACA,YAAA;EACA,mBAAA;EACA,qBAAA;AACA;AAEA;EACA,QAAA;EACA,SAAA;EACA,mBAAA;EACA,kBAAA;EACA,WAAA;EACA,0CAAA;EACA,UAAA;AACA;AAEA;EACA,kBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,2CAAA;EACA,YAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,eAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,0CAAA;EACA,wCAAA;EACA,SAAA;EACA,qBAAA;EACA,aAAA;EACA,gBAAA;AACA;AAEA;EACA,gBAAA;AACA;AAEA;EACA,2BAAA;EACA,yCAAA;EACA,wCAAA;EACA,2CAAA;EACA,UAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,iBAAA;AACA;AAEA;EACA,2BAAA;EACA,wCAAA;EACA,0CAAA;EACA,2CAAA;EACA,WAAA;EACA,oBAAA;EACA,cAAA;EACA,eAAA;AACA;AAEA;EACA,mBAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,uCAAA;AACA;AAEA;EACA,qBAAA;AACA;AAEA;EACA,kBAAA;EACA,UAAA;EACA,2CAAA;AACA;AAEA;EACA,mBAAA;EACA,UAAA;EACA,yBAAA;AACA","file":"Visualization.vue","sourcesContent":["<template>\r\n <div\r\n class=\"visualization-row\"\r\n id=\"visualization-container\"\r\n @click=\"framesClicked\"\r\n >\r\n <GlobalEvents\r\n v-if=\"active && canInsertTime && settingsClosed\"\r\n @keydown.45=\"insertTime\"\r\n @keydown.46=\"insertTime\"\r\n />\r\n <GlobalEvents\r\n v-if=\"active && settingsClosed\"\r\n @keydown.left.prevent=\"arrowLeft\"\r\n @keydown.right.prevent=\"arrowRight\"\r\n @keydown.shift.page-down.prevent=\"nextLoopActivate\"\r\n @keydown.page-down.prevent=\"next\"\r\n @keydown.page-up.prevent=\"prev\"\r\n @keydown.shift.page-up.prevent=\"prevLoopActivate\"\r\n @keydown.83.prevent=\"setHourIni\"\r\n @keydown.69.prevent=\"setHourEnd\"\r\n @keydown.36.prevent=\"goToFirstFrame\"\r\n @keydown.35.prevent=\"goToLastFrame\"\r\n @keydown.71.prevent=\"dialogs.goTo = true\"\r\n @keydown.73.prevent=\"dialogs.secondsPerFrame = true\"\r\n @keydown.76.prevent=\"dialogs.frames = true\"\r\n @keydown.49.97=\"() => (secondsPerFrame = 1)\"\r\n @keydown.50.98=\"() => (secondsPerFrame = 2)\"\r\n @keydown.51.99=\"() => (secondsPerFrame = 3)\"\r\n @keydown.52.100=\"() => (secondsPerFrame = 4)\"\r\n @keydown.53.101=\"() => (secondsPerFrame = 5)\"\r\n />\r\n <GlobalEvents\r\n v-if=\"prevLoop || nextLoop\"\r\n @keydown=\"breakLoop\"\r\n v-on:click=\"breakLoop\"\r\n />\r\n <settings\r\n v-if=\"active\"\r\n :dialogs-visibility=\"dialogs\"\r\n :playback-rate=\"playbackRate\"\r\n :seconds-per-frame=\"secondsPerFrame\"\r\n :frames-per-row=\"framesPerRow\"\r\n :number-of-rows=\"numberOfRows\"\r\n @change-playback-rate=\"(value) => (playbackRate = value)\"\r\n @change-go-to=\"changeHour\"\r\n @change-seconds-per-frame=\"(value) => (secondsPerFrame = value)\"\r\n @set-frames-selection=\"setFrameSelection\"\r\n @close=\"(dialog) => (dialogs[dialog] = false)\"\r\n />\r\n <div\r\n :class=\"{ 'visualization-card': true, 'active-tab': active }\"\r\n style=\"width: 100%; padding: 0\"\r\n >\r\n <command-bar\r\n v-show=\"commandBarShow\"\r\n :video-playing=\"videoPlaying\"\r\n :video-paused=\"paused\"\r\n :insert-time=\"canInsertTime\"\r\n :hour-ini-selected=\"!!hourIniSelected\"\r\n :hour-end-selected=\"!!hourEndSelected\"\r\n @prev-loop-activate=\"prevLoopActivate\"\r\n @next-loop-activate=\"nextLoopActivate\"\r\n @prev=\"prev\"\r\n @next=\"next\"\r\n @go-to=\"dialogs.goTo = true\"\r\n @open-frame-selection=\"dialogs.frames = true\"\r\n @open-frames-per-second=\"dialogs.secondsPerFrame = true\"\r\n @open-blocks=\"openBlocks\"\r\n @open-playback-rate=\"dialogs.playbackRate = true\"\r\n @play-or-pause=\"playOrPause\"\r\n @stop-playing=\"stopPlayingBar\"\r\n @set-hour-ini=\"setHourIni\"\r\n @set-hour-end=\"setHourEnd\"\r\n @insert-time=\"insertTime\"\r\n />\r\n <video-progress\r\n v-if=\"videoProgressBar\"\r\n v-show=\"videoPlaying\"\r\n :video-time=\"videoTime\"\r\n />\r\n <info-bar\r\n :playback-rate=\"playbackRate\"\r\n :seconds-per-frame=\"secondsPerFrame\"\r\n :commands-show=\"commandBarShow\"\r\n :cache=\"useCache\"\r\n :block-start-time=\"blockStartTime\"\r\n :video-total-duration=\"videoSliderTotalDuration\"\r\n :alternative-server=\"alternativeServer\"\r\n :frames-per-row=\"framesPerRow\"\r\n :number-of-rows=\"numberOfRows\"\r\n :hour-ini=\"hourIniSelected\"\r\n :hour-end=\"hourEndSelected\"\r\n @toogle-commands-visibility=\"commandBarShow = !commandBarShow\"\r\n @toogle-cache=\"useCache = !useCache\"\r\n @change-server=\"changeServerClick\"\r\n />\r\n <div\r\n class=\"visualization-row\"\r\n v-for=\"rowNumber in numberOfRows\"\r\n :id=\"'row-' + rowNumber\"\r\n :key=\"'row-' + rowNumber\"\r\n style=\"padding: 12px\"\r\n >\r\n <div\r\n v-for=\"(frame, frameNumber) in previousFrames\"\r\n :key=\"\r\n numberOfRows +\r\n '-' +\r\n framesPerRow +\r\n '-' +\r\n getIndex(rowNumber, frameNumber, Positions.previous)\r\n \"\r\n style=\"display: none\"\r\n >\r\n <span v-html=\"frame.img\" />\r\n </div>\r\n <div\r\n v-for=\"(frame, frameNumber) in nextFrames\"\r\n :key=\"\r\n numberOfRows +\r\n '-' +\r\n framesPerRow +\r\n '-' +\r\n getIndex(rowNumber, frameNumber, Positions.next)\r\n \"\r\n style=\"display: none\"\r\n >\r\n <span v-html=\"frame.img\" />\r\n </div>\r\n <div\r\n class=\"visualization-col\"\r\n v-for=\"(frame, frameNumber) in frames.slice(\r\n framesPerRow * (rowNumber - 1),\r\n framesPerRow * rowNumber\r\n )\"\r\n :key=\"'row-' + rowNumber + '-frame-' + frameNumber\"\r\n :id=\"`frame-${getIndex(rowNumber, frameNumber, Positions.current)}`\"\r\n :class=\"{ loaderImg: !!frame.img }\"\r\n @click=\"\r\n frame.time\r\n ? selectFrame(\r\n getIndex(rowNumber, frameNumber, Positions.current),\r\n frame\r\n )\r\n : null\r\n \"\r\n >\r\n <span :id=\"activeFrame ? 'aa' : 0\" style=\"padding-left: 4px\">\r\n <b>\r\n {{\r\n getAudienceTime(\r\n frame.time,\r\n rowNumber,\r\n frameNumber,\r\n Positions.current\r\n )\r\n }}\r\n </b>\r\n </span>\r\n\r\n <frame\r\n ref=\"frames\"\r\n :frame=\"frame\"\r\n :index=\"getIndex(rowNumber, frameNumber, Positions.current)\"\r\n :grid-settings=\"{ numberOfRows, framesPerRow }\"\r\n :initialTime=\"frame.time === hourIniSelected\"\r\n :endTime=\"frame.time === hourEndSelected\"\r\n :betweenTime=\"\r\n frame.time > hourIniSelected && frame.time < hourEndSelected\r\n \"\r\n :active=\"\r\n getIndex(rowNumber, frameNumber, Positions.current) ===\r\n activeFrame\r\n \"\r\n :activeTab=\"active\"\r\n :videoUrl=\"fInterface ? fInterface.getVideoUrl(frame) : ''\"\r\n @startPlaying=\"startPlaying\"\r\n @stopPlaying=\"stopPlaying\"\r\n @playPauseStatus=\"changePlayPause\"\r\n @updateSlider=\"updateSlider\"\r\n :playback-rate=\"playbackRate\"\r\n style=\"margin: 0 auto\"\r\n ></frame>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <settings\r\n ref=\"settings2\"\r\n :active=\"active\"\r\n @goToTime=\"changeHour\"\r\n @goToBlockInterval=\"changeBlockInterval\"\r\n @setSplitTime=\"setSplitTime\"\r\n @setFrameSelection=\"setFrameSelection\"\r\n @setPlaybackRate=\"\r\n (rate) => {\r\n playbackRate = rate\r\n }\r\n \"\r\n >\r\n </settings> -->\r\n <!-- <v-dialog v-model=\"dialog\" width=\"500\">\r\n <div class=\"card\">\r\n <div class=\"card\"-title class=\"text-h5 grey lighten-2\">\r\n {{ ' Último bloco disponível até: ' }}\r\n <v-btn\r\n @click=\"goToStartBlock\"\r\n class=\"ml-2\"\r\n dark\r\n color=\"success\"\r\n depressed\r\n >\r\n <v-icon left> fa-clock </v-icon>\r\n {{ timeLastBlock }}\r\n </v-btn>\r\n <v-spacer></v-spacer>\r\n <v-btn color=\"error\" fab small class=\"ml-5\" @click=\"dialog = false\">\r\n <v-icon dark> fa fa-xmark </v-icon>\r\n </v-btn>\r\n </div-title>\r\n </div>\r\n </v-dialog>\r\n <Help :media=\"media\" @close=\"media = null\" />\r\n <v-dialog\r\n v-if=\"userMultiTabsGrid\"\r\n v-model=\"userMultiTabsGridsModel\"\r\n persistent\r\n width=\"60%\"\r\n >\r\n <div class=\"card\">\r\n <div class=\"card\"-title class=\"warning text-h5\" primary-title>\r\n <div class=\"row\" class=\"ma-0\" justify=\"center\" align=\"center\">\r\n <v-icon dark left style=\"font-size: 24px !important\">\r\n fa fa-exclamation-triangle\r\n </v-icon>\r\n <div style=\"color: white\">{{ $t('form.alert') }}</div>\r\n </div>\r\n </div-title>\r\n <div class=\"card\"-text class=\"justify-center pa-6 grey lighten-2\">\r\n <h3>\r\n {{ $t('alerts.userMultiTabsGrid') }}\r\n </h3>\r\n </div-text>\r\n <hr class=\"divider\" class=\"grey lighten-1\"></span>\r\n <div class=\"card\"-actions class=\"grey lighten-2 justify-center\">\r\n <v-btn color=\"error\" ml-5 @click=\"userMultiTabsGrid = false\">\r\n <v-icon left color=\"white\">fa fa-times</v-icon>\r\n {{ $t('form.close') }}\r\n </v-btn>\r\n </div-actions>\r\n </div>\r\n </v-dialog> -->\r\n </div>\r\n</template>\r\n<script>\r\nimport Frame from './components/Frame.vue'\r\nimport FramesInterface from './utils/FramesInterface.js'\r\nimport FramesService from './services/FramesService.js'\r\n\r\nimport Commands from './components/Commands.vue'\r\nimport Infos from './components/Infos.vue'\r\nimport VideoProgress from './components/VideoProgress.vue'\r\nimport Settings from './components/Settings.vue'\r\n\r\nconst Positions = Object.freeze({\r\n previous: 0,\r\n current: 1,\r\n next: 2,\r\n})\r\n\r\nexport default {\r\n name: 'visualization-container',\r\n props: {\r\n value: {\r\n type: Boolean,\r\n required: true,\r\n },\r\n date: {\r\n type: String,\r\n required: true,\r\n },\r\n channel: {\r\n type: Number,\r\n required: true,\r\n },\r\n startAudienceTime: {\r\n type: String,\r\n required: true,\r\n },\r\n endAudienceTime: {\r\n type: String,\r\n required: true,\r\n },\r\n videoProgressBar: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n jumpOnInsert: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n framesFormat: {\r\n type: [Number, String],\r\n default: 6,\r\n },\r\n maxSize: {\r\n type: Number,\r\n },\r\n },\r\n components: {\r\n Frame,\r\n CommandBar: Commands,\r\n InfoBar: Infos,\r\n VideoProgress,\r\n Settings,\r\n // Help,\r\n },\r\n data() {\r\n return {\r\n Positions,\r\n updatingChannel: null,\r\n dialog: false,\r\n timeLastBlock: null,\r\n alternativeServer: false,\r\n useCache: true,\r\n numberOfRows: 1,\r\n framesPerRow: 5,\r\n secondsPerFrame: 1,\r\n fInterface: null,\r\n velocity: 1,\r\n frames: [],\r\n previousFrames: [],\r\n nextFrames: [],\r\n channelCode: 0,\r\n videoPlaying: false,\r\n activeFrame: null,\r\n activeVideo: null,\r\n videoTime: 0,\r\n videoTotalTime: null,\r\n progressVideoDrag: false,\r\n hourIniSelected: false,\r\n hourEndSelected: false,\r\n canInsertTime: false,\r\n lastHeight: 0,\r\n loopInterval: null,\r\n nextLoop: false,\r\n prevLoop: false,\r\n videoSliderTotalDuration: 900,\r\n blockStartTime: null,\r\n media: null,\r\n changeServer: false,\r\n userMultiTabsGrid: false,\r\n userMultiTabsGridsModel: true,\r\n playbackRate: 1,\r\n paused: false,\r\n commandBarShow: true,\r\n dialogs: {\r\n playbackRate: false,\r\n goTo: false,\r\n secondsPerFrame: false,\r\n frames: false,\r\n },\r\n }\r\n },\r\n async created() {\r\n this.changeServer = this.serverOfFrames === 'alternative'\r\n this.alternativeServer = this.serverOfFrames === 'alternative'\r\n\r\n const settings = [\r\n {\r\n framesPerRow: 2,\r\n numberOfRows: 1,\r\n },\r\n {\r\n framesPerRow: 3,\r\n numberOfRows: 1,\r\n },\r\n {\r\n framesPerRow: 3,\r\n numberOfRows: 2,\r\n },\r\n {\r\n framesPerRow: 4,\r\n numberOfRows: 1,\r\n },\r\n {\r\n framesPerRow: 4,\r\n numberOfRows: 2,\r\n },\r\n {\r\n framesPerRow: 5,\r\n numberOfRows: 1,\r\n },\r\n {\r\n framesPerRow: 5,\r\n numberOfRows: 2,\r\n },\r\n {\r\n framesPerRow: 6,\r\n numberOfRows: 1,\r\n },\r\n {\r\n framesPerRow: 6,\r\n numberOfRows: 2,\r\n },\r\n ]\r\n\r\n const storedOnDb = settings[parseInt(this.framesFormat) - 1]\r\n this.framesPerRow = storedOnDb.framesPerRow\r\n this.numberOfRows = storedOnDb.numberOfRows\r\n\r\n await this.createFramesInterface()\r\n if (this.maxSize) {\r\n this.resize(this.maxSize, true)\r\n }\r\n },\r\n methods: {\r\n framesClicked(e) {\r\n if (e.target.id != 'insert') {\r\n this.active = true\r\n }\r\n },\r\n async goToStartBlock() {\r\n try {\r\n const d = new Date()\r\n let timestamp = Date.UTC(\r\n d.getFullYear(),\r\n d.getMonth(),\r\n d.getDate(),\r\n d.getHours(),\r\n d.getMinutes(),\r\n d.getSeconds()\r\n )\r\n\r\n const response = (\r\n await FramesService.getNextAvailableBlock({\r\n channel: this.channel,\r\n time: timestamp / 1000,\r\n })\r\n ).data\r\n\r\n this.dialog = false\r\n this.changeHour(this.convertToAudienceTime(response.data.start, ':'))\r\n } catch (err) {\r\n console.error(err)\r\n }\r\n },\r\n async checkAvailableBlock() {\r\n try {\r\n const d = new Date()\r\n let timestamp = Date.UTC(\r\n d.getFullYear(),\r\n d.getMonth(),\r\n d.getDate(),\r\n d.getHours(),\r\n d.getMinutes(),\r\n d.getSeconds()\r\n )\r\n\r\n const response = (\r\n await FramesService.getNextAvailableBlock({\r\n channel: this.channel,\r\n time: timestamp / 1000,\r\n })\r\n ).data\r\n\r\n this.timeLastBlock = this.convertToAudienceTime(response.data.end, ':')\r\n this.dialog = true\r\n if (!response.status) {\r\n this.timeLastBlock = 'N/D'\r\n }\r\n } catch (err) {\r\n console.error(err)\r\n }\r\n },\r\n updateSlider(videoStartTime, time) {\r\n // * atualizar slider se estiver fora do range definido previamente\r\n if (\r\n time < this.blockStartTime ||\r\n time > this.blockStartTime ||\r\n videoStartTime > this.blockStartTime + this.videoSliderTotalDuration\r\n ) {\r\n this.blockStartTime = videoStartTime\r\n this.videoSliderTotalDuration = 900\r\n }\r\n },\r\n nextLoopActivate() {\r\n this.breakLoop()\r\n this.loopInterval = setInterval(this.next, 40)\r\n setTimeout(() => {\r\n this.nextLoop = true\r\n }, 0)\r\n },\r\n prevLoopActivate() {\r\n this.breakLoop()\r\n this.loopInterval = setInterval(this.prev, 40)\r\n setTimeout(() => {\r\n this.prevLoop = true\r\n }, 0)\r\n },\r\n breakLoop() {\r\n clearInterval(this.loopInterval)\r\n this.loopInterval = null\r\n this.nextLoop = false\r\n this.prevLoop = false\r\n },\r\n changePlayPause(status) {\r\n this.paused = !status\r\n },\r\n resize(height = this.lastHeight) {\r\n this.lastHeight = height\r\n if (this.$refs.frames) {\r\n for (let frame of this.$refs.frames) {\r\n frame.resize(height)\r\n }\r\n }\r\n this.$emit('resized')\r\n },\r\n async goToFirstFrame() {\r\n let frames = this.$refs.frames\r\n\r\n let audienceTime = null\r\n if (frames.length > 0) {\r\n let frame = frames[0].frame\r\n audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)\r\n }\r\n // if (audienceTime) {\r\n // this.changeHour(this.getLastFirtsBlockTime(audienceTime, true))\r\n // }\r\n if (audienceTime) {\r\n const [hours, minutes, seconds] = audienceTime.split(':')\r\n const totalSeconds =\r\n parseInt(hours) * 3600 + parseInt(minutes) * 60 + parseInt(seconds)\r\n if (totalSeconds >= 9000)\r\n this.changeHour(this.getLastFirtsBlockTime(audienceTime, true))\r\n else this.changeHour(this.getLastFirtsBlockTime('02:30:00', true))\r\n }\r\n },\r\n async goToLastFrame() {\r\n let frames = this.$refs.frames\r\n let audienceTime = null\r\n if (frames.length > 0) {\r\n let frame = frames[0].frame\r\n\r\n audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)\r\n }\r\n if (audienceTime) {\r\n this.changeHour(this.getLastFirtsBlockTime(audienceTime))\r\n }\r\n },\r\n getLastFirtsBlockTime(time, first = false) {\r\n if (time.indexOf(':') !== -1) {\r\n time = time.replace(/:/g, '')\r\n }\r\n let h, m, newTime\r\n const t = time.match(/.{1,2}/g)\r\n if (t[0] && t[1]) {\r\n h = parseInt(t[0])\r\n m = parseInt(t[1])\r\n }\r\n if (h < 26) {\r\n if (m < 15)\r\n if (first) newTime = t[0] + ':00:00'\r\n else newTime = t[0] + ':14:59'\r\n else if (m < 30)\r\n if (first) newTime = t[0] + ':15:00'\r\n else newTime = t[0] + ':29:59'\r\n else if (m < 45)\r\n if (first) newTime = t[0] + ':30:00'\r\n else newTime = t[0] + ':44:59'\r\n else if (first) newTime = t[0] + ':45:00'\r\n else newTime = t[0] + ':59:59'\r\n } else {\r\n if (m < 15)\r\n if (first) newTime = '26:00:00'\r\n else newTime = '26:14:59'\r\n else {\r\n if (first) newTime = '26:15:00'\r\n else newTime = '26:29:59'\r\n }\r\n }\r\n return newTime\r\n },\r\n openBlocks() {\r\n this.$refs.settings2?.openBlocks()\r\n },\r\n playOrPause() {\r\n const array = this.$refs.frames.filter((fc) => !!fc.active)\r\n if (array.length === 1) {\r\n const frame = array[0]\r\n frame.playOrPause(this.playbackRate)\r\n }\r\n },\r\n stopPlayingBar() {\r\n for (let ref of this.$refs.frames) {\r\n if (\r\n ref.videoStatus === ref.Status.playing ||\r\n ref.videoStatus === ref.Status.paused\r\n ) {\r\n ref.stop(false)\r\n }\r\n }\r\n },\r\n async setFrameSelection(selected) {\r\n this.frames = this.loadingArray\r\n switch (parseInt(selected)) {\r\n // 2x1\r\n case 1:\r\n this.framesPerRow = 2\r\n this.numberOfRows = 1\r\n break\r\n // 3x1\r\n case 2:\r\n this.framesPerRow = 3\r\n this.numberOfRows = 1\r\n break\r\n // 3x2\r\n case 3:\r\n this.framesPerRow = 3\r\n this.numberOfRows = 2\r\n break\r\n // 4x1\r\n case 4:\r\n this.framesPerRow = 4\r\n this.numberOfRows = 1\r\n break\r\n // 4x2\r\n case 5:\r\n this.framesPerRow = 4\r\n this.numberOfRows = 2\r\n break\r\n // 5x1\r\n case 6:\r\n this.framesPerRow = 5\r\n this.numberOfRows = 1\r\n break\r\n // 5x2\r\n case 7:\r\n this.framesPerRow = 5\r\n this.numberOfRows = 2\r\n break\r\n // 6x1\r\n case 8:\r\n this.framesPerRow = 6\r\n this.numberOfRows = 1\r\n break\r\n // 6x2\r\n case 9:\r\n this.framesPerRow = 6\r\n this.numberOfRows = 2\r\n break\r\n }\r\n await this.fInterface.changeSize(this.numberOfRows, this.framesPerRow)\r\n this.getFramesArray()\r\n setTimeout(() => {\r\n for (let ref of this.$refs.frames) {\r\n ref?.resize(this.lastHeight)\r\n }\r\n }, 150)\r\n },\r\n getFramesArray() {\r\n this.frames = this.fInterface.getFrames(Positions.current)\r\n this.nextFrames = this.fInterface.getFrames(Positions.next)\r\n this.previousFrames = this.fInterface.getFrames(Positions.previous)\r\n },\r\n async createFramesInterface() {\r\n this.frames = this.loadingArray\r\n let ch = this.channel\r\n let associationTMP = {\r\n 1735073: 1,\r\n 1735074: 139,\r\n 1735075: 3,\r\n 1735076: 132,\r\n }\r\n //\r\n this.channelCode = associationTMP[ch] ? associationTMP[ch] : ch\r\n\r\n const t = this.startAudienceTime.match(/.{1,2}/g)\r\n const d = this.getDateParts()\r\n const time = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000\r\n // * iniciar slider\r\n this.blockStartTime = time\r\n this.fInterface = await new FramesInterface(\r\n this.channelCode,\r\n this.numberOfRows,\r\n this.framesPerRow,\r\n time,\r\n this.startAudienceTime,\r\n this.useCache\r\n )\r\n await this.fInterface.init()\r\n\r\n this.getFramesArray()\r\n\r\n this.activeFrame = this.getIndex(1, 0, Positions.current)\r\n\r\n this.activeVideo = null\r\n },\r\n getIndex(rowNumber, frameIndex, position) {\r\n let from = this.framesPerRow * this.numberOfRows * position\r\n let till = this.framesPerRow * this.numberOfRows * (position + 1)\r\n\r\n return (from + till * (rowNumber - 1)) / rowNumber + frameIndex\r\n },\r\n getAudienceTime(frameTime, rowNumber, frameNumber, position) {\r\n if (!frameTime) {\r\n return 'Loading...'\r\n } else if (\r\n this.getIndex(rowNumber, frameNumber, position) === this.activeVideo\r\n ) {\r\n return this.convertToAudienceTime(this.videoTime)\r\n } else {\r\n return this.convertToAudienceTime(frameTime)\r\n }\r\n },\r\n dateInUtc(miliSeconds) {\r\n var date = new Date(miliSeconds)\r\n var utc = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours(),\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n return utc\r\n },\r\n convertToAudienceTime(time, separator = ':') {\r\n const d = this.getDateParts()\r\n const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000\r\n\r\n let hour = this.dateInUtc(time * 1000)\r\n .toTimeString()\r\n .split(' ')[0]\r\n .split(':')\r\n .map(Number)\r\n\r\n if (time > limit && time <= limit + this.startAudienceSeconds) {\r\n hour[0] = 24 + hour[0]\r\n }\r\n return hour\r\n .map((part) => (part > 9 ? part.toString() : '0' + part))\r\n .join(separator)\r\n },\r\n getDateParts(date = this.date) {\r\n const d = new Date(date)\r\n return {\r\n year: d.getFullYear(),\r\n month: d.getMonth(),\r\n day: d.getDate(),\r\n }\r\n },\r\n selectFrame(index, frame) {\r\n const d = this.getDateParts()\r\n const limit = Date.UTC(d.year, d.month, d.day, 23, 59, 59) / 1000\r\n const frameTime = frame?.time\r\n\r\n if (frameTime - (this.startAudienceSeconds + limit) <= 0) {\r\n if (this.hourIniSelected === true) {\r\n this.hourIniSelected = frameTime\r\n\r\n if (\r\n this.hourEndSelected &&\r\n this.hourIniSelected > this.hourEndSelected\r\n ) {\r\n this.hourEndSelected = false\r\n }\r\n } else if (this.hourEndSelected === true) {\r\n if (frameTime > this.hourIniSelected) {\r\n this.hourEndSelected = frameTime\r\n this.canInsertTime = true\r\n } else {\r\n this.hourEndSelected = false\r\n }\r\n }\r\n }\r\n\r\n if (this.activeFrame !== index) {\r\n // ? Se clicar no frame diferente de onde está a dar play, faz pausa\r\n const array = this.$refs.frames.filter(\r\n (fc) => fc.videoStatus === fc.Status.playing\r\n )\r\n if (array.length === 1) {\r\n const frame = array[0]\r\n frame.playOrPause()\r\n }\r\n this.activeVideo = null\r\n this.activeFrame = index\r\n }\r\n },\r\n setHourIni() {\r\n this.canInsertTime = true\r\n this.hourIniSelected = true\r\n document.getElementById(`frame-${this.activeFrame}`).click()\r\n this.$emit('setHourIni', {\r\n hour_ini: this.hourIniSelected\r\n ? this.convertToAudienceTime(this.hourIniSelected, '')\r\n : null,\r\n })\r\n },\r\n setHourEnd() {\r\n this.canInsertTime = true\r\n this.hourEndSelected = true\r\n document.getElementById(`frame-${this.activeFrame}`).click()\r\n },\r\n //* Navegação\r\n arrowRight() {\r\n if (this.checkLimitRight(false)) {\r\n if (\r\n this.activeFrame ===\r\n this.numberOfRows * this.framesPerRow * 2 - 1\r\n ) {\r\n this.next()\r\n } else {\r\n this.activeFrame++\r\n }\r\n }\r\n },\r\n arrowLeft() {\r\n if (this.checkLimitLeft(false)) {\r\n if (this.activeFrame === this.numberOfRows * this.framesPerRow) {\r\n this.prev()\r\n } else {\r\n this.activeFrame--\r\n }\r\n }\r\n },\r\n checkLimitRight(value) {\r\n const hours = this.endAudienceTime.match(/.{1,2}/g)\r\n const d = this.getDateParts()\r\n const high = Date.UTC(d.year, d.month, d.day, 26, 29, 59)\r\n\r\n if (value) {\r\n return (\r\n high > (this.fInterface.getCurrentTime() - 1) * 1000 &&\r\n this.nextFrames[0].title !== -1\r\n )\r\n } else {\r\n // return high > (this.fInterface.getCurrentTime() + this.activeFrame) * 1000\r\n return high > this.fInterface.getCurrentTime() * 1000\r\n }\r\n },\r\n checkLimitLeft(value) {\r\n const hours = this.startAudienceTime.match(/.{1,2}/g)\r\n const d = this.getDateParts()\r\n const low = Date.UTC(d.year, d.month, d.day, hours[0], hours[1], hours[2])\r\n\r\n if (value) {\r\n return low <= (this.fInterface.getCurrentTime() - 1) * 1000\r\n } else {\r\n return (\r\n low <\r\n (this.fInterface.getCurrentTime() +\r\n this.activeFrame -\r\n this.numberOfRows * this.framesPerRow) *\r\n 1000\r\n )\r\n }\r\n },\r\n async next() {\r\n if (this.checkLimitRight(true)) {\r\n const array = this.$refs.frames.filter(\r\n (fc) =>\r\n fc.videoStatus === fc.Status.playing ||\r\n fc.videoStatus === fc.Status.paused\r\n )\r\n\r\n if (array.length === 1) {\r\n const frame = array[0]\r\n frame.stop(false)\r\n }\r\n this.fInterface.setCurrentStep(this.secondsPerFrame)\r\n await this.fInterface.loadNextFrames()\r\n\r\n this.activeFrame = this.getIndex(1, 0, Positions.current)\r\n this.activeVideo = null\r\n\r\n this.getFramesArray()\r\n }\r\n },\r\n async prev() {\r\n if (this.checkLimitLeft(true)) {\r\n const array = this.$refs.frames.filter(\r\n (fc) =>\r\n fc.videoStatus === fc.Status.playing ||\r\n fc.videoStatus === fc.Status.paused\r\n )\r\n if (array.length === 1) {\r\n const frame = array[0]\r\n frame.stop(false)\r\n }\r\n\r\n this.fInterface.setCurrentStep(this.secondsPerFrame)\r\n await this.fInterface.loadPrevFrames()\r\n\r\n this.activeFrame = this.getIndex(\r\n this.numberOfRows,\r\n this.framesPerRow - 1,\r\n Positions.current\r\n )\r\n this.activeVideo = null\r\n\r\n this.getFramesArray()\r\n }\r\n },\r\n async setStartTime(time) {\r\n if (time.indexOf(':') !== -1) {\r\n time = time.replace(/:/g, '')\r\n }\r\n const t = time.match(/.{1,2}/g)\r\n const d = this.getDateParts()\r\n const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000\r\n this.frames = this.loadingArray\r\n\r\n await this.fInterface.changeTime(setTime)\r\n\r\n this.getFramesArray()\r\n\r\n this.activeFrame = this.getIndex(1, 0, Positions.current)\r\n // let frames = this.$refs.frames\r\n\r\n // let audienceTime = null\r\n // if (frames.length > 0) {\r\n // let frame = frames[0].frame\r\n // audienceTime = this.getAudienceTime(frame.time, 0, 0, 0)\r\n // }\r\n\r\n this.activeVideo = null\r\n\r\n return true\r\n },\r\n hourToTimeStamp(time) {\r\n if (time.indexOf(':') !== -1) {\r\n time = time.replace(/:/g, '')\r\n }\r\n const t = time.match(/.{1,2}/g)\r\n const d = this.getDateParts()\r\n const setTime = Date.UTC(d.year, d.month, d.day, t[0], t[1], t[2]) / 1000\r\n\r\n return setTime\r\n },\r\n async changeHour(value) {\r\n if (value) {\r\n setTimeout(() => {\r\n const array = this.$refs.frames.filter(\r\n (fc) =>\r\n fc.videoStatus === fc.Status.playing ||\r\n fc.videoStatus === fc.Status.paused\r\n )\r\n\r\n if (array.length === 1) {\r\n const frame = array[0]\r\n frame.stop(false)\r\n }\r\n\r\n this.setStartTime(value, true)\r\n }, 0)\r\n }\r\n },\r\n changeBlockInterval(value) {\r\n this.changeHour(value.ini)\r\n let time_ini, time_end\r\n time_ini = this.hourToTimeStamp(value.ini)\r\n time_end = this.hourToTimeStamp(value.end)\r\n this.videoSliderTotalDuration = time_end - time_ini\r\n this.$refs.frames[0].changeSettings(time_ini)\r\n this.blockStartTime = time_ini\r\n },\r\n //eslint-disable-next-line\r\n async updateVideoTime(index, videoTime) {\r\n this.activeVideo = index\r\n this.videoTime = videoTime\r\n },\r\n //eslint-disable-next-line\r\n updateVideoStatus(currentTime) {\r\n if (!this.progressVideoDrag) {\r\n // ESTA FUNÇÃO PASSOU PARA DENTRO DOS COMMANDS\r\n // this.updateProgress(null, currentTime)\r\n }\r\n },\r\n async startPlaying(frame, totalTime) {\r\n const array = this.$refs.frames.filter(\r\n (fc) => fc.frame.time !== frame.time\r\n )\r\n\r\n for (let ref of array) {\r\n if (\r\n ref.videoStatus === ref.Status.playing ||\r\n ref.videoStatus === ref.Status.paused\r\n ) {\r\n ref.stop(false)\r\n }\r\n }\r\n\r\n this.videoTotalTime = totalTime\r\n this.videoPlaying = true\r\n },\r\n stopPlaying() {\r\n this.videoTotalTime = null\r\n this.videoPlaying = false\r\n this.paused = false\r\n },\r\n insertTime() {\r\n this.$emit('timeToInsert', {\r\n channel: this.channel,\r\n hour_ini: this.hourIniSelected\r\n ? this.convertToAudienceTime(this.hourIniSelected, '')\r\n : null,\r\n hour_end: this.hourEndSelected\r\n ? this.convertToAudienceTime(this.hourEndSelected, '')\r\n : null,\r\n force: false,\r\n })\r\n\r\n if (this.jumpOnInsert) {\r\n this.changeHour(\r\n this.convertToAudienceTime(\r\n (this.hourEndSelected || this.hourIniSelected) + 1\r\n )\r\n )\r\n }\r\n\r\n this.hourIniSelected = null\r\n this.hourEndSelected = null\r\n this.canInsertTime = false\r\n\r\n // this.fInterface.setCurrentPosition(this.hourEndSelected)\r\n },\r\n insertTimeForce() {\r\n this.$emit('timeToInsert', {\r\n channel: this.channel,\r\n hour_ini: this.hourIniSelected\r\n ? this.convertToAudienceTime(this.hourIniSelected, '')\r\n : null,\r\n hour_end: this.hourEndSelected\r\n ? this.convertToAudienceTime(this.hourEndSelected, '')\r\n : null,\r\n force: true,\r\n })\r\n\r\n this.hourIniSelected = null\r\n this.hourEndSelected = null\r\n this.canInsertTime = false\r\n\r\n // this.fInterface.setCurrentPosition(this.hourEndSelected)\r\n },\r\n async getChannelMedia() {\r\n // this.media = (await ChannelService.show(this.channel)).data.MEDIA\r\n },\r\n async changeServerClick() {\r\n this.changeServer = !this.changeServer\r\n // this.$store.dispatch(\r\n // 'serverOfFrames',\r\n // this.changeServer ? 'alternative' : 'default'\r\n // )\r\n sessionStorage.setItem(\r\n 'serverOfFrames',\r\n this.changeServer ? 'alternative' : 'default'\r\n )\r\n\r\n // if (this.$route.params.time != this.frames[0].time)\r\n // this.$router.push({\r\n // name: 'grid',\r\n // params: {\r\n // date: this.date,\r\n // channel: this.channelCode,\r\n // time: this.frames[0].time,\r\n // },\r\n // })\r\n location.reload()\r\n },\r\n },\r\n computed: {\r\n active: {\r\n get() {\r\n return this.value\r\n },\r\n set(value) {\r\n this.$emit('input', value)\r\n },\r\n },\r\n settingsClosed() {\r\n return !Object.values(this.dialogs).find((v) => v)\r\n },\r\n startAudienceSeconds() {\r\n const t = this.startAudienceTime.match(/.{1,2}/g)\r\n return parseInt(t[0] * 3600 + t[1] * 60 + t[2])\r\n },\r\n loadingArray() {\r\n return Array.from(Array(this.numberOfRows * this.framesPerRow).keys())\r\n },\r\n serverOfFrames() {\r\n return sessionStorage.getItem('server')\r\n },\r\n },\r\n watch: {\r\n secondsPerFrame(value) {\r\n let frames = this.$refs.frames\r\n let initialTime = null\r\n let audienceTime = null\r\n if (frames.length > 0) {\r\n let frame = frames[0].frame\r\n\r\n if (initialTime === null) {\r\n initialTime = frame.time\r\n }\r\n if (value <= 5) {\r\n let newAudienceTime = initialTime + value\r\n audienceTime = this.getAudienceTime(newAudienceTime, 0, 0, 0)\r\n this.changeHour(audienceTime)\r\n this.next()\r\n }\r\n }\r\n },\r\n framesFormat(value) {\r\n this.setFrameSelection(value)\r\n },\r\n active() {\r\n // ? sempre que trocamos de tabs dar reset as horas selected\r\n this.hourIniSelected = false\r\n this.hourEndSelected = false\r\n },\r\n useCache() {\r\n this.createFramesInterface()\r\n },\r\n hourIniSelected(value) {\r\n if (value) {\r\n sessionStorage.setItem(\r\n 'currentTimeFrames',\r\n this.convertToAudienceTime(this.hourIniSelected, '')\r\n )\r\n } else {\r\n sessionStorage.removeItem('currentTimeFrames')\r\n }\r\n },\r\n activeFrame(value) {\r\n if (value) {\r\n this.stopPlayingBar()\r\n }\r\n },\r\n channel() {\r\n this.updatingChannel = new Promise((resolve, reject) => {\r\n try {\r\n this.createFramesInterface()\r\n resolve(true)\r\n } catch (err) {\r\n reject(err)\r\n }\r\n })\r\n },\r\n },\r\n}\r\n</script>\r\n<style scoped>\r\n.visualization-row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n flex: 1 1 auto;\r\n}\r\n\r\n.visualization-col {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n}\r\n\r\n.visualization-divider {\r\n display: block;\r\n flex: 1 1 100%;\r\n height: 0px;\r\n max-height: 0px;\r\n opacity: 1;\r\n transition: inherit;\r\n border-style: solid;\r\n border-width: thin 0 0 0;\r\n border-color: rgba(0, 0, 0, 0.12);\r\n margin: 0;\r\n}\r\n\r\n.visualization-divider.vertical {\r\n align-self: stretch;\r\n border-width: 0 thin 0 0;\r\n display: inline-flex;\r\n height: inherit;\r\n margin-left: -1px;\r\n max-height: 100%;\r\n max-width: 0px;\r\n vertical-align: text-bottom;\r\n width: 0px;\r\n}\r\n\r\n.visualization-card {\r\n flex-basis: 0;\r\n flex-grow: 1;\r\n max-width: 100%;\r\n padding: 12px;\r\n width: 100%;\r\n transition-property: box-shadow, opacity, -webkit-box-shadow;\r\n overflow-wrap: break-word;\r\n /*box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);*/\r\n}\r\n\r\n.visualization-justify-center,\r\n/deep/ .visualization-justify-center {\r\n justify-content: center;\r\n}\r\n\r\n.visualization-align-center {\r\n align-items: center;\r\n}\r\n\r\n#visualization-container {\r\n max-width: 100% !important;\r\n margin: 0 auto !important;\r\n height: 100%;\r\n border-bottom: none;\r\n}\r\n#visualization-container > .card {\r\n border-radius: 0 !important;\r\n font-size: 12px;\r\n width: 100%;\r\n box-shadow: none;\r\n height: 100%;\r\n}\r\n\r\n#command-bar,\r\n#info-bar {\r\n background-color: #f5f5f5;\r\n box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 5px 0 rgba(0, 0, 0, 0.12);\r\n}\r\n#command-bar button {\r\n width: 42px;\r\n height: 36px;\r\n border: none;\r\n background: none;\r\n}\r\n\r\n#command-bar button:hover {\r\n cursor: pointer;\r\n background: rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n#command-bar svg {\r\n font-size: 16px;\r\n}\r\n\r\n#command-bar {\r\n padding: 0 !important;\r\n}\r\n\r\n#info-bar {\r\n padding: 4px;\r\n font-size: 14px;\r\n position: relative;\r\n}\r\n\r\n.settings-container {\r\n position: absolute;\r\n right: 14px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n}\r\n\r\n.settings-container > * {\r\n margin: 0 2px;\r\n cursor: pointer;\r\n}\r\n\r\n#info-bar svg {\r\n font-size: 16px;\r\n}\r\n\r\n#info-bar .divider {\r\n margin: 0 8px;\r\n}\r\n\r\nsvg:focus {\r\n border: none;\r\n}\r\n\r\n.visualization-card {\r\n border-left: 8px solid #eee;\r\n}\r\n\r\n.active-tab {\r\n border-left: 8px solid var(--visualization-primary) !important;\r\n border-image-slice: 1;\r\n}\r\n\r\n[id^='frame-'] {\r\n padding: 1px;\r\n display: flex;\r\n flex-flow: column;\r\n}\r\n\r\n.tooltip {\r\n display: block !important;\r\n z-index: 10000;\r\n}\r\n\r\n.tooltip .tooltip-inner {\r\n background: var(--visualization-primary);\r\n color: white;\r\n border-radius: 16px;\r\n padding: 5px 10px 4px;\r\n}\r\n\r\n.tooltip .tooltip-arrow {\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n position: absolute;\r\n margin: 5px;\r\n border-color: var(--visualization-primary);\r\n z-index: 1;\r\n}\r\n\r\n.tooltip[x-placement^='top'] {\r\n margin-bottom: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='top'] .tooltip-arrow {\r\n border-width: 5px 5px 0 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n bottom: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\n\r\n.tooltip[x-placement^='bottom'] {\r\n margin-top: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='bottom'] .tooltip-arrow {\r\n border-width: 0 5px 5px 5px;\r\n border-left-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-top-color: transparent !important;\r\n top: -5px;\r\n left: calc(50% - 5px);\r\n margin-top: 0;\r\n margin-bottom: 0;\r\n}\r\n\r\n.tooltip[x-placement^='right'] {\r\n margin-left: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='right'] .tooltip-arrow {\r\n border-width: 5px 5px 5px 0;\r\n border-left-color: transparent !important;\r\n border-top-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n left: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\r\n}\r\n\r\n.tooltip[x-placement^='left'] {\r\n margin-right: 5px;\r\n}\r\n\r\n.tooltip[x-placement^='left'] .tooltip-arrow {\r\n border-width: 5px 0 5px 5px;\r\n border-top-color: transparent !important;\r\n border-right-color: transparent !important;\r\n border-bottom-color: transparent !important;\r\n right: -5px;\r\n top: calc(50% - 5px);\r\n margin-left: 0;\r\n margin-right: 0;\r\n}\r\n\r\n.tooltip.popover .popover-inner {\r\n background: #f9f9f9;\r\n color: black;\r\n padding: 24px;\r\n border-radius: 5px;\r\n box-shadow: 0 5px 30px rgba(black, 0.1);\r\n}\r\n\r\n.tooltip.popover .popover-arrow {\r\n border-color: #f9f9f9;\r\n}\r\n\r\n.tooltip[aria-hidden='true'] {\r\n visibility: hidden;\r\n opacity: 0;\r\n transition: opacity 0.15s, visibility 0.15s;\r\n}\r\n\r\n.tooltip[aria-hidden='false'] {\r\n visibility: visible;\r\n opacity: 1;\r\n transition: opacity 0.15s;\r\n}\r\n</style>\r\n"]}, media: undefined });
4483
4492
 
4484
4493
  };
4485
4494
  /* scoped */
4486
- const __vue_scope_id__ = "data-v-4a1abe45";
4495
+ const __vue_scope_id__ = "data-v-09946f69";
4487
4496
  /* module identifier */
4488
4497
  const __vue_module_identifier__ = undefined;
4489
4498
  /* functional template */