DEV Community

NuryCaroline for Dev Girls Mentor

Posted on

Dashboard - Criando Task

Adicionar um botão fechar no modal

Adicionar o botão no componente ModalFormTask

receber `onClose` como prop

<button onClick={onClose}>fechar</button>
Enter fullscreen mode Exit fullscreen mode

adicionar um style para o botão não ficar em cima do outro

button + button {
  right: 8rem;
}
Enter fullscreen mode Exit fullscreen mode

Na page Task/index.js criar um estado para abrir/fechar o modal

const [showModal, setShowModal] = useState(false)

{showModal &&
    <ModalFormTasks
      onClose={() => setShowModal(false)}
    />
  }
Enter fullscreen mode Exit fullscreen mode

Abrir modal ao clicar no + da coluna

No componente da coluna recebermos a prop onShowModal, e passamos para o botão

<button onClick={onShowModal}>
  <img src={IconPlus} alt="Add" />
</button>
Enter fullscreen mode Exit fullscreen mode

E na chamada do componente passamos a função para abrir o modal como prop para o componente filho (Column)

<Column
  name="In progress"
  value="0"
  theme="yellow"
  icon={IconInProgress}
  **onShowModal={() => setShowModal(true)}**
>
  <CardsTasks />
</Column>
Enter fullscreen mode Exit fullscreen mode

Abrir o modal com o status pré preenchido

Criamos um estado para o status default

const [defaultStatus, setDefaultStatus] = useState('to do')
Enter fullscreen mode Exit fullscreen mode

Criamos uma função para alem de abrir o modal, também atualizar o status default, que recebe um status como parâmetro.

function handleOpenModalWithDefaultStatus(status) {
  setDefaultStatus(status)
  setShowModal(true)
}
Enter fullscreen mode Exit fullscreen mode

Agora podemos modificar a função de onShowModal para alem de abrir o modal também atualizar o status conforme o botão da coluna

<Column
  name="To do"
  value="0"
  theme="pink"
  icon={IconTodo}
  onShowModal={() => handleOpenModalWithDefaultStatus('to do')}
>
  <CardsTasks />
</Column>
<Column
  name="In progress"
  value="0"
  theme="yellow"
  icon={IconInProgress}
  onShowModal={() => handleOpenModalWithDefaultStatus('in progress')}
>
  <CardsTasks />
</Column>
<Column
  name="Done"
  value="0"
  theme="green"
  icon={IconDone}
  onShowModal={() => handleOpenModalWithDefaultStatus('done')}
>
  <CardsTasks />
</Column>
Enter fullscreen mode Exit fullscreen mode

Com o status default sendo preenchido conforme o click da coluna, podemos passar o status para o modal. Recebemos defaultStatus como prop, e adicionamos o valor no select

<select defaultValue={defaultStatus}>
    <option value="to do">To do</option>
    <option value="in progress">In progress</option>
    <option value="done">Done</option>
  </select>
Enter fullscreen mode Exit fullscreen mode

Modificando o form do modal para utilizar o estado

Começamos criando os estados

const [title, setTitle] = useState('')
const [description, setDescription] = useState('')
const [date, setDate] = useState('')
const [hour, setHour] = useState('')
const [responsable, setResponsable] = useState('')
const [status, setStatus] = useState(defaultStatus)
Enter fullscreen mode Exit fullscreen mode

E depois adicionamos uma função para o onChange de cada input

<input onChange={e => setTitle(e.currentTarget.value)} />
Enter fullscreen mode Exit fullscreen mode

Vamos adicionar um console ao clicar em salvar, para visualizar se os estados estão sendo preenchidos corretamente

function handleSaveTask() {
  console.log({
    title,
    description,
    date,
    hour,
    responsable,
    status,
  })
}

<button type="button" onClick={handleSaveTask}>Save</button>
Enter fullscreen mode Exit fullscreen mode

Adicionar uma nova task

Começamos criando um estado para armazenas as atividades

const [tasks, setTasks] = useState([])
Enter fullscreen mode Exit fullscreen mode

Vamos criar uma função bem simples para receber uma task e adiciona-la a lista

function handleAddTask(task) {
  setTasks([...tasks, task])
}
Enter fullscreen mode Exit fullscreen mode

Vamos passar para o modal a função para adicionar uma nova tarefa

<ModalFormTasks
  onClose={() => setShowModal(false)}
  defaultStatus={defaultStatus}
    handleAddTask={handleAddTask}
/>
Enter fullscreen mode Exit fullscreen mode

No modal, recebemos a nova prop, e ao clicar em salvar chamamos a função de adicionar tarefas passando as informações da nova tarefa

function handleSaveTask() {
  handleAddTask({
    title,
    description,
    date,
    hour,
    responsable,
    status,
  })
}
Enter fullscreen mode Exit fullscreen mode

Mostrando as tasks criadas

Para mostrarmos as tasks criadas, vamos criar um map e passar para o componente CardsTasks as informações

<Column
  name="To do"
  value="0"
  theme="pink"
  icon={IconTodo}
  onShowModal={() => handleOpenModalWithDefaultStatus('to do')}
>
  {
    tasks.map(task => (
      <CardsTasks
        title={task.title}
        description={task.description}
        date={task.date}
        hour={task.hour}
        responsable={task.responsable}
        status={task.status}
      />
    ))
  }
</Column>
Enter fullscreen mode Exit fullscreen mode

e temos que modificar o componente CardsTasks para ser dinâmico e receber as informações como props

<ContainerCardsTasks>
    <h4>{title}</h4>
    <p>{description}</p>

    <FooterCards>
      <time>{date} {hour}</time>
            <p>{responsable}</p>

      <div>
        <ContainerAvatar />
        <img src={IconEdit} alt="Edit" />
      </div>
    </FooterCards>
  </ContainerCardsTasks>
Enter fullscreen mode Exit fullscreen mode

Separando as tasks por status

Para listarmos somente a tarefa de cada status em sua respectiva coluna, podemos adicionar uma função de filtro antes do map

{
  tasks.filter(t => t.status === 'to do').map(task => (
    <CardsTasks
      title={task.title}
      description={task.description}
      date={task.date}
      hour={task.hour}
      responsable={task.responsable}
      status={task.status}
    />
  ))
}
Enter fullscreen mode Exit fullscreen mode

Adicionando KEY no map

Para o React atualizar o seu componente corretamente, é uma boa prática adicionar a prop key ao seu componente, quando utilizar a função map

{
  tasks.filter(t => t.status === 'in progress').map((task, index) => (
    <CardsTasks
      key={index}
      title={task.title}
      description={task.description}
      date={task.date}
      hour={task.hour}
      responsable={task.responsable}
      status={task.status}
    />
  ))
}
Enter fullscreen mode Exit fullscreen mode

Oldest comments (0)