Browse Source

implement create e update Nota

pull/10/head
LeandroRoberto 9 years ago
parent
commit
4766497356
  1. 116
      compilacao/forms.py
  2. 24
      compilacao/migrations/0025_auto_20151122_1744.py
  3. 28
      compilacao/migrations/0026_auto_20151122_1756.py
  4. 20
      compilacao/models.py
  5. 12
      compilacao/urls.py
  6. 132
      compilacao/views.py
  7. 3
      sapl/settings.py
  8. BIN
      static/img/down_arrow_select.jpg
  9. BIN
      static/img/hand-note.png
  10. 244
      static/js/compilacao.js
  11. 254
      static/js/compilacao_edit.js
  12. 91
      static/js/compilacao_notas.js
  13. 40
      static/js/compilacao_view.js
  14. 300
      static/styles/compilacao.scss
  15. 1
      templates/compilacao/edit.html
  16. 13
      templates/compilacao/edit_bloco.html
  17. 62
      templates/compilacao/index.html
  18. 67
      templates/compilacao/index_bloco.html
  19. 2
      templates/compilacao/index_bloco_alteracao.html
  20. 3
      templates/compilacao/nota_ajaxform.html

116
compilacao/forms.py

@ -1,8 +1,124 @@
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Fieldset, ButtonHolder, Submit, Field,\
Div, Column, Row, Hidden, Button
from django import forms from django import forms
from django.core.urlresolvers import reverse
from django.forms.models import ModelForm
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from compilacao.models import Nota, TipoNota, Dispositivo
import sapl
class UpLoadImportFileForm(forms.Form): class UpLoadImportFileForm(forms.Form):
import_file = forms.FileField( import_file = forms.FileField(
required=True, required=True,
label=_('Arquivo formato ODF para Importanção')) label=_('Arquivo formato ODF para Importanção'))
def get_tipos_nota():
return [(t.id, t.sigla + ' - ' + t.nome) for t in TipoNota.objects.all()]
class NotaForm(ModelForm):
NPRIV = 1
NSTRL = 2
NINST = 3
NPUBL = 4
PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility.
(NPRIV, _('Nota Privada')),
# All of the same group have visibility.
(NSTRL, _('Nota Setorial')),
# All authenticated users have visibility.
(NINST, _('Nota Institucional')),
# All users have visibility.
(NPUBL, _('Nota Pública')),
)
titulo = forms.CharField(label=' ', required=False)
texto = forms.CharField(label='', widget=forms.Textarea)
url_externa = forms.URLField(label='', required=False)
publicidade = forms.ChoiceField(
required=True,
label='Publicidade',
choices=PUBLICIDADE_CHOICES,
widget=forms.Select(attrs={'class': 'selector'}))
tipo = forms.ModelChoiceField(
required=False,
label='Tipo da Nota',
queryset=TipoNota.objects.all(),
empty_label=None)
publicacao = forms.DateField(label=u'Publicação',
input_formats=['%d/%m/%Y'],
required=True,
widget=forms.DateInput(
format='%d/%m/%Y'))
efetividade = forms.DateField(label=u'Efetividade',
input_formats=['%d/%m/%Y'],
required=True,
widget=forms.DateInput(
format='%d/%m/%Y'))
dispositivo = forms.ModelChoiceField(queryset=Dispositivo.objects.all(),
widget=forms.HiddenInput())
pk = forms.IntegerField(widget=forms.HiddenInput(),
required=False)
class Meta:
model = Nota
fields = ['titulo',
'texto',
'url_externa',
'publicidade',
'publicacao',
'efetividade',
'tipo',
'dispositivo',
'pk'
]
def __init__(self, *args, **kwargs):
row1 = sapl.layout.to_row([
('tipo', 4),
])
row1.append(
Column(
Field(
'titulo',
placeholder=_('Título da Nota (opcional)')
),
css_class='columns large-8'))
row3 = sapl.layout.to_row([
('publicidade', 3),
('publicacao', 3),
('efetividade', 3),
(Button('submit', 'Salvar',
css_class='button primary'), 3)
])
self.helper = FormHelper()
self.helper.layout = Layout(
row1,
Field('texto', placeholder=_('Adicionar Nota')),
Field('url_externa', placeholder=_('URL Externa (opcional)')),
row3
)
kwargs.pop('norma_id')
dispositivo_id = kwargs.pop('dispositivo_id')
if 'pk' in kwargs:
pk = kwargs.pop('pk')
else:
pk = ''
super(NotaForm, self).__init__(*args, **kwargs)
self.fields['dispositivo'].initial = dispositivo_id
if pk:
self.fields['pk'].initial = pk

24
compilacao/migrations/0025_auto_20151122_1744.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0024_auto_20151120_1814'),
]
operations = [
migrations.RenameField(
model_name='nota',
old_name='efetifidade',
new_name='efetividade',
),
migrations.AlterField(
model_name='nota',
name='dispositivo',
field=models.ForeignKey(to='compilacao.Dispositivo', related_name='notas', verbose_name='Dispositivo da Nota'),
),
]

28
compilacao/migrations/0026_auto_20151122_1756.py

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0025_auto_20151122_1744'),
]
operations = [
migrations.AlterModelOptions(
name='nota',
options={'verbose_name': 'Nota', 'ordering': ['publicacao'], 'verbose_name_plural': 'Notas'},
),
migrations.AddField(
model_name='nota',
name='titulo',
field=models.CharField(verbose_name='Título', max_length=100, default=''),
),
migrations.AlterField(
model_name='nota',
name='texto',
field=models.TextField(verbose_name='Texto'),
),
]

20
compilacao/models.py

@ -256,7 +256,7 @@ class TipoDispositivo(BaseModel):
return self.nome return self.nome
def permitido_inserir_in( def permitido_inserir_in(
self, base, include_relative_autos=True, perfil_pk=None): self, pai_relativo, include_relative_autos=True, perfil_pk=None):
if not perfil_pk: if not perfil_pk:
perfis = PerfilEstruturalTextosNormativos.objects.filter( perfis = PerfilEstruturalTextosNormativos.objects.filter(
@ -267,7 +267,7 @@ class TipoDispositivo(BaseModel):
perfil_pk = perfis[0].pk perfil_pk = perfis[0].pk
pp = self.possiveis_pais.filter(pai=base, perfil_id=perfil_pk) pp = self.possiveis_pais.filter(pai=pai_relativo, perfil_id=perfil_pk)
if pp.exists(): if pp.exists():
if not include_relative_autos: if not include_relative_autos:
if pp[0].filho_de_insercao_automatica: if pp[0].filho_de_insercao_automatica:
@ -1051,6 +1051,7 @@ class Nota(TimestampedMixin):
NSTRL = 2 NSTRL = 2
NINST = 3 NINST = 3
NPUBL = 4 NPUBL = 4
PUBLICIDADE_CHOICES = ( PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility. # Only the owner of the note has visibility.
(NPRIV, _('Nota Privada')), (NPRIV, _('Nota Privada')),
@ -1062,19 +1063,25 @@ class Nota(TimestampedMixin):
(NPUBL, _('Nota Pública')), (NPUBL, _('Nota Pública')),
) )
texto = models.TextField(verbose_name=_('Texto da Nota')) titulo = models.CharField(
verbose_name=_('Título'),
max_length=100,
default='',
blank=True)
texto = models.TextField(verbose_name=_('Texto'))
url_externa = models.CharField( url_externa = models.CharField(
max_length=1024, max_length=1024,
blank=True, blank=True,
verbose_name=_('Url externa')) verbose_name=_('Url externa'))
publicacao = models.DateTimeField(verbose_name=_('Data de Publicação')) publicacao = models.DateTimeField(verbose_name=_('Data de Publicação'))
efetifidade = models.DateTimeField(verbose_name=_('Data de Efeito')) efetividade = models.DateTimeField(verbose_name=_('Data de Efeito'))
tipo = models.ForeignKey(TipoNota, verbose_name=_('Tipo da Nota')) tipo = models.ForeignKey(TipoNota, verbose_name=_('Tipo da Nota'))
dispositivo = models.ForeignKey( dispositivo = models.ForeignKey(
Dispositivo, Dispositivo,
verbose_name=_('Dispositivo da Nota')) verbose_name=_('Dispositivo da Nota'),
related_name='notas')
owner = models.ForeignKey(User, verbose_name=_('Dono da Nota')) owner = models.ForeignKey(User, verbose_name=_('Dono da Nota'))
publicidade = models.PositiveSmallIntegerField( publicidade = models.PositiveSmallIntegerField(
@ -1084,9 +1091,10 @@ class Nota(TimestampedMixin):
class Meta: class Meta:
verbose_name = _('Nota') verbose_name = _('Nota')
verbose_name_plural = _('Notas') verbose_name_plural = _('Notas')
ordering = ['-publicacao', '-modified']
def __str__(self): def __str__(self):
return '%s: %s' % ( return '%s: %s' % (
self.tipo, self.tipo,
self.PUBLICIDADE_CHOICES[self.publicidade][1] self.get_publicidade_display()
) )

12
compilacao/urls.py

@ -22,6 +22,18 @@ urlpatterns_compilacao = [
url(r'^(?P<norma_id>[0-9]+)/compilacao/(?P<dispositivo_id>[0-9]+)/actions', url(r'^(?P<norma_id>[0-9]+)/compilacao/(?P<dispositivo_id>[0-9]+)/actions',
views.ActionsEditView.as_view(), name='dispositivo_actions'), views.ActionsEditView.as_view(), name='dispositivo_actions'),
url(r'^(?P<norma_id>[0-9]+)/compilacao/'
'(?P<dispositivo_id>[0-9]+)/nota/create$',
views.NotasCreateView.as_view(), name='nota_create'),
url(r'^(?P<norma_id>[0-9]+)/compilacao/'
'(?P<dispositivo_id>[0-9]+)/nota/(?P<pk>[0-9]+)/edit$',
views.NotasEditView.as_view(), name='nota_edit'),
url(r'^(?P<norma_id>[0-9]+)/compilacao/'
'(?P<dispositivo_id>[0-9]+)/nota/delete$',
views.NotasDeleteView.as_view(), name='nota_delete'),
] ]
urlpatterns = [ urlpatterns = [

132
compilacao/views.py

@ -2,24 +2,29 @@ from collections import OrderedDict
from datetime import datetime, timedelta from datetime import datetime, timedelta
from os.path import sys from os.path import sys
from django.contrib.auth.models import User
from django.core.signing import Signer from django.core.signing import Signer
from django.core.urlresolvers import reverse
from django.db.models import Q from django.db.models import Q
from django.http.response import JsonResponse from django.http.response import JsonResponse, HttpResponse
from django.shortcuts import render from django.shortcuts import render
from django.utils.dateparse import parse_date from django.utils.dateparse import parse_date
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from django.views.generic.edit import FormMixin from django.views.generic.edit import FormMixin, UpdateView
from django.views.generic.list import ListView from django.views.generic.list import ListView
from vanilla.model_views import CreateView
from compilacao import forms
from compilacao.file2dispositivo import Parser from compilacao.file2dispositivo import Parser
from compilacao.forms import UpLoadImportFileForm from compilacao.forms import NotaForm
from compilacao.models import (Dispositivo, PerfilEstruturalTextosNormativos, from compilacao.models import (Dispositivo, PerfilEstruturalTextosNormativos,
TipoDispositivo, TipoNota, TipoPublicacao, TipoDispositivo, TipoNota, TipoPublicacao,
TipoVide, VeiculoPublicacao) TipoVide, VeiculoPublicacao, Nota)
from norma.models import NormaJuridica from norma.models import NormaJuridica
from sapl.crud import build_crud from sapl.crud import build_crud
DISPOSITIVO_SELECT_RELATED = ( DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo', 'tipo_dispositivo',
'norma_publicada', 'norma_publicada',
@ -149,7 +154,8 @@ class CompilacaoView(ListView):
return Dispositivo.objects.filter( return Dispositivo.objects.filter(
ordem__gt=0, ordem__gt=0,
norma_id=self.kwargs['norma_id'] norma_id=self.kwargs['norma_id']
).select_related(*DISPOSITIVO_SELECT_RELATED) ).select_related(*DISPOSITIVO_SELECT_RELATED).prefetch_related(
'notas',)
def get_vigencias(self): def get_vigencias(self):
itens = Dispositivo.objects.filter( itens = Dispositivo.objects.filter(
@ -272,7 +278,7 @@ class CompilacaoEditView(CompilacaoView, FormMixin):
pk_view = 0 pk_view = 0
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
form = UpLoadImportFileForm(request.POST, request.FILES) form = forms.UpLoadImportFileForm(request.POST, request.FILES)
message = "Arquivo Submetido com sucesso" message = "Arquivo Submetido com sucesso"
self.object_list = self.get_queryset() self.object_list = self.get_queryset()
@ -312,7 +318,7 @@ class CompilacaoEditView(CompilacaoView, FormMixin):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset() self.object_list = self.get_queryset()
form_class = UpLoadImportFileForm form_class = forms.UpLoadImportFileForm
self.form = self.get_form(form_class) self.form = self.get_form(form_class)
context = self.get_context_data( context = self.get_context_data(
object_list=self.object_list, object_list=self.object_list,
@ -739,8 +745,8 @@ class ActionsEditMixin(object):
def render_to_json_response(self, context, **response_kwargs): def render_to_json_response(self, context, **response_kwargs):
test = getattr(self, context['action']) action = getattr(self, context['action'])
return JsonResponse(test(context), safe=False) return JsonResponse(action(context), safe=False)
def delete_item_dispositivo(self, context): def delete_item_dispositivo(self, context):
return self.delete_bloco_dispositivo(context) return self.delete_bloco_dispositivo(context)
@ -778,7 +784,8 @@ class ActionsEditMixin(object):
parents = [base, ] + base.get_parents() parents = [base, ] + base.get_parents()
tipos_dp_auto_insert = tipo.filhos_permitidos.filter( tipos_dp_auto_insert = tipo.filhos_permitidos.filter(
filho_de_insercao_automatica=True) filho_de_insercao_automatica=True,
perfil_id=context['perfil_pk'])
count_auto_insert = 0 count_auto_insert = 0
for tipoauto in tipos_dp_auto_insert: for tipoauto in tipos_dp_auto_insert:
@ -793,9 +800,6 @@ class ActionsEditMixin(object):
else: else:
count_auto_insert += 1 count_auto_insert += 1
ordem = base.criar_espaco(
espaco_a_criar=1 + count_auto_insert, local=local_add)
dp_irmao = None dp_irmao = None
dp_pai = None dp_pai = None
for dp in parents: for dp in parents:
@ -838,6 +842,28 @@ class ActionsEditMixin(object):
else: else:
dp.set_numero_completo([1, 0, 0, 0, 0, 0, ]) dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
# verificar se existe restrição de quantidade de itens
if dp.dispositivo_pai:
pp = dp.tipo_dispositivo.possiveis_pais.filter(
pai_id=dp.dispositivo_pai.tipo_dispositivo_id,
perfil_id=context['perfil_pk'])
if pp.exists() and pp[0].quantidade_permitida >= 0:
qtd_existente = Dispositivo.objects.filter(
norma_id=dp.norma_id,
tipo_dispositivo_id=dp.tipo_dispositivo_id).count()
if qtd_existente >= pp[0].quantidade_permitida:
return {'pk': base.pk,
'pai': [base.dispositivo_pai.pk, ],
'alert': str(_('Limite de inserções de '
'dispositivos deste tipo '
'foi excedido.'))
}
ordem = base.criar_espaco(
espaco_a_criar=1 + count_auto_insert, local=local_add)
dp.rotulo = dp.rotulo_padrao() dp.rotulo = dp.rotulo_padrao()
dp.ordem = ordem dp.ordem = ordem
dp.incrementar_irmaos(variacao, [local_add, ]) dp.incrementar_irmaos(variacao, [local_add, ])
@ -846,6 +872,7 @@ class ActionsEditMixin(object):
dp.save() dp.save()
dp_auto_insert = None dp_auto_insert = None
# Inserção automática # Inserção automática
if count_auto_insert: if count_auto_insert:
dp_pk = dp.pk dp_pk = dp.pk
@ -1055,3 +1082,82 @@ class ActionsEditView(ActionsEditMixin, TemplateView):
context['perfil_pk'] = self.request.session['perfil_estrutural'] context['perfil_pk'] = self.request.session['perfil_estrutural']
return self.render_to_json_response(context, **response_kwargs) return self.render_to_json_response(context, **response_kwargs)
class NotasCreateView(FormMixin, CreateView):
template_name = 'compilacao/nota_ajaxform.html'
form_class = forms.NotaForm
def get(self, request, *args, **kwargs):
if 'action' in request.GET and request.GET['action'] == 'modelo_nota':
tn = TipoNota.objects.get(pk=request.GET['id_tipo'])
return HttpResponse(tn.modelo)
return super(NotasCreateView, self).get(request, *args, **kwargs)
def get_form_kwargs(self):
kwargs = super(NotasCreateView, self).get_form_kwargs()
kwargs.update(self.kwargs)
return kwargs
def post(self, request, *args, **kwargs):
try:
form = NotaForm(request.POST, request.FILES, **kwargs)
if form.is_valid():
nt = form.save(commit=False)
# TODO: Implementar tratamento do usuário.
nt.owner_id = User.objects.order_by('id')[:1][0].pk
nt.save()
self.kwargs['pk'] = nt.pk
return self.form_valid(form)
else:
return self.form_invalid(form)
except Exception as e:
print(e)
return HttpResponse("post")
def get_success_url(self):
return reverse(
'dispositivo', kwargs={
'norma_id': self.kwargs[
'norma_id'],
'dispositivo_id': self.kwargs[
'dispositivo_id']})
class NotasEditView(UpdateView):
model = Nota
template_name = 'compilacao/nota_ajaxform.html'
form_class = forms.NotaForm
def get(self, request, *args, **kwargs):
try:
# TODO: permitir edição apenas das notas do usuário conectado
# TODO: tratar revalidação no método post
# TODO: não mostrar botão de edição na interface
if 'action' in request.GET and request.GET['action'] == 'modelo_nota':
tn = TipoNota.objects.get(pk=request.GET['id_tipo'])
return HttpResponse(tn.modelo)
return super(NotasEditView, self).get(request, *args, **kwargs)
except Exception as e:
print(e)
def get_form_kwargs(self):
kwargs = super(NotasEditView, self).get_form_kwargs()
kwargs.update(self.kwargs)
return kwargs
def get_success_url(self):
return reverse(
'dispositivo', kwargs={
'norma_id': self.kwargs[
'norma_id'],
'dispositivo_id': self.kwargs[
'dispositivo_id']})
class NotasDeleteView(FormMixin, CreateView):
pass

3
sapl/settings.py

@ -60,7 +60,8 @@ INSTALLED_APPS = (
'sass_processor', 'sass_processor',
) )
if DEBUG: if DEBUG:
INSTALLED_APPS += ('debug_toolbar',) # INSTALLED_APPS += ('debug_toolbar',)
pass
MIDDLEWARE_CLASSES = ( MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',

BIN
static/img/down_arrow_select.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

BIN
static/img/hand-note.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

244
static/js/compilacao.js

@ -1,227 +1,3 @@
var editortype = "textarea";
var gets = 0;
var onSubmitEditForm = function(event) {
var texto = '';
var editorTiny = tinymce.get('editdi_texto');
if (editorTiny != null)
texto = editorTiny.getContent();
else
texto = $('#editdi_texto').val();
var formData = {
'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(),
'texto' : texto
};
var url = $('.csform form').attr( "action_ajax" );
$("#message_block").css("display", "block");
$.post(url, formData)
.done(function(data) {
if (typeof data == "string") {
$('.dpt-selected').html(data);
clearEditSelected();
reloadFunctionClicks();
return;
}
clearEditSelected();
if (data.pk != null)
refreshScreenFocusPk(data);
else {
alert('Erro na inserção!');
flag_refresh_all = false;
}
}).always(function() {
$("#message_block").css("display", "none");
});
if (event != null)
event.preventDefault();
}
var clickEditDispositivo = function(event) {
var _pk = event.currentTarget.getAttribute('pk');
if ($('#dpt'+_pk).hasClass("dpt-selected")) {
clearEditSelected();
return;
}
clearEditSelected();
clickUpdateDispositivo(event);
}
var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, flag_actions_vibible, flag_refresh_all) {
var pk_refresh = __pk_refresh;
var pk_edit = __pk_edit;
var _action = __action;
var _variacao = '';
var _tipo_pk = '';
var _perfil_pk = '';
if (event != null) {
pk_refresh = event.currentTarget.getAttribute('pk');
_action = $(this).attr('action');
_variacao = $(this).attr('variacao');
_tipo_pk = $(this).attr('tipo_pk');
_perfil_pk = $(this).attr('perfil_pk');
}
if (pk_edit == null)
pk_edit = pk_refresh;
var url = '';
if (_action == '')
return;
else if ( _action == null) {
url = pk_refresh+'/refresh?edit='+pk_edit;
}
else if (_action.startsWith('refresh')) {
var str = _action.split(':');
if (str.length > 1) {
if(_action.endsWith('perfil')) {
url = '&perfil_pk='+_perfil_pk;
}
else {
editortype = str[1];
SetCookie("editortype", editortype, 30)
}
}
url = pk_refresh+'/refresh?edit='+pk_edit+url;
}
else if (_action.startsWith('add_')) {
url = pk_refresh+'/actions?action='+_action;
url += '&tipo_pk='+_tipo_pk;
url += '&variacao='+_variacao;
$("#message_block").css("display", "block");
}
else if (_action.startsWith('delete_')) {
url = pk_refresh+'/actions?action='+_action;
$("#message_block").css("display", "block");
}
$.get(url).done(function( data ) {
if ( _action == null || _action.startsWith('refresh')) {
if (flag_refresh_all) {
if (flag_actions_vibible)
clearEditSelected();
$( '#dpt' + pk_refresh ).html( data);
}
else {
//console.log(pk_refresh + ' - '+pk_edit)
if (flag_actions_vibible == null || flag_actions_vibible)
clearEditSelected();
$( '#dpt' + pk_refresh ).prepend( data );
}
reloadFunctionClicks();
var _editortype = editortype;
if ( $('.edt-'+_editortype).length == 0) {
_editortype = 'construct';
}
if ( _editortype == 'tinymce' ) {
initTinymce();
}
else if (_editortype == 'textarea') {
$('.csform form').submit(onSubmitEditForm);
}
else if (_editortype == 'construct') {
$('.csform .btn-salvar').parent().addClass("displaynone");
$('.csform .btn-salvar, .csform .fields').addClass("displaynone");
$('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2);
$('.actions_inserts').removeClass('menu_flutuante');
}
else if (_editortype == 'detail') {
$('.csform .btn-salvar').parent().removeClass("displaynone");
$('.csform .btn-salvar, .csform .fields').removeClass("displaynone");
$('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2);
$('.actions_inserts').addClass('menu_flutuante');
}
$(".edt-"+_editortype).addClass('selected');
//$(".container").addClass('class_color_container');
if (flag_actions_vibible == null || flag_actions_vibible) {
$('html, body').animate({
scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10
}, 300);
$('#dpt'+pk_edit).addClass('dpt-selected');
}
}
else if (_action == 'add_next' || _action == 'add_in') {
clearEditSelected();
if (data.pk != null) {
refreshScreenFocusPk(data);
}
else {
alert('Erro na inserção!');
}
}
else if (_action.startsWith('delete_')) {
$("#message_block").css("display", "block");
clearEditSelected();
if (data.pk != null) {
refreshScreenFocusPk(data);
}
else {
alert('Erro exclusão!');
}
}
else {
clearEditSelected();
reloadFunctionClicks();
}
}).always(function() {
$("#message_block").css("display", "none");
});
}
function refreshScreenFocusPk(data) {
for (var pai = 0; pai < data.pai.length; pai++)
if (data.pai[pai] != -1) {
clickUpdateDispositivo(null, data.pai[pai], data.pk, 'refresh', pai == 0, true);
}
else {
href = location.href.split('#')[0]
location.href = href+'#'+data.pk
location.reload(true)
}
}
function clearEditSelected() {
$(".container").removeClass('class_color_container');
tinymce.remove();
$('.dpt-selected').removeClass('dpt-selected');
$('.dpt').css('min-height', '');
$('.csform').remove();
}
function reloadFunctionClicks() {
$('.dpt .de, .btn-action, .btn-edit').off();
$('.dpt .de, .btn-edit').on('click', clickEditDispositivo);
$('.btn-action').on('click', clickUpdateDispositivo);
$('#editdi_texto').focus();
}
function initTinymce() { function initTinymce() {
tinymce.init({ tinymce.init({
@ -239,7 +15,6 @@ function initTinymce() {
}); });
} }
//cookies
function SetCookie(cookieName,cookieValue,nDays) { function SetCookie(cookieName,cookieValue,nDays) {
var today = new Date(); var today = new Date();
var expire = new Date(); var expire = new Date();
@ -258,22 +33,3 @@ function ReadCookie(cookieName) {
if (ind1==-1) ind1=theCookie.length; if (ind1==-1) ind1=theCookie.length;
return unescape(theCookie.substring(ind+cookieName.length+2,ind1)); return unescape(theCookie.substring(ind+cookieName.length+2,ind1));
} }
$(document).ready(function() {
editortype = ReadCookie("editortype")
if (editortype == null || editortype == "") {
editortype = "textarea"
SetCookie("editortype", editortype, 30)
}
reloadFunctionClicks();
$("#message_block").css("display", "none");
href = location.href.split('#')
if (href.length == 2) {
clickUpdateDispositivo(null, href[1], href[1], 'refresh', true);
}
});

254
static/js/compilacao_edit.js

@ -0,0 +1,254 @@
var editortype = "textarea";
var gets = 0;
var onSubmitEditForm = function(event) {
var texto = '';
var editorTiny = tinymce.get('editdi_texto');
if (editorTiny != null)
texto = editorTiny.getContent();
else
texto = $('#editdi_texto').val();
var formData = {
'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(),
'texto' : texto
};
var url = $('.csform form').attr( "action_ajax" );
$("#message_block").css("display", "block");
$.post(url, formData)
.done(function(data) {
if (typeof data == "string") {
$('.dpt-selected').html(data);
clearEditSelected();
reloadFunctionClicks();
return;
}
clearEditSelected();
if (data.pk != null)
refreshScreenFocusPk(data);
else {
alert('Erro na inserção!');
flag_refresh_all = false;
}
}).always(function() {
$("#message_block").css("display", "none");
});
if (event != null)
event.preventDefault();
}
var clickEditDispositivo = function(event) {
var _pk = event.currentTarget.getAttribute('pk');
if ($('#dpt'+_pk).hasClass("dpt-selected")) {
clearEditSelected();
return;
}
clearEditSelected();
clickUpdateDispositivo(event);
}
var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action, flag_actions_vibible, flag_refresh_all) {
var pk_refresh = __pk_refresh;
var pk_edit = __pk_edit;
var _action = __action;
var _variacao = '';
var _tipo_pk = '';
var _perfil_pk = '';
if (event != null) {
pk_refresh = event.currentTarget.getAttribute('pk');
_action = $(this).attr('action');
_variacao = $(this).attr('variacao');
_tipo_pk = $(this).attr('tipo_pk');
_perfil_pk = $(this).attr('perfil_pk');
}
if (pk_edit == null)
pk_edit = pk_refresh;
var url = '';
if (_action == '')
return;
else if ( _action == null) {
url = pk_refresh+'/refresh?edit='+pk_edit;
}
else if (_action.startsWith('refresh')) {
var str = _action.split(':');
if (str.length > 1) {
if(_action.endsWith('perfil')) {
url = '&perfil_pk='+_perfil_pk;
$("#message_block").css("display", "block");
}
else {
editortype = str[1];
SetCookie("editortype", editortype, 30)
}
}
url = pk_refresh+'/refresh?edit='+pk_edit+url;
}
else if (_action.startsWith('add_')) {
url = pk_refresh+'/actions?action='+_action;
url += '&tipo_pk='+_tipo_pk;
url += '&variacao='+_variacao;
$("#message_block").css("display", "block");
}
else if (_action.startsWith('delete_')) {
var r = confirm("Confirma Exclusão deste dispositivo?");
if (r == true) {
x = "You pressed OK!";
} else {
return
}
url = pk_refresh+'/actions?action='+_action;
$("#message_block").css("display", "block");
}
$.get(url).done(function( data ) {
if ( _action == null || _action.startsWith('refresh')) {
if (flag_refresh_all) {
if (flag_actions_vibible)
clearEditSelected();
$( '#dpt' + pk_refresh ).html( data);
}
else {
//console.log(pk_refresh + ' - '+pk_edit)
if (flag_actions_vibible == null || flag_actions_vibible)
clearEditSelected();
$( '#dpt' + pk_refresh ).prepend( data );
}
reloadFunctionClicks();
var _editortype = editortype;
if ( $('.edt-'+_editortype).length == 0) {
_editortype = 'construct';
}
if ( _editortype == 'tinymce' ) {
initTinymce();
}
else if (_editortype == 'textarea') {
$('.csform form').submit(onSubmitEditForm);
}
else if (_editortype == 'construct') {
$('.csform .btn-salvar').parent().addClass("displaynone");
$('.csform .btn-salvar, .csform .fields').addClass("displaynone");
$('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2);
$('.actions_inserts').removeClass('menu_flutuante');
}
else if (_editortype == 'detail') {
$('.csform .btn-salvar').parent().removeClass("displaynone");
$('.csform .btn-salvar, .csform .fields').removeClass("displaynone");
$('#dpt'+pk_refresh).css('min-height', $('.actions_right').height()*2);
$('.actions_inserts').addClass('menu_flutuante');
}
$(".edt-"+_editortype).addClass('selected');
//$(".container").addClass('class_color_container');
if (flag_actions_vibible == null || flag_actions_vibible) {
$('#dpt'+pk_edit).addClass('dpt-selected');
$('html, body').animate({
scrollTop: $('#dpt' + pk_edit ).offset().top - window.innerHeight / 10
}, 300);
}
}
else if (_action == 'add_next' || _action == 'add_in') {
clearEditSelected();
if (data.pk != null) {
if (data.alert != null)
alert(data.alert)
refreshScreenFocusPk(data);
}
else {
alert('Erro na inserção!');
}
}
else if (_action.startsWith('delete_')) {
$("#message_block").css("display", "block");
clearEditSelected();
if (data.pk != null) {
refreshScreenFocusPk(data);
}
else {
alert('Erro exclusão!');
}
}
else {
clearEditSelected();
reloadFunctionClicks();
}
}).always(function() {
$("#message_block").css("display", "none");
});
}
function refreshScreenFocusPk(data) {
for (var pai = 0; pai < data.pai.length; pai++)
if (data.pai[pai] != -1) {
clickUpdateDispositivo(null, data.pai[pai], data.pk, 'refresh', pai == 0, true);
}
else {
href = location.href.split('#')[0]
location.href = href+'#'+data.pk
location.reload(true)
}
}
function clearEditSelected() {
$(".container").removeClass('class_color_container');
tinymce.remove();
$('.dpt-selected').removeClass('dpt-selected');
$('.dpt').css('min-height', '');
$('.csform').remove();
}
function reloadFunctionClicks() {
$('.dpt .de, .btn-action, .btn-edit').off();
$('.dpt .de, .btn-edit').on('click', clickEditDispositivo);
$('.btn-action').on('click', clickUpdateDispositivo);
$('#editdi_texto').focus();
}
$(document).ready(function() {
editortype = ReadCookie("editortype")
if (editortype == null || editortype == "") {
editortype = "textarea"
SetCookie("editortype", editortype, 30)
}
reloadFunctionClicks();
$("#message_block").css("display", "none");
href = location.href.split('#')
if (href.length == 2) {
clickUpdateDispositivo(null, href[1], href[1], 'refresh', true);
}
});

91
static/js/compilacao_notas.js

@ -0,0 +1,91 @@
function onEventsDneExec(pk) {
$('html, body').animate({
scrollTop: $('#dne' + pk ).offset().top - window.innerHeight / 5
}, 300);
$('.dateinput').fdatepicker({
// TODO localize
format: 'dd/mm/yyyy',
language: 'pt',
endDate: '31/12/2100',
todayBtn: true
});
$('#dne'+pk+" select[name='tipo']").change(function(event) {
var url = '';
url = 'compilacao/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value;
$.get(url).done(function( data ) {
$('#dne'+pk+" textarea[name='texto']").val(data);
});
});
$('#dne'+pk+" .button").click(onSubmitEditForm);
}
var onSubmitEditForm = function(event) {
var id_dispositivo = $('#id_dispositivo').val();
var id_nota = $('#id_pk').val();
var url = 'compilacao/'+id_dispositivo+'/nota/'
if (id_nota == '')
url += 'create';
else
url += id_nota+'/edit';
$.post( url, $('#dne'+id_dispositivo+" form").serialize(), function(data) {
if (typeof data == "string") {
if (data.indexOf('<form') >= 0) {
$('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo);
}
else {
$('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data)
onReadyNotas();
}
}
}
);
}
function getFormNota(_this, _btn) {
var id_dispositivo = $('.dne-exec .dne-form').closest('.dne').attr('pk');
if (id_dispositivo != null) {
$('#dne'+id_dispositivo).removeClass('dne-exec');
$('#dne'+id_dispositivo+' .dne-form').html('');
}
var url = '';
if (_btn == 'btn-create') {
id_dispositivo = $(_this).attr('pk');
url = 'compilacao/'+id_dispositivo+'/nota/create';
}
else {
var id_nota = $(_this).attr('pk');
id_dispositivo = $(_this).closest('.dn').attr('pk');
url = 'compilacao/'+id_dispositivo+'/nota/'+id_nota+'/edit'
}
$('#dne'+id_dispositivo).addClass('dne-exec');
$('#dne'+id_dispositivo).addClass('dne-exec');
$.get(url).done(function( data ) {
$('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo);
});
}
function onReadyNotas() {
$('.dne .btn-create').off();
$('.dne .btn-edit').off();
$('.dne .btn-create').click(function(){
getFormNota(this, 'btn-create')
});
$('.dn .btn-edit').click(function(){
getFormNota(this, 'btn-edit')
});
}
$(document).ready(function() {
onReadyNotas()
});

40
static/js/compilacao_view.js

@ -0,0 +1,40 @@
$( window ).scroll(function() {
if (window.pageYOffset <= 180)
$( "section.vigencias" ).removeClass("fixed");
else if (!$( "section.vigencias" ).hasClass("fixed"))
$( "section.vigencias" ).addClass("fixed");
});
$(window).load(function() {
setTimeout(function() {
height = $( "section.vigencias" ).height();
$('html, body').animate({
scrollTop: window.pageYOffset - height - 55
}, 300);
}, 100);
});
function textoMultiVigente(item) {
$(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").removeClass("displaynone");
$(".link_alterador").removeClass("displaynone");
}
function textoVigente(item, link) {
$(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").addClass("displaynone");
$(".link_alterador").removeClass("displaynone");
if (!link)
$(".link_alterador").addClass("displaynone");
}
$(document).ready(function() {
$("#btn_font_menos").click(function() {
$(".dpt").css("font-size", "-=1");
});
$("#btn_font_mais").click(function() {
$(".dpt").css("font-size", "+=1");
});
});

300
static/styles/compilacao.scss

@ -16,21 +16,49 @@ $color_actions_border: #CCC;
-o-border-radius: $radius; -o-border-radius: $radius;
border-radius: $radius; border-radius: $radius;
} }
@mixin placeholder($color, $opacity, $fontsize, $fontweight) {
&::-webkit-input-placeholder {
color: $color;
opacity: $opacity;
font-size:$fontsize;
font-weight: $fontweight;
}
&::-moz-placeholder {
color: $color;
opacity: $opacity;
font-size:$fontsize;
font-weight: $fontweight;
}
&::-moz-placeholder {
color: $color;
opacity: $opacity;
font-size:$fontsize;
font-weight: $fontweight;
}
&:-ms-input-placeholder {
color: $color;
opacity: $opacity;
font-size:$fontsize;
font-weight: $fontweight;
}
}
@mixin li_flutuante() { @mixin li_flutuante() {
& > ul { & > ul {
transform: translateY(30px); transform: translateY(30px);
transition: transform 0.1s linear, transition: transform 0.1s linear, opacity 0.1s linear, clip 0s 0.3s;
opacity 0.1s linear,
clip 0s 0.3s;
clip: rect(0, 0, 0, 0); clip: rect(0, 0, 0, 0);
opacity: 0; opacity: 0;
position:absolute; position:absolute;
margin-left: 0.5em; margin-left: 0.5em;
box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23); box-shadow: 0px 6px 18px rgba(0, 0, 0, 0.19), 0px 2px 6px rgba(0, 0, 0, 0.23);
-webkit-transition-delay: 0.4s; /* Safari */
transition-delay: 0.4s;
li { li {
a { a {
border-right: 0px !important; border-right: 0px !important;
@ -112,9 +140,20 @@ $color_actions_border: #CCC;
.cp { .cp {
.desativado, .desativado * {
text-decoration: line-through;
color: #777 !important;
table, table td {
border: 1px dotted #ccc;
}
}
.dpt { .dpt {
font-size:1em; font-size:1em;
transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out;
position: relative;
.ementa { .ementa {
padding: 4em 0em 3em 35%; padding: 4em 0em 3em 35%;
@ -169,6 +208,10 @@ $color_actions_border: #CCC;
.artigo { .artigo {
font-size: 1.15em; font-size: 1.15em;
float:left; float:left;
.dptt {
z-index: 98;
position: relative;
}
} }
.caput { .caput {
@ -224,17 +267,224 @@ $color_actions_border: #CCC;
color: #018 !important; color: #018 !important;
} }
} }
} /* and dpt */
.desativado, .desativado * { .dn { /* Notas de Dispositivo*/
text-decoration: line-through; font-size: 0.8rem;
color: #777 !important; font-weight: normal;
line-height: 1rem;
position: relative;
p, ul {
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
margin: 0 0 0 0;
list-style: none;
}
.dnl { /* Lista Notas de Dispositivo*/
display: block;
margin-left: 15%;
table, table td { .dnli {
border: 1px dotted #ccc; margin-top: 0.5em;
border-top: 1px solid #c7e3d3;
display: block;
ul {
transition: opacity 0.5s linear, clip 0s 0.3s;
clip: rect(0, 0, 0, 0);
opacity: 0;
position: absolute;
background: transparent;
right: 0;
padding: 0.5em 0.5em 0em 0.5em;
border: 1px solid #c7e3d3;
border-top: 0px;
}
&:hover {
min-height: 2.5em;
ul {
transition: opacity 0.5s linear, clip 0s 0.3s;
clip: auto;
opacity: 1;
background: rgba(230,230,230, 0.9);
} }
} }
li {
display: table-cell;
color: #aaa;
&.bullet {
padding: 0 0.333em;
padding-bottom: 0.2em;
}
&:hover {
color: #787;
}
}
.ntitulo {
font-weight: bold;
color: #676;
font-size: 90%;
}
.ntexto {
color: #787;
}
.nowner {
color: #27AE60;
}
}
}
}
.dptt {
.dne {
position: relative;
display: block;
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
text-align: left;
height: 0;
transform: scaleY(0);
transform-origin: top;
transition: all 0.3s ease;
* {
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
}
ul.btns-action {
position: absolute;
margin: 0 0 0 0;
display: table;
list-style: none;
clip: rect(0,0,0,0);
opacity: 0;
transition: opacity 1.5s linear, clip 1s linear;
transition-delay: 0s;
li {
display: table-cell;
background-color: #ddd;
border-radius: 50%;
a {
border-radius: 50%;
display: inline-block;
background: url(/static/img/hand-note.png) no-repeat 50% 50%;
padding: 1.2em 1.7em;
&:hover {
background-color: rgba(0, 150, 0, 0.1);
}
}
}
}
}
.dne-exec {
box-shadow: -4px 15px 15px rgba(0, 0, 0, 0.1), 0px 6px 6px rgba(0, 0, 0, 0.23);
@include background-top-down(#f5f5f5, #eee);
transform: scaleY(1);
height: auto;
transition-delay: 0s;
margin: 1em 0 2em 0;
padding: 0em;
ul.btns-action {
display: none;
}
.dne-form {
.asterisk {
color: transparent;
&::before {
color: red;
content: "\2b25";
padding: 0.333em;
vertical-align: super;
}
}
fieldset {
border: 0px;
}
select {
background: url(/static/img/down_arrow_select.jpg) no-repeat right #ddd;
border: 0px;
outline:0px;
}
.row:first-of-type {
margin-top: 1em;
display: inline-block;
}
.input {
border: 0px;
border-bottom: 1px solid #ccc;
margin: 0 0 0 0 ;
padding: 0.5em;
background: #eee;
height: auto;
box-shadow: 0 0 0;
@include placeholder(#777, 1, 100%, normal);
&:focus {
background: #fafafa;
}
}
.textinput[name='titulo']{
@extend .input;
font-size:130%;
font-weight: bold;
border-bottom: 0;
@include placeholder(#777, 1, 100%, bold);
}
.textarea {
@extend .input;
resize: vertical;
font-weight: normal;
}
.urlinput {
@extend .input;
margin-bottom: 1em;
}
.button {
width: 100%;
margin-top: 1.6em;
height: 2.3125rem;
padding: 0;
}
}
}
&:hover {
.dne {
height: 3.2em;
transform: scaleY(1);
transition-delay: 1s;
ul.btns-action {
clip: rect(-100px, 2000px, 2000px, -100px);
opacity: 1;
transition: opacity 0.5s linear, clip 0s 0.3s;
transition-delay: 0.5s;
li {
a {
}
}
}
}
.dne-exec {
transition-delay: 0s;
height: auto;
}
}
}
} /* and dpt */
.top-bar { .top-bar {
line-height: 1.6rem; line-height: 1.6rem;
height: auto; height: auto;
@ -371,6 +621,7 @@ $color_actions_border: #CCC;
} }
} }
.bloco { .bloco {
display: block; display: block;
clear: both; clear: both;
@ -402,9 +653,7 @@ $color_actions_border: #CCC;
display: block; display: block;
} }
} }
.btns-action {
opacity: 0;
}
} /* fim dpt */ } /* fim dpt */
.dpt-selected { .dpt-selected {
@ -488,10 +737,10 @@ $color_actions_border: #CCC;
display: table-cell; display: table-cell;
vertical-align: top; vertical-align: top;
&:hover { &:hover {
background-color: rgba(0,0,0,0.08); background-color: rgba(255, 255, 255, 0.5);
& > a { & > a {
text-shadow: 0 0 5px #777; text-shadow: 0 0 5px #777;
color: #ff0; color: #0a5;
} }
} }
} }
@ -506,6 +755,10 @@ $color_actions_border: #CCC;
font-size: 80%; font-size: 80%;
text-align: right; text-align: right;
z-index: 5; z-index: 5;
display: table;
li {
display: table-cell;
}
} }
.actions_parents { .actions_parents {
@ -556,13 +809,13 @@ $color_actions_border: #CCC;
left: 0; left: 0;
bottom: 0; bottom: 0;
display: inline-block; display: inline-block;
border-top: 1px solid $color_actions_border;
a { a {
padding: 0 0.4em; padding: 0 0.4em;
} }
li { li {
border: 0px; border: 0px;
border-right: 1px solid $color_actions_border; border-right: 1px solid $color_actions_border;
border-top: 1px solid $color_actions_border;
} }
} }
@ -688,9 +941,9 @@ $color_actions_border: #CCC;
@include li_flutuante(); @include li_flutuante();
table-layout: fixed; table-layout: fixed;
} }
&.opc_excluir { &.menu_excluir {
@include li_flutuante(); @include li_flutuante();
table-layout: fixed; display: block;
position: static; position: static;
@ -727,7 +980,7 @@ $color_actions_border: #CCC;
@include li_flutuante(); @include li_flutuante();
&.opc_excluir { &.menu_excluir {
& > ul { & > ul {
li { li {
&:first-child { &:first-child {
@ -738,14 +991,10 @@ $color_actions_border: #CCC;
} }
} }
} }
} }
} }
} }
textarea { textarea {
margin: 0; margin: 0;
resize: vertical; resize: vertical;
@ -775,7 +1024,7 @@ $color_actions_border: #CCC;
} }
.selected { .selected {
background-color: rgba(0, 0, 0, 0.1); background-color: rgba(255, 255, 255, 0.5);
a { a {
&:hover { &:hover {
color: $color_actions !important; color: $color_actions !important;
@ -799,6 +1048,9 @@ $color_actions_border: #CCC;
text-shadow: 0 0 5px #fff; text-shadow: 0 0 5px #fff;
box-shadow: 0 0 5px #777; box-shadow: 0 0 5px #777;
} }
.mce-menu {
background: #eee !important;
}
.displaynone { .displaynone {
display: none !important; display: none !important;
@ -869,7 +1121,7 @@ $color_actions_border: #CCC;
left: auto; left: auto;
} }
} }
&.opc_excluir > ul { &.menu_excluir > ul {
left: 10% !important; left: 10% !important;
right: 0 !important; right: 0 !important;
margin-left: 0; margin-left: 0;

1
templates/compilacao/edit.html

@ -9,6 +9,7 @@
{% block head_content %}{{block.super}} {% block head_content %}{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css"> <link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script> <script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_edit.js' %}"></script>
{% endblock %} {% endblock %}

13
templates/compilacao/edit_bloco.html

@ -59,11 +59,11 @@
{% if not dpt|is_relative_auto_insert:request %} {% if not dpt|is_relative_auto_insert:request %}
<li class="opc_excluir"><a {% if not dpt.dispositivos_filhos_set.exists %}class="btn-excluir btn-action" action="delete_item_dispositivo" pk={{dpt.pk}}{%else%}class="btn-excluir"{%endif%}>&nbsp;<span>Excluir</span></a> <li class="menu_excluir"><a {% if not dpt.dispositivos_filhos_set.exists %}class="btn-excluir btn-action" action="delete_item_dispositivo" pk={{dpt.pk}}{%else%}class="btn-excluir"{%endif%}>&nbsp;<span>Excluir</span></a>
{% if dpt.dispositivos_filhos_set.exists %} {% if dpt.dispositivos_filhos_set.exists %}
<ul> <ul>
<li><a href="#" class="btn-excluir btn-action" action="delete_item_dispositivo" pk={{dpt.pk}}>TODO: Excluir apenas este dispositivo</a></li> <li><a href="#" class="btn-excluir btn-action" action="delete_item_dispositivo_todo" pk={{dpt.pk}}>TODO: Excluir apenas este dispositivo</a></li>
<li><a href="#" class="btn-excluir btn-action" action="delete_bloco_dispositivo" pk={{dpt.pk}}>TODO: Excluir toda a estrutura deste dispositivo</a></li> <li><a href="#" class="btn-excluir btn-action" action="delete_bloco_dispositivo" pk={{dpt.pk}}>Excluir toda a estrutura deste dispositivo</a></li>
</ul> </ul>
{% endif %} {% endif %}
</li> </li>
@ -82,9 +82,10 @@
</div> </div>
<div class="label_status" > <ul class="label_status" >
<div>Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}</div> <li>Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}</li>
</div> <li><a>.</a></li>
</ul>
<ul class="btns-action actions_parents"> <ul class="btns-action actions_parents">
<div>Em Edição:</div> <div>Em Edição:</div>

62
templates/compilacao/index.html

@ -6,6 +6,12 @@
{% block head_content %}{{block.super}} {% block head_content %}{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css"> <link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_view.js' %}"></script>
{# TODO: incluir javascript compilacao_notas apenas se houver usuário conectado e que possua permissão para cadastro de notas #}
<script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script>
{% endblock %} {% endblock %}
@ -14,60 +20,9 @@
{% endblock %} {% endblock %}
{% block base_content %} {% block base_content %}
<script type="text/javascript">
$( window ).scroll(function() {
if (window.pageYOffset <= 180)
$( "section.vigencias" ).removeClass("fixed");
else if (!$( "section.vigencias" ).hasClass("fixed"))
$( "section.vigencias" ).addClass("fixed");
});
$(window).load(function() {
setTimeout(function() {
height = $( "section.vigencias" ).height();
$('html, body').animate({
scrollTop: window.pageYOffset - height - 55
}, 300);
}, 100);
});
function textoMultiVigente(item) {
$(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").removeClass("displaynone");
$(".link_alterador").removeClass("displaynone");
}
function textoVigente(item, link) {
$(".cp .tipo-vigencias a").removeClass("selected")
$(item).addClass("selected")
$(".desativado").addClass("displaynone");
$(".link_alterador").removeClass("displaynone");
if (!link)
$(".link_alterador").addClass("displaynone");
}
$(document).ready(function() {
$("#btn_font_menos").click(function() {
$(".dpt").css("font-size", "-=1");
});
$("#btn_font_mais").click(function() {
$(".dpt").css("font-size", "+=1");
});
});
</script>
<div class="cp"> <div class="cp">
<div style="float: right; clear:right;"> <div style="float: right; clear:right;">
<a id="btn_font_menos" title="Diminuir tamanho da letra">a</a> <a id="btn_font_menos" title="Diminuir tamanho da letra">a</a>
<a id="btn_font_mais" title="Aumentar tamanho da Letra">A</a> <a id="btn_font_mais" title="Aumentar tamanho da Letra">A</a>
@ -91,8 +46,6 @@ $(document).ready(function() {
{% endfor %} {% endfor %}
{% else %} {% else %}
<a class="nav__link {% if view.inicio_vigencia.year == key %}selected{%endif%}">{{ key }}</a> <a class="nav__link {% if view.inicio_vigencia.year == key %}selected{%endif%}">{{ key }}</a>
{%endif%} {%endif%}
{% if not forloop.first and not forloop.last %} {% if not forloop.first and not forloop.last %}
@ -124,9 +77,6 @@ $(document).ready(function() {
{% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>. {% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>.
{%endif%} {%endif%}
{% include 'compilacao/index_bloco.html'%} {% include 'compilacao/index_bloco.html'%}
</div> </div>
{% endblock base_content %} {% endblock base_content %}

67
templates/compilacao/index_bloco.html

@ -7,9 +7,16 @@
{% elif dpt.nivel < view.flag_nivel_old %} {% elif dpt.nivel < view.flag_nivel_old %}
{% close_div view.flag_nivel_old dpt.nivel 0 %} {% close_div view.flag_nivel_old dpt.nivel 0 %}
{% endif%} {% endif%}
<div class="dpt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}" id="d{{dpt.id}}">
<div class="{{ dpt.tipo_dispositivo.class_css }}" id="id{{dpt.id}}">
{% if forloop.first and view|isinst:'DispositivoView' %}
{% else %}
<div class="dpt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}">
{% endif%}
{% spaceless %} {% spaceless %}
<div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt">
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%}&nbsp;{%endif%} {{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%}&nbsp;{%endif%}
{% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %} {% if dpt.norma_publicada_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{%url 'compilacao' dpt.norma_publicada.pk %}#{{dpt.dispositivo_atualizador_id}}"> <a class="link_alterador" href="{%url 'compilacao' dpt.norma_publicada.pk %}#{{dpt.dispositivo_atualizador_id}}">
@ -18,13 +25,67 @@
{{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }} {{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a> </a>
{% endif %} {% endif %}
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
<div class="dne" id="dne{{dpt.pk}}" pk="{{dpt.pk}}">{# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#}
<ul class="btns-action">
<li><a class="btn-create" pk="{{dpt.pk}}" title="{% trans 'Adcionar uma Nota ao Dispositivo'%}">&nbsp;</a></li>
</ul>
<div class="dne-form"></div>
</div>
{% endif%}
</div>
{% if not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
<div class="dn" id="dn{{dpt.pk}}" pk="{{dpt.pk}}">{# Dispostivo Nota#}
<ul class="dnl">{# Dispostivo Nota Lista#}
{% for nota in dpt.notas.all %}{# TODO: User - dnl - Dispostivo Nota Editor - tratar permissão de usuário quanto a publicidade#}
<li class="dnli" id="nt{{nota.pk}}">
<ul>
<li><a class="btn-edit" pk="{{nota.pk}}">Editar</a></li> {# TODO: User - tratar permissão usuário #}
<li class="bullet">&#8226;</li>
<li><a class="btn-delete" pk="{{nota.pk}}">Excluir</a></li> {# TODO: User - tratar permissão usuário #}
<li class="bullet">&#8226;</li>
<li class="ntipo">{{nota.tipo.nome}}</li>
<li class="bullet">&#8226;</li>
<li class="nowner" title="{% trans 'Criado Por' %}">{%if nota.owner.first_name%}{{nota.owner.first_name}}{%else%}{{nota.owner}}{%endif%}</li>
<li class="bullet">&#8226;</li>
<li class="npublicacao" title="{% trans 'Data de Publicação'%}">{{nota.publicacao|date:"d M Y"}}</li>
</ul>
{%if nota.url_externa %}<a target="_blank" href="{{nota.url_externa}}">{%endif%}
{%if nota.titulo %}<div class="ntitulo">{{nota.titulo}}</div>{%endif%}
{%if nota.url_externa %}</a>{%endif%}
{%if nota.url_externa %}<a target="_blank" href="{{nota.url_externa}}">{%endif%}
<div class="ntexto">{{ nota.texto}}</div>
{%if nota.url_externa %}</a>{%endif%}
{%comment%}
<ul>
<li class="nefetividade" title="{% trans 'Data de Efetividade'%}">{{nota.efetividade|date:"d M Y"}}</li>
<li class="bullet">&#8226;</li>
<li class="npublicidade">{{nota.get_publicidade_display}}</li>
</ul>
{%endcomment%}
</li>{# Dispostivo Nota Lista Item#}
{% endfor %}
</ul>
</div>
{% endif%}
</div>
{% endspaceless %} {% endspaceless %}
{% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%} {% if view.is_norma_alteradora and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{%with node=dpt template_name='compilacao/index_bloco_alteracao.html' %} {%with node=dpt template_name='compilacao/index_bloco_alteracao.html' %}
{%include template_name%} {%include template_name%}
{%endwith%} {%endwith%}
{% endif%} {% endif%}
</div>
{% set_nivel_old view dpt.nivel %} {% set_nivel_old view dpt.nivel %}
{% endfor %} {% endfor %}
{% if view|isinst:'DispositivoView' %}
{% close_div view.flag_nivel_old view.flag_nivel_ini -1 %}
{% else %}
{% close_div view.flag_nivel_old view.flag_nivel_ini 0 %} {% close_div view.flag_nivel_old view.flag_nivel_ini 0 %}
{% endif%}

2
templates/compilacao/index_bloco_alteracao.html

@ -3,8 +3,10 @@
{% spaceless %} {% spaceless %}
<div class="dpt" id="d{{ch.id}}"> <div class="dpt" id="d{{ch.id}}">
<div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}"> <div class="{{ ch.tipo_dispositivo.class_css }}" id="id{{ch.id}}" nivel="{{ch.nivel}}">
<div class="dptt">
{{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'compilacao' ch.norma.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }} {{ ch.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{ch.pk}}" href="{%url 'compilacao' ch.norma.pk %}#{{ch.pk}}">{{ ch.rotulo }}</a>{{ ch.tipo_dispositivo.rotulo_sufixo_html|safe }}{{ ch.tipo_dispositivo.texto_prefixo_html|safe }}{{ ch.texto|safe }}
</div> </div>
</div> </div>
</div>
{% endspaceless %} {% endspaceless %}
{% endfor %} {% endfor %}

3
templates/compilacao/nota_ajaxform.html

@ -0,0 +1,3 @@
{% load crispy_forms_tags %}
{% crispy form form.helper%}
Loading…
Cancel
Save