LogList.vue 6.5 KB
Newer Older
H
Hao Sun 已提交
1
<template>
aaronchen2k2k's avatar
aaronchen2k2k 已提交
2
  <div id="log-list" class="log-list scrollbar-y">
H
Hao Sun 已提交
3
    <pre id="content" class="content">
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
      <template v-for="(item, index) in wsMsg.out" :key="index">
aaronchen2k2k's avatar
aaronchen2k2k 已提交
5 6 7
        {{ void (info = item.info) }}
        {{ void (csKey = info?.key) }}

H
Hao Sun 已提交
8
        <code class="item small"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9 10 11 12 13 14
             :class="[
                 csKey && caseDetail[csKey] ? 'show-detail' : '',

                 csKey ? 'case-item' : '',
                 info?.status === 'start' ? 'case-start' : '',
                 info?.status === 'start' ? 'result-'+caseResult[csKey] : '',
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15

H
Hao Sun 已提交
16
                 info?.status === 'start-task' ? 'strong' : ''
aaronchen2k2k's avatar
aaronchen2k2k 已提交
17
             ]">
aaronchen2k2k's avatar
aaronchen2k2k 已提交
18 19

          <div class="group">
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
            <template v-if="info?.status === 'start'">
H
Hao Sun 已提交
21
              <span @click="showDetail(item.info?.key)" class="link state center">
aaronchen2k2k's avatar
aaronchen2k2k 已提交
22 23 24 25
                <Icon v-if="!caseDetail[csKey]" icon="chevron-right" />
                <Icon v-if="caseDetail[csKey]" icon="chevron-down" />
              </span>
            </template>
aaronchen2k2k's avatar
aaronchen2k2k 已提交
26 27 28
          </div>

          <div class="sign">
aaronchen2k2k's avatar
aaronchen2k2k 已提交
29 30
            <Icon v-if="item.msg" icon="circle" />
            <span v-else>&nbsp;</span>
aaronchen2k2k's avatar
aaronchen2k2k 已提交
31 32 33 34 35 36
          </div>

          <div class="time">
            <span>{{ item.time }}</span>
          </div>
          <div class="msg-span">
aaronchen2k2k's avatar
aaronchen2k2k 已提交
37
            <span v-html="item.msg"></span>
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38 39
            <span v-if="info?.status === 'start' && caseResult[csKey]">
              [ {{ t(caseResult[csKey]) }} ]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
40 41
            </span>
          </div>
H
Hao Sun 已提交
42
        </code>
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43 44

      </template>
H
Hao Sun 已提交
45
    </pre>
H
Hao Sun 已提交
46 47
  </div>
</template>
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48 49 50

<script setup lang="ts">
import {useI18n} from "vue-i18n";
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51 52 53
import {WsMsg} from "@/types/data";
import {genExecInfo, genWorkspaceToScriptsMap} from "@/views/script/service";
import {scroll} from "@/utils/dom";
aaronchen2k2k's avatar
aaronchen2k2k 已提交
54
import {computed, onBeforeUnmount, onMounted, reactive, ref, watch} from "vue";
aaronchen2k2k's avatar
aaronchen2k2k 已提交
55 56 57 58 59 60 61 62
import {useStore} from "vuex";
import {WebSocketData} from "@/store/websoket";
import {ExecStatus} from "@/store/exec";
import bus from "@/utils/eventBus";
import settings from "@/config/settings";
import {ZentaoData} from "@/store/zentao";
import {WebSocket} from "@/services/websocket";

aaronchen2k2k's avatar
aaronchen2k2k 已提交
63
import Icon from '@/components/Icon.vue';
aaronchen2k2k's avatar
aaronchen2k2k 已提交
64
import {momentTime} from "@/utils/datetime";
aaronchen2k2k's avatar
aaronchen2k2k 已提交
65
import {isInArray} from "@/utils/array";
aaronchen2k2k's avatar
aaronchen2k2k 已提交
66
import {StateType as GlobalStateType} from "@/store/global";
aaronchen2k2k's avatar
aaronchen2k2k 已提交
67 68
const { t } = useI18n();

aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70
const store = useStore<{global: GlobalStateType, Zentao: ZentaoData, WebSocket: WebSocketData, Exec: ExecStatus}>();
const logContentExpand = computed<boolean>(() => store.state.global.logContentExpand);
aaronchen2k2k's avatar
aaronchen2k2k 已提交
71

aaronchen2k2k's avatar
aaronchen2k2k 已提交
72 73 74 75
const currSite = computed<any>(() => store.state.Zentao.currSite);
const currProduct = computed<any>(() => store.state.Zentao.currProduct);
const wsStatus = computed<any>(() => store.state.WebSocket.connStatus);
const isRunning = computed<any>(() => store.state.Exec.isRunning);
aaronchen2k2k's avatar
aaronchen2k2k 已提交
76

aaronchen2k2k's avatar
aaronchen2k2k 已提交
77
const cachedExecData = ref({})
78
const caseCount = ref(1)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
const caseResult = ref({})
aaronchen2k2k's avatar
aaronchen2k2k 已提交
80
const caseDetail = ref({})
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81 82 83 84

// websocket
let wsMsg = reactive({in: '', out: [] as any[]});

aaronchen2k2k's avatar
aaronchen2k2k 已提交
85 86 87 88 89
const showDetail = (key) => {
  console.log('showDetail', key)
  caseDetail.value[key] = !caseDetail.value[key]
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102
const hideAllDetailOrNot = (val) => {
  console.log('hideAllDetailOrNot')
  Object.keys(caseDetail.value).forEach((key => {
    caseDetail.value[key] = val;
  }))
  console.log(caseDetail.value)
}

watch(logContentExpand, () => {
  console.log('watch logContentExpand', logContentExpand.value)
  hideAllDetailOrNot(logContentExpand.value)
}, {deep: true})

aaronchen2k2k's avatar
aaronchen2k2k 已提交
103 104 105 106 107 108 109
const onWebsocketMsgEvent = (data: any) => {
  console.log('WebsocketMsgEvent in ExecLog', data.msg)

  let item = JSON.parse(data.msg) as WsMsg

  if ('isRunning' in wsMsg) {
    console.log('change isRunning to ', item.isRunning)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
110
    store.dispatch('Exec/setRunning', item.isRunning)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
111 112
  }

aaronchen2k2k's avatar
aaronchen2k2k 已提交
113 114 115 116 117
  if (item.info?.status === 'start') {
    const key = item.info.key + '-' + caseCount.value
    caseDetail.value[key] = logContentExpand.value
  }

118
  item = genExecInfo(item, caseCount.value)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
119
  if (item.info && item.info.key && isInArray(item.info.status, ['pass', 'fail', 'skip'])) { // set case result
aaronchen2k2k's avatar
aaronchen2k2k 已提交
120
    store.dispatch('Result/list', {
Z
zhaoke 已提交
121 122 123 124 125
        keywords: '',
        enabled: 1,
        pageSize: 10,
        page: 1
        });
aaronchen2k2k's avatar
aaronchen2k2k 已提交
126 127 128 129
    caseResult.value[item.info.key] = item.info.status
  }

  wsMsg.out.push(item)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
130
  scroll('log-list')
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
}

onMounted(() => {
  console.log('onMounted')
  bus.on(settings.eventExec, exec);
  bus.on(settings.eventWebSocketMsg, onWebsocketMsgEvent);
})
onBeforeUnmount( () => {
  console.log('onBeforeUnmount')
  bus.off(settings.eventExec, exec);
  bus.off(settings.eventWebSocketMsg, onWebsocketMsgEvent);
})

const exec = (data: any) => {
  console.log('exec', data)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
147 148 149 150 151 152 153
  let execType = data.execType
  if (execType === 'previous') {
    data = cachedExecData.value
    execType = data.execType
  } else {
    cachedExecData.value = data
  }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
154

155 156
  if (execType === 'ztf' && (!data.scripts || data.scripts.length === 0)) {
    const msgCancel = {
H
Hao Sun 已提交
157
      msg: `<span class="strong">`+t('case_num_empty')+`</span>`,
158 159 160 161
      time: momentTime(new Date())}
    wsMsg.out.push(msgCancel)
    return
  }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
162

aaronchen2k2k's avatar
aaronchen2k2k 已提交
163
  caseCount.value++
aaronchen2k2k's avatar
aaronchen2k2k 已提交
164 165 166 167 168 169 170
  let msg = {}
  if (execType === 'ztf') {
    const scripts = data.scripts
    const sets = genWorkspaceToScriptsMap(scripts)
    msg = {act: 'execCase', testSets: sets}

  } else if (execType === 'unit') {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
171 172
    const set = {
      workspaceId: data.id,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
173 174 175 176 177
      workspaceType: data.type,
      cmd: data.cmd,
      submitResult: data.submitResult,
      name: data.name,
    }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
178

aaronchen2k2k's avatar
aaronchen2k2k 已提交
179
    msg = {act: 'execUnit', testSets: [set], productId: currProduct.value.id}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
180 181 182 183 184 185

  } else if (execType === 'stop') {
    msg = {act: 'execStop'}
  }

  console.log('exec testing', msg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
186
  WebSocket.sentMsg(settings.webSocketRoom, JSON.stringify(msg))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
187 188 189 190 191
}

const logLevel = ref('result')
const logStatus = ref('')

aaronchen2k2k's avatar
aaronchen2k2k 已提交
192
</script>
aaronchen2k2k's avatar
aaronchen2k2k 已提交
193

aaronchen2k2k's avatar
aaronchen2k2k 已提交
194 195
<style lang="less">
.log-list {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
196
  height: 100%;
aaronchen2k2k's avatar
aaronchen2k2k 已提交
197
  .result-pass {
H
Hao Sun 已提交
198
    color: var(--color-green)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
199 200
  }
  .result-fail {
H
Hao Sun 已提交
201
    color: var(--color-red)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
202
  }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
203 204 205
  .result-skip {
    color: var(--color-gray)
  }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
206

aaronchen2k2k's avatar
aaronchen2k2k 已提交
207
  .content {
H
Hao Sun 已提交
208
    white-space: normal;
aaronchen2k2k's avatar
aaronchen2k2k 已提交
209
    .item {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
210
      line-height: 18px;
aaronchen2k2k's avatar
aaronchen2k2k 已提交
211 212 213 214 215 216 217 218
      &.case-item {
        &:not(.case-start) {
          display: none !important;
        }
      }
      &.show-detail:not(.case-start) {
        display: flex !important;
      }
H
Hao Sun 已提交
219 220 221
      &:hover {
        background-color: var(--color-darken-1);
      }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
222

aaronchen2k2k's avatar
aaronchen2k2k 已提交
223 224 225 226
      .group {
        width: 16px;
        font-size: 13px;
        text-align: center;
aaronchen2k2k's avatar
aaronchen2k2k 已提交
227
        .link {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
228 229
          //position: relative;
          //top: 2px;
aaronchen2k2k's avatar
aaronchen2k2k 已提交
230
        }
aaronchen2k2k's avatar
aaronchen2k2k 已提交
231 232
      }
      .sign {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
233 234
        margin: auto;

H
Hao Sun 已提交
235
        width: 20px;
aaronchen2k2k's avatar
aaronchen2k2k 已提交
236 237 238 239 240 241 242 243 244 245
        font-size: 6px;
        text-align: center;
      }
      .time {
        width: 80px;
      }
    }
  }
}
</style>