function doQuery()

in ui-modules/utils/logbook/logbook.js [210:302]


        function doQuery() {

            if ($scope.autoRefresh && queryParametersChanged > 1) {
                queryParametersChanged = 1;
                displayInProgress();
                return; // User is still editing query parameters.
            }

            if (!vm.isValidNumber()) {
                console.error('number of items is invalid', $scope.search.numberOfItems)
                return;
            }

            let isNewQueryParameters = queryParametersChanged > 0; // new parameters!
            queryParametersChanged = 0; // reset the count.

            // Take into account timezone offset of the browser.
            let dateTimeFrom = getUtcTimestamp($scope.search.dateTimeFrom);
            let dateTimeTo = getUtcTimestamp($scope.search.dateTimeTo)
            if (isTail() && !isNewQueryParameters && !isEmpty($scope.logEntries)) {
                dateTimeFrom = getLogEntryTimestamp($scope.logEntries.slice(-1)[0])
            }

            const levels = getCheckedBoxes($scope.search.logLevels);

            const params = {
                levels: levels,
                tail: $scope.search.latest,
                recursive: $scope.search.recursive,
                searchPhrase: $scope.search.phrase,
                taskId: $scope.taskId,
                entityId: $scope.entityId,
                numberOfItems: $scope.search.numberOfItems,
                dateTimeFrom: dateTimeFrom,
                dateTimeTo: dateTimeTo,
            }

            logbookApi.logbookQuery(params, true).then((newLogEntries) => {

                if (isNewQueryParameters) {

                    // New query.

                    // Re-draw all entries.
                    $scope.logEntries = newLogEntries;

                } else if (!isEmpty(newLogEntries) && !isEmpty($scope.logEntries) && isTail() && $scope.autoRefresh) {

                    // Tail query.

                    // Use line IDs to resolve the overlap, if any.
                    let lastLogEntryDisplayed = $scope.logEntries[$scope.logEntries.length - 1];
                    let indexOfLogEntryInTheNewBatch = newLogEntries.findIndex(({lineId}) => lineId === lastLogEntryDisplayed.lineId);
                    if (indexOfLogEntryInTheNewBatch >= 0) {

                        // Append new log entries without overlap.
                        $scope.logEntries = $scope.logEntries.concat(newLogEntries.slice(indexOfLogEntryInTheNewBatch + 1));


                    } else {

                        // Append all new log entries, there is no overlap.
                        $scope.logEntries = $scope.logEntries.concat(newLogEntries)

                    }

                    // Display not more of lines than was requested.
                    $scope.logEntries.slice(-$scope.search.numberOfItems);

                }

                // Auto-scroll.
                if (!isEmpty($scope.logEntries.length)) {
                    if ($scope.isAutoScrollDown) {
                        scrollToMostRecentLogEntry();
                    } else if (datetimeToScrollTo && datetimeToScrollTo >= getLogEntryTimestamp($scope.logEntries[0])) {
                        scrollToLogEntryWithDateTime(datetimeToScrollTo);
                    }
                }

                // Display 'No results' if user stopped editing search parameters, it can be the case that previous query
                // result was empty when the user resumed editing of search parameters.
                if (isEmpty($scope.logEntries) && queryParametersChanged === 0) {
                    $scope.logtext = 'No results.';
                }

            }, (error) => {
                $scope.logtext = 'Error getting the logs: \n' + error.error.message;
                console.log(JSON.stringify(error));
            }).finally(() => {
                $scope.waitingResponse = false;
            });
        }