Finish project
This commit is contained in:
parent
0d5278a792
commit
6b1bb60fbf
20 changed files with 205 additions and 81 deletions
|
|
@ -42,7 +42,7 @@
|
|||
"budgets": [
|
||||
{
|
||||
"type": "initial",
|
||||
"maximumWarning": "500kB",
|
||||
"maximumWarning": "1MB",
|
||||
"maximumError": "1MB"
|
||||
},
|
||||
{
|
||||
|
|
|
|||
30
db.json
30
db.json
|
|
@ -1,28 +1,22 @@
|
|||
{
|
||||
"tasks": [
|
||||
{
|
||||
"id": "a2e6",
|
||||
"title": "Teste",
|
||||
"id": "39b1",
|
||||
"title": "Testando",
|
||||
"categoryId": "1",
|
||||
"isCompleted": false
|
||||
"isCompleted": true
|
||||
},
|
||||
{
|
||||
"id": "9992",
|
||||
"title": "Testeasdas",
|
||||
"categoryId": "1",
|
||||
"isCompleted": false
|
||||
"id": "ab73",
|
||||
"title": "testando",
|
||||
"categoryId": "2",
|
||||
"isCompleted": true
|
||||
},
|
||||
{
|
||||
"id": "c544",
|
||||
"title": "treinar",
|
||||
"categoryId": "1",
|
||||
"isCompleted": false
|
||||
},
|
||||
{
|
||||
"id": "ecc9",
|
||||
"title": "treinar 2",
|
||||
"categoryId": "1",
|
||||
"isCompleted": false
|
||||
"id": "eee1",
|
||||
"title": "Hackeando tudo",
|
||||
"categoryId": "3",
|
||||
"isCompleted": true
|
||||
}
|
||||
],
|
||||
"categories": [
|
||||
|
|
@ -34,7 +28,7 @@
|
|||
{
|
||||
"id": "2",
|
||||
"name": "Estudo",
|
||||
"color": "orange"
|
||||
"color": "yellow"
|
||||
},
|
||||
{
|
||||
"id": "3",
|
||||
|
|
|
|||
19
public/no_data.svg
Normal file
19
public/no_data.svg
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<svg width="200" height="205" viewBox="0 0 200 205" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1347_198)">
|
||||
<path d="M126.968 45.9364H73.0769C71.8488 45.9379 70.6715 46.449 69.8031 47.3576C68.9347 48.2662 68.4462 49.498 68.4447 50.7829V176.097L67.827 176.294L54.6066 180.53C53.9801 180.73 53.3033 180.662 52.7249 180.34C52.1466 180.018 51.7138 179.47 51.5217 178.814L12.197 44.421C12.0056 43.7655 12.0709 43.0573 12.3783 42.452C12.6858 41.8468 13.2104 41.394 13.8368 41.1933L34.2094 34.6666L93.2704 15.7524L113.643 9.22574C113.953 9.12591 114.279 9.09103 114.602 9.12308C114.925 9.15514 115.238 9.25351 115.525 9.41257C115.811 9.57163 116.065 9.78824 116.272 10.05C116.478 10.3118 116.633 10.6136 116.728 10.9382L126.78 45.2902L126.968 45.9364Z" fill="#F2F2F2"/>
|
||||
<path d="M138.728 45.2902L126.613 3.88822C126.412 3.19838 126.082 2.55686 125.644 2.00031C125.205 1.44376 124.666 0.9831 124.057 0.64464C123.448 0.306179 122.781 0.096553 122.095 0.0277492C121.409 -0.0410545 120.716 0.032312 120.057 0.243649L91.4144 9.41646L32.3567 28.334L3.71406 37.51C2.38348 37.9375 1.26936 38.8998 0.61626 40.1859C-0.0368417 41.4719 -0.17557 42.9765 0.230533 44.3694L41.6365 185.865C41.9664 186.989 42.6321 187.973 43.5358 188.673C44.4395 189.372 45.5338 189.75 46.6579 189.751C47.1782 189.752 47.6956 189.67 48.1927 189.509L67.8272 183.222L68.4448 183.021V182.346L67.8272 182.543L48.0105 188.892C46.836 189.267 45.5675 189.139 44.4832 188.536C43.3988 187.933 42.5872 186.905 42.2264 185.677L0.823585 44.1788C0.644808 43.5704 0.5825 42.931 0.640226 42.2974C0.697951 41.6637 0.874572 41.0482 1.15998 40.4861C1.4454 39.9239 1.834 39.4262 2.30352 39.0214C2.77304 38.6167 3.31427 38.3127 3.89621 38.1271L32.5388 28.9511L91.5967 10.0368L120.239 0.860776C120.681 0.719839 121.14 0.647979 121.601 0.647529C122.592 0.649855 123.555 0.983927 124.351 1.60081C125.147 2.21769 125.733 3.08497 126.023 4.07562L138.083 45.2903L138.274 45.9365H138.917L138.728 45.2902Z" fill="#3F3D56"/>
|
||||
<path d="M37.8858 41.2989C37.2905 41.2984 36.7111 41.0984 36.2325 40.7282C35.7539 40.358 35.4013 39.837 35.2264 39.2418L31.2488 25.6484C31.1419 25.2833 31.1048 24.8997 31.1396 24.5195C31.1745 24.1394 31.2805 23.7702 31.4518 23.4329C31.623 23.0957 31.8561 22.797 32.1376 22.554C32.4192 22.311 32.7438 22.1284 33.0928 22.0167L87.4254 4.61331C88.1303 4.38828 88.8916 4.46503 89.5424 4.8267C90.1933 5.18838 90.6803 5.80544 90.8968 6.54244L94.8744 20.136C95.0894 20.8734 95.0159 21.67 94.6703 22.3508C94.3246 23.0317 93.7349 23.5413 93.0306 23.7679L38.6977 41.1712C38.4346 41.2557 38.161 41.2987 37.8858 41.2989Z" fill="#6C63FF"/>
|
||||
<path d="M58.7223 14.5249C62.1334 14.5249 64.8986 11.6317 64.8986 8.06286C64.8986 4.494 62.1334 1.60086 58.7223 1.60086C55.3112 1.60086 52.546 4.494 52.546 8.06286C52.546 11.6317 55.3112 14.5249 58.7223 14.5249Z" fill="#6C63FF"/>
|
||||
<path d="M58.7223 12.1548C60.8823 12.1548 62.6334 10.3228 62.6334 8.06286C62.6334 5.80294 60.8823 3.97092 58.7223 3.97092C56.5623 3.97092 54.8113 5.80294 54.8113 8.06286C54.8113 10.3228 56.5623 12.1548 58.7223 12.1548Z" fill="white"/>
|
||||
<path d="M186.103 188.1H81.7238C81.0279 188.099 80.3607 187.81 79.8686 187.295C79.3765 186.78 79.0997 186.082 79.0989 185.354V54.4985C79.0997 53.7704 79.3765 53.0723 79.8686 52.5574C80.3607 52.0426 81.0279 51.7529 81.7238 51.7521H186.103C186.799 51.753 187.467 52.0426 187.959 52.5575C188.451 53.0723 188.728 53.7704 188.728 54.4985V185.354C188.727 186.082 188.451 186.78 187.959 187.295C187.466 187.81 186.799 188.099 186.103 188.1Z" fill="#E6E6E6"/>
|
||||
<path d="M138.083 45.2902H73.0769C71.6852 45.2922 70.351 45.8716 69.3669 46.9012C68.3828 47.9308 67.829 49.3267 67.827 50.7829V182.543L68.4447 182.346V50.7829C68.4462 49.498 68.9347 48.2662 69.8031 47.3576C70.6715 46.449 71.8488 45.9379 73.0769 45.9364H138.274L138.083 45.2902ZM194.75 45.2902H73.0769C71.6852 45.2922 70.351 45.8716 69.3669 46.9012C68.3828 47.9308 67.829 49.3267 67.827 50.7829V198.763C67.829 200.219 68.3828 201.615 69.3669 202.644C70.351 203.674 71.6852 204.253 73.0769 204.255H194.75C196.142 204.253 197.476 203.674 198.46 202.644C199.444 201.615 199.998 200.219 200 198.763V50.7829C199.998 49.3267 199.444 47.9308 198.46 46.9012C197.476 45.8716 196.142 45.2922 194.75 45.2902ZM199.382 198.763C199.381 200.048 198.892 201.279 198.024 202.188C197.156 203.096 195.978 203.608 194.75 203.609H73.0769C71.8488 203.608 70.6715 203.096 69.8031 202.188C68.9347 201.279 68.4462 200.048 68.4447 198.763V50.7829C68.4462 49.498 68.9347 48.2662 69.8031 47.3576C70.6715 46.449 71.8488 45.9379 73.0769 45.9364H194.75C195.978 45.9379 197.156 46.449 198.024 47.3576C198.892 48.2662 199.381 49.498 199.382 50.7829V198.763Z" fill="#3F3D56"/>
|
||||
<path d="M162.325 59.5066H105.503C104.766 59.5057 104.059 59.199 103.538 58.6539C103.017 58.1087 102.724 57.3696 102.723 56.5987V42.3823C102.724 41.6113 103.017 40.8722 103.538 40.327C104.059 39.7819 104.766 39.4752 105.503 39.4744H162.325C163.061 39.4752 163.768 39.7819 164.289 40.327C164.81 40.8722 165.103 41.6113 165.104 42.3823V56.5987C165.103 57.3696 164.81 58.1087 164.289 58.6539C163.768 59.199 163.061 59.5057 162.325 59.5066Z" fill="#6C63FF"/>
|
||||
<path d="M133.914 40.4437C137.325 40.4437 140.09 37.5505 140.09 33.9817C140.09 30.4128 137.325 27.5197 133.914 27.5197C130.502 27.5197 127.737 30.4128 127.737 33.9817C127.737 37.5505 130.502 40.4437 133.914 40.4437Z" fill="#6C63FF"/>
|
||||
<path d="M133.914 37.9176C135.991 37.9176 137.675 36.1554 137.675 33.9816C137.675 31.8079 135.991 30.0457 133.914 30.0457C131.836 30.0457 130.152 31.8079 130.152 33.9816C130.152 36.1554 131.836 37.9176 133.914 37.9176Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_1347_198">
|
||||
<rect width="200" height="204.255" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.6 KiB |
9
public/trash.svg
Normal file
9
public/trash.svg
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<rect width="34" height="34" fill="url(#pattern0_1347_78)"/>
|
||||
<defs>
|
||||
<pattern id="pattern0_1347_78" patternContentUnits="objectBoundingBox" width="1" height="1">
|
||||
<use xlink:href="#image0_1347_78" transform="scale(0.00195312)"/>
|
||||
</pattern>
|
||||
<image id="image0_1347_78" width="512" height="512" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABHNCSVQICAgIfAhkiAAAAAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAAsQAAALEAGtI711AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAYdpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkJz8+DQo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj48cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSJ1dWlkOmZhZjViZGQ1LWJhM2QtMTFkYS1hZDMxLWQzM2Q3NTE4MmYxYiIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPjx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPjwveDp4bXBtZXRhPg0KPD94cGFja2V0IGVuZD0ndyc/PiyUmAsAAAimSURBVHhe7d2xbcQwFAVB0i0oVaj+K1KoVDXImQ0wNXyGb2fC1wAXP+Ec8Gbu/XjWDX5qu865bvCffawDAPD+BAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAia6/BK93486wYAFdt1/tk77AIAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQNNch4lkHANJy76ELAAAECQAACBIAABAkAAAgSAAAQJAAAIAgAQAAQQIAAIIEAAAECQAACBIAABAkAAAgSAAAQFDu96Mxxrj3w2+AAHzZrjP3HroAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABM114Pfc+/GsGwDftuv0Lr2ICwAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABAkAAAgSAAAQJAAAIEgAAECQAACAIAEAAEECAACCBAAABH0CFS0U/J9eaGoAAAAASUVORK5CYII="/>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
|
|
@ -1,6 +1,7 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { ThemeToggleComponent } from './shared/components/theme-toggle/theme-toggle.component';
|
||||
import { MainComponent } from "./layout/main/main.component";
|
||||
import { MainComponent } from '@layout/main/main.component';
|
||||
import { ThemeToggleComponent } from '@shared/components/theme-toggle/theme-toggle.component';
|
||||
|
||||
|
||||
const COMPONENTS = [ThemeToggleComponent, MainComponent];
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { categoryBackgroundColors } from './../../constants/category-colors';
|
||||
import { Category } from './../../model/category.model';
|
||||
import { ChangeDetectionStrategy, Component, inject, Signal } from '@angular/core';
|
||||
import { MatDivider } from '@angular/material/divider';
|
||||
import { CategoryService } from '../../services/category.service';
|
||||
import { categoryBackgroundColors } from '@features/category/constants/category-colors';
|
||||
import { Category } from '@features/category/model/category.model';
|
||||
import { CategoryService } from '@features/category/services/category.service';
|
||||
|
||||
const MODULES = [MatDivider];
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
import { CommonModule } from '@angular/common';
|
||||
import { ChangeDetectionStrategy, Component, inject, Signal } from '@angular/core';
|
||||
import { Category } from '../../model/category.model';
|
||||
import { CategoryService } from '../../services/category.service';
|
||||
import { Category } from '@category/model/category.model';
|
||||
import { CategoryService } from '@category/services/category.service';
|
||||
|
||||
|
||||
@Component({
|
||||
selector: 'app-main-list',
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
export const categoryBackgroundColors: Record<string, string> = {
|
||||
green: 'bg-green-600',
|
||||
orange: 'bg-yellow-600',
|
||||
yellow: 'bg-yellow-600',
|
||||
red: 'bg-red-600',
|
||||
blue: 'bg-blue-600',
|
||||
purple: 'bg-purple-600',
|
||||
|
|
@ -13,3 +13,13 @@ export const categoryBackgroundIdColors: Record<string, string> = {
|
|||
'4': 'bg-blue-600',
|
||||
'5': 'bg-purple-600',
|
||||
};
|
||||
|
||||
|
||||
export const categoryTextColors: Record<string, string> = {
|
||||
green: 'text-green-600',
|
||||
yellow: 'text-yellow-600',
|
||||
red: 'text-red-600',
|
||||
blue: 'text-blue-600',
|
||||
purple: 'text-purple-600',
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,22 +1,17 @@
|
|||
import { SnackBarService } from './../../../../../shared/services/snack-bar.service';
|
||||
import { TaskService } from './../../../service/task.service';
|
||||
import { CategoryService } from './../../../../category/services/category.service';
|
||||
import {
|
||||
ComponentFixture,
|
||||
fakeAsync,
|
||||
TestBed,
|
||||
tick,
|
||||
} from '@angular/core/testing';
|
||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { IncludeTaskFormComponent } from './include-task-form.component';
|
||||
|
||||
import { SnackBarService } from '@shared/services/snack-bar.service';
|
||||
import { TaskService } from '@features/task/service/task.service';
|
||||
import { CategoryService } from '@features/category/services/category.service';
|
||||
import { Task } from '@features/task/model/task.model';
|
||||
import { task } from '@mocks/task';
|
||||
import { Observable, of } from 'rxjs';
|
||||
import { Task } from '../../../model/task.model';
|
||||
import { task } from '../../../../../__mocks__/task';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { provideAnimations } from '@angular/platform-browser/animations';
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
|
||||
import { IncludeTaskFormComponent } from './include-task-form.component';
|
||||
|
||||
|
||||
|
||||
describe('IncludeTaskFormComponent', () => {
|
||||
let component: IncludeTaskFormComponent;
|
||||
|
|
|
|||
|
|
@ -1,27 +1,17 @@
|
|||
import { FormGroup } from '@angular/forms';
|
||||
import { CategoryService } from './../../../../category/services/category.service';
|
||||
import {
|
||||
ChangeDetectionStrategy,
|
||||
Component,
|
||||
computed,
|
||||
DestroyRef,
|
||||
inject,
|
||||
OnInit,
|
||||
} from '@angular/core';
|
||||
|
||||
import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatSelectChange, MatSelectModule } from '@angular/material/select';
|
||||
import { createTaskForm } from '../../../constants/create-task-form';
|
||||
import { Task } from '../../../model/task.model';
|
||||
import { TaskService } from '../../../service/task.service';
|
||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||
import { delay, finalize } from 'rxjs/operators';
|
||||
|
||||
import { NgClass } from '@angular/common';
|
||||
import { SnackBarService } from '../../../../../shared/services/snack-bar.service';
|
||||
import { CategoryService } from '@category/services/category.service';
|
||||
import { SnackBarService } from '@shared/services/snack-bar.service';
|
||||
import { createTaskForm } from '@features/task/constants/create-task-form';
|
||||
import { Task } from '@features/task/model/task.model';
|
||||
import { TaskService } from '@features/task/service/task.service';
|
||||
|
||||
|
||||
const MODULES = [
|
||||
|
|
@ -33,11 +23,8 @@ const MODULES = [
|
|||
ReactiveFormsModule,
|
||||
];
|
||||
|
||||
// const COMPONENTS: never[] = [];
|
||||
|
||||
const COMMONS = [NgClass];
|
||||
|
||||
|
||||
@Component({
|
||||
selector: 'app-include-task-form',
|
||||
standalone: true,
|
||||
|
|
@ -64,8 +51,7 @@ const COMMONS = [NgClass];
|
|||
</mat-form-field>
|
||||
<mat-form-field>
|
||||
<mat-label for="categoryId" data-testid="categoryId"
|
||||
>Categorias</mat-label
|
||||
>
|
||||
>Categorias</mat-label>
|
||||
<mat-select
|
||||
data-testid="matSelect"
|
||||
formControlName="categoryId"
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { TaskService } from './../../service/task.service';
|
||||
import { Component, inject } from '@angular/core';
|
||||
import { IncludeTaskFormComponent } from './include-task-form/include-task-form.component';
|
||||
import { CategoryService } from '../../../category/services/category.service';
|
||||
import { categoryBackgroundIdColors } from '../../../category/constants/category-colors';
|
||||
import { NgClass } from '@angular/common';
|
||||
import { categoryBackgroundIdColors } from '@features/category/constants/category-colors';
|
||||
import { CategoryService } from '@features/category/services/category.service';
|
||||
import { TaskService } from '@features/task/service/task.service';
|
||||
|
||||
const COMPONENTS = [IncludeTaskFormComponent]
|
||||
const COMMONS = [NgClass];
|
||||
|
|
@ -13,7 +13,7 @@ const COMMONS = [NgClass];
|
|||
imports: [...COMPONENTS, ...COMMONS],
|
||||
template: `
|
||||
<div class="grid grid-cols-12 gap-2 mt-8">
|
||||
<app-include-task-form class="col-span-11" />
|
||||
<app-include-task-form class="col-span-11"/>
|
||||
|
||||
<div class="colspan-1 flex items-start mt-2">
|
||||
<span
|
||||
|
|
@ -23,7 +23,7 @@ const COMMONS = [NgClass];
|
|||
}"
|
||||
class=" {{
|
||||
colorVariants[selectedCategoryId()]
|
||||
}} rounded-full w-10 h-10 bg-blue-700"
|
||||
}} rounded-full w-10 h-10 bg-blue-700"
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
import { Component, Input } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-no-task',
|
||||
standalone: true,
|
||||
template: `
|
||||
<div class="flex flex-col w-full justify-center items-center mt-8">
|
||||
<img width="200" height="200" [alt]="alt" [src]="imageUrl" />
|
||||
<span class="text-xl text-primary font-bold">{{ message }}</span>
|
||||
</div>
|
||||
`,
|
||||
styles: ``,
|
||||
})
|
||||
export class NoTasksComponent {
|
||||
@Input() public alt!: string;
|
||||
@Input() public imageUrl!: string;
|
||||
@Input() public message!: string;
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
import { Component, inject } from '@angular/core';
|
||||
import { TaskService } from '@features/task/service/task.service';
|
||||
import { AsyncPipe } from '@angular/common';
|
||||
import { NoTasksComponent } from '../no-tasks/no-tasks.component';
|
||||
import { Task } from '@features/task/model/task.model';
|
||||
import { CategoryService } from '@features/category/services/category.service';
|
||||
import { categoryTextColors } from '@features/category/constants/category-colors';
|
||||
|
||||
@Component({
|
||||
selector: 'app-task-list',
|
||||
imports: [AsyncPipe, NoTasksComponent],
|
||||
template: `
|
||||
<div class="mt-8">
|
||||
@if(tasks$ | async) { @if(numberOfTasks() > 0) { @for(task of tasks();
|
||||
track task.id) {
|
||||
<div class="flex flex-row justify-start mb-4 items-center gap-4 ">
|
||||
<!-- Checkbox -->
|
||||
<input
|
||||
type="checkbox"
|
||||
[checked]="task.isCompleted"
|
||||
(change)="toggleTaskStatus(task)"
|
||||
class="form-checkbox w-5 h-5 accent-purple-500"
|
||||
/>
|
||||
|
||||
<!-- Título da tarefa -->
|
||||
@if(task.isCompleted) {
|
||||
<label class="line-through {{ colorVariants[getColorByTask(task)] }}">{{task.title}}</label>
|
||||
}@else{
|
||||
<label class="{{ colorVariants[getColorByTask(task)] }}">{{task.title}}</label>
|
||||
}
|
||||
|
||||
<!-- Botão de deletar -->
|
||||
<button (click)="deleteTask(task.id)">
|
||||
<img src="trash.svg" />
|
||||
</button>
|
||||
</div>
|
||||
} } @else {
|
||||
<app-no-task
|
||||
alt="Nenhuma tarefa adicionada"
|
||||
imageUrl="no_data.svg"
|
||||
message="Nenhuma tarefa adicionada 😢"
|
||||
/>
|
||||
} }
|
||||
</div>
|
||||
`,
|
||||
styles: ``,
|
||||
})
|
||||
export class TaskListComponent {
|
||||
private tasksService = inject(TaskService);
|
||||
private categoryService = inject(CategoryService);
|
||||
public tasks$ = this.tasksService.getTasks();
|
||||
public tasks = this.tasksService.tasks;
|
||||
public category = this.categoryService.categories;
|
||||
|
||||
public toggleTaskStatus(task: Task): void {
|
||||
this.tasksService
|
||||
.updateIsCompletedStatus(task.id, !task.isCompleted)
|
||||
.subscribe();
|
||||
}
|
||||
|
||||
// função para buscar cor com base na categoria da task
|
||||
public getColorByTask(task: Task): string {
|
||||
const cat = this.category().find(
|
||||
(cat) => cat.id === task.categoryId
|
||||
)?.color;
|
||||
return cat || '';
|
||||
}
|
||||
|
||||
public numberOfTasks = this.tasksService.numberOfTasks;
|
||||
|
||||
public colorVariants = categoryTextColors;
|
||||
public updateTask = this.tasksService.updateTaskInTheTasksList;
|
||||
|
||||
public deleteTask(taskId: string): void {
|
||||
this.tasksService.deleteTask(taskId).subscribe();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
import { Task } from './../model/task.model';
|
||||
import { inject } from "@angular/core";
|
||||
import { FormControl, FormGroup, NonNullableFormBuilder, Validators } from "@angular/forms";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { task, TASK_INTERNAL_SERVER_ERROR_RESPONSE, TASK_UNPROCESSIBLE_ENTITY_RESPONSE, tasks } from './../../../__mocks__/task';
|
||||
import { TestBed, waitForAsync } from '@angular/core/testing';
|
||||
import { HttpErrorResponse, provideHttpClient } from '@angular/common/http';
|
||||
import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { TaskService } from './task.service';
|
||||
import { Task } from '../model/task.model';
|
||||
import { task, TASK_INTERNAL_SERVER_ERROR_RESPONSE, TASK_UNPROCESSIBLE_ENTITY_RESPONSE, tasks } from '@mocks/task';
|
||||
|
||||
describe('TaskService', () => {
|
||||
let taskService: TaskService;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { Task } from './../model/task.model';
|
||||
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Injectable, computed, inject, signal } from '@angular/core';
|
||||
import { environment } from '../../../../env/environment.prod';
|
||||
import { Observable, tap } from 'rxjs';
|
||||
import { setThrowInvalidWriteToSignalError } from '@angular/core/primitives/signals';
|
||||
import { environment } from '@env/environment.prod';
|
||||
import { Task } from '../model/task.model';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
import { InclusionFormComponent } from '../../components/inclusion-form/inclusion-form.component';
|
||||
import { TaskListComponent } from "../../components/task-list/task-list.component";
|
||||
|
||||
const COMPONENTS = [InclusionFormComponent];
|
||||
const COMPONENTS = [InclusionFormComponent, TaskListComponent];
|
||||
|
||||
|
||||
@Component({
|
||||
selector: 'app-task',
|
||||
standalone: true,
|
||||
imports: [...COMPONENTS],
|
||||
imports: [...COMPONENTS ],
|
||||
template: ` <div class="flex flex-col mx-10">
|
||||
<!-- Titulo -->
|
||||
<span class="font-bold text-4xl">Meu quadro de tarefas</span>
|
||||
|
|
@ -16,6 +17,7 @@ const COMPONENTS = [InclusionFormComponent];
|
|||
<app-inclusion-form />
|
||||
|
||||
<!-- Lista de tarefas -->
|
||||
<app-task-list/>
|
||||
</div>`,
|
||||
styles: ``,
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
import { CategoryComponent } from '../../features/category/view/category/category.component';
|
||||
import { MatDivider } from '@angular/material/divider';
|
||||
import { TaskComponent } from '../../features/task/view/task/task.component';
|
||||
import { CategoryComponent } from '@features/category/view/category/category.component';
|
||||
import { TaskComponent } from '@features/task/view/task/task.component';
|
||||
|
||||
const COMPONENTS = [CategoryComponent, TaskComponent];
|
||||
const MODULES = [MatDivider];
|
||||
|
|
@ -11,15 +11,15 @@ const MODULES = [MatDivider];
|
|||
standalone: true,
|
||||
imports: [...COMPONENTS,...MODULES],
|
||||
template: `
|
||||
<div class="h-screen flex w-full border-4 border-blue-700">
|
||||
<div class="h-screen flex w-full border-4">
|
||||
<!-- Categorias -->
|
||||
<app-category class="w-1/4 opacity-50" />
|
||||
|
||||
<!-- Divisor -->
|
||||
<mat-divider class="h-full border-2 border-orange-700" />
|
||||
<mat-divider class="h-full border-2" />
|
||||
|
||||
<!-- Tarefas -->
|
||||
<app-task class="w-3/4 border-2 border-green-700 pt-10" />
|
||||
<app-task class="w-3/4 border-2 pt-10" />
|
||||
</div>
|
||||
`,
|
||||
styles: ``,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import { Component, inject } from '@angular/core';
|
||||
import { ThemeService } from '../../services/theme.service';
|
||||
import { ThemeService } from '@shared/services/theme.service';
|
||||
|
||||
|
||||
@Component({
|
||||
selector: 'app-theme-toggle',
|
||||
|
|
|
|||
|
|
@ -7,6 +7,18 @@
|
|||
"node",
|
||||
"jest"
|
||||
],
|
||||
"baseUrl": "./",
|
||||
"paths": {
|
||||
"@features/*": ["src/app/features/*"],
|
||||
"@category/*": ["src/app/features/category/*"],
|
||||
"@task/*": ["src/app/features/task/*"],
|
||||
"@mocks/*": ["src/app/__mocks__/*"],
|
||||
"@shared/*": ["src/app/shared/*"],
|
||||
"@layout/*": ["src/app/layout/*"],
|
||||
"@initializers/*": ["src/app/initializers/*"],
|
||||
"@services/*": ["src/app/services/*"],
|
||||
"@env/*": ["src/env/*"]
|
||||
},
|
||||
"outDir": "./dist/out-tsc",
|
||||
"strict": true,
|
||||
"noImplicitOverride": true,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue