att
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,640 @@
|
||||
body { background: #ffffff; }
|
||||
.audit-shell {
|
||||
background: #f4f8fd;
|
||||
border: 1px solid #dbe4ee;
|
||||
border-radius: 14px;
|
||||
box-shadow: 0 4px 14px rgba(15, 23, 42, 0.06);
|
||||
padding: 10px 10px 14px 10px;
|
||||
margin: 14px auto 0 auto;
|
||||
max-width: 1140px;
|
||||
}
|
||||
.audit-section {
|
||||
border: 1px solid #e2e8f0;
|
||||
border-radius: 14px;
|
||||
background: #ffffff;
|
||||
padding: 12px;
|
||||
margin-bottom: 10px;
|
||||
box-shadow: 0 2px 6px rgba(15, 23, 42, 0.05);
|
||||
}
|
||||
h1.audit-main-title {
|
||||
margin: 2px 0 10px 0;
|
||||
font-size: 18px !important;
|
||||
line-height: 1.2;
|
||||
font-weight: 700 !important;
|
||||
color: #ffffff !important;
|
||||
background: #0b556b;
|
||||
border-radius: 10px;
|
||||
padding: 8px 12px;
|
||||
}
|
||||
.section-title {
|
||||
margin: 0 0 10px 0;
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #1e293b;
|
||||
}
|
||||
.audit-status {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
align-items: center;
|
||||
margin: 2px 0 10px 0;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.progress-section {
|
||||
padding: 5px 10px 5px 10px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
.progress-section .section-title {
|
||||
font-size: 16px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.audit-context-card .section-title {
|
||||
font-size: 17px;
|
||||
}
|
||||
.progress-inline {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
gap: 16px;
|
||||
align-items: center;
|
||||
}
|
||||
.progress-track {
|
||||
width: 100%;
|
||||
height: 5px;
|
||||
border-radius: 999px;
|
||||
background: #e6ebf2;
|
||||
overflow: hidden;
|
||||
}
|
||||
.progress-fill {
|
||||
width: 0%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #3ea9c8 0%, #3ea9c8 100%);
|
||||
transition: width .18s ease-in-out;
|
||||
}
|
||||
.progress-percent {
|
||||
font-size: 14px;
|
||||
line-height: 1;
|
||||
color: #0f172a;
|
||||
font-weight: 700;
|
||||
min-width: 42px;
|
||||
text-align: right;
|
||||
}
|
||||
.progress-meta {
|
||||
margin-top: 3px;
|
||||
font-size: 9px;
|
||||
color: #52637b;
|
||||
font-weight: 600;
|
||||
}
|
||||
.instruction-section {
|
||||
display: block;
|
||||
background: #ffffff;
|
||||
}
|
||||
.intro-data-section {
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
background: linear-gradient(90deg, #f4f8fd 0%, #edf3fa 100%);
|
||||
}
|
||||
.intro-data-section .instruction-section {
|
||||
padding: 12px;
|
||||
border-radius: 14px 14px 0 0;
|
||||
background: #ffffff;
|
||||
}
|
||||
.intro-divider {
|
||||
height: 1px;
|
||||
background: #dfe7f0;
|
||||
}
|
||||
.instruction-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.instruction-icon {
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
border-radius: 999px;
|
||||
background: #3ea9c8;
|
||||
color: #fff;
|
||||
font-size: 22px;
|
||||
font-weight: 700;
|
||||
line-height: 34px;
|
||||
text-align: center;
|
||||
}
|
||||
.instruction-title {
|
||||
font-size: 16px;
|
||||
color: #1f2f46;
|
||||
font-weight: 700;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.instruction-steps {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(160px, 1fr));
|
||||
gap: 6px 16px;
|
||||
font-size: 10px;
|
||||
color: #334155;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.instruction-steps span {
|
||||
display: inline-block;
|
||||
border: 1px solid #b9d4ea;
|
||||
background: #f4f9ff;
|
||||
color: #0f3f66;
|
||||
border-radius: 999px;
|
||||
padding: 4px 9px;
|
||||
width: fit-content;
|
||||
}
|
||||
.status-pill {
|
||||
background: #eef5fb;
|
||||
border: 1px solid #d9e8f6;
|
||||
color: #0b556b;
|
||||
border-radius: 999px;
|
||||
padding: 6px 10px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.audit-context-card {
|
||||
background: #ffffff;
|
||||
padding: 12px;
|
||||
border-radius: 0 0 14px 14px;
|
||||
}
|
||||
.audit-context-row > div {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.audit-label {
|
||||
font-size: 12px;
|
||||
letter-spacing: 0.3px;
|
||||
color: #16486a;
|
||||
margin-bottom: 4px;
|
||||
font-weight: 700;
|
||||
}
|
||||
.label-icon { opacity: 0.8; margin-right: 4px; }
|
||||
.audit-input {
|
||||
height: 32px;
|
||||
font-size: 12px;
|
||||
border-color: #c9d7e7;
|
||||
border-radius: 7px;
|
||||
padding: 5px 9px;
|
||||
}
|
||||
.audit-input:focus {
|
||||
border-color: #74a5d3;
|
||||
box-shadow: 0 0 0 2px rgba(34, 93, 143, 0.12);
|
||||
}
|
||||
.audit-card { margin-top: 12px; }
|
||||
.audit-score { font-size: 22px; font-weight: 700; }
|
||||
.audit-score small { font-size: 12px; font-weight: 400; color: #7f8c8d; display: block; }
|
||||
#pilaresContainer {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, minmax(220px, 1fr));
|
||||
gap: 14px;
|
||||
background: #f4f8fd;
|
||||
border: 0;
|
||||
border-radius: 10px;
|
||||
padding: 8px 12px 10px 12px;
|
||||
}
|
||||
h2.section-title.pilares-title {
|
||||
margin-top: 4px;
|
||||
margin-bottom: 10px;
|
||||
font-size: 17px !important;
|
||||
}
|
||||
.audit-send-wrap {
|
||||
margin-top: 10px;
|
||||
text-align: right;
|
||||
padding: 10px 12px 2px 12px;
|
||||
border-top: 1px solid #dbe5f0;
|
||||
}
|
||||
.audit-send-btn {
|
||||
min-width: 120px;
|
||||
height: 38px;
|
||||
border-radius: 8px;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
background: #0b556b;
|
||||
border-color: #0b556b;
|
||||
}
|
||||
.audit-send-btn:hover,
|
||||
.audit-send-btn:focus {
|
||||
background: #0a4b5f;
|
||||
border-color: #0a4b5f;
|
||||
}
|
||||
.pilar-panel {
|
||||
border: 1px solid #d6e1ee;
|
||||
border-radius: 12px;
|
||||
background: #ffffff;
|
||||
padding: 8px;
|
||||
min-height: 108px;
|
||||
box-shadow: 0 6px 14px rgba(15, 23, 42, 0.08);
|
||||
transition: box-shadow .18s ease, transform .18s ease;
|
||||
}
|
||||
.pilar-panel:hover {
|
||||
box-shadow: 0 10px 20px rgba(15, 23, 42, 0.12);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
.pilar-panel.is-open {
|
||||
grid-column: 1 / -1;
|
||||
box-shadow: 0 12px 24px rgba(15, 23, 42, 0.14);
|
||||
}
|
||||
.pilar-summary-card {
|
||||
grid-column: span 3;
|
||||
border: 1px solid #d6e1ee;
|
||||
border-radius: 12px;
|
||||
background: #ffffff;
|
||||
padding: 10px 12px;
|
||||
box-shadow: 0 6px 14px rgba(15, 23, 42, 0.08);
|
||||
}
|
||||
.summary-title {
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
color: #000000;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.summary-item {
|
||||
font-size: 12px;
|
||||
line-height: 1.45;
|
||||
color: #000000;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.summary-item:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.summary-name {
|
||||
color: #000000;
|
||||
font-weight: 700;
|
||||
}
|
||||
.pilar-head {
|
||||
background: #ffffff;
|
||||
border: 0;
|
||||
padding: 6px;
|
||||
display: grid;
|
||||
gap: 6px;
|
||||
cursor: pointer;
|
||||
border-radius: 10px;
|
||||
transition: background .15s ease, border-color .15s ease, box-shadow .15s ease, transform .15s ease;
|
||||
}
|
||||
.pilar-head:hover {
|
||||
background: #f8fbff;
|
||||
box-shadow: none;
|
||||
transform: none;
|
||||
}
|
||||
.pilar-head.is-open {
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
.pilar-title-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.pilar-state-dot {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 999px;
|
||||
background: #94a3b8;
|
||||
border: 1px solid rgba(148, 163, 184, 0.25);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #ffffff;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
line-height: 1;
|
||||
}
|
||||
.pilar-state-dot.state-pending { background: #dc2626; border-color: rgba(220, 38, 38, 0.4); }
|
||||
.pilar-state-dot.state-progress { background: #d18a2f; border-color: rgba(209, 138, 47, 0.35); }
|
||||
.pilar-state-dot.state-done { background: #2f9d78; border-color: rgba(47, 157, 120, 0.35); }
|
||||
.pilar-title {
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
color: #000000;
|
||||
letter-spacing: 0.2px;
|
||||
}
|
||||
.pilar-photo-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
color: #243549;
|
||||
}
|
||||
.pilar-photo-count {
|
||||
font-size: 10px;
|
||||
font-weight: 700;
|
||||
color: #000000;
|
||||
}
|
||||
.pilar-missing {
|
||||
font-size: 10px;
|
||||
color: #000000;
|
||||
font-weight: 600;
|
||||
}
|
||||
.pilar-mini-track {
|
||||
height: 5px;
|
||||
border-radius: 999px;
|
||||
background: #e4eaf1;
|
||||
overflow: hidden;
|
||||
}
|
||||
.pilar-mini-fill {
|
||||
display: block;
|
||||
width: 0%;
|
||||
height: 100%;
|
||||
border-radius: inherit;
|
||||
background: #5d8fbe;
|
||||
transition: width .18s ease;
|
||||
}
|
||||
.pilar-foot {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
}
|
||||
.pilar-count {
|
||||
font-size: 10px;
|
||||
color: #000000;
|
||||
font-weight: 600;
|
||||
}
|
||||
.pilar-open-cta {
|
||||
font-size: 10px;
|
||||
color: #000000;
|
||||
font-weight: 700;
|
||||
}
|
||||
.pilar-body { padding: 8px 0 0 0; }
|
||||
.audit-row {
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
padding: 0;
|
||||
margin: 0 0 12px 0;
|
||||
background: transparent;
|
||||
}
|
||||
.audit-row-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
.audit-row-top {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
gap: 10px;
|
||||
align-items: start;
|
||||
}
|
||||
.audit-info {
|
||||
min-width: 0;
|
||||
}
|
||||
.indicador-cell { font-weight: 700; color: #000000; font-size: 15px; line-height: 1.25; }
|
||||
.indicador-help {
|
||||
margin-top: 5px;
|
||||
font-size: 12px;
|
||||
color: #5c6f82;
|
||||
line-height: 1.35;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
padding: 7px 9px;
|
||||
}
|
||||
.indicador-help ul {
|
||||
margin: 0;
|
||||
padding-left: 18px;
|
||||
}
|
||||
.indicador-help li {
|
||||
margin: 2px 0;
|
||||
}
|
||||
.indicador-help .indicador-group {
|
||||
list-style: none;
|
||||
margin-top: 6px;
|
||||
margin-left: -18px;
|
||||
font-weight: 700;
|
||||
color: #36597b;
|
||||
}
|
||||
.indicador-help-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(220px, 1fr));
|
||||
gap: 10px 20px;
|
||||
padding-left: 0;
|
||||
}
|
||||
.indicador-help-col .indicador-group {
|
||||
margin: 0 0 4px 0;
|
||||
font-size: 12px;
|
||||
}
|
||||
.indicador-help-col ul {
|
||||
margin: 0;
|
||||
padding-left: 18px;
|
||||
}
|
||||
.meta-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, minmax(100px, 1fr));
|
||||
gap: 10px;
|
||||
}
|
||||
.meta-box {
|
||||
border: 1px solid #d7e2ef;
|
||||
border-radius: 10px;
|
||||
background: #fff;
|
||||
padding: 8px 10px;
|
||||
min-height: 62px;
|
||||
}
|
||||
.meta-label { font-size: 11px; color: #64748b; text-transform: uppercase; }
|
||||
.meta-value { font-size: 20px; color: #1f2937; margin-top: 4px; font-weight: 600; }
|
||||
.meta-value .form-control {
|
||||
font-size: 14px;
|
||||
height: 34px;
|
||||
padding: 4px 10px;
|
||||
}
|
||||
.anexo-wrap, .resultado-wrap, .just-wrap { margin-top: 0; }
|
||||
.penalidade-badge {
|
||||
font-size: 10px !important;
|
||||
font-weight: 700;
|
||||
padding: 2px 8px !important;
|
||||
border-radius: 999px;
|
||||
letter-spacing: 0.2px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.penalidade-badge.label-danger { background: #f7dada; color: #9f2d2d; }
|
||||
.penalidade-badge.label-warning { background: #fff0c7; color: #8a5a00; }
|
||||
.penalidade-badge.label-info { background: #dceefe; color: #1f5f9b; }
|
||||
.penalidade-badge.label-success { background: #dff5e4; color: #1f7a3d; }
|
||||
.penalidade-badge.label-default { background: #eceff3; color: #5f6b7a; }
|
||||
.anexos-cell {
|
||||
background: #eef3fb;
|
||||
border: 1px solid #cfdaea;
|
||||
border-radius: 14px;
|
||||
padding: 10px;
|
||||
}
|
||||
.anexo-auto-hint { font-size: 12px; color: #5c7390; margin-top: 7px; }
|
||||
.anexo-progress {
|
||||
margin-top: 10px;
|
||||
font-size: 13px;
|
||||
color: #26486a;
|
||||
font-weight: 600;
|
||||
}
|
||||
.anexo-progress-count {
|
||||
display: inline-block;
|
||||
min-width: 52px;
|
||||
text-align: center;
|
||||
border-radius: 999px;
|
||||
background: #d8e6f8;
|
||||
color: #204c7a;
|
||||
padding: 4px 12px;
|
||||
margin-right: 6px;
|
||||
font-weight: 700;
|
||||
}
|
||||
.anexo-multi-list {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, minmax(240px, 1fr));
|
||||
gap: 10px;
|
||||
}
|
||||
.audit-row[data-max-fotos="1"] .anexo-multi-list {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
.audit-row[data-max-fotos="2"] .anexo-multi-list {
|
||||
grid-template-columns: repeat(2, minmax(220px, 1fr));
|
||||
}
|
||||
.audit-row[data-max-fotos="3"] .anexo-multi-list {
|
||||
grid-template-columns: repeat(3, minmax(220px, 1fr));
|
||||
}
|
||||
.anexo-slot {
|
||||
background: #ffffff;
|
||||
border: 1px solid #bdcde1;
|
||||
border-radius: 10px;
|
||||
padding: 7px;
|
||||
position: relative;
|
||||
}
|
||||
.audit-row[data-max-fotos="1"] .anexo-slot,
|
||||
.audit-row[data-max-fotos="2"] .anexo-slot {
|
||||
max-width: 100%;
|
||||
}
|
||||
.anexo-slot.slot-filled {
|
||||
border-color: #8fc1a3;
|
||||
box-shadow: inset 0 0 0 1px rgba(79, 161, 109, 0.2);
|
||||
}
|
||||
.anexo-slot.extra-slot { display: none; }
|
||||
.anexo-multi-list.expanded .anexo-slot.extra-slot { display: block; }
|
||||
.anexo-slot-label {
|
||||
font-size: 12px;
|
||||
color: #375478;
|
||||
margin-bottom: 4px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.audit-row[data-max-fotos]:not([data-max-fotos="1"]) .anexo-slot::after {
|
||||
content: "•••";
|
||||
position: absolute;
|
||||
right: 12px;
|
||||
top: 8px;
|
||||
color: #b0c5df;
|
||||
font-size: 15px;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
.anexo-toggle-wrap {
|
||||
margin-top: 12px;
|
||||
text-align: right;
|
||||
}
|
||||
.anexo-toggle {
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
color: #2f4f74 !important;
|
||||
border-color: #b7c8de;
|
||||
background: #eef3fb;
|
||||
border-radius: 12px;
|
||||
padding: 8px 22px;
|
||||
}
|
||||
.anexos-cell .fluigFormAttachmentComponent {
|
||||
width: 100%;
|
||||
}
|
||||
.anexos-cell .fluigFormAttachmentComponent input {
|
||||
height: 36px;
|
||||
border: 1px dashed #b6c9e1;
|
||||
border-radius: 8px;
|
||||
background: #eef3fb;
|
||||
font-size: 14px;
|
||||
color: #5e7898;
|
||||
padding: 4px 10px;
|
||||
}
|
||||
.anexos-cell .fluigFormAttachmentComponent input::placeholder {
|
||||
color: #8ea4bf;
|
||||
opacity: 1;
|
||||
}
|
||||
.anexos-cell .fluigFormAttachmentComponent .btn {
|
||||
height: 42px !important;
|
||||
min-width: 52px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
.anexos-cell .fluigFormAttachmentComponent .btn-success {
|
||||
background: #2f81c6 !important;
|
||||
border-color: #2a75b3 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
.anexos-cell .fluigFormAttachmentComponent .btn-default {
|
||||
background: #eef2f7 !important;
|
||||
border-color: #c7d1de !important;
|
||||
color: #41597a !important;
|
||||
}
|
||||
.anexos-cell .fluigFormAttachmentComponent .btn-danger {
|
||||
background: #e1574c !important;
|
||||
border-color: #d04c42 !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
.just-wrap input {
|
||||
border-radius: 10px;
|
||||
}
|
||||
.audit-row-target { background: #fff8e6 !important; }
|
||||
.nc-box {
|
||||
border: 1px solid #f5d0d0;
|
||||
background: #fff6f6;
|
||||
border-radius: 10px;
|
||||
padding: 10px 12px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.nc-title {
|
||||
font-weight: 700;
|
||||
color: #9f2d2d;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.nc-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
.nc-item {
|
||||
background: #fff;
|
||||
border: 1px solid #f1b7b7;
|
||||
color: #7f1d1d;
|
||||
border-radius: 999px;
|
||||
padding: 4px 10px;
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.anexo-view { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
|
||||
.anexo-thumb-inline {
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
object-fit: cover;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 4px;
|
||||
background: #fff;
|
||||
}
|
||||
.anexo-file {
|
||||
font-size: 11px;
|
||||
max-width: 170px;
|
||||
display: inline-block;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 4px;
|
||||
padding: 4px 6px;
|
||||
background: #fafafa;
|
||||
}
|
||||
.anexo-text {
|
||||
background: #fff;
|
||||
font-size: 12px;
|
||||
}
|
||||
@media (max-width: 900px) {
|
||||
.section-title { font-size: 22px; }
|
||||
.progress-percent { font-size: 14px; min-width: 38px; }
|
||||
.progress-meta { font-size: 14px; }
|
||||
.instruction-title { font-size: 16px; }
|
||||
.instruction-steps { grid-template-columns: 1fr; font-size: 14px; }
|
||||
.audit-label { font-size: 13px; }
|
||||
.audit-input { height: 40px; font-size: 15px; }
|
||||
.audit-row-top { grid-template-columns: 1fr; }
|
||||
.meta-grid { grid-template-columns: repeat(2, minmax(100px, 1fr)); }
|
||||
.anexo-multi-list { grid-template-columns: 1fr; }
|
||||
#pilaresContainer { grid-template-columns: repeat(2, minmax(180px, 1fr)); }
|
||||
.pilar-panel.is-open { grid-column: auto; }
|
||||
.pilar-summary-card { grid-column: span 2; }
|
||||
.audit-send-wrap { padding: 8px 0 0 0; border-top: 0; }
|
||||
.audit-send-btn { width: 100%; }
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,423 @@
|
||||
/**
|
||||
* Plugin JQuery para trabalhar com anexos nos formulários dentro do processo
|
||||
*
|
||||
* @author Bruno Gasparetto
|
||||
* @see https://github.com/brunogasparetto/fluig-form-attachment
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Configurações
|
||||
*
|
||||
* @typedef AttachmentSettings
|
||||
* @property {boolean} showActionButton Exibe o botão de upload/delete. True por padrão.
|
||||
* @property {boolean} filename Nome que será salvo como descrição do Anexo.
|
||||
* @property {boolean|string} prefixName Adiciona prefixo ao anexo. False por padrão, True para prefixo aleatório, String para prefixo fixo.
|
||||
* @property {string} accept Tipos de arquivos aceitos. Segue a regra do accept do input tipo file.
|
||||
*/
|
||||
|
||||
;(function ($) {
|
||||
"use strict";
|
||||
|
||||
const pluginName = "fluigFormAttachment";
|
||||
|
||||
const deleteFileClassName = "BtnDeleteFile";
|
||||
const uploadFileClassname = "BtnUploadFile";
|
||||
const viewerFileClassname = "BtnViewerFile";
|
||||
const compressedExtensions = [
|
||||
'.7z', '.zip', '.rar', '.gz', '.tar', '.tbz2', '.tgz', '.bz2', '.lz', '.lz4','.txz',
|
||||
'.xz', '.z', '.zst', '.zstd', '.war', '.ear', '.jar','.apk', '.arj', '.ace', '.cab',
|
||||
];
|
||||
|
||||
const isString = item => typeof item === "string";
|
||||
|
||||
/**
|
||||
* Procura o índice do anexo de acordo com sua descrição
|
||||
*
|
||||
* @param {string} filename
|
||||
* @returns {number} -1 se não encontrar
|
||||
*/
|
||||
const attachmentFindIndex = (filename) => parent.ECM.attachmentTable.getData().findIndex(attachment => attachment.description === filename);
|
||||
|
||||
/**
|
||||
* Configuração padrão
|
||||
*
|
||||
* @type {AttachmentSettings}
|
||||
*/
|
||||
const defaults = {
|
||||
showActionButton: true,
|
||||
filename: "Anexo",
|
||||
prefixName: false,
|
||||
accept: "*",
|
||||
};
|
||||
|
||||
class Plugin {
|
||||
/**
|
||||
* @type {AttachmentSettings}
|
||||
*/
|
||||
#settings;
|
||||
|
||||
/**
|
||||
* Elemento do arquivo. Pode ser um input ou span (no modo leitura).
|
||||
*
|
||||
* @type {JQuery<HTMLElement>}
|
||||
*/
|
||||
#input;
|
||||
|
||||
/**
|
||||
* @type {JQuery<HTMLElement>}
|
||||
*/
|
||||
#container;
|
||||
|
||||
/**
|
||||
* @type {string}
|
||||
*/
|
||||
#attachmentFilename;
|
||||
|
||||
/**
|
||||
* @param {HTMLElement} element
|
||||
* @param {AttachmentSettings} options
|
||||
*/
|
||||
constructor(element, options) {
|
||||
|
||||
// Garantir um ID para o Input
|
||||
if (!element.id && element.nodeName.toLowerCase() === "input") {
|
||||
element.id = FLUIGC.utilities.randomUUID();
|
||||
}
|
||||
|
||||
this.#settings = $.extend({}, defaults, options);
|
||||
this.#input = $(element);
|
||||
this.#attachmentFilename = this.#input.val() || this.#input.text().trim();
|
||||
|
||||
this.#input
|
||||
.prop("readonly", true)
|
||||
.on("change", () => {
|
||||
this.#attachmentFilename = this.#input.val();
|
||||
this.#changeButtonsState();
|
||||
})
|
||||
.wrap(`<div class="${pluginName}Component"></div>`)
|
||||
.after(`<div class="${pluginName}Component_buttons">${this.#getButtonsTemplate()}</div>`);
|
||||
|
||||
this.#container = this.#input.closest(`.${pluginName}Component`);
|
||||
|
||||
this.#container
|
||||
.on("click", `.${pluginName}${deleteFileClassName}`, () => this.#confirmDeleteAttachment())
|
||||
.on("click", `.${pluginName}${uploadFileClassname}`, () => this.#uploadAttachment())
|
||||
.on("click", `.${pluginName}${viewerFileClassname}`, () => this.#viewAttachment())
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indica que o campo está válido
|
||||
*
|
||||
* Caso o campo possua algum valor é obrigatório que o anexo
|
||||
* esteja na tabela de anexos.
|
||||
*
|
||||
* @returns {boolean}
|
||||
*/
|
||||
isValid() {
|
||||
return this.#attachmentFilename.length
|
||||
? this.hasAttachment()
|
||||
: true
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indica se o anexo está na tabela de anexos
|
||||
*
|
||||
* @returns {boolean}
|
||||
*/
|
||||
hasAttachment() {
|
||||
const filename = this.#attachmentFilename || this.#input.val() || this.#input.text().trim();
|
||||
|
||||
return filename.length > 0 && attachmentFindIndex(filename) !== -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove o anexo
|
||||
*
|
||||
* Método útil para excluir anexos em tabela Pai x Filho.
|
||||
*/
|
||||
deleteAttachment() {
|
||||
const attachmentIndex = parent.ECM.attachmentTable.getData().findIndex(
|
||||
attachment => attachment.description === this.#attachmentFilename
|
||||
);
|
||||
|
||||
setTimeout(() => this.#input.val("").trigger("change"), 500);
|
||||
|
||||
if (attachmentIndex === -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
parent.WKFViewAttachment.removeAttach([attachmentIndex]);
|
||||
}
|
||||
|
||||
showActionButton() {
|
||||
this.#settings.showActionButton = true;
|
||||
this.#input.trigger("change");
|
||||
}
|
||||
|
||||
hideActionButton() {
|
||||
this.#settings.showActionButton = false;
|
||||
this.#input.trigger("change");
|
||||
}
|
||||
|
||||
filename(fileName, prefixName) {
|
||||
if (fileName === undefined) {
|
||||
return this.#input.data("filename") || this.#settings.filename;
|
||||
}
|
||||
|
||||
this.#settings.filename = fileName;
|
||||
this.#input.data("filename", fileName);
|
||||
|
||||
if (prefixName !== undefined) {
|
||||
this.prefixName(prefixName);
|
||||
}
|
||||
}
|
||||
|
||||
prefixName(prefixName) {
|
||||
if (prefixName === undefined) {
|
||||
return this.#settings.prefixName;
|
||||
}
|
||||
|
||||
this.#settings.prefixName = prefixName;
|
||||
}
|
||||
|
||||
#getButtonsTemplate() {
|
||||
const hasFileSelected = this.#attachmentFilename.length !== 0;
|
||||
const canShowActionButton = this.#canDisplayActionButton();
|
||||
|
||||
return `<button type="button" class="${pluginName}BtnAction ${pluginName}${deleteFileClassName} btn btn-danger btn-sm ${(canShowActionButton && hasFileSelected) ? '' : 'hide'}" title="Remover Anexo"><i class="flaticon flaticon-trash icon-sm"></i></button>`
|
||||
+ `<button type="button" class="${pluginName}BtnAction ${pluginName}${uploadFileClassname} btn btn-success btn-sm ${(canShowActionButton && !hasFileSelected) ? '' : 'hide'}" title="Enviar Anexo"><i class="flaticon flaticon-upload icon-sm"></i></button>`
|
||||
+ `<button type="button" class="${pluginName}${viewerFileClassname} btn btn-info btn-sm ${hasFileSelected ? '' : 'hide'}" title="Visualizar Anexo"><i class="flaticon flaticon-view icon-sm"></i></button>`
|
||||
;
|
||||
}
|
||||
|
||||
#canDisplayActionButton() {
|
||||
const element = this.#input.get(0);
|
||||
|
||||
return this.#settings.showActionButton
|
||||
&& parent.ECM.workflowView.userPermissions.indexOf("P") >= 0
|
||||
&& location.href.includes('ManagerMode')
|
||||
&& !location.href.includes('token')
|
||||
&& element.nodeName.toLowerCase() === "input"
|
||||
&& !element.disabled
|
||||
;
|
||||
}
|
||||
|
||||
#changeButtonsState() {
|
||||
const hasFileSelected = this.#attachmentFilename.length !== 0;
|
||||
|
||||
if (this.#canDisplayActionButton()) {
|
||||
if (hasFileSelected) {
|
||||
this.#container.find(`.${pluginName}${uploadFileClassname}`).addClass("hide");
|
||||
this.#container.find(`.${pluginName}${deleteFileClassName}`).removeClass("hide");
|
||||
} else {
|
||||
this.#container.find(`.${pluginName}${deleteFileClassName}`).addClass("hide");
|
||||
this.#container.find(`.${pluginName}${uploadFileClassname}`).removeClass("hide");
|
||||
}
|
||||
} else {
|
||||
this.#container.find(`.${pluginName}BtnAction`).addClass("hide");
|
||||
}
|
||||
|
||||
if (hasFileSelected) {
|
||||
this.#container.find(`.${pluginName}${viewerFileClassname}`).removeClass("hide");
|
||||
} else {
|
||||
this.#container.find(`.${pluginName}${viewerFileClassname}`).addClass("hide");
|
||||
}
|
||||
}
|
||||
|
||||
#confirmDeleteAttachment() {
|
||||
if (!this.#canDisplayActionButton()) {
|
||||
return;
|
||||
}
|
||||
|
||||
FLUIGC.message.confirm({
|
||||
message: `Deseja remover o anexo <b>${this.#attachmentFilename}</b>?`,
|
||||
title: 'Confirmação',
|
||||
labelYes: 'Sim, quero remover',
|
||||
labelNo: 'Não, quero cancelar',
|
||||
}, result => {
|
||||
if (!result) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.deleteAttachment();
|
||||
});
|
||||
}
|
||||
|
||||
#uploadAttachment() {
|
||||
if (!this.#canDisplayActionButton()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let filename = this.#input.data("filename") || this.#settings.filename;
|
||||
|
||||
if (this.#settings.prefixName === true) {
|
||||
filename = FLUIGC.utilities.randomUUID().substring(0, 9) + filename;
|
||||
} else if (this.#settings.prefixName !== false && isString(this.#settings.prefixName)) {
|
||||
filename = `${this.#settings.prefixName}-${filename}`;
|
||||
}
|
||||
|
||||
// Evitar conflito de descrição do anexo
|
||||
if (attachmentFindIndex(filename) !== -1) {
|
||||
FLUIGC.toast({
|
||||
title: "Atenção",
|
||||
message: "Já existe um anexo com essa descrição",
|
||||
type: "warning",
|
||||
})
|
||||
return;
|
||||
}
|
||||
|
||||
parent.$("#ecm-navigation-inputFile-clone")
|
||||
.attr({
|
||||
"data-on-camera": "true",
|
||||
"data-file-name-camera": filename,
|
||||
"data-inputid": this.#input.attr("id"),
|
||||
"data-filename": filename,
|
||||
"multiple": false,
|
||||
"accept": this.#input.data("accept") || this.#settings.accept,
|
||||
})
|
||||
.trigger("click")
|
||||
;
|
||||
}
|
||||
|
||||
#viewAttachment() {
|
||||
const attachmentIndex = parent.ECM.attachmentTable.getData().findIndex(
|
||||
attachment => attachment.description === this.#attachmentFilename
|
||||
);
|
||||
|
||||
if (attachmentIndex === -1) {
|
||||
FLUIGC.toast({
|
||||
title: "Atenção",
|
||||
message: "Anexo não encontrado",
|
||||
type: "warning"
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const attachment = parent.ECM.attachmentTable.getRow(attachmentIndex);
|
||||
const physicalFileName = String(
|
||||
attachment.physicalFileName || attachment.fileName || attachment.name || ""
|
||||
).toLowerCase();
|
||||
const isCompressedFile = compressedExtensions.some(extension => physicalFileName.endsWith(extension));
|
||||
|
||||
if (attachment.documentId && !isCompressedFile) {
|
||||
parent.WKFViewAttachment.openAttachmentView(parent.WCMAPI.userCode, attachment.documentId, attachment.version);
|
||||
} else {
|
||||
parent.WKFViewAttachment.downloadAttach([attachmentIndex]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Instancia o Plugin ou executa algum método do plugin
|
||||
*
|
||||
* @param {AttachmentSettings|string} options
|
||||
* @returns {undefined|boolean|void}
|
||||
*/
|
||||
$.fn[pluginName] = function (options) {
|
||||
if (!parent.WKFViewAttachment || !parent.ECM || !parent.ECM.attachmentTable) {
|
||||
console.error(`Plugin ${pluginName} executado fora de um processo.`)
|
||||
return this;
|
||||
}
|
||||
|
||||
// Executa o Método
|
||||
if (isString(options)) {
|
||||
const methodName = options;
|
||||
const methodArgs = Array.prototype.slice.call(arguments, 1);
|
||||
|
||||
let returnedValue = undefined;
|
||||
|
||||
this.each(function () {
|
||||
let pluginData = $.data(this, pluginName);
|
||||
|
||||
if (!pluginData) {
|
||||
pluginData = new Plugin(this, {});
|
||||
$.data(this, pluginName, pluginData);
|
||||
}
|
||||
|
||||
if (!pluginData[methodName]) {
|
||||
return;
|
||||
}
|
||||
|
||||
returnedValue = pluginData[methodName](...methodArgs);
|
||||
|
||||
if (returnedValue !== undefined) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
return returnedValue !== undefined
|
||||
? returnedValue
|
||||
: this
|
||||
;
|
||||
}
|
||||
|
||||
return this.each(function () {
|
||||
if (!$.data(this, pluginName)) {
|
||||
$.data(this, pluginName, new Plugin(this, options));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
if (!parent.WKFViewAttachment || !parent.ECM || !parent.ECM.attachmentTable) {
|
||||
return;
|
||||
}
|
||||
|
||||
const loading = FLUIGC.loading(window, {
|
||||
title: "Aguarde",
|
||||
textMessage: "Enviando arquivo",
|
||||
})
|
||||
|
||||
$(() => {
|
||||
// Oculta aba anexos
|
||||
$("#tab-attachments", parent.document).hide();
|
||||
|
||||
parent.$("#ecm_navigation_fileupload")
|
||||
.on(`fileuploadadd.${pluginName}`, function(e, data) {
|
||||
// Impede abrir o Loading caso tenha erro no arquivo
|
||||
|
||||
const file = data.files[0];
|
||||
|
||||
if (parent.ECM.maxUploadSize > 0 && file.size >= (parent.ECM.maxUploadSize * 1024 * 1024)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (parent.ECM.newAttachmentsDocs.length
|
||||
&& parent.ECM.newAttachmentsDocs.findIndex(attachment => attachment.name === file.name) !== -1
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
loading.show();
|
||||
})
|
||||
.on(`fileuploadfail.${pluginName}`, () => loading.hide())
|
||||
.on(`fileuploaddone.${pluginName}`, function() {
|
||||
// Atualiza o campo do arquivo caso o upload tenha ocorrido
|
||||
|
||||
loading.hide();
|
||||
|
||||
const btnUpload = parent.document.getElementById("ecm-navigation-inputFile-clone");
|
||||
const filename = btnUpload.getAttribute("data-filename");
|
||||
|
||||
if (attachmentFindIndex(filename) === -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
$(`#${btnUpload.getAttribute("data-inputid")}`).val(filename).trigger("change");
|
||||
});
|
||||
|
||||
parent.$(document).on(`fileuploadstop.${pluginName}`, () => loading.hide());
|
||||
});
|
||||
|
||||
|
||||
$("head").append(`<style>
|
||||
.${pluginName}Component { display: flex; align-items: center; flex-wrap: nowrap; }
|
||||
.${pluginName}Component input { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
|
||||
.${pluginName}Component_buttons { display: flex; align-items: center; justify-content: flex-end; }
|
||||
.${pluginName}Component_buttons .btn { outline: none !important; outline-offset: unset !important; border-radius: 0 !important; height: 32px; }
|
||||
</style>`);
|
||||
|
||||
}(jQuery));
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,166 @@
|
||||
<html>
|
||||
<head>
|
||||
<link type="text/css" rel="stylesheet" href="/style-guide/css/fluig-style-guide.min.css" />
|
||||
<script type="text/javascript" src="/portal/resources/js/jquery/jquery.js"></script>
|
||||
<script type="text/javascript" src="/portal/resources/js/jquery/jquery-ui.min.js"></script>
|
||||
<script type="text/javascript" src="/portal/resources/js/mustache/mustache-min.js"></script>
|
||||
<script type="text/javascript" src="/style-guide/js/fluig-style-guide.min.js" charset="utf-8"></script>
|
||||
<script type="text/javascript" src="./fluigFormAttachment.js"></script>
|
||||
<link type="text/css" rel="stylesheet" href="./assets/css/checklist.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="fluig-style-guide">
|
||||
<form name="form" role="form">
|
||||
<div class="container-fluid audit-shell">
|
||||
<div class="audit-status">
|
||||
<span class="status-pill" id="profileBadge">Perfil: Loja</span>
|
||||
<span class="status-pill" id="progressBadge">Evidências: 0/0</span>
|
||||
</div>
|
||||
|
||||
<h1 class="audit-main-title">Checklist de Auditoria dos Pilares</h1>
|
||||
|
||||
<section class="audit-section intro-data-section">
|
||||
<div class="instruction-section">
|
||||
<div class="instruction-copy">
|
||||
<div class="instruction-head">
|
||||
<div class="instruction-icon">i</div>
|
||||
<div class="instruction-title">Envie as fotos dos pilares</div>
|
||||
</div>
|
||||
<div class="instruction-steps">
|
||||
<span>1. Clique em um <strong>PILAR</strong></span>
|
||||
<span>3. Clique em <strong>ANEXAR</strong> para enviar a foto solicitada</span>
|
||||
<span>5. Envie para concluir</span>
|
||||
<span>2. Verifique as <strong>INSTRUÇÕES</strong></span>
|
||||
<span>4. Confira em <strong>VISUALIZAR</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="intro-divider"></div>
|
||||
|
||||
<div class="audit-context-card">
|
||||
<div class="section-title">Dados da Auditoria</div>
|
||||
<div class="row audit-context-row">
|
||||
<div class="col-md-6 col-sm-6">
|
||||
<label class="audit-label" for="loja">Loja</label>
|
||||
<input
|
||||
type="zoom"
|
||||
class="form-control audit-input"
|
||||
name="loja"
|
||||
id="loja"
|
||||
data-zoom="{
|
||||
'displayKey':'LOJA',
|
||||
'datasetId':'ds_lojas_api',
|
||||
'maximumSelectionLength':'1',
|
||||
'placeholder':'Selecione a loja',
|
||||
'fields':[
|
||||
{'field':'LOJA','label':'Loja', 'standard':'true','search':'true'},
|
||||
{'field':'RESPONSAVEL_LOJA','label':'Responsavel'},
|
||||
{'field':'REGIONAL','label':'Regional'},
|
||||
{'field':'COLLEAGUE_ID','label':'Colleague ID'},
|
||||
{'field':'LOGIN_LOJA','label':'Login Loja'}
|
||||
]
|
||||
}"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-md-3 col-sm-6">
|
||||
<label class="audit-label" for="responsavelLoja">Responsavel da Loja</label>
|
||||
<input type="text" class="form-control audit-input" name="responsavelLoja" id="responsavelLoja" />
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-6">
|
||||
<label class="audit-label" for="auditor">Analista</label>
|
||||
<input type="text" class="form-control audit-input" name="auditor" id="auditor" />
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-4">
|
||||
<label class="audit-label" for="dataAuditoria">Data</label>
|
||||
<input type="date" class="form-control audit-input" name="dataAuditoria" id="dataAuditoria" readonly/>
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-4">
|
||||
<label class="audit-label" for="ciclo">Ciclo</label>
|
||||
<input type="text" class="form-control audit-input" name="ciclo" id="ciclo" placeholder="Ex: 2026-03" required />
|
||||
</div>
|
||||
<div class="col-md-3 col-sm-4">
|
||||
<label class="audit-label" for="regional">Regional</label>
|
||||
<input type="text" class="form-control audit-input" name="regional" id="regional" readonly />
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-4">
|
||||
<label class="audit-label" for="dataLimite">Data limite</label>
|
||||
<input type="date" class="form-control audit-input" name="dataLimite" id="dataLimite" required />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="nc-box" id="naoConformeBox" style="display:none;">
|
||||
<div class="nc-title">Pendências para correção</div>
|
||||
<div class="nc-list" id="naoConformeList"></div>
|
||||
</div>
|
||||
|
||||
<section class="audit-section progress-section">
|
||||
<h2 class="section-title">Progresso da Auditoria</h2>
|
||||
<div class="progress-inline">
|
||||
<div class="progress-track">
|
||||
<div class="progress-fill" id="globalProgressFill"></div>
|
||||
</div>
|
||||
<div class="progress-percent" id="globalProgressPercent">0%</div>
|
||||
</div>
|
||||
<div class="progress-meta" id="globalProgressMeta">0 de 0 fotos enviadas</div>
|
||||
</section>
|
||||
|
||||
<div class="row audit-card">
|
||||
<div class="col-md-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="audit-score" id="scoreFinal">0%</div>
|
||||
<small>Score final</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="audit-score" id="pontosObtidos">0</div>
|
||||
<small>Pontos obtidos</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="audit-score" id="pontosPossiveis">0</div>
|
||||
<small>Pontos possíveis</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="audit-score" id="classificacao">-</div>
|
||||
<small>Classificação</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 class="section-title pilares-title">Pilares Analisados</h2>
|
||||
<div class="row">
|
||||
<div class="col-md-12" id="pilaresContainer"></div>
|
||||
</div>
|
||||
<div class="audit-send-wrap">
|
||||
<button type="button" class="btn btn-primary audit-send-btn" id="btnEnviarForm">Finalizar</button>
|
||||
</div>
|
||||
<input type="hidden" name="auditoriaPayload" id="auditoriaPayload" />
|
||||
<input type="hidden" name="temNaoConforme" id="temNaoConforme" value="false" />
|
||||
<input type="hidden" name="qtdNaoConforme" id="qtdNaoConforme" value="0" />
|
||||
<input type="hidden" name="listaNaoConforme" id="listaNaoConforme" value="" />
|
||||
<input type="hidden" name="saidaAnalise" id="saidaAnalise" value="CONFORME" />
|
||||
<input type="hidden" name="usuarioRetorno" id="usuarioRetorno" value="" />
|
||||
<input type="hidden" name="destinoLoja" id="destinoLoja" value="" />
|
||||
<input type="hidden" name="destinoLojaId" id="destinoLojaId" value="" />
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="./assets/js/checklist.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user