+
diff --git a/cis/testtool/gebietfertig.php b/cis/testtool/gebietfertig.php
index d8f9982d0..cf0a86ae2 100644
--- a/cis/testtool/gebietfertig.php
+++ b/cis/testtool/gebietfertig.php
@@ -50,9 +50,22 @@ $p = new phrasen($sprache_user);
-
+
+
t('testtool/zeitAbgelaufen');?>
diff --git a/cis/testtool/login.php b/cis/testtool/login.php
index 0b114b8c5..d1944fe7a 100644
--- a/cis/testtool/login.php
+++ b/cis/testtool/login.php
@@ -126,10 +126,6 @@ if (isset($_REQUEST['prestudent']))
$rt->getReihungstestPerson($ps->person_id);
if (isset($rt->result[0]))
$reihungstest_id = $rt->result[0]->reihungstest_id;
- else
- {
- $alertmsg .= ''.$p->t('testtool/reihungstestKannNichtGeladenWerden').'
';
- }
}
else
{
@@ -138,10 +134,6 @@ if (isset($_REQUEST['prestudent']))
// TODO Was ist wenn da mehrere Zurueckkommen?!
if (isset($rt->result[0]))
$reihungstest_id = $rt->result[0]->reihungstest_id;
- else
- {
- $alertmsg .= ''.$p->t('testtool/reihungstestKannNichtGeladenWerden').'
';
- }
}
else
{
@@ -362,6 +354,8 @@ if ((isset($_SESSION['prestudent_id']) && !isset($_SESSION['pruefling_id']) &&
$pruefling->idnachweis = '';
$pruefling->registriert = date('Y-m-d H:i:s');
$pruefling->prestudent_id = $_SESSION['prestudent_id'];
+ $pruefling->gesperrt = $pruefling->isGesperrt(null, $_SESSION['prestudent_id']);
+
if ($pruefling->save())
{
$_SESSION['pruefling_id']=$pruefling->pruefling_id;
@@ -385,6 +379,7 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id']))
$pruefling->registriert = date('Y-m-d H:i:s');
$pruefling->prestudent_id = $_SESSION['prestudent_id'];
$pruefling->semester = $_POST['semester'];
+ $pruefling->gesperrt = $pruefling->isGesperrt(null, $_SESSION['prestudent_id']);
if ($pruefling->save())
{
$_SESSION['pruefling_id']=$pruefling->pruefling_id;
@@ -431,6 +426,26 @@ if (isset($_POST['save']) && isset($_SESSION['prestudent_id']))
});';
?>
+ $(document).bind('cut copy paste', function(e)
+ {
+ if (document.querySelector('.frage'))
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("keydown", function (e)
+ {
+ if (((e.ctrlKey || e.metaKey) && e.keyCode === 85) || e.keyCode === 123)
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("contextmenu", function (e)
+ {
+ e.preventDefault();
+ });
// If Browser is any other than Mozilla Firefox and the test includes any MathML,
// show message to use Mozilla Firefox
var ua = navigator.userAgent;
diff --git a/cis/testtool/menu.php b/cis/testtool/menu.php
index 11fbc61d5..7c8b12b9d 100644
--- a/cis/testtool/menu.php
+++ b/cis/testtool/menu.php
@@ -414,7 +414,17 @@ else
+
+
t('testtool/prueflingGesperrt');?>
diff --git a/cis/testtool/topbar.php b/cis/testtool/topbar.php
index 8432d4f41..7ca218ede 100644
--- a/cis/testtool/topbar.php
+++ b/cis/testtool/topbar.php
@@ -71,6 +71,18 @@ function changeSprache(sprache)
parent.menu.location.href = parent.menu.location.pathname + '?sprache_user=' + sprache; // refreshes menu.php
parent.content.location.href = parent.content.location.pathname + '?' + content_params; // refreshes login.php or frage.php
}
+
+ $(document).on("keydown", function (e) {
+ if (((e.ctrlKey || e.metaKey) && e.keyCode === 85) || e.keyCode === 123)
+ {
+ e.preventDefault();
+ }
+ });
+
+ $(document).on("contextmenu", function (e)
+ {
+ e.preventDefault();
+ });
=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2015-06-14T21:17:01+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
+ "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.x"
+ },
+ "time": "2017-10-19T19:58:43+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.18.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999",
+ "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999",
"shasum": ""
},
"require": {
@@ -1878,32 +2185,36 @@
"parser",
"php"
],
- "time": "2022-05-31T20:59:12+00:00"
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0"
+ },
+ "time": "2023-12-10T21:03:43+00:00"
},
{
"name": "pdepend/pdepend",
- "version": "2.10.3",
+ "version": "2.16.2",
"source": {
"type": "git",
"url": "https://github.com/pdepend/pdepend.git",
- "reference": "da3166a06b4a89915920a42444f707122a1584c9"
+ "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pdepend/pdepend/zipball/da3166a06b4a89915920a42444f707122a1584c9",
- "reference": "da3166a06b4a89915920a42444f707122a1584c9",
+ "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58",
+ "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58",
"shasum": ""
},
"require": {
"php": ">=5.3.7",
- "symfony/config": "^2.3.0|^3|^4|^5|^6.0",
- "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0",
- "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0"
+ "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0",
+ "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0",
+ "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0",
+ "symfony/polyfill-mbstring": "^1.19"
},
"require-dev": {
"easy-doc/easy-doc": "0.0.0|^1.2.3",
"gregwar/rst": "^1.0",
- "phpunit/phpunit": "^4.8.36|^5.7.27",
"squizlabs/php_codesniffer": "^2.0.0"
},
"bin": [
@@ -1925,26 +2236,315 @@
"BSD-3-Clause"
],
"description": "Official version of pdepend to be handled with Composer",
- "time": "2022-02-23T07:53:09+00:00"
+ "keywords": [
+ "PHP Depend",
+ "PHP_Depend",
+ "dev",
+ "pdepend"
+ ],
+ "support": {
+ "issues": "https://github.com/pdepend/pdepend/issues",
+ "source": "https://github.com/pdepend/pdepend/tree/2.16.2"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-12-17T18:09:59+00:00"
},
{
- "name": "phpmd/phpmd",
- "version": "2.12.0",
+ "name": "phar-io/manifest",
+ "version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/phpmd/phpmd.git",
- "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec"
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpmd/phpmd/zipball/c0b678ba71902f539c27c14332aa0ddcf14388ec",
- "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^1.0.1",
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/master"
+ },
+ "time": "2017-03-05T18:14:27+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/master"
+ },
+ "time": "2017-03-05T17:38:23+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master"
+ },
+ "time": "2017-09-11T18:02:19+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "4.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c",
+ "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
+ "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.0.5",
+ "mockery/mockery": "^1.0",
+ "phpdocumentor/type-resolver": "0.4.*",
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x"
+ },
+ "time": "2019-12-28T18:55:12+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "cf842904952e64e703800d094cdf34e715a8a3ae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/cf842904952e64e703800d094cdf34e715a8a3ae",
+ "reference": "cf842904952e64e703800d094cdf34e715a8a3ae",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/master"
+ },
+ "time": "2017-12-30T13:23:38+00:00"
+ },
+ {
+ "name": "phpmd/phpmd",
+ "version": "2.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpmd/phpmd.git",
+ "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0",
+ "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0",
"shasum": ""
},
"require": {
"composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0",
"ext-xml": "*",
- "pdepend/pdepend": "^2.10.3",
+ "pdepend/pdepend": "^2.16.1",
"php": ">=5.3.9"
},
"require-dev": {
@@ -1953,8 +2553,7 @@
"ext-simplexml": "*",
"gregwar/rst": "^1.0",
"mikey179/vfsstream": "^1.6.8",
- "phpunit/phpunit": "^4.8.36 || ^5.7.27",
- "squizlabs/php_codesniffer": "^2.0"
+ "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2"
},
"bin": [
"src/bin/phpmd"
@@ -1991,26 +2590,38 @@
"description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.",
"homepage": "https://phpmd.org/",
"keywords": [
+ "dev",
"mess detection",
"mess detector",
"pdepend",
"phpmd",
"pmd"
],
- "time": "2022-03-24T13:33:01+00:00"
+ "support": {
+ "irc": "irc://irc.freenode.org/phpmd",
+ "issues": "https://github.com/phpmd/phpmd/issues",
+ "source": "https://github.com/phpmd/phpmd/tree/2.15.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-12-11T08:22:20+00:00"
},
{
"name": "phpmetrics/phpmetrics",
- "version": "v2.8.1",
+ "version": "v2.8.2",
"source": {
"type": "git",
"url": "https://github.com/phpmetrics/PhpMetrics.git",
- "reference": "e279f7317390f642339941b693359e9a181817a7"
+ "reference": "4b77140a11452e63c7a9b98e0648320bf6710090"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/e279f7317390f642339941b693359e9a181817a7",
- "reference": "e279f7317390f642339941b693359e9a181817a7",
+ "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/4b77140a11452e63c7a9b98e0648320bf6710090",
+ "reference": "4b77140a11452e63c7a9b98e0648320bf6710090",
"shasum": ""
},
"require": {
@@ -2061,7 +2672,242 @@
"quality",
"testing"
],
- "time": "2022-03-24T10:19:51+00:00"
+ "support": {
+ "issues": "https://github.com/PhpMetrics/PhpMetrics/issues",
+ "source": "https://github.com/phpmetrics/PhpMetrics/tree/v2.8.2"
+ },
+ "time": "2023-03-08T15:03:36+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.10.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "451c3cd1418cf640de218914901e51b064abb093"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+ "reference": "451c3cd1418cf640de218914901e51b064abb093",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
+ "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5 || ^3.2",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.10.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "support": {
+ "issues": "https://github.com/phpspec/prophecy/issues",
+ "source": "https://github.com/phpspec/prophecy/tree/v1.10.3"
+ },
+ "time": "2020-03-05T15:02:03+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "5.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "c89677919c5dd6d3b3852f230a663118762218ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac",
+ "reference": "c89677919c5dd6d3b3852f230a663118762218ac",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0",
+ "phpunit/php-file-iterator": "^1.4.2",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-token-stream": "^2.0.1",
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
+ "sebastian/environment": "^3.0",
+ "sebastian/version": "^2.0.1",
+ "theseer/tokenizer": "^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.3.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/5.3"
+ },
+ "time": "2018-04-06T15:36:58+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.net/phpunit",
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5"
+ },
+ "time": "2017-11-27T13:52:08+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+ },
+ "time": "2015-06-21T13:50:34+00:00"
},
{
"name": "phpunit/php-timer",
@@ -2110,8 +2956,218 @@
"keywords": [
"timer"
],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
+ },
"time": "2017-02-26T11:10:40+00:00"
},
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "791198a2c6254db10131eecfe8c06670700904db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
+ "reference": "791198a2c6254db10131eecfe8c06670700904db",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
+ "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master"
+ },
+ "abandoned": true,
+ "time": "2017-11-27T05:48:46+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "6.5.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bac23fe7ff13dbdb461481f706f0e9fe746334b7",
+ "reference": "bac23fe7ff13dbdb461481f706f0e9fe746334b7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "^1.6.1",
+ "phar-io/manifest": "^1.0.1",
+ "phar-io/version": "^1.0",
+ "php": "^7.0",
+ "phpspec/prophecy": "^1.7",
+ "phpunit/php-code-coverage": "^5.3",
+ "phpunit/php-file-iterator": "^1.4.3",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-timer": "^1.0.9",
+ "phpunit/phpunit-mock-objects": "^5.0.9",
+ "sebastian/comparator": "^2.1",
+ "sebastian/diff": "^2.0",
+ "sebastian/environment": "^3.1",
+ "sebastian/exporter": "^3.1",
+ "sebastian/global-state": "^2.0",
+ "sebastian/object-enumerator": "^3.0.3",
+ "sebastian/resource-operations": "^1.0",
+ "sebastian/version": "^2.0.1"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2",
+ "phpunit/dbunit": "<3.0"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.5.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/6.5.14"
+ },
+ "time": "2019-02-01T05:22:47+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "5.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f",
+ "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.5",
+ "php": "^7.0",
+ "phpunit/php-text-template": "^1.2.1",
+ "sebastian/exporter": "^3.1"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5.11"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/5.0.10"
+ },
+ "abandoned": true,
+ "time": "2018-08-09T05:50:03+00:00"
+ },
{
"name": "psr/container",
"version": "1.0.0",
@@ -2159,6 +3215,10 @@
"container-interop",
"psr"
],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/master"
+ },
"time": "2017-02-14T16:28:37+00:00"
},
{
@@ -2206,8 +3266,321 @@
"psr",
"psr-3"
],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.4"
+ },
"time": "2021-05-03T11:20:27+00:00"
},
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
+ "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T08:15:22+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "2.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9",
+ "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/diff": "^2.0 || ^3.0",
+ "sebastian/exporter": "^3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/master"
+ },
+ "time": "2018-02-01T13:46:46+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
+ "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/master"
+ },
+ "time": "2017-08-03T08:09:46+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/master"
+ },
+ "time": "2017-07-01T08:51:00+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "3.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6",
+ "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^8.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T06:00:17+00:00"
+ },
{
"name": "sebastian/finder-facade",
"version": "1.2.2",
@@ -2245,9 +3618,180 @@
],
"description": "FinderFacade is a convenience wrapper for Symfony's Finder component.",
"homepage": "https://github.com/sebastianbergmann/finder-facade",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/finder-facade/issues",
+ "source": "https://github.com/sebastianbergmann/finder-facade/tree/master"
+ },
"abandoned": true,
"time": "2017-11-18T17:31:49+00:00"
},
+ {
+ "name": "sebastian/global-state",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0"
+ },
+ "time": "2017-04-27T15:39:26+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
+ "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:40:27+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
+ "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:37:18+00:00"
+ },
{
"name": "sebastian/phpcpd",
"version": "3.0.1",
@@ -2296,8 +3840,122 @@
],
"description": "Copy/Paste Detector (CPD) for PHP code.",
"homepage": "https://github.com/sebastianbergmann/phpcpd",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpcpd/issues",
+ "source": "https://github.com/sebastianbergmann/phpcpd/tree/master"
+ },
+ "abandoned": true,
"time": "2017-11-16T08:49:28+00:00"
},
+ {
+ "name": "sebastian/recursion-context",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb",
+ "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-30T07:34:24+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/master"
+ },
+ "time": "2015-07-28T20:34:47+00:00"
+ },
{
"name": "sebastian/version",
"version": "2.0.1",
@@ -2339,6 +3997,10 @@
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/master"
+ },
"time": "2016-10-03T07:35:21+00:00"
},
{
@@ -2346,12 +4008,12 @@
"version": "3.6.2",
"source": {
"type": "git",
- "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
"reference": "5e4e71592f69da17871dba6e80dd51bce74a351a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a",
"reference": "5e4e71592f69da17871dba6e80dd51bce74a351a",
"shasum": ""
},
@@ -2390,6 +4052,25 @@
"phpcs",
"standards"
],
+ "support": {
+ "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
+ "source": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ }
+ ],
"time": "2021-12-12T21:44:58+00:00"
},
{
@@ -2449,6 +4130,23 @@
],
"description": "Symfony Config Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v3.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-10-24T10:57:07+00:00"
},
{
@@ -2516,6 +4214,23 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v3.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-10-24T10:57:07+00:00"
},
{
@@ -2567,6 +4282,23 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/debug/tree/v3.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
"abandoned": "symfony/error-handler",
"time": "2020-10-24T10:57:07+00:00"
},
@@ -2634,6 +4366,23 @@
],
"description": "Symfony DependencyInjection Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/dependency-injection/tree/v3.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-10-24T10:57:07+00:00"
},
{
@@ -2679,6 +4428,23 @@
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v3.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-10-24T10:57:07+00:00"
},
{
@@ -2723,6 +4489,23 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v3.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-11-16T17:02:08+00:00"
},
{
@@ -2786,6 +4569,23 @@
"portable",
"shim"
],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-10-23T09:01:57+00:00"
},
{
@@ -2829,8 +4629,109 @@
],
"description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.",
"homepage": "https://github.com/theseer/fDOMDocument",
+ "support": {
+ "issues": "https://github.com/theseer/fDOMDocument/issues",
+ "source": "https://github.com/theseer/fDOMDocument/tree/1.6.7"
+ },
"abandoned": true,
"time": "2022-01-25T23:10:35+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+ "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/master"
+ },
+ "time": "2019-06-13T22:48:21+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<3.9.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "support": {
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.9.1"
+ },
+ "time": "2020-07-08T17:02:28+00:00"
}
],
"aliases": [],
@@ -2842,5 +4743,5 @@
"php": ">=5.6.40"
},
"platform-dev": [],
- "plugin-api-version": "2.3.0"
+ "plugin-api-version": "2.2.0"
}
diff --git a/config/cis.config-default.inc.php b/config/cis.config-default.inc.php
index 1a72888be..b61ce9869 100644
--- a/config/cis.config-default.inc.php
+++ b/config/cis.config-default.inc.php
@@ -86,6 +86,7 @@ define("AUTH_NAME","FH-Complete");
* LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName)
+ * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server
*/
define('LDAP_SERVER','ldap://ldap.example.com');
define('LDAP_PORT',389);
@@ -94,6 +95,7 @@ define('LDAP_BASE_DN','ou=People,dc=example,dc=com');
define('LDAP_BIND_USER',null);
define('LDAP_BIND_PASSWORD',null);
define('LDAP_USER_SEARCH_FILTER','uid');
+define('LDAP_SERVICEPING',true);
// 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen)
/*
@@ -127,6 +129,8 @@ define('MAILVERTEILER_SPERRE', true);
// Bezeichnung des Campus
define('CAMPUS_NAME','FH Technikum Wien');
+define('CI_ENVIRONMENT', 'development'); // Code igniter environment variable
+
// Anzahl der Tag die eine Nachricht am Pinboard angezeigt wird.
define("MAXNEWSALTER",60);
// Anzahl der Newseintraege die maximal angezeigt werden
@@ -292,5 +296,4 @@ define ('DEFAULT_ALLIN_DIENSTVERTRAG',[111]);
//Echter Dienstvertrag
define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,111]);
-
?>
diff --git a/config/global.config-default.inc.php b/config/global.config-default.inc.php
index 8990bbd81..d12b23828 100644
--- a/config/global.config-default.inc.php
+++ b/config/global.config-default.inc.php
@@ -47,6 +47,9 @@ define('CIS_PROFIL_STUDIENINFORMATION_ANZEIGEN',true);
// Zeitaufzeichnung gesperrt_bis Datum YYYY-MM-DD
define('CIS_ZEITAUFZEICHNUNG_GESPERRT_BIS','');
+// maximale Dauer einer Zeitsperre in Tagen
+define('CIS_ZEITSPERREN_MAX_DAUER', 730);
+
// Anzeige des Links zur Noteneingabe in der LVA Uebersicht
define('CIS_LVALISTE_NOTENEINGABE_ANZEIGEN',true);
@@ -54,8 +57,13 @@ define('CIS_LVALISTE_NOTENEINGABE_ANZEIGEN',true);
define('CIS_SUCHE_LVPLAN_ANZEIGEN',true);
// Anzeige des Links zum Profil von Personen bei globaler Suche
+// Wenn ein Mitarbeiter sucht, wird der Link IMMER angezeigt, unabhängig von der Config
+// Wenn ein Studierender sucht und die Config auf false ist, wird der Link nicht angezeigt - ansonsten schon
define('CIS_SUCHE_PROFIL_ANZEIGEN',true);
+// Anzeige von Personen bei globaler Suche
+define('CIS_ALLOW_PERSON_SEARCH', true);
+
// Soll geprueft werden ob das Passwort innerhalb des letzten Jahres geaendert wurde true|false
// Wenn dies nicht geaendert wurde wird nach dem Login auf die Passwort aendern Seite umgeleitet
define('CIS_CHECK_PASSWORD_CHANGE',false);
@@ -319,4 +327,9 @@ define ('ZAHLUNGSBESTAETIGUNG_ZAHLUNGSREFERENZ_ANZEIGEN', false);
define('DOCSBOX_ENABLED', false);
+// Aktiviert Abfragen auf die Dienstverhaeltnisse im HR Schema anstatt auf die BIS-Verwendung
+// Uebergangsphase bis zur entfernung der BIS-Verwendungen
+// (true | false)
+define('DIENSTVERHAELTNIS_SUPPORT', false);
+
?>
diff --git a/config/system.config-default.inc.php b/config/system.config-default.inc.php
index 45a83837e..a1f70086a 100644
--- a/config/system.config-default.inc.php
+++ b/config/system.config-default.inc.php
@@ -52,6 +52,7 @@
* LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName)
+ * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server
*/
define('LDAP_SERVER','ldap://ldap.example.com');
define('LDAP_PORT',389);
@@ -60,6 +61,7 @@
define('LDAP_BIND_USER',null);
define('LDAP_BIND_PASSWORD',null);
define('LDAP_USER_SEARCH_FILTER','uid');
+ define('LDAP_SERVICEPING',true);
// 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen)
/*
diff --git a/config/vilesci.config-default.inc.php b/config/vilesci.config-default.inc.php
index cbb3c1136..a372bc9da 100644
--- a/config/vilesci.config-default.inc.php
+++ b/config/vilesci.config-default.inc.php
@@ -75,6 +75,7 @@ define('AUTH_NAME', 'FH Complete');
* LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName)
+ * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server
*/
define('LDAP_SERVER', 'ldap://ldap.example.com');
define('LDAP_PORT', 389);
@@ -83,6 +84,7 @@ define('LDAP_BASE_DN', 'ou=People,dc=example,dc=com');
define('LDAP_BIND_USER', null);
define('LDAP_BIND_PASSWORD', null);
define('LDAP_USER_SEARCH_FILTER', 'uid');
+define('LDAP_SERVICEPING',true);
// 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen)
/*
@@ -274,8 +276,14 @@ define('DOCSBOX_WAITING_SLEEP_TIME', 1);
// Bei folgenden Buchungstypen wird ein Anlegen geprüft ob bereits ein Eintrag für diesen Typ vorhanden ist im selben
// Semester und ggf ein Hinweis ausgegeben
define('FAS_DOPPELTE_BUCHUNGSTYPEN_CHECK', serialize(
- array('StudiengebuehrAnzahlung', 'Studiengebuehr', 'StudiengebuehrRestzahlung', 'OEH')
-));
+ array(
+ 'Studiengebuehr' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung', 'StudiengebuehrRestzahlung'),
+ 'StudiengebuehrErhoeht' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung', 'StudiengebuehrRestzahlung'),
+ 'StudiengebuehrAnzahlung' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrAnzahlung'),
+ 'StudiengebuehrRestzahlung' => array('StudiengebuehrErhoeht', 'Studiengebuehr', 'StudiengebuehrRestzahlung'),
+ 'OEH' => array('OEH')
+ ))
+);
// Spezialnoten die am Zeunigs und Diplomasupplement ignoriert werden
define('ZEUGNISNOTE_NICHT_ANZEIGEN',serialize(array('iar', 'nz')));
@@ -287,4 +295,13 @@ define ('DEFAULT_LEHRMODUS','regulaer');
//Echter Dienstvertrag
define ('DEFAULT_ECHTER_DIENSTVERTRAG',[103,110]);
+//Buchungstypen die fix auf eine bestimmte Kostenstelle gebucht werden sollen
+//Buchungstyp => Studiengang_kz
+define('FAS_BUCHUNGSTYP_FIXE_KOSTENSTELLE', serialize(
+ array(
+ 'Test_1' => 0,
+ 'Test_2' => 2
+ )
+));
+
?>
diff --git a/config/wawi.config-default.inc.php b/config/wawi.config-default.inc.php
index bed069e39..0081c2420 100644
--- a/config/wawi.config-default.inc.php
+++ b/config/wawi.config-default.inc.php
@@ -53,6 +53,7 @@ define("AUTH_NAME","FHComplete");
* LDAP_BIND_USER: DN des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_BIND_PASSWORD: Passwort des Users falls eine Authentifizierung am LDAP noetig ist oder null
* LDAP_USER_SEARCH_FILTER: LDAP Attribut in dem der Username steht nach dem gesucht wird (uid | sAMAccountName)
+ * LDAP_SERVICEPING: LDAP Service Ping verwenden (true | false) - wirksam für alle LDAP Server
*/
define('LDAP_SERVER','ldap://ldap.example.com');
define('LDAP_PORT',389);
@@ -61,6 +62,7 @@ define('LDAP_BASE_DN','ou=People,dc=example,dc=com');
define('LDAP_BIND_USER',null);
define('LDAP_BIND_PASSWORD',null);
define('LDAP_USER_SEARCH_FILTER','uid');
+define('LDAP_SERVICEPING',true);
// 2. LDAP Server (zB wenn Mitarbeiter und Studierende auf 2 getrennten Servern liegen)
/*
diff --git a/content/dragboard.js.php b/content/dragboard.js.php
index 6510cfc47..9f720c57a 100644
--- a/content/dragboard.js.php
+++ b/content/dragboard.js.php
@@ -385,6 +385,7 @@ var LeLektorDDObserver=
req.add('lehreinheit_id', lehreinheit_id);
req.add('mitarbeiter_uid', uid);
+ req.add('studiensemester_kurzbz', getStudiensemester());
var response = req.executePOST();
diff --git a/content/fas.xul.php b/content/fas.xul.php
index 80efdb2f9..29515eae6 100644
--- a/content/fas.xul.php
+++ b/content/fas.xul.php
@@ -140,6 +140,10 @@ foreach($addon_obj->result as $addon)
+
+
+
+
@@ -507,19 +511,52 @@ foreach($addon_obj->result as $addon)
label = "&menu-dokumente-zutrittskarte.label;"
command = "menu-dokumente-zutrittskarte:command"
accesskey = "&menu-dokumente-zutrittskarte.accesskey;"/>
+
-
+
+ accesskey = "&menu-dokumente-inskriptionsbestaetigungeng.accesskey;"
+ />
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Leitung/Actions.js b/public/js/components/Studierendenantrag/Leitung/Actions.js
new file mode 100644
index 000000000..2720a7df5
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Leitung/Actions.js
@@ -0,0 +1,85 @@
+import ActionsNew from './Actions/New.js';
+import ActionsColumns from './Actions/Columns.js';
+
+export default {
+ components: {
+ ActionsNew,
+ ActionsColumns
+ },
+ props: {
+ selectedData: Array,
+ columns: Array,
+ stgL: Array,
+ stgA: Array
+ },
+ emits: [
+ 'reload',
+ 'download',
+ 'action:approve',
+ 'action:reject',
+ 'action:reopen'
+ ],
+ data() {
+ return {
+ currentStudent: ''
+ }
+ },
+ computed: {
+ selectedCanBeApproved() {
+ if (!this.selectedData.length)
+ return false;
+ if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz)))
+ return false;
+ return this.selectedData.filter(row => {
+ return (row.typ == 'Wiederholung' && row.status == 'Lvszugewiesen') || (row.typ != 'Wiederholung' && (row.status == 'Erstellt' || row.status == 'ErstelltStgl'));
+ }).length == this.selectedData.length;
+ },
+ selectedCanBeRejected() {
+ if (!this.selectedData.length)
+ return false;
+ if (!this.selectedData.every(val => this.stgL.includes(val.studiengang_kz)))
+ return false;
+ return this.selectedData.filter(row => {
+ return (row.typ == 'Unterbrechung' && row.status == 'Erstellt');
+ }).length == this.selectedData.length;
+ },
+ selectedCanBeReopened() {
+ if (!this.selectedData.length)
+ return false;
+ if (!this.selectedData.every(val => this.stgA.includes(val.studiengang_kz)))
+ return false;
+ return this.selectedData.filter(row => {
+ return (row.typ == 'Wiederholung' && row.status == 'Verzichtet');
+ }).length == this.selectedData.length;
+ },
+ newUrl() {
+ return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + this.currentStudent;
+ }
+ },
+ methods: {
+ hideModal() {
+ bootstrap.Modal.getInstance(this.$refs.modal).hide();
+ }
+ },
+ template: `
+
+
+
+
+
{{$p.t('table', 'with_selected', {count: selectedData.length})}}
+
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js b/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js
new file mode 100644
index 000000000..55a7bd1cc
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Leitung/Actions/Columns.js
@@ -0,0 +1,22 @@
+export default {
+ props: {
+ columns: Array
+ },
+ methods: {
+ toggleColumn(col) {
+ col.visible = !col.visible;
+ col.original.toggle()
+ }
+ },
+ template: `
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Leitung/Actions/New.js b/public/js/components/Studierendenantrag/Leitung/Actions/New.js
new file mode 100644
index 000000000..8952c4e78
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Leitung/Actions/New.js
@@ -0,0 +1,109 @@
+import BsAlert from '../../../Bootstrap/Alert.js';
+import BsModal from '../../../Bootstrap/Modal.js';
+
+export default {
+ components: {
+ BsModal,
+ AutoComplete: primevue.autocomplete
+ },
+ emits: [
+ 'reload'
+ ],
+ data() {
+ return {
+ data: [],
+ student: '',
+ abortController: null
+ }
+ },
+ computed: {
+ newUrl() {
+ return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/lehre/Studierendenantrag/abmeldungStgl/' + this.student.prestudent_id;
+ }
+ },
+ methods: {
+ openForm() {
+ bootstrap.Modal.getInstance(this.$refs.modal).hide();
+ BsModal.popup(Vue.h('iframe', {
+ src: this.newUrl,
+ class: 'position-absolute top-0 start-0 w-100 h-100'
+ }), {
+ dialogClass: 'modal-fullscreen'
+ }, this.$p.t('studierendenantrag', 'antrag_header')).then(() => {
+ this.$emit('reload');
+ this.student = '';
+ });
+ },
+ loadData(evt) {
+ if (this.abortController)
+ this.abortController.abort();
+ this.abortController = new AbortController();
+
+ axios.post(
+ FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router +
+ '/components/Antrag/Abmeldung/getStudiengaengeAssistenz/',
+ evt,
+ {
+ signal: this.abortController.signal
+ }
+ ).then(
+ result => {
+ if (result.data.error) {
+ BsAlert.popup(result.data.retval, {dialogClass: 'alert alert-danger'});
+ } else {
+ this.data = result.data.retval;
+ }
+ return result;
+ }
+ ).catch(() => {});
+ }
+ },
+ template: `
+
+
+
+
+
+
+
+
+
+
+
+
+ {{slotProps.option.name}}
+
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Leitung/GrundPopup.js b/public/js/components/Studierendenantrag/Leitung/GrundPopup.js
new file mode 100644
index 000000000..bdea298ec
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Leitung/GrundPopup.js
@@ -0,0 +1,59 @@
+import BsAlert from '../../Bootstrap/Alert.js';
+
+export default {
+ mixins: [
+ BsAlert,
+ ],
+ props: {
+ placeholder: String,
+ default: String,
+ countRemaining: Number,
+ optional: Boolean
+ },
+ data: () => ({
+ value: '',
+ result: false,
+ check: false,
+ isInvalid: false
+ }),
+ methods: {
+ submit() {
+ if (!this.value && !this.optional) {
+ this.isInvalid = true;
+ } else {
+ this.result = [this.value, this.check];
+ this.hide();
+ }
+ }
+ },
+ created() {
+ if (this.default)
+ this.value = this.default;
+ },
+ popup(msg, options) {
+ if (typeof options === 'string')
+ options = { default: options };
+ return BsAlert.popup.bind(this)(msg, options);
+ },
+ template: `
+
+
+
+
+
+
+
+ {{$p.t('kvp','new.error.required')}}
+
+
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Leitung/Header.js b/public/js/components/Studierendenantrag/Leitung/Header.js
new file mode 100644
index 000000000..addb3ff72
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Leitung/Header.js
@@ -0,0 +1,74 @@
+const LOCAL_STORAGE_ID = 'studierendenantrag_leitung_2023-11-14_header_filter';
+
+export default {
+ props: {
+ stgs: Array
+ },
+ emits: [
+ 'input'
+ ],
+ data() {
+ return {
+ todo_value: '',
+ stg_value: ''
+ }
+ },
+ computed: {
+ value() {
+ const a = [];
+ if (this.todo_value)
+ a.push(this.todo_value);
+ if (this.stg_value)
+ a.push(this.stg_value);
+
+ return a.join('/');
+ }
+ },
+ watch: {
+ value(n) {
+ window.localStorage.setItem(LOCAL_STORAGE_ID, n);
+ this.$emit('input', n);
+ }
+ },
+ created() {
+ var values = 'todo';
+ const savedPath = window.localStorage.getItem(LOCAL_STORAGE_ID);
+ if (savedPath !== null) {
+ values = savedPath;
+ }
+
+ values = values.split('/');
+
+ if (values.length) {
+ if (values.length == 1) {
+ if (values[0] == 'todo')
+ values.push('');
+ else
+ values.unshift('');
+ }
+ this.stg_value = values.pop();
+ this.todo_value = values.pop();
+ }
+ },
+ template: `
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Leitung/LvPopup.js b/public/js/components/Studierendenantrag/Leitung/LvPopup.js
new file mode 100644
index 000000000..700a2330b
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Leitung/LvPopup.js
@@ -0,0 +1,151 @@
+import BsAlert from '../../Bootstrap/Alert.js';
+import {CoreFetchCmpt} from "../../Fetch.js";
+
+export default {
+ components: {
+ CoreFetchCmpt
+ },
+ mixins: [
+ BsAlert
+ ],
+ props: {
+ footer: Boolean,
+ antragId: Number,
+ countRemaining: Number
+ },
+ data(){
+ return {
+ lvs: null,
+ repeat_last: false,
+ refresh: true,
+ result: false,
+ check: false
+ };
+ },
+ computed: {
+ lvzugelassen() {
+ let zwischen = {};
+ for (let k in this.lvs){
+ zwischen[k] = this.lvs[k] ? this.lvs[k].filter(lv=>lv.antrag_zugelassen) : null;
+ }
+ return zwischen;
+ },
+ lvzugelassenLength() {
+ return Object.values(this.lvzugelassen).reduce((result, current) => result + (current ? current.length : 0), 0);
+ }
+ },
+ methods: {
+ setlvs(param) {
+ if(param.error) {
+ this.$refs.fetchCompt.error = true;
+ this.$refs.fetchCompt.errorMessage = param.retval;
+ } else {
+ this.repeat_last = !!param.retval.repeat_last;
+ if (this.repeat_last) {
+ delete param.retval.repeat_last;
+ }
+ this.lvs = param.retval;
+ }
+ },
+ loadlvs() {
+ if (!this.antragId)
+ return new Promise(() => {});
+ return axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId);
+ },
+ submit(result) {
+ this.result = [result, this.check];
+ this.hide();
+ }
+ },
+ watch: {
+ antragId() {
+ Vue.nextTick(() => {
+ this.refresh = !this.refresh;
+ });
+ }
+ },
+ popup(msg, options) {
+ if (typeof options === 'string')
+ options = { default: options };
+ return BsAlert.popup.bind(this)(msg, options);
+ },
+ template: `
+
+
+
+
+
+
+
+ {{$p.t('studierendenantrag','error_no_lvs')}}
+
+
+
+
+ {{ $p.t('studierendenantrag',['title_lv_nicht_zugelassen', 'title_lv_wiederholen'][repeat_last ? 1 : sem.substr(0,1)-1]) }}
+ {{sem.substr(1)}}
+
+
+
+
+ | {{$p.t('ui','bezeichnung')}} |
+ {{$p.t('lehre','lehrform')}} |
+ ECTS |
+ {{$p.t('lehre','note')}} |
+
+ {{$p.t('global','anmerkung')}}
+ |
+
+
+
+
+ | {{$p.t('studierendenantrag/error_stg_last_semester')}} |
+
+
+
+ |
+
+ |
+
+
+ {{lv.lehrform_kurzbz}}
+
+ |
+
+
+ {{lv.ects}}
+
+ |
+
+
+ {{lv.note || '---'}}
+
+ |
+
+
+ {{lv.antrag_anmerkung}}
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Leitung/Table.js b/public/js/components/Studierendenantrag/Leitung/Table.js
new file mode 100644
index 000000000..6c1417f69
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Leitung/Table.js
@@ -0,0 +1,492 @@
+import BsModal from '../../Bootstrap/Modal.js';
+import {CoreFetchCmpt} from '../../Fetch.js';
+import LvPopup from './LvPopup.js';
+import { dateFilter } from '../../../tabulator/filters/Dates.js';
+
+export default {
+ components: {
+ BsModal,
+ CoreFetchCmpt,
+ LvPopup
+ },
+ props: {
+ selectedData: Array,
+ columnData: Array,
+ stgL: Array,
+ stgA: Array,
+ filter: String
+ },
+ emits: [
+ 'update:columnData',
+ 'update:selectedData',
+ 'action:approve',
+ 'action:reject',
+ 'action:reopen',
+ 'action:object',
+ 'action:objectionDeny',
+ 'action:objectionApprove',
+ 'action:cancel',
+ 'action:pause',
+ 'action:unpause'
+ ],
+ data() {
+ return {
+ ajaxUrl: FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router +
+ '/components/Antrag/Leitung/getAntraege/',
+ table: null,
+ lastHistoryClickedId: null,
+ historyData: [],
+ lvsData: null
+ }
+ },
+ methods: {
+ reload(stg) {
+ this.table.setData(this.ajaxUrl + (stg || ''));
+ },
+ download() {
+ this.table.download("csv", "data.csv", {
+ delimiter: ';',
+ bom: true
+ });
+ },
+ getHistory() {
+ if (this.lastHistoryClickedId === null)
+ return null;
+ return axios.get(
+ FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router +
+ '/components/Antrag/Leitung/getHistory/' +
+ this.lastHistoryClickedId
+ ).then(res => {
+ this.historyData = res.data.retval.sort((a, b) => a.insertamum > b.insertamum);
+ });
+ },
+ getHistoryStatus(data, index) {
+ if (data.insertvon == 'Studienabbruch')
+ return this.$p.t('studierendenantrag/status_stop');
+ if (index > 0 && this.historyData[index-1].studierendenantrag_statustyp_kurzbz == 'Pause') {
+ if (index > 1 && this.historyData[index-2].studierendenantrag_statustyp_kurzbz != 'Pause') {
+ // NOTE(chris): this is a AbmeldungStgl Pause right after a manual Pause
+ if (data.studierendenantrag_statustyp_kurzbz == 'Pause')
+ return data.typ;
+ // NOTE(chris): this is a manual Pause resumed
+ else
+ return data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')';
+ }
+ // NOTE(chris): a series of pause stati always starts with a manual and alternate afterwards
+ let i = 2;
+ while (index-i > 0 && this.historyData[index-i].studierendenantrag_statustyp_kurzbz == 'Pause') i++;
+ if (data.studierendenantrag_statustyp_kurzbz == 'Pause')
+ i++;
+ return i%2
+ ? data.typ
+ : data.typ + ' (' + this.$p.t('studierendenantrag/status_unpaused') + ')';
+ }
+ return data.typ;
+ },
+ showHistoryGrund(grund) {
+ this.$refs.modalGrund.$el.addEventListener(
+ 'hidden.bs.modal',
+ this.$refs.history.show,
+ {
+ once: true
+ }
+ );
+ this.$refs.modalGrundPre.innerHTML = grund;
+ },
+ showLVs(data) {
+ this.lvsData = data;
+ this.$refs.lvList.show();
+ }
+ },
+ async mounted() {
+ await this.$p.loadCategory(['lehre', 'studierendenantrag', 'person', 'global', 'ui']);
+ function dateFormatter(cell)
+ {
+ let val = cell.getValue();
+ if (!val)
+ return ' ';
+ let date = new Date(val);
+ return date.toLocaleDateString();
+ }
+
+ this.table = new Tabulator(this.$refs.table, {
+ placeholder:"Keine zu bearbeitenden Datensätze",
+ movableColumns: true,
+ height: '65vh',
+ layout: "fitDataFill",
+ ajaxURL: this.ajaxUrl + (this.filter || ''),
+ persistence: { // NOTE(chris): do not store column titles
+ sort: true, //persist column sorting
+ filter: true, //persist filters
+ headerFilter: true, //persist header filters
+ group: true, //persist row grouping
+ page: true, //persist page
+ columns: ["width", "visible"], //persist columns
+ },
+ persistenceID: 'studierendenantrag_leitung_2023-11-14',
+ columns: [{
+ formatter: 'rowSelection',
+ titleFormatter: 'rowSelection',
+ titleFormatterParams: {
+ rowRange: 'active'
+ },
+ hozAlign: 'center',
+ headerSort: false
+ }, {
+ field: 'studierendenantrag_id',
+ title: '#',
+ sorter: 'number'
+ }, {
+ field: 'bezeichnung',
+ title: this.$p.t('lehre', 'studiengang'),
+ headerFilter: 'list',
+ headerFilterParams: {
+ valuesLookup: true,
+ clearable: true,
+ autocomplete: true,
+ }
+ }, {
+ field: 'orgform',
+ title: this.$p.t('lehre', 'organisationsform'),
+ headerFilter: 'list',
+ headerFilterParams: {
+ valuesLookup: true,
+ clearable: true,
+ autocomplete: true,
+ }
+ }, {
+ field: 'typ',
+ title: this.$p.t('studierendenantrag', 'antrag_typ'),
+ headerFilter: 'list',
+ headerFilterParams: {
+ valuesLookup: true,
+ clearable: true,
+ autocomplete: true,
+ },
+ formatter: (cell, formatterParams, onRendered) => {
+ return this.$p.t('studierendenantrag','antrag_typ_' + cell.getValue());
+ }
+ }, {
+ field: 'statustyp',
+ title: this.$p.t('studierendenantrag', 'antrag_status'),
+ headerFilter: 'list',
+ headerFilterParams: {
+ valuesLookup: true,
+ clearable: true,
+ autocomplete: true,
+ },
+ formatter: (cell, formatterParams, onRendered) => {
+ let data = cell.getData();
+ let status = cell.getValue();
+ if (data.status_insertvon == 'Studienabbruch' && data.status == 'Pause')
+ status = this.$p.t('studierendenantrag/status_stop');
+ let link = document.createElement('a');
+ link.href = "#";
+ link.innerHTML = status;
+ link.addEventListener('click', e => {
+ e.preventDefault();
+ this.lastHistoryClickedId = cell.getData().studierendenantrag_id;
+ this.$refs.historyLoader.fetchData();
+ this.$refs.history.show();
+ });
+
+ return link;
+ }
+ }, {
+ field: 'matrikelnr',
+ title: this.$p.t('person', 'personenkennzeichen'),
+ headerFilter: 'input'
+ }, {
+ field: 'prestudent_id',
+ title: this.$p.t('lehre', 'prestudent'),
+ headerFilter: 'input'
+ }, {
+ field: 'name',
+ title: this.$p.t('global', 'name'),
+ mutator: (value, data) => (data.nachname + ' ' + data.vorname).replace(/^\s*(.*)\s*$/, '$1'),
+ headerFilter: 'input'
+ }, {
+ field: 'datum',
+ title: this.$p.t('global', 'datum'),
+ formatter: dateFormatter,
+ headerFilterFunc: 'dates',
+ headerFilter: dateFilter
+ }, {
+ field: 'datum_wiedereinstieg',
+ title: this.$p.t('studierendenantrag', 'antrag_datum_wiedereinstieg'),
+ formatter: dateFormatter,
+ headerFilterFunc: 'dates',
+ headerFilter: dateFilter
+ }, {
+ field: 'grund',
+ title: this.$p.t('studierendenantrag', 'antrag_grund'),
+ formatter: (cell, formatterParams, onRendered) => {
+ let link = document.createElement('a'),
+ val = cell.getValue();
+ link.href = "#modal-grund";
+ link.setAttribute('data-bs-toggle', 'modal');
+ link.innerHTML = this.$p.t('studierendenantrag', 'antrag_grund');
+ link.addEventListener('click', () => {
+ this.$refs.modalGrundPre.innerHTML = val;
+ });
+
+ return val ? link : ' ';
+ }
+ }, {
+ field: 'dms_id',
+ title: this.$p.t('studierendenantrag', 'antrag_dateianhaenge'),
+ formatter: (cell, formatterParams, onRendered) => {
+ let val = cell.getValue();
+ if (!val)
+ return ' ';
+ let link = document.createElement('a');
+ link.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router +
+ '/lehre/Antrag/Attachment/show/' +
+ val;
+ link.setAttribute('target', '_blank');
+ link.innerHTML = '
';
+ link.append(this.$p.t('studierendenantrag/antrag_anhang'));
+ return link;
+ }
+ }, {
+ field: 'actions',
+ frozen: true,
+ title: this.$p.t('ui', 'aktion'),
+ headerFilter: false,
+ headerSort: false,
+ formatter: (cell, formatterParams, onRendered) => {
+ let container = document.createElement('div'),
+ data = cell.getData();
+
+ container.className = "d-flex gap-2";
+
+ let allowed_status_for_download = [];
+ switch (data.typ) {
+ case 'Abmeldung':
+ allowed_status_for_download = ['Genehmigt'];
+ break;
+ case 'AbmeldungStgl':
+ allowed_status_for_download = ['Genehmigt', 'Beeinsprucht', 'EinspruchAbgelehnt', 'Abgemeldet'];
+ break;
+ case 'Unterbrechung':
+ allowed_status_for_download = ['Genehmigt', 'EmailVersandt'];
+ break;
+ case 'Wiederholung':
+ allowed_status_for_download = ['Abgemeldet'];
+ break;
+ }
+ if (allowed_status_for_download.includes(data.status)) {
+ // NOTE(chris): Download PDF
+ let button = document.createElement('a');
+ // NOTE(chris): phrasen in attribues don't work if they are not preloaded
+ // it work in this case because the category has already been loaded before
+ button.innerHTML = '
';
+ button.className = "btn btn-outline-secondary";
+ button.target = "_blank";
+ button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ 'content/pdfExport.php?xml=Antrag' + data.typ + '.xml.php&xsl=Antrag' + data.typ + '&id=' + data.studierendenantrag_id + '&output=pdf';
+ container.append(button);
+ }
+
+ if (data.typ == 'Wiederholung' && (data.status == 'ErsteAufforderungVersandt' || data.status == 'ZweiteAufforderungVersandt')) {
+ // NOTE(chris): Pause
+ let button = document.createElement('button');
+ let icon = document.createElement('i');
+ let span = document.createElement('span');
+
+ icon.className = "fa-solid fa-pause";
+ icon.setAttribute('aria-hidden', true);
+ icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_pause'));
+
+ span.className = "fa-sr-only";
+ span.append(this.$p.t('studierendenantrag', 'btn_pause'));
+
+ button.append(icon);
+ button.append(span);
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:pause', [cell.getData()]));
+ container.append(button);
+ }
+
+ let canUnpause = data.status == 'Pause' && !['AbmeldungStgl', 'Studienabbruch'].includes(data.status_insertvon);
+ if (!canUnpause && data.status == 'Pause' && data.status_insertvon == 'AbmeldungStgl') {
+ canUnpause = cell.getTable().getData().filter(row =>
+ row.prestudent_id == data.prestudent_id
+ && row.typ == 'AbmeldungStgl'
+ && row.status == 'Zurueckgezogen'
+ && row.status_insertamum == data.status_insertamum
+ ).length;
+ }
+ if (canUnpause) {
+ // NOTE(chris): Unpause
+ let button = document.createElement('button');
+ let icon = document.createElement('i');
+ let span = document.createElement('span');
+
+ icon.className = "fa-solid fa-play";
+ icon.setAttribute('aria-hidden', true);
+ icon.setAttribute('title', this.$p.t('studierendenantrag', 'btn_unpause'));
+
+ span.className = "fa-sr-only";
+ span.append(this.$p.t('studierendenantrag', 'btn_unpause'));
+
+ button.append(icon);
+ button.append(span);
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:unpause', [cell.getData()]));
+ container.append(button);
+ }
+
+ if (data.typ == 'AbmeldungStgl' && data.status == 'Genehmigt') {
+ // NOTE(chris): Object
+ let button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_object'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:object', [cell.getData()]));
+ container.append(button);
+ }
+
+ if (data.typ == 'AbmeldungStgl' && data.status == 'Beeinsprucht') {
+ // NOTE(chris): Deny Objection
+ let button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_objection_deny'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:objectionDeny', [cell.getData()]));
+ container.append(button);
+
+ // NOTE(chris): Approve Objection
+ button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_objection_approve'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:objectionApprove', [cell.getData()]));
+ container.append(button);
+ }
+
+ if (this.stgA.includes(data.studiengang_kz)) {
+ // NOTE(chris): Reopen
+ if (data.typ == 'Wiederholung' && data.status == 'Verzichtet') {
+ let button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_reopen'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:reopen', [cell.getData()]));
+ container.append(button);
+ }
+ // NOTE(chris): Lv Zuweisen
+ if (data.typ == 'Wiederholung' && (data.status == 'Erstellt' || data.status == 'Lvszugewiesen')) {
+ let button = document.createElement('a');
+ button.append(this.$p.t('studierendenantrag', 'btn_lvzuweisen'));
+ button.className = "btn btn-outline-secondary";
+ button.href = FHC_JS_DATA_STORAGE_OBJECT.app_root +
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router +
+ '/lehre/Antrag/Wiederholung/assistenz/' +
+ cell.getData().studierendenantrag_id + '/frame';
+ button.onclick = e => {
+ e.preventDefault();
+ BsModal.popup(Vue.h('iframe', {
+ src: button.href,
+ class: 'position-absolute top-0 start-0 w-100 h-100'
+ }), {
+ dialogClass: 'modal-fullscreen'
+ }, this.$p.t('studierendenantrag', 'title_lvzuweisen', cell.getData())).then(() => {
+ this.$emit('reload');
+ });
+ };
+ container.append(button);
+ }
+ // NOTE(chris): Cancel
+ if (data.typ == 'AbmeldungStgl' && (data.status == 'Erstellt' || data.status == 'Genehmigt' )) {
+ let button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_cancel'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click',() => this.$emit('action:cancel', [cell.getData()]));
+ container.append(button);
+ }
+ }
+
+ if (this.stgL.includes(data.studiengang_kz)) {
+ // NOTE(chris): Approve
+ if ((data.typ == 'Wiederholung' && data.status == 'Lvszugewiesen') || (data.typ != 'Wiederholung' && data.status == 'Erstellt')) {
+ let button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_approve'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:approve', [cell.getData()]));
+ container.append(button);
+ }
+ // NOTE(chris): Reject (Unterbrechung braucht grund)
+ if (data.status == 'Erstellt' && data.typ == 'Unterbrechung') {
+ let button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_reject'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.$emit('action:reject', [cell.getData()]));
+ container.append(button);
+ }
+ }
+
+ // NOTE(chris): Show LVs
+ if (data.typ == 'Wiederholung' && (data.status == 'Lvszugewiesen' || data.status == 'Genehmigt')) {
+ let button = document.createElement('button');
+ button.append(this.$p.t('studierendenantrag', 'btn_show_lvs'));
+ button.className = "btn btn-outline-secondary";
+ button.addEventListener('click', () => this.showLVs(cell.getData()));
+ container.append(button);
+ }
+
+ if (container.innerHTML == '')
+ container.innerHTML = ' ';
+
+ return container;
+ }
+ }]
+ });
+ this.table.on("tableBuilt", () => {
+ let columns = this.table.getColumns();
+ let columnData = [];
+ for (let col of columns) {
+ let def = col.getDefinition();
+ if (def.title && !def.frozen) {
+ columnData.push({
+ title: def.title,
+ visible: col.isVisible(),
+ original: col
+ });
+ }
+ }
+ this.$emit('update:columnData', columnData);
+ });
+ this.table.on("rowSelectionChanged", data => {
+ this.$emit('update:selectedData', data);
+ });
+ },
+ template: `
+
+
+
+ {{$p.t('studierendenantrag', 'antrag_grund')}}
+
+
+
+ {{$p.t('studierendenantrag', 'title_history', {id: lastHistoryClickedId})}}
+
+
+
+
+
+ {{$p.t('studierendenantrag', 'title_show_lvs', lvsData ? lvsData : {name: ''}) }}
+
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Lvzuweisung.js b/public/js/components/Studierendenantrag/Lvzuweisung.js
new file mode 100644
index 000000000..5ef1e9030
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Lvzuweisung.js
@@ -0,0 +1,262 @@
+import StudierendenantragStatus from './Status.js';
+
+export default {
+ components: {
+ StudierendenantragStatus
+ },
+ props: {
+ antragId: Number,
+ initialStatusCode: String,
+ initialStatusMsg: String,
+ disabled: Boolean
+ },
+ data() {
+ return {
+ lvs: [],
+ isloading: false,
+ statusCode: '',
+ statusMsg: ''
+ };
+ },
+ computed: {
+ lvs1() {
+ return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1)] || [];
+ },
+ lvs2() {
+ return this.lvs[Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2)] || [];
+ },
+ lvs1sem(){
+ return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 1).pop() || "1").substr(1);
+ },
+ lvs2sem(){
+ return (Object.keys(this.lvs).filter(key => key.substr(0, 1) == 2).pop() || "2").substr(1);
+ },
+ statusSeverity() {
+ switch (this.statusCode) {
+ case 0: return 'danger';
+ default: return 'info';
+ }
+ }
+ },
+ methods: {
+ save() {
+ this.isloading = true;
+ const forbiddenLvs = this.lvs1.filter(lv => (lv.antrag_zugelassen || this.lvs.repeat_last)
+ && !lv._children).map(lv => ({
+ studierendenantrag_id: this.antragId,
+ lehrveranstaltung_id: lv.lehrveranstaltung_id,
+ zugelassen: this.lvs.repeat_last ? (lv.antrag_zugelassen ? 1 : 2) : 0,
+ anmerkung: lv.antrag_anmerkung || "",
+ studiensemester_kurzbz: this.lvs1sem
+ }));
+ const mandatoryLvs = this.lvs2.filter(lv => !lv._children).map(lv => ({
+ studierendenantrag_id: this.antragId,
+ lehrveranstaltung_id: lv.lehrveranstaltung_id,
+ zugelassen:lv.antrag_zugelassen ? 1 : 2,
+ anmerkung: lv.antrag_anmerkung || "",
+ studiensemester_kurzbz: this.lvs2sem
+ }));
+ axios.post(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/saveLvs/', {forbiddenLvs, mandatoryLvs})
+ .then(response => {
+ if(!response.data.error) {
+ this.addAlert('Speichern erfolgreich', 'alert-success');
+ this.statusCode = response.data.retval[0].studierendenantrag_statustyp_kurzbz;
+ this.statusMsg = response.data.retval[0].typ;
+ } else {
+ this.addAlert(response.data.retval.message || response.data.retval, 'alert-danger');
+ this.statusCode = 0;
+ this.statusMsg = 'Error';
+ }
+ this.isloading = false;
+ }).catch(error => {
+ this.addAlert(error.message, 'alert-danger');
+ this.statusCode = 0;
+ this.statusMsg = 'Error';
+ this.isloading = false;
+ }).finally(() => {
+ window.scrollTo(0, 0);
+ });
+ },
+ addAlert(text, type) {
+ const para = document.createElement("p");
+ para.innerText = text;
+ para.className = "alert " + type + " alert-dismissible fade show";
+ const btn = document.createElement("button");
+ btn.className = "btn-close";
+ btn.type = "button";
+ btn.setAttribute("aria-label", "Close");
+ btn.setAttribute("data-bs-dismiss", "alert");
+ para.appendChild(btn);
+
+ this.$refs.alertbox.appendChild(para);
+ }
+ },
+ created() {
+ this.statusCode = this.initialStatusCode;
+ this.statusMsg = this.initialStatusMsg;
+ },
+ mounted() {
+ axios.get(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/components/Antrag/Wiederholung/getLvs/' + this.antragId).then(
+ result => {
+ if(result.data.error)
+ {
+ this.addAlert(result.data.retval, 'alert-danger');
+ this.isloading = true;
+ }
+ else
+ {
+ let res = {};
+ this.$p
+ .loadCategory(['ui', 'lehre', 'studierendenantrag', 'global'])
+ .then(() => {
+ for (var k in result.data.retval) {
+ if (k === 'repeat_last')
+ continue;
+ if (result.data.retval[k] === null) {
+ const alert = document.createElement('div');
+ alert.innerHTML = this.$p.t('studierendenantrag', 'error_stg_last_semester');
+ alert.className = 'alert alert-warning';
+ alert.role = 'alert';
+ this.$refs["lvtable" + k.substr(0,1)].append(alert);
+ continue;
+ }
+ let lvs = result.data.retval[k].reduce((obj,lv) => {
+ obj[lv.studienplan_lehrveranstaltung_id] = lv;
+ return obj;
+ }, {});
+ for (var lv of Object.values(lvs)) {
+ if (!lv.studienplan_lehrveranstaltung_id_parent)
+ continue;
+ if (!lvs[lv.studienplan_lehrveranstaltung_id_parent])
+ console.error('parent not available');
+ else {
+ if (!lvs[lv.studienplan_lehrveranstaltung_id_parent]._children)
+ lvs[lv.studienplan_lehrveranstaltung_id_parent]._children = [];
+ lvs[lv.studienplan_lehrveranstaltung_id_parent]._children.push(lv);
+ }
+ }
+ res[k] = Object.values(lvs).filter(lv => !lv.studienplan_lehrveranstaltung_id_parent);
+ let current = res[k];
+ let index = k.substr(0,1);
+
+ const options = {
+ data: current,
+ dataTree: true,
+ dataTreeStartExpanded: true, //start with an expanded tree
+ dataTreeChildIndent: 15,
+ layout: "fitDataStretch",
+ columns: [
+ {title: this.$p.t('ui', 'bezeichnung'), field: "bezeichnung"},
+ {title: this.$p.t('lehre','lehrform'), field: "lehrform_kurzbz"},
+ {title: "ECTS", field: "ects"},
+ {title: this.$p.t('lehre','note'), field: "note", formatter:(cell, formatterParams, onRendered)=>cell.getValue() || "---"},
+ {
+ title: index == 1 && !result.data.retval.repeat_last ? this.$p.t('studierendenantrag','lv_nicht_zulassen') : this.$p.t('studierendenantrag','lv_wiederholen'),
+ field: "antrag_zugelassen",
+ formatter: (cell, formatterParams, onRendered) => {
+ let data = cell.getData();
+ if(data._children || !data.zeugnis)
+ return "";
+ let input = document.createElement('input');
+ input.className = "form-check-input";
+ input.type = "checkbox";
+ input.role = "switch";
+ input.checked = cell.getValue();
+ input.addEventListener('input', () => {
+ lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen = input.checked;
+ cell.getRow().reformat();
+ });
+ if (this.disabled) {
+ input.disabled = true;
+ }
+
+ let div = document.createElement('div');
+ div.className = 'form-check form-switch';
+ div.append(input);
+
+ return div;
+ }
+ },
+ {
+ title: this.$p.t('global','anmerkung'),
+ field: "antrag_anmerkung",
+ headerSort:false,
+ titleFormatter:(cell, formatterParams, onRendered)=>{
+ let link = document.createElement('a');
+ link.addEventListener('click', (e) => {
+ e.preventDefault();
+ });
+
+ link.href ="#";
+ link.title = this.$p.t('studierendenantrag','anmerkung_tooltip');
+ new bootstrap.Tooltip(link);
+ let tooltip = document.createElement('span');
+ tooltip.innerHTML = this.$p.t('global','anmerkung') + " ";
+ tooltip.append(link);
+
+ let icon = document.createElement('i');
+ link.append(icon);
+ icon.className = "fa fa-info-circle";
+ icon.setAttribute("aria-hidden", "true");
+ icon.style.minWidth = '1em';
+
+ return tooltip;
+
+ },
+ formatter: (cell, formatterParams, onRendered) => {
+ if (this.disabled) {
+ return cell.getValue() || "";
+ }
+ var data = cell.getData();
+ if (lvs[data.studienplan_lehrveranstaltung_id].antrag_zugelassen)
+ {
+ let input = document.createElement('input');
+ input.className = "form-control";
+ input.type = "text";
+ input.value = cell.getValue() || "";
+ input.addEventListener('input', () => {
+ lvs[data.studienplan_lehrveranstaltung_id].antrag_anmerkung = input.value;
+ });
+ return input;
+ }
+ else
+ {
+ return "";
+ }
+ }
+ }
+ ]
+ };
+ var table = new Tabulator(this.$refs["lvtable" + k.substr(0,1)], options);
+ }
+ this.lvs = result.data.retval;
+ });
+ }
+ }
+ );
+ },
+ template: `
+
+
+
+
+ {{lvs.repeat_last ? $p.t('studierendenantrag', 'title_lv_wiederholen') : $p.t('studierendenantrag', 'title_lv_nicht_zugelassen')}}
+ {{lvs1sem}}
+
+
+
+
+
+ {{$p.t('studierendenantrag', 'title_lv_wiederholen')}}
+ {{lvs2sem}}
+
+
+
+
+
+
+
+
+
+ `
+}
diff --git a/public/js/components/Studierendenantrag/Status.js b/public/js/components/Studierendenantrag/Status.js
new file mode 100644
index 000000000..7449fd376
--- /dev/null
+++ b/public/js/components/Studierendenantrag/Status.js
@@ -0,0 +1,15 @@
+export default {
+ props: {
+ msg: String,
+ severity: String
+ },
+ computed: {
+ severityClass() {
+ return 'alert-' + this.severity;
+ }
+ },
+ template: `
+
+
+ `
+}
diff --git a/public/js/components/Tabs.js b/public/js/components/Tabs.js
new file mode 100644
index 000000000..36b6406c5
--- /dev/null
+++ b/public/js/components/Tabs.js
@@ -0,0 +1,126 @@
+import {CoreRESTClient} from '../RESTClient.js';
+import accessibility from "../directives/accessibility.js";
+
+export default {
+ directives: {
+ accessibility
+ },
+ emits: [
+ 'update:modelValue',
+ 'change',
+ 'changed'
+ ],
+ props: {
+ config: {
+ type: [String, Object],
+ required: true
+ },
+ default: String,
+ modelValue: [String, Number, Boolean, Array, Object, Date, Function, Symbol],
+ vertical: Boolean,
+ border: Boolean
+ },
+ data() {
+ return {
+ current: null,
+ tabs: {}
+ }
+ },
+ computed: {
+ currentTab() {
+ if (this.tabs[this.current])
+ return this.tabs[this.current];
+
+ return { component: 'div' };
+ },
+ value: {
+ get() {
+ return this.modelValue;
+ },
+ set(v) {
+ this.$emit('update:modelValue', v);
+ }
+ }
+ },
+ watch: {
+ config(n) {
+ this.initConfig(n);
+ }
+ },
+ methods: {
+ change(key) {
+ this.$emit("change", key)
+ this.current = key;
+ this.$nextTick(() => this.$emit("changed", key));
+ },
+ initConfig(config) {
+ if (!config)
+ return;
+ if (typeof config === 'string' || config instanceof String)
+ return CoreRESTClient.get(config)
+ .then(result => CoreRESTClient.getData(result.data))
+ .then(this.initConfig)
+ .catch(this.$fhcAlert.handleSystemError);
+
+ const tabs = {};
+
+ if (Array.isArray(config)) {
+ config.forEach((item, key) => {
+ if (!item.component)
+ return console.error('Component missing for ' + key);
+
+ tabs[key] = {
+ component: Vue.markRaw(Vue.defineAsyncComponent(() => import(item.component))),
+ title: item.title || key,
+ config: item.config,
+ key
+ }
+ });
+ } else {
+ Object.entries(config).forEach(([key, item]) => {
+ if (!item.component)
+ return console.error('Component missing for ' + key);
+
+ tabs[key] = {
+ component: Vue.markRaw(Vue.defineAsyncComponent(() => import(item.component))),
+ title: item.title || key,
+ config: item.config,
+ key
+ }
+ });
+ }
+
+ if (this.current === null || !tabs[this.current]) {
+ if (tabs[this.default])
+ this.current = this.default;
+ else
+ this.current = Object.keys(tabs)[0];
+ }
+ this.tabs = tabs;
+ }
+ },
+ created() {
+ this.initConfig(this.config);
+ },
+ template: `
+
`
+};
diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js
index e153042ad..64a75c910 100644
--- a/public/js/components/filter/Filter.js
+++ b/public/js/components/filter/Filter.js
@@ -18,20 +18,32 @@
import {CoreFilterAPIs} from './API.js';
import {CoreRESTClient} from '../../RESTClient.js';
import {CoreFetchCmpt} from '../../components/Fetch.js';
+import FilterConfig from './Filter/Config.js';
+import FilterColumns from './Filter/Columns.js';
+import TableDownload from './Table/Download.js';
//
const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter';
const FILTER_COMPONENT_NEW_FILTER_TYPE = 'Filter Component New Filter Type';
+var _uuid = 0;
+
/**
*
*/
export const CoreFilterCmpt = {
- emits: ['nwNewEntry'],
components: {
- CoreFetchCmpt
+ CoreFetchCmpt,
+ FilterConfig,
+ FilterColumns,
+ TableDownload
},
+ emits: [
+ 'nwNewEntry',
+ 'click:new'
+ ],
props: {
+ onNwNewEntry: Function, // NOTE(chris): Hack to get the nwNewEntry listener into $props
title: String,
sideMenu: {
type: Boolean,
@@ -42,10 +54,21 @@ export const CoreFilterCmpt = {
required: true
},
tabulatorOptions: Object,
- tabulatorEvents: Array
+ tabulatorEvents: Array,
+ tableOnly: Boolean,
+ reload: Boolean,
+ download: {
+ type: [Boolean, String, Function, Array, Object],
+ default: false
+ },
+ newBtnShow: Boolean,
+ newBtnClass: [String, Array, Object],
+ newBtnDisabled: Boolean,
+ newBtnLabel: String
},
data: function() {
return {
+ uuid: 0,
// FilterCmpt properties
filterName: null,
fields: null,
@@ -54,9 +77,9 @@ export const CoreFilterCmpt = {
selectedFields: null,
notSelectedFields: null,
filterFields: null,
- columnsAlias: null,
availableFilters: null,
+ selectedFilter: null,
// FetchCmpt binded properties
fetchCmptRefresh: false,
@@ -64,110 +87,182 @@ export const CoreFilterCmpt = {
fetchCmptApiFunctionParams: null,
fetchCmptDataFetched: null,
- tabulator: null
+ tabulator: null,
+ tableBuilt: false,
+ tabulatorHasSelector: false,
+ selectedData: []
};
},
- created: function() {
- this.getFilter(); // get the filter data
- },
- updated: function() {
- //
- let dataset = JSON.parse(JSON.stringify(this.dataset));
- let fields = JSON.parse(JSON.stringify(this.fields));
- let selectedFields = JSON.parse(JSON.stringify(this.selectedFields));
+ computed: {
+ filteredData() {
+ if (!this.dataset)
+ return [];
+ return JSON.parse(JSON.stringify(this.dataset));
+ },
+ filteredColumns() {
+ let fields = JSON.parse(JSON.stringify(this.fields)) || [];
+ let selectedFields = JSON.parse(JSON.stringify(this.selectedFields)) || [];
- //
- let columns = null;
+ let columns = null;
- // If the tabulator options has been provided and it contains the property columns
- if (this.tabulatorOptions != null && this.tabulatorOptions.hasOwnProperty('columns'))
- {
- columns = this.tabulatorOptions.columns;
- }
+ // If the tabulator options has been provided and it contains the property columns
+ if (this.tabulatorOptions && this.tabulatorOptions.hasOwnProperty('columns'))
+ columns = this.tabulatorOptions.columns;
- // If columns is not an array or it is an array with less elements then the array fields
- if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length))
- {
- columns = []; // set it as an empty array
-
- // Loop throught all the retrieved columns from database
- for (let i = 0; i < fields.length; i++)
+ // If columns is not an array or it is an array with less elements then the array fields
+ if (!Array.isArray(columns) || (Array.isArray(columns) && columns.length < fields.length))
{
- // Create a new column having the title equal to the field name
- let column = {
- title: fields[i],
- field: fields[i]
- };
+ columns = []; // set it as an empty array
- // If the column has to be displayed or not
- selectedFields.indexOf(fields[i]) >= 0 ? column.visible = true : column.visible = false;
-
- // Add the new column to the list of columns
- columns.push(column);
- }
- }
- else // the property columns has been provided in the tabulator options
- {
- // Loop throught the property columns of the tabulator options
- for (let i = 0; i < columns.length; i++)
- {
- // If the column has to be displayed or not
- selectedFields.indexOf(columns[i].field) >= 0 ? columns[i].visible = true : columns[i].visible = false;
-
- if (columns[i].hasOwnProperty('resizable'))
+ // Loop throught all the retrieved columns from database
+ for (let field of fields)
{
- columns[i].visible ? columns[i].resizable = true : columns[i].resizable = false;
- }
+ // Create a new column having the title equal to the field name
+ let column = {
+ title: field,
+ field: field
+ };
+
+ // If the column has to be displayed or not
+ column.visible = selectedFields.indexOf(field) >= 0;
+
+ // Add the new column to the list of columns
+ columns.push(column);
+ }
}
- }
-
- this.columnsAlias = columns;
-
- // Define a default tabulator options in case it was not provided
- let tabulatorOptions = {
- height: 500,
- layout: "fitColumns",
- movableColumns: true,
- reactiveData: true,
- columns: columns,
- data: JSON.parse(JSON.stringify(this.dataset))
- };
-
- // If it was provided
- if (this.tabulatorOptions != null)
- {
- // Then copy it...
- tabulatorOptions = this.tabulatorOptions;
- // ...and overwrite the properties data, reactiveData, movableColumns and columns
- tabulatorOptions.data = JSON.parse(JSON.stringify(this.dataset));
- tabulatorOptions.columns = columns;
- tabulatorOptions.reactiveData = true;
- tabulatorOptions.movableColumns = true;
- }
-
- // Start the tabulator with the buid options
- this.tabulator = new Tabulator(
- "#filterTableDataset",
- tabulatorOptions
- );
-
- // If event handlers have been provided
- if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0)
- {
- // Attach all the provided event handlers to the started tabulator
- for (let i = 0; i < this.tabulatorEvents.length; i++)
+ else // the property columns has been provided in the tabulator options
{
- this.tabulator.on(this.tabulatorEvents[i].event, this.tabulatorEvents[i].handler);
+ // Loop throught the property columns of the tabulator options
+ for (let col of columns)
+ {
+ // If the column has to be displayed or not
+ /* fields.indexOf(col.field) == -1; ensures displaying formatter colums
+ e.g. column with rowSelection checkboxes or with custom formatted action buttons */
+ col.visible = selectedFields.indexOf(col.field) >= 0 || fields.indexOf(col.field) == -1;
+
+ if (col.hasOwnProperty('resizable'))
+ col.resizable = col.visible;
+ }
}
+
+ return columns;
+ },
+ fieldIdsForVisibilty() {
+ if (!this.tableBuilt)
+ return [];
+ return this.tabulator.getColumns().filter(col => {
+ let def = col.getDefinition();
+ return !def.frozen && def.title;
+ }).map(col => col.getField());
+ },
+ fieldNames() {
+ if (!this.tableBuilt)
+ return {};
+ return this.tabulator.getColumns().reduce((res, col) => {
+ res[col.getField()] = col.getDefinition().title;
+ return res;
+ }, {});
+ },
+ idExtra() {
+ if (!this.uuid)
+ return '';
+ return '-' + this.uuid;
+ },
+ columnsForFilter() {
+ if (!this.filteredColumns || !this.datasetMetadata)
+ return [];
+ const filterTitles = this.filteredColumns.reduce((a,c) => {
+ a[c.field] = c.title;
+ return a;
+ }, {});
+ return this.datasetMetadata.map(el => ({...el, ...{title: filterTitles[el.name]}}));
}
},
methods: {
+ reloadTable() {
+ if (this.tableOnly)
+ this.tabulator.setData();
+ else
+ this.getFilter();
+ },
+ async initTabulator() {
+ let placeholder = '< Phrasen Plugin not loaded! >';
+ if (this.$p) {
+ await this.$p.loadCategory('ui');
+ placeholder = this.$p.t('ui/keineDatenVorhanden');
+ }
+ // Define a default tabulator options in case it was not provided
+ let tabulatorOptions = {...{
+ height: 500,
+ layout: "fitDataStretch",
+ movableColumns: true,
+ columnDefaults:{
+ tooltip: true,
+ },
+ placeholder,
+ reactiveData: true,
+ persistence: true
+ }, ...(this.tabulatorOptions || {})};
+
+ if (!this.tableOnly) {
+ tabulatorOptions.data = this.filteredData;
+ tabulatorOptions.columns = this.filteredColumns;
+ }
+
+ if (tabulatorOptions.columns && tabulatorOptions.columns.filter(el => el.formatter == 'rowSelection').length)
+ this.tabulatorHasSelector = true;
+
+ // Start the tabulator with the build options
+ this.tabulator = new Tabulator(
+ this.$refs.table,
+ tabulatorOptions
+ );
+ // If event handlers have been provided
+ if (Array.isArray(this.tabulatorEvents) && this.tabulatorEvents.length > 0)
+ {
+ // Attach all the provided event handlers to the started tabulator
+ for (let evt of this.tabulatorEvents)
+ this.tabulator.on(evt.event, evt.handler);
+ }
+ this.tabulator.on('tableBuilt', () => this.tableBuilt = true);
+ this.tabulator.on("rowSelectionChanged", data => {
+ this.selectedData = data;
+ });
+ if (this.tableOnly) {
+ this.tabulator.on('tableBuilt', () => {
+ const cols = this.tabulator.getColumns();
+ this.fields = cols.map(col => col.getField());
+ this.selectedFields = cols.filter(col => col.isVisible()).map(col => col.getField());
+ });
+ }
+ },
+ updateTabulator() {
+ if (this.tabulator) {
+ if (this.tableBuilt)
+ this._updateTabulator();
+ else
+ this.tabulator.on('tableBuilt', this._updateTabulator);
+ }
+ },
+ _updateTabulator() {
+ this.tabulatorHasSelector = this.filteredColumns.filter(el => el.formatter == 'rowSelection').length;
+ this.tabulator.setColumns(this.filteredColumns);
+ this.tabulator.setData(this.filteredData);
+ },
/**
*
*/
getFilter: function() {
- //
- this.startFetchCmpt(CoreFilterAPIs.getFilter, null, this.render);
+ if (this.selectedFilter === null)
+ this.startFetchCmpt(CoreFilterAPIs.getFilter, null, this.render);
+ else
+ this.startFetchCmpt(
+ CoreFilterAPIs.getFilterById,
+ {
+ filterId: this.selectedFilter
+ },
+ this.render
+ );
},
/**
*
@@ -180,6 +275,7 @@ export const CoreFilterCmpt = {
this.filterName = data.filterName;
this.dataset = data.dataset;
this.datasetMetadata = data.datasetMetadata;
+
this.fields = data.fields;
this.selectedFields = data.selectedFields;
this.notSelectedFields = this.fields.filter(x => this.selectedFields.indexOf(x) === -1);
@@ -195,7 +291,7 @@ export const CoreFilterCmpt = {
filter.type = data.datasetMetadata[i].type;
this.filterFields.push(filter);
- break;
+ //break;
}
}
}
@@ -209,6 +305,7 @@ export const CoreFilterCmpt = {
{
this.setDropDownMenu(data);
}
+ this.updateTabulator();
}
else
{
@@ -230,6 +327,7 @@ export const CoreFilterCmpt = {
if (link == null) link = '#';
filtersArray[filtersArray.length] = {
+ id: filters[filtersCount].filter_id,
link: link + filters[filtersCount].filter_id,
description: filters[filtersCount].desc,
sort: filtersCount,
@@ -244,6 +342,7 @@ export const CoreFilterCmpt = {
if (link == null) link = '#';
filtersArray[filtersArray.length] = {
+ id: personalFilters[filtersCount].filter_id,
link: link + personalFilters[filtersCount].filter_id,
description: personalFilters[filtersCount].desc,
subscriptDescription: personalFilters[filtersCount].subscriptDescription,
@@ -282,6 +381,7 @@ export const CoreFilterCmpt = {
if (link == null) link = '#';
filtersArray[filtersArray.length] = {
+ id: filters[filtersCount].filter_id,
option: filters[filtersCount].filter_id,
description: filters[filtersCount].desc
};
@@ -294,6 +394,7 @@ export const CoreFilterCmpt = {
if (link == null) link = '#';
filtersArray[filtersArray.length] = {
+ id: personalFilters[filtersCount].filter_id,
option: personalFilters[filtersCount].filter_id,
description: personalFilters[filtersCount].desc
};
@@ -330,12 +431,13 @@ export const CoreFilterCmpt = {
/**
*
*/
- handlerSaveCustomFilter: function(event) {
+ handlerSaveCustomFilter: function(customFilterName) {
+ this.selectedFilter = null;
//
this.startFetchCmpt(
CoreFilterAPIs.saveCustomFilter,
{
- customFilterName: document.getElementById('customFilterName').value
+ customFilterName
},
this.getFilter
);
@@ -344,159 +446,22 @@ export const CoreFilterCmpt = {
*
*/
handlerRemoveCustomFilter: function(event) {
+ let filterId = event.currentTarget.getAttribute("href").substring(1);
+ if (filterId === this.selectedFilter)
+ this.selectedFilter = null;
//
this.startFetchCmpt(
CoreFilterAPIs.removeCustomFilter,
{
- filterId: event.currentTarget.getAttribute("href").substring(1)
+ filterId: filterId
},
this.getFilter
);
},
- /**
- *
- */
- handlerApplyFilterFields: function(event) {
- let filterFields = [];
- let filterFieldDivRows = document.getElementById('filterFields').getElementsByClassName('row');
- for (let i = 0; i< filterFieldDivRows.length; i++)
- {
- let filterField = {};
-
- for (let j = 0; j< filterFieldDivRows[i].children.length; j++)
- {
- let filterColumn = filterFieldDivRows[i].children[j];
- let filterColumnElement = filterColumn.children[0];
-
- // If the first column then search for the fields dropdown
- if (j == 0) filterColumnElement = filterColumnElement.querySelector('select[name=fieldName]');
-
- // If the filter name is _not_ null and it is _not_ a new filter
- if (filterColumnElement.name != null && filterColumnElement.name != FILTER_COMPONENT_NEW_FILTER)
- {
- // Condition
- if (filterColumnElement.name == 'condition' && filterColumnElement.value == "")
- {
- alert("Please fill all the filter options");
- return;
- }
-
- // Name
- if (filterColumnElement.name == 'fieldName')
- {
- filterField.name = filterColumnElement.value;
- }
- // Operation
- if (filterColumnElement.name == 'operation')
- {
- filterField.operation = filterColumnElement.value;
- }
- // Condition
- if (filterColumnElement.name == 'condition')
- {
- filterField.condition = filterColumnElement.value;
- }
- // Option
- if (filterColumnElement.name == 'option')
- {
- filterField.option = filterColumnElement.value;
- }
- }
- }
-
- if (Object.entries(filterField).length > 0) filterFields.push(filterField);
- }
-
- //
- this.startFetchCmpt(
- CoreFilterAPIs.applyFilterFields,
- {
- filterFields: filterFields
- },
- this.getFilter
- );
- },
- /**
- *
- */
- handlerChangeFilterField: function(oldValue, newValue) {
-
- // If an old filter has been changed
- if (oldValue != "")
- {
- for (let i = 0; i < this.filterFields.length; i++)
- {
- if (this.filterFields[i].name == oldValue)
- {
- this.filterFields.splice(i, 1);
- break;
- }
- }
- }
-
- // Then add the new filter
- for (let i = 0; i < this.datasetMetadata.length; i++)
- {
- if (this.datasetMetadata[i].name == newValue)
- {
- let filter = {
- name: this.datasetMetadata[i].name,
- type: this.datasetMetadata[i].type
- };
-
- this.filterFields.push(filter);
- break;
- }
- }
- },
- /**
- *
- */
- handlerAddNewFilter: function(event) {
- // Adds a new empty filter
- this.filterFields.push({
- name: FILTER_COMPONENT_NEW_FILTER,
- type: FILTER_COMPONENT_NEW_FILTER_TYPE
- });
- },
/*
*
*/
- handlerToggleSelectedField: function(event) {
-
- // If it is a selected field
- if (this.selectedFields.indexOf(event.target.innerText) != -1)
- {
- // then hide it
- this.tabulator.hideColumn(event.target.innerText);
- // and remove it from the this.selectedFields property
- this.selectedFields.splice(this.selectedFields.indexOf(event.target.innerText), 1);
- }
- else // otherwise
- {
- // show it
- this.tabulator.showColumn(event.target.innerText);
- // and add it to the this.selectedFields property
- this.selectedFields.push(event.target.innerText);
- }
- },
- /**
- *
- */
- handlerRemoveFilterField: function(event) {
- //
- this.startFetchCmpt(
- CoreFilterAPIs.removeFilterField,
- {
- filterField: event.currentTarget.getAttribute('field-to-remove')
- },
- this.getFilter
- );
- },
- /**
- *
- */
handlerGetFilterById: function(event) {
let filterId = null;
@@ -514,19 +479,41 @@ export const CoreFilterCmpt = {
filterId = attr.substring(1);
}
- // Ajax call
+ this.switchFilter(filterId);
+ },
+ switchFilter(filterId) {
+ this.selectedFilter = filterId;
+ this.getFilter();
+ },
+ applyFilterConfig(filterFields) {
+ this.selectedFilter = null;
this.startFetchCmpt(
- CoreFilterAPIs.getFilterById,
+ CoreFilterAPIs.applyFilterFields,
{
- filterId: filterId
+ filterFields
},
- this.render
+ this.getFilter
);
}
},
+ beforeCreate() {
+ if (!this.tableOnly == !this.filterType)
+ alert('You can not have a filter-type in table-only mode!');
+ },
+ created() {
+ if (this.sideMenu && (!this.$props.onNwNewEntry || !(this.$props.onNwNewEntry instanceof Function)))
+ alert('"nwNewEntry" listener is mandatory when sideMenu is true');
+ this.uuid = _uuid++;
+ if (!this.tableOnly)
+ this.getFilter(); // get the filter data
+ },
+ mounted() {
+ this.initTabulator();
+ },
template: `
-