Rewrite dashboard with Vue
This commit is contained in:
42
src/Dashboard/Components/DashboardApp.vue
Normal file
42
src/Dashboard/Components/DashboardApp.vue
Normal file
@ -0,0 +1,42 @@
|
||||
<template>
|
||||
<main id="dashboard">
|
||||
<div id="dashboard-inner">
|
||||
<hdr></hdr>
|
||||
<task-list></task-list>
|
||||
</div>
|
||||
</main>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Header from './Header';
|
||||
import TaskList from './TaskList';
|
||||
export default {
|
||||
components: {
|
||||
hdr: Header,
|
||||
'task-list': TaskList,
|
||||
},
|
||||
data() {
|
||||
return {};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
#dashboard {
|
||||
position: absolute;
|
||||
display: block;
|
||||
left: 0;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
width: 500px;
|
||||
z-index: 9999;
|
||||
/*overflow: hidden;*/
|
||||
}
|
||||
#dashboard * {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
#dashboard-inner {
|
||||
background-color: white;
|
||||
margin: 4px;
|
||||
}
|
||||
</style>
|
33
src/Dashboard/Components/Header.vue
Normal file
33
src/Dashboard/Components/Header.vue
Normal file
@ -0,0 +1,33 @@
|
||||
<template>
|
||||
<section>
|
||||
<h1 class="title">{{ shared.name }} - {{ villageName }}</h1>
|
||||
<p class="version">{{ shared.version }}</p>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
shared: this.$root.$data,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
villageName() {
|
||||
let village = this.shared.village;
|
||||
return village ? village.name : 'Unknown';
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.title {
|
||||
font-size: 160%;
|
||||
margin: 8px;
|
||||
}
|
||||
.version {
|
||||
font-size: 120%;
|
||||
margin: 8px;
|
||||
}
|
||||
</style>
|
57
src/Dashboard/Components/TaskList.vue
Normal file
57
src/Dashboard/Components/TaskList.vue
Normal file
@ -0,0 +1,57 @@
|
||||
<template>
|
||||
<section class="task-list">
|
||||
<p class="summary">Task count: {{ shared.taskList.length }}</p>
|
||||
<div class="container">
|
||||
<table class="task-table">
|
||||
<tr class="task-item" v-for="task in shared.taskList">
|
||||
<td :title="formatDate(task.ts)">{{ formatDate(task.ts) }}</td>
|
||||
<td :title="task.id">{{ task.id }}</td>
|
||||
<td :title="task.name">{{ task.name }}</td>
|
||||
<td :title="JSON.stringify(task.args)">{{ JSON.stringify(task.args) }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as dateFormat from 'dateformat';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
shared: this.$root.$data,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
formatDate(ts) {
|
||||
const d = new Date(ts * 1000);
|
||||
return dateFormat(d, 'HH:MM:ss');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.task-list {
|
||||
margin: 8px 8px auto;
|
||||
}
|
||||
.summary {
|
||||
margin: 10px auto 0;
|
||||
}
|
||||
.container {
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
max-height: 300px;
|
||||
}
|
||||
.task-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin: 6px auto 0;
|
||||
}
|
||||
.task-item > td {
|
||||
border-top: 1px solid #ddd;
|
||||
padding: 2px 4px;
|
||||
max-width: 25%;
|
||||
}
|
||||
</style>
|
@ -1,13 +1,14 @@
|
||||
import * as URLParse from 'url-parse';
|
||||
import { markPage, waitForLoad } from '../utils';
|
||||
import { markPage, uniqId, waitForLoad } from '../utils';
|
||||
import { Scheduler } from '../Scheduler';
|
||||
import { TaskQueueRenderer } from '../TaskQueueRenderer';
|
||||
import { BuildPage } from '../Page/BuildPage';
|
||||
|
||||
import { UpgradeBuildingTask } from '../Task/UpgradeBuildingTask';
|
||||
import { grabResources } from '../Page/ResourcesBlock';
|
||||
import { grabActiveVillageId, grabVillageList } from '../Page/VillageBlock';
|
||||
import { grabActiveVillage, grabActiveVillageId, grabVillageList } from '../Page/VillageBlock';
|
||||
import { onResourceSlotCtrlClick, showBuildingSlotIds, showResourceSlotIds } from '../Page/SlotBlock';
|
||||
import Vue from 'vue';
|
||||
import DashboardApp from './Components/DashboardApp.vue';
|
||||
|
||||
export class Dashboard {
|
||||
private readonly version: string;
|
||||
@ -24,10 +25,6 @@ export class Dashboard {
|
||||
const p = new URLParse(window.location.href, true);
|
||||
this.log('PARSED LOCATION', p);
|
||||
|
||||
markPage('Dashboard', this.version);
|
||||
this.renderTaskQueue();
|
||||
setInterval(() => this.renderTaskQueue(), 5000);
|
||||
|
||||
const res = grabResources();
|
||||
this.log('RES', res);
|
||||
|
||||
@ -36,6 +33,25 @@ export class Dashboard {
|
||||
|
||||
const villageId = grabActiveVillageId();
|
||||
|
||||
const state = {
|
||||
name: 'Dashboard',
|
||||
village: grabActiveVillage(),
|
||||
version: this.version,
|
||||
taskList: this.scheduler.getTaskItems(),
|
||||
};
|
||||
|
||||
const appId = `app-${uniqId()}`;
|
||||
jQuery('body').prepend(`<div id="${appId}"></div>`);
|
||||
new Vue({
|
||||
el: `#${appId}`,
|
||||
data: state,
|
||||
render: h => h(DashboardApp),
|
||||
});
|
||||
|
||||
// markPage('Dashboard', this.version);
|
||||
// this.renderTaskQueue();
|
||||
// setInterval(() => this.renderTaskQueue(), 5000);
|
||||
|
||||
const tasks = this.scheduler.getTaskItems();
|
||||
const buildingsInQueue = tasks
|
||||
.filter(t => t.name === UpgradeBuildingTask.name && t.args.villageId === villageId)
|
||||
|
@ -12,14 +12,18 @@ export function grabVillageList(): VillageList {
|
||||
return villageList;
|
||||
}
|
||||
|
||||
export function grabActiveVillageId(): number {
|
||||
export function grabActiveVillage(): Village | undefined {
|
||||
const villageList = grabVillageList();
|
||||
for (let village of villageList) {
|
||||
if (village.active) {
|
||||
return village.id;
|
||||
return village;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return undefined;
|
||||
}
|
||||
|
||||
export function grabActiveVillageId(): number {
|
||||
return grabActiveVillage()?.id || 0;
|
||||
}
|
||||
|
||||
function getVillageListItems() {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { TaskList } from './Storage/TaskQueue';
|
||||
import { uniqId } from './utils';
|
||||
import dateFormat = require('dateformat');
|
||||
import * as dateFormat from 'dateformat';
|
||||
|
||||
const ID = uniqId();
|
||||
|
||||
|
18
src/utils.ts
18
src/utils.ts
@ -1,7 +1,3 @@
|
||||
import { customAlphabet } from 'nanoid';
|
||||
|
||||
const smallIdGenerator = customAlphabet('1234567890abcdef', 6);
|
||||
|
||||
export function sleep(ms: number) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
@ -28,8 +24,20 @@ export async function waitForLoad() {
|
||||
return new Promise(resolve => jQuery(resolve));
|
||||
}
|
||||
|
||||
const ALPHABET = 'abcdefghijklmnopqrstuvwxyz1234567890';
|
||||
const ALPHABET_LENGTH = ALPHABET.length - 1;
|
||||
|
||||
function generateId(count: number): string {
|
||||
let str = '';
|
||||
for (let i = 0; i < count; ++i) {
|
||||
let symbolIndex = Math.floor(Math.random() * ALPHABET_LENGTH);
|
||||
str += ALPHABET[symbolIndex];
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
export function uniqId(): string {
|
||||
return 'id' + smallIdGenerator();
|
||||
return 'id' + generateId(6);
|
||||
}
|
||||
|
||||
export function timestamp(): number {
|
||||
|
4
src/vue-shims.d.ts
vendored
Normal file
4
src/vue-shims.d.ts
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
declare module '*.vue' {
|
||||
import Vue from 'vue';
|
||||
export default Vue;
|
||||
}
|
Reference in New Issue
Block a user