From 7aa83dbd2039c9f8b250014e766edee843d25dd6 Mon Sep 17 00:00:00 2001 From: walljm Date: Thu, 26 Jan 2017 01:16:26 -0500 Subject: [PATCH] FEATURE/PERF: move more things into promises, so the menu closes immediately. * only load strongs into modals if you're clicking on a link * change size of strongs cross refs dynamically --- .../src/components/passage/passage.ts | 2 +- .../components/strongs-modal/strongs-modal.ts | 3 +- .../src/components/strongs/strongs.ts | 30 +- .../src/components/words/words.ts | 2 +- DynamicBibleIonic/src/pages/search/search.ts | 267 +++++++++--------- 5 files changed, 169 insertions(+), 135 deletions(-) diff --git a/DynamicBibleIonic/src/components/passage/passage.ts b/DynamicBibleIonic/src/components/passage/passage.ts index 34a52a16..79a32c55 100644 --- a/DynamicBibleIonic/src/components/passage/passage.ts +++ b/DynamicBibleIonic/src/components/passage/passage.ts @@ -40,7 +40,7 @@ export class Passage implements OnInit openStrongs(strongs: string) { - this.onItemClicked.emit({ card: this.cardItem, qry: this.cardItem.dict + strongs }); + this.onItemClicked.emit({ card: this.cardItem, qry: this.cardItem.dict + strongs, from_search_bar: false }); } openMenu(strongs: string) diff --git a/DynamicBibleIonic/src/components/strongs-modal/strongs-modal.ts b/DynamicBibleIonic/src/components/strongs-modal/strongs-modal.ts index 63115c93..7979b16b 100644 --- a/DynamicBibleIonic/src/components/strongs-modal/strongs-modal.ts +++ b/DynamicBibleIonic/src/components/strongs-modal/strongs-modal.ts @@ -5,7 +5,8 @@ import { StrongsResult, StrongsService } from '../../services/strongs-service'; @Component({ selector: "strongs-modal", - templateUrl: "strongs-modal.html" + templateUrl: "strongs-modal.html", + providers: [StrongsService] }) export class StrongsModal implements OnInit { diff --git a/DynamicBibleIonic/src/components/strongs/strongs.ts b/DynamicBibleIonic/src/components/strongs/strongs.ts index 6e19572f..8465f795 100644 --- a/DynamicBibleIonic/src/components/strongs/strongs.ts +++ b/DynamicBibleIonic/src/components/strongs/strongs.ts @@ -1,4 +1,4 @@ -import { EventEmitter, Component, Input, Output, OnInit } from "@angular/core"; +import { HostListener, EventEmitter, Component, Input, Output, OnInit, AfterViewChecked } from "@angular/core"; import { Reference } from '../../libs/Reference'; import { OpenData, CardItem } from "../../pages/search/search"; import { StrongsResult, StrongsService } from '../../services/strongs-service'; @@ -8,7 +8,7 @@ import { StrongsResult, StrongsService } from '../../services/strongs-service'; templateUrl: "strongs.html", providers: [StrongsService] }) -export class Strongs implements OnInit +export class Strongs implements AfterViewChecked, OnInit { @Output() onClose = new EventEmitter(); @@ -25,12 +25,30 @@ export class Strongs implements OnInit { } + @HostListener('window:resize', ['$event']) + onResize(evt) + { + $("strongs ion-scroll").each((i, el) => + { + let len = $(el).find(".scroll-content .scroll-zoom-wrapper dl span").length; + len += $(el).find(".scroll-content .scroll-zoom-wrapper dl dd").length; + + if (len < 20) + $(el).css("height", Math.ceil(len / 3) * 30 + 30); + }); + } + + ngAfterViewChecked(): void + { + this.onResize(null); + } + ngOnInit(): void { this.strongsService.getResultAsPromise(parseInt(this.cardItem.qry), this.cardItem.dict) - .then(data => + .then(data => this.data = data - ); + ); } close() @@ -40,7 +58,7 @@ export class Strongs implements OnInit openItem(p: string) { - this.onItemClicked.emit({ card: this.cardItem, qry: p }); + this.onItemClicked.emit({ card: this.cardItem, qry: p, from_search_bar: false }); } makePassage(p: string) @@ -51,6 +69,6 @@ export class Strongs implements OnInit openPassage(p: string) { let ref = this.makePassage(p); - this.onItemClicked.emit({ card: this.cardItem, qry: ref }); + this.onItemClicked.emit({ card: this.cardItem, qry: ref, from_search_bar: false }); } } \ No newline at end of file diff --git a/DynamicBibleIonic/src/components/words/words.ts b/DynamicBibleIonic/src/components/words/words.ts index e3a13426..c502e6bb 100644 --- a/DynamicBibleIonic/src/components/words/words.ts +++ b/DynamicBibleIonic/src/components/words/words.ts @@ -103,6 +103,6 @@ export class Words implements AfterViewChecked, OnInit openPassage(p: string) { let ref = this.makePassage(p); - this.onItemClicked.emit({ card: this.cardItem, qry: ref }); + this.onItemClicked.emit({ card: this.cardItem, qry: ref, from_search_bar: false }); } } \ No newline at end of file diff --git a/DynamicBibleIonic/src/pages/search/search.ts b/DynamicBibleIonic/src/pages/search/search.ts index a26a4a89..370eafd8 100644 --- a/DynamicBibleIonic/src/pages/search/search.ts +++ b/DynamicBibleIonic/src/pages/search/search.ts @@ -42,77 +42,23 @@ export class SearchPage implements OnInit if (profile !== null) t = JSON.parse(profile); - this.userProfile.update(t, this.local); + this.loader = this.loadingCtrl.create({ content: 'Loading Page...' }); + this.loader.present().then( + () => + { + this.userProfile.update(t, this.local); - this.initializeItems(this.userProfile); + this.initializeItems(this.userProfile); + + this.loader.dismiss(); + }); }).catch(error => { console.log(error); }); } - - actionsMenu() - { - this.menu.open('actions'); - } - - addPage() - { - let alert = this.alertCtrl.create({ - title: 'Save Search as Page', - inputs: [ - { - name: 'title', - placeholder: 'Page Title' - } - ], - buttons: [ - { - text: 'Cancel', - role: 'cancel', - handler: data => - { - console.log('Cancel clicked'); - } - }, - { - text: 'Save', - handler: data => - { - let p = { queries: this.userProfile.user.items.slice(), title: data.title }; - this.userProfile.user.saved_pages.push(p); - this.userProfile.save(this.local); - this.pagesService.addPage(p); - } - } - ] - }); - alert.present(); - } - - updatePage() - { - let page = this.userProfile.user.saved_pages.find( - i => - i.title == this.params.data.title - ); - page.queries = this.userProfile.user.items.slice(); - this.userProfile.save(this.local); - } - initializeItems(u: UserProfile) { - this.userProfile = u; - - // initialize the pages. - this.pagesService.initializePages(u.user.saved_pages); - if (this.params.data.queries !== undefined) - this.userProfile.user.items = this.params.data.queries.slice(); - if (this.params.data.title === undefined) - this.title = "Search"; - else - this.title = this.params.data.title; - // migrate old way of storing card items to the new. let has_migrated = false; for (let i in u.user.items) @@ -153,9 +99,65 @@ export class SearchPage implements OnInit } } } + // initialize the pages. + this.pagesService.initializePages(u.user.saved_pages); + if (this.params.data.queries !== undefined) + this.userProfile.user.items = this.params.data.queries.slice(); + if (this.params.data.title === undefined) + this.title = "Search"; + else + this.title = this.params.data.title; if (has_migrated) - this.userProfile.save(this.local); + this.userProfile.save(this.local); + } + + actionsMenu() + { + this.menu.open('actions'); + } + + addPage() + { + let alert = this.alertCtrl.create({ + title: 'Save Search as Page', + inputs: [ + { + name: 'title', + placeholder: 'Page Title' + } + ], + buttons: [ + { + text: 'Cancel', + role: 'cancel', + handler: data => + { + console.log('Cancel clicked'); + } + }, + { + text: 'Save', + handler: data => + { + let p = { queries: this.userProfile.user.items.slice(), title: data.title }; + this.userProfile.user.saved_pages.push(p); + this.userProfile.save(this.local); + this.pagesService.addPage(p); + } + } + ] + }); + alert.present(); + } + updatePage() + { + let page = this.userProfile.user.saved_pages.find( + i => + i.title == this.params.data.title + ); + page.queries = this.userProfile.user.items.slice(); + this.userProfile.save(this.local); } setQuery(searchbar) @@ -164,16 +166,7 @@ export class SearchPage implements OnInit } getQuery(searchbar) { - this.getItems(this.searchQuery); - } - - removeItem(item) - { - let idx = this.userProfile.user.items.indexOf(item); - this.userProfile.user.items.splice(idx, 1); - - // save the users settings. - this.userProfile.save(this.local); + this.getItems(this.searchQuery, true); } isError(t: string) @@ -193,6 +186,14 @@ export class SearchPage implements OnInit return t === 'Words'; } + removeItem(item) + { + let idx = this.userProfile.user.items.indexOf(item); + this.userProfile.user.items.splice(idx, 1); + + // save the users settings. + this.userProfile.save(this.local); + } addItemToList(item: CardItem) { if (this.userProfile.user.append_to_bottom) @@ -217,83 +218,97 @@ export class SearchPage implements OnInit } this.last = null; } - getItemsNextToCard(data: OpenData) { this.last = data.card; - this.getItems(data.qry); + this.getItems(data.qry, data.from_search_bar); } - getItems(search) + getItemsList(search: string): Promise { - this.loader = this.loadingCtrl.create({ content: 'Looking up query...' }); - this.loader.present().then( - () => + return new Promise((resolve, reject) => + { + let list: CardItem[] = []; + + try { - try + let qs = search.split(';'); + for (let x in qs) { - let qs = search.split(';'); - for (let x in qs) + if (qs.hasOwnProperty(x)) { - if (qs.hasOwnProperty(x)) + let q = qs[x].trim(); + if (q !== '') { - let q = qs[x].trim(); - if (q !== '') + // its a search term. + if (q.search(/[0-9]/i) === -1) + list.push({ qry: q, dict: 'na', type: 'Words' }); + else if (q.search(/(H|G)[0-9]/i) !== -1) { - // its a search term. - if (q.search(/[0-9]/i) === -1) - this.addItemToList({ qry: q, dict: 'na', type: 'Words' }); - else if (q.search(/(H|G)[0-9]/i) !== -1) - { - // its a strongs lookup - let dict = q.substring(0, 1); + // its a strongs lookup + let dict = q.substring(0, 1); - if (dict.search(/h/i) !== -1) - dict = 'heb'; - else - dict = 'grk'; - - q = q.substring(1, q.length); - if (this.userProfile.user.strongs_modal) - { - let modal = this.modalCtrl.create(StrongsModal, { sn: parseInt(q), dict: dict, onItemClicked: this }); - modal.present(); - } - else - this.addItemToList({ qry: q, dict: dict, type: 'Strongs' }); - } + if (dict.search(/h/i) !== -1) + dict = 'heb'; else + dict = 'grk'; + + q = q.substring(1, q.length); + list.push({ qry: q, dict: dict, type: 'Strongs' }); + } + else + { + // its a verse reference. + if (q.trim() !== '') { - // its a verse reference. - if (q.trim() !== '') - { - let myref = new Reference(q.trim()); - this.addItemToList({ qry: myref.toString(), dict: myref.Section.start.book > 39 ? 'G' : 'H', type: 'Passage' }); - } + let myref = new Reference(q.trim()); + list.push({ qry: myref.toString(), dict: myref.Section.start.book > 39 ? 'G' : 'H', type: 'Passage' }); } } } } - if (this.userProfile.user.clear_search_after_query) - $('.searchbar-input').val(''); + } + if (this.userProfile.user.clear_search_after_query) + $('.searchbar-input').val(''); - this.userProfile.save(this.local); - } - catch (error) - { - this.addItemToList({ qry: error, type: 'Error', dict: 'na' }); - console.log(error); - } - finally + this.userProfile.save(this.local); + } + catch (error) + { + list.push({ qry: error, type: 'Error', dict: 'na' }); + console.log(error); + } + + resolve(list); + }); + } + + getItems(search: string, from_search_bar: boolean) + { + this.getItemsList(search).then(lst => + { + this.loader = this.loadingCtrl.create({ content: 'Looking up Query...' }); + this.loader.present().then( + () => { + for (let item of lst) + { + if (item.type == "Strongs" && this.userProfile.user.strongs_modal && !from_search_bar) + { + let modal = this.modalCtrl.create(StrongsModal, { sn: parseInt(item.qry), dict: item.dict, onItemClicked: this }); + modal.present(); + } + else + this.addItemToList(item); + } this.loader.dismiss(); } - } - ); + ); + }); } } -export type OpenData = { card: CardItem, qry: string } +export type OpenData = { card: CardItem, qry: string, from_search_bar: boolean } export type CardItem = { qry: string, type: string, dict: string }