mirror of https://github.com/wekan/wekan
The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
5.7 KiB
201 lines
5.7 KiB
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();
|
|
},
|
|
},
|
|
];
|
|
}
|
|
}
|
|
|