-
Notifications
You must be signed in to change notification settings - Fork 0
/
renumeracao-automatica.user.js
121 lines (99 loc) · 5.05 KB
/
renumeracao-automatica.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// ==UserScript==
// @name Renumeração Automatica
// @namespace https://app.orcafascio.com/
// @updateURL https://github.com/cesarep/scripts-orsafascio/raw/main/renumeracao-automatica.user.js
// @downloadURL https://github.com/cesarep/scripts-orsafascio/raw/main/renumeracao-automatica.user.js
// @version 0.4
// @description Renumera automaticamente os itens
// @author César E. Petersen
// @match https://app.orcafascio.com/orc/orcamentos/*
// @icon https://app.orcafascio.com/img/logo4.png
// @run-at document-end
// @grant GM_addStyle
// ==/UserScript==
/**
* Mudanças:
* v0.4
* - Adicionado checkbox para modificar os subitens de uma etapa com numeraçao atualizada
*
* v0.3
* - Adicionado Botão para editar numeração removido dos orçamentos
*
* v0.2
* - Corrigido URL para só aparecer na edição de itens
*/
GM_addStyle ( `
.input-xsmall {
width: fit-content !important;
}
` );
(function() {
'use strict';
let url = window.location.pathname;
// se esta no modo de edição de items:
if(url.startsWith('/orc/orcamentos/edit_todos') && window.location.search.endsWith('&item=true')) {
var html = `
<div style='float: left;'>
<button class="btn btn-warning" id="renumeraitens" type="button">Renumerar Itens Automaticamente</button>
<span style="vertical-align: text-bottom;">
<input type="checkbox" style="vertical-align: sub;" id="renumeraetapa">
<label style="display: inline-block;" for="renumeraetapa">Modificar itens das etapas</span>
</span>
</div>`
document.querySelector("#table_orc_itens tbody tr:first-child td:first-child").insertAdjacentHTML('afterbegin',html)
var btn = document.querySelector("#renumeraitens")
var chk = document.querySelector("#renumeraetapa")
function nivel(value) {
return (value.match(/\./g)||[]).length+1;
}
// aplica evento em todos os inputs de etapas
Array.from(document.querySelectorAll("#table_orc_itens input[type=text][name^=etapa]")).map(etapa => {
etapa.oninput = () => {
// se o checkbox de renumerar etapas esta marcado
if(chk.checked){
// valor original
let valor_antigo = etapa.defaultValue
// seleciona todos os itens cujo valor original comece com o valor original do input da etapa
Array.from(document.querySelectorAll("#table_orc_itens input[type=text][value^='"+valor_antigo+".']")).map(item => {
// corrige valor para nova etapa
item.value = etapa.value + item.defaultValue.slice(valor_antigo.length);
item.style.backgroundColor="yellow";
item.title = "Valor antigo: " + item.defaultValue;
})
}
}
});
btn.onclick = () => Array.from(document.querySelectorAll("#table_orc_itens input[type=text]")).reduce(
(acc, node, idx) => {
let oldvalue = node.value
let curnivel = nivel(node.value);
if( curnivel == acc.N && acc.N > 1 ){ // está no mesmo nivel que o item anteriora
let base = acc.v.split(".", curnivel-1).join(".")+".";
// novo num
let newnum = parseInt(acc.v.substring(acc.v.lastIndexOf(".")+1)) + 1;
node.value = base + newnum;
} else if( curnivel == acc.N && acc.N == 1 ){ // esta no mesmo nivel que o anterior, e é primario
let base = acc.v.split(".", curnivel);
// novo num
let newnum = parseInt(base) + 1;
node.value = newnum;
} else if( curnivel > acc.N){ // nivel maior que o anterior
node.value = acc.v + ".1";
} else { // nivel menor que o anterior
let base = acc.v.split(".", curnivel).join(".")
let newnum = parseInt(base.substring(base.lastIndexOf(".")+1)) + 1;
node.value = base.split(".", curnivel-1).join(".") + (curnivel > 1 ? "." : "") + newnum; // só adiciona ponto se nivel > 1
}
if ( node.value != oldvalue ){
node.style.backgroundColor="yellow"
node.title = "Valor antigo: " + oldvalue;
}
return { N: nivel(node.value), v: node.value};
}, { N: 1, v: "0"});
} else if(!url.startsWith('/orc/orcamentos/edit_todos')) { // se está na pagina do orçamento
let ultimo_li = document.querySelector('li a[href^="/orc/orcamentos/edit_todos"]').parentElement;
let link_novo = document.createElement('li')
link_novo.innerHTML = '<a href="/orc/orcamentos/edit_todos?id=' + document.querySelector('#orcamento_id').getAttribute('orcamento_id') + '&item=true">Editar todos os itens</a>';
ultimo_li.insertAdjacentElement('afterEnd', link_novo);
}
})();