mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-01-10 12:35:07 +00:00
mail..
This commit is contained in:
parent
29bb2198d3
commit
c3cb5c8942
|
@ -5,7 +5,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
import { RouterModule, Routes } from '@angular/router';
|
import { RouterModule, Routes } from '@angular/router';
|
||||||
import 'hammerjs';
|
import 'hammerjs';
|
||||||
import { MailModule } from './main/apps/mail/mail.module';
|
|
||||||
import { ChatModule } from './main/apps/chat/chat.module';
|
import { ChatModule } from './main/apps/chat/chat.module';
|
||||||
import { ProjectModule } from './main/apps/dashboards/project/project.module';
|
import { ProjectModule } from './main/apps/dashboards/project/project.module';
|
||||||
import { FuseLayoutService } from './core/services/layout.service';
|
import { FuseLayoutService } from './core/services/layout.service';
|
||||||
|
@ -18,13 +17,9 @@ import { FuseMdSidenavHelperService } from './core/directives/md-sidenav-helper/
|
||||||
import { UIPageLayoutsModule } from './main/ui/page-layouts/page-layouts.module';
|
import { UIPageLayoutsModule } from './main/ui/page-layouts/page-layouts.module';
|
||||||
import { FuseLayoutModule } from './core/components/layout/layout.module';
|
import { FuseLayoutModule } from './core/components/layout/layout.module';
|
||||||
import { PerfectScrollbarConfigInterface, PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
|
import { PerfectScrollbarConfigInterface, PerfectScrollbarModule } from 'ngx-perfect-scrollbar';
|
||||||
import { environment } from 'environments/environment';
|
|
||||||
import { MailListComponent } from './main/apps/mail/mail-list/mail-list.component';
|
|
||||||
import { MailDetailsComponent } from './main/apps/mail/mail-details/mail-details.component';
|
|
||||||
import { MailDataService } from './main/apps/mail/mail-data.service';
|
|
||||||
import { HttpModule } from '@angular/http';
|
import { HttpModule } from '@angular/http';
|
||||||
import {InMemoryWebApiModule} from 'angular-in-memory-web-api';
|
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
|
||||||
import {FuseFakeDbService} from './fuse-fake-db/fuse-fake-db.service';
|
import { FuseFakeDbService } from './fuse-fake-db/fuse-fake-db.service';
|
||||||
|
|
||||||
const PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
const PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
|
||||||
suppressScrollX: true
|
suppressScrollX: true
|
||||||
|
@ -54,7 +49,7 @@ const appRoutes: Routes = [
|
||||||
SharedModule,
|
SharedModule,
|
||||||
RouterModule.forRoot(appRoutes),
|
RouterModule.forRoot(appRoutes),
|
||||||
|
|
||||||
InMemoryWebApiModule.forRoot(FuseFakeDbService, { delay: 500 }),
|
InMemoryWebApiModule.forRoot(FuseFakeDbService, {delay: 125}),
|
||||||
|
|
||||||
PerfectScrollbarModule.forRoot(PERFECT_SCROLLBAR_CONFIG),
|
PerfectScrollbarModule.forRoot(PERFECT_SCROLLBAR_CONFIG),
|
||||||
|
|
||||||
|
@ -67,7 +62,6 @@ const appRoutes: Routes = [
|
||||||
UIPageLayoutsModule
|
UIPageLayoutsModule
|
||||||
],
|
],
|
||||||
providers : [
|
providers : [
|
||||||
MailDataService,
|
|
||||||
FuseNavigationService,
|
FuseNavigationService,
|
||||||
FuseLayoutService,
|
FuseLayoutService,
|
||||||
FuseMatchMedia,
|
FuseMatchMedia,
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
import { Injectable } from '@angular/core';
|
|
||||||
import {ActivatedRouteSnapshot, Resolve, Route, RouterStateSnapshot} from '@angular/router';
|
|
||||||
import { Observable } from 'rxjs/Observable';
|
|
||||||
import { Http } from '@angular/http';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class MailDataService implements Resolve<any>
|
|
||||||
{
|
|
||||||
constructor(
|
|
||||||
private http: Http
|
|
||||||
)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any
|
|
||||||
{
|
|
||||||
console.log(route.params);
|
|
||||||
console.log(route.paramMap.get('labelHandle'));
|
|
||||||
|
|
||||||
// route.params.subscribe(params => {
|
|
||||||
// });
|
|
||||||
return new Promise((resolve, reject) =>
|
|
||||||
{
|
|
||||||
console.log('resolve...');
|
|
||||||
|
|
||||||
this.http.get('api/mail-mails').subscribe(response =>
|
|
||||||
{
|
|
||||||
console.info(response);
|
|
||||||
resolve(response);
|
|
||||||
}, reject);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getMailsByFolder(handle)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
saveMailSubject(subject)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -13,14 +13,12 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="actions" fxLayout="row" fxLayoutAlign="start center">
|
<div class="actions" fxLayout="row" fxLayoutAlign="start center">
|
||||||
<button md-button class="mat-icon-button" ng-click="vm.togglemailStatus('starred')"
|
<button md-button class="mat-icon-button" (click)="toggleStar($event)" aria-label="Toggle star">
|
||||||
aria-label="Toggle starred">
|
|
||||||
<md-icon *ngIf="mail.starred">star</md-icon>
|
<md-icon *ngIf="mail.starred">star</md-icon>
|
||||||
<md-icon *ngIf="!mail.starred">star_outline</md-icon>
|
<md-icon *ngIf="!mail.starred">star_outline</md-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button md-button class="mat-icon-button" ng-click="vm.togglemailStatus('important')"
|
<button md-button class="mat-icon-button" (click)="toggleImportant($event)" aria-label="Toggle important">
|
||||||
aria-label="Toggle important">
|
|
||||||
<md-icon *ngIf="mail.important">label</md-icon>
|
<md-icon *ngIf="mail.important">label</md-icon>
|
||||||
<md-icon *ngIf="!mail.important">label_outline</md-icon>
|
<md-icon *ngIf="!mail.important">label_outline</md-icon>
|
||||||
</button>
|
</button>
|
||||||
|
@ -118,7 +116,8 @@
|
||||||
<div *ngIf="mail.attachments" class="mail-attachments">
|
<div *ngIf="mail.attachments" class="mail-attachments">
|
||||||
|
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<span>Attachments</span> ({{mail.attachments.length}})
|
<span>Attachments</span>
|
||||||
|
({{mail.attachments.length}})
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="attachment-list" layout-wrap fxLayout="row">
|
<div class="attachment-list" layout-wrap fxLayout="row">
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import {Component, Input, OnInit} from '@angular/core';
|
import { Component, Input, OnInit } from '@angular/core';
|
||||||
import {MailModel} from '../mail.model';
|
import { Mail } from '../mail.model';
|
||||||
|
import { MailService } from '../mail.service';
|
||||||
|
import { ActivatedRoute } from '@angular/router';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-mail-details',
|
selector : 'fuse-mail-details',
|
||||||
|
@ -8,16 +10,38 @@ import {MailModel} from '../mail.model';
|
||||||
})
|
})
|
||||||
export class MailDetailsComponent implements OnInit
|
export class MailDetailsComponent implements OnInit
|
||||||
{
|
{
|
||||||
@Input('selectedMail') public mail: MailModel;
|
@Input('selectedMail') public mail: Mail;
|
||||||
showDetails: boolean;
|
showDetails: boolean;
|
||||||
|
|
||||||
constructor()
|
constructor(
|
||||||
|
private route: ActivatedRoute,
|
||||||
|
private mailService: MailService
|
||||||
|
)
|
||||||
{
|
{
|
||||||
this.showDetails = false;
|
this.showDetails = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit()
|
ngOnInit()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleStar(event)
|
||||||
|
{
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
this.mail.toggleStar();
|
||||||
|
|
||||||
|
this.mailService.update(this.mail);
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleImportant(event)
|
||||||
|
{
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
this.mail.toggleImportant();
|
||||||
|
|
||||||
|
this.mailService.update(this.mail);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,16 +35,12 @@
|
||||||
<div class="time">{{mail.time}}</div>
|
<div class="time">{{mail.time}}</div>
|
||||||
|
|
||||||
<div class="actions" fxLayout="row" fxLayoutAlign="start center">
|
<div class="actions" fxLayout="row" fxLayoutAlign="start center">
|
||||||
<button md-button class="mat-icon-button"
|
<button md-button class="mat-icon-button" (click)="toggleStar($event)" aria-label="Toggle star">
|
||||||
ng-click="vm.togglemailStatus('starred', mail, $event)"
|
|
||||||
aria-label="Toggle starred">
|
|
||||||
<md-icon *ngIf="mail.starred">star</md-icon>
|
<md-icon *ngIf="mail.starred">star</md-icon>
|
||||||
<md-icon *ngIf="!mail.starred">star_outline</md-icon>
|
<md-icon *ngIf="!mail.starred">star_outline</md-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button md-button class="mat-icon-button"
|
<button md-button class="mat-icon-button" (click)="toggleImportant($event)" aria-label="Toggle important">
|
||||||
ng-click="vm.togglemailStatus('important', mail, $event)"
|
|
||||||
aria-label="Toggle important">
|
|
||||||
<md-icon *ngIf="mail.important">label</md-icon>
|
<md-icon *ngIf="mail.important">label</md-icon>
|
||||||
<md-icon *ngIf="!mail.important">label_outline</md-icon>
|
<md-icon *ngIf="!mail.important">label_outline</md-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import { Component, Input, OnInit } from '@angular/core';
|
import { Component, Input, OnInit } from '@angular/core';
|
||||||
import { MailModel } from '../../mail.model';
|
import { Mail } from '../../mail.model';
|
||||||
|
import { MailService } from '../../mail.service';
|
||||||
|
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-mail-list-item',
|
selector : 'fuse-mail-list-item',
|
||||||
|
@ -8,14 +10,36 @@ import { MailModel } from '../../mail.model';
|
||||||
})
|
})
|
||||||
export class MailListItemComponent implements OnInit
|
export class MailListItemComponent implements OnInit
|
||||||
{
|
{
|
||||||
@Input() mail: MailModel;
|
@Input() mail: Mail;
|
||||||
|
|
||||||
constructor()
|
constructor(
|
||||||
|
private route: ActivatedRoute,
|
||||||
|
private mailService: MailService
|
||||||
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit()
|
ngOnInit()
|
||||||
{
|
{
|
||||||
|
this.mail = new Mail(this.mail);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleStar(event)
|
||||||
|
{
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
this.mail.toggleStar();
|
||||||
|
|
||||||
|
this.mailService.update(this.mail);
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleImportant(event)
|
||||||
|
{
|
||||||
|
event.stopPropagation();
|
||||||
|
|
||||||
|
this.mail.toggleImportant();
|
||||||
|
|
||||||
|
this.mailService.update(this.mail);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,3 @@
|
||||||
|
<fuse-mail-list-item *ngFor="let mail of mails" [mail]="mail" md-ripple (click)="selectMail(mail.id)"
|
||||||
<button md-button (click)="onSave()">Save</button>
|
[ngClass]="{'selected-mail':mail?.id === selectedMail?.id}">
|
||||||
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<fuse-mail-list-item *ngFor="let mail of mails" [mail]="mail" md-ripple (click)="selectMail(mail)"
|
|
||||||
[ngClass]="{'selected-mail':mail === selectedMail}">
|
|
||||||
</fuse-mail-list-item>
|
</fuse-mail-list-item>
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
|
import { Component, Input, OnInit } from '@angular/core';
|
||||||
import {MailModel} from '../mail.model';
|
import { Mail } from '../mail.model';
|
||||||
import {MailDataService} from '../mail-data.service';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import {Http} from '@angular/http';
|
import { MailService } from '../mail.service';
|
||||||
import {ActivatedRoute} from '@angular/router';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-mail-list',
|
selector : 'fuse-mail-list',
|
||||||
|
@ -11,62 +10,44 @@ import {ActivatedRoute} from '@angular/router';
|
||||||
})
|
})
|
||||||
export class MailListComponent implements OnInit
|
export class MailListComponent implements OnInit
|
||||||
{
|
{
|
||||||
mails: MailModel[];
|
mails: Mail[];
|
||||||
|
|
||||||
@Input('selectedMail') public selectedMail: MailModel;
|
@Input('selectedMail') public selectedMail: Mail;
|
||||||
@Output() onMailSelect = new EventEmitter<MailModel>();
|
|
||||||
|
|
||||||
constructor(private mailDataService: MailDataService,
|
constructor(
|
||||||
private http: Http,
|
private route: ActivatedRoute,
|
||||||
private route: ActivatedRoute)
|
private router: Router,
|
||||||
|
private mailService: MailService
|
||||||
|
)
|
||||||
{
|
{
|
||||||
route.data.subscribe(response =>
|
|
||||||
{
|
|
||||||
console.info(response.mailDB.json());
|
|
||||||
this.mails = response.mailDB.json().data;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit()
|
ngOnInit()
|
||||||
{
|
{
|
||||||
|
// Get mails for the first time
|
||||||
|
this.mails = this.mailService.mails;
|
||||||
|
|
||||||
|
// Subscribe to update mails on changes
|
||||||
|
this.mailService.onMailsUpdated
|
||||||
|
.subscribe(mails => {
|
||||||
|
console.log('mailsUpdated');
|
||||||
|
this.mails = mails;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onSave()
|
selectMail(mailId)
|
||||||
{
|
{
|
||||||
/*this.http.get('api/mails?important=true&labels=1').subscribe(response =>
|
const labelHandle = this.route.snapshot.params.labelHandle,
|
||||||
|
folderHandle = this.route.snapshot.params.folderHandle;
|
||||||
|
|
||||||
|
if ( labelHandle )
|
||||||
{
|
{
|
||||||
console.log(response);
|
this.router.navigate(['apps/mail/label', labelHandle, mailId]);
|
||||||
});*/
|
|
||||||
|
|
||||||
this.http.get('api/mail-mails').subscribe(response =>
|
|
||||||
{
|
|
||||||
console.log(response.json());
|
|
||||||
});
|
|
||||||
|
|
||||||
/*this.http.get('api/mail/folders/0').subscribe(response =>
|
|
||||||
{
|
|
||||||
console.log(response);
|
|
||||||
});*/
|
|
||||||
|
|
||||||
|
|
||||||
/*this.http.post('api/mails', {id: '2', subject: 'Test test'}).subscribe(response =>
|
|
||||||
{
|
|
||||||
console.log(response);
|
|
||||||
|
|
||||||
this.http.get('api/mails/2').subscribe(response2 =>
|
|
||||||
{
|
|
||||||
console.log(response2);
|
|
||||||
});
|
|
||||||
});*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
selectMail(mail)
|
|
||||||
{
|
{
|
||||||
this.selectedMail = mail;
|
this.router.navigate(['apps/mail', folderHandle, mailId]);
|
||||||
this.onMailSelect.emit(mail);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
|
|
||||||
<div fxLayout="row" fxFill>
|
<div fxLayout="row" fxFill>
|
||||||
|
|
||||||
<fuse-mail-list fxFlex [selectedMail]="selectedMail" (onMailSelect)="onMailSelect($event)"></fuse-mail-list>
|
<fuse-mail-list fxFlex [selectedMail]="selectedMail"></fuse-mail-list>
|
||||||
|
|
||||||
<fuse-mail-details fxFlex [selectedMail]="selectedMail"></fuse-mail-details>
|
<fuse-mail-details fxFlex [selectedMail]="selectedMail"></fuse-mail-details>
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { Mail } from './mail.model';
|
||||||
import { MailModel } from './mail.model';
|
import { MailService } from './mail.service';
|
||||||
import { MailDataService } from './mail-data.service';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-mail',
|
selector : 'fuse-mail',
|
||||||
|
@ -10,23 +9,22 @@ import { MailDataService } from './mail-data.service';
|
||||||
})
|
})
|
||||||
export class MailComponent implements OnInit
|
export class MailComponent implements OnInit
|
||||||
{
|
{
|
||||||
selectedMail: MailModel;
|
selectedMail: Mail;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
private mailService: MailService
|
||||||
private mailDataService: MailDataService
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
console.log('mail component inited');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit()
|
ngOnInit()
|
||||||
{
|
{
|
||||||
|
this.selectedMail = this.mailService.selectedMail;
|
||||||
|
|
||||||
}
|
this.mailService.onSelectedMailUpdated
|
||||||
|
.subscribe(selectedMail => {
|
||||||
onMailSelect(mail)
|
this.selectedMail = selectedMail;
|
||||||
{
|
});
|
||||||
this.selectedMail = mail;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
export class MailModel
|
export class Mail
|
||||||
{
|
{
|
||||||
id: string;
|
id: string;
|
||||||
subject: string;
|
|
||||||
from: {
|
from: {
|
||||||
name: string,
|
name: string,
|
||||||
avatar: string,
|
avatar: string,
|
||||||
|
@ -11,26 +10,47 @@ export class MailModel
|
||||||
name: string,
|
name: string,
|
||||||
email: string
|
email: string
|
||||||
}[];
|
}[];
|
||||||
|
subject: string;
|
||||||
message: string;
|
message: string;
|
||||||
time: string;
|
time: string;
|
||||||
read: boolean;
|
read: boolean;
|
||||||
starred: boolean;
|
starred: boolean;
|
||||||
important: boolean;
|
important: boolean;
|
||||||
hasAttachments: boolean;
|
hasAttachments: boolean;
|
||||||
attachments: [
|
attachments: {
|
||||||
{
|
|
||||||
type: string,
|
type: string,
|
||||||
fileName: string,
|
fileName: string,
|
||||||
preview: string,
|
preview: string,
|
||||||
url: string,
|
url: string,
|
||||||
size: string
|
size: string
|
||||||
}
|
}[];
|
||||||
];
|
|
||||||
labels: string[];
|
labels: string[];
|
||||||
folders: any[];
|
folders: string[];
|
||||||
|
|
||||||
constructor()
|
constructor(mail)
|
||||||
{
|
{
|
||||||
|
this.id = mail.id;
|
||||||
|
this.from = mail.from;
|
||||||
|
this.to = mail.to;
|
||||||
|
this.subject = mail.subject;
|
||||||
|
this.message = mail.message;
|
||||||
|
this.time = mail.time;
|
||||||
|
this.read = mail.read;
|
||||||
|
this.starred = mail.starred;
|
||||||
|
this.important = mail.important;
|
||||||
|
this.hasAttachments = mail.hasAttachments;
|
||||||
|
this.attachments = mail.attachments;
|
||||||
|
this.labels = mail.labels;
|
||||||
|
this.folders = mail.folders;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleStar()
|
||||||
|
{
|
||||||
|
this.starred = !this.starred;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleImportant()
|
||||||
|
{
|
||||||
|
this.important = !this.important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,37 +6,35 @@ import { MainSidenavComponent } from './sidenavs/main/main-sidenav.component';
|
||||||
import { MailListItemComponent } from './mail-list/mail-list-item/mail-list-item.component';
|
import { MailListItemComponent } from './mail-list/mail-list-item/mail-list-item.component';
|
||||||
import { MailListComponent } from './mail-list/mail-list.component';
|
import { MailListComponent } from './mail-list/mail-list.component';
|
||||||
import { MailDetailsComponent } from './mail-details/mail-details.component';
|
import { MailDetailsComponent } from './mail-details/mail-details.component';
|
||||||
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
|
import { MailService } from './mail.service';
|
||||||
import { HttpModule } from '@angular/http';
|
|
||||||
import {MailDataService} from './mail-data.service';
|
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
path : 'label/:labelHandle',
|
path : 'label/:labelHandle',
|
||||||
component: MailComponent,
|
component: MailComponent,
|
||||||
resolve : {
|
resolve : {
|
||||||
mailDB: MailDataService
|
mail: MailService
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'label/:labelHandle/:mailId',
|
path : 'label/:labelHandle/:mailId',
|
||||||
component: MailComponent,
|
component: MailComponent,
|
||||||
resolve : {
|
resolve : {
|
||||||
mailDB: MailDataService
|
mail: MailService
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path : ':folderHandle',
|
path : ':folderHandle',
|
||||||
component: MailComponent,
|
component: MailComponent,
|
||||||
resolve : {
|
resolve : {
|
||||||
mailDB: MailDataService
|
mail: MailService
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: ':folderHandle/:mailId',
|
path : ':folderHandle/:mailId',
|
||||||
component: MailComponent,
|
component: MailComponent,
|
||||||
resolve : {
|
resolve : {
|
||||||
mailDB: MailDataService
|
mail: MailService
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -55,11 +53,11 @@ const routes: Routes = [
|
||||||
],
|
],
|
||||||
imports : [
|
imports : [
|
||||||
SharedModule,
|
SharedModule,
|
||||||
HttpModule,
|
RouterModule.forChild(routes)
|
||||||
RouterModule.forChild(routes),
|
|
||||||
InMemoryWebApiModule
|
|
||||||
],
|
],
|
||||||
providers : []
|
providers : [
|
||||||
|
MailService
|
||||||
|
]
|
||||||
})
|
})
|
||||||
export class MailModule
|
export class MailModule
|
||||||
{
|
{
|
||||||
|
|
198
src/app/main/apps/mail/mail.service.ts
Normal file
198
src/app/main/apps/mail/mail.service.ts
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
|
||||||
|
import { Observable } from 'rxjs/Observable';
|
||||||
|
import { Http } from '@angular/http';
|
||||||
|
import { Mail } from './mail.model';
|
||||||
|
import { Subject } from 'rxjs/Subject';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class MailService implements Resolve<any>
|
||||||
|
{
|
||||||
|
mails: Mail[];
|
||||||
|
selectedMail: Mail;
|
||||||
|
labels: any[];
|
||||||
|
folders: any[];
|
||||||
|
|
||||||
|
routeParams: any;
|
||||||
|
|
||||||
|
onMailsUpdated = new Subject<Mail[]>();
|
||||||
|
onSelectedMailUpdated = new Subject<Mail>();
|
||||||
|
onLabelsUpdated = new Subject<any[]>();
|
||||||
|
onFoldersUpdated = new Subject<any[]>();
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private http: Http
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any
|
||||||
|
{
|
||||||
|
this.routeParams = route.params;
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
Promise.all([
|
||||||
|
this.getFolders(),
|
||||||
|
this.getLabels(),
|
||||||
|
this.getMails()
|
||||||
|
]).then(
|
||||||
|
() => {
|
||||||
|
if ( this.routeParams.mailId )
|
||||||
|
{
|
||||||
|
this.setSelectedMail(this.routeParams.mailId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.setSelectedMail(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
},
|
||||||
|
reject
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getFolders(): Promise<any>
|
||||||
|
{
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.http.get('api/mail-folders')
|
||||||
|
.subscribe(response => {
|
||||||
|
this.folders = response.json().data;
|
||||||
|
this.onFoldersUpdated.next(this.folders);
|
||||||
|
resolve(this.folders);
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getLabels(): Promise<any>
|
||||||
|
{
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.http.get('api/mail-labels')
|
||||||
|
.subscribe(response => {
|
||||||
|
this.labels = response.json().data;
|
||||||
|
this.onLabelsUpdated.next(this.labels);
|
||||||
|
resolve(this.labels);
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getMails(): Promise<Mail[]>
|
||||||
|
{
|
||||||
|
if ( this.routeParams.labelHandle )
|
||||||
|
{
|
||||||
|
return this.getMailsByLabel(this.routeParams.labelHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.getMailsByFolder(this.routeParams.folderHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
getMailsByFolder(handle): Promise<Mail[]>
|
||||||
|
{
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
|
if ( handle === 'starred' || handle === 'important' )
|
||||||
|
{
|
||||||
|
this.http.get('api/mail-mails?' + handle + '=true')
|
||||||
|
.subscribe(mails => {
|
||||||
|
|
||||||
|
this.mails = mails.json().data.map(mail => {
|
||||||
|
return new Mail(mail);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.onMailsUpdated.next(this.mails);
|
||||||
|
|
||||||
|
resolve(this.mails);
|
||||||
|
|
||||||
|
}, reject);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.http.get('api/mail-folders?handle=' + handle)
|
||||||
|
.subscribe(folders => {
|
||||||
|
|
||||||
|
const folderId = folders.json().data[0].id;
|
||||||
|
|
||||||
|
this.http.get('api/mail-mails?folders=' + folderId)
|
||||||
|
.subscribe(mails => {
|
||||||
|
|
||||||
|
this.mails = mails.json().data.map(mail => {
|
||||||
|
return new Mail(mail);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.onMailsUpdated.next(this.mails);
|
||||||
|
|
||||||
|
resolve(this.mails);
|
||||||
|
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getMailsByLabel(handle): Promise<Mail[]>
|
||||||
|
{
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.http.get('api/mail-labels?handle=' + handle)
|
||||||
|
.subscribe(labels => {
|
||||||
|
|
||||||
|
const labelId = labels.json().data[0].id;
|
||||||
|
|
||||||
|
this.http.get('api/mail-mails?labels=' + labelId)
|
||||||
|
.subscribe(mails => {
|
||||||
|
|
||||||
|
this.mails = mails.json().data.map(mail => {
|
||||||
|
return new Mail(mail);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.onMailsUpdated.next(this.mails);
|
||||||
|
|
||||||
|
resolve(this.mails);
|
||||||
|
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getMailById(id): Promise<Mail>
|
||||||
|
{
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.http.get('api/mail-mails/' + id)
|
||||||
|
.subscribe(mail => {
|
||||||
|
resolve(mail.json().data);
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setSelectedMail(id)
|
||||||
|
{
|
||||||
|
this.selectedMail = this.mails.find(mail => {
|
||||||
|
return mail.id === id;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.onSelectedMailUpdated.next(this.selectedMail);
|
||||||
|
}
|
||||||
|
|
||||||
|
update(mail)
|
||||||
|
{
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.http.post('api/mail-mails/' + mail.id, {...mail}).subscribe(response => {
|
||||||
|
|
||||||
|
console.log(response);
|
||||||
|
|
||||||
|
this.getMails().then(mails => {
|
||||||
|
|
||||||
|
if ( mails && this.selectedMail )
|
||||||
|
{
|
||||||
|
this.setSelectedMail(this.selectedMail.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(mails);
|
||||||
|
|
||||||
|
}, reject);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -22,12 +22,21 @@
|
||||||
<!-- SIDENAV CONTENT -->
|
<!-- SIDENAV CONTENT -->
|
||||||
<div class="content" perfect-scrollbar>
|
<div class="content" perfect-scrollbar>
|
||||||
|
|
||||||
<a routerLink="/apps/mail/inbox">Inbox</a>
|
<md-list>
|
||||||
<a routerLink="/apps/mail/sent">Sent</a>
|
<div md-subheader>FOLDERS</div>
|
||||||
<a routerLink="/apps/mail/drafts">Drafts</a>
|
<md-list-item *ngFor="let folder of folders">
|
||||||
<a routerLink="/apps/mail/spam">Spam</a>
|
<a md-line [routerLink]="'/apps/mail/' + folder.handle">
|
||||||
|
{{ folder.title }}
|
||||||
|
</a>
|
||||||
|
</md-list-item>
|
||||||
|
|
||||||
<a routerLink="/apps/mail/true">Spam</a>
|
<div md-subheader>LABELS</div>
|
||||||
|
<md-list-item *ngFor="let label of labels">
|
||||||
|
<a md-line [routerLink]="'/apps/mail/label/' + label.handle">
|
||||||
|
{{ label.title }}
|
||||||
|
</a>
|
||||||
|
</md-list-item>
|
||||||
|
</md-list>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- / SIDENAV CONTENT -->
|
<!-- / SIDENAV CONTENT -->
|
|
@ -1,4 +1,5 @@
|
||||||
import {Component, OnInit} from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { MailService } from '../../mail.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector : 'fuse-mail-main-sidenav',
|
selector : 'fuse-mail-main-sidenav',
|
||||||
|
@ -7,20 +8,35 @@ import {Component, OnInit} from '@angular/core';
|
||||||
})
|
})
|
||||||
export class MainSidenavComponent implements OnInit
|
export class MainSidenavComponent implements OnInit
|
||||||
{
|
{
|
||||||
|
labels: any[];
|
||||||
|
folders: any[];
|
||||||
accounts: object;
|
accounts: object;
|
||||||
selectedAccount: string;
|
selectedAccount: string;
|
||||||
|
|
||||||
constructor()
|
constructor(
|
||||||
|
private mailService: MailService
|
||||||
|
)
|
||||||
{
|
{
|
||||||
// Data
|
// Data
|
||||||
this.accounts = {
|
this.accounts = {
|
||||||
'creapond' : 'johndoe@creapond.com',
|
'creapond' : 'johndoe@creapond.com',
|
||||||
'withinpixels': 'johndoe@withinpixels.com'
|
'withinpixels': 'johndoe@withinpixels.com'
|
||||||
};
|
};
|
||||||
|
|
||||||
this.selectedAccount = 'creapond';
|
this.selectedAccount = 'creapond';
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit()
|
ngOnInit()
|
||||||
{
|
{
|
||||||
|
this.labels = this.mailService.labels;
|
||||||
|
this.folders = this.mailService.folders;
|
||||||
|
|
||||||
|
this.mailService.onLabelsUpdated.subscribe(labels => {
|
||||||
|
this.labels = this.mailService.labels;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.mailService.onFoldersUpdated.subscribe(folders => {
|
||||||
|
this.folders = this.mailService.folders;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user