prepare release 1.12 (#2183)

* updated dependencies (#2125)
* display application name and version in console (#2150)
This commit is contained in:
Kevin Papst
2020-12-10 16:25:14 +01:00
committed by GitHub
parent 78d8212e57
commit 26c2d5aa81
29 changed files with 2042 additions and 2376 deletions

View File

@@ -1,5 +1,5 @@
unreleased=true unreleased=true
future-release=1.11.1 future-release=1.12
exclude-labels=duplicate,support,question,invalid,wontfix,release exclude-labels=duplicate,support,question,invalid,wontfix,release,waiting for feedback
enhancement_labels=>enhancement,Enhancement,feature request,translation i18n,technical debt,documentation enhancement_labels=>enhancement,Enhancement,feature request,translation i18n,technical debt,documentation
issues-wo-labels=false issues-wo-labels=false

View File

@@ -1,5 +1,10 @@
# Changelog # Changelog
## [1.12](https://github.com/kevinpapst/kimai2/tree/1.12)
[Full Changelog](https://github.com/kevinpapst/kimai2/compare/1.11.1...1.12)
Release notes including the changelog can be found [here](https://github.com/kevinpapst/kimai2/releases/tag/1.12)
## [1.11.1](https://github.com/kevinpapst/kimai2/tree/1.11.1) ## [1.11.1](https://github.com/kevinpapst/kimai2/tree/1.11.1)
[Full Changelog](https://github.com/kevinpapst/kimai2/compare/1.11...1.11.1) [Full Changelog](https://github.com/kevinpapst/kimai2/compare/1.11...1.11.1)

View File

@@ -7,8 +7,8 @@ As announced in the [README](README.md) I only support the latest available rele
| Version | Supported | | Version | Supported |
| ------- | ------------------ | | ------- | ------------------ |
| master | :white_check_mark: | | master | :white_check_mark: |
| 1.11 | :white_check_mark: | | 1.12 | :white_check_mark: |
| < 1.11 | :x: | | < 1.12 | :x: |
## Reporting a Vulnerability ## Reporting a Vulnerability

View File

@@ -8,6 +8,10 @@ you can upgrade your Kimai installation to the latest stable release.
Check below if there are more version specific steps required, which need to be executed after the normal update process. Check below if there are more version specific steps required, which need to be executed after the normal update process.
Perform EACH version specific task between your version and the new one, otherwise you risk data inconsistency or a broken installation. Perform EACH version specific task between your version and the new one, otherwise you risk data inconsistency or a broken installation.
## [1.12](https://github.com/kevinpapst/kimai2/releases/tag/1.12)
- Export templates can now include items from plugins (eg. Expenses).
## [1.10](https://github.com/kevinpapst/kimai2/releases/tag/1.10) ## [1.10](https://github.com/kevinpapst/kimai2/releases/tag/1.10)
**New database tables and fields were created, don't forget to [run the updater](https://www.kimai.org/documentation/updates.html).** **New database tables and fields were created, don't forget to [run the updater](https://www.kimai.org/documentation/updates.html).**

View File

@@ -48,7 +48,7 @@ export default class KimaiConfirmationLink extends KimaiPlugin {
if (value) { if (value) {
if (form === null) { if (form === null) {
document.location = url; document.location = url;
} else { } else {
if (url !== null) { if (url !== null) {
form.action = url; form.action = url;
} }

View File

@@ -14,10 +14,10 @@ import KimaiPlugin from "../KimaiPlugin";
export default class KimaiReducedClickHandler extends KimaiPlugin { export default class KimaiReducedClickHandler extends KimaiPlugin {
_addClickHandler(selector, callback)  { _addClickHandler(selector, callback) {
jQuery('body').on('click', selector, function(event) { jQuery('body').on('click', selector, function(event) {
// just in case an inner element is editable, than this should not be triggered // just in case an inner element is editable, than this should not be triggered
if (event.target.parentNode.isContentEditable || event.target.isContentEditable) { if (event.target.parentNode.isContentEditable || event.target.isContentEditable) {
return; return;
} }

View File

@@ -2,7 +2,7 @@
<?php <?php
use App\Kernel; use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application; use App\ConsoleApplication;
use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\ErrorHandler\Debug;
use Symfony\Component\Dotenv\Dotenv; use Symfony\Component\Dotenv\Dotenv;
@@ -25,5 +25,5 @@ if ($debug) {
} }
$kernel = new Kernel($env, $debug); $kernel = new Kernel($env, $debug);
$application = new Application($kernel); $application = new ConsoleApplication($kernel);
$application->run($input); $application->run($input);

View File

@@ -24,8 +24,9 @@
"doctrine/doctrine-migrations-bundle": "^2.1", "doctrine/doctrine-migrations-bundle": "^2.1",
"doctrine/orm": "^2.7", "doctrine/orm": "^2.7",
"erusev/parsedown": "^1.6", "erusev/parsedown": "^1.6",
"friendsofsymfony/rest-bundle": "^2.5", "friendsofsymfony/rest-bundle": "^3.0",
"gedmo/doctrine-extensions": "^2.4", "gedmo/doctrine-extensions": "^2.4",
"handcraftedinthealps/rest-routing-bundle": "^1.0",
"hslavich/oneloginsaml-bundle": "^1.4", "hslavich/oneloginsaml-bundle": "^1.4",
"jms/metadata": "^2.0", "jms/metadata": "^2.0",
"jms/serializer-bundle": "^3.2", "jms/serializer-bundle": "^3.2",

4039
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -21,4 +21,5 @@ return [
Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true], Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true],
Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true],
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
HandcraftedInTheAlps\RestRoutingBundle\RestRoutingBundle::class => ['all' => true],
]; ];

View File

@@ -1,111 +1,52 @@
# TODO upgrade to 2.8
# https://github.com/FriendsOfSymfony/FOSRestBundle/releases/tag/2.8.0
fos_rest: fos_rest:
# disable_csrf_role: IS_AUTHENTICATED_ANONYMOUSLY
# unauthorized_challenge: null
param_fetcher_listener: param_fetcher_listener:
enabled: true enabled: true
# force: false cache_dir: '%kernel.cache_dir%/fos_rest'
# service: null routing_loader: false
cache_dir: '%kernel.cache_dir%/fos_rest'
# allowed_methods_listener:
# enabled: false
# service: null
# TODO activate with 2.8
# routing_loader: false
routing_loader:
default_format: json
include_format: true
body_converter: body_converter:
enabled: true enabled: true
# validate: false
# validation_errors_argument: validationErrors
# service:
# router: router
# templating: templating
# serializer: null
# view_handler: fos_rest.view_handler.default
# inflector: fos_rest.inflector.doctrine
# validator: validator
serializer: serializer:
# version: null serialize_null: true
# groups: []
serialize_null: true
view: view:
default_engine: twig
# force_redirects:
# name: ~
# mime_types:
# enabled: false
# service: null
# formats:
# name: ~
formats: formats:
json: true json: true
xml: false xml: false
# templating_formats:
# name: ~
view_response_listener: view_response_listener:
enabled: true enabled: true
# force: true failed_validation: 400
# service: null
failed_validation: 400
# empty_content: 204
# serialize_null: false
# jsonp_handler:
# callback_param: callback
# mime_type: application/javascript+jsonp
exception: exception:
enabled: true enabled: true
# TODO active with 2.8 map_exception_codes: true
# serialize_exceptions: false serializer_error_renderer: true
# TODO deprecated with 2.8 serialize_exceptions: false
# https://github.com/FriendsOfSymfony/FOSRestBundle/issues/2200#issuecomment-629150462 exception_listener: false
# https://github.com/FriendsOfSymfony/FOSRestBundle/issues/2224
exception_controller: 'fos_rest.exception.controller:showAction'
codes: codes:
# 'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404 'Symfony\Component\HttpKernel\Exception\BadRequestHttpException': 400
# 'Doctrine\ORM\OptimisticLockException': HTTP_CONFLICT
# 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException': 400
'App\Validator\ValidationFailedException': 400 'App\Validator\ValidationFailedException': 400
messages: 'Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException': 401
'Symfony\Component\Routing\Exception\ResourceNotFoundException': true 'Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException': 403
'Symfony\Component\HttpKernel\Exception\NotFoundHttpException': true 'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
'Symfony\Component\HttpKernel\Exception\NotFoundHttpException': 404
'App\API\NotFoundException': 404
body_listener: body_listener:
enabled: true enabled: true
# service: null decoders:
# default_format: null json: fos_rest.decoder.json
# throw_exception_on_unsupported_content_type: false
# decoders:
# name: ~
array_normalizer: array_normalizer:
service: fos_rest.normalizer.camel_keys service: fos_rest.normalizer.camel_keys
forms: true forms: true
format_listener: format_listener:
enabled: true enabled: true
# service: null
rules: rules:
- { path: ^/api, prefer_extension: true, fallback_format: json, priorities: [ json ] } - { path: ^/api, prefer_extension: true, fallback_format: json, priorities: [ json ] }
# host: null # URL host name
# methods: null # Method for URL
# stop: false
# attributes: []
# versioning:
# enabled: false
# default_version: ~
# resolvers:
# query:
# enabled: true
# parameter_name: version
# custom_header:
# enabled: true
# header_name: X-Accept-Version
# media_type:
# enabled: true
# regex: /(v|version)=(?P<version>[0-9\.]+)/
# guessing_order:
# - query
# - custom_header
# - media_type
zone: zone:
- { path: ^/api/* } - { path: ^/api/* }
handcraftedinthealps_rest_routing:
routing_loader:
default_format: 'json'
prefix_methods: true
include_format: true
formats:
json: true
xml: false

View File

@@ -1,5 +1,4 @@
twig: twig:
#paths: ['%kernel.project_dir%/templates']
debug: '%kernel.debug%' debug: '%kernel.debug%'
strict_variables: '%kernel.debug%' strict_variables: '%kernel.debug%'
form_themes: form_themes:

View File

@@ -22,10 +22,10 @@ use App\Repository\ActivityRepository;
use App\Repository\Query\ActivityQuery; use App\Repository\Query\ActivityQuery;
use App\Utils\SearchTerm; use App\Utils\SearchTerm;
use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\Request\ParamFetcherInterface; use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\View\View; use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface; use FOS\RestBundle\View\ViewHandlerInterface;
use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity; use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Swagger\Annotations as SWG; use Swagger\Annotations as SWG;

View File

@@ -22,10 +22,10 @@ use App\Repository\CustomerRepository;
use App\Repository\Query\CustomerQuery; use App\Repository\Query\CustomerQuery;
use App\Utils\SearchTerm; use App\Utils\SearchTerm;
use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\Request\ParamFetcherInterface; use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\View\View; use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface; use FOS\RestBundle\View\ViewHandlerInterface;
use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity; use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Swagger\Annotations as SWG; use Swagger\Annotations as SWG;

View File

@@ -23,10 +23,10 @@ use App\Repository\ProjectRepository;
use App\Repository\Query\ProjectQuery; use App\Repository\Query\ProjectQuery;
use App\Utils\SearchTerm; use App\Utils\SearchTerm;
use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\Request\ParamFetcherInterface; use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\View\View; use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface; use FOS\RestBundle\View\ViewHandlerInterface;
use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity; use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Swagger\Annotations as SWG; use Swagger\Annotations as SWG;

View File

@@ -15,10 +15,10 @@ use App\Entity\Tag;
use App\Form\API\TagApiEditForm; use App\Form\API\TagApiEditForm;
use App\Repository\TagRepository; use App\Repository\TagRepository;
use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\Request\ParamFetcherInterface; use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\View\View; use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface; use FOS\RestBundle\View\ViewHandlerInterface;
use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity; use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Swagger\Annotations as SWG; use Swagger\Annotations as SWG;

View File

@@ -22,10 +22,10 @@ use App\Repository\CustomerRepository;
use App\Repository\ProjectRepository; use App\Repository\ProjectRepository;
use App\Repository\TeamRepository; use App\Repository\TeamRepository;
use App\Repository\UserRepository; use App\Repository\UserRepository;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\Request\ParamFetcherInterface; use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\View\View; use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface; use FOS\RestBundle\View\ViewHandlerInterface;
use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity; use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Swagger\Annotations as SWG; use Swagger\Annotations as SWG;

View File

@@ -24,10 +24,10 @@ use App\Timesheet\TrackingModeService;
use App\Utils\SearchTerm; use App\Utils\SearchTerm;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\Request\ParamFetcherInterface; use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\View\View; use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface; use FOS\RestBundle\View\ViewHandlerInterface;
use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity; use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity;
use Pagerfanta\Pagerfanta; use Pagerfanta\Pagerfanta;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;

View File

@@ -19,10 +19,10 @@ use App\Repository\Query\UserQuery;
use App\Repository\UserRepository; use App\Repository\UserRepository;
use App\Utils\SearchTerm; use App\Utils\SearchTerm;
use FOS\RestBundle\Controller\Annotations as Rest; use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\Request\ParamFetcherInterface; use FOS\RestBundle\Request\ParamFetcherInterface;
use FOS\RestBundle\View\View; use FOS\RestBundle\View\View;
use FOS\RestBundle\View\ViewHandlerInterface; use FOS\RestBundle\View\ViewHandlerInterface;
use HandcraftedInTheAlps\RestRoutingBundle\Controller\Annotations\RouteResource;
use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity; use Nelmio\ApiDocBundle\Annotation\Security as ApiSecurity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Swagger\Annotations as SWG; use Swagger\Annotations as SWG;

View File

@@ -0,0 +1,25 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App;
use Symfony\Bundle\FrameworkBundle\Console\Application;
class ConsoleApplication extends Application
{
public function getName()
{
return Constants::SOFTWARE;
}
public function getVersion()
{
return Constants::VERSION;
}
}

View File

@@ -17,7 +17,7 @@ class Constants
/** /**
* The current release version * The current release version
*/ */
public const VERSION = '1.11.1'; public const VERSION = '1.12';
/** /**
* The current release status, either "stable" or "dev" * The current release status, either "stable" or "dev"
*/ */

View File

@@ -99,6 +99,9 @@
"doctrine/reflection": { "doctrine/reflection": {
"version": "v1.0.0" "version": "v1.0.0"
}, },
"doctrine/sql-formatter": {
"version": "1.1.1"
},
"egulias/email-validator": { "egulias/email-validator": {
"version": "2.1.3" "version": "2.1.3"
}, },
@@ -135,44 +138,8 @@
"guzzlehttp/psr7": { "guzzlehttp/psr7": {
"version": "1.6.1" "version": "1.6.1"
}, },
"hoa/compiler": { "handcraftedinthealps/rest-routing-bundle": {
"version": "3.17.08.08" "version": "1.0.0"
},
"hoa/consistency": {
"version": "1.17.05.02"
},
"hoa/event": {
"version": "1.17.01.13"
},
"hoa/exception": {
"version": "1.17.01.16"
},
"hoa/file": {
"version": "1.17.07.11"
},
"hoa/iterator": {
"version": "2.17.01.10"
},
"hoa/math": {
"version": "1.17.05.16"
},
"hoa/protocol": {
"version": "1.17.01.14"
},
"hoa/regex": {
"version": "1.17.01.13"
},
"hoa/stream": {
"version": "1.17.02.21"
},
"hoa/ustring": {
"version": "4.17.01.16"
},
"hoa/visitor": {
"version": "2.17.01.16"
},
"hoa/zformat": {
"version": "1.17.01.10"
}, },
"hslavich/oneloginsaml-bundle": { "hslavich/oneloginsaml-bundle": {
"version": "v1.4.1" "version": "v1.4.1"
@@ -189,9 +156,6 @@
"intervention/image": { "intervention/image": {
"version": "2.5.0" "version": "2.5.0"
}, },
"jdorn/sql-formatter": {
"version": "v1.2.17"
},
"jms/metadata": { "jms/metadata": {
"version": "1.6.0" "version": "1.6.0"
}, },
@@ -225,6 +189,9 @@
"lorenzo/pinky": { "lorenzo/pinky": {
"version": "1.0.5" "version": "1.0.5"
}, },
"maennchen/zipstream-php": {
"version": "2.1.0"
},
"markbaker/complex": { "markbaker/complex": {
"version": "1.4.6" "version": "1.4.6"
}, },
@@ -240,6 +207,9 @@
"myclabs/deep-copy": { "myclabs/deep-copy": {
"version": "1.7.0" "version": "1.7.0"
}, },
"myclabs/php-enum": {
"version": "1.7.6"
},
"nelmio/api-doc-bundle": { "nelmio/api-doc-bundle": {
"version": "3.0", "version": "3.0",
"recipe": { "recipe": {
@@ -357,6 +327,12 @@
"psr/container": { "psr/container": {
"version": "1.0.0" "version": "1.0.0"
}, },
"psr/http-client": {
"version": "1.0.1"
},
"psr/http-factory": {
"version": "1.0.1"
},
"psr/http-message": { "psr/http-message": {
"version": "1.0.1" "version": "1.0.1"
}, },
@@ -471,6 +447,9 @@
"symfony/dependency-injection": { "symfony/dependency-injection": {
"version": "v4.0.3" "version": "v4.0.3"
}, },
"symfony/deprecation-contracts": {
"version": "v2.2.0"
},
"symfony/doctrine-bridge": { "symfony/doctrine-bridge": {
"version": "v4.0.3" "version": "v4.0.3"
}, },

View File

@@ -31,22 +31,19 @@
{% if not customer.visible %} {% if not customer.visible %}
<tr> <tr>
<th>{{ 'label.visible'|trans }}</th> <th>{{ 'label.visible'|trans }}</th>
<td> <td>{{ widgets.label_boolean(customer.visible) }}</td>
{{ widgets.label_boolean(customer.visible) }}
</td>
</tr> </tr>
{% endif %} {% endif %}
{% if customer.address is not empty %} {% if customer.address is not empty %}
<tr> <tr>
<th>{{ 'label.address'|trans }}</th> <th>{{ 'label.address'|trans }}</th>
<td> <td>{{ customer.address|nl2br }}</td>
{{ customer.address|nl2br }} </tr>
{% endif %}
{% if customer.country is not empty %} {% if customer.country is not empty %}
<br> <tr>
{{ customer.country|country }} <th>{{ 'label.country'|trans }}</th>
{% endif %} <td>{{ customer.country|country }}</td>
</td>
</tr> </tr>
{% endif %} {% endif %}
{% if customer.contact is not empty %} {% if customer.contact is not empty %}
@@ -88,7 +85,7 @@
{% if customer.timezone is not empty %} {% if customer.timezone is not empty %}
<tr> <tr>
<th>{{ 'label.timezone'|trans }}</th> <th>{{ 'label.timezone'|trans }}</th>
<td><span data-toggle="tooltip" data-placement="top" title="{{ customer.timezone }}">{{ now|date_time }}</span></td> <td>{{ now|date_full }} ({{ customer.timezone }})</td>
</tr> </tr>
{% endif %} {% endif %}
{% if customer.currency is not empty %} {% if customer.currency is not empty %}

View File

@@ -56,7 +56,6 @@ class AppExtensionTest extends TestCase
], ],
], ],
'data_dir' => '/tmp/', 'data_dir' => '/tmp/',
'plugin_dir' => '/tmp/', // still here, to make sure that this value is NOT applied!
'timesheet' => [], 'timesheet' => [],
'saml' => [ 'saml' => [
'connection' => [] 'connection' => []
@@ -325,6 +324,21 @@ class AppExtensionTest extends TestCase
$this->extension->load($minConfig, $container = $this->getContainer()); $this->extension->load($minConfig, $container = $this->getContainer());
} }
/**
* @expectedDeprecation Changing the plugin directory via "kimai.plugin_dir" is not supported since 1.9
* @group legacy
*/
public function testChangingPluginsIsIgnoredAndTriggersDeprecation()
{
$minConfig = $this->getMinConfig();
$minConfig['kimai']['plugin_dir'] = '/tmp/';
$expected = realpath(__DIR__ . '/../../') . '/var/plugins';
$this->extension->load($minConfig, $container = $this->getContainer());
$this->assertEquals($expected, $container->getParameter('kimai.plugin_dir'), 'Invalid config: kimai.plugin_dir');
}
public function testLdapDefaultValues() public function testLdapDefaultValues()
{ {
$minConfig = $this->getMinConfig(); $minConfig = $this->getMinConfig();

View File

@@ -18,11 +18,10 @@ use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
*/ */
class ConfigurationTest extends TestCase class ConfigurationTest extends TestCase
{ {
protected function getMinConfig($dataDir = '/tmp/', $pluginDir = '/tmp/') protected function getMinConfig($dataDir = '/tmp/')
{ {
return [ return [
'data_dir' => $dataDir, 'data_dir' => $dataDir,
'plugin_dir' => $pluginDir,
'timesheet' => [], 'timesheet' => [],
]; ];
} }
@@ -52,12 +51,17 @@ class ConfigurationTest extends TestCase
$this->assertConfig($this->getMinConfig('sdfsdfsdfds'), []); $this->assertConfig($this->getMinConfig('sdfsdfsdfds'), []);
} }
/**
* @expectedDeprecation Changing the plugin directory via "kimai.plugin_dir" is not supported since 1.9
* @group legacy
*/
public function testValidatePluginDir() public function testValidatePluginDir()
{ {
$finalizedConfig = $this->getCompiledConfig($this->getMinConfig()); $config = $this->getMinConfig();
$finalizedConfig['plugin_dir'] = 'sdfsdfs'; $config['plugin_dir'] = '/tmp/';
$config = $this->getMinConfig('/tmp/', 'sdfsdfs'); $finalizedConfig = $this->getCompiledConfig($config);
$finalizedConfig['plugin_dir'] = '/tmp/';
$this->assertConfig($config, $finalizedConfig); $this->assertConfig($config, $finalizedConfig);
} }
@@ -257,7 +261,6 @@ class ConfigurationTest extends TestCase
{ {
$fullDefaultConfig = [ $fullDefaultConfig = [
'data_dir' => '/tmp/', 'data_dir' => '/tmp/',
'plugin_dir' => '/tmp/',
'timesheet' => [ 'timesheet' => [
'default_begin' => 'now', 'default_begin' => 'now',
'mode' => 'default', 'mode' => 'default',

View File

@@ -2,10 +2,6 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2"> <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" target-language="ar" datatype="plaintext" original="email.en.xlf"> <file source-language="en" target-language="ar" datatype="plaintext" original="email.en.xlf">
<body> <body>
<trans-unit id="button_copy_url_to_browser">
<source>button_copy_url_to_browser</source>
<target/>
</trans-unit>
<trans-unit id="automated_email_dont_answer"> <trans-unit id="automated_email_dont_answer">
<source>automated_email_dont_answer</source> <source>automated_email_dont_answer</source>
<target>هذا بريد آلي. رجاء لاترد، بريدك لن يقرء.</target> <target>هذا بريد آلي. رجاء لاترد، بريدك لن يقرء.</target>
@@ -22,26 +18,6 @@
<source>registration.button</source> <source>registration.button</source>
<target>فعل حسابك</target> <target>فعل حسابك</target>
</trans-unit> </trans-unit>
<trans-unit id="registration.intro">
<source>registration.intro</source>
<target/>
</trans-unit>
<trans-unit id="reset.subject">
<source>reset.subject</source>
<target/>
</trans-unit>
<trans-unit id="reset.title">
<source>reset.title</source>
<target/>
</trans-unit>
<trans-unit id="reset.button">
<source>reset.button</source>
<target/>
</trans-unit>
<trans-unit id="reset.intro">
<source>reset.intro</source>
<target/>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View File

@@ -54,11 +54,11 @@
--> -->
<trans-unit id="label.password"> <trans-unit id="label.password">
<source>label.password</source> <source>label.password</source>
<target>Senha</target> <target>Palavra-passe</target>
</trans-unit> </trans-unit>
<trans-unit id="label.password_repeat"> <trans-unit id="label.password_repeat">
<source>label.password_repeat</source> <source>label.password_repeat</source>
<target>Repita a Senha</target> <target>Repita a palavra-passe</target>
</trans-unit> </trans-unit>
<trans-unit id="label.logout"> <trans-unit id="label.logout">
<source>label.logout</source> <source>label.logout</source>
@@ -70,11 +70,11 @@
</trans-unit> </trans-unit>
<trans-unit id="label.api_token"> <trans-unit id="label.api_token">
<source>label.api_token</source> <source>label.api_token</source>
<target>Senha API</target> <target>Palavra-passe da API</target>
</trans-unit> </trans-unit>
<trans-unit id="label.api_token_repeat"> <trans-unit id="label.api_token_repeat">
<source>label.api_token_repeat</source> <source>label.api_token_repeat</source>
<target>Repita Senha da API</target> <target>Repita a palavra-passe da API</target>
</trans-unit> </trans-unit>
<!-- <!--
Menu / Navbar items Menu / Navbar items
@@ -366,7 +366,7 @@
</trans-unit> </trans-unit>
<trans-unit id="profile.password"> <trans-unit id="profile.password">
<source>profile.password</source> <source>profile.password</source>
<target>Senha</target> <target>Palavra-passe</target>
</trans-unit> </trans-unit>
<trans-unit id="profile.api-token"> <trans-unit id="profile.api-token">
<source>profile.api-token</source> <source>profile.api-token</source>
@@ -618,7 +618,7 @@
</trans-unit> </trans-unit>
<trans-unit id="stats.userActiveWeek"> <trans-unit id="stats.userActiveWeek">
<source>stats.userActiveWeek</source> <source>stats.userActiveWeek</source>
<target>Usuários ativos nessa semana</target> <target>Utilizadores ativos nessa semana</target>
</trans-unit> </trans-unit>
<trans-unit id="stats.userActiveMonth"> <trans-unit id="stats.userActiveMonth">
<source>stats.userActiveMonth</source> <source>stats.userActiveMonth</source>

View File

@@ -906,10 +906,6 @@
<source>upload</source> <source>upload</source>
<target>Enviar</target> <target>Enviar</target>
</trans-unit> </trans-unit>
<trans-unit id="help.rate">
<source>help.rate</source>
<target></target>
</trans-unit>
<trans-unit id="error.no_comments_found"> <trans-unit id="error.no_comments_found">
<source>error.no_comments_found</source> <source>error.no_comments_found</source>
<target>Não houve nenhum comentários postados ainda.</target> <target>Não houve nenhum comentários postados ainda.</target>

View File

@@ -6,34 +6,6 @@
<source>teams.title</source> <source>teams.title</source>
<target>الفريق</target> <target>الفريق</target>
</trans-unit> </trans-unit>
<trans-unit id="teams.project_access">
<source>teams.project_access</source>
<target/>
</trans-unit>
<trans-unit id="teams.customer_access">
<source>teams.customer_access</source>
<target/>
</trans-unit>
<trans-unit id="team.visibility_global">
<source>team.visibility_global</source>
<target/>
</trans-unit>
<trans-unit id="team.visibility_restricted">
<source>team.visibility_restricted</source>
<target/>
</trans-unit>
<trans-unit id="team.project_visibility_inherited">
<source>team.project_visibility_inherited</source>
<target/>
</trans-unit>
<trans-unit id="team.activity_visibility_inherited">
<source>team.activity_visibility_inherited</source>
<target/>
</trans-unit>
<trans-unit id="team.create_default">
<source>team.create_default</source>
<target/>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>