import { Component, EventEmitter, Output, Input, OnInit, ElementRef } from '@angular/core'; import { OpenData, CardItem } from '../../pages/search/search'; import { BiblePassageResult, BibleService, BiblePassage, BibleVerse, HashTable, Paragraph } from '../../services/bible-service'; import { Reference } from '../../libs/Reference'; import { ProfileService } from '../../services/profile-service'; import { ActionSheetController, GestureController, GESTURE_ITEM_SWIPE, AlertController } from 'ionic-angular'; import { PagesService } from '../../services/pages-service'; import { GESTURE_PRIORITY_SLIDING_ITEM } from 'ionic-angular/umd/gestures/gesture-controller'; @Component({ selector: 'passage', templateUrl: 'passage.html', providers: [BibleService] }) export class Passage implements OnInit { @Output() onItemClicked = new EventEmitter(); @Output() onClose = new EventEmitter(); @Input() cardItem: CardItem; data: BiblePassageResult; withParas: BibleParaPassage[]; ref: Reference; private gesture; constructor( private bibleService: BibleService, private elementRef: ElementRef, private profileService: ProfileService, private actionSheet: ActionSheetController, private pagesSvc: PagesService, private alertCtrl: AlertController ) { } ngOnInit(): void { this.ref = new Reference(this.cardItem.qry); this.bibleService.getResultAsPromise(this.ref.Section).then(data => { this.setData(data); }); } setData(data: BiblePassageResult) { this.data = data; this.withParas = this.getParaPassages(data.cs); } contextMenu() { const actions = this.actionSheet.create({ title: 'Passage Actions', buttons: [ { text: 'Add to a Saved Page', icon: 'add-circle', handler: () => { let btns = this.pagesSvc.getSavedPages().map(p => { return { text: p.title, icon: 'bookmark', handler: () => { const page = this.profileService.profile().saved_pages.find( i => i.title === p.title ); page.queries.push(this.cardItem); this.profileService.save(); } } }); btns.push({ text: 'Add to New Page', icon: 'create', handler: () => { const alert = this.alertCtrl.create({ title: 'Save Passage as Page', inputs: [ { name: 'title', placeholder: 'Page Title' } ], buttons: [ { text: 'Cancel', role: 'cancel', handler: (): void => { console.log('Cancel clicked'); } }, { text: 'Save', handler: data => { const p = { queries: this.profileService.profile().items.slice(), title: data.title }; this.profileService.profile().saved_pages.push(p); this.profileService.save(); this.pagesSvc.addPage(p); } } ] }); alert.present(); } }); this.actionSheet.create({ title: 'Saved Pages', buttons: btns }).present(); } } ] }); if (this.profileService.isOnSearchPage()) { actions.addButton({ text: 'Remove from ' + this.profileService.title, icon: 'remove-circle', handler: () => { const page = this.profileService.profile().saved_pages.find( i => i.title === this.profileService.title ); const idx = this.profileService.profile().items.indexOf(this.cardItem); this.profileService.profile().items.splice(idx, 1); page.queries = this.profileService.profile().items.slice(); this.profileService.save(); this.pagesSvc.initializePages(this.profileService.profile().saved_pages); } }); } actions.present(); } close(ev) { let translate = 'translate3d(110%, 0, 0)'; if (ev != null && ev.direction === 2) { translate = 'translate3d(-110%, 0, 0)'; } let d = 250; this.elementRef.nativeElement.parentElement.animate({ transform: ['none', translate] }, { fill: 'forwards', duration: d, iterations: 1, easing: 'ease-in-out' }); setTimeout(() => { this.onClose.emit(this.cardItem); }, d); } next() { const last_verse_for_end = this.ref.Section.end.book.chapters[parseInt(this.ref.Section.end.chapter)].toString(); if (this.ref.Section.end.verse !== '*' && this.ref.Section.end.verse !== last_verse_for_end) this.ref.Section.end.chapter = this.ref.Section.end.chapter; else this.ref.Section.end.chapter = (parseInt(this.ref.Section.end.chapter) + 1).toString(); this.ref.Section.start.chapter = this.ref.Section.end.chapter; this.ref.Section.start.verse = '1'; this.ref.Section.end.verse = '*'; this.bibleService.getResultAsPromise(this.ref.Section).then(data => { this.setData(data); this.cardItem.qry = data.ref; this.ref = new Reference(data.ref); }); } prev() { if (this.ref.Section.start.verse !== '1') this.ref.Section.start.chapter = this.ref.Section.start.chapter; else this.ref.Section.start.chapter = (parseInt(this.ref.Section.start.chapter) - 1).toString(); this.ref.Section.end.chapter = this.ref.Section.start.chapter; this.ref.Section.start.verse = '1'; this.ref.Section.end.verse = '*'; this.bibleService.getResultAsPromise(this.ref.Section).then(data => { this.setData(data); this.cardItem.qry = data.ref; this.ref = new Reference(data.ref); }); } expand() { const last_verse_for_end = this.ref.Section.end.book.chapters[parseInt(this.ref.Section.end.chapter)]; // if your verse is at the beginning, to go the prev chapter and add 3 verses from that if (parseInt(this.ref.Section.start.verse) < 4) { this.ref.Section.start.chapter = (parseInt(this.ref.Section.start.chapter) - 1).toString(); this.ref.Section.start.verse = '*-' + (3 - parseInt(this.ref.Section.start.verse)); if (this.ref.Section.start.chapter === '0') { this.ref.Section.start.chapter = '1'; this.ref.Section.start.verse = '1'; } } else // or go back 3 verses this.ref.Section.start.verse = (parseInt(this.ref.Section.start.verse) - 3).toString(); // if your verse is at the end, go to the next chapter if (this.ref.Section.end.verse === '*' || parseInt(this.ref.Section.end.verse) + 3 > last_verse_for_end) { this.ref.Section.end.chapter = (parseInt(this.ref.Section.end.chapter) + 1).toString(); if (this.ref.Section.end.verse === '*') this.ref.Section.end.verse = '3'; else this.ref.Section.end.verse = (parseInt(this.ref.Section.end.verse) + 3 - last_verse_for_end).toString(); if (this.ref.Section.end.chapter === (this.ref.Section.end.book.last_chapter + 1).toString()) { this.ref.Section.end.chapter = this.ref.Section.end.book.last_chapter.toString(); this.ref.Section.end.verse = last_verse_for_end.toString(); } } else // or add 3 verses this.ref.Section.end.verse = (parseInt(this.ref.Section.end.verse) + 3).toString(); if (this.ref.Section.start.verse === '0') this.ref.Section.start.verse = '1'; this.bibleService.getResultAsPromise(this.ref.Section).then(data => { this.setData(data); this.cardItem.qry = data.ref; this.ref = new Reference(data.ref); }); } openStrongs(strongs: string) { this.onItemClicked.emit({ card: this.cardItem, qry: this.cardItem.dict + strongs, from_search_bar: false }); } isPunct(c: string) { return new RegExp('^[\.\,\;\:\?\!]$').test(c); } hasHeader(p: Paragraph) { if (p === undefined) return false; return p.h.length > 0; } isPara(vs: BibleVerse) { return this.getRefKey(this.ref.Section.start.chapter, vs) in BibleService.paragraphs; } getRefKey(ch: string, vs: BibleVerse) { return this.ref.Section.start.book.book_number + ';' + ch + ';' + vs.v; } getParaPassages(chapters: BiblePassage[]) { let passages: BibleParaPassage[] = []; for (let ch of chapters) { let para = { ch: ch.ch, paras: this.getParas(ch) }; passages.push(para); } return passages; } getParas(ch: BiblePassage) { // group the verses into paragraphs. // create an initial paragraph to hold verses that might come before a paragraph. let para: BiblePara = { p: { h: '', p: 0 }, vss: [] }; let paras: BiblePara[] = []; // for each verse in the chapter, break them into paragraphs. for (let v of ch.vss) { if (this.isPara(v)) { paras.push(para); para = { p: BibleService.paragraphs[this.getRefKey(ch.ch.toString(), v)], vss: [v] }; if (para.p === undefined) para.p = { h: '', p: 0 }; // just in case you can't find a paragraph. } else { para.vss.push(v); } } // add the final paragraph if it has verses. if (para.vss.length > 0) paras.push(para); return paras; } } type BiblePara = { p: Paragraph, vss: BibleVerse[], } type BibleParaPassage = { ch: number; paras: BiblePara[]; }