@zydon/common 2.9.59 → 2.9.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -64,7 +64,7 @@ declare const EmptyStateContainer: _emotion_styled.StyledComponent<_mui_material
|
|
|
64
64
|
|
|
65
65
|
interface DashboardLayoutProps {
|
|
66
66
|
dashboard: AnalyticsLayoutDashboard;
|
|
67
|
-
widgets: Record<string, ReactNode>;
|
|
67
|
+
widgets: Record<string, ReactNode | ((item: AnalyticsLayoutDashboard['widgets'][number]) => ReactNode)>;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
declare const DashboardLayout: ({ dashboard, widgets }: DashboardLayoutProps) => react_jsx_runtime.JSX.Element;
|
|
@@ -18,31 +18,31 @@ import { b as b$1, e, f, a as a$b } from '../../chunk-UWTX4JMW.js';
|
|
|
18
18
|
import { b } from '../../chunk-TXJ45CNA.js';
|
|
19
19
|
import { c as c$1, d } from '../../chunk-ERLI5GAP.js';
|
|
20
20
|
import { a as a$5 } from '../../chunk-LQRRMVFN.js';
|
|
21
|
-
import
|
|
22
|
-
import
|
|
21
|
+
import zt from '@mui/material/AlertTitle';
|
|
22
|
+
import ut from '@mui/material/Button';
|
|
23
23
|
import ot from '@mui/material/Typography';
|
|
24
24
|
import B from '@mui/material/Stack';
|
|
25
|
-
import
|
|
25
|
+
import Wt from '@mui/material/Alert';
|
|
26
26
|
import { keyframes, styled, alpha } from '@mui/material/styles';
|
|
27
27
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
28
28
|
import { memo, useState, useCallback } from 'react';
|
|
29
29
|
import nt from '@mui/material/Box';
|
|
30
|
-
import
|
|
30
|
+
import io from '@mui/lab/LoadingButton';
|
|
31
31
|
import { useForm } from 'react-hook-form';
|
|
32
|
-
import
|
|
33
|
-
import
|
|
34
|
-
import
|
|
35
|
-
import
|
|
32
|
+
import uo from '@mui/material/Divider';
|
|
33
|
+
import yo from '@mui/material/FormControlLabel';
|
|
34
|
+
import go from '@mui/material/Radio';
|
|
35
|
+
import ho from '@mui/material/RadioGroup';
|
|
36
36
|
import v from 'dayjs';
|
|
37
37
|
|
|
38
|
-
var
|
|
38
|
+
var Ht=keyframes`
|
|
39
39
|
0% {
|
|
40
40
|
background-position: 0% 50%;
|
|
41
41
|
}
|
|
42
42
|
100% {
|
|
43
43
|
background-position: 200% 50%;
|
|
44
44
|
}
|
|
45
|
-
`,
|
|
45
|
+
`,M=styled(Wt)(({theme:t})=>{let r=t.palette.primary.main,e=alpha(r,.1);return {position:"relative",backgroundColor:alpha(t.palette.primary.main,.01),border:"1px solid transparent",borderRadius:8,"&::before":{content:'""',position:"absolute",inset:0,borderRadius:"inherit",padding:"1px",background:`linear-gradient(90deg, ${r} 0%, ${e} 50%, ${r} 100%)`,WebkitMask:"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",WebkitMaskComposite:"xor",mask:"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",maskComposite:"exclude",pointerEvents:"none"},overflow:"hidden","& .MuiAlert-message":{width:"100%"}}}),X=styled(M)({border:"1px solid transparent","&::before":{content:'""',position:"absolute",inset:0,borderRadius:"inherit",padding:"1px",background:"linear-gradient(90deg, #e01cd5 0%, #1CB5E0 50%, #e01cd5 100%)",backgroundSize:"200% auto",WebkitMask:"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",WebkitMaskComposite:"xor",mask:"linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",maskComposite:"exclude",pointerEvents:"none",animation:`${Ht} 2s linear infinite`}});var Nt=()=>jsxs(X,{icon:jsx(a$4,{icon:"AI_08_SOLID_ROUND",color:"primary.main"}),action:jsx(a$c,{variant:"text",width:100,height:30}),children:[jsx(zt,{variant:"subtitle1",color:"text.primary",children:"Resumo inteligente"}),jsxs(B,{gap:.5,children:[jsx(a$c,{variant:"text",width:"100%",height:30}),jsx(a$c,{variant:"text",width:"80%",height:30})]})]}),j=Nt;var Ut=()=>jsxs(B,{direction:"row",alignItems:"center",gap:1.5,children:[jsx(a$4,{icon:"AI_08_SOLID_ROUND",color:"primary.main",sx:{flexGrow:0}}),jsxs(B,{children:[jsx(ot,{variant:"subtitle1",color:"text.primary",children:"Resumo inteligente"}),jsx(ot,{variant:"body2",color:"text.secondary",children:"Gerado com base nos dados consolidados da p\xE1gina."})]})]}),I=Ut;var Vt=t=>t,rt=({detail:t,formatContent:r})=>{let e=r??Vt,n=r!=null;return jsx(ot,{variant:"body2",color:"text.primary",children:n?jsx("span",{dangerouslySetInnerHTML:{__html:e(t)}}):t})},Kt=({open:t,toggleOpen:r,detail:e,formatContent:n})=>b("down","sm")?jsx(a,{open:t,onClose:r,headerTitle:jsx(I,{}),headerProps:{direction:"row-reverse",sx:{"& > :last-child":{minWidth:0,overflow:"hidden"}}},children:jsx(rt,{detail:e,formatContent:n})}):jsx(a$1,{open:t,onClose:r,dialogTitle:jsx(I,{}),dialogTitleProps:{sx:{flex:1,overflow:"hidden"}},maxWidth:"md",fullWidth:!0,scroll:"paper",children:jsx(rt,{detail:e,formatContent:n})}),at=memo(Kt);var Xt=({brief:t,detail:r,isLoading:e=!1,formatContent:n})=>{let[s,m]=a$2(!1);return !(!!t&&!!r)&&!e?null:jsxs(Fragment,{children:[jsx(a$3,{isLoading:e,loading:jsx(j,{}),children:jsxs(M,{icon:jsx(a$4,{icon:"AI_08_SOLID_ROUND",color:"primary.main"}),action:jsx(ut,{variant:e?"contained":"text",color:"primary",size:"small",onClick:m,children:"Ver mais"}),children:[jsx(zt,{variant:"subtitle1",color:"text.primary",children:"Resumo inteligente"}),jsx(ot,{variant:"body2",color:"text.secondary",children:t})]})}),jsx(at,{open:s,toggleOpen:m,detail:r??"",formatContent:n})]})},Zt=Xt;var oo=({dashboard:t,widgets:r})=>jsx(nt,{display:"grid",gridTemplateColumns:{xs:"1fr",md:"repeat(2, minmax(0, 1fr))"},gap:3,children:t.widgets.filter(e=>e.widget in r).map((e,n)=>{let s=r[e.widget],m=typeof s=="function"?s(e):s;return jsx(nt,{"data-testid":`analytics-widget-${e.widget}`,gridColumn:{xs:"span 1",md:e.width==="FULL"?"span 2":"span 1"},minWidth:0,children:e.accessible?jsxs(Fragment,{children:[e.title&&jsx(ot,{variant:"subtitle1",fontWeight:600,mb:1,"data-testid":"analytics-library-widget-title",children:e.title}),m]}):jsx(eo,{})},`${e.library_widget_id??e.widget}-${n}`)})}),eo=()=>jsxs(B,{minHeight:200,alignItems:"center",justifyContent:"center",gap:1,border:1,borderColor:"divider",borderRadius:2,children:[jsx(a$4,{icon:"SECURITY_LOCK",width:32,color:"text.secondary"}),jsx(ot,{variant:"body2",color:"text.secondary",children:"Voc\xEA n\xE3o tem permiss\xE3o para ver estes dados."})]}),ro=oo;var mt=styled(ut)(({theme:t})=>({color:t.palette.text.secondary,"&:hover":{background:t.palette.action.hover}})),pt=styled(io)(({theme:t})=>({justifyContent:"flex-start",color:t.palette.text.secondary,fontWeight:400,"&:hover":{background:t.palette.action.hover}}));var so=({onExport:t,isExporting:r})=>{let{open:e,onOpen:n,onClose:s}=a$5(),m=a=>{t(a),s();};return jsxs(Fragment,{children:[jsx(mt,{variant:"text",startIcon:jsx(a$4,{icon:"DOWNLOAD"}),color:"primary",size:"small",onClick:n,disabled:r,children:r?"Exportando...":"Exportar"}),jsx(a$6,{open:e,onClose:s,disabledArrow:!0,sx:{p:1,width:180},children:Object.values(c$1).map((a,c)=>jsx(pt,{variant:"text",onClick:()=>m(a),loading:r,fullWidth:!0,"data-testid":`export-button-${c}`,children:a},c))})]})},lo=so;var ct=styled(c)(({theme:t})=>({"&.MuiDateRangeCalendar-root":{margin:-24},"& .MuiPickersCalendarHeader-label":{textTransform:"capitalize"},[t.breakpoints.down(400)]:{"& .MuiPickersCalendarHeader-root":{padding:t.spacing(0,7)},"& .MuiDayCalendar-header, & .MuiDayCalendar-weekContainer":{gap:0},"& .MuiPickersDay-root, & .MuiDateRangePickerDay-root":{width:32,height:32},"& .MuiDayCalendar-weekDayLabel":{width:32,height:32},"& .MuiDayCalendar-slideTransition":{minHeight:210}},[t.breakpoints.down(350)]:{"& .MuiPickersDay-root, & .MuiDateRangePickerDay-root":{width:28,height:28},"& .MuiDayCalendar-weekDayLabel":{width:28,height:28},"& .MuiDayCalendar-slideTransition":{minHeight:196}}}));var bo=["D","S","T","Q","Q","S","S"],Do=({value:t,onSave:r,onClose:e$1})=>{let n=b("down","sm"),s=useForm({defaultValues:{period:t.period,start_date:t.start_date?v(t.start_date).toDate():null,end_date:t.end_date?v(t.end_date).toDate():null}}),{handleSubmit:m,setValue:a,getValues:c}=s,[L,b$2]=useState(t.period),[yt,D]=useState(()=>[t.start_date?v(t.start_date).toDate():null,t.end_date?v(t.end_date).toDate():null]),T=useCallback(o=>{let i=b$1(o);b$2(o),D([i.start_date,i.end_date]),a("period",o),a("start_date",i.start_date),a("end_date",i.end_date);},[a]),gt=useCallback(o=>{if(D(o),o[0]&&a("start_date",o[0]),o[1]&&a("end_date",o[1]),o[0]&&o[1]){let i=e(o[0],o[1]);b$2(i),a("period",i);}},[a]),ht=useCallback(o=>{a("start_date",o);let i=c("end_date");if(o&&i){let f=[o,i];D(f);let h=e(f[0],f[1]);b$2(h),a("period",h);}},[c,a]),xt=useCallback(o=>{a("end_date",o);let i=c("start_date");if(i&&o){let f=[i,o];D(f);let h=e(f[0],f[1]);b$2(h),a("period",h);}},[c,a]),bt=useCallback(o=>{o&&typeof o=="string"&&T(o);},[T]),Dt=useCallback(o=>{r(f(o));},[r]);return jsxs(a$7,{methods:s,onSubmit:m(Dt),gap:3,children:[jsx(ot,{variant:"overline",color:"text.secondary",children:"Defina o per\xEDodo"}),jsxs(B,{display:"grid",gridTemplateColumns:"1fr 1fr",alignItems:"center",gap:1.5,children:[jsx(a$8,{name:"start_date",label:"Data inicial",size:"small",onChange:ht}),jsx(a$8,{name:"end_date",label:"Data final",size:"small",onChange:xt})]}),jsxs(a$9,{direction:{xs:"column",sm:"row"},alignItems:"center",justifyContent:{xs:"center",sm:"space-between"},gap:{xs:3,sm:0},overflow:"hidden",children:[n?jsx(a$a,{name:"period",value:L,onChange:bt,options:a$b,size:"small",disableClearable:!0,fullWidth:!0}):jsx(ho,{value:L,onChange:(o,i)=>T(i),children:Object.values(d).map(o=>jsx(yo,{value:o,control:jsx(go,{size:"small"}),label:a$b.find(i=>i.value===o)?.label},o))}),jsx(uo,{orientation:"vertical",flexItem:!0,sx:{display:{xs:"none",sm:"block"}}}),jsx(ct,{value:yt,onChange:gt,calendars:1,showDaysOutsideCurrentMonth:!0,fixedWeekNumber:6,disableFuture:!0,dayOfWeekFormatter:o=>bo[o.day()]})]}),jsx(B,{alignItems:"flex-end",children:jsxs(B,{direction:"row",alignItems:"center",gap:1.5,children:[jsx(ut,{variant:"outlined",color:"inherit",onClick:e$1,children:"Cancelar"}),jsx(ut,{variant:"contained",type:"submit",children:"Salvar"})]})})]})},Co=Do;
|
|
46
46
|
|
|
47
|
-
export {
|
|
47
|
+
export { Zt as AiSummary, ro as DashboardLayout, lo as ExportButton, Co as FilterDate };
|
|
48
48
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/Analytics/AiSummary/index.tsx","../../../src/components/Analytics/AiSummary/Skeleton.tsx","../../../src/components/Analytics/AiSummary/styles.ts","../../../src/components/Analytics/AiSummary/Summary.tsx","../../../src/components/Analytics/AiSummary/Header.tsx","../../../src/components/Analytics/DashboardLayout/index.tsx","../../../src/components/Analytics/ExportButton/styles.ts","../../../src/components/Analytics/ExportButton/index.tsx","../../../src/components/Analytics/FilterDate/index.tsx","../../../src/components/Analytics/FilterDate/styles.ts"],"names":["AlertTitle","Button","Typography","Stack","MuiAlert","alpha","keyframes","styled","gradientAnimation","Alert","theme","primaryMain","primaryLight","LoadingAlert","jsx","jsxs","AiSummarySkeleton","Icon_default","Skeleton_default","memo","Header","Header_default","defaultFormatContent","text","SummaryContent","detail","formatContent","format","isHtml","Summary","open","toggleOpen","useResponsive_default","Drawer_default","Modal_default","Summary_default","Fragment","AiSummary","brief","isLoading","useToggle_default","Result_default","AiSummary_default","Box","DashboardLayout","dashboard","widgets","item","index","NoAccess","DashboardLayout_default","LoadingButton","MuiButton","ItemButton","ExportButton","onExport","isExporting","onOpen","onClose","usePopover_default","handleExport","MenuPopover_default","ExportFormat","ExportButton_default","useCallback","useState","useForm","Divider","FormControlLabel","Radio","RadioGroup","dayjs","DateRangeCalendar","DateRangeCalendar_default","daysOfWeek","FilterDate","value","onSave","isMobile","methods","handleSubmit","setValue","getValues","selectedPeriod","setSelectedPeriod","dateRange","setDateRange","handlePeriodChange","period","dates","getPeriodDates","handleCalendarChange","newRange","matchingPeriod","findMatchingPeriod","handleStartDateChange","date","endDate","handleEndDateChange","startDate","handleAutocompletePeriodChange","newValue","onSubmit","formData","toFilterDateState","Form_default","DateField_default","SimpleCard_default","Autocomplete_default","periodOptions","_","FilterPeriod","o","day","FilterDate_default"],"mappings":"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","sourcesContent":["import AlertTitle from '@mui/material/AlertTitle';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\nimport Result from 'components/Result';\nimport useToggle from 'hooks/useToggle';\n\nimport { AiSummaryProps } from './props';\nimport AiSummarySkeleton from './Skeleton';\nimport { Alert } from './styles';\nimport Summary from './Summary';\n\nconst AiSummary = ({\n brief,\n detail,\n isLoading = false,\n formatContent,\n}: AiSummaryProps) => {\n const [open, toggleOpen] = useToggle(false);\n\n const hasSummary = !!brief && !!detail;\n\n if (!hasSummary && !isLoading) return null;\n\n return (\n <>\n <Result isLoading={isLoading} loading={<AiSummarySkeleton />}>\n <Alert\n icon={<Icon icon=\"AI_08_SOLID_ROUND\" color=\"primary.main\" />}\n action={\n <Button\n variant={isLoading ? 'contained' : 'text'}\n color=\"primary\"\n size=\"small\"\n onClick={toggleOpen}\n >\n Ver mais\n </Button>\n }\n >\n <AlertTitle variant=\"subtitle1\" color=\"text.primary\">\n Resumo inteligente\n </AlertTitle>\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {brief}\n </Typography>\n </Alert>\n </Result>\n\n <Summary\n open={open}\n toggleOpen={toggleOpen}\n detail={detail ?? ''}\n formatContent={formatContent}\n />\n </>\n );\n};\n\nexport default AiSummary;\n","import AlertTitle from '@mui/material/AlertTitle';\nimport Stack from '@mui/material/Stack';\n\nimport Icon from 'components/Icon';\nimport Skeleton from 'components/Skeleton';\n\nimport { LoadingAlert } from './styles';\n\nconst AiSummarySkeleton = () => (\n <LoadingAlert\n icon={<Icon icon=\"AI_08_SOLID_ROUND\" color=\"primary.main\" />}\n action={<Skeleton variant=\"text\" width={100} height={30} />}\n >\n <AlertTitle variant=\"subtitle1\" color=\"text.primary\">\n Resumo inteligente\n </AlertTitle>\n\n <Stack gap={0.5}>\n <Skeleton variant=\"text\" width=\"100%\" height={30} />\n <Skeleton variant=\"text\" width=\"80%\" height={30} />\n </Stack>\n </LoadingAlert>\n);\n\nexport default AiSummarySkeleton;\n","import MuiAlert from '@mui/material/Alert';\nimport { alpha, keyframes, styled } from '@mui/material/styles';\n\nconst gradientAnimation = keyframes`\n 0% {\n background-position: 0% 50%;\n }\n 100% {\n background-position: 200% 50%;\n }\n`;\n\nexport const Alert = styled(MuiAlert)(({ theme }) => {\n const primaryMain = theme.palette.primary.main;\n const primaryLight = alpha(primaryMain, 0.1);\n\n return {\n position: 'relative',\n\n backgroundColor: alpha(theme.palette.primary.main, 0.01),\n border: '1px solid transparent',\n\n borderRadius: 8,\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n borderRadius: 'inherit',\n padding: '1px',\n background: `linear-gradient(90deg, ${primaryMain} 0%, ${primaryLight} 50%, ${primaryMain} 100%)`,\n WebkitMask:\n 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n maskComposite: 'exclude',\n pointerEvents: 'none',\n },\n\n overflow: 'hidden',\n\n '& .MuiAlert-message': {\n width: '100%',\n },\n };\n});\n\nexport const LoadingAlert = styled(Alert)({\n border: '1px solid transparent',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n borderRadius: 'inherit',\n padding: '1px',\n background: 'linear-gradient(90deg, #e01cd5 0%, #1CB5E0 50%, #e01cd5 100%)',\n backgroundSize: '200% auto',\n WebkitMask:\n 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n maskComposite: 'exclude',\n pointerEvents: 'none',\n animation: `${gradientAnimation} 2s linear infinite`,\n },\n});\n","import { memo } from 'react';\nimport Typography from '@mui/material/Typography';\n\nimport Drawer from 'components/Drawer';\nimport Modal from 'components/Modal';\nimport useResponsive from 'hooks/useResponsive';\n\nimport Header from './Header';\nimport { SummaryContentProps, SummaryProps } from './props';\n\nconst defaultFormatContent = (text: string) => text;\n\nconst SummaryContent = ({ detail, formatContent }: SummaryContentProps) => {\n const format = formatContent ?? defaultFormatContent;\n const isHtml = formatContent != null;\n\n return (\n <Typography variant=\"body2\" color=\"text.primary\">\n {isHtml ? (\n <span dangerouslySetInnerHTML={{ __html: format(detail) }} />\n ) : (\n detail\n )}\n </Typography>\n );\n};\n\nconst Summary = ({ open, toggleOpen, detail, formatContent }: SummaryProps) => {\n const isMobile = useResponsive('down', 'sm');\n\n if (isMobile) {\n return (\n <Drawer\n open={open}\n onClose={toggleOpen}\n headerTitle={<Header />}\n headerProps={{\n direction: 'row-reverse',\n sx: { '& > :last-child': { minWidth: 0, overflow: 'hidden' } },\n }}\n >\n <SummaryContent detail={detail} formatContent={formatContent} />\n </Drawer>\n );\n }\n\n return (\n <Modal\n open={open}\n onClose={toggleOpen}\n dialogTitle={<Header />}\n dialogTitleProps={{ sx: { flex: 1, overflow: 'hidden' } }}\n maxWidth=\"md\"\n fullWidth\n scroll=\"paper\"\n >\n <SummaryContent detail={detail} formatContent={formatContent} />\n </Modal>\n );\n};\n\nexport default memo(Summary);\n","import Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\n\nconst Header = () => (\n <Stack direction=\"row\" alignItems=\"center\" gap={1.5}>\n <Icon icon=\"AI_08_SOLID_ROUND\" color=\"primary.main\" sx={{ flexGrow: 0 }} />\n\n <Stack>\n <Typography variant=\"subtitle1\" color=\"text.primary\">\n Resumo inteligente\n </Typography>\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n Gerado com base nos dados consolidados da página.\n </Typography>\n </Stack>\n </Stack>\n);\n\nexport default Header;\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\n\nimport type { DashboardLayoutProps } from './props';\n\n/**\n * Monta uma tela de Análises a partir do layout da organização: os widgets saem na ordem do\n * layout, em largura cheia ou meia, num grid de duas colunas que vira uma coluna no mobile.\n *\n * Widget sem componente registrado no front fica de fora — melhor faltar um card do que\n * quebrar a tela. Widget sem permissão para os dados mostra um aviso no lugar.\n */\nconst DashboardLayout = ({ dashboard, widgets }: DashboardLayoutProps) => (\n <Box\n display=\"grid\"\n gridTemplateColumns={{ xs: '1fr', md: 'repeat(2, minmax(0, 1fr))' }}\n gap={3}\n >\n {dashboard.widgets\n .filter(item => item.widget in widgets)\n .map((item, index) => (\n <Box\n key={`${item.widget}-${index}`}\n data-testid={`analytics-widget-${item.widget}`}\n gridColumn={{ xs: 'span 1', md: item.width === 'FULL' ? 'span 2' : 'span 1' }}\n minWidth={0}\n >\n {item.accessible ? widgets[item.widget] : <NoAccess />}\n </Box>\n ))}\n </Box>\n);\n\nconst NoAccess = () => (\n <Stack\n minHeight={200}\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={1}\n border={1}\n borderColor=\"divider\"\n borderRadius={2}\n >\n <Icon icon=\"SECURITY_LOCK\" width={32} color=\"text.secondary\" />\n <Typography variant=\"body2\" color=\"text.secondary\">\n Você não tem permissão para ver estes dados.\n </Typography>\n </Stack>\n);\n\nexport default DashboardLayout;\n","import LoadingButton from '@mui/lab/LoadingButton';\nimport MuiButton from '@mui/material/Button';\nimport { styled } from '@mui/material/styles';\n\nexport const Button = styled(MuiButton)(({ theme }) => ({\n color: theme.palette.text.secondary,\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n}));\n\nexport const ItemButton = styled(LoadingButton)(({ theme }) => ({\n justifyContent: 'flex-start',\n\n color: theme.palette.text.secondary,\n fontWeight: 400,\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n}));\n","import Icon from 'components/Icon';\nimport MenuPopover from 'components/MenuPopover';\nimport usePopover from 'hooks/usePopover';\nimport { ExportFormat } from 'utils/analytics';\n\nimport { ExportButtonProps } from './props';\nimport { Button, ItemButton } from './styles';\n\nconst ExportButton = ({ onExport, isExporting }: ExportButtonProps) => {\n const { open, onOpen, onClose } = usePopover();\n\n const handleExport = (format: ExportFormat) => {\n onExport(format);\n onClose();\n };\n\n return (\n <>\n <Button\n variant=\"text\"\n startIcon={<Icon icon=\"DOWNLOAD\" />}\n color=\"primary\"\n size=\"small\"\n onClick={onOpen}\n disabled={isExporting}\n >\n {isExporting ? 'Exportando...' : 'Exportar'}\n </Button>\n\n <MenuPopover\n open={open}\n onClose={onClose}\n disabledArrow\n sx={{ p: 1, width: 180 }}\n >\n {Object.values(ExportFormat).map((format, index) => (\n <ItemButton\n key={index}\n variant=\"text\"\n onClick={() => handleExport(format)}\n loading={isExporting}\n fullWidth\n data-testid={`export-button-${index}`}\n >\n {format}\n </ItemButton>\n ))}\n </MenuPopover>\n </>\n );\n};\n\nexport default ExportButton;\n","import { useCallback, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport Button from '@mui/material/Button';\nimport Divider from '@mui/material/Divider';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Radio from '@mui/material/Radio';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport dayjs from 'dayjs';\n\nimport Autocomplete from 'components/Autocomplete';\nimport DateField from 'components/form/DateField';\nimport Form from 'components/form/Form';\nimport SimpleCard from 'components/SimpleCard';\nimport useResponsive from 'hooks/useResponsive';\nimport { FilterPeriod } from 'utils/analytics';\nimport {\n findMatchingPeriod,\n getPeriodDates,\n periodOptions,\n toFilterDateState,\n} from 'utils/periodDates';\n\nimport { FilterDateForm, FilterDateProps } from './props';\nimport { DateRangeCalendar } from './styles';\n\nconst daysOfWeek = ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'];\n\nconst FilterDate = ({ value, onSave, onClose }: FilterDateProps) => {\n const isMobile = useResponsive('down', 'sm');\n\n const methods = useForm<FilterDateForm>({\n defaultValues: {\n period: value.period,\n start_date: value.start_date ? dayjs(value.start_date).toDate() : null,\n end_date: value.end_date ? dayjs(value.end_date).toDate() : null,\n },\n });\n\n const { handleSubmit, setValue, getValues } = methods;\n\n const [selectedPeriod, setSelectedPeriod] = useState<FilterPeriod>(\n value.period,\n );\n\n const [dateRange, setDateRange] = useState<[Date | null, Date | null]>(() => [\n value.start_date ? dayjs(value.start_date).toDate() : null,\n value.end_date ? dayjs(value.end_date).toDate() : null,\n ]);\n\n const handlePeriodChange = useCallback(\n (period: FilterPeriod) => {\n const dates = getPeriodDates(period);\n\n setSelectedPeriod(period);\n setDateRange([dates.start_date, dates.end_date]);\n\n setValue('period', period);\n setValue('start_date', dates.start_date);\n setValue('end_date', dates.end_date);\n },\n [setValue],\n );\n\n const handleCalendarChange = useCallback(\n (newRange: [Date | null, Date | null]) => {\n setDateRange(newRange);\n\n if (newRange[0]) setValue('start_date', newRange[0]);\n if (newRange[1]) setValue('end_date', newRange[1]);\n\n if (newRange[0] && newRange[1]) {\n const matchingPeriod = findMatchingPeriod(newRange[0], newRange[1]);\n setSelectedPeriod(matchingPeriod);\n setValue('period', matchingPeriod);\n }\n },\n [setValue],\n );\n\n const handleStartDateChange = useCallback(\n (date: Date) => {\n setValue('start_date', date);\n\n const endDate = getValues('end_date');\n\n if (date && endDate) {\n const newRange: [Date, Date] = [date, endDate];\n setDateRange(newRange);\n const matchingPeriod = findMatchingPeriod(newRange[0], newRange[1]);\n setSelectedPeriod(matchingPeriod);\n setValue('period', matchingPeriod);\n }\n },\n [getValues, setValue],\n );\n\n const handleEndDateChange = useCallback(\n (date: Date) => {\n setValue('end_date', date);\n\n const startDate = getValues('start_date');\n\n if (startDate && date) {\n const newRange: [Date, Date] = [startDate, date];\n setDateRange(newRange);\n const matchingPeriod = findMatchingPeriod(newRange[0], newRange[1]);\n setSelectedPeriod(matchingPeriod);\n setValue('period', matchingPeriod);\n }\n },\n [getValues, setValue],\n );\n\n const handleAutocompletePeriodChange = useCallback(\n (newValue: string | string[] | null) => {\n if (newValue && typeof newValue === 'string') {\n handlePeriodChange(newValue as FilterPeriod);\n }\n },\n [handlePeriodChange],\n );\n\n const onSubmit = useCallback(\n (formData: FilterDateForm) => {\n onSave(toFilterDateState(formData));\n },\n [onSave],\n );\n\n return (\n <Form methods={methods} onSubmit={handleSubmit(onSubmit)} gap={3}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n Defina o período\n </Typography>\n\n <Stack\n display=\"grid\"\n gridTemplateColumns=\"1fr 1fr\"\n alignItems=\"center\"\n gap={1.5}\n >\n <DateField\n name=\"start_date\"\n label=\"Data inicial\"\n size=\"small\"\n onChange={handleStartDateChange}\n />\n <DateField\n name=\"end_date\"\n label=\"Data final\"\n size=\"small\"\n onChange={handleEndDateChange}\n />\n </Stack>\n\n <SimpleCard\n direction={{ xs: 'column', sm: 'row' }}\n alignItems=\"center\"\n justifyContent={{ xs: 'center', sm: 'space-between' }}\n gap={{ xs: 3, sm: 0 }}\n overflow=\"hidden\"\n >\n {!isMobile ? (\n <RadioGroup\n value={selectedPeriod}\n onChange={(_, newValue) =>\n handlePeriodChange(newValue as FilterPeriod)\n }\n >\n {Object.values(FilterPeriod).map(period => (\n <FormControlLabel\n key={period}\n value={period}\n control={<Radio size=\"small\" />}\n label={periodOptions.find(o => o.value === period)?.label}\n />\n ))}\n </RadioGroup>\n ) : (\n <Autocomplete\n name=\"period\"\n value={selectedPeriod}\n onChange={handleAutocompletePeriodChange}\n options={periodOptions}\n size=\"small\"\n disableClearable\n fullWidth\n />\n )}\n\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{ display: { xs: 'none', sm: 'block' } }}\n />\n\n <DateRangeCalendar\n value={dateRange}\n onChange={handleCalendarChange}\n calendars={1}\n showDaysOutsideCurrentMonth\n fixedWeekNumber={6}\n disableFuture\n dayOfWeekFormatter={day => {\n return daysOfWeek[day.day()];\n }}\n />\n </SimpleCard>\n\n <Stack alignItems=\"flex-end\">\n <Stack direction=\"row\" alignItems=\"center\" gap={1.5}>\n <Button variant=\"outlined\" color=\"inherit\" onClick={onClose}>\n Cancelar\n </Button>\n\n <Button variant=\"contained\" type=\"submit\">\n Salvar\n </Button>\n </Stack>\n </Stack>\n </Form>\n );\n};\n\nexport default FilterDate;\n","import { styled } from '@mui/material/styles';\n\nimport CommonDateRangeCalendar from 'components/DateRangeCalendar';\n\nexport const DateRangeCalendar = styled(CommonDateRangeCalendar)(\n ({ theme }) => ({\n '&.MuiDateRangeCalendar-root': {\n margin: -24,\n },\n\n '& .MuiPickersCalendarHeader-label': {\n textTransform: 'capitalize',\n },\n\n [theme.breakpoints.down(400)]: {\n '& .MuiPickersCalendarHeader-root': {\n padding: theme.spacing(0, 7),\n },\n\n '& .MuiDayCalendar-header, & .MuiDayCalendar-weekContainer': {\n gap: 0,\n },\n\n '& .MuiPickersDay-root, & .MuiDateRangePickerDay-root': {\n width: 32,\n height: 32,\n },\n\n '& .MuiDayCalendar-weekDayLabel': {\n width: 32,\n height: 32,\n },\n\n '& .MuiDayCalendar-slideTransition': {\n minHeight: 210,\n },\n },\n\n [theme.breakpoints.down(350)]: {\n '& .MuiPickersDay-root, & .MuiDateRangePickerDay-root': {\n width: 28,\n height: 28,\n },\n\n '& .MuiDayCalendar-weekDayLabel': {\n width: 28,\n height: 28,\n },\n\n '& .MuiDayCalendar-slideTransition': {\n minHeight: 196,\n },\n },\n }),\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Analytics/AiSummary/index.tsx","../../../src/components/Analytics/AiSummary/Skeleton.tsx","../../../src/components/Analytics/AiSummary/styles.ts","../../../src/components/Analytics/AiSummary/Summary.tsx","../../../src/components/Analytics/AiSummary/Header.tsx","../../../src/components/Analytics/DashboardLayout/index.tsx","../../../src/components/Analytics/ExportButton/styles.ts","../../../src/components/Analytics/ExportButton/index.tsx","../../../src/components/Analytics/FilterDate/index.tsx","../../../src/components/Analytics/FilterDate/styles.ts"],"names":["AlertTitle","Button","Typography","Stack","MuiAlert","alpha","keyframes","styled","gradientAnimation","Alert","theme","primaryMain","primaryLight","LoadingAlert","jsx","jsxs","AiSummarySkeleton","Icon_default","Skeleton_default","memo","Header","Header_default","defaultFormatContent","text","SummaryContent","detail","formatContent","format","isHtml","Summary","open","toggleOpen","useResponsive_default","Drawer_default","Modal_default","Summary_default","Fragment","AiSummary","brief","isLoading","useToggle_default","Result_default","AiSummary_default","Box","DashboardLayout","dashboard","widgets","item","index","widget","content","NoAccess","DashboardLayout_default","LoadingButton","MuiButton","ItemButton","ExportButton","onExport","isExporting","onOpen","onClose","usePopover_default","handleExport","MenuPopover_default","ExportFormat","ExportButton_default","useCallback","useState","useForm","Divider","FormControlLabel","Radio","RadioGroup","dayjs","DateRangeCalendar","DateRangeCalendar_default","daysOfWeek","FilterDate","value","onSave","isMobile","methods","handleSubmit","setValue","getValues","selectedPeriod","setSelectedPeriod","dateRange","setDateRange","handlePeriodChange","period","dates","getPeriodDates","handleCalendarChange","newRange","matchingPeriod","findMatchingPeriod","handleStartDateChange","date","endDate","handleEndDateChange","startDate","handleAutocompletePeriodChange","newValue","onSubmit","formData","toFilterDateState","Form_default","DateField_default","SimpleCard_default","Autocomplete_default","periodOptions","_","FilterPeriod","o","day","FilterDate_default"],"mappings":"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","sourcesContent":["import AlertTitle from '@mui/material/AlertTitle';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\nimport Result from 'components/Result';\nimport useToggle from 'hooks/useToggle';\n\nimport { AiSummaryProps } from './props';\nimport AiSummarySkeleton from './Skeleton';\nimport { Alert } from './styles';\nimport Summary from './Summary';\n\nconst AiSummary = ({\n brief,\n detail,\n isLoading = false,\n formatContent,\n}: AiSummaryProps) => {\n const [open, toggleOpen] = useToggle(false);\n\n const hasSummary = !!brief && !!detail;\n\n if (!hasSummary && !isLoading) return null;\n\n return (\n <>\n <Result isLoading={isLoading} loading={<AiSummarySkeleton />}>\n <Alert\n icon={<Icon icon=\"AI_08_SOLID_ROUND\" color=\"primary.main\" />}\n action={\n <Button\n variant={isLoading ? 'contained' : 'text'}\n color=\"primary\"\n size=\"small\"\n onClick={toggleOpen}\n >\n Ver mais\n </Button>\n }\n >\n <AlertTitle variant=\"subtitle1\" color=\"text.primary\">\n Resumo inteligente\n </AlertTitle>\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n {brief}\n </Typography>\n </Alert>\n </Result>\n\n <Summary\n open={open}\n toggleOpen={toggleOpen}\n detail={detail ?? ''}\n formatContent={formatContent}\n />\n </>\n );\n};\n\nexport default AiSummary;\n","import AlertTitle from '@mui/material/AlertTitle';\nimport Stack from '@mui/material/Stack';\n\nimport Icon from 'components/Icon';\nimport Skeleton from 'components/Skeleton';\n\nimport { LoadingAlert } from './styles';\n\nconst AiSummarySkeleton = () => (\n <LoadingAlert\n icon={<Icon icon=\"AI_08_SOLID_ROUND\" color=\"primary.main\" />}\n action={<Skeleton variant=\"text\" width={100} height={30} />}\n >\n <AlertTitle variant=\"subtitle1\" color=\"text.primary\">\n Resumo inteligente\n </AlertTitle>\n\n <Stack gap={0.5}>\n <Skeleton variant=\"text\" width=\"100%\" height={30} />\n <Skeleton variant=\"text\" width=\"80%\" height={30} />\n </Stack>\n </LoadingAlert>\n);\n\nexport default AiSummarySkeleton;\n","import MuiAlert from '@mui/material/Alert';\nimport { alpha, keyframes, styled } from '@mui/material/styles';\n\nconst gradientAnimation = keyframes`\n 0% {\n background-position: 0% 50%;\n }\n 100% {\n background-position: 200% 50%;\n }\n`;\n\nexport const Alert = styled(MuiAlert)(({ theme }) => {\n const primaryMain = theme.palette.primary.main;\n const primaryLight = alpha(primaryMain, 0.1);\n\n return {\n position: 'relative',\n\n backgroundColor: alpha(theme.palette.primary.main, 0.01),\n border: '1px solid transparent',\n\n borderRadius: 8,\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n borderRadius: 'inherit',\n padding: '1px',\n background: `linear-gradient(90deg, ${primaryMain} 0%, ${primaryLight} 50%, ${primaryMain} 100%)`,\n WebkitMask:\n 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n maskComposite: 'exclude',\n pointerEvents: 'none',\n },\n\n overflow: 'hidden',\n\n '& .MuiAlert-message': {\n width: '100%',\n },\n };\n});\n\nexport const LoadingAlert = styled(Alert)({\n border: '1px solid transparent',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n borderRadius: 'inherit',\n padding: '1px',\n background: 'linear-gradient(90deg, #e01cd5 0%, #1CB5E0 50%, #e01cd5 100%)',\n backgroundSize: '200% auto',\n WebkitMask:\n 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n maskComposite: 'exclude',\n pointerEvents: 'none',\n animation: `${gradientAnimation} 2s linear infinite`,\n },\n});\n","import { memo } from 'react';\nimport Typography from '@mui/material/Typography';\n\nimport Drawer from 'components/Drawer';\nimport Modal from 'components/Modal';\nimport useResponsive from 'hooks/useResponsive';\n\nimport Header from './Header';\nimport { SummaryContentProps, SummaryProps } from './props';\n\nconst defaultFormatContent = (text: string) => text;\n\nconst SummaryContent = ({ detail, formatContent }: SummaryContentProps) => {\n const format = formatContent ?? defaultFormatContent;\n const isHtml = formatContent != null;\n\n return (\n <Typography variant=\"body2\" color=\"text.primary\">\n {isHtml ? (\n <span dangerouslySetInnerHTML={{ __html: format(detail) }} />\n ) : (\n detail\n )}\n </Typography>\n );\n};\n\nconst Summary = ({ open, toggleOpen, detail, formatContent }: SummaryProps) => {\n const isMobile = useResponsive('down', 'sm');\n\n if (isMobile) {\n return (\n <Drawer\n open={open}\n onClose={toggleOpen}\n headerTitle={<Header />}\n headerProps={{\n direction: 'row-reverse',\n sx: { '& > :last-child': { minWidth: 0, overflow: 'hidden' } },\n }}\n >\n <SummaryContent detail={detail} formatContent={formatContent} />\n </Drawer>\n );\n }\n\n return (\n <Modal\n open={open}\n onClose={toggleOpen}\n dialogTitle={<Header />}\n dialogTitleProps={{ sx: { flex: 1, overflow: 'hidden' } }}\n maxWidth=\"md\"\n fullWidth\n scroll=\"paper\"\n >\n <SummaryContent detail={detail} formatContent={formatContent} />\n </Modal>\n );\n};\n\nexport default memo(Summary);\n","import Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\n\nconst Header = () => (\n <Stack direction=\"row\" alignItems=\"center\" gap={1.5}>\n <Icon icon=\"AI_08_SOLID_ROUND\" color=\"primary.main\" sx={{ flexGrow: 0 }} />\n\n <Stack>\n <Typography variant=\"subtitle1\" color=\"text.primary\">\n Resumo inteligente\n </Typography>\n\n <Typography variant=\"body2\" color=\"text.secondary\">\n Gerado com base nos dados consolidados da página.\n </Typography>\n </Stack>\n </Stack>\n);\n\nexport default Header;\n","import Box from '@mui/material/Box';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\nimport Icon from 'components/Icon';\n\nimport type { DashboardLayoutProps } from './props';\n\n/**\n * Monta uma tela de Análises a partir do layout da organização: os widgets saem na ordem do\n * layout, em largura cheia ou meia, num grid de duas colunas que vira uma coluna no mobile.\n *\n * Widget sem componente registrado no front fica de fora — melhor faltar um card do que\n * quebrar a tela. Widget sem permissão para os dados mostra um aviso no lugar.\n */\nconst DashboardLayout = ({ dashboard, widgets }: DashboardLayoutProps) => (\n <Box\n display=\"grid\"\n gridTemplateColumns={{ xs: '1fr', md: 'repeat(2, minmax(0, 1fr))' }}\n gap={3}\n >\n {dashboard.widgets\n .filter(item => item.widget in widgets)\n .map((item, index) => {\n const widget = widgets[item.widget];\n const content = typeof widget === 'function' ? widget(item) : widget;\n return (\n <Box\n key={`${item.library_widget_id ?? item.widget}-${index}`}\n data-testid={`analytics-widget-${item.widget}`}\n gridColumn={{ xs: 'span 1', md: item.width === 'FULL' ? 'span 2' : 'span 1' }}\n minWidth={0}\n >\n {item.accessible ? (\n <>\n {item.title && (\n <Typography\n variant=\"subtitle1\"\n fontWeight={600}\n mb={1}\n data-testid=\"analytics-library-widget-title\"\n >\n {item.title}\n </Typography>\n )}\n {content}\n </>\n ) : <NoAccess />}\n </Box>\n );\n })}\n </Box>\n);\n\nconst NoAccess = () => (\n <Stack\n minHeight={200}\n alignItems=\"center\"\n justifyContent=\"center\"\n gap={1}\n border={1}\n borderColor=\"divider\"\n borderRadius={2}\n >\n <Icon icon=\"SECURITY_LOCK\" width={32} color=\"text.secondary\" />\n <Typography variant=\"body2\" color=\"text.secondary\">\n Você não tem permissão para ver estes dados.\n </Typography>\n </Stack>\n);\n\nexport default DashboardLayout;\n","import LoadingButton from '@mui/lab/LoadingButton';\nimport MuiButton from '@mui/material/Button';\nimport { styled } from '@mui/material/styles';\n\nexport const Button = styled(MuiButton)(({ theme }) => ({\n color: theme.palette.text.secondary,\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n}));\n\nexport const ItemButton = styled(LoadingButton)(({ theme }) => ({\n justifyContent: 'flex-start',\n\n color: theme.palette.text.secondary,\n fontWeight: 400,\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n}));\n","import Icon from 'components/Icon';\nimport MenuPopover from 'components/MenuPopover';\nimport usePopover from 'hooks/usePopover';\nimport { ExportFormat } from 'utils/analytics';\n\nimport { ExportButtonProps } from './props';\nimport { Button, ItemButton } from './styles';\n\nconst ExportButton = ({ onExport, isExporting }: ExportButtonProps) => {\n const { open, onOpen, onClose } = usePopover();\n\n const handleExport = (format: ExportFormat) => {\n onExport(format);\n onClose();\n };\n\n return (\n <>\n <Button\n variant=\"text\"\n startIcon={<Icon icon=\"DOWNLOAD\" />}\n color=\"primary\"\n size=\"small\"\n onClick={onOpen}\n disabled={isExporting}\n >\n {isExporting ? 'Exportando...' : 'Exportar'}\n </Button>\n\n <MenuPopover\n open={open}\n onClose={onClose}\n disabledArrow\n sx={{ p: 1, width: 180 }}\n >\n {Object.values(ExportFormat).map((format, index) => (\n <ItemButton\n key={index}\n variant=\"text\"\n onClick={() => handleExport(format)}\n loading={isExporting}\n fullWidth\n data-testid={`export-button-${index}`}\n >\n {format}\n </ItemButton>\n ))}\n </MenuPopover>\n </>\n );\n};\n\nexport default ExportButton;\n","import { useCallback, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport Button from '@mui/material/Button';\nimport Divider from '@mui/material/Divider';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport Radio from '@mui/material/Radio';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport dayjs from 'dayjs';\n\nimport Autocomplete from 'components/Autocomplete';\nimport DateField from 'components/form/DateField';\nimport Form from 'components/form/Form';\nimport SimpleCard from 'components/SimpleCard';\nimport useResponsive from 'hooks/useResponsive';\nimport { FilterPeriod } from 'utils/analytics';\nimport {\n findMatchingPeriod,\n getPeriodDates,\n periodOptions,\n toFilterDateState,\n} from 'utils/periodDates';\n\nimport { FilterDateForm, FilterDateProps } from './props';\nimport { DateRangeCalendar } from './styles';\n\nconst daysOfWeek = ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'];\n\nconst FilterDate = ({ value, onSave, onClose }: FilterDateProps) => {\n const isMobile = useResponsive('down', 'sm');\n\n const methods = useForm<FilterDateForm>({\n defaultValues: {\n period: value.period,\n start_date: value.start_date ? dayjs(value.start_date).toDate() : null,\n end_date: value.end_date ? dayjs(value.end_date).toDate() : null,\n },\n });\n\n const { handleSubmit, setValue, getValues } = methods;\n\n const [selectedPeriod, setSelectedPeriod] = useState<FilterPeriod>(\n value.period,\n );\n\n const [dateRange, setDateRange] = useState<[Date | null, Date | null]>(() => [\n value.start_date ? dayjs(value.start_date).toDate() : null,\n value.end_date ? dayjs(value.end_date).toDate() : null,\n ]);\n\n const handlePeriodChange = useCallback(\n (period: FilterPeriod) => {\n const dates = getPeriodDates(period);\n\n setSelectedPeriod(period);\n setDateRange([dates.start_date, dates.end_date]);\n\n setValue('period', period);\n setValue('start_date', dates.start_date);\n setValue('end_date', dates.end_date);\n },\n [setValue],\n );\n\n const handleCalendarChange = useCallback(\n (newRange: [Date | null, Date | null]) => {\n setDateRange(newRange);\n\n if (newRange[0]) setValue('start_date', newRange[0]);\n if (newRange[1]) setValue('end_date', newRange[1]);\n\n if (newRange[0] && newRange[1]) {\n const matchingPeriod = findMatchingPeriod(newRange[0], newRange[1]);\n setSelectedPeriod(matchingPeriod);\n setValue('period', matchingPeriod);\n }\n },\n [setValue],\n );\n\n const handleStartDateChange = useCallback(\n (date: Date) => {\n setValue('start_date', date);\n\n const endDate = getValues('end_date');\n\n if (date && endDate) {\n const newRange: [Date, Date] = [date, endDate];\n setDateRange(newRange);\n const matchingPeriod = findMatchingPeriod(newRange[0], newRange[1]);\n setSelectedPeriod(matchingPeriod);\n setValue('period', matchingPeriod);\n }\n },\n [getValues, setValue],\n );\n\n const handleEndDateChange = useCallback(\n (date: Date) => {\n setValue('end_date', date);\n\n const startDate = getValues('start_date');\n\n if (startDate && date) {\n const newRange: [Date, Date] = [startDate, date];\n setDateRange(newRange);\n const matchingPeriod = findMatchingPeriod(newRange[0], newRange[1]);\n setSelectedPeriod(matchingPeriod);\n setValue('period', matchingPeriod);\n }\n },\n [getValues, setValue],\n );\n\n const handleAutocompletePeriodChange = useCallback(\n (newValue: string | string[] | null) => {\n if (newValue && typeof newValue === 'string') {\n handlePeriodChange(newValue as FilterPeriod);\n }\n },\n [handlePeriodChange],\n );\n\n const onSubmit = useCallback(\n (formData: FilterDateForm) => {\n onSave(toFilterDateState(formData));\n },\n [onSave],\n );\n\n return (\n <Form methods={methods} onSubmit={handleSubmit(onSubmit)} gap={3}>\n <Typography variant=\"overline\" color=\"text.secondary\">\n Defina o período\n </Typography>\n\n <Stack\n display=\"grid\"\n gridTemplateColumns=\"1fr 1fr\"\n alignItems=\"center\"\n gap={1.5}\n >\n <DateField\n name=\"start_date\"\n label=\"Data inicial\"\n size=\"small\"\n onChange={handleStartDateChange}\n />\n <DateField\n name=\"end_date\"\n label=\"Data final\"\n size=\"small\"\n onChange={handleEndDateChange}\n />\n </Stack>\n\n <SimpleCard\n direction={{ xs: 'column', sm: 'row' }}\n alignItems=\"center\"\n justifyContent={{ xs: 'center', sm: 'space-between' }}\n gap={{ xs: 3, sm: 0 }}\n overflow=\"hidden\"\n >\n {!isMobile ? (\n <RadioGroup\n value={selectedPeriod}\n onChange={(_, newValue) =>\n handlePeriodChange(newValue as FilterPeriod)\n }\n >\n {Object.values(FilterPeriod).map(period => (\n <FormControlLabel\n key={period}\n value={period}\n control={<Radio size=\"small\" />}\n label={periodOptions.find(o => o.value === period)?.label}\n />\n ))}\n </RadioGroup>\n ) : (\n <Autocomplete\n name=\"period\"\n value={selectedPeriod}\n onChange={handleAutocompletePeriodChange}\n options={periodOptions}\n size=\"small\"\n disableClearable\n fullWidth\n />\n )}\n\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={{ display: { xs: 'none', sm: 'block' } }}\n />\n\n <DateRangeCalendar\n value={dateRange}\n onChange={handleCalendarChange}\n calendars={1}\n showDaysOutsideCurrentMonth\n fixedWeekNumber={6}\n disableFuture\n dayOfWeekFormatter={day => {\n return daysOfWeek[day.day()];\n }}\n />\n </SimpleCard>\n\n <Stack alignItems=\"flex-end\">\n <Stack direction=\"row\" alignItems=\"center\" gap={1.5}>\n <Button variant=\"outlined\" color=\"inherit\" onClick={onClose}>\n Cancelar\n </Button>\n\n <Button variant=\"contained\" type=\"submit\">\n Salvar\n </Button>\n </Stack>\n </Stack>\n </Form>\n );\n};\n\nexport default FilterDate;\n","import { styled } from '@mui/material/styles';\n\nimport CommonDateRangeCalendar from 'components/DateRangeCalendar';\n\nexport const DateRangeCalendar = styled(CommonDateRangeCalendar)(\n ({ theme }) => ({\n '&.MuiDateRangeCalendar-root': {\n margin: -24,\n },\n\n '& .MuiPickersCalendarHeader-label': {\n textTransform: 'capitalize',\n },\n\n [theme.breakpoints.down(400)]: {\n '& .MuiPickersCalendarHeader-root': {\n padding: theme.spacing(0, 7),\n },\n\n '& .MuiDayCalendar-header, & .MuiDayCalendar-weekContainer': {\n gap: 0,\n },\n\n '& .MuiPickersDay-root, & .MuiDateRangePickerDay-root': {\n width: 32,\n height: 32,\n },\n\n '& .MuiDayCalendar-weekDayLabel': {\n width: 32,\n height: 32,\n },\n\n '& .MuiDayCalendar-slideTransition': {\n minHeight: 210,\n },\n },\n\n [theme.breakpoints.down(350)]: {\n '& .MuiPickersDay-root, & .MuiDateRangePickerDay-root': {\n width: 28,\n height: 28,\n },\n\n '& .MuiDayCalendar-weekDayLabel': {\n width: 28,\n height: 28,\n },\n\n '& .MuiDayCalendar-slideTransition': {\n minHeight: 196,\n },\n },\n }),\n);\n"]}
|