<!-- Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->

<template>
  <div @click="showSelectSpan" class="log-item">
    <div v-for="(item, index) in columns" :key="index" :class="item.label">
      <span v-if="item.label === 'timestamp'">
        {{ data.timestamp | dateformat }}
      </span>
      <span v-else-if="item.label === 'tags'">
        {{ tags }}
      </span>
      <router-link
        v-else-if="item.label === 'traceId' && !noLink"
        :to="{ name: 'trace', query: { traceid: data[item.label] } }"
      >
        <span>{{ data[item.label] }}</span>
      </router-link>
      <span v-else>{{ data[item.label] }}</span>
    </div>
  </div>
</template>
<script lang="ts">
  import { Component, Prop, Vue } from 'vue-property-decorator';
  import { ServiceLogConstants } from './log-constant';

  @Component
  export default class ServiceItem extends Vue {
    @Prop() private data: any;
    @Prop() private noLink!: any;
    private columns = ServiceLogConstants;
    private get tags() {
      if (!this.data.tags) {
        return '';
      }
      return String(this.data.tags.map((d: any) => `${d.key}=${d.value}`));
    }
    private showSelectSpan() {
      this.$eventBus.$emit('HANDLE-SELECT-LOG', this.data);
    }
  }
</script>
<style lang="scss" scoped>
  .log-item {
    white-space: nowrap;
    position: relative;
    cursor: pointer;
    .traceId {
      width: 390px;
      color: #448dfe;
      cursor: pointer;
      span {
        display: inline-block;
        width: 100%;
        line-height: 30px;
      }
    }
    .content,
    .tags {
      width: 300px;
    }
    .serviceInstanceName,
    .serviceName {
      width: 200px;
    }
  }

  .log-item:hover {
    background: rgba(0, 0, 0, 0.04);
  }

  .log-item > div {
    width: 140px;
    padding: 0 5px;
    display: inline-block;
    border: 1px solid transparent;
    border-right: 1px dotted silver;
    overflow: hidden;
    line-height: 30px;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .log-item .text {
    width: 100%;
    display: inline-block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .log-item > div.method {
    height: 100%;
    padding: 3px 8px;
  }
</style>
