1 && [\n moment(valorPadrao[0], dateFormat),\n moment(valorPadrao[1], dateFormat),\n ]\n }\n />\n );\n}\n\nexport default RangePickerComponent;\n","import {Divider} from './Divider.styled';\n\nexport default Divider;\n","import styled from 'styled-components';\nimport { Divider as antdDivider} from 'antd';\n\nexport const Divider = styled(antdDivider)`\n &&{\n .ant-divider-inner-text{\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n }\n }\n \n`;","import * as S from './Drawer.styled';\n\nexport default S.Drawer;\n","import styled from 'styled-components';\nimport { Drawer as AntDesignDrawer } from 'antd';\n\nexport const Drawer = styled(AntDesignDrawer).attrs(() => ({\n bodyStyle: { padding: 0 },\n}))``;\n","export const Limite = {\n PDF: 60000,\n XML: 60000,\n TXT: 60000,\n XLSX: 60000,\n CSV: 60000,\n JPG: 1500,\n};\n","import styled from 'styled-components';\nimport Button from '../Button/Button.component';\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n ${Button} {\n padding: 2px;\n margin-left: 8px;\n }\n`;\n","import {Dropdown} from 'antd';\n\nexport default Dropdown;\n","import React from 'react';\nimport { Menu } from 'antd';\nimport { Limite } from '~/modules/Helper/FileExportConstants';\nimport { Container } from './Exportacao.styled';\n\nimport Tooltip from '../Tooltip/Tooltip.component';\nimport Dropdown from '../Dropdown/Dropdown.component';\nimport Icons from '../Icons/Icons.component';\nimport Button from '../Button/Button.component';\n\nfunction Exportacao({ onClick, QuantidadeRegistros, semURI, moduloFixo }) {\n function handleMenuClick(e) {\n onClick(e.key);\n }\n\n function handleLimitMessage(limite) {\n return `${`Não é possível exportar acima de ${limite} registros`}`;\n }\n\n const menuExportacao = (\n \n );\n\n return (\n \n \n \n \n \n );\n}\n\nexport default Exportacao;\n","import styled from 'styled-components';\nimport { Typography as AntDesignTypography } from 'antd';\n\nexport const Text = styled(AntDesignTypography.Text)`\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n`;\n\nexport const Link = styled(AntDesignTypography.Link)``;\n\nexport const Title = styled(AntDesignTypography.Title)`\n &.ant-typography {\n font-size: ${({ theme, level }) => {\n let originalFontSize = 0;\n switch (level) {\n case 1:\n originalFontSize = 38;\n break;\n\n case 2:\n originalFontSize = 30;\n break;\n\n case 3:\n originalFontSize = 24;\n break;\n\n case 4:\n originalFontSize = 20;\n break;\n\n case 5:\n originalFontSize = 16;\n break;\n\n default:\n originalFontSize = 38;\n }\n\n return `${originalFontSize + 2 * theme.zoomFonte}px`;\n }};\n }\n`;\n\nexport const Paragraph = styled(AntDesignTypography.Paragraph)`\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n`;\n\nexport const Typography = {\n Text,\n Link,\n Title,\n Paragraph,\n};\n","import styled from 'styled-components';\nimport { Button } from 'antd';\nimport * as Icons from '@ant-design/icons';\n\nexport const Icon = styled(Icons.EnvironmentOutlined)`\n font-size: 14px;\n`;\n\nexport const ImageButton = styled(Button)`\n && {\n display: flex;\n align-items: center;\n height: 40px;\n width: 40px;\n padding: 12px;\n }\n`;\n","import React from 'react';\nimport { Tooltip } from 'antd';\nimport * as S from './MapButton.styled';\n\nfunction MapButton({ rua, numero, bairro, cidade }) {\n let query = `${rua || ' '} ${numero || ''} ${bairro || ''} ${cidade || ''}`;\n query = query.replace(/\\s/g, '+');\n\n function redirect() {\n window.open(`https://www.google.com/maps/search/?api=1&query=${query}`);\n }\n\n return (\n \n \n \n \n \n );\n}\nexport default MapButton;\n","import styled from 'styled-components';\nimport { Layout, Col } from 'antd';\n\nexport const Footer = styled(Layout.Footer)`\n && {\n text-align: center;\n }\n`;\n\nexport const MapButtonWrapper = styled(Col)`\n margin-top: 5px;\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Row, Col } from 'antd';\nimport { Typography } from '../Typography/Typography.styled';\nimport MapButton from '~/components/MapButton/MapButton.component';\nimport * as S from './Footer.styled';\n\nfunction Footer() {\n const configuration = useSelector(state => state.configuration);\n const {\n corFonteRodape,\n endereco,\n bairro,\n cidade,\n cep,\n telefone,\n atendimento,\n } = configuration;\n\n return (\n \n \n \n \n {endereco} - {bairro} - {cidade} - {cep}\n \n\n \n {telefone} - {atendimento}\n \n \n \n \n \n
\n \n );\n}\n\nexport default Footer;\n","import { Form as FormV3 } from '@ant-design/compatible';\nimport '@ant-design/compatible/assets/index.css';\n\nexport default FormV3;\n","import styled from 'styled-components';\nimport { Layout } from 'antd';\n\nexport const Header = styled(Layout.Header)`\n && {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0;\n height: 160px;\n background: url(${({ src }) => `'${src}'`}) no-repeat;\n background-size: 100% 100%;\n background-position: center center;\n background-color: #fff;\n }\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport * as S from './Header.styled';\n\nfunction Header({ children }) {\n const banner = useSelector(state => state.configuration.banner);\n\n return {children};\n}\n\nexport default Header;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { Icon as AntDesignIcon } from 'antd';\n\nexport const Icon = styled(props => )`\n && {\n padding: ${props => props.padding}px;\n padding-left: ${props => props.pl}px;\n padding-right: ${props => props.pr}px;\n font-size: ${props => props.fontSize}px;\n color: ${props => props.color};\n }\n`;\n","import styled from 'styled-components';\nimport { Typography } from '../Typography/Typography.styled';\n\nexport const Paragraph = styled(Typography.Paragraph)`\n && {\n color: ${({ color }) => color};\n font-weight: bold;\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n }\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport * as S from './SectionTitle.styled';\n\nfunction SectionTitle({ titulo, icon }) {\n const corTema = useSelector(state => state.configuration.corTema);\n\n return (\n \n {icon}\n {titulo}\n \n );\n}\n\nexport default SectionTitle;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n margin-bottom: 10px;\n background: rgba(255, 255, 255, 0.9);\n`;\n\nexport const IconSection = styled.div`\n margin-right: 5px;\n`;\n\nexport const Content = styled.div`\n padding: 10px;\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n`;\n","import React from 'react';\nimport SectionTitle from '../SectionTitle/SectionTitle.component';\nimport { Container, Content, IconSection } from './style';\n\nfunction Informacao({ titulo, informacao, icon}) {\n return (\n <>\n \n \n \n \n >\n );\n}\n\nexport default Informacao;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n margin-bottom: 10px;\n background: rgba(255, 255, 255, 0.9);\n`;\n\nexport const IconSection = styled.div`\n margin-right: 5px;\n`;\n\nexport const Content = styled.div`\n padding: 10px;\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n\n & #highlighted {\n font-style: normal;\n background: yellow;\n }\n`;\n","import React from 'react';\r\n\r\nexport default function RemoveDiacritic(stringValue) {\r\n\r\n return stringValue\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/\\p{Diacritic}/gu, '');\r\n}\r\n","import React, {\n useEffect,\n useState,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport SectionTitle from '../SectionTitle/SectionTitle.component';\nimport { Container, Content } from './style';\nimport RemoveDiacritic from '../../hooks/removeDiacritic';\n\nconst InformacaoFilter = forwardRef(\n ({ titulo, informacao, icon, setSearchValue }, ref) => {\n const [html, setHtml] = useState();\n const tagsPermitidas = ['LI', 'P', 'BODY'];\n const regexToRemoveHtmlTag = /(<([^>]+)>)/gi;\n\n useImperativeHandle(ref, () => ({\n filterElements(value) {\n const buscaSemAcentos = RemoveDiacritic(value);\n if (buscaSemAcentos) {\n\n const newDocumentHTML = new DOMParser().parseFromString(\n informacao,\n 'text/html'\n );\n\n const elementos = newDocumentHTML.body.getElementsByTagName('*');\n\n const hasMatchWord = string => {\n return RemoveDiacritic(string)?.indexOf(buscaSemAcentos) !== -1;\n };\n\n let ultimoElementoPermitido; \n\n for(let i = 0; i < elementos.length; i++) {\n let elemento = elementos[i];\n \n let elementoSemAcento = elemento.innerHTML.replace(regexToRemoveHtmlTag, '');\n elementoSemAcento = RemoveDiacritic(elementoSemAcento);\n \n let IndexFound = hasMatchWord(elementoSemAcento);\n let isTagPermitida = tagsPermitidas.includes(elemento.tagName);\n\n //Nesse if verificamos se encontramos o termo na busca e se ele é uma das tags permitidas definidas nas consts no começo\n //da classe, caso encontrado ele define o display como block, caso encontre e não seja uma tag permitida, definimos como\n // '', e caso não encontre colocamos 'none'.\n\n if(IndexFound && isTagPermitida) {\n ultimoElementoPermitido = elemento;\n elemento.style.display= \"block\";\n }\n \n else if(IndexFound || (!isTagPermitida && ultimoElementoPermitido)) \n elemento.style.display= \"\";\n \n else {\n elemento.style.display= \"none\";\n }\n };\n\n const novoHtml = newDocumentHTML.body.innerHTML;\n return setHtml(novoHtml);\n } else {\n setSearchValue('');\n }\n },\n onChangeInfo(e) {\n setSearchValue(e.target.value);\n if (!e.target.value) {\n setHtml(informacao);\n }\n },\n }));\n\n useEffect(() => {\n setSearchValue('');\n setHtml(informacao);\n }, [informacao]);\n\n return (\n <>\n \n \n \n \n >\n );\n }\n);\n\nexport default InformacaoFilter;\n","import React from 'react';\nimport { ConfigProvider } from 'antd';\nimport ptBR from 'antd/es/locale/pt_BR';\n\nfunction Internationalization({ children }) {\n return {children};\n}\n\nexport default Internationalization;\n","import * as S from './Layout.styled';\n\nexport default S.Layout;\n","import styled from 'styled-components';\nimport { Layout as AntDesignLayout } from 'antd';\n\nexport const Layout = styled(AntDesignLayout)`\n min-height: 100vh;\n overflow-y: hidden;\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { Spin } from 'antd';\n\nfunction Loader({ children }) {\n const count = useSelector(state => state.loader.count);\n\n return (\n 0} delay={500}>\n {children}\n \n );\n}\n\nexport default Loader;\n","import styled from 'styled-components';\n\nexport const Logo = styled.img`\n display: block;\n height: 60px;\n margin: 16px auto;\n cursor: pointer;\n`;\n","/* eslint-disable react/self-closing-comp */\nimport React from 'react';\nimport { useSelector } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\nimport * as S from './Logo.styled';\n\nfunction Logo({ history: { push } }) {\n const brasao = useSelector(state =>\n state.configuration.highContrast\n ? state.configuration.brasaoPB\n : state.configuration.brasao\n );\n\n function onClick() {\n push('/');\n }\n\n return (\n {\n if (event.keyCode === 13) onClick();\n }}\n onClick={onClick}\n tabIndex={0}\n src={brasao}\n alt=\"Brasão\"\n >\n );\n}\n\nexport default withRouter(Logo);\n","import styled, { createGlobalStyle } from 'styled-components';\nimport { Map as LeafletMap } from 'react-leaflet';\nimport { Card } from '~/components';\n\nexport const Map = styled(LeafletMap)`\n width: 100%;\n height: 459px;\n z-index: 0;\n`;\n\nexport const PopupStyles = createGlobalStyle`\n .leaflet-zoom-animated{\n bottom: 35px !important;\n }\n`;\n\nexport const PopupLink = styled.a`\n font-size: 14px;\n text-decoration: underline;\n &:hover{\n text-decoration: underline;\n }\n`;\n\nexport const MapTextCard = styled(Card)`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 459px;\n`;\n","import React, { useEffect, useState } from 'react';\nimport { Icon } from 'leaflet';\nimport { TileLayer, Marker, Popup } from 'react-leaflet';\nimport markerIconPng from 'leaflet/dist/images/marker-icon.png';\nimport Geocode from 'react-geocode';\nimport * as S from './Map.styled';\nimport { geocodeKey } from '~/utils/keys';\n\nGeocode.setApiKey(geocodeKey);\nGeocode.setLanguage('cs');\nGeocode.setRegion('br');\n\nfunction MapContainer({ rua, numero, bairro, cidade, corFonte }) {\n const discardCompleFromRua = rua?.split('-')[0];\n let query = `${discardCompleFromRua || ' '} ${numero || ''} ${bairro ||\n ''} ${cidade || ''}`;\n query = query.replace(/\\s/g, '+');\n\n function redirect() {\n window.open(`https://www.google.com/maps/search/?api=1&query=${query}`);\n }\n\n const [data, setData] = useState(false);\n\n useEffect(() => {\n Geocode.fromAddress(\n `${discardCompleFromRua || ' '} ${bairro || ' '} ${cidade || ' '}`\n ).then(\n response => {\n setData(response.results[0].geometry.location);\n },\n error => {\n setData(null);\n }\n );\n }, []);\n\n const loadMap = () => {\n if (data) {\n return (\n \n \n \n \n \n \n {rua}\n \n \n \n \n );\n }\n\n if (data === null) {\n return Localização não encontrada.;\n }\n\n do {\n return Carregando;\n } while (!data);\n };\n\n return <>{loadMap()}>;\n}\n\nexport default MapContainer;\n","export const geocodeKey = 'AIzaSyD1YTq1NF4ZIBis1ZYmf_zzLiAiU_BnYD4';\n","import React from 'react';\nimport Icons from '../../components/Icons/Icons.component';\n\nexport const iconEnum = [\n {\n name: 'question-circle',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'question',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'clock-circle',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'exclamation',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'message',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'bulb',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'bank',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'calendar',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'file-text',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'file-done',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'flag',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'home',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'mail',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'setting',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'schedule',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'smile',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'tags',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'wallet',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'dollar',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'link',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'shopping-cart',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'shopping',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'team',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'check',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'close',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'warning',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'stop',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'delete',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'area-chart',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'alert',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'api',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'cloud',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'contacts',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'container',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'idcard',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'global',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'safety',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'notification',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'environment',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'ordered-list',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'snippets',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'control',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'compass',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'dashboard',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'api-requests',\n value: style => ,\n filled: 'outlined',\n },\n {\n name: 'project',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'profile',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'info-circle',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'apartment',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'calculator',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'file-search',\n value: style => ,\n outlined: 'outlined',\n },\n {\n name: 'info-circle-filled',\n value: style => ,\n filled: 'filled',\n },\n {\n name: 'youtube',\n value: style => ,\n filled: 'filled',\n },\n {\n name: 'file-pdf',\n value: style => ,\n filled: 'filled',\n },\n {\n name: 'file-img',\n value: style => ,\n filled: 'filled',\n },\n {\n name: 'file-excel',\n value: style => ,\n filled: 'filled',\n },\n {\n name: 'line-chart',\n value: style => ,\n filled: 'outlined',\n },\n {\n name: 'folder-open',\n value: style => ,\n filled: 'outlined',\n },\n];\n","export function getUrlSemDominio() {\n const url = window.location.href;\n\n return url.slice(url.indexOf('#') + 1);\n}\n\nexport function getUrlComDominio() {\n return window.location.href;\n}\n\nexport function getUrlDominio() {\n const url = window.location.href;\n\n return url.split('#')[0];\n}\n\nexport default { getUrlSemDominio, getUrlComDominio };\n","import styled from 'styled-components';\nimport { Input as AntDesignInput } from 'antd';\n\nexport const Input = styled(AntDesignInput)``;\n","import styled, { createGlobalStyle, css } from 'styled-components';\nimport { Menu as AntDesignMenu } from 'antd';\nimport { Input } from '../Input/Input.styled';\n\nconst { Search } = Input;\n\nexport const Menu = styled(AntDesignMenu)`\n height: calc(100svh - 156px);\n overflow-y: auto;\n overflow-x: hidden;\n\n // Adicionando padding no último item do menu\n .ant-menu-item:last-child,\n .ant-menu-submenu:last-child {\n margin-bottom: 24px !important;\n padding-bottom: 24px !important;\n }\n`;\n\nconst menuTitulo = css`\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n display: inline-block;\n word-wrap: break-word;\n white-space: break-spaces;\n line-height: 1.6;\n`;\n\nexport const SubMenu = styled(AntDesignMenu.SubMenu)`\n .menu-titulo {\n ${menuTitulo}\n }\n\n .ant-menu-submenu-arrow {\n display: none;\n }\n\n .ant-menu-submenu-title {\n padding: 0px 20px;\n }\n\n .anticon-arrow-right {\n border: 1px solid;\n border-radius: 50%;\n padding: 3px;\n\n svg {\n width: 12px;\n height: 12px;\n cursor: pointer;\n }\n }\n`;\n\nexport const MenuItem = styled(AntDesignMenu.Item)`\n .menu-titulo {\n ${menuTitulo}\n }\n`;\n\nexport const SearchMenu = styled(Search)`\n margin: 16px;\n display: flex;\n width: auto;\n`;\n\nexport const MenuStyles = createGlobalStyle`\n\n .ant-menu-title-content, .ant-menu-item-active {\n color: #fff !important;\n text-decoration-color: none !important;\n text-emphasis-color: none !important;\n }\n\n .ant-menu-item:hover, .ant-menu-submenu-open {\n text-decoration: underline;\n }\n\n .ant-menu-dark .ant-menu-inline. ant-menu-sub {\n box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.45);\n }\n\n .ant-layout-sider-children {\n position: fixed;\n width:inherit;\n }\n\n .ant-menu-vertical > .ant-menu-submenu > .ant-menu-submenu-title{\n line-height:normal;\n height:auto;\n margin: 12px 0px;\n text-wrap: auto;\n }\n\n .ant-menu-inline-collapsed-tooltip { \n display: none;\n }\n\n .ant-tooltip { \n opacity: 0.8; \n }\n`;\n","/* eslint-disable no-restricted-syntax */\n/* eslint-disable no-shadow */\n/* eslint-disable react/jsx-no-bind */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport React, { useState } from 'react';\nimport { withRouter, useHistory } from 'react-router-dom';\nimport { iconEnum } from '~/modules/Helper/iconEnum';\nimport { TIPO_MENU_PORTAL } from '~/modules/Helper/tipoMenuPortal';\nimport { useMenus } from '~/contexts/menu.context';\nimport { useSelector } from 'react-redux';\nimport { getUrlDominio } from '~/modules/Helper/getUrl-helper';\n\nimport * as S from './Menu.styled';\nimport Tooltip from '../Tooltip/Tooltip.component';\nimport Icons from '../Icons/Icons.component';\n\nfunction Menu({ openKeys, setOpenKeys, setCollapsed, collapsed }) {\n const { menus, setMenuSelecionado } = useMenus();\n const { highContrast } = useSelector(state => state.configuration);\n const [searchValue, setSearchValue] = useState('');\n const [searchResult, setSearchResult] = useState([]);\n const history = useHistory();\n\n function handleTitleClick(name, idMenuItem) {\n\n // Função auxiliar para encontrar o item e seus níveis\n const findItemAndLevels = (items, targetId, levels = []) => {\n for (const item of items) {\n if (item.Id === targetId) {\n return [...levels, item.Titulo];\n }\n\n if (item.SubItens && item.SubItens.length > 0) {\n const found = findItemAndLevels(item.SubItens, targetId, [\n ...levels,\n item.Titulo,\n ]);\n if (found) return found;\n }\n }\n return null;\n };\n\n // Encontra todos os níveis até o item clicado\n const menuLevels = findItemAndLevels(menus, idMenuItem);\n\n if (menuLevels) {\n // Se encontrou o item, atualiza openKeys\n if (openKeys.includes(name)) {\n // Se o item já está aberto, mantém apenas os níveis até ele\n setOpenKeys(openKeys.filter(key => menuLevels.includes(key)));\n } else {\n // Se o item está fechado, mantém apenas os níveis necessários\n const newOpenKeys = openKeys.filter(key => menuLevels.includes(key));\n setOpenKeys([...newOpenKeys, name]);\n }\n } else {\n // 1º nivel é aqui\n setOpenKeys([name]);\n }\n }\n\n function formatUrl(url) {\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n return `http://${url}`;\n }\n return url;\n }\n\n function handleRedirect(tipoMenuPortal, uri, subItens) {\n if (tipoMenuPortal === TIPO_MENU_PORTAL.EXTERNO) {\n // externo\n let newUri = '';\n if (subItens !== null) newUri = formatUrl(uri);\n else newUri = getUrlDominio() + uri;\n window.open(newUri);\n } else {\n history.replace(`/`);\n history.push(uri);\n }\n setOpenKeys([]);\n }\n\n function tratarTextoBusca(texto) {\n return texto\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '');\n }\n\n function handleSearchChange(event) {\n const { value } = event.target;\n setSearchValue(value);\n\n if (value === '') {\n setSearchResult([]);\n setOpenKeys([]);\n return;\n }\n\n const searchTerm = tratarTextoBusca(value);\n\n const findMatchingSubItems = (subItems, searchTerm) => {\n let matchedList = [];\n\n subItems.forEach(subItem => {\n const subItemTitle = tratarTextoBusca(subItem.Titulo);\n\n if (subItemTitle.includes(searchTerm)) {\n matchedList.push(subItem);\n }\n\n if (subItem.SubItens && subItem.SubItens.length > 0) {\n matchedList = matchedList.concat(\n findMatchingSubItems(subItem.SubItens, searchTerm)\n );\n }\n });\n\n return matchedList;\n };\n\n const results = menus.reduce((acc, menu) => {\n const {\n Id,\n Titulo,\n TipoMenuPortal,\n SubItens,\n Icone,\n URI,\n ChaveModulo,\n } = menu;\n\n const menuTitle = tratarTextoBusca(Titulo);\n let matchFound = menuTitle.includes(searchTerm);\n let matchedList = [];\n\n if (SubItens && SubItens.length > 0) {\n matchedList = findMatchingSubItems(SubItens, searchTerm);\n if (matchedList.length > 0) {\n matchFound = true;\n }\n } else if (menuTitle.includes(searchTerm)) {\n matchFound = true;\n matchedList.push(menu);\n }\n\n if (matchFound) {\n if (matchedList.length > 0) {\n matchedList.forEach(matchedItem => acc.push(matchedItem));\n } else {\n acc.push({\n Id,\n Titulo,\n TipoMenuPortal,\n SubItens,\n Icone,\n URI,\n ChaveModulo,\n });\n }\n }\n\n return acc;\n }, []);\n\n setSearchResult(results);\n }\n\n function renderMenuItem(menu) {\n const { Titulo, TipoMenuPortal, SubItens, Icone, URI, IdMenuItem } = menu;\n\n const handleSubMenuTitleClick = () => {\n if (URI) {\n handleRedirect(TipoMenuPortal, URI, SubItens);\n setMenuSelecionado(menu);\n }\n };\n\n const handleSubMenuTitleClick2 = () => {\n if (URI) {\n handleRedirect(TipoMenuPortal, URI, SubItens);\n setMenuSelecionado(menu);\n }\n };\n\n const handleMenuClick = () => {\n handleRedirect(TipoMenuPortal, URI, SubItens);\n setMenuSelecionado(menu);\n if (setCollapsed) setCollapsed(false);\n };\n\n const handleSubMenuIconClick = () => {\n handleTitleClick(Titulo, IdMenuItem);\n };\n\n const TitleMenu = () => {Titulo};\n\n if (SubItens.length > 0) {\n return (\n \n \n {Icone && iconEnum.find(x => x.name === Icone)?.value()}\n
\n \n \n
\n \n
\n
\n \n }\n >\n {SubItens.map(subItem => renderMenuItem({ Titulo, ...subItem }))}\n \n );\n }\n return (\n \n x.name === Icone)?.value()}\n style={!collapsed ? { padding: '0px 20px' } : {}}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n event.preventDefault();\n handleMenuClick();\n }\n }}\n >\n \n \n \n );\n }\n\n const handleMouseLeave = () => {\n setOpenKeys([]); // Fecha todos os submenus\n };\n\n return (\n <>\n \n {!collapsed ? (\n \n \n \n ) : null}\n \n {menus && searchResult.length > 0\n ? searchResult.map(renderMenuItem)\n : menus.map(renderMenuItem)}\n \n >\n );\n}\n\nexport default withRouter(Menu);\n","import styled from 'styled-components';\nimport { Modal as ModalAntDesign } from 'antd';\n\nexport const Modal = styled(ModalAntDesign).attrs(props => ({\n bodyStyle: {\n maxHeight: props.maxHeight,\n minHeight: props.minHeight,\n overflow: 'auto',\n },\n}))`\n .ant-modal-title {\n color: ${({ corFonteTituloTelas }) => `${corFonteTituloTelas}`};\n font-size: ${({ theme }) => `${16 + 2 * theme.zoomFonte}px`};\n }\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport * as S from './Modal.styled';\n\nfunction Modal({\n title,\n width,\n visible,\n onCancel,\n maxHeight,\n minHeight,\n children,\n}) {\n const configuration = useSelector(state => state.configuration);\n const { corFonteTituloTelas } = configuration;\n\n return (\n \n {children}\n \n );\n}\n\nexport default Modal;\n\nModal.defaultProps = {\n width: 520,\n visible: false,\n maxHeight: '70vh',\n};\n\nModal.confirm = S.Modal.confirm;\n","import { Row } from 'antd';\n\nexport default Row;\n","import styled from 'styled-components';\nimport { Layout } from 'antd';\n\nexport const Sider = styled(Layout.Sider)`\n min-height: 100vh;\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport * as S from './Sider.styled';\n\nfunction Sider({ collapsed, children }) {\n const corTema = useSelector(state => state.configuration.corTema);\n\n return (\n \n {children}\n \n );\n}\n\nexport default Sider;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { ThemeProvider } from 'styled-components';\n\nfunction Theme({ children }) {\n const { highContrast, zoomFonte } = useSelector(state => state.configuration);\n\n return (\n \n {children}\n \n );\n}\n\nexport default Theme;\n","import * as S from './Tag.styled';\n\nexport default S.Tag;\n","import styled from 'styled-components';\nimport { Tag as TagComponent } from 'antd';\n\nexport const Tag = styled(TagComponent)``;\n","import styled from 'styled-components';\nimport { Typography } from 'antd';\n\nexport const Title = styled(Typography.Title)`\n && {\n display: inline;\n font-size: ${({ theme }) => `${22 + 2 * theme.zoomFonte}px`};\n color: ${({ color }) => color};\n }\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport * as S from './Title.styled';\n\nfunction Title() {\n const configuration = useSelector(state => state.configuration);\n const { corFonteTituloPortal, titulo } = configuration;\n\n return {titulo};\n}\n\nexport default Title;\n","import * as S from './Typography.styled';\n\nexport default S.Typography;\n","import * as S from './Input.styled';\n\nexport default S.Input;\n","import * as S from './InputNumber.styled';\n\nexport default S.InputNumber;\n","import styled from 'styled-components';\nimport { InputNumber as InputNumero } from 'antd';\n\nexport const InputNumber = styled(InputNumero)`\n && .ant-input-number-handler-wrap {\n display: none;\n }\n`;\n","import * as S from './Select.styled';\n\nexport default S.Select;\n","import styled from 'styled-components';\nimport { Select as AntDesignSelect } from 'antd';\n\nexport const Select = styled(AntDesignSelect)``;\n","import styled from 'styled-components';\n// eslint-disable-next-line import/no-cycle\nimport { Button } from '../index';\n\nexport const SocialsContainer = styled.div`\n z-index: 999;\n position: fixed;\n display: flex;\n right: 10px;\n bottom: 0;\n flex-direction: column;\n`;\n\nexport const ButtonStyled = styled(Button)`\n display: flex;\n align-items: center;\n justify-content: center;\n background: ${({ background }) => background} !important;\n border: none !important;\n margin-bottom: 10px;\n width: 32.89px;\n height: 32.89px;\n border-radius: 12px !important;\n box-shadow: 0px 5px 11px -2px rgba(0, 0, 0, 0.2),\n 0px 4px 12px -7px rgba(0, 0, 0, 0.2) !important;\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\n// eslint-disable-next-line import/no-cycle\nimport { Icons } from '../index';\n\nexport function SocialsList() {\n const {\n RazaoSocial,\n EmailSocials,\n FacebookSocials,\n InstagramSocials,\n LinkedInSocials,\n TwitterSocials,\n WhatsAppSocials,\n YoutubeSocials,\n } = useSelector(state => state?.configuration);\n\n function retornaWpp() {\n const { input } = WhatsAppSocials?.replace(/\\D/g, '').match(\n /(\\d{0,3})(\\d{0,3})(\\d{0,4})/\n );\n return input;\n }\n\n const ArraySocials = [\n {\n icon: (\n \n ),\n link: TwitterSocials || null,\n ToolTip: 'Twitter',\n background: '#1DA1F2',\n },\n {\n icon: (\n \n ),\n link: FacebookSocials || null,\n ToolTip: 'Facebook',\n background: '#1877F2',\n },\n {\n icon: (\n \n ),\n link: InstagramSocials || null,\n ToolTip: 'Instagram',\n background:\n 'linear-gradient(45deg, #f09433 0%,#e6683c 25%,#dc2743 50%,#cc2366 75%,#bc1888 100%)',\n },\n {\n icon: (\n \n ),\n link:\n (WhatsAppSocials &&\n retornaWpp() &&\n `https://wa.me/55${retornaWpp()}/?text=Olá ${RazaoSocial}. Gostaria de informações sobre o Portal de Transparência.`) ||\n null,\n ToolTip: 'WhatsApp',\n background: '#1A9447',\n },\n {\n icon: (\n \n ),\n link: YoutubeSocials || null,\n ToolTip: 'Youtube',\n background: '#CD201F',\n },\n {\n icon: (\n \n ),\n link: LinkedInSocials || null,\n ToolTip: 'LinkedIn',\n background: '#0A66C2',\n },\n {\n mail: true,\n icon: ,\n link: (EmailSocials && `mailto:${EmailSocials}`) || null,\n ToolTip: 'E-mail',\n background: '#0061FF',\n },\n ];\n return ArraySocials;\n}\n","import React from 'react';\nimport MailGo from 'mailgo';\n// eslint-disable-next-line import/no-cycle\nimport * as S from './Socials.styled';\n// eslint-disable-next-line import/no-cycle\nimport { Tooltip } from '../index';\nimport { SocialsList } from './SocialsList';\n\nexport default function Socials() {\n MailGo();\n return (\n \n {SocialsList &&\n SocialsList().map(\n item =>\n item.link && (\n \n window.open(item.link, '_blank') : null\n }\n background={item?.background}\n type=\"primary\"\n color=\"#fff\"\n icon={item?.icon}\n />\n \n )\n )}\n \n );\n}\n","import styled from 'styled-components';\nimport { Table as AntDesignTable } from 'antd';\n\nexport const Table = styled(AntDesignTable)`\n .ant-table-thead > tr > th.ant-table-column-has-sorters:hover {\n opacity: 0.9;\n }\n .ant-table-tbody > tr.ant-table-row-level-0:hover > td {\n background: unset;\n opacity: 0.9;\n }\n .ant-table-thead > tr > th,\n .ant-table-tbody > tr > td,\n .ant-table tfoot > tr > th,\n .ant-table tfoot > tr > td {\n padding: 6px 6px;\n }\n .ant-table-thead th.ant-table-column-has-sorters {\n padding: 14px 14px;\n }\n .ant-empty-img-simple-g {\n stroke: #d9d9d9;\n }\n .ant-empty-img-simple-path {\n fill: #fafafa;\n }\n .ant-empty-description,\n .ant-empty-img-simple-ellipse {\n color: #c9c9c9;\n }\n\n .ant-table-column-sorters-with-tooltip {\n text-align: center;\n\n .ant-table-column-title,\n .ant-table-cell,\n .btn-chave-visao,\n .btn-link-externo {\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n }\n }\n`;\n\nexport const TableResize = styled.section`\n @media only screen and (max-width: 1200px) {\n .ant-table-expanded-row-fixed {\n width: auto !important;\n }\n\n .ant-table-placeholder td {\n padding-left: 0px !important;\n }\n\n .ant-table {\n background: #ffff !important;\n }\n\n .ant-pagination {\n overflow-wrap: break-word;\n flex-wrap: wrap;\n }\n\n div.dates {\n flex-wrap: wrap;\n }\n\n table,\n thead,\n tbody,\n th,\n td,\n tr {\n display: block !important;\n }\n\n table {\n width: auto !important;\n }\n\n thead tr {\n position: absolute !important;\n top: -9999px !important;\n left: -9999px !important;\n }\n\n tr:first-child {\n margin-top: -2px;\n }\n\n tr {\n border: 1px solid #ccc !important;\n border-bottom: 2px solid #eee !important;\n }\n\n tr:nth-child(even) {\n background: ${({ theme }) => `${theme.corFundoGrid}`} !important;\n\n & td.ant-table-cell {\n background: ${({ theme }) => `${theme.corFundoGrid}`} !important;\n }\n\n & td.ant-table-column-sort {\n background: ${({ theme }) => `${theme.corFundoGrid}`} !important;\n }\n }\n\n tr:nth-child(odd) {\n background: ${({ theme }) => `${theme.corFundoGrid}70`} !important;\n\n & td.ant-table-cell {\n background: ${({ theme }) => `${theme.corFundoGrid}70`} !important;\n }\n\n & td.ant-table-column-sort {\n background: ${({ theme }) => `${theme.corFundoGrid}70`} !important;\n }\n }\n\n td {\n border: none !important;\n border-bottom: 1px solid #eee !important;\n min-height: 1.25em !important;\n white-space: normal !important;\n text-align: left !important;\n display: flex !important;\n }\n\n td:before {\n width: 45% !important;\n padding-right: 10px !important;\n font-weight: bold !important;\n color: #006b76 !important;\n }\n\n td:before {\n content: attr(data-title);\n }\n\n button.btn-chave-visao {\n padding: 0 !important;\n height: auto !important;\n flex: 1 !important;\n white-space: normal !important;\n }\n\n td > span {\n width: 50% !important;\n }\n }\n\n @media only screen and (max-width: 820px) and (min-width: 700px) {\n ul.ant-pagination {\n justify-content: center !important;\n }\n\n ul.ant-pagination > li.ant-pagination-total-text {\n white-space: nowrap !important;\n min-width: 90%;\n }\n }\n\n @media only screen and (max-width: 580px) and (min-width: 440px) {\n ul.ant-pagination {\n justify-content: center !important;\n }\n\n ul.ant-pagination > li.ant-pagination-total-text {\n white-space: nowrap !important;\n min-width: 90%;\n }\n }\n\n @media only screen and (max-width: 440px) {\n .ant-table-footer > div:first-child {\n display: contents !important;\n }\n\n ul.ant-pagination {\n flex-direction: column !important;\n align-items: center !important;\n width: 100% !important;\n }\n }\n`;\n","import React from 'react';\nimport * as S from './Table.styled';\nimport { useSelector } from 'react-redux';\n\nexport default function Table(props) {\n const theme = useSelector(state => state.configuration);\n\n return (\n \n \n \n );\n}\n","export const TIPO_VISAO = {\n PRINCIPAL: 1,\n AGRUPAMENTO: 2,\n ANALITICO: 3,\n EXTERNO: 4,\n INTERNO: 5,\n MODULOFIXO: 6,\n MODULODINAMICO: 7,\n};\n","import React, { useRef, useState } from 'react';\nimport { TIPO_VISAO } from '~/modules/Helper/tipo-visao';\nimport { Input, Button, Space } from 'antd';\nimport { SearchOutlined } from '@ant-design/icons';\n\nconst FilterHeaderTable = ({\n setSelectedKeys,\n selectedKeys,\n confirm,\n clearFilters,\n close,\n visaoColuna,\n setDataFilterHeader,\n dataFilterHeader,\n configuracao,\n obterColunaChave,\n obterColunaLink,\n setFiltro,\n filtro,\n setPagina\n}) => {\n const searchInput = useRef(null);\n\n const [valorChave, setValorChave] = useState('');\n const [campoAlterado, setCampoAlterado] = useState(false);\n\n const { NomeColuna, FonteDados, TipoValor } = visaoColuna;\n\n let KeyVisao = null;\n if (configuracao && configuracao.VisaoColunas) {\n const visaoColuna =\n configuracao.Tipo === TIPO_VISAO.AGRUPAMENTO\n ? obterColunaChave()\n : obterColunaLink();\n\n KeyVisao = visaoColuna?.FonteDados;\n }\n\n const handleSearch = (selectedKeys, confirm, valorChave) => {\n confirm();\n if (KeyVisao && KeyVisao == FonteDados) {\n setValorChave(valorChave);\n setFiltro([\n {\n Campo: FonteDados,\n Valor: selectedKeys[0],\n TipoValor,\n },\n ]);\n setSelectedKeys(['']);\n } else {\n let dataFilter = { ...dataFilterHeader };\n dataFilter.Filtros ? dataFilter.Filtros = dataFilter.Filtros.filter(x => x.Campo != FonteDados) : dataFilter.Filtros = [];\n dataFilter.Filtros.push({\n Campo: FonteDados,\n Valor: selectedKeys[0],\n TipoValor,\n });\n setDataFilterHeader(dataFilter);\n }\n setCampoAlterado(false);\n setPagina(1);\n };\n\n const handleReset = clearFilters => {\n clearFilters();\n if (KeyVisao && KeyVisao == FonteDados) setFiltro([]);\n else {\n let dataFilter = {\n ...dataFilterHeader,\n Filtros: dataFilterHeader.Filtros.filter(x => x.Campo != FonteDados),\n };\n setDataFilterHeader(dataFilter);\n }\n setValorChave('');\n };\n\n const verificaValor = () => {\n let valor = selectedKeys[0] || '';\n if (KeyVisao && KeyVisao == FonteDados) {\n if (valor == valorChave && campoAlterado) {\n setCampoAlterado(false);\n } else if (\n filtro?.length > 0 &&\n filtro[0].Campo == KeyVisao &&\n filtro[0].Valor != valorChave &&\n !campoAlterado\n ) {\n valor = filtro[0].Valor;\n setValorChave(valor);\n } else {\n valor =\n (valor != valorChave || valorChave) && campoAlterado\n ? valor\n : valorChave;\n }\n }\n return valor;\n };\n\n return (\n e.stopPropagation()}\n >\n {\n setCampoAlterado(true);\n setSelectedKeys(e.target.value ? [e.target.value] : ['']);\n }}\n onPressEnter={e => {\n handleSearch(selectedKeys, confirm, e.target?.value);\n }}\n style={{\n marginBottom: 8,\n display: 'block',\n }}\n />\n \n \n \n \n
\n );\n};\n\nexport default FilterHeaderTable;\n","import { Tree } from 'antd';\n\nexport default Tree;\n","import { Result } from 'antd';\n\nexport default Result;\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport Result from '../Result/Result.component';\nimport { Button } from '../Button/Button.styled';\n\nfunction NotFound() {\n const history = useHistory();\n\n const voltarParaHome = () => {\n history.push('/');\n };\n\n const tituloPagina = 'Página não Encontrada';\n\n return (\n <>\n \n Voltar para Home\n \n }\n />\n >\n );\n}\n\nexport default NotFound;\n","import styled from 'styled-components';\nimport { Typography } from '../Typography/Typography.styled';\n\nexport const Title = styled(Typography.Title)`\n && {\n color: ${({ color }) => color};\n font-weight: bold;\n font-size: ${({ theme }) => `${20 + 2 * theme.zoomFonte}px`};\n }\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport * as S from './PageTitle.styled';\n\nfunction PageTitle({ titulo }) {\n const { corFonteTituloTelas: corTitulo, corTema } = useSelector(\n state => state.configuration\n );\n\n return (\n \n {titulo}\n \n );\n}\n\nexport default PageTitle;\n","import styled from 'styled-components';\n\nexport const ImageLink = styled.img`\n display: flex;\n height: 60px;\n margin: 20px 0px;\n cursor: pointer;\n`;\n","import { Tooltip } from 'antd';\nimport React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport * as S from './ImageLink.styled';\n\nfunction ImageLink({ imagem, uri, alt, tooltip }) {\n function onClick() {\n if (uri) {\n const redirect = !uri.match(/http(s)*:\\/\\//g) ? `http://${uri}` : uri;\n window.open(redirect);\n }\n }\n\n return (\n \n {\n if (event.keyCode === 13) onClick();\n }}\n onClick={onClick}\n tabIndex={0}\n src={`data:image/png;base64, ${imagem}`}\n alt={alt}\n >\n \n );\n}\n\nexport default withRouter(ImageLink);\n","import styled from 'styled-components';\nimport { Button } from 'antd';\n\nexport const Image = styled.img`\n display: block;\n width: 100%;\n height: 100%;\n`;\n\nexport const ImageButton = styled(Button)`\n && {\n display: inline-block;\n vertical-align: top;\n height: 90px;\n width: 180px;\n padding: 12px;\n margin-bottom: 20px;\n }\n`;\n","import { Tooltip } from 'antd';\nimport React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport * as S from './ImageButton.styled';\n\nfunction ImageButton({ type, shape, imagem, uri, alt, tooltip }) {\n function onClick() {\n if (uri) {\n const redirect = !uri.match(/http(s)*:\\/\\//g) ? `http://${uri}` : uri;\n window.open(redirect);\n }\n }\n\n return (\n \n {\n if (event.keyCode === 13) onClick();\n }}\n onClick={onClick}\n tabIndex={0}\n >\n \n \n \n );\n}\n\nexport default withRouter(ImageButton);\n","import * as L from './List.styled';\n\nexport default L.List;\n","import styled from 'styled-components';\nimport { List as antdList } from 'antd';\n\nexport const List = styled(antdList)`\n .ant-list-item, .ant-list-item-meta-content h4 {\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n }\n`;","import styled from 'styled-components';\nimport { Button as AntDesignButton } from 'antd';\n\nexport const ButtonGoBack = styled(AntDesignButton)`\nfloat: left;\nmargin: 10px 20px 0 0;\n && {\n margin-left: ${({ ml }) => ml}px;\n margin-right: ${({ mr }) => mr}px;\n color: ${({ color }) => color};\n }\n`;\n","import * as S from './ButtonGoBack.styled';\nimport React from 'react';\nfunction ButtonGoBack({ OnClick, MarginLeft = '0px' }) {\n return (\n <>\n \n Voltar\n \n >\n );\n}\n\nexport default ButtonGoBack;\n","import React from 'react';\nimport ReCAPTCHA from \"react-google-recaptcha\";\n\nfunction ReCaptcha({ handleOnCaptchaChange }) {\n return (\n \n );\n}\nexport default ReCaptcha;","import React from 'react';\nimport { notification } from 'antd';\n\nconst PreserveBreakLine = ({ message }) => (\n {message}
\n);\n\nfunction showSuccess(successMessage) {\n notification.success({\n message: 'Sucesso',\n description: ,\n });\n}\n\nfunction showWarning(warningMessage) {\n notification.warning({\n message: 'Alerta',\n description: ,\n });\n}\n\nfunction showError(errorMessage) {\n notification.error({\n message: 'Erro',\n description: ,\n });\n}\n\nexport { showSuccess, showWarning, showError };\n","import axios from 'axios';\nimport {\n addRequest,\n removeRequest,\n} from '~/store/modules/loader/loader.actions';\nimport { SMARAPD_FILEMANAGER_DOMAIN } from '~/services/urls';\nimport store from '~/store';\nimport history from './history';\n\nconst apiFM = axios.create({\n baseURL: SMARAPD_FILEMANAGER_DOMAIN,\n});\n\napiFM.interceptors.request.use(\n function handleRequest(config) {\n store.dispatch(addRequest());\n return config;\n },\n function handleError(error) {\n return Promise.reject(error);\n }\n);\n\napiFM.interceptors.response.use(\n function handleResponse(response) {\n store.dispatch(removeRequest());\n return response;\n },\n function handleError(error) {\n store.dispatch(removeRequest());\n return Promise.reject(error);\n }\n);\n\napiFM.interceptors.response.use(\n function handleResponse(response) {\n return response;\n },\n function handleError(error) {\n if (error && error.response) {\n store.dispatch(removeRequest());\n const { status } = error.response;\n if (status === 404) history.push('/notfound');\n }\n return Promise.reject(error);\n }\n);\n\nexport default apiFM;\n","import apiFM from '../apiFM';\n\nconst paiBaseService = '/filemanager/pai';\n\nexport async function fileManagerPaiDownload(fileName) {\n const url = `${apiFM.defaults.baseURL}${paiBaseService}/download?nomeArquivo=${fileName}`;\n window.location.assign(url);\n}\n\nexport function getFullUrl(nomeArquivo) {\n return `${apiFM.defaults.baseURL}${paiBaseService}/download?nomeArquivo=${nomeArquivo}`;\n}\n","import React, { useState, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useMediaQuery } from 'react-responsive';\n\nimport { setConfiguration } from '~/store/modules/configuration/configuration.actions';\n\nimport api from '~/services/api';\n\nimport {\n Layout,\n Drawer,\n Sider,\n Logo,\n Menu,\n Header,\n Collapse,\n Title,\n Acessibility,\n Content,\n Footer,\n BackTopPage,\n Icons,\n Socials,\n} from '~/components';\nimport { getFullUrl } from '~/services/FileManager/file-manager.service';\nimport { useMenus } from '~/contexts/menu.context';\n\nfunction DefaultLayout({ children }) {\n const { isLoadingMenus } = useMenus();\n const [isLoading, setIsLoading] = useState(true);\n const [collapsed, setCollapsed] = useState(false);\n const [openKeys, setOpenKeys] = useState([]);\n const [backTopBgColor, setBackTopBgColor] = useState();\n\n const dispatch = useDispatch();\n\n const isMobile = useMediaQuery({ query: '(max-width: 700px)' });\n\n useEffect(() => {\n async function getConfiguracao() {\n const [responseConfiguracao, responseCliente] = await Promise.all([\n api.get('configuracaoaparencia'),\n api.get('cliente'),\n ]);\n\n const {\n BannerUrl,\n BrasaoUrl,\n BrasaoPretoBrancoUrl,\n ImagemFundoHomeUrl,\n ImagemFundoTelasUrl,\n CorTema,\n Titulo,\n CorFonteTituloPortal,\n CorFonteTituloTelas,\n CorFonte,\n CorFonteRodape,\n CorFundoRodape,\n CorFundoGrid,\n CorFundoTituloGrid,\n CorTituloGrid,\n } = responseConfiguracao.data;\n\n const {\n RazaoSocial,\n Endereco,\n Bairro,\n Cidade,\n CEP,\n Telefone,\n Atendimento,\n EmailSocials,\n FacebookSocials,\n InstagramSocials,\n LinkedInSocials,\n TwitterSocials,\n WhatsAppSocials,\n YoutubeSocials,\n } = responseCliente.data;\n\n dispatch(\n setConfiguration({\n BannerUrl: getFullUrl(BannerUrl),\n BrasaoUrl: getFullUrl(BrasaoUrl),\n BrasaoPretoBrancoUrl: getFullUrl(BrasaoPretoBrancoUrl),\n ImagemFundoHomeUrl: getFullUrl(ImagemFundoHomeUrl),\n ImagemFundoTelasUrl: getFullUrl(ImagemFundoTelasUrl),\n CorTema,\n Titulo,\n CorFonteTituloPortal,\n CorFonteTituloTelas,\n CorFonte,\n CorFonteRodape,\n RazaoSocial,\n Endereco,\n Bairro,\n Cidade,\n CEP,\n Telefone,\n Atendimento,\n CorFundoGrid,\n CorFundoTituloGrid,\n CorTituloGrid,\n EmailSocials,\n FacebookSocials,\n InstagramSocials,\n LinkedInSocials,\n TwitterSocials,\n WhatsAppSocials,\n YoutubeSocials,\n })\n );\n\n setBackTopBgColor(CorTema);\n\n window.less\n .modifyVars({\n '@primary-color': CorTema || 'rgba(0, 0, 0, 0.1);',\n '@icon-color-hover': '#f5f5f5',\n '@link-hover-decoration': '#ffffff',\n '@layout-sider-background': CorTema || '#036f5a',\n '@menu-dark-bg': `${CorTema} !important` || '#036f5a',\n '@layout-footer-background': CorFundoRodape || '#fff',\n '@heading-color': `${CorFonte}` || '#000',\n '@text-color': `${CorFonte}` || '#000',\n '@text-color-secondary': `${CorFonte}` || '#000',\n '@disabled-color': `${CorFonte}` || '#000',\n '@link-color': '#1890ff',\n // Titulo Grid\n '@table-header-color': CorTituloGrid || '#000',\n '@table-footer-color': CorTituloGrid || '#000',\n // Fundo Grid\n '@table-bg': CorFundoGrid || '#f2f2f2',\n '@table-body-sort-bg': CorFundoGrid || '#f2f2f2',\n // Fundo Titulo Grid\n '@table-header-bg': CorFundoTituloGrid || '#fff2f2',\n '@table-header-sort-bg': CorFundoTituloGrid || '#f2f2f2',\n '@table-header-sort-active-bg': CorFundoTituloGrid || '#f2f2f2',\n '@table-footer-bg': CorFundoTituloGrid || '#f2f2f2',\n })\n .then(() => setIsLoading(false));\n }\n\n getConfiguracao();\n }, [dispatch]);\n\n function handleToggle() {\n setOpenKeys([]);\n setCollapsed(!collapsed);\n }\n\n return isLoading || isLoadingMenus ? (\n \n ) : (\n \n {isMobile ? (\n \n \n \n \n \n \n ) : (\n \n \n \n \n )}\n\n \n \n \n \n \n \n\n \n \n \n \n {children}\n \n \n }\n backgroundColor={backTopBgColor || 'rgba(0, 0, 0, 0.1);'}\n />\n \n \n );\n}\n\nexport default DefaultLayout;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n padding: 20px;\n height: 100%;\n padding: 20px;\n background: ${({ fundoTransparente }) =>\n fundoTransparente ? 'transparent' : 'rgba(255, 255, 255, 0.9)'};\n`;\n\nexport const Content = styled.div`\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n`;","import React from 'react';\nimport { Container, Content } from './style';\n\nfunction InformacaoDashboard({ informacao, fundoTransparente }) {\n return (\n <>\n \n \n \n >\n );\n}\n\nexport default InformacaoDashboard;\n","export const TIPO_ACESSO = {\n INTERNO: 1,\n EXTERNO: 2,\n};\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n width: 100%;\n height: 100%;\n cursor: pointer;\n`;\n\nexport const Imagem = styled.img`\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n","import React from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { TIPO_ACESSO } from '~/modules/Helper/tipoAcesso';\nimport { Container, Imagem } from './style';\n\nfunction CardImagemDashboard({ urlImagem, valorLink, tipoAcesso }) {\n const history = useHistory();\n\n function Redirecionar(link) {\n if (tipoAcesso === TIPO_ACESSO.INTERNO) return history.push(link);\n\n window.open(link, '_blank');\n }\n\n return (\n Redirecionar(valorLink)}>\n \n \n );\n}\n\nexport default CardImagemDashboard;\n","import styled from 'styled-components';\nimport YouTube from 'react-youtube';\n\nexport const Container = styled.div`\n padding: 20px;\n height: 100%;\n position: relative;\n background: rgba(255, 255, 255, 0.9);\n`;\n\nexport const Youtube = styled(YouTube)`\n width: 100%;\n height: 100%;\n\n iframe {\n width: 100%;\n height: 100%;\n }\n`;","import React from 'react';\nimport { Container, Youtube } from './style';\n\nfunction YouTubePlayer({ videoId }) {\n const optionsYoutubePlayer = {\n playerVars: {\n rel: 0,\n },\n };\n\n return (\n <>\n \n \n \n >\n );\n}\n\nexport default YouTubePlayer;\n","import React, { useState } from 'react';\n\nconst GraficoContext = React.createContext({});\n\nfunction ListaGraficoContext({ children }) {\n const [listaGrafico, setListaGrafico] = useState([]);\n const [eSic, setESic] = useState(null);\n return (\n \n {children}\n \n );\n}\n\nexport { ListaGraficoContext, GraficoContext };\n","import { useState, useEffect } from 'react';\n\nexport const tiposDevice = {\n mobile: 'Mobile',\n desktop: 'Desktop',\n};\n\nexport function useWindowListener() {\n const isClient = typeof window === 'object';\n const [widthWindow, setWidthWindow] = useState(getSize());\n\n function getSize() {\n return {\n width: isClient ? window.innerWidth : 0,\n height: isClient ? window.innerHeight : 0,\n device:\n isClient && window.innerWidth && window.innerWidth < 990\n ? tiposDevice.mobile\n : tiposDevice.desktop,\n };\n }\n\n useEffect(() => {\n if (!isClient) {\n return;\n }\n\n const handleResize = () => {\n const size = getSize();\n setWidthWindow(size);\n };\n\n window.addEventListener('resize', handleResize);\n\n return () => window.removeEventListener('resize', handleResize);\n }, [getSize, isClient, widthWindow]);\n\n return widthWindow;\n}\n","export const TAMANHO_HOME_ITEM_ENUM = {\n T_1x3: 1,\n T_2x6: 2,\n T_2x12: 3,\n T_2x9: 4,\n T_3x6: 5,\n T_3x9: 6,\n T_3x12: 7,\n T_4x12: 8,\n T_5x12: 9,\n T_6x12: 10,\n T_05x12: 11,\n T_1x12: 12,\n};\n","import { TAMANHO_HOME_ITEM_ENUM } from '~/modules/Helper/tamanhoHomeItemEnum';\n\nexport const calcularAlturaLargura = tamanho => {\n switch (tamanho) {\n case TAMANHO_HOME_ITEM_ENUM.T_3x6:\n case TAMANHO_HOME_ITEM_ENUM.T_3x9:\n case TAMANHO_HOME_ITEM_ENUM.T_3x12:\n return '225px';\n case TAMANHO_HOME_ITEM_ENUM.T_4x12:\n return '300px';\n case TAMANHO_HOME_ITEM_ENUM.T_5x12:\n return '375px';\n case TAMANHO_HOME_ITEM_ENUM.T_6x12:\n return '450px';\n default:\n return '150px';\n }\n};\n\nexport const calcularAlturaLarguraIconeMedio = tamanho => {\n switch (tamanho) {\n case TAMANHO_HOME_ITEM_ENUM.T_1x3:\n return '70px';\n case TAMANHO_HOME_ITEM_ENUM.T_3x6:\n case TAMANHO_HOME_ITEM_ENUM.T_3x9:\n case TAMANHO_HOME_ITEM_ENUM.T_3x12:\n return '130px';\n case TAMANHO_HOME_ITEM_ENUM.T_4x12:\n return '180px';\n case TAMANHO_HOME_ITEM_ENUM.T_5x12:\n return '200px';\n case TAMANHO_HOME_ITEM_ENUM.T_6x12:\n return '210px';\n default:\n return '100px';\n }\n};\n","import { TAMANHO_HOME_ITEM_ENUM } from '~/modules/Helper/tamanhoHomeItemEnum';\n\nexport const tamanhoFonteDescricaoGrafico = tamanho => {\n switch (tamanho) {\n case TAMANHO_HOME_ITEM_ENUM.T_3x6:\n case TAMANHO_HOME_ITEM_ENUM.T_3x9:\n case TAMANHO_HOME_ITEM_ENUM.T_3x12:\n return '1.35rem';\n case TAMANHO_HOME_ITEM_ENUM.T_4x12:\n return '1.7rem';\n case TAMANHO_HOME_ITEM_ENUM.T_5x12:\n return '2.05rem';\n case TAMANHO_HOME_ITEM_ENUM.T_6x12:\n return '2.40rem';\n default:\n return '1rem';\n }\n};\n\nexport const tamanhoFonteDescricaoDestaqueMedio = tamanho => {\n switch (tamanho) {\n case TAMANHO_HOME_ITEM_ENUM.T_3x6:\n case TAMANHO_HOME_ITEM_ENUM.T_3x9:\n case TAMANHO_HOME_ITEM_ENUM.T_3x12:\n return '24px';\n case TAMANHO_HOME_ITEM_ENUM.T_4x12:\n return '34px';\n case TAMANHO_HOME_ITEM_ENUM.T_5x12:\n return '44px';\n case TAMANHO_HOME_ITEM_ENUM.T_6x12:\n return '54px';\n default:\n return '22px';\n }\n};\n\nexport const tamanhoFonteDestaqueMedio = tamanho => {\n switch (tamanho) {\n case TAMANHO_HOME_ITEM_ENUM.T_3x6:\n case TAMANHO_HOME_ITEM_ENUM.T_3x9:\n case TAMANHO_HOME_ITEM_ENUM.T_3x12:\n return '2.30rem';\n case TAMANHO_HOME_ITEM_ENUM.T_4x12:\n return '3.5rem';\n case TAMANHO_HOME_ITEM_ENUM.T_5x12:\n return '4.7rem';\n case TAMANHO_HOME_ITEM_ENUM.T_6x12:\n return '5.9rem';\n default:\n return '2.15rem';\n }\n};\n\nexport const tamanhoFonteIconeMedio = tamanho => {\n switch (tamanho) {\n case TAMANHO_HOME_ITEM_ENUM.T_3x6:\n case TAMANHO_HOME_ITEM_ENUM.T_3x9:\n case TAMANHO_HOME_ITEM_ENUM.T_3x12:\n return '9rem';\n case TAMANHO_HOME_ITEM_ENUM.T_4x12:\n return '12rem';\n case TAMANHO_HOME_ITEM_ENUM.T_5x12:\n return '15rem';\n case TAMANHO_HOME_ITEM_ENUM.T_6x12:\n return '18rem';\n default:\n return '7rem';\n }\n};\n","import { css } from 'styled-components';\n\nconst sizes = {\n Mobile: 700,\n Desktop: 2600,\n};\nexport default Object.keys(sizes).reduce((acc, label) => {\n acc[label] = (...args) => css`\n @media (max-width: ${sizes[label]}px) {\n ${css(...args)};\n }\n `;\n return acc;\n}, {});\n","import styled from 'styled-components';\nimport Button from '~/components/Button/Button.component';\nimport Card from '~/components/Card/Card.component';\nimport Col from '~/components/Col/Col.component';\nimport {\n calcularAlturaLargura,\n calcularAlturaLarguraIconeMedio,\n} from '~/modules/Helper/calcularAlturaLargura';\nimport {\n tamanhoFonteDescricaoGrafico,\n tamanhoFonteDescricaoDestaqueMedio,\n tamanhoFonteIconeMedio,\n tamanhoFonteDestaqueMedio,\n} from '~/modules/Helper/calcularTamanhoFonte';\nimport media from '../../modules/Dashboard/components/mediaStyle';\n\nexport const FilterButton = styled(Button)`\n width: 35px !important;\n height: 30px !important;\n cursor: pointer;\n background-color: #efefef !important;\n display: block;\n float: right;\n opacity: 0.5;\n`;\n\nexport const CardWrapper = styled(Card)`\n height: 100% !important;\n\n .ant-card-body {\n padding: 0 10px;\n height: calc(100% - 50px) !important;\n background-color: transparent !important;\n align-content: center;\n }\n\n .ant-card-body > div:nth-child(2),\n .ant-card-body > div:nth-child(2) > div,\n .ant-card-body > div:nth-child(2) > div > div,\n canvas {\n height: 100% !important;\n width: 100% !important;\n }\n\n .ant-card-extra {\n display: flex;\n }\n\n .ant-select {\n margin-right: 15px;\n }\n\n &:hover ${FilterButton} {\n opacity: 1;\n transition: 300ms;\n }\n`;\n\nexport const TituloSpan = styled.span`\n margin-bottom: 20px;\n font-size: 25px;\n`;\n\nexport const Visualizar = styled.div`\n margin-top: 5px;\n cursor: pointer;\n font-size: 18px;\n`;\n\nexport const DescricaoLinkExternoDiv = styled.div`\n margin: 15px;\n font-size: 1.8rem;\n`;\n\nexport const DescricaoLinkExternoDivMedio = styled.div`\n font-size: 1.8rem;\n margin-top: 16%;\n`;\n\nexport const IconeDiv = styled.div`\n text-align: center;\n font-size: 55px;\n margin-right: 20px;\n\n ${media.Mobile`\n float: 'left'\n `};\n`;\n\nexport const StatisticSpan = styled.div`\n ${media.Desktop`\n position: relative;\n top: -5px;\n `}\n\n ${media.Mobile`\n position: relative;\n top: -5px;\n `}\n`;\n\nexport const StyledCol = styled(Col)`\n background-color: transparent !important;\n`;\n\nexport const StatisticSpanMedio = styled.div`\n background-color: transparent !important;\n\n ${media.Desktop`\n position: relative;\n top: 15px;\n padding-left: 15px;\n `} ${media.Mobile`\n position: relative;\n top: 0px;\n `};\n`;\n\nexport const ValorDescricaoSpan = styled.span`\n font-size: 15px;\n font-weight: 500;\n`;\n\nexport const ValorDestaqueDiv = styled.div`\n font-size: 25px;\n`;\n\nexport const ValorSecundarioSpan = styled.span`\n font-size: 15px;\n\n span {\n font-weight: 700;\n }\n`;\n\nexport const Grafico = styled.span`\n display: table;\n margin: auto;\n`;\n\nexport const IconeMedioDiv = styled.div`\n ${media.Desktop`\n font-size: ${({ tamanho }) => tamanhoFonteIconeMedio(tamanho)};\n margin-top: 15px;\n `}\n\n ${media.Mobile`\n text-align: center;\n font-size: 65px;\n `}\n`;\n\nexport const IconeMedioImg = styled.img`\n ${media.Desktop`\n height: ${({ tamanho }) => calcularAlturaLarguraIconeMedio(tamanho)};\n width: ${({ tamanho }) => calcularAlturaLarguraIconeMedio(tamanho)};\n `}\n\n ${media.Mobile`\n height: 60px;\n width: 60px;\n `}\n`;\n\nexport const ValorDescricaoDestaqueMedioDiv = styled.div`\n ${media.Desktop`\n margin-top: 15px;\n font-size: ${({ tamanho }) => tamanhoFonteDescricaoDestaqueMedio(tamanho)};\n color: ${({ corFonte }) => `${corFonte}`};\n `}\n\n ${media.Mobile`\n font-size: 15px;\n font-weight: 500;\n `}\n`;\n\nexport const ValorDestaqueMedioDiv = styled.span`\n ${media.Desktop`\n font-size: ${({ tamanho }) => tamanhoFonteDestaqueMedio(tamanho)};\n color: ${({ corFonte }) => `${corFonte}`};\n font-weight: 500;\n `}\n\n ${media.Mobile`\n div{\n font-size: 25px;\n }\n `}\n`;\n\nexport const ValorSecundarioMedioSpan = styled.span`\n span {\n font-weight: 700;\n }\n\n ${media.Desktop`\n font-size: ${({ tamanho }) => tamanhoFonteDescricaoDestaqueMedio(tamanho)};\n `}\n\n ${media.Mobile`\n font-size: 15px;\n `}\n`;\n\nexport const GraficoMedio = styled.div`\n div.g2plot-htmlStatistic,\n div.g2plot-htmlStatistic > div.ring-guide-html,\n div.g2-html-annotation {\n background-color: transparent !important;\n }\n\n font-size: 25px;\n height: ${({ tamanho }) => calcularAlturaLargura(tamanho)};\n width: ${({ tamanho }) => calcularAlturaLargura(tamanho)};\n\n div.g2plot-htmlStatistic > div.ring-guide-html > span.ring-guide-name {\n position: relative;\n top: 5px;\n }\n\n div.g2plot-htmlStatistic > div.ring-guide-html > span.ring-guide-value {\n font-size: 1.3rem !important;\n }\n\n ${media.Mobile`\n display: table;\n margin: auto;\n width: 125px;\n height: 125px;\n\n div.g2plot-htmlStatistic > div.ring-guide-html > span.ring-guide-name{\n position: relative;\n top: 5px\n }\n\n div.g2plot-htmlStatistic > div.ring-guide-html > span.ring-guide-value{\n font-size: 1.3rem !important;\n }\n `}\n`;\n\nexport const DescricaoGrafico = styled.p`\n font-size: ${({ tamanho }) => tamanhoFonteDescricaoGrafico(tamanho)};\n font-weight: 700;\n margin: 0;\n padding: 0;\n`;\n\nexport const GraficoDonut = styled.div`\n padding: 0.625em 0;\n ${media.Mobile``}\n`;\n\nexport const GraficoPie = styled.div`\n padding: 0.625em 0;\n ${media.Mobile``}\n`;\n\nexport const GraficoLine = styled.div`\n ${media.Mobile``}\n`;\n\nexport const GraficoBar = styled.div`\n ${media.Mobile``}\n`;\n\nexport const GraficoColumn = styled.div`\n ${media.Mobile``}\n`;\n","import { Popover } from 'antd';\n\nexport default Popover;\n","import React, { useState } from 'react';\nimport { Form } from 'antd';\nimport { filtrarGrafico } from '~/modules/ESic/services/esic.service';\nimport Popover from '~/components/Popover/Popover.component';\nimport Button from '~/components/Button/Button.component';\nimport Icons from '~/components/Icons/Icons.component';\nimport { FilterButton } from './style';\n\nfunction Filter({ idGrafico, contentFilter, eSic, setESic }) {\n const [visible, setVisible] = useState(false);\n\n async function onFilter(Id, values) {\n const { Periodo } = values;\n const response = await filtrarGrafico({ Id, Periodo });\n const newLista = [...eSic.ListaGraficos];\n const item = {\n ...newLista[\n eSic.ListaGraficos.findIndex(obj => obj.Id === response.data.Id)\n ],\n Dados: response.data.Dados,\n DescricaoPeriodo: response.data.DescricaoPeriodo,\n };\n newLista[\n eSic.ListaGraficos.findIndex(obj => obj.Id === response.data.Id)\n ] = item;\n setESic({ ...eSic, ListaGraficos: newLista });\n }\n\n const content = (\n <>\n \n >\n );\n\n const handleVisibleChange = visibleEvent => setVisible(visibleEvent);\n\n return (\n <>\n \n \n \n \n \n >\n );\n}\n\nexport default Filter;\n","import api from '~/services/api';\nimport history from '~/services/history';\n\nfunction getESicService() {\n return api.get('esic');\n}\n\nfunction filtrarGrafico(data) {\n return api.post('esic/filtrar', data);\n}\n\nfunction redirectNotFound() {\n history.push('/notfound');\n}\n\nfunction getVisoesData(params) {\n return api.post('integracaoesic', params);\n}\n\nexport { getESicService, redirectNotFound, getVisoesData, filtrarGrafico };\n","import React, { useState } from 'react';\n\nconst HomeGraficoContext = React.createContext({});\n\nfunction ListaHomeGraficoContext({ children }) {\n const [item, setItem] = useState([]);\n const [home, setHome] = useState(null);\n const [exercicio, setExercicio] = useState({});\n const anoAtual = new Date().getFullYear();\n\n return (\n \n {children}\n \n );\n}\n\nexport { ListaHomeGraficoContext, HomeGraficoContext };\n","import React, { useContext } from 'react';\nimport { Select, Tooltip } from '~/components';\nimport { HomeGraficoContext } from '~/modules/Dashboard/context/listaHomeGraficoContext';\nimport { getHomeItemService } from '~/modules/Dashboard/services/dashboard.service';\n\nfunction ExercicioSelect({ id }) {\n const { anoAtual, home, setHome, exercicio, setExercicio } = useContext(\n HomeGraficoContext\n );\n const exercicios = Array.from({ length: 5 }, (_, i) => anoAtual - i);\n\n async function onChange(ano) {\n if (ano) {\n setExercicio(prevState => ({ ...prevState, [id]: ano }));\n const response = await getHomeItemService(id, ano);\n if (response && response.data) {\n const updatedHome = home?.ListaHomeItem.map(item => {\n if (item.Id == response.data.Id) item = response.data;\n\n return item;\n });\n setHome({ ListaHomeItem: updatedHome });\n }\n }\n }\n\n return (\n \n \n \n );\n}\n\nexport default ExercicioSelect;\n","import api from '~/services/api';\n\nfunction getHomeService(exercicio) {\n const response = api.get(`/home/${exercicio}`);\n return response;\n}\n\nfunction getHomeItemService(id, exercicio) {\n const response = api.get(`/home/${id}/${exercicio}`);\n return response;\n}\n\nexport { getHomeService, getHomeItemService };\n","import React, { useEffect, useState, useContext } from 'react';\nimport { Pie } from '@antv/g2plot';\nimport { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { Row, Col, Icons, Typography } from '~/components';\nimport { GraficoContext } from '~/modules/ESic/context/listaGraficoContext';\nimport { useWindowListener, tiposDevice } from './windowListener.component';\nimport { GraficoDonut, Visualizar, CardWrapper } from './style';\nimport Filter from './Filter.component';\nimport ExercicioSelect from './ExercicioSelect.component';\n\nfunction DonutGraphic({\n id,\n titulo,\n data,\n legenda,\n tootltipTitle,\n ValorLink,\n hasFilter,\n filterDescription,\n contentFilter,\n showEyeButton = false,\n corFonte,\n showExercicioSelect,\n}) {\n const { listaGrafico, setListaGrafico, eSic, setESic } = useContext(\n GraficoContext\n );\n const [donut, setDonut] = useState(null);\n const windowListener = useWindowListener();\n const {\n graficHighContrastStyle,\n highContrast,\n graficDefaultStyle,\n zoomFonte,\n } = useSelector(state => state.configuration);\n const getConfigStyle = highContrast\n ? graficHighContrastStyle\n : graficDefaultStyle;\n const legend = {\n visible: true,\n position: 'left',\n maxItemWidth: 160,\n title: {\n visible: true,\n text: legenda,\n style: getConfigStyle,\n },\n itemName: {\n formatter: v => {\n return v.trim().length >= 27 ? `${v.substring(0, 27)}...` : v.trim();\n },\n style: getConfigStyle,\n },\n };\n const [config] = useState({\n title: false,\n legend,\n autoFit: true,\n radius: 0.8,\n innerRadius: 0.65,\n label: {\n autoHide: true,\n type: 'spider',\n formatter: ({ percent }) => `${(percent * 100).toFixed(2)}%`,\n style: getConfigStyle,\n },\n statistic: {\n title: false,\n content: false,\n },\n colorField: 'EixoX',\n angleField: 'EixoY',\n color: [\n '#30BBAA',\n '#F39366',\n '#876AB0',\n '#FDF25B',\n '#77C966',\n '#EE7B80',\n '#7F8BB2',\n '#F9D04F',\n '#D85B81',\n '#D3E045',\n '#2DA0D7',\n '#FBB141',\n ],\n tooltip: {\n showTitle: true,\n title: tootltipTitle,\n formatter: ({ EixoX, EixoY }) => {\n return {\n name: EixoX,\n value: new Intl.NumberFormat('pt-BR').format(EixoY),\n };\n },\n },\n });\n\n useEffect(() => {\n if (donut) return;\n\n const element = document.getElementById(id);\n if (element) {\n const donutRender = new Pie(element, { data, ...config });\n setDonut(donutRender);\n donutRender.render();\n }\n }, [config, data, donut, id]);\n\n useEffect(() => {\n if (windowListener && windowListener.device && donut) {\n const visible = windowListener.device === tiposDevice.desktop;\n donut.update({\n legend: visible ? legend : false,\n label: {\n ...config.label,\n style: getConfigStyle,\n },\n });\n }\n\n if (donut) donut.render();\n }, [\n donut,\n windowListener,\n highContrast,\n config.text,\n config.label,\n getConfigStyle,\n zoomFonte,\n ]);\n\n useEffect(() => {\n if (donut) {\n donut.update({\n data,\n });\n donut.render();\n }\n }, [data, donut]);\n\n return (\n <>\n \n {titulo}\n \n }\n extra={\n <>\n {showExercicioSelect && }\n {showEyeButton && (\n \n \n \n \n \n )}\n >\n }\n size=\"small\"\n style={{ height: '100%' }}\n >\n \n {hasFilter && (\n \n \n \n )}\n {filterDescription && (\n \n \n {filterDescription}\n \n \n )}\n
\n \n \n
\n \n >\n );\n}\n\nexport default DonutGraphic;\n","import React, { useEffect, useState, useContext } from 'react';\nimport { Pie } from '@antv/g2plot';\nimport { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { Row, Col, Icons, Typography } from '~/components';\nimport { GraficoContext } from '~/modules/ESic/context/listaGraficoContext';\nimport { GraficoPie, Visualizar, CardWrapper } from './style';\nimport { useWindowListener, tiposDevice } from './windowListener.component';\nimport Filter from './Filter.component';\nimport ExercicioSelect from './ExercicioSelect.component';\n\nfunction PieGraphic({\n id,\n titulo,\n data,\n legenda,\n tootltipTitle,\n ValorLink,\n hasFilter,\n filterDescription,\n contentFilter,\n showEyeButton = false,\n corFonte,\n colorField = 'EixoX',\n angleField = 'EixoY',\n legendPosition = 'left',\n tooltipFormatter,\n legendMaxRow,\n legendItemMarginBottom,\n legendItemSpacing,\n showExercicioSelect,\n}) {\n const { eSic, setESic } = useContext(GraficoContext);\n const [pie, setPie] = useState(null);\n const windowListener = useWindowListener();\n const {\n graficHighContrastStyle,\n highContrast,\n graficDefaultStyle,\n zoomFonte,\n } = useSelector(state => state.configuration);\n const getConfigStyle = highContrast\n ? graficHighContrastStyle\n : graficDefaultStyle;\n const legend = {\n visible: true,\n maxRow: legendMaxRow,\n itemMarginBottom: legendItemMarginBottom,\n itemSpacing: legendItemSpacing,\n position: legendPosition,\n maxItemWidth: 160,\n title: {\n visible: true,\n text: legenda,\n style: getConfigStyle,\n },\n itemName: {\n formatter: v => {\n return v.trim().length >= 27 ? `${v.substring(0, 27)}...` : v.trim();\n },\n style: getConfigStyle,\n },\n };\n const [config] = useState({\n title: false,\n legend,\n autoFit: true,\n radius: 0.8,\n label: {\n autoHide: true,\n type: 'spider',\n formatter: ({ percent }) => `${(percent * 100).toFixed(2)}%`,\n style: getConfigStyle,\n },\n statistic: {\n visible: false,\n },\n colorField,\n angleField,\n color: [\n '#30BBAA',\n '#F39366',\n '#876AB0',\n '#FDF25B',\n '#77C966',\n '#EE7B80',\n '#7F8BB2',\n '#F9D04F',\n '#D85B81',\n '#D3E045',\n '#2DA0D7',\n '#FBB141',\n ],\n tooltip: {\n showTitle: true,\n title: tootltipTitle,\n formatter:\n tooltipFormatter ||\n (({ EixoX, EixoY }) => {\n return {\n name: EixoX,\n value: new Intl.NumberFormat('pt-BR').format(EixoY),\n };\n }),\n },\n });\n\n useEffect(() => {\n if (pie) return;\n\n const element = document.getElementById(id);\n if (element) {\n const pieRender = new Pie(element, { data, ...config });\n setPie(pieRender);\n pieRender.render();\n }\n }, [config, data, id, pie]);\n\n useEffect(() => {\n if (pie) {\n pie.update({\n data,\n });\n pie.render();\n }\n }, [data, pie]);\n\n useEffect(() => {\n if (windowListener && windowListener.device && pie) {\n const visible = windowListener.device === tiposDevice.desktop;\n pie.update({\n legend: visible ? legend : false,\n label: {\n ...config.label,\n style: getConfigStyle,\n },\n });\n }\n\n if (pie) pie.render();\n }, [\n pie,\n windowListener,\n highContrast,\n config.title,\n config.text,\n config.label,\n getConfigStyle,\n zoomFonte,\n ]);\n\n return (\n <>\n \n {titulo}\n \n }\n extra={\n <>\n {showExercicioSelect && }\n {showEyeButton && (\n \n \n \n \n \n )}\n >\n }\n size=\"small\"\n >\n \n {hasFilter && (\n \n \n \n )}\n {filterDescription && (\n \n \n {filterDescription}\n \n \n )}\n
\n \n \n
\n \n >\n );\n}\n\nexport default PieGraphic;\n","import React, { useEffect, useState, useContext } from 'react';\nimport { Bar } from '@antv/g2plot';\nimport { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { Row, Col, Icons, Typography } from '~/components';\nimport { GraficoContext } from '~/modules/ESic/context/listaGraficoContext';\nimport { GraficoBar, Visualizar, CardWrapper } from './style';\nimport Filter from './Filter.component';\nimport ExercicioSelect from './ExercicioSelect.component';\n\nfunction BarGraphic({\n id,\n titulo,\n data,\n cor,\n legendaEixoX,\n legendaEixoY,\n ValorLink,\n hasFilter,\n filterDescription,\n contentFilter,\n showEyeButton = false,\n corFonte,\n showExercicioSelect,\n}) {\n const { eSic, setESic } = useContext(GraficoContext);\n const [bar, setBar] = useState(null);\n const {\n graficHighContrastStyle,\n highContrast,\n graficDefaultStyle,\n zoomFonte,\n } = useSelector(state => state.configuration);\n const getConfigStyle = highContrast\n ? graficHighContrastStyle\n : graficDefaultStyle;\n\n const NumberFormatter = function NumberFormatter(value) {\n let newNum = value;\n const suffix = ['', ' Mil', ' Mi', ' Bi', ' Tri'];\n let suffixNum = 0;\n if (newNum > 10000) {\n while (newNum >= 1000) {\n newNum /= 1000;\n suffixNum += 1;\n }\n return Math.trunc(newNum) + suffix[suffixNum];\n }\n return newNum;\n };\n\n const [config] = useState({\n padding: [15, 20, 55, 70],\n title: false,\n autoFit: true,\n data,\n xField: 'EixoY',\n yField: 'EixoX',\n color: cor,\n xAxis: {\n title: {\n visible: legendaEixoX || false,\n text: legendaEixoX || '',\n style: getConfigStyle,\n },\n label: {\n formatter: v => {\n return NumberFormatter(v);\n },\n style: getConfigStyle,\n },\n },\n yAxis: {\n title: {\n visible: false,\n text: '',\n style: getConfigStyle,\n },\n label: {\n formatter: v => {\n return v.length >= 7 ? `${v.substring(0, 7)}...` : v;\n },\n style: getConfigStyle,\n },\n },\n label: {\n visible: true,\n formatter: ({ EixoY }) => {\n return NumberFormatter(EixoY);\n },\n position: 'right',\n style: getConfigStyle,\n },\n tooltip: {\n showTitle: true,\n title: legendaEixoY,\n formatter: ({ EixoX, EixoY }) => {\n return {\n name: EixoX,\n value: new Intl.NumberFormat('pt-BR').format(EixoY),\n };\n },\n },\n });\n\n useEffect(() => {\n if (bar) return;\n\n const element = document.getElementById(id);\n if (element) {\n const barRender = new Bar(element, { data, ...config });\n setBar(barRender);\n barRender.render();\n }\n }, [bar, config, data, id]);\n\n useEffect(() => {\n if (bar) {\n bar.update({\n label: {\n ...config.label,\n style: getConfigStyle,\n },\n xAxis: {\n ...config.xAxis,\n title: {\n ...config.xAxis.title,\n style: getConfigStyle,\n },\n label: {\n ...config.xAxis.label,\n style: getConfigStyle,\n },\n },\n yAxis: {\n ...config.yAxis,\n title: {\n ...config.yAxis.title,\n style: getConfigStyle,\n },\n label: {\n ...config.yAxis.label,\n style: getConfigStyle,\n },\n },\n });\n }\n\n if (bar) bar.render();\n }, [\n bar,\n config.label,\n config.xAxis,\n config.yAxis,\n getConfigStyle,\n highContrast,\n zoomFonte,\n ]);\n\n useEffect(() => {\n if (bar) {\n bar.update({\n data,\n });\n bar.render();\n }\n }, [data, bar]);\n\n return (\n <>\n \n {titulo}\n \n }\n extra={\n <>\n {showExercicioSelect && }\n {showEyeButton && (\n \n \n \n \n \n )}\n >\n }\n size=\"small\"\n >\n \n {hasFilter && (\n \n \n \n )}\n {filterDescription && (\n \n \n {filterDescription}\n \n \n )}\n
\n \n \n
\n \n >\n );\n}\n\nexport default BarGraphic;\n","import React, { useEffect, useState, useContext } from 'react';\nimport { Column } from '@antv/g2plot';\nimport { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { Row, Col, Icons, Typography } from '~/components';\nimport { GraficoContext } from '~/modules/ESic/context/listaGraficoContext';\nimport { GraficoColumn, Visualizar, CardWrapper } from './style';\nimport Filter from './Filter.component';\nimport ExercicioSelect from './ExercicioSelect.component';\n\nconst NumberFormatter = function NumberFormatter(value) {\n let newNum = value;\n const suffix = ['', ' Mil', ' Mi', ' Bi', ' Tri'];\n let suffixNum = 0;\n if (newNum > 10000) {\n while (newNum >= 1000) {\n newNum /= 1000;\n suffixNum += 1;\n }\n return newNum + suffix[suffixNum];\n }\n return newNum;\n};\n\nfunction ColumnGraphic({\n id,\n titulo,\n cor,\n data,\n legendaEixoX,\n legendaEixoY,\n ValorLink,\n hasFilter,\n filterDescription,\n contentFilter,\n showEyeButton = false,\n corFonte,\n showExercicioSelect,\n // onFilter,\n}) {\n const { eSic, setESic } = useContext(GraficoContext);\n const [column, setColumn] = useState(null);\n const {\n graficHighContrastStyle,\n highContrast,\n graficDefaultStyle,\n zoomFonte,\n } = useSelector(state => state.configuration);\n const getConfigStyle = highContrast\n ? graficHighContrastStyle\n : graficDefaultStyle;\n\n const [config] = useState({\n padding: [20, 20, 100, 70],\n title: {\n visible: false,\n text: legendaEixoX,\n alignTo: 'middle',\n style: getConfigStyle,\n },\n showTitle: false,\n autoFit: true,\n color: cor,\n data,\n xField: 'EixoX',\n yField: 'EixoY',\n xAxis: {\n visible: true,\n title: {\n visible: legendaEixoX || false,\n text: legendaEixoX || '',\n style: getConfigStyle,\n },\n label: {\n formatter: v => {\n return v.trim().length >= 7 ? `${v.substring(0, 7)}...` : v.trim();\n },\n rotate: -20,\n offsetX: -30,\n offsetY: -6,\n style: getConfigStyle,\n },\n },\n yAxis: {\n visible: true,\n title: {\n visible: legendaEixoY || false,\n text: legendaEixoY || '',\n offset: 60,\n style: getConfigStyle,\n },\n label: {\n formatter: v => {\n return NumberFormatter(v);\n },\n style: getConfigStyle,\n },\n },\n tooltip: {\n showTitle: true,\n title: legendaEixoY,\n formatter: ({ EixoX, EixoY }) => {\n return {\n name: EixoX,\n value: new Intl.NumberFormat('pt-BR').format(EixoY),\n };\n },\n },\n });\n\n useEffect(() => {\n if (column) return;\n const element = document.getElementById(id);\n\n if (element) {\n const columnRender = new Column(element, { data, ...config });\n setColumn(columnRender);\n columnRender.render();\n }\n }, [column, config, data, id]);\n\n useEffect(() => {\n if (column) {\n column.update({\n title: {\n ...config.title,\n style: getConfigStyle,\n },\n xAxis: {\n ...config.xAxis,\n\n title: {\n ...config.xAxis.title,\n style: getConfigStyle,\n },\n label: {\n ...config.xAxis.label,\n style: getConfigStyle,\n },\n },\n yAxis: {\n ...config.yAxis,\n title: {\n ...config.yAxis.title,\n style: getConfigStyle,\n },\n label: {\n ...config.yAxis.label,\n style: getConfigStyle,\n },\n },\n });\n\n column.render();\n }\n }, [\n highContrast,\n config.text,\n config.label,\n getConfigStyle,\n column,\n config.title,\n config.xAxis,\n config.yAxis,\n zoomFonte,\n ]);\n\n useEffect(() => {\n if (column) {\n column.update({\n data,\n });\n column.render();\n }\n }, [data, column]);\n\n return (\n <>\n \n {titulo}\n \n }\n extra={\n <>\n {showExercicioSelect && }\n {showEyeButton && (\n \n \n \n \n \n )}\n >\n }\n size=\"small\"\n >\n \n {hasFilter && (\n \n \n \n )}\n {filterDescription && (\n \n \n {filterDescription}\n \n \n )}\n
\n \n \n
\n \n >\n );\n}\n\nexport default ColumnGraphic;\n","import React, { useEffect } from 'react';\nimport { Link } from 'react-router-dom';\nimport { Empty } from 'antd';\nimport { useSelector } from 'react-redux';\nimport { Icons } from '~/components';\nimport { Visualizar, CardWrapper } from './style';\nimport ExercicioSelect from './ExercicioSelect.component';\n\nfunction EmptyCardGrafico({\n id,\n titulo,\n valorLink,\n tamanho,\n corFonte,\n showEyeButton = false,\n showExercicioSelect,\n}) {\n const { zoomFonte } = useSelector(state => state.configuration);\n\n useEffect(() => {}, [zoomFonte]);\n return (\n \n {titulo}\n \n }\n extra={\n <>\n {showExercicioSelect && }\n {showEyeButton && (\n \n \n \n \n \n )}\n >\n }\n size=\"small\"\n style={{\n height: '100%',\n fontSize: '25px',\n }}\n >\n 1 ? 'auto' : '3rem',\n marginTop: tamanho > 1 ? '4rem' : 0,\n }}\n />\n \n );\n}\n\nexport default EmptyCardGrafico;\n","/* eslint-disable jsx-a11y/interactive-supports-focus */\nimport React, { useState, useEffect } from 'react';\nimport { Tooltip } from 'antd';\nimport { useSelector } from 'react-redux';\nimport { Pie } from '@antv/g2plot';\nimport { useHistory } from 'react-router-dom';\nimport { Row, Col } from '~/components';\nimport { iconEnum } from '~/modules/Helper/iconEnum';\nimport {\n ValorDestaqueDiv,\n IconeDiv,\n StatisticSpan,\n ValorDescricaoSpan,\n IconeMedioDiv,\n IconeMedioImg,\n ValorDescricaoDestaqueMedioDiv,\n ValorDestaqueMedioDiv,\n ValorSecundarioMedioSpan,\n GraficoMedio,\n DescricaoGrafico,\n CardWrapper,\n DescricaoLinkExternoDiv,\n DescricaoLinkExternoDivMedio,\n StatisticSpanMedio,\n StyledCol,\n} from '~/components/Grafico/style';\n\nimport {\n useWindowListener,\n tiposDevice,\n} from '~/components/Grafico/windowListener.component';\nimport ExercicioSelect from '~/components/Grafico/ExercicioSelect.component';\nimport { TIPO_ACESSO } from '../../Helper/tipoAcesso';\n\nfunction StatisticCard({\n id,\n Tamanho,\n Titulo,\n IconePersonalizado,\n Icone,\n IconeCor,\n TipoAcesso,\n ValorDestaque,\n DescricaoValorDestaque,\n ExibirValorSecundario,\n ValorSecundario,\n DescricaoValorSecundario,\n ExibirGraficoPorcentagem,\n DescricaoLinkExterno,\n PorcentagemValorDestaque,\n PorcentagemValorSecundario,\n ValorLink,\n corFonte,\n showExercicioSelect,\n}) {\n const windowListener = useWindowListener();\n\n const donutData = [\n {\n type: DescricaoValorDestaque,\n value: parseFloat(PorcentagemValorDestaque),\n },\n {\n type: DescricaoValorSecundario,\n value: parseFloat(PorcentagemValorSecundario),\n },\n ];\n\n const [donut, setDonut] = useState(null);\n const { zoomFonte } = useSelector(state => state.configuration);\n const [config] = useState({\n title: false,\n description: false,\n label: {\n visible: false,\n },\n legend: {\n visible: false,\n flipPage: false,\n },\n autoFit: true,\n radius: 0.8,\n statistic: {\n visible: true,\n title: {\n content: 'Total',\n style: {\n fontSize: 15,\n },\n },\n content: {\n content: `${Math.round(parseFloat(PorcentagemValorDestaque))}%`,\n style: {\n fontSize: 18,\n },\n },\n triggerOn: null,\n triggerOff: null,\n },\n colorField: 'type',\n angleField: 'value',\n color: ['#5AD8A6', '#D9D9D9'],\n innerRadius: 1.2,\n });\n\n const history = useHistory();\n\n useEffect(() => {\n if (\n windowListener &&\n windowListener.device === tiposDevice.mobile &&\n donut\n ) {\n setDonut(null);\n } else if (\n windowListener &&\n windowListener.device === tiposDevice.desktop &&\n !donut\n ) {\n const element = document.getElementById(id);\n if (element) {\n const donutRender = new Pie(element, { data: donutData, ...config });\n setDonut(donutRender);\n donutRender.render();\n }\n }\n }, [config, donut, donutData, id, windowListener, zoomFonte]);\n\n function hrefFunction(link) {\n if (TipoAcesso === TIPO_ACESSO.INTERNO) return history.push(link);\n\n window.open(link, '_blank');\n }\n\n return (\n <>\n {Tamanho === 1 ? (\n \n \n {Titulo}\n \n }\n extra={showExercicioSelect && }\n hoverable\n size=\"small\"\n style={{\n fontSize: '25px',\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n maxHeight: '99.5%',\n cursor: 'default',\n }}\n >\n hrefFunction(ValorLink)}\n style={{ cursor: 'pointer' }}\n >\n \n \n \n {Icone &&\n iconEnum\n .find(x => x.name === Icone)\n ?.value({ color: IconeCor })}\n \n {!Icone && (\n \n )}\n \n \n {TipoAcesso === TIPO_ACESSO.INTERNO ? (\n \n \n \n \n {DescricaoValorDestaque}\n \n \n
\n \n \n {ValorDestaque}\n \n
\n \n ) : (\n \n {DescricaoLinkExterno}\n \n )}\n \n
\n
\n \n \n ) : (\n \n \n {Titulo}\n \n }\n extra={showExercicioSelect && }\n hoverable\n size=\"small\"\n style={{\n height: '100%',\n fontSize: '25px',\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n cursor: 'default',\n }}\n >\n hrefFunction(ValorLink)}\n style={{ cursor: 'pointer', height: '100%' }}\n >\n {windowListener &&\n windowListener.device === tiposDevice.mobile &&\n id ? (\n <>\n
\n \n \n {Icone &&\n iconEnum\n .find(x => x.name === Icone)\n ?.value({ color: IconeCor })}\n \n {!Icone && (\n \n )}\n \n \n {TipoAcesso === TIPO_ACESSO.INTERNO ? (\n \n \n \n \n {DescricaoValorDestaque}\n
\n \n {ValorDestaque}\n \n \n \n
\n {ExibirValorSecundario && (\n <>\n \n \n \n {`${DescricaoValorSecundario}: `}\n {`${ValorSecundario}`}\n \n \n
\n >\n )}\n \n ) : (\n \n {DescricaoLinkExterno}\n \n )}\n \n
\n >\n ) : (\n
\n \n \n {Icone &&\n iconEnum\n .find(x => x.name === Icone)\n ?.value({ color: IconeCor })}\n \n {!Icone && (\n \n )}\n \n \n {TipoAcesso === TIPO_ACESSO.INTERNO ? (\n \n \n \n \n {DescricaoValorDestaque}\n
\n \n {ValorDestaque}\n \n \n \n
\n {ExibirValorSecundario && (\n <>\n \n \n \n {`${DescricaoValorSecundario} `}\n {`${ValorSecundario}`}\n \n \n
\n >\n )}\n \n ) : (\n \n {DescricaoLinkExterno}\n \n )}\n \n \n {ExibirGraficoPorcentagem && (\n \n \n \n {`Percentual de ${DescricaoValorDestaque} sobre ${DescricaoValorSecundario}`}\n \n
\n )}\n \n
\n )}\n
\n \n \n )}\n >\n );\n}\n\nexport default StatisticCard;\n","import styled from 'styled-components';\nimport { Card, Icons, Typography } from '~/components';\n\nexport const CardNoConfigHome = styled(Card)`\n && {\n justify-content: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n margin: 10px;\n }\n .ant-card-body {\n display: flex;\n flex-direction: column;\n margin: 100px 0px;\n }\n`;\n\nexport const IconNoConfigHome = styled(Icons.SettingOutlined)`\n && {\n font-size: 25px;\n margin-bottom: 10px;\n color: rgb(201, 201, 201);\n }\n`;\n\nexport const TextNoConfigHome = styled(Typography.Text)`\n && {\n font-weight: 400;\n font-size: 14px;\n margin-bottom: 0;\n text-align: center;\n color: rgb(201, 201, 201);\n }\n`;\n","import React, { useState, useEffect, useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport { WidthProvider, Responsive } from 'react-grid-layout';\nimport InformacaoDashboard from '~/components/InformacaoDashboard/InformacaoDashboard.component';\nimport CardImagemDashboard from '~/components/CardImagemDashboard/cardImagemDashboard.component';\nimport YoutubePlayer from '~/components/YoutubePlayer/YoutubePlayer.component';\nimport DonutGraphic from '~/components/Grafico/DonutGraphic.component';\nimport PieGraphic from '~/components/Grafico/PieGraphic.component';\nimport BarGraphic from '~/components/Grafico/BarGraphic.component';\nimport ColumnGraphic from '~/components/Grafico/ColumnGraphic.component';\nimport EmptyCardGrafico from '~/components/Grafico/EmptyCardGraphic.component';\nimport { useMenus } from '~/contexts/menu.context';\nimport { getFullUrl } from '~/services/FileManager/file-manager.service';\nimport { getHomeService } from '../services/dashboard.service';\nimport StatisticCard from '../components/StatisticCard.component';\n\nimport {\n CardNoConfigHome,\n IconNoConfigHome,\n TextNoConfigHome,\n} from './dashboard.container.styled';\n\nimport {\n ListaHomeGraficoContext,\n HomeGraficoContext,\n} from '../context/listaHomeGraficoContext';\nimport { TIPO_ACESSO } from '../../Helper/tipoAcesso';\n\nfunction Dashboard() {\n const ResponsiveReactGridLayout = WidthProvider(Responsive);\n const { resetMenuSelecionado } = useMenus();\n\n const [menuIsCollapsed, setMenuIsCollapsed] = useState(false);\n\n useEffect(() => {\n function forceComponentReRender() {\n setTimeout(() => setMenuIsCollapsed(!menuIsCollapsed), 800);\n }\n\n function addButtonListeners(buttonNode) {\n buttonNode.addEventListener('click', forceComponentReRender);\n buttonNode.addEventListener('keydown', forceComponentReRender);\n }\n\n function removeButtonListeners(buttonNode) {\n buttonNode.removeEventListener('click', forceComponentReRender);\n buttonNode.removeEventListener('keydown', forceComponentReRender);\n }\n\n let collapseButton = document.getElementsByClassName('collapseButton');\n\n function updateButtonOnResize() {\n removeButtonListeners(collapseButton[0]);\n collapseButton = document.getElementsByClassName('collapseButton');\n addButtonListeners(collapseButton[0]);\n }\n\n addButtonListeners(collapseButton[0]);\n window.addEventListener('resize', updateButtonOnResize);\n\n return () => {\n removeButtonListeners(collapseButton[0]);\n window.removeEventListener('resize', updateButtonOnResize);\n };\n }, [menuIsCollapsed]);\n\n const [layouts, setLayouts] = useState();\n const { item, setItem, home, setHome, anoAtual } = useContext(\n HomeGraficoContext\n );\n const [noConfigError, setNoConfigError] = useState('');\n\n const gridContainer = {\n overflow: 'hidden',\n left: -10,\n };\n\n const gridBackground = {\n width: '100%',\n height: '100%',\n left: '0px',\n right: '0px',\n backgroundSize: '3% 3%',\n };\n\n const { corFonte } = useSelector(state => state.configuration);\n\n useEffect(() => {\n async function getHome() {\n const response = await getHomeService(anoAtual);\n if (response && response.data) setHome(response.data);\n }\n getHome();\n }, []);\n\n useEffect(() => {\n if (item) {\n const layoutDefault = item.map(el => ({\n i: el.id,\n ...el.position,\n static: true,\n }));\n\n const sm = [];\n let previousItemY = 0;\n\n item.forEach(el => {\n const newItem = {\n i: el.id,\n ...el.position,\n x: 0,\n y: previousItemY,\n static: true,\n };\n sm.push(newItem);\n previousItemY += el.position.h;\n });\n\n const newlayouts = {\n sm,\n md: layoutDefault,\n lg: layoutDefault,\n };\n setLayouts(newlayouts);\n }\n }, [item]);\n\n useEffect(() => {\n async function getListaGrafico() {\n const listaHomeItem = home?.ListaHomeItem.map(homeItem => {\n const titulo =\n homeItem.Titulo &&\n anoAtual &&\n !homeItem.ExibirExercicio &&\n homeItem.HomeItemBotao?.TipoAcesso !== TIPO_ACESSO.EXTERNO\n ? `${homeItem.Titulo} - Ano ${anoAtual}`\n : homeItem.Titulo || '';\n\n if (homeItem.HomeItemBotao) {\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n }\n if (homeItem.HomeItemTexto) {\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n }\n if (homeItem.HomeItemVideo) {\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n }\n if (homeItem.HomeItemCardImagem) {\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n }\n if (homeItem.HomeItemGrafico) {\n switch (homeItem.HomeItemGrafico.TipoGrafico) {\n case 1:\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n case 2:\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n case 3:\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n case 4:\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n default:\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n }\n } else {\n return {\n id: homeItem.Id,\n position: homeItem.Posicao,\n component: (\n \n ),\n };\n }\n });\n if (listaHomeItem) {\n if (!listaHomeItem.itemHome)\n setNoConfigError(\n \n \n \n Nenhuma Configuração Realizada na Home\n \n \n );\n setItem(\n listaHomeItem.filter(itemHome => {\n return itemHome;\n })\n );\n }\n }\n\n getListaGrafico();\n }, [home, setHome]);\n\n useEffect(() => {\n resetMenuSelecionado();\n }, []);\n\n return (\n \n
\n {item?.length ? (\n
\n {item?.length &&\n item.map(el => {el.component}
)}\n \n ) : (\n <>{noConfigError}>\n )}\n
\n );\n}\n\nfunction Container() {\n return (\n \n \n \n );\n}\n\nexport default Container;\n","import styled from 'styled-components';\n\nexport const Content = styled.div`\n background: transparent;\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n`;\n","import React from 'react';\nimport { Accordion } from '~/components';\nimport { Content } from './style';\n\nconst { Panel } = Accordion;\n\nfunction FaqItem({ pergunta, resposta }) {\n return (\n <>\n \n \n \n \n \n >\n );\n}\n\nexport default FaqItem;\n","import React, { useState, useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { getFaqService } from '../services/faq.service';\nimport { Informacao, PageTitle, Row, ButtonGoBack } from '~/components';\nimport FaqItem from '../components/FaqItem/faqitem.component';\n\nfunction Faq() {\n const [informacao, setInformacao] = useState({ __html: null });\n const [listaFaqItem, setListaFaqItem] = useState([]);\n const history = useHistory();\n\n useEffect(() => {\n async function getFaq() {\n const response = await getFaqService();\n if (response && response.data) {\n setListaFaqItem(response.data.FaqItem);\n setInformacao(response.data.Informacao);\n }\n }\n\n getFaq();\n }, []);\n\n function goBack() {\n history.push('/');\n }\n\n return (\n <>\n \n {informacao?.Texto && (\n \n )}\n\n {Boolean(listaFaqItem?.length) &&\n listaFaqItem.map(el => (\n \n ))}\n\n \n \n
\n >\n );\n}\n\nexport default Faq;\n","import api from '~/services/api';\n\nfunction getFaqService() {\n return api.get('faq');\n}\n\nexport { getFaqService };\n","import styled from 'styled-components';\n\nexport const Content = styled.div`\n background: white;\n font-size: ${({ theme }) => `${16 + 2 * theme.zoomFonte}px`};\n padding: 14px;\n margin-top: 10px;\n`;\n\nexport const ContainerExportar = styled.div`\n display: inline-flex;\n width: 120px;\n margin-bottom: 10px;\n margin-left: 5px;\n position: relative;\n top: -1px;\n`;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n flex-wrap: wrap;\n`;\n\nexport const NumberRegistersArea = styled.div`\n display: flex;\n flex-wrap: wrap;\n\n .ant-pagination {\n display: flex;\n margin-top: 5px;\n margin-bottom: 5px;\n }\n\n .ant-select {\n margin-left: 15px;\n margin-top: 5px;\n margin-bottom: 5px;\n }\n\n .ant-pagination-item-active a,\n .ant-pagination-item,\n .ant-pagination-item a,\n .ant-select,\n .ant-pagination-prev svg,\n .ant-pagination-next svg,\n .ant-select-arrow svg,\n .ant-pagination-item:focus a {\n color: ${({ corTituloGrid }) => `${corTituloGrid}`};\n }\n\n .ant-pagination-item-active,\n .ant-pagination-item:hover,\n .ant-select:not(.ant-select-disabled):hover .ant-select-selector,\n .ant-pagination-item:focus {\n border-color: ${({ corTituloGrid }) => `${corTituloGrid}`};\n }\n\n .ant-pagination-item-active:focus a,\n .ant-pagination-item-active:hover a,\n .ant-pagination-item:hover a,\n .ant-pagination-prev:hover .ant-pagination-item-link,\n .ant-pagination-next:hover .ant-pagination-item-link {\n border-color: ${({ corTituloGrid }) => `${corTituloGrid}`};\n color: ${({ corTituloGrid }) => `${corTituloGrid}`};\n }\n\n @media (max-width: 795px) {\n width: 100%;\n .ant-select {\n width: 100%;\n margin-right: 0px;\n }\n }\n\n @media (max-width: 700px) and (min-width: 545px) {\n .ant-select {\n width: auto;\n margin-right: 15px;\n }\n }\n\n .ant-select-selection--single .ant-select-selection__rendered {\n margin-right: 30px;\n }\n`;\n\nexport const ButtonsArea = styled.div`\n display: flex;\n margin-top: 5px;\n margin-bottom: 5px;\n\n .ant-typography {\n color: ${({ corTituloGrid }) => `${corTituloGrid}`};\n }\n\n @media (max-width: 700px) {\n width: 100%;\n }\n`;\n\nexport const UltimaAtualizacaoArea = styled.div`\n display: flex;\n justify-content: flex-start;\n flex-direction: row;\n font-size: ${({ theme }) => `${12 + 2 * theme.zoomFonte}px`};\n\n .title {\n font-weight: bold;\n margin-top: auto;\n margin-bottom: auto;\n }\n\n .dates {\n display: flex;\n justify-content: space-between;\n margin-top: auto;\n margin-bottom: auto;\n\n p {\n margin-left: 10px;\n margin-bottom: 0;\n }\n }\n`;\n","import React from 'react';\nimport { ClockCircleOutlined } from '@ant-design/icons';\nimport { UltimaAtualizacaoArea } from './Footer.styled';\n\nexport function UltimaAtualizacao({ dataHora, corTituloGrid }) {\n const data = new Date(dataHora).toLocaleDateString('pt-Br');\n const horas = new Date(dataHora).toLocaleTimeString('pt-Br');\n\n return (\n \n Última Atualização:
\n \n
{data}
\n
\n \n {horas}\n
\n
\n \n );\n}\n","import api from '~/services/api';\n\nexport async function obterConfiguracoes(modulo, visao) {\n return api.get(`modulovisao/${modulo}/${visao}/configuracao`);\n}\n\nexport async function obterConfiguracoesGerais(modulo) {\n return api.get(`modulo/${modulo}/configuracoes`);\n}\n\nexport async function filtrar(data) {\n return api.post('modulovisao/filter', data);\n}\n\nexport async function exportarVisao(tipoExportacao, data) {\n return api.post(`modulovisao/exportacaogrid/${tipoExportacao}`, data);\n}\n\nexport async function obterTotalizadores(data) {\n return api.post(`modulovisao/colunasTotalizadoras`, data);\n}\n","import React, { useState, useEffect } from 'react';\nimport { Accordion, Select, Exportacao, Notification } from '~/components';\nimport { Content, ContainerExportar } from './style';\nimport { useSelector } from 'react-redux';\nimport { UltimaAtualizacao } from '../../../modules/Modulos/components/Grid/UltimaAtualizacao.component';\nimport { getUrlComDominio } from '~/modules/Helper/getUrl-helper';\nimport { exportarVisao } from '../../Modulos/services/moduloVisao.service';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\n\nconst { Panel } = Accordion;\nconst { Option, OptGroup } = Select;\n\nfunction DadosAbertosList({ chaveModulo, visaoAnalitica, modulo }) {\n const periodicidades = visaoAnalitica && visaoAnalitica.Periodicidades ? visaoAnalitica.Periodicidades : [];\n const configuration = useSelector(state => state.configuration);\n const { corTituloGrid } = configuration;\n const dataUltimaAtualizacao = visaoAnalitica.DataUltimaSicronizacaoModulo;\n\n const [periodicidadeSelecionada, setPeriodicidadeSelecionada] = useState(null);\n const [periodicidadeDescricao, setPeriodicidadeDescricao] = useState('Periodicidade');\n const [exercicioSelecionado, setExercicioSelecionado] = useState(null);\n const [periodoSelecionado, setPeriodoSelecionado] = useState(null);\n const [periodoDescricao, setperiodoDescricao] = useState('Exercício');\n \n\n const existePeriodicidade = periodicidades.length > 0;\n const periodicidadeUnica = periodicidades.length === 1;\n\n useEffect(() => {\n if (periodicidadeUnica){\n setPeriodicidadeSelecionada(periodicidades[0].Id);\n setPeriodicidadeDescricao(periodicidades[0].Descricao);\n };\n }, [visaoAnalitica]);\n\n const handlePeriodicidadeChange = (value) => {\n const parsedValue = JSON.parse(value);\n const { periodicidadeId, periodicidadeDescricao } = parsedValue;\n\n setPeriodicidadeSelecionada(periodicidadeId);\n setPeriodicidadeDescricao(periodicidadeDescricao);\n setExercicioSelecionado(null);\n setperiodoDescricao('Exercício');\n };\n\n const handleExercicioChange = (value) => {\n const parsedValue = JSON.parse(value);\n const { exercicio, periodoId, periodoDescricao } = parsedValue;\n\n setExercicioSelecionado(exercicio);\n setPeriodoSelecionado(periodoId);\n setperiodoDescricao(periodicidadeUnica && !periodoDescricao ? exercicio : periodoDescricao);\n };\n\n async function exportar(tipoExportacao) {\n if (existePeriodicidade && !exercicioSelecionado) {\n Notification.showError(\"Selecione um exercício antes de exportar.\");\n return;\n }\n\n const payload = {\n ChaveModulo: chaveModulo,\n Exercicio: existePeriodicidade ? Number(exercicioSelecionado) : null,\n Periodicidade: periodicidadeSelecionada,\n Periodo: periodoSelecionado,\n NomeVisao: visaoAnalitica.NomeVisaoAnalitica,\n UrlExportacao: getUrlComDominio(),\n };\n\n try {\n const res = await exportarVisao(tipoExportacao, payload);\n fileManagerPaiDownload(res.data);\n } catch (error) {\n Notification.showError(error.response.data);\n }\n }\n\n return (\n <>\n \n \n \n \n\n \n\n {existePeriodicidade &&(\n \n )}\n\n \n \n \n\n \n {dataUltimaAtualizacao && (\n
\n )}\n
\n \n >\n );\n}\n\nexport default DadosAbertosList;\n","import React, { useState, useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { Informacao, PageTitle, Row, ButtonGoBack } from '~/components';\nimport { getDadosAbertosService } from '../services/dadosAbertos.service';\nimport DadosAbertosList from './../components/dadosAbertos.component';\n\nfunction DadosAbertos() {\n const [informacao, setInformacao] = useState({ __html: null });\n const [listaModulos, setListaModulos] = useState([]);\n const history = useHistory();\n\n useEffect(() => {\n async function getDadosAbertos() {\n\n const response = await getDadosAbertosService();\n if (response && response.data.Informacao) {\n setListaModulos(response.data.Modulos);\n setInformacao(response.data.Informacao);\n }\n\n }\n\n getDadosAbertos();\n }, []);\n\n function goBack() {\n history.push('/');\n }\n\n return (\n <>\n \n {informacao?.Texto && (\n \n )}\n\n {Boolean(listaModulos?.length) &&\n listaModulos.map(el => (\n \n ))}\n\n \n \n
\n >\n );\n}\n\nexport default DadosAbertos;\n","import api from '~/services/api';\n\nfunction getDadosAbertosService() {\n return api.get('DadosAbertos');\n}\n\nexport { getDadosAbertosService };\n","import React from 'react';\nimport { Form } from 'antd';\nimport { Select, Typography } from '~/components';\n\nconst { Option } = Select;\n\nconst listaMes = [\n { name: 'Janeiro', value: 1 },\n { name: 'Fevereiro', value: 2 },\n { name: 'Março', value: 3 },\n { name: 'Abril', value: 4 },\n { name: 'Maio', value: 5 },\n { name: 'Junho', value: 6 },\n { name: 'Julho', value: 7 },\n { name: 'Agosto', value: 8 },\n { name: 'Setembro', value: 9 },\n { name: 'Outubro', value: 10 },\n { name: 'Novembro', value: 11 },\n { name: 'Dezembro', value: 12 },\n];\n\nconst listaBimestral = [\n {\n name: '1º Bimestre',\n value: 1,\n },\n {\n name: '2º Bimestre',\n value: 2,\n },\n {\n name: '3º Bimestre',\n value: 3,\n },\n {\n name: '4º Bimestre',\n value: 4,\n },\n];\n\nconst listaSemestral = [\n {\n name: '1º Semestre',\n value: 1,\n },\n {\n name: '2º Semestre',\n value: 2,\n },\n];\n\nexport const FILTRO_DEFAULT = {\n MENSAL: 1,\n ANUAL: 2,\n SEM_FILTRO: 3,\n};\n\nexport const periodicidadeAnual = (\n <>\n \n \n Por Exercício\n \n
\n \n \n \n >\n);\n\nexport const periodicidadeMensal = periodos => {\n return (\n <>\n \n \n Por Mês\n \n
\n \n \n \n >\n );\n};\n\nexport const periodicidadeBimestral = periodos => {\n return (\n <>\n \n \n Por Bimestre\n \n
\n \n \n \n >\n );\n};\n\nexport const periodicidadeSemestral = periodos => {\n return (\n <>\n \n \n Por Semestre\n \n
\n {periodos && (\n \n \n \n )}\n >\n );\n};\n","import React from 'react';\nimport {\n Typography,\n Row,\n Col,\n Card,\n Divider,\n Tooltip,\n Button,\n Icons,\n} from '~/components';\n\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\n\nconst TotalEntidadeESic = 3;\n\nfunction CardInfo({ dados }) {\n return (\n \n {dados.map(informacoes => (\n \n {informacoes}\n \n ))}\n \n );\n}\n\nfunction Arquivo({ form }) {\n return (\n \n \n \n {form.Descricao}\n \n \n \n \n \n \n
\n );\n}\n\nfunction showFormulario(formularios) {\n return (\n <>\n \n Formulários SIC\n \n {formularios.map(form =>\n form.Url ? : null\n )}\n >\n );\n}\n\nfunction EsicCard({ dados, formularios }) {\n const cards = dados; // dados.filter(card => card.Dados.length > 0);\n\n return cards.map(card => {\n const formularioentidade = formularios.find(\n forms => forms.Entidade === card.Entidade\n );\n\n return (\n \n {card.Entidade}}\n size=\"small\"\n style={{\n minHeight: 248,\n backgroundColor: 'rgba(255, 255, 255, 0.9)',\n }}\n >\n \n {formularioentidade && showFormulario(formularioentidade.Fomulario)}\n \n \n );\n });\n}\n\nfunction ESicVisoes({ dados, formularios }) {\n return (\n <>\n \n \n
\n >\n );\n}\n\nexport default ESicVisoes;","import React, { useState, useEffect, useContext } from 'react';\nimport { WidthProvider, Responsive } from 'react-grid-layout';\nimport { useHistory } from 'react-router-dom';\nimport _ from 'lodash';\nimport DonutGraphic from '~/components/Grafico/DonutGraphic.component';\nimport PieGraphic from '~/components/Grafico/PieGraphic.component';\nimport BarGraphic from '~/components/Grafico/BarGraphic.component';\nimport ColumnGraphic from '~/components/Grafico/ColumnGraphic.component';\nimport {\n periodicidadeBimestral,\n periodicidadeAnual,\n periodicidadeMensal,\n periodicidadeSemestral,\n} from '~/modules/Helper/FiltrosPeriodicidade';\nimport api from '~/services/api';\n\nimport {\n ListaGraficoContext,\n GraficoContext,\n} from '../context/listaGraficoContext';\n\nimport {\n getESicService,\n redirectNotFound,\n getVisoesData,\n} from '../services/esic.service';\n\nimport {\n Informacao,\n PageTitle,\n ImageButton,\n Row,\n ButtonGoBack,\n} from '~/components';\nimport ESicVisoes from '../components/visoes.component';\n\nfunction ESic() {\n const history = useHistory();\n const [visoesESic, setVisoesESic] = useState(null);\n const [formularioESIC, setFormularioESIC] = useState(null);\n\n const ResponsiveReactGridLayout = WidthProvider(Responsive);\n const { listaGrafico, setListaGrafico, eSic, setESic } = useContext(\n GraficoContext\n );\n const [periodicidade, setPeriodicidade] = useState(null);\n const gridContainer = {\n overflow: 'hidden',\n left: -10,\n };\n\n const gridBackground = {\n width: '100%',\n height: '100%',\n left: '0px',\n right: '0px',\n backgroundSize: '3% 3%',\n };\n\n const showEyeButton = false;\n\n useEffect(() => {\n async function getPeriodos() {\n const responsePeriodicidade = await api.get('periodicidade/periodos');\n setPeriodicidade(responsePeriodicidade.data);\n }\n\n getPeriodos();\n }, []);\n\n function obterUrlFormulario({\n UrlArquivoPessoaFisicaReclamacao,\n UrlArquivoPessoaFisicaRecurso,\n UrlArquivoPessoaFisicaeSIC,\n UrlArquivoPessoaJuridicaReclamacao,\n UrlArquivoPessoaJuridicaRecurso,\n UrlArquivoPessoaJuridicaeSIC,\n }) {\n const data = [\n {\n Entidade: 'e-SIC',\n Fomulario: [\n {\n Descricao: 'Arquivo Pessoa Física',\n Url: UrlArquivoPessoaFisicaeSIC,\n },\n {\n Descricao: 'Arquivo Pessoa Jurídica',\n Url: UrlArquivoPessoaJuridicaeSIC,\n },\n ],\n },\n {\n Entidade: 'Reclamações',\n Fomulario: [\n {\n Descricao: 'Arquivo Pessoa Física',\n Url: UrlArquivoPessoaFisicaReclamacao,\n },\n {\n Descricao: 'Arquivo Pessoa Jurídica',\n Url: UrlArquivoPessoaJuridicaReclamacao,\n },\n ],\n },\n {\n Entidade: 'Recursos',\n Fomulario: [\n {\n Descricao: 'Arquivo Pessoa Física',\n Url: UrlArquivoPessoaFisicaRecurso,\n },\n {\n Descricao: 'Arquivo Pessoa Jurídica',\n Url: UrlArquivoPessoaJuridicaRecurso,\n },\n ],\n },\n ];\n\n setFormularioESIC(data);\n }\n\n async function obterDadosVisoes({\n AtendimentoQuantidade,\n AtendimentoRespondido,\n AtendimentoPrazoMedio,\n RecursoQuantidade,\n RecursoRespondido,\n RecursoPrazoMedio,\n ReclamacaoQuantidade,\n ReclamacaoRespondido,\n ReclamacaoPrazoMedio,\n }) {\n const params = {\n AtendimentoQuantidade,\n AtendimentoRespondido,\n AtendimentoPrazoMedio,\n RecursoQuantidade,\n RecursoRespondido,\n RecursoPrazoMedio,\n ReclamacaoQuantidade,\n ReclamacaoRespondido,\n ReclamacaoPrazoMedio,\n };\n\n const { data } = await getVisoesData(params);\n setVisoesESic(data);\n }\n\n useEffect(() => {\n async function getESic() {\n const response = await getESicService();\n if (response && response.data) {\n if (!response.data.Habilitado) redirectNotFound();\n setESic(response.data);\n obterDadosVisoes(response.data);\n obterUrlFormulario(response.data);\n }\n }\n\n if (periodicidade) getESic();\n }, [periodicidade, setESic]);\n\n useEffect(() => {\n function getFilterContent(exibicao) {\n switch (exibicao) {\n case 1:\n return {\n Periodicidade: periodicidade[0]?.Periodos[0]?.Id,\n Content: periodicidadeMensal(periodicidade[0]?.Periodos),\n };\n case 2:\n return {\n Periodicidade: periodicidade[1]?.Periodos[0]?.Id,\n Content: periodicidadeBimestral(periodicidade[1]?.Periodos),\n };\n case 5:\n return {\n Periodicidade: periodicidade[4]?.Periodos[0]?.Id,\n Content: periodicidadeSemestral(periodicidade[4]?.Periodos),\n };\n case 6:\n return {\n Periodicidade: 2021,\n Content: periodicidadeAnual,\n };\n default:\n return null;\n }\n }\n\n function getListaGraficos() {\n const listaGraficosESic = eSic?.ListaGraficos.map(graficoESic => {\n switch (graficoESic.TipoGrafico) {\n case 1:\n return {\n id: graficoESic.Id,\n position: graficoESic.Posicao,\n component: (\n \n ),\n };\n case 2:\n return {\n id: graficoESic.Id,\n position: graficoESic.Posicao,\n component: (\n \n ),\n };\n case 3:\n return {\n id: graficoESic.Id,\n position: graficoESic.Posicao,\n component: (\n \n ),\n };\n case 4:\n return {\n id: graficoESic.Id,\n position: graficoESic.Posicao,\n component: (\n \n ),\n };\n default:\n return null;\n }\n });\n setListaGrafico(\n listaGraficosESic.filter(itemGrafico => {\n return itemGrafico;\n })\n );\n }\n\n if (eSic && periodicidade) getListaGraficos();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [eSic, periodicidade]);\n\n function createElement(el) {\n return (\n \n {el.component}\n
\n );\n }\n\n function goBack() {\n history.push('/');\n }\n\n return (\n <>\n {eSic && (\n <>\n \n \n\n {eSic?.Informacao?.Texto && (\n \n )}\n\n {visoesESic != null && (\n \n )}\n >\n )}\n\n \n
\n
\n {_.map(listaGrafico, el => createElement(el))}\n \n
\n\n \n \n
\n >\n );\n}\n\nfunction Container() {\n return (\n \n \n \n );\n}\n\nexport default Container;\n","import api from './api';\n\nexport async function verificaModuloHabilitado(chaveModulo) {\n const response = await api.get(`Modulo/habilitado/${chaveModulo}`);\n\n return response.status === 200;\n}\n","export const CHAVES_MODULO = {\n ESIC: 'esic',\n FAQ: 'faq',\n ESTRUTURA_ORGANIZACIONAL: 'estrutura_organizacional',\n ESTATISTICAS: 'estatisticas',\n SUMARIO: 'sumario',\n FALE_CONOSCO: 'faleconosco',\n GLOSSARIO: 'glossario',\n HOME: 'home',\n AUTENTICIDADE: 'autenticidade',\n DADOS_ABERTOS: 'dados_abertos',\n};\n","import React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport {\n PageTitle,\n Divider,\n List,\n Card,\n Col,\n Row,\n ButtonGoBack,\n} from '~/components';\nimport { useMenus } from '~/contexts/menu.context';\nimport { TIPO_MENU_PORTAL } from '~/modules/Helper/tipoMenuPortal';\nimport * as ModuloService from '../../../services/modulos.service';\nimport { CHAVES_MODULO } from '../../Helper/chave-modulo-constants';\n\nfunction transformarJson(menu) {\n return menu.map(item => {\n const novosSubItens = [];\n\n function extrairSubItens(subItens) {\n subItens.forEach(subItem => {\n novosSubItens.push({ ...subItem, SubItens: [] });\n if (subItem.SubItens.length > 0) {\n extrairSubItens(subItem.SubItens);\n }\n });\n }\n\n extrairSubItens(item.SubItens);\n return { ...item, SubItens: novosSubItens };\n });\n}\n\nfunction Sumario() {\n const history = useHistory();\n const { menus } = useMenus();\n const corTema = useSelector(state => state.configuration.corTema);\n const [menusTransformados, setMenusTransformados] = useState([]);\n\n function handleRedirect(item) {\n if (!item.URI) return;\n if (item.TipoMenuPortal === TIPO_MENU_PORTAL.EXTERNO) {\n window.open(item.URI);\n } else {\n history.push(item.URI);\n }\n }\n\n function goBack() {\n history.push('/');\n }\n\n useEffect(() => {\n ModuloService.verificaModuloHabilitado(CHAVES_MODULO.SUMARIO);\n setMenusTransformados(transformarJson(menus));\n }, [menus]);\n\n return (\n <>\n \n \n \n (\n \n {\n handleRedirect(item);\n }}\n >\n {item.Titulo}\n \n ) : (\n item.Titulo\n )\n }\n />\n \n {item.SubItens.length > 0 && (\n \n )}\n \n )}\n />\n
\n \n \n \n
\n >\n );\n}\n\nexport default Sumario;\n","import styled from 'styled-components';\nimport { Tree } from '~/components';\n\nexport const TreeTransparente = styled(Tree)`\n &&.draggable-tree {\n background: transparent !important;\n }\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { TreeTransparente } from './styles';\nimport { Tree, Tooltip, Typography } from '~/components';\n\nfunction TreeViewEstruturaOrganizacional({ treeView, history }) {\n\n const { TreeNode } = Tree;\n const { corTema } = useSelector(state => state.configuration);\n\n const loop = data =>\n data.map(item => {\n if (item.children && item.children.length && item.Habilitado) {\n return (\n \n \n \n {\n if (item.Externo) window.open(item.Link);\n else\n history.push(\n `/estrutura_organizacional/detalhe/${item.IdDetalhe}`\n );\n }}\n role=\"link\"\n tabIndex=\"0\"\n aria-hidden=\"true\"\n >\n {item.title}\n \n \n \n >\n }\n >\n {loop(item.children)}\n \n );\n }\n if (item.Habilitado) {\n return (\n \n \n \n {\n if (item.Externo) window.open(item.Link);\n else\n history.push(\n `/estrutura_organizacional/detalhe/${item.IdDetalhe}`\n );\n }}\n role=\"link\"\n tabIndex=\"0\"\n aria-hidden=\"true\"\n >\n {item.title}\n \n \n \n >\n }\n />\n );\n }\n return null;\n });\n\n return (\n \n {loop(treeView)}\n \n );\n}\n\nexport default TreeViewEstruturaOrganizacional;\n","import React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { getEstruturaOrganizacionalConfiguracaoService } from '../services/estruturaOrganizacional.service';\nimport TreeViewEstruturaOrganizacional from '../components/treeViewEstruturaOrganizacional.component';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\n\nimport { Typography, Tooltip, Row, Col, Card, PageTitle, ButtonGoBack } from '~/components';\n\nfunction EstruturaOrganizacional({ history }) {\n const { corTema } = useSelector(state => state.configuration);\n\n const [\n estruturaOrganizacionalConfiguracao,\n setEstruturaOrganizacionalConfiguracao,\n ] = useState(null);\n\n useEffect(() => {\n async function getEstruturaOrganizacionalConfiguracao() {\n const response = await getEstruturaOrganizacionalConfiguracaoService();\n if (response.data) setEstruturaOrganizacionalConfiguracao(response.data);\n }\n getEstruturaOrganizacionalConfiguracao();\n }, []);\n\n function goBack() {\n history.push('/');\n }\n\n return (\n <>\n {estruturaOrganizacionalConfiguracao && (\n <>\n \n \n \n \n
\n \n {estruturaOrganizacionalConfiguracao.ExibicaoLegislacao &&\n estruturaOrganizacionalConfiguracao.UrlLegislacao && (\n \n Legislação}\n size=\"small\"\n >\n \n \n {\n fileManagerPaiDownload(\n estruturaOrganizacionalConfiguracao.UrlLegislacao\n );\n }}\n role=\"link\"\n tabIndex=\"0\"\n aria-hidden=\"true\"\n >\n {\n estruturaOrganizacionalConfiguracao.ExibicaoLegislacao\n }\n \n \n \n \n \n )}\n\n {estruturaOrganizacionalConfiguracao.ExibicaoFluxograma &&\n estruturaOrganizacionalConfiguracao.UrlFluxograma && (\n \n Fluxograma}\n size=\"small\"\n >\n \n \n {\n fileManagerPaiDownload(\n estruturaOrganizacionalConfiguracao.UrlFluxograma\n );\n }}\n role=\"link\"\n tabIndex=\"0\"\n aria-hidden=\"true\"\n >\n {\n estruturaOrganizacionalConfiguracao.ExibicaoFluxograma\n }\n \n \n \n \n \n )}\n
\n\n \n \n Estrutura Organizacional\n }\n size=\"small\"\n >\n \n \n \n
\n \n \n
\n >\n )}\n >\n );\n}\n\nexport default EstruturaOrganizacional;\n","import api from '~/services/api';\n\nfunction getEstruturaOrganizacionalConfiguracaoService() {\n return api.get(`estruturaOrganizacional`);\n}\n\nfunction getEstruturaOrganizacionalDetalheService(id) {\n return api.get(`estruturaOrganizacional/${id}/detalhe`);\n}\n\nexport {\n getEstruturaOrganizacionalConfiguracaoService,\n getEstruturaOrganizacionalDetalheService,\n};\n","import styled from 'styled-components';\n\nexport const Title = styled.div`\n margin: 0px 20px 0px 20px;\n`;\n\nexport const Content = styled.div`\n margin: 15px;\n margin-right: 20px;\n margin-left: 20px;\n`;\n\nexport const Section = styled.div`\n margin-bottom: 15px;\n`;\n","export const ChooseIconFile = fileExtension => {\n let fileIcon = 'pdf';\n if (fileExtension) {\n switch (fileExtension) {\n case 'pdf':\n break;\n case 'png':\n case 'jpg':\n case 'jpeg':\n fileIcon = 'img';\n break;\n case 'csv':\n case 'xls':\n case 'xlsx':\n fileIcon = 'excel';\n break;\n default:\n fileIcon = 'text';\n }\n }\n return fileIcon;\n};\n","import React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { getEstruturaOrganizacionalDetalheService } from '../services/estruturaOrganizacional.service';\nimport {\n fileManagerPaiDownload,\n getFullUrl,\n} from '~/services/FileManager/file-manager.service';\n\nimport {\n Card,\n Typography,\n Button,\n Tooltip,\n Icons,\n Row,\n Col,\n MapButton,\n ButtonGoBack,\n} from '~/components/';\nimport { Title, Content } from './style';\nimport { ChooseIconFile } from '~/modules/Helper/chooseIconFile';\nimport { iconEnum } from '~/modules/Helper/iconEnum';\n\nfunction EstruturaOrganizacionalDetalhe({ match }) {\n const corTema = useSelector(state => state.configuration.corTema);\n const [\n estruturaOrganizacionalDetalhe,\n setEstruturaOrganizacionalDetalhe,\n ] = useState();\n const [imgSecretario, setImgSecretario] = useState();\n const history = useHistory();\n\n async function getUrl(response) {\n return getFullUrl(response);\n }\n useEffect(() => {\n async function getEstruturaOrganizacionalConfiguracao() {\n const response = await getEstruturaOrganizacionalDetalheService(\n Number(match.params.id)\n );\n setEstruturaOrganizacionalDetalhe(response.data);\n\n const { UrlImagemSecretario } = response.data;\n let img = null;\n\n if (UrlImagemSecretario) {\n img = await getUrl(UrlImagemSecretario);\n }\n setImgSecretario(img);\n }\n getEstruturaOrganizacionalConfiguracao();\n }, [match]);\n\n function goBack() {\n history.goBack();\n }\n return (\n <>\n {estruturaOrganizacionalDetalhe && (\n <>\n \n \n {estruturaOrganizacionalDetalhe.Nome}\n \n\n \n {estruturaOrganizacionalDetalhe.SecretarioResponsavel}\n \n\n \n Secretário/Responsável\n \n \n\n \n {imgSecretario != null && (\n \n
\n \n )}\n\n \n \n \n Telefone:{' '}\n \n {estruturaOrganizacionalDetalhe.Telefone}\n \n \n\n
\n\n \n E-mail:{' '}\n \n {estruturaOrganizacionalDetalhe.Email}\n \n \n\n
\n\n \n Atendimento ao Publico:{' '}\n \n {estruturaOrganizacionalDetalhe.AtendimentoPublico}\n \n \n\n
\n \n \n
\n\n \n \n \n \n Endereço:{' '}\n \n {estruturaOrganizacionalDetalhe.Logradouro}\n {' '}\n \n \n Nº:{' '}\n \n {estruturaOrganizacionalDetalhe.Numero}\n \n \n\n
\n\n \n Bairro:{' '}\n \n {estruturaOrganizacionalDetalhe.Bairro}\n \n \n\n
\n \n Cidade:{' '}\n \n {estruturaOrganizacionalDetalhe.Cidade}\n \n \n\n
\n \n CEP:{' '}\n \n {estruturaOrganizacionalDetalhe.CEP}\n \n \n\n
\n \n \n \n \n
\n \n\n \n \n \n \n \n {estruturaOrganizacionalDetalhe.NomeArquivo &&\n estruturaOrganizacionalDetalhe.UrlArquivo && (\n \n \n \n fileManagerPaiDownload(\n estruturaOrganizacionalDetalhe.UrlArquivo\n )\n }\n >\n \n \n {iconEnum\n .find(\n x =>\n x.name ===\n `file-${ChooseIconFile(\n estruturaOrganizacionalDetalhe?.NomeArquivo?.split(\n '.',\n 2\n )[1].toLowerCase()\n )}`\n )\n ?.value({ fontSize: '20px' })}\n \n \n \n \n {estruturaOrganizacionalDetalhe.NomeArquivo}\n \n \n \n \n }\n />\n \n
\n \n \n )}\n \n \n
\n >\n )}\n >\n );\n}\n\nexport default EstruturaOrganizacionalDetalhe;\n","import styled from 'styled-components';\nimport Result from '../Result/Result.component';\n\nexport const InfoManutencao = styled(Result)` \n justify-content: center;\n height: 70%;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1rem;\n\n .ant-result-subtitle {\n font-size: 1.25rem;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport { InfoManutencao } from './EmManutencao.styled';\nimport { Button } from '../Button/Button.styled';\nimport * as ModuloVisaoService from '../../modules/Modulos/services/moduloVisao.service';\n\nfunction EmManutencao() {\n const history = useHistory();\n const location = useLocation();\n const params = new URLSearchParams(location.search);\n\n const visao = params.get('visao');\n const titulo = params.get('titulo');\n const [moduloApi, visaoApi] = visao.split('/');\n const [botaoDisabled, setBotaoDisabled] = useState(true);\n\n useEffect(() => {\n const voltarParaVisao = async () => {\n const responseConfiguracao = await ModuloVisaoService.obterConfiguracoes(\n moduloApi,\n visaoApi\n );\n\n const modoVisao = responseConfiguracao.data.ModoVisao;\n if (modoVisao !== 3) {\n setBotaoDisabled(false);\n }\n };\n\n voltarParaVisao();\n }, [moduloApi, visaoApi]);\n\n const voltarParaVisao = () => {\n if (botaoDisabled) history.push('/');\n else history.push(`/${visao}`);\n };\n\n const textoBotao = botaoDisabled\n ? 'Voltar para a Home'\n : 'Voltar para a Visão';\n\n const tituloPagina = botaoDisabled\n ? `Visão '${titulo}' em manutenção temporária.`\n : `Visão '${titulo}' sofreu uma alteração.`;\n\n const subTituloPagina = botaoDisabled\n ? 'Tente novamente mais tarde.'\n : 'Clique aqui para atualizar';\n\n return (\n <>\n \n {textoBotao}\n \n }\n />\n >\n );\n}\n\nexport default EmManutencao;\n","import styled from 'styled-components';\nimport { Button, Card } from '~/components';\n\nexport const ContainerButtons = styled(Card)`\n display: flex;\n justify-content: center;\n align-items: center;\n position: sticky;\n width: 100%;\n top: 0;\n padding: 1em 0 1em 0.35em;\n z-index: 1;\n margin-bottom: 1em;\n\n ${Button} {\n width: 2.8em;\n height: 2.5em;\n display: flex;\n justify-content: center;\n align-items: center;\n margin: 0 0.35em 0.35em 0;\n padding: 1.2em;\n\n @media (max-width: 1440px) {\n width: 2.5em;\n height: 2.5em;\n font-size: 12px;\n }\n\n @media (max-width: 815px) {\n font-size: 10px;\n }\n\n @media (max-width: 768px) {\n font-size: 9px;\n }\n\n @media (max-width: 450px) {\n font-size: 8px;\n }\n\n @media (max-width: 313px) {\n font-size: 7px;\n }\n }\n`;\n","export const alfabeto = [\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'I',\n 'J',\n 'K',\n 'L',\n 'M',\n 'N',\n 'O',\n 'P',\n 'Q',\n 'R',\n 'S',\n 'T',\n 'U',\n 'V',\n 'W',\n 'X',\n 'Y',\n 'Z',\n];\n","import React from 'react';\nimport { HashLink } from 'react-router-hash-link';\nimport { Button } from '~/components';\nimport { ContainerButtons } from './style';\nimport { alfabeto } from '../constants/alfabeto';\n\nfunction GlossarioButtons({ letrasAtivas = [] }) {\n const verificaBotaoDesabilitado = letra =>\n letrasAtivas.includes(letra) === false;\n\n return (\n \n {alfabeto.map(letra => (\n \n \n \n ))}\n \n );\n}\n\nexport default GlossarioButtons;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n height: 80vh;\n overflow-y: scroll;\n\n ::-webkit-scrollbar {\n width: 8px;\n }\n\n ::-webkit-scrollbar-track {\n background: #f1f1f1;\n }\n\n ::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 5px;\n }\n\n ::-webkit-scrollbar-thumb:hover {\n background: #555;\n }\n`;\n\nexport const ItemGlossarioArea = styled.div`\n padding-top: 5em;\n\n @media (max-width: 1244px) {\n padding-top: 6.6em;\n }\n`;\n","import React, { useState, useEffect } from 'react';\nimport { Divider, Typography, PageTitle, Card } from '~/components';\nimport GlossarioButtons from '../componentes/glossario-buttons.component';\nimport { getGlossario } from '../services/glossario.service';\nimport { Container, ItemGlossarioArea } from './style';\n\nfunction Glossario() {\n const [letrasAtivas, setLetrasAtivas] = useState([]);\n const [glossario, setGlossario] = useState([]);\n\n async function obterGlossario() {\n const response = await getGlossario();\n if (response?.data?.Itens?.length) setGlossario(response.data.Itens);\n }\n\n useEffect(() => {\n obterGlossario();\n }, []);\n\n useEffect(() => {\n const letras = glossario.map(item => item.Letra);\n\n setLetrasAtivas(letras);\n }, [glossario]);\n\n return (\n <>\n \n \n \n \n {Boolean(glossario?.length) &&\n glossario.map(({ Letra, PalavrasSignificados }) => (\n \n \n {Letra}\n \n\n \n\n {Boolean(PalavrasSignificados?.length) &&\n PalavrasSignificados.map(({ Palavra, Significado }) => (\n \n {Palavra}: {Significado}\n \n ))}\n \n ))}\n \n \n >\n );\n}\n\nexport default Glossario;\n","import api from '~/services/api';\n\nfunction getGlossario() {\n return api.get('glossario');\n}\n\nexport { getGlossario };\n","export function parseToQueryString(data) {\n if (!data) return '';\n\n const urlSearchParams = new URLSearchParams();\n\n Object.keys(data).forEach(key => {\n // remove props null ou undefined\n if (data[key] === null || data[key] === undefined) {\n } else if (Array.isArray(data[key])) {\n data[key].forEach(item => urlSearchParams.append(key, item));\n } else {\n urlSearchParams.append(key, data[key]);\n }\n });\n\n const queryString = urlSearchParams.toString();\n return queryString;\n}\n","export const MODO_VISAO = {\n GridCarregada: 1,\n GridVazia: 2,\n Manutencao: 3,\n};\n","export const NUMERO_QUANTIDADE_REGISTROS = ['5', '10', '20', '50', '100'];\n","export const PARAMS_FILTERS_GRID = [\n 'periodicidade',\n 'exercicio',\n 'pagina',\n 'periodo',\n 'quantidaderegistros',\n 'colunafiltroRedirecionaVisao',\n 'valorfiltroRedirecionaVisao',\n 'tipovalorfiltroRedirecionaVisao',\n 'colunaordem',\n 'tipoordem',\n 'listacolunaordem',\n];\n\nexport const PARAMS_FILTERS_DETALHE = [\n 'periodicidade',\n 'exercicio',\n 'periodo',\n 'pagina',\n 'chavesPeriodicidade',\n];\n\nexport const PARAMS_FILTERS_GRID_BUSCA_AVANCADA = [\n 'pagina',\n 'quantidaderegistros',\n 'listacolunaordem',\n 'filtros',\n];\n","export function getAndFormatSearchParams(data, filtersArray) {\n let searchParams = new URLSearchParams();\n const filtersArrayLowwer = filtersArray.map(item => item.toLowerCase());\n\n Object.entries(data).forEach(key => {\n const values = key.filter(\n () => filtersArrayLowwer.includes(key[0].toLowerCase()) && key[1]\n );\n\n if (values.length > 0) searchParams.append(values[0], values[1]);\n });\n\n const queryString = searchParams.toString();\n return queryString;\n}\n\nexport function getAndFormatSearchParamsBuscaAvancada(data, filtersArray) {\n let searchParams = new URLSearchParams();\n const filtersArrayLowwer = filtersArray.map(item => item.toLowerCase());\n\n Object.entries(data).forEach(key => {\n const values = key.filter(() => {\n if (key[0].toLowerCase() !== 'filtros')\n return filtersArrayLowwer.includes(key[0].toLowerCase()) && key[1];\n });\n\n if (values.length > 0) searchParams.append(values[0], values[1]);\n });\n\n const chavesFiltro = Object.keys(data.filtros);\n\n chavesFiltro.forEach(filtro => {\n const valuesFiltro = [];\n\n if (data.filtros[`${filtro}`] !== undefined) {\n valuesFiltro.push(data.filtros[`${filtro}`].Campo);\n valuesFiltro.push(data.filtros[`${filtro}`].Valor);\n valuesFiltro.push(data.filtros[`${filtro}`].TipoValor);\n\n if (valuesFiltro.length > 0) {\n searchParams.append(\n valuesFiltro[0],\n `${valuesFiltro[1]},${valuesFiltro[2]}`\n );\n }\n }\n });\n\n const queryString = searchParams.toString();\n return queryString;\n}\n","import React, { createContext, useContext, useState } from 'react';\n\nexport const UrlContext = createContext();\n\nexport function UrlProvider({ children }) {\n const [urls, setUrls] = useState([]);\n\n function empilhaUrl(url) {\n setUrls(u => [...u, url]);\n }\n\n function obterUrlPaginaAnterior() {\n const valorDefault = {\n urlCompleta: null,\n urlBase: null,\n queryParam: null,\n };\n\n if (!urls?.length) {\n return valorDefault;\n }\n\n const urlAnterior = String(urls[urls.length - 1]);\n\n if (urlAnterior) {\n const novasUrls = urls.filter(item => item !== urlAnterior);\n\n setUrls(novasUrls);\n\n const [urlBase, queryParam] = urlAnterior.split('?');\n\n return {\n urlCompleta: urlAnterior,\n urlBase,\n queryParam,\n };\n }\n\n return valorDefault;\n }\n\n return (\n \n {children}\n \n );\n}\n\nexport function useUrls() {\n const { urls, empilhaUrl, obterUrlPaginaAnterior } = useContext(UrlContext);\n\n return {\n urls,\n empilhaUrl,\n obterUrlPaginaAnterior,\n };\n}\n","import React from 'react';\nimport { PageTitle, Informacao } from '~/components';\n\nfunction Header({ configuracao }) {\n return (\n <>\n {configuracao?.Titulo && }\n\n {configuracao?.Informacao?.Texto && (\n \n )}\n >\n );\n}\n\nexport default Header;\n","export const TIPO_AGRUPAMENTO = {\n CONTADOR: 1,\n SOMA: 2,\n AGRUPADOR: 3,\n MAXIMO: 4,\n};\n","export const TIPO_COLUNA = {\n TEXTO_50: 1,\n TEXTO_100: 2,\n INTEIRO: 3,\n DECIMAL: 4,\n DATA: 5,\n LINK: 6,\n BOOLEANO: 7,\n TEXTO: 8,\n};\n","import React from 'react';\nimport { Row, Col, Divider } from '~/components';\nimport { TIPO_AGRUPAMENTO } from '~/modules/Helper/tipo-agrupamento';\nimport { TIPO_COLUNA } from '~/modules/Helper/tipoColuna';\n\nfunction Totalizadores({ totalizadores }) {\n return (\n <>\n \n \n {totalizadores.map(item => (\n \n {item.DescricaoTotalizador}\n \n {item.TipoValor === TIPO_COLUNA.DECIMAL &&\n item.TipoAgrupamento !== TIPO_AGRUPAMENTO.CONTADOR\n ? item.Total.toLocaleString('pt-br', {\n style: 'currency',\n currency: 'BRL',\n })\n : item.Total}\n \n \n ))}\n
\n \n >\n );\n}\n\nexport default Totalizadores;\n","import React, { useState, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Pagination, notification } from 'antd';\nimport { Select, Exportacao } from '~/components';\nimport { UltimaAtualizacao } from './UltimaAtualizacao.component';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\nimport { Container, NumberRegistersArea, ButtonsArea } from './Footer.styled';\nimport { exportarVisao } from '../../services/moduloVisao.service';\nimport { exportarBuscaAvancada } from '~/modules/BuscaAvancada/services/buscaAvancada.service';\nimport { getUrlComDominio } from '~/modules/Helper/getUrl-helper';\n\nfunction Footer({\n moduloVisao,\n quantidadeRegistros,\n setQuantidadeRegistros,\n page,\n setPage,\n configuracao,\n modulo,\n visao,\n filter,\n periodicidade,\n periodo,\n exercicio,\n colunaFiltroRedirecionaVisao,\n valorFiltroRedirecionaVisao,\n tipoValorFiltroRedirecionaVisao,\n dataUltimaAtualizacao,\n buscaAvancada,\n}) {\n const [tipo, setTipo] = useState(null);\n\n const configuration = useSelector(state => state.configuration);\n const { corFundoTituloGrid, corTituloGrid } = configuration;\n\n function setNewTipo() {\n if (configuracao.Tipo !== tipo) {\n setTipo(configuracao.Tipo);\n }\n }\n\n useEffect(() => {\n setTipo(configuracao.Tipo);\n setNewTipo();\n }, [configuracao.Tipo, setNewTipo]);\n\n function exportar(tipoExportacao) {\n if (tipoExportacao === 'uri') {\n navigator.clipboard.writeText(window.location.href);\n notification.success({\n message: 'URI Copiada com Sucesso!',\n });\n } else {\n const FiltroRedirecionaVisao = {\n Campo: colunaFiltroRedirecionaVisao,\n Valor: valorFiltroRedirecionaVisao,\n TipoValor: tipoValorFiltroRedirecionaVisao,\n };\n\n const dtoExportacao = {\n ChaveModulo: modulo,\n NomeVisao: visao,\n Filtros: filter,\n Periodicidade: periodicidade,\n Periodo: periodo,\n Exercicio: exercicio,\n Pagina: page,\n QuantidadeRegistros: quantidadeRegistros,\n FiltroRedirecionaVisao,\n UrlExportacao: getUrlComDominio(),\n };\n\n if (buscaAvancada) {\n exportarBuscaAvancada(tipoExportacao, dtoExportacao).then(res => {\n fileManagerPaiDownload(res.data);\n });\n } else {\n exportarVisao(tipoExportacao, dtoExportacao).then(res => {\n fileManagerPaiDownload(res.data);\n });\n }\n }\n }\n\n return (\n \n \n
\n {\n return (\n \n Total: \n {`${new Intl.NumberFormat('pt-BR').format(total)} registros`}\n
\n );\n }}\n onChange={pag => setPage(pag)}\n />\n\n \n \n
\n\n \n {dataUltimaAtualizacao && (\n
\n )}\n
\n\n \n {moduloVisao != null && moduloVisao.Valores.length !== 0 && (\n \n )}\n \n \n );\n}\n\nexport default Footer;\n","import api from '~/services/api';\n\nasync function getColunasFiltro(nomeModulo) {\n const response = await api.get(`Modulo/${nomeModulo}/colunasfiltro`);\n return response.data;\n}\n\nasync function obterDadosFiltroAvancado(data) {\n const response = await api.post(`ModuloVisao/filtroavancado`, data);\n return response;\n}\n\nasync function exportarBuscaAvancada(tipoExportacao, data) {\n const response = await api.post(\n `Modulovisao/exportacaogridfiltroavancado/${tipoExportacao}`,\n data\n );\n return response;\n}\n\nexport { getColunasFiltro, exportarBuscaAvancada, obterDadosFiltroAvancado };\n","import React from 'react';\n\nimport { Button } from '~/components';\n\nconst ButtonLinkFileManagerLinkAnexo = ({ children, onClick }) => (\n \n);\n\nexport default ButtonLinkFileManagerLinkAnexo;\n","import React from 'react';\n\nimport { Button, Tooltip, Icons } from '~/components';\n\nconst ButtonDownloadFileManager = ({ onClick }) => (\n \n }\n style={{ margin: '9px' }}\n />\n \n);\n\nexport default ButtonDownloadFileManager;\n","import React from 'react';\n\nimport { Button, Tooltip, Icons } from '~/components';\n\nconst ButtonLinkAnexo = ({ onClick }) => (\n \n }\n style={{ margin: '9px' }}\n />\n \n);\n\nexport default ButtonLinkAnexo;\n","import React, { useState, useEffect } from 'react';\n\nimport { Modal, FormV3 as Form, Row, Col, Table } from '~/components';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\n\nimport { obterAnexos } from '~/modules/Modulos/services/arquivos.service';\nimport ButtonLinkFileManagerLinkAnexo from './ButtonLinkFileManager';\nimport ButtonDownloadFileManager from './ButtonDowloadFileManager';\nimport ButtonLinkAnexo from './ButtonLinkAnexo';\n\nfunction ArquivosForm({\n visible,\n onCancel,\n chaveModulo,\n filtroPesquisaArquivosDigitais,\n}) {\n const [arquivosAnexados, setArquivosAnexados] = useState([]);\n const titulo = 'Listagem dos Anexos';\n\n useEffect(() => {\n async function buscarAnexos() {\n if (filtroPesquisaArquivosDigitais) {\n const response = await obterAnexos(filtroPesquisaArquivosDigitais);\n setArquivosAnexados(response);\n }\n }\n if (visible) buscarAnexos();\n }, [chaveModulo, filtroPesquisaArquivosDigitais, visible]);\n\n function onCloseModal() {\n onCancel();\n }\n\n function showAnexos() {\n const columns = [\n {\n title: 'Anexos',\n dataIndex: 'NomeArquivoDigital',\n key: 'NomeArquivoDigital',\n render: (text, record) => {\n return {\n children: (\n {\n if (record?.IsLinkAnexo) {\n window.open(record.LinkAnexo, '_blank');\n } else {\n fileManagerPaiDownload(record.UrlArquivoDigital);\n }\n }}\n >\n {text}\n \n ),\n props: {\n 'data-title': 'Anexos',\n },\n };\n },\n },\n {\n title: 'Ações',\n dataIndex: 'Acao',\n align: 'center',\n key: 'Acao',\n width: 100,\n render: (text, record) => {\n return {\n children: record?.IsLinkAnexo ? (\n {\n window.open(record.LinkAnexo, '_blank');\n }}\n />\n ) : (\n {\n fileManagerPaiDownload(record.UrlArquivoDigital);\n }}\n />\n ),\n props: {\n 'data-title': 'Ações',\n },\n };\n },\n },\n ];\n\n return (\n row.IdArquivoDigital || row.NomeArquivoDigital}\n pagination={false}\n scroll={{ x: 650 }}\n columns={columns}\n />\n );\n }\n\n return (\n \n \n \n );\n}\n\nexport default ArquivosForm;\n","import api from '~/services/api';\n\nasync function obterAnexos(params) {\n const response = await api.post(`ModuloArquivoDigital/arquivos`, params);\n\n return response.data;\n}\n\nexport { obterAnexos };\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React, { useState } from 'react';\nimport { Button, Tooltip, Icons, Table, FilterHeaderTable } from '~/components';\n\nimport { TIPO_COLUNA } from '~/modules/Helper/tipoColuna';\nimport { TIPO_VISAO } from '~/modules/Helper/tipo-visao';\nimport Footer from './Footer.component';\nimport ArquivoForm from './arquivos/arquivos.form.component';\n\nfunction TableDinamic({\n dataUltimaAtualizacao,\n moduloVisao,\n handleTableChange,\n configuracao,\n quantidadeRegistros,\n setQuantidadeRegistros,\n pagina,\n setPagina,\n modulo,\n visao,\n filtro,\n setFiltro,\n periodicidadeSelecionada,\n periodoSelecionado,\n exercicioSelecionado,\n colunaFiltroRedirecionaVisao,\n valorFiltroRedirecionaVisao,\n tipoValorFiltroRedirecionaVisao,\n redirecionarDetalheVisaoAnalitica,\n urlVisaoAnalitica,\n urlVisaoAgrupamento,\n listaColunaOrdem,\n obterValoresChavesPeriodicidadePorLinha,\n redirecionarVisaoAnalitica,\n redirecionarRastreabilidade,\n possuiArquivoDigital,\n exibirAnexos,\n filtroPesquisaArquivosDigitais,\n exibirArquivosForm,\n setFiltroPesquisaArquivosDigitais,\n setExibirArquivosForm,\n buscaAvancada,\n tableKey,\n setDataFilterHeader,\n dataFilterHeader,\n obterColunaChave,\n obterColunaLink,\n}) {\n function verificaAlinhamentoColuna(tipoValor) {\n if (tipoValor === TIPO_COLUNA.DECIMAL) {\n return 'right';\n }\n if (tipoValor === TIPO_COLUNA.LINK) {\n return 'center';\n }\n return 'left';\n }\n\n const BotaoLink = ({ value }) => {\n return (\n \n \n );\n };\n\n const BotaoArquivoAnexo = props => {\n return (\n \n }\n shape=\"circle\"\n onClick={() => exibirAnexos(props)}\n />\n \n );\n };\n\n const BotaoRedirecionarDetalheVisaoAnalitica = ({\n valoresChavesPeriodicidade,\n value,\n exercicio,\n mes,\n }) => {\n const dadosColuna = Object.values(valoresChavesPeriodicidade)[0].valor;\n\n return (\n 50\n ? 'top'\n : 'right'\n }\n >\n \n \n );\n };\n\n const BotaoRedirecionarRastreabilidade = ({ row, visaoColuna, value }) => {\n const valoresRow = Object.values(row);\n const valorRow = valoresRow.filter(\n valor => typeof valor === 'string' && valor.length > 50\n )[0];\n\n return (\n \n \n \n );\n };\n\n const BotaoRedirecionarVisaoAnalitica = ({ visaoColuna, value }) => {\n return (\n \n );\n };\n\n const TextoValorBoolean = ({ value }) => {\n return {value === true ? 'Sim' : 'Não'};\n };\n\n const TextoValorString = ({ value, maxLength }) => {\n return (\n \n {value?.length > maxLength\n ? `${value?.substring(0, maxLength)}...`\n : value}\n \n );\n };\n\n const Columns = ({ row, value, visaoColuna }) => {\n const valoresChavesPeriodicidade = obterValoresChavesPeriodicidadePorLinha(\n row\n );\n if (value !== null && value !== undefined && value !== '') {\n if (\n visaoColuna.ColunaLink &&\n (urlVisaoAnalitica || urlVisaoAgrupamento) &&\n configuracao.Tipo !== TIPO_VISAO.AGRUPAMENTO &&\n periodicidadeSelecionada\n ) {\n return (\n \n );\n }\n\n if (visaoColuna.Chave && configuracao.Tipo === TIPO_VISAO.AGRUPAMENTO) {\n return (\n \n );\n }\n\n if (\n visaoColuna.Rastreabilidade?.FonteDadosColunaLink ===\n visaoColuna.FonteDados\n ) {\n return (\n \n );\n }\n\n if (visaoColuna.TipoValor === TIPO_COLUNA.LINK) {\n return ;\n }\n\n if (visaoColuna.TipoValor === TIPO_COLUNA.BOOLEANO) {\n return ;\n }\n }\n\n return ;\n };\n\n function ordenacao(visaoColuna) {\n if (visaoColuna.TipoValor !== TIPO_COLUNA.LINK && visaoColuna.Ordenacao) {\n const ordenacao = listaColunaOrdem?.find(\n item => item.ColunaOrdem === visaoColuna.FonteDados\n );\n return {\n compare: (a, b) =>\n a[visaoColuna.FonteDados] - b[visaoColuna.FonteDados],\n multiple: ordenacao?.Ordem ?? visaoColuna.Ordenacao.Ordem,\n };\n }\n\n return visaoColuna.TipoValor !== TIPO_COLUNA.LINK;\n }\n\n function tipoOrdenacaoPadrao(visaoColuna) {\n const ordenacao = listaColunaOrdem?.find(\n item => item.ColunaOrdem === visaoColuna.FonteDados\n );\n\n if (ordenacao) return ordenacao.TipoOrdem;\n\n return null;\n }\n\n return (\n <>\n row.Id}\n pagination={false}\n scroll={{ x: 1100 }}\n onChange={handleTableChange}\n footer={() => (\n \n )}\n >\n {configuracao.VisaoColunas?.filter(\n visaoColuna => !visaoColuna?.OcultoGridPortal\n )?.map(visaoColuna => (\n (\n \n )}\n render={(value, row) => {\n return {\n children: (\n \n ),\n props: {\n 'data-title': visaoColuna.NomeColuna,\n },\n };\n }}\n />\n ))}\n\n {possuiArquivoDigital && configuracao.Tipo === TIPO_VISAO.ANALITICO ? (\n {\n return {\n children: ,\n props: {\n 'data-title': 'Anexos',\n },\n };\n }}\n />\n ) : (\n ''\n )}\n
\n {filtroPesquisaArquivosDigitais ? (\n {\n setFiltroPesquisaArquivosDigitais([]);\n setExibirArquivosForm(false);\n }}\n filtroPesquisaArquivosDigitais={filtroPesquisaArquivosDigitais}\n chaveModulo={modulo}\n />\n ) : (\n <>>\n )}\n >\n );\n}\n\nexport default TableDinamic;\n","/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable prefer-const */\nimport React from 'react';\nimport { Row, Col, Tooltip, Input, Select, Button, Icons } from '~/components';\nimport { TIPO_VISAO } from '~/modules/Helper/tipo-visao';\nimport { TIPO_COLUNA } from '~/modules/Helper/tipoColuna';\nimport { useUrls } from '~/contexts/url.context';\n\nconst { Search } = Input;\n\nfunction FiltroPeriodicidadeModuloDinamico({\n filtro,\n pagina,\n setPagina,\n configuracao,\n obterColunaChave,\n obterColunaLink,\n setFiltro,\n InputCarregando,\n periodicidadeSelecionada,\n setPeriocidadeSelecionada,\n listaPeriodicidades,\n periodoDesabilitado,\n periodoSelecionado,\n setPeriodoSelecionado,\n listaPeriodos,\n exercicioSelecionado,\n setExercicioSelecionado,\n listaExercicios,\n isFiltroAvancadoHabilitado,\n history,\n obterOrdenacaoPadrao,\n setDataFilterHeader,\n dataFilterHeader\n}) {\n const { empilhaUrl } = useUrls();\n const tiposValorString = [\n TIPO_COLUNA.TEXTO_50,\n TIPO_COLUNA.TEXTO_100,\n TIPO_COLUNA.LINK,\n TIPO_COLUNA.BOOLEANO,\n ];\n\n const tiposValorData = [TIPO_COLUNA.DATA];\n\n const tiposValorNumber = [TIPO_COLUNA.INTEIRO, TIPO_COLUNA.DECIMAL];\n\n function verificaTipoInputEPlaceholder() {\n let inputType = 'text';\n let textoPlaceholder = 'Filtro';\n if (configuracao && configuracao.VisaoColunas) {\n const visaoColuna =\n configuracao.Tipo === TIPO_VISAO.AGRUPAMENTO\n ? obterColunaChave()\n : obterColunaLink();\n\n if (visaoColuna) {\n const { TipoValor, NomeColuna } = visaoColuna;\n \n if (TipoValor) {\n if (tiposValorString.includes(TipoValor)) {\n inputType = 'text';\n } else if (tiposValorNumber.includes(TipoValor)) {\n inputType = 'number';\n } else if (tiposValorData.includes(TipoValor)) {\n inputType = 'date';\n }\n }\n\n textoPlaceholder = `Filtro por ${NomeColuna}`;\n }\n }\n\n return { inputType, textoPlaceholder };\n }\n\n const {\n inputType,\n textoPlaceholder\n } = verificaTipoInputEPlaceholder();\n\n function restaurarOrdenacao() {\n const colunaChave =\n configuracao?.Tipo === TIPO_VISAO.AGRUPAMENTO\n ? obterColunaChave()\n : obterColunaLink();\n\n if (colunaChave) obterOrdenacaoPadrao(colunaChave);\n\n let dataFilter = {\n ...dataFilterHeader,\n Filtros: null,\n };\n setDataFilterHeader(dataFilter);\n setFiltro([]);\n }\n\n return (\n \n \n \n 0 ? filtro[0]?.Valor : ''}\n type={inputType}\n onChange={event => {\n if (pagina !== 1) setPagina(1);\n\n const { FonteDados, TipoValor } =\n configuracao.Tipo === TIPO_VISAO.AGRUPAMENTO\n ? obterColunaChave()\n : obterColunaLink();\n\n setFiltro([\n {\n Campo: FonteDados,\n Valor: event.target.value,\n TipoValor,\n },\n ]);\n }}\n loading={InputCarregando}\n />\n \n \n\n {isFiltroAvancadoHabilitado &&\n configuracao?.Tipo === TIPO_VISAO.ANALITICO && (\n \n \n }\n onClick={() => {\n empilhaUrl(window.location.hash.split('#')[1]);\n history.push({ pathname: `${configuracao.Uri}/busca` });\n }}\n >\n Busca Avançada\n \n \n \n )}\n\n {configuracao?.Tipo === TIPO_VISAO.AGRUPAMENTO ||\n configuracao?.Tipo === TIPO_VISAO.ANALITICO ? (\n <>\n \n \n }\n onClick={() => restaurarOrdenacao()}\n >\n Restaurar Ordenação\n \n \n \n >\n ) : (\n \n )}\n\n {periodicidadeSelecionada && (\n <>\n \n \n \n \n \n\n \n \n \n \n \n\n \n \n \n \n \n >\n )}\n
\n );\n}\n\nexport default FiltroPeriodicidadeModuloDinamico;\n","/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable prefer-const */\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { createBrowserHistory } from 'history';\nimport { Row, ButtonGoBack } from '~/components';\nimport { parseToQueryString } from '~/modules/Helper/querystring-helper';\n\nimport { TIPO_VISAO } from '~/modules/Helper/tipo-visao';\nimport { MODO_VISAO } from '~/modules/Helper/modoVisao';\nimport { NUMERO_QUANTIDADE_REGISTROS } from '~/modules/Helper/numeroQuantidadeRegistros';\nimport { PARAMS_FILTERS_GRID } from '~/modules/Helper/searchParamsFilters';\nimport { getAndFormatSearchParams } from '~/modules/Helper/searchString-helper';\nimport { useUrls } from '~/contexts/url.context';\nimport * as ModuloVisaoService from './services/moduloVisao.service';\n\nimport Header from './components/Grid/Header.component';\nimport Totalizadores from './components/Totalizadores/Totalizadores.component';\nimport TableDinamic from './components/Grid/TableDinamic.component';\nimport FiltroPeriodicidadeModuloDinamico from './components/Grid/FiltroPeriodicidadeModuloDinamico.component';\n\nimport { useDebounce } from '../Helper/hooks/debounce.hook';\n\nimport { FILTRO_DEFAULT } from '../Helper/FiltrosPeriodicidade';\n\nfunction ModuloDinamicoPage({ match, history }) {\n const browserHistory = createBrowserHistory();\n\n const { empilhaUrl, obterUrlPaginaAnterior } = useUrls();\n\n const routeParams = new URLSearchParams(history.location.search);\n\n const periodicidadeParam = routeParams.get('periodicidade')?.toUpperCase();\n const periodoParam = routeParams.get('periodo')?.toUpperCase();\n const exercicioParam = Number(routeParams.get('exercicio'));\n const paginacaoGridParam = Number(routeParams.get('pagina'));\n const quantidadeRegistrosParam = routeParams.get('quantidaderegistros');\n\n const valorFiltroRedirecionaVisaoParam = routeParams.get(\n 'valorfiltroredirecionavisao'\n );\n\n const colunaFiltroRedirecionaVisaoParam = routeParams.get(\n 'colunafiltroredirecionavisao'\n );\n\n const tipoValorFiltroRedirecionaVisaoParam = routeParams.get(\n 'tipovalorfiltroredirecionavisao'\n );\n\n const listaColunaOrdemParam = JSON.parse(routeParams.get('listacolunaordem'));\n\n const [dataUltimaAtualizacao, setDataUltimaAtualizacao] = useState(null);\n const [configuracao, setConfiguracao] = useState(null);\n const [listaPeriodicidades, setListaPeriodicidades] = useState([]);\n const [listaPeriodos, setListaPeriodos] = useState([]);\n const [listaExercicios, setListaExercicios] = useState([]);\n const [possuiArquivoDigital, setPossuiArquivoDigital] = useState(false);\n const [moduloVisao, setModuloVisao] = useState(null);\n const [urlVisaoAnalitica, setUrlVisaoAnalitica] = useState(null);\n const [urlVisaoAgrupamento, setUrlVisaoAgrupamento] = useState(null);\n const [periodoDesabilitado, setPeriodoDesabilitado] = useState(false);\n const [InputCarregando, setInputCarregando] = useState(false);\n const [filtro, setFiltro] = useState([]);\n const filtroDebounce = useDebounce(filtro, 500);\n const [totalizadores, setTotalizadores] = useState([]);\n const [filtroDefault, setFiltroDefaultEnum] = useState();\n\n const [dataFilterHeader, setDataFilterHeader] = useState([]);\n\n // filtros da visão agrupamento\n const [\n colunaFiltroRedirecionaVisao,\n setColunaFiltroRedirecionaVisao,\n ] = useState(null);\n const [\n valorFiltroRedirecionaVisao,\n setValorFiltroRedirecionaVisao,\n ] = useState(null);\n const [\n tipoValorFiltroRedirecionaVisao,\n setTipoValorFiltroRedirecionaVisao,\n ] = useState(null);\n\n const [periodicidadeSelecionada, setPeriocidadeSelecionada] = useState(null);\n const [periodoSelecionado, setPeriodoSelecionado] = useState(null);\n const [exercicioSelecionado, setExercicioSelecionado] = useState(null);\n const [pagina, setPagina] = useState(1);\n const [quantidadeRegistros, setQuantidadeRegistros] = useState();\n const [listaColunaOrdem, setListaColunaOrdem] = useState([]);\n const [tableKey, setTableKey] = useState(Date.now());\n const [exibirArquivosForm, setExibirArquivosForm] = useState(false);\n const [\n filtroPesquisaArquivosDigitais,\n setFiltroPesquisaArquivosDigitais,\n ] = useState(null);\n const [isFiltroAvancadoHabilitado, setIsFiltroAvancadoHabiltado] = useState(\n false\n );\n\n const { modulo, visao } = match.params;\n const [chavesPeriodicidade, setChavesPeriodicidade] = useState([]);\n\n const obterVisaoColunas = propriedade => {\n return (\n configuracao?.VisaoColunas?.find(\n x => x.OcultoGridPortal !== true && x[propriedade] // A coluna OcultoGridPortal não deve ser utilizada\n ) || null\n );\n };\n\n const obterColunaChave = useCallback(() => {\n return (\n obterVisaoColunas('Chave') ||\n obterVisaoColunas('ChaveUnicaModulo') ||\n obterVisaoColunas('ColunaLink') ||\n configuracao?.VisaoColunas?.[0] ||\n null\n );\n }, [configuracao]);\n\n const obterChaveUnicaModulo = useCallback(() => {\n return obterVisaoColunas('ChaveUnicaModulo') || obterColunaChave();\n }, [configuracao, obterColunaChave]);\n\n const obterColunaLink = useCallback(() => {\n return obterVisaoColunas('ColunaLink') || obterChaveUnicaModulo();\n }, [configuracao, obterChaveUnicaModulo]);\n\n const obterOrdenacaoPadrao = useCallback(\n colunaChave => {\n const ordenacoes = configuracao.VisaoColunas?.map(item => {\n if (item.Ordenacao)\n return {\n ColunaOrdem: item.FonteDados,\n TipoOrdem: item.Ordenacao.TipoOrdenacao,\n Ordem: item.Ordenacao.Ordem,\n };\n return null;\n })?.filter(Boolean);\n\n if (ordenacoes?.length) setListaColunaOrdem(ordenacoes);\n else\n setListaColunaOrdem([\n {\n ColunaOrdem: colunaChave.FonteDados,\n TipoOrdem: 'ascend',\n Ordem: 1,\n },\n ]);\n\n setTableKey(Date.now());\n },\n [configuracao]\n );\n\n function handleTableChange(pagination, filters, sorter) {\n if (!Array.isArray(sorter))\n return setListaColunaOrdem([\n {\n ColunaOrdem: sorter.field,\n TipoOrdem: sorter.order,\n Ordem: 1,\n },\n ]);\n const maxOrdem = Math.max(...listaColunaOrdem?.map(item => item.Ordem));\n\n const novaListaOrdenacaoColuna = sorter?.map((s, index) => {\n const itemOrdenacao = listaColunaOrdem.find(\n (ordenacao, idx) =>\n s.columnKey === ordenacao.ColunaOrdem && index === idx\n );\n if (itemOrdenacao) {\n return {\n ...itemOrdenacao,\n TipoOrdem: s.order,\n };\n }\n return {\n ColunaOrdem: s.field,\n TipoOrdem: s.order,\n Ordem: maxOrdem ? maxOrdem + 1 : 1,\n };\n });\n\n setListaColunaOrdem(novaListaOrdenacaoColuna);\n }\n\n function obterValoresChavesPeriodicidadePorLinha(linhaGrid) {\n const valores = chavesPeriodicidade.map(colunaGrid => ({\n campo: colunaGrid.FonteDados,\n valor: linhaGrid[colunaGrid.FonteDados],\n tipo: colunaGrid.TipoValor,\n }));\n return valores;\n }\n\n const exibirAnexos = useCallback(row => {\n const colunasChave = configuracao?.VisaoColunas.filter(\n colunaGrid => colunaGrid.ChaveUnicaModulo\n );\n\n const chavePesquisa = {\n ChaveModulo: modulo,\n Chave: colunasChave.map(coluna => ({\n Campo: coluna.FonteDados,\n Valor: row[coluna.FonteDados],\n TipoValor: coluna.TipoValor,\n })),\n };\n\n setFiltroPesquisaArquivosDigitais(chavePesquisa);\n setExibirArquivosForm(true);\n });\n\n const validaPeriodicidade = useCallback(() => {\n if (!periodicidadeSelecionada) return false;\n\n const periodoAnualValido =\n periodicidadeSelecionada === 'ANUAL' && !periodoSelecionado;\n\n let periodoValidoParaPeriodicidade;\n if (periodicidadeSelecionada === null) {\n periodoValidoParaPeriodicidade = listaPeriodicidades;\n } else {\n periodoValidoParaPeriodicidade = listaPeriodicidades.some(\n p =>\n p.Id === periodicidadeSelecionada &&\n p.Periodos &&\n p.Periodos.length &&\n p.Periodos.some(x => x.Id === periodoSelecionado)\n );\n }\n\n return periodoAnualValido || periodoValidoParaPeriodicidade;\n }, [periodicidadeSelecionada, listaPeriodicidades, periodoSelecionado]);\n\n function redirecionarDetalheVisaoAnalitica(valoresChavesPeriodicidade) {\n let colunasPeriodicidadeCampoValor = {};\n\n valoresChavesPeriodicidade.forEach(item => {\n colunasPeriodicidadeCampoValor[item.campo] = item.valor;\n });\n\n const data = {\n exercicio: exercicioSelecionado,\n periodicidade: periodicidadeSelecionada,\n periodo: periodoSelecionado,\n\n ...colunasPeriodicidadeCampoValor,\n };\n\n const queryString = parseToQueryString(data);\n\n empilhaUrl(window.location.hash.split('#')[1]);\n\n history.push({\n pathname: `${urlVisaoAnalitica}/detalhevisao`,\n state: {\n pagina,\n quantidadeRegistros,\n colunaFiltroRedirecionaVisao,\n valorFiltroRedirecionaVisao,\n tipoValorFiltroRedirecionaVisao,\n listaColunaOrdem,\n filtro,\n },\n search: queryString,\n });\n }\n\n function redirecionarVisaoAnalitica(\n colunaSelecionada,\n valorSelecionada,\n tipoValorColunaSelecionada\n ) {\n setColunaFiltroRedirecionaVisao(colunaSelecionada);\n setValorFiltroRedirecionaVisao(valorSelecionada);\n setTipoValorFiltroRedirecionaVisao(tipoValorColunaSelecionada);\n\n empilhaUrl(window.location.hash.split('#')[1]);\n\n history.push({\n pathname: urlVisaoAnalitica,\n state: {\n colunaSelecionada,\n chaveSelecionada: valorSelecionada,\n tipoValorColunaSelecionada,\n exercicio: exercicioSelecionado,\n periodicidade: periodicidadeSelecionada,\n periodo: periodoSelecionado,\n quantidadeRegistros,\n valorFiltroRedirecionaVisao,\n tipoValorFiltroRedirecionaVisao,\n isFromAgrupamento: true,\n listacolunaordem: listaColunaOrdem\n ? JSON.stringify(listaColunaOrdem)\n : null,\n },\n });\n }\n\n async function redirecionarRastreabilidade(row, visaoRastreabilidade) {\n const rastreabilidade = {\n campo: visaoRastreabilidade.FonteDadosColunaDestino,\n valor: row[visaoRastreabilidade.FonteDadosColunaOrigem],\n tipo: visaoRastreabilidade.TipoValorColunaDestino,\n link: visaoRastreabilidade.LinkVisaoDestino,\n };\n\n empilhaUrl(window.location.hash.split('#')[1]);\n\n history.push({\n pathname: `${rastreabilidade.link}?${\n window.location.hash.split('#')[1]\n }&colunafiltroredirecionavisao=${\n rastreabilidade.campo\n }&valorfiltroredirecionavisao=${\n rastreabilidade.valor\n }&tipovalorfiltroredirecionavisao=${rastreabilidade.tipo}`,\n state: {\n colunaSelecionada: rastreabilidade.campo,\n chaveSelecionada: rastreabilidade.valor,\n tipoValorColunaSelecionada: rastreabilidade.tipo,\n exercicio: exercicioSelecionado,\n periodicidade: periodicidadeSelecionada,\n periodo: periodoSelecionado,\n quantidadeRegistros,\n valorFiltroRedirecionaVisao: null,\n tipoValorFiltroRedirecionaVisao: null,\n isFromAgrupamento: true,\n listacolunaordem: listaColunaOrdem\n ? JSON.stringify(listaColunaOrdem)\n : null,\n },\n });\n }\n\n function voltarPaginaAnterior() {\n if (configuracao.Tipo === TIPO_VISAO.AGRUPAMENTO) {\n history.push(`/`);\n }\n\n const { urlBase, queryParam } = obterUrlPaginaAnterior();\n\n if (urlBase && queryParam) {\n history.push({ pathname: urlBase, search: queryParam });\n } else {\n history.push(`/`);\n }\n }\n\n const buscaDadosGrid = useCallback(() => {\n if (!filtroDefault) return;\n\n if (\n filtroDefault !== FILTRO_DEFAULT.SEM_FILTRO &&\n (!validaPeriodicidade() || !exercicioSelecionado)\n ) {\n return;\n }\n\n if (!configuracao || !listaColunaOrdem?.length) {\n return;\n }\n const FiltroRedirecionaVisao = {\n Campo: colunaFiltroRedirecionaVisao,\n Valor: valorFiltroRedirecionaVisao,\n TipoValor: tipoValorFiltroRedirecionaVisao,\n };\n\n let mergeFiltro = [];\n let indexFiltro;\n if (dataFilterHeader?.Filtros && dataFilterHeader?.Filtros.length > 0) {\n mergeFiltro = dataFilterHeader.Filtros;\n\n if (filtroDebounce) {\n indexFiltro = mergeFiltro.findIndex(\n x => x.Campo == filtroDebounce[0]?.Campo\n );\n\n if (indexFiltro >= 0) {\n mergeFiltro = mergeFiltro.filter(\n item => item.Campo !== mergeFiltro[indexFiltro].Campo\n );\n }\n\n if (filtroDebounce.length > 0 && filtroDebounce[0].Valor !== '') {\n mergeFiltro.push(filtroDebounce[0]);\n }\n }\n\n if (filtroDebounce === -1 || filtroDebounce === undefined) {\n mergeFiltro = dataFilterHeader.Filtros;\n }\n } else {\n mergeFiltro =\n Array.isArray(dataFilterHeader?.Filtros) &&\n dataFilterHeader?.Filtros.length > 0\n ? dataFilterHeader?.Filtros\n : filtroDebounce;\n }\n\n let data = {\n ChaveModulo: modulo,\n NomeVisao: visao,\n Filtros: mergeFiltro,\n Periodicidade: periodicidadeSelecionada,\n Periodo: periodoSelecionado,\n Exercicio: exercicioSelecionado,\n Pagina: pagina,\n QuantidadeRegistros: quantidadeRegistros,\n Ordenacao: listaColunaOrdem,\n FiltroRedirecionaVisao,\n };\n const dataQueryString = {\n periodicidade: periodicidadeSelecionada,\n periodo: periodoSelecionado,\n exercicio: exercicioSelecionado,\n pagina,\n quantidaderegistros: quantidadeRegistros,\n colunafiltroredirecionavisao: colunaFiltroRedirecionaVisao,\n valorfiltroredirecionavisao: valorFiltroRedirecionaVisao,\n tipovalorfiltroredirecionavisao: tipoValorFiltroRedirecionaVisao,\n listacolunaordem: listaColunaOrdem\n ? JSON.stringify(listaColunaOrdem)\n : null,\n };\n const searchParams = getAndFormatSearchParams(\n dataQueryString,\n PARAMS_FILTERS_GRID\n );\n\n setDataFilterHeader(data);\n\n function filtrarModuloVisao(dataFiltro) {\n setInputCarregando(true);\n ModuloVisaoService.filtrar(dataFiltro)\n .then(res => {\n setModuloVisao(res.data);\n setInputCarregando(false);\n })\n .catch(() => {\n setModuloVisao({\n QuantidadePaginas: 0,\n QuantidadeRegistros: 0,\n Valores: [],\n });\n setInputCarregando(false);\n });\n }\n\n if (configuracao) {\n if (configuracao.ModoVisao === MODO_VISAO.GridVazia) {\n if (data?.Filtros.length > 0) {\n filtrarModuloVisao(data);\n } else {\n setModuloVisao({\n QuantidadePaginas: 0,\n QuantidadeRegistros: 0,\n Valores: [],\n });\n }\n return;\n }\n\n if (configuracao.ModoVisao === MODO_VISAO.Manutencao) {\n history.push(\n `/manutencao?visao=dinamico/${modulo}/${visao}&titulo=${configuracao.Titulo}`\n );\n } else {\n browserHistory.replace(\n `/#/dinamico/${modulo}/${visao}?${searchParams}`,\n history.location.state\n );\n filtrarModuloVisao(data);\n }\n }\n }, [\n valorFiltroRedirecionaVisao,\n colunaFiltroRedirecionaVisao,\n tipoValorFiltroRedirecionaVisao,\n periodoDesabilitado,\n exercicioSelecionado,\n filtroDebounce,\n modulo,\n pagina,\n periodicidadeSelecionada,\n periodoSelecionado,\n quantidadeRegistros,\n validaPeriodicidade,\n visao,\n listaColunaOrdem,\n configuracao,\n filtroDefault,\n ]);\n\n const obterConfiguracoes = useCallback(async () => {\n const responseConfiguracao = await ModuloVisaoService.obterConfiguracoes(\n modulo,\n visao\n );\n\n if (responseConfiguracao?.data) setConfiguracao(responseConfiguracao.data);\n }, [modulo, visao]);\n\n const obterExerciciosEVisaoAnalitica = useCallback(async () => {\n const responseConfiguracoesGerais = await ModuloVisaoService.obterConfiguracoesGerais(\n modulo\n );\n\n if (responseConfiguracoesGerais?.data) {\n const {\n NomeVisaoAnalitica,\n NomeVisaoAgrupamento,\n Exercicios,\n PossuiArquivoDigital,\n DataUltimaSicronizacaoModulo,\n Periodicidades,\n FiltroHabilitado,\n FiltroDefaultEnum,\n } = responseConfiguracoesGerais?.data;\n\n if (NomeVisaoAnalitica) setUrlVisaoAnalitica(NomeVisaoAnalitica);\n\n if (NomeVisaoAgrupamento) setUrlVisaoAgrupamento(NomeVisaoAgrupamento);\n\n if (DataUltimaSicronizacaoModulo)\n setDataUltimaAtualizacao(DataUltimaSicronizacaoModulo);\n\n if (FiltroHabilitado) setIsFiltroAvancadoHabiltado(FiltroHabilitado);\n\n if (FiltroDefaultEnum) setFiltroDefaultEnum(FiltroDefaultEnum);\n\n if (Exercicios?.length) {\n await setListaExercicios(Exercicios);\n\n const exercicioParamExisteArray = Exercicios.find(\n x => x.Exercicio === exercicioParam\n );\n\n await setExercicioSelecionado(\n exercicioParamExisteArray === undefined\n ? Exercicios[0].Exercicio\n : exercicioParam\n );\n }\n\n if (Periodicidades?.length) {\n await setListaPeriodicidades(Periodicidades);\n\n const periodicidadeDoParam = Periodicidades.find(\n x => x.Id === periodicidadeParam\n );\n\n await setPeriocidadeSelecionada(\n periodicidadeDoParam === undefined\n ? Periodicidades[0].Id\n : periodicidadeParam\n );\n }\n\n if (PossuiArquivoDigital !== null && PossuiArquivoDigital !== undefined)\n setPossuiArquivoDigital(PossuiArquivoDigital);\n }\n }, [modulo]);\n\n function setSearchParams() {\n setTipoValorFiltroRedirecionaVisao(\n tipoValorFiltroRedirecionaVisaoParam || null\n );\n setColunaFiltroRedirecionaVisao(colunaFiltroRedirecionaVisaoParam || null);\n setValorFiltroRedirecionaVisao(valorFiltroRedirecionaVisaoParam || null);\n setPeriodoSelecionado(periodoParam || null);\n setExercicioSelecionado(exercicioParam || null);\n setPagina(paginacaoGridParam || 1);\n setQuantidadeRegistros(\n NUMERO_QUANTIDADE_REGISTROS.includes(quantidadeRegistrosParam)\n ? quantidadeRegistrosParam\n : '10'\n );\n\n if (listaColunaOrdemParam?.length)\n setListaColunaOrdem(listaColunaOrdemParam);\n }\n\n function obterChavesPeriocidadeDaConfiguracao() {\n const colunasPeriodicidade = configuracao.ChavesPeriodicidades;\n\n setChavesPeriodicidade(arrayAnterior => [\n ...arrayAnterior,\n ...colunasPeriodicidade,\n ]);\n }\n\n const carregarPagina = useCallback(() => {\n if (visao !== urlVisaoAnalitica && visao !== urlVisaoAgrupamento) {\n setColunaFiltroRedirecionaVisao(null);\n setValorFiltroRedirecionaVisao(null);\n setTipoValorFiltroRedirecionaVisao(null);\n if (filtro?.length) {\n setFiltro([]);\n }\n } else if (history.location.state) {\n const {\n chaveSelecionada,\n colunaSelecionada,\n tipoValorColunaSelecionada,\n exercicio,\n periodicidade,\n periodo,\n tipoOrdem,\n isFromAgrupamento,\n // váriaveis com o mesmo nome já existem no escopo acima\n quantidadeRegistros: quantidadeRegistrosHistory,\n colunaFiltroRedirecionaVisao: colunaFiltroRedirecionaVisaoHistory,\n valorFiltroRedirecionaVisao: valorFiltroRedirecionaVisaoHistory,\n tipoValorFiltroRedirecionaVisao: tipoValorFiltroRedirecionaVisaoHistory,\n colunaOrdem: colunaOrdemHistory,\n filtro: filtroHistory,\n } = history.location.state;\n\n if (colunaFiltroRedirecionaVisaoHistory) {\n setColunaFiltroRedirecionaVisao(colunaFiltroRedirecionaVisaoHistory);\n } else {\n setColunaFiltroRedirecionaVisao(colunaSelecionada);\n }\n\n if (valorFiltroRedirecionaVisaoHistory) {\n setValorFiltroRedirecionaVisao(valorFiltroRedirecionaVisaoHistory);\n } else if (isFromAgrupamento) {\n setValorFiltroRedirecionaVisao(chaveSelecionada);\n }\n\n if (tipoValorFiltroRedirecionaVisaoHistory) {\n setTipoValorFiltroRedirecionaVisao(\n tipoValorFiltroRedirecionaVisaoHistory\n );\n } else {\n setTipoValorFiltroRedirecionaVisao(tipoValorColunaSelecionada);\n }\n\n setFiltro(filtroHistory);\n\n if (listaColunaOrdem && tipoOrdem) {\n setListaColunaOrdem([\n {\n ColunaOrdem: colunaOrdemHistory,\n TipoOrdem: tipoOrdem,\n },\n ]);\n }\n setExercicioSelecionado(exercicio);\n\n setPeriocidadeSelecionada(periodicidade);\n setPeriodoSelecionado(periodo);\n setQuantidadeRegistros(quantidadeRegistrosHistory || '10');\n\n // eslint-disable-next-line no-param-reassign\n history.location.state = null;\n }\n }, [history.location.state, urlVisaoAnalitica, urlVisaoAgrupamento, visao]);\n\n function desabilitarPeriodo() {\n setPeriodoDesabilitado(true);\n setPeriodoSelecionado(null);\n carregarPagina();\n }\n\n function configuraPeriodoPorTipoPeriodicidade() {\n setPeriodoDesabilitado(false);\n const exercicio = listaExercicios.find(\n ex => ex.Exercicio === exercicioSelecionado\n );\n\n if (exercicio) {\n const { IdsPeriodicidadePeriodoUltimoMes } = exercicio;\n\n if (IdsPeriodicidadePeriodoUltimoMes?.length) {\n const IdPeriodicidadePeriodoSelecionado = IdsPeriodicidadePeriodoUltimoMes.find(\n p => p.IdPeriodicidade === periodicidadeSelecionada\n );\n if (IdPeriodicidadePeriodoSelecionado?.IdPeriodo) {\n const periodoValido = listaPeriodicidades.some(\n e =>\n e.Id === periodicidadeSelecionada &&\n e.Periodos.some(p => p.Id === periodoSelecionado)\n );\n setPeriodoSelecionado(\n periodoValido\n ? periodoSelecionado\n : IdPeriodicidadePeriodoSelecionado.IdPeriodo\n );\n carregarPagina();\n }\n }\n }\n }\n\n function configuraPeriodo() {\n if (periodicidadeSelecionada === 'ANUAL') {\n desabilitarPeriodo();\n } else if (\n listaExercicios?.length &&\n exercicioSelecionado &&\n periodicidadeSelecionada\n ) {\n configuraPeriodoPorTipoPeriodicidade();\n }\n }\n\n // set exercicios, exercicio e visao analitica\n useEffect(() => {\n obterExerciciosEVisaoAnalitica();\n obterConfiguracoes();\n setSearchParams();\n }, [obterExerciciosEVisaoAnalitica, obterConfiguracoes]);\n\n // set ordem inicial\n useEffect(() => {\n const colunaChave =\n configuracao?.Tipo === 2 ? obterColunaChave() : obterColunaLink();\n\n if (colunaChave && !listaColunaOrdem?.length) {\n obterOrdenacaoPadrao(colunaChave);\n }\n if (configuracao) obterChavesPeriocidadeDaConfiguracao();\n }, [obterColunaLink, obterColunaChave, configuracao]);\n\n // set periodos\n useEffect(() => {\n if (listaPeriodicidades?.length && periodicidadeSelecionada) {\n const periodicidade = listaPeriodicidades.find(\n x => x.Id === periodicidadeSelecionada\n );\n\n setListaPeriodos(periodicidade?.Periodos || []);\n }\n }, [periodicidadeSelecionada, listaPeriodicidades]);\n\n // set periodo\n useEffect(() => {\n configuraPeriodo();\n }, [\n exercicioSelecionado,\n listaExercicios,\n carregarPagina,\n periodicidadeSelecionada,\n periodoSelecionado,\n urlVisaoAnalitica,\n urlVisaoAgrupamento,\n visao,\n listaPeriodicidades,\n configuracao,\n ]);\n\n // search da grid\n useEffect(() => {\n buscaDadosGrid();\n }, [buscaDadosGrid]);\n\n useEffect(() => {\n if (history.location.state?.pagina) {\n setPagina(history.location.state?.pagina);\n }\n }, [pagina]);\n\n const Grid = useMemo(() => {\n return configuracao?.VisaoColunas && moduloVisao?.Valores ? (\n \n ) : (\n <>>\n );\n }, [\n valorFiltroRedirecionaVisao,\n colunaFiltroRedirecionaVisao,\n listaColunaOrdem,\n configuracao,\n exercicioSelecionado,\n possuiArquivoDigital,\n filtro,\n modulo,\n moduloVisao,\n pagina,\n periodicidadeSelecionada,\n periodoSelecionado,\n quantidadeRegistros,\n urlVisaoAnalitica,\n urlVisaoAgrupamento,\n visao,\n filtroPesquisaArquivosDigitais,\n exibirArquivosForm,\n exibirAnexos,\n dataUltimaAtualizacao,\n ]);\n\n useEffect(() => {\n async function obterTotalizadores() {\n const FiltroRedirecionaVisao = {\n Campo: colunaFiltroRedirecionaVisao,\n Valor: valorFiltroRedirecionaVisao,\n TipoValor: tipoValorFiltroRedirecionaVisao,\n };\n\n const data = {\n ChaveModulo: modulo,\n NomeVisao: visao,\n Filtros: filtro,\n Periodicidade: periodicidadeSelecionada,\n Periodo: periodoSelecionado,\n Exercicio: exercicioSelecionado,\n FiltroRedirecionaVisao,\n };\n\n const ColunasTotalizadoras = await ModuloVisaoService.obterTotalizadores(\n data\n );\n\n setTotalizadores(ColunasTotalizadoras.data);\n }\n\n if (!validaPeriodicidade() || !exercicioSelecionado || !configuracao) {\n return;\n }\n\n obterTotalizadores();\n }, [\n colunaFiltroRedirecionaVisao,\n valorFiltroRedirecionaVisao,\n tipoValorFiltroRedirecionaVisao,\n modulo,\n visao,\n configuracao,\n filtroDebounce,\n periodicidadeSelecionada,\n periodoSelecionado,\n exercicioSelecionado,\n ]);\n\n return (\n <>\n \n\n {totalizadores?.length > 0 && (\n \n )}\n\n \n\n {Grid}\n\n \n \n
\n >\n );\n}\n\nconst ModuloDinamico = ({ history, match }) => {\n return (\n \n );\n};\n\nexport default ModuloDinamico;\n","import { useState, useEffect } from 'react';\n\nexport function useDebounce(text, delay) {\n const [debouncedValue, setDebouncedValue] = useState(text);\n\n useEffect(() => {\n const time = setTimeout(() => {\n setDebouncedValue(text);\n }, delay);\n\n return () => {\n clearTimeout(time);\n };\n }, [delay, text]);\n\n return debouncedValue;\n}\n","import styled from 'styled-components';\nimport { Input } from '~/components';\n\nconst { Search } = Input;\n\nexport const Row = styled.div`\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n`;\n\nexport const SearchTool = styled(Search)`\n margin-bottom: 8px;\n width: 50%;\n`;\n","import styled from 'styled-components';\nimport { Tree } from '~/components';\n\nexport const TreeTransparente = styled(Tree)`\n &&.draggable-tree {\n background: transparent !important;\n }\n\n .ant-tree-list-scrollbar-show {\n display: initial !important;\n }\n`;\n\nexport const LinkArquivo = styled.a`\n font-style: italic;\n margin-left: 5px;\n`;\n","import React, {\n useState,\n useEffect,\n forwardRef,\n useImperativeHandle,\n} from 'react';\nimport { useSelector } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport { Tree, Tooltip, Typography, Icons } from '~/components';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\nimport { TreeTransparente, LinkArquivo } from './styles';\nimport { iconEnum } from '~/modules/Helper/iconEnum';\nimport { ChooseIconFile } from '~/modules/Helper/chooseIconFile';\nimport RemoveDiacritic from '../../../hooks/removeDiacritic';\n\nconst TreeViewModuloFixo = forwardRef(\n ({ treeView, visao, setSearchValue }, ref) => {\n const { TreeNode } = Tree;\n const { corTema } = useSelector(state => state.configuration);\n const [expandedKeys, setExpandedKeys] = useState([]);\n const [autoExpandParent, setAutoExpandParent] = useState(true);\n const [treeData, setTreeData] = useState(treeView);\n\n useEffect(() => {\n setSearchValue('');\n setTreeData(treeView);\n }, [treeView]);\n\n const loop = data =>\n data.map(item => {\n if (\n (item.children && item.children.length) ||\n item.PrimeiroNivel\n ) {\n return (\n \n \n {item.title}\n \n >)\n :\n (<>\n \n \n {item.title}\n \n {item.ExibeDetalhes && (\n \n \n \n \n \n )}\n \n >)\n }\n >\n {loop(item.children)}\n \n );\n }\n const fileExtension = item?.Link?.split('.', 2)[1].toLowerCase();\n if (item.Externo) {\n return (\n x.name === `file-${ChooseIconFile(fileExtension)}`\n )\n ?.value({ fontSize: '20px' })\n }\n title={\n <>\n \n \n fileManagerPaiDownload(item.Link)}\n role=\"link\"\n tabIndex=\"0\"\n aria-hidden=\"true\"\n >\n {item.title}\n - Baixar Arquivo\n \n \n \n >\n }\n />\n );\n }\n return (\n \n fileManagerPaiDownload(item.Arquivo.Url)\n } />\n \n ) : (\n \n )\n }\n title={\n <>\n \n \n \n \n {item.title}\n \n \n \n \n >\n }\n />\n );\n });\n\n const toggleExpandNode = key => {\n setExpandedKeys(prev => {\n const outArr = [...prev];\n if (outArr.includes(key)) {\n return outArr.filter(e => e !== key);\n } else {\n outArr.push(key);\n return outArr;\n }\n });\n setAutoExpandParent(false);\n };\n\n const onExpand = keys => {\n setExpandedKeys(keys);\n setAutoExpandParent(false);\n };\n\n useImperativeHandle(ref, () => ({\n onSearch(busca) {\n const searchWithoutAccents = RemoveDiacritic(busca);\n if (searchWithoutAccents) {\n const hasMatchWord = string => {\n const stringWithoutAccents = RemoveDiacritic(string);\n return stringWithoutAccents?.indexOf(searchWithoutAccents) !== -1;\n };\n const filterData = arr =>\n arr?.filter(\n item =>\n hasMatchWord(item.title) || filterData(item.children)?.length\n );\n const filteredData = filterData(treeView).map(n => {\n return {\n ...n,\n children: filterData(n.children),\n };\n });\n\n const expandedKeys = filteredData?.map(dataItem => dataItem.key);\n\n setTreeData(filteredData);\n setExpandedKeys(expandedKeys);\n setAutoExpandParent(true);\n } else {\n setSearchValue('');\n setTreeData(treeView);\n setExpandedKeys([]);\n setAutoExpandParent(false);\n }\n },\n onChange(e) {\n setSearchValue(e.target.value);\n if (!e.target.value) {\n setExpandedKeys([]);\n setTreeData(treeView);\n }\n },\n }));\n\n return (\n <>\n (\n toggleExpandNode(record.key)}\n style={{ display: 'inline-block', width: '100%', height: '100%' }}\n >\n {record.title}\n \n )}\n >\n {loop(treeData)}\n \n >\n );\n }\n);\n\nexport default TreeViewModuloFixo;\n","import React, { createRef, useEffect, useState } from 'react';\nimport {\n InformacaoFilter,\n PageTitle,\n Card,\n ButtonGoBack,\n Exportacao,\n} from '~/components';\nimport { notification } from 'antd';\nimport { getUrlComDominio } from '~/modules/Helper/getUrl-helper';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\nimport * as S from './styles';\nimport TreeViewModuloFixo from '../components/treeViewModuloFixo.component';\nimport {\n getModuloFixoService,\n exportarVisao,\n} from '../services/moduloFixo.service';\n\nfunction ModuloFixo({ match, history }) {\n const [informacao, setInformacao] = useState({ __html: null });\n const [treeView, setTreeView] = useState([]);\n const [titulo, setTitulo] = useState(null);\n const [searchValue, setSearchValue] = useState('');\n const treeViewMethods = createRef({});\n const infoMethods = createRef({});\n\n const { modulo, visao } = match.params;\n\n useEffect(() => {\n async function getModuloFixo() {\n const response = await getModuloFixoService(modulo, visao);\n if (response && response.data) {\n setInformacao(response.data.Informacao);\n setTreeView(response.data.VisaoItens);\n setTitulo(response.data.Titulo);\n }\n }\n\n getModuloFixo();\n }, [modulo, visao]);\n\n function goBack() {\n history.push(`/`);\n }\n\n function onSearch(busca) {\n if (informacao?.Texto) infoMethods.current.filterElements(busca);\n if (treeView?.length > 0) treeViewMethods.current.onSearch(busca);\n }\n\n function onChange(e) {\n if (informacao?.Texto) infoMethods.current.onChangeInfo(e);\n if (treeView?.length > 0) treeViewMethods.current.onChange(e);\n }\n\n function exportar(tipoExportacao) {\n if (tipoExportacao === 'uri') {\n navigator.clipboard.writeText(window.location.href);\n notification.success({\n message: 'URI Copiada com Sucesso!',\n });\n } else {\n const dtoExportacao = {\n ChaveModulo: modulo,\n NomeVisao: visao,\n UrlExportacao: getUrlComDominio(),\n };\n\n exportarVisao(tipoExportacao, dtoExportacao).then(res => {\n fileManagerPaiDownload(res.data);\n });\n }\n }\n\n return (\n <>\n \n onSearch(busca)}\n onChange={e => onChange(e)}\n allowClear\n value={searchValue}\n />\n {informacao?.Texto && (\n <>\n \n >\n )}\n {treeView?.length > 0 && (\n <>\n \n \n \n >\n )}\n \n \n \n \n >\n );\n}\n\nexport default ModuloFixo;\n","import api from '~/services/api';\n\nfunction getModuloFixoService(modulo, visao) {\n return api.get(`modulovisao/fixo/${modulo}/${visao}`);\n}\n\nasync function exportarVisao(tipoExportacao, data) {\n return api.post(`modulovisao/fixo/${tipoExportacao}`, data);\n}\n\nexport { getModuloFixoService, exportarVisao };\n","import api from '~/services/api';\n\nfunction getPeriodoDetalheVisaoAnaliticaService(\n exercicio,\n periodicidade,\n periodo\n) {\n let params = {};\n if (periodo) params.periodo = periodo;\n\n return api.get(\n `detalhevisaoanalitica/periodos/${exercicio}/${periodicidade}`,\n { params }\n );\n}\n\nfunction getDetalheVisaoAnaliticaService(detalheVisaoAnalitica) {\n return api.post('detalhevisaoanalitica/filter', detalheVisaoAnalitica);\n}\n\nfunction exportarDetalheVisao(tipoExportacao, data) {\n return api.post(`detalhevisaoanalitica/exportar/${tipoExportacao}`, data);\n}\n\nexport {\n getDetalheVisaoAnaliticaService,\n getPeriodoDetalheVisaoAnaliticaService,\n exportarDetalheVisao,\n};\n","import styled from 'styled-components';\nimport { Button } from '~/components';\n\nexport const NextPrevButton = styled.div`\n font-size: ${({ theme }) => `${20 + 2 * theme.zoomFonte}px`};\n border-radius: 3px;\n cursor: pointer;\n padding: 8px;\n :hover {\n background-color: #dedede;\n transition: 0.2s;\n }\n\n -webkit-touch-callout: none; /* iOS Safari */\n -webkit-user-select: none; /* Safari */\n -khtml-user-select: none; /* Konqueror HTML */\n -moz-user-select: none; /* Old versions of Firefox */\n -ms-user-select: none; /* Internet Explorer/Edge */\n user-select: none; /* Non-prefixed version, currently\n supported by Chrome, Edge, Opera and Firefox */\n`;\n\nexport const ButtonArquivoDigital = styled(Button)`\n font-size: ${({ theme }) => `${14 + 2 * theme.zoomFonte}px`};\n padding-left: 0px;\n word-wrap: anywhere;\n white-space: normal;\n text-align: left;\n`;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { useMediaQuery } from 'react-responsive';\nimport { Col, Row, Icons, Typography, Divider } from '~/components';\nimport { NextPrevButton } from './style';\n\nfunction PeriodicidadeNavigation({\n previous,\n previousFunction,\n next,\n nextFunction,\n current,\n}) {\n const corTema = useSelector(state => state.configuration.corTema);\n const isMobile = useMediaQuery({ query: '(max-width: 900px)' });\n\n return (\n <>\n {isMobile ? (\n <>\n \n \n \n \n {` ${previous} `}\n \n \n\n \n \n {`${next} `}\n \n \n \n
\n \n \n \n {`${current}`}\n \n \n
\n >\n ) : (\n <>\n \n \n \n \n {` ${previous} `}\n \n \n \n \n {`${current}`}\n \n \n \n \n {`${next} `}\n \n \n \n
\n >\n )}\n\n \n >\n );\n}\n\nexport default PeriodicidadeNavigation;\n","export const TIPO_DETALHE = {\n CAMPO: 1,\n TOTAL: 2,\n CAMPO_TOTAL: 3,\n};\n","/* eslint-disable react/no-array-index-key */\nimport React from 'react';\nimport { Row, Col, Typography, Card } from '~/components';\nimport { TIPO_DETALHE } from '~/modules/Helper/tipoDetalheAnalitica';\n\nfunction Tabelas({ detalheVisaoAnalitica }) {\n const CamposGrid = ({ coluna, fonte, fundo, index }) => {\n const gridStyle = {\n width: '100%',\n background: fundo,\n gridColumn: index === 0 ? 1 : 'unset',\n };\n\n const TextoValorBoolean = ({ valor }) => {\n return valor === true ? 'Sim' : 'Não';\n };\n\n const { Descricao, Valor } = coluna;\n\n return (\n \n \n
\n \n {Descricao}:\n \n
\n
\n \n {typeof Valor === 'boolean' ? (\n \n ) : (\n Valor\n )}\n \n
\n
\n \n );\n };\n\n const Grid = ({ tabela }) => {\n switch (tabela.Tipo) {\n case TIPO_DETALHE.CAMPO:\n return (\n \n \n \n {tabela.Grupo.Colunas.map((coluna, index) => (\n \n ))}\n \n \n
\n );\n case TIPO_DETALHE.TOTAL:\n return (\n \n \n \n \n \n {tabela.Coluna.Descricao}:\n \n \n {tabela.Coluna.Valor}\n \n \n \n \n
\n );\n case TIPO_DETALHE.CAMPO_TOTAL:\n return (\n <>\n \n \n \n {tabela.Grupo.Colunas.map((coluna, index) => (\n \n ))}\n \n \n \n {tabela.Coluna.Descricao}:\n \n\n \n {tabela.Coluna.Valor}\n \n \n \n
\n >\n );\n default:\n return <>>;\n }\n };\n\n return (\n <>\n {detalheVisaoAnalitica.Dados.map((tabela, index) => (\n \n ))}\n >\n );\n}\n\nexport default Tabelas;\n","import React from 'react';\nimport { Row, Col, Card, Typography } from '~/components';\nimport { ButtonArquivoDigital } from './style';\n\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\nimport ButtonDownloadFileManager from '~/modules/Modulos/components/Grid/arquivos/ButtonDowloadFileManager';\nimport ButtonLinkAnexo from '~/modules/Modulos/components/Grid/arquivos/ButtonLinkAnexo';\n\nfunction listaAnexos({ anexos }) {\n return (\n \n \n Ações\n }\n >\n {anexos.length > 0\n ? anexos.map(arquivo => (\n \n \n {\n if (arquivo?.IsLinkAnexo) {\n window.open(arquivo.LinkAnexo, '_blank');\n } else {\n fileManagerPaiDownload(arquivo.UrlArquivoDigital);\n }\n }}\n type=\"link\"\n block\n >\n {arquivo.NomeArquivoDigital}\n \n \n \n {arquivo?.IsLinkAnexo ? (\n {\n window.open(arquivo.LinkAnexo, '_blank');\n }}\n />\n ) : (\n {\n fileManagerPaiDownload(arquivo.UrlArquivoDigital);\n }}\n />\n )}\n \n
\n ))\n : 'Não há anexos disponíveis.'}\n \n \n
\n );\n}\n\nexport default listaAnexos;\n","/* eslint-disable prefer-const */\n/* eslint-disable no-else-return */\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport { notification } from 'antd';\nimport { createBrowserHistory } from 'history';\nimport {\n Col,\n Row,\n Card,\n Typography,\n Exportacao,\n ButtonGoBack,\n} from '~/components';\nimport {\n getDetalheVisaoAnaliticaService,\n getPeriodoDetalheVisaoAnaliticaService,\n exportarDetalheVisao,\n} from '../services/detalheVisaoAnalitica.service';\nimport { useUrls } from '~/contexts/url.context';\n\nimport PeriodicidadeNavigation from '../components/periodicidadeNavigation.component';\nimport Tabela from '../components/Tabela.component';\nimport ListaAnexos from '../components/listaAnexos.component';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\nimport { UltimaAtualizacao } from '~/modules/Modulos/components/Grid/UltimaAtualizacao.component';\nimport { PARAMS_FILTERS_DETALHE } from '~/modules/Helper/searchParamsFilters';\nimport { getAndFormatSearchParams } from '~/modules/Helper/searchString-helper';\nimport { getUrlComDominio } from '~/modules/Helper/getUrl-helper';\nimport {\n obterConfiguracoes,\n obterConfiguracoesGerais,\n} from '~/modules/Modulos/services/moduloVisao.service';\n\nfunction DetalheVisaoAnalitica({ match, history }) {\n const [detalheVisaoAnalitica, setDetalheVisaoAnalitica] = useState({\n Titulo: undefined,\n Descricao: undefined,\n Dados: undefined,\n Anexos: [],\n });\n\n const { obterUrlPaginaAnterior } = useUrls();\n\n const [periodoAnterior, setPeriodoAnterior] = useState(null);\n const [periodoPosterior, setPeriodoPosterior] = useState(null);\n const [periodoAtual, setPeriodoAtual] = useState(null);\n const [exercicioAnterior, setExercicioAnterior] = useState(null);\n const [exercicioPosterior, setExercicioPosterior] = useState(null);\n const [exercicioAtual, setExercicioAtual] = useState(null);\n const [dataUltimaAtualizacao, setDataUltimaAtualizacao] = useState(null);\n const [filtroAnterior, setFiltroAnterior] = useState(null);\n\n const { modulo, visao } = match.params;\n\n const [exercicioFilter, setExercicioFilter] = useState(undefined);\n const [periodicidadeFilter, setPeriodicidadeFilter] = useState(undefined);\n\n // filtros da visão agrupamento\n const [\n colunaFiltroRedirecionaVisao,\n setColunaFiltroRedirecionaVisao,\n ] = useState(undefined);\n const [\n valorFiltroRedirecionaVisao,\n setValorFiltroRedirecionaVisao,\n ] = useState(undefined);\n const [\n tipoValorFiltroRedirecionaVisao,\n setTipoValorFiltroRedirecionaVisao,\n ] = useState(null);\n\n const [periodoFilter, setPeriodoFilter] = useState(undefined);\n const [chavesPeriodicidade, setChavesPeriodicidade] = useState([]);\n const [configuracao, setConfiguracao] = useState(null);\n const [pagina, setPagina] = useState(1);\n const [quantidadeRegistros, setQuantidadeRegistros] = useState(10);\n const [colunaOrdem, setColunaOrdem] = useState(null);\n\n const browserHistory = createBrowserHistory();\n\n const [queryParamsDefault, setQueryParamsDefault] = useState(\n PARAMS_FILTERS_DETALHE\n );\n\n const corTema = useSelector(state => state.configuration.corTema);\n\n async function obterDetalheVisao(detalheVisao) {\n try {\n const response = await getDetalheVisaoAnaliticaService(detalheVisao);\n setDetalheVisaoAnalitica(response.data);\n } catch (ex) {\n setDetalheVisaoAnalitica({ ...detalheVisaoAnalitica, Dados: [] });\n }\n }\n\n async function obterPeriodoDetalheVisaoAnalitica(\n exercicio,\n periodicidade,\n periodo\n ) {\n const responsePeriodo = await getPeriodoDetalheVisaoAnaliticaService(\n exercicio,\n periodicidade,\n periodo\n );\n\n if (responsePeriodo?.data?.PeriodoAnterior)\n setPeriodoAnterior(responsePeriodo.data.PeriodoAnterior);\n if (responsePeriodo?.data?.PeriodoAtual)\n setPeriodoAtual(responsePeriodo.data.PeriodoAtual);\n if (responsePeriodo?.data?.PeriodoPosterior)\n setPeriodoPosterior(responsePeriodo.data.PeriodoPosterior);\n if (responsePeriodo?.data?.ExercicioAnterior)\n setExercicioAnterior(responsePeriodo.data.ExercicioAnterior);\n if (responsePeriodo?.data?.ExercicioAtual)\n setExercicioAtual(responsePeriodo.data.ExercicioAtual);\n if (responsePeriodo?.data?.ExercicioPosterior)\n setExercicioPosterior(responsePeriodo.data.ExercicioPosterior);\n\n const detalheVisao = {\n ChaveModulo: modulo,\n Exercicio: exercicio,\n Periodicidade: periodicidade,\n Periodo: periodo,\n ChavesPeriodicidade: chavesPeriodicidade,\n };\n\n if (configuracao && configuracao.VisaoColunas) {\n const { VisaoColunas } = configuracao;\n const visaoColuna = VisaoColunas.find(x => x.Chave);\n if (visaoColuna) {\n const { TipoValor } = visaoColuna;\n if (TipoValor) {\n detalheVisao.TipoValor = TipoValor;\n }\n }\n }\n\n obterDetalheVisao(detalheVisao);\n\n let queryParamData = {\n chaveModulo: modulo,\n exercicio,\n periodicidade,\n periodo,\n };\n\n chavesPeriodicidade.forEach(item => {\n queryParamData[item.Campo] = item.Valor;\n });\n\n const searchParams = getAndFormatSearchParams(\n queryParamData,\n queryParamsDefault\n );\n\n browserHistory.replace(\n `/#/dinamico/${modulo}/${visao}/detalhevisao?${searchParams}`,\n history.location.state\n );\n }\n\n const getPeriodo = useCallback(\n async (exercicio, periodicidade, periodo) => {\n const [responsePeriodo, responseConfiguracao] = await Promise.all([\n getPeriodoDetalheVisaoAnaliticaService(\n exercicio,\n periodicidade,\n periodo\n ),\n obterConfiguracoes(modulo, visao),\n ]);\n\n if (responseConfiguracao.data) setConfiguracao(responseConfiguracao.data);\n if (responsePeriodo?.data?.PeriodoAnterior)\n setPeriodoAnterior(responsePeriodo.data.PeriodoAnterior);\n if (responsePeriodo?.data?.PeriodoAtual)\n setPeriodoAtual(responsePeriodo.data.PeriodoAtual);\n if (responsePeriodo?.data?.PeriodoPosterior)\n setPeriodoPosterior(responsePeriodo.data.PeriodoPosterior);\n if (responsePeriodo?.data?.ExercicioAnterior)\n setExercicioAnterior(responsePeriodo.data.ExercicioAnterior);\n if (responsePeriodo?.data?.ExercicioAtual)\n setExercicioAtual(responsePeriodo.data.ExercicioAtual);\n if (responsePeriodo?.data?.ExercicioPosterior)\n setExercicioPosterior(responsePeriodo.data.ExercicioPosterior);\n\n const params = new URLSearchParams(history.location.search);\n\n const ChavesPeriodicidade = responseConfiguracao.data.ChavesPeriodicidades.map(\n item => {\n const { TipoValor, FonteDados } = item;\n const Valor = params.get(FonteDados);\n\n return {\n Campo: FonteDados,\n Valor,\n TipoValor,\n };\n }\n );\n\n const campos = ChavesPeriodicidade.map(x => x.Campo);\n\n setQueryParamsDefault([...queryParamsDefault, ...campos]);\n\n setChavesPeriodicidade(ChavesPeriodicidade);\n\n const detalheVisao = {\n ChaveModulo: modulo,\n Exercicio: exercicio,\n Periodicidade: periodicidade,\n Periodo: periodo,\n ChavesPeriodicidade,\n };\n\n if (\n responseConfiguracao &&\n responseConfiguracao.data &&\n responseConfiguracao.data.VisaoColunas\n ) {\n const { VisaoColunas } = responseConfiguracao.data;\n const visaoColuna = VisaoColunas.find(x => x.Chave);\n if (visaoColuna) {\n const { TipoValor } = visaoColuna;\n if (TipoValor) {\n detalheVisao.TipoValor = TipoValor;\n }\n }\n }\n\n obterDetalheVisao(detalheVisao);\n },\n [modulo, visao]\n );\n\n async function obterDataUltimaAlteracao() {\n const response = await obterConfiguracoesGerais(modulo);\n\n if (response?.data?.DataUltimaSicronizacaoModulo)\n setDataUltimaAtualizacao(response.data.DataUltimaSicronizacaoModulo);\n }\n\n useEffect(() => {\n setPagina(history.location.state?.pagina);\n setQuantidadeRegistros(history.location.state?.quantidadeRegistros);\n setColunaFiltroRedirecionaVisao(\n history.location.state?.colunaFiltroRedirecionaVisao\n );\n setValorFiltroRedirecionaVisao(\n history.location.state?.valorFiltroRedirecionaVisao\n );\n setTipoValorFiltroRedirecionaVisao(\n history.location.state?.tipoValorFiltroRedirecionaVisao\n );\n\n setColunaOrdem({\n colunaOrdem: history.location.state?.colunaOrdem,\n tipoOrdem: history.location.state?.tipoOrdem,\n });\n setFiltroAnterior(history.location.state?.filtro);\n }, []);\n\n useEffect(() => {\n if (modulo) obterDataUltimaAlteracao();\n }, [modulo]);\n\n useEffect(() => {\n const params = new URLSearchParams(history.location.search);\n\n const exercicio = Number(params.get('exercicio'));\n const periodicidade = params.get('periodicidade')?.toUpperCase();\n const periodo = params.get('periodo')?.toUpperCase();\n\n setExercicioFilter(exercicio);\n setPeriodicidadeFilter(periodicidade);\n\n setPeriodoFilter(periodo);\n\n getPeriodo(exercicio, periodicidade, periodo);\n }, [getPeriodo, history.location.search, modulo, visao]);\n\n function obterAnterior() {\n if (periodoAnterior) {\n obterPeriodoDetalheVisaoAnalitica(\n periodoAnterior.Exercicio,\n periodicidadeFilter,\n periodoAnterior.Valor\n );\n } else {\n obterPeriodoDetalheVisaoAnalitica(\n exercicioAnterior,\n periodicidadeFilter,\n null\n );\n }\n }\n\n function obterProximo() {\n if (periodoPosterior) {\n obterPeriodoDetalheVisaoAnalitica(\n periodoPosterior.Exercicio,\n periodicidadeFilter,\n periodoPosterior.Valor\n );\n } else {\n obterPeriodoDetalheVisaoAnalitica(\n exercicioPosterior,\n periodicidadeFilter,\n null\n );\n }\n }\n\n function exportar(tipoExportacao) {\n let payload = {\n ChaveModulo: modulo,\n Exercicio: exercicioFilter,\n Periodicidade: periodicidadeFilter,\n Periodo: periodoAtual?.Valor,\n ChavesPeriodicidade: chavesPeriodicidade,\n UrlExportacao: getUrlComDominio(),\n };\n\n if (configuracao && configuracao.VisaoColunas) {\n const { VisaoColunas } = configuracao;\n const visaoColuna = VisaoColunas.find(x => x.Chave);\n if (visaoColuna) {\n const { TipoValor } = visaoColuna;\n payload = { ...payload, TipoValor };\n }\n }\n\n if (tipoExportacao === 'uri') {\n navigator.clipboard.writeText(window.location.href);\n notification.success({\n message: 'URI Copiada com Sucesso!',\n });\n } else {\n exportarDetalheVisao(tipoExportacao, payload).then(res => {\n fileManagerPaiDownload(res.data);\n });\n }\n }\n\n const tituloVisaoAnalitica = () => {\n if (periodoAtual)\n return `${periodoAtual.Descricao}/${periodoAtual.Exercicio}`;\n else if (exercicioAtual) return exercicioAtual;\n else return '';\n };\n\n const tituloVisaoAnaliticaPosterior = () => {\n if (periodoPosterior)\n return `${periodoPosterior.Descricao}/${periodoPosterior.Exercicio}`;\n else if (exercicioPosterior) return exercicioPosterior;\n else return '';\n };\n\n const tituloVisaoAnaliticaAnterior = () => {\n if (periodoAnterior)\n return `${periodoAnterior.Descricao}/${periodoAnterior.Exercicio}`;\n else if (exercicioAnterior) return exercicioAnterior;\n else return '';\n };\n\n function voltarPaginaAnterior() {\n const { urlBase, queryParam } = obterUrlPaginaAnterior();\n if (urlBase && queryParam) {\n history.push({ pathname: urlBase, search: queryParam });\n } else {\n history.push({\n pathname: `/dinamico/${modulo}/${visao}`,\n state: {\n pagina,\n periodicidade: periodicidadeFilter,\n exercicio: exercicioFilter,\n periodo: periodoFilter,\n quantidadeRegistros,\n valorFiltroRedirecionaVisao,\n colunaFiltroRedirecionaVisao,\n tipoValorFiltroRedirecionaVisao,\n colunaOrdem: colunaOrdem.colunaOrdem,\n tipoOrdem: colunaOrdem.tipoOrdem,\n filtro: filtroAnterior,\n },\n });\n }\n }\n\n return (\n <>\n \n \n {detalheVisaoAnalitica.Descricao}\n \n\n \n {detalheVisaoAnalitica.Titulo}\n \n\n {detalheVisaoAnalitica.Dados && detalheVisaoAnalitica.Dados.length > 0 ? (\n <>\n \n \n \n \n \n \n \n {dataUltimaAtualizacao && (\n \n )}\n \n \n \n \n
\n \n \n
\n >\n ) : (\n detalheVisaoAnalitica.Dados &&\n detalheVisaoAnalitica.Dados.length === 0 && (\n \n Não há dados para este período.\n \n )\n )}\n\n \n \n
\n >\n );\n}\n\nexport default DetalheVisaoAnalitica;\n","export const TIPO_FILTRO = {\n TEXTO: 1,\n OPCOES: 2,\n};\n","import styled from 'styled-components';\nimport { Divider } from 'antd';\n\nexport const StyledDivider = styled(Divider)`\n &&.ant-divider-horizontal.ant-divider-with-text-left::before {\n width: 0px;\n }\n && .ant-divider-inner-text {\n padding: 0 1em 0 0.5em;\n }\n`;\n","import React, { useState, useEffect } from 'react';\nimport {\n Tooltip,\n Col,\n RangePickerComponent,\n FormV3 as Form,\n Input,\n InputNumber,\n Select,\n} from '~/components';\n\nimport { TIPO_COLUNA } from '~/modules/Helper/tipoColuna';\nimport { TIPO_FILTRO } from '~/modules/Helper/tipoFiltro';\nimport transformaDataParaAmericano from '../../../Helper/transformaDataParaAmericano-helper';\n\nimport * as S from './FiltrosAvancados.styled';\n\nfunction FiltrosAccordion({ filtros, form, paramsFiltros, handlePesquisa }) {\n const { getFieldDecorator, setFieldsValue } = form;\n const [filtrosTransformados, setFiltrosTransformados] = useState([]);\n\n function fazerPesquisaParams(){\n if (paramsFiltros.length > 0) {\n const objetoForm = {};\n\n paramsFiltros.forEach(element => {\n objetoForm[`${element.Campo}`] = {\n Campo: element.Campo,\n Valor: element.Valor,\n TipoValor: element.TipoValor,\n };\n\n setFieldsValue(objetoForm);\n });\n\n handlePesquisa();\n }\n }\n\n async function setValoresDoInputComoObjeto(coluna, event, isParam) {\n let valor = event;\n\n let dataFormatada;\n\n if (coluna.TipoValor === TIPO_COLUNA.DATA) {\n if (valor[0] !== '' && valor[1] !== '') {\n valor = transformaDataParaAmericano(valor);\n dataFormatada = `${valor[0]},${valor[1]}`;\n }\n }\n\n if (\n coluna.TipoFiltro === TIPO_FILTRO.TEXTO &&\n coluna.TipoValor !== TIPO_COLUNA.DATA &&\n !isParam\n ) {\n valor = valor.target.value;\n\n if (coluna.TipoValor === TIPO_COLUNA.DECIMAL || TIPO_COLUNA.INTEIRO) {\n valor = valor.replace(',', '.');\n }\n }\n\n const objetoForm = {};\n\n objetoForm[`${coluna.FonteDados}`] = {\n Campo: coluna.FonteDados,\n Valor: coluna.TipoValor === TIPO_COLUNA.DATA ? dataFormatada : valor,\n TipoValor: coluna.TipoValor,\n };\n\n if (coluna.TipoValor === TIPO_COLUNA.DATA && dataFormatada === undefined) {\n objetoForm[`${coluna.FonteDados}`] = undefined;\n }\n\n if (coluna.TipoValor === TIPO_FILTRO.OPCOES && valor === '') {\n objetoForm[`${coluna.FonteDados}`] = undefined;\n }\n\n await setFieldsValue(objetoForm);\n }\n\n function renderizaInputTexto(coluna) {\n return (\n \n {\n setValoresDoInputComoObjeto(coluna, event);\n }}\n >\n \n {getFieldDecorator(coluna.FonteDados)(\n \n )}\n \n \n \n );\n }\n\n function renderizaInputNumero(coluna) {\n return (\n \n {\n setValoresDoInputComoObjeto(coluna, event);\n }}\n >\n \n {getFieldDecorator(coluna.FonteDados)(\n \n )}\n \n \n \n );\n }\n\n function renderizaInputData(coluna) {\n return (\n \n \n \n {getFieldDecorator(coluna.FonteDados)(\n {\n setValoresDoInputComoObjeto(coluna, dateString);\n }}\n />\n )}\n \n \n \n );\n }\n\n function renderizaSelect(coluna) {\n return (\n \n \n \n {getFieldDecorator(coluna.FonteDados)(\n \n )}\n \n \n \n );\n }\n\n function renderizaSelectBooleano(coluna) {\n return (\n \n \n \n {getFieldDecorator(coluna.FonteDados)(\n \n )}\n \n \n \n );\n }\n\n function transformaColunaEmInput(filtrosModulo) {\n setFiltrosTransformados([]);\n filtrosModulo.Grupos.forEach(grupo => {\n setFiltrosTransformados(arrayFiltros => [\n ...arrayFiltros,\n \n {grupo.Nome}\n ,\n ]);\n\n grupo.Colunas.forEach(coluna => {\n if (\n coluna.TipoFiltro === TIPO_FILTRO.TEXTO &&\n coluna.TipoValor !== TIPO_COLUNA.DATA &&\n coluna.TipoValor !== TIPO_COLUNA.INTEIRO &&\n coluna.TipoValor !== TIPO_COLUNA.DECIMAL\n ) {\n setFiltrosTransformados(arrayFiltros => [\n ...arrayFiltros,\n renderizaInputTexto(coluna),\n ]);\n } else if (\n (coluna.TipoFiltro === TIPO_FILTRO.TEXTO &&\n coluna.TipoValor === TIPO_COLUNA.INTEIRO) ||\n coluna.TipoValor === TIPO_COLUNA.DECIMAL\n ) {\n setFiltrosTransformados(arrayFiltros => [\n ...arrayFiltros,\n renderizaInputNumero(coluna),\n ]);\n }\n\n if (\n coluna.TipoFiltro === TIPO_FILTRO.TEXTO &&\n coluna.TipoValor === TIPO_COLUNA.DATA\n ) {\n setFiltrosTransformados(arrayFiltros => [\n ...arrayFiltros,\n renderizaInputData(coluna),\n ]);\n }\n\n if (\n coluna.TipoFiltro === TIPO_FILTRO.OPCOES &&\n coluna.TipoValor === TIPO_COLUNA.BOOLEANO\n ) {\n setFiltrosTransformados(arrayFiltros => [\n ...arrayFiltros,\n renderizaSelectBooleano(coluna),\n ]);\n } else if (coluna.TipoFiltro === TIPO_FILTRO.OPCOES) {\n setFiltrosTransformados(arrayFiltros => [\n ...arrayFiltros,\n renderizaSelect(coluna),\n ]);\n }\n });\n });\n }\n\n useEffect(() => {\n fazerPesquisaParams();\n }, [paramsFiltros]);\n\n useEffect(() => {\n if (filtros) transformaColunaEmInput(filtros);\n }, [filtros, paramsFiltros]);\n\n return <>{filtrosTransformados}>;\n}\n\nexport default FiltrosAccordion;\n","export default function transformaDataParaAmericano(datas) {\n const dataFormatada = [];\n\n datas.forEach((data, index) => {\n const dataAux = datas[index].split('/');\n dataFormatada.push(`${dataAux[2]}-${dataAux[1]}-${dataAux[0]}`);\n });\n\n return dataFormatada;\n}","import React, { useState, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { Tag, Col, Row, Button, Icons, Tooltip } from '~/components';\nimport { TIPO_COLUNA } from '~/modules/Helper/tipoColuna';\n\nfunction ShowFiltros({\n filtros,\n setFiltros,\n form,\n removeTodosOsFiltros,\n colunasFiltro,\n}) {\n const { corTema } = useSelector(state => state.configuration);\n const [tags, setTags] = useState(null);\n\n function removeFiltro(event, campo) {\n event.preventDefault();\n\n const novosFiltros = filtros.filter(filtro => {\n return filtro.Campo !== campo;\n });\n\n if (novosFiltros.length === 0) removeTodosOsFiltros();\n else setFiltros(novosFiltros);\n\n form.resetFields([campo]);\n }\n\n function transformaFiltrosEmTags() {\n const arrayTags = [];\n\n filtros.forEach(filtro => {\n let nomePadrao;\n\n colunasFiltro.Grupos.forEach(grupo => {\n grupo.Colunas.forEach(coluna => {\n if (coluna.FonteDados === filtro.Campo)\n nomePadrao = coluna.NomePadrao;\n });\n });\n\n let valor = `${filtro.Valor}`;\n\n if (filtro.TipoValor === TIPO_COLUNA.DECIMAL) {\n const pos = valor.lastIndexOf('.');\n valor = `${valor.substring(0, pos)},${valor.substring(pos + 1)}`;\n }\n\n if (filtro.TipoValor === TIPO_COLUNA.DATA) {\n let aux = filtro.Valor.replace(',', '-');\n aux = aux.split('-');\n valor = `De ${aux[2]}/${aux[1]}/${aux[0]} até ${aux[5]}/${aux[4]}/${aux[3]}`;\n }\n\n arrayTags.push(\n \n {nomePadrao}:\n removeFiltro(event, filtro.Campo)}\n color={corTema}\n >\n {valor}\n \n \n );\n });\n\n setTags(arrayTags);\n }\n\n useEffect(() => {\n if (filtros.length > 0) transformaFiltrosEmTags();\n else setTags([]);\n }, [filtros]);\n\n return (\n <>\n {tags && tags.length > 0 ? (\n <>\n \n Filtros Aplicados:\n {tags}\n
\n \n \n \n \n
\n >\n ) : (\n <>>\n )}\n >\n );\n}\n\nexport default ShowFiltros;\n","import React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport { createBrowserHistory } from 'history';\nimport { notification } from 'antd';\nimport FiltrosAvancados from '../components/FiltrosAvancados/FiltrosAvancados.component';\nimport ShowFiltros from '../components/ShowFiltros/ShowFiltros.component';\nimport TableDinamic from '../../Modulos/components/Grid/TableDinamic.component';\nimport {\n getColunasFiltro,\n obterDadosFiltroAvancado,\n} from '../services/buscaAvancada.service';\nimport * as ModuloVisaoService from '../../Modulos/services/moduloVisao.service';\n\nimport {\n obterConfiguracoes,\n obterConfiguracoesGerais,\n} from '../../Modulos/services/moduloVisao.service';\nimport { PARAMS_FILTERS_GRID_BUSCA_AVANCADA } from '~/modules/Helper/searchParamsFilters';\nimport { NUMERO_QUANTIDADE_REGISTROS } from '~/modules/Helper/numeroQuantidadeRegistros';\nimport { getAndFormatSearchParamsBuscaAvancada } from '~/modules/Helper/searchString-helper';\nimport { parseToQueryString } from '~/modules/Helper/querystring-helper';\nimport {\n Row,\n Col,\n Card,\n PageTitle,\n FormV3 as Form,\n Button,\n ButtonGoBack,\n} from '~/components';\nimport { useUrls } from '~/contexts/url.context';\nimport { TIPO_VISAO } from '~/modules/Helper/tipo-visao';\nimport { TIPO_COLUNA } from '~/modules/Helper/tipoColuna';\nimport Totalizadores from '../../Modulos/components/Totalizadores/Totalizadores.component';\n\nfunction BuscaAvancada({ match, history, form }) {\n const { empilhaUrl, obterUrlPaginaAnterior } = useUrls();\n const [colunasFiltro, setColunasFiltro] = useState();\n const [configuracoesVisao, setConfiguracoesVisao] = useState(null);\n const [filtros, setFiltros] = useState([]);\n const [moduloVisao, setModuloVisao] = useState(null);\n\n const [listaColunaOrdem, setListaColunaOrdem] = useState([]);\n const [quantidadeRegistros, setQuantidadeRegistros] = useState(null);\n const [pagina, setPagina] = useState(null);\n const [urlVisaoAnalitica, setUrlVisaoAnalitica] = useState(null);\n const [urlVisaoAgrupamento, setUrlVisaoAgrupamento] = useState(null);\n const [dataUltimaAtualizacao, setDataUltimaAtualizacao] = useState(null);\n const [possuiArquivoDigital, setPossuiArquivoDigital] = useState(false);\n const [exibirArquivosForm, setExibirArquivosForm] = useState(false);\n const [\n filtroPesquisaArquivosDigitais,\n setFiltroPesquisaArquivosDigitais,\n ] = useState(null);\n const [FiltroHabilitado, setFiltroHabilitado] = useState(null);\n const [chavesPeriodicidade, setChavesPeriodicidade] = useState([]);\n\n const { modulo, visao } = match.params;\n\n const browserHistory = createBrowserHistory();\n\n const routeParams = new URLSearchParams(history.location.search);\n\n const arrayFonteDados = [];\n\n const [valoresParamsFiltros, setValoresParamsFiltros] = useState([]);\n const [totalizadores, setTotalizadores] = useState([]);\n\n const paginacaoGridParam = Number(routeParams.get('pagina'));\n const quantidadeRegistrosParam = routeParams.get('quantidaderegistros');\n const listaColunaOrdemParam = JSON.parse(routeParams.get('listacolunaordem'));\n\n function setSearchParams() {\n setPagina(paginacaoGridParam || 1);\n setQuantidadeRegistros(\n NUMERO_QUANTIDADE_REGISTROS.includes(quantidadeRegistrosParam)\n ? quantidadeRegistrosParam\n : '10'\n );\n if (listaColunaOrdemParam?.length)\n setListaColunaOrdem(listaColunaOrdemParam);\n }\n\n function voltarPaginaAnterior() {\n const { urlBase, queryParam } = obterUrlPaginaAnterior();\n\n if (urlBase && queryParam) {\n history.push({ pathname: urlBase, search: queryParam });\n } else {\n history.push(`/`);\n }\n }\n\n function handleTableChange(pagination, filters, sorter) {\n if (!Array.isArray(sorter))\n return setListaColunaOrdem([\n {\n ColunaOrdem: sorter.field,\n TipoOrdem: sorter.order,\n Ordem: 1,\n },\n ]);\n const maxOrdem = Math.max(...listaColunaOrdem?.map(item => item.Ordem));\n\n const novaListaOrdenacaoColuna = sorter?.map((s, index) => {\n const itemOrdenacao = listaColunaOrdem.find(\n (ordenacao, idx) =>\n s.columnKey === ordenacao.ColunaOrdem && index === idx\n );\n if (itemOrdenacao) {\n return {\n ...itemOrdenacao,\n TipoOrdem: s.order,\n };\n }\n return {\n ColunaOrdem: s.field,\n TipoOrdem: s.order,\n Ordem: maxOrdem ? maxOrdem + 1 : 1,\n };\n });\n\n setListaColunaOrdem(novaListaOrdenacaoColuna);\n }\n\n const obterConfiguracoesVisao = useCallback(async () => {\n const response = await obterConfiguracoes(modulo, visao);\n if (response?.data) setConfiguracoesVisao(response.data);\n }, [modulo, visao]);\n\n function getFonteDadosColunas() {\n if (colunasFiltro?.Grupos?.length > 0) {\n colunasFiltro.Grupos.forEach(grupo => {\n grupo.Colunas.forEach(coluna => {\n arrayFonteDados.push(coluna.FonteDados);\n });\n });\n }\n }\n\n const obterExerciciosEVisaoAnalitica = useCallback(async () => {\n const responseConfiguracoesGerais = await obterConfiguracoesGerais(modulo);\n\n if (responseConfiguracoesGerais?.data) {\n const {\n NomeVisaoAnalitica,\n NomeVisaoAgrupamento,\n PossuiArquivoDigital,\n DataUltimaSicronizacaoModulo,\n FiltroHabilitado,\n } = responseConfiguracoesGerais?.data;\n\n if (NomeVisaoAnalitica) setUrlVisaoAnalitica(NomeVisaoAnalitica);\n\n if (NomeVisaoAgrupamento) setUrlVisaoAgrupamento(NomeVisaoAgrupamento);\n\n if (DataUltimaSicronizacaoModulo)\n setDataUltimaAtualizacao(DataUltimaSicronizacaoModulo);\n\n if (FiltroHabilitado) setFiltroHabilitado(FiltroHabilitado);\n\n if (PossuiArquivoDigital !== null && PossuiArquivoDigital !== undefined)\n setPossuiArquivoDigital(PossuiArquivoDigital);\n }\n }, [modulo]);\n\n function obterChavesPeriocidadeDaConfiguracao() {\n const colunasPeriodicidade = configuracoesVisao.ChavesPeriodicidades;\n\n setChavesPeriodicidade(arrayAnterior => [\n ...arrayAnterior,\n ...colunasPeriodicidade,\n ]);\n }\n\n function obterValoresChavesPeriodicidadePorLinha(linhaGrid) {\n const valores = chavesPeriodicidade.map(colunaGrid => ({\n campo: colunaGrid.FonteDados,\n valor: linhaGrid[colunaGrid.FonteDados],\n tipo: colunaGrid.TipoValor,\n }));\n return valores;\n }\n\n const obterColunaLink = useCallback(() => {\n if (!(configuracoesVisao && configuracoesVisao.VisaoColunas)) return null;\n\n return configuracoesVisao.VisaoColunas.find(x => x.ColunaLink);\n }, [configuracoesVisao]);\n\n const exibirAnexos = useCallback(row => {\n const valoresChavesPeriodicidade = obterValoresChavesPeriodicidadePorLinha(\n row\n );\n\n const chavePesquisa = {\n ChaveModulo: modulo,\n Exercicio: row.Exercicio,\n Periodicidade: 'MENSAL',\n Periodo: row.Mes,\n ChavesPeriodicidade: valoresChavesPeriodicidade.map(item => ({\n Campo: item.campo,\n Valor: item.valor,\n TipoValor: item.tipo,\n })),\n };\n\n setFiltroPesquisaArquivosDigitais(chavePesquisa);\n setExibirArquivosForm(true);\n });\n\n function redirecionarDetalheVisaoAnalitica(\n valoresChavesPeriodicidade,\n exercicio,\n mes\n ) {\n const colunasPeriodicidadeCampoValor = {};\n\n valoresChavesPeriodicidade.forEach(item => {\n colunasPeriodicidadeCampoValor[item.campo] = item.valor;\n });\n\n const data = {\n exercicio,\n periodicidade: 'MENSAL',\n periodo: mes,\n\n ...colunasPeriodicidadeCampoValor,\n };\n\n const queryString = parseToQueryString(data);\n\n empilhaUrl(window.location.hash.split('#')[1]);\n\n history.push({\n pathname: `detalhevisao`,\n state: {\n pagina,\n quantidadeRegistros,\n listaColunaOrdem: listaColunaOrdem,\n },\n search: queryString,\n });\n }\n\n const buscaDadosGrid = useCallback(() => {\n if (!configuracoesVisao) {\n return;\n }\n\n const data = {\n ChaveModulo: modulo,\n NomeVisao: visao,\n Filtros: filtros,\n Periodicidade: null,\n Periodo: null,\n Exercicio: null,\n FiltroRedirecionaVisao: null,\n Pagina: pagina,\n QuantidadeRegistros: quantidadeRegistros,\n Ordenacao: listaColunaOrdem,\n };\n\n obterDadosFiltroAvancado(data)\n .then(res => {\n setModuloVisao(res.data);\n return null;\n })\n .catch(() => {\n setModuloVisao({\n QuantidadePaginas: 0,\n QuantidadeRegistros: 0,\n Valores: [],\n });\n });\n\n const dataQueryString = {\n filtros,\n pagina,\n quantidaderegistros: quantidadeRegistros,\n listacolunaordem: listaColunaOrdem\n ? JSON.stringify(listaColunaOrdem)\n : null,\n };\n\n const searchParams = getAndFormatSearchParamsBuscaAvancada(\n dataQueryString,\n PARAMS_FILTERS_GRID_BUSCA_AVANCADA\n );\n\n browserHistory.replace(\n `/#/dinamico/${modulo}/${visao}/busca?${searchParams}`,\n history.location.state\n );\n }, [\n modulo,\n pagina,\n quantidadeRegistros,\n visao,\n listaColunaOrdem,\n configuracoesVisao,\n filtros,\n ]);\n\n async function getColunas() {\n const response = await getColunasFiltro(modulo);\n setColunasFiltro(response);\n }\n\n function getParamsUrlFonteDadosColunas(array) {\n const arrayAuxiliar = [];\n\n array.forEach(fonteDados => {\n let valorParam = routeParams.get(`${fonteDados}`);\n\n if (valorParam !== null) {\n valorParam = valorParam.split(',');\n\n const objetoFiltro = {\n Campo: fonteDados,\n Valor:\n valorParam[valorParam.length - 1] === '5'\n ? `${valorParam[0]},${valorParam[1]}`\n : valorParam[0],\n TipoValor: valorParam[valorParam.length - 1],\n };\n\n arrayAuxiliar.push(objetoFiltro);\n }\n });\n\n setValoresParamsFiltros(arrayAuxiliar);\n }\n\n function transformaFormEmObjetoRequisicao(valores) {\n const chavesFiltro = Object.keys(valores);\n\n const novoFiltro = [];\n\n function montaNovoFiltro(filtro, isBool) {\n novoFiltro.push({\n Campo: valores[`${filtro}`].Campo,\n // eslint-disable-next-line no-nested-ternary\n Valor: isBool\n ? valores[`${filtro}`].Valor === 1\n ? 'Sim'\n : 'Não'\n : valores[`${filtro}`].Valor,\n TipoValor: valores[`${filtro}`].TipoValor,\n });\n }\n\n chavesFiltro.forEach(filtro => {\n if (\n valores[`${filtro}`] !== undefined &&\n valores[`${filtro}`].TipoValor !== TIPO_COLUNA.BOOLEANO\n ) {\n if (valores[`${filtro}`].Valor.trim() !== '') {\n montaNovoFiltro(filtro);\n }\n } else if (valores[`${filtro}`] !== undefined) {\n if (valores[`${filtro}`].Valor !== '') {\n montaNovoFiltro(filtro, true);\n }\n }\n });\n\n return novoFiltro;\n }\n\n function handlePesquisa() {\n form.validateFields(async function _(err, values) {\n if (!err) {\n const filtrosRequisicao = transformaFormEmObjetoRequisicao(values);\n\n if (filtrosRequisicao.length > 0) {\n setFiltros(filtrosRequisicao);\n } else {\n notification.error({\n message: 'Preencha ao menos um filtro para continuar',\n });\n }\n }\n });\n }\n\n function handleSubmit(event) {\n event.preventDefault();\n handlePesquisa();\n }\n\n function removeTodosOsFiltros() {\n setFiltros([]);\n setValoresParamsFiltros([]);\n setTotalizadores([]);\n setPagina(1);\n setQuantidadeRegistros('10');\n setListaColunaOrdem([]);\n\n browserHistory.replace(\n `/#/dinamico/${modulo}/${visao}/busca`,\n history.location.state\n );\n }\n\n async function obterTotalizadores() {\n const data = {\n ChaveModulo: modulo,\n NomeVisao: visao,\n Filtros: filtros,\n Periodicidade: 'MENSAL',\n BuscaAvancada: true,\n };\n\n const ColunasTotalizadoras = await ModuloVisaoService.obterTotalizadores(\n data\n );\n\n setTotalizadores(ColunasTotalizadoras.data);\n }\n\n const Grid = useMemo(() => {\n return configuracoesVisao?.VisaoColunas &&\n moduloVisao?.Valores &&\n filtros.length > 0 ? (\n \n ) : (\n <>>\n );\n }, [\n listaColunaOrdem,\n configuracoesVisao,\n possuiArquivoDigital,\n filtros,\n modulo,\n moduloVisao,\n pagina,\n quantidadeRegistros,\n urlVisaoAnalitica,\n urlVisaoAgrupamento,\n visao,\n filtroPesquisaArquivosDigitais,\n exibirArquivosForm,\n exibirAnexos,\n dataUltimaAtualizacao,\n ]);\n\n useEffect(() => {\n if (\n FiltroHabilitado === false ||\n (configuracoesVisao && configuracoesVisao?.Tipo !== TIPO_VISAO.ANALITICO)\n )\n history.push('/notfound');\n }, [FiltroHabilitado, configuracoesVisao]);\n\n useEffect(() => {\n getColunas();\n obterConfiguracoesVisao();\n obterExerciciosEVisaoAnalitica();\n setSearchParams();\n }, [obterConfiguracoesVisao, obterExerciciosEVisaoAnalitica]);\n\n useEffect(() => {\n getFonteDadosColunas();\n getParamsUrlFonteDadosColunas(arrayFonteDados);\n }, [colunasFiltro]);\n\n useEffect(() => {\n if (configuracoesVisao) obterChavesPeriocidadeDaConfiguracao();\n }, [configuracoesVisao]);\n\n useEffect(() => {\n if (filtros.length > 0) {\n buscaDadosGrid();\n obterTotalizadores();\n }\n }, [buscaDadosGrid]);\n\n return (\n <>\n \n {filtros.length === 0 ? (\n \n \n \n ) : (\n <>>\n )}\n\n {totalizadores?.length > 0 && (\n \n )}\n\n \n\n {Grid}\n\n {filtros.length > 0 ? (\n \n \n
\n ) : (\n <>>\n )}\n >\n );\n}\n\nexport default Form.create({\n name: 'FormBuscaAvancada',\n})(BuscaAvancada);\n","import React, { useState, useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\nimport { getItemVisaoService } from '../services/visaoItem.service';\nimport {\n Informacao,\n Typography,\n Icons,\n Row,\n Col,\n ButtonGoBack,\n Card,\n Button,\n Tooltip,\n} from '~/components';\nimport { iconEnum } from '~/modules/Helper/iconEnum';\nimport { ChooseIconFile } from '~/modules/Helper/chooseIconFile';\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\n\nfunction VisaoItem({ match }) {\n const history = useHistory();\n const [visaoItem, setVisaoItem] = useState(null);\n\n const { corTema } = useSelector(state => state.configuration);\n\n useEffect(() => {\n async function getItemVisao() {\n const { modulo, visao, itemVisao } = match.params;\n const response = await getItemVisaoService(modulo, visao, itemVisao);\n\n if (response?.data) setVisaoItem(response.data);\n }\n\n getItemVisao();\n }, [match.params]);\n\n function goBack() {\n history.goBack();\n }\n\n return (\n <>\n {visaoItem?.Titulo}\n \n {visaoItem?.NomeArquivo && (\n \n \n fileManagerPaiDownload(visaoItem?.UrlArquivo)}>\n \n \n {iconEnum\n .find(\n x =>\n x.name ===\n `file-${ChooseIconFile(\n visaoItem?.NomeArquivo?.split('.', 2)[1].toLowerCase()\n )}`\n )\n ?.value({ fontSize: '20px' })}\n \n \n \n \n {visaoItem?.NomeArquivo}\n \n \n \n }\n />\n \n
\n \n \n )}\n \n \n
\n >\n );\n}\n\nexport default VisaoItem;\n","import api from '~/services/api';\n\nexport function getItemVisaoService(chaveModulo, uriVisao, idVisaoItemDetalhe) {\n return api.get(\n `ModuloVisaoItemDetalhe/${chaveModulo}/${uriVisao}/${parseInt(\n idVisaoItemDetalhe,\n 10\n )}`\n );\n}\n","import React, { useState, useRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport ReCaptcha from '~/components/ReCaptcha/reCacptcha.component';\n\nimport {\n Tooltip,\n Row,\n Col,\n Card,\n PageTitle,\n FormV3 as Form,\n Input,\n Button,\n Notification,\n Map,\n} from '~/components';\nimport { insertFaleConoscoService } from '../services/faleconosco.service';\n\nfunction FaleConoscoForm({ form }) {\n const { endereco, bairro, cidade, corFonte } = useSelector(\n state => state.configuration\n );\n const { getFieldDecorator } = form;\n const [captcha, SetCaptcha] = useState(null);\n const recaptchaInputRef = useRef({});\n\n function handleOnCaptchaChange(value) {\n SetCaptcha(value);\n }\n\n function resetForm() {\n form.resetFields();\n SetCaptcha(null);\n window.grecaptcha.reset();\n }\n\n function handleSubmit(event) {\n event.preventDefault();\n\n form.validateFields(async function _(err, values) {\n if (!err) {\n const { Nome, Email, Assunto, Mensagem } = values;\n\n const faleConosco = {\n Nome,\n Email,\n Assunto,\n Mensagem,\n captcha,\n };\n await insertFaleConoscoService(faleConosco)\n .then(x => {\n Notification.showSuccess('Mensagem enviada com sucesso');\n resetForm();\n })\n .catch(res => Notification.showError(res.response.data));\n }\n });\n }\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n
\n \n >\n );\n}\nexport default Form.create({\n name: 'FaleConosco',\n})(FaleConoscoForm);\n","import api from '~/services/api';\n\nexport function insertFaleConoscoService(data) {\n return api.post('/faleconosco', data);\n}","import React, { useEffect } from 'react';\nimport * as ModuloService from '../../../services/modulos.service';\nimport { CHAVES_MODULO } from '../../Helper/chave-modulo-constants';\nimport FaleConoscoForm from '../components/faleConosco.form.component';\n\nfunction FaleConosco() {\n useEffect(() => {\n ModuloService.verificaModuloHabilitado(CHAVES_MODULO.FALE_CONOSCO);\n }, []);\n\n return ;\n}\n\nexport default FaleConosco;\n","import styled from 'styled-components';\nimport { Card } from '~/components';\n\nexport const CardWithTitleStyled = styled(Card)`\n .ant-card-head {\n font-weight: 700;\n }\n\n .ant-card-body {\n padding-right: 24px;\n padding-left: 24px;\n padding-top: 16px;\n padding-bottom: 16px;\n }\n`;\n\nexport const InfosContainer = styled.div`\n .info-autenticidade {\n font-weight: 700;\n margin-right: 10px;\n }\n\n .ant-tag-error {\n background: #fff2f0 !important;\n }\n`;\n\nexport const SubInfosContainer = styled.div`\n margin-left: 15px;\n`;\n\nexport const ContainerAviso = styled.div`\n margin-top: 12px;\n\n p {\n margin-bottom: 0px;\n }\n\n .anticon {\n margin-right: 10px;\n }\n\n div.ant-typography {\n margin-bottom: 0px;\n }\n\n div:nth-child(2) {\n margin-left: 25px;\n margin-bottom: 0px;\n }\n\n div:nth-child(2) div {\n padding: 0px;\n }\n`;\n","export const STATUS_AUTENTICIDADE = {\n DENTRO_PRAZO: 1,\n FORA_PRAZO: 2,\n};\n","import React from 'react';\n\nimport {\n Tooltip,\n Row,\n Col,\n Button,\n Informacao,\n Icons,\n Tag,\n Typography,\n Card,\n} from '~/components';\n\nimport * as S from './autenticidadeValidacao.styled';\n\nimport { iconEnum } from '~/modules/Helper/iconEnum';\nimport { ChooseIconFile } from '~/modules/Helper/chooseIconFile';\n\nimport { fileManagerPaiDownload } from '~/services/FileManager/file-manager.service';\nimport { STATUS_AUTENTICIDADE } from '~/modules/Helper/statusAutenticidade';\n\nfunction AutenticidadeValidacao({ dadosValidacao, aviso }) {\n function renderTagFromStatusAutenticidade() {\n if (dadosValidacao?.Status === STATUS_AUTENTICIDADE.DENTRO_PRAZO)\n return (\n \n Documento dentro do Prazo de Validade\n \n );\n if (dadosValidacao?.Status === STATUS_AUTENTICIDADE.FORA_PRAZO)\n return (\n \n Documento com Prazo Vencido\n \n );\n\n return null;\n }\n\n return (\n <>\n \n \n \n Status:\n {renderTagFromStatusAutenticidade()}\n
\n \n Informações do Documento\n
\n \n \n Nome:\n {dadosValidacao?.NomeArquivo}\n
\n \n Data/Hora:\n {dadosValidacao?.DataHoraExportacao}\n
\n \n Válido até:\n {dadosValidacao?.DataHoraValidade}\n
\n \n \n {aviso && (\n \n }\n />\n \n )}\n \n\n \n \n \n \n {dadosValidacao?.TituloRelatorio}\n \n \n \n \n \n \n
\n \n\n {dadosValidacao.Status === STATUS_AUTENTICIDADE.DENTRO_PRAZO && (\n \n \n \n \n {iconEnum\n .find(\n x =>\n x.name ===\n `file-${ChooseIconFile(\n dadosValidacao?.NomeArquivo?.split(\n '.',\n 2\n )[1].toLowerCase()\n )}`\n )\n ?.value({ fontSize: '20px' })}\n \n {dadosValidacao?.NomeArquivo}\n \n \n \n \n \n \n
\n \n )}\n >\n );\n}\n\nexport default AutenticidadeValidacao;\n","import styled from 'styled-components';\n\nexport const ContainerInformacao = styled.div`\n div.ant-typography {\n margin-bottom: 0px;\n }\n\n div:nth-child(2) div {\n padding: 0px;\n }\n`;\n","import React, { useState, useRef, useEffect } from 'react';\nimport ReCaptcha from '~/components/ReCaptcha/reCacptcha.component';\n\nimport {\n Tooltip,\n Row,\n Col,\n Card,\n PageTitle,\n FormV3 as Form,\n Input,\n Button,\n Notification,\n Informacao,\n ButtonGoBack,\n} from '~/components';\nimport {\n obterAutenticidade,\n obterConfiguracoes,\n} from '../services/autenticidade.service';\nimport AutenticidadeValidacao from './autenticidadeValidacao.component';\n\nimport * as S from './autenticidade.styled';\n\nfunction AutenticidadeForm({ form }) {\n const { getFieldDecorator } = form;\n const [captcha, SetCaptcha] = useState(null);\n const recaptchaInputRef = useRef({});\n const [hasSubmitted, setHasSubmitted] = useState(false);\n const [dadosValidacao, setDadosValidacao] = useState();\n const [configuracoes, setConfiguracoes] = useState();\n\n function handleOnCaptchaChange(value) {\n SetCaptcha(value);\n }\n\n function handleSubmit(event) {\n event.preventDefault();\n\n form.validateFields(async function _(err, values) {\n if (!err) {\n const { CodigoValidacao } = values;\n\n await obterAutenticidade(CodigoValidacao, true)\n .then(resp => {\n setDadosValidacao(resp.data);\n setHasSubmitted(true);\n })\n .catch(() => Notification.showError('Código de Validação Inválido'));\n }\n });\n }\n\n function goBack() {\n SetCaptcha(null);\n setHasSubmitted(false);\n }\n\n useEffect(() => {\n obterConfiguracoes().then(resp => setConfiguracoes(resp.data));\n }, []);\n\n return (\n <>\n \n {!hasSubmitted ? (\n \n {configuracoes?.Informacao && (\n \n \n \n )}\n \n \n \n \n
\n \n ) : (\n \n )}\n {hasSubmitted && (\n \n \n
\n )}\n >\n );\n}\nexport default Form.create({\n name: 'Autenticidade',\n})(AutenticidadeForm);\n","import api from '~/services/api';\n\nexport async function obterAutenticidade(codigoValidacao) {\n return api.get(`/autenticidade/obter/${codigoValidacao}`);\n}\n\nexport async function obterConfiguracoes() {\n return api.get('/autenticidade/configuracoes');\n}\n","import React, { useEffect } from 'react';\nimport * as ModuloService from '../../../services/modulos.service';\nimport { CHAVES_MODULO } from '../../Helper/chave-modulo-constants';\nimport AutenticidadeForm from '../components/autenticidade.form.component';\n\nfunction Autenticidade() {\n useEffect(() => {\n ModuloService.verificaModuloHabilitado(CHAVES_MODULO.AUTENTICIDADE);\n }, []);\n\n return ;\n}\n\nexport default Autenticidade;\n","import React, { useEffect, useState } from 'react';\nimport { Line } from '@antv/g2plot';\nimport { Link } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { Row, Icons } from '~/components';\nimport { GraficoLine, Visualizar, CardWrapper } from './style';\n\nfunction LineGraphic({\n id,\n titulo,\n data,\n xField = 'EixoY',\n yField = 'EixoX',\n seriesField,\n legendaEixoX,\n legendaEixoY,\n legenda,\n ValorLink,\n showEyeButton = false,\n corFonte,\n onLineClick,\n onPointClick,\n}) {\n const [line, setLine] = useState(null);\n\n const NumberFormatter = function NumberFormatter(value) {\n let newNum = value;\n const suffix = ['', ' Mil', ' Mi', ' Bi', ' Tri'];\n let suffixNum = 0;\n if (newNum > 10000) {\n while (newNum >= 1000) {\n newNum /= 1000;\n suffixNum += 1;\n }\n return Math.trunc(newNum) + suffix[suffixNum];\n }\n return newNum;\n };\n\n const {\n graficHighContrastStyle,\n highContrast,\n graficDefaultStyle,\n zoomFonte,\n } = useSelector(state => state.configuration);\n\n const getConfigStyle = highContrast\n ? graficHighContrastStyle\n : graficDefaultStyle;\n\n const [config] = useState({\n title: false,\n autoFit: true,\n data,\n xField,\n yField,\n seriesField,\n xAxis: {\n title: {\n visible: legendaEixoX || false,\n text: legendaEixoX,\n style: getConfigStyle,\n },\n label: {\n style: getConfigStyle,\n formatter: v => {\n return v.length >= 7 ? `${v.substring(0, 7)}...` : v;\n },\n },\n },\n yAxis: {\n title: {\n visible: false,\n text: legendaEixoY,\n offset: 45,\n style: getConfigStyle,\n },\n label: {\n formatter: v => {\n return NumberFormatter(v);\n },\n style: getConfigStyle,\n },\n },\n color: [\n '#30BBAA',\n '#F39366',\n '#876AB0',\n '#FDF25B',\n '#77C966',\n '#EE7B80',\n '#7F8BB2',\n '#F9D04F',\n '#D85B81',\n '#D3E045',\n '#2DA0D7',\n '#FBB141',\n ],\n point: {\n visible: true,\n size: 5,\n shape: 'circle',\n style: {\n lineWidth: 2,\n },\n },\n legend: {\n visible: true,\n title: {\n visible: true,\n text: legenda,\n style: getConfigStyle,\n },\n itemName: {\n formatter: v => {\n return v.trim().length >= 25 ? `${v.substring(0, 25)}...` : v.trim();\n },\n style: getConfigStyle,\n },\n },\n tooltip: {\n title: () => legendaEixoY,\n },\n smooth: true,\n });\n\n useEffect(() => {\n if (line) return;\n\n const element = document.getElementById(id);\n if (element) {\n const lineRender = new Line(element, {\n data,\n ...config,\n events: {\n onLineClick,\n onPointClick,\n },\n });\n setLine(lineRender);\n lineRender.render();\n }\n }, [line, config, data, id]);\n\n useEffect(() => {\n if (line) {\n line.update({\n xAxis: {\n ...config.xAxis,\n title: {\n ...config.xAxis.title,\n style: getConfigStyle,\n },\n label: {\n ...config.xAxis.label,\n style: getConfigStyle,\n },\n },\n yAxis: {\n ...config.yAxis,\n title: {\n ...config.yAxis.title,\n style: getConfigStyle,\n },\n label: {\n ...config.yAxis.label,\n style: getConfigStyle,\n },\n },\n legend: {\n ...config.legend,\n itemName: {\n ...config.itemName,\n style: getConfigStyle,\n },\n title: {\n ...config.label,\n style: getConfigStyle,\n },\n },\n smooth: config.smooth,\n point: config.point,\n tooltip: config.tooltip,\n });\n }\n\n if (line) line.render();\n }, [\n line,\n config.xAxis,\n config.yAxis,\n config.legend,\n getConfigStyle,\n highContrast,\n zoomFonte,\n ]);\n\n useEffect(() => {\n if (line) {\n line.update({\n data,\n });\n line.render();\n }\n }, [data, line]);\n\n return (\n <>\n \n {titulo}\n \n }\n extra={\n showEyeButton ? (\n \n \n \n \n \n ) : (\n ''\n )\n }\n size=\"small\"\n >\n
\n \n \n
\n \n >\n );\n}\n\nexport default LineGraphic;\n","import React, { useEffect, useState } from 'react';\nimport EmptyCardGrafico from '../../../components/Grafico/EmptyCardGraphic.component';\nimport LineGraphic from '../../../components/Grafico/LineGraphic.component';\nimport * as EstatisticasService from '../services/Estatisticas.service';\n\nexport default function GraficoAnos() {\n const [acessosAnos, setAcessosAnos] = useState([]);\n\n useEffect(() => {\n EstatisticasService.getEstatisticasAcessoAno().then(({ data }) => {\n if (data) setAcessosAnos(data);\n });\n }, []);\n\n return acessosAnos?.length ? (\n \n \n
\n ) : (\n \n );\n}\n","import api from '~/services/api';\n\nfunction getEstatisticasAcessosVisao(exercicio) {\n return api.get(`/estatistica/grafico/visao/portal/${exercicio}`); // DTO para o Gráfico de Pie\n}\n\nfunction getEstatisticasAcessoAno() {\n return api.get('/estatistica/grafico/ano/portal'); // DTO para o Gráfico de Line\n}\n\nfunction getEstatisticasAnosComDados() {\n return api.get('/estatistica/anos'); // DTO para o select de apenas Exercícios com dados.\n}\n\nexport {\n getEstatisticasAcessosVisao,\n getEstatisticasAcessoAno,\n getEstatisticasAnosComDados,\n};\n","import React, { useEffect, useState } from 'react';\nimport PieGraphic from '../../../components/Grafico/PieGraphic.component';\nimport EmptyCardGrafico from '../../../components/Grafico/EmptyCardGraphic.component';\nimport * as EstatisticasService from '../services/Estatisticas.service';\n\nexport default function GraficoVisoes({ anoSelecionado }) {\n const [acessosVisoes, setAcessosVisoes] = useState([]);\n\n useEffect(() => {\n EstatisticasService.getEstatisticasAcessosVisao(anoSelecionado).then(\n ({ data }) => {\n if (data) setAcessosVisoes(data);\n }\n );\n }, [anoSelecionado]);\n\n const tooltipFormatter = ({ Acessos, NomeVisao }) => {\n return {\n name: NomeVisao,\n value: new Intl.NumberFormat('pt-BR').format(Acessos),\n };\n };\n\n return acessosVisoes?.length ? (\n \n
'Acessos'}\n legendMaxRow={5}\n legendItemMarginBottom={8}\n legendItemSpacing={8}\n tooltipFormatter={tooltipFormatter}\n />\n \n ) : (\n \n );\n}\n","import React from 'react';\nimport { Select, Tooltip, Row, Typography, Card } from '~/components';\n\nexport default function FiltroExercicio({\n handleChangeExercicio,\n exercicios,\n exercicio,\n}) {\n return (\n \n \n \n Exercício\n \n \n \n \n \n
\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { PageTitle } from '~/components';\nimport GraficoAnos from '../components/GraficoAnos.component';\nimport GraficoVisoes from '../components/GraficoVisoes.component';\nimport FiltroExercicio from '../components/FiltroExercicio.component';\nimport * as EstatisticasService from '../services/Estatisticas.service';\n\nexport default function Estatiscas() {\n const anoAtual = new Date().getFullYear();\n\n const [exercicioSelcionado, setExercicioSelecionado] = useState(anoAtual);\n const [exercicios, setExercicios] = useState([]);\n\n useEffect(() => {\n EstatisticasService.getEstatisticasAnosComDados().then(({ data }) => {\n if (data) setExercicios(data);\n });\n }, []);\n\n function handleChangeExercicio(anoSelecionado) {\n setExercicioSelecionado(anoSelecionado);\n }\n\n return (\n <>\n \n \n handleChangeExercicio(value)}\n exercicios={exercicios}\n exercicio={exercicioSelcionado}\n />\n \n >\n );\n}\n","/* eslint-disable react/jsx-props-no-spreading */\nimport React from 'react';\nimport { Route as ReactRoute } from 'react-router-dom';\nimport { Breadcrumb } from '~/components';\nimport { salvaEstatistica } from './routes.service';\n\nfunction Route({ path, component: Component, hasStatistics }) {\n function handleStatistics(url) {\n const payload = {\n Rota: url,\n };\n\n salvaEstatistica(payload);\n }\n\n return (\n {\n if (hasStatistics) handleStatistics(props.location.pathname);\n return (\n <>\n \n \n >\n );\n }}\n />\n );\n}\n\nexport default Route;\n","import api from '~/services/api';\n\nfunction salvaEstatistica(data) {\n return api.post('Estatistica', data);\n}\n\nexport { salvaEstatistica };\n","import React from 'react';\nimport { Router, Switch } from 'react-router-dom';\nimport DefaultLayout from '~/modules/_layouts/default/default.layout';\nimport Dashboard from '~/modules/Dashboard/containers/dashboard.container';\nimport Faq from '~/modules/FAQ/containers/faq.container';\nimport DadosAbertos from '~/modules/DadosAbertos/containers/dadosAbertos.container';\nimport ESic from '~/modules/ESic/containers/esic.container';\nimport Sumario from '~/modules/Sumario/containers/sumario.container';\nimport EstruturaOrganizacional from '~/modules/EstruturaOrganizacional/containers/estruturaOrganizacional.container';\nimport EstruturaOrganizacionalDetalhe from '~/modules/EstruturaOrganizacional/containers/estruturaOrganizacionalDetalhe.container';\nimport NotFound from '~/components/NotFound/NotFound.component';\nimport EmManutencao from '~/components/EmManutencao/EmManutencao.component';\nimport Glossario from '~/modules/Glossario/containers/glossario.container';\nimport ModuloDinamico from '~/modules/Modulos/ModuloDinamico.component';\nimport ModuloFixo from '~/modules/Modulos/ModuloFixo/ModuloFixo.component';\nimport DetalheVisaoAnalitica from '~/modules/DetalheVisaoAnalitica/containers/detalheVisaoAnalitica.container';\nimport BuscaAvancada from '~/modules/BuscaAvancada/containers/buscaAvancada.container';\nimport ItemVisao from '~/modules/Modulos/containers/visaoItem.container';\n\nimport history from '~/services/history';\nimport FaleConosco from '~/modules/FaleConosco/containers/faleConosco';\nimport Autenticidade from '~/modules/Autenticidade/containers/autenticidade';\nimport Estatisticas from '~/modules/Estatisticas/containers/Estatisticas';\nimport Route from './Route';\n\nfunction Routes() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default Routes;\n","/* eslint-disable import/no-extraneous-dependencies */\nimport 'react-grid-layout/css/styles.css';\nimport 'react-resizable/css/styles.css';\nimport 'leaflet/dist/leaflet.css';\n\nimport './config/reactotron';\n\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { PersistGate } from 'redux-persist/integration/react';\nimport VLibras from '@djpfs/react-vlibras';\n\nimport GlobalStyle from '~/styles/global';\nimport { Internationalization, Theme, Loader } from '~/components';\n\nimport Routes from './routes';\n\nimport store, { persistor } from './store';\nimport MenuProvider from '~/contexts/menu.context';\nimport { UrlProvider } from '~/contexts/url.context';\n\nfunction App() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(, document.getElementById('root'));\n"],"sourceRoot":""}