Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: chrome/browser/resources/history/history.js

Issue 11886104: History: Add range navigation control for grouped visits (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 <include src="../uber/uber_utils.js"> 5 <include src="../uber/uber_utils.js">
6 6
7 /////////////////////////////////////////////////////////////////////////////// 7 ///////////////////////////////////////////////////////////////////////////////
8 // Globals: 8 // Globals:
9 /** @const */ var RESULTS_PER_PAGE = 150; 9 /** @const */ var RESULTS_PER_PAGE = 150;
10 10
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 }; 350 };
351 351
352 /** 352 /**
353 * Reload our model with the current parameters. 353 * Reload our model with the current parameters.
354 */ 354 */
355 HistoryModel.prototype.reload = function() { 355 HistoryModel.prototype.reload = function() {
356 // Save user-visible state, clear the model, and restore the state. 356 // Save user-visible state, clear the model, and restore the state.
357 var search = this.searchText_; 357 var search = this.searchText_;
358 var page = this.requestedPage_; 358 var page = this.requestedPage_;
359 var range = this.rangeInDays_; 359 var range = this.rangeInDays_;
360 var offset = this.offset_;
360 var groupByDomain = this.groupByDomain_; 361 var groupByDomain = this.groupByDomain_;
361 362
362 this.clearModel_(); 363 this.clearModel_();
363 this.searchText_ = search; 364 this.searchText_ = search;
364 this.requestedPage_ = page; 365 this.requestedPage_ = page;
365 this.rangeInDays_ = range; 366 this.rangeInDays_ = range;
367 this.offset_ = offset;
366 this.groupByDomain_ = groupByDomain; 368 this.groupByDomain_ = groupByDomain;
367 this.queryHistory_(); 369 this.queryHistory_();
368 }; 370 };
369 371
370 /** 372 /**
371 * @return {string} The current search text. 373 * @return {string} The current search text.
372 */ 374 */
373 HistoryModel.prototype.getSearchText = function() { 375 HistoryModel.prototype.getSearchText = function() {
374 return this.searchText_; 376 return this.searchText_;
375 }; 377 };
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 }; 468 };
467 469
468 /** 470 /**
469 * Sets the range in days when using grouped results and updates the results. 471 * Sets the range in days when using grouped results and updates the results.
470 * @param {HistoryModel.Range} days The range to set. 472 * @param {HistoryModel.Range} days The range to set.
471 */ 473 */
472 HistoryModel.prototype.setRangeInDays = function(days) { 474 HistoryModel.prototype.setRangeInDays = function(days) {
473 this.rangeInDays_ = days; 475 this.rangeInDays_ = days;
474 }; 476 };
475 477
478 /**
479 * Returns the current offset. The offset moves the current query 'window'
480 * |range| days behind. As such for range set to WEEK an offset of 0 refers to
481 * the last 7 days, an offset of 1 refers to the 7 day period that ended 7 days
482 * ago, etc. For MONTH an offset of 0 refers to the current calendar month,
483 * 1 to the previous one, etc.
484 * @return {number} The current offset.
485 */
486 HistoryModel.prototype.getOffset = function() {
Bernhard Bauer 2013/01/18 16:08:27 Use get/set accessors?
Sergiu 2013/01/21 14:05:24 Done.
487 return this.offset_;
488 };
489
490 /**
491 * Sets the offset.
492 * @param {Number} value Either the new value or the relative change.
493 */
494 HistoryModel.prototype.setOffset = function(value) {
495 this.offset_ = value;
496 };
497
476 // HistoryModel, Private: ----------------------------------------------------- 498 // HistoryModel, Private: -----------------------------------------------------
477 499
478 /** 500 /**
479 * Clear the history model. 501 * Clear the history model.
480 * @private 502 * @private
481 */ 503 */
482 HistoryModel.prototype.clearModel_ = function() { 504 HistoryModel.prototype.clearModel_ = function() {
483 this.inFlight_ = false; // Whether a query is inflight. 505 this.inFlight_ = false; // Whether a query is inflight.
484 this.searchText_ = ''; 506 this.searchText_ = '';
485 // Flag to show that the results are grouped by domain or not. 507 // Flag to show that the results are grouped by domain or not.
486 this.groupByDomain_ = false; 508 this.groupByDomain_ = false;
487 509
488 this.visits_ = []; // Date-sorted list of visits (most recent first). 510 this.visits_ = []; // Date-sorted list of visits (most recent first).
489 this.last_id_ = 0; 511 this.last_id_ = 0;
490 selectionAnchor = -1; 512 selectionAnchor = -1;
491 513
492 // The page that the view wants to see - we only fetch slightly past this 514 // The page that the view wants to see - we only fetch slightly past this
493 // point. If the view requests a page that we don't have data for, we try 515 // point. If the view requests a page that we don't have data for, we try
494 // to fetch it and call back when we're done. 516 // to fetch it and call back when we're done.
495 this.requestedPage_ = 0; 517 this.requestedPage_ = 0;
496 518
519 // Skip |offset_| * weeks/months from the begining.
520 this.offset_ = 0;
521
497 // The range of history to view or search over, WEEK by default. 522 // The range of history to view or search over, WEEK by default.
498 this.rangeInDays_ = HistoryModel.Range.WEEK; 523 this.rangeInDays_ = HistoryModel.Range.WEEK;
499 524
500 // Keeps track of whether or not there are more results available than are 525 // Keeps track of whether or not there are more results available than are
501 // currently held in |this.visits_|. 526 // currently held in |this.visits_|.
502 this.isQueryFinished_ = false; 527 this.isQueryFinished_ = false;
503 528
504 // An opaque value that is returned with the query results. This is used to 529 // An opaque value that is returned with the query results. This is used to
505 // fetch the next page of results for a query. 530 // fetch the next page of results for a query.
506 this.queryCursor_ = null; 531 this.queryCursor_ = null;
(...skipping 26 matching lines...) Expand all
533 // Show the result or a message if no results were returned. 558 // Show the result or a message if no results were returned.
534 this.view_.onModelReady(); 559 this.view_.onModelReady();
535 }; 560 };
536 561
537 /** 562 /**
538 * Query for history, either for a search or time-based browsing. 563 * Query for history, either for a search or time-based browsing.
539 * @private 564 * @private
540 */ 565 */
541 HistoryModel.prototype.queryHistory_ = function() { 566 HistoryModel.prototype.queryHistory_ = function() {
542 var endTime = 0; 567 var endTime = 0;
543 // Set the range to the values from the interface. 568 // Set the range and offset to the values from the interface.
569 var offset = this.offset_;
544 var range = this.rangeInDays_; 570 var range = this.rangeInDays_;
545 if (!this.getGroupByDomain()) { 571 if (!this.getGroupByDomain()) {
546 // Do the time-based search. 572 // Do the time-based search.
547 // If there are already some visits, pick up the previous query where it 573 // If there are already some visits, pick up the previous query where it
548 // left off. 574 // left off.
549 if (this.visits_.length > 0) { 575 if (this.visits_.length > 0) {
550 var lastVisit = this.visits_.slice(-1)[0]; 576 var lastVisit = this.visits_.slice(-1)[0];
551 endTime = lastVisit.date.getTime(); 577 endTime = lastVisit.date.getTime();
552 cursor = this.queryCursor_; 578 cursor = this.queryCursor_;
553 } 579 }
554 range = HistoryModel.Range.NOT_GROUPED; 580 range = HistoryModel.Range.NOT_GROUPED;
555 } 581 }
556 $('loading-spinner').hidden = false; 582 $('loading-spinner').hidden = false;
557 this.inFlight_ = true; 583 this.inFlight_ = true;
558 chrome.send('queryHistory', 584 chrome.send('queryHistory',
559 [this.searchText_, range, endTime, this.queryCursor_, 585 [this.searchText_, offset, range, endTime, this.queryCursor_,
560 RESULTS_PER_PAGE]); 586 RESULTS_PER_PAGE]);
561 }; 587 };
562 588
563 /** 589 /**
564 * Check to see if we have data for the given page. 590 * Check to see if we have data for the given page.
565 * @param {number} page The page number. 591 * @param {number} page The page number.
566 * @return {boolean} Whether we have any data for the given page. 592 * @return {boolean} Whether we have any data for the given page.
567 * @private 593 * @private
568 */ 594 */
569 HistoryModel.prototype.haveDataForPage_ = function(page) { 595 HistoryModel.prototype.haveDataForPage_ = function(page) {
570 return (page * RESULTS_PER_PAGE < this.getSize()); 596 return (page * RESULTS_PER_PAGE < this.getSize());
571 }; 597 };
572 598
573 /** 599 /**
574 * Check to see if we have data to fill the given page. 600 * Check to see if we have data to fill the given page.
575 * @param {number} page The page number. 601 * @param {number} page The page number.
576 * @return {boolean} Whether we have data to fill the page. 602 * @return {boolean} Whether we have data to fill the page.
577 * @private 603 * @private
578 */ 604 */
579 HistoryModel.prototype.canFillPage_ = function(page) { 605 HistoryModel.prototype.canFillPage_ = function(page) {
580 return ((page + 1) * RESULTS_PER_PAGE <= this.getSize()); 606 return ((page + 1) * RESULTS_PER_PAGE <= this.getSize());
581 }; 607 };
582 608
583 /** 609 /**
584 * Enables or disables grouping by domain. 610 * Enables or disables grouping by domain.
585 * @param {boolean} groupByDomain New groupByDomain_ value. 611 * @param {boolean} groupByDomain New groupByDomain_ value.
586 */ 612 */
587 HistoryModel.prototype.setGroupByDomain = function(groupByDomain) { 613 HistoryModel.prototype.setGroupByDomain = function(groupByDomain) {
588 this.groupByDomain_ = groupByDomain; 614 this.groupByDomain_ = groupByDomain;
615 this.offset_ = 0;
589 }; 616 };
590 617
591 /** 618 /**
592 * Gets whether we are grouped by domain. 619 * Gets whether we are grouped by domain.
593 * @return {boolean} Whether the results are grouped by domain. 620 * @return {boolean} Whether the results are grouped by domain.
594 */ 621 */
595 HistoryModel.prototype.getGroupByDomain = function() { 622 HistoryModel.prototype.getGroupByDomain = function() {
596 return this.groupByDomain_; 623 return this.groupByDomain_;
597 }; 624 };
598 625
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 }); 663 });
637 664
638 // Add handlers for the range options. 665 // Add handlers for the range options.
639 $('timeframe-filter').addEventListener('change', function(e) { 666 $('timeframe-filter').addEventListener('change', function(e) {
640 self.setRangeInDays(parseInt(e.target.value, 10)); 667 self.setRangeInDays(parseInt(e.target.value, 10));
641 }); 668 });
642 669
643 $('display-filter-sites').addEventListener('click', function(e) { 670 $('display-filter-sites').addEventListener('click', function(e) {
644 self.setGroupByDomain($('display-filter-sites').checked); 671 self.setGroupByDomain($('display-filter-sites').checked);
645 }); 672 });
673
674 $('range-previous').addEventListener('click', function(e) {
675 self.setOffset(self.getOffset() + 1);
676 });
677 $('range-next').addEventListener('click', function(e) {
678 self.setOffset(self.getOffset() - 1);
679 });
680 $('range-today').addEventListener('click', function(e) {
681 self.setOffset(0);
682 });
646 } 683 }
647 684
648 // HistoryView, public: ------------------------------------------------------- 685 // HistoryView, public: -------------------------------------------------------
649 /** 686 /**
650 * Do a search and optionally view a certain page. 687 * Do a search and optionally view a certain page.
651 * @param {string} term The string to search for. 688 * @param {string} term The string to search for.
652 * @param {number} opt_page The page we wish to view, only use this for 689 * @param {number} opt_page The page we wish to view, only use this for
653 * setting up initial views, as this triggers a search. 690 * setting up initial views, as this triggers a search.
654 */ 691 */
655 HistoryView.prototype.setSearch = function(term, opt_page) { 692 HistoryView.prototype.setSearch = function(term, opt_page) {
656 this.pageIndex_ = parseInt(opt_page || 0, 10); 693 this.pageIndex_ = parseInt(opt_page || 0, 10);
657 window.scrollTo(0, 0); 694 window.scrollTo(0, 0);
658 this.model_.setSearchText(term, this.pageIndex_); 695 this.model_.setSearchText(term, this.pageIndex_);
659 pageState.setUIState(term, this.pageIndex_, this.model_.getGroupByDomain(), 696 pageState.setUIState(term, this.pageIndex_, this.model_.getGroupByDomain(),
660 this.getRangeInDays()); 697 this.getRangeInDays(), this.getOffset());
661 }; 698 };
662 699
663 /** 700 /**
664 * Enable or disable results as being grouped by domain. 701 * Enable or disable results as being grouped by domain.
665 * @param {boolean} groupedByDomain Whether to group by domain or not. 702 * @param {boolean} groupedByDomain Whether to group by domain or not.
666 */ 703 */
667 HistoryView.prototype.setGroupByDomain = function(groupedByDomain) { 704 HistoryView.prototype.setGroupByDomain = function(groupedByDomain) {
668 // Group by domain is not currently supported for search results, so reset 705 // Group by domain is not currently supported for search results, so reset
669 // the search term if there was one. 706 // the search term if there was one.
670 this.model_.clearSearchText(); 707 this.model_.clearSearchText();
671 this.model_.setGroupByDomain(groupedByDomain); 708 this.model_.setGroupByDomain(groupedByDomain);
672 $('timeframe-filter').disabled = !groupedByDomain; 709 setRangeButtonsState(groupedByDomain, this);
673 this.model_.reload(); 710 this.model_.reload();
674 pageState.setUIState(this.model_.getSearchText(), 711 pageState.setUIState(this.model_.getSearchText(),
675 this.pageIndex_, 712 this.pageIndex_,
676 this.model_.getGroupByDomain(), 713 this.model_.getGroupByDomain(),
677 this.getRangeInDays()); 714 this.getRangeInDays(),
715 this.getOffset());
678 }; 716 };
679 717
680 /** 718 /**
681 * Reload the current view. 719 * Reload the current view.
682 */ 720 */
683 HistoryView.prototype.reload = function() { 721 HistoryView.prototype.reload = function() {
684 this.model_.reload(); 722 this.model_.reload();
685 this.updateRemoveButton(); 723 this.updateRemoveButton();
686 }; 724 };
687 725
688 /** 726 /**
689 * Switch to a specified page. 727 * Switch to a specified page.
690 * @param {number} page The page we wish to view. 728 * @param {number} page The page we wish to view.
691 */ 729 */
692 HistoryView.prototype.setPage = function(page) { 730 HistoryView.prototype.setPage = function(page) {
693 this.clear_(); 731 this.clear_();
694 this.pageIndex_ = parseInt(page, 10); 732 this.pageIndex_ = parseInt(page, 10);
695 window.scrollTo(0, 0); 733 window.scrollTo(0, 0);
696 this.model_.requestPage(page); 734 this.model_.requestPage(page);
697 pageState.setUIState(this.model_.getSearchText(), 735 pageState.setUIState(this.model_.getSearchText(),
698 this.pageIndex_, 736 this.pageIndex_,
699 this.model_.getGroupByDomain(), 737 this.model_.getGroupByDomain(),
700 this.getRangeInDays()); 738 this.getRangeInDays(),
739 this.getOffset());
701 }; 740 };
702 741
703 /** 742 /**
704 * @return {number} The page number being viewed. 743 * @return {number} The page number being viewed.
705 */ 744 */
706 HistoryView.prototype.getPage = function() { 745 HistoryView.prototype.getPage = function() {
707 return this.pageIndex_; 746 return this.pageIndex_;
708 }; 747 };
709 748
710 /** 749 /**
711 * Set the current range for grouped results. 750 * Set the current range for grouped results.
712 * @param {string} range The number of days to which the range should be set. 751 * @param {string} range The number of days to which the range should be set.
713 */ 752 */
714 HistoryView.prototype.setRangeInDays = function(range) { 753 HistoryView.prototype.setRangeInDays = function(range) {
715 window.scrollTo(0, 0); 754 window.scrollTo(0, 0);
716 // Set the range and reset the offset. 755 // Set the range and reset the offset.
756 this.model_.setOffset(0);
717 this.model_.setRangeInDays(range); 757 this.model_.setRangeInDays(range);
718 this.model_.reload(); 758 this.model_.reload();
719 pageState.setUIState(this.model_.getSearchText(), this.pageIndex_, 759 pageState.setUIState(this.model_.getSearchText(), this.pageIndex_,
720 this.model_.getGroupByDomain(), range); 760 this.model_.getGroupByDomain(), range, this.getOffset());
721 }; 761 };
722 762
723 /** 763 /**
724 * Get the current range in days. 764 * Get the current range in days.
725 * @return {number} Current range in days from the model. 765 * @return {number} Current range in days from the model.
726 */ 766 */
727 HistoryView.prototype.getRangeInDays = function() { 767 HistoryView.prototype.getRangeInDays = function() {
728 return this.model_.getRangeInDays(); 768 return this.model_.getRangeInDays();
729 }; 769 };
730 770
731 /** 771 /**
772 * Set the current offset for grouped results.
773 * @param {number} offset Offset to set.
774 */
775 HistoryView.prototype.setOffset = function(offset) {
776 window.scrollTo(0, 0);
777 this.model_.setOffset(offset);
778 this.model_.reload();
779 setRangeButtonsState(true, this);
780 pageState.setUIState(this.model_.getSearchText(),
781 this.pageIndex_,
782 this.model_.getGroupByDomain(),
783 this.getRangeInDays(),
784 this.getOffset());
785 };
786
787 /**
788 * Get the current offset.
789 * @return {number} Current offset from the model.
790 */
791 HistoryView.prototype.getOffset = function() {
792 return this.model_.getOffset();
793 };
794
795 /**
732 * Callback for the history model to let it know that it has data ready for us 796 * Callback for the history model to let it know that it has data ready for us
733 * to view. 797 * to view.
734 */ 798 */
735 HistoryView.prototype.onModelReady = function() { 799 HistoryView.prototype.onModelReady = function() {
736 this.displayResults_(); 800 this.displayResults_();
737 this.updateNavBar_(); 801 this.updateNavBar_();
738 }; 802 };
739 803
740 /** 804 /**
741 * Enables or disables the 'Remove selected items' button as appropriate. 805 * Enables or disables the 'Remove selected items' button as appropriate.
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 var hashData = state_obj.getHashData(); 1116 var hashData = state_obj.getHashData();
1053 if (hashData.q != state_obj.model.getSearchText()) { 1117 if (hashData.q != state_obj.model.getSearchText()) {
1054 state_obj.view.setSearch(hashData.q, parseInt(hashData.p, 10)); 1118 state_obj.view.setSearch(hashData.q, parseInt(hashData.p, 10));
1055 } else if (parseInt(hashData.p, 10) != state_obj.view.getPage()) { 1119 } else if (parseInt(hashData.p, 10) != state_obj.view.getPage()) {
1056 state_obj.view.setPage(hashData.p); 1120 state_obj.view.setPage(hashData.p);
1057 } else if ((hashData.g == 'true') != 1121 } else if ((hashData.g == 'true') !=
1058 state_obj.view.model_.getGroupByDomain()) { 1122 state_obj.view.model_.getGroupByDomain()) {
1059 state_obj.view.setGroupByDomain(hashData.g); 1123 state_obj.view.setGroupByDomain(hashData.g);
1060 } else if (parseInt(hashData.r, 10) != state_obj.model.getRangeInDays()) { 1124 } else if (parseInt(hashData.r, 10) != state_obj.model.getRangeInDays()) {
1061 state_obj.view.setRangeInDays(parseInt(hashData.r, 10)); 1125 state_obj.view.setRangeInDays(parseInt(hashData.r, 10));
1126 } else if (parseInt(hashData.o, 10) != state_obj.model.getOffset()) {
1127 state_obj.view.setOffset(parseInt(hashData.o, 10));
1062 } 1128 }
1063 }), 50, this); 1129 }), 50, this);
1064 } 1130 }
1065 1131
1066 /** 1132 /**
1067 * Holds the singleton instance. 1133 * Holds the singleton instance.
1068 */ 1134 */
1069 PageState.instance = null; 1135 PageState.instance = null;
1070 1136
1071 /** 1137 /**
1072 * @return {Object} An object containing parameters from our window hash. 1138 * @return {Object} An object containing parameters from our window hash.
1073 */ 1139 */
1074 PageState.prototype.getHashData = function() { 1140 PageState.prototype.getHashData = function() {
1075 var result = { 1141 var result = {
1076 e: 0, 1142 e: 0,
1077 q: '', 1143 q: '',
1078 p: 0, 1144 p: 0,
1079 g: false, 1145 g: false,
1080 r: 0 1146 r: 0,
1147 o: 0
1081 }; 1148 };
1082 1149
1083 if (!window.location.hash) 1150 if (!window.location.hash)
1084 return result; 1151 return result;
1085 1152
1086 var hashSplit = window.location.hash.substr(1).split('&'); 1153 var hashSplit = window.location.hash.substr(1).split('&');
1087 for (var i = 0; i < hashSplit.length; i++) { 1154 for (var i = 0; i < hashSplit.length; i++) {
1088 var pair = hashSplit[i].split('='); 1155 var pair = hashSplit[i].split('=');
1089 if (pair.length > 1) { 1156 if (pair.length > 1) {
1090 result[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' ')); 1157 result[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' '));
1091 } 1158 }
1092 } 1159 }
1093 1160
1094 return result; 1161 return result;
1095 }; 1162 };
1096 1163
1097 /** 1164 /**
1098 * Set the hash to a specified state, this will create an entry in the 1165 * Set the hash to a specified state, this will create an entry in the
1099 * session history so the back button cycles through hash states, which 1166 * session history so the back button cycles through hash states, which
1100 * are then picked up by our listener. 1167 * are then picked up by our listener.
1101 * @param {string} term The current search string. 1168 * @param {string} term The current search string.
1102 * @param {number} page The page currently being viewed. 1169 * @param {number} page The page currently being viewed.
1103 * @param {boolean} grouped Whether the results are grouped or not. 1170 * @param {boolean} grouped Whether the results are grouped or not.
1104 * @param {number} range The range in days to view or search over. If 0, use 1171 * @param {number} range The range in days to view or search over. If 0, use
1105 * the entire history. 1172 * the entire history.
1173 * @param {number} offset Set the begining of the query to range * offset days.
1106 */ 1174 */
1107 PageState.prototype.setUIState = function(term, page, grouped, range) { 1175 PageState.prototype.setUIState = function(term, page, grouped, range, offset) {
1108 // Make sure the form looks pretty. 1176 // Make sure the form looks pretty.
1109 $('search-field').value = term; 1177 $('search-field').value = term;
1110 if (grouped) { 1178 if (grouped) {
1111 $('timeframe-filter').value = range; 1179 $('timeframe-filter').value = range;
1112 $('display-filter-sites').checked = true; 1180 $('display-filter-sites').checked = true;
1113 } else { 1181 } else {
1114 $('timeframe-filter').disabled = true; 1182 $('timeframe-filter').disabled = true;
1115 $('display-filter-sites').checked = false; 1183 $('display-filter-sites').checked = false;
1116 } 1184 }
1117 var hash = this.getHashData(); 1185 var hash = this.getHashData();
1118 if (hash.q != term || hash.p != page || hash.g != grouped || 1186 if (hash.q != term || hash.p != page || hash.g != grouped ||
1119 hash.r != range) { 1187 hash.r != range || hash.o != offset) {
1120 window.location.hash = PageState.getHashString( 1188 window.location.hash = PageState.getHashString(
1121 term, page, grouped, range); 1189 term, page, grouped, range, offset);
1122 } 1190 }
1123 }; 1191 };
1124 1192
1125 /** 1193 /**
1126 * Static method to get the hash string for a specified state 1194 * Static method to get the hash string for a specified state
1127 * @param {string} term The current search string. 1195 * @param {string} term The current search string.
1128 * @param {number} page The page currently being viewed. 1196 * @param {number} page The page currently being viewed.
1129 * @param {boolean} grouped Whether the results are grouped or not. 1197 * @param {boolean} grouped Whether the results are grouped or not.
1130 * @param {number} range The range in days to view or search over. 1198 * @param {number} range The range in days to view or search over.
1199 * @param {number} offset Set the begining of the query to range * offset days.
1131 * @return {string} The string to be used in a hash. 1200 * @return {string} The string to be used in a hash.
1132 */ 1201 */
1133 PageState.getHashString = function(term, page, grouped, range) { 1202 PageState.getHashString = function(term, page, grouped, range, offset) {
1134 // Omit elements that are empty. 1203 // Omit elements that are empty.
1135 var newHash = []; 1204 var newHash = [];
1136 1205
1137 if (term) 1206 if (term)
1138 newHash.push('q=' + encodeURIComponent(term)); 1207 newHash.push('q=' + encodeURIComponent(term));
1139 1208
1140 if (page) 1209 if (page)
1141 newHash.push('p=' + page); 1210 newHash.push('p=' + page);
1142 1211
1143 if (range > 0) 1212 if (range > 0)
1144 newHash.push('r=' + range); 1213 newHash.push('r=' + range);
1145 1214
1215 if (offset > 0)
1216 newHash.push('o=' + offset);
1217
1146 if (grouped) 1218 if (grouped)
1147 newHash.push('g=' + grouped); 1219 newHash.push('g=' + grouped);
1148 1220
1149 return newHash.join('&'); 1221 return newHash.join('&');
1150 }; 1222 };
1151 1223
1152 /////////////////////////////////////////////////////////////////////////////// 1224 ///////////////////////////////////////////////////////////////////////////////
1153 // Document Functions: 1225 // Document Functions:
1154 /** 1226 /**
1155 * Window onload handler, sets up the page. 1227 * Window onload handler, sets up the page.
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 removeNode(previousEntry); 1441 removeNode(previousEntry);
1370 } 1442 }
1371 1443
1372 // if both the next and previous entries are gaps, remove one 1444 // if both the next and previous entries are gaps, remove one
1373 if (nextEntry && nextEntry.className == 'gap' && 1445 if (nextEntry && nextEntry.className == 'gap' &&
1374 previousEntry && previousEntry.className == 'gap') { 1446 previousEntry && previousEntry.className == 'gap') {
1375 removeNode(nextEntry); 1447 removeNode(nextEntry);
1376 } 1448 }
1377 } 1449 }
1378 1450
1451 /**
1452 * Enables or disables the time range buttons.
1453 * @param {boolean} groupByDomain Whether grouping by domain is active
1454 * @param {HistoryView} view The current history view.
1455 */
1456 function setRangeButtonsState(groupByDomain, view) {
1457 // The enabled state for the previous, today and next buttons.
1458 var buttonsState = [false, false, false];
1459 var start = 0;
1460 var isQueryFinished = view.model_.isQueryFinished_;
1461 var offset = view.getOffset();
1462
1463 // Set today button.
1464 if (offset != start) {
1465 buttonsState[2] = true;
1466 buttonsState[1] = true;
1467 }
1468
1469 // TODO(sergiu): isQueryFinished does not return the correct value now but
1470 // ideally it would return false when there are no older results available.
1471 // Until then allow to go back in time as much as the user wants.
1472 // See http://crbug.com/167363.
1473 buttonsState[0] = true;
1474
1475 $('range-previous').disabled = !(groupByDomain && buttonsState[0]);
1476 $('range-today').disabled = !(groupByDomain && buttonsState[1]);
1477 $('range-next').disabled = !(groupByDomain && buttonsState[2]);
1478 $('timeframe-filter').disabled = !groupByDomain;
1479 }
1480
1379 /////////////////////////////////////////////////////////////////////////////// 1481 ///////////////////////////////////////////////////////////////////////////////
1380 // Chrome callbacks: 1482 // Chrome callbacks:
1381 1483
1382 /** 1484 /**
1383 * Our history system calls this function with results from searches. 1485 * Our history system calls this function with results from searches.
1384 * @param {Object} info An object containing information about the query. 1486 * @param {Object} info An object containing information about the query.
1385 * @param {Array} results A list of results. 1487 * @param {Array} results A list of results.
1386 */ 1488 */
1387 function historyResult(info, results) { 1489 function historyResult(info, results) {
1388 historyModel.addResults(info, results); 1490 historyModel.addResults(info, results);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1426 historyView.reload(); 1528 historyView.reload();
1427 } 1529 }
1428 1530
1429 // Add handlers to HTML elements. 1531 // Add handlers to HTML elements.
1430 document.addEventListener('DOMContentLoaded', load); 1532 document.addEventListener('DOMContentLoaded', load);
1431 1533
1432 // This event lets us enable and disable menu items before the menu is shown. 1534 // This event lets us enable and disable menu items before the menu is shown.
1433 document.addEventListener('canExecute', function(e) { 1535 document.addEventListener('canExecute', function(e) {
1434 e.canExecute = true; 1536 e.canExecute = true;
1435 }); 1537 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698