Browse Source

Criar template da edição avançada - issue #14

pull/299/head
LeandroRoberto 9 years ago
parent
commit
68ef0264db
  1. 96
      compilacao/forms.py
  2. 14
      compilacao/migrations/0045_auto_20160311_1117.py
  3. 17
      compilacao/models.py
  4. 4
      compilacao/templatetags/compilacao_filters.py
  5. 6
      compilacao/urls.py
  6. 2
      compilacao/utils.py
  7. 84
      compilacao/views.py
  8. 25
      static/js/app.js
  9. 17
      static/js/compilacao.js
  10. 44
      static/js/compilacao_edit.js
  11. 4
      static/js/compilacao_notas.js
  12. 23
      static/styles/compilacao.scss
  13. 2
      static/styles/style_tinymce.css
  14. 67
      templates/compilacao/dispositivo_form.html
  15. 28
      templates/compilacao/dispositivo_form_parents.html
  16. 6
      templates/compilacao/form.html
  17. 55
      templates/compilacao/text_edit.html
  18. 17
      templates/compilacao/text_edit_bloco.html

96
compilacao/forms.py

@ -464,16 +464,100 @@ class PublicacaoForm(ModelForm):
pass
class DispositivoForm(ModelForm):
class DispositivoIntegerField(forms.IntegerField):
def __init__(self, field_name=None, *args, **kwargs):
if 'required' not in kwargs:
kwargs.setdefault('required', False)
self.widget = forms.NumberInput(
attrs={'title': Dispositivo._meta.get_field(
field_name).verbose_name,
'onchange': 'atualizaRotulo()'})
super(DispositivoIntegerField, self).__init__(
min_value=0, *args, **kwargs)
class DispositivoEdicaoBasicaForm(ModelForm):
texto = forms.CharField(
widget=forms.Textarea,
required=False)
dispositivo1 = DispositivoIntegerField(
label=('1ª %s' % _('Variação')),
field_name='dispositivo1')
dispositivo2 = DispositivoIntegerField(
label=('2ª'),
field_name='dispositivo2')
dispositivo3 = DispositivoIntegerField(
label=('3ª'),
field_name='dispositivo3')
dispositivo4 = DispositivoIntegerField(
label=('4ª'),
field_name='dispositivo4')
dispositivo5 = DispositivoIntegerField(
label=('5ª'),
field_name='dispositivo5')
rotulo = forms.CharField(label=_('Rótulo Resultante'))
class Meta:
model = Dispositivo
fields = []
fields = (
'dispositivo0',
'dispositivo1',
'dispositivo2',
'dispositivo3',
'dispositivo4',
'dispositivo5',
'rotulo',
'texto')
widgets = {
'dispositivo0': forms.NumberInput(
attrs={'title': _('Valor 0(zero) é permitido apenas '
'para Dispositivos com tipos variáveis.'),
'onchange': 'atualizaRotulo()'})}
def __init__(self, *args, **kwargs):
layout = []
rotulo_fieldset = to_row([
('dispositivo0', 3),
('dispositivo1', 2),
('dispositivo2', 1),
('dispositivo3', 1),
('dispositivo4', 1),
('dispositivo5', 1),
('rotulo', 3)
])
layout.append(
Fieldset(
_('Montagem do Rótulo'),
rotulo_fieldset,
css_class="col-md-12"))
# Campo Texto
row_texto = to_row([('texto', 12)])
css_class_texto = "col-md-12"
if 'instance' in kwargs and\
kwargs['instance'].tipo_dispositivo.dispositivo_de_articulacao:
css_class_texto = "col-md-12 hidden"
layout.append(
Fieldset(
Dispositivo._meta.get_field('texto').verbose_name,
row_texto,
css_class=css_class_texto))
self.helper = FormHelper()
"""self.helper.layout = SaplFormLayout(
Fieldset(Publicacao._meta.verbose_name,
row1, row2, row3, css_class="col-md-12"))"""
if layout:
self.helper.layout = SaplFormLayout(*layout)
else:
self.helper.layout = SaplFormLayout()
super(PublicacaoForm, self).__init__(*args, **kwargs)
super(DispositivoEdicaoBasicaForm, self).__init__(*args, **kwargs)

14
compilacao/migrations/0044_auto_20160301_1816.py → compilacao/migrations/0045_auto_20160311_1117.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2016-03-01 21:16
# Generated by Django 1.9 on 2016-03-11 14:17
from __future__ import unicode_literals
from django.db import migrations, models
@ -9,7 +9,7 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('compilacao', '0043_auto_20160110_1733'),
('compilacao', '0044_auto_20160307_0918'),
]
operations = [
@ -23,4 +23,14 @@ class Migration(migrations.Migration):
name='dispositivo_substituido',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='compilacao.Dispositivo', verbose_name='Dispositivo Substituido'),
),
migrations.AlterField(
model_name='dispositivo',
name='inconstitucionalidade',
field=models.BooleanField(choices=[(True, 'Sim'), (False, 'Não')], default=False, verbose_name='Declaração de Inconstitucionalidade'),
),
migrations.AlterField(
model_name='dispositivo',
name='texto',
field=models.TextField(blank=True, default='', verbose_name='Texto na Norma Original'),
),
]

17
compilacao/models.py

@ -135,6 +135,19 @@ class TextoArticulado(TimestampedMixin):
'numero': self.numero,
'data': defaultfilters.date(self.data, "d \d\e F \d\e Y")}
def organizar_ordem_de_dispositivos(self):
dpts = Dispositivo.objects.filter(ta=self)
ordem_max = dpts.last().ordem
dpts.update(ordem=F('ordem') + ordem_max)
count = 0
for d in dpts:
count += Dispositivo.INTERVALO_ORDEM
d.ordem = count
d.save()
class TipoNota(models.Model):
sigla = models.CharField(
@ -543,7 +556,7 @@ class Dispositivo(BaseModel, TimestampedMixin):
texto = models.TextField(
blank=True,
default='',
verbose_name=_('Texto'))
verbose_name=_('Texto na Norma Original'))
texto_atualizador = models.TextField(
blank=True,
default='',
@ -562,7 +575,7 @@ class Dispositivo(BaseModel, TimestampedMixin):
inconstitucionalidade = models.BooleanField(
default=False,
choices=utils.YES_NO_CHOICES,
verbose_name=_('Inconstitucionalidade'))
verbose_name=_('Declaração de Inconstitucionalidade'))
# Relevant attribute only in altering norms
visibilidade = models.BooleanField(
default=False,

4
compilacao/templatetags/compilacao_filters.py

@ -1,8 +1,8 @@
from django import template
from django.core.signing import Signer
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from compilacao.models import Dispositivo, TipoDispositivo
@ -125,7 +125,7 @@ def nomenclatura(d):
result = '(' + d.tipo_dispositivo.nome + ' ' + \
d.rotulo + ')'
else:
result = '(' + d.tipo_dispositivo.nome + \
result = '(' + d.tipo_dispositivo.nome + ' ' + \
d.rotulo_padrao() + ')'
return result

6
compilacao/urls.py

@ -33,8 +33,10 @@ urlpatterns_compilacao = [
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/refresh',
views.DispositivoSimpleEditView.as_view(), name='dispositivo_refresh'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/edit',
views.DispositivoEditView.as_view(), name='dispositivo_edit'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<pk>[0-9]+)/edit',
views.DispositivoEdicaoBasicaView.as_view(), name='dispositivo_edit'),
url(r'^(?P<ta_id>[0-9]+)/text/(?P<dispositivo_id>[0-9]+)/actions',
views.ActionsEditView.as_view(), name='dispositivo_actions'),

2
compilacao/utils.py

@ -18,6 +18,8 @@ def int_to_roman(int_value):
def int_to_letter(int_value):
result = ''
if not int_value:
return '0'
int_value -= 1
while int_value >= 26:
rest = int_value % 26

84
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
@ -20,8 +20,8 @@ from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from django.views.generic.list import ListView
from compilacao.forms import (NotaForm, PublicacaoForm, TaForm, TipoTaForm,
VideForm, DispositivoForm)
from compilacao.forms import (DispositivoEdicaoBasicaForm, NotaForm,
PublicacaoForm, TaForm, TipoTaForm, VideForm)
from compilacao.models import (Dispositivo, Nota,
PerfilEstruturalTextoArticulado, Publicacao,
TextoArticulado, TipoDispositivo, TipoNota,
@ -29,7 +29,6 @@ from compilacao.models import (Dispositivo, Nota,
VeiculoPublicacao, Vide)
from crud.base import Crud, CrudListView, make_pagination
DISPOSITIVO_SELECT_RELATED = (
'tipo_dispositivo',
'ta_publicado',
@ -1014,7 +1013,18 @@ class ActionsEditMixin:
return JsonResponse(action(context), safe=False)
def set_dvt(self, context):
return {}
dvt = Dispositivo.objects.get(pk=context['dispositivo_id'])
if dvt.is_relative_auto_insert():
dvt = dvt.dispositivo_pai
try:
Dispositivo.objects.all().update(dispositivo_vigencia=dvt)
return {'message': str(_('Dispositivo de Vigência atualizado '
'com sucesso!!!'))}
except:
return {'message': str(_('Ocorreu um erro na atualização do '
'Dispositivo de Vigência'))}
def delete_item_dispositivo(self, context):
return self.delete_bloco_dispositivo(context, bloco=False)
@ -1040,11 +1050,15 @@ class ActionsEditMixin:
else:
data['pk'] = ''
ta_base = base.ta
# TODO: a linha abaixo causa atualização da tela inteira...
# retirar a linha abaixo e identificar atualizações pontuais
data['pai'] = [-1, ]
data['message'] = str(self.remover_dispositivo(base, bloco))
ta_base.organizar_ordem_de_dispositivos()
return data
def remover_dispositivo(self, base, bloco):
@ -1068,10 +1082,7 @@ class ActionsEditMixin:
p.fim_eficacia = None
for d in base.dispositivos_filhos_set.all():
if d.tipo_dispositivo.possiveis_pais.filter(
pai=base.tipo_dispositivo,
perfil__padrao=True,
filho_de_insercao_automatica=True).exists():
if d.is_relative_auto_insert():
self.remover_dispositivo(d, bloco)
elif not bloco:
p.dispositivos_filhos_set.add(d)
@ -1084,10 +1095,7 @@ class ActionsEditMixin:
# independente da escolha do usuário
d_nivel_old = d.nivel
if d.tipo_dispositivo.possiveis_pais.filter(
pai=base.tipo_dispositivo,
perfil__padrao=True,
filho_de_insercao_automatica=True).exists():
if d.is_relative_auto_insert():
continue
# encontrar possível pai que será o primeiro parent
@ -1170,7 +1178,7 @@ class ActionsEditMixin:
order_by('ordem').filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
nivel__lte=base.nivel)
nivel__lte=base.nivel).first()
if proximo_independente_base:
dcc = Dispositivo.objects.order_by('ordem').filter(
@ -1980,7 +1988,47 @@ class PublicacaoDeleteView(CompMixin, DeleteView):
kwargs={'ta_id': self.kwargs['ta_id']})
class DispositivoEditView(CompMixin, UpdateView):
class DispositivoEdicaoBasicaView(UpdateView):
model = Dispositivo
form_class = DispositivoForm
template_name = "crud/form.html"
form_class = DispositivoEdicaoBasicaForm
@property
def cancel_url(self):
return reverse_lazy(
'compilacao:ta_text_edit',
kwargs={'ta_id': self.kwargs['ta_id']}) + '#' + str(self.object.pk)
def get_success_url(self):
return reverse_lazy(
'compilacao:dispositivo_edit',
kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']})
def get_context_data(self, **kwargs):
return UpdateView.get_context_data(self, **kwargs)
def run_actions(self, request):
if 'action' in request.GET and\
request.GET['action'] == 'atualiza_rotulo':
try:
d = Dispositivo.objects.get(pk=self.kwargs['pk'])
d.dispositivo0 = int(request.GET['dispositivo0'])
d.dispositivo1 = int(request.GET['dispositivo1'])
d.dispositivo2 = int(request.GET['dispositivo2'])
d.dispositivo3 = int(request.GET['dispositivo3'])
d.dispositivo4 = int(request.GET['dispositivo4'])
d.dispositivo5 = int(request.GET['dispositivo5'])
d.rotulo = d.rotulo_padrao()
except:
return True, JsonResponse({'message': str(
_('Ocorreu erro na atualização do rótulo'))}, safe=False)
return True, JsonResponse({'rotulo': d.rotulo}, safe=False)
return False, ''
def get(self, request, *args, **kwargs):
flag_action, render_json_response = self.run_actions(request)
if flag_action:
return render_json_response
return UpdateView.get(self, request, *args, **kwargs)

25
static/js/app.js

@ -1,8 +1,24 @@
function initTinymce() {
removeTinymce();
tinymce.init({
mode : "textareas",
force_br_newlines : false,
force_p_newlines : false,
forced_root_block : '',
plugins: ["table save code"],
menubar: "edit format table tools",
toolbar: "undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent",
tools: "inserttable",
border_css: "/static/styles/style_tinymce.css",
content_css: "/static/styles/style_tinymce.css"
});
}
tinymce.init({
mode : "exact",
elements : "biografia-parlamentar,casa-informacoes"
});
function removeTinymce() {
while (tinymce.editors.length > 0) {
tinymce.remove(tinymce.editors[0]);
}
}
function refreshDatePicker() {
$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
@ -96,4 +112,5 @@ $(document).ready(function(){
refreshDatePicker();
refreshMask();
autorModal();
initTinymce();
});

17
static/js/compilacao.js

@ -1,20 +1,3 @@
function initTinymce() {
tinymce.init({
mode : "textareas",
force_br_newlines : false,
force_p_newlines : false,
forced_root_block : '',
plugins: ["table save code"],
menubar: "edit format table tools",
toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent",
tools: "inserttable",
save_onsavecallback: onSubmitEditForm,
border_css: "/static/styles/compilacao_tinymce.css",
content_css: "/static/styles/compilacao_tinymce.css"
});
}
function SetCookie(cookieName,cookieValue,nDays) {
var today = new Date();
var expire = new Date();

44
static/js/compilacao_edit.js

@ -1,3 +1,19 @@
function initTinymceForEdit() {
tinymce.init({
mode : "textareas",
force_br_newlines : false,
force_p_newlines : false,
forced_root_block : '',
plugins: ["table save code"],
menubar: "edit format table tools",
toolbar: "save | undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent",
tools: "inserttable",
save_onsavecallback: onSubmitEditForm,
border_css: "/static/styles/compilacao_tinymce.css",
content_css: "/static/styles/compilacao_tinymce.css"
});
}
var editortype = "textarea";
var gets = 0;
@ -95,7 +111,6 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
}
}
url = pk_refresh+'/refresh?edit='+pk_edit+url;
}
else if (_action.startsWith('add_')) {
@ -109,7 +124,6 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
else if (_action.startsWith('set_')) {
url = pk_refresh+'/actions?action='+_action;
$("#message_block").css("display", "block");
}
@ -148,7 +162,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
}
if ( _editortype == 'tinymce' ) {
initTinymce();
initTinymceForEdit();
}
else if (_editortype == 'textarea') {
$('.csform form').submit(onSubmitEditForm);
@ -190,15 +204,10 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
$("#message_block").css("display", "block");
clearEditSelected();
if (data.pk != null) {
if (data.message != null && data.message != '') {
modalMessage(data.message, 'alert-danger', function() {
if (!modalMessage(data.message, 'alert-danger', function() {
//refreshScreenFocusPk(data);
});
}
else {
}))
refreshScreenFocusPk(data);
}
}
else {
alert('Erro exclusão de Dispositivo!');
@ -207,6 +216,7 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
else {
clearEditSelected();
reloadFunctionClicks();
modalMessage(data.message, 'alert-success', null);
}
}).always(function() {
@ -215,18 +225,22 @@ var clickUpdateDispositivo = function(event, __pk_refresh, __pk_edit, __action,
}
function modalMessage(message, alert, closeFunction) {
$('#modal-message #message').html(message);
$('#modal-message').modal('show');
if (closeFunction != null) {
if (message != null && message != '') {
$('#modal-message #message').html(message);
$('#modal-message').modal('show');
$('#modal-message, #modal-message .alert button').off();
$('#modal-message .alert').removeClass('alert-success alert-info alert-warning alert-danger alert-danger');
$('#modal-message .alert').addClass(alert);
$('#modal-message').on('hidden.bs.modal', closeFunction);
if (closeFunction != null)
$('#modal-message').on('hidden.bs.modal', closeFunction);
$('#modal-message .alert button').on('click', function() {
$('#modal-message').modal('hide');
});
return true;
}
return false;
}
function refreshScreenFocusPk(data) {

4
static/js/compilacao_notas.js

@ -7,7 +7,7 @@ function onEventsDneExec(pk, model) {
refreshDatePicker()
$('#dne'+pk+" #button-id-submit-form").click(onSubmitEditForm);
$('#dne'+pk+" #button-id-submit-form").click(onSubmitEditNVForm);
$('#dne'+pk+" .btn-close-container").click(function(){
$(this).closest('.dne-nota').removeClass('dne-nota');
$(this).closest('.dne-form').html('');
@ -88,7 +88,7 @@ var onChangeParamNorma = function(event) {
});
}
var onSubmitEditForm = function(event) {
var onSubmitEditNVForm = function(event) {
var url = '';
var model = 'nota';

23
static/styles/compilacao.scss

@ -919,6 +919,7 @@ a:link:after, a:visited:after {
display: table;
li {
display: table-cell;
padding: 0 0.5em;
}
}
@ -1196,6 +1197,26 @@ a:link:after, a:visited:after {
}
}
.cp-nav-parents {
& > .dropdown-menu {
left: 0;
right: auto;
&::before {
content: '';
position: absolute;
top: -11px;
width: 100%;
height: 11px;
}
}
&:hover {
& > .dropdown-menu {
display: block;
}
}
}
.class_color_container {
background: #ddd !important;
@ -1204,7 +1225,7 @@ a:link:after, a:visited:after {
clear:both;
}
.mce-panel {
border: 0px solid #ccc !important;
/*border: 0px solid #ccc !important;*/
}
.mce-btn button:hover {
background-color: rgba(0,0,0,0.1) !important;

2
static/styles/compilacao_tinymce.css → static/styles/style_tinymce.css

@ -1,5 +1,3 @@
.mce-content-body {
font-family: "Open Sans" "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
font-style: normal;

67
templates/compilacao/dispositivo_form.html

@ -0,0 +1,67 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% load compilacao_filters %}
{% load staticfiles %}
{% load sass_tags %}
{% block head_content %}{{block.super}}
<link rel="stylesheet" href="{% sass_src 'styles/compilacao.scss' %}" type="text/css">
{% endblock %}
{% block title %}
<h1><small>{{object.ta}}</small><br>{% trans 'Edição de Dispositivo' %}</h1>
{% endblock%}
{% block base_content %}
<div class="btn-group btn-group-sm" role="group">
{%for parent in object.get_parents_asc %}
{%with node=parent active=False template_name='compilacao/dispositivo_form_parents.html' %}
{%include template_name%}
{%endwith%}
{%endfor %}
{%with node=object active=True template_name='compilacao/dispositivo_form_parents.html' %}
{%include template_name%}
{%endwith%}
</div>
<br><br>
{% crispy form %}
{% endblock %}
{% block foot_js %}
{{block.super}}
<script type="text/javascript" src="{% static 'js/compilacao.js' %}"></script>
{% endblock %}
{% block extra_js %}
<script type="text/javascript">
function atualizaRotulo() {
var formData = {
'dispositivo0' : $('[name="dispositivo0"]').val(),
'dispositivo1' : $('[name="dispositivo1"]').val(),
'dispositivo2' : $('[name="dispositivo2"]').val(),
'dispositivo3' : $('[name="dispositivo3"]').val(),
'dispositivo4' : $('[name="dispositivo4"]').val(),
'dispositivo5' : $('[name="dispositivo5"]').val(),
'action' : 'atualiza_rotulo'
};
var url = '#';
$.get(url, formData).done(function(data) {
if (data.rotulo != undefined) {
$('[name="rotulo"]').val(data.rotulo);
return;
}
});
}
$(document).ready(function() {
{% if object.tipo_dispositivo.dispositivo_de_articulacao %}
setTimeout(removeTinymce, 100);
{% endif %}
$('[data-toggle="tooltip"]').tooltip();
});
</script>
{% endblock %}

28
templates/compilacao/dispositivo_form_parents.html

@ -0,0 +1,28 @@
{% load i18n %}
{% load compilacao_filters %}
{% if not node.dispositivos_filhos_set.exists %}
<a href="{% url 'compilacao:dispositivo_edit' node.ta_id node.pk %}" class="btn btn-default {%if active%}btn-primary{%endif%}">
{{node|nomenclatura}}
</a>
{% else %}
<div class="cp-nav-parents btn-group btn-group-sm" role="group">
<a href="{% url 'compilacao:dispositivo_edit' node.ta_id node.pk %}" class="btn btn-default {%if active%}btn-primary{%endif%}">
{{node|nomenclatura}}
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li>
{%for parent in node.dispositivos_filhos_set.all %}
<a href="{% url 'compilacao:dispositivo_edit' parent.ta_id parent.pk %}">
{{parent|nomenclatura}}
</a>
{%endfor %}
</li>
</ul>
</div>
{% endif %}

6
templates/compilacao/form.html

@ -1,6 +0,0 @@
{% extends "base.html" %}
{% load i18n crispy_forms_tags %}
{% block base_content %}
{% crispy form %}
{% endblock %}

55
templates/compilacao/text_edit.html

@ -45,6 +45,61 @@
{% include 'compilacao/text_edit_bloco.html'%}
</div>
<div class="modal fade" id="modal-help" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog modal-xs modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">Orientações Gerais <small>Dicas e Boas Práticas</small></h4>
</div>
<div class="modal-body">
{% blocktrans %}
<ol>
<li>As opções de inserção e exclusão tem precedência sobre qualquer alteração feita na edição avançada.
</li>
<li>Os Perfis Estruturais controlam as possibilidades do inserção do Editor. Perfis Estruturais servem para guiar as permissões de inserções relativas e podem, caso configurados de acordo, guiar a construção do Texto para se enquadrar em legislação e/ou regras específicas.</li>
<li>O Editor pode estar em quatro modos:
<ol>
<li><strong>(E) Editor Simples:</strong> Edição Básica de Texto, além de novas inserções e exclusões. É recomendável o uso deste sempre que possível.</li>
<li><strong>(E+) Editor Rico:</strong> Edição do texto com o editor TinyMCE. Neste editor é possível registro de tabelas e textos customizados</li>
<li><strong>(E*) Editor Avançado:</strong> Edição e Lançamento de Dispositivos Originais, Alterados e Alteradores, além de todos os dados que controlam a compilação. </li>
<li><strong>(C) Construtor Estrutural:</strong> Neste modo, o editor foca na inserção de Dispositivos e busca deixar mais acessíveis as estas ações.</li>
</ol></li>
<li>A Edição Avançada é complexa e sensível a erros. É recomendável o uso cuidadoso e consciente das funcionalidades.</li>
<li>Gere toda a estrutura básica sem adicionar texto, isso evitará erros estruturais e otimizará seu trabalho por:
<ol>
<li>Facilitar o trabalho local aí, de seu navegador.</li>
<li>Diminuir o tráfego de rede.</li>
<li>Desonerar os servidores que processam e armazenam seus dados.</li>
</ol>
</li>
<li>Inserir os Dispositivos na sequência natural é mais produtivo para você, além de ser também mais simples para o algorítmo que controla este processo. Quanto maior a mudança estutural, mais lento será o procedimento. </li>
<li>A exclusão de Dispositivos é um processo moroso e complicado, principalmente se o que está sendo excluido for, ou envolver, os DCC's - Dispositivos de Contagem Continua, como é o caso do Tipo de Dispositivo (Artigo), que é um tipo comum nos Textos Articulados Brasileiros.
As exclusões podem ser diretas, individuais ou em bloco:
<ol>
<li><strong>Diretas:</strong> Dispositivos que não possuam itens internos são excluidos diretamente.</li>
<li><strong>Individuais:</strong> Dispositivos que possuam itens internos e este podem ser reenquadrados no Dispositivo imediatamente anterior</li>
<li><strong>Em Bloco:</strong> Todo o conteúdo incluído no Dispositivo em edição será excluído.</li>
</ol>
<ul>
<li>As exclusões e inserções, quando acionadas, renumeram e redefinem os rótulos, tanto de dispositivos locais, quanto os DCC's.</li>
</ul>
</li>
<li>A criação de Tipos de Dispositivos é dinâmica e deverão estar amarrados por perfis estuturais configuráveis. Por serem tarefas técnicas e complicadas, criar/editar tipos de dispositivos e perfis estuturais estão disponíveis apenas na área de edição técnica do SAPL (admin).
</li>
</ol>
{% endblocktrans %}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
{% endblock base_content %}
{% block foot_js %}

17
templates/compilacao/text_edit_bloco.html

@ -22,7 +22,7 @@
<li class="edt-textarea"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:textarea" title="{% trans 'Edição simples apenas do texto'%}">E</a></li>
<li class="edt-tinymce"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:tinymce" title="{% trans 'Editar o texto com TinyMCE'%}">E+</a></li>
{%endif%}
<li class="edt-detail"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:detail" title="{% trans 'TODO: Edição detalhada'%}">E*</a></li>
<li class="edt-detail"><a class="btn-top" href="{% url 'compilacao:dispositivo_edit' dpt.ta_id dpt.pk %}" title="{% trans 'Edição Avançada'%}">E*</a></li>
<li class="edt-construct"><a class="btn-top btn-action" pk="{{dpt.pk}}" action="refresh:construct" title="{% trans 'Construçao da estrutura do Texto Articulado'%}">C</a></li>
</ul>
@ -87,8 +87,19 @@
</div>
<ul class="label_status" >
<li>p: {{dpt.dispositivo_substituido_id}}, n: {{dpt.dispositivo_subsequente_id}}, Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}</li>
<li><a>.</a></li>
<li>p: {{dpt.dispositivo_substituido_id|default:''}}, n: {{dpt.dispositivo_subsequente_id|default:''}}, Ordem: {{dpt.ordem}}, Nivel: {{dpt.nivel}}, Número: {{dpt.get_numero_completo}}</li>
{% if dpt.dispositivo_vigencia %}
<li>{% field_verbose_name dpt 'dispositivo_vigencia'%}: <a action="refresh" pk="{{dpt.dispositivo_vigencia.pk}}" title="{% field_verbose_name dpt 'dispositivo_vigencia'%}" class="btn-action">{{dpt.dispositivo_vigencia|nomenclatura}}</a> </li>
{% endif %}
<li>
<a type="button" data-toggle="modal" data-target="#modal-help">
?
</a>
</li>
</ul>
<ul class="btns-action actions_parents">

Loading…
Cancel
Save