DEV Community

NuryCaroline for Dev Girls Mentor

Posted on

2 2

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

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay