chromium/tools/android/dependency_analysis/js/src/vue_components/graph_display_panel.vue

<!-- Copyright 2020 The Chromium Authors
     Use of this source code is governed by a BSD-style license that can be
     found in the LICENSE file. -->

<template>
  <div id="display-panel">
    <div id="preset-container">
      <MdField id="preset-select-container">
        <label for="preset-select">Display Preset</label>
        <MdSelect
            id="preset-select"
            v-model="internalDisplaySettingsPreset"
            @md-selected="applySelectedPreset">
          <MdOption
              v-for="presetName in DisplaySettingsPreset"
              :key="presetName"
              :value="presetName">
            {{ presetName }}
          </MdOption>
        </MdSelect>
      </MdField>
      <MdButton
          class="md-primary md-raised md-dense"
          @click="settingsExpanded = !settingsExpanded">
        {{ settingsExpanded ? 'Hide' : 'Show' }} Advanced
      </MdButton>
    </div>
    <div
        v-if="settingsExpanded"
        id="advanced-panel">
      <slot/>
    </div>
  </div>
</template>

<script>
import {DisplaySettingsPreset} from '../display_settings_data.js';

// @vue/component
const GraphDisplaySettings = {
  props: {
    displaySettingsData: Object,
    displaySettingsPreset: String,
  },
  data: function() {
    return {
      settingsExpanded: false,
    };
  },
  computed: {
    DisplaySettingsPreset: () => DisplaySettingsPreset,
    internalDisplaySettingsPreset: {
      get: function() {
        return this.displaySettingsPreset;
      },
      set: function(newValue) {
        this.$emit('update:displaySettingsPreset', newValue);
      },
    },
  },
  methods: {
    applySelectedPreset() {
      // nextTick is needed here since we need to wait for the parent/child data
      // sync on `displaySettingsPreset` to finish.
      this.$nextTick(() => this.displaySettingsData.applyPreset(
          this.internalDisplaySettingsPreset));
    },
  },
};

export default GraphDisplaySettings;
</script>

<style scoped>
#preset-container {
  align-items: baseline;
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}

#preset-select-container {
  margin-bottom: 0;
  width: 60%;
}

#advanced-panel {
  margin: 0 20px;
}

#display-panel {
  display: flex;
  flex-direction: column;
  margin-bottom: 10px;
}
</style>