|
|
|
@ -15,12 +15,28 @@
@@ -15,12 +15,28 @@
|
|
|
|
|
|
|
|
|
|
<body> |
|
|
|
|
<div id="root"> |
|
|
|
|
<!-- Tracker-Display --> |
|
|
|
|
<div class="container" id="content"> |
|
|
|
|
<link rel="stylesheet" :href="'https://bootswatch.com/5/' + theme + '/bootstrap.min.css'"> |
|
|
|
|
<link rel="stylesheet" href="css/app.css"> |
|
|
|
|
|
|
|
|
|
<!-- Content --> |
|
|
|
|
<div class="container" id="content"> |
|
|
|
|
<div id="trackers" class="row" v-if="view === 'trackers'"> |
|
|
|
|
<!-- <nav class="navbar navbar-expand-lg navbar-light bg-light">--> |
|
|
|
|
<!-- <a class="navbar-brand">--> |
|
|
|
|
<!-- <img :src="dashboardLogo" alt="logo" class="logo-nav float-end" v-if="dashboardLogo"/>--> |
|
|
|
|
<!-- <div v-if="experimental.trackWorktime">--> |
|
|
|
|
<!-- <template v-if="worktimeTracker.tracking">--> |
|
|
|
|
<!-- <i class="far fa-pause-circle"></i>--> |
|
|
|
|
<!-- <i class="far fa-stop-circle" @click="stopTracking(worktimeTracker)"></i>--> |
|
|
|
|
<!-- </template>--> |
|
|
|
|
<!-- <template v-else>--> |
|
|
|
|
<!-- <a href="javascript:" @click="startTracking(worktimeTracker)">--> |
|
|
|
|
<!-- <i class="far fa-play-circle"></i>--> |
|
|
|
|
<!-- </a>--> |
|
|
|
|
<!-- </template>--> |
|
|
|
|
<!-- </div>--> |
|
|
|
|
<!-- <h5 class="brand-title">Timetrack</h5>--> |
|
|
|
|
<!-- </a>--> |
|
|
|
|
<!-- </nav>--> |
|
|
|
|
<div class="row" v-if="!experimental.boardView || view === 'trackers'"> |
|
|
|
|
<div class="col-md-12"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<template v-for="(ticket, ticketIndex) in tickets"> |
|
|
|
@ -62,30 +78,38 @@
@@ -62,30 +78,38 @@
|
|
|
|
|
<span class="">Heute: </span> |
|
|
|
|
|
|
|
|
|
<div class="row"> |
|
|
|
|
<div class="col-md-12" v-if="!ticket.tracking"> |
|
|
|
|
<button type="button" class="btn btn-info ticket-action-button" |
|
|
|
|
<div class="col-md-6" v-if="!ticket.tracking"> |
|
|
|
|
<button type="button" class="btn btn-primary ticket-action-button" |
|
|
|
|
@click="startTracking(ticket)"> |
|
|
|
|
<i class="far fa-play-circle"></i> |
|
|
|
|
<i class="far fa-play-circle"></i> <small>Starten</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="col-md-12" v-else> |
|
|
|
|
<div class="col-md-6" v-else> |
|
|
|
|
<button type="button" class="btn btn-danger ticket-action-button" |
|
|
|
|
@click="stopTracking(ticket)"> |
|
|
|
|
<i class="far fa-stop-circle"></i> |
|
|
|
|
<i class="far fa-stop-circle"></i> <small>Stoppen</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="col-6"> |
|
|
|
|
<button class="btn btn-secondary ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
<button class="btn btn-warning ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
@click="archiveTracker(ticketIndex)" title="Archivieren"> |
|
|
|
|
<i class="fas fa-archive"></i> |
|
|
|
|
<i class="fas fa-archive"></i> <small>Archivieren</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
<button type="button" class="btn btn-info ticket-action-button" |
|
|
|
|
@click="openTasksForTracker(ticket)" title="Tasks"> |
|
|
|
|
<i class="fas fa-clipboard-check"></i> <small>Tasks {{ showOpenTasksForTracker(ticket.tasks) }}</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="col-6"> |
|
|
|
|
<button class="btn btn-danger ticket-action-button" |
|
|
|
|
@click="deleteTracker(ticketIndex)" title="Löschen"> |
|
|
|
|
<i class="fas fa-trash"></i> |
|
|
|
|
<i class="fas fa-trash"></i> <small>Löschen</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
@ -153,20 +177,20 @@
@@ -153,20 +177,20 @@
|
|
|
|
|
<div class="col-md-12" v-if="ticket.tracking"> |
|
|
|
|
<button type="button" class="btn btn-danger ticket-action-button" |
|
|
|
|
@click="stopTracking(ticket)"> |
|
|
|
|
<i class="far fa-stop-circle"></i> |
|
|
|
|
<i class="far fa-stop-circle"></i> <small>Stoppen</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col-md-12" v-if="!ticket.tracking && ticket.timeBoxMinutes && timeBoxTimeLeft(ticket) > 0"> |
|
|
|
|
<button type="button" class="btn btn-info ticket-action-button" |
|
|
|
|
<button type="button" class="btn btn-primary ticket-action-button" |
|
|
|
|
@click="startTracking(ticket)"> |
|
|
|
|
<i class="far fa-play-circle"></i> |
|
|
|
|
<i class="far fa-play-circle"></i> <small>Starten</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="col-md-12"> |
|
|
|
|
<button class="btn btn-danger ticket-action-button" |
|
|
|
|
@click="deleteTracker(ticketIndex)" title="Löschen"> |
|
|
|
|
<i class="fas fa-trash"></i> |
|
|
|
|
<i class="fas fa-trash"></i> <small>Löschen</small> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
@ -179,9 +203,7 @@
@@ -179,9 +203,7 @@
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Board View--> |
|
|
|
|
<div id="board" class="col row" v-if="view === 'board'"> |
|
|
|
|
<div class="row" v-if="experimental.boardView && view === 'board'" id="board-view"> |
|
|
|
|
<div class="col-4 col-board-inner"> |
|
|
|
|
<h5>Todo</h5> |
|
|
|
|
<template v-for="(ticket, ticketIndex) in tickets"> |
|
|
|
@ -241,7 +263,7 @@
@@ -241,7 +263,7 @@
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="col-md-12"> |
|
|
|
|
<button class="btn btn-secondary ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
<button class="btn btn-warning ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
@click="archiveTracker(ticketIndex)" title="Archivieren"> |
|
|
|
|
<i class="fas fa-archive"></i> |
|
|
|
|
</button> |
|
|
|
@ -306,7 +328,7 @@
@@ -306,7 +328,7 @@
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="col-md-12"> |
|
|
|
|
<button class="btn btn-secondary ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
<button class="btn btn-warning ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
@click="archiveTracker(ticketIndex)" title="Archivieren"> |
|
|
|
|
<i class="fas fa-archive"></i> |
|
|
|
|
</button> |
|
|
|
@ -318,12 +340,26 @@
@@ -318,12 +340,26 @@
|
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<!-- Trackers-Detail --> |
|
|
|
|
<!-- TODO: Merge to main Trackers-page --> |
|
|
|
|
<div id="trackersDetail" class="col-md-auto row" v-if="view === 'trackersDetail'"> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Tickets Modal --> |
|
|
|
|
<div class="modal modal-fullscreen fade" id="showTicketsModal" tabindex="-1" role="dialog" |
|
|
|
|
aria-labelledby="showTicketsModalLabel" |
|
|
|
|
aria-hidden="true"> |
|
|
|
|
<div class="modal-dialog showTicketsModalDialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-clock"></i> Tracker</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<template v-for="(ticket, ticketIndex) in tickets"> |
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
<h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6> |
|
|
|
|
<!-- <h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6>--> |
|
|
|
|
<div class="form-group"> |
|
|
|
|
<input type="text" class="form-control" v-model="ticket.number" @keydown="updateStorage()" placeholder="Name"> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="form-group"> |
|
|
|
|
<input type="text" class="form-control" v-model="ticket.description" @keydown="updateStorage()" placeholder="Beschreibung"> |
|
|
|
@ -340,17 +376,29 @@
@@ -340,17 +376,29 @@
|
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col"> |
|
|
|
|
<button class="btn btn-secondary ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
<button class="btn btn-warning ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
@click="archiveTracker(ticketIndex)" title="Archivieren"> |
|
|
|
|
<i class="fas fa-archive"></i> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col" v-if="ticket.tasks && ticket.tasks.length > 0"> |
|
|
|
|
<button class="btn btn-info ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
@click="openTasksForTracker(ticket)" title="Tasks"> |
|
|
|
|
<i class="fas fa-clipboard-check"></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="showHistoryForTracker(ticket)" title="History"> |
|
|
|
|
<i class="fas fa-history"></i> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col" v-if="ticket.history.length > 0 && this.ticketSystemUrl"> |
|
|
|
|
<button class="btn btn-white ticket-action-button" |
|
|
|
|
@click="sendLastBookingToTicketSystem(ticket)" title="Letzte Buchung in Ticketsystem eintragen"> |
|
|
|
|
<img :src="ticketSystemIcon" class="ticket-icon"/> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col"> |
|
|
|
|
<button class="btn btn-danger ticket-action-button" |
|
|
|
|
@click="deleteTracker(ticketIndex)" title="Löschen"> |
|
|
|
@ -368,19 +416,103 @@
@@ -368,19 +416,103 @@
|
|
|
|
|
</div> |
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
<!-- Archive --> |
|
|
|
|
<div id="archive" class="col-md-auto row" v-if="view === 'archive'"> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Tasks Modal --> |
|
|
|
|
<div class="modal modal-fullscreen fade" |
|
|
|
|
v-if="selectedTracker" |
|
|
|
|
id="trackerTasksModal" |
|
|
|
|
tabindex="-1" |
|
|
|
|
role="dialog" |
|
|
|
|
aria-labelledby="showTrackerTasksModal" |
|
|
|
|
aria-hidden="true"> |
|
|
|
|
<div class="modal-dialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-clock"></i> Tasks für {{ selectedTracker.number }}</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<div class="form-group"> |
|
|
|
|
<input type="text" id="newTaskInput" class="form-control" |
|
|
|
|
v-model="newTaskInput" placeholder="Neuer Task" v-on:keyup.enter="addTask()"/> |
|
|
|
|
</div> |
|
|
|
|
<ul class="list-group" v-if="selectedTracker.tasks && selectedTracker.tasks.length > 0"> |
|
|
|
|
<template v-for="(task, taskIndex) in selectedTracker.tasks"> |
|
|
|
|
<li class="list-group-item" v-if="!task.done"> |
|
|
|
|
<span class="float-end"> |
|
|
|
|
<a href="javascript:"> |
|
|
|
|
<i class="fas fa-trash" @click="deleteTask(taskIndex)"></i> |
|
|
|
|
</a> |
|
|
|
|
</span> |
|
|
|
|
<a href="javascript:" @click="toggleTask(task)"> |
|
|
|
|
<i class="far fa-square"></i> |
|
|
|
|
</a> {{ task.name }} |
|
|
|
|
<div class="form-group"> |
|
|
|
|
<div class="float-end"> |
|
|
|
|
{{ task.percentDone }}% erledigt |
|
|
|
|
</div> |
|
|
|
|
<input type="range" |
|
|
|
|
class="range range-success range-tasks" |
|
|
|
|
min="0" |
|
|
|
|
max="100" |
|
|
|
|
step="5" |
|
|
|
|
v-model="task.percentDone" |
|
|
|
|
@change="checkForCompletionOfTask(task)"> |
|
|
|
|
</div> |
|
|
|
|
</li> |
|
|
|
|
</template> |
|
|
|
|
</ul> |
|
|
|
|
<br/> |
|
|
|
|
<ul class="list-group" v-if="selectedTracker.tasks && selectedTracker.tasks.length > 0"> |
|
|
|
|
<template v-for="(task, taskIndex) in selectedTracker.tasks"> |
|
|
|
|
<li class="list-group-item" v-if="task.done"> |
|
|
|
|
<span class="float-end"> |
|
|
|
|
<a href="javascript:"> |
|
|
|
|
<i class="fas fa-trash" @click="deleteTask(taskIndex)"></i> |
|
|
|
|
</a> |
|
|
|
|
</span> |
|
|
|
|
<a href="javascript:" @click="toggleTask(task)"> |
|
|
|
|
<i class="far fa-check-square"></i> |
|
|
|
|
</a> <span class="finished-task">{{ task.name }}</span> |
|
|
|
|
</li> |
|
|
|
|
</template> |
|
|
|
|
</ul> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Archive Modal --> |
|
|
|
|
<div class="modal modal-fullscreen fade" id="showArchivedTicketsModal" tabindex="-1" role="dialog" |
|
|
|
|
aria-labelledby="showArchivedTicketsModalLabel" |
|
|
|
|
aria-hidden="true"> |
|
|
|
|
<div class="modal-dialog showArchivedTicketsModalDialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-archive"></i> Archivierte Tracker</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<div class="col-sm-6"></div> |
|
|
|
|
<div class="col-sm-6"> |
|
|
|
|
<i class="fas fa-search"></i> |
|
|
|
|
<input @keydown="$forceUpdate()" type="text" class="form-control search-field float-right" v-model="searchQuery" placeholder="Suche.."> |
|
|
|
|
</div> |
|
|
|
|
<div class="col-sm-6"></div> |
|
|
|
|
<template v-for="(ticket, ticketIndex) in archive"> |
|
|
|
|
<div class="col-md-6" v-if="searchQuery === '' || ticket.number.search(searchQuery) >= 0 || (ticket.description && ticket.description.search(searchQuery)) >= 0"> |
|
|
|
|
<h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6> |
|
|
|
|
<div v-if="ticket.description"> |
|
|
|
|
<p class="fst-italic">{{ ticket.description }}</p> |
|
|
|
|
<div class="form-group"> |
|
|
|
|
<input type="text" class="form-control" v-model="ticket.number" @keydown="updateStorage()" placeholder="Name"> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="form-group"> |
|
|
|
|
<input type="text" class="form-control" v-model="ticket.description" @keydown="updateStorage()" placeholder="Beschreibung"> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<div class="ticket-time-info"> |
|
|
|
|
<span class="float-end">{{ getTotalTime(ticket) }}</span> |
|
|
|
|
<span class="current-ticket-info">Gesamt: </span> |
|
|
|
@ -397,12 +529,24 @@
@@ -397,12 +529,24 @@
|
|
|
|
|
<i class="fas fa-power-off"></i> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col" v-if="ticket.tasks && ticket.tasks.length > 0"> |
|
|
|
|
<button class="btn btn-info ticket-action-button" data-bs-dismiss="modal" |
|
|
|
|
@click="openTasksForTracker(ticket)" title="Tasks"> |
|
|
|
|
<i class="fas fa-clipboard-check"></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="showHistoryForTracker(ticket)" title="History"> |
|
|
|
|
<i class="fas fa-history"></i> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col" v-if="ticket.history.length > 0 && this.ticketSystemUrl"> |
|
|
|
|
<button class="btn btn-white ticket-action-button" |
|
|
|
|
@click="sendLastBookingToTicketSystem(ticket)" title="Letzte Buchung in Ticketsystem eintragen"> |
|
|
|
|
<img :src="ticketSystemIcon" class="ticket-icon"/> |
|
|
|
|
</button> |
|
|
|
|
</div> |
|
|
|
|
<div class="col"> |
|
|
|
|
<button class="btn btn-danger ticket-action-button" |
|
|
|
|
@click="deleteTracker(ticketIndex, true)" title="Löschen"> |
|
|
|
@ -420,8 +564,21 @@
@@ -420,8 +564,21 @@
|
|
|
|
|
</div> |
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
<!-- Settings --> |
|
|
|
|
<div id="settings" class="col-md-auto row" v-if="view === 'settings'"> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Settings Modal --> |
|
|
|
|
<div class="modal fade" id="settingsModal" tabindex="-1" role="dialog" aria-labelledby="settingsModalLabel" |
|
|
|
|
aria-hidden="true"> |
|
|
|
|
<div class="modal-dialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-sliders-h"></i> Einstellungen</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body row"> |
|
|
|
|
<div class="col-md-6"> |
|
|
|
|
<h5>Allgemeine Einstellungen</h5> |
|
|
|
|
<div class="form-group"> |
|
|
|
@ -498,8 +655,88 @@
@@ -498,8 +655,88 @@
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<!-- Custom Booking--> |
|
|
|
|
<div id="customBooking" class="col-md-auto row" v-if="view === 'customBooking' && selectedTracker"> |
|
|
|
|
<div class="modal-footer"> |
|
|
|
|
<button class="btn btn-primary" v-on:click="updateStorage()" data-bs-dismiss="modal">Speichern</button> |
|
|
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Schließen</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- History Modal --> |
|
|
|
|
<div class="modal fade" id="historyModal" tabindex="-1" role="dialog" aria-labelledby="historyModalLabel" |
|
|
|
|
aria-hidden="true" v-if="selectedTracker"> |
|
|
|
|
<div class="modal-dialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-history"></i> History von {{ selectedTracker.number }}</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<ul class="list-group ticket-history"> |
|
|
|
|
<template v-for="(tracker, historyIndex) in selectedTracker.history"> |
|
|
|
|
<li class="list-group-item" v-if="!tracker.manually"> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end" :title="exactTimestamp(tracker.trackingStarted)"> |
|
|
|
|
{{ formattedDate(tracker.trackingStarted) }} |
|
|
|
|
</div> |
|
|
|
|
Start: |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end" :title="exactTimestamp(tracker.trackingStopped)"> |
|
|
|
|
{{ formattedDate(tracker.trackingStopped) }} |
|
|
|
|
</div> |
|
|
|
|
Ende: |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end"> |
|
|
|
|
{{ timeWithPostFix(tracker.minutes) }} |
|
|
|
|
</div> |
|
|
|
|
Zeit: |
|
|
|
|
</div> |
|
|
|
|
<a href="javascript:" @click="deleteHistoryEntry(null, historyIndex)" class="float-end"> |
|
|
|
|
<i class="fas fa-trash"></i> |
|
|
|
|
</a> |
|
|
|
|
<br/> |
|
|
|
|
</li> |
|
|
|
|
</template> |
|
|
|
|
<template v-for="(tracker, historyIndex) in selectedTracker.history"> |
|
|
|
|
<li class="list-group-item bg-light" |
|
|
|
|
v-if="tracker.manually"> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end" :title="exactTimestamp(tracker.trackingStarted)"> |
|
|
|
|
{{ formattedDate(tracker.trackingStarted) }} |
|
|
|
|
</div> |
|
|
|
|
Manuell erfasst am: |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end"> |
|
|
|
|
{{ timeWithPostFix(tracker.minutes) }} |
|
|
|
|
</div> |
|
|
|
|
Zeit: |
|
|
|
|
</div> |
|
|
|
|
<a href="javascript:" @click="deleteHistoryEntry(ticketIndex, historyIndex)" class="float-end"> |
|
|
|
|
<i class="fas fa-trash"></i> |
|
|
|
|
</a> |
|
|
|
|
<br/> |
|
|
|
|
</li> |
|
|
|
|
</template> |
|
|
|
|
</ul> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Custom Booking Modal --> |
|
|
|
|
<div class="modal fade" id="customBookingModal" tabindex="-1" role="dialog" aria-labelledby="customBookingModalLabel" |
|
|
|
|
aria-hidden="true" v-if="selectedTracker"> |
|
|
|
|
<div class="modal-dialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-user-edit"></i> Buchung für {{selectedTracker.number}}</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<div class="form-group"> |
|
|
|
|
<label>Zeit in Minuten:</label> |
|
|
|
|
<input type="text" class="form-control" v-model="customBookingValue"> |
|
|
|
@ -513,8 +750,21 @@
@@ -513,8 +750,21 @@
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<!-- Switcher --> |
|
|
|
|
<div id="switcher" class="col-md-auto row" v-if="view === 'switcher'"> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Switcher Modal --> |
|
|
|
|
<div class="modal fade" id="switcherModal" tabindex="-1" role="dialog" aria-labelledby="switcherModalLabel" |
|
|
|
|
aria-hidden="true" v-if="experimental.portalSwitcher"> |
|
|
|
|
<div class="modal-dialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-random"></i> Portal Switcher</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<div class="col-12"> |
|
|
|
|
<div class="form-group"> |
|
|
|
|
<label class="text-muted">Portalname:</label> |
|
|
|
@ -548,8 +798,22 @@
@@ -548,8 +798,22 @@
|
|
|
|
|
</div> |
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
<!-- Past Days--> |
|
|
|
|
<div id="pastDays" class="col-md-auto row" v-if="view === 'pastDays'"> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- Past Days Modal --> |
|
|
|
|
<div class="modal fade" id="pastDaysModal" tabindex="-1" role="dialog" aria-labelledby="pastDaysModalLabel" |
|
|
|
|
aria-hidden="true"> |
|
|
|
|
<div class="modal-dialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-random"></i> Buchungsverlauf</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<div class="col-12"> |
|
|
|
|
<div class="form-group"> |
|
|
|
|
<div class="form-group"> |
|
|
|
@ -565,8 +829,22 @@
@@ -565,8 +829,22 @@
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<!-- Snippet Space--> |
|
|
|
|
<div id="snippetSpace" class="col-md-auto row" v-if="view === 'snippetSpace'"> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<!-- SnippetSpace Modal --> |
|
|
|
|
<div class="modal fade" id="snippetSpaceModal" tabindex="-1" role="dialog" aria-labelledby="snippetSpaceModalLabel" |
|
|
|
|
aria-hidden="true" v-if="experimental.snippetSpace"> |
|
|
|
|
<div class="modal-dialog" role="document"> |
|
|
|
|
<div class="modal-content"> |
|
|
|
|
<div class="modal-header"> |
|
|
|
|
<h5 class="modal-title"><i class="fas fa-code"></i> Snippet Space</h5> |
|
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|
|
|
|
</div> |
|
|
|
|
<div class="modal-body"> |
|
|
|
|
<div class="row"> |
|
|
|
|
<div class="col-12"> |
|
|
|
|
<a href="javascript:" class="btn btn-sm btn-success btn-wide float-end" @click="createSnippet()"> |
|
|
|
|
<i class="fas fa-plus"></i> |
|
|
|
@ -584,59 +862,6 @@
@@ -584,59 +862,6 @@
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="col-6 card" v-if="showHistory"> |
|
|
|
|
<div class="card-body"> |
|
|
|
|
<!-- History --> |
|
|
|
|
<div class="row"> |
|
|
|
|
<ul class="list-group ticket-history"> |
|
|
|
|
<template v-for="(tracker, historyIndex) in selectedTracker.history"> |
|
|
|
|
<li class="list-group-item" v-if="!tracker.manually"> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end" :title="exactTimestamp(tracker.trackingStarted)"> |
|
|
|
|
{{ formattedDate(tracker.trackingStarted) }} |
|
|
|
|
</div> |
|
|
|
|
Start: |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end" :title="exactTimestamp(tracker.trackingStopped)"> |
|
|
|
|
{{ formattedDate(tracker.trackingStopped) }} |
|
|
|
|
</div> |
|
|
|
|
Ende: |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end"> |
|
|
|
|
{{ timeWithPostFix(tracker.minutes) }} |
|
|
|
|
</div> |
|
|
|
|
Zeit: |
|
|
|
|
</div> |
|
|
|
|
<a href="javascript:" @click="deleteHistoryEntry(null, historyIndex)" class="float-end"> |
|
|
|
|
<i class="fas fa-trash"></i> |
|
|
|
|
</a> |
|
|
|
|
<br/> |
|
|
|
|
</li> |
|
|
|
|
</template> |
|
|
|
|
<template v-for="(tracker, historyIndex) in selectedTracker.history"> |
|
|
|
|
<li class="list-group-item bg-light" |
|
|
|
|
v-if="tracker.manually"> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end" :title="exactTimestamp(tracker.trackingStarted)"> |
|
|
|
|
{{ formattedDate(tracker.trackingStarted) }} |
|
|
|
|
</div> |
|
|
|
|
Manuell erfasst am: |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<div class="float-end"> |
|
|
|
|
{{ timeWithPostFix(tracker.minutes) }} |
|
|
|
|
</div> |
|
|
|
|
Zeit: |
|
|
|
|
</div> |
|
|
|
|
<a href="javascript:" @click="deleteHistoryEntry(ticketIndex, historyIndex)" class="float-end"> |
|
|
|
|
<i class="fas fa-trash"></i> |
|
|
|
|
</a> |
|
|
|
|
<br/> |
|
|
|
|
</li> |
|
|
|
|
</template> |
|
|
|
|
</ul> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
@ -652,43 +877,27 @@
@@ -652,43 +877,27 @@
|
|
|
|
|
<i class="fas fa-plus"></i> |
|
|
|
|
</button> |
|
|
|
|
<ul class="dropdown-menu" aria-labelledby="create-dropdown-menu"> |
|
|
|
|
<li> |
|
|
|
|
<button class="btn btn-light dropdown-menu-button" type="button" @click="createTracker()">Tracker</button> |
|
|
|
|
</li> |
|
|
|
|
<li> |
|
|
|
|
<button class="btn btn-light dropdown-menu-button" type="button" @click="createTimeBox()">Timebox</button> |
|
|
|
|
</li> |
|
|
|
|
<li><button class="btn btn-light dropdown-menu-button" type="button" @click="createTracker()">Tracker</button></li> |
|
|
|
|
<li><button class="btn btn-light dropdown-menu-button" type="button" @click="createTimeBox()">Timebox</button></li> |
|
|
|
|
</ul> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-dark text-light bottom-menu-item" |
|
|
|
|
v-on:click="view = 'trackers'" |
|
|
|
|
title="Alle Tracker"> |
|
|
|
|
<i class="fas fa-home"></i> |
|
|
|
|
</a> |
|
|
|
|
</div> |
|
|
|
|
<div> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-dark text-light bottom-menu-item" |
|
|
|
|
v-on:click="view = 'board'" |
|
|
|
|
title="Alle Tracker"> |
|
|
|
|
<i class="fas fa-clipboard-check"></i> |
|
|
|
|
</a> |
|
|
|
|
</div> |
|
|
|
|
<div class="" v-if="tickets.length > 0"> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-primary text-light bottom-menu-item" |
|
|
|
|
v-on:click="view = 'trackersDetail'" |
|
|
|
|
data-bs-toggle="modal" |
|
|
|
|
data-bs-target="#showTicketsModal" |
|
|
|
|
data-bs-placement="top" |
|
|
|
|
title="Alle Tracker"> |
|
|
|
|
<i class="fas fa-clock"></i> |
|
|
|
|
</a> |
|
|
|
|
</div> |
|
|
|
|
<div class="" v-if="archive.length > 0"> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-secondary text-dark bottom-menu-item" |
|
|
|
|
v-on:click="view = 'archive'" |
|
|
|
|
class="btn btn-warning bottom-menu-item" |
|
|
|
|
data-bs-toggle="modal" |
|
|
|
|
data-bs-target="#showArchivedTicketsModal" |
|
|
|
|
data-bs-placement="top" |
|
|
|
|
title="Archivierte Tracker"> |
|
|
|
|
<i class="fas fa-archive"></i> |
|
|
|
|
</a> |
|
|
|
@ -696,7 +905,9 @@
@@ -696,7 +905,9 @@
|
|
|
|
|
<div class="" v-if="experimental.portalSwitcher"> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-warning text-light bottom-menu-item" |
|
|
|
|
v-on:click="view = 'switcher'" |
|
|
|
|
data-bs-toggle="modal" |
|
|
|
|
data-bs-target="#switcherModal" |
|
|
|
|
data-bs-placement="top" |
|
|
|
|
title="Portal Switcher"> |
|
|
|
|
<i class="fas fa-random"></i> |
|
|
|
|
</a> |
|
|
|
@ -704,7 +915,9 @@
@@ -704,7 +915,9 @@
|
|
|
|
|
<div class="" v-if="experimental.snippetSpace"> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-info text-light bottom-menu-item" |
|
|
|
|
v-on:click="view = 'snippetSpace'" |
|
|
|
|
data-bs-toggle="modal" |
|
|
|
|
data-bs-target="#snippetSpaceModal" |
|
|
|
|
data-bs-placement="top" |
|
|
|
|
title="Snippet Space"> |
|
|
|
|
<i class="fas fa-code"></i> |
|
|
|
|
</a> |
|
|
|
@ -712,7 +925,9 @@
@@ -712,7 +925,9 @@
|
|
|
|
|
<div class=""> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-info text-light bottom-menu-item" |
|
|
|
|
v-on:click="view = 'pastDays'" |
|
|
|
|
data-bs-toggle="modal" |
|
|
|
|
data-bs-target="#pastDaysModal" |
|
|
|
|
data-bs-placement="top" |
|
|
|
|
title="Buchungsverlauf"> |
|
|
|
|
<i class="fas fa-history"></i> |
|
|
|
|
</a> |
|
|
|
@ -720,7 +935,9 @@
@@ -720,7 +935,9 @@
|
|
|
|
|
<div class=""> |
|
|
|
|
<a type="button" |
|
|
|
|
class="btn btn-dark text-light bottom-menu-item" |
|
|
|
|
v-on:click="view = 'settings'" |
|
|
|
|
data-bs-toggle="modal" |
|
|
|
|
data-bs-target="#settingsModal" |
|
|
|
|
data-bs-placement="left" |
|
|
|
|
title="Einstellungen"> |
|
|
|
|
<i class="fas fa-sliders-h"></i> |
|
|
|
|
</a> |
|
|
|
@ -728,6 +945,13 @@
@@ -728,6 +945,13 @@
|
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<template v-if="fun"> |
|
|
|
|
<div id="hidden-one" @click="tellJoke('pun', 'de')"></div> |
|
|
|
|
<div id="hidden-two" @click="tellJoke('programming,coding,development')"></div> |
|
|
|
|
<div id="hidden-three" @click="tellJoke('dark')"></div> |
|
|
|
|
<div id="hidden-four" @click="tellJoke('misc')"></div> |
|
|
|
|
</template> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
<script src="js/codemirror.js"></script> |
|
|
|
|