Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/replay/frontend/src/pages/list-menu/index.vue
1030 views
<template lang="pug">
.ListMenu.Page(:style="cssVars")
  ul
    li(@click="goto(item)" v-for="item of items" :class="{active:item.isActive}")
      Icon(v-if="iconName" :src="icon" :size=18 iconStyle="transform: 'scale(-1,1)'")
      .text {{item.title}}
</template>

<script lang="ts">
import Vue from 'vue';
import Component from 'vue-class-component';
import { ipcRenderer } from 'electron';
import * as icons from '~frontend/constants/icons';
import Icon from '~frontend/components/Icon.vue';
import NoCache from '~frontend/lib/NoCache';
import { OverlayStore } from '~frontend/models/OverlayStore';

@Component({ components: { Icon } })
export default class ListMenu extends Vue {
  private store = new OverlayStore();
  private items: IListItem[] = [];

  private iconName: string;
  private clickEventName: string;

  @NoCache
  get icon() {
    return icons[this.iconName];
  }

  private goto(item) {
    ipcRenderer.send(this.clickEventName ?? `goto-menu-item`, item);
    this.store.hide();
  }

  @NoCache
  private get cssVars() {
    return this.store.cssVars;
  }

  async mounted() {
    ipcRenderer.on(
      'will-show',
      (e, items: IListItem[], iconName: string, clickEventName: string) => {
        console.log('Show List', items, iconName)
        this.items = items;
        this.iconName = iconName;
        this.clickEventName = clickEventName;
      },
    );
  }
}

interface IListItem {
  title: string;
  id: string;
  isActive: boolean;
}
</script>

<style lang="scss">
@import '../../assets/style/overlay-mixins';
@import '../../assets/style/resets';
@include overlayBaseStyle();

.ListMenu {
  @include overlayStyle();
  ul {
    @include reset-ul();
    padding-top: 5px;
    margin: 0;
    box-sizing: border-box;
    display: flex;
    flex-direction: column;

    li {
      display: flex;
      box-sizing: border-box;
      padding-left: 10px;
      padding-right: 10px;
      align-items: center;
      margin: 0;
      flex: 1;
      border-bottom: 1px solid #eee;
      cursor: pointer;

      .text {
        cursor: pointer;
        padding: 5px 0;
        flex: 1;
        margin-left: 5px;
      }
      .Icon {
        cursor: pointer;
        margin-right: 5px;
      }
    }
  }
}
</style>