Browse Source

Update to Vue 3, split archive to own collection;

modals-to-spa
Nero Ignis 4 years ago
parent
commit
c7cf50ff6f
  1. 17
      css/app.css
  2. 361
      index.html
  3. 109
      js/app.js
  4. 11965
      js/vue.js

17
css/app.css

@ -7,10 +7,6 @@ body {
margin: 20px auto 20px auto; margin: 20px auto 20px auto;
} }
.add-button {
padding: 1px 5px 1px 5px;
}
.ticket-action-button { .ticket-action-button {
margin-top: 10px; margin-top: 10px;
padding: 1px 5px 1px 5px; padding: 1px 5px 1px 5px;
@ -25,7 +21,7 @@ body {
} }
.side-button-right { .side-button-right {
position: absolute; position: fixed;
right: 30px; right: 30px;
height: 60px; height: 60px;
@ -35,7 +31,7 @@ body {
} }
.add-tracker-button { .add-tracker-button {
position: absolute; position: fixed;
left: 30px; left: 30px;
bottom: 30px; bottom: 30px;
@ -51,17 +47,10 @@ body {
.second-button { .second-button {
bottom: 110px; bottom: 110px;
padding-left: 16px;
} }
.third-button { .third-button {
bottom: 190px; bottom: 190px;
padding-left: 16px;
}
.fourth-button {
bottom: 270px;
padding-left: 16px;
} }
.navbar-brand { .navbar-brand {
@ -106,7 +95,7 @@ nav, .card {
margin-bottom: 1px; margin-bottom: 1px;
} }
#showTrackedTicketsModal .showTrackedTicketsModalDialog, #showTicketsModal .showTicketsModalDialog,
#showArchivedTicketsModal .showArchivedTicketsModalDialog{ #showArchivedTicketsModal .showArchivedTicketsModalDialog{
max-width: 900px; max-width: 900px;
} }

361
index.html

@ -22,63 +22,63 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="row"> <div class="row">
<div class=" col-lg-4 col-md-6" <template v-for="ticket in tickets">
v-for="(ticket, ticketIndex) in trackedTickets" <div class="col-lg-4 col-md-6">
v-if="!ticket.archived"> <div class="card bg-gradient-secondary">
<div class="card bg-gradient-secondary"> <div class="card-body">
<div class="card-body"> <div class="card-text">
<div class="card-text"> <input type="text"
<input type="text" v-model="ticket.number"
v-model="ticket.number" class="form-control trackingNameField"
class="form-control trackingNameField" @keydown="updateStorage()"/>
@keydown="updateStorage()"/>
<div class="ticket-time-info"> <div class="ticket-time-info">
<div v-if="ticket.tracking === true"> <div v-if="ticket.tracking === true">
<div class="text-danger font-weight-bolder float-end"> <div class="text-danger font-weight-bolder float-end">
<div class="spinner-grow spinner-grow-sm" role="status"> <div class="spinner-grow spinner-grow-sm" role="status">
<span class="sr-only">Tracking...</span> <span class="sr-only">Tracking...</span>
</div>
Tracking
</div> </div>
Tracking
</div> </div>
</div> </div>
</div>
<div v-if="ticket.tracking === true" class="ticket-time-info"> <div v-if="ticket.tracking === true" class="ticket-time-info">
<span class="float-end">{{ getTrackingStartTime(ticket) }}</span> <span class="float-end">{{ getTrackingStartTime(ticket) }}</span>
<span v-if="ticket.tracking === true">Gestartet: </span> <span v-if="ticket.tracking === true">Gestartet: </span>
<br/> <br/>
<span class="float-end">{{ currentTrackingRunningFor(ticket) }}</span> <span class="float-end">{{ currentTrackingRunningFor(ticket) }}</span>
<span v-if="ticket.tracking === true">Läuft seit: </span> <span v-if="ticket.tracking === true">Läuft seit: </span>
</div> </div>
<div class="ticket-time-info"> <div class="ticket-time-info">
<span class="float-end">{{ getTotalTime(ticket) }}</span> <span class="float-end">{{ getTotalTime(ticket) }}</span>
<span class="current-ticket-info">Gesamt: </span> <span class="current-ticket-info">Gesamt: </span>
</div> </div>
<span class="float-end">{{ getTotalTimeToday(ticket) }}</span> <span class="float-end">{{ getTotalTimeToday(ticket) }}</span>
<span class="">Heute: </span> <span class="">Heute: </span>
<div class="row"> <div class="row">
<div class="col-md-12" v-if="ticket.tracking == false"> <div class="col-md-12" v-if="!ticket.tracking">
<button type="button" class="btn btn-info ticket-action-button" <button type="button" class="btn btn-info ticket-action-button"
@click="startTracking(ticket)"> @click="startTracking(ticket)">
<i class="far fa-play-circle"></i> <i class="far fa-play-circle"></i>
</button> </button>
</div> </div>
<div class="col-md-12" v-else> <div class="col-md-12" v-else>
<button type="button" class="btn btn-danger ticket-action-button" <button type="button" class="btn btn-danger ticket-action-button"
@click="stopTracking(ticket)"> @click="stopTracking(ticket)">
<i class="far fa-stop-circle"></i> <i class="far fa-stop-circle"></i>
</button> </button>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </template>
</div> </div>
</div> </div>
</div> </div>
@ -87,13 +87,13 @@
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</a> </a>
<a type="button" :class="'btn btn-primary side-button-right text-light ' + (archivedTrackers > 0 ? 'third-button' : 'second-button')" data-toggle="modal" <a type="button" :class="'btn btn-primary side-button-right text-light ' + (archive.length > 0 ? 'third-button' : 'second-button')" data-toggle="modal"
data-target="#showTrackedTicketsModal" v-if="activeTrackers > 0"> data-target="#showTicketsModal" v-if="tickets.length > 0">
<i class="fas fa-user-clock"></i> <i class="fas fa-user-clock"></i>
</a> </a>
<a type="button" :class="'btn btn-secondary side-button-right text-dark second-button'" data-toggle="modal" <a type="button" :class="'btn btn-secondary side-button-right text-dark second-button'" data-toggle="modal"
data-target="#showArchivedTicketsModal" v-if="archivedTrackers > 0"> data-target="#showArchivedTicketsModal" v-if="archive.length > 0">
<i class="fas fa-archive"></i> <i class="fas fa-archive"></i>
</a> </a>
@ -102,10 +102,10 @@
<i class="fas fa-sliders-h"></i> <i class="fas fa-sliders-h"></i>
</a> </a>
<div class="modal modal-fullscreen fade" id="showTrackedTicketsModal" tabindex="-1" role="dialog" <div class="modal modal-fullscreen fade" id="showTicketsModal" tabindex="-1" role="dialog"
aria-labelledby="showTrackedTicketsModalLabel" aria-labelledby="showTicketsModalLabel"
aria-hidden="true"> aria-hidden="true">
<div class="modal-dialog showTrackedTicketsModalDialog" role="document"> <div class="modal-dialog showTicketsModalDialog" role="document">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title"><i class="fas fa-user-clock"></i> Tracker</h5> <h5 class="modal-title"><i class="fas fa-user-clock"></i> Tracker</h5>
@ -113,66 +113,69 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-md-6" v-for="(ticket, ticketIndex) in trackedTickets" v-if="!ticket.archived"> <template v-for="(ticket, ticketIndex) in tickets">
<h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6> <div class="col-md-6">
<h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6>
<div class="form-group"> <div class="form-group">
<input type="text" class="form-control" v-model="ticket.description" @keydown="updateStorage()" placeholder="Beschreibung"> <input type="text" class="form-control" v-model="ticket.description" @keydown="updateStorage()" placeholder="Beschreibung">
</div>
<span>Gesamtzeit: {{ getTotalTime(ticket) }}</span>
<br>
<div class="row">
<div class="col-md-3">
<button class="btn btn-success ticket-action-button"
@click="bookTimeManually(ticket, 30)">
+ ½h
</button>
</div>
<div class="col-md-3">
<button class="btn btn-success ticket-action-button"
@click="bookTimeManually(ticket, 60)">
+ 1h
</button>
</div> </div>
<div class="col-md-3">
<button class="btn btn-warning ticket-action-button" <span v-if="getTotalTime(ticket) > 0">Gesamtzeit: {{ getTotalTime(ticket) }}</span>
@click="bookTimeManually(ticket, -30)"> <br>
- ½h <div class="row">
</button> <div class="col-md-3">
</div> <button class="btn btn-success ticket-action-button"
<div class="col-md-3"> @click="bookTimeManually(ticket, 30)">
<button class="btn btn-warning ticket-action-button" + ½h
@click="bookTimeManually(ticket, -60)"> </button>
- 1h </div>
</button> <div class="col-md-3">
</div> <button class="btn btn-success ticket-action-button"
<div class="col"> @click="bookTimeManually(ticket, 60)">
<button class="btn btn-secondary ticket-action-button" data-bs-dismiss="modal" + 1h
@click="archiveTicket(ticket)" title="Archivieren"> </button>
<i class="fas fa-archive"></i> </div>
</button> <div class="col-md-3">
</div> <button class="btn btn-warning ticket-action-button"
<div class="col" v-if="ticket.history.length > 0"> @click="bookTimeManually(ticket, -30)">
<button class="btn btn-info ticket-action-button" data-bs-dismiss="modal" - ½h
@click="showHistoryForTicket(ticket)" title="History"> </button>
<i class="fas fa-history"></i> </div>
</button> <div class="col-md-3">
</div> <button class="btn btn-warning ticket-action-button"
<div class="col"> @click="bookTimeManually(ticket, -60)">
<button class="btn btn-danger ticket-action-button" - 1h
@click="deleteTicket(ticket)" title="Löschen"> </button>
<i class="fas fa-trash"></i> </div>
</button> <div class="col">
</div> <button class="btn btn-secondary ticket-action-button" data-bs-dismiss="modal"
<div class="col" v-if="ticketSystemUrl"> @click="archiveTicket(ticketIndex)" title="Archivieren">
<a v-if="isTicketNumber(ticket.number)" :href="ticketSystemUrl + ticket.number" <i class="fas fa-archive"></i>
target="_blank" class="btn btn-dark ticket-action-button" title="Ticket"> </button>
<i class="fas fa-external-link-square-alt"></i> </div>
</a> <div class="col" v-if="ticket.history.length > 0">
<button class="btn btn-info ticket-action-button" data-bs-dismiss="modal"
@click="showHistoryForTicket(ticket)" title="History">
<i class="fas fa-history"></i>
</button>
</div>
<div class="col">
<button class="btn btn-danger ticket-action-button"
@click="deleteTicket(ticket)" title="Löschen">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="col" v-if="ticketSystemUrl">
<a v-if="isTicketNumber(ticket.number)" :href="ticketSystemUrl + ticket.number"
target="_blank" class="btn btn-dark ticket-action-button" title="Ticket">
<i class="fas fa-external-link-square-alt"></i>
</a>
</div>
</div> </div>
<br/>
</div> </div>
</div> </template>
</div> </div>
</div> </div>
</div> </div>
@ -190,40 +193,43 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row"> <div class="row">
<div class="col-md-6" v-for="(ticket, ticketIndex) in trackedTickets" v-if="ticket.archived"> <template v-for="(ticket, ticketIndex) in archive">
<h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6> <div class="col-md-6">
<div v-if="ticket.description"> <h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6>
<p class="blockquote">{{ ticket.description }}</p> <div v-if="ticket.description">
</div> <p class="blockquote">{{ ticket.description }}</p>
<span>Gesamtzeit: {{ getTotalTime(ticket) }}</span>
<br>
<div class="col-md-12 row">
<div class="col">
<button class="btn btn-success ticket-action-button" data-bs-dismiss="modal"
@click="reactivateTicket(ticket)" title="Reaktivieren">
<i class="fas fa-power-off"></i>
</button>
</div>
<div class="col" v-if="ticket.history.length > 0">
<button class="btn btn-info ticket-action-button" data-bs-dismiss="modal"
@click="showHistoryForTicket(ticket)" title="History">
<i class="fas fa-history"></i>
</button>
</div> </div>
<div class="col"> <span v-if="getTotalTime(ticket) > 0">Gesamtzeit: {{ getTotalTime(ticket) }}</span>
<button class="btn btn-danger ticket-action-button" <br>
@click="deleteTicket(ticket)" title="Löschen"> <div class="col-md-12 row">
<i class="fas fa-trash"></i> <div class="col">
</button> <button class="btn btn-success ticket-action-button" data-bs-dismiss="modal"
</div> @click="reactivateTicket(ticketIndex)" title="Reaktivieren">
<div class="col" v-if="ticketSystemUrl"> <i class="fas fa-power-off"></i>
<a v-if="isTicketNumber(ticket.number)" :href="ticketSystemUrl + ticket.number" </button>
target="_blank" class="btn btn-dark ticket-action-button" title="Ticket"> </div>
<i class="fas fa-external-link-square-alt"></i> <div class="col" v-if="ticket.history.length > 0">
</a> <button class="btn btn-info ticket-action-button" data-bs-dismiss="modal"
@click="showHistoryForTicket(ticket)" title="History">
<i class="fas fa-history"></i>
</button>
</div>
<div class="col">
<button class="btn btn-danger ticket-action-button"
@click="deleteTicket(ticket)" title="Löschen">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="col" v-if="ticketSystemUrl">
<a v-if="isTicketNumber(ticket.number)" :href="ticketSystemUrl + ticket.number"
target="_blank" class="btn btn-dark ticket-action-button" title="Ticket">
<i class="fas fa-external-link-square-alt"></i>
</a>
</div>
</div> </div>
<br/>
</div> </div>
</div> </template>
</div> </div>
</div> </div>
</div> </div>
@ -309,60 +315,63 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<ul class="list-group ticket-history"> <ul class="list-group ticket-history">
<li class="list-group-item" v-for="(tracker, historyIndex) in selectedTicket.history" v-if="!tracker.manually"> <template v-for="(tracker, historyIndex) in selectedTicket.history">
<div> <li class="list-group-item" v-if="!tracker.manually">
<div class="float-end" :title="exactTimestamp(tracker.trackingStarted)"> <div>
{{ formattedDate(tracker.trackingStarted) }} <div class="float-end" :title="exactTimestamp(tracker.trackingStarted)">
{{ formattedDate(tracker.trackingStarted) }}
</div>
Start:
</div> </div>
Start: <div>
</div> <div class="float-end" :title="exactTimestamp(tracker.trackingStopped)">
<div> {{ formattedDate(tracker.trackingStopped) }}
<div class="float-end" :title="exactTimestamp(tracker.trackingStopped)"> </div>
{{ formattedDate(tracker.trackingStopped) }} Ende:
</div> </div>
Ende: <div>
</div> <div class="float-end">
<div> {{ timeWithPostFix(tracker.minutes) }}
<div class="float-end"> </div>
{{ timeWithPostFix(tracker.minutes) }} Zeit:
</div> </div>
Zeit: <a href="javascript:" @click="deleteHistoryEntry(null, historyIndex)" class="float-end">
</div> <i class="fas fa-trash"></i>
<a href="javascript:" @click="deleteHistoryEntry(null, historyIndex)" class="float-end"> </a>
<i class="fas fa-trash"></i> <br/>
</a> </li>
<br/> </template>
</li> <template v-for="(tracker, historyIndex) in selectedTicket.history">
<li class="list-group-item bg-light" v-for="(tracker, historyIndex) in selectedTicket.history" <li class="list-group-item bg-light"
v-if="tracker.manually && tracker.manually == true"> v-if="tracker.manually">
<div> <div>
<div class="float-end" :title="exactTimestamp(tracker.trackingStarted)"> <div class="float-end" :title="exactTimestamp(tracker.trackingStarted)">
{{ formattedDate(tracker.trackingStarted) }} {{ formattedDate(tracker.trackingStarted) }}
</div>
Manuell erfasst am:
</div> </div>
Manuell erfasst am: <div>
</div> <div class="float-end">
<div> {{ timeWithPostFix(tracker.minutes) }}
<div class="float-end"> </div>
{{ timeWithPostFix(tracker.minutes) }} Zeit:
</div> </div>
Zeit: <a href="javascript:" @click="deleteHistoryEntry(ticketIndex, historyIndex)" class="float-end">
</div> <i class="fas fa-trash"></i>
<a href="javascript:" @click="deleteHistoryEntry(ticketIndex, historyIndex)" class="float-end"> </a>
<i class="fas fa-trash"></i> <br/>
</a> </li>
<br/> </template>
</li>
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script src="https://kit.fontawesome.com/b54a4cceff.js" crossorigin="anonymous"></script> <script src="https://kit.fontawesome.com/b54a4cceff.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment-with-locales.min.js"></script>
<script src="js/vue.js"></script> <script src="https://unpkg.com/vue@next"></script>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"></script> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>

109
js/app.js

@ -1,17 +1,19 @@
let tab = new Vue({ const TimeTrack = {
el: '#root', data() {
data: { return {
theme: 'quartz', theme: 'quartz',
themes: null, themes: null,
dashboardLogo: 'img/logo.png', dashboardLogo: 'img/logo.png',
ticketSystemUrl: '', ticketSystemUrl: '',
showPT: true, showPT: true,
linkTarget: '_blank', linkTarget: '_blank',
inputs: { inputs: {
importJson: '' importJson: ''
}, },
trackedTickets: [], tickets: [],
selectedTicket: null archive: [],
selectedTicket: null
}
}, },
mounted() { mounted() {
let vue = this; let vue = this;
@ -26,8 +28,11 @@ let tab = new Vue({
}, },
methods: { methods: {
loadStorage() { loadStorage() {
let storedTrackedTickets = JSON.parse(localStorage.getItem('trackedTickets')); let storedTickets = JSON.parse(localStorage.getItem('tickets'));
this.trackedTickets = storedTrackedTickets == null ? [] : storedTrackedTickets; this.tickets = storedTickets == null ? [] : storedTickets;
let storedArchive = JSON.parse(localStorage.getItem('archive'));
this.archive = storedArchive == null ? [] : storedArchive;
let storedticketSystemUrl = localStorage.getItem('ticketSystemUrl'); let storedticketSystemUrl = localStorage.getItem('ticketSystemUrl');
this.ticketSystemUrl = storedticketSystemUrl == null ? '' : storedticketSystemUrl; this.ticketSystemUrl = storedticketSystemUrl == null ? '' : storedticketSystemUrl;
@ -39,17 +44,19 @@ let tab = new Vue({
this.theme = storedTheme == null ? 'materia' : storedTheme; this.theme = storedTheme == null ? 'materia' : storedTheme;
}, },
updateStorage() { updateStorage() {
localStorage.setItem('trackedTickets', JSON.stringify(this.trackedTickets)); localStorage.setItem('tickets', JSON.stringify(this.tickets));
localStorage.setItem('archive', JSON.stringify(this.archive));
localStorage.setItem('ticketSystemUrl', this.ticketSystemUrl); localStorage.setItem('ticketSystemUrl', this.ticketSystemUrl);
localStorage.setItem('showPT', this.showPT); localStorage.setItem('showPT', this.showPT);
localStorage.setItem('theme', this.theme); localStorage.setItem('theme', this.theme);
this.$forceUpdate();
}, },
resetToDefault() { resetToDefault() {
this.updateStorage(); this.updateStorage();
}, },
addTrackedTicket() { addTrackedTicket() {
let newTicket = { let newTicket = {
archived: false,
tracking: false, tracking: false,
number: '#', number: '#',
trackingStarted: null, trackingStarted: null,
@ -57,7 +64,7 @@ let tab = new Vue({
history: [] history: []
}; };
this.trackedTickets.push(newTicket); this.tickets.push(newTicket);
this.updateStorage(); this.updateStorage();
}, },
startTracking(ticket) { startTracking(ticket) {
@ -153,7 +160,7 @@ let tab = new Vue({
stopTrackingTicket() { stopTrackingTicket() {
let vue = this; let vue = this;
vue.trackedTickets.forEach(function (ticket) { vue.tickets.forEach(function (ticket) {
if (ticket.tracking === true) { if (ticket.tracking === true) {
vue.stopTracking(ticket); vue.stopTracking(ticket);
} }
@ -166,24 +173,26 @@ let tab = new Vue({
return number.indexOf('#') >= 0; return number.indexOf('#') >= 0;
}, },
deleteTicket(index) { deleteTicket(index) {
this.trackedTickets.splice(index, 1); this.tickets.splice(index, 1);
this.updateStorage(); this.updateStorage();
}, },
archiveTicket(ticket) { archiveTicket(index) {
ticket.archived = true; if (this.tickets[index].tracking) {
if (ticket.tracking) {
this.stopTrackingTicket(); this.stopTrackingTicket();
} }
this.archive.push(this.tickets[index]);
this.tickets.splice(index, 1);
this.updateStorage(); this.updateStorage();
this.$forceUpdate();
}, },
reactivateTicket(ticket) { reactivateTicket(index) {
ticket.archived = false; this.tickets.push(this.archive[index]);
this.archive.splice(index, 1);
this.updateStorage(); this.updateStorage();
}, },
deleteHistoryEntry(ticketIndex, historyIndex) { deleteHistoryEntry(ticketIndex, historyIndex) {
if (ticketIndex) { if (ticketIndex) {
this.trackedTickets[ticketIndex].history.splice(historyIndex, 1); this.tickets[ticketIndex].history.splice(historyIndex, 1);
} else { } else {
this.selectedTicket.history.splice(historyIndex, 1); this.selectedTicket.history.splice(historyIndex, 1);
} }
@ -202,7 +211,8 @@ let tab = new Vue({
importData() { importData() {
let json = JSON.parse(this.inputs.importJson); let json = JSON.parse(this.inputs.importJson);
this.trackedTickets = json.trackedTickets; this.tickets = json.tickets;
this.archive = json.archive;
this.ticketSystemUrl = json.ticketSystemUrl; this.ticketSystemUrl = json.ticketSystemUrl;
this.showPT = json.showPT; this.showPT = json.showPT;
this.theme = json.theme; this.theme = json.theme;
@ -237,6 +247,19 @@ let tab = new Vue({
let historyModal = new bootstrap.Modal(document.getElementById('historyModal')); let historyModal = new bootstrap.Modal(document.getElementById('historyModal'));
historyModal.toggle(); historyModal.toggle();
}, 50) }, 50)
},
collectDataForDay() {
let collection = [];
this.tickets.forEach((ticket) => {
ticket.history.forEach((historyEntry) => {
if (moment(historyEntry.trackingStarted).format("MMM Do YY") === moment().format("MMM Do YY")) {
collection.push(historyEntry);
}
});
});
return collection;
} }
}, },
watch: { watch: {
@ -252,33 +275,13 @@ let tab = new Vue({
computed: { computed: {
exportJson() { exportJson() {
return JSON.stringify({ return JSON.stringify({
trackedTickets: this.trackedTickets, tickets: this.tickets,
ticketSystemUrl: this.ticketSystemUrl, ticketSystemUrl: this.ticketSystemUrl,
showPT: this.showPT, showPT: this.showPT,
theme: this.theme theme: this.theme
}); });
},
archivedTrackers() {
let vue = this;
let count = 0;
this.trackedTickets.forEach((ticket) => {
count += (ticket.archived ? 1 : 0);
})
return count;
},
activeTrackers() {
let vue = this;
let count = 0;
this.trackedTickets.forEach((ticket) => {
count += (ticket.archived ? 0 : 1);
})
return count;
} }
},
created() {
} }
}); };
Vue.createApp(TimeTrack).mount('#root');

11965
js/vue.js

File diff suppressed because it is too large Load Diff