Browse Source

Ajustar compilação para bootstrap em progresso

- Issue #188
  - Tarefa em progresso - 60% concluida.
    - Botões de navegação ok
    - Reenderização de usuário anônimo ok
    - Edição de notas e vides ok
pull/213/head
LeandroRoberto 9 years ago
parent
commit
6c0d305bf3
  1. 3
      base/templatetags/common_tags.py
  2. 163
      compilacao/forms.py
  3. 28
      compilacao/models.py
  4. 10
      compilacao/templatetags/compilacao_filters.py
  5. 186
      compilacao/views.py
  6. 2
      materia/views.py
  7. 8
      norma/urls.py
  8. 2
      norma/views.py
  9. 3
      sapl/layout.py
  10. 43
      static/js/compilacao_notas.js
  11. 8
      static/js/compilacao_view.js
  12. 356
      static/styles/compilacao.scss
  13. 11
      templates/base.html
  14. 1
      templates/compilacao/ajax_form.html
  15. 19
      templates/compilacao/publicacao_detail.html
  16. 3
      templates/compilacao/publicacao_list.html
  17. 28
      templates/compilacao/text_edit.html
  18. 9
      templates/compilacao/text_edit_bloco.html
  19. 114
      templates/compilacao/text_list.html
  20. 18
      templates/compilacao/text_list_bloco.html
  21. 1
      templates/compilacao/text_list_blocoalteracao.html
  22. 50
      templates/compilacao/textoarticulado_detail.html
  23. 16
      templates/compilacao/textoarticulado_list.html
  24. 17
      templates/compilacao/textoarticulado_menu_config.html
  25. 2
      templates/norma/normajuridica_detail.html

3
base/templatetags/common_tags.py

@ -29,8 +29,7 @@ def model_verbose_name_plural(class_name):
@register.filter
def lookup(d, key):
skey = str(key)
return d[str(key)] if skey in d else []
return d[key] if key in d else []
@register.filter

163
compilacao/forms.py

@ -1,8 +1,7 @@
from crispy_forms.bootstrap import FormActions, StrictButton, FieldWithButtons
from crispy_forms.helper import FormHelper
from crispy_forms_foundation.layout import (HTML, Column, Div, Fieldset,
Layout, Row)
from crispy_forms_foundation.layout.buttons import Button
from crispy_forms_foundation.layout.fields import Field
from crispy_forms.layout import Button, Field, Column, HTML, Layout, Div, Row,\
Fieldset
from django import forms
from django.core.exceptions import NON_FIELD_ERRORS
from django.forms.models import ModelForm
@ -11,16 +10,12 @@ from django.utils.translation import ugettext_lazy as _
from compilacao.models import (PARTICIPACAO_SOCIAL_CHOICES, Dispositivo, Nota,
Publicacao, TextoArticulado, TipoNota,
TipoPublicacao, TipoTextoArticulado, TipoVide,
VeiculoPublicacao, Vide)
VeiculoPublicacao, Vide,
NOTAS_PUBLICIDADE_CHOICES)
from sapl.layout import SaplFormLayout, to_column, to_row
from sapl.utils import YES_NO_CHOICES
class UpLoadImportFileForm(forms.Form):
import_file = forms.FileField(
required=True,
label=_('Arquivo formato ODF para Importanção'))
error_messages = {
'required': _('Este campo é obrigatório'),
'invalid': _('URL inválida.')
@ -145,41 +140,30 @@ class TaForm(ModelForm):
class NotaForm(ModelForm):
NPRIV = 1
NINST = 2
NPUBL = 3
PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility.
(NPRIV, _('Nota Privada')),
# All authenticated users have visibility.
(NINST, _('Nota Institucional')),
# All users have visibility.
(NPUBL, _('Nota Pública')),
)
titulo = forms.CharField(label=' ', required=False)
titulo = forms.CharField(
label=Nota._meta.get_field('titulo').verbose_name, required=False)
texto = forms.CharField(
label='',
label=Nota._meta.get_field('texto').verbose_name,
widget=forms.Textarea,
error_messages=error_messages)
url_externa = forms.URLField(
label='',
label=Nota._meta.get_field('url_externa').verbose_name,
required=False,
error_messages=error_messages)
publicidade = forms.ChoiceField(
required=True,
label=_('Publicidade'),
choices=PUBLICIDADE_CHOICES,
label=Nota._meta.get_field('publicidade').verbose_name,
choices=NOTAS_PUBLICIDADE_CHOICES,
widget=forms.Select(attrs={'class': 'selector'}))
tipo = forms.ModelChoiceField(
required=False,
label=_('Tipo da Nota'),
label=Nota._meta.get_field('tipo').verbose_name,
queryset=TipoNota.objects.all(),
empty_label=None)
publicacao = forms.DateField(
label=_('Publicação'),
label=Nota._meta.get_field('publicacao').verbose_name,
input_formats=['%d/%m/%Y'],
required=True,
widget=forms.DateInput(
@ -187,7 +171,7 @@ class NotaForm(ModelForm):
error_messages=error_messages
)
efetividade = forms.DateField(
label=_('Efetividade'),
label=Nota._meta.get_field('efetividade').verbose_name,
input_formats=['%d/%m/%Y'],
required=True,
widget=forms.DateInput(
@ -225,20 +209,39 @@ class NotaForm(ModelForm):
css_class='col-md-8'))
row3 = to_row([
('publicidade', 3),
('publicidade', 6),
('publicacao', 3),
('efetividade', 3),
(Button('submit', _('Salvar'),
css_class='btn btn-primary'), 3)
])
buttons = FormActions(
HTML('<a class="btn btn-inverse btn-close-container">'
'%s</a>' % _('Cancelar')),
Button(
'submit-form',
'Salvar',
css_class='btn btn-primary pull-right')
)
self.helper = FormHelper()
self.helper.layout = Layout(
Div(HTML(_('Notas')), css_class='title_form'),
Div(
Div(HTML(_('Notas')), css_class='panel-heading'),
Div(
row1,
Field('texto', placeholder=_('Adicionar Nota')),
Field('url_externa', placeholder=_('URL Externa (opcional)')),
row3
to_row([(Field(
'texto',
placeholder=_('Adicionar Nota')), 12)]),
to_row([(Field(
'url_externa',
placeholder=_('URL Externa (opcional)')), 12)]),
row3,
to_row([(buttons, 12)]),
css_class="panel-body"
),
css_class="panel panel-primary"
)
)
super(NotaForm, self).__init__(*args, **kwargs)
@ -256,6 +259,11 @@ class VideForm(ModelForm):
label=_('Tipo do Texto Articulado'),
queryset=TipoTextoArticulado.objects.all(),
required=False)
tipo_model = forms.ChoiceField(
choices=[],
label=_('Tipos de...'), required=False)
num_ta = forms.IntegerField(
label=_('Núm Texto Articulado'), required=False)
ano_ta = forms.IntegerField(
@ -293,54 +301,63 @@ class VideForm(ModelForm):
def __init__(self, *args, **kwargs):
self.helper = FormHelper()
self.helper.layout = Layout(
Div(HTML(_('Vides')), css_class='title_form'),
buttons = FormActions(
HTML('<a class="btn btn-inverse btn-close-container">'
'%s</a>' % _('Cancelar')),
Button(
'submit-form',
'Salvar',
css_class='btn-primary pull-right')
)
Row(
to_column((
Div(
Div(to_column((Field(
fields_form = Div(
Row(to_column((Field(
'tipo',
placeholder=_('Selecione um Tipo de Vide')), 12))),
Div(to_column((
Field(
Row(to_column((Field(
'texto',
placeholder=_(
'Texto Adicional ao Vide')), 12))),
Div(to_column((
Button(
'submit',
'Salvar',
css_class='btn btn-primary'), 12)))
), 4)),
to_column((
Div(
Div(to_column(('tipo_ta', 6))),
Div(to_column(('num_ta', 3)),
to_column(('ano_ta', 3))),
Div(to_column(
(Field(
placeholder=_('Texto Adicional ao Vide')), 12))),
Row(to_column((buttons, 12))))
fields_search = Div(
Row(
to_column(('tipo_ta', 6)),
to_column(('tipo_model', 6))),
Row(
to_column(('num_ta', 6)),
to_column(('ano_ta', 6))),
Row(to_column((FieldWithButtons(
Field(
'busca_dispositivo',
placeholder=_('Digite palavras, letras, '
'números ou algo'
' que estejam '
'no rótulo ou no texto.')), 10)),
to_column((
Button(
'buscar',
'Buscar',
css_class='btn btn-primary btn-busca'), 2))
'no rótulo ou no texto.')),
StrictButton("Buscar", css_class='btn-busca')), 12))),
Row(to_column(
(Div(css_class='container-busca'), 12)))
)
self.helper = FormHelper()
self.helper.layout = Layout(
Div(
Div(HTML(_('Vides')), css_class='panel-heading'),
Div(
to_column((
fields_form, 4)),
to_column((
fields_search, 8)), css_class="panel-body"
),
to_column(
(Div(css_class='container-busca'), 12))
), 8)
)
css_class="panel panel-primary"
)
)
if 'choice_model_type_foreignkey_in_extenal_views' in kwargs:
ch = kwargs.pop('choice_model_type_foreignkey_in_extenal_views')
if 'data' in kwargs:
choice = ch(kwargs['data']['tipo_ta'])
self.base_fields['tipo_model'].choices = choice
super(VideForm, self).__init__(*args, **kwargs)

28
compilacao/models.py

@ -473,7 +473,7 @@ class Publicacao(TimestampedMixin):
verbose_name_plural = _('Publicações')
def __str__(self):
return _('%s realizada em %s \n %s') % (
return _('%s realizada em %s \n <small>%s</small>') % (
self.tipo_publicacao,
defaultfilters.date(self.data, "d \d\e F \d\e Y"),
self.ta)
@ -624,9 +624,8 @@ class Dispositivo(BaseModel, TimestampedMixin):
)
def __str__(self):
return '%(rotulo)s - %(ta)s' % {
'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo),
'ta': self.ta}
return '%(rotulo)s' % {
'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo)}
def rotulo_padrao(self, local_insert=0, for_insert_in=0):
"""
@ -1145,19 +1144,24 @@ class Vide(TimestampedMixin):
return _('Vide %s') % self.texto
class Nota(TimestampedMixin):
NPRIV = 1
NINST = 2
NPUBL = 3
PUBLICIDADE_CHOICES = (
NPRIV = 1
NINST = 2
NPUBL = 3
NOTAS_PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility.
(NPRIV, _('Nota Privada')),
# All authenticated users have visibility.
(NINST, _('Nota Institucional')),
# All users have visibility.
(NPUBL, _('Nota Pública')),
)
)
class Nota(TimestampedMixin):
NPRIV = 1
NINST = 2
NPUBL = 3
titulo = models.CharField(
verbose_name=_('Título'),
@ -1181,7 +1185,7 @@ class Nota(TimestampedMixin):
owner = models.ForeignKey(User, verbose_name=_('Dono da Nota'))
publicidade = models.PositiveSmallIntegerField(
choices=PUBLICIDADE_CHOICES,
choices=NOTAS_PUBLICIDADE_CHOICES,
verbose_name=_('Nível de Publicidade'))
class Meta:

10
compilacao/templatetags/compilacao_filters.py

@ -36,15 +36,15 @@ def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia):
@register.simple_tag
def nota_automatica(dispositivo):
def nota_automatica(dispositivo, ta_pub_list):
if dispositivo.ta_publicado is not None:
d = dispositivo.dispositivo_atualizador.dispositivo_pai
if dispositivo.texto == Dispositivo.TEXTO_PADRAO_DISPOSITIVO_REVOGADO:
return 'Revogado pelo %s.' % d
elif not dispositivo.dispositivo_substituido:
return 'Inclusão feita pelo %s.' % d
return 'Revogado pelo %s - %s.' % (d, ta_pub_list[dispositivo.ta_publicado_id])
elif not dispositivo.dispositivo_substituido_id:
return 'Inclusão feita pelo %s - %s.' % (d, ta_pub_list[dispositivo.ta_publicado_id])
else:
return 'Alteração feita pelo %s.' % d
return 'Alteração feita pelo %s - %s.' % (d, ta_pub_list[dispositivo.ta_publicado_id])
return ''

186
compilacao/views.py

@ -1,6 +1,6 @@
import sys
from collections import OrderedDict
from datetime import datetime, timedelta
import sys
from braces.views import FormMessagesMixin
from django import forms
@ -29,6 +29,7 @@ from compilacao.models import (Dispositivo, Nota,
VeiculoPublicacao, Vide)
from sapl.crud import NO_ENTRIES_MSG, build_crud, make_pagination
DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo',
'ta_publicado',
@ -38,7 +39,9 @@ DISPOSITIVO_SELECT_RELATED = (
'dispositivo_atualizador__dispositivo_pai__ta',
'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta',
'dispositivo_pai',
'dispositivo_pai__tipo_dispositivo')
'dispositivo_pai__tipo_dispositivo',
'ta_publicado',
'ta',)
tipo_nota_crud = build_crud(
TipoNota, 'tipo_nota', [
@ -193,10 +196,11 @@ def get_integrations_view_names():
return result
def choice_extenal_views():
def choice_models_in_extenal_views():
integrations_view_names = get_integrations_view_names()
result = [(None, '-------------'), ]
for item in integrations_view_names:
if hasattr(item, 'model') and hasattr(item, 'model_type_foreignkey'):
ct = ContentType.objects.filter(
model=item.model.__name__.lower(),
app_label=item.model._meta.app_label)
@ -242,7 +246,7 @@ class TipoTaCreateView(FormMessagesMixin, CreateView):
self.object = None
form = self.get_form()
form.fields['content_type'] = forms.ChoiceField(
choices=choice_extenal_views(),
choices=choice_models_in_extenal_views(),
label=_('Modelo Integrado'), required=False)
return self.render_to_response(self.get_context_data(form=form))
@ -268,7 +272,7 @@ class TipoTaUpdateView(CompMixin, UpdateView):
self.object = self.get_object()
form = self.get_form()
form.fields['content_type'] = forms.ChoiceField(
choices=choice_extenal_views(),
choices=choice_models_in_extenal_views(),
label=_('Modelo Integrado'), required=False)
return self.render_to_response(self.get_context_data(form=form))
@ -321,7 +325,8 @@ class TaDetailView(DetailView):
def title(self):
if self.get_object().content_object:
return _(
'Metadados para o Texto Articulado da %s - %s') % (
'Metadados para o Texto Articulado de %s\n'
'<small>%s</small>') % (
self.get_object().content_object._meta.verbose_name_plural,
self.get_object().content_object)
else:
@ -444,9 +449,9 @@ class TextView(ListView, CompMixin):
context['cita'] = {}
for c in cita:
if str(c.dispositivo_base_id) not in context['cita']:
context['cita'][str(c.dispositivo_base_id)] = []
context['cita'][str(c.dispositivo_base_id)].append(c)
if c.dispositivo_base_id not in context['cita']:
context['cita'][c.dispositivo_base_id] = []
context['cita'][c.dispositivo_base_id].append(c)
citado = Vide.objects.filter(
Q(dispositivo_ref__ta_id=self.kwargs['ta_id'])).\
@ -458,9 +463,9 @@ class TextView(ListView, CompMixin):
context['citado'] = {}
for c in citado:
if str(c.dispositivo_ref_id) not in context['citado']:
context['citado'][str(c.dispositivo_ref_id)] = []
context['citado'][str(c.dispositivo_ref_id)].append(c)
if c.dispositivo_ref_id not in context['citado']:
context['citado'][c.dispositivo_ref_id] = []
context['citado'][c.dispositivo_ref_id].append(c)
notas = Nota.objects.filter(
dispositivo__ta_id=self.kwargs['ta_id']).select_related(
@ -468,9 +473,19 @@ class TextView(ListView, CompMixin):
context['notas'] = {}
for n in notas:
if str(n.dispositivo_id) not in context['notas']:
context['notas'][str(n.dispositivo_id)] = []
context['notas'][str(n.dispositivo_id)].append(n)
if n.dispositivo_id not in context['notas']:
context['notas'][n.dispositivo_id] = []
context['notas'][n.dispositivo_id].append(n)
tas_pub = [d.ta_publicado for d in self.object_list if d.ta_publicado]
tas_pub = set(tas_pub)
ta_pub_list = {}
for ta in tas_pub:
ta_pub_list[ta.pk] = str(ta)
context['ta_pub_list'] = ta_pub_list
# context['vigencias'] = self.get_vigencias()
return context
def get_queryset(self):
@ -601,7 +616,7 @@ class DispositivoView(TextView):
return itens
class TextEditView(TextView):
class TextEditView(ListView, CompMixin):
template_name = 'compilacao/text_edit.html'
flag_alteradora = -1
@ -611,14 +626,27 @@ class TextEditView(TextView):
pk_edit = 0
pk_view = 0
"""
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data(
object_list=self.object_list)
return ListView.get(self, request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(TextEditView, self).get_context_data(**kwargs)
return self.render_to_response(context)"""
ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id'])
self.object = ta
context['object'] = self.object
tas_pub = [d.ta_publicado for d in self.object_list if d.ta_publicado]
tas_pub = set(tas_pub)
ta_pub_list = {}
for ta in tas_pub:
ta_pub_list[ta.pk] = str(ta)
context['ta_pub_list'] = ta_pub_list
return context
def get_queryset(self):
self.pk_edit = 0
@ -1487,30 +1515,58 @@ class VideMixin(DispositivoSuccessUrlMixin):
return super(VideMixin, self).dispatch(*args, **kwargs)
def choice_model_type_foreignkey_in_extenal_views(id_tipo_ta=None):
result = [(None, '-------------'), ]
if not id_tipo_ta:
return result
tipo_ta = TipoTextoArticulado.objects.get(pk=id_tipo_ta)
integrations_view_names = get_integrations_view_names()
for item in integrations_view_names:
if hasattr(item, 'model_type_foreignkey'):
if (tipo_ta.content_type.model == item.model.__name__.lower() and
tipo_ta.content_type.app_label ==
item.model._meta.app_label):
for i in item.model_type_foreignkey.objects.all():
result.append((i.pk, i))
return result
class VideCreateView(VideMixin, CreateView):
model = Vide
template_name = 'compilacao/ajax_form.html'
form_class = VideForm
def post_old(self, request, *args, **kwargs):
try:
def get(self, request, *args, **kwargs):
self.object = None
ta_id = kwargs.pop('ta_id')
dispositivo_id = kwargs.pop('dispositivo_id')
form = VideForm(request.POST, request.FILES, **kwargs)
kwargs['ta_id'] = ta_id
kwargs['dispositivo_id'] = dispositivo_id
if form.is_valid():
vd = form.save(commit=False)
vd.save()
self.kwargs['pk'] = vd.pk
return self.form_valid(form)
else:
return self.form_invalid(form)
except Exception as e:
print(e)
return HttpResponse("error post")
if 'action' in request.GET and request.GET['action'] == 'get_tipos':
result = choice_model_type_foreignkey_in_extenal_views(
id_tipo_ta=request.GET['tipo_ta'])
itens = []
for i in result:
item = {}
item[i[0] if i[0] else ''] = str(i[1])
itens.append(item)
return JsonResponse(itens, safe=False)
form = self.get_form()
return self.render_to_response(self.get_context_data(form=form))
def get_form_kwargs(self):
kwargs = super(VideCreateView, self).get_form_kwargs()
if 'choice_model_type_foreignkey_in_extenal_views' not in kwargs:
kwargs.update({
'choice_model_type_foreignkey_in_extenal_views':
choice_model_type_foreignkey_in_extenal_views
})
return kwargs
class VideEditView(VideMixin, UpdateView):
@ -1589,7 +1645,59 @@ class DispositivoSearchFragmentFormView(ListView):
q = q & Q(pk=initial_ref)
n = 50
return Dispositivo.objects.filter(q)[:n]
result = Dispositivo.objects.filter(q).select_related('ta')
if 'tipo_model' not in self.request.GET:
return result[:n]
tipo_model = self.request.GET['tipo_model']
if not tipo_model:
return result[:n]
integrations_view_names = get_integrations_view_names()
tipo_ta = TipoTextoArticulado.objects.get(pk=tipo_ta)
model_class = None
for item in integrations_view_names:
if hasattr(item, 'model_type_foreignkey') and\
hasattr(item, 'model'):
if (tipo_ta.content_type.model ==
item.model.__name__.lower() and
tipo_ta.content_type.app_label ==
item.model._meta.app_label):
model_class = item.model
model_type_class = item.model_type_foreignkey
tipo_model = item.model_type_foreignkey.objects.get(
pk=tipo_model)
break
if not model_class:
return result[:n]
column_field = ''
for field in model_class._meta.fields:
if field.related_model == model_type_class:
column_field = field.column
break
if not column_field:
return result[:n]
r = []
for d in result:
if not d.ta.content_object or\
not hasattr(d.ta.content_object, column_field):
continue
if tipo_model.pk == getattr(d.ta.content_object, column_field):
r.append(d)
if len(r) == n:
break
return r
except Exception as e:
print(e)

2
materia/views.py

@ -1486,7 +1486,9 @@ class ProposicaoView(FormMixin, GenericView):
class MateriaTaView(IntegracaoTaView):
model = MateriaLegislativa
model_type_foreignkey = TipoMateriaLegislativa
class ProposicaoTaView(IntegracaoTaView):
model = Proposicao
model_type_foreignkey = TipoProposicao

8
norma/urls.py

@ -3,17 +3,17 @@ from django.conf.urls import include, url
from norma.views import (NormaIncluirView, NormaTaView, assunto_norma_crud,
norma_temporario_crud, tipo_norma_crud)
norma_url_patterns = norma_temporario_crud.urlpatterns
# norma_url_patterns = norma_crud.urlpatterns + []
norma_url_patterns = norma_temporario_crud.urlpatterns + [
url(r'^norma/(?P<pk>[0-9]+)/ta$',
NormaTaView.as_view(), name='ta')
]
urlpatterns = [
url(r'^norma/', include(norma_url_patterns,
norma_temporario_crud.namespace,
norma_temporario_crud.namespace)),
url(r'^norma/(?P<pk>[0-9]+)/ta$',
NormaTaView.as_view(), name='norma_ta'),
url(r'^sistema/norma/tipo/', include(tipo_norma_crud.urls)),
url(r'^sistema/norma/assunto/', include(assunto_norma_crud.urls)),

2
norma/views.py

@ -15,6 +15,7 @@ from .forms import NormaJuridicaForm
from .models import (AssuntoNorma, LegislacaoCitada, NormaJuridica,
TipoNormaJuridica)
assunto_norma_crud = build_crud(
AssuntoNorma, 'assunto_norma_juridica', [
@ -125,3 +126,4 @@ class NormaIncluirView(FormMixin, GenericView):
class NormaTaView(IntegracaoTaView):
model = NormaJuridica
model_type_foreignkey = TipoNormaJuridica

3
sapl/layout.py

@ -23,7 +23,8 @@ def to_fieldsets(fields):
def form_actions(more=[], save_label=_('Salvar')):
return FormActions(Submit('salvar', save_label), *more)
return FormActions(
Submit('salvar', save_label, css_class='pull-right'), *more)
class SaplFormLayout(Layout):

43
static/js/compilacao_notas.js

@ -1,24 +1,19 @@
function onEventsDneExec(pk) {
function onEventsDneExec(pk, model) {
$('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
});
refreshDatePicker()
$('#dne'+pk+" .primary").click(onSubmitEditForm);
$('#dne'+pk+" #button-id-submit-form").click(onSubmitEditForm);
$('#dne'+pk+" .btn-close-container").click(function(){
$(this).closest('.dne-nota').removeClass('dne-nota');
$(this).closest('.dne-form').html('');
});
if (model == 'nota') {
$('#dne'+pk+" select[name='tipo']").change(function(event) {
var url = '';
url = 'text/'+pk+'/nota/create?action=modelo_nota&id_tipo='+this.value;
@ -26,10 +21,29 @@ function onEventsDneExec(pk) {
$('#dne'+pk+" textarea[name='texto']").val(data);
});
});
}
else if (model == 'vide') {
$('#dne'+pk+" select[name='tipo_ta']").change(function(event) {
var url = '';
url = 'text/'+pk+'/vide/create?action=get_tipos&tipo_ta='+this.value;
$('#dne'+pk+" select[name='tipo_norma']"
).change(onChangeParamNorma);
$('#dne'+pk+" label[for='id_tipo_model']").html('Tipos de ' + this.children[this.selectedIndex].innerHTML);
var select = $('#dne'+pk+" select[name='tipo_model']");
select.empty();
$('<option value="">Carregando...</option>').appendTo(select);
$.get(url).done(function( data ) {
select.empty();
for(var item in data) {
for (var i in data[item])
$('<option value="'+i+'">'+data[item][i]+'</option>').appendTo(select);
}
});
});
$('#dne'+pk+" input[name='num_norma'], "
+ '#dne'+pk+" input[name='ano_norma'], "
+ '#dne'+pk+" input[name='busca_dispositivo']"
@ -38,9 +52,11 @@ function onEventsDneExec(pk) {
$('#dne'+pk+" .btn-busca").click(onChangeParamNorma);
onChangeParamNorma();
}
}
var onChangeParamNorma = function(event) {
var tipo_ta = $("select[name='tipo_ta']").val();
var tipo_model = $("select[name='tipo_model']").val();
var num_ta = $("input[name='num_ta']").val();
var ano_ta = $("input[name='ano_ta']").val();
var busca_dispositivo = $("input[name='busca_dispositivo']").val();
@ -55,6 +71,7 @@ var onChangeParamNorma = function(event) {
var formData = {
'tipo_ta' : tipo_ta,
'tipo_model' : tipo_model,
'num_ta' : num_ta,
'ano_ta' : ano_ta,
'busca' : busca_dispositivo,
@ -98,7 +115,7 @@ var onSubmitEditForm = function(event) {
if (typeof data == "string") {
if (data.indexOf('<form') >= 0) {
$('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo);
onEventsDneExec(id_dispositivo, model);
}
else {
$('#dne'+id_dispositivo+' .dne-form').closest('.dpt').html(data)
@ -152,7 +169,7 @@ function getForm(_this) {
$.get(url).done(function( data ) {
$('#dne'+id_dispositivo+' .dne-form').html(data);
onEventsDneExec(id_dispositivo);
onEventsDneExec(id_dispositivo, model);
}).fail(function() {
onReadyNotasVides();
});

8
static/js/compilacao_view.js

@ -30,7 +30,11 @@ function textoMultiVigente(item, diff) {
if ($(ldpts[i]).hasClass('displaynone'))
continue;
if (isElementInViewport( ldpts[i])) {
if (i+1 < ldpts.length)
elv = ldpts[i+1];
else {
elv = ldpts[i];
}
break;
}
}
@ -112,7 +116,11 @@ function textoVigente(item, link) {
if ($(ldpts[i]).hasClass('displaynone'))
continue;
if (isElementInViewport( ldpts[i])) {
if (i+1 < ldpts.length)
elv = ldpts[i+1];
else {
elv = ldpts[i];
}
break;
}
}

356
static/styles/compilacao.scss

@ -151,13 +151,19 @@ a:link:after, a:visited:after {
border: 1px dotted #ccc;
}
}
a {
text-decoration: none;
cursor: pointer;
}
.diff {
.desativado, .desativado * {
text-decoration: line-through;
color: #dbb !important;
color: #ddd !important;
font-size: 90%;
}
.added {
color: #018;
color: #04DE2C;
}
}
@ -254,19 +260,7 @@ a:link:after, a:visited:after {
margin-top: 2px;
}
a {
color: #444444;
&.link_alterador {
color: #2980B9;
font-size: 0.75em;
&:hover {
text-decoration: underline;
}
}
&.desativado {
@extend .desativado;
}
}
.bloco_alteracao {
padding-left: 10%;
@ -283,16 +277,14 @@ a:link:after, a:visited:after {
}
.dn { /* Notas de Dispositivo*/
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
position: relative;
font-size: 70%;
p, ul {
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
margin: 0 0 0 0;
list-style: none;
padding: 0;
}
.dnl { /* Lista Notas de Dispositivo*/
@ -305,7 +297,6 @@ a:link:after, a:visited:after {
.bullet {
padding: 0 0.333em;
padding-bottom: 0.2em;
display: inline-block;
}
.dnli {
@ -326,9 +317,10 @@ a:link:after, a:visited:after {
position: absolute;
background: transparent;
right: 0;
padding: 0.5em 0.5em 0em 0.5em;
padding: 0.2em 0.5em 0em 0.5em;
border: 1px solid #c7e3d3;
border-top: 0px;
font-size: 1.5rem;
li {
display: table-cell;
color: #aaa;
@ -347,17 +339,17 @@ a:link:after, a:visited:after {
.ntitulo {
font-weight: bold;
color: #676;
font-size: 90%;
color: #03A203;
text-decoration: none;
a{
a {
color: #294 !important;
}
}
.ntexto {
color: #787;
color: #06D806;
a{
color: #294 !important;
color: #03A203 !important;
}
}
}
@ -381,61 +373,140 @@ a:link:after, a:visited:after {
}
.dptt {
& > a {
color: #444444;
&.link_alterador {
color: #2980B9;
font-size: 0.75em;
&:hover {
text-decoration: underline;
}
}
&.desativado {
@extend .desativado;
}
}
.dne {
text-decoration: none;
position: absolute;
display: block;
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
text-align: left;
right: 0;
left: 0;
top: 0;
height: 0;
transform: scaleX(0);
transform-origin: right;
transition: all 0.3s ease;
top: 0;
left: -1.6em;
right: -1.6em;
background-color: #2980b9;
z-index: 18;
* {
font-size: 0.8rem;
font-weight: normal;
line-height: 1rem;
text-decoration: none !important;
border-top: 1px solid $color_buttons;
ul.btns-action {
list-style: none;
padding: 0;
position: absolute;
right: 0;
background-color: $color_buttons;
li {
float: left;
&:hover {
background-color: rgba(#000, 0.1);
}
a {
color: white;
padding: 0.15em 1em 0;
display: inline-block;
&:hover {
}
}
}
}
}
.dne-nota {
position: relative;
transform: scaleX(1);
height: auto;
border-top: 0px;
ul.btns-action {
position: absolute;
margin: 0 0 0 0;
display: table;
display: none;
}
.dne-form {
margin: 1em -2em 0em;
text-align: left;
font-size: 1.6rem;
.container-busca {
ul{
list-style: none;
clip: rect(0,0,0,0);
opacity: 0;
transition: opacity 1.5s linear, clip 1s linear;
display: table;
margin-left: 0;
border-collapse:separate;
border-spacing: 0;
top: 0px;
right: 0px;
z-index: 19;
border-spacing:1px;
padding: 0px;
li {
display: table-row;
&:nth-child(even) {
background-color: rgba(0, 0, 0, 0.05);
}
&:nth-child(odd) {
background-color: rgba(0, 0, 0, 0.08);
}
.iteminput {
display: table-cell;
background-color: $color_buttons;
a {
font-size: 155%;
padding: 0.4em 0.8em;
display: inline-block;
float: right;
color: #fff !important;
&:hover {
padding: 0.5em;
vertical-align: middle;
text-align: center;
input {
margin: 0;
}
}
.itemlabel {
display: table-cell;
padding: 0.5em;
vertical-align: middle;
width: 100%;
label {
line-height: 1;
font-family: "SourceSansPro", Helvetica, Arial, sans-serif;
}
}
}
}
.ta_title {
padding: 0.15em 0.7em;
background-color: rgba(0, 0, 0, 0.15);
margin: 0.1em 0.08em 0 0.1em;
}
.nomenclatura_heranca {
font-size: 90%;
color: #057dba;
}
}
}
}
&:hover {
.dne {
height: 0.1667rem;
transform: scaleX(1);
transition-delay: 1s;
}
.dne-nota {
height: auto;
transition-delay: 0s;
}
}
.dne-nota111 {
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);
position: relative;
@ -451,7 +522,7 @@ a:link:after, a:visited:after {
display: none;
}
.dne-form {
.dne-form111 {
.asterisk {
color: transparent;
&::before {
@ -592,114 +663,56 @@ a:link:after, a:visited:after {
}
}
}
&:hover {
.dne {
height: 0.1667rem;
transform: scaleX(1);
transition-delay: 1s;
ul.btns-action {
clip: rect(-100px, 2000px, 2000px, -100px);
opacity: 1;
transition: opacity 0.5s linear, clip 0s 0.3s;
li {
a {
}
}
}
}
.dne-nota {
height: auto;
transition-delay: 0s;
}
}
}
} /* and dpt */
.top-bar {
line-height: 1.6rem;
height: auto;
background: #2980B9;
z-index:1;
margin: 0 auto;
max-width: 62.5rem;
}
.top-bar-section {
li:not(.has-form) {
a:not(.button) {
@extend .top-bar;
padding: 0 0.43333rem;
&.selected, &:hover {
background: #1056A0;
}
}
}
}
ul.nav {
background: #2980B9;
display:block;
width: 100%;
z-index:1;
}
.tipo-vigencias {
border-top: 1px solid #62B5B5;
list-style: none;
position: fixed;
bottom: 0;
transform: translate(-50%,0);
bottom: 0px;
left: 50%;
}
.vigencias {
margin: 2.5em 0 0 0;
transition: all .4s ease-in-out;
background: #2980B9;
clear:both;
}
.fixed{
z-index:98;
opacity: 0.2;
transition: all 2s ease-in-out;
-webkit-transition-delay: 3s; /* Safari */
transition-delay: 3s;
transform: translate(-50%, 0);
margin: 0;
padding: 0;
background-color: $color_buttons;
z-index: 1000;
&:hover {
-webkit-transition-delay: 0s; /* Safari */
transition-delay: 0s;
transition: all 0.3s ease-in-out;
opacity: 0.9;
transition: all 0.3s ease-in-out;
&::-webkit-scrollbar {
width: 10px;
height: 10px;
li {
display: inline-block;
border-left: 1px solid #fff;
float: left;
a {
color: white;
padding: 0.3em 1em 0;
display: inline-block;
font-size: 110%;
cursor: pointer;
&.selected {
background-color: rgba(0, 0, 0, 0.5);
}
&::-webkit-scrollbar-thumb:vertical {
height: 30px;
background-color: rgba(0, 0, 0, 0.1);
}
&:hover {
background-color: rgba(0, 0, 0, 0.2);
}
}
&:hover {
opacity: 1;
}
}
} /* end cp */
.cpe {
.cp.cpe {
@extend .cp;
margin-bottom: 15em;
margin-left: 0.8em;
a {
text-decoration: none;
cursor: pointer;
}
.dpt {
@ -1141,6 +1154,7 @@ a:link:after, a:visited:after {
min-height: 12.6em;
border: 0px;
font-size: 120%;
width: 100%;
&:focus {
background: #fff;
}
@ -1173,53 +1187,7 @@ a:link:after, a:visited:after {
}
}
}
.btn-busca {
background-color: #0093dd;
&:hover {
background-color: #007ebe;
}
&:focus {
background-color: #036190;
}
}
.btn-close-container{
position: absolute;
background-color: #AAA;
width: 2em;
height: 2em;
border: 0.3em solid #FFF;
top: -0.9em;
right: -0.9em;
border-radius: 50%;
cursor: pointer;
opacity: 0.7;
transform: rotate(45deg);
z-index: 98;
.icon-close{
background: #FFF;
height: 1.2em;
position: absolute;
width: 0.2em;
top: 0.15em;
left: 0.66em;
&::after {
background: #FFF;
content: "";
height: 0.2em;
left: -0.5em;
position: absolute;
top: 0.48em;
width: 1.2em;
}
}
&:hover{
opacity: 1;
}
}
.class_color_container {
background: #ddd !important;

11
templates/base.html

@ -155,7 +155,7 @@
{% block title %}
{% if view.title %}
<h1 class="page-header">{{ view.title|linebreaksbr }}</h1>
<h1 class="page-header">{{ view.title|safe|linebreaksbr }}</h1>
{% endif %}
{% endblock %}
@ -217,7 +217,7 @@
{% block foot_js %}
<!-- Bootstrap core JavaScript ================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="{% static 'jquery/dist/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'bootstrap-sass/assets/javascripts/bootstrap.min.js' %}"></script>
<script type="text/javascript" src="{% static 'jQuery-runner/build/jquery.runner.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-mask-plugin/dist/jquery.mask.js' %}"></script>
@ -225,7 +225,14 @@
<script src="{% static 'jquery-ui/jquery-ui.min.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-ui/ui/i18n/datepicker-pt-BR.js' %}"></script>
{# Scripts #}
{# modernizr must be in head (see http://modernizr.com/docs/#installing) #}
<script type="text/javascript" src="{% static 'jQuery-runner/build/jquery.runner.js' %}"></script>
<script type="text/javascript" src="{% static 'jquery-mask-plugin/dist/jquery.mask.js' %}"></script>
<script src="{% static 'tinymce/tinymce.min.js' %}"></script>
<script type="text/javascript" src="{% static 'jsdiff/diff.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/app.js' %}"></script>
{% block extra_js %}{% endblock %}

1
templates/compilacao/ajax_form.html

@ -1,3 +1,2 @@
{% load crispy_forms_tags %}
<div class="btn-close-container"><div class="icon-close"></div></div>
{% crispy form form.helper%}

19
templates/compilacao/publicacao_detail.html

@ -1,19 +1,24 @@
{% extends "base.html" %} {% load i18n %} {% load compilacao_filters %}
{% load common_tags %}
{% block base_content %} {# FIXME is this the best markup to use? #}
<div class="clearfix">
{% block base_content %}
<div class="clearfix">
{% block actions %}
<ul class="button-group right">
<li><a href="{% url 'ta_pub_edit' object.ta.pk object.pk %}" class="button tiny">{% trans 'Editar' %}</a></li>
<li><a href="{% url 'ta_pub_delete' object.ta.pk object.pk %}" class="button alert tiny">{% trans 'Excluir' %}</a></li>
</ul>
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'ta_pub_edit' object.ta.pk object.pk %}" class="btn btn-default">{% trans 'Editar' %}</a>
<a href="{% url 'ta_pub_delete' object.ta.pk object.pk %}" class="btn btn-default">{% trans 'Excluir' %}</a>
</div>
{% endblock actions %}
</div>
<div class="actions btn-group pull-right" role="group">
{% block sections_nav %}
{% endblock %}
</div>
</div>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>

3
templates/compilacao/publicacao_list.html

@ -10,8 +10,7 @@
{% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.Publicacao'%}
</a>
{% block more_buttons %}
<a href="{% url 'ta_text' view.kwargs|lookup:'ta_id' %}" class="btn btn-default">{% trans 'Voltar' %}</a>
<a href="{% url 'ta_text' view.kwargs.ta_id %}" class="btn btn-default">{% trans 'Voltar' %}</a>
{% endblock more_buttons %}
</div>

28
templates/compilacao/text_edit.html

@ -6,26 +6,38 @@
{% load crispy_forms_tags %}
{% load common_tags %}
{% block head_content %}{{block.super}}
<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_edit.js' %}"></script>
{% endblock %}
{% block title%}
<h1><b>Edição:</b> {{ view.title }} - <i>{% trans 'Texto Multivigente' %}</i></h1>
{% endblock %}
<div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div>
{% block base_content %}{{block.super}}
<div id="message_block"><div id="msg">{% trans 'Aguarde... Atualizando informações!!!'%}</div></div>
<div class="cpe">
<div class="cp cpe">
{% include 'compilacao/text_edit_bloco.html'%}
</div>
{% endblock base_content %}
{% block actions %}
<div class="clearfix">
<div class="actions btn-toolbar pull-right" role="toolbar">
<div class="actions btn-group" role="group">
<a href="{% url 'ta_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Metadados do Texto Articulado' %}</a>
</div>
{% include 'compilacao/textoarticulado_menu_config.html' %}
</div>
</div>
{% endblock actions %}
{% block foot_js %}
{{block.super}}
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_edit.js' %}"></script>
{% endblock %}

9
templates/compilacao/text_edit_bloco.html

@ -14,7 +14,6 @@
<div class="dpt" id="dpt{{dpt.pk}}" pk="{{dpt.pk}}">
{% endif%}
{% if view|render_actions_head:dpt %}
<div class="csform">
<form method="post" action="" action_ajax="{{dpt.pk}}/refresh">
@ -47,10 +46,10 @@
<ul class="actions_inserts {% if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}menu_flutuante{%endif%}">
{% if dpt.dispositivo_subsequente == None %}
{% for inserts in view|select_provaveis_inserts:request %}
<li class="{{inserts|lookup:'action'}}"><a class="btn-inserts" action="" pk="{{dpt.pk}}">{{inserts|lookup:'icone'|safe}}<span>{{inserts|lookup:'tipo_insert'}}</span></a>
<li class="{{inserts.action}}"><a class="btn-inserts" action="" pk="{{dpt.pk}}">{{inserts.icone|safe}}<span>{{inserts.tipo_insert}}</span></a>
<ul id="afe{{dpt.id}}" >
{% for item in inserts|lookup:'itens' %}
<li><a class="btn-inserts btn-action" action="{{inserts|lookup:'action'}}" pk="{{item|lookup:'dispositivo_base'}}" variacao="{{item|lookup:'variacao'}}" tipo_pk="{{item|lookup:'tipo_pk'}}">{{item|lookup:'provavel'}}</a></li>
{% for item in inserts.itens %}
<li><a class="btn-inserts btn-action" action="{{inserts|lookup:'action'}}" pk="{{item.dispositivo_base}}" variacao="{{item.variacao}}" tipo_pk="{{item.tipo_pk}}">{{item.provavel}}</a></li>
{% endfor %}
</ul>
</li>
@ -111,7 +110,7 @@
{% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{%url 'ta_text_edit' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dpt %}
{% nota_automatica dpt ta_pub_list %}
{{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}

114
templates/compilacao/text_list.html

@ -5,94 +5,90 @@
{% load staticfiles %}
{% load sass_tags %}
{% block head_content %}{{block.super}}
{% block head_content %}
{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
<script type="text/javascript" src="{% static 'jsdiff/diff.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_view.js' %}"></script>
{% if perms.compilacao.add_nota %}
<script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script>
{% endif %}
{% endblock %}
{% block base_content %}
{% block actions %}
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>
{% endblock actions %}
{% block base_content %}{{block.super}}
{% block detail_content %}{{block.super}}
{% endblock %}
<div class="cp">
{% if object_list %}
<ul class="button-group right">
<li><a class="button tiny" id="btn_font_menos" title="Diminuir tamanho da letra">a</a></li>
<li><a class="button tiny" id="btn_font_mais" title="Aumentar tamanho da Letra">A</a></li>
</ul>
{% endif %}
{% for key, values in view.get_vigencias.items %}
{% if object_list %}
<div class="clearfix">
<div class="actions btn-group pull-right" role="group">
<a class="btn btn-default" id="btn_font_menos" title="Diminuir tamanho da letra">a</a>
<a class="btn btn-default" id="btn_font_mais" title="Aumentar tamanho da Letra">A</a>
</div>
</div>
{% endif %}
{% for key, values in view.get_vigencias.items %}
{% if forloop.first %}
<section class="vigencias">
<nav class="top-bar" data-topbar="" role="navigation">
<section class="top-bar-section">
<ul class="nav left">
{%endif%}
<li class="nav__item has-dropdown">
<ul class="nav nav-pills">
{% endif %}
{% if forloop.first %}
{% for dispositivo in values %}
<a class="nav__link {% if view.inicio_vigencia == dispositivo.inicio_vigencia %}selected{%endif%}" href="{%url 'ta_vigencia' dispositivo.ta.pk dispositivo|get_sign_vigencia %}" title="{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}">{% trans 'Texto Original'%}</a>
<li class="{% if view.inicio_vigencia == dispositivo.inicio_vigencia %}active{%endif%}"><a href="{%url 'ta_vigencia' dispositivo.ta_id dispositivo|get_sign_vigencia %}" title="{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}">{% trans 'Texto Original'%}</a>
{% endfor %}
{% elif forloop.last %}
{% for dispositivo in values %}
<a class="nav__link {% if view.inicio_vigencia == None %}selected{%endif%}" href="{%url 'ta_text' dispositivo.ta.pk %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{{dispositivo.ta_publicado}}">{% trans 'Texto Atual'%}</a>
<li class="{% if not view.inicio_vigencia%}active{% endif %}"><a href="{%url 'ta_text' dispositivo.ta_id %}" title="{% trans 'Compilação atual'%}.&#013;{% trans 'Vigência a partir de'%} {{dispositivo.inicio_vigencia}}&#013;{% if dispositivo.ta_publicado_id in ta_pub_list %}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{{dispositivo.ta_publicado}}{%endif%}">{% trans 'Texto Atual'%}</a>
{% if forloop.last %}
</ul>
{% if view.inicio_vigencia and view.fim_vigencia %}
<span class="vigencia-active">{% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>.</span>
{% else%}
<span class="vigencia-active">{% trans 'Vigência a partir de '%} <b>{{dispositivo.inicio_vigencia}}.</b></span>
{%endif%}
{% endif%}
{% endfor %}
{% else %}
<a class="nav__link {% if view.inicio_vigencia.year == key %}selected{%endif%}">{{ key }}</a>
<li class="{% if view.inicio_vigencia.year == key %}active{% endif %}"><a data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">{{ key }}</a>
{%endif%}
{% if not forloop.first and not forloop.last %}
<ul class="nav__sub-nav dropdown">
<ul class="dropdown-menu">
{% for dispositivo in values %}
<li class="nav__sub-item">
<li>
{% if not forloop.parentloop.first %}
<a class="nav__sub-link" href="{%url 'ta_vigencia' dispositivo.ta.pk dispositivo|get_sign_vigencia %}" title="{{ dispositivo.ta_publicado }}">{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}</a>
{%endif%}
<a href="{%url 'ta_vigencia' dispositivo.ta_id dispositivo|get_sign_vigencia %}" title="{% if dispositivo.ta_publicado_id in ta_pub_list%}{{ ta_pub_list|lookup:dispositivo.ta_publicado_id }}{%else%}{{dispositivo.ta_publicado}}{%endif%}">{% trans 'Vigência entre'%} {{dispositivo.inicio_vigencia}} {% trans 'e'%} {{dispositivo.fim_vigencia}}</a>
{% endif %}
</li>
{% endfor %}
</ul>
{%endif%}
{% endif %}
</li>
{% if forloop.last %}
</ul>
{% comment %}
<ul class="nav left tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this);" title="">{% trans 'Texto Multivigente'%}</a></li>
<li><a onclick="textoVigente(this, true);">{% trans 'Texto Vigente COM Links para Textos Alteradores'%}</a></li>
<li><a onclick="textoVigente(this, false);">{% trans 'Texto Vigente SEM Links para Textos Alteradores'%}</a></li>
</ul>
{% endcomment %}
{% endfor %}
<ul class="tipo-vigencias">
<ul class="tipo-vigencias">
<li><a class="selected" onclick="textoMultiVigente(this, false);" title="{% trans 'Texto Multivigente Sequencial'%}">{% trans 'TMS'%}</a></li>
<li><a onclick="textoMultiVigente(this, true);" title="{% trans 'Texto Multivigente Integrado com Realce de Alterações'%}">{% trans 'TMI'%}</a></li>
<li><a onclick="textoVigente(this, true);" title="{% trans 'Texto Vigente COM Links para Textos Alteradores'%}">{% trans 'TVL'%}</a></li>
<li><a onclick="textoVigente(this, false);" title="{% trans 'Texto Vigente'%}">{% trans 'TVT'%}</a></li>
</ul>
</section>
</nav>
</section>
{%endif%}
{% endfor %}
<br>
{% if view.inicio_vigencia != None and view.fim_vigencia != None %}
{% trans 'Vigência entre'%} <b>{{view.inicio_vigencia}}</b> {% trans 'e'%} <b>{{view.fim_vigencia}}</b>.
{%endif%}
</ul>
{% include 'compilacao/text_list_bloco.html'%}
</div>
{% endblock base_content %}
{% block foot_js %}
{{block.super}}
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
<script type="text/javascript" src="{% static 'js/compilacao_view.js' %}"></script>
{% if perms.compilacao.add_nota %}
<script type="text/javascript" src="{% static 'js/compilacao_notas.js' %}"></script>
{% endif %}
{% endblock %}

18
templates/compilacao/text_list_bloco.html

@ -20,23 +20,27 @@
{% spaceless %}
<div class="{{ dpt.tipo_dispositivo.class_css }}">
<div class="dptt {% dispositivo_desativado dpt view.inicio_vigencia view.fim_vigencia %}" id="dptt{{dpt.pk}}" >
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}<span class="dtxt" id="d{% if not dpt.dispositivo_subsequente and dpt.dispositivo_substituido %}a{%endif%}{{dpt.pk}}" pks="{{dpt.dispositivo_substituido.pk}}" pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto%}{{ dpt.texto|safe }}{%else%}&nbsp;{%endif%}</span>
{% if dpt.ta_publicado_id != None and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
{{ dpt.tipo_dispositivo.rotulo_prefixo_html|safe }}
<a name="{{dpt.pk}}" title="{{dpt.pk}}">{{ dpt.rotulo }}</a>
{{ dpt.tipo_dispositivo.rotulo_sufixo_html|safe }}
<span class="dtxt" id="d{% if not dpt.dispositivo_subsequente_id and dpt.dispositivo_substituido_id %}a{%endif%}{{dpt.pk}}" pks="{{dpt.dispositivo_substituido_id|default:''}}" pk="{{dpt.pk}}">{{ dpt.tipo_dispositivo.texto_prefixo_html|safe }}{%if dpt.texto %}{{ dpt.texto|safe }}{%else%}{%if not dpt.tipo_dispositivo.dispositivo_de_articulacao %}&nbsp;{%endif%}{%endif%}</span>
{% if dpt.ta_publicado_id and not dpt.tipo_dispositivo.dispositivo_de_articulacao %}
<a class="link_alterador" href="{%url 'ta_text' dpt.ta_publicado.pk %}#{{dpt.dispositivo_atualizador_id}}">
{{ dpt.tipo_dispositivo.nota_automatica_prefixo_html|safe }}
{% nota_automatica dpt %}
{% nota_automatica dpt ta_pub_list %}
{{ dpt.tipo_dispositivo.nota_automatica_sufixo_html|safe }}
</a>
{% endif %}
{% if user.is_authenticated and not dpt.tipo_dispositivo.dispositivo_de_articulacao%}
{% if perms.compilacao.add_nota or perms.compilacao.add_vide or perms.compilacao.change_dispositivo%}
<div class="dne" id="dne{{dpt.pk}}" pk="{{dpt.pk}}">{# TODO: User - dne - Dispostivo Nota Editor - tratar permissão de usuário#}
<div class="dne" id="dne{{dpt.pk}}" pk="{{dpt.pk}}">
<ul class="btns-action">
{% if perms.compilacao.change_dispositivo %}<li><a href = "{% url 'ta_text_edit' dpt.ta.pk%}#{{dpt.pk}}" class="btn-action" title="{% trans 'Editar Dispositivo'%}">Ed</a></li>{% endif %}
{% if perms.compilacao.add_nota %}<li><a class="btn-action btn-nota-create" model="nota" pk="{{dpt.pk}}" title="{% trans 'Adicionar Nota'%}">N</a></li>{% endif %}
{% if perms.compilacao.add_vide %}<li><a class="btn-action btn-vide-create" model="vide" pk="{{dpt.pk}}" title="{% trans 'Adicionar Vide'%}">V</a></li>{% endif %}
</ul>
<div class="dne-form"></div>
<div class="dne-form clearfix"></div>
</div>
{% endif %}
{% endif%}
@ -107,7 +111,7 @@
{% if notas and notas|lookup:dpt.pk %}
{% for nota in notas|lookup:dpt.pk %}
{% if user.is_superuser or nota.publicidade == nota.NPUBL or nota.publicidade == nota.NINST and user.is_authenticated or nota.publicidade = nota.NPRIV and nota.owner == user %}
{% if user.is_superuser or nota.publicidade == nota.NPUBL or nota.publicidade == nota.NINST and user.is_authenticated or nota.publicidade == nota.NPRIV and nota.owner == user %}
{%if not forloop.first %}<li class="bullet">&#8226;</li>{%endif%}
<li class="dnli" id="nt{{nota.pk}}">
<ul>
@ -153,7 +157,7 @@
{% endif%}
</div>
{% endspaceless %}
{% if view.is_ta_alterador and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{% if ta_pub_list and dpt.tipo_dispositivo.class_css == 'bloco_alteracao'%}
{%with node=dpt template_name='compilacao/text_list_blocoalteracao.html' %}
{%include template_name%}
{%endwith%}

1
templates/compilacao/text_list_blocoalteracao.html

@ -1,6 +1,5 @@
{% load compilacao_filters %}
{% load common_tags %}
<i class="fa fa-quote-left fa-2x fa-pull-left fa-border"></i>
{% for ch in dpt.pk|get_bloco_atualizador %}
{% spaceless %}
{% if ch.visibilidade %}

50
templates/compilacao/textoarticulado_detail.html

@ -3,46 +3,34 @@
{% load compilacao_filters %}
{% load common_tags %}
{% block sections_nav %}
{% block sections_nav %}
<ul class="nav nav-pills navbar-right">
{%if object %}
<div class="actions btn-group pull-right" role="group">
<li>
{% if object.content_object%}
<a href="{% url object|urldetail_content_type object.content_object.pk %}"title="{% trans 'Ir para '%}{{object.content_object}}" class="btn btn-default">Início</a>
<a href="{% url object|urldetail_content_type object.content_object.pk %}" title="{% trans 'Ir para '%}{{object.content_object}}">Início</a>
{%else%}
<a href="{% url 'ta_detail' object.pk %}" class="btn btn-default">{% trans 'Início' %}</a>
<a href="{% url 'ta_detail' object.pk %}">{% trans 'Início' %}</a>
{%endif%}
<a href="{% url 'ta_pub_list' object.pk %}" class="btn btn-default">{% model_verbose_name_plural 'compilacao.models.Publicacao' %}</a>
<a href="{% url 'ta_text' object.pk %}" class="btn btn-default">{% trans 'Texto' %}</a>
<a href="{% url 'ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Edição do Texto' %}</a>
</div>
</li>
<li><a href="{% url 'ta_pub_list' object.pk %}">{% model_verbose_name_plural 'compilacao.models.Publicacao' %}</a></li>
<li><a href="{% url 'ta_text' object.pk %}">{% trans 'Texto da Norma' %}</a></li>
{%endif %}
{% endblock %}
</ul>
{% endblock %}
{% block base_content %}
{% block base_content %} {# FIXME is this the best markup to use? #}
{% block actions %}
<div class="clearfix">
{% block actions %}
<ul class="button-group right">
<div class="actions btn-group pull-right" role="group">
<a href="{% url 'ta_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Metadados do Texto Articulado' %}</a>
<a href="{% url 'ta_text_edit' object.pk %}" class="btn btn-default">{% trans 'Editar Texto' %}</a>
</div>
</div>
{% endblock actions %}
{%if object %}
<li><a href="{% url 'ta_edit' object.pk %}" class="button tiny">{% trans 'Edição dos Metadados do Texto Articulado' %}</a></li>
<li><a href="{% url 'ta_delete' object.pk %}" class="button alert tiny">{% trans 'Excluir' %}</a></li>
{%endif%}
<li><a href="#" class="button tiny" data-dropdown="drop"><i class="fi-widget"></i></a>
<ul id="drop" class="tiny f-dropdown" data-dropdown-content>
<li><a href="{% url 'tipo_ta_list' %}">{%model_verbose_name_plural 'compilacao.models.TipoTextoArticulado'%}</a></li>
<li><a href="{% url 'tipopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoPublicacao'%}</a></li>
<li><a href="{% url 'veiculopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.VeiculoPublicacao'%}</a></li>
<li><a href="{% url 'tiponota:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoNota'%}</a></li>
<li><a href="{% url 'tipovide:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoVide'%}</a></li>
<li><a href="#">TODO: Tipo de Dispositivo</a></li>
<li><a href="#">TODO: Perfil Estrutural de Textos Articulados</a></li>
</ul></li>
</ul>
{% endblock actions %}
</div>
{% block detail_content %} {# TODO replace fieldset for something semantically correct, but with similar visual grouping style #}
<fieldset>

16
templates/compilacao/textoarticulado_list.html

@ -4,21 +4,21 @@
{% load common_tags %}
{% block base_content %}
{% block actions %}{{block.super}}
{% block detail_content %}
{% endblock detail_content %}
{% endblock actions %}
{% block detail_content %}
{% endblock detail_content %}
<div class="actions btn-group pull-right" role="group">
{% block actions %}
<div class="actions btn-group pull-right clearfix" role="group">
<a href="{{ view.create_url }}" class="btn btn-default">
{% trans 'Adicionar'%} {%model_verbose_name 'compilacao.models.TextoArticulado'%}
</a>
{% include 'compilacao/textoarticulado_menu_config.html' %}
{% block more_buttons %}
{% endblock more_buttons %}
</div>
</div>
{% endblock actions %}
<table class="table table-striped table-hover">
<thead>

17
templates/compilacao/textoarticulado_menu_config.html

@ -0,0 +1,17 @@
{% load i18n %}
{% load common_tags %}
<div class="btn-group" role="group">
<button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-cog fa-1x fa-fw"></i>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="{% url 'tipo_ta_list' %}">{%model_verbose_name_plural 'compilacao.models.TipoTextoArticulado'%}</a></li>
<li><a href="{% url 'tipopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoPublicacao'%}</a></li>
<li><a href="{% url 'veiculopublicacao:list' %}">{%model_verbose_name_plural 'compilacao.models.VeiculoPublicacao'%}</a></li>
<li><a href="{% url 'tiponota:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoNota'%}</a></li>
<li><a href="{% url 'tipovide:list' %}">{%model_verbose_name_plural 'compilacao.models.TipoVide'%}</a></li>
<li><a href="#">TODO: Tipo de Dispositivo</a></li>
<li><a href="#">TODO: Perfil Estrutural de Textos Articulados</a></li>
</ul>
</div>

2
templates/norma/normajuridica_detail.html

@ -10,7 +10,7 @@
e a view NormaTa(IntegracaoTaView) em views.py
Em nada mais a integração interfere em Norma Jurídica
{% endcomment %}
<a href="{% url 'norma_ta' object.pk %}" class="btn btn-default">{% trans 'Texto' %}</a>
<a href="{% url 'normajuridica:ta' object.pk %}" class="btn btn-default">{% trans 'Texto da Norma' %}</a>
</div>
{% endblock sections_nav %}

Loading…
Cancel
Save