added start and stop entries

enhanced administration of activities/projects/customers
added navbar for active records and recent activities
added edit timesheet entry form
added translation packages for errors and flashmessages
upgraded composer packages
This commit is contained in:
Kevin Papst
2018-01-04 14:06:07 +01:00
parent 3f429a3663
commit c9c82e767f
50 changed files with 973 additions and 405 deletions

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file date="2016-10-19T21:46:45Z" source-language="en" target-language="de" datatype="plaintext" original="not.available">
<body>
<trans-unit id="Toggle navigation">
<source>Toggle navigation</source>
<target>Ansicht der Seitenleiste umschalten</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file date="2016-10-19T21:46:45Z" source-language="en" target-language="de" datatype="plaintext" original="not.available">
<body>
<trans-unit id="access.denied">
<source>access.denied</source>
<target>Der Zugriff wurde verweigert</target>
</trans-unit>
<trans-unit id="timesheet.access.denied">
<source>timesheet.deny.stop</source>
<target>Der Benutzer "%user%" darf den Zeiteintrag "%entry%" nicht aufrufen</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file date="2016-10-19T21:46:45Z" source-language="en" target-language="de" datatype="plaintext" original="not.available">
<body>
<trans-unit id="timesheet.stop.success">
<source>timesheet.stop.success</source>
<target>Zeitmessung wurde gestoppt</target>
</trans-unit>
<trans-unit id="timesheet.stop.error">
<source>timesheet.stop.error</source>
<target>Zeitmessung konnte nicht gestoppt werden: %reason%</target>
</trans-unit>
<trans-unit id="timesheet.start.success">
<source>timesheet.start.success</source>
<target>Zeitmessung wurde gestartet</target>
</trans-unit>
<trans-unit id="timesheet.start.error">
<source>timesheet.start.error</source>
<target>Zeitmessung konnte nicht gestartet werden: %reason%</target>
</trans-unit>
<trans-unit id="action.updated_successfully">
<source>action.updated_successfully</source>
<target>Änderungen erfolgreich gespeichert</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -212,7 +212,7 @@
</trans-unit>
<trans-unit id="label.rate">
<source>label.rate</source>
<target>Umsatz</target>
<target>Lohn</target>
</trans-unit>
<trans-unit id="label.language">
<source>label.language</source>
@@ -250,10 +250,6 @@
<source>action.back</source>
<target>Zurück</target>
</trans-unit>
<trans-unit id="action.updated_successfully">
<source>action.updated_successfully</source>
<target>Änderungen erfolgreich gespeichert</target>
</trans-unit>
<!--
Dashboard
@@ -310,6 +306,18 @@
<source>timesheet.subtitle</source>
<target>Verwalten Sie Ihre Zeiteinträge</target>
</trans-unit>
<trans-unit id="timesheet.edit">
<source>timesheet.edit</source>
<target>Eintrag bearbeiten</target>
</trans-unit>
<trans-unit id="label.begin">
<source>label.begin</source>
<target>Von</target>
</trans-unit>
<trans-unit id="label.end">
<source>label.end</source>
<target>Bis</target>
</trans-unit>
<!--
User profile
@@ -430,6 +438,10 @@
<source>label.timezone</source>
<target>Zeitzone</target>
</trans-unit>
<trans-unit id="label.currency">
<source>label.currency</source>
<target>Währung</target>
</trans-unit>
<!--
Admin: User
@@ -556,16 +568,28 @@
</trans-unit>
<!--
Running time entries top menu
Navbar - recent entries and activities
-->
<trans-unit id="tracking.active">
<source>tracking.active</source>
<target>Sie haben %count% aktive Einträge</target>
<trans-unit id="active.entries">
<source>active.entries</source>
<target>Sie haben %count% aktiven Eintrag|Sie haben %count% aktive Einträge</target>
</trans-unit>
<trans-unit id="tracking.all">
<source>tracking.all</source>
<trans-unit id="timesheet.all">
<source>timesheet.all</source>
<target>Alle Einträge anzeigen</target>
</trans-unit>
<trans-unit id="recent.activities">
<source>recent.activities</source>
<target>Ihr %count% zuletzt bearbeitete Aktivität|Eine ihrer %count% letzten Aktivitäten neustarten</target>
</trans-unit>
<trans-unit id="recent.activities.format">
<source>recent.activities.format</source>
<target>%activity% in %project% für %customer%</target>
</trans-unit>
<trans-unit id="timesheet.start">
<source>timesheet.start</source>
<target>Neue Zeitmessung starten</target>
</trans-unit>
</body>
</file>

View File

@@ -1,6 +1,7 @@
{% extends 'AvanzuAdminThemeBundle:layout:default-layout.html.twig' %}
{% block avanzu_page_content %}
{{ include('default/_flash_messages.html.twig') }}
{% block main %}{% endblock %}
{% endblock %}
@@ -8,10 +9,6 @@
{% block title %}{{ 'browser.title'|trans }}{% endblock %}
{% endblock %}
{% block avanzu_sidebar_search %}
<!-- right now we simply deactivate that box -->
{% endblock %}
{% block avanzu_page_title %}
{% block page_title %}{% endblock %}
{% endblock %}
@@ -32,10 +29,6 @@
<b>Kimai</b> - Time Tracking
{% endblock %}
{% block flash_messages %}
{{ include('default/_flash_messages.html.twig') }}
{% endblock %}
{% block avanzu_head %}
<link rel="stylesheet" href="{{ asset('css/kimai.css') }}">
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
@@ -47,17 +40,11 @@
$(document).ready(function() {
$('.dropdown-toggle').dropdown();
$(document).kimai({imagePath: '{{ asset('images') }}'});
$(document).kimai('ticktac', 'a#ticktac');
//$(document).kimai('pauseRecord', 'li.messages-menu ul.menu li');
});
</script>
{% endblock %}
{% block avanzu_sidebar_user %}
{% if app.user is not null and is_granted('IS_AUTHENTICATED_FULLY') %}
{{ render(controller('TimesheetBundle:Timesheet:statusEntry')) }}
{% endif %}
{% endblock %}
{% block avanzu_footer %}
{% block footer %}
<footer class="main-footer">
@@ -67,32 +54,42 @@
<strong>Copyright &copy; {{ 'now'|date('Y') }} - <a href="http://www.kevinpapst.de">Kevin Papst</a></strong>.
{{ 'footer.license'|trans }}
</footer>
<!-- Page rendered on {{ 'now'|localizeddate('long', 'long', null, 'UTC') }} -->
{% endblock %}
{% endblock %}
{#
avanzu_navbar_toggle
avanzu_navbar_messages
avanzu_navbar_notifications
avanzu_navbar_tasks
avanzu_navbar_user
avanzu_navbar_control_sidebar_toggle
avanzu_sidebar_user
avanzu_sidebar_nav
avanzu_breadcrumb
avanzu_control_sidebar
avanzu_javascripts
avanzu_javascripts_inline
{% block avanzu_navbar_messages %}
{% if app.user is not null and is_granted('IS_AUTHENTICATED_FULLY') %}
{{ render(controller('TimesheetBundle:Timesheet:activeEntries')) }}
{% endif %}
{% endblock %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><i class="fa fa-globe"></i> <span class="caret"></span></a>
<ul class="dropdown-menu locales" role="menu">
{% for locale in locales() %}
<li {% if app.request.locale == locale.code %}class="active"{% endif %}><a href="{{ path(app.request.get('_route', 'homepage'), app.request.get('_route_params', [])|merge({ _locale: locale.code })) }}">{{ locale.name|capitalize }}</a></li>
{% endfor %}
</ul>
</li>
{% block avanzu_navbar_notifications %}
{% if app.user is not null and is_granted('IS_AUTHENTICATED_FULLY') %}
{{ render(controller('TimesheetBundle:Activity:recentActivities')) }}
{% endif %}
{#
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><i class="fa fa-globe"></i> <span class="caret"></span></a>
<ul class="dropdown-menu locales" role="menu">
{% for locale in locales() %}
<li {% if app.request.locale == locale.code %}class="active"{% endif %}><a href="{{ path(app.request.get('_route', 'homepage'), app.request.get('_route_params', [])|merge({ _locale: locale.code })) }}">{{ locale.name|capitalize }}</a></li>
{% endfor %}
</ul>
</li>
#}
{% endblock %}
<!-- Page rendered on {{ 'now'|localizeddate('long', 'long', null, 'UTC') }} -->
{% block avanzu_navbar_toggle %}{{ parent() }}{% endblock %}
{% block avanzu_navbar_tasks %}{{ parent() }}{% endblock %}
{% block avanzu_navbar_user %}{{ parent() }}{% endblock %}
{% block avanzu_navbar_control_sidebar_toggle %}{{ parent() }}{% endblock %}
#}
{% block avanzu_sidebar_user %}{# right now we simply deactivate that box #}{% endblock %}
{% block avanzu_sidebar_search %}{# right now we simply deactivate that box #}{% endblock %}
{% block avanzu_sidebar_nav %}{{ parent() }}{% endblock %}
{% block avanzu_breadcrumb %}{{ parent() }}{% endblock %}
{% block avanzu_control_sidebar %}{{ parent() }}{% endblock %}
{% block avanzu_javascripts %}{{ parent() }}{% endblock %}
{% block avanzu_javascripts_inline %}{{ parent() }}{% endblock %}

View File

@@ -1,16 +1,9 @@
{% if app.session.started and app.session.flashBag.peekAll is not empty %}
<div class="messages">
{% for type, messages in app.session.flashBag.all %}
{% for message in messages %}
{# Bootstrap alert, see http://getbootstrap.com/components/#alerts #}
<div class="alert alert-dismissible alert-{{ type }}" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
{% import "AvanzuAdminThemeBundle:layout:macros.html.twig" as macro %}
{{ message|trans }}
</div>
{% endfor %}
{% endfor %}
{% if app.session.started and app.session.flashbag.peekAll|length > 0 %}
<div class="row">
<div class="col-sm-12">
{{ macro.session_flash(avanzu_adminlte_close_alert|default(true), false, '', 'flashmessages') }}
</div>
</div>
{% endif %}

View File

@@ -34,22 +34,4 @@
</div>
<div class="col-sm-4"></div>
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script>
// FIXME remove me
$(document).ready(function() {
var usernameEl = $('#username');
var passwordEl = $('#password');
// in a real application, hardcoding the user/password would be idiotic
// but for the demo application it's very convenient to do so
if (!usernameEl.val() && !passwordEl.val()) {
usernameEl.val('anna_admin');
passwordEl.val('kitten');
}
});
</script>
{% endblock %}
{% endblock %}

View File

@@ -6,8 +6,6 @@
{% block main %}
{% import _self as widgets %}
{{ include('default/_flash_messages.html.twig') }}
<div class="row">
<div class="col-md-3">
{{ widgets.profile_box(user, stats) }}

View File

@@ -42,7 +42,6 @@ framework:
engines: ['twig']
default_locale: "%locale%"
trusted_hosts: ~
trusted_proxies: ~
session:
handler_id: session.handler.native_file
save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%"
@@ -59,8 +58,9 @@ twig:
# - "form/fields.html.twig"
globals:
kimai_context:
date_1: "d.m.Y" # used for display in timesheets
box_color: "green"
date_1: "d.m.Y" # used for display in timesheets
box_color: "green" # a color for ???
active_warning: 3 # display a warning color if the user has at least X active recordings
# Assetic Configuration (used for managing web assets: CSS, JavaScript, Sass, etc.)
#assetic:
@@ -100,4 +100,5 @@ avanzu_admin_theme:
boxed_layout : false
collapsed_sidebar: true
mini_sidebar : true
# TODO support options like: language and skin via sidebar menu
control_sidebar : false

View File

@@ -43,3 +43,7 @@ services:
avanzu_admin_theme:
enable_demo: false
web_profiler:
toolbar: true
intercept_redirects: false

View File

@@ -1,12 +1,12 @@
# this imports the routes used to display the web debug toolbar at the bottom of each page
#_wdt:
# resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
# prefix: /_wdt
_wdt:
resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
prefix: /_wdt
# this imports the routes needed to display the Symfony Profiler information
#_profiler:
# resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
# prefix: /_profiler
_profiler:
resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
prefix: /_profiler
# this imports the route used to test error pages. Just browse the following URL:
# /{_locale}/_error/{status_code}.{format}

View File

@@ -17,6 +17,9 @@ security:
# this firewall applies to all URLs
pattern: ^/
# does what it says
logout_on_user_change: true
# but the firewall does not require login on every page
# denying access is done in access_control or in your controllers
anonymous: ~

View File

@@ -1,6 +1,4 @@
services:
slugger:
class: AppBundle\Utils\Slugger
markdown:
class: AppBundle\Utils\Markdown
@@ -31,7 +29,7 @@ services:
class: AppBundle\EventListener\MenuBuilder
arguments: ["@event_dispatcher", "@security.authorization_checker"]
tags:
- { name: kernel.event_listener, event:theme.sidebar_setup_menu, method:onSetupNavbar }
- { name: kernel.event_listener, event: theme.sidebar_setup_menu, method: onSetupNavbar }
# service that prefixes every database table
app.tableprefix_subscriber:
@@ -40,6 +38,7 @@ services:
tags:
- { name: doctrine.event_subscriber }
# additional menu entries for the timesheet bundle
timesheet.configure_menu_listener:
class: TimesheetBundle\EventListener\Menu
tags: