diff --git a/sapl-frontend/package.json b/sapl-frontend/package.json
index 016f92c1a..a6929c5f2 100644
--- a/sapl-frontend/package.json
+++ b/sapl-frontend/package.json
@@ -10,6 +10,7 @@
"dependencies": {
"@fortawesome/fontawesome-free": "^5.6.3",
"bootstrap": "^4.2.1",
+ "diff": "^4.0.1",
"dotenv": "^6.2.0",
"imports-loader": "^0.8.0",
"jquery": "^3.3.1",
diff --git a/sapl-frontend/src/apps/compilacao/js/compilacao.js b/sapl-frontend/src/apps/compilacao/js/compilacao.js
new file mode 100644
index 000000000..31c1de7f7
--- /dev/null
+++ b/sapl-frontend/src/apps/compilacao/js/compilacao.js
@@ -0,0 +1,284 @@
+ function SetCookie(cookieName,cookieValue,nDays) {
+ var today = new Date();
+ var expire = new Date();
+ if (nDays==null || nDays==0) nDays=1;
+ expire.setTime(today.getTime() + 3600000*24*nDays);
+ document.cookie = cookieName+"="+escape(cookieValue)
+ + ";expires="+expire.toGMTString();
+ }
+
+ function ReadCookie(cookieName) {
+ var theCookie=" "+document.cookie;
+ var ind=theCookie.indexOf(" "+cookieName+"=");
+ if (ind==-1) ind=theCookie.indexOf(";"+cookieName+"=");
+ if (ind==-1 || cookieName=="") return "";
+ var ind1=theCookie.indexOf(";",ind+1);
+ if (ind1==-1) ind1=theCookie.length;
+ return unescape(theCookie.substring(ind+cookieName.length+2,ind1));
+ }
+
+ function insertWaitAjax(element) {
+ //jQuery(element).append('

');
+ jQuery(element).append('
');
+ }
+
+ function DispositivoSearch(opts) {
+ $(function() {
+ let formData = {}
+ var container_ds = $('body').children("#container_ds");
+ if (container_ds.length > 0)
+ $(container_ds).remove();
+ container_ds = $('');
+ $('body').prepend(container_ds);
+
+ var fields = $("[data-sapl-ta='DispositivoSearch']");
+ fields.each(function() {
+ var field = $(this);
+ var data_type_selection = field.attr('data-type-selection');
+ var data_field = field.attr('data-field');
+ var data_function = field.attr('data-function');
+
+ var onChangeFieldSelects = function(event) {
+ if (data_type_selection == 'checkbox') {
+ var tas = field.find('input[name="ta_select_all"]'); //tas - Textos Articulados
+ tas.off();
+
+ tas.on('change', function(event) {
+ $(this).closest('ul').find('input[name="'+data_field+'"]').prop("checked", this.checked);
+ //$(this).prop("checked", false);
+ });
+
+
+ }
+ else {
+ var dpts = field.find('input');
+ dpts.off()
+ dpts.attr('type', 'hidden');
+ $('')
+ .insertBefore(dpts)
+ .append($(''))
+ .on('click', function() {
+ if ($(this).closest('ul').find('li').length == 2)
+ $(this).closest('ul').remove();
+ else
+ $(this).closest('li').remove();
+ });
+ }
+ }
+ onChangeFieldSelects();
+
+ var onChangeParamTA = 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 dispositivos_internos = $("input[name='dispositivos_internos']:checked").val();
+ var rotulo_dispositivo = $("input[name='rotulo_dispositivo']").val();
+ var texto_dispositivo = $("input[name='texto_dispositivo']").val();
+ var max_results = $("select[name='max_results']").val();
+ var url = '';
+
+ if (rotulo_dispositivo.length > 0 || texto_dispositivo.length > 0) {
+ $("input[name='dispositivos_internos']").prop('disabled', false);
+ $("input[name='dispositivos_internos']").each((idx, element) => {
+ element.parentElement.classList.remove('disabled')
+ });
+ $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','1');
+ }
+ else {
+ $("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', true);
+ $("input[name='dispositivos_internos']").prop('disabled', true);
+
+ $("input[name='dispositivos_internos']").each((idx, element) => {
+ element.parentElement.classList.add('disabled')
+ });
+ $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','0.3');
+ dispositivos_internos = 'False';
+ }
+ formData = {
+ 'tipo_ta' : tipo_ta,
+ 'tipo_model' : tipo_model,
+ 'num_ta' : num_ta,
+ 'ano_ta' : ano_ta,
+ 'texto' : texto_dispositivo,
+ 'rotulo' : rotulo_dispositivo,
+ 'dispositivos_internos' : dispositivos_internos,
+ 'max_results' : max_results,
+ 'data_type_selection' : data_type_selection,
+ 'data_field' : data_field,
+ 'data_function' : data_function,
+ };
+
+ window.localStorage.setItem("dispositivo_search_form_data", JSON.stringify(formData))
+
+
+ url = '/ta/search_fragment_form';
+ $('.result-busca-dispositivo').html('');
+ insertWaitAjax('.result-busca-dispositivo')
+ $.get(url, formData).done(function( data ) {
+ $('.result-busca-dispositivo').html(data);
+ //OptionalCustomFrontEnd().init();
+ if (data_type_selection == 'checkbox') {
+ var tas = $('.result-busca-dispositivo').find('input[name="ta_select_all"]');
+ tas.off();
+ tas.on('change', function(event) {
+ $(this).closest('ul').find('input[name="'+data_field+'"]').prop("checked", this.checked);
+ });
+ }
+
+ });
+ }
+
+ var onKeyPressRotuloBuscaTextual = function(event) {
+ var rotulo_dispositivo = $("input[name='rotulo_dispositivo']").val();
+ var texto_dispositivo = $("input[name='texto_dispositivo']").val();
+ var dispositivos_internos = $("input[name='dispositivos_internos']:checked").val();
+
+ if (rotulo_dispositivo.length > 0 || texto_dispositivo.length > 0) {
+ $("input[name='dispositivos_internos']").prop('disabled', false);
+ $("input[name='dispositivos_internos']").each((idx, element) => {
+ element.parentElement.classList.remove('disabled')
+ });
+ $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','1');
+ }
+ else {
+ $("input[name='dispositivos_internos']").filter('[value="False"]').prop('checked', true);
+ $("input[name='dispositivos_internos']").prop('disabled', true);
+ $("input[name='dispositivos_internos']").each((idx, element) => {
+ element.parentElement.classList.add('disabled')
+ });
+ $("input[name='dispositivos_internos']").closest('#div_id_dispositivos_internos').css('opacity','0.3');
+ dispositivos_internos = 'False';
+ }
+ }
+
+ var button_ds = field.children("#button_ds");
+ if (button_ds.length > 0)
+ $(button_ds).remove();
+ button_ds = $('');
+ field.prepend(button_ds);
+
+ var btn_open_search = $('