<template> <section> <table class="village-table"> <thead> <tr> <th></th> <th class="right">Дерево</th> <th class="right">Глина</th> <th class="right">Железо</th> <th class="right">Зерно</th> <th class="right" title="Время до окончания добычи необходимых ресурсов">Рес.</th> <th class="right" title="Время до окончания выполнения текущей задачи">Оч.</th> </tr> </thead> <tbody> <template v-for="villageState in shared.villageStates"> <tr class="normal-line top-line"> <td class="right" :class="{ active: villageState.village.active }" :title="villageHint(villageState)" > {{ villageState.village.name }} [ <a href="#" v-on:click.prevent="openEditor(villageState.id)">ред</a>, <a href="#" v-on:click.prevent="toggleTaskList(villageState.id)">здч</a> ]: </td> <td class="right"> <filling :value="villageState.resources.lumber" :warning="villageState.storageOptimumFullness.lumber" :critical="villageState.storageCriticalFullness.lumber" :full="villageState.storage.capacity.lumber" ></filling> </td> <td class="right"> <filling :value="villageState.resources.clay" :warning="villageState.storageOptimumFullness.clay" :critical="villageState.storageCriticalFullness.clay" :full="villageState.storage.capacity.clay" ></filling> </td> <td class="right"> <filling :value="villageState.resources.iron" :warning="villageState.storageOptimumFullness.iron" :critical="villageState.storageCriticalFullness.iron" :full="villageState.storage.capacity.iron" ></filling> </td> <td class="right"> <filling :value="villageState.resources.crop" :warning="villageState.storageOptimumFullness.crop" :critical="villageState.storageCriticalFullness.crop" :full="villageState.storage.capacity.crop" ></filling> </td> <td class="right" v-text="storageTime(villageState)"></td> <td></td> </tr> <resource-line :title="'Добыча:'" :resources="villageState.performance" :color="false" /> <resource-line v-for="queueState of villageState.queues" v-bind:key="villageState.id + queueState.queue" v-if="queueState.isActive" :title="queueTitle(queueState.queue) + ' (' + queueState.taskCount + '):'" :hint="'Задач в очереди: ' + queueState.taskCount" :resources="queueState.firstTask.balance" :time1="renderGatheringTime(queueState.firstTask.time)" :time2="renderTimeInSeconds(queueState.currentTaskFinishSeconds)" :color="queueState.isWaiting" /> <resource-line :title="'Торговцы:'" :resources="villageState.incomingResources" :hide-zero="true" v-if="!villageState.incomingResources.empty()" /> <tr class="normal-line"> <td class="right" colspan="7"> <a v-for="s in shared.villageStates" v-if="s.id !== villageState.id" class="village-quick-link" :href="marketPath(villageState.village, s.village)" :title=" 'Отправить ресурсы из ' + villageState.village.name + ' в ' + s.village.name " >$->{{ s.village.name }}</a > </td> </tr> <status-line class="second-line" :village-state="villageState" /> <tr class="task-list-line" v-if="isTaskListVisible(villageState.id)"> <td class="right" colspan="7"> <village-task-list :village-id="villageState.id" :tasks="villageState.tasks" /> </td> </tr> </template> </tbody> </table> </section> </template> <script> import ResourceBalance from './ResourceBalance'; import VillageResource from './VillageResource'; import { MARKET_ID } from '../Core/Buildings'; import { path } from '../Helpers/Path'; import { Actions } from './Store'; import { translateProductionQueue } from '../Core/ProductionQueue'; import VillageStateResourceLine from './VillageStateResourceLine'; import VillageStateStatusLine from './VillageStateStatusLine'; import VillageTaskList from './VillageTaskList'; function secondsToTime(value) { if (value === 0) { return ''; } const hours = Math.floor(value / 3600); const minutes = Math.floor((value % 3600) / 60); const seconds = Math.floor(value % 60); return `${hours}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`; } export default { components: { VillageTaskList, 'resource': ResourceBalance, 'filling': VillageResource, 'resource-line': VillageStateResourceLine, 'status-line': VillageStateStatusLine, }, data() { return { shared: this.$root.$data, taskListView: {}, }; }, methods: { villageHint(villageState) { const id = villageState.id; const name = villageState.village.name; return `${name}, ${id}`; }, path(name, args) { return path(name, args); }, storageTime(villageState) { const toZero = villageState.storage.timeToZero; const toFull = villageState.storage.timeToFull; return this.renderGatheringTime(toFull.never ? toZero : toFull); }, marketPath(fromVillage, toVillage) { return path('/build.php', { newdid: fromVillage.id, gid: MARKET_ID, t: 5, x: toVillage.crd.x, y: toVillage.crd.y, }); }, renderTimeInSeconds(value) { return secondsToTime(value); }, /** * @param {GatheringTime} value * @returns {string} */ renderGatheringTime(value) { if (value.never) { return 'never'; } return secondsToTime(value.seconds); }, openEditor(villageId) { this.$store.dispatch(Actions.OpenVillageEditor, { villageId }); }, queueTitle(queue) { return translateProductionQueue(queue); }, toggleTaskList(villageId) { this.taskListView[villageId] = !this.taskListView[villageId]; }, isTaskListVisible(villageId) { return !!this.taskListView[villageId]; }, }, }; </script> <style scoped lang="scss"> @import 'style'; .village-table { width: 100%; max-width: 100%; border-collapse: collapse; } .top-line td { border-top: 1px solid #ddd; } .normal-line td { padding: 4px; } .second-line td { padding: 0 4px 4px; } .task-list-line td { padding: 0; max-width: $panel-work-area; overflow: hidden; } .filling-line td { padding: 0; border: 1px solid #ddd; } .performance-line td, .required-line td, .commitments-line td, .incoming-line td { padding: 0 4px 4px; font-size: 90%; } .village-table td.active { font-weight: bold; } .right { text-align: right; } .village-quick-link { display: inline-block; } .village-quick-link.active { color: midnightblue; } .village-quick-link + .village-quick-link { margin-left: 0.4em; } </style>