'use client' import Link from 'next/link' import { useActionState, useState } from 'react' import { ActivityDemandFields } from '@/components/campaign/activity/ActivityDemandFields' import { ActivityTaskFields } from '@/components/campaign/activity/ActivityTaskFields' import { AsyncSearchCombobox } from '@/components/campaign/shared/AsyncSearchCombobox' import { ContactCombobox, type ContactComboboxOption, } from '@/components/campaign/shared/ContactCombobox' import { RelationMultiSelect, type RelationOption, } from '@/components/campaign/shared/RelationMultiSelect' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/Alert' import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Checkbox } from '@/components/ui/Checkbox' import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSet, } from '@/components/ui/field' import { Input } from '@/components/ui/input' import { NativeSelect, NativeSelectOption } from '@/components/ui/native-select' import { Spinner } from '@/components/ui/Spinner' import { Textarea } from '@/components/ui/textarea' import { ToggleGroup, ToggleGroupItem } from '@/components/ui/ToggleGroup' import { isContactSearchQueryReady } from '@/lib/contactSearchQuery' import { activityKindLabels, activityOriginLabels, activityStatusLabels, } from '@/lib/schemas/activity' import type { ActivityLeadershipOption } from '@/utilities/activityLeadershipOptions' import type { ActivityFormViewModel } from '@/utilities/activityViewModels' import { fieldError } from '@/utilities/campaignFormFields' import { formatIsoAsBahiaDateTimeInput } from '@/utilities/campaignTime' import type { EligibleAdvisorOption } from '@/utilities/municipalityViewModels' export type ActivityFormState = { message?: string fieldErrors?: Record existingHref?: string submittedTitle?: string } type ActivityFormAction = ( state: ActivityFormState, formData: FormData, ) => Promise export type ActivityFormFieldsProps = { municipalityOptions: RelationOption[] organizationOptions: RelationOption[] advisorOptions?: EligibleAdvisorOption[] canManageAdvisors?: boolean activity?: ActivityFormViewModel fieldErrors?: Record submittedTitle?: string searchContacts: (query: string) => Promise searchLeaderships: (query: string) => Promise } const editableStatuses = ['rascunho', 'planejado'] as const const ActivityFormFields = ({ municipalityOptions, organizationOptions, advisorOptions = [], canManageAdvisors = false, activity, fieldErrors = {}, submittedTitle, searchContacts, searchLeaderships, }: ActivityFormFieldsProps) => { const errorFor = (name: string) => fieldError(fieldErrors, name) const statusIsEditable = !activity || editableStatuses.includes(activity.status as (typeof editableStatuses)[number]) const [status, setStatus] = useState<(typeof editableStatuses)[number]>( activity && editableStatuses.includes(activity.status as (typeof editableStatuses)[number]) ? (activity.status as (typeof editableStatuses)[number]) : 'rascunho', ) const [responsible, setResponsible] = useState( activity?.responsible ? { id: activity.responsible.id, name: activity.responsible.name, phone: activity.responsible.phone, } : null, ) const [leadership, setLeadership] = useState( activity?.leadership ? { id: activity.leadership.id, label: activity.leadership.label } : null, ) return ( {statusIsEditable ? ( ) : ( )} Informações básicas Título * {errorFor('title') ? ( {errorFor('title')} ) : null}
Tipo de atividade * Selecione um tipo {Object.entries(activityKindLabels).map(([value, label]) => ( {label} ))} {errorFor('kind') ? ( {errorFor('kind')} ) : null} Status * {statusIsEditable ? ( <> value && setStatus(value as typeof status)} variant="outline" className="flex w-full flex-wrap justify-start" aria-label="Status da atividade" > Planejado Rascunho Rascunhos não exigem data. Atividades planejadas exigem data e horário de início. ) : ( Status atual: {activityStatusLabels[activity?.status ?? ''] ?? activity?.status} . Use as ações do detalhe para marcar como realizado ou cancelado. )}
Origem da atividade {Object.entries(activityOriginLabels).map(([value, label]) => ( {label} ))} Registra se a atividade nasceu da análise de dados, de um pedido de articulação ou de um compromisso político. {errorFor('origin') ? {errorFor('origin')} : null} Descrição