mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 13:28:25 +00:00 
			
		
		
		
	Reorder blocks in vue SFCs (#26874)
The [recommended order](https://vuejs.org/guide/scaling-up/sfc.html) for SFC blocks is script -> template -> style, which we were violating because template and script were swapped. I do find script first also easier to read because the imports are on top, letting me immideatly see a component's dependencies. This is a pure cut-paste refactor with some removal of some empty lines. --------- Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		@@ -1,124 +1,3 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="ui container action-view-container">
 | 
			
		||||
    <div class="action-view-header">
 | 
			
		||||
      <div class="action-info-summary">
 | 
			
		||||
        <div class="action-info-summary-title">
 | 
			
		||||
          <ActionRunStatus :locale-status="locale.status[run.status]" :status="run.status" :size="20"/>
 | 
			
		||||
          <h2 class="action-info-summary-title-text">
 | 
			
		||||
            {{ run.title }}
 | 
			
		||||
          </h2>
 | 
			
		||||
        </div>
 | 
			
		||||
        <button class="ui basic small compact button primary" @click="approveRun()" v-if="run.canApprove">
 | 
			
		||||
          {{ locale.approve }}
 | 
			
		||||
        </button>
 | 
			
		||||
        <button class="ui basic small compact button red" @click="cancelRun()" v-else-if="run.canCancel">
 | 
			
		||||
          {{ locale.cancel }}
 | 
			
		||||
        </button>
 | 
			
		||||
        <button class="ui basic small compact button gt-mr-0 link-action" :data-url="`${run.link}/rerun`" v-else-if="run.canRerun">
 | 
			
		||||
          {{ locale.rerun_all }}
 | 
			
		||||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="action-commit-summary">
 | 
			
		||||
        {{ run.commit.localeCommit }}
 | 
			
		||||
        <a class="muted" :href="run.commit.link">{{ run.commit.shortSHA }}</a>
 | 
			
		||||
        {{ run.commit.localePushedBy }}
 | 
			
		||||
        <a class="muted" :href="run.commit.pusher.link">{{ run.commit.pusher.displayName }}</a>
 | 
			
		||||
        <span class="ui label" v-if="run.commit.shortSHA">
 | 
			
		||||
          <a :href="run.commit.branch.link">{{ run.commit.branch.name }}</a>
 | 
			
		||||
        </span>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="action-view-body">
 | 
			
		||||
      <div class="action-view-left">
 | 
			
		||||
        <div class="job-group-section">
 | 
			
		||||
          <div class="job-brief-list">
 | 
			
		||||
            <a class="job-brief-item" :href="run.link+'/jobs/'+index" :class="parseInt(jobIndex) === index ? 'selected' : ''" v-for="(job, index) in run.jobs" :key="job.id" @mouseenter="onHoverRerunIndex = job.id" @mouseleave="onHoverRerunIndex = -1">
 | 
			
		||||
              <div class="job-brief-item-left">
 | 
			
		||||
                <ActionRunStatus :locale-status="locale.status[job.status]" :status="job.status"/>
 | 
			
		||||
                <span class="job-brief-name gt-mx-3 gt-ellipsis">{{ job.name }}</span>
 | 
			
		||||
              </div>
 | 
			
		||||
              <span class="job-brief-item-right">
 | 
			
		||||
                <SvgIcon name="octicon-sync" role="button" :data-tooltip-content="locale.rerun" class="job-brief-rerun gt-mx-3 link-action" :data-url="`${run.link}/jobs/${index}/rerun`" v-if="job.canRerun && onHoverRerunIndex === job.id"/>
 | 
			
		||||
                <span class="step-summary-duration">{{ job.duration }}</span>
 | 
			
		||||
              </span>
 | 
			
		||||
            </a>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="job-artifacts" v-if="artifacts.length > 0">
 | 
			
		||||
          <div class="job-artifacts-title">
 | 
			
		||||
            {{ locale.artifactsTitle }}
 | 
			
		||||
          </div>
 | 
			
		||||
          <ul class="job-artifacts-list">
 | 
			
		||||
            <li class="job-artifacts-item" v-for="artifact in artifacts" :key="artifact.name">
 | 
			
		||||
              <a class="job-artifacts-link" target="_blank" :href="run.link+'/artifacts/'+artifact.name">
 | 
			
		||||
                <SvgIcon name="octicon-file" class="ui text black job-artifacts-icon"/>{{ artifact.name }}
 | 
			
		||||
              </a>
 | 
			
		||||
            </li>
 | 
			
		||||
          </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="action-view-right">
 | 
			
		||||
        <div class="job-info-header">
 | 
			
		||||
          <div class="job-info-header-left">
 | 
			
		||||
            <h3 class="job-info-header-title">
 | 
			
		||||
              {{ currentJob.title }}
 | 
			
		||||
            </h3>
 | 
			
		||||
            <p class="job-info-header-detail">
 | 
			
		||||
              {{ currentJob.detail }}
 | 
			
		||||
            </p>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="job-info-header-right">
 | 
			
		||||
            <div class="ui top right pointing dropdown custom jump item" @click.stop="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible">
 | 
			
		||||
              <button class="btn gt-interact-bg gt-p-3">
 | 
			
		||||
                <SvgIcon name="octicon-gear" :size="18"/>
 | 
			
		||||
              </button>
 | 
			
		||||
              <div class="menu transition action-job-menu" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak>
 | 
			
		||||
                <a class="item" @click="toggleTimeDisplay('seconds')">
 | 
			
		||||
                  <i class="icon"><SvgIcon :name="timeVisible['log-time-seconds'] ? 'octicon-check' : 'gitea-empty-checkbox'"/></i>
 | 
			
		||||
                  {{ locale.showLogSeconds }}
 | 
			
		||||
                </a>
 | 
			
		||||
                <a class="item" @click="toggleTimeDisplay('stamp')">
 | 
			
		||||
                  <i class="icon"><SvgIcon :name="timeVisible['log-time-stamp'] ? 'octicon-check' : 'gitea-empty-checkbox'"/></i>
 | 
			
		||||
                  {{ locale.showTimeStamps }}
 | 
			
		||||
                </a>
 | 
			
		||||
                <a class="item" @click="toggleFullScreen()">
 | 
			
		||||
                  <i class="icon"><SvgIcon :name="isFullScreen ? 'octicon-check' : 'gitea-empty-checkbox'"/></i>
 | 
			
		||||
                  {{ locale.showFullScreen }}
 | 
			
		||||
                </a>
 | 
			
		||||
                <div class="divider"/>
 | 
			
		||||
                <a :class="['item', currentJob.steps.length === 0 ? 'disabled' : '']" :href="run.link+'/jobs/'+jobIndex+'/logs'" target="_blank">
 | 
			
		||||
                  <i class="icon"><SvgIcon name="octicon-download"/></i>
 | 
			
		||||
                  {{ locale.downloadLogs }}
 | 
			
		||||
                </a>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="job-step-container" ref="steps">
 | 
			
		||||
          <div class="job-step-section" v-for="(jobStep, i) in currentJob.steps" :key="i">
 | 
			
		||||
            <div class="job-step-summary" @click.stop="toggleStepLogs(i)" :class="currentJobStepsStates[i].expanded ? 'selected' : ''">
 | 
			
		||||
              <!-- If the job is done and the job step log is loaded for the first time, show the loading icon
 | 
			
		||||
                currentJobStepsStates[i].cursor === null means the log is loaded for the first time
 | 
			
		||||
              -->
 | 
			
		||||
              <SvgIcon v-if="isDone(run.status) && currentJobStepsStates[i].expanded && currentJobStepsStates[i].cursor === null" name="octicon-sync" class="gt-mr-3 job-status-rotate"/>
 | 
			
		||||
              <SvgIcon v-else :name="currentJobStepsStates[i].expanded ? 'octicon-chevron-down': 'octicon-chevron-right'" class="gt-mr-3"/>
 | 
			
		||||
              <ActionRunStatus :status="jobStep.status" class="gt-mr-3"/>
 | 
			
		||||
 | 
			
		||||
              <span class="step-summary-msg gt-ellipsis">{{ jobStep.summary }}</span>
 | 
			
		||||
              <span class="step-summary-duration">{{ jobStep.duration }}</span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- the log elements could be a lot, do not use v-if to destroy/reconstruct the DOM,
 | 
			
		||||
            use native DOM elements for "log line" to improve performance, Vue is not suitable for managing so many reactive elements. -->
 | 
			
		||||
            <div class="job-step-logs" ref="logs" v-show="currentJobStepsStates[i].expanded"/>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import {SvgIcon} from '../svg.js';
 | 
			
		||||
import ActionRunStatus from './ActionRunStatus.vue';
 | 
			
		||||
@@ -472,9 +351,127 @@ export function initRepositoryActionView() {
 | 
			
		||||
  });
 | 
			
		||||
  view.mount(el);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="ui container action-view-container">
 | 
			
		||||
    <div class="action-view-header">
 | 
			
		||||
      <div class="action-info-summary">
 | 
			
		||||
        <div class="action-info-summary-title">
 | 
			
		||||
          <ActionRunStatus :locale-status="locale.status[run.status]" :status="run.status" :size="20"/>
 | 
			
		||||
          <h2 class="action-info-summary-title-text">
 | 
			
		||||
            {{ run.title }}
 | 
			
		||||
          </h2>
 | 
			
		||||
        </div>
 | 
			
		||||
        <button class="ui basic small compact button primary" @click="approveRun()" v-if="run.canApprove">
 | 
			
		||||
          {{ locale.approve }}
 | 
			
		||||
        </button>
 | 
			
		||||
        <button class="ui basic small compact button red" @click="cancelRun()" v-else-if="run.canCancel">
 | 
			
		||||
          {{ locale.cancel }}
 | 
			
		||||
        </button>
 | 
			
		||||
        <button class="ui basic small compact button gt-mr-0 link-action" :data-url="`${run.link}/rerun`" v-else-if="run.canRerun">
 | 
			
		||||
          {{ locale.rerun_all }}
 | 
			
		||||
        </button>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="action-commit-summary">
 | 
			
		||||
        {{ run.commit.localeCommit }}
 | 
			
		||||
        <a class="muted" :href="run.commit.link">{{ run.commit.shortSHA }}</a>
 | 
			
		||||
        {{ run.commit.localePushedBy }}
 | 
			
		||||
        <a class="muted" :href="run.commit.pusher.link">{{ run.commit.pusher.displayName }}</a>
 | 
			
		||||
        <span class="ui label" v-if="run.commit.shortSHA">
 | 
			
		||||
          <a :href="run.commit.branch.link">{{ run.commit.branch.name }}</a>
 | 
			
		||||
        </span>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="action-view-body">
 | 
			
		||||
      <div class="action-view-left">
 | 
			
		||||
        <div class="job-group-section">
 | 
			
		||||
          <div class="job-brief-list">
 | 
			
		||||
            <a class="job-brief-item" :href="run.link+'/jobs/'+index" :class="parseInt(jobIndex) === index ? 'selected' : ''" v-for="(job, index) in run.jobs" :key="job.id" @mouseenter="onHoverRerunIndex = job.id" @mouseleave="onHoverRerunIndex = -1">
 | 
			
		||||
              <div class="job-brief-item-left">
 | 
			
		||||
                <ActionRunStatus :locale-status="locale.status[job.status]" :status="job.status"/>
 | 
			
		||||
                <span class="job-brief-name gt-mx-3 gt-ellipsis">{{ job.name }}</span>
 | 
			
		||||
              </div>
 | 
			
		||||
              <span class="job-brief-item-right">
 | 
			
		||||
                <SvgIcon name="octicon-sync" role="button" :data-tooltip-content="locale.rerun" class="job-brief-rerun gt-mx-3 link-action" :data-url="`${run.link}/jobs/${index}/rerun`" v-if="job.canRerun && onHoverRerunIndex === job.id"/>
 | 
			
		||||
                <span class="step-summary-duration">{{ job.duration }}</span>
 | 
			
		||||
              </span>
 | 
			
		||||
            </a>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="job-artifacts" v-if="artifacts.length > 0">
 | 
			
		||||
          <div class="job-artifacts-title">
 | 
			
		||||
            {{ locale.artifactsTitle }}
 | 
			
		||||
          </div>
 | 
			
		||||
          <ul class="job-artifacts-list">
 | 
			
		||||
            <li class="job-artifacts-item" v-for="artifact in artifacts" :key="artifact.name">
 | 
			
		||||
              <a class="job-artifacts-link" target="_blank" :href="run.link+'/artifacts/'+artifact.name">
 | 
			
		||||
                <SvgIcon name="octicon-file" class="ui text black job-artifacts-icon"/>{{ artifact.name }}
 | 
			
		||||
              </a>
 | 
			
		||||
            </li>
 | 
			
		||||
          </ul>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="action-view-right">
 | 
			
		||||
        <div class="job-info-header">
 | 
			
		||||
          <div class="job-info-header-left">
 | 
			
		||||
            <h3 class="job-info-header-title">
 | 
			
		||||
              {{ currentJob.title }}
 | 
			
		||||
            </h3>
 | 
			
		||||
            <p class="job-info-header-detail">
 | 
			
		||||
              {{ currentJob.detail }}
 | 
			
		||||
            </p>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="job-info-header-right">
 | 
			
		||||
            <div class="ui top right pointing dropdown custom jump item" @click.stop="menuVisible = !menuVisible" @keyup.enter="menuVisible = !menuVisible">
 | 
			
		||||
              <button class="btn gt-interact-bg gt-p-3">
 | 
			
		||||
                <SvgIcon name="octicon-gear" :size="18"/>
 | 
			
		||||
              </button>
 | 
			
		||||
              <div class="menu transition action-job-menu" :class="{visible: menuVisible}" v-if="menuVisible" v-cloak>
 | 
			
		||||
                <a class="item" @click="toggleTimeDisplay('seconds')">
 | 
			
		||||
                  <i class="icon"><SvgIcon :name="timeVisible['log-time-seconds'] ? 'octicon-check' : 'gitea-empty-checkbox'"/></i>
 | 
			
		||||
                  {{ locale.showLogSeconds }}
 | 
			
		||||
                </a>
 | 
			
		||||
                <a class="item" @click="toggleTimeDisplay('stamp')">
 | 
			
		||||
                  <i class="icon"><SvgIcon :name="timeVisible['log-time-stamp'] ? 'octicon-check' : 'gitea-empty-checkbox'"/></i>
 | 
			
		||||
                  {{ locale.showTimeStamps }}
 | 
			
		||||
                </a>
 | 
			
		||||
                <a class="item" @click="toggleFullScreen()">
 | 
			
		||||
                  <i class="icon"><SvgIcon :name="isFullScreen ? 'octicon-check' : 'gitea-empty-checkbox'"/></i>
 | 
			
		||||
                  {{ locale.showFullScreen }}
 | 
			
		||||
                </a>
 | 
			
		||||
                <div class="divider"/>
 | 
			
		||||
                <a :class="['item', currentJob.steps.length === 0 ? 'disabled' : '']" :href="run.link+'/jobs/'+jobIndex+'/logs'" target="_blank">
 | 
			
		||||
                  <i class="icon"><SvgIcon name="octicon-download"/></i>
 | 
			
		||||
                  {{ locale.downloadLogs }}
 | 
			
		||||
                </a>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="job-step-container" ref="steps">
 | 
			
		||||
          <div class="job-step-section" v-for="(jobStep, i) in currentJob.steps" :key="i">
 | 
			
		||||
            <div class="job-step-summary" @click.stop="toggleStepLogs(i)" :class="currentJobStepsStates[i].expanded ? 'selected' : ''">
 | 
			
		||||
              <!-- If the job is done and the job step log is loaded for the first time, show the loading icon
 | 
			
		||||
                currentJobStepsStates[i].cursor === null means the log is loaded for the first time
 | 
			
		||||
              -->
 | 
			
		||||
              <SvgIcon v-if="isDone(run.status) && currentJobStepsStates[i].expanded && currentJobStepsStates[i].cursor === null" name="octicon-sync" class="gt-mr-3 job-status-rotate"/>
 | 
			
		||||
              <SvgIcon v-else :name="currentJobStepsStates[i].expanded ? 'octicon-chevron-down': 'octicon-chevron-right'" class="gt-mr-3"/>
 | 
			
		||||
              <ActionRunStatus :status="jobStep.status" class="gt-mr-3"/>
 | 
			
		||||
 | 
			
		||||
              <span class="step-summary-msg gt-ellipsis">{{ jobStep.summary }}</span>
 | 
			
		||||
              <span class="step-summary-duration">{{ jobStep.duration }}</span>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
            <!-- the log elements could be a lot, do not use v-if to destroy/reconstruct the DOM,
 | 
			
		||||
            use native DOM elements for "log line" to improve performance, Vue is not suitable for managing so many reactive elements. -->
 | 
			
		||||
            <div class="job-step-logs" ref="logs" v-show="currentJobStepsStates[i].expanded"/>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped>
 | 
			
		||||
.action-view-body {
 | 
			
		||||
  padding-top: 12px;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user