From 48233ea9afc00ddb9aea0492ffb415f62856bd9f Mon Sep 17 00:00:00 2001 From: Gustavo274 Date: Fri, 8 Oct 2021 10:46:50 -0300 Subject: [PATCH] =?UTF-8?q?Cr=C3=B4nometro=20personalizado=20com=20nome=20?= =?UTF-8?q?est=C3=A1titco?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/__apps/painel/main.js | 72 ++++++++++++++++++++++++++++-- sapl/base/forms.py | 2 + sapl/base/models.py | 5 +++ sapl/painel/tasks.py | 2 + sapl/painel/views.py | 13 ++++++ sapl/sessao/views.py | 8 +++- sapl/templates/base/layouts.yaml | 1 + sapl/templates/painel/index.html | 5 ++- sapl/templates/sessao/painel.html | 59 ++++++++++++++++++++++++ 9 files changed, 161 insertions(+), 6 deletions(-) diff --git a/frontend/src/__apps/painel/main.js b/frontend/src/__apps/painel/main.js index 0e1aba292..9f655736e 100644 --- a/frontend/src/__apps/painel/main.js +++ b/frontend/src/__apps/painel/main.js @@ -10,10 +10,12 @@ var time_d = null var time_o = null var time_a = null var time_c = null +var time_p = null var timeEnd_o = null var timeEnd_d = null var timeEnd_a = null var timeEnd_c = null +var timeEnd_p = null var audioAlertFinish = document.getElementById('audio') var cronometroStart = [] var started = [] @@ -35,6 +37,7 @@ const v = new Vue({ // eslint-disable-line cronometro_aparte: '', cronometro_ordem: '', cronometro_consideracoes: '', + cronometro_personalizado: '', sessao_solene: false, sessao_solene_tema: '', presentes: [], @@ -57,7 +60,8 @@ const v = new Vue({ // eslint-disable-line status_cronometro_discurso: '', status_cronometro_aparte: '', status_cronometro_ordem: '', - status_cronometro_consideracoes: '' + status_cronometro_consideracoes: '', + status_cronometro_personalizado: '' } }, methods: { @@ -127,6 +131,7 @@ const v = new Vue({ // eslint-disable-line this.status_cronometro_ordem = objeto.status_cronometro_ordem this.status_cronometro_aparte = objeto.status_cronometro_aparte this.status_cronometro_consideracoes = objeto.status_cronometro_consideracoes + this.status_cronometro_personalizado = objeto.status_cronometro_personalizado this.presentes = objeto.presentes this.presentes.forEach(parlamentar => { @@ -155,11 +160,13 @@ const v = new Vue({ // eslint-disable-line cronometroStart[1] = objeto.cronometro_aparte cronometroStart[2] = objeto.cronometro_ordem cronometroStart[3] = objeto.cronometro_consideracoes + cronometroStart[4] = objeto.cronometro_personalizado this.running[0] = 0 this.running[1] = 0 this.running[2] = 0 this.running[3] = 0 + this.running[4] = 0 // Status cronometro if (this.status_cronometro_discurso === 'S') { @@ -186,6 +193,12 @@ const v = new Vue({ // eslint-disable-line this.start(4) } + if (this.status_cronometro_personalizado === 'S') { + this.stop(5) + } else if (this.status_cronometro_personalizado === 'I') { + this.start(5) + } + // Setar os timers no caso de nulo ou resetado if (time_d === null || this.status_cronometro_discurso === 'R') { this.setTimer(1) @@ -203,17 +216,22 @@ const v = new Vue({ // eslint-disable-line this.setTimer(4) this.stop(4) } + if (time_p === null || this.status_cronometro_personalizado === 'R') { + this.setTimer(5) + this.stop(5) + } }, setTimer (temp_crono) { var temp var res var now - if (temp_crono === 5) { + if (temp_crono === 6) { // Pegar data atual this.cronometro_discurso = new Date() this.cronometro_aparte = this.cronometro_discurso this.cronometro_ordem = this.cronometro_discurso this.cronometro_consideracoes = this.cronometro_discurso + this.cronometro_personalizado = this.cronometro_discurso // Setar cada Cronometro temp = new Date() @@ -239,6 +257,12 @@ const v = new Vue({ // eslint-disable-line res = new Date(temp - this.cronometro_consideracoes) res.setHours(temp.getHours() - this.cronometro_consideracoes.getHours()) this.cronometro_consideracoes = this.formatTime(res) + + temp = new Date() + temp.setSeconds(this.cronometro_personalizado.getSeconds() + cronometroStart[4]) + res = new Date(temp - this.cronometro_personalizado) + res.setHours(temp.getHours() - this.cronometro_personalizado.getHours()) + this.cronometro_personalizado = this.formatTime(res) } else { now = new Date() switch (temp_crono) { @@ -273,6 +297,14 @@ const v = new Vue({ // eslint-disable-line res = new Date(temp - now) res.setHours(cronometroStart[3] / 3600) this.cronometro_consideracoes = this.formatTime(res) + break + case 5: + time_p = null + temp = new Date() + temp.setSeconds(now.getSeconds() + cronometroStart[4]) + res = new Date(temp - now) + res.setHours(cronometroStart[4] / 3600) + this.cronometro_personalizado = this.formatTime(res) } } }, @@ -290,7 +322,7 @@ const v = new Vue({ // eslint-disable-line return tempo }, stop: function stop (crono) { - if (crono === 5) { + if (crono === 6) { audioAlertFinish.play() } else { this.running[crono - 1] = 0 @@ -367,6 +399,23 @@ const v = new Vue({ // eslint-disable-line }, 5000) } break + case 5: + if (this.status_cronometro_personalizado !== 'I') return + var now_p = new Date() + time_p = new Date(timeEnd_p - now_p) + + // Definir propriamento o tempo + time_p.setHours((time_p.getTime() / 1000) / 3600) + + if (timeEnd_p > now_p) { + this.cronometro_personalizado = this.formatTime(time_p) + } else { + audioAlertFinish.play() + this.alert = setTimeout(() => { + this.reset() + }, 5000) + } + break } }, start: function startStopWatch (temp_crono) { @@ -441,6 +490,23 @@ const v = new Vue({ // eslint-disable-line this.clockRunning(temp_crono) }, 50) break + case 5: + if (time_p === null) { + time_p = cronometroStart[4] + timeEnd_p = new Date() + timeEnd_p.setSeconds(timeEnd_p.getSeconds() + time_p) + } else { + timeEnd_p = new Date() + timeEnd_p.setHours(timeEnd_p.getHours() + time_p.getHours()) + timeEnd_p.setMinutes(timeEnd_p.getMinutes() + time_p.getMinutes()) + timeEnd_p.setSeconds(timeEnd_p.getSeconds() + time_p.getSeconds()) + } + this.running[4] = 1 + + started[4] = setInterval(() => { + this.clockRunning(temp_crono) + }, 50) + break } } }, diff --git a/sapl/base/forms.py b/sapl/base/forms.py index 1dd54e3a7..eea75c33f 100644 --- a/sapl/base/forms.py +++ b/sapl/base/forms.py @@ -1556,6 +1556,7 @@ class ConfiguracoesAppForm(ModelForm): 'cronometro_aparte', 'cronometro_ordem', 'cronometro_consideracoes', + 'cronometro_personalizado', 'mostrar_brasao_painel', 'receber_recibo_proposicao', 'assinatura_ata', @@ -1573,6 +1574,7 @@ class ConfiguracoesAppForm(ModelForm): self.fields['cronometro_aparte'].widget.attrs['class'] = 'cronometro' self.fields['cronometro_ordem'].widget.attrs['class'] = 'cronometro' self.fields['cronometro_consideracoes'].widget.attrs['class'] = 'cronometro' + self.fields['cronometro_personalizado'].widget.attrs['class'] = 'cronometro' def clean(self): cleaned_data = super().clean() diff --git a/sapl/base/models.py b/sapl/base/models.py index fb2a3bd66..6c047fced 100644 --- a/sapl/base/models.py +++ b/sapl/base/models.py @@ -168,6 +168,11 @@ class AppConfig(models.Model): blank=True, null=True) + cronometro_personalizado = models.DurationField( + verbose_name=_('Cronômetro Personalizado'), + blank=True, + null=True) + mostrar_brasao_painel = models.BooleanField( default=False, verbose_name=_('Mostrar brasão da Casa no painel?')) diff --git a/sapl/painel/tasks.py b/sapl/painel/tasks.py index 6c72fba4c..ccc52112b 100644 --- a/sapl/painel/tasks.py +++ b/sapl/painel/tasks.py @@ -7,4 +7,6 @@ channel_layer = get_channel_layer() def get_dados_painel_final(id): json_data = views.get_dados_painel(id) + print(json_data) + print('\n') async_to_sync(channel_layer.group_send)('painel', {'type':'send_data', 'message': json_data}) diff --git a/sapl/painel/views.py b/sapl/painel/views.py index dca958c1b..38ef8f719 100644 --- a/sapl/painel/views.py +++ b/sapl/painel/views.py @@ -372,6 +372,9 @@ def get_cronometro_status(request): elif tipo == 4: sessao.status_cronometro_consideracoes_finais = 'I' + elif tipo == 5: + sessao.status_cronometro_personalizado = 'I' + elif ligado == 2: if tipo == 1: sessao.status_cronometro_discurso = 'S' @@ -384,6 +387,9 @@ def get_cronometro_status(request): elif tipo == 4: sessao.status_cronometro_consideracoes_finais = 'S' + + elif tipo == 5: + sessao.status_cronometro_personalizado = 'S' elif ligado == 3: if tipo == 1: @@ -397,6 +403,9 @@ def get_cronometro_status(request): elif tipo == 4: sessao.status_cronometro_consideracoes_finais = 'R' + + elif tipo == 5: + sessao.status_cronometro_personalizado = 'R' sessao.save() tasks.get_dados_painel_final(pk) @@ -412,6 +421,8 @@ def get_cronometro_value(name): result = ConfiguracoesAplicacao.objects.first().cronometro_ordem if name == 'consideracoes': result = ConfiguracoesAplicacao.objects.first().cronometro_consideracoes + if name == 'personalizado': + result = ConfiguracoesAplicacao.objects.first().cronometro_personalizado return result.total_seconds() @@ -628,10 +639,12 @@ def get_dados_painel(pk): 'status_cronometro_aparte': sessao.status_cronometro_aparte, 'status_cronometro_ordem': sessao.status_cronometro_ordem_do_dia, 'status_cronometro_consideracoes': sessao.status_cronometro_consideracoes_finais, + 'status_cronometro_personalizado': sessao.status_cronometro_personalizado, 'cronometro_aparte': get_cronometro_value('aparte'), 'cronometro_discurso': get_cronometro_value('discurso'), 'cronometro_ordem': get_cronometro_value('ordem'), 'cronometro_consideracoes': get_cronometro_value('consideracoes'), + 'cronometro_personalizado': get_cronometro_value('personalizado'), 'status_painel': sessao.painel_aberto, 'brasao': brasao } diff --git a/sapl/sessao/views.py b/sapl/sessao/views.py index f2bb0cc7b..c1f4e39be 100755 --- a/sapl/sessao/views.py +++ b/sapl/sessao/views.py @@ -1404,9 +1404,11 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): cronometro_ordem = AppsAppConfig.attr('cronometro_ordem') cronometro_consideracoes = AppsAppConfig.attr( 'cronometro_consideracoes') + cronometro_personalizado = AppsAppConfig.attr( + 'cronometro_personalizado') if (not cronometro_discurso or not cronometro_aparte - or not cronometro_ordem or not cronometro_consideracoes): + or not cronometro_ordem or not cronometro_consideracoes or not cronometro_personalizado): username = self.request.user.username self.logger.error('user=' + username + '. Você precisa primeiro configurar os cronômetros' @@ -1421,6 +1423,7 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): cronometro_aparte = cronometro_aparte.seconds cronometro_ordem = cronometro_ordem.seconds cronometro_consideracoes = cronometro_consideracoes.seconds + cronometro_personalizado = cronometro_personalizado.seconds sessao_pk = kwargs['pk'] sessao = SessaoPlenaria.objects.get(pk=sessao_pk) @@ -1433,7 +1436,8 @@ class PainelView(PermissionRequiredForAppCrudMixin, TemplateView): 'cronometro_discurso': cronometro_discurso, 'cronometro_aparte': cronometro_aparte, 'cronometro_ordem': cronometro_ordem, - 'cronometro_consideracoes': cronometro_consideracoes}) + 'cronometro_consideracoes': cronometro_consideracoes, + 'cronometro_personalizado' : cronometro_personalizado}) tipo_sessao = sessao.tipo if tipo_sessao.nome == "Solene": diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index 658eb8e17..69063368c 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -59,6 +59,7 @@ AppConfig: {% trans 'Módulo Painel' %}: - cronometro_discurso cronometro_aparte - cronometro_ordem cronometro_consideracoes + - cronometro_personalizado - mostrar_brasao_painel {% trans 'Segurança' %}: diff --git a/sapl/templates/painel/index.html b/sapl/templates/painel/index.html index 70a9ca1c5..1156cb329 100644 --- a/sapl/templates/painel/index.html +++ b/sapl/templates/painel/index.html @@ -131,7 +131,10 @@
Considerações Finais: [[ cronometro_consideracoes ]] - +
+ + Personalizado: [[ cronometro_personalizado ]] +
diff --git a/sapl/templates/sessao/painel.html b/sapl/templates/sessao/painel.html index cb3df08ef..4f0ddc065 100644 --- a/sapl/templates/sessao/painel.html +++ b/sapl/templates/sessao/painel.html @@ -91,6 +91,22 @@


+
+

Cronômetro Personalizado

+
+ +
+
+
+
+ +
+
+
+
+
+

+
@@ -300,6 +316,49 @@ $(function() { $('#consideracoes').runner('reset'); }); + $('#personalizado').runner({ + autostart: false, + countdown: true, + startAt: {{cronometro_personalizado}} * 1000, + stopAt: 0, + milliseconds: false, + format: function(value) { + let h = Math.floor((value/1000) / 3600); + h = checkTime(h); + let m = Math.floor((value/1000) % 3600 / 60); + m = checkTime(m); + let s = Math.floor((value/1000) % 3600 % 60); + s = checkTime(s); + return h.toString() + ":" + m.toString() + ":" + s.toString(); + } + }).on('runnerFinish', function(eventObject, info){ + $.get('/painel/cronometro', { tipo: 'personalizado', action: 'stop' } ); + audioAlertFinish.play(); + $('#personalizadoReset').show(); + $('#personalizado').runner('stop'); + $('#personalizadoStart').text('Iniciar'); + + + }); + + $('#personalizadoStart').click(function(){ + $.get('/painel/cronometro', { tipo: 'personalizado', action: 'start' } ); + $('#personalizado').runner('start'); + }); + + $('#personalizadoStop').click(function(){ + $.get('/painel/cronometro', { tipo: 'personalizado', action: 'stop' } ); + $('#personalizado').runner('stop'); + }); + + $('#personalizadoReset').click(function() { + + $.get('/painel/cronometro', { tipo: 'personalizado', action: 'reset' } ); + + $('#personalizado').runner('stop'); + $('#personalizado').runner('reset'); + }); + }); function switch_painel(aberto) {