Compare commits

..
4 Commits
Author SHA1 Message Date
salam 464bd71542 Release: Aktuellster Entwicklungsstand für TYPO3 11.4 2026-10-18 18:06:27 +02:00
salam f3c7233f67 Initial commit: TYPO3 11.4 Setup und Extension watten 2026-10-18 17:51:54 +02:00
salam afc8a6e1f5 wip watten 2026-10-18 17:49:22 +02:00
salam 8ace316cbf first commit 2026-10-18 17:40:27 +02:00
102 changed files with 14642 additions and 594 deletions

No files matched your search

+68 -11
View File
@@ -1,12 +1,69 @@
# ==========================================
# TYPO3 v11.4 .gitignore für Extension-Entwicklung
# ==========================================
# --- Core- und Systemordner ---
/var/
/vendor/
/public/typo3/
/public/index.php
# --- Temporäre Dateien und Caches ---
/public/typo3temp/
# --- Benutzer-Uploads und Medien ---
/public/uploads/
/public/fileadmin/
# --- Konfigurationen ---
/public/typo3conf/LocalConfiguration.php
/public/typo3conf/AdditionalConfiguration.php
/public/typo3conf/PackageStates.php
# ==========================================
# EXTENSION-ENTWICKLUNG SEKTION
# ==========================================
# FALL A: Sie entwickeln über den empfohlenen "packages/" Ordner
# Wir ignorieren standardmäßig nichts im packages-Ordner,
# damit Ihre eigenen Extensions committet werden.
!/packages/
# FALL B: Sie entwickeln direkt unter "public/typo3conf/ext/"
# Ignoriere alle Extensions (z.B. Core-Reste oder Drittanbieter-Extensions)
/public/typo3conf/ext/*
# AUSNAHMEN: Tragen Sie hier die Keys Ihrer eigenen Extensions ein,
# damit Git diese trotz der obigen Regel trackt.
!/public/typo3conf/ext/wapp/
!/public/typo3conf/ext/watten/
# ==========================================
# Entwicklungstools & Umgebung
# ==========================================
# DDEV lokale Entwicklungsumgebung (falls genutzt)
/.ddev/db/
/.ddev/.import-db*
# Umgebungsvariablen & Zugangsdaten
.env
.env.local
auth.json
# --- IDEs und Editoren ---
.idea/
.vscode/
*.swp
*.bak
*~
# --- OS-spezifische Dateien ---
.DS_Store
.idea
nbproject
/var/*
!/var/labels
/vendor
/public/*
!/public/.htaccess
!/public/typo3conf
/public/typo3conf/*
!/public/typo3conf/LocalConfiguration.php
!/public/typo3conf/AdditionalConfiguration.php
Thumbs.db
# --- Frontend-Build-Tools (falls in Extensions genutzt) ---
node_modules/
/dist/
.sass-cache/
npm-debug.log*
-29
View File
@@ -1,29 +0,0 @@
{
"workbench.colorCustomizations": {
"activityBar.activeBackground": "#fec8c2",
"activityBar.background": "#fec8c2",
"activityBar.foreground": "#15202b",
"activityBar.inactiveForeground": "#15202b99",
"activityBarBadge.background": "#039d12",
"activityBarBadge.foreground": "#e7e7e7",
"activityBarTop.activeBackground": "#fec8c2",
"activityBarTop.background": "#fec8c2",
"activityBarTop.foreground": "#15202b",
"activityBarTop.inactiveForeground": "#15202b99",
"commandCenter.border": "#15202b99",
"commandCenter.foreground": "#15202b",
"sash.hoverBorder": "#fec8c2",
"statusBar.background": "#fd9a90",
"statusBar.debuggingBackground": "#fd9a90",
"statusBar.debuggingForeground": "#15202b",
"statusBar.foreground": "#15202b",
"statusBarItem.hoverBackground": "#fc6c5e",
"statusBarItem.remoteBackground": "#027d0e",
"statusBarItem.remoteForeground": "#15202b",
"titleBar.activeBackground": "#fd9a90",
"titleBar.activeForeground": "#15202b",
"titleBar.inactiveBackground": "#fd9a9099",
"titleBar.inactiveForeground": "#15202b99"
},
"peacock.remoteColor": "#fd9a90"
}
+1 -3
View File
@@ -18,13 +18,12 @@
"typo3/cms-composer-installers": true
},
"platform": {
"php": "7.4.1"
"php": "8.3"
},
"sort-packages": true
},
"require": {
"bk2k/bootstrap-package": "^12.0",
"brotkrueml/typo3-matomo-widgets": "^1.6",
"codingms/poll": "^4.0",
"fixpunkt/fp-masterquiz": "^3.7",
"friendsoftypo3/extension-builder": "^11.0",
@@ -32,7 +31,6 @@
"helhum/typo3-console": "^7.0.2",
"hermanntelser/watten": "@dev",
"mediadreams/md_newsfrontend": "^3.0",
"t3/pw_comments": "^5.2",
"typo3/cms-backend": "^11.5.0",
"typo3/cms-belog": "^11.5.0",
"typo3/cms-beuser": "^11.5.0",
Generated
+195 -312
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "7a66ef3e175b943f753b4a8f104533de",
"content-hash": "3aa64506152d3e21677418490064266b",
"packages": [
{
"name": "bacon/bacon-qr-code",
@@ -169,87 +169,6 @@
],
"time": "2023-06-30T13:47:27+00:00"
},
{
"name": "brotkrueml/typo3-matomo-widgets",
"version": "v1.7.0",
"source": {
"type": "git",
"url": "https://github.com/brotkrueml/typo3-matomo-widgets.git",
"reference": "1b3eb49c489ac02311e29ecd2da66f7de97765e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brotkrueml/typo3-matomo-widgets/zipball/1b3eb49c489ac02311e29ecd2da66f7de97765e5",
"reference": "1b3eb49c489ac02311e29ecd2da66f7de97765e5",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": ">=7.4",
"symfony/finder": "^4.4 || ^5.0 || ^6.0",
"symfony/polyfill-php80": "^1.17",
"typo3/cms-core": "^10.4.15 || ^11.5",
"typo3/cms-dashboard": "^10.4.15 || ^11.5",
"typo3/cms-install": "^10.4.15 || ^11.5"
},
"require-dev": {
"brotkrueml/coding-standards": "~2.0.2",
"brotkrueml/typo3-matomo-integration": "^1.0",
"donatj/mock-webserver": "^2.4",
"ergebnis/composer-normalize": "~2.28.0",
"php-coveralls/php-coveralls": "^2.5",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "1.9.7",
"phpunit/phpunit": "^9.5.23",
"rector/rector": "0.15.2",
"saschaegerer/phpstan-typo3": "^1.1",
"symfony/yaml": "^5.4 || ^6.0",
"symplify/phpstan-rules": "^10.1"
},
"suggest": {
"brotkrueml/typo3-matomo-integration": "Matomo integration for TYPO3"
},
"type": "typo3-cms-extension",
"extra": {
"typo3/cms": {
"web-dir": ".Build/web",
"extension-key": "matomo_widgets",
"cms-package-dir": "{$vendor-dir}/typo3/cms"
},
"branch-alias": {
"dev-main": "1.7.x-dev"
}
},
"autoload": {
"psr-4": {
"Brotkrueml\\MatomoWidgets\\": "Classes"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0-or-later"
],
"authors": [
{
"name": "Chris Müller",
"role": "Developer"
}
],
"description": "TYPO3 Dashboard widgets with Matomo reports",
"keywords": [
"TYPO3 CMS",
"TYPO3 Extension",
"dashboard",
"matomo",
"widgets"
],
"support": {
"docs": "https://docs.typo3.org/p/brotkrueml/typo3-matomo-widgets/main/en-us/",
"issues": "https://github.com/brotkrueml/typo3-matomo-widgets/issues",
"source": "https://github.com/brotkrueml/typo3-matomo-widgets"
},
"time": "2023-01-07T13:55:47+00:00"
},
{
"name": "christian-riesen/base32",
"version": "1.6.1",
@@ -1521,22 +1440,22 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "7.15.5",
"version": "7.16.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a"
"reference": "ffb62ec787050ae4fa9449cdd6b80335db69bda2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee80339fd9177ba44c49cdb653ff02a4d1106b9a",
"reference": "ee80339fd9177ba44c49cdb653ff02a4d1106b9a",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/ffb62ec787050ae4fa9449cdd6b80335db69bda2",
"reference": "ffb62ec787050ae4fa9449cdd6b80335db69bda2",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^2.5.3",
"guzzlehttp/psr7": "^2.13.1",
"guzzlehttp/promises": "^2.6",
"guzzlehttp/psr7": "^2.13.2",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.5 || ^3.0",
@@ -1629,7 +1548,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.15.5"
"source": "https://github.com/guzzle/guzzle/tree/7.16.0"
},
"funding": [
{
@@ -1645,20 +1564,20 @@
"type": "tidelift"
}
],
"time": "2026-08-24T09:21:06+00:00"
"time": "2026-10-18T13:38:36+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "2.5.3",
"version": "2.6.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1"
"reference": "3d88c829bd5f13d13847b39067dbf09a60af2154"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/cde49999552d185d64715fe9c1f77a2aadd2f9f1",
"reference": "cde49999552d185d64715fe9c1f77a2aadd2f9f1",
"url": "https://api.github.com/repos/guzzle/promises/zipball/3d88c829bd5f13d13847b39067dbf09a60af2154",
"reference": "3d88c829bd5f13d13847b39067dbf09a60af2154",
"shasum": ""
},
"require": {
@@ -1713,7 +1632,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.5.3"
"source": "https://github.com/guzzle/promises/tree/2.6.0"
},
"funding": [
{
@@ -1729,7 +1648,7 @@
"type": "tidelift"
}
],
"time": "2026-08-24T09:11:28+00:00"
"time": "2026-10-18T12:46:59+00:00"
},
{
"name": "guzzlehttp/psr7",
@@ -2072,7 +1991,7 @@
"dist": {
"type": "path",
"url": "packages/watten",
"reference": "b8c6a2eba01f08d1479bf9b503894dfa51d2f944"
"reference": "de7be741e38c818aec3849dca9b20d35b08c5478"
},
"require": {
"typo3/cms-core": "^11.5"
@@ -2102,29 +2021,29 @@
},
{
"name": "lolli42/finediff",
"version": "1.0.4",
"version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/lolli42/FineDiff.git",
"reference": "807deaf7aa119cf47b58e90ba7bf37c8c8264c7a"
"reference": "38a03ca581ee72d7b20bbb1d89d47c5ecf8b11ba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/lolli42/FineDiff/zipball/807deaf7aa119cf47b58e90ba7bf37c8c8264c7a",
"reference": "807deaf7aa119cf47b58e90ba7bf37c8c8264c7a",
"url": "https://api.github.com/repos/lolli42/FineDiff/zipball/38a03ca581ee72d7b20bbb1d89d47c5ecf8b11ba",
"reference": "38a03ca581ee72d7b20bbb1d89d47c5ecf8b11ba",
"shasum": ""
},
"require": {
"php": ">=7.2.0",
"symfony/polyfill-mbstring": "^1.23"
"ext-mbstring": "*",
"php": ">=8.2"
},
"replace": {
"cogpowered/finediff": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.4",
"phpstan/phpstan": "^1.9.14",
"phpunit/phpunit": "^8.5.33 || ^9.6.11 || ^10.3.2"
"friendsofphp/php-cs-fixer": "^3.89.1",
"phpstan/phpstan": "^2.1.31",
"phpunit/phpunit": "^11.5.43 || ^12.4.2"
},
"type": "library",
"autoload": {
@@ -2161,9 +2080,9 @@
],
"support": {
"issues": "https://github.com/lolli42/FineDiff/issues",
"source": "https://github.com/lolli42/FineDiff/tree/1.0.4"
"source": "https://github.com/lolli42/FineDiff/tree/1.1.2"
},
"time": "2024-07-09T14:52:10+00:00"
"time": "2025-10-31T12:28:27+00:00"
},
{
"name": "masterminds/html5",
@@ -2568,20 +2487,20 @@
},
{
"name": "psr/cache",
"version": "1.0.1",
"version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/cache.git",
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
"url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
"php": ">=8.0.0"
},
"type": "library",
"extra": {
@@ -2601,7 +2520,7 @@
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for caching libraries",
@@ -2611,9 +2530,9 @@
"psr-6"
],
"support": {
"source": "https://github.com/php-fig/cache/tree/master"
"source": "https://github.com/php-fig/cache/tree/3.0.0"
},
"time": "2016-08-06T20:24:11+00:00"
"time": "2021-02-03T23:26:27+00:00"
},
{
"name": "psr/container",
@@ -3162,58 +3081,57 @@
},
{
"name": "symfony/cache",
"version": "v5.4.54",
"version": "v6.4.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
"reference": "c025df9d14208da976fa84a481f2f2a6e090500a"
"reference": "7ce0de35c828d29a5602134cdcf82b9c301b198f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/c025df9d14208da976fa84a481f2f2a6e090500a",
"reference": "c025df9d14208da976fa84a481f2f2a6e090500a",
"url": "https://api.github.com/repos/symfony/cache/zipball/7ce0de35c828d29a5602134cdcf82b9c301b198f",
"reference": "7ce0de35c828d29a5602134cdcf82b9c301b198f",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/cache": "^1.0|^2.0",
"php": ">=8.1",
"psr/cache": "^2.0|^3.0",
"psr/log": "^1.1|^2|^3",
"symfony/cache-contracts": "^1.1.7|^2",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php73": "^1.9",
"symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/var-exporter": "^4.4|^5.0|^6.0"
"symfony/cache-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^3",
"symfony/var-exporter": "^6.3.6|^7.0"
},
"conflict": {
"doctrine/dbal": "<2.13.1",
"symfony/dependency-injection": "<4.4",
"symfony/http-kernel": "<4.4",
"symfony/var-dumper": "<4.4"
"symfony/dependency-injection": "<5.4",
"symfony/http-kernel": "<5.4",
"symfony/var-dumper": "<5.4"
},
"provide": {
"psr/cache-implementation": "1.0|2.0",
"psr/simple-cache-implementation": "1.0|2.0",
"symfony/cache-implementation": "1.0|2.0"
"psr/cache-implementation": "2.0|3.0",
"psr/simple-cache-implementation": "1.0|2.0|3.0",
"symfony/cache-implementation": "1.1|2.0|3.0"
},
"require-dev": {
"cache/integration-tests": "^0.18",
"doctrine/cache": "^1.6|^2.0",
"doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1|^2.0",
"psr/simple-cache": "^1.0|^2.0",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/filesystem": "^4.4|^5.0|^6.0",
"symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/messenger": "^4.4|^5.0|^6.0",
"symfony/var-dumper": "^4.4|^5.0|^6.0"
"psr/simple-cache": "^1.0|^2.0|^3.0",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/filesystem": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/messenger": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Cache\\": ""
},
"classmap": [
"Traits/ValueWrapper.php"
],
"exclude-from-classmap": [
"/Tests/"
]
@@ -3239,7 +3157,7 @@
"psr6"
],
"support": {
"source": "https://github.com/symfony/cache/tree/v5.4.54"
"source": "https://github.com/symfony/cache/tree/v6.4.47"
},
"funding": [
{
@@ -3259,28 +3177,25 @@
"type": "tidelift"
}
],
"time": "2026-08-30T20:10:04+00:00"
"time": "2026-09-29T12:25:26+00:00"
},
{
"name": "symfony/cache-contracts",
"version": "v2.5.4",
"version": "v3.7.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache-contracts.git",
"reference": "517c3a3619dadfa6952c4651767fcadffb4df65e"
"reference": "9789738bc19af1106dc54d6afba9a0b467516cf2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e",
"reference": "517c3a3619dadfa6952c4651767fcadffb4df65e",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/9789738bc19af1106dc54d6afba9a0b467516cf2",
"reference": "9789738bc19af1106dc54d6afba9a0b467516cf2",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/cache": "^1.0|^2.0|^3.0"
},
"suggest": {
"symfony/cache-implementation": ""
"php": ">=8.1",
"psr/cache": "^3.0"
},
"type": "library",
"extra": {
@@ -3289,7 +3204,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
"dev-main": "3.7-dev"
}
},
"autoload": {
@@ -3322,7 +3237,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/cache-contracts/tree/v2.5.4"
"source": "https://github.com/symfony/cache-contracts/tree/v3.7.1"
},
"funding": [
{
@@ -3333,12 +3248,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-09-25T14:11:13+00:00"
"time": "2026-06-05T06:23:12+00:00"
},
{
"name": "symfony/config",
@@ -3613,20 +3532,20 @@
},
{
"name": "symfony/deprecation-contracts",
"version": "v2.5.4",
"version": "v3.7.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "605389f2a7e5625f273b53960dc46aeaf9c62918"
"reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918",
"reference": "605389f2a7e5625f273b53960dc46aeaf9c62918",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d",
"reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=8.1"
},
"type": "library",
"extra": {
@@ -3635,7 +3554,7 @@
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "2.5-dev"
"dev-main": "3.7-dev"
}
},
"autoload": {
@@ -3660,7 +3579,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4"
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1"
},
"funding": [
{
@@ -3671,53 +3590,52 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-09-25T14:11:13+00:00"
"time": "2026-06-05T06:23:12+00:00"
},
{
"name": "symfony/event-dispatcher",
"version": "v5.4.45",
"version": "v6.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9"
"reference": "d7110a878e7e7cbd8aaebe9f55da8af885b8c0af"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d7110a878e7e7cbd8aaebe9f55da8af885b8c0af",
"reference": "d7110a878e7e7cbd8aaebe9f55da8af885b8c0af",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/event-dispatcher-contracts": "^2|^3",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1",
"symfony/event-dispatcher-contracts": "^2.5|^3"
},
"conflict": {
"symfony/dependency-injection": "<4.4"
"symfony/dependency-injection": "<5.4",
"symfony/service-contracts": "<2.5"
},
"provide": {
"psr/event-dispatcher-implementation": "1.0",
"symfony/event-dispatcher-implementation": "2.0"
"symfony/event-dispatcher-implementation": "2.0|3.0"
},
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/error-handler": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/stopwatch": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/dependency-injection": "",
"symfony/http-kernel": ""
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/error-handler": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/service-contracts": "^2.5|^3",
"symfony/stopwatch": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -3745,7 +3663,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45"
"source": "https://github.com/symfony/event-dispatcher/tree/v6.4.44"
},
"funding": [
{
@@ -3756,12 +3674,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-09-25T14:11:13+00:00"
"time": "2026-08-21T14:01:40+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@@ -4126,30 +4048,30 @@
},
{
"name": "symfony/lock",
"version": "v5.4.54",
"version": "v6.4.48",
"source": {
"type": "git",
"url": "https://github.com/symfony/lock.git",
"reference": "1ed040bccdf75281b237206c87b8ef4289c23b88"
"reference": "bb18c2ad3b61bcddb4385b50f1c86e17a7dac035"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/1ed040bccdf75281b237206c87b8ef4289c23b88",
"reference": "1ed040bccdf75281b237206c87b8ef4289c23b88",
"url": "https://api.github.com/repos/symfony/lock/zipball/bb18c2ad3b61bcddb4385b50f1c86e17a7dac035",
"reference": "bb18c2ad3b61bcddb4385b50f1c86e17a7dac035",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1",
"psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16"
"symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"doctrine/dbal": "<2.13"
"doctrine/dbal": "<2.13.1",
"symfony/cache": "<6.2"
},
"require-dev": {
"doctrine/dbal": "^2.13|^3|^4",
"predis/predis": "^1.0|^2.0"
"doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1|^2.0"
},
"type": "library",
"autoload": {
@@ -4185,7 +4107,7 @@
"semaphore"
],
"support": {
"source": "https://github.com/symfony/lock/tree/v5.4.54"
"source": "https://github.com/symfony/lock/tree/v6.4.48"
},
"funding": [
{
@@ -4205,7 +4127,7 @@
"type": "tidelift"
}
],
"time": "2026-08-30T20:10:04+00:00"
"time": "2026-10-04T13:21:49+00:00"
},
{
"name": "symfony/mailer",
@@ -5281,21 +5203,20 @@
},
{
"name": "symfony/process",
"version": "v5.4.54",
"version": "v6.4.48",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
"reference": "485d7b3f15ae329058d2407c9772c57ed4f564de"
"reference": "2a0cb83994a4b8a5f92fc91b8b4527e6e227c6f5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/process/zipball/485d7b3f15ae329058d2407c9772c57ed4f564de",
"reference": "485d7b3f15ae329058d2407c9772c57ed4f564de",
"url": "https://api.github.com/repos/symfony/process/zipball/2a0cb83994a4b8a5f92fc91b8b4527e6e227c6f5",
"reference": "2a0cb83994a4b8a5f92fc91b8b4527e6e227c6f5",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1"
},
"type": "library",
"autoload": {
@@ -5323,7 +5244,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/process/tree/v5.4.54"
"source": "https://github.com/symfony/process/tree/v6.4.48"
},
"funding": [
{
@@ -5343,7 +5264,7 @@
"type": "tidelift"
}
],
"time": "2026-09-01T06:19:14+00:00"
"time": "2026-10-08T05:06:07+00:00"
},
{
"name": "symfony/property-access",
@@ -5770,34 +5691,33 @@
},
{
"name": "symfony/string",
"version": "v5.4.47",
"version": "v6.4.48",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "136ca7d72f72b599f2631aca474a4f8e26719799"
"reference": "9459a27a00b1f0fec1954e9eb362d00aedcfe048"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799",
"reference": "136ca7d72f72b599f2631aca474a4f8e26719799",
"url": "https://api.github.com/repos/symfony/string/zipball/9459a27a00b1f0fec1954e9eb362d00aedcfe048",
"reference": "9459a27a00b1f0fec1954e9eb362d00aedcfe048",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "~1.15"
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"symfony/translation-contracts": ">=3.0"
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
"symfony/error-handler": "^4.4|^5.0|^6.0",
"symfony/http-client": "^4.4|^5.0|^6.0",
"symfony/translation-contracts": "^1.1|^2",
"symfony/var-exporter": "^4.4|^5.0|^6.0"
"symfony/http-client": "^5.4|^6.0|^7.0",
"symfony/intl": "^6.2|^7.0",
"symfony/translation-contracts": "^2.5|^3.0",
"symfony/var-exporter": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@@ -5836,7 +5756,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v5.4.47"
"source": "https://github.com/symfony/string/tree/v6.4.48"
},
"funding": [
{
@@ -5847,33 +5767,39 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-11-10T20:33:58+00:00"
"time": "2026-10-03T14:51:46+00:00"
},
{
"name": "symfony/var-exporter",
"version": "v5.4.45",
"version": "v7.4.18",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
"reference": "862700068db0ddfd8c5b850671e029a90246ec75"
"reference": "d6a87acbe48cbc707b9aba7f1a6c2215aab02603"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/862700068db0ddfd8c5b850671e029a90246ec75",
"reference": "862700068db0ddfd8c5b850671e029a90246ec75",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/d6a87acbe48cbc707b9aba7f1a6c2215aab02603",
"reference": "d6a87acbe48cbc707b9aba7f1a6c2215aab02603",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3"
},
"require-dev": {
"symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
"symfony/property-access": "^6.4|^7.0|^8.0",
"symfony/serializer": "^6.4|^7.0|^8.0",
"symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
@@ -5906,10 +5832,12 @@
"export",
"hydrate",
"instantiate",
"lazy-loading",
"proxy",
"serialize"
],
"support": {
"source": "https://github.com/symfony/var-exporter/tree/v5.4.45"
"source": "https://github.com/symfony/var-exporter/tree/v7.4.18"
},
"funding": [
{
@@ -5920,12 +5848,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-09-25T14:11:13+00:00"
"time": "2026-08-23T10:03:40+00:00"
},
{
"name": "symfony/yaml",
@@ -6006,65 +5938,6 @@
],
"time": "2026-08-30T06:09:20+00:00"
},
{
"name": "t3/pw_comments",
"version": "5.2.0",
"source": {
"type": "git",
"url": "https://github.com/a-r-m-i-n/pw_comments.git",
"reference": "ebe1d7a7e4e3046a62c1e090ad49b2a17eef8867"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/a-r-m-i-n/pw_comments/zipball/ebe1d7a7e4e3046a62c1e090ad49b2a17eef8867",
"reference": "ebe1d7a7e4e3046a62c1e090ad49b2a17eef8867",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"typo3/cms-core": "^10.4 || ^11.5"
},
"replace": {
"instituteweb/pw_comments": "*"
},
"type": "typo3-cms-extension",
"extra": {
"typo3/cms": {
"extension-key": "pw_comments"
}
},
"autoload": {
"psr-4": {
"T3\\PwComments\\": "Classes"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0+"
],
"authors": [
{
"name": "Armin Vieweg",
"email": "armin@v.ieweg.de",
"homepage": "https://v.ieweg.de/",
"role": "Lead Developer"
}
],
"description": "Powerful TYPO3 CMS extension for providing comments, including replies on comments and votings, as well as mail notifications.",
"homepage": "http://v.ieweg.de/",
"keywords": [
"comment",
"extension",
"typo3",
"voting"
],
"support": {
"issues": "https://github.com/a-r-m-i-n/pw_comments/issues",
"source": "https://github.com/a-r-m-i-n/pw_comments/tree/5.2.0"
},
"abandoned": "teamneusta/pw_comments",
"time": "2022-08-03T16:46:35+00:00"
},
{
"name": "typo3/class-alias-loader",
"version": "v1.2.2",
@@ -7999,31 +7872,33 @@
},
{
"name": "typo3fluid/fluid",
"version": "2.7.4",
"version": "2.15.0",
"source": {
"type": "git",
"url": "https://github.com/TYPO3/Fluid.git",
"reference": "24f4494083c8d304680e4c9c38667dff33720dd4"
"reference": "0a8ebdb9bab1510380f18bef6395fbb4754c01b7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TYPO3/Fluid/zipball/24f4494083c8d304680e4c9c38667dff33720dd4",
"reference": "24f4494083c8d304680e4c9c38667dff33720dd4",
"url": "https://api.github.com/repos/TYPO3/Fluid/zipball/0a8ebdb9bab1510380f18bef6395fbb4754c01b7",
"reference": "0a8ebdb9bab1510380f18bef6395fbb4754c01b7",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
"ext-mbstring": "*",
"php": "^8.1"
},
"require-dev": {
"ext-json": "*",
"ext-mbstring": "*",
"friendsofphp/php-cs-fixer": "^3.4",
"phpstan/phpstan": "^1.7",
"phpstan/phpstan-phpunit": "^1.1",
"phpunit/phpunit": "^8.5.33 || ^9.5.28 || ^10.0.16"
"ext-simplexml": "*",
"friendsofphp/php-cs-fixer": "^3.59.3",
"phpstan/phpstan": "^1.10.14",
"phpstan/phpstan-phpunit": "^1.3.11",
"phpunit/phpunit": "^10.2.6"
},
"suggest": {
"ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case"
"ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case",
"ext-simplexml": "SimpleXML is required for the XSD schema generator"
},
"bin": [
"bin/fluid"
@@ -8045,27 +7920,27 @@
"issues": "https://github.com/TYPO3/Fluid/issues",
"source": "https://github.com/TYPO3/Fluid"
},
"time": "2023-03-23T12:04:09+00:00"
"time": "2024-08-30T21:24:26+00:00"
},
{
"name": "webmozart/assert",
"version": "1.12.1",
"version": "2.5.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "9be6926d8b485f55b9229203f962b51ed377ba68"
"reference": "8a163706bbcac613733dba03f51e13b5eb1bb819"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",
"reference": "9be6926d8b485f55b9229203f962b51ed377ba68",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/8a163706bbcac613733dba03f51e13b5eb1bb819",
"reference": "8a163706bbcac613733dba03f51e13b5eb1bb819",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-date": "*",
"ext-filter": "*",
"php": "^7.2 || ^8.0"
"php": "^8.2"
},
"suggest": {
"ext-intl": "",
@@ -8074,8 +7949,12 @@
},
"type": "library",
"extra": {
"psalm": {
"pluginClass": "Webmozart\\Assert\\PsalmPlugin"
},
"branch-alias": {
"dev-master": "1.10-dev"
"dev-master": "2.0-dev",
"dev-feature/2-0": "2.0-dev"
}
},
"autoload": {
@@ -8091,6 +7970,10 @@
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
},
{
"name": "Woody Gilk",
"email": "woody.gilk@gmail.com"
}
],
"description": "Assertions to validate method input/output with nice error messages.",
@@ -8101,9 +7984,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/1.12.1"
"source": "https://github.com/webmozarts/assert/tree/2.5.0"
},
"time": "2025-10-29T15:56:20+00:00"
"time": "2026-10-05T23:14:19+00:00"
}
],
"packages-dev": [],
@@ -8114,10 +7997,10 @@
},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {},
"platform-dev": {},
"platform": [],
"platform-dev": [],
"platform-overrides": {
"php": "7.4.1"
"php": "8.3"
},
"plugin-api-version": "2.6.0"
}
+1 -7
View File
@@ -1,4 +1,4 @@
base: 'https://www.xn--dotterbhel-geb.com/'
base: 'https://dotter.test/'
errorHandling:
-
errorCode: 404
@@ -22,11 +22,5 @@ languages:
direction: ltr
flag: at
websiteTitle: ''
matomoWidgetsActiveWidgets: 'actionsPerDay,actionsPerMonth,annotations,createAnnotation,bounceRate,browserPlugins,browsers,campaigns,contentNames,contentPieces,countries,javaScriptErrors,linkMatomo,osFamilies,pagesNotFound,siteSearchKeywords,siteSearchNoResultKeywords,visitsPerDay,visitsPerMonth'
matomoWidgetsIdSite: 1
matomoWidgetsPagesNotFoundTemplate: '404/URL = {path}/From = {referrer}'
matomoWidgetsTitle: 'FC Dotterbühel'
matomoWidgetsTokenAuth: 7b47a9c62448e14d0db1cf19ecffa087
matomoWidgetsUrl: 'https://matomo.nuhodds.com/'
rootPageId: 1
websiteTitle: 'FC Dotterbühel'
Submodule packages/watten deleted from de7be741e3.
@@ -0,0 +1,71 @@
<?php
declare(strict_types=1);
namespace HermannTelser\Watten\Controller;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use HermannTelser\Watten\Domain\Repository\SpieltageRepository;
use HermannTelser\Watten\Domain\Repository\ErgebnisseRepository;
use HermannTelser\Watten\Domain\Repository\RanglisteRepository;
use HermannTelser\Watten\Domain\Repository\StatistikRepository;
use HermannTelser\Watten\Domain\Repository\GstrichenRepository;
use HermannTelser\Watten\Domain\Repository\AthletenRepository;
class EidController implements MiddlewareInterface
{
/**
* @return void
*/
public function __construct()
{
date_default_timezone_set('Europe/Vienna');
}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$response = $handler->handle($request);
if (!isset($request->getQueryParams()['application'])) {
return $response;
}
switch (GeneralUtility::_GP('application')) {
case 'loadspieltag':
$arr = SpieltageRepository::loadSpieltag();
break;
case 'loadrangliste':
$activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament();
$arr = RanglisteRepository::loadRangliste($activeTournament);
break;
case 'loadgstrichenliste':
$activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament();
$arr = GstrichenRepository::loadGstrichenliste($activeTournament);
break;
case 'loadstatistik':
$event_id = GeneralUtility::_GP('event_id') ?? ErgebnisseRepository::getLastEventId();
$arr = StatistikRepository::loadStatistik($event_id);
break;
case 'loadstatistiktangliste':
$activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament();
$arr = StatistikRepository::loadStatistikRangliste($activeTournament);
break;
case 'loadtournamentathleten':
$activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament();
$arr = AthletenRepository::loadTournamentAthleten($activeTournament);
break;
case 'loadpaarlaufer';
$activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament();
$teilnehmer_id = GeneralUtility::_GP('teilnehmer_id');
$arr = StatistikRepository::loadPaarlauf($activeTournament, $teilnehmer_id);
break;
}
header('Content-Type: application/json');
echo json_encode((array) $arr);
exit();
}
}
@@ -0,0 +1,71 @@
<?php
namespace HermannTelser\Watten\Controller;
use HermannTelser\Watten\Domain\Repository\ErgebnisseRepository;
use HermannTelser\Watten\Domain\Repository\AthletenRepository;
use HermannTelser\Watten\Domain\Repository\SpieltageRepository;
use HermannTelser\Watten\Domain\Repository\RanglisteRepository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class WattenController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
private $athletenRepository;
private $spieltageRepository;
private $ergebnisseRepository;
private $ranglisteRepository;
private $activeTournament;
private $event_id;
/**
* Inject the Athleten repository
*
* @param \HermannTelser\Watten\Domain\Repository\AthletenRepository $athletenRepository
* @param \HermannTelser\Watten\Domain\Repository\SpieltageRepository $spieltageRepository
* @param \HermannTelser\Watten\Domain\Repository\ErgebnisseRepository $ergebnisseRepository
* @param \HermannTelser\Watten\Domain\Repository\RanglisteRepository $ranglisteRepository
*/
public function __construct(AthletenRepository $athletenRepository, SpieltageRepository $spieltageRepository, ErgebnisseRepository $ergebnisseRepository, RanglisteRepository $ranglisteRepository)
{
$this->athletenRepository = $athletenRepository;
$this->ergebnisseRepository = $ergebnisseRepository;
$this->spieltageRepository = $spieltageRepository;
$this->ranglisteRepository = $ranglisteRepository;
$this->activeTournament = GeneralUtility::_GP('tournament') ?? $this->ergebnisseRepository->getActiveTournament();
$this->event_id = GeneralUtility::_GP('event_id') ?? $this->ergebnisseRepository->getLastEventId();
}
public function ergebnisseAction()
{
$tournaments = $this->ergebnisseRepository->findTournaments(false);
$this->view->assign('tournaments', $tournaments);
$this->view->assign('active_tournaments', $this->activeTournament);
$spieltage = $this->spieltageRepository->loadSpieltage();
$this->view->assign('spieltage', $spieltage);
$this->view->assign('active_event_id', $this->event_id);
}
public function ranglisteAction()
{
$tournaments = $this->ergebnisseRepository->findTournaments(true);
$this->view->assign('tournaments', $tournaments);
$this->view->assign('active', $this->activeTournament);
}
public function statistikAction()
{
$tournaments = $this->ergebnisseRepository->findTournaments(true);
$this->view->assign('tournaments', $tournaments);
$this->view->assign('active', $this->activeTournament);
$teilnehmer = $this->athletenRepository->loadTournamentAthleten($this->activeTournament);
$this->view->assign('teilnehmer', $teilnehmer);
}
}
@@ -0,0 +1,191 @@
<?php
namespace HermannTelser\Watten\Daten;
// use Doctrine\DBAL\DBALException;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class Berechnung
{
public static function run()
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'athlet')
->from('tx_watten_domain_model_athleten')
->execute();
$user = [];
foreach ($res as $key => $value) {
$user[$value['uid']] = $value['athlet'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments')->createQueryBuilder();
$tournaments = $queryBuilder
->select('uid', 'tournament', 'active', 'king')
->from('tx_watten_tournaments')
->execute();
// TRUNCATE `tx_watten_tournaments_ergebnisse`
GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable('tx_watten_tournaments_ergebnisse')
->truncate('tx_watten_tournaments_ergebnisse');
self::calcolate_data($user, ['uid' => 0, 'tournament' => 'Gesamt']);
foreach ($tournaments as $key => $row) {
self::calcolate_data($user, $row);
}
}
public static function calcolate_data($user, $row)
{
$tournamentid = $row['uid'];
$tournament = $row['tournament'];
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
if ($tournamentid == 0) {
// Gesamt
$_tournament = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'bumid')
->from('tx_watten_domain_model_ergebnisse')
->executeQuery()
->fetchAllAssociative();
} else {
$_tournament = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'bumid')
->from('tx_watten_domain_model_ergebnisse')
->where(
$queryBuilder->expr()->eq('tournaments_id', (int) $tournamentid)
)
->executeQuery()
->fetchAllAssociative();
}
$arr = [];
foreach ($_tournament as $key => $value) {
$bum = $value['bumid'];
$s1 = $value['s1'];
$s2 = $value['s2'];
$v1 = $value['v1'];
$v2 = $value['v2'];
if (!isset($arr[$s1]['s'][$bum])) {
$arr[$s1]['s'][$bum] = 0;
}
if (!isset($arr[$s2]['s'][$bum])) {
$arr[$s2]['s'][$bum] = 0;
}
if (!isset($arr[$v1]['v'][$bum])) {
$arr[$v1]['v'][$bum] = 0;
}
if (!isset($arr[$v2]['v'][$bum])) {
$arr[$v2]['v'][$bum] = 0;
}
if (!isset($arr[$s1]['p'])) {
$arr[$s1]['p'] = 0;
}
if (!isset($arr[$s2]['p'])) {
$arr[$s2]['p'] = 0;
}
if (!isset($arr[$v1]['p'])) {
$arr[$v1]['p'] = 0;
}
if (!isset($arr[$v2]['p'])) {
$arr[$v2]['p'] = 0;
}
$arr[$s1]['s'][$bum]++;
$arr[$s2]['s'][$bum]++;
$arr[$v1]['v'][$bum]++;
$arr[$v2]['v'][$bum]++;
$arr[$s1]['p']++;
$arr[$s2]['p']++;
$arr[$v1]['p']++;
$arr[$v2]['p']++;
}
foreach ($arr as $userid => $value) {
$punkte = 0;
if (isset($value['s'][1])) {
$punkte = $value['s'][1] * 1.1;
}
if (isset($value['s'][2])) {
$punkte += $value['s'][2] * 2.1;
}
if (isset($value['s'][4])) {
$punkte += $value['s'][4] * 4.1;
}
if (isset($value['v'][1])) {
$punkte -= $value['v'][1];
}
if (isset($value['v'][2])) {
$punkte -= $value['v'][2] * 2;
}
if (isset($value['v'][4])) {
$punkte -= $value['v'][4] * 4;
}
$arr[$userid]['punkte'] = round($punkte, 2);
$arr[$userid]['spiele'] = $value['p'];
$arr[$userid]['userid'] = $userid;
$arr[$userid]['name'] = $user[$userid];
$arr[$userid]['userid'] = $userid;
}
$punkte = array_column($arr, 'punkte');
array_multisort($punkte, SORT_NUMERIC, SORT_DESC, $arr);
$winner = $arr[0];
$looser = $arr[array_key_last($arr)];
foreach ($arr as $key => $value) {
$arr[$key]['platz'] = $key + 1;
$arr[$key]['s1'] = isset($value['s'][1]) ? $value['s'][1] : '';
$arr[$key]['s1'] = isset($value['s'][1]) ? $value['s'][1] : '';
$arr[$key]['s2'] = isset($value['s'][2]) ? $value['s'][2] : '';
$arr[$key]['s4'] = isset($value['s'][4]) ? $value['s'][4] : '';
unset($arr[$key]['s']);
$arr[$key]['v1'] = isset($value['v'][1]) ? $value['v'][1] : '';
$arr[$key]['v2'] = isset($value['v'][2]) ? $value['v'][2] : '';
$arr[$key]['v4'] = isset($value['v'][4]) ? $value['v'][4] : '';
unset($arr[$key]['v']);
}
$insert_value = [];
$insert_value['crdate'] = time();
$insert_value['tournament_id'] = $tournamentid;
$insert_value['tournament'] = (string)$tournament;
if ($tournamentid == 0) {
$insert_value['type'] = 'gesamt';
} elseif ($row['king'] == 1) {
$insert_value['type'] = 'king';
} elseif ($row['active'] == 1) {
$insert_value['type'] = 'active';
}
$insert_value['koenig'] = (string)$winner['name'];
$insert_value['koenig_id'] = (int)$winner['userid'];
$insert_value['koenig_spiele'] = isset($winner['spiele']) ? $winner['spiele'] : 0;
$insert_value['koenig_punkte'] = isset($winner['punkte']) ? (float) $winner['punkte'] : 0;
$insert_value['koenig_siege'] = isset($winner['s'][1]) ? $winner['s'][1] : 0;
$insert_value['koenig_niederlagen'] = isset($winner['v'][1]) ? $winner['v'][1] : 0;
$insert_value['koenig_schneider'] = isset($winner['s'][2]) ? $winner['s'][2] : 0;
$insert_value['koenig_schneider_niederlage'] = isset($winner['v'][2]) ? $winner['v'][2] : 0;
$insert_value['koenig_retour_schneider'] = isset($winner['s'][4]) ? $winner['s'][4] : 0;
$insert_value['koenig_retour_schneider_niederlage'] = isset($winner['v'][4]) ? $winner['v'][4] : 0;
$insert_value['schneewatter'] = (string)$looser['name'];
$insert_value['schneewatter_id'] = (int)$looser['userid'];
$insert_value['schneewatter_spiele'] = isset($looser['spiele']) ? $looser['spiele'] : 0;
$insert_value['schneewatter_punkte'] = isset($looser['punkte']) ? (float) $looser['punkte'] : 0;
$insert_value['schneewatter_siege'] = isset($looser['s'][1]) ? $looser['s'][1] : 0;
$insert_value['schneewatter_niederlagen'] = isset($looser['v'][1]) ? $looser['v'][1] : 0;
$insert_value['schneewatter_schneider'] = isset($looser['s'][2]) ? $looser['s'][2] : 0;
$insert_value['schneewatter_schneider_niederlage'] = isset($looser['v'][2]) ? $looser['v'][2] : 0;
$insert_value['schneewatter_retour_schneider'] = isset($looser['s'][4]) ? $looser['s'][4] : 0;
$insert_value['schneewatter_retour_schneider_niederlage'] = isset($looser['v'][4]) ? $looser['v'][4] : 0;
$insert_value['result_json'] = json_encode($arr);
GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments_ergebnisse')
->insert('tx_watten_tournaments_ergebnisse', $insert_value);
}
}
@@ -0,0 +1,117 @@
<?php
namespace HermannTelser\Watten\Domain\Model;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
class Athleten extends AbstractEntity
{
/**
* @var int
*/
protected $gender = 0;
/**
* @var string
*/
protected $name = '';
/**
* @var string
*/
protected $image = '';
/**
* @var int
*/
protected $isactive = 0;
public function __construct(int $gender = 0, string $name = '', string $image = '', int $isactive = 0)
{
$this->setGender($gender);
$this->setName($name);
$this->setImage($image);
$this->setIsactive($isactive);
}
/**
*
* @param int $gender
*
* @return void
*/
public function setGender(int $gender): void
{
$this->gender = $gender;
}
/**
*
* @return int
*/
public function getGender(): int
{
return $this->gender;
}
/**
*
* @param string $name
*
* @return void
*/
public function setName(string $name): void
{
$this->name = $name;
}
/**
*
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
*
* @param string $image
*
* @return void
*/
public function setImage(string $image): void
{
$this->image = $image;
}
/**
*
* @return string
*/
public function getImage(): string
{
return $this->image;
}
/**
*
* @param int $isactive
*
* @return void
*/
public function setIsactive(int $isactive): void
{
$this->isactive = $isactive;
}
/**
*
* @return int
*/
public function getIsactive(): int
{
return $this->isactive;
}
}
@@ -0,0 +1,170 @@
<?php
namespace HermannTelser\Watten\Domain\Model;
use DateTime;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
class Ergebnisse extends AbstractEntity
{
/**
* @var DateTime
*/
protected $datum = 0;
/**
* @var int
*/
protected $s1 = 0;
/**
* @var int
*/
protected $s2 = 0;
/**
* @var int
*/
protected $v1 = 0;
/**
* @var int
*/
protected $v2 = 0;
/**
* @var int
*/
protected $bumid = 0;
public function __construct(int $datum = 0, int $s1 = 0, int $s2 = 0, int $v1 = 0, int $v2 = 0, int $bumid = 0)
{
$this->setDatum($datum);
$this->setS1($s1);
$this->setS2($s2);
$this->setV1($v1);
$this->setV2($v2);
$this->setBumid($bumid);
}
/**
*
* @param DateTime $datum time stamp
*
* @return void
*/
public function setDatum(int $datum): void
{
$this->datum = $datum;
}
/**
*
* @return DateTime
*/
public function getDatum(): int
{
return $this->datum;
}
/**
*
* @param int $s1
*
* @return void
*/
public function setS1(int $s1): void
{
$this->s1 = $s1;
}
/**
*
* @return Int
*/
public function getS1(): int
{
return $this->s1;
}
/**
*
* @param int $s2
*
* @return void
*/
public function setS2(int $s2): void
{
$this->s2 = $s2;
}
/**
*
* @return Int
*/
public function getS2(): int
{
return $this->s2;
}
/**
*
* @param int $v1
*
* @return void
*/
public function setV1(int $v1): void
{
$this->v1 = $v1;
}
/**
*
* @return Int
*/
public function getV1(): int
{
return $this->v1;
}
/**
*
* @param int $v1
*
* @return void
*/
public function setV2(int $v2): void
{
$this->v2 = $v2;
}
/**
*
* @return Int
*/
public function getV2(): int
{
return $this->v2;
}
/**
*
* @param int $bumid
*
* @return void
*/
public function setBumid(int $bumid): void
{
$this->bumid = $bumid;
}
/**
*
* @return Int
*/
public function getBumid(): int
{
return $this->bumid;
}
}
@@ -0,0 +1,119 @@
<?php
namespace HermannTelser\Watten\Domain\Model;
use \DateTime;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
class Events extends AbstractEntity
{
/**
* @var DateTime
*/
protected $datum = 0;
/**
* @var int
*/
protected $tournaments_id = 0;
/**
* @var string
*/
protected $event = 0;
/**
* @var int
*/
protected $isactive = 0;
public function __construct(int $datum = 0, int $tournaments_id = 0, string $event = '', int $isactive = 0)
{
$this->setDatum($datum);
$this->setTournamentId($tournaments_id);
$this->setEvent($event);
$this->setIsactive($isactive);
}
/**
*
* @param DateTime $datum
*
* @return void
*/
public function setDatum(int $datum): void
{
$this->datum = $datum;
}
/**
*
* @return DateTime
*/
public function getDatum(): int
{
return $this->datum;
}
/**
*
* @param int $tournaments_id
*
* @return void
*/
public function setTournamentId(int $tournaments_id): void
{
$this->s1 = $tournaments_id;
}
/**
*
* @return Int
*/
public function getTournamentId(): int
{
return $this->tournaments_id;
}
/**
*
* @param String $event
*
* @return void
*/
public function setEvent(string $event): void
{
$this->event = $event;
}
/**
*
* @return String
*/
public function getEvent(): string
{
return $this->event;
}
/**
*
* @param int $isactive
*
* @return void
*/
public function setIsactive(int $isactive): void
{
$this->s1 = $isactive;
}
/**
*
* @return Int
*/
public function getIsactive(): int
{
return $this->isactive;
}
}
@@ -0,0 +1,49 @@
<?php
namespace HermannTelser\Watten\Domain\Repository;
use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class AthletenRepository extends Repository
{
public static function loadTournamentAthleten($activeTournament)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'name')
->from('tx_watten_domain_model_athleten')
->execute();
$athleten = [];
foreach ($res as $value) {
$athleten[$value['uid']] = $value['name'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
$res = $queryBuilder
->select('s1', 's2', 'v1', 'v2')
->from('tx_watten_domain_model_ergebnisse')
->where(
$queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament)
)
->execute();
$active = [];
foreach ($res as $value) {
$active[] = $value['s1'];
$active[] = $value['s2'];
$active[] = $value['v1'];
$active[] = $value['v2'];
}
$active = array_unique($active);
$return = [];
$return[] = ['id' => 0, 'name' => 'Athleten'];
foreach ($athleten as $key => $name) {
if (in_array($key, $active)) {
$return[] = ['id' => $key, 'name' => $name];
}
}
return $return;
}
}
@@ -0,0 +1,120 @@
<?php
namespace HermannTelser\Watten\Domain\Repository;
use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use stdClass;
class ErgebnisseRepository extends Repository
{
public static function loadStatistik()
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments')->createQueryBuilder();
$res = $queryBuilder
->select('uid')
->from('tx_watten_tournaments')
->where(
$queryBuilder->expr()->eq('active', (int) 1)
)
->execute();
foreach ($res as $key => $value) {
return (int) $value['uid'];
}
return 0;
}
public static function getActiveTournament()
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments')->createQueryBuilder();
$res = $queryBuilder
->select('uid')
->from('tx_watten_tournaments')
->where(
$queryBuilder->expr()->eq('active', (int) 1)
)
->execute();
foreach ($res as $key => $value) {
return (int) $value['uid'];
}
return 0;
}
public function getLastEventId()
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_events')->createQueryBuilder();
$res = $queryBuilder
->select('uid')
->from('tx_watten_domain_model_events')
->where(
$queryBuilder->expr()->eq('isactive', (int) 1)
)
->execute();
foreach ($res as $key => $value) {
return (int) $value['uid'];
}
return 0;
}
public function findTournaments($mitGesammt)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_tournaments')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'tournament', 'active')
->from('tx_watten_tournaments')
->execute();
$tournaments = [];
foreach ($res as $key => $value) {
$tmp = new stdClass();
$tmp->id = (int) $value['uid'];
$tmp->name = $value['tournament'];
$tmp->active = $value['active'];
$tournaments[] = $tmp;
}
if ($mitGesammt == true) {
$tmp = new stdClass();
$tmp->id = -1;
$tmp->name = "Gesamt";
$tournaments[] = $tmp;
}
return $tournaments;
}
public function findByEventId(int $event_id)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'name')
->from('tx_watten_domain_model_athleten')
->execute();
$athleten = [];
foreach ($res as $key => $value) {
$athleten[$value['uid']] = $value['name'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
$ergebnisse = $queryBuilder
->select('uid', 'datum', 's1', 's2', 'v1', 'v2', 'bumid')
->from('tx_watten_domain_model_ergebnisse')
->where(
$queryBuilder->expr()->eq('event_id', (int) $event_id)
)
->execute();
$return = [];
foreach ($ergebnisse as $key => $value) {
$tmp = [];
$tmp['uid'] = $value['uid'];
$tmp['s1'] = $athleten[$value['s1']];
$tmp['s2'] = $athleten[$value['s2']];
$tmp['v1'] = $athleten[$value['v1']];
$tmp['v2'] = $athleten[$value['v2']];
$tmp['bumid'] = $value['bumid'];
$return[] = $tmp;
}
return $return;
}
}
@@ -0,0 +1,111 @@
<?php
namespace HermannTelser\Watten\Domain\Repository;
use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use stdClass;
class GstrichenRepository extends Repository
{
public static function loadGstrichenliste($activeTournament)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'name')
->from('tx_watten_domain_model_athleten')
->execute();
$user = [];
foreach ($res as $key => $value) {
$user[$value['uid']] = $value['name'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
if ($activeTournament < 0) {
$ergebnisse = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'gstrichen')
->from('tx_watten_domain_model_ergebnisse')
->execute();
} else {
$ergebnisse = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'gstrichen')
->from('tx_watten_domain_model_ergebnisse')
->where($queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament))
->execute();
}
$arr = [];
foreach ($ergebnisse as $key => $value) {
$s1 = $value['s1'];
$s2 = $value['s2'];
$v1 = $value['v1'];
$v2 = $value['v2'];
$gs = $value['gstrichen'];
if (!isset($arr[$s1]['s'])) {
$arr[$s1]['s'] = 0;
$arr[$s1]['v'] = 0;
}
if (!isset($arr[$s2]['s'])) {
$arr[$s2]['s'] = 0;
$arr[$s2]['v'] = 0;
}
if (!isset($arr[$v1]['v'])) {
$arr[$v1]['v'] = 0;
$arr[$v1]['s'] = 0;
}
if (!isset($arrv[$v2]['v'])) {
$arr[$v2]['v'] = 0;
$arr[$v2]['s'] = 0;
}
if ($gs) {
$arr[$s1]['s']++;
$arr[$s2]['s']++;
$arr[$v1]['v']++;
$arr[$v2]['v']++;
}
}
$sieger = [];
$verlierer = [];
$i = 1;
foreach ($arr as $userid => $value) {
$sieger[$i]['sieger'] = $user[$userid];
$sieger[$i]['gewonnen'] = $value['s'];
$verlierer[$i]['verlierer'] = $user[$userid];
$verlierer[$i]['verloren'] = $value['v'];
$i++;
}
$gewonnen = array_column($sieger, 'gewonnen');
array_multisort($gewonnen, SORT_NUMERIC, SORT_DESC, $sieger);
$verloren = array_column($verlierer, 'verloren');
array_multisort($verloren, SORT_NUMERIC, SORT_DESC, $verlierer);
$return = [];
$s = 0;
$v = 0;
foreach ($gewonnen as $key => $value) {
$return[$key] = array_merge($sieger[$key], $verlierer[$key]);
$return[$key]['platz'] = $key + 1;
if ($return[$key]['gewonnen'] == 0) {
$return[$key]['sieger'] = '';
$return[$key]['gewonnen'] = '';
$s = 1;
}
if ($return[$key]['verloren'] == 0) {
$return[$key]['verloren'] = '';
$return[$key]['verlierer'] = '';
$v = 1;
}
if ($s and $v) {
unset($return[$key]);
}
}
return $return;
}
}
@@ -0,0 +1,149 @@
<?php
namespace HermannTelser\Watten\Domain\Repository;
use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use stdClass;
class RanglisteRepository extends Repository
{
public static function loadRangliste($activeTournament)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'name')
->from('tx_watten_domain_model_athleten')
->execute();
$user = [];
foreach ($res as $key => $value) {
$user[$value['uid']] = $value['name'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
if ($activeTournament < 0) {
$ergebnisse = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen')
->from('tx_watten_domain_model_ergebnisse')
->execute();
} else {
$ergebnisse = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen')
->from('tx_watten_domain_model_ergebnisse')
->where($queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament))
->execute();
}
// debug($queryBuilder->getSQL());
$arr = [];
foreach ($ergebnisse as $key => $value) {
$bum = $value['bumid'];
$s1 = $value['s1'];
$s2 = $value['s2'];
$v1 = $value['v1'];
$v2 = $value['v2'];
$ge = $value['gstrichen'];
if (!isset($arr[$s1]['s'][$bum])) {
$arr[$s1]['s'][$bum] = 0;
}
if (!isset($arr[$s2]['s'][$bum])) {
$arr[$s2]['s'][$bum] = 0;
}
if (!isset($arr[$v1]['v'][$bum])) {
$arr[$v1]['v'][$bum] = 0;
}
if (!isset($arr[$v2]['v'][$bum])) {
$arr[$v2]['v'][$bum] = 0;
}
if (!isset($arr[$s1]['p'])) {
$arr[$s1]['p'] = 0;
}
if (!isset($arr[$s2]['p'])) {
$arr[$s2]['p'] = 0;
}
if (!isset($arr[$v1]['p'])) {
$arr[$v1]['p'] = 0;
}
if (!isset($arr[$v2]['p'])) {
$arr[$v2]['p'] = 0;
}
if (!isset($arr[$s1]['sg'])) {
$arr[$s1]['sg'] = 0;
}
if (!isset($arr[$s2]['sg'])) {
$arr[$s2]['sg'] = 0;
}
if (!isset($arr[$v1]['vg'])) {
$arr[$v1]['vg'] = 0;
}
if (!isset($arr[$v2]['vg'])) {
$arr[$v2]['vg'] = 0;
}
$arr[$s1]['s'][$bum]++;
$arr[$s2]['s'][$bum]++;
$arr[$v1]['v'][$bum]++;
$arr[$v2]['v'][$bum]++;
$arr[$s1]['p']++;
$arr[$s2]['p']++;
$arr[$v1]['p']++;
$arr[$v2]['p']++;
if ($ge) {
$arr[$s1]['sg']++;
$arr[$s2]['sg']++;
$arr[$v1]['vg']++;
$arr[$v2]['vg']++;
}
}
foreach ($arr as $userid => $value) {
$punkte = 0;
if (isset($value['s'][1])) {
$punkte += $value['s'][1] * 1.1;
}
if (isset($value['s'][2])) {
$punkte += $value['s'][2] * 2.1;
}
if (isset($value['s'][4])) {
$punkte += $value['s'][4] * 4.1;
}
if (isset($value['v'][1])) {
$punkte -= $value['v'][1];
}
if (isset($value['v'][2])) {
$punkte -= $value['v'][2] * 2;
}
if (isset($value['v'][4])) {
$punkte -= $value['v'][4] * 4;
}
$arr[$userid]['punkte'] = round($punkte, 2);
$arr[$userid]['spiele'] = $value['p'];
$arr[$userid]['name'] = $user[$userid];
unset($arr[$userid]['p']);
}
$punkte = array_column($arr, 'punkte');
array_multisort($punkte, SORT_NUMERIC, SORT_DESC, $arr);
// $winner = $arr[0];
// $looser = $arr[array_key_last($arr)];
foreach ($arr as $key => $value) {
$arr[$key]['platz'] = $key + 1;
$arr[$key]['s1'] = isset($value['s'][1]) ?? '';
$arr[$key]['s1'] = isset($value['s'][1]) ? $value['s'][1] : '';
$arr[$key]['s2'] = isset($value['s'][2]) ? $value['s'][2] : '';
$arr[$key]['s4'] = isset($value['s'][4]) ? $value['s'][4] : '';
$arr[$key]['sg'] = isset($value['sg']) && $value['sg'] != 0 ? $value['sg'] : '';
unset($arr[$key]['s']);
$arr[$key]['v1'] = isset($value['v'][1]) ? $value['v'][1] : '';
$arr[$key]['v2'] = isset($value['v'][2]) ? $value['v'][2] : '';
$arr[$key]['v4'] = isset($value['v'][4]) ? $value['v'][4] : '';
$arr[$key]['vg'] = isset($value['vg']) && $value['vg'] != 0 ? $value['vg'] : '';
unset($arr[$key]['v']);
}
return $arr;
}
}
@@ -0,0 +1,146 @@
<?php
namespace HermannTelser\Watten\Domain\Repository;
use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use HermannTelser\Watten\Domain\Repository\ErgebnisseRepository;
use stdClass;
class SpieltageRepository extends Repository
{
public static function loadSpieltage()
{
$activeTournament = GeneralUtility::_GP('tournament') ?? ErgebnisseRepository::getActiveTournament();
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_events')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'datum', 'event', 'isactive')
->from('tx_watten_domain_model_events')
->where(
$queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament)
)
->addOrderBy('datum', 'DESC')
->execute();
$spieltage = [];
$tmp = new stdClass();
$tmp->id = 0;
$tmp->name = 'Spieltag';
$spieltage[] = $tmp;
foreach ($res as $key => $value) {
$tmp = new stdClass();
$tmp->id = (int) $value['uid'];
// $tmp->selected = (int) $value['isactive'];
$tmp->name = date("d. M. Y", $value['datum']);
if ($value['event']) {
$tmp->name .= ' - ' . $value['event'];
}
$spieltage[] = $tmp;
}
return $spieltage;
}
public static function loadSpieltag()
{
$event_id = (int) GeneralUtility::_GP('event_id');
if (!$event_id) {
exit;
}
$return = [];
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_events')->createQueryBuilder();
$res = $queryBuilder
->select('story')
->from('tx_watten_domain_model_events')
->where(
$queryBuilder->expr()->eq('uid', (int) $event_id)
)
->execute();
foreach ($res as $key => $value) {
$return['story'] = $value['story'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'name')
->from('tx_watten_domain_model_athleten')
->execute();
$athleten = [];
foreach ($res as $key => $value) {
$athleten[$value['uid']] = $value['name'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
$ergebnisse = $queryBuilder
->select('uid', 'datum', 's1', 's2', 'v1', 'v2', 'bumid', 'gstrichen')
->from('tx_watten_domain_model_ergebnisse')
->where(
$queryBuilder->expr()->eq('event_id', (int) $event_id)
)
->execute();
$data = [];
foreach ($ergebnisse as $key => $value) {
$tmp = [];
$tmp['uid'] = (int) $value['uid'];
$tmp['s1'] = $athleten[$value['s1']];
$tmp['s2'] = $athleten[$value['s2']];
$tmp['v1'] = $athleten[$value['v1']];
$tmp['v2'] = $athleten[$value['v2']];
$tmp['gs'] = $value['gstrichen'] ? '||' : '';
$tmp['bumid'] = (int) $value['bumid'];
$tmp['datum'] = (int) $value['datum'];
$data[] = $tmp;
}
$return['data'] = $data;
$return['punkte'] = self::punkte($data);
return $return;
}
private static function punkte(array $data)
{
$punkte = [];
foreach ($data as $value) {
$s1 = $value['s1'];
$s2 = $value['s2'];
$v1 = $value['v1'];
$v2 = $value['v2'];
if (!isset($punkte[$s1])) {
$punkte[$s1] = $value['bumid'] + 0.1;
} else {
$punkte[$s1] = $punkte[$s1] + $value['bumid'] + 0.1;
}
if (!isset($punkte[$s2])) {
$punkte[$s2] = $value['bumid'] + 0.1;
} else {
$punkte[$s2] = $punkte[$s2] + $value['bumid'] + 0.1;
}
if (!isset($punkte[$v1])) {
$punkte[$v1] = - ($value['bumid']);
} else {
$punkte[$v1] = $punkte[$v1] - $value['bumid'];
}
if (!isset($punkte[$v2])) {
$punkte[$v2] = - ($value['bumid']);
} else {
$punkte[$v2] = $punkte[$v2] - $value['bumid'];
}
}
$return = [];
arsort($punkte);
$i = 1;
foreach ($punkte as $name => $value) {
$tmp = [];
$tmp['rang'] = $i;
$tmp['name'] = $name;
$tmp['punkte'] = round($value, 1);
$return[] = $tmp;
$i++;
}
return $return;
}
}
@@ -0,0 +1,395 @@
<?php
namespace HermannTelser\Watten\Domain\Repository;
use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use stdClass;
class StatistikRepository extends Repository
{
public static function loadStatistikRangliste($activeTournament)
{
/*
[punkte] => 5.9
[spiele] => 13
[name] => Gerhard
[platz] => 1
[s1] => 9
[s2] =>
[s4] =>
[v1] => 4
[v2] =>
[v4] =>
*/
$arr = RanglisteRepository::loadRangliste($activeTournament);
$return = [];
$tmp = [];
foreach ($arr as $key => $value) {
$return['labels'][] = $value['name'] . " " . $value['platz'] . ". Platz";
$tmp['s1']['label'] = "Gewonnen";
$tmp['s1']['data'][] = $value['s1'] ? $value['s1'] : 0;
$tmp['s2']['label'] = "Schneider";
$tmp['s2']['data'][] = $value['s2'] ? $value['s2'] : 0;
$tmp['s4']['label'] = "Retour Schneider";
$tmp['s4']['data'][] = $value['s4'] ? $value['s4'] : 0;
$tmp['v1']['label'] = "Verloren";
$tmp['v1']['data'][] = $value['v1'] ? $value['v1'] * -1 : 0;
$tmp['v2']['label'] = "Schneider Verloren";
$tmp['v2']['data'][] = $value['v2'] ? $value['v2'] * -1 : 0;
$tmp['v4']['label'] = "Retour Schneider Verloren";
$tmp['v4']['data'][] = $value['v4'] ? $value['v4'] * -1 : 0;
}
$datasets = [];
foreach ($tmp as $key => $value) {
if (array_sum($value['data']) != false) {
$value['borderWidth'] = 1;
$datasets[] = $value;
}
}
$return['datasets'] = $datasets;
// print_r($return);
return $return;
}
public static function loadStatistik($event_id)
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'name')
->from('tx_watten_domain_model_athleten')
->execute();
$user = [];
foreach ($res as $key => $value) {
$user[$value['uid']] = $value['name'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
$ergebnisse = $queryBuilder
->select('uid', 's1', 's2', 'v1', 'v2', 'bumid')
->from('tx_watten_domain_model_ergebnisse')
->where($queryBuilder->expr()->eq('event_id', (int) $event_id))
->execute();
$usr = [];
$data = [];
foreach ($ergebnisse as $value) {
$usr[] = $value['s1'];
$usr[] = $value['s2'];
$usr[] = $value['v1'];
$usr[] = $value['v2'];
$data[] = $value;
}
$usr = array_unique($usr);
$arr = [];
$datasets = [];
foreach ($data as $value) {
$arr['labels'][] = $value['uid'];
$bum = $value['bumid'];
$s1 = $value['s1'];
$s2 = $value['s2'];
$v1 = $value['v1'];
$v2 = $value['v2'];
foreach ($usr as $key => $uid) {
if (isset($datasets[$uid])) {
$punkte = 0;
if ($s1 == $uid or $s2 == $uid) {
switch ($bum) {
case 1:
$punkte = 1.1;
break;
case 2:
$punkte = 2.1;
break;
case 4:
$punkte = 4.1;
break;
}
} elseif ($v1 == $uid or $v2 == $uid) {
switch ($bum) {
case 1:
$punkte = -1;
break;
case 2:
$punkte = -2;
break;
case 4:
$punkte = -4;
break;
}
}
$datasets[$uid]['stand'] = round($datasets[$uid]['stand'] + $punkte, 2);
$datasets[$uid]['data'][] = $datasets[$uid]['stand'];
} else {
$datasets[$uid]['label'] = $user[$uid];
$punkte = 0;
if ($s1 == $uid or $s2 == $uid) {
switch ($bum) {
case 1:
$punkte = 1.1;
break;
case 2:
$punkte = 2.1;
break;
case 4:
$punkte = 4.1;
break;
}
} elseif ($v1 == $uid or $v2 == $uid) {
switch ($bum) {
case 1:
$punkte = -1;
break;
case 2:
$punkte = -2;
break;
case 4:
$punkte = -4;
break;
}
}
$datasets[$uid]['stand'] = $punkte;
$datasets[$uid]['data'][] = $punkte;
}
}
}
foreach ($datasets as $value) {
unset($value['stand']);
$value['pointRadius'] = 2;
$value['tension'] = 0;
$value['borderWidth'] = 0.5;
$arr['datasets'][] = $value;
}
return $arr;
}
public static function loadPaarlauf($activeTournament, $athlet_1)
{
$athlet_1 = (int) $athlet_1;
$athlet_2 = 3;
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_athleten')->createQueryBuilder();
$res = $queryBuilder
->select('uid', 'name')
->from('tx_watten_domain_model_athleten')
->execute();
$user = [];
foreach ($res as $key => $value) {
$user[$value['uid']] = $value['name'];
}
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
if ($activeTournament < 0) {
$res = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen')
->from('tx_watten_domain_model_ergebnisse')
->execute();
} else {
$res = $queryBuilder
->select('s1', 's2', 'v1', 'v2', 'bumid', 'gstrichen')
->from('tx_watten_domain_model_ergebnisse')
->where($queryBuilder->expr()->eq('tournaments_id', (int) $activeTournament))
->execute();
}
$_names = [
'spiele' => 0,
'siege' => 0,
'verloren' => 0,
'sn' => 0,
'ss' => 0,
'srs' => 0,
'sg' => 0,
'vn' => 0,
'vs' => 0,
'vrs' => 0,
'vg' => 0,
];
$_data = [];
foreach ($res as $row) {
if ($row['s1'] == $athlet_1 or $row['s2'] == $athlet_1) {
if ($row['s1'] == $athlet_1)
$partner = (int) $row['s2'];
else
$partner = (int) $row['s1'];
$gegner1 = (int) $row['v1'];
$gegner2 = (int) $row['v2'];
$bummalen = (int) $row['bumid'];
$gstrichen = (int) $row['gstrichen'];
if (!isset($_data[$partner])) {
$_data[$partner] = $_names;
}
$_data[$partner]['spiele']++;
$_data[$partner]['siege']++;
if ($bummalen == 1)
$_data[$partner]['sn']++;
else if ($bummalen == 2)
$_data[$partner]['ss']++;
else if ($bummalen == 4)
$_data[$partner]['srs']++;
if ($gstrichen == 1)
$_data[$partner]['sg']++;
if ($gegner1 < $gegner2) {
$team = "$gegner1:$gegner2";
} else {
$team = "$gegner2:$gegner1";
}
if (!isset($_data[$partner]['gegner'][$team])) {
$_data[$partner]['gegner'][$team] = $_names;
}
$_data[$partner]['gegner'][$team]['spiele']++;
$_data[$partner]['gegner'][$team]['siege']++;
if ($bummalen == 1)
$_data[$partner]['gegner'][$team]['sn']++;
else if ($bummalen == 2)
$_data[$partner]['gegner'][$team]['ss']++;
else if ($bummalen == 4)
$_data[$partner]['gegner'][$team]['srs']++;
if ($gstrichen == 1)
$_data[$partner]['gegner'][$team]['sg']++;
} else if ($row['v1'] == $athlet_1 or $row['v2'] == $athlet_1) {
if ($row['v1'] == $athlet_1)
$partner = $row['v2'];
else
$partner = (int) $row['v1'];
$gegner1 = (int) $row['s1'];
$gegner2 = (int) $row['s2'];
$bummalen = (int) $row['bumid'];
$gstrichen = (int) $row['gstrichen'];
if (!isset($_data[$partner])) {
$_data[$partner] = $_names;
}
$_data[$partner]['spiele']++;
$_data[$partner]['verloren']++;
if ($bummalen == 1)
$_data[$partner]['vn']++;
if ($bummalen == 2)
$_data[$partner]['vs']++;
if ($bummalen == 4)
$_data[$partner]['vrs']++;
if ($gstrichen == 1)
$_data[$partner]['vg']++;
if ($gegner1 < $gegner2) {
$team = "$gegner1:$gegner2";
} else {
$team = "$gegner2:$gegner1";
}
if (!isset($_data[$partner]['gegner'][$team])) {
$_data[$partner]['gegner'][$team] = $_names;
}
$_data[$partner]['gegner'][$team]['spiele']++;
$_data[$partner]['gegner'][$team]['verloren']++;
if ($bummalen == 1)
$_data[$partner]['gegner'][$team]['vn']++;
if ($bummalen == 2)
$_data[$partner]['gegner'][$team]['vs']++;
if ($bummalen == 4)
$_data[$partner]['gegner'][$team]['vrs']++;
if ($gstrichen == 1)
$_data[$partner]['gegner'][$team]['vg']++;
}
}
$return = [];
if(isset($user[$athlet_1])){
$athlet = $user[$athlet_1];
foreach ($_data as $partnerid => $row) {
$tmp = [];
$partner = $user[$partnerid];
$tmp['head'] = 1;
$tmp['teams'] = $athlet . ' & ' . $partner . ' ';
$tmp['spiele'] = $row['spiele'];
$tmp['siege'] = $row['siege'];
$tmp['verloren'] = $row['verloren'];
$tmp['sn'] = $row['sn'];
$tmp['ss'] = $row['ss'];
$tmp['srs'] = $row['srs'];
$tmp['sg'] = $row['sg'];
$tmp['vn'] = $row['vn'];
$tmp['vs'] = $row['vs'];
$tmp['vrs'] = $row['vrs'];
$tmp['vg'] = $row['vg'];
$return[] = $tmp;
foreach ($row['gegner'] as $team => $value) {
$tmp = [];
$tmp['head'] = 0;
$tmp['teams'] = $athlet . ' & ' . $partner . ' <img src="/typo3conf/ext/watten/Resources/Public/Icons/Degen.svg" class="iconsizesm"> ' . self::getnames($user, $team);
$tmp['spiele'] = $value['spiele'];
$tmp['siege'] = $value['siege'];
$tmp['verloren'] = $value['verloren'];
$tmp['sn'] = $value['sn'];
$tmp['ss'] = $value['ss'];
$tmp['srs'] = $value['srs'];
$tmp['sg'] = $value['sg'];
$tmp['vn'] = $value['vn'];
$tmp['vs'] = $value['vs'];
$tmp['vrs'] = $value['vrs'];
$tmp['vg'] = $value['vg'];
$return[] = $tmp;
}
}
}
foreach ($return as $key1 => $row) {
foreach ($row as $key2 => $value) {
if ($key2 != 'teams' and $value == 0)
$return[$key1][$key2] = '';
}
}
return $return;
}
public function getnames(&$user, $team)
{
$_gegner = explode(':', $team);
$g1 = $_gegner[0];
$g2 = $_gegner[1];
return $user[$g1] . " & " . $user[$g2];
}
}
// Array
// (
// [26] => Array
// (
// [spiele] => 11
// [siege] => 6
// [verloren] => 5
// [sn] => 0
// [ss] => 0
// [srs] => 0
// [gs] => 0
// [vn] => 0
// [vs] => 0
// [vrs] => 0
// [vg] => 0
// [6:31] => Array
// (
// [spiele] => 1
// [siege] => 1
// [verloren] => 0
// [sn] => 1
// [ss] => 0
// [srs] => 0
// [gs] => 0
// [vn] => 0
// [vs] => 0
// [vrs] => 0
@@ -0,0 +1,75 @@
<?php
namespace HermannTelser\Watten\Hooks;
/**
* This file is part of the "news" Extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/
use TYPO3\CMS\Backend\Utility\BackendUtility as BackendUtilityCore;
use TYPO3\CMS\Core\SingletonInterface;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Session\SessionManager;
/**
* Hook into tcemain which is used to show preview of news item
*/
class DataHandler implements SingletonInterface
{
/**
* Prevent saving of a news record if the editor doesn't have access to all categories of the news record
*
* @param array $fieldArray
* @param string $table
* @param int $id
* @param $parentObject \TYPO3\CMS\Core\DataHandling\DataHandler
*
* @return void
*/
public function processDatamap_preProcessFieldArray(&$fieldArray, $table, $id, $parentObject): void
{
if ($table === 'tx_watten_domain_model_ergebnisse') {
// print_r($fieldArray);
// print_r($table);
// print_r($id);
$tmp = [];
$tmp[] = $fieldArray['s1'];
$tmp[] = $fieldArray['s2'];
$tmp[] = $fieldArray['v1'];
$tmp[] = $fieldArray['v2'];
$tmp = array_unique($tmp);
if (\array_sum($tmp) < 4) {
$parentObject->log(
$table,
$id,
2,
0,
1,
"Sichern des Eintrags misslang. Grund: Athleten müssen vollständig ausgefüllt werden.",
1,
[$table]
);
// unset table to prevent saving
$table = '';
} elseif (\count($tmp) != 4) {
$parentObject->log(
$table,
$id,
2,
0,
1,
"Sichern des Eintrags misslang. Grund: Athleten dürfen nicht doppelt vorkommen.",
1,
[$table]
);
// unset table to prevent saving
$table = '';
}
}
}
}
@@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace HermannTelser\Watten\Scheduler;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Scheduler\Task\AbstractTask;
use HermannTelser\Watten\Daten\Berechnung;
class CronTask extends AbstractTask
{
public function execute()
{
$businessLogic = GeneralUtility::makeInstance(Berechnung::class);
$businessLogic->run();
return true;
}
}
@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace HermannTelser\Watten\Tca;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Connection;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class Configuration
{
/*
* @param string $type
* @return integer
*/
public static function eingabedatum(): int
{
// use last entry in ergebnisse as default
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_watten_domain_model_ergebnisse')->createQueryBuilder();
$res = $queryBuilder
->select('datum')
->from('tx_watten_domain_model_ergebnisse')
->addOrderBy('uid', 'DESC')
->setMaxResults(1)
->setFirstResult(0)
->execute();
$spieltag = 0;
foreach ($res as $key => $value) {
$spieltag = (int) $value['datum'];
}
return $spieltag;
}
}
@@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace HermannTelser\Watten\Utilities;
/***
*
* This file is part of the "mindshape Cookie Consent" Extension for TYPO3 CMS.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* (c) 2021 Daniel Dorndorf <dorndorf@mindshape.de>, mindshape GmbH
*
***/
/**
* @package HermannTelser\Watten\Utility
*/
class CookieUtility
{
public const DEFAULT_COOKIE_NAME = 'watten';
/**
* @param string $name
* @return array|null
*/
public static function getCookieValue(string $name = self::DEFAULT_COOKIE_NAME): ?array
{
if (false === self::hasCookie($name)) {
return null;
}
return json_decode($_COOKIE[$name], true);
}
/**
* @param string $named
* @return bool
*/
public static function hasCookie(string $name = self::DEFAULT_COOKIE_NAME): bool
{
return true === array_key_exists($name, $_COOKIE);
}
/**
* @param string $name
*/
public static function deleteCookie(string $name = self::DEFAULT_COOKIE_NAME): void
{
unset($_COOKIE[$name]);
}
}
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3DataStructure>
<sheets>
<sDEF>
<ROOT>
<TCEforms>
<sheetTitle>Statistik Konfiguration</sheetTitle>
</TCEforms>
<type>array</type>
<el>
<!-- Add settings here ... -->
<settings.statistik_mode>
<TCEforms>
<label>Select Statistik</label>
<config>
<type>select</type>
<renderType>selectSingle</renderType>
<items>
<numIndex index="0">
<numIndex index="0">Spieltag Chart</numIndex>
<numIndex index="1">line</numIndex>
</numIndex>
<numIndex index="1">
<numIndex index="0">Ranglisten Bar</numIndex>
<numIndex index="1">bar</numIndex>
</numIndex>
</items>
</config>
</TCEforms>
</settings.statistik_mode>
<!-- end of settings -->
</el>
</ROOT>
</sDEF>
</sheets>
</T3DataStructure>
+8
View File
@@ -0,0 +1,8 @@
<?php
return [
'watten-plugin-ergebnisse' => [
'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class,
'source' => 'EXT:watten/Resources/Public/Icons/user_plugin_ergebnisse.svg'
],
];
@@ -0,0 +1,12 @@
<?php
return [
'frontend' => [
'hermanntelser/watten/wattenajax' => [
'target' => \HermannTelser\Watten\Controller\EidController::class,
'after' => [
'typo3/cms-frontend/prepare-tsfe-rendering'
]
],
],
];
@@ -0,0 +1,4 @@
<?php
defined('TYPO3') || die();
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile('watten', 'Configuration/TypoScript', 'Watten');
@@ -0,0 +1,32 @@
<?php
defined('TYPO3') || die();
// 1 extension key
// 2 the name of the plugin
// 3 title of the plugin used in the select box of the content element
// 4 icon
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Watten',
'Ergebnisse',
'Watten Ergebnisse',
'EXT:watten/Resources/Public/Icons/Extension.svg'
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Watten',
'Rangliste',
'Watten Rangliste',
'EXT:watten/Resources/Public/Icons/Extension.svg'
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
'Watten',
'Statistik',
'Watten Statistik',
'EXT:watten/Resources/Public/Icons/Extension.svg'
);
// $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['watten_statistik'] = 'pi_flexform';
// \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue(
// 'watten_statistik',
// 'FILE:EXT:watten/Configuration/FlexForms/flexform_watten.xml'
// );
@@ -0,0 +1,9 @@
<?php
defined('TYPO3_MODE') || die();
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr(
'tx_watten_domain_model_athleten',
'Watten Athleten'
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_watten_domain_model_athleten');
@@ -0,0 +1,9 @@
<?php
defined('TYPO3_MODE') || die();
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr(
'tx_watten_domain_model_ergebnisse',
'Watten Ergebnisse'
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_watten_domain_model_ergebnisse');
@@ -0,0 +1,9 @@
<?php
defined('TYPO3_MODE') || die();
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr(
'tx_watten_domain_model_events',
'Watten Spieltage'
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_watten_domain_model_events');
@@ -0,0 +1,107 @@
<?php
return [
'ctrl' => [
'title' => 'Watten Athleten',
'label' => 'name',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'dividers2tabs' => true,
'versioningWS' => false,
'iconfile' => 'EXT:watten/Resources/Public/Icons/User.svg',
'sortby' => 'uid',
],
'interface' => [
'showRecordFieldList' => 'gender, name, image, isactive',
],
'types' => [
'0' => ['showitem' => '
--div--;Teilnehmer, gender, name, isactive, image'
],
],
'palettes' => [
'1' => ['showitem' => 'name, isactive'],
],
'columns' => [
'gender' => [
'exclude' => 1,
'label' => 'Gender',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['Herr', 0],
['Frau', 1],
],
],
],
'name' => [
'exclude' => 1,
'label' => 'Athleten',
'config' => [
'type' => 'input',
'size' => 30,
'max' => 50,
],
],
'isactive' => [
'exclude' => 0,
'label' => 'Ist Aktiv',
'config' => [
'type' => 'check',
],
],
'image' => [
'exclude' => true,
'label' => 'Avatar',
'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig(
'image',
[
'appearance' => [
'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference'
],
'overrideChildTca' => [
'types' => [
\TYPO3\CMS\Core\Resource\File::FILETYPE_UNKNOWN => [
'showitem' => '
--palette--;;filePalette
'
],
\TYPO3\CMS\Core\Resource\File::FILETYPE_TEXT => [
'showitem' => '
--palette--;;filePalette
'
],
\TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => [
'showitem' => '
title,
alternative,
crop,
--palette--;;filePalette
'
],
\TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => [
'showitem' => '
--palette--;;filePalette
'
],
\TYPO3\CMS\Core\Resource\File::FILETYPE_VIDEO => [
'showitem' => '
--palette--;;filePalette
'
],
\TYPO3\CMS\Core\Resource\File::FILETYPE_APPLICATION => [
'showitem' => '
--palette--;;filePalette
'
],
],
],
'minitems' => 0,
'maxitems' => 1,
],
$GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']
),
],
],
];
@@ -0,0 +1,169 @@
<?php
return [
'ctrl' => [
'title' => 'Watten Ergebnisse',
'label' => 'uid',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'dividers2tabs' => true,
'versioningWS' => false,
'searchFields' => 'uid',
'iconfile' => 'EXT:watten/Resources/Public/Icons/List.svg',
'default_sortby' => 'uid DESC',
],
'interface' => [
'showRecordFieldList' => 'event_id, s1, s2, v1, v2, bumid, gstrichen',
],
'types' => [
'1' => ['showitem' => '
--div--;Spieltag, tournaments_id, event_id, s1, s2, v1, v2, bumid, gstrichen'
],
],
'palettes' => [
'1' => ['showitem' => 'datum'],
],
'columns' => [
// 'datum' => [
// 'exclude' => 1,
// 'label' => 'Spieltag',
// 'config' => [
// 'type' => 'input',
// 'renderType' => 'inputDateTime',
// 'disableAgeDisplay' => 1,
// 'size' => 13,
// 'eval' => 'date',
// 'checkbox' => 0,
// 'default' => time(),
// 'behaviour' => ['allowLanguageSynchronization' => false ],
// 'range' => ['lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))]
// ],
// ],
'tournaments_id' => [
'exclude' => 0,
'label' => 'Tournament',
'config' => [
'fieldWizard' => [
'selectIcons' => [
'disabled' => true
]
],
"type" => "select",
'renderType' => 'selectSingle',
"foreign_table" => "tx_watten_tournaments",
// 'foreign_table_where' => 'AND active = 1 ORDER BY tournament',
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
'event_id' => [
'exclude' => 0,
'label' => 'Event',
'config' => [
'fieldWizard' => [
'selectIcons' => [
'disabled' => true
]
],
"type" => "select",
'renderType' => 'selectSingle',
"foreign_table" => "tx_watten_domain_model_events",
// 'foreign_table_where' => 'AND isactive = 1',
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
's1' => [
'exclude' => 0,
'label' => 'Sieger 1',
'config' => [
"type" => "select",
"default" => "0",
'items' => [
['Bitte wählen', 0],
],
'renderType' => 'selectSingle',
"foreign_table" => "tx_watten_domain_model_athleten",
'foreign_table_where' => 'AND isactive = 1 ORDER BY name',
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
's2' => [
'exclude' => 0,
'label' => 'Sieger 2',
'config' => [
"type" => "select",
'items' => [
['Bitte wählen', 0],
],
"default" => "0",
'renderType' => 'selectSingle',
"foreign_table" => "tx_watten_domain_model_athleten",
'foreign_table_where' => 'AND isactive = 1 ORDER BY name',
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
'v1' => [
'exclude' => 0,
'label' => 'Verlierer 1',
'config' => [
"type" => "select",
'items' => [
['Bitte wählen', 0],
],
"default" => "0",
'renderType' => 'selectSingle',
"foreign_table" => "tx_watten_domain_model_athleten",
'foreign_table_where' => 'AND isactive = 1 ORDER BY name',
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
'v2' => [
'exclude' => 0,
'label' => 'Verlierer 2',
'config' => [
"type" => "select",
'items' => [
['Bitte wählen', 0],
],
"default" => "0",
'renderType' => 'selectSingle',
"foreign_table" => "tx_watten_domain_model_athleten",
'foreign_table_where' => 'AND isactive = 1 ORDER BY name',
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
'bumid' => [
'label' => 'Bummalen',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['Sieg', 1],
['Schneider', 2],
['Retour Schneider', 4],
],
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
'gstrichen' => [
'exclude' => 0,
'label' => 'Gstrichen/Gstrichen',
'config' => [
'type' => 'check',
],
],
],
];
@@ -0,0 +1,84 @@
<?php
return [
'ctrl' => [
'title' => 'Watten Spieltage',
'label' => 'datum',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'dividers2tabs' => true,
'versioningWS' => false,
'iconfile' => 'EXT:watten/Resources/Public/Icons/Calender.svg',
'default_sortby' => 'datum DESC',
],
'interface' => [
'showRecordFieldList' => 'tournaments_id, datum, isactive, event, story',
],
'types' => [
'1' => ['showitem' => '
--div--;Spieltag, tournaments_id, datum, isactive, event, story'
],
],
'palettes' => [
'1' => ['showitem' => 'datum'],
],
'columns' => [
'tournaments_id' => [
'exclude' => 0,
'label' => 'Tournament/Saison',
'config' =>[
'fieldWizard' => [
'selectIcons' => [
'disabled' => true
]
],
"type" => "select",
'renderType' => 'selectSingle',
"foreign_table" => "tx_watten_tournaments",
"size" => 1,
"minitems" => 1,
"maxitems" => 1,
],
],
'datum' => [
'exclude' => 1,
'label' => 'Spieltag',
'config' => [
'type' => 'input',
'renderType' => 'inputDateTime',
'disableAgeDisplay' => 1,
'size' => 13,
'eval' => 'date',
'checkbox' => 0,
'default' => time(),
'behaviour' => ['allowLanguageSynchronization' => false ]
],
],
'isactive' => [
'exclude' => 0,
'label' => 'Ist Aktiv',
'config' => [
'type' => 'check',
],
],
'event' => [
'exclude' => 1,
'label' => 'Select Anhang',
'config' => [
'type' => 'input',
'size' => 30,
'max' => 50,
],
],
'story' => [
'exclude' => true,
'label' => 'Spieltag Beschreibung',
'config' => [
'type' => 'text',
'cols' => 60,
'rows' => 5,
'enableRichtext' => true
]
],
],
];
@@ -0,0 +1,50 @@
<?php
return [
'ctrl' => [
'title' => 'Saisonen / Tournaments',
'label' => 'tournament',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
'dividers2tabs' => true,
'versioningWS' => false,
'iconfile' => 'EXT:watten/Resources/Public/Icons/Sun.svg',
'default_sortby' => 'tournament DESC',
],
'interface' => [
'showRecordFieldList' => 'tournament, active, king',
],
'types' => [
'0' => ['showitem' => '
--div--;Tournaments, tournament, active, king'
],
],
'palettes' => [
'1' => ['showitem' => 'Tournaments'],
],
'columns' => [
'tournament' => [
'exclude' => 0,
'label' => 'Tournaments',
'config' => [
'type' => 'input',
'size' => 30,
'max' => 50,
],
],
'active' => [
'exclude' => 0,
'label' => 'Ist Aktiv',
'config' => [
'type' => 'check',
],
],
'king' => [
'exclude' => 0,
'label' => 'Aktiver König',
'config' => [
'type' => 'check',
],
],
],
];
@@ -0,0 +1,14 @@
plugin.tx_watten_domain_model_ergebnisse {
view {
# cat=plugin.tx_watten_domain_model_ergebnisse/file; type=string; label=Path to template root (FE)
templateRootPath = EXT:watten/Resources/Private/Templates/
# cat=plugin.tx_watten_domain_model_ergebnisse/file; type=string; label=Path to template partials (FE)
partialRootPath = EXT:watten/Resources/Private/Partials/
# cat=plugin.tx_watten_domain_model_ergebnisse/file; type=string; label=Path to template layouts (FE)
layoutRootPath = EXT:watten/Resources/Private/Layouts/
}
persistence {
# cat=plugin.tx_watten_domain_model_ergebnisse//a; type=string; label=Default storage PID
storagePid =
}
}
@@ -0,0 +1,37 @@
plugin.tx_watten_domain_model_ergebnisse {
view {
templateRootPaths.0 = EXT:watten/Resources/Private/Templates/
templateRootPaths.1 = {$plugin.tx_watten_domain_model_ergebnisse.view.templateRootPath}
partialRootPaths.0 = EXT:watten/Resources/Private/Partials/
partialRootPaths.1 = {$plugin.tx_watten_domain_model_ergebnisse.view.partialRootPath}
layoutRootPaths.0 = EXT:watten/Resources/Private/Layouts/
layoutRootPaths.1 = {$plugin.tx_watten_domain_model_ergebnisse.view.layoutRootPath}
}
persistence {
storagePid = {$plugin.tx_watten_domain_model_ergebnisse.persistence.storagePid}
#recursive = 1
}
features {
#skipDefaultArguments = 1
# if set to 1, the enable fields are ignored in BE context
ignoreAllEnableFieldsInBe = 0
}
mvc {
#callDefaultActionIfActionCantBeResolved = 1
}
}
tx_watten_domain_model_ergebnisse = PAGE
tx_watten_domain_model_ergebnisse {
typeNum < 1234
config {
disableAllHeaderCode = 1
additionalHeaders = Content-type:text/html
xhtml_cleaning = 0
admPanel = 0
debug = 0
no_cache = 1
}
}
+31
View File
@@ -0,0 +1,31 @@
# Dotterbühel Watten
Typo3 Erweiterung zur Verwaltung der der Watterergebnisse des FC Dotterbühel
Verion TYPO3 CMS 11.5.19
### Installing
```
* git clone http://gitea.nuhodds.com:3000/salam/watten_t3.git
```
## Authors
Hermann Telser
## Version History
* 0.1
* Create Repository
## License
This project is privat
## Acknowledgments
Website Produktion
* [Dotterbühel Homepage](https://www.xn--dotterbhel-geb.com/)
* [Dotterbühel Typo3 Administration](https://www.xn--dotterbhel-geb.com/typo3)
Latest
@@ -0,0 +1,11 @@
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
Satisfy All
</IfModule>
# Apache >= 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
@@ -0,0 +1,99 @@
<style>
#grid_ergebnisse td,
#grid_ergebnisse th {
width: 100px !important
}
</style>
<f:asset.script identifier="watterergebnisse">
var bum1 = '<td><img src="typo3conf/ext/watten/Resources/Public/Icons/Bum.svg" class="iconsizesm"></td>';
var bum2 = '<td><img src="typo3conf/ext/watten/Resources/Public/Icons/Bum.svg" class="iconsizesm"><img src="typo3conf/ext/watten/Resources/Public/Icons/Bum.svg" class="iconsizesm"></td>';
var bum4 = '<td><img src="typo3conf/ext/watten/Resources/Public/Icons/Bum.svg" class="iconsizesm"><img src="typo3conf/ext/watten/Resources/Public/Icons/Bum.svg" class="iconsizesm"><img src="typo3conf/ext/watten/Resources/Public/Icons/Bum.svg" class="iconsizesm"><img src="typo3conf/ext/watten/Resources/Public/Icons/Bum.svg" class="iconsizesm"></td>';
function markName(classname) {
$('.athlet ').css('color', '#ddd');
$('.athlet ').css('font-weight', 'normal');
$('td.'+classname).css('color', '#CC7B2E');
$('td.'+classname).css('font-weight', 'bold');
}
$("#grid_ergebnisse").jsGrid({
height: "auto",
width: "100%",
heading: true,
filtering: false,
inserting: false,
editing: false,
selecting: true,
sorting: true,
paging: false,
pageLoading: false,
noDataContent: '&nbsp;Spieltag wählen&nbsp;',
loadIndication: true,
loadIndicationDelay: 500,
loadMessage: "&nbsp;Bitte, warten...&nbsp;",
loadShading: true,
fields: [
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Hashtag.svg" class="iconsize"><div class="xsmall">Spiel Nummer</div>', name: "uid", type: "text" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">Sieger</div>', name: "s1", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.s1; return '<td class="athlet ' + v + '" onClick="markName(\'' + v + '\')">' + v + '</td>'; }},
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">Sieger</div>', name: "s2", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.s2; return '<td class="athlet ' + v + '" onClick="markName(\'' + v + '\')">' + v + '</td>'; }},
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">Verlierer</div>', name: "v1", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.v1; return '<td class="athlet ' + v + '" onClick="markName(\'' + v + '\')">' + v + '</td>'; }},
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">Verlierer</div>', name: "v2", type: "text", css:"pointer", cellRenderer: function (item, value) { let v = value.v2; return '<td class="athlet ' + v + '" onClick="markName(\'' + v + '\')">' + v + '</td>'; }},
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Bold.svg" class="iconsize"><div class="xsmall">Bummale</div>', name: "bumid", type: "text", cellRenderer: function(item, value){ if(item==1) return bum1; else if(item==2) return bum2; else return bum4; }},
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Gstrichen.svg" class="iconsize"><div class="xsmall">Gstr/Gstr</div>', name: "gs", type: "text"}
]
});
$("#grid_punkte").jsGrid({
height: "auto",
width: "50%",
heading: true,
filtering: false,
inserting: false,
editing: false,
selecting: true,
sorting: true,
paging: false,
pageLoading: false,
noDataContent: '&nbsp;Spieltag wählen&nbsp;',
loadIndication: true,
loadIndicationDelay: 500,
loadMessage: "&nbsp;Bitte, warten...&nbsp;",
loadShading: true,
fields: [
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Rank.svg" class="iconsize"><div class="xsmall">Platzierung</div>', name: "rang", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/User.svg" class="iconsize"><div class="xsmall">Athlet</div>', name: "name", type: "text", width: "200" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Hashtag.svg" class="iconsize"><div class="xsmall">Punkte</div>', name: "punkte", type: "text", width: "100" },
]
});
$(function() {
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadspieltag",
event_id: $( "#spieltagselect" ).val()
},
dataType : "json"
})
.done(function( response ) {
$('#story_text').html(response.story);
$("#grid_ergebnisse").jsGrid({ data: response.data });
$("#grid_punkte").jsGrid({ data: response.punkte });
})
});
</f:asset.script>
<div id="story_text" style="padding:1rem 5rem;"></div>
<div id="grid_ergebnisse" class="pure-table"></div>
<br><br>
<h1 class="element-header text-center"><span>Punkte Spieltag</span></h1>
<div id="grid_punkte" class="pure-table" style="margin:auto;"></div>
@@ -0,0 +1,54 @@
<f:asset.script identifier="wattergstrichen">
$("#grid_gstrichen").jsGrid({
height: "auto",
width: "100%",
heading: true,
filtering: false,
inserting: false,
editing: false,
selecting: true,
sorting: true,
paging: false,
pageLoading: false,
noDataContent: '&nbsp;Turnier wählen&nbsp;',
loadIndication: true,
loadIndicationDelay: 500,
loadMessage: "&nbsp;Bitte, warten...&nbsp;",
loadShading: true,
fields: [
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Rank.svg" class="iconsize"><div class="xsmall bg-green">Platzierungen</div>', name: "platz", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/User.svg" class="iconsize"><div class="xsmall bg-green">Athlet</div>', name: "sieger", type: "text", width: "200" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Gstrichen-win.svg" class="iconsize"><div class="xsmall bg-green">Gewonnen</div>', name: "gewonnen", type: "text", width: "100" },
{ title: '<div class="xsmall">&nbsp</div>', name: "", type: "text", width: "100", css: "transparent" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Rank.svg" class="iconsize"><div class="xsmall bg-red">Platzierungen</div>', name: "platz", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/User.svg" class="iconsize"><div class="xsmall bg-red">Athlet</div>', name: "verlierer", type: "text", width: "200" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Gstrichen-lose.svg" class="iconsize"><div class="xsmall bg-red">Verloren</div>', name: "verloren", type: "text", width: "100" },
]
});
$(function() {
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadgstrichenliste",
tournament: $( "#tournament_rangliste" ).val()
},
dataType : "json"
})
.done(function( response ) {
$("#grid_gstrichen").jsGrid({ data: response });
})
});
</f:asset.script>
<br><br>
<h1 class="element-header text-center"><span>Gstrichen || Gstrichen</span></h1>
<br>
<div id="grid_gstrichen"
class="pure-table"></div>
@@ -0,0 +1,136 @@
<f:asset.script identifier="watterrangliste">
function render_gesamt(data, row) {
if(row.head == 1)
return '<td class="paarlaufheader">'+ data+ '</td>'
else
return '<td>'+ data+ '</td>'
}
$("#grid_paarlauf").jsGrid({
height: "auto",
width: "100%",
heading: true,
filtering: false,
inserting: false,
editing: false,
selecting: true,
sorting: true,
paging: false,
pageLoading: false,
noDataContent: '&nbsp;Athleten wählen&nbsp;',
loadIndication: true,
loadIndicationDelay: 500,
loadMessage: "&nbsp;Bitte, warten...&nbsp;",
loadShading: true,
fields: [
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/User.svg" class="iconsize"><div class="xsmall">Kontrahenten</div>',
name: "teams",
type: "text",
width: "30%",
css: "firstcolumn",
cellRenderer: render_gesamt,
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Hashtag.svg" class="iconsize"><div class="xsmall">Spiele</div>',
name: "spiele",
type: "text",
width: "6.5%",
css: "bold",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">Gesamt</div>',
name: "siege",
type: "text",
width: "6.5%",
css:"greenbold",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">Gesamt</div>',
name: "verloren",
type: "text",
width: "6.5%",
css:"rotbold",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">Siege</div>',
name: "sn",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">Schneider</div>',
name: "ss",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">R-Schneider</div>',
name: "srs",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Gstrichen-win.svg" class="iconsize"><div class="xsmall">Gstrichen</div>',
name: "sg",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">Verloren</div>',
name: "vn",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">Schneider</div>',
name: "vs",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">R-Schneider</div>',
name: "vrs",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt
},
{
title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Gstrichen-lose.svg" class="iconsize"><div class="xsmall">Gstrichen</div>',
name: "vg",
type: "text",
width: "6.5%",
cellRenderer: render_gesamt },
]
});
$(function() {
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadpaarlaufer",
tournament: $( "#tournament_paarlauf" ).val(),
teilnehmer_id: $( "#tournament_teilnehmer" ).val()
},
dataType : "json"
})
.done(function( response ) {
$("#grid_paarlauf").jsGrid({ data: response });
})
});
</f:asset.script>
<div id="grid_paarlauf"
class="pure-table"></div>
@@ -0,0 +1,55 @@
<f:asset.script identifier="watterrangliste">
$("#grid_rangliste").jsGrid({
height: "auto",
width: "100%",
heading: true,
filtering: false,
inserting: false,
editing: false,
selecting: true,
sorting: true,
paging: false,
pageLoading: false,
noDataContent: '&nbsp;Turnier wählen&nbsp;',
loadIndication: true,
loadIndicationDelay: 500,
loadMessage: "&nbsp;Bitte, warten...&nbsp;",
loadShading: true,
fields: [
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Rank.svg" class="iconsize"><div class="xsmall">Platzierungen</div>', name: "platz", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/User.svg" class="iconsize"><div class="xsmall">Athlet</div>', name: "name", type: "text", width: "200" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Hashtag.svg" class="iconsize"><div class="xsmall">Spiele</div>', name: "spiele", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Bowling.svg" class="iconsize"><div class="xsmall">Punkte</div>', name: "punkte", type: "text", width: "100", css: "bold" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">Siege</div>', name: "s1", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">Schneider</div>', name: "s2", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-up.svg" class="iconsize"><div class="xsmall">R-Schneider</div>', name: "s4", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Gstrichen-win.svg" class="iconsize"><div class="xsmall">Gstrichen</div>', name: "sg", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">Niederlagen</div>', name: "v1", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">Schneider</div>', name: "v2", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Thump-down.svg" class="iconsize"><div class="xsmall">R-Schneider</div>', name: "v4", type: "text", width: "100" },
{ title: '<img src="typo3conf/ext/watten/Resources/Public/Icons/Gstrichen-lose.svg" class="iconsize"><div class="xsmall">Gstrichen</div>', name: "vg", type: "text", width: "100" },
]
});
$(function() {
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadrangliste",
},
dataType : "json"
})
.done(function( response ) {
$("#grid_rangliste").jsGrid({ data: response });
})
});
</f:asset.script>
<div id="grid_rangliste"
class="pure-table"></div>
@@ -0,0 +1,31 @@
<f:asset.script identifier="laderangliste">
function loadTournamentAthleten(){
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadtournamentathleten",
tournament: $( "#tournament_paarlauf" ).val()
},
dataType : "json"
})
.done(function( response ) {
$("#grid_paarlauf").jsGrid({ data: '' });
var $select = $('#tournament_teilnehmer');
$select.find('option').remove();
$.each(response, function(key, value) {
$select.append(`<option value="${value.id}">${value.name}</option>`);
});
$select.options[0].selected = true
});
}
</f:asset.script>
<f:form.select id="tournament_paarlauf"
name="tournament_paarlauf"
options="{tournament_paarlauf}"
optionValueField="id"
optionLabelField="name"
additionalAttributes="{onchange: 'loadTournamentAthleten();'}"
value="{active}" />
@@ -0,0 +1,25 @@
<f:asset.script identifier="laderangliste">
function ladeRangliste(){
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadrangliste",
tournament: $( "#tournament_rangliste" ).val()
},
dataType : "json"
})
.done(function( response ) {
$("#grid_rangliste").jsGrid({ data: response });
});
}
</f:asset.script>
<f:form.select id="tournament_rangliste"
name="tournament_rangliste"
options="{tournament_rangliste}"
optionValueField="id"
optionLabelField="name"
additionalAttributes="{onchange: 'ladeRangliste(); ladeStatistikRangliste();'}"
value="{active}" />
@@ -0,0 +1,26 @@
<f:asset.script identifier="loadspieltag">
function ladeSpieltag(){
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadspieltag",
event_id: $( "#spieltagselect" ).val()
},
dataType : "json"
})
.done(function( response ) {
$('#story_text').html(response.story);
$("#grid_ergebnisse").jsGrid({ data: response.data });
$("#grid_punkte").jsGrid({ data: response.punkte });
})
}
</f:asset.script>
<f:form.select name="spieltagselect"
id="spieltagselect"
options="{spieltage}"
additionalAttributes="{onchange: 'ladeSpieltag(); ladeStatistik();'}"
optionValueField="id"
optionLabelField="name"
value="{active_event_id}" />
@@ -0,0 +1,25 @@
<f:asset.script identifier="loadpaarlaufer">
function ladePaarlaufer(){
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadpaarlaufer",
tournament: $( "#tournament_paarlauf" ).val(),
teilnehmer_id: $( "#tournament_teilnehmer" ).val()
},
dataType : "json"
})
.done(function( response ) {
$("#grid_paarlauf").jsGrid({ data: response });
})
}
</f:asset.script>
<f:form.select name="tournament_teilnehmer"
id="tournament_teilnehmer"
options="{tournament_teilnehmer}"
additionalAttributes="{onchange: 'ladePaarlaufer();'}"
optionValueField="id"
optionLabelField="name"
value="{active_teilnehmer_id}" />
@@ -0,0 +1,37 @@
<f:asset.script identifier="loadspieltage">
function ladeSpieltage(){
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadspieltage",
tournament: $( "#tournament" ).val()
},
dataType : "json"
})
.done(function( response ) {
$("#grid_ergebnisse").jsGrid({ data: '' });
$("#grid_punkte").jsGrid({ data: '' });
$('#story_text').html('');
myChart.data = [];
myChart.update();
var $select = $('#spieltagselect');
$select.find('option').remove();
$.each(response, function(key, value) {
$select.append(`<option value="${value.id}">${value.name}</option>`);
});
})
}
</f:asset.script>
<f:form.select id="tournament"
name="tournament"
options="{tournaments}"
optionValueField="id"
optionLabelField="name"
additionalAttributes="{onchange: 'ladeSpieltage();'}"
value="{active_tournaments}" />
@@ -0,0 +1,6 @@
<br><br>
<h1 class="element-header text-center"><span>Liniendiagramm Spieltag</span></h1>
<br>
<div>
<canvas id="dotterStatistikErgebnisse"></canvas>
</div>
@@ -0,0 +1,6 @@
<br><br>
<h1 class="element-header text-center"><span>Ergebnisse Balkendiagram</span></h1>
<br>
<div>
<canvas id="dotterStatistikRangliste"></canvas>
</div>
@@ -0,0 +1,26 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers">
<f:asset.script identifier="chart"
type="module"
src="EXT:watten/Resources/Public/node_modules/chart.js/dist/chart.umd.js" />
<f:asset.script identifier="statistikjahr"
src="EXT:watten/Resources/Public/Javascript/statistik_line.js" />
<table style="width: 100%">
<tr>
<td class="right"
style="width:47%;">
<f:render partial="selectTournament"
arguments="{tournaments: tournaments, active_tournaments: active_tournaments}" />
</td>
<td>
<f:render partial="selectSpieltag"
arguments="{spieltage: spieltage, active_event_id: active_event_id }" />
</td>
</tr>
</table>
<f:render partial="GridErgebnisse" />
<f:render partial="StatistikErgebnisse" />
@@ -0,0 +1,24 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers">
<f:asset.script identifier="chart"
type="module"
src="EXT:watten/Resources/Public/node_modules/chart.js/dist/chart.umd.js" />
<f:asset.script identifier="statistikjahr"
src="EXT:watten/Resources/Public/Javascript/statistik_bar.js" />
<table style="width: 100%">
<tr>
<td class="center"
style="width:47%;">
<f:render partial="SelectRangliste"
arguments="{tournament_rangliste: tournaments, active: active}" />
</td>
</tr>
</table>
<f:render partial="GridRangliste" />
<f:render partial="GridGstrichen" />
<f:render partial="StatistikRangliste" />
@@ -0,0 +1,25 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers">
<h1 class="element-header text-center"><span>Paarlauf</span></h1>
<br>
<table style="width: 100%">
<tr>
<td class="center"
style="width:47%;">
<f:render partial="SelectPaarlauf"
arguments="{tournament_paarlauf: tournaments, active: active}" />
</td>
</tr>
<tr>
<td class="center"
style="width:47%;">
<f:render partial="SelectTeilnehmer"
arguments="{tournament_teilnehmer: teilnehmer, active: active}" />
</td>
</tr>
</table>
<f:render partial="GridPaarlauf" />
@@ -0,0 +1 @@
https://www.chartjs.org/docs/latest/samples/line/line.html
+1
View File
@@ -0,0 +1 @@
/var/www/html/dotter_t3/public/fileadmin/templates/css/base.css
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@@ -0,0 +1,326 @@
/*
* jsGrid v1.5.3 (http://js-grid.com)
* (c) 2016 Artem Tabalin
* Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE)
*/
.jsgrid-table {
width: 100%;
}
.jsgrid-grid-header,
.jsgrid-grid-body,
.jsgrid-header-row>.jsgrid-header-cell,
.jsgrid-filter-row>.jsgrid-cell,
.jsgrid-insert-row>.jsgrid-cell,
.jsgrid-edit-row>.jsgrid-cell {
border: 1px solid #333;
text-align: center;
}
.jsgrid-header-row>.jsgrid-header-cell {
border-top: 0;
}
.jsgrid-header-row>.jsgrid-header-cell,
.jsgrid-filter-row>.jsgrid-cell,
.jsgrid-insert-row>.jsgrid-cell {
border-bottom: 0;
}
.jsgrid-header-row>.jsgrid-header-cell:first-child,
.jsgrid-filter-row>.jsgrid-cell:first-child,
.jsgrid-insert-row>.jsgrid-cell:first-child {
border-left: none;
}
.jsgrid-header-row>.jsgrid-header-cell:last-child,
.jsgrid-filter-row>.jsgrid-cell:last-child,
.jsgrid-insert-row>.jsgrid-cell:last-child {
border-right: none;
}
.jsgrid-header-row .jsgrid-align-right,
.jsgrid-header-row .jsgrid-align-left {
text-align: center;
}
.jsgrid-grid-header {
background: #313131;
}
.jsgrid-header-scrollbar {
scrollbar-arrow-color: #242424;
scrollbar-base-color: #242424;
scrollbar-3dlight-color: #242424;
scrollbar-highlight-color: #242424;
scrollbar-track-color: #242424;
scrollbar-shadow-color: #242424;
scrollbar-dark-shadow-color: #242424;
}
.jsgrid-header-scrollbar::-webkit-scrollbar {
visibility: hidden;
}
.jsgrid-header-scrollbar::-webkit-scrollbar-track {
background: #242424;
}
.jsgrid-header-sortable:hover {
cursor: pointer;
background: #000;
}
.jsgrid-header-row .jsgrid-header-sort {
background: #3d3d3d;
}
.jsgrid-header-sort:before {
content: " ";
display: block;
float: left;
width: 0;
height: 0;
border-style: solid;
}
.jsgrid-header-sort-asc:before {
border-width: 0 5px 5px 5px;
border-color: transparent transparent #aaa transparent;
margin: 3px;
}
.jsgrid-header-sort-desc:before {
border-width: 5px 5px 0 5px;
border-color: #aaa transparent transparent transparent;
margin: 3px;
}
.jsgrid-grid-body {
border-top: none;
}
.jsgrid-cell {
border: #777 1px solid;
}
.jsgrid-grid-body .jsgrid-row:first-child .jsgrid-cell,
.jsgrid-grid-body .jsgrid-alt-row:first-child .jsgrid-cell {
border-top: none;
}
.jsgrid-grid-body .jsgrid-cell:first-child {
border-left: none;
}
.jsgrid-grid-body .jsgrid-cell:last-child {
border-right: none;
}
.jsgrid-row>.jsgrid-cell {
background: #0C0A09;
}
.jsgrid-alt-row>.jsgrid-cell {
background: #313131;
}
.jsgrid-header-row>.jsgrid-header-cell {
background: #313131;
}
.jsgrid-filter-row>.jsgrid-cell {
background: #313131;
}
.jsgrid-insert-row>.jsgrid-cell {
background: #313131;
}
.jsgrid-edit-row>.jsgrid-cell {
background: #3a3a3a;
}
.jsgrid-selected-row>.jsgrid-cell {
background: #D97706;
color:#000;
border-color: #3d3d3d;
}
.jsgrid-nodata-row>.jsgrid-cell {
background: #000;
}
.jsgrid-invalid input,
.jsgrid-invalid select,
.jsgrid-invalid textarea {
background: #313131;
color: #d3d3d3;
border: 1px solid #800;
}
.jsgrid-pager-current-page {
font-weight: bold;
}
.jsgrid-pager-nav-inactive-button a {
color: #d3d3d3;
}
.jsgrid-button+.jsgrid-button {
margin-left: 5px;
}
.jsgrid-button:hover {
opacity: .5;
transition: opacity 200ms linear;
}
.jsgrid .jsgrid-button {
width: 16px;
height: 16px;
border: none;
cursor: pointer;
background-image: url(data:image/png;base64,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 truncated
background-repeat: no-repeat;
background-color: transparent;
}
@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min-device-pixel-ratio: 2) {
.jsgrid .jsgrid-button {
background-image: url(data:image/png;base64,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 truncated
background-size: 24px 352px;
}
}
.jsgrid .jsgrid-mode-button {
width: 24px;
height: 24px;
}
.jsgrid-mode-on-button {
opacity: .5;
}
.jsgrid-cancel-edit-button {
background-position: 0 0;
width: 16px;
height: 16px;
}
.jsgrid-clear-filter-button {
background-position: 0 -40px;
width: 16px;
height: 16px;
}
.jsgrid-delete-button {
background-position: 0 -80px;
width: 16px;
height: 16px;
}
.jsgrid-edit-button {
background-position: 0 -120px;
width: 16px;
height: 16px;
}
.jsgrid-insert-mode-button {
background-position: 0 -160px;
width: 24px;
height: 24px;
}
.jsgrid-insert-button {
background-position: 0 -208px;
width: 16px;
height: 16px;
}
.jsgrid-search-mode-button {
background-position: 0 -248px;
width: 24px;
height: 24px;
}
.jsgrid-search-button {
background-position: 0 -296px;
width: 16px;
height: 16px;
}
.jsgrid-update-button {
background-position: 0 -336px;
width: 16px;
height: 16px;
}
.jsgrid-load-shader {
background: #3d3d3d;
opacity: .5;
filter: alpha(opacity=50);
}
.jsgrid-load-panel {
width: 15em;
height: 5em;
background: #000;
border: 1px solid #333;
padding-top: 3em;
text-align: center;
}
.jsgrid-load-panel:before {
content: ' ';
position: absolute;
top: .5em;
left: 50%;
margin-left: -1em;
width: 2em;
height: 2em;
border: 2px solid #009a67;
border-right-color: transparent;
border-radius: 50%;
-webkit-animation: indicator 1s linear infinite;
animation: indicator 1s linear infinite;
}
@-webkit-keyframes indicator {
from {
-webkit-transform: rotate(0deg);
}
50% {
-webkit-transform: rotate(180deg);
}
to {
-webkit-transform: rotate(360deg);
}
}
@keyframes indicator {
from {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
to {
transform: rotate(360deg);
}
}
/* old IE */
.jsgrid-load-panel {
padding-top: 1.5em\9;
}
.jsgrid-load-panel:before {
display: none\9;
}
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path fill="#CC7B2E" d="M349.4 44.6c5.9-13.7 1.5-29.7-10.6-38.5s-28.6-8-39.9 1.8l-256 224c-10 8.8-13.6 22.9-8.9 35.3S50.7 288 64 288H175.5L98.6 467.4c-5.9 13.7-1.5 29.7 10.6 38.5s28.6 8 39.9-1.8l256-224c10-8.8 13.6-22.9 8.9-35.3s-16.6-20.7-30-20.7H272.5L349.4 44.6z"/></svg>

After

Width:  |  Height:  |  Size: 509 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path fill="#9A9A9A" d="M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512zM240 144c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32zm32 64c0 17.7-14.3 32-32 32s-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32zm-128 0c-17.7 0-32-14.3-32-32s14.3-32 32-32s32 14.3 32 32s-14.3 32-32 32z"/></svg>

After

Width:  |  Height:  |  Size: 568 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="#9A9A9A" d="M256 512c141.4 0 256-114.6 256-256S397.4 0 256 0S0 114.6 0 256S114.6 512 256 512z"/>
</svg>

After

Width:  |  Height:  |  Size: 184 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path
fill="#CC7B2E"
d="M224 232C237.3 232 248 242.7 248 256V304H296C309.3 304 320 314.7 320 328C320 341.3 309.3 352 296 352H248V400C248 413.3 237.3 424 224 424C210.7 424 200 413.3 200 400V352H152C138.7 352 128 341.3 128 328C128 314.7 138.7 304 152 304H200V256C200 242.7 210.7 232 224 232zM152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z"/>
</svg>

After

Width:  |  Height:  |  Size: 693 B

@@ -0,0 +1,25 @@
<svg height="800px" width="800px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 30.875 32.045" xml:space="preserve">
<g id="Layer_36">
<path style="fill:#D6D3D1;" d="M30.582,0.293c-0.39-0.391-1.024-0.391-1.414,0l-13.73,13.731L1.707,0.293
c-0.391-0.391-1.024-0.391-1.414,0c-0.391,0.391-0.391,1.024,0,1.414l13.73,13.73l-3.182,3.182
c-1.238-0.926-2.713-1.398-4.186-1.397c-1.788-0.001-3.587,0.684-4.95,2.048c-0.391,0.39-0.391,1.024,0,1.414l3.535,3.536
l-4.243,4.243c-0.001,0.001-0.303,0.303-0.709,0.713c-0.386,0.39-0.385,1.023,0.004,1.411c1.028,1.026,2.381,1.461,3.662,1.458
c1.269-0.001,2.486-0.541,3.406-1.461c0.798-0.797,1.253-1.806,1.397-2.846l1.431,1.432c0.186,0.186,0.444,0.293,0.707,0.293
c0.263,0,0.521-0.107,0.707-0.293c1.364-1.363,2.049-3.161,2.048-4.95c0.001-1.473-0.471-2.948-1.397-4.186l3.182-3.182
l3.182,3.182c-0.926,1.238-1.398,2.713-1.397,4.186c-0.001,1.788,0.684,3.587,2.048,4.95c0.186,0.186,0.444,0.293,0.707,0.293
s0.521-0.107,0.707-0.293l1.431-1.432c0.144,1.04,0.599,2.048,1.397,2.846c0.92,0.92,2.137,1.46,3.406,1.461
c1.282,0.002,2.635-0.432,3.662-1.458c0.389-0.388,0.39-1.021,0.004-1.411c-0.406-0.41-0.708-0.712-0.709-0.713l-4.243-4.243
l3.535-3.536c0.186-0.186,0.293-0.444,0.293-0.707c0-0.263-0.107-0.521-0.293-0.707c-1.363-1.364-3.161-2.049-4.95-2.048
c-1.473-0.001-2.948,0.471-4.186,1.397l-3.182-3.182l13.73-13.73C30.973,1.317,30.973,0.683,30.582,0.293z M5.948,29.17
c-0.575,0.575-1.3,0.876-1.992,0.875c-0.498-0.001-0.972-0.109-1.405-0.306l3.974-3.974c0.192,0.405,0.299,0.841,0.3,1.284
C6.824,27.821,6.534,28.583,5.948,29.17z M10.826,26.977l-3.464-3.464c0,0,0,0,0,0l0,0l-3.464-3.464
c0.832-0.551,1.792-0.825,2.757-0.826c1.284,0.001,2.559,0.486,3.535,1.462c0.976,0.976,1.461,2.251,1.462,3.536
C11.651,25.186,11.377,26.145,10.826,26.977z M28.324,29.739c-0.433,0.198-0.907,0.305-1.405,0.306
c-0.692,0.001-1.417-0.3-1.992-0.875c-0.586-0.587-0.876-1.349-0.877-2.121c0.001-0.443,0.108-0.879,0.3-1.284L28.324,29.739z
M20.685,20.685c0.976-0.976,2.251-1.461,3.535-1.462c0.965,0.001,1.925,0.275,2.757,0.826l-3.464,3.464v0l0,0l-3.464,3.464
c-0.55-0.832-0.825-1.792-0.826-2.757C19.224,22.936,19.709,21.661,20.685,20.685z"/>
</g>
<g id="Layer_1">
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
<path fill="#CC7B2E" d="M309 106c11.4-7 19-19.7 19-34c0-22.1-17.9-40-40-40s-40 17.9-40 40c0 14.4 7.6 27 19 34L209.7 220.6c-9.1 18.2-32.7 23.4-48.6 10.7L72 160c5-6.7 8-15 8-24c0-22.1-17.9-40-40-40S0 113.9 0 136s17.9 40 40 40c.2 0 .5 0 .7 0L86.4 427.4c5.5 30.4 32 52.6 63 52.6H426.6c30.9 0 57.4-22.1 63-52.6L535.3 176c.2 0 .5 0 .7 0c22.1 0 40-17.9 40-40s-17.9-40-40-40s-40 17.9-40 40c0 9 3 17.3 8 24l-89.1 71.3c-15.9 12.7-39.5 7.5-48.6-10.7L309 106z"/>
</svg>

After

Width:  |  Height:  |  Size: 562 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
<path
fill="#800"
d="M48 64C21.5 64 0 85.5 0 112V400c0 26.5 21.5 48 48 48H80c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H48zm192 0c-26.5 0-48 21.5-48 48V400c0 26.5 21.5 48 48 48h32c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H240z"/></svg>

After

Width:  |  Height:  |  Size: 317 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
<path
fill="#062"
d="M48 64C21.5 64 0 85.5 0 112V400c0 26.5 21.5 48 48 48H80c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H48zm192 0c-26.5 0-48 21.5-48 48V400c0 26.5 21.5 48 48 48h32c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H240z"/></svg>

After

Width:  |  Height:  |  Size: 317 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
<path
fill="#9A9A9A"
d="M48 64C21.5 64 0 85.5 0 112V400c0 26.5 21.5 48 48 48H80c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H48zm192 0c-26.5 0-48 21.5-48 48V400c0 26.5 21.5 48 48 48h32c26.5 0 48-21.5 48-48V112c0-26.5-21.5-48-48-48H240z"/></svg>

After

Width:  |  Height:  |  Size: 320 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path
fill="#9A9A9A"
d="M181.3 32.4c17.4 2.9 29.2 19.4 26.3 36.8L197.8 128h95.1l11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4 26.3 36.8L357.8 128H416c17.7 0 32 14.3 32 32s-14.3 32-32 32H347.1L325.8 320H384c17.7 0 32 14.3 32 32s-14.3 32-32 32H315.1l-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7H155.1l-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2 384H32c-17.7 0-32-14.3-32-32s14.3-32 32-32h68.9l21.3-128H64c-17.7 0-32-14.3-32-32s14.3-32 32-32h68.9l11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3zM187.1 192L165.8 320h95.1l21.3-128H187.1z"/></svg>

After

Width:  |  Height:  |  Size: 830 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path
fill="#CC7B2E"
d="M309 106c11.4-7 19-19.7 19-34c0-22.1-17.9-40-40-40s-40 17.9-40 40c0 14.4 7.6 27 19 34L209.7 220.6c-9.1 18.2-32.7 23.4-48.6 10.7L72 160c5-6.7 8-15 8-24c0-22.1-17.9-40-40-40S0 113.9 0 136s17.9 40 40 40c.2 0 .5 0 .7 0L86.4 427.4c5.5 30.4 32 52.6 63 52.6H426.6c30.9 0 57.4-22.1 63-52.6L535.3 176c.2 0 .5 0 .7 0c22.1 0 40-17.9 40-40s-17.9-40-40-40s-40 17.9-40 40c0 9 3 17.3 8 24l-89.1 71.3c-15.9 12.7-39.5 7.5-48.6-10.7L309 106z"/></svg>

After

Width:  |  Height:  |  Size: 701 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="#CC7B2E" d="M24 56c0-13.3 10.7-24 24-24H80c13.3 0 24 10.7 24 24V176h16c13.3 0 24 10.7 24 24s-10.7 24-24 24H40c-13.3 0-24-10.7-24-24s10.7-24 24-24H56V80H48C34.7 80 24 69.3 24 56zM86.7 341.2c-6.5-7.4-18.3-6.9-24 1.2L51.5 357.9c-7.7 10.8-22.7 13.3-33.5 5.6s-13.3-22.7-5.6-33.5l11.1-15.6c23.7-33.2 72.3-35.6 99.2-4.9c21.3 24.4 20.8 60.9-1.1 84.7L86.8 432H120c13.3 0 24 10.7 24 24s-10.7 24-24 24H32c-9.5 0-18.2-5.6-22-14.4s-2.1-18.9 4.3-25.9l72-78c5.3-5.8 5.4-14.6 .3-20.5zM224 64H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 160H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 160H480c17.7 0 32 14.3 32 32s-14.3 32-32 32H224c-17.7 0-32-14.3-32-32s14.3-32 32-32z"/>
</svg>

After

Width:  |  Height:  |  Size: 818 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="#CC7B2E" d="M313.4 479.1c26-5.2 42.9-30.5 37.7-56.5l-2.3-11.4c-5.3-26.7-15.1-52.1-28.8-75.2H464c26.5 0 48-21.5 48-48c0-25.3-19.5-46-44.3-47.9c7.7-8.5 12.3-19.8 12.3-32.1c0-23.4-16.8-42.9-38.9-47.1c4.4-7.3 6.9-15.8 6.9-24.9c0-21.3-13.9-39.4-33.1-45.6c.7-3.3 1.1-6.8 1.1-10.4c0-26.5-21.5-48-48-48H294.5c-19 0-37.5 5.6-53.3 16.1L202.7 73.8C176 91.6 160 121.6 160 153.7V192v48 24.9c0 29.2 13.3 56.7 36 75l7.4 5.9c26.5 21.2 44.6 51 51.2 84.2l2.3 11.4c5.2 26 30.5 42.9 56.5 37.7zM32 320H96c17.7 0 32-14.3 32-32V64c0-17.7-14.3-32-32-32H32C14.3 32 0 46.3 0 64V288c0 17.7 14.3 32 32 32z"/>
</svg>

After

Width:  |  Height:  |  Size: 665 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
<path fill="#CA8A04" d="M112 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm40 304V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V256.9L59.4 304.5c-9.1 15.1-28.8 20-43.9 10.9s-20-28.8-10.9-43.9l58.3-97c17.4-28.9 48.6-46.6 82.3-46.6h29.7c33.7 0 64.9 17.7 82.3 46.6l58.3 97c9.1 15.1 4.2 34.8-10.9 43.9s-34.8 4.2-43.9-10.9L232 256.9V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V352H152z"/>
</svg>

After

Width:  |  Height:  |  Size: 440 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512">
<path fill="#2563EB" d="M112 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm40 304V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V256.9L59.4 304.5c-9.1 15.1-28.8 20-43.9 10.9s-20-28.8-10.9-43.9l58.3-97c17.4-28.9 48.6-46.6 82.3-46.6h29.7c33.7 0 64.9 17.7 82.3 46.6l58.3 97c9.1 15.1 4.2 34.8-10.9 43.9s-34.8 4.2-43.9-10.9L232 256.9V480c0 17.7-14.3 32-32 32s-32-14.3-32-32V352H152z"/>
</svg>

After

Width:  |  Height:  |  Size: 440 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512">
<path
fill="#9A9A9A"
d="M353.8 54.1L330.2 6.3c-3.9-8.3-16.1-8.6-20.4 0L286.2 54.1l-52.3 7.5c-9.3 1.4-13.3 12.9-6.4 19.8l38 37-9 52.1c-1.4 9.3 8.2 16.5 16.8 12.2l46.9-24.8 46.6 24.4c8.6 4.3 18.3-2.9 16.8-12.2l-9-52.1 38-36.6c6.8-6.8 2.9-18.3-6.4-19.8l-52.3-7.5zM256 256c-17.7 0-32 14.3-32 32V480c0 17.7 14.3 32 32 32H384c17.7 0 32-14.3 32-32V288c0-17.7-14.3-32-32-32H256zM32 320c-17.7 0-32 14.3-32 32V480c0 17.7 14.3 32 32 32H160c17.7 0 32-14.3 32-32V352c0-17.7-14.3-32-32-32H32zm416 96v64c0 17.7 14.3 32 32 32H608c17.7 0 32-14.3 32-32V416c0-17.7-14.3-32-32-32H480c-17.7 0-32 14.3-32 32z"/>
</svg>

After

Width:  |  Height:  |  Size: 670 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<path fill="#CC7B2E" d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"/>
</svg>

After

Width:  |  Height:  |  Size: 762 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512">
<path fill="#2563EB" d="M72 88a56 56 0 1 1 112 0A56 56 0 1 1 72 88zM64 245.7C54 256.9 48 271.8 48 288s6 31.1 16 42.3V245.7zm144.4-49.3C178.7 222.7 160 261.2 160 304c0 34.3 12 65.8 32 90.5V416c0 17.7-14.3 32-32 32H96c-17.7 0-32-14.3-32-32V389.2C26.2 371.2 0 332.7 0 288c0-61.9 50.1-112 112-112h32c24 0 46.2 7.5 64.4 20.3zM448 416V394.5c20-24.7 32-56.2 32-90.5c0-42.8-18.7-81.3-48.4-107.7C449.8 183.5 472 176 496 176h32c61.9 0 112 50.1 112 112c0 44.7-26.2 83.2-64 101.2V416c0 17.7-14.3 32-32 32H480c-17.7 0-32-14.3-32-32zm8-328a56 56 0 1 1 112 0A56 56 0 1 1 456 88zM576 245.7v84.7c10-11.3 16-26.1 16-42.3s-6-31.1-16-42.3zM320 32a64 64 0 1 1 0 128 64 64 0 1 1 0-128zM240 304c0 16.2 6 31 16 42.3V261.7c-10 11.3-16 26.1-16 42.3zm144-42.3v84.7c10-11.3 16-26.1 16-42.3s-6-31.1-16-42.3zM448 304c0 44.7-26.2 83.2-64 101.2V448c0 17.7-14.3 32-32 32H288c-17.7 0-32-14.3-32-32V405.2c-37.8-18-64-56.5-64-101.2c0-61.9 50.1-112 112-112h32c61.9 0 112 50.1 112 112z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path
fill="#800" d="M313.4 479.1c26-5.2 42.9-30.5 37.7-56.5l-2.3-11.4c-5.3-26.7-15.1-52.1-28.8-75.2H464c26.5 0 48-21.5 48-48c0-25.3-19.5-46-44.3-47.9c7.7-8.5 12.3-19.8 12.3-32.1c0-23.4-16.8-42.9-38.9-47.1c4.4-7.3 6.9-15.8 6.9-24.9c0-21.3-13.9-39.4-33.1-45.6c.7-3.3 1.1-6.8 1.1-10.4c0-26.5-21.5-48-48-48H294.5c-19 0-37.5 5.6-53.3 16.1L202.7 73.8C176 91.6 160 121.6 160 153.7V192v48 24.9c0 29.2 13.3 56.7 36 75l7.4 5.9c26.5 21.2 44.6 51 51.2 84.2l2.3 11.4c5.2 26 30.5 42.9 56.5 37.7zM32 320H96c17.7 0 32-14.3 32-32V64c0-17.7-14.3-32-32-32H32C14.3 32 0 46.3 0 64V288c0 17.7 14.3 32 32 32z"/></svg>

After

Width:  |  Height:  |  Size: 829 B

@@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path
fill="#062" d="M313.4 32.9c26 5.2 42.9 30.5 37.7 56.5l-2.3 11.4c-5.3 26.7-15.1 52.1-28.8 75.2H464c26.5 0 48 21.5 48 48c0 25.3-19.5 46-44.3 47.9c7.7 8.5 12.3 19.8 12.3 32.1c0 23.4-16.8 42.9-38.9 47.1c4.4 7.2 6.9 15.8 6.9 24.9c0 21.3-13.9 39.4-33.1 45.6c.7 3.3 1.1 6.8 1.1 10.4c0 26.5-21.5 48-48 48H294.5c-19 0-37.5-5.6-53.3-16.1l-38.5-25.7C176 420.4 160 390.4 160 358.3V320 272 247.1c0-29.2 13.3-56.7 36-75l7.4-5.9c26.5-21.2 44.6-51 51.2-84.2l2.3-11.4c5.2-26 30.5-42.9 56.5-37.7zM32 192H96c17.7 0 32 14.3 32 32V448c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32V224c0-17.7 14.3-32 32-32z"/></svg>

After

Width:  |  Height:  |  Size: 833 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="#CC7B2E" d="M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0S96 57.3 96 128s57.3 128 128 128zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 309 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path
fill="#CC7B2E"
d="M219.3 .5c3.1-.6 6.3-.6 9.4 0l200 40C439.9 42.7 448 52.6 448 64s-8.1 21.3-19.3 23.5L352 102.9V160c0 70.7-57.3 128-128 128s-128-57.3-128-128V102.9L48 93.3v65.1l15.7 78.4c.9 4.7-.3 9.6-3.3 13.3s-7.6 5.9-12.4 5.9H16c-4.8 0-9.3-2.1-12.4-5.9s-4.3-8.6-3.3-13.3L16 158.4V86.6C6.5 83.3 0 74.3 0 64C0 52.6 8.1 42.7 19.3 40.5l200-40zM129.1 323.2l83.2 88.4c6.3 6.7 17 6.7 23.3 0l83.2-88.4c73.7 14.9 129.1 80 129.1 158.1c0 17-13.8 30.7-30.7 30.7H30.7C13.8 512 0 498.2 0 481.3c0-78.1 55.5-143.2 129.1-158.1z"/></svg>

After

Width:  |  Height:  |  Size: 773 B

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path fill="#CC7B2E" d="M313.4 32.9c26 5.2 42.9 30.5 37.7 56.5l-2.3 11.4c-5.3 26.7-15.1 52.1-28.8 75.2H464c26.5 0 48 21.5 48 48c0 25.3-19.5 46-44.3 47.9c7.7 8.5 12.3 19.8 12.3 32.1c0 23.4-16.8 42.9-38.9 47.1c4.4 7.2 6.9 15.8 6.9 24.9c0 21.3-13.9 39.4-33.1 45.6c.7 3.3 1.1 6.8 1.1 10.4c0 26.5-21.5 48-48 48H294.5c-19 0-37.5-5.6-53.3-16.1l-38.5-25.7C176 420.4 160 390.4 160 358.3V320 272 247.1c0-29.2 13.3-56.7 36-75l7.4-5.9c26.5-21.2 44.6-51 51.2-84.2l2.3-11.4c5.2-26 30.5-42.9 56.5-37.7zM32 192H96c17.7 0 32 14.3 32 32V448c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32V224c0-17.7 14.3-32 32-32z"/>
</svg>

After

Width:  |  Height:  |  Size: 838 B

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512">
<path fill="#CC7B2E" d="M309 106c11.4-7 19-19.7 19-34c0-22.1-17.9-40-40-40s-40 17.9-40 40c0 14.4 7.6 27 19 34L209.7 220.6c-9.1 18.2-32.7 23.4-48.6 10.7L72 160c5-6.7 8-15 8-24c0-22.1-17.9-40-40-40S0 113.9 0 136s17.9 40 40 40c.2 0 .5 0 .7 0L86.4 427.4c5.5 30.4 32 52.6 63 52.6H426.6c30.9 0 57.4-22.1 63-52.6L535.3 176c.2 0 .5 0 .7 0c22.1 0 40-17.9 40-40s-17.9-40-40-40s-40 17.9-40 40c0 9 3 17.3 8 24l-89.1 71.3c-15.9 12.7-39.5 7.5-48.6-10.7L309 106z"/>
</svg>

After

Width:  |  Height:  |  Size: 562 B

@@ -0,0 +1,305 @@
/*
* jsGrid v1.5.3 (http://js-grid.com)
* (c) 2016 Artem Tabalin
* Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE)
*/
.jsgrid-grid-header,
.jsgrid-grid-body,
.jsgrid-header-row>.jsgrid-header-cell,
.jsgrid-filter-row>.jsgrid-cell,
.jsgrid-insert-row>.jsgrid-cell,
.jsgrid-edit-row>.jsgrid-cell {
border: 1px solid #e9e9e9;
}
.jsgrid-header-row>.jsgrid-header-cell {
border-top: 0;
}
.jsgrid-header-row>.jsgrid-header-cell,
.jsgrid-filter-row>.jsgrid-cell,
.jsgrid-insert-row>.jsgrid-cell {
border-bottom: 0;
}
.jsgrid-header-row>.jsgrid-header-cell:first-child,
.jsgrid-filter-row>.jsgrid-cell:first-child,
.jsgrid-insert-row>.jsgrid-cell:first-child {
border-left: none;
}
.jsgrid-header-row>.jsgrid-header-cell:last-child,
.jsgrid-filter-row>.jsgrid-cell:last-child,
.jsgrid-insert-row>.jsgrid-cell:last-child {
border-right: none;
}
.jsgrid-header-row .jsgrid-align-right,
.jsgrid-header-row .jsgrid-align-left {
text-align: center;
}
.jsgrid-grid-header {
background: #f9f9f9;
}
.jsgrid-header-scrollbar {
scrollbar-arrow-color: #f1f1f1;
scrollbar-base-color: #f1f1f1;
scrollbar-3dlight-color: #f1f1f1;
scrollbar-highlight-color: #f1f1f1;
scrollbar-track-color: #f1f1f1;
scrollbar-shadow-color: #f1f1f1;
scrollbar-dark-shadow-color: #f1f1f1;
}
.jsgrid-header-scrollbar::-webkit-scrollbar {
visibility: hidden;
}
.jsgrid-header-scrollbar::-webkit-scrollbar-track {
background: #f1f1f1;
}
.jsgrid-header-sortable:hover {
cursor: pointer;
background: #fcfcfc;
}
.jsgrid-header-row .jsgrid-header-sort {
background: #c4e2ff;
}
.jsgrid-header-sort:before {
content: " ";
display: block;
float: left;
width: 0;
height: 0;
border-style: solid;
}
.jsgrid-header-sort-asc:before {
border-width: 0 5px 5px 5px;
border-color: transparent transparent #fff transparent;
}
.jsgrid-header-sort-desc:before {
border-width: 5px 5px 0 5px;
border-color: #fff transparent transparent transparent;
}
.jsgrid-grid-body {
border-top: none;
}
.jsgrid-cell {
border: #f3f3f3 1px solid;
}
.jsgrid-grid-body .jsgrid-row:first-child .jsgrid-cell,
.jsgrid-grid-body .jsgrid-alt-row:first-child .jsgrid-cell {
border-top: none;
}
.jsgrid-grid-body .jsgrid-cell:first-child {
border-left: none;
}
.jsgrid-grid-body .jsgrid-cell:last-child {
border-right: none;
}
.jsgrid-row>.jsgrid-cell {
background: #fff;
}
.jsgrid-alt-row>.jsgrid-cell {
background: #fcfcfc;
}
.jsgrid-header-row>.jsgrid-header-cell {
background: #f9f9f9;
}
.jsgrid-filter-row>.jsgrid-cell {
background: #fcfcfc;
}
.jsgrid-insert-row>.jsgrid-cell {
background: #e3ffe5;
}
.jsgrid-edit-row>.jsgrid-cell {
background: #fdffe3;
}
.jsgrid-selected-row>.jsgrid-cell {
background: #c4e2ff;
border-color: #c4e2ff;
}
.jsgrid-nodata-row>.jsgrid-cell {
background: #fff;
}
.jsgrid-invalid input,
.jsgrid-invalid select,
.jsgrid-invalid textarea {
background: #ffe3e5;
border: 1px solid #ff808a;
}
.jsgrid-pager-current-page {
font-weight: bold;
}
.jsgrid-pager-nav-inactive-button a {
color: #d3d3d3;
}
.jsgrid-button+.jsgrid-button {
margin-left: 5px;
}
.jsgrid-button:hover {
opacity: .5;
transition: opacity 200ms linear;
}
.jsgrid .jsgrid-button {
width: 16px;
height: 16px;
border: none;
cursor: pointer;
background-image: url(data:image/png;base64,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 truncated
background-repeat: no-repeat;
background-color: transparent;
}
@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min-device-pixel-ratio: 2) {
.jsgrid .jsgrid-button {
background-image: url(data:image/png;base64,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 truncated
background-size: 24px 352px;
}
}
.jsgrid .jsgrid-mode-button {
width: 24px;
height: 24px;
}
.jsgrid-mode-on-button {
opacity: .5;
}
.jsgrid-cancel-edit-button {
background-position: 0 0;
width: 16px;
height: 16px;
}
.jsgrid-clear-filter-button {
background-position: 0 -40px;
width: 16px;
height: 16px;
}
.jsgrid-delete-button {
background-position: 0 -80px;
width: 16px;
height: 16px;
}
.jsgrid-edit-button {
background-position: 0 -120px;
width: 16px;
height: 16px;
}
.jsgrid-insert-mode-button {
background-position: 0 -160px;
width: 24px;
height: 24px;
}
.jsgrid-insert-button {
background-position: 0 -208px;
width: 16px;
height: 16px;
}
.jsgrid-search-mode-button {
background-position: 0 -248px;
width: 24px;
height: 24px;
}
.jsgrid-search-button {
background-position: 0 -296px;
width: 16px;
height: 16px;
}
.jsgrid-update-button {
background-position: 0 -336px;
width: 16px;
height: 16px;
}
.jsgrid-load-shader {
background: #ddd;
opacity: .5;
filter: alpha(opacity=50);
}
.jsgrid-load-panel {
width: 15em;
height: 5em;
background: #fff;
border: 1px solid #e9e9e9;
padding-top: 3em;
text-align: center;
}
.jsgrid-load-panel:before {
content: ' ';
position: absolute;
top: .5em;
left: 50%;
margin-left: -1em;
width: 2em;
height: 2em;
border: 2px solid #009a67;
border-right-color: transparent;
border-radius: 50%;
-webkit-animation: indicator 1s linear infinite;
animation: indicator 1s linear infinite;
}
@-webkit-keyframes indicator {
from {
-webkit-transform: rotate(0deg);
}
50% {
-webkit-transform: rotate(180deg);
}
to {
-webkit-transform: rotate(360deg);
}
}
@keyframes indicator {
from {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
to {
transform: rotate(360deg);
}
}
/* old IE */
.jsgrid-load-panel {
padding-top: 1.5em\9;
}
.jsgrid-load-panel:before {
display: none\9;
}
@@ -0,0 +1,7 @@
/*
* jsGrid v1.5.3 (http://js-grid.com)
* (c) 2016 Artem Tabalin
* Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE)
*/
.jsgrid-edit-row>.jsgrid-cell,.jsgrid-filter-row>.jsgrid-cell,.jsgrid-grid-body,.jsgrid-grid-header,.jsgrid-header-row>.jsgrid-header-cell,.jsgrid-insert-row>.jsgrid-cell{border:1px solid #e9e9e9}.jsgrid-header-row>.jsgrid-header-cell{border-top:0}.jsgrid-filter-row>.jsgrid-cell,.jsgrid-header-row>.jsgrid-header-cell,.jsgrid-insert-row>.jsgrid-cell{border-bottom:0}.jsgrid-filter-row>.jsgrid-cell:first-child,.jsgrid-header-row>.jsgrid-header-cell:first-child,.jsgrid-insert-row>.jsgrid-cell:first-child{border-left:none}.jsgrid-filter-row>.jsgrid-cell:last-child,.jsgrid-header-row>.jsgrid-header-cell:last-child,.jsgrid-insert-row>.jsgrid-cell:last-child{border-right:none}.jsgrid-header-row .jsgrid-align-left,.jsgrid-header-row .jsgrid-align-right{text-align:center}.jsgrid-grid-header{background:#f9f9f9}.jsgrid-header-scrollbar{scrollbar-arrow-color:#f1f1f1;scrollbar-base-color:#f1f1f1;scrollbar-3dlight-color:#f1f1f1;scrollbar-highlight-color:#f1f1f1;scrollbar-track-color:#f1f1f1;scrollbar-shadow-color:#f1f1f1;scrollbar-dark-shadow-color:#f1f1f1}.jsgrid-header-scrollbar::-webkit-scrollbar{visibility:hidden}.jsgrid-header-scrollbar::-webkit-scrollbar-track{background:#f1f1f1}.jsgrid-header-sortable:hover{cursor:pointer;background:#fcfcfc}.jsgrid-header-row .jsgrid-header-sort{background:#c4e2ff}.jsgrid-header-sort:before{content:" ";display:block;float:left;width:0;height:0;border-style:solid}.jsgrid-header-sort-asc:before{border-width:0 5px 5px;border-color:transparent transparent #009a67}.jsgrid-header-sort-desc:before{border-width:5px 5px 0;border-color:#009a67 transparent transparent}.jsgrid-grid-body{border-top:none}.jsgrid-cell{border:1px solid #f3f3f3}.jsgrid-grid-body .jsgrid-alt-row:first-child .jsgrid-cell,.jsgrid-grid-body .jsgrid-row:first-child .jsgrid-cell{border-top:none}.jsgrid-grid-body .jsgrid-cell:first-child{border-left:none}.jsgrid-grid-body .jsgrid-cell:last-child{border-right:none}.jsgrid-row>.jsgrid-cell{background:#fff}.jsgrid-alt-row>.jsgrid-cell{background:#fcfcfc}.jsgrid-header-row>.jsgrid-header-cell{background:#f9f9f9}.jsgrid-filter-row>.jsgrid-cell{background:#fcfcfc}.jsgrid-insert-row>.jsgrid-cell{background:#e3ffe5}.jsgrid-edit-row>.jsgrid-cell{background:#fdffe3}.jsgrid-selected-row>.jsgrid-cell{background:#c4e2ff;border-color:#c4e2ff}.jsgrid-nodata-row>.jsgrid-cell{background:#fff}.jsgrid-invalid input,.jsgrid-invalid select,.jsgrid-invalid textarea{background:#ffe3e5;border:1px solid #ff808a}.jsgrid-pager-current-page{font-weight:700}.jsgrid-pager-nav-inactive-button a{color:#d3d3d3}.jsgrid-button+.jsgrid-button{margin-left:5px}.jsgrid-button:hover{opacity:.5;transition:opacity 200ms linear}.jsgrid .jsgrid-button{width:16px;height:16px;border:none;cursor:pointer;background-image:url(data:image/png;base64,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 truncated
@@ -0,0 +1,126 @@
/*
* jsGrid v1.5.3 (http://js-grid.com)
* (c) 2016 Artem Tabalin
* Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE)
*/
.jsgrid {
position: relative;
overflow: hidden;
font-size: 1em;
}
.jsgrid, .jsgrid *, .jsgrid *:before, .jsgrid *:after {
box-sizing: border-box;
}
.jsgrid input,
.jsgrid textarea,
.jsgrid select {
font-size: 1em;
}
.jsgrid-grid-header {
overflow-x: hidden;
overflow-y: scroll;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.jsgrid-grid-body {
overflow-x: auto;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
.jsgrid-table {
width: 100%;
table-layout: fixed;
border-collapse: collapse;
border-spacing: 0;
}
.jsgrid-cell {
padding: 0.5em 0.5em;
}
.jsgrid-сell,
.jsgrid-header-cell {
box-sizing: border-box;
}
.jsgrid-align-left {
text-align: left;
}
.jsgrid-align-center,
.jsgrid-align-center input,
.jsgrid-align-center textarea,
.jsgrid-align-center select {
text-align: center;
}
.jsgrid-align-right,
.jsgrid-align-right input,
.jsgrid-align-right textarea,
.jsgrid-align-right select {
text-align: right;
}
.jsgrid-header-cell {
padding: .5em .5em;
}
.jsgrid-filter-row input,
.jsgrid-filter-row textarea,
.jsgrid-filter-row select,
.jsgrid-edit-row input,
.jsgrid-edit-row textarea,
.jsgrid-edit-row select,
.jsgrid-insert-row input,
.jsgrid-insert-row textarea,
.jsgrid-insert-row select {
width: 100%;
padding: .3em .5em;
}
.jsgrid-filter-row input[type='checkbox'],
.jsgrid-edit-row input[type='checkbox'],
.jsgrid-insert-row input[type='checkbox'] {
width: auto;
}
.jsgrid-selected-row .jsgrid-cell {
cursor: pointer;
}
.jsgrid-nodata-row .jsgrid-cell {
padding: .5em 0;
text-align: center;
}
.jsgrid-header-sort {
cursor: pointer;
}
.jsgrid-pager {
padding: .5em 0;
}
.jsgrid-pager-nav-button {
padding: .2em .6em;
}
.jsgrid-pager-nav-inactive-button {
display: none;
pointer-events: none;
}
.jsgrid-pager-page {
padding: .2em .6em;
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,7 @@
/*
* jsGrid v1.5.3 (http://js-grid.com)
* (c) 2016 Artem Tabalin
* Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE)
*/
.jsgrid{position:relative;overflow:hidden;font-size:1em}.jsgrid,.jsgrid *,.jsgrid :after,.jsgrid :before{box-sizing:border-box}.jsgrid input,.jsgrid select,.jsgrid textarea{font-size:1em}.jsgrid-grid-header{overflow-x:hidden;overflow-y:scroll;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.jsgrid-grid-body{overflow-x:auto;overflow-y:scroll;-webkit-overflow-scrolling:touch}.jsgrid-table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0}.jsgrid-cell{padding:.5em}.jsgrid-header-cell,.jsgrid-сell{box-sizing:border-box}.jsgrid-align-left{text-align:left}.jsgrid-align-center,.jsgrid-align-center input,.jsgrid-align-center select,.jsgrid-align-center textarea{text-align:center}.jsgrid-align-right,.jsgrid-align-right input,.jsgrid-align-right select,.jsgrid-align-right textarea{text-align:right}.jsgrid-header-cell{padding:.5em}.jsgrid-edit-row input,.jsgrid-edit-row select,.jsgrid-edit-row textarea,.jsgrid-filter-row input,.jsgrid-filter-row select,.jsgrid-filter-row textarea,.jsgrid-insert-row input,.jsgrid-insert-row select,.jsgrid-insert-row textarea{width:100%;padding:.3em .5em}.jsgrid-edit-row input[type=checkbox],.jsgrid-filter-row input[type=checkbox],.jsgrid-insert-row input[type=checkbox]{width:auto}.jsgrid-selected-row .jsgrid-cell{cursor:pointer}.jsgrid-nodata-row .jsgrid-cell{padding:.5em 0;text-align:center}.jsgrid-header-sort{cursor:pointer}.jsgrid-pager{padding:.5em 0}.jsgrid-pager-nav-button{padding:.2em .6em}.jsgrid-pager-nav-inactive-button{display:none;pointer-events:none}.jsgrid-pager-page{padding:.2em .6em}
@@ -0,0 +1,8 @@
/*
* jsGrid v1.5.3 (http://js-grid.com)
* (c) 2016 Artem Tabalin
* Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE)
*/
!function(a,b,c){function d(a,c){var d=b(a);d.data(f,this),this._container=d,this.data=[],this.fields=[],this._editingRow=null,this._sortField=null,this._sortOrder=i,this._firstDisplayingPage=1,this._init(c),this.render()}var e="JSGrid",f=e,g="JSGridItem",h="JSGridEditRow",i="asc",j="desc",k="{first}",l="{pages}",m="{prev}",n="{next}",o="{last}",p="{pageIndex}",q="{pageCount}",r="{itemCount}",s="javascript:void(0);",t=function(a,c){return b.isFunction(a)?a.apply(c,b.makeArray(arguments).slice(2)):a},u=function(a){var c=b.Deferred();return a&&a.then?a.then(function(){c.resolve.apply(c,arguments)},function(){c.reject.apply(c,arguments)}):c.resolve(a),c.promise()},v={loadData:b.noop,insertItem:b.noop,updateItem:b.noop,deleteItem:b.noop};d.prototype={width:"auto",height:"auto",updateOnResize:!0,rowClass:b.noop,rowRenderer:null,rowClick:function(a){this.editing&&this.editItem(b(a.event.target).closest("tr"))},rowDoubleClick:b.noop,noDataContent:"Not found",noDataRowClass:"jsgrid-nodata-row",heading:!0,headerRowRenderer:null,headerRowClass:"jsgrid-header-row",headerCellClass:"jsgrid-header-cell",filtering:!1,filterRowRenderer:null,filterRowClass:"jsgrid-filter-row",inserting:!1,insertRowRenderer:null,insertRowClass:"jsgrid-insert-row",editing:!1,editRowRenderer:null,editRowClass:"jsgrid-edit-row",confirmDeleting:!0,deleteConfirm:"Are you sure?",selecting:!0,selectedRowClass:"jsgrid-selected-row",oddRowClass:"jsgrid-row",evenRowClass:"jsgrid-alt-row",cellClass:"jsgrid-cell",sorting:!1,sortableClass:"jsgrid-header-sortable",sortAscClass:"jsgrid-header-sort jsgrid-header-sort-asc",sortDescClass:"jsgrid-header-sort jsgrid-header-sort-desc",paging:!1,pagerContainer:null,pageIndex:1,pageSize:20,pageButtonCount:15,pagerFormat:"Pages: {first} {prev} {pages} {next} {last} &nbsp;&nbsp; {pageIndex} of {pageCount}",pagePrevText:"Prev",pageNextText:"Next",pageFirstText:"First",pageLastText:"Last",pageNavigatorNextText:"...",pageNavigatorPrevText:"...",pagerContainerClass:"jsgrid-pager-container",pagerClass:"jsgrid-pager",pagerNavButtonClass:"jsgrid-pager-nav-button",pagerNavButtonInactiveClass:"jsgrid-pager-nav-inactive-button",pageClass:"jsgrid-pager-page",currentPageClass:"jsgrid-pager-current-page",customLoading:!1,pageLoading:!1,autoload:!1,controller:v,loadIndication:!0,loadIndicationDelay:500,loadMessage:"Please, wait...",loadShading:!0,invalidMessage:"Invalid data entered!",invalidNotify:function(c){var d=b.map(c.errors,function(a){return a.message||null});a.alert([this.invalidMessage].concat(d).join("\n"))},onInit:b.noop,onRefreshing:b.noop,onRefreshed:b.noop,onPageChanged:b.noop,onItemDeleting:b.noop,onItemDeleted:b.noop,onItemInserting:b.noop,onItemInserted:b.noop,onItemEditing:b.noop,onItemUpdating:b.noop,onItemUpdated:b.noop,onItemInvalid:b.noop,onDataLoading:b.noop,onDataLoaded:b.noop,onOptionChanging:b.noop,onOptionChanged:b.noop,onError:b.noop,invalidClass:"jsgrid-invalid",containerClass:"jsgrid",tableClass:"jsgrid-table",gridHeaderClass:"jsgrid-grid-header",gridBodyClass:"jsgrid-grid-body",_init:function(a){b.extend(this,a),this._initLoadStrategy(),this._initController(),this._initFields(),this._attachWindowLoadResize(),this._attachWindowResizeCallback(),this._callEventHandler(this.onInit)},loadStrategy:function(){return this.pageLoading?new jsGrid.loadStrategies.PageLoadingStrategy(this):new jsGrid.loadStrategies.DirectLoadingStrategy(this)},_initLoadStrategy:function(){this._loadStrategy=t(this.loadStrategy,this)},_initController:function(){this._controller=b.extend({},v,t(this.controller,this))},renderTemplate:function(a,b,d){args=[];for(var e in d)args.push(d[e]);return args.unshift(a,b),a=t.apply(null,args),a===c||null===a?"":a},loadIndicator:function(a){return new jsGrid.LoadIndicator(a)},validation:function(a){return jsGrid.Validation&&new jsGrid.Validation(a)},_initFields:function(){var a=this;a.fields=b.map(a.fields,function(c){if(b.isPlainObject(c)){var d=c.type&&jsGrid.fields[c.type]||jsGrid.Field;c=new d(c)}return c._grid=a,c})},_attachWindowLoadResize:function(){b(a).on("load",b.proxy(this._refreshSize,this))},_attachWindowResizeCallback:function(){this.updateOnResize&&b(a).on("resize",b.proxy(this._refreshSize,this))},_detachWindowResizeCallback:function(){b(a).off("resize",this._refreshSize)},option:function(a,b){var c,d;return 1===arguments.length?this[a]:(c={option:a,oldValue:this[a],newValue:b},this._callEventHandler(this.onOptionChanging,c),this._handleOptionChange(c.option,c.newValue),d={option:c.option,value:c.newValue},void this._callEventHandler(this.onOptionChanged,d))},fieldOption:function(a,b,c){return a=this._normalizeField(a),2===arguments.length?a[b]:(a[b]=c,void this._renderGrid())},_handleOptionChange:function(a,b){switch(this[a]=b,a){case"width":case"height":this._refreshSize();break;case"rowClass":case"rowRenderer":case"rowClick":case"rowDoubleClick":case"noDataRowClass":case"noDataContent":case"selecting":case"selectedRowClass":case"oddRowClass":case"evenRowClass":this._refreLine truncated
a.prop("readOnly")?a.prop({checked:!1,readOnly:!1}):a.prop("checked")||a.prop({readOnly:!0,indeterminate:!0})}),this.autosearch&&c.on("click",function(){a.search()}),c},insertTemplate:function(){return this.inserting?this.insertControl=this._createCheckbox():""},editTemplate:function(a){if(!this.editing)return this.itemTemplate.apply(this,arguments);var b=this.editControl=this._createCheckbox();return b.prop("checked",a),b},filterValue:function(){return this.filterControl.get(0).indeterminate?c:this.filterControl.is(":checked")},insertValue:function(){return this.insertControl.is(":checked")},editValue:function(){return this.editControl.is(":checked")},_createCheckbox:function(){return b("<input>").attr("type","checkbox")}}),a.fields.checkbox=a.CheckboxField=d}(jsGrid,jQuery),function(a,b){function c(a){d.call(this,a),this._configInitialized=!1}var d=a.Field;c.prototype=new d({css:"jsgrid-control-field",align:"center",width:50,filtering:!1,inserting:!1,editing:!1,sorting:!1,buttonClass:"jsgrid-button",modeButtonClass:"jsgrid-mode-button",modeOnButtonClass:"jsgrid-mode-on-button",searchModeButtonClass:"jsgrid-search-mode-button",insertModeButtonClass:"jsgrid-insert-mode-button",editButtonClass:"jsgrid-edit-button",deleteButtonClass:"jsgrid-delete-button",searchButtonClass:"jsgrid-search-button",clearFilterButtonClass:"jsgrid-clear-filter-button",insertButtonClass:"jsgrid-insert-button",updateButtonClass:"jsgrid-update-button",cancelEditButtonClass:"jsgrid-cancel-edit-button",searchModeButtonTooltip:"Switch to searching",insertModeButtonTooltip:"Switch to inserting",editButtonTooltip:"Edit",deleteButtonTooltip:"Delete",searchButtonTooltip:"Search",clearFilterButtonTooltip:"Clear filter",insertButtonTooltip:"Insert",updateButtonTooltip:"Update",cancelEditButtonTooltip:"Cancel edit",editButton:!0,deleteButton:!0,clearFilterButton:!0,modeSwitchButton:!0,_initConfig:function(){this._hasFiltering=this._grid.filtering,this._hasInserting=this._grid.inserting,this._hasInserting&&this.modeSwitchButton&&(this._grid.inserting=!1),this._configInitialized=!0},headerTemplate:function(){this._configInitialized||this._initConfig();var a=this._hasFiltering,b=this._hasInserting;return this.modeSwitchButton&&(a||b)?a&&!b?this._createFilterSwitchButton():b&&!a?this._createInsertSwitchButton():this._createModeSwitchButton():""},itemTemplate:function(a,c){var d=b([]);return this.editButton&&(d=d.add(this._createEditButton(c))),this.deleteButton&&(d=d.add(this._createDeleteButton(c))),d},filterTemplate:function(){var a=this._createSearchButton();return this.clearFilterButton?a.add(this._createClearFilterButton()):a},insertTemplate:function(){return this._createInsertButton()},editTemplate:function(){return this._createUpdateButton().add(this._createCancelEditButton())},_createFilterSwitchButton:function(){return this._createOnOffSwitchButton("filtering",this.searchModeButtonClass,!0)},_createInsertSwitchButton:function(){return this._createOnOffSwitchButton("inserting",this.insertModeButtonClass,!1)},_createOnOffSwitchButton:function(a,c,d){var e=d,f=b.proxy(function(){g.toggleClass(this.modeOnButtonClass,e)},this),g=this._createGridButton(this.modeButtonClass+" "+c,"",function(b){e=!e,b.option(a,e),f()});return f(),g},_createModeSwitchButton:function(){var a=!1,c=b.proxy(function(){d.attr("title",a?this.searchModeButtonTooltip:this.insertModeButtonTooltip).toggleClass(this.insertModeButtonClass,!a).toggleClass(this.searchModeButtonClass,a)},this),d=this._createGridButton(this.modeButtonClass,"",function(b){a=!a,b.option("inserting",a),b.option("filtering",!a),c()});return c(),d},_createEditButton:function(a){return this._createGridButton(this.editButtonClass,this.editButtonTooltip,function(b,c){b.editItem(a),c.stopPropagation()})},_createDeleteButton:function(a){return this._createGridButton(this.deleteButtonClass,this.deleteButtonTooltip,function(b,c){b.deleteItem(a),c.stopPropagation()})},_createSearchButton:function(){return this._createGridButton(this.searchButtonClass,this.searchButtonTooltip,function(a){a.search()})},_createClearFilterButton:function(){return this._createGridButton(this.clearFilterButtonClass,this.clearFilterButtonTooltip,function(a){a.clearFilter()})},_createInsertButton:function(){return this._createGridButton(this.insertButtonClass,this.insertButtonTooltip,function(a){a.insertItem().done(function(){a.clearInsert()})})},_createUpdateButton:function(){return this._createGridButton(this.updateButtonClass,this.updateButtonTooltip,function(a,b){a.updateItem(),b.stopPropagation()})},_createCancelEditButton:function(){return this._createGridButton(this.cancelEditButtonClass,this.cancelEditButtonTooltip,function(a,b){a.cancelEdit(),b.stopPropagation()})},_createGridButton:function(a,c,d){var e=this._grid;return b("<input>").addClass(this.buttonClass).addClass(a).attr({type:"button",title:c}).on("click",function(a){d(e,a)})},editValue:function(){return""}}),a.fields.control=a.ControlField=c}(jsGrid,jQuery);
@@ -0,0 +1,67 @@
document.barChart
function ladeStatistikRangliste () {
$.ajax({
url: '../index.php',
type: 'GET',
data: {
application: 'loadstatistiktangliste',
tournament: $('#tournament_rangliste').val()
},
dataType: 'json'
}).done(function (response) {
barChart.data = response
barChart.update()
})
}
$(document).ready(function () {
const ctx = document.getElementById('dotterStatistikRangliste')
barChart = new Chart(ctx, {
type: 'bar',
data: [],
options: {
animation: {
y: {
duration: 2000,
from: 500
}
},
indexAxis: 'y',
maintainAspectRatio: true,
scaleShowValues: true,
responsive: true,
elements: {
bar: {
borderWidth: 2
}
},
plugins: {
legend: {
display: true,
position: 'right',
color: '#cecece'
}
},
scales: {
x: {
title: {
display: true,
text: 'Punkte',
color: '#cecece'
}
},
y: {
title: {
display: true,
text: 'Athlet:innen',
color: '#cecece'
},
ticks: {
autoSkip: false
}
}
}
}
})
ladeStatistikRangliste()
})
@@ -0,0 +1,45 @@
document.myChart;
function ladeStatistik() {
$.ajax({
url: "../index.php",
type: "GET",
data: {
application: "loadstatistik",
event_id: $("#spieltagselect").val()
},
dataType: "json"
}).done(function(response) {
myChart.data = response;
myChart.update();
});
}
$(document).ready(function() {
const ctx = document.getElementById("dotterStatistikErgebnisse");
myChart = new Chart(ctx, {
type: "line",
data: [],
options: {
animations: {
tension: {
duration: 2000,
easing: "linear",
from: 0.5,
to: 0,
loop: true
}
},
responsive: true,
plugins: {
legend: {
position: "top"
},
title: {
display: false,
text: "FC Dotterbühel"
}
}
}
});
ladeStatistik();
});
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+58
View File
@@ -0,0 +1,58 @@
{
"name": "Public",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"dependencies": {
"@fortawesome/fontawesome-free": "^6.2.0",
"chart.js": "^4.1.1"
}
},
"node_modules/@fortawesome/fontawesome-free": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.0.tgz",
"integrity": "sha512-CNR7qRIfCwWHNN7FnKUniva94edPdyQzil/zCwk3v6k4R6rR2Fr8i4s3PM7n/lyfPA6Zfko9z5WDzFxG9SW1uQ==",
"hasInstallScript": true,
"engines": {
"node": ">=6"
}
},
"node_modules/@kurkle/color": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.1.tgz",
"integrity": "sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw=="
},
"node_modules/chart.js": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.1.1.tgz",
"integrity": "sha512-P0pCosNXp+LR8zO/QTkZKT6Hb7p0DPFtypEeVOf+6x06hX13NIb75R0DXUA4Ksx/+48chDQKtCCmRCviQRTqsA==",
"dependencies": {
"@kurkle/color": "^0.3.0"
},
"engines": {
"pnpm": "^7.0.0"
}
}
},
"dependencies": {
"@fortawesome/fontawesome-free": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.0.tgz",
"integrity": "sha512-CNR7qRIfCwWHNN7FnKUniva94edPdyQzil/zCwk3v6k4R6rR2Fr8i4s3PM7n/lyfPA6Zfko9z5WDzFxG9SW1uQ=="
},
"@kurkle/color": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.1.tgz",
"integrity": "sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw=="
},
"chart.js": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.1.1.tgz",
"integrity": "sha512-P0pCosNXp+LR8zO/QTkZKT6Hb7p0DPFtypEeVOf+6x06hX13NIb75R0DXUA4Ksx/+48chDQKtCCmRCviQRTqsA==",
"requires": {
"@kurkle/color": "^0.3.0"
}
}
}
}
@@ -0,0 +1,6 @@
{
"dependencies": {
"@fortawesome/fontawesome-free": "^6.2.0",
"chart.js": "^4.1.1"
}
}
+26
View File
@@ -0,0 +1,26 @@
{
"name": "hermanntelser/watten",
"type": "typo3-cms-extension",
"description": "Verwaltet die Ergebnisse der Dotterb\u00fchel Wattergemeinschaft",
"authors": [{
"name": "Hermann Telser",
"role": "Developer"
}],
"license": "GPL-2.0-or-later",
"require": {
"typo3/cms-core": "^11.5"
},
"autoload": {
"psr-4": {
"HermannTelser\\Watten\\": "Classes"
}
},
"replace": {
"typo3-ter/watten": "self.version"
},
"config": {
"allow-plugins": {
"typo3/class-alias-loader": false
}
}
}
+7471
View File
File diff suppressed because it is too large. Load diff
+19
View File
@@ -0,0 +1,19 @@
<?php
$EM_CONF[(string) $_EXTKEY] = [
'title' => 'Watten',
'description' => 'Verwaltet die Ergebnisse der Dotterbühel Wattergemeinschaft',
'category' => 'plugin',
'author' => 'Hermann Telser',
'author_email' => 'hermann.telser@gmail.com',
'state' => 'alpha',
'clearCacheOnLoad' => 0,
'version' => '1.0.0',
'constraints' => [
'depends' => [
'typo3' => '11.5.0-11.5.99',
],
'conflicts' => [],
'suggests' => [],
],
];
+92
View File
@@ -0,0 +1,92 @@
<?php
defined('TYPO3') || die();
$GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['watten_cache'] ??= [];
# controll eingabe ergebnisse
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['watten'] =
\HermannTelser\Watten\Hooks\DataHandler::class;
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['watten'] =
\HermannTelser\Watten\Hooks\DataHandler::class;
/* ===========================================================================
cron
=========================================================================== */
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\HermannTelser\Watten\Scheduler\CronTask::class] = array(
'extension' => 'watten',
'title' => 'Watten Ergebnisse berechnen',
'description' => 'Mit diesem Aufruf werden die Ergebnisse für Statistiken und Auflistungen vorberechnet.'
);
/* ===========================================================================
jquery grid
=========================================================================== */
$assetCollector = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Page\AssetCollector::class);
$scriptPath = 'EXT:watten/Resources/Public/Javascript/jsgrid/jsgrid.min.js';
$assetCollector->addJavaScript('jsgrid', $scriptPath);
/* ===========================================================================
jquery grid css
=========================================================================== */
$cssPath = 'EXT:watten/Resources/Public/Css/jsgrid-dark.css';
$assetCollector->addStyleSheet('jsgrid-dark', $cssPath);
$cssPath = 'EXT:watten/Resources/Public/node_modules/@fortawesome/fontawesome-free/css/all.min.css';
$assetCollector->addStyleSheet('fontawesome', $cssPath);
/* ===========================================================================
plugins
=========================================================================== */
(static function () {
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Watten',
'Ergebnisse',
[
\HermannTelser\Watten\Controller\WattenController::class => 'ergebnisse',
],
[
\HermannTelser\Watten\Controller\WattenController::class => '',
]
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Watten',
'Rangliste',
[
\HermannTelser\Watten\Controller\WattenController::class => 'rangliste',
],
[
\HermannTelser\Watten\Controller\WattenController::class => '',
]
);
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'Watten',
'Statistik',
[
\HermannTelser\Watten\Controller\WattenController::class => 'statistik',
],
[
\HermannTelser\Watten\Controller\WattenController::class => '',
]
);
// wizards
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig(
'mod {
wizards.newContentElement.wizardItems.plugins {
elements {
tx_watten_domain_model_ergebnisse {
iconIdentifier = watten-plugin-ergebnisse
title = Watten Spieleverwaltung
description = Watter Spieleverwaltung
tt_content_defValues {
CType = watten_ergebnisse
list_type = watten_ergebnisse
}
}
}
show = *
}
}'
);
})();
+4
View File
@@ -0,0 +1,4 @@
<?php
defined('TYPO3') || die();
(static function() {})();
+85
View File
@@ -0,0 +1,85 @@
CREATE TABLE tx_watten_domain_model_athleten (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) DEFAULT '0' NOT NULL,
crdate int(11) DEFAULT '0' NOT NULL,
gender int(4) DEFAULT '0' NOT NULL,
isactive int(4) DEFAULT '0' NOT NULL,
name varchar(50) NOT NULL DEFAULT '',
image varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (uid)
);
CREATE TABLE tx_watten_domain_model_ergebnisse (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) DEFAULT '0' NOT NULL,
crdate int(11) DEFAULT '0' NOT NULL,
hidden tinyint(4) DEFAULT '0' NOT NULL,
event_id int(11) DEFAULT '0' NOT NULL,
datum int(11) DEFAULT '0' NOT NULL,
s1 int(11) DEFAULT '0' NOT NULL,
s2 int(11) DEFAULT '0' NOT NULL,
v1 int(11) DEFAULT '0' NOT NULL,
v2 int(11) DEFAULT '0' NOT NULL,
bumid int(11) DEFAULT '0' NOT NULL,
gstrichen int(11) DEFAULT '0' NOT NULL,
tournaments_id int(11) DEFAULT '0' NOT NULL,
PRIMARY KEY (uid)
);
CREATE TABLE tx_watten_domain_model_events (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) DEFAULT '0' NOT NULL,
crdate int(11) DEFAULT '0' NOT NULL,
tournaments_id int(11) DEFAULT '0' NOT NULL,
datum int(11) DEFAULT '0' NOT NULL,
event varchar(50) NOT NULL DEFAULT '',
story text,
isactive tinyint(4) DEFAULT '0' NOT NULL,
PRIMARY KEY (uid)
);
CREATE TABLE tx_watten_tournaments (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
tstamp int(11) DEFAULT '0' NOT NULL,
crdate int(11) DEFAULT '0' NOT NULL,
tournament varchar(50) NOT NULL DEFAULT '',
active tinyint(4) DEFAULT '0' NOT NULL,
king tinyint(4) DEFAULT '0' NOT NULL,
PRIMARY KEY (uid)
);
CREATE TABLE tx_watten_tournaments_ergebnisse (
uid int(11) NOT NULL auto_increment,
pid int(11) DEFAULT '0' NOT NULL,
crdate int(11) DEFAULT '0' NOT NULL,
tstamp int(11) DEFAULT '0' NOT NULL,
tournament_id int(11) DEFAULT '0' NOT NULL,
type varchar(20) DEFAULT '0' NOT NULL,
tournament varchar(30) DEFAULT '0' NOT NULL,
koenig_id int(11) DEFAULT '0' NOT NULL,
koenig varchar(120) DEFAULT '0' NOT NULL,
schneewatter_id int(11) DEFAULT '0' NOT NULL,
schneewatter varchar(120) DEFAULT '0' NOT NULL,
koenig_spiele int(11) DEFAULT '0' NOT NULL,
koenig_punkte double(5, 1) DEFAULT '0' NOT NULL,
koenig_siege int(11) DEFAULT '0' NOT NULL,
koenig_niederlagen int(11) DEFAULT '0' NOT NULL,
koenig_schneider int(11) DEFAULT '0' NOT NULL,
koenig_schneider_niederlage int(11) DEFAULT '0' NOT NULL,
koenig_retour_schneider int(11) DEFAULT '0' NOT NULL,
koenig_retour_schneider_niederlage int(11) DEFAULT '0' NOT NULL,
schneewatter_spiele int(11) DEFAULT '0' NOT NULL,
schneewatter_punkte double(5, 1) DEFAULT '0' NOT NULL,
schneewatter_siege int(11) DEFAULT '0' NOT NULL,
schneewatter_niederlagen int(11) DEFAULT '0' NOT NULL,
schneewatter_schneider int(11) DEFAULT '0' NOT NULL,
schneewatter_schneider_niederlage int(11) DEFAULT '0' NOT NULL,
schneewatter_retour_schneider int(11) DEFAULT '0' NOT NULL,
schneewatter_retour_schneider_niederlage int(11) DEFAULT '0' NOT NULL,
result_json text DEFAULT NULL,
PRIMARY KEY (uid)
);
+3 -15
View File
@@ -96,22 +96,10 @@
text/x-cross-domain-policy \
text/xml
</IfModule>
<IfModule mod_mime.c>
# Verhindert, dass Dateien mit der Endung .wrong als HTML ausgeliefert werden
RemoveType .html .htm
<FilesMatch ".+\\.html?$">
AddType text/html .html
AddType text/html .htm
</FilesMatch>
# Falls der Fehler gleich auch für SVG-Testdateien auftaucht:
RemoveType .svg .svgz
<FilesMatch ".+\\.svgz?$">
AddType image/svg+xml .svg
AddType image/svg+xml .svgz
</FilesMatch>
</IfModule>
<IfModule mod_mime.c>
AddEncoding gzip svgz
</IfModule>
</IfModule>
### End: Compression ###
+3
View File
@@ -0,0 +1,3 @@
<?php
phpinfo();
Loaded 100 of 102 files, more files were not shown because too many files have changed in this diff. Show more