fix(companies): corrige modal de edicao de empresas
All checks were successful
All checks were successful
- Corrige erro NaN nos campos numericos (reopenWindowDays, contractedHoursPerMonth) usando z.preprocess para converter NaN para null - Ajusta espacamento nos AccordionContent para melhor legibilidade - Define tamanho consistente nos botoes Cancelar/Salvar (size="sm") - Accordions agora iniciam fechados por padrao 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
a5bab2cc33
commit
d38d5d39eb
2 changed files with 20 additions and 17 deletions
|
|
@ -1102,12 +1102,13 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
</DialogDescription>
|
</DialogDescription>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<div className="flex flex-wrap items-center gap-2 md:justify-end">
|
<div className="flex flex-wrap items-center gap-2 md:justify-end">
|
||||||
<Button type="button" variant="outline" onClick={close} disabled={isSubmitting}>
|
<Button type="button" variant="outline" size="sm" onClick={close} disabled={isSubmitting}>
|
||||||
Cancelar
|
Cancelar
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
type="submit"
|
type="submit"
|
||||||
form="company-form"
|
form="company-form"
|
||||||
|
size="sm"
|
||||||
disabled={isSubmitting}
|
disabled={isSubmitting}
|
||||||
onClick={async (e) => {
|
onClick={async (e) => {
|
||||||
const valid = await form.trigger()
|
const valid = await form.trigger()
|
||||||
|
|
@ -1274,10 +1275,10 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<Accordion type="multiple" defaultValue={["communication", "contacts", "contracts"]} className="space-y-2">
|
<Accordion type="multiple" defaultValue={[]} className="space-y-2">
|
||||||
<AccordionItem value="communication" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="communication" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Canais e comunicação</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Canais e comunicação</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="grid gap-x-4 gap-y-3 md:grid-cols-2">
|
<div className="grid gap-x-4 gap-y-3 md:grid-cols-2">
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label htmlFor="supportEmail">E-mail de suporte</Label>
|
<Label htmlFor="supportEmail">E-mail de suporte</Label>
|
||||||
|
|
@ -1434,7 +1435,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
|
|
||||||
<AccordionItem value="contacts" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="contacts" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Contatos estratégicos</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Contatos estratégicos</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
|
|
@ -1589,7 +1590,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
|
|
||||||
<AccordionItem value="locations" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="locations" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Localizações e unidades</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Localizações e unidades</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<p className="text-sm text-muted-foreground">Registre filiais, data centers ou unidades críticas.</p>
|
<p className="text-sm text-muted-foreground">Registre filiais, data centers ou unidades críticas.</p>
|
||||||
|
|
@ -1712,7 +1713,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
|
|
||||||
<AccordionItem value="businessHours" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="businessHours" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Horários de atendimento</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Horários de atendimento</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="grid gap-x-4 gap-y-3 md:grid-cols-2">
|
<div className="grid gap-x-4 gap-y-3 md:grid-cols-2">
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label>Modo</Label>
|
<Label>Modo</Label>
|
||||||
|
|
@ -1744,7 +1745,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
|
|
||||||
<AccordionItem value="requestTypes" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="requestTypes" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Tipos de solicitação</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Tipos de solicitação</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<CompanyRequestTypesControls tenantId={tenantId} companyId={editor?.mode === "edit" ? editor.company.id : null} />
|
<CompanyRequestTypesControls tenantId={tenantId} companyId={editor?.mode === "edit" ? editor.company.id : null} />
|
||||||
<CompanyExportTemplateSelector tenantId={tenantId} companyId={editor?.mode === "edit" ? editor.company.id : null} />
|
<CompanyExportTemplateSelector tenantId={tenantId} companyId={editor?.mode === "edit" ? editor.company.id : null} />
|
||||||
</AccordionContent>
|
</AccordionContent>
|
||||||
|
|
@ -1753,7 +1754,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
{editor?.mode === "edit" ? (
|
{editor?.mode === "edit" ? (
|
||||||
<AccordionItem value="machines" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="machines" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Dispositivos vinculadas</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Dispositivos vinculadas</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="rounded-lg border border-border/60 bg-background p-3">
|
<div className="rounded-lg border border-border/60 bg-background p-3">
|
||||||
<AdminDevicesOverview tenantId={tenantId} initialCompanyFilterSlug={editor.company.slug} />
|
<AdminDevicesOverview tenantId={tenantId} initialCompanyFilterSlug={editor.company.slug} />
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1763,7 +1764,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
|
|
||||||
<AccordionItem value="contracts" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="contracts" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Contratos e escopo</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Contratos e escopo</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<p className="text-sm text-muted-foreground">
|
<p className="text-sm text-muted-foreground">
|
||||||
|
|
@ -1935,7 +1936,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
|
|
||||||
<AccordionItem value="sla" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="sla" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">SLA e horários de atendimento</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">SLA e horários de atendimento</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="grid gap-x-4 gap-y-3 md:grid-cols-2">
|
<div className="grid gap-x-4 gap-y-3 md:grid-cols-2">
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label>Calendário</Label>
|
<Label>Calendário</Label>
|
||||||
|
|
@ -2029,7 +2030,7 @@ export function CompanySheet({ tenantId, editor, onClose, onCreated, onUpdated }
|
||||||
|
|
||||||
<AccordionItem value="metadata" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
<AccordionItem value="metadata" className="rounded-lg border border-border/60 bg-muted/20 px-4">
|
||||||
<AccordionTrigger className="py-3 font-semibold">Metadados e observações</AccordionTrigger>
|
<AccordionTrigger className="py-3 font-semibold">Metadados e observações</AccordionTrigger>
|
||||||
<AccordionContent className="pb-5">
|
<AccordionContent className="space-y-4 pb-5 pt-2">
|
||||||
<div className="grid gap-4 md:grid-cols-2">
|
<div className="grid gap-4 md:grid-cols-2">
|
||||||
<Controller
|
<Controller
|
||||||
name="tags"
|
name="tags"
|
||||||
|
|
|
||||||
|
|
@ -347,11 +347,10 @@ export const companyFormSchema = z.object({
|
||||||
.nullable()
|
.nullable()
|
||||||
.optional(),
|
.optional(),
|
||||||
address: z.string().trim().nullable().optional(),
|
address: z.string().trim().nullable().optional(),
|
||||||
contractedHoursPerMonth: z
|
contractedHoursPerMonth: z.preprocess(
|
||||||
.number()
|
(val) => (val === "" || Number.isNaN(val) ? null : val),
|
||||||
.min(0)
|
z.number().min(0).nullable().optional()
|
||||||
.nullable()
|
),
|
||||||
.optional(),
|
|
||||||
businessHours: businessHoursSchema.nullish(),
|
businessHours: businessHoursSchema.nullish(),
|
||||||
communicationChannels: communicationChannelsSchema.default({
|
communicationChannels: communicationChannelsSchema.default({
|
||||||
supportEmails: [],
|
supportEmails: [],
|
||||||
|
|
@ -384,7 +383,10 @@ export const companyFormSchema = z.object({
|
||||||
customFields: z.array(customFieldSchema).default([]),
|
customFields: z.array(customFieldSchema).default([]),
|
||||||
notes: z.string().trim().nullable().optional(),
|
notes: z.string().trim().nullable().optional(),
|
||||||
isAvulso: z.boolean().default(false),
|
isAvulso: z.boolean().default(false),
|
||||||
reopenWindowDays: z.number().int().min(1).max(90).nullable().optional(),
|
reopenWindowDays: z.preprocess(
|
||||||
|
(val) => (val === "" || Number.isNaN(val) ? null : val),
|
||||||
|
z.number().int().min(1).max(90).nullable().optional()
|
||||||
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
export type CompanyFormValues = z.infer<typeof companyFormSchema>
|
export type CompanyFormValues = z.infer<typeof companyFormSchema>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue