map-panel.mjs 2.89 KB
Newer Older
zeynepCankara's avatar
zeynepCankara committed
1 2 3
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4 5
import './map-panel/map-details.mjs';
import './map-panel/map-transitions.mjs';
zeynepCankara's avatar
zeynepCankara committed
6

7 8
import {MapLogEntry} from '../log/map.mjs';

9
import {FocusEvent} from './events.mjs';
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
import {CollapsableElement, DOM} from './helper.mjs';

DOM.defineCustomElement('view/map-panel',
                        (templateText) =>
                            class MapPanel extends CollapsableElement {
  _map;
  _timeline;
  _selectedLogEntries = [];
  _displayedLogEntries = [];

  constructor() {
    super(templateText);
    this.searchBarBtn.addEventListener('click', e => this._handleSearch(e));
    this.showAllRadio.onclick = _ => this._showEntries(this._timeline);
    this.showTimerangeRadio.onclick = _ =>
        this._showEntries(this._timeline.selectionOrSelf);
    this.showSelectionRadio.onclick = _ =>
        this._showEntries(this._selectedLogEntries);
  }

  get showAllRadio() {
    return this.$('#show-all');
  }

  get showTimerangeRadio() {
    return this.$('#show-timerange');
  }

  get showSelectionRadio() {
    return this.$('#show-selection');
  }

  get mapTransitionsPanel() {
    return this.$('#map-transitions');
  }

  get mapDetailsTransitionsPanel() {
    return this.$('#map-details-transitions');
  }

  get mapDetailsPanel() {
    return this.$('#map-details');
  }

  get searchBarBtn() {
    return this.$('#searchBarBtn');
  }

  get searchBar() {
    return this.$('#searchBar');
  }

  set timeline(timeline) {
    console.assert(timeline !== undefined, 'timeline undefined!');
    this._timeline = timeline;
    this.$('.panel').style.display = timeline.isEmpty() ? 'none' : 'inherit';
    this.mapTransitionsPanel.timeline = timeline;
    this.mapDetailsTransitionsPanel.timeline = timeline;
  }

  set selectedLogEntries(entries) {
    if (entries === this._timeline.selection) {
      this.showTimerangeRadio.click();
    } else if (entries == this._timeline) {
      this.showAllRadio.click();
    } else {
      this._selectedLogEntries = entries;
      this.showSelectionRadio.click();
    }
  }

  set map(map) {
    this._map = map;
    this.requestUpdate();
  }

  _showEntries(entries) {
    this._displayedLogEntries = entries;
    this.requestUpdate();
  }

  _update() {
    this.mapDetailsTransitionsPanel.selectedLogEntries = [this._map];
    this.mapDetailsPanel.map = this._map;
    this.mapTransitionsPanel.selectedLogEntries = this._displayedLogEntries;
  }

  _handleSearch(e) {
    const searchBar = this.$('#searchBarInput');
    const searchBarInput = searchBar.value;
    // access the map from model cache
    const selectedMap = MapLogEntry.get(searchBarInput);
    if (selectedMap) {
      searchBar.className = 'success';
      this.dispatchEvent(new FocusEvent(selectedMap));
    } else {
      searchBar.className = 'failure';
    }
  }
});