|
@@ -29,21 +29,86 @@ export class CardSearchPagedComponent extends BlazeComponent {
|
|
const that = this;
|
|
const that = this;
|
|
this.subscriptionCallbacks = {
|
|
this.subscriptionCallbacks = {
|
|
onReady() {
|
|
onReady() {
|
|
- that.getResults();
|
|
|
|
- that.searching.set(false);
|
|
|
|
- that.hasResults.set(true);
|
|
|
|
- that.serverError.set(false);
|
|
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Subscription ready, getting results...');
|
|
|
|
+ console.log('Subscription ready - sessionId:', that.sessionId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Wait for session data to be available (with timeout)
|
|
|
|
+ let waitCount = 0;
|
|
|
|
+ const maxWaitCount = 50; // 10 seconds max wait
|
|
|
|
+
|
|
|
|
+ const waitForSessionData = () => {
|
|
|
|
+ waitCount++;
|
|
|
|
+ const sessionData = that.getSessionData();
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('waitForSessionData - attempt', waitCount, 'session data:', sessionData);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (sessionData) {
|
|
|
|
+ const results = that.getResults();
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Search results count:', results ? results.length : 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // If no results and this is a due cards search, try to retry
|
|
|
|
+ if ((!results || results.length === 0) && that.searchRetryCount !== undefined && that.searchRetryCount < that.maxRetries) {
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('No results found, retrying search...');
|
|
|
|
+ }
|
|
|
|
+ that.searchRetryCount++;
|
|
|
|
+ Meteor.setTimeout(() => {
|
|
|
|
+ if (that.performSearch) {
|
|
|
|
+ that.performSearch();
|
|
|
|
+ }
|
|
|
|
+ }, 500);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ that.searching.set(false);
|
|
|
|
+ that.hasResults.set(true);
|
|
|
|
+ that.serverError.set(false);
|
|
|
|
+ } else if (waitCount < maxWaitCount) {
|
|
|
|
+ // Session data not available yet, wait a bit more
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Session data not available yet, waiting... (attempt', waitCount, 'of', maxWaitCount, ')');
|
|
|
|
+ }
|
|
|
|
+ Meteor.setTimeout(waitForSessionData, 200);
|
|
|
|
+ } else {
|
|
|
|
+ // Timeout reached, try fallback search
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Timeout reached waiting for session data, trying fallback search');
|
|
|
|
+ }
|
|
|
|
+ const results = that.getResults();
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Fallback search results count:', results ? results.length : 0);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (results && results.length > 0) {
|
|
|
|
+ that.searching.set(false);
|
|
|
|
+ that.hasResults.set(true);
|
|
|
|
+ that.serverError.set(false);
|
|
|
|
+ } else {
|
|
|
|
+ that.searching.set(false);
|
|
|
|
+ that.hasResults.set(false);
|
|
|
|
+ that.serverError.set(true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // Start waiting for session data
|
|
|
|
+ Meteor.setTimeout(waitForSessionData, 100);
|
|
},
|
|
},
|
|
onError(error) {
|
|
onError(error) {
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Subscription error:', error);
|
|
|
|
+ console.log('Error.reason:', error.reason);
|
|
|
|
+ console.log('Error.message:', error.message);
|
|
|
|
+ console.log('Error.stack:', error.stack);
|
|
|
|
+ }
|
|
that.searching.set(false);
|
|
that.searching.set(false);
|
|
that.hasResults.set(false);
|
|
that.hasResults.set(false);
|
|
that.serverError.set(true);
|
|
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);
|
|
|
|
},
|
|
},
|
|
};
|
|
};
|
|
}
|
|
}
|
|
@@ -62,9 +127,28 @@ export class CardSearchPagedComponent extends BlazeComponent {
|
|
}
|
|
}
|
|
|
|
|
|
getSessionData(sessionId) {
|
|
getSessionData(sessionId) {
|
|
- return ReactiveCache.getSessionData({
|
|
|
|
- sessionId: sessionId || SessionData.getSessionId(),
|
|
|
|
|
|
+ const sessionIdToUse = sessionId || SessionData.getSessionId();
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getSessionData - looking for sessionId:', sessionIdToUse);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Try using the raw SessionData collection instead of ReactiveCache
|
|
|
|
+ const sessionData = SessionData.findOne({
|
|
|
|
+ sessionId: sessionIdToUse,
|
|
});
|
|
});
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getSessionData - found session data (raw):', sessionData);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Also try ReactiveCache for comparison
|
|
|
|
+ const reactiveSessionData = ReactiveCache.getSessionData({
|
|
|
|
+ sessionId: sessionIdToUse,
|
|
|
|
+ });
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getSessionData - found session data (reactive):', reactiveSessionData);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return sessionData || reactiveSessionData;
|
|
}
|
|
}
|
|
|
|
|
|
getResults() {
|
|
getResults() {
|
|
@@ -72,33 +156,85 @@ export class CardSearchPagedComponent extends BlazeComponent {
|
|
// console.log('getting results');
|
|
// console.log('getting results');
|
|
this.sessionData = this.getSessionData();
|
|
this.sessionData = this.getSessionData();
|
|
// eslint-disable-next-line no-console
|
|
// eslint-disable-next-line no-console
|
|
- console.log('session data:', this.sessionData);
|
|
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getResults - sessionId:', this.sessionId);
|
|
|
|
+ console.log('getResults - session data:', this.sessionData);
|
|
|
|
+ }
|
|
const cards = [];
|
|
const cards = [];
|
|
- this.sessionData.cards.forEach(cardId => {
|
|
|
|
- cards.push(ReactiveCache.getCard(cardId));
|
|
|
|
- });
|
|
|
|
- this.queryErrors = this.sessionData.errors;
|
|
|
|
|
|
+
|
|
|
|
+ if (this.sessionData && this.sessionData.cards) {
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getResults - cards array length:', this.sessionData.cards.length);
|
|
|
|
+ }
|
|
|
|
+ this.sessionData.cards.forEach(cardId => {
|
|
|
|
+ const card = ReactiveCache.getCard(cardId);
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getResults - card:', cardId, card);
|
|
|
|
+ }
|
|
|
|
+ cards.push(card);
|
|
|
|
+ });
|
|
|
|
+ this.queryErrors = this.sessionData.errors || [];
|
|
|
|
+ } else {
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getResults - no sessionData or no cards array, trying direct card search');
|
|
|
|
+ }
|
|
|
|
+ // Fallback: try to get cards directly from the client-side collection
|
|
|
|
+ const selector = {
|
|
|
|
+ type: 'cardType-card',
|
|
|
|
+ dueAt: { $exists: true, $nin: [null, ''] }
|
|
|
|
+ };
|
|
|
|
+ const allCards = Cards.find(selector).fetch();
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getResults - direct card search found:', allCards ? allCards.length : 0, 'cards');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (allCards && allCards.length > 0) {
|
|
|
|
+ allCards.forEach(card => {
|
|
|
|
+ if (card && card._id) {
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('getResults - direct card:', card._id, card.title);
|
|
|
|
+ }
|
|
|
|
+ cards.push(card);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.queryErrors = [];
|
|
|
|
+ }
|
|
if (this.queryErrors.length) {
|
|
if (this.queryErrors.length) {
|
|
// console.log('queryErrors:', this.queryErrorMessages());
|
|
// console.log('queryErrors:', this.queryErrorMessages());
|
|
this.hasQueryErrors.set(true);
|
|
this.hasQueryErrors.set(true);
|
|
// return null;
|
|
// 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());
|
|
|
|
|
|
+ this.debug.set(new QueryDebug(this.sessionData ? this.sessionData.debug : null));
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ 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) {
|
|
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,
|
|
|
|
- );
|
|
|
|
|
|
+ if (this.sessionData) {
|
|
|
|
+ this.totalHits = this.sessionData.totalHits || 0;
|
|
|
|
+ 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,
|
|
|
|
+ );
|
|
|
|
+ } else {
|
|
|
|
+ this.totalHits = cards.length;
|
|
|
|
+ this.resultsCount = cards.length;
|
|
|
|
+ this.resultsStart = 1;
|
|
|
|
+ this.resultsEnd = cards.length;
|
|
|
|
+ this.resultsHeading.set(this.getResultsHeading());
|
|
|
|
+ this.results.set(cards);
|
|
|
|
+ this.hasNextPage.set(false);
|
|
|
|
+ this.hasPreviousPage.set(false);
|
|
|
|
+ }
|
|
return cards;
|
|
return cards;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -113,13 +249,29 @@ export class CardSearchPagedComponent extends BlazeComponent {
|
|
}
|
|
}
|
|
|
|
|
|
getSubscription(queryParams) {
|
|
getSubscription(queryParams) {
|
|
- return Meteor.subscribe(
|
|
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Subscribing to globalSearch with:', {
|
|
|
|
+ sessionId: this.sessionId,
|
|
|
|
+ params: queryParams.params,
|
|
|
|
+ text: queryParams.text
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Subscribe to both globalSearch and sessionData
|
|
|
|
+ const globalSearchHandle = Meteor.subscribe(
|
|
'globalSearch',
|
|
'globalSearch',
|
|
this.sessionId,
|
|
this.sessionId,
|
|
queryParams.params,
|
|
queryParams.params,
|
|
queryParams.text,
|
|
queryParams.text,
|
|
this.subscriptionCallbacks,
|
|
this.subscriptionCallbacks,
|
|
);
|
|
);
|
|
|
|
+
|
|
|
|
+ const sessionDataHandle = Meteor.subscribe('sessionData', this.sessionId);
|
|
|
|
+ if (process.env.DEBUG === 'true') {
|
|
|
|
+ console.log('Subscribed to sessionData with sessionId:', this.sessionId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return globalSearchHandle;
|
|
}
|
|
}
|
|
|
|
|
|
runGlobalSearch(queryParams) {
|
|
runGlobalSearch(queryParams) {
|