123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- import { ReactiveCache } from '/imports/reactiveCache';
- import { TAPi18n } from '/imports/i18n';
- import Cards from '../../models/cards';
- import SessionData from '../../models/usersessiondata';
- import {QueryDebug} from "../../config/query-classes";
- import {OPERATOR_DEBUG} from "../../config/search-const";
- export class CardSearchPagedComponent extends BlazeComponent {
- onCreated() {
- this.searching = new ReactiveVar(false);
- this.hasResults = new ReactiveVar(false);
- this.hasQueryErrors = new ReactiveVar(false);
- this.query = new ReactiveVar('');
- this.resultsHeading = new ReactiveVar('');
- this.searchLink = new ReactiveVar(null);
- this.results = new ReactiveVar([]);
- this.hasNextPage = new ReactiveVar(false);
- this.hasPreviousPage = new ReactiveVar(false);
- this.resultsCount = 0;
- this.totalHits = 0;
- this.queryErrors = null;
- this.resultsPerPage = 25;
- this.sessionId = SessionData.getSessionId();
- this.subscriptionHandle = null;
- this.serverError = new ReactiveVar(false);
- this.sessionData = null;
- this.debug = new ReactiveVar(new QueryDebug());
- const that = this;
- this.subscriptionCallbacks = {
- onReady() {
- that.getResults();
- that.searching.set(false);
- that.hasResults.set(true);
- that.serverError.set(false);
- },
- onError(error) {
- that.searching.set(false);
- that.hasResults.set(false);
- that.serverError.set(true);
- // eslint-disable-next-line no-console
- //console.log('Error.reason:', error.reason);
- // eslint-disable-next-line no-console
- //console.log('Error.message:', error.message);
- // eslint-disable-next-line no-console
- //console.log('Error.stack:', error.stack);
- },
- };
- }
- resetSearch() {
- this.searching.set(false);
- this.results.set([]);
- this.hasResults.set(false);
- this.hasQueryErrors.set(false);
- this.resultsHeading.set('');
- this.serverError.set(false);
- this.resultsCount = 0;
- this.totalHits = 0;
- this.queryErrors = null;
- this.debug.set(new QueryDebug());
- }
- getSessionData(sessionId) {
- return ReactiveCache.getSessionData({
- sessionId: sessionId || SessionData.getSessionId(),
- });
- }
- getResults() {
- // eslint-disable-next-line no-console
- // console.log('getting results');
- this.sessionData = this.getSessionData();
- // eslint-disable-next-line no-console
- console.log('session data:', this.sessionData);
- const cards = [];
- this.sessionData.cards.forEach(cardId => {
- cards.push(ReactiveCache.getCard(cardId));
- });
- this.queryErrors = this.sessionData.errors;
- if (this.queryErrors.length) {
- // console.log('queryErrors:', this.queryErrorMessages());
- this.hasQueryErrors.set(true);
- // return null;
- }
- this.debug.set(new QueryDebug(this.sessionData.debug));
- console.log('debug:', this.debug.get().get());
- console.log('debug.show():', this.debug.get().show());
- console.log('debug.showSelector():', this.debug.get().showSelector());
- if (cards) {
- this.totalHits = this.sessionData.totalHits;
- this.resultsCount = cards.length;
- this.resultsStart = this.sessionData.lastHit - this.resultsCount + 1;
- this.resultsEnd = this.sessionData.lastHit;
- this.resultsHeading.set(this.getResultsHeading());
- this.results.set(cards);
- this.hasNextPage.set(this.sessionData.lastHit < this.sessionData.totalHits);
- this.hasPreviousPage.set(
- this.sessionData.lastHit - this.sessionData.resultsCount > 0,
- );
- return cards;
- }
- this.resultsCount = 0;
- return null;
- }
- stopSubscription() {
- if (this.subscriptionHandle) {
- this.subscriptionHandle.stop();
- }
- }
- getSubscription(queryParams) {
- return Meteor.subscribe(
- 'globalSearch',
- this.sessionId,
- queryParams.params,
- queryParams.text,
- this.subscriptionCallbacks,
- );
- }
- runGlobalSearch(queryParams) {
- this.searching.set(true);
- this.debug.set(new QueryDebug());
- this.stopSubscription();
- this.subscriptionHandle = this.getSubscription(queryParams);
- }
- queryErrorMessages() {
- const messages = [];
- this.queryErrors.forEach(err => {
- let value = err.color ? TAPi18n.__(`color-${err.value}`) : err.value;
- if (!value) {
- value = err.value;
- }
- messages.push(TAPi18n.__(err.tag, value));
- });
- return messages;
- }
- nextPage() {
- this.searching.set(true);
- this.stopSubscription();
- this.subscriptionHandle = Meteor.subscribe(
- 'nextPage',
- this.sessionId,
- this.subscriptionCallbacks,
- );
- }
- previousPage() {
- this.searching.set(true);
- this.stopSubscription();
- this.subscriptionHandle = Meteor.subscribe(
- 'previousPage',
- this.sessionId,
- this.subscriptionCallbacks,
- );
- }
- getResultsHeading() {
- if (this.resultsCount === 0) {
- return TAPi18n.__('no-cards-found');
- } else if (this.resultsCount === 1) {
- return TAPi18n.__('one-card-found');
- } else if (this.resultsCount === this.totalHits) {
- return TAPi18n.__('n-cards-found', {sprintf: [this.resultsCount]});
- }
- return TAPi18n.__('n-n-of-n-cards-found', {
- start: this.resultsStart,
- end: this.resultsEnd,
- total: this.totalHits,
- });
- }
- getSearchHref() {
- const baseUrl = window.location.href.replace(/([?#].*$|\s*$)/, '');
- return `${baseUrl}?q=${encodeURIComponent(this.query.get())}`;
- }
- events() {
- return [
- {
- 'click .js-next-page'(evt) {
- evt.preventDefault();
- this.nextPage();
- },
- 'click .js-previous-page'(evt) {
- evt.preventDefault();
- this.previousPage();
- },
- },
- ];
- }
- }
|