@iclips/ui 2.0.0 → 2.0.1
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.
- package/dist/components/ui/charts/kpi-card.cjs +1 -1
- package/dist/components/ui/charts/kpi-card.cjs.map +1 -1
- package/dist/components/ui/charts/kpi-card.js +69 -65
- package/dist/components/ui/charts/kpi-card.js.map +1 -1
- package/dist/components/ui/forms/date-picker.cjs +1 -1
- package/dist/components/ui/forms/date-picker.cjs.map +1 -1
- package/dist/components/ui/forms/date-picker.js +104 -102
- package/dist/components/ui/forms/date-picker.js.map +1 -1
- package/dist/components/ui/forms/date-range-picker.cjs +1 -1
- package/dist/components/ui/forms/date-range-picker.cjs.map +1 -1
- package/dist/components/ui/forms/date-range-picker.js +167 -165
- package/dist/components/ui/forms/date-range-picker.js.map +1 -1
- package/dist/components/ui/forms/month-range-picker.cjs +1 -1
- package/dist/components/ui/forms/month-range-picker.cjs.map +1 -1
- package/dist/components/ui/forms/month-range-picker.js +141 -139
- package/dist/components/ui/forms/month-range-picker.js.map +1 -1
- package/dist/components/ui/use-controllable-value.cjs +2 -0
- package/dist/components/ui/use-controllable-value.cjs.map +1 -0
- package/dist/components/ui/use-controllable-value.js +14 -0
- package/dist/components/ui/use-controllable-value.js.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.cts +31 -10
- package/dist/index.d.ts +31 -10
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),ee=require("react"),S=require("lucide-react"),te=require("../utils.cjs"),se=require("../use-controllable-value.cjs"),V=require("./input.cjs"),h=require("../primitives/button.cjs"),Y=require("../overlays/popover.cjs");function ne(o){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const l in o)if(l!=="default"){const c=Object.getOwnPropertyDescriptor(o,l);Object.defineProperty(n,l,c.get?c:{enumerable:!0,get:()=>o[l]})}}return n.default=o,Object.freeze(n)}const f=ne(ee),z=["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"];function w(o,n){return o*12+n}function F(o){return`${z[o.getMonth()]}/${o.getFullYear()}`}function E(o){const n=o.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\d{1,2})\/(\d{4})$/);if(!n)return null;const[,l,c]=n,a=Number(c);if(Number.isNaN(a))return null;let i;if(/^\d+$/.test(l))i=Number(l);else{const u=z.findIndex(m=>m.toLowerCase()===l.toLowerCase().slice(0,3));if(u===-1)return null;i=u+1}return i<1||i>12?null:new Date(a,i-1,1)}function re(o){const n=o.trim();if(!n)return null;const l=["→","-","até","a"];for(const c of l){if(!n.includes(c))continue;const a=n.split(c).map(m=>m.trim());if(a.length!==2)continue;const i=E(a[0]),u=E(a[1]);if(i&&u)return w(i.getFullYear(),i.getMonth()+1)>w(u.getFullYear(),u.getMonth()+1)?null:{from:i,to:u}}return null}function L({titulo:o,year:n,onYearChange:l,minYear:c,maxYear:a,selectedMonth:i,selectedYear:u,onSelect:m,isMonthDisabled:p}){return s.jsxs("div",{className:"p-3 w-56",children:[s.jsx("p",{className:"text-xs font-medium text-muted-foreground mb-2",children:o}),s.jsxs("div",{className:"flex items-center justify-center mb-2 gap-1",children:[s.jsx(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>l(Math.max(c,n-1)),disabled:n<=c,children:s.jsx(S.ChevronLeft,{className:"h-4 w-4"})}),s.jsx(V.Input,{type:"number",className:"w-20 text-center h-8",value:n,min:c,max:a,onChange:g=>{const x=Number(g.target.value);Number.isNaN(x)||l(x)}}),s.jsx(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>l(Math.min(a,n+1)),disabled:n>=a,children:s.jsx(S.ChevronRight,{className:"h-4 w-4"})})]}),s.jsx("div",{className:"grid grid-cols-3 gap-1",children:z.map((g,x)=>{const y=x+1,e=(p==null?void 0:p(n,y))??!1,j=n===u&&y===i;return s.jsx(h.Button,{type:"button",variant:j?"default":"ghost",size:"sm",className:"px-0",disabled:e,onClick:()=>m(n,y),children:g},g)})})]})}const J=f.forwardRef(({value:o,defaultValue:n,onChange:l,placeholder:c="Selecione um período",disabled:a=!1,minYear:i=2020,maxYear:u=new Date().getFullYear()+5,className:m,error:p=!1,id:g,name:x},y)=>{var O,q,$,A;const[e,j]=se.useControllableValue(o,n,l),[K,I]=f.useState(!1),[t,v]=f.useState(e),[C,N]=f.useState(""),[k,d]=f.useState(!1),[T,P]=f.useState(()=>((e==null?void 0:e.from)??new Date).getFullYear()),[_,R]=f.useState(()=>((e==null?void 0:e.to)??new Date).getFullYear());f.useEffect(()=>{v(e),e!=null&&e.from&&P(e.from.getFullYear()),e!=null&&e.to&&R(e.to.getFullYear()),e!=null&&e.from&&(e!=null&&e.to)?N(`${F(e.from)} → ${F(e.to)}`):N(""),d(!1)},[e]);const Z=(r,b)=>{const M=new Date(r,b-1,1),W=t!=null&&t.to&&w(t.to.getFullYear(),t.to.getMonth()+1)>=w(r,b)?t.to:M;v({from:M,to:W})},X=(r,b)=>{if(!(t!=null&&t.from))return;const M=new Date(r,b-1,1);v({from:t.from,to:M})},G=(r,b)=>t!=null&&t.from?w(r,b)<w(t.from.getFullYear(),t.from.getMonth()+1):!1,H=()=>{j(t),I(!1)},D=r=>{r.stopPropagation(),v(void 0),N(""),d(!1),j(void 0)},Q=r=>{a||(N(r.target.value.replace(/[^A-Za-zÀ-ÿ\d/\s→-]/g,"")),d(!1))},B=()=>{if(a)return;if(!C.trim()){v(void 0),j(void 0),d(!1);return}const r=re(C);r?(v(r),P(r.from.getFullYear()),R(r.to.getFullYear()),j(r),d(!1)):d(!0)},U=r=>{r.key==="Enter"?(r.preventDefault(),B(),k||I(!0)):r.key==="Escape"&&(r.preventDefault(),e!=null&&e.from&&(e!=null&&e.to)?N(`${F(e.from)} → ${F(e.to)}`):N(""),d(!1))};return s.jsxs(Y.Popover,{open:!a&&K,onOpenChange:r=>{a||I(r)},children:[s.jsxs("div",{className:"relative w-full",children:[s.jsx(V.Input,{ref:y,id:g,name:x,value:C,onChange:Q,onBlur:B,onKeyDown:U,placeholder:c,disabled:a,"aria-invalid":p||k,className:te.cn("pr-20",(p||k)&&"border-destructive focus-visible:ring-destructive/20",m)}),s.jsxs("div",{className:"absolute inset-y-0 right-0 flex items-center gap-1 pr-1",children:[C&&!a&&s.jsxs(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0 hover:bg-transparent",onClick:D,tabIndex:-1,children:[s.jsx(S.X,{className:"h-4 w-4 text-muted-foreground hover:text-foreground"}),s.jsx("span",{className:"sr-only",children:"Limpar"})]}),s.jsx(Y.PopoverTrigger,{asChild:!0,children:s.jsx(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0 hover:bg-transparent",disabled:a,"aria-label":"Abrir calendário",children:s.jsx(S.CalendarIcon,{className:"h-4 w-4 text-muted-foreground"})})})]})]}),s.jsxs(Y.PopoverContent,{align:"start",className:"w-auto p-0 max-w-[calc(100vw-2rem)]",children:[s.jsxs("div",{className:"flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x",children:[s.jsx(L,{titulo:"Mês inicial",year:T,onYearChange:P,minYear:i,maxYear:u,selectedYear:((O=t==null?void 0:t.from)==null?void 0:O.getFullYear())??-1,selectedMonth:(((q=t==null?void 0:t.from)==null?void 0:q.getMonth())??-2)+1,onSelect:Z}),s.jsx(L,{titulo:"Mês final",year:_,onYearChange:R,minYear:i,maxYear:u,selectedYear:(($=t==null?void 0:t.to)==null?void 0:$.getFullYear())??-1,selectedMonth:(((A=t==null?void 0:t.to)==null?void 0:A.getMonth())??-2)+1,onSelect:X,isMonthDisabled:G})]}),s.jsxs("div",{className:"border-t p-3 flex justify-end gap-2",children:[s.jsx(h.Button,{type:"button",variant:"outline",size:"sm",onClick:D,children:"Limpar"}),s.jsx(h.Button,{type:"button",size:"sm",disabled:!(t!=null&&t.from)||!(t!=null&&t.to),onClick:H,children:"Confirmar"})]})]})]})});J.displayName="MonthRangePicker";exports.MonthRangePicker=J;
|
|
2
2
|
//# sourceMappingURL=month-range-picker.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"month-range-picker.cjs","sources":["../../../../src/components/ui/forms/month-range-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { CalendarIcon, ChevronLeft, ChevronRight, X } from \"lucide-react\";\n\nimport { cn } from \"../utils\";\nimport { Input } from \"./input\";\nimport { Button } from \"../primitives/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\n\nconst MESES = [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"];\n\nexport interface MonthYearRange {\n from: Date;\n to: Date;\n}\n\nexport interface MonthRangePickerProps {\n /**\n * Intervalo de meses selecionado. `from`/`to` representam o 1º dia do mês.\n */\n value?: MonthYearRange;\n /**\n * Callback quando o intervalo muda\n */\n onChange?: (range: MonthYearRange | undefined) => void;\n /**\n * Placeholder do campo\n * @default \"Selecione um período\"\n */\n placeholder?: string;\n /**\n * Desabilita o componente\n */\n disabled?: boolean;\n /**\n * Ano mínimo navegável\n * @default 2020\n */\n minYear?: number;\n /**\n * Ano máximo navegável\n * @default anoAtual + 5\n */\n maxYear?: number;\n /**\n * Classes CSS adicionais para o trigger\n */\n className?: string;\n /**\n * Estado de erro\n */\n error?: boolean;\n /**\n * ID do campo para acessibilidade\n */\n id?: string;\n /**\n * Nome do campo para formulários\n */\n name?: string;\n}\n\nfunction monthKey(year: number, month: number) {\n return year * 12 + month;\n}\n\nfunction formatMesAno(date: Date) {\n return `${MESES[date.getMonth()]}/${date.getFullYear()}`;\n}\n\nfunction parseMesAno(input: string): Date | null {\n const match = input.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\\d{1,2})\\/(\\d{4})$/);\n if (!match) return null;\n\n const [, monthRaw, yearRaw] = match;\n const year = Number(yearRaw);\n if (Number.isNaN(year)) return null;\n\n let month: number;\n if (/^\\d+$/.test(monthRaw)) {\n month = Number(monthRaw);\n } else {\n const idx = MESES.findIndex((m) => m.toLowerCase() === monthRaw.toLowerCase().slice(0, 3));\n if (idx === -1) return null;\n month = idx + 1;\n }\n if (month < 1 || month > 12) return null;\n\n return new Date(year, month - 1, 1);\n}\n\nfunction parseInputRange(input: string): MonthYearRange | null {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const separators = [\"→\", \"-\", \"até\", \"a\"];\n for (const sep of separators) {\n if (!trimmed.includes(sep)) continue;\n const parts = trimmed.split(sep).map((p) => p.trim());\n if (parts.length !== 2) continue;\n\n const from = parseMesAno(parts[0]);\n const to = parseMesAno(parts[1]);\n if (from && to) {\n // Mês final anterior ao inicial é inválido (não é corrigido silenciosamente) — dispara estado de erro no input\n if (monthKey(from.getFullYear(), from.getMonth() + 1) > monthKey(to.getFullYear(), to.getMonth() + 1)) {\n return null;\n }\n return { from, to };\n }\n }\n\n return null;\n}\n\ninterface MonthPanelProps {\n titulo: string;\n year: number;\n onYearChange: (year: number) => void;\n minYear: number;\n maxYear: number;\n selectedMonth: number;\n selectedYear: number;\n onSelect: (year: number, month: number) => void;\n isMonthDisabled?: (year: number, month: number) => boolean;\n}\n\nfunction PainelMes({\n titulo,\n year,\n onYearChange,\n minYear,\n maxYear,\n selectedMonth,\n selectedYear,\n onSelect,\n isMonthDisabled,\n}: MonthPanelProps) {\n return (\n <div className=\"p-3 w-56\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">{titulo}</p>\n <div className=\"flex items-center justify-center mb-2 gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.max(minYear, year - 1))}\n disabled={year <= minYear}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Input\n type=\"number\"\n className=\"w-20 text-center h-8\"\n value={year}\n min={minYear}\n max={maxYear}\n onChange={(e) => {\n const parsed = Number(e.target.value);\n if (!Number.isNaN(parsed)) onYearChange(parsed);\n }}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.min(maxYear, year + 1))}\n disabled={year >= maxYear}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {MESES.map((label, idx) => {\n const month = idx + 1;\n const disabled = isMonthDisabled?.(year, month) ?? false;\n const selected = year === selectedYear && month === selectedMonth;\n return (\n <Button\n key={label}\n type=\"button\"\n variant={selected ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"px-0\"\n disabled={disabled}\n onClick={() => onSelect(year, month)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * MonthRangePicker - Seleção de intervalo de meses (Mês/Ano Início + Mês/Ano Fim)\n *\n * @example\n * <MonthRangePicker\n * value={periodo}\n * onChange={setPeriodo}\n * placeholder=\"Selecione o período\"\n * />\n *\n * @example\n * // Digitação direta\n * // Set/2025 → Mar/2026\n * // 09/2025 - 03/2026\n */\nconst MonthRangePicker = React.forwardRef<\n React.ElementRef<typeof Input>,\n MonthRangePickerProps\n>(({\n value,\n onChange,\n placeholder = \"Selecione um período\",\n disabled = false,\n minYear = 2020,\n maxYear = new Date().getFullYear() + 5,\n className,\n error = false,\n id,\n name,\n}, ref) => {\n const [open, setOpen] = React.useState(false);\n const [pending, setPending] = React.useState<MonthYearRange | undefined>(value);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [isInvalid, setIsInvalid] = React.useState(false);\n const [yearInicio, setYearInicio] = React.useState(() => (value?.from ?? new Date()).getFullYear());\n const [yearFim, setYearFim] = React.useState(() => (value?.to ?? new Date()).getFullYear());\n\n React.useEffect(() => {\n setPending(value);\n if (value?.from) setYearInicio(value.from.getFullYear());\n if (value?.to) setYearFim(value.to.getFullYear());\n\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }, [value]);\n\n const handleSelectInicio = (year: number, month: number) => {\n const from = new Date(year, month - 1, 1);\n const to = pending?.to && monthKey(pending.to.getFullYear(), pending.to.getMonth() + 1) >= monthKey(year, month)\n ? pending.to\n : from;\n setPending({ from, to });\n };\n\n const handleSelectFim = (year: number, month: number) => {\n if (!pending?.from) return;\n const to = new Date(year, month - 1, 1);\n setPending({ from: pending.from, to });\n };\n\n const isFimDisabled = (year: number, month: number) => {\n if (!pending?.from) return false;\n return monthKey(year, month) < monthKey(pending.from.getFullYear(), pending.from.getMonth() + 1);\n };\n\n const handleConfirm = () => {\n onChange?.(pending);\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setPending(undefined);\n setInputValue(\"\");\n setIsInvalid(false);\n onChange?.(undefined);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n setInputValue(e.target.value);\n setIsInvalid(false);\n };\n\n const handleInputBlur = () => {\n if (disabled) return;\n if (!inputValue.trim()) {\n setPending(undefined);\n onChange?.(undefined);\n setIsInvalid(false);\n return;\n }\n\n const parsed = parseInputRange(inputValue);\n if (parsed) {\n setPending(parsed);\n setYearInicio(parsed.from.getFullYear());\n setYearFim(parsed.to.getFullYear());\n onChange?.(parsed);\n setIsInvalid(false);\n } else {\n setIsInvalid(true);\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleInputBlur();\n if (!isInvalid) setOpen(true);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }\n };\n\n return (\n <Popover open={!disabled && open} onOpenChange={(o) => { if (!disabled) setOpen(o); }}>\n <div className=\"relative w-full\">\n <Input\n ref={ref}\n id={id}\n name={name}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error || isInvalid}\n className={cn(\n \"pr-20\",\n (error || isInvalid) && \"border-destructive focus-visible:ring-destructive/20\",\n className,\n )}\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center gap-1 pr-1\">\n {inputValue && !disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n onClick={handleClear}\n tabIndex={-1}\n >\n <X className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />\n <span className=\"sr-only\">Limpar</span>\n </Button>\n )}\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n disabled={disabled}\n aria-label=\"Abrir calendário\"\n >\n <CalendarIcon className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n </PopoverTrigger>\n </div>\n </div>\n <PopoverContent align=\"start\" className=\"w-auto p-0 max-w-[calc(100vw-2rem)]\">\n <div className=\"flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x\">\n <PainelMes\n titulo=\"Mês inicial\"\n year={yearInicio}\n onYearChange={setYearInicio}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.from?.getFullYear() ?? -1}\n selectedMonth={(pending?.from?.getMonth() ?? -2) + 1}\n onSelect={handleSelectInicio}\n />\n <PainelMes\n titulo=\"Mês final\"\n year={yearFim}\n onYearChange={setYearFim}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.to?.getFullYear() ?? -1}\n selectedMonth={(pending?.to?.getMonth() ?? -2) + 1}\n onSelect={handleSelectFim}\n isMonthDisabled={isFimDisabled}\n />\n </div>\n <div className=\"border-t p-3 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClear}>\n Limpar\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={!pending?.from || !pending?.to}\n onClick={handleConfirm}\n >\n Confirmar\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n});\n\nMonthRangePicker.displayName = \"MonthRangePicker\";\n\nexport { MonthRangePicker };\n"],"names":["MESES","monthKey","year","month","formatMesAno","date","parseMesAno","input","match","monthRaw","yearRaw","idx","m","parseInputRange","trimmed","separators","sep","parts","p","from","to","PainelMes","titulo","onYearChange","minYear","maxYear","selectedMonth","selectedYear","onSelect","isMonthDisabled","jsxs","jsx","Button","ChevronLeft","Input","e","parsed","ChevronRight","label","disabled","selected","MonthRangePicker","React","value","onChange","placeholder","className","error","id","name","ref","open","setOpen","pending","setPending","inputValue","setInputValue","isInvalid","setIsInvalid","yearInicio","setYearInicio","yearFim","setYearFim","handleSelectInicio","handleSelectFim","isFimDisabled","handleConfirm","handleClear","handleInputChange","handleInputBlur","handleInputKeyDown","Popover","cn","X","PopoverTrigger","CalendarIcon","PopoverContent","_a","_b","_c","_d"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"month-range-picker.cjs","sources":["../../../../src/components/ui/forms/month-range-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { CalendarIcon, ChevronLeft, ChevronRight, X } from \"lucide-react\";\n\nimport { cn } from \"../utils\";\nimport { useControllableValue } from \"../use-controllable-value\";\nimport { Input } from \"./input\";\nimport { Button } from \"../primitives/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\n\nconst MESES = [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"];\n\nexport interface MonthYearRange {\n from: Date;\n to: Date;\n}\n\nexport interface MonthRangePickerProps {\n /**\n * Intervalo de meses selecionado (modo controlado). `from`/`to` representam o\n * 1º dia do mês. Omita para o modo não-controlado.\n */\n value?: MonthYearRange;\n /**\n * Valor inicial no modo não-controlado (quando `value` não é passado).\n */\n defaultValue?: MonthYearRange;\n /**\n * Callback quando o intervalo muda. Chamado nos dois modos.\n */\n onChange?: (range: MonthYearRange | undefined) => void;\n /**\n * Placeholder do campo\n * @default \"Selecione um período\"\n */\n placeholder?: string;\n /**\n * Desabilita o componente\n */\n disabled?: boolean;\n /**\n * Ano mínimo navegável\n * @default 2020\n */\n minYear?: number;\n /**\n * Ano máximo navegável\n * @default anoAtual + 5\n */\n maxYear?: number;\n /**\n * Classes CSS adicionais para o trigger\n */\n className?: string;\n /**\n * Estado de erro\n */\n error?: boolean;\n /**\n * ID do campo para acessibilidade\n */\n id?: string;\n /**\n * Nome do campo para formulários\n */\n name?: string;\n}\n\nfunction monthKey(year: number, month: number) {\n return year * 12 + month;\n}\n\nfunction formatMesAno(date: Date) {\n return `${MESES[date.getMonth()]}/${date.getFullYear()}`;\n}\n\nfunction parseMesAno(input: string): Date | null {\n const match = input.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\\d{1,2})\\/(\\d{4})$/);\n if (!match) return null;\n\n const [, monthRaw, yearRaw] = match;\n const year = Number(yearRaw);\n if (Number.isNaN(year)) return null;\n\n let month: number;\n if (/^\\d+$/.test(monthRaw)) {\n month = Number(monthRaw);\n } else {\n const idx = MESES.findIndex((m) => m.toLowerCase() === monthRaw.toLowerCase().slice(0, 3));\n if (idx === -1) return null;\n month = idx + 1;\n }\n if (month < 1 || month > 12) return null;\n\n return new Date(year, month - 1, 1);\n}\n\nfunction parseInputRange(input: string): MonthYearRange | null {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const separators = [\"→\", \"-\", \"até\", \"a\"];\n for (const sep of separators) {\n if (!trimmed.includes(sep)) continue;\n const parts = trimmed.split(sep).map((p) => p.trim());\n if (parts.length !== 2) continue;\n\n const from = parseMesAno(parts[0]);\n const to = parseMesAno(parts[1]);\n if (from && to) {\n // Mês final anterior ao inicial é inválido (não é corrigido silenciosamente) — dispara estado de erro no input\n if (monthKey(from.getFullYear(), from.getMonth() + 1) > monthKey(to.getFullYear(), to.getMonth() + 1)) {\n return null;\n }\n return { from, to };\n }\n }\n\n return null;\n}\n\ninterface MonthPanelProps {\n titulo: string;\n year: number;\n onYearChange: (year: number) => void;\n minYear: number;\n maxYear: number;\n selectedMonth: number;\n selectedYear: number;\n onSelect: (year: number, month: number) => void;\n isMonthDisabled?: (year: number, month: number) => boolean;\n}\n\nfunction PainelMes({\n titulo,\n year,\n onYearChange,\n minYear,\n maxYear,\n selectedMonth,\n selectedYear,\n onSelect,\n isMonthDisabled,\n}: MonthPanelProps) {\n return (\n <div className=\"p-3 w-56\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">{titulo}</p>\n <div className=\"flex items-center justify-center mb-2 gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.max(minYear, year - 1))}\n disabled={year <= minYear}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Input\n type=\"number\"\n className=\"w-20 text-center h-8\"\n value={year}\n min={minYear}\n max={maxYear}\n onChange={(e) => {\n const parsed = Number(e.target.value);\n if (!Number.isNaN(parsed)) onYearChange(parsed);\n }}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.min(maxYear, year + 1))}\n disabled={year >= maxYear}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {MESES.map((label, idx) => {\n const month = idx + 1;\n const disabled = isMonthDisabled?.(year, month) ?? false;\n const selected = year === selectedYear && month === selectedMonth;\n return (\n <Button\n key={label}\n type=\"button\"\n variant={selected ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"px-0\"\n disabled={disabled}\n onClick={() => onSelect(year, month)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * MonthRangePicker - Seleção de intervalo de meses (Mês/Ano Início + Mês/Ano Fim)\n *\n * @example\n * <MonthRangePicker\n * value={periodo}\n * onChange={setPeriodo}\n * placeholder=\"Selecione o período\"\n * />\n *\n * @example\n * // Digitação direta\n * // Set/2025 → Mar/2026\n * // 09/2025 - 03/2026\n */\nconst MonthRangePicker = React.forwardRef<\n React.ElementRef<typeof Input>,\n MonthRangePickerProps\n>(({\n value: valueProp,\n defaultValue,\n onChange,\n placeholder = \"Selecione um período\",\n disabled = false,\n minYear = 2020,\n maxYear = new Date().getFullYear() + 5,\n className,\n error = false,\n id,\n name,\n}, ref) => {\n const [value, setValue] = useControllableValue<MonthYearRange>(valueProp, defaultValue, onChange);\n const [open, setOpen] = React.useState(false);\n const [pending, setPending] = React.useState<MonthYearRange | undefined>(value);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [isInvalid, setIsInvalid] = React.useState(false);\n const [yearInicio, setYearInicio] = React.useState(() => (value?.from ?? new Date()).getFullYear());\n const [yearFim, setYearFim] = React.useState(() => (value?.to ?? new Date()).getFullYear());\n\n React.useEffect(() => {\n setPending(value);\n if (value?.from) setYearInicio(value.from.getFullYear());\n if (value?.to) setYearFim(value.to.getFullYear());\n\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }, [value]);\n\n const handleSelectInicio = (year: number, month: number) => {\n const from = new Date(year, month - 1, 1);\n const to = pending?.to && monthKey(pending.to.getFullYear(), pending.to.getMonth() + 1) >= monthKey(year, month)\n ? pending.to\n : from;\n setPending({ from, to });\n };\n\n const handleSelectFim = (year: number, month: number) => {\n if (!pending?.from) return;\n const to = new Date(year, month - 1, 1);\n setPending({ from: pending.from, to });\n };\n\n const isFimDisabled = (year: number, month: number) => {\n if (!pending?.from) return false;\n return monthKey(year, month) < monthKey(pending.from.getFullYear(), pending.from.getMonth() + 1);\n };\n\n const handleConfirm = () => {\n setValue(pending);\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setPending(undefined);\n setInputValue(\"\");\n setIsInvalid(false);\n setValue(undefined);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n // Aceita \"09/2026\" e \"Set/2026\" (nome do mês) — filtra pontuação/símbolos fora disso.\n setInputValue(e.target.value.replace(/[^A-Za-zÀ-ÿ\\d/\\s→-]/g, \"\"));\n setIsInvalid(false);\n };\n\n const handleInputBlur = () => {\n if (disabled) return;\n if (!inputValue.trim()) {\n setPending(undefined);\n setValue(undefined);\n setIsInvalid(false);\n return;\n }\n\n const parsed = parseInputRange(inputValue);\n if (parsed) {\n setPending(parsed);\n setYearInicio(parsed.from.getFullYear());\n setYearFim(parsed.to.getFullYear());\n setValue(parsed);\n setIsInvalid(false);\n } else {\n setIsInvalid(true);\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleInputBlur();\n if (!isInvalid) setOpen(true);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }\n };\n\n return (\n <Popover open={!disabled && open} onOpenChange={(o) => { if (!disabled) setOpen(o); }}>\n <div className=\"relative w-full\">\n <Input\n ref={ref}\n id={id}\n name={name}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error || isInvalid}\n className={cn(\n \"pr-20\",\n (error || isInvalid) && \"border-destructive focus-visible:ring-destructive/20\",\n className,\n )}\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center gap-1 pr-1\">\n {inputValue && !disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n onClick={handleClear}\n tabIndex={-1}\n >\n <X className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />\n <span className=\"sr-only\">Limpar</span>\n </Button>\n )}\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n disabled={disabled}\n aria-label=\"Abrir calendário\"\n >\n <CalendarIcon className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n </PopoverTrigger>\n </div>\n </div>\n <PopoverContent align=\"start\" className=\"w-auto p-0 max-w-[calc(100vw-2rem)]\">\n <div className=\"flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x\">\n <PainelMes\n titulo=\"Mês inicial\"\n year={yearInicio}\n onYearChange={setYearInicio}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.from?.getFullYear() ?? -1}\n selectedMonth={(pending?.from?.getMonth() ?? -2) + 1}\n onSelect={handleSelectInicio}\n />\n <PainelMes\n titulo=\"Mês final\"\n year={yearFim}\n onYearChange={setYearFim}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.to?.getFullYear() ?? -1}\n selectedMonth={(pending?.to?.getMonth() ?? -2) + 1}\n onSelect={handleSelectFim}\n isMonthDisabled={isFimDisabled}\n />\n </div>\n <div className=\"border-t p-3 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClear}>\n Limpar\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={!pending?.from || !pending?.to}\n onClick={handleConfirm}\n >\n Confirmar\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n});\n\nMonthRangePicker.displayName = \"MonthRangePicker\";\n\nexport { MonthRangePicker };\n"],"names":["MESES","monthKey","year","month","formatMesAno","date","parseMesAno","input","match","monthRaw","yearRaw","idx","parseInputRange","trimmed","separators","sep","parts","p","from","to","PainelMes","titulo","onYearChange","minYear","maxYear","selectedMonth","selectedYear","onSelect","isMonthDisabled","jsxs","jsx","Button","ChevronLeft","Input","e","parsed","ChevronRight","label","disabled","selected","MonthRangePicker","React","valueProp","defaultValue","onChange","placeholder","className","error","id","name","ref","value","setValue","useControllableValue","open","setOpen","pending","setPending","inputValue","setInputValue","isInvalid","setIsInvalid","yearInicio","setYearInicio","yearFim","setYearFim","handleSelectInicio","handleSelectFim","isFimDisabled","handleConfirm","handleClear","handleInputChange","handleInputBlur","handleInputKeyDown","Popover","o","cn","X","PopoverTrigger","CalendarIcon","PopoverContent","_a","_b","_c","_d"],"mappings":"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"}
|
|
@@ -1,61 +1,62 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsxs as
|
|
3
|
-
import * as
|
|
4
|
-
import { X as
|
|
5
|
-
import { cn as
|
|
6
|
-
import {
|
|
2
|
+
import { jsxs as u, jsx as s } from "react/jsx-runtime";
|
|
3
|
+
import * as f from "react";
|
|
4
|
+
import { X as U, CalendarIcon as W, ChevronLeft as _, ChevronRight as ee } from "lucide-react";
|
|
5
|
+
import { cn as te } from "../utils.js";
|
|
6
|
+
import { useControllableValue as re } from "../use-controllable-value.js";
|
|
7
|
+
import { Input as B } from "./input.js";
|
|
7
8
|
import { Button as p } from "../primitives/button.js";
|
|
8
|
-
import { Popover as
|
|
9
|
+
import { Popover as oe, PopoverTrigger as ne, PopoverContent as se } from "../overlays/popover.js";
|
|
9
10
|
const P = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"];
|
|
10
|
-
function
|
|
11
|
-
return
|
|
11
|
+
function C(l, o) {
|
|
12
|
+
return l * 12 + o;
|
|
12
13
|
}
|
|
13
|
-
function
|
|
14
|
-
return `${P[
|
|
14
|
+
function S(l) {
|
|
15
|
+
return `${P[l.getMonth()]}/${l.getFullYear()}`;
|
|
15
16
|
}
|
|
16
|
-
function K(
|
|
17
|
-
const
|
|
18
|
-
if (!
|
|
19
|
-
const [,
|
|
20
|
-
if (Number.isNaN(
|
|
21
|
-
let
|
|
22
|
-
if (/^\d+$/.test(
|
|
23
|
-
|
|
17
|
+
function K(l) {
|
|
18
|
+
const o = l.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\d{1,2})\/(\d{4})$/);
|
|
19
|
+
if (!o) return null;
|
|
20
|
+
const [, c, m] = o, n = Number(m);
|
|
21
|
+
if (Number.isNaN(n)) return null;
|
|
22
|
+
let a;
|
|
23
|
+
if (/^\d+$/.test(c))
|
|
24
|
+
a = Number(c);
|
|
24
25
|
else {
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
27
|
-
|
|
26
|
+
const i = P.findIndex((h) => h.toLowerCase() === c.toLowerCase().slice(0, 3));
|
|
27
|
+
if (i === -1) return null;
|
|
28
|
+
a = i + 1;
|
|
28
29
|
}
|
|
29
|
-
return
|
|
30
|
+
return a < 1 || a > 12 ? null : new Date(n, a - 1, 1);
|
|
30
31
|
}
|
|
31
|
-
function
|
|
32
|
-
const
|
|
33
|
-
if (!
|
|
34
|
-
const
|
|
35
|
-
for (const
|
|
36
|
-
if (!
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
return
|
|
32
|
+
function ae(l) {
|
|
33
|
+
const o = l.trim();
|
|
34
|
+
if (!o) return null;
|
|
35
|
+
const c = ["→", "-", "até", "a"];
|
|
36
|
+
for (const m of c) {
|
|
37
|
+
if (!o.includes(m)) continue;
|
|
38
|
+
const n = o.split(m).map((h) => h.trim());
|
|
39
|
+
if (n.length !== 2) continue;
|
|
40
|
+
const a = K(n[0]), i = K(n[1]);
|
|
41
|
+
if (a && i)
|
|
42
|
+
return C(a.getFullYear(), a.getMonth() + 1) > C(i.getFullYear(), i.getMonth() + 1) ? null : { from: a, to: i };
|
|
42
43
|
}
|
|
43
44
|
return null;
|
|
44
45
|
}
|
|
45
|
-
function
|
|
46
|
-
titulo:
|
|
47
|
-
year:
|
|
48
|
-
onYearChange:
|
|
49
|
-
minYear:
|
|
50
|
-
maxYear:
|
|
51
|
-
selectedMonth:
|
|
52
|
-
selectedYear:
|
|
53
|
-
onSelect:
|
|
54
|
-
isMonthDisabled:
|
|
46
|
+
function V({
|
|
47
|
+
titulo: l,
|
|
48
|
+
year: o,
|
|
49
|
+
onYearChange: c,
|
|
50
|
+
minYear: m,
|
|
51
|
+
maxYear: n,
|
|
52
|
+
selectedMonth: a,
|
|
53
|
+
selectedYear: i,
|
|
54
|
+
onSelect: h,
|
|
55
|
+
isMonthDisabled: g
|
|
55
56
|
}) {
|
|
56
|
-
return /* @__PURE__ */
|
|
57
|
-
/* @__PURE__ */ s("p", { className: "text-xs font-medium text-muted-foreground mb-2", children:
|
|
58
|
-
/* @__PURE__ */
|
|
57
|
+
return /* @__PURE__ */ u("div", { className: "p-3 w-56", children: [
|
|
58
|
+
/* @__PURE__ */ s("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: l }),
|
|
59
|
+
/* @__PURE__ */ u("div", { className: "flex items-center justify-center mb-2 gap-1", children: [
|
|
59
60
|
/* @__PURE__ */ s(
|
|
60
61
|
p,
|
|
61
62
|
{
|
|
@@ -63,22 +64,22 @@ function B({
|
|
|
63
64
|
variant: "ghost",
|
|
64
65
|
size: "sm",
|
|
65
66
|
className: "h-7 w-7 p-0",
|
|
66
|
-
onClick: () =>
|
|
67
|
-
disabled:
|
|
68
|
-
children: /* @__PURE__ */ s(
|
|
67
|
+
onClick: () => c(Math.max(m, o - 1)),
|
|
68
|
+
disabled: o <= m,
|
|
69
|
+
children: /* @__PURE__ */ s(_, { className: "h-4 w-4" })
|
|
69
70
|
}
|
|
70
71
|
),
|
|
71
72
|
/* @__PURE__ */ s(
|
|
72
|
-
|
|
73
|
+
B,
|
|
73
74
|
{
|
|
74
75
|
type: "number",
|
|
75
76
|
className: "w-20 text-center h-8",
|
|
76
|
-
value:
|
|
77
|
-
min:
|
|
78
|
-
max:
|
|
79
|
-
onChange: (
|
|
80
|
-
const
|
|
81
|
-
Number.isNaN(
|
|
77
|
+
value: o,
|
|
78
|
+
min: m,
|
|
79
|
+
max: n,
|
|
80
|
+
onChange: (N) => {
|
|
81
|
+
const v = Number(N.target.value);
|
|
82
|
+
Number.isNaN(v) || c(v);
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
),
|
|
@@ -89,97 +90,98 @@ function B({
|
|
|
89
90
|
variant: "ghost",
|
|
90
91
|
size: "sm",
|
|
91
92
|
className: "h-7 w-7 p-0",
|
|
92
|
-
onClick: () =>
|
|
93
|
-
disabled:
|
|
94
|
-
children: /* @__PURE__ */ s(
|
|
93
|
+
onClick: () => c(Math.min(n, o + 1)),
|
|
94
|
+
disabled: o >= n,
|
|
95
|
+
children: /* @__PURE__ */ s(ee, { className: "h-4 w-4" })
|
|
95
96
|
}
|
|
96
97
|
)
|
|
97
98
|
] }),
|
|
98
|
-
/* @__PURE__ */ s("div", { className: "grid grid-cols-3 gap-1", children: P.map((
|
|
99
|
-
const
|
|
99
|
+
/* @__PURE__ */ s("div", { className: "grid grid-cols-3 gap-1", children: P.map((N, v) => {
|
|
100
|
+
const y = v + 1, e = (g == null ? void 0 : g(o, y)) ?? !1;
|
|
100
101
|
return /* @__PURE__ */ s(
|
|
101
102
|
p,
|
|
102
103
|
{
|
|
103
104
|
type: "button",
|
|
104
|
-
variant:
|
|
105
|
+
variant: o === i && y === a ? "default" : "ghost",
|
|
105
106
|
size: "sm",
|
|
106
107
|
className: "px-0",
|
|
107
|
-
disabled:
|
|
108
|
-
onClick: () =>
|
|
109
|
-
children:
|
|
108
|
+
disabled: e,
|
|
109
|
+
onClick: () => h(o, y),
|
|
110
|
+
children: N
|
|
110
111
|
},
|
|
111
|
-
|
|
112
|
+
N
|
|
112
113
|
);
|
|
113
114
|
}) })
|
|
114
115
|
] });
|
|
115
116
|
}
|
|
116
|
-
const
|
|
117
|
-
value:
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
const le = f.forwardRef(({
|
|
118
|
+
value: l,
|
|
119
|
+
defaultValue: o,
|
|
120
|
+
onChange: c,
|
|
121
|
+
placeholder: m = "Selecione um período",
|
|
120
122
|
disabled: n = !1,
|
|
121
|
-
minYear:
|
|
123
|
+
minYear: a = 2020,
|
|
122
124
|
maxYear: i = (/* @__PURE__ */ new Date()).getFullYear() + 5,
|
|
123
|
-
className:
|
|
124
|
-
error:
|
|
125
|
-
id:
|
|
126
|
-
name:
|
|
127
|
-
},
|
|
125
|
+
className: h,
|
|
126
|
+
error: g = !1,
|
|
127
|
+
id: N,
|
|
128
|
+
name: v
|
|
129
|
+
}, y) => {
|
|
128
130
|
var A, E, L, j;
|
|
129
|
-
const [F,
|
|
130
|
-
|
|
131
|
-
w(
|
|
132
|
-
}, [
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
w({ from:
|
|
136
|
-
},
|
|
137
|
-
if (!(
|
|
138
|
-
const
|
|
139
|
-
w({ from:
|
|
140
|
-
},
|
|
141
|
-
|
|
142
|
-
}, R = (
|
|
143
|
-
|
|
144
|
-
},
|
|
145
|
-
n || (
|
|
131
|
+
const [e, F] = re(l, o, c), [J, Y] = f.useState(!1), [t, w] = f.useState(e), [M, b] = f.useState(""), [k, d] = f.useState(!1), [O, z] = f.useState(() => ((e == null ? void 0 : e.from) ?? /* @__PURE__ */ new Date()).getFullYear()), [Z, D] = f.useState(() => ((e == null ? void 0 : e.to) ?? /* @__PURE__ */ new Date()).getFullYear());
|
|
132
|
+
f.useEffect(() => {
|
|
133
|
+
w(e), e != null && e.from && z(e.from.getFullYear()), e != null && e.to && D(e.to.getFullYear()), e != null && e.from && (e != null && e.to) ? b(`${S(e.from)} → ${S(e.to)}`) : b(""), d(!1);
|
|
134
|
+
}, [e]);
|
|
135
|
+
const T = (r, x) => {
|
|
136
|
+
const I = new Date(r, x - 1, 1), Q = t != null && t.to && C(t.to.getFullYear(), t.to.getMonth() + 1) >= C(r, x) ? t.to : I;
|
|
137
|
+
w({ from: I, to: Q });
|
|
138
|
+
}, X = (r, x) => {
|
|
139
|
+
if (!(t != null && t.from)) return;
|
|
140
|
+
const I = new Date(r, x - 1, 1);
|
|
141
|
+
w({ from: t.from, to: I });
|
|
142
|
+
}, q = (r, x) => t != null && t.from ? C(r, x) < C(t.from.getFullYear(), t.from.getMonth() + 1) : !1, G = () => {
|
|
143
|
+
F(t), Y(!1);
|
|
144
|
+
}, R = (r) => {
|
|
145
|
+
r.stopPropagation(), w(void 0), b(""), d(!1), F(void 0);
|
|
146
|
+
}, H = (r) => {
|
|
147
|
+
n || (b(r.target.value.replace(/[^A-Za-zÀ-ÿ\d/\s→-]/g, "")), d(!1));
|
|
146
148
|
}, $ = () => {
|
|
147
149
|
if (n) return;
|
|
148
|
-
if (!
|
|
149
|
-
w(void 0),
|
|
150
|
+
if (!M.trim()) {
|
|
151
|
+
w(void 0), F(void 0), d(!1);
|
|
150
152
|
return;
|
|
151
153
|
}
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
+
const r = ae(M);
|
|
155
|
+
r ? (w(r), z(r.from.getFullYear()), D(r.to.getFullYear()), F(r), d(!1)) : d(!0);
|
|
154
156
|
};
|
|
155
|
-
return /* @__PURE__ */
|
|
156
|
-
n ||
|
|
157
|
+
return /* @__PURE__ */ u(oe, { open: !n && J, onOpenChange: (r) => {
|
|
158
|
+
n || Y(r);
|
|
157
159
|
}, children: [
|
|
158
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ u("div", { className: "relative w-full", children: [
|
|
159
161
|
/* @__PURE__ */ s(
|
|
160
|
-
|
|
162
|
+
B,
|
|
161
163
|
{
|
|
162
|
-
ref:
|
|
163
|
-
id:
|
|
164
|
-
name:
|
|
165
|
-
value:
|
|
166
|
-
onChange:
|
|
164
|
+
ref: y,
|
|
165
|
+
id: N,
|
|
166
|
+
name: v,
|
|
167
|
+
value: M,
|
|
168
|
+
onChange: H,
|
|
167
169
|
onBlur: $,
|
|
168
|
-
onKeyDown: (
|
|
169
|
-
|
|
170
|
+
onKeyDown: (r) => {
|
|
171
|
+
r.key === "Enter" ? (r.preventDefault(), $(), k || Y(!0)) : r.key === "Escape" && (r.preventDefault(), e != null && e.from && (e != null && e.to) ? b(`${S(e.from)} → ${S(e.to)}`) : b(""), d(!1));
|
|
170
172
|
},
|
|
171
|
-
placeholder:
|
|
173
|
+
placeholder: m,
|
|
172
174
|
disabled: n,
|
|
173
|
-
"aria-invalid":
|
|
174
|
-
className:
|
|
175
|
+
"aria-invalid": g || k,
|
|
176
|
+
className: te(
|
|
175
177
|
"pr-20",
|
|
176
|
-
(
|
|
177
|
-
|
|
178
|
+
(g || k) && "border-destructive focus-visible:ring-destructive/20",
|
|
179
|
+
h
|
|
178
180
|
)
|
|
179
181
|
}
|
|
180
182
|
),
|
|
181
|
-
/* @__PURE__ */
|
|
182
|
-
|
|
183
|
+
/* @__PURE__ */ u("div", { className: "absolute inset-y-0 right-0 flex items-center gap-1 pr-1", children: [
|
|
184
|
+
M && !n && /* @__PURE__ */ u(
|
|
183
185
|
p,
|
|
184
186
|
{
|
|
185
187
|
type: "button",
|
|
@@ -189,12 +191,12 @@ const ot = u.forwardRef(({
|
|
|
189
191
|
onClick: R,
|
|
190
192
|
tabIndex: -1,
|
|
191
193
|
children: [
|
|
192
|
-
/* @__PURE__ */ s(
|
|
194
|
+
/* @__PURE__ */ s(U, { className: "h-4 w-4 text-muted-foreground hover:text-foreground" }),
|
|
193
195
|
/* @__PURE__ */ s("span", { className: "sr-only", children: "Limpar" })
|
|
194
196
|
]
|
|
195
197
|
}
|
|
196
198
|
),
|
|
197
|
-
/* @__PURE__ */ s(
|
|
199
|
+
/* @__PURE__ */ s(ne, { asChild: !0, children: /* @__PURE__ */ s(
|
|
198
200
|
p,
|
|
199
201
|
{
|
|
200
202
|
type: "button",
|
|
@@ -203,50 +205,50 @@ const ot = u.forwardRef(({
|
|
|
203
205
|
className: "h-7 w-7 p-0 hover:bg-transparent",
|
|
204
206
|
disabled: n,
|
|
205
207
|
"aria-label": "Abrir calendário",
|
|
206
|
-
children: /* @__PURE__ */ s(
|
|
208
|
+
children: /* @__PURE__ */ s(W, { className: "h-4 w-4 text-muted-foreground" })
|
|
207
209
|
}
|
|
208
210
|
) })
|
|
209
211
|
] })
|
|
210
212
|
] }),
|
|
211
|
-
/* @__PURE__ */
|
|
212
|
-
/* @__PURE__ */
|
|
213
|
+
/* @__PURE__ */ u(se, { align: "start", className: "w-auto p-0 max-w-[calc(100vw-2rem)]", children: [
|
|
214
|
+
/* @__PURE__ */ u("div", { className: "flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x", children: [
|
|
213
215
|
/* @__PURE__ */ s(
|
|
214
|
-
|
|
216
|
+
V,
|
|
215
217
|
{
|
|
216
218
|
titulo: "Mês inicial",
|
|
217
219
|
year: O,
|
|
218
|
-
onYearChange:
|
|
219
|
-
minYear:
|
|
220
|
+
onYearChange: z,
|
|
221
|
+
minYear: a,
|
|
220
222
|
maxYear: i,
|
|
221
|
-
selectedYear: ((A =
|
|
222
|
-
selectedMonth: (((E =
|
|
223
|
-
onSelect:
|
|
223
|
+
selectedYear: ((A = t == null ? void 0 : t.from) == null ? void 0 : A.getFullYear()) ?? -1,
|
|
224
|
+
selectedMonth: (((E = t == null ? void 0 : t.from) == null ? void 0 : E.getMonth()) ?? -2) + 1,
|
|
225
|
+
onSelect: T
|
|
224
226
|
}
|
|
225
227
|
),
|
|
226
228
|
/* @__PURE__ */ s(
|
|
227
|
-
|
|
229
|
+
V,
|
|
228
230
|
{
|
|
229
231
|
titulo: "Mês final",
|
|
230
|
-
year:
|
|
231
|
-
onYearChange:
|
|
232
|
-
minYear:
|
|
232
|
+
year: Z,
|
|
233
|
+
onYearChange: D,
|
|
234
|
+
minYear: a,
|
|
233
235
|
maxYear: i,
|
|
234
|
-
selectedYear: ((L =
|
|
235
|
-
selectedMonth: (((j =
|
|
236
|
-
onSelect:
|
|
237
|
-
isMonthDisabled:
|
|
236
|
+
selectedYear: ((L = t == null ? void 0 : t.to) == null ? void 0 : L.getFullYear()) ?? -1,
|
|
237
|
+
selectedMonth: (((j = t == null ? void 0 : t.to) == null ? void 0 : j.getMonth()) ?? -2) + 1,
|
|
238
|
+
onSelect: X,
|
|
239
|
+
isMonthDisabled: q
|
|
238
240
|
}
|
|
239
241
|
)
|
|
240
242
|
] }),
|
|
241
|
-
/* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ u("div", { className: "border-t p-3 flex justify-end gap-2", children: [
|
|
242
244
|
/* @__PURE__ */ s(p, { type: "button", variant: "outline", size: "sm", onClick: R, children: "Limpar" }),
|
|
243
245
|
/* @__PURE__ */ s(
|
|
244
246
|
p,
|
|
245
247
|
{
|
|
246
248
|
type: "button",
|
|
247
249
|
size: "sm",
|
|
248
|
-
disabled: !(
|
|
249
|
-
onClick:
|
|
250
|
+
disabled: !(t != null && t.from) || !(t != null && t.to),
|
|
251
|
+
onClick: G,
|
|
250
252
|
children: "Confirmar"
|
|
251
253
|
}
|
|
252
254
|
)
|
|
@@ -254,8 +256,8 @@ const ot = u.forwardRef(({
|
|
|
254
256
|
] })
|
|
255
257
|
] });
|
|
256
258
|
});
|
|
257
|
-
|
|
259
|
+
le.displayName = "MonthRangePicker";
|
|
258
260
|
export {
|
|
259
|
-
|
|
261
|
+
le as MonthRangePicker
|
|
260
262
|
};
|
|
261
263
|
//# sourceMappingURL=month-range-picker.js.map
|