Guilherme Silberfarb Costa commited on
Commit
1d89fc8
·
1 Parent(s): 225c9ff

correcoes observacao

Browse files
frontend/src/components/AvaliacaoTab.jsx CHANGED
@@ -4,6 +4,7 @@ import { buildCsvBlob } from '../csv'
4
  import { buildAvaliacaoModeloLink } from '../deepLinks'
5
  import LoadingOverlay from './LoadingOverlay'
6
  import MapFrame from './MapFrame'
 
7
  import ShareLinkButton from './ShareLinkButton'
8
  import SinglePillAutocomplete from './SinglePillAutocomplete'
9
  import TruncatedCellContent from './TruncatedCellContent'
@@ -526,6 +527,7 @@ export default function AvaliacaoTab({ sessionId, quickLoadRequest = null, onRou
526
  const [avaliandoLocalizacaoStatus, setAvaliandoLocalizacaoStatus] = useState('')
527
  const [avaliandoLogradouroOptions, setAvaliandoLogradouroOptions] = useState([])
528
  const [avaliandoLogradouroLoading, setAvaliandoLogradouroLoading] = useState(false)
 
529
 
530
  const [avaliacoesCards, setAvaliacoesCards] = useState([])
531
  const [baseCardId, setBaseCardId] = useState(BASE_COMPARACAO_SEM_BASE)
@@ -728,32 +730,9 @@ export default function AvaliacaoTab({ sessionId, quickLoadRequest = null, onRou
728
  }, [sessionId])
729
 
730
  useEffect(() => {
731
- let ativo = true
732
- if (!sessionId) return () => {
733
- ativo = false
734
- }
735
-
736
- setAvaliandoLogradouroLoading(true)
737
- api.pesquisarModelos({ somente_contexto: true })
738
- .then((resp) => {
739
- if (!ativo) return
740
- const logradouros = Array.isArray(resp?.sugestoes?.logradouros_eixos)
741
- ? resp.sugestoes.logradouros_eixos
742
- : []
743
- setAvaliandoLogradouroOptions(logradouros)
744
- })
745
- .catch(() => {
746
- if (!ativo) return
747
- setAvaliandoLogradouroOptions([])
748
- })
749
- .finally(() => {
750
- if (!ativo) return
751
- setAvaliandoLogradouroLoading(false)
752
- })
753
-
754
- return () => {
755
- ativo = false
756
- }
757
  }, [sessionId])
758
 
759
  useEffect(() => {
@@ -823,6 +802,23 @@ export default function AvaliacaoTab({ sessionId, quickLoadRequest = null, onRou
823
  }
824
  }
825
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
826
  async function onUploadModel(arquivo = null) {
827
  const arquivoUpload = arquivo || uploadedFile
828
  if (!sessionId || !arquivoUpload) return
@@ -1305,12 +1301,7 @@ export default function AvaliacaoTab({ sessionId, quickLoadRequest = null, onRou
1305
  )}
1306
  {status ? <div className="status-line">{status}</div> : null}
1307
  {badgeHtml ? <div className="upload-badge-block" dangerouslySetInnerHTML={{ __html: badgeHtml }} /> : null}
1308
- {modeloObservacao ? (
1309
- <div className="elaborador-badge modelo-observacao-badge">
1310
- <div className="elaborador-badge-title">OBSERVAÇÃO</div>
1311
- <div className="modelo-observacao-text">{modeloObservacao}</div>
1312
- </div>
1313
- ) : null}
1314
  </div>
1315
 
1316
  {!modeloPronto ? (
@@ -1417,6 +1408,9 @@ export default function AvaliacaoTab({ sessionId, quickLoadRequest = null, onRou
1417
  panelTitle="Logradouros dos eixos"
1418
  emptyMessage="Nenhum logradouro encontrado nos eixos."
1419
  loading={avaliandoLogradouroLoading}
 
 
 
1420
  inputName="logradouroEixosAvaliacao"
1421
  inputAutoComplete="new-password"
1422
  />
 
4
  import { buildAvaliacaoModeloLink } from '../deepLinks'
5
  import LoadingOverlay from './LoadingOverlay'
6
  import MapFrame from './MapFrame'
7
+ import ModeloObservacaoCard from './ModeloObservacaoCard'
8
  import ShareLinkButton from './ShareLinkButton'
9
  import SinglePillAutocomplete from './SinglePillAutocomplete'
10
  import TruncatedCellContent from './TruncatedCellContent'
 
527
  const [avaliandoLocalizacaoStatus, setAvaliandoLocalizacaoStatus] = useState('')
528
  const [avaliandoLogradouroOptions, setAvaliandoLogradouroOptions] = useState([])
529
  const [avaliandoLogradouroLoading, setAvaliandoLogradouroLoading] = useState(false)
530
+ const [avaliandoLogradouroLoaded, setAvaliandoLogradouroLoaded] = useState(false)
531
 
532
  const [avaliacoesCards, setAvaliacoesCards] = useState([])
533
  const [baseCardId, setBaseCardId] = useState(BASE_COMPARACAO_SEM_BASE)
 
730
  }, [sessionId])
731
 
732
  useEffect(() => {
733
+ setAvaliandoLogradouroOptions([])
734
+ setAvaliandoLogradouroLoading(false)
735
+ setAvaliandoLogradouroLoaded(false)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
736
  }, [sessionId])
737
 
738
  useEffect(() => {
 
802
  }
803
  }
804
 
805
+ async function carregarSugestoesLogradouroAvaliando() {
806
+ if (!sessionId || avaliandoLogradouroLoading || avaliandoLogradouroLoaded) return
807
+ setAvaliandoLogradouroLoading(true)
808
+ try {
809
+ const response = await api.pesquisarLogradourosEixos()
810
+ const opcoes = Array.isArray(response?.logradouros_eixos)
811
+ ? response.logradouros_eixos.map((item) => String(item || '').trim()).filter(Boolean)
812
+ : []
813
+ setAvaliandoLogradouroOptions(opcoes)
814
+ setAvaliandoLogradouroLoaded(true)
815
+ } catch {
816
+ setAvaliandoLogradouroOptions([])
817
+ } finally {
818
+ setAvaliandoLogradouroLoading(false)
819
+ }
820
+ }
821
+
822
  async function onUploadModel(arquivo = null) {
823
  const arquivoUpload = arquivo || uploadedFile
824
  if (!sessionId || !arquivoUpload) return
 
1301
  )}
1302
  {status ? <div className="status-line">{status}</div> : null}
1303
  {badgeHtml ? <div className="upload-badge-block" dangerouslySetInnerHTML={{ __html: badgeHtml }} /> : null}
1304
+ <ModeloObservacaoCard text={modeloObservacao} className="modelo-observacao-badge" />
 
 
 
 
 
1305
  </div>
1306
 
1307
  {!modeloPronto ? (
 
1408
  panelTitle="Logradouros dos eixos"
1409
  emptyMessage="Nenhum logradouro encontrado nos eixos."
1410
  loading={avaliandoLogradouroLoading}
1411
+ onOpenChange={(open) => {
1412
+ if (open) void carregarSugestoesLogradouroAvaliando()
1413
+ }}
1414
  inputName="logradouroEixosAvaliacao"
1415
  inputAutoComplete="new-password"
1416
  />
frontend/src/components/ModeloObservacaoCard.jsx ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useEffect, useState } from 'react'
2
+
3
+ export default function ModeloObservacaoCard({
4
+ text,
5
+ title = 'OBSERVAÇÃO',
6
+ defaultOpen = true,
7
+ className = '',
8
+ }) {
9
+ const content = String(text || '').trim()
10
+ const [open, setOpen] = useState(defaultOpen)
11
+
12
+ useEffect(() => {
13
+ setOpen(defaultOpen)
14
+ }, [content, defaultOpen])
15
+
16
+ if (!content) return null
17
+
18
+ const classes = [
19
+ 'elaborador-badge',
20
+ 'modelo-observacao-card',
21
+ open ? 'is-open' : '',
22
+ className,
23
+ ].filter(Boolean).join(' ')
24
+
25
+ return (
26
+ <div className={classes}>
27
+ <button
28
+ type="button"
29
+ className="modelo-observacao-toggle"
30
+ onClick={() => setOpen((prev) => !prev)}
31
+ aria-expanded={open}
32
+ title={open ? 'Recolher observação' : 'Expandir observação'}
33
+ >
34
+ <span className="elaborador-badge-title">{title}</span>
35
+ <span className="modelo-observacao-toggle-icon" aria-hidden="true">▾</span>
36
+ </button>
37
+ {open ? <div className="modelo-observacao-text">{content}</div> : null}
38
+ </div>
39
+ )
40
+ }
frontend/src/components/PesquisaTab.jsx CHANGED
@@ -6,6 +6,7 @@ import DataTable from './DataTable'
6
  import EquationFormatsPanel from './EquationFormatsPanel'
7
  import LoadingOverlay from './LoadingOverlay'
8
  import MapFrame from './MapFrame'
 
9
  import ModeloTrabalhosTecnicosPanel from './ModeloTrabalhosTecnicosPanel'
10
  import PlotFigure from './PlotFigure'
11
  import PesquisaAdminConfigPanel from './PesquisaAdminConfigPanel'
@@ -1638,7 +1639,6 @@ export default function PesquisaTab({
1638
  <div className="pesquisa-opened-model-head">
1639
  <div className="pesquisa-opened-model-title-wrap">
1640
  <h3>{modeloAbertoMeta?.nome || 'Modelo'}</h3>
1641
- {modeloAbertoMeta?.observacao ? <p>{modeloAbertoMeta.observacao}</p> : null}
1642
  </div>
1643
  <button
1644
  type="button"
@@ -1649,6 +1649,7 @@ export default function PesquisaTab({
1649
  Voltar para pesquisa
1650
  </button>
1651
  </div>
 
1652
 
1653
  <div className="inner-tabs" role="tablist" aria-label="Abas internas do modelo aberto na pesquisa">
1654
  {PESQUISA_INNER_TABS.map((tab) => (
 
6
  import EquationFormatsPanel from './EquationFormatsPanel'
7
  import LoadingOverlay from './LoadingOverlay'
8
  import MapFrame from './MapFrame'
9
+ import ModeloObservacaoCard from './ModeloObservacaoCard'
10
  import ModeloTrabalhosTecnicosPanel from './ModeloTrabalhosTecnicosPanel'
11
  import PlotFigure from './PlotFigure'
12
  import PesquisaAdminConfigPanel from './PesquisaAdminConfigPanel'
 
1639
  <div className="pesquisa-opened-model-head">
1640
  <div className="pesquisa-opened-model-title-wrap">
1641
  <h3>{modeloAbertoMeta?.nome || 'Modelo'}</h3>
 
1642
  </div>
1643
  <button
1644
  type="button"
 
1649
  Voltar para pesquisa
1650
  </button>
1651
  </div>
1652
+ <ModeloObservacaoCard text={modeloAbertoMeta?.observacao} className="pesquisa-opened-model-observacao" />
1653
 
1654
  <div className="inner-tabs" role="tablist" aria-label="Abas internas do modelo aberto na pesquisa">
1655
  {PESQUISA_INNER_TABS.map((tab) => (
frontend/src/components/RepositorioTab.jsx CHANGED
@@ -6,6 +6,7 @@ import EquationFormatsPanel from './EquationFormatsPanel'
6
  import ListPagination from './ListPagination'
7
  import LoadingOverlay from './LoadingOverlay'
8
  import MapFrame from './MapFrame'
 
9
  import ModeloTrabalhosTecnicosPanel from './ModeloTrabalhosTecnicosPanel'
10
  import PlotFigure from './PlotFigure'
11
  import ShareLinkButton from './ShareLinkButton'
@@ -618,7 +619,6 @@ export default function RepositorioTab({
618
  <div className="pesquisa-opened-model-head">
619
  <div className="pesquisa-opened-model-title-wrap">
620
  <h3>{modeloAbertoMeta?.nome || 'Modelo'}</h3>
621
- {modeloAbertoMeta?.observacao ? <p>{modeloAbertoMeta.observacao}</p> : null}
622
  </div>
623
  <div className="pesquisa-opened-model-actions">
624
  <ShareLinkButton href={shareHref} />
@@ -647,6 +647,7 @@ export default function RepositorioTab({
647
  </button>
648
  </div>
649
  </div>
 
650
 
651
  <div className="inner-tabs" role="tablist" aria-label="Abas internas do modelo aberto no repositório">
652
  {REPO_INNER_TABS.map((tab) => (
 
6
  import ListPagination from './ListPagination'
7
  import LoadingOverlay from './LoadingOverlay'
8
  import MapFrame from './MapFrame'
9
+ import ModeloObservacaoCard from './ModeloObservacaoCard'
10
  import ModeloTrabalhosTecnicosPanel from './ModeloTrabalhosTecnicosPanel'
11
  import PlotFigure from './PlotFigure'
12
  import ShareLinkButton from './ShareLinkButton'
 
619
  <div className="pesquisa-opened-model-head">
620
  <div className="pesquisa-opened-model-title-wrap">
621
  <h3>{modeloAbertoMeta?.nome || 'Modelo'}</h3>
 
622
  </div>
623
  <div className="pesquisa-opened-model-actions">
624
  <ShareLinkButton href={shareHref} />
 
647
  </button>
648
  </div>
649
  </div>
650
+ <ModeloObservacaoCard text={modeloAbertoMeta?.observacao} className="pesquisa-opened-model-observacao" />
651
 
652
  <div className="inner-tabs" role="tablist" aria-label="Abas internas do modelo aberto no repositório">
653
  {REPO_INNER_TABS.map((tab) => (
frontend/src/styles.css CHANGED
@@ -4767,6 +4767,35 @@ button.btn-upload-select {
4767
  margin-top: 10px;
4768
  }
4769
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4770
  .modelo-observacao-text {
4771
  margin-top: 6px;
4772
  color: #40586f;
@@ -4775,6 +4804,10 @@ button.btn-upload-select {
4775
  white-space: pre-line;
4776
  }
4777
 
 
 
 
 
4778
  .modelo-variaveis-box {
4779
  padding: 9px 11px;
4780
  border-radius: 11px;
 
4767
  margin-top: 10px;
4768
  }
4769
 
4770
+ .modelo-observacao-card {
4771
+ padding-top: 9px;
4772
+ }
4773
+
4774
+ .modelo-observacao-toggle {
4775
+ width: 100%;
4776
+ border: 0;
4777
+ padding: 0;
4778
+ background: transparent;
4779
+ display: flex;
4780
+ align-items: center;
4781
+ justify-content: space-between;
4782
+ gap: 12px;
4783
+ cursor: pointer;
4784
+ text-align: left;
4785
+ }
4786
+
4787
+ .modelo-observacao-toggle-icon {
4788
+ flex: 0 0 auto;
4789
+ color: #68829c;
4790
+ font-size: 0.8rem;
4791
+ line-height: 1;
4792
+ transition: transform 0.15s ease;
4793
+ }
4794
+
4795
+ .modelo-observacao-card:not(.is-open) .modelo-observacao-toggle-icon {
4796
+ transform: rotate(-90deg);
4797
+ }
4798
+
4799
  .modelo-observacao-text {
4800
  margin-top: 6px;
4801
  color: #40586f;
 
4804
  white-space: pre-line;
4805
  }
4806
 
4807
+ .pesquisa-opened-model-observacao {
4808
+ margin: -2px 0 14px;
4809
+ }
4810
+
4811
  .modelo-variaveis-box {
4812
  padding: 9px 11px;
4813
  border-radius: 11px;