add card to saved page(s)

This commit is contained in:
Jason Wall 2020-08-06 12:57:33 -04:00
parent 81075f47d7
commit 3663fa0b53
14 changed files with 190 additions and 11 deletions

View File

@ -16,6 +16,7 @@ import { WordsComponent } from './search/components/words/words.component';
import { NoteComponent } from './search/components/note/note.component'; import { NoteComponent } from './search/components/note/note.component';
import { SettingsComponent } from './common/components/settings/settings.component'; import { SettingsComponent } from './common/components/settings/settings.component';
import { AddToPageModalComponent } from './search/components/add-to-page-modal/add-to-page-modal.component';
import { PageEditModalComponent } from './search/components/page-edit-modal/page-edit-modal.component'; import { PageEditModalComponent } from './search/components/page-edit-modal/page-edit-modal.component';
import { NoteEditModalComponent } from './search/components/note-edit-modal/note-edit-modal.component'; import { NoteEditModalComponent } from './search/components/note-edit-modal/note-edit-modal.component';
import { VersePickerModalComponent } from './search/components/verse-picker/verse-picker-modal.component'; import { VersePickerModalComponent } from './search/components/verse-picker/verse-picker-modal.component';
@ -67,6 +68,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard';
NoteComponent, NoteComponent,
PageEditModalComponent, PageEditModalComponent,
NoteEditModalComponent, NoteEditModalComponent,
AddToPageModalComponent,
VersePickerModalComponent, VersePickerModalComponent,
SettingsComponent, SettingsComponent,
], ],

View File

@ -8,6 +8,8 @@ import {
import { CardItem, OpenData } from '../../models/app-state'; import { CardItem, OpenData } from '../../models/app-state';
import { BibleReference } from '../bible-reference'; import { BibleReference } from '../bible-reference';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { MatDialog } from '@angular/material/dialog';
import { AddToPageModalComponent } from 'src/app/search/components/add-to-page-modal/add-to-page-modal.component';
@Component({ @Component({
template: '', template: '',
@ -24,7 +26,7 @@ export class CardComponent {
icon$: Observable<string>; icon$: Observable<string>;
constructor(protected elementRef: ElementRef) {} constructor(protected elementRef: ElementRef, protected dialog: MatDialog) {}
protected copyToClip(text: string, html: string) { protected copyToClip(text: string, html: string) {
function listener(e: ClipboardEvent) { function listener(e: ClipboardEvent) {
@ -63,4 +65,10 @@ export class CardComponent {
makePassage(p: string) { makePassage(p: string) {
return BibleReference.makePassageFromReferenceKey(p); return BibleReference.makePassageFromReferenceKey(p);
} }
addToSavedPage() {
this.dialog.open(AddToPageModalComponent, {
data: this.cardItem,
});
}
} }

View File

@ -0,0 +1,39 @@
<div mat-dialog-title>
<mat-toolbar>
<mat-icon>save</mat-icon>
<div class="title">Add Card to Saved Page</div>
</mat-toolbar>
</div>
<mat-dialog-content class="content">
<mat-selection-list #pageList>
<mat-list-option
*ngFor="let page of this.pages$ | async"
[value]="page"
[checkBoxPosition]="before"
>
{{ page.title }}
</mat-list-option>
<mat-divider></mat-divider>
</mat-selection-list>
<br /><br />
<form [formGroup]="form" class="add-page-form">
<h4>Create New Page</h4>
<mat-form-field class="page-title">
<mat-label>Title</mat-label>
<input formControlName="title" matInput /> </mat-form-field
><button
class="page-add-button"
mat-icon-button
mat-button
[disableRipple]="true"
(click)="addPage()"
>
<mat-icon>add</mat-icon>
</button>
</form>
</mat-dialog-content>
<div mat-dialog-actions>
<button mat-button (click)="save()">Save</button>
<button mat-button (click)="cancel()">Cancel</button>
</div>

View File

@ -0,0 +1,24 @@
.close-button {
float: right;
mat-icon {
font-size: 2rem;
}
}
.title {
width: 100%;
padding-left: 1rem;
font-size: 1.5rem;
}
.content {
min-width: 60vw;
min-height: 60vh;
}
.add-page-form {
padding-left: 16px;
}
.page-title {
width: calc(100% - 42px);
}

View File

@ -0,0 +1,48 @@
import { Component, Inject, ViewChild } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { AppService } from '../../../services/app.service';
import { CardItem } from 'src/app/models/app-state';
import { MatSelectionList } from '@angular/material/list';
import { FormBuilder, FormGroup } from '@angular/forms';
@Component({
selector: 'app-add-to-page-modal-modal',
templateUrl: 'add-to-page-modal.component.html',
styleUrls: ['./add-to-page-modal.component.scss'],
})
export class AddToPageModalComponent {
form: FormGroup;
title: string;
pages$ = this.appService.select((state) => state.savedPages);
@ViewChild('pageList')
pageList: MatSelectionList;
constructor(
@Inject(MAT_DIALOG_DATA) public card: CardItem,
public dialogRef: MatDialogRef<AddToPageModalComponent>,
private appService: AppService,
private fb: FormBuilder
) {
this.form = this.fb.group({
title: this.title,
});
}
cancel() {
this.dialogRef.close();
}
addPage() {
this.appService.savePage(this.form.get('title').value);
this.form.get('title').setValue('');
}
save() {
for (const page of this.pageList.selectedOptions.selected) {
this.appService.addCardToSavedPage(page.value.id, this.card);
}
this.dialogRef.close();
}
}

View File

@ -46,6 +46,10 @@
<mat-icon>content_copy</mat-icon> <mat-icon>content_copy</mat-icon>
<span>Copy Note</span> <span>Copy Note</span>
</button> </button>
<button mat-menu-item (click)="addToSavedPage()">
<mat-icon>save</mat-icon>
<span>Add Card to Saved Page</span>
</button>
</mat-menu> </mat-menu>
</span> </span>
</div> </div>

View File

@ -17,7 +17,7 @@ export class NoteComponent extends CardComponent {
private appService: AppService, private appService: AppService,
public dialog: MatDialog public dialog: MatDialog
) { ) {
super(elementRef); super(elementRef, dialog);
this.icon$ = appService.select((state) => state.cardIcons.note); this.icon$ = appService.select((state) => state.cardIcons.note);
} }

View File

@ -84,6 +84,10 @@
<mat-icon>content_copy</mat-icon> <mat-icon>content_copy</mat-icon>
<span>Copy Passage</span> <span>Copy Passage</span>
</button> </button>
<button mat-menu-item (click)="addToSavedPage()">
<mat-icon>save</mat-icon>
<span>Add Card to Saved Page</span>
</button>
</mat-menu> </mat-menu>
</span> </span>
</div> </div>

View File

@ -3,6 +3,7 @@ import { BibleReference } from '../../../common/bible-reference';
import { AppService } from '../../../services/app.service'; import { AppService } from '../../../services/app.service';
import { CardComponent } from '../../../common/components/card.component'; import { CardComponent } from '../../../common/components/card.component';
import { Paragraph } from '../../../models/app-state'; import { Paragraph } from '../../../models/app-state';
import { MatDialog } from '@angular/material/dialog';
@Component({ @Component({
selector: 'app-passage', selector: 'app-passage',
@ -32,9 +33,10 @@ export class PassageComponent extends CardComponent implements OnInit {
constructor( constructor(
protected elementRef: ElementRef, protected elementRef: ElementRef,
private appService: AppService private appService: AppService,
public dialog: MatDialog
) { ) {
super(elementRef); super(elementRef, dialog);
this.icon$ = appService.select((state) => state.cardIcons.passage); this.icon$ = appService.select((state) => state.cardIcons.passage);
} }

View File

@ -79,6 +79,10 @@
<mat-icon>content_copy</mat-icon> <mat-icon>content_copy</mat-icon>
<span>Copy Strongs Definition</span> <span>Copy Strongs Definition</span>
</button> </button>
<button mat-menu-item (click)="addToSavedPage()">
<mat-icon>save</mat-icon>
<span>Add Card to Saved Page</span>
</button>
</mat-menu> </mat-menu>
</span> </span>
</div> </div>

View File

@ -1,6 +1,7 @@
import { Component, ElementRef, ViewChild } from '@angular/core'; import { Component, ElementRef, ViewChild } from '@angular/core';
import { AppService } from '../../../services/app.service'; import { AppService } from '../../../services/app.service';
import { CardComponent } from '../../../common/components/card.component'; import { CardComponent } from '../../../common/components/card.component';
import { MatDialog } from '@angular/material/dialog';
@Component({ @Component({
selector: 'app-strongs', selector: 'app-strongs',
@ -13,9 +14,10 @@ export class StrongsComponent extends CardComponent {
constructor( constructor(
protected elementRef: ElementRef, protected elementRef: ElementRef,
private appService: AppService private appService: AppService,
public dialog: MatDialog
) { ) {
super(elementRef); super(elementRef, dialog);
this.icon$ = appService.select((state) => state.cardIcons.strongs); this.icon$ = appService.select((state) => state.cardIcons.strongs);
} }

View File

@ -42,6 +42,11 @@
<mat-icon>content_copy</mat-icon> <mat-icon>content_copy</mat-icon>
<span>Copy References</span> <span>Copy References</span>
</button> </button>
<button mat-menu-item (click)="addToSavedPage()">
<mat-icon>save</mat-icon>
<span>Add Card to Saved Page</span>
</button>
</mat-menu> </mat-menu>
</span> </span>
</div> </div>

View File

@ -2,6 +2,7 @@ import { Component, ElementRef, ViewChild } from '@angular/core';
import { AppService } from '../../../services/app.service'; import { AppService } from '../../../services/app.service';
import { CardComponent } from '../../../common/components/card.component'; import { CardComponent } from '../../../common/components/card.component';
import { WordLookupResult } from 'src/app/models/app-state'; import { WordLookupResult } from 'src/app/models/app-state';
import { MatDialog } from '@angular/material/dialog';
@Component({ @Component({
selector: 'app-words', selector: 'app-words',
@ -14,9 +15,10 @@ export class WordsComponent extends CardComponent {
constructor( constructor(
protected elementRef: ElementRef, protected elementRef: ElementRef,
private appService: AppService private appService: AppService,
public dialog: MatDialog
) { ) {
super(elementRef); super(elementRef, dialog);
this.icon$ = appService.select((state) => state.cardIcons.words); this.icon$ = appService.select((state) => state.cardIcons.words);
} }

View File

@ -75,12 +75,17 @@ const initialState: AppState = {
type AppAction = type AppAction =
| { | {
type: 'GET_SAVED_PAGE'; type: 'GET_SAVED_PAGE';
pageid: string; pageId: string;
} }
| { | {
type: 'UPDATE_SAVED_PAGES'; type: 'UPDATE_SAVED_PAGES';
savedPages: SavedPage[]; savedPages: SavedPage[];
} }
| {
type: 'ADD_CARD_TO_SAVED_PAGE';
card: CardItem;
pageId: string;
}
| { | {
type: 'ADD_CARD'; type: 'ADD_CARD';
card: CardItem; card: CardItem;
@ -144,7 +149,7 @@ function reducer(state: AppState, action: AppAction): AppState {
} }
case 'GET_SAVED_PAGE': { case 'GET_SAVED_PAGE': {
const page = state.savedPages.find( const page = state.savedPages.find(
(o) => o.id.toString() === action.pageid (o) => o.id.toString() === action.pageId
); );
if (!page) { if (!page) {
@ -157,6 +162,28 @@ function reducer(state: AppState, action: AppAction): AppState {
cards: [...page.queries], cards: [...page.queries],
}; };
} }
case 'ADD_CARD_TO_SAVED_PAGE': {
return {
...state,
savedPages: [
...state.savedPages.map((o) => {
if (o.id.toString() === action.pageId) {
let cards = [];
if (state.displaySettings.appendCardToBottom) {
cards = [...o.queries, action.card];
} else {
cards = [action.card, ...o.queries];
}
return {
...o,
queries: cards,
};
}
return o;
}),
],
};
}
case 'ADD_CARD': { case 'ADD_CARD': {
let cards = []; let cards = [];
@ -279,7 +306,7 @@ export class AppService extends createStateService(reducer, initialState) {
getSavedPage(pageid: string) { getSavedPage(pageid: string) {
this.dispatch({ this.dispatch({
type: 'GET_SAVED_PAGE', type: 'GET_SAVED_PAGE',
pageid, pageId: pageid,
}); });
} }
@ -350,6 +377,14 @@ export class AppService extends createStateService(reducer, initialState) {
); );
} }
addCardToSavedPage(pageId: string, card: CardItem) {
this.dispatch({
type: 'ADD_CARD_TO_SAVED_PAGE',
card,
pageId,
});
}
//#endregion //#endregion
//#region Display Settings //#region Display Settings