Add direct linking to a task. Fixes #81
This commit is contained in:
parent
88535c3ab1
commit
f2f0f052cf
@ -22,6 +22,11 @@ export const ROUTES: Routes = [
|
||||
component: BoardDisplayComponent,
|
||||
canActivate: [ AuthGuard ]
|
||||
},
|
||||
{
|
||||
path: 'boards/:id/:taskId',
|
||||
component: BoardDisplayComponent,
|
||||
canActivate: [ AuthGuard ]
|
||||
},
|
||||
{
|
||||
path: 'settings',
|
||||
component: SettingsComponent,
|
||||
|
@ -80,6 +80,13 @@ export class BoardDisplayComponent implements OnInit, OnDestroy {
|
||||
this.loading = true;
|
||||
this.boardNavId = id ? id : null;
|
||||
this.updateActiveBoard();
|
||||
|
||||
if (!params.taskId) {
|
||||
boardService.showTask(null);
|
||||
return;
|
||||
}
|
||||
|
||||
boardService.showTask(params.taskId);
|
||||
});
|
||||
this.subs.push(sub);
|
||||
}
|
||||
|
@ -28,8 +28,10 @@ export class BoardService extends ApiService {
|
||||
complete: 0
|
||||
};
|
||||
private activeBoard = new BehaviorSubject<Board>(null);
|
||||
private showTaskId = new BehaviorSubject<number>(null);
|
||||
|
||||
public activeBoardChanged = this.activeBoard.asObservable();
|
||||
public showTaskIdChanged = this.showTaskId.asObservable();
|
||||
|
||||
constructor(private http: HttpClient, strat: LocationStrategy) {
|
||||
super(strat);
|
||||
@ -42,6 +44,10 @@ export class BoardService extends ApiService {
|
||||
hljs.registerLanguage('php', php);
|
||||
}
|
||||
|
||||
showTask(id: number) {
|
||||
this.showTaskId.next(id);
|
||||
}
|
||||
|
||||
async convertMarkdown(markdown: string, callback = this.defaultCallback,
|
||||
doCount = false): Promise<MarkedReturn> {
|
||||
this.checkCounts.total = 0;
|
||||
|
@ -89,7 +89,7 @@
|
||||
[remove-task]="getRemoveTaskFunction(task.id)"
|
||||
[collapse]="collapseTasks"
|
||||
(on-update-boards)="callBoardUpdate();"
|
||||
(dblclick)="$event.preventDefault();showViewModal(task.id)">
|
||||
(dblclick)="$event.preventDefault();getShowViewModalFunction(task.id)()">
|
||||
</tb-task>
|
||||
</div>
|
||||
|
||||
|
@ -8,6 +8,7 @@ import {
|
||||
Output,
|
||||
} from '@angular/core';
|
||||
import { DomSanitizer } from '@angular/platform-browser';
|
||||
import { Location } from '@angular/common';
|
||||
import {
|
||||
CdkDragDrop,
|
||||
moveItemInArray,
|
||||
@ -92,6 +93,7 @@ export class ColumnDisplayComponent implements OnInit, OnDestroy {
|
||||
|
||||
constructor(public elRef: ElementRef,
|
||||
private auth: AuthService,
|
||||
private location: Location,
|
||||
public notes: NotificationsService,
|
||||
public modal: ModalService,
|
||||
public stringsService: StringsService,
|
||||
@ -99,7 +101,7 @@ export class ColumnDisplayComponent implements OnInit, OnDestroy {
|
||||
private sanitizer: DomSanitizer) {
|
||||
this.templateElement = elRef.nativeElement;
|
||||
this.collapseTasks = false;
|
||||
this.commentOrder = "oldest";
|
||||
this.commentOrder = 'oldest';
|
||||
this.sortOption = 'pos';
|
||||
|
||||
this.MODAL_ID = 'add-task-form-';
|
||||
@ -126,6 +128,17 @@ export class ColumnDisplayComponent implements OnInit, OnDestroy {
|
||||
});
|
||||
this.subs.push(sub);
|
||||
|
||||
sub = boardService.showTaskIdChanged.subscribe(taskId => {
|
||||
setTimeout(() => {
|
||||
this.columnData?.tasks?.forEach(task => {
|
||||
if (+task.id === +taskId) {
|
||||
this.showViewModal(+taskId);
|
||||
}
|
||||
});
|
||||
}, 0);
|
||||
});
|
||||
this.subs.push(sub);
|
||||
|
||||
sub = auth.userChanged.subscribe((user: User) => {
|
||||
if (user === null) {
|
||||
return;
|
||||
@ -559,7 +572,11 @@ export class ColumnDisplayComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
getShowViewModalFunction(taskId: number): () => void {
|
||||
return () => { this.showViewModal(taskId); };
|
||||
return () => {
|
||||
const url = 'boards/' + this.activeBoard.id + '/' + taskId;
|
||||
this.location.go(url);
|
||||
this.showViewModal(taskId);
|
||||
};
|
||||
}
|
||||
|
||||
showModal(taskId: number = 0) {
|
||||
|
@ -4,6 +4,7 @@ import {
|
||||
OnInit,
|
||||
ContentChild
|
||||
} from '@angular/core';
|
||||
import { Location } from '@angular/common';
|
||||
|
||||
import { ModalService } from './modal.service';
|
||||
|
||||
@ -30,7 +31,7 @@ export class ModalComponent implements OnInit {
|
||||
isOpen = false;
|
||||
animate = true;
|
||||
|
||||
constructor(public modalService: ModalService) {
|
||||
constructor(public modalService: ModalService, private location: Location) {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
@ -39,6 +40,11 @@ export class ModalComponent implements OnInit {
|
||||
|
||||
close(checkBlocking = false): void {
|
||||
this.modalService.close(this.modalId, checkBlocking);
|
||||
|
||||
const path = this.location.path().split('/');
|
||||
path.length -= 1;
|
||||
|
||||
this.location.go(path.join('/'))
|
||||
}
|
||||
|
||||
filterClick(event: Event): void {
|
||||
@ -52,13 +58,11 @@ export class ModalComponent implements OnInit {
|
||||
}
|
||||
|
||||
keyup(event: KeyboardEvent): void {
|
||||
// tslint:disable-next-line
|
||||
if (event.keyCode === 27) {
|
||||
this.modalService.close(this.modalId, true);
|
||||
if (event.key === 'Escape' && this.isOpen) {
|
||||
this.close(true);
|
||||
}
|
||||
|
||||
// tslint:disable-next-line
|
||||
if (event.keyCode === 13) {
|
||||
if (event.key === 'Enter') {
|
||||
this.clickDefaultAction();
|
||||
}
|
||||
}
|
||||
|
@ -513,7 +513,7 @@ describe('ColumnDisplay', () => {
|
||||
expect(called).toEqual(true);
|
||||
});
|
||||
|
||||
it('opens a model to add a task', () => {
|
||||
it('opens a modal to add a task', () => {
|
||||
component.quickAdd = { title: '' } as any;
|
||||
component.columnData = { id: 1 } as any;
|
||||
|
||||
|
@ -19,6 +19,12 @@ export class BoardServiceMock {
|
||||
public activeBoardChanged =
|
||||
new BehaviorSubject({ id: 0, name: 'Test', columns: [] });
|
||||
|
||||
public showTaskIdChanged = new BehaviorSubject(null);
|
||||
|
||||
showTask(id: number) {
|
||||
this.showTaskIdChanged.next(id);
|
||||
}
|
||||
|
||||
getBoards() {
|
||||
return new BehaviorSubject({
|
||||
data: [{}, [{ id: 1, name: 'Test', is_active: '1' }]]
|
||||
|
@ -73,7 +73,7 @@ describe('Modal', () => {
|
||||
expect(checkBlocking).toEqual(true);
|
||||
};
|
||||
|
||||
keyUp({ keyCode: 27 } as any);
|
||||
keyUp({ key: 'Escape' } as any);
|
||||
});
|
||||
|
||||
it('handles the Enter key', () => {
|
||||
@ -85,7 +85,7 @@ describe('Modal', () => {
|
||||
click: () => called = true
|
||||
} };
|
||||
|
||||
keyUp({ keyCode: 13 } as any);
|
||||
keyUp({ key: 'Enter' } as any);
|
||||
expect(called).toEqual(true);
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user