-
- {{ task.category }}
+
{{ task.title }}
@@ -40,4 +52,7 @@
+ @if (isMenuOpen){
+
+ }
diff --git a/src/app/components/board/task/task.component.scss b/src/app/components/board/task/task.component.scss
index 3b567ea..340b1cb 100644
--- a/src/app/components/board/task/task.component.scss
+++ b/src/app/components/board/task/task.component.scss
@@ -1,6 +1,7 @@
section {
width: 246px;
margin: 15.5px 0;
+ position: relative;
}
.content {
@@ -20,22 +21,41 @@ section {
}
}
-.category {
- position: absolute;
- font-size: 16px;
- top: 16px;
- left: 16px;
- padding: 4px 16px;
- border-radius: 8px;
- color: var(--white);
- text-shadow: 1px 1px 2px var(--black);
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ .category {
+ width: fit-content;
+ font-size: 16px;
+ padding: 4px 16px;
+ border-radius: 8px;
+ color: var(--white);
+ text-shadow: 1px 1px 2px var(--black);
+ }
+ .menu-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 6px 12px;
+ img {
+ height: 16px;
+ width: auto;
+ }
+ &:hover {
+ img {
+ filter: brightness(0) saturate(100%) invert(56%) sepia(64%)
+ saturate(570%) hue-rotate(154deg) brightness(92%) contrast(92%);
+ }
+ }
+ }
}
.headline {
color: var(--dark-blue);
font-size: 16px;
font-weight: 700;
- margin-top: 40px;
+ margin-top: 12px;
}
.description {
diff --git a/src/app/components/board/task/task.component.ts b/src/app/components/board/task/task.component.ts
index 279eb53..6004a2a 100644
--- a/src/app/components/board/task/task.component.ts
+++ b/src/app/components/board/task/task.component.ts
@@ -1,20 +1,25 @@
import { CommonModule } from '@angular/common';
-import { Component, Input } from '@angular/core';
+import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { DragDropService } from '../../../services/drag-drop.service';
import { Task } from '../../../interfaces/task.interface';
import { FirebaseService } from '../../../services/firebase.service';
import { OverlayService } from '../../../services/overlay.service';
import { Router } from '@angular/router';
+import { TaskMenuComponent } from './task-menu/task-menu.component';
@Component({
selector: 'app-task',
standalone: true,
- imports: [CommonModule],
+ imports: [CommonModule, TaskMenuComponent],
templateUrl: './task.component.html',
styleUrl: './task.component.scss',
})
-export class TaskComponent {
- @Input() task!: Task;
+export class TaskComponent implements OnInit, OnDestroy {
+ @Input() task: Task = {} as Task;
+ private resizeListener!: () => void;
+
+ isPageViewMedia: boolean = window.innerWidth <= 650;
+ isMenuOpen: boolean = false;
categoryColors = new Map
([
['User Story', '#0038ff'],
@@ -28,12 +33,36 @@ export class TaskComponent {
private router: Router
) {}
+ ngOnInit() {
+ this.resizeListener = this.onResize.bind(this);
+ window.addEventListener('resize', this.resizeListener);
+ }
+
+ ngOnDestroy() {
+ window.removeEventListener('resize', this.resizeListener);
+ }
+
+ onResize() {
+ this.isPageViewMedia = window.innerWidth <= 650;
+ }
+
+ handleMenuButtonClick(event: MouseEvent, taskIdOrStatus: string | undefined) {
+ event.stopPropagation();
+ const targetElement = event.target as HTMLElement;
+ targetElement.classList.contains('menu-btn') ||
+ targetElement.classList.contains('menu-img')
+ ? this.openTaskMenu(taskIdOrStatus)
+ : this.openTaskDetailsOverlay(taskIdOrStatus);
+ }
+
+ openTaskMenu(taskStatus: string | undefined) {
+ this.isMenuOpen = !this.isMenuOpen;
+ }
+
openTaskDetailsOverlay(taskId: string | undefined) {
- if (window.innerWidth >= 650) {
- this.overlayService.setOverlayData('taskOverlay', taskId);
- } else {
- this.router.navigate(['/task', taskId]);
- }
+ this.isPageViewMedia
+ ? this.router.navigate(['/task', taskId])
+ : this.overlayService.setOverlayData('taskOverlay', taskId);
}
// Subtasks
diff --git a/src/assets/img/board/menu.svg b/src/assets/img/board/menu.svg
new file mode 100644
index 0000000..17e9933
--- /dev/null
+++ b/src/assets/img/board/menu.svg
@@ -0,0 +1,3 @@
+