Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fernando Valentim - Teste Frontend #9

Open
wants to merge 77 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
5c5c265
initial setup
VLtim43 Mar 22, 2023
8eba23a
leaflet installation
VLtim43 Mar 22, 2023
4bedc97
SCSS setup
VLtim43 Mar 22, 2023
fd4680f
SCSS setup
VLtim43 Mar 22, 2023
b5a2aa1
SCSS setup
VLtim43 Mar 22, 2023
7c223ee
refactor/changed to typescript
VLtim43 Mar 23, 2023
150a0db
chore/ts-config
VLtim43 Mar 23, 2023
c12a78b
chore/ts-config
VLtim43 Mar 23, 2023
400b93d
chore/ts-config
VLtim43 Mar 23, 2023
63b5232
feature/Implementing the entities and classes
VLtim43 Mar 23, 2023
50d4523
feature/Vehicle type
VLtim43 Mar 23, 2023
5898f69
feature/State class
VLtim43 Mar 23, 2023
ea6dfc4
feature/sidebar component
VLtim43 Mar 23, 2023
c0807b5
feature/Position and State classes
VLtim43 Mar 23, 2023
8edd809
refactor/Changed class Vehicle to class Equipment
VLtim43 Mar 23, 2023
f5cb99d
feature/Function that creates all the equipaments objects based on th…
VLtim43 Mar 23, 2023
1e2c997
feature/Positon function that gets the positions for given equipment
VLtim43 Mar 23, 2023
bf5685b
feature/function that prints all equipament positions
VLtim43 Mar 24, 2023
505e72e
feature/React typescript props to the Map component
VLtim43 Mar 24, 2023
624f1c6
feature/Custom Map Popup and Custom Marker
VLtim43 Mar 24, 2023
b1a235e
feature/Marker component
VLtim43 Mar 24, 2023
4d8f1c3
feature/Marker component
VLtim43 Mar 24, 2023
af6e679
feature/Method that gets the most recent position of given equipment
VLtim43 Mar 24, 2023
10b998d
refactor/Refactoring the equiplist function
VLtim43 Mar 24, 2023
add94f1
feature/Creating a Marker for all equipments
VLtim43 Mar 24, 2023
acb5cc1
feature/Custom Equip Icons
VLtim43 Mar 24, 2023
b19c5ba
feature/Search bar
VLtim43 Mar 25, 2023
7d1587e
feature/Card component
VLtim43 Mar 25, 2023
ca79deb
fix/Fix equipment attributes names
VLtim43 Mar 25, 2023
53df108
fix/Fix getMostRecentPosition method. now returning the last(most rec…
VLtim43 Mar 25, 2023
5954b1a
feature/Custom icon colors based on state
VLtim43 Mar 25, 2023
14b766b
style/Sidebar style emprove
VLtim43 Mar 25, 2023
ff2f26f
feature/Radix Scroll area
VLtim43 Mar 25, 2023
861b1ca
feature/Moved the equipment upper in the component chain
VLtim43 Mar 25, 2023
e70dade
feature/filter icon
VLtim43 Mar 25, 2023
caef985
fix/ popup zindex fix
VLtim43 Mar 25, 2023
a80d5ce
style/Filter popup style
VLtim43 Mar 26, 2023
02ae717
feature/filter popup content
VLtim43 Mar 26, 2023
1ac2351
feature/All checkbox logic
VLtim43 Mar 26, 2023
67a2cb5
feature/All checkbox logic
VLtim43 Mar 26, 2023
459fe61
feature/All checkbox logic
VLtim43 Mar 26, 2023
9b61d81
refactor/Changed maker equipment props
VLtim43 Mar 27, 2023
9a765b2
feature/PopUp props for each component and changed EquipType method g…
VLtim43 Mar 27, 2023
e53624f
refactor/changed State method getNameStateId to static
VLtim43 Mar 27, 2023
5cd711e
style/changed toLocateString method to pt-bt date format
VLtim43 Mar 27, 2023
03b754f
feature/Custom icon for each state
VLtim43 Mar 27, 2023
2922255
fix/cleaning automatic generated css folder
VLtim43 Mar 27, 2023
a60828d
feature/Scroll component now can handle components as props
VLtim43 Mar 27, 2023
c3eae2f
refactor/ changed the props from marker component
VLtim43 Mar 27, 2023
0852e76
style/Changed card style
VLtim43 Mar 27, 2023
b6b8d46
feature/side card components
VLtim43 Mar 27, 2023
1dfd100
feature/Accordion component
VLtim43 Mar 28, 2023
1eb12de
refactor/Made setStateIcon a isolate function
VLtim43 Mar 28, 2023
480c45f
rollback/ rollback one commit - unknow map display error
VLtim43 Mar 28, 2023
e7544ee
feature/Scroll logic
VLtim43 Mar 28, 2023
0297273
fix/commit fix
VLtim43 Mar 28, 2023
3055b98
documentation/Changing the readme
VLtim43 Mar 28, 2023
ac87eef
documentation/Changing the readme
VLtim43 Mar 28, 2023
2bb6dca
documentation/Changing the readme
VLtim43 Mar 28, 2023
f9223bc
Update README.md
VLtim43 Mar 28, 2023
9ec7856
Update README.md
VLtim43 Mar 28, 2023
fa838bf
Create README.md
VLtim43 Mar 28, 2023
421d062
feature/Alert component integration
VLtim43 Mar 28, 2023
5303497
feature/equip state
VLtim43 Mar 28, 2023
4a18968
feature/Search component
VLtim43 Mar 28, 2023
4619b84
feature/model and state select
VLtim43 Mar 28, 2023
e99234b
feature/Select filter
VLtim43 Mar 28, 2023
a74bc3b
fix/select state filter
VLtim43 Mar 28, 2023
7faffe6
fix/select state filter
VLtim43 Mar 28, 2023
59828b2
Update README.md
VLtim43 Mar 28, 2023
a98b3a8
Update README.md
VLtim43 Mar 28, 2023
83cb72e
doc/added phosporicons info on readme
VLtim43 Mar 28, 2023
86bb13d
style/changed accordeon name
VLtim43 Mar 28, 2023
b8946e2
fix/removed unused popover component
VLtim43 Mar 28, 2023
a19e1d1
Update README.md
VLtim43 Mar 28, 2023
12abaeb
Update README.md
VLtim43 Jul 4, 2023
5c67a08
Update README.md
VLtim43 Oct 3, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
214 changes: 14 additions & 200 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,209 +1,23 @@
# Teste Frontend estágio V3
# Equipment Management

![Aiko](img/aiko.png)
**Deploy:**

Neste teste serão avaliados seus conhecimentos em Javascript, HTML e CSS, a criatividade e metodologia aplicada no desenvolvimento, a usabilidade e design da aplicação final.
## Overview
The `Equipment` class is instantiated based on values retrieved from .JSON files, generating objects for each piece of equipment. Supporting classes for the `Position` and `State` entities are established, and every equipment object contains arrays from these classes. Within `App.tsx`, all equipment objects are propagated to the `sidebar` and `map` components.

## O Desafio
The `sidebar` has a scrolling section (utilizing Radix scrollArea) that presents a "card" for each piece of equipment, detailing its attributes such as name, model, current state, and so forth. Each "card" further embeds an "accordion" which unveils another scrollArea that showcases the state history of that specific equipment. At the top of the sidebar, there are three "select" components that aid in filtering equipment by name, model, or their current state.

Você é o desenvolvedor frontend de uma empresa que coleta dados de equipamentos utilizados em uma operação florestal. Dentre esses dados estão o histórico de posições e estados desses equipamentos. O estado de um equipamento é utilizado para saber o que o equipamento estava fazendo em um determinado momento, seja *Operando*, *Parado* ou em *Manutenção*. O estado é alterado de acordo com o uso do equipamento na operação, já a posição do equipamento é coletada através do GPS e é enviada e armazenada de tempo em tempo pela aplicação.
The `map` component, powered by Leaflet, displays geographical coordinates. A distinct "marker" on the map represents each equipment. These markers are visually differentiated by their icons and colors, correlating to their model (cargo truck, trace grapple, or harvester) and state (idle, working, or under maintenance). Clicking on a marker pops up more details about the corresponding equipment, along with an option to view its state history.

Seu objetivo é, de posse desses dados, desenvolver o frontend de aplicação web que trate e exibida essas informações para os gestores da operação.
## Tech Stack

## Requisitos
- ![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge&logo=typescript&logoColor=white)
- ![React](https://img.shields.io/badge/react-%2320232a.svg?style=for-the-badge&logo=react&logoColor=%2361DAFB)
- ![JavaScript](https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge&logo=javascript&logoColor=%23F7DF1E)
- ![SASS](https://img.shields.io/badge/SASS-hotpink.svg?style=for-the-badge&logo=SASS&logoColor=white)
- ![Vite](https://img.shields.io/badge/vite-%23646CFF.svg?style=for-the-badge&logo=vite&logoColor=white)

Esses requisitos são obrigatórios e devem ser desenvolvidos para a entrega do teste.
- [Radix-UI Components](https://www.radix-ui.com/)
- [Phospor-Icons](https://phosphoricons.com/)

* **Posições dos equipamentos**: Exibir no mapa os equipamentos nas suas posições mais recentes.

* **Estado atual do equipamento**: Visualizar o estado mais recente dos equipamentos. Exemplo: mostrando no mapa, como um pop-up, mouse hover sobre o equipamento, etc.

* **Histórico de estados do equipamento**: Permitir a visualização do histórico de estados de um equipamento específico ao clicar sobre o equipamento.

## Dados

Todos os dados que precisa para desenvolver os requisitos estão na pasta `data/` no formato `json` e são detalhados a seguir.

```sh
data/
|- equipment.json
|- equipmentModel.json
|- equipmentPositionHistory.json
|- equipmentState.json
|- equipmentStateHistory.json
```

### equipment.json
Contém todos os equipamentos da aplicação.

```JSONC
[
{
// Identificador único do equipamento
"id": "a7c53eb1-4f5e-4eba-9764-ad205d0891f9",
// Chave estrangeira, utilizada para referenciar de qual modelo é esse equipamento
"equipmentModelId": "a3540227-2f0e-4362-9517-92f41dabbfdf",
// Nome do Equipamento
"name": "CA-0001"
},
// ...
]
```

### equipmentState.json
Contém todos os estados dos equipamentos.

```JSONC
[
{
// Identificador único do estado de equipamento
"id": "0808344c-454b-4c36-89e8-d7687e692d57",
// Nome do estado
"name": "Operando",
// Cor utilizada para representar o estado
"color": "#2ecc71"
},
// ...
]
```

### equipmentModel.json
Contém todos os modelos de equipamento e a informação de qual é o valor por hora do equipamento em cada um dos estados.

```JSONC
[
{
// Identificador único do modelo de equipamento
"id": "a3540227-2f0e-4362-9517-92f41dabbfdf",
// Nome do modelo de equipamento
"name": "Caminhão de carga",
// Valor gerado por hora para cada estado
"hourlyEarnings": [
{
// Chave estrangeira, utilizada para referenciar de qual valor é esse estado
"equipmentStateId": "0808344c-454b-4c36-89e8-d7687e692d57",
// Valor gerado por hora nesse estado
"value": 100
},
// ...
]
},
// ...
]
```

### equipmentStateHistory.json
O histórico de estados por equipamento.

```JSONC
[
{
// Chave estrangeira, utilizada para referenciar de qual equipamento são esses estados
"equipmentId": "a7c53eb1-4f5e-4eba-9764-ad205d0891f9",
// Histórico de estados do equipamento
"states": [
{
// Data em que o equipamento declarou estar nesse estado
"date": "2021-02-01T03:00:00.000Z",
// Chave estrangeira, utilizada para referenciar qual é o estado
// que o equipamento estava nesse momento
"equipmentStateId": "03b2d446-e3ba-4c82-8dc2-a5611fea6e1f"
},
// ...
]
},
// ...
]
```

### equipmentPositionHistory.json
O histórico de posições dos equipamentos.

```JSONC
[
{
// Chave estrangeira, utilizada para referenciar de qual equipamento são esses estados
"equipmentId": "a7c53eb1-4f5e-4eba-9764-ad205d0891f9",
// Posições do equipamento
"positions": [
{
// Data em que a posição foi registrada
"date": "2021-02-01T03:00:00.000Z",
// Latitude WGS84
"lat": -19.126536,
// Longitude WGS84
"lon": -45.947756
},
// ...
]
},
// ...
]
```


## O que é permitido

* Vue, React e Angular.

* Typescript.

* Bibliotecas de componentes (Element-ui, Vuetify, Bootstrap, etc.)

* Bibliotecas e APIs de Mapas (Leaflet, Openlayers, Google Maps API, etc).

* Template engines (Pug, Ejs, etc).

* Gerenciamento de estado (Vuex, Redux, etc).

* Frameworks CSS (Tailwind, Bulma, Bootstrap, Materialize, etc).

* Pré-processadores CSS (SCSS, SASS, LESS, etc).

* Frameworks baseados em Vue (Nuxt.js, Quasar, etc).

* Qualquer tecnologia complementar as citadas anteriormente são permitidas desde que seu uso seja justificável.

## O que não é permitido

* Utilizar componentes ou códigos de terceiros que implementem algum dos requisitos.

## Recomendações

* **Linter**: Desenvolva o projeto utilizando algum padrão de formatação de código.

* **Leaflet**: Para a exibição de informações no mapa recomendamos o Leaflet por ser uma biblioteca de código aberto e de fácil uso.

## Extras

Aqui são listados algumas sugestões para você que quer ir além do desafio inicial. Lembrando que você não precisa se limitar a essas sugestões, se tiver pensado em outra funcionalidade que considera relevante ao escopo da aplicação fique à vontade para implementá-la.

* **Filtros**: Filtrar as visualizações por estado atual ou modelo de equipamento.

* **Pesquisa**: Ser possível pesquisar por dados de um equipamento especifico.

* **Percentual de Produtividade do equipamento**: Calcular a produtividade do equipamento, que consiste em uma relação das horas produtivas (em estado "Operando") em relação ao total de horas. Exemplo se um equipamento teve 18 horas operando no dia a formula deve ser `18 / 24 * 100 = 75% de produtividade`.

* **Ganho por equipamento**: Calcular o ganho do equipamento com base no valor recebido por hora informado no Modelo de Equipamento. Exemplo se um modelo de equipamento gera 100 por hora em operando e -20 em manutenção, então se esse equipamento ficou 10 horas em operação e 4 em manutenção ele gerou `10 * 100 + 4 * -20 = 920`.

* **Diferenciar os equipamentos**: Diferenciar visualmente os equipamentos por modelo de equipamento na visualização do mapa.

* **Histórico de posições**: Que seja possível visualizar o histórico de posições de um equipamento, mostrando o trajeto realizado por ele.

* **Testes**: Desenvolva testes que achar necessário para a aplicação, seja testes unitários, testes automatizados, testes de acessibilidade, etc.

* **Documentação**: Gerar uma documentação da aplicação. A documentação pode incluir detalhes sobre as decisões tomadas, especificação dos componentes desenvolvidos, instruções de uso dentre outras informações que achar relevantes.

## Entregas

Para realizar a entrega do teste você deve:

* Relizar o fork e clonar esse repositório para sua máquina.

* Criar uma branch com o nome de `teste/[NOME]`.
* `[NOME]`: Seu nome.
* Exemplos: `teste/fulano-da-silva`; `teste/beltrano-primeiro-gomes`.

* Faça um commit da sua branch com a implementação do teste.

* Realize o pull request da sua branch nesse repositório.
26 changes: 26 additions & 0 deletions client/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?


24 changes: 24 additions & 0 deletions client/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8" />
<link rel="icon" type="image" href="/wharvester.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css"
integrity="sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A=="
crossorigin="" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,200;1,300;1,400;1,500;1,600;1,700&display=swap"
rel="stylesheet">
<title>Aiko Machinery</title>
</head>

<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>

</html>
Loading