Compare commits

...
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

1 Commits

Author SHA1 Message Date
stingl b66b98edb0 Refactor WIP 4 years ago
  1. 1
      .idea/timetrack.iml
  2. 1
      css/app.css
  3. 328
      index.html
  4. 14
      js/app.js

1
.idea/timetrack.iml

@ -4,5 +4,6 @@
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="izitoast" level="application" />
</component> </component>
</module> </module>

1
css/app.css

@ -1,5 +1,4 @@
body { body {
background-color: #e7e7e7;
overflow-y: auto; overflow-y: auto;
} }

328
index.html

@ -15,28 +15,12 @@
<body> <body>
<div id="root"> <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="'https://bootswatch.com/5/' + theme + '/bootstrap.min.css'">
<link rel="stylesheet" href="css/app.css"> <link rel="stylesheet" href="css/app.css">
<!-- <nav class="navbar navbar-expand-lg navbar-light bg-light">-->
<!-- <a class="navbar-brand">--> <!-- Content -->
<!-- <img :src="dashboardLogo" alt="logo" class="logo-nav float-end" v-if="dashboardLogo"/>--> <div class="container" id="content">
<!-- <div v-if="experimental.trackWorktime">--> <div id="trackers" class="row" v-if="view === 'trackers'">
<!-- <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="col-md-12">
<div class="row"> <div class="row">
<template v-for="(ticket, ticketIndex) in tickets"> <template v-for="(ticket, ticketIndex) in tickets">
@ -195,7 +179,9 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row" v-if="experimental.boardView && view === 'board'" id="board-view">
<!-- Board View-->
<div id="board" class="col row" v-if="view === 'board'">
<div class="col-4 col-board-inner"> <div class="col-4 col-board-inner">
<h5>Todo</h5> <h5>Todo</h5>
<template v-for="(ticket, ticketIndex) in tickets"> <template v-for="(ticket, ticketIndex) in tickets">
@ -332,20 +318,9 @@
</template> </template>
</div> </div>
</div> </div>
</div> <!-- Trackers-Detail -->
<!-- TODO: Merge to main Trackers-page -->
<!-- Tickets Modal --> <div id="trackersDetail" class="col-md-auto row" v-if="view === 'trackersDetail'">
<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"> <template v-for="(ticket, ticketIndex) in tickets">
<div class="col-md-6"> <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>
@ -393,28 +368,13 @@
</div> </div>
</template> </template>
</div> </div>
</div> <!-- Archive -->
</div> <div id="archive" class="col-md-auto row" v-if="view === 'archive'">
</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"> <div class="col-sm-6">
<i class="fas fa-search"></i> <i class="fas fa-search"></i>
<input @keydown="$forceUpdate()" type="text" class="form-control search-field float-right" v-model="searchQuery" placeholder="Suche.."> <input @keydown="$forceUpdate()" type="text" class="form-control search-field float-right" v-model="searchQuery" placeholder="Suche..">
</div> </div>
<div class="col-sm-6"></div>
<template v-for="(ticket, ticketIndex) in archive"> <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"> <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> <h6><span v-if="isTicketNumber(ticket.number)"></span>{{ ticket.number }}</h6>
@ -460,21 +420,8 @@
</div> </div>
</template> </template>
</div> </div>
</div> <!-- Settings -->
</div> <div id="settings" class="col-md-auto row" v-if="view === 'settings'">
</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"> <div class="col-md-6">
<h5>Allgemeine Einstellungen</h5> <h5>Allgemeine Einstellungen</h5>
<div class="form-group"> <div class="form-group">
@ -551,88 +498,8 @@
</div> </div>
</div> </div>
</div> </div>
<div class="modal-footer"> <!-- Custom Booking-->
<button class="btn btn-primary" v-on:click="updateStorage()" data-bs-dismiss="modal">Speichern</button> <div id="customBooking" class="col-md-auto row" v-if="view === 'customBooking' && selectedTracker">
<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"> <div class="form-group">
<label>Zeit in Minuten:</label> <label>Zeit in Minuten:</label>
<input type="text" class="form-control" v-model="customBookingValue"> <input type="text" class="form-control" v-model="customBookingValue">
@ -646,21 +513,8 @@
</div> </div>
</div> </div>
</div> </div>
</div> <!-- Switcher -->
</div> <div id="switcher" class="col-md-auto row" v-if="view === 'switcher'">
</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="col-12">
<div class="form-group"> <div class="form-group">
<label class="text-muted">Portalname:</label> <label class="text-muted">Portalname:</label>
@ -694,22 +548,8 @@
</div> </div>
</template> </template>
</div> </div>
</div> <!-- Past Days-->
</div> <div id="pastDays" class="col-md-auto row" v-if="view === 'pastDays'">
</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="col-12">
<div class="form-group"> <div class="form-group">
<div class="form-group"> <div class="form-group">
@ -725,22 +565,8 @@
</div> </div>
</div> </div>
</div> </div>
</div> <!-- Snippet Space-->
</div> <div id="snippetSpace" class="col-md-auto row" v-if="view === 'snippetSpace'">
</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"> <div class="col-12">
<a href="javascript:" class="btn btn-sm btn-success btn-wide float-end" @click="createSnippet()"> <a href="javascript:" class="btn btn-sm btn-success btn-wide float-end" @click="createSnippet()">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
@ -758,6 +584,59 @@
</div> </div>
</div> </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> </div>
</div> </div>
@ -773,17 +652,35 @@
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</button> </button>
<ul class="dropdown-menu" aria-labelledby="create-dropdown-menu"> <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>
<li><button class="btn btn-light dropdown-menu-button" type="button" @click="createTimeBox()">Timebox</button></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> </ul>
</div> </div>
</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"> <div class="" v-if="tickets.length > 0">
<a type="button" <a type="button"
class="btn btn-primary text-light bottom-menu-item" class="btn btn-primary text-light bottom-menu-item"
data-bs-toggle="modal" v-on:click="view = 'trackersDetail'"
data-bs-target="#showTicketsModal"
data-bs-placement="top"
title="Alle Tracker"> title="Alle Tracker">
<i class="fas fa-clock"></i> <i class="fas fa-clock"></i>
</a> </a>
@ -791,9 +688,7 @@
<div class="" v-if="archive.length > 0"> <div class="" v-if="archive.length > 0">
<a type="button" <a type="button"
class="btn btn-secondary text-dark bottom-menu-item" class="btn btn-secondary text-dark bottom-menu-item"
data-bs-toggle="modal" v-on:click="view = 'archive'"
data-bs-target="#showArchivedTicketsModal"
data-bs-placement="top"
title="Archivierte Tracker"> title="Archivierte Tracker">
<i class="fas fa-archive"></i> <i class="fas fa-archive"></i>
</a> </a>
@ -801,9 +696,7 @@
<div class="" v-if="experimental.portalSwitcher"> <div class="" v-if="experimental.portalSwitcher">
<a type="button" <a type="button"
class="btn btn-warning text-light bottom-menu-item" class="btn btn-warning text-light bottom-menu-item"
data-bs-toggle="modal" v-on:click="view = 'switcher'"
data-bs-target="#switcherModal"
data-bs-placement="top"
title="Portal Switcher"> title="Portal Switcher">
<i class="fas fa-random"></i> <i class="fas fa-random"></i>
</a> </a>
@ -811,9 +704,7 @@
<div class="" v-if="experimental.snippetSpace"> <div class="" v-if="experimental.snippetSpace">
<a type="button" <a type="button"
class="btn btn-info text-light bottom-menu-item" class="btn btn-info text-light bottom-menu-item"
data-bs-toggle="modal" v-on:click="view = 'snippetSpace'"
data-bs-target="#snippetSpaceModal"
data-bs-placement="top"
title="Snippet Space"> title="Snippet Space">
<i class="fas fa-code"></i> <i class="fas fa-code"></i>
</a> </a>
@ -821,9 +712,7 @@
<div class=""> <div class="">
<a type="button" <a type="button"
class="btn btn-info text-light bottom-menu-item" class="btn btn-info text-light bottom-menu-item"
data-bs-toggle="modal" v-on:click="view = 'pastDays'"
data-bs-target="#pastDaysModal"
data-bs-placement="top"
title="Buchungsverlauf"> title="Buchungsverlauf">
<i class="fas fa-history"></i> <i class="fas fa-history"></i>
</a> </a>
@ -831,9 +720,7 @@
<div class=""> <div class="">
<a type="button" <a type="button"
class="btn btn-dark text-light bottom-menu-item" class="btn btn-dark text-light bottom-menu-item"
data-bs-toggle="modal" v-on:click="view = 'settings'"
data-bs-target="#settingsModal"
data-bs-placement="left"
title="Einstellungen"> title="Einstellungen">
<i class="fas fa-sliders-h"></i> <i class="fas fa-sliders-h"></i>
</a> </a>
@ -841,13 +728,6 @@
</div> </div>
</div> </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> </div>
<script src="js/codemirror.js"></script> <script src="js/codemirror.js"></script>

14
js/app.js

@ -7,7 +7,8 @@ const TimeTrack = {
snippetSpace: false, snippetSpace: false,
portalSwitcher: true portalSwitcher: true
}, },
view: 'board', view: 'trackers',
showHistory: false,
theme: 'materia', theme: 'materia',
themes: null, themes: null,
dashboardLogo: 'assets/img/logo.png', dashboardLogo: 'assets/img/logo.png',
@ -348,7 +349,8 @@ const TimeTrack = {
iziToast.show({ iziToast.show({
message: message, message: message,
color: 'blue' color: 'blue',
position: 'topCenter'
}); });
this.updateStorage(); this.updateStorage();
@ -358,11 +360,18 @@ const TimeTrack = {
this.stopActiveTracker(); this.stopActiveTracker();
} }
iziToast.show({
title: 'Tracker archiviert',
color: 'green',
position: 'topCenter'
});
this.archive.push(this.tickets[index]); this.archive.push(this.tickets[index]);
this.tickets.splice(index, 1); this.tickets.splice(index, 1);
this.updateStorage(); this.updateStorage();
}, },
reactivateTicket(index) { reactivateTicket(index) {
this.view = 'trackers';
this.tickets.push(this.archive[index]); this.tickets.push(this.archive[index]);
this.archive.splice(index, 1); this.archive.splice(index, 1);
this.updateStorage(); this.updateStorage();
@ -443,6 +452,7 @@ const TimeTrack = {
}, },
showHistoryForTracker(ticket) { showHistoryForTracker(ticket) {
this.selectedTracker = ticket; this.selectedTracker = ticket;
this.showHistory = true;
this.$forceUpdate(); this.$forceUpdate();
setTimeout(() => { setTimeout(() => {
let historyModal = new bootstrap.Modal(document.getElementById('historyModal')); let historyModal = new bootstrap.Modal(document.getElementById('historyModal'));