commit e81864e6835d41c7392acf3812ae13ac2fd16d80 Author: salam Date: Tue Oct 6 19:40:28 2026 +0200 first commit diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..2945016 --- /dev/null +++ b/composer.json @@ -0,0 +1,63 @@ +{ + "repositories": { + "local": { + "type": "path", + "url": "packages/*" + }, + "0": { + "type": "composer", + "url": "https://composer.typo3.org/" + } + }, + "name": "typo3/cms-base-distribution", + "description": "TYPO3 CMS Base Distribution", + "license": "GPL-2.0-or-later", + "config": { + "allow-plugins": { + "typo3/class-alias-loader": true, + "typo3/cms-composer-installers": true + } + }, + "require": { + "typo3/cms-adminpanel": "^11.5", + "typo3/cms-belog": "^11.5", + "typo3/cms-beuser": "^11.5", + "typo3/cms-felogin": "^11.5", + "typo3/cms-fluid-styled-content": "^11.5", + "typo3/cms-form": "^11.5", + "typo3/cms-impexp": "^11.5", + "typo3/cms-info": "^11.5", + "typo3/cms-redirects": "^11.5", + "typo3/cms-reports": "^11.5", + "typo3/cms-rte-ckeditor": "^11.5", + "typo3/cms-setup": "^11.5", + "typo3/cms-sys-note": "^11.5", + "typo3/cms-t3editor": "^11.5", + "typo3/cms-tstemplate": "^11.5", + "typo3/cms-viewpage": "^11.5", + "mpdf/mpdf": "^8.0", + "bk2k/bootstrap-package": "^12.0", + "catfan/medoo": "v2.1.12", + "typo3/cms-backend": "^11.5", + "typo3/cms-core": "^11.5", + "typo3/cms-extbase": "^11.5", + "typo3/cms-extensionmanager": "^11.5", + "typo3/cms-filelist": "^11.5", + "typo3/cms-fluid": "^11.5", + "typo3/cms-frontend": "^11.5", + "typo3/cms-install": "^11.5", + "typo3/cms-recordlist": "^11.5", + "typo3/cms-scheduler": "^11.5", + "neitanod/forceutf8": "^2.0", + "typo3/cms-about": "^11.5", + "typo3/cms-dashboard": "^11.5", + "typo3/cms-lowlevel": "^11.5", + "typo3/cms-opendocs": "^11.5", + "typo3/cms-recycler": "^11.5", + "typo3/cms-seo": "^11.5", + "typo3/minimal": "^11.5", + "hermanntelser/zuladungsliste": "dev-main", + "sjbr/sr-freecap": "^11.5", + "in2code/femanager": "^7.0" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..d8d26aa --- /dev/null +++ b/composer.lock @@ -0,0 +1,8218 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "6519e2ae9da7543afd4aae224d757b50", + "packages": [ + { + "name": "bacon/bacon-qr-code", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.1", + "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + }, + "time": "2022-12-07T17:46:57+00:00" + }, + { + "name": "bk2k/bootstrap-package", + "version": "12.0.10", + "source": { + "type": "git", + "url": "https://github.com/benjaminkott/bootstrap_package.git", + "reference": "e7c038ce35e589b5918b0e43c90d8ebabc49c5bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/benjaminkott/bootstrap_package/zipball/e7c038ce35e589b5918b0e43c90d8ebabc49c5bc", + "reference": "e7c038ce35e589b5918b0e43c90d8ebabc49c5bc", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-pdo": "*", + "ext-simplexml": "*", + "php": ">=7.2.0", + "scssphp/scssphp": "^1.8.1", + "typo3/cms-backend": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-core": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-extbase": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-extensionmanager": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-fluid": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-frontend": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-install": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-rte-ckeditor": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-seo": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3fluid/fluid": "^2.5.2" + }, + "require-dev": { + "b13/container": "^1.3", + "bk2k/demo-package": "@dev", + "bk2k/extension-helper": "^1.0", + "friendsofphp/php-cs-fixer": "^3.0.0", + "friendsoftypo3/phpstan-typo3": "^0.8.1", + "overtrue/phplint": "^2.3.5", + "phpstan/phpstan": "^0.12.87", + "phpstan/phpstan-deprecation-rules": "^0.12.6", + "phpstan/phpstan-phpunit": "^0.12.19", + "phpstan/phpstan-strict-rules": "^0.12.9", + "typo3/cms-belog": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-felogin": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-filelist": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-form": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-indexed-search": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-info": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-lowlevel": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-tstemplate": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/cms-workspaces": "^10.4 || ^11.5 || 11.*.*@dev", + "typo3/testing-framework": "^5.0 || ^6.4" + }, + "type": "typo3-cms-extension", + "extra": { + "typo3/cms": { + "app-dir": ".build", + "web-dir": ".build/public", + "extension-key": "bootstrap_package" + }, + "branch-alias": { + "dev-BP_12-0": "12.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "BK2K\\BootstrapPackage\\": "Classes" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benjamin Kott", + "email": "info@bk2k.info", + "homepage": "http://www.bk2k.info/", + "role": "Developer" + } + ], + "description": "Bootstrap Package delivers a full configured frontend theme for TYPO3, based on the Bootstrap CSS Framework.", + "homepage": "https://github.com/benjaminkott/bootstrap_package", + "keywords": [ + "TYPO3 CMS", + "bootstrap", + "frontend", + "introduction", + "responsive", + "sitepackage", + "theme", + "web" + ], + "support": { + "issues": "https://github.com/benjaminkott/bootstrap_package/issues", + "source": "https://github.com/benjaminkott/bootstrap_package/tree/12.0.10" + }, + "funding": [ + { + "url": "https://www.paypal.me/benjaminkott", + "type": "custom" + } + ], + "time": "2023-06-30T13:47:27+00:00" + }, + { + "name": "catfan/medoo", + "version": "v2.1.12", + "source": { + "type": "git", + "url": "https://github.com/catfan/Medoo.git", + "reference": "d1ff4e0e873a3e032e3d8804031dd6be4e013b22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/catfan/Medoo/zipball/d1ff4e0e873a3e032e3d8804031dd6be4e013b22", + "reference": "d1ff4e0e873a3e032e3d8804031dd6be4e013b22", + "shasum": "" + }, + "require": { + "ext-pdo": "*", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "suggest": { + "ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform", + "ext-pdo_mysql": "For MySQL or MariaDB database", + "ext-pdo_oci": "For Oracle database", + "ext-pdo_pqsql": "For PostgreSQL database", + "ext-pdo_sqlite": "For SQLite database", + "ext-pdo_sqlsrv": "For MSSQL database on both Window/Liunx platform" + }, + "type": "framework", + "autoload": { + "psr-4": { + "Medoo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Angel Lai", + "email": "angel@medoo.in" + } + ], + "description": "The lightweight PHP database framework to accelerate development", + "homepage": "https://medoo.in", + "keywords": [ + "database", + "database library", + "lightweight", + "mariadb", + "mssql", + "mysql", + "oracle", + "php framework", + "postgresql", + "sql", + "sqlite" + ], + "support": { + "issues": "https://github.com/catfan/Medoo/issues", + "source": "https://github.com/catfan/Medoo" + }, + "funding": [ + { + "url": "https://paypal.me/AngelaonLai", + "type": "custom" + }, + { + "url": "https://opencollective.com/medoo", + "type": "open_collective" + } + ], + "time": "2024-02-03T11:28:59+00:00" + }, + { + "name": "christian-riesen/base32", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/ChristianRiesen/base32.git", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.5.13 || ^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Base32\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Riesen", + "email": "chris.riesen@gmail.com", + "homepage": "http://christianriesen.com", + "role": "Developer" + } + ], + "description": "Base32 encoder/decoder according to RFC 4648", + "homepage": "https://github.com/ChristianRiesen/base32", + "keywords": [ + "base32", + "decode", + "encode", + "rfc4648" + ], + "support": { + "issues": "https://github.com/ChristianRiesen/base32/issues", + "source": "https://github.com/ChristianRiesen/base32/tree/1.6.0" + }, + "time": "2021-02-26T10:19:33+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" + }, + "time": "2024-08-09T14:30:48+00:00" + }, + { + "name": "doctrine/annotations", + "version": "1.14.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915", + "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1 || ^2", + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^1.11 || ^2.0", + "doctrine/coding-standard": "^9 || ^12", + "phpstan/phpstan": "~1.4.10 || ^1.10.28", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.14.4" + }, + "time": "2024-09-05T10:15:52+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "2.13.9", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "reference": "c480849ca3ad6706a39c970cdfe6888fa8a058b8", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.1 || ^8" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.4.6", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.16", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.2", + "symfony/cache": "^4.4", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", + "vimeo/psalm": "4.22.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/2.13.9" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2022-05-02T20:28:55+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" + }, + "time": "2025-04-07T20:06:18+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/95aa4cb529f1e96576f3fda9f5705ada4056a520", + "reference": "95aa4cb529f1e96576f3fda9f5705ada4056a520", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^0.5.3 || ^1", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^10", + "phpstan/phpstan": "~1.4.10 || ^1.8.8", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.24" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.2.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:51:15+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", + "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.30 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:15:36+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2022-02-28T11:07:21+00:00" + }, + { + "name": "egulias/email-validator", + "version": "3.2.6", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.2|^2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/3.2.6" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-06-01T07:04:22+00:00" + }, + { + "name": "enshrined/svg-sanitize", + "version": "0.18.0", + "source": { + "type": "git", + "url": "https://github.com/darylldoyle/svg-sanitizer.git", + "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0", + "reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "enshrined\\svgSanitize\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Daryll Doyle", + "email": "daryll@enshrined.co.uk" + } + ], + "description": "An SVG sanitizer for PHP", + "support": { + "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0" + }, + "time": "2024-02-22T17:51:05+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "reference": "7b2f29fe81dc4da0ca0ea7d42107a0845946ea77", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-03-27T13:37:11+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c", + "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.2.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-03-27T13:27:01+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2025-03-27T12:30:47+00:00" + }, + { + "name": "hermanntelser/zuladungsliste", + "version": "dev-main", + "dist": { + "type": "path", + "url": "packages/zuladungsliste", + "reference": "62e76e2ab05801d0b37db05bd09eaffe0a0b7fb4" + }, + "require": { + "typo3/cms-core": "^11.5" + }, + "replace": { + "typo3-ter/zuladungsliste": "self.version" + }, + "type": "typo3-cms-extension", + "extra": { + "typo3/cms": { + "cms-package-dir": "{$vendor-dir}/typo3/cms", + "web-dir": ".Build/public", + "extension-key": "zuladungsliste" + } + }, + "autoload": { + "psr-4": { + "HermannTelser\\Zuladungsliste\\": "Classes" + } + }, + "scripts": { + "post-autoload-dump": [ + "TYPO3\\TestingFramework\\Composer\\ExtensionTestEnvironment::prepare" + ] + }, + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Hermann Telser", + "email": "hermann.telser@gmail.com", + "role": "Developer" + } + ], + "description": "Programm zur Verwaltung Zuladungsliste für die Architektenkammer in Österrreich", + "transport-options": { + "relative": true + } + }, + { + "name": "in2code/femanager", + "version": "7.5.3", + "source": { + "type": "git", + "url": "https://github.com/in2code-de/femanager.git", + "reference": "fabec8bea13a2dd327b2c1a043a1f98006be083c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/in2code-de/femanager/zipball/fabec8bea13a2dd327b2c1a043a1f98006be083c", + "reference": "fabec8bea13a2dd327b2c1a043a1f98006be083c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-pdo": "*", + "php": "^7.4 || ^8.0", + "symfony/config": "^5.4", + "typo3/cms-core": "^11.5" + }, + "replace": { + "typo3-ter/femanager": "self.version" + }, + "require-dev": { + "behat/behat": "^3.8", + "behat/mink-selenium2-driver": "^1.5", + "drevops/behat-screenshot": "^1.1", + "friends-of-behat/mink-browserkit-driver": "^1.6", + "friends-of-behat/mink-extension": "^2.6", + "friendsofphp/php-cs-fixer": "^3.2", + "genesis/behat-fail-aid": "^3.7", + "helhum/typo3-console": "^7.0", + "helmich/typo3-typoscript-lint": "^2.5", + "mikey179/vfsstream": "^1.6", + "nimut/testing-framework": "6.x-dev", + "phpmd/phpmd": "^2.10", + "phpunit/phpunit": "^9.5", + "se/selenium-server-standalone": "^3.141", + "sjbr/static-info-tables": "^11.5", + "squizlabs/php_codesniffer": "^3.6", + "ssch/typo3-rector": "^1.1", + "typo3/cms-adminpanel": "^11.5", + "typo3/cms-belog": "^11.5", + "typo3/cms-beuser": "^11.5", + "typo3/cms-dashboard": "^11.5", + "typo3/cms-extbase": "^11.5", + "typo3/cms-extensionmanager": "^11.5", + "typo3/cms-felogin": "^11.5", + "typo3/cms-filelist": "^11.5", + "typo3/cms-fluid-styled-content": "^11.5", + "typo3/cms-frontend": "^11.5", + "typo3/cms-impexp": "^11.5", + "typo3/cms-info": "^11.5", + "typo3/cms-install": "^11.5", + "typo3/cms-lowlevel": "^11.5", + "typo3/cms-recordlist": "^11.5", + "typo3/cms-rte-ckeditor": "^11.5", + "typo3/cms-scheduler": "^11.5", + "typo3/cms-setup": "^11.5", + "typo3/cms-t3editor": "^11.5", + "typo3/cms-tstemplate": "^11.5", + "typo3/coding-standards": "^v0.4.0" + }, + "type": "typo3-cms-extension", + "extra": { + "typo3/cms": { + "web-dir": ".Build/Web", + "extension-key": "femanager", + "cms-package-dir": "{$vendor-dir}/typo3/cms" + } + }, + "autoload": { + "psr-4": { + "In2code\\Femanager\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Alex Kellner", + "email": "alexander.kellner@in2code.de" + }, + { + "name": "Stefan Busemann", + "email": "stefan.busemann@in2code.de" + } + ], + "description": "Modern TYPO3 Frontend User Registration.", + "homepage": "https://github.com/in2code-de/femanager", + "keywords": [ + "fe_users", + "form", + "frontend", + "profile", + "registration", + "sr_feuser_register", + "typo3" + ], + "support": { + "issues": "https://github.com/in2code-de/femanager/issues", + "source": "https://github.com/in2code-de/femanager/tree/7.5.3" + }, + "time": "2025-07-22T08:42:20+00:00" + }, + { + "name": "lolli42/finediff", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/lolli42/FineDiff.git", + "reference": "807deaf7aa119cf47b58e90ba7bf37c8c8264c7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/807deaf7aa119cf47b58e90ba7bf37c8c8264c7a", + "reference": "807deaf7aa119cf47b58e90ba7bf37c8c8264c7a", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "symfony/polyfill-mbstring": "^1.23" + }, + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "cogpowered\\FineDiff\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raymond Hill" + }, + { + "name": "Rob Crowe", + "email": "rob@cogpowered.com" + }, + { + "name": "Christian Kuhn", + "email": "lolli@schwarzbu.ch", + "role": "maintainer" + } + ], + "description": "PHP implementation of a Fine granularity Diff engine", + "homepage": "https://github.com/lolli42/FineDiff", + "keywords": [ + "diff", + "finediff", + "opcode", + "string", + "text" + ], + "support": { + "issues": "https://github.com/lolli42/FineDiff/issues", + "source": "https://github.com/lolli42/FineDiff/tree/1.0.4" + }, + "time": "2024-07-09T14:52:10+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" + }, + "time": "2025-07-25T09:04:22+00:00" + }, + { + "name": "mpdf/mpdf", + "version": "v8.2.5", + "source": { + "type": "git", + "url": "https://github.com/mpdf/mpdf.git", + "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/mpdf/zipball/e175b05e3e00977b85feb96a8cccb174ac63621f", + "reference": "e175b05e3e00977b85feb96a8cccb174ac63621f", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "ext-mbstring": "*", + "mpdf/psr-http-message-shim": "^1.0 || ^2.0", + "mpdf/psr-log-aware-trait": "^2.0 || ^3.0", + "myclabs/deep-copy": "^1.7", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": "^5.6 || ^7.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "setasign/fpdi": "^2.1" + }, + "require-dev": { + "mockery/mockery": "^1.3.0", + "mpdf/qrcode": "^1.1.0", + "squizlabs/php_codesniffer": "^3.5.0", + "tracy/tracy": "~2.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-bcmath": "Needed for generation of some types of barcodes", + "ext-xml": "Needed mainly for SVG manipulation", + "ext-zlib": "Needed for compression of embedded resources, such as fonts" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Mpdf\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-only" + ], + "authors": [ + { + "name": "Matěj Humpál", + "role": "Developer, maintainer" + }, + { + "name": "Ian Back", + "role": "Developer (retired)" + } + ], + "description": "PHP library generating PDF files from UTF-8 encoded HTML", + "homepage": "https://mpdf.github.io", + "keywords": [ + "pdf", + "php", + "utf-8" + ], + "support": { + "docs": "https://mpdf.github.io", + "issues": "https://github.com/mpdf/mpdf/issues", + "source": "https://github.com/mpdf/mpdf" + }, + "funding": [ + { + "url": "https://www.paypal.me/mpdf", + "type": "custom" + } + ], + "time": "2024-11-18T15:30:42+00:00" + }, + { + "name": "mpdf/psr-http-message-shim", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-http-message-shim.git", + "reference": "3206e6b80b6d2479e148ee497e9f2bebadc919db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-http-message-shim/zipball/3206e6b80b6d2479e148ee497e9f2bebadc919db", + "reference": "3206e6b80b6d2479e148ee497e9f2bebadc919db", + "shasum": "" + }, + "require": { + "psr/http-message": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrHttpMessageShim\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + }, + { + "name": "Nigel Cunningham", + "email": "nigel.cunningham@technocrat.com.au" + } + ], + "description": "Shim to allow support of different psr/message versions.", + "support": { + "issues": "https://github.com/mpdf/psr-http-message-shim/issues", + "source": "https://github.com/mpdf/psr-http-message-shim/tree/1.0.0" + }, + "time": "2023-09-01T05:59:47+00:00" + }, + { + "name": "mpdf/psr-log-aware-trait", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/mpdf/psr-log-aware-trait.git", + "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mpdf/psr-log-aware-trait/zipball/7a077416e8f39eb626dee4246e0af99dd9ace275", + "reference": "7a077416e8f39eb626dee4246e0af99dd9ace275", + "shasum": "" + }, + "require": { + "psr/log": "^1.0 || ^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mpdf\\PsrLogAwareTrait\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Dorison", + "email": "mark@chromatichq.com" + }, + { + "name": "Kristofer Widholm", + "email": "kristofer@chromatichq.com" + } + ], + "description": "Trait to allow support of different psr/log versions.", + "support": { + "issues": "https://github.com/mpdf/psr-log-aware-trait/issues", + "source": "https://github.com/mpdf/psr-log-aware-trait/tree/v2.0.0" + }, + "time": "2023-05-03T06:18:28+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "neitanod/forceutf8", + "version": "v2.0.4", + "source": { + "type": "git", + "url": "https://github.com/neitanod/forceutf8.git", + "reference": "c1fbe70bfb5ad41b8ec5785056b0e308b40d4831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/neitanod/forceutf8/zipball/c1fbe70bfb5ad41b8ec5785056b0e308b40d4831", + "reference": "c1fbe70bfb5ad41b8ec5785056b0e308b40d4831", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "ForceUTF8\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastián Grignoli", + "email": "grignoli@gmail.com" + } + ], + "description": "PHP Class Encoding featuring popular Encoding::toUTF8() function --formerly known as forceUTF8()-- that fixes mixed encoded strings.", + "homepage": "https://github.com/neitanod/forceutf8", + "support": { + "issues": "https://github.com/neitanod/forceutf8/issues", + "source": "https://github.com/neitanod/forceutf8/tree/master" + }, + "time": "2019-12-10T14:09:14+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.19.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "reference": "715f4d25e225bc47b293a8b997fe6ce99bf987d2", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.4" + }, + "time": "2024-09-29T15:01:53+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.6.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7|^2.0", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5 || ~1.6.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "psalm/phar": "^5.26" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" + }, + "time": "2025-04-13T19:20:35+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.18|^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" + }, + "time": "2024-11-09T15:12:26+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.33.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0" + }, + "time": "2024-10-13T11:25:22+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, + "time": "2023-04-04T09:50:52+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "scssphp/scssphp", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/scssphp/scssphp.git", + "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/63d1157457e5554edf00b0c1fabab4c1511d2520", + "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^5.1", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "~5.0", + "twbs/bootstrap4": "4.6.1", + "zurb/foundation": "~6.7.0" + }, + "suggest": { + "ext-iconv": "Can be used as fallback when ext-mbstring is not available", + "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" + }, + "bin": [ + "bin/pscss" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "ScssPhp\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "http://scssphp.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "support": { + "issues": "https://github.com/scssphp/scssphp/issues", + "source": "https://github.com/scssphp/scssphp/tree/v1.13.0" + }, + "time": "2024-08-17T21:02:11+00:00" + }, + { + "name": "setasign/fpdi", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/Setasign/FPDI.git", + "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Setasign/FPDI/zipball/67c31f5e50c93c20579ca9e23035d8c540b51941", + "reference": "67c31f5e50c93c20579ca9e23035d8c540b51941", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "setasign/tfpdf": "<1.31" + }, + "require-dev": { + "phpunit/phpunit": "^7", + "setasign/fpdf": "~1.8.6", + "setasign/tfpdf": "~1.33", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.2" + }, + "suggest": { + "setasign/fpdf": "FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured." + }, + "type": "library", + "autoload": { + "psr-4": { + "setasign\\Fpdi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Slabon", + "email": "jan.slabon@setasign.com", + "homepage": "https://www.setasign.com" + }, + { + "name": "Maximilian Kresse", + "email": "maximilian.kresse@setasign.com", + "homepage": "https://www.setasign.com" + } + ], + "description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.", + "homepage": "https://www.setasign.com/fpdi", + "keywords": [ + "fpdf", + "fpdi", + "pdf" + ], + "support": { + "issues": "https://github.com/Setasign/FPDI/issues", + "source": "https://github.com/Setasign/FPDI/tree/v2.6.3" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/setasign/fpdi", + "type": "tidelift" + } + ], + "time": "2025-02-05T13:22:35+00:00" + }, + { + "name": "sjbr/sr-freecap", + "version": "v11.5.5", + "source": { + "type": "git", + "url": "https://codeberg.org/sjbr/sr-freecap", + "reference": "24c99c76e5a508c6936c21524749466b01054f1d" + }, + "require": { + "typo3/cms-core": "^11.5" + }, + "replace": { + "typo3-ter/sr-freecap": "self.version" + }, + "type": "typo3-cms-extension", + "extra": { + "typo3/cms": { + "extension-key": "sr_freecap" + } + }, + "autoload": { + "psr-4": { + "SJBR\\SrFreecap\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Stanislas Rolland", + "homepage": "https://www.sjbr.ca", + "role": "Developer" + } + ], + "description": "A TYPO3 integration of freeCap CAPTCHA.", + "homepage": "https://codeberg.org/sjbr/sr-freecap", + "keywords": [ + "captcha", + "typo3" + ], + "support": { + "issues": "https://codeberg.org/sjbr/sr-freecap/issues" + }, + "time": "2023-06-19T20:27:30+00:00" + }, + { + "name": "symfony/cache", + "version": "v5.4.46", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/0fe08ee32cec2748fbfea10c52d3ee02049e0f6b", + "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.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" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<4.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0|2.0", + "psr/simple-cache-implementation": "1.0|2.0", + "symfony/cache-implementation": "1.0|2.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "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" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v5.4.46" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-04T11:43:55+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e", + "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/cache": "^1.0|^2.0|^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/config", + "version": "v5.4.46", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "977c88a02d7d3f16904a81907531b19666a08e78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/977c88a02d7d3f16904a81907531b19666a08e78", + "reference": "977c88a02d7d3f16904a81907531b19666a08e78", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/filesystem": "^4.4|^5.0|^6.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22" + }, + "conflict": { + "symfony/finder": "<4.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v5.4.46" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-30T07:58:02+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-06T11:30:55+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "e5ca16dee39ef7d63e552ff0bf0a2526a1142c92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e5ca16dee39ef7d63e552ff0bf0a2526a1142c92", + "reference": "e5ca16dee39ef7d63e552ff0bf0a2526a1142c92", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1.1", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/polyfill-php81": "^1.22", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<5.3", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4.26" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0|2.0" + }, + "require-dev": { + "symfony/config": "^5.3|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4.26|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-20T10:51:57+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", + "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.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": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "a784b66edc4c151eb05076d04707906ee2c209a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/a784b66edc4c151eb05076d04707906ee2c209a9", + "reference": "a784b66edc4c151eb05076d04707906ee2c209a9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-04T14:55:40+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", + "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-22T13:05:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "63741784cd7b9967975eec610b256eed3ede022b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", + "reference": "63741784cd7b9967975eec610b256eed3ede022b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-28T13:32:08+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "3f38b8af283b830e1363acd79e5bc3412d055341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3f38b8af283b830e1363acd79e5bc3412d055341", + "reference": "3f38b8af283b830e1363acd79e5bc3412d055341", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T18:58:02+00:00" + }, + { + "name": "symfony/lock", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/lock.git", + "reference": "f85ebc5346a2f0e4f9e347e9154922a6d4665c65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/lock/zipball/f85ebc5346a2f0e4f9e347e9154922a6d4665c65", + "reference": "f85ebc5346a2f0e4f9e347e9154922a6d4665c65", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/dbal": "<2.13" + }, + "require-dev": { + "doctrine/dbal": "^2.13|^3|^4", + "predis/predis": "^1.0|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Lock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Derussé", + "email": "jeremy@derusse.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource", + "homepage": "https://symfony.com", + "keywords": [ + "cas", + "flock", + "locking", + "mutex", + "redlock", + "semaphore" + ], + "support": { + "source": "https://github.com/symfony/lock/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-21T20:36:41+00:00" + }, + { + "name": "symfony/mailer", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/f732e1fafdf0f4a2d865e91f1018aaca174aeed9", + "reference": "f732e1fafdf0f4a2d865e91f1018aaca174aeed9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=7.2.5", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.2.6|^6.0", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<4.4" + }, + "require-dev": { + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/messenger": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/8c1b9b3e5b52981551fc6044539af1d974e39064", + "reference": "8c1b9b3e5b52981551fc6044539af1d974e39064", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4", + "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.4", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-23T20:18:32+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "763d2a91fea5681509ca01acbc1c5e450d127811" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811", + "reference": "763d2a91fea5681509ca01acbc1c5e450d127811", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Icu\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-21T18:38:29+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.32.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/property-access", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "111e7ed617509f1a9139686055d234aad6e388e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/111e7ed617509f1a9139686055d234aad6e388e0", + "reference": "111e7ed617509f1a9139686055d234aad6e388e0", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/property-info": "^5.2|^6.0" + }, + "require-dev": { + "symfony/cache": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/property-info", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "a0396295ad585f95fccd690bc6a281e5bd303902" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/a0396295ad585f95fccd690bc6a281e5bd303902", + "reference": "a0396295ad585f95fccd690bc6a281e5bd303902", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.10.4|^2", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "suggest": { + "phpdocumentor/reflection-docblock": "To use the PHPDoc", + "psr/cache-implementation": "To cache results", + "symfony/doctrine-bridge": "To use Doctrine metadata", + "symfony/serializer": "To use Serializer metadata" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v5.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-25T16:14:41+00:00" + }, + { + "name": "symfony/rate-limiter", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/rate-limiter.git", + "reference": "c902bf796ca6c9656c3cc8185b53afb9acbb7c72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/c902bf796ca6c9656c3cc8185b53afb9acbb7c72", + "reference": "c902bf796ca6c9656c3cc8185b53afb9acbb7c72", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/lock": "^5.2|^6.0", + "symfony/options-resolver": "^5.1|^6.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\RateLimiter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wouter de Jong", + "email": "wouter@wouterj.nl" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a Token Bucket implementation to rate limit input and output in your application", + "homepage": "https://symfony.com", + "keywords": [ + "limiter", + "rate-limiter" + ], + "support": { + "source": "https://github.com/symfony/rate-limiter/tree/v5.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-07T11:51:21+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "dd08c19879a9b37ff14fd30dcbdf99a4cf045db1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/dd08c19879a9b37ff14fd30dcbdf99a4cf045db1", + "reference": "dd08c19879a9b37ff14fd30dcbdf99a4cf045db1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^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/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-12T18:20:21+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", + "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", + "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "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" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "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" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-10T20:33:58+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.48", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/42f18f170aa86d612c3559cfb3bd11a375df32c8", + "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.48" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-08T15:21:10+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "862700068db0ddfd8c5b850671e029a90246ec75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/862700068db0ddfd8c5b850671e029a90246ec75", + "reference": "862700068db0ddfd8c5b850671e029a90246ec75", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.45", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a454d47278cc16a5db371fe73ae66a78a633371e", + "reference": "a454d47278cc16a5db371fe73ae66a78a633371e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.45" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:11:13+00:00" + }, + { + "name": "typo3/class-alias-loader", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git", + "reference": "cf2aebabe1886474da7194e1531900039263b3e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/cf2aebabe1886474da7194e1531900039263b3e0", + "reference": "cf2aebabe1886474da7194e1531900039263b3e0", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=7.1" + }, + "replace": { + "helhum/class-alias-loader": "*" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <9" + }, + "type": "composer-plugin", + "extra": { + "class": "TYPO3\\ClassAliasLoader\\Plugin", + "branch-alias": { + "dev-main": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\ClassAliasLoader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Helmut Hummel", + "email": "info@helhum.io" + } + ], + "description": "Amends the composer class loader to support class aliases to provide backwards compatibility for packages", + "homepage": "http://github.com/TYPO3/class-alias-loader", + "keywords": [ + "alias", + "autoloader", + "classloader", + "composer" + ], + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.2.0" + }, + "time": "2024-10-11T08:11:39+00:00" + }, + { + "name": "typo3/cms-adminpanel", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/adminpanel.git", + "reference": "b32d946dd41e10fb0e5e2ae76fff5447563bcf61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/adminpanel/zipball/b32d946dd41e10fb0e5e2ae76fff5447563bcf61", + "reference": "b32d946dd41e10fb0e5e2ae76fff5447563bcf61", + "shasum": "" + }, + "require": { + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "symfony/var-dumper": "^5.4", + "typo3/cms-backend": "11.5.41", + "typo3/cms-core": "11.5.41", + "typo3/cms-fluid": "11.5.41", + "typo3/cms-frontend": "11.5.41", + "typo3fluid/fluid": "^2.7.2" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "adminpanel" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Adminpanel\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The TYPO3 admin panel provides a panel with additional functionality in the frontend (Debugging, Caching, Preview...)", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-adminpanel/11.5/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-backend", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/backend.git", + "reference": "3731452fa07b013cf96b67b3a826a3403a8f2968" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/3731452fa07b013cf96b67b3a826a3403a8f2968", + "reference": "3731452fa07b013cf96b67b3a826a3403a8f2968", + "shasum": "" + }, + "require": { + "psr/event-dispatcher": "^1.0", + "typo3/cms-core": "11.5.41", + "typo3/cms-recordlist": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "replace": { + "typo3/cms-about": "self.version", + "typo3/cms-context-help": "self.version", + "typo3/cms-cshmanual": "self.version", + "typo3/cms-func-wizards": "self.version", + "typo3/cms-wizard-crpages": "self.version", + "typo3/cms-wizard-sortpages": "self.version" + }, + "suggest": { + "typo3/cms-install": "To generate url to install tool in environment toolbar" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "serviceProvider": "TYPO3\\CMS\\Backend\\ServiceProvider", + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "backend" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Backend\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Classes for the TYPO3 backend.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-belog", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/belog.git", + "reference": "659f1d607aeba5542158396dabbaa3a1c76f0775" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/belog/zipball/659f1d607aeba5542158396dabbaa3a1c76f0775", + "reference": "659f1d607aeba5542158396dabbaa3a1c76f0775", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "belog" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Belog\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Displays backend log, both per page and system wide. Available as the module Tools>Log (system wide overview) and Web>Info/Log (page relative overview).", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-beuser", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/beuser.git", + "reference": "0ed0db0d285bf447f278ec1b1dfbb2f23878154a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/beuser/zipball/0ed0db0d285bf447f278ec1b1dfbb2f23878154a", + "reference": "0ed0db0d285bf447f278ec1b1dfbb2f23878154a", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "beuser" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Beuser\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Backend user administration and overview. Allows you to compare the settings of users and verify their permissions and see who is online.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-cli", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/cms-cli.git", + "reference": "e7ad171e5abf790db17296d33268e1a620452558" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/cms-cli/zipball/e7ad171e5abf790db17296d33268e1a620452558", + "reference": "e7ad171e5abf790db17296d33268e1a620452558", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.0 || >=2.0" + }, + "bin": [ + "typo3" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "TYPO3 command line binary", + "homepage": "https://typo3.org", + "support": { + "issues": "https://github.com/TYPO3/cms-cli/issues", + "source": "https://github.com/TYPO3/cms-cli/tree/3.1.2" + }, + "time": "2024-11-13T12:02:24+00:00" + }, + { + "name": "typo3/cms-composer-installers", + "version": "v3.1.4", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/CmsComposerInstallers.git", + "reference": "29fb214976fe05f39c7d0619ce1d648d59c50a08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/CmsComposerInstallers/zipball/29fb214976fe05f39c7d0619ce1d648d59c50a08", + "reference": "29fb214976fe05f39c7d0619ce1d648d59c50a08", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0.0 || ^2.0.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "composer/installers": "<2.0.0" + }, + "replace": { + "lw/typo3cms-installers": "*", + "netresearch/composer-installers": "*" + }, + "require-dev": { + "composer/composer": "1.2.*@dev || 2.0.*@dev", + "friendsofphp/php-cs-fixer": "^2.18", + "overtrue/phplint": "^2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "composer-plugin", + "extra": { + "class": "TYPO3\\CMS\\Composer\\Installer\\Plugin", + "branch-alias": { + "dev-main": "3.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Composer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 CMS Core Team", + "homepage": "https://forge.typo3.org/projects/typo3cms-core", + "role": "Developer" + }, + { + "name": "The TYPO3 Community", + "homepage": "https://typo3.org/community/", + "role": "Contributor" + } + ], + "description": "TYPO3 CMS Installers", + "homepage": "https://github.com/TYPO3/CmsComposerInstallers", + "keywords": [ + "cms", + "core", + "extension", + "installer", + "typo3" + ], + "support": { + "general": "https://typo3.org/support/", + "issues": "https://github.com/TYPO3/CmsComposerInstallers/issues", + "source": "https://github.com/TYPO3/CmsComposerInstallers/tree/v3.1.4" + }, + "time": "2024-08-13T14:56:37+00:00" + }, + { + "name": "typo3/cms-core", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/core.git", + "reference": "1249ec68101f20fd3d5b2e51366da0c005930a12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/1249ec68101f20fd3d5b2e51366da0c005930a12", + "reference": "1249ec68101f20fd3d5b2e51366da0c005930a12", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0.4", + "christian-riesen/base32": "^1.6", + "composer-runtime-api": "^2.1", + "doctrine/annotations": "^1.11", + "doctrine/dbal": "^2.13.8", + "doctrine/event-manager": "^1.0.0", + "doctrine/instantiator": "^1.4", + "doctrine/lexer": "^1.2.3", + "egulias/email-validator": "^3.2.1", + "enshrined/svg-sanitize": "^0.18.0", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-pcre": "*", + "ext-pdo": "*", + "ext-session": "*", + "ext-xml": "*", + "guzzlehttp/guzzle": "^7.7.0", + "guzzlehttp/psr7": "^2.4.3", + "lolli42/finediff": "^1.0.1", + "masterminds/html5": "^2.7.6", + "nikic/php-parser": "^4.13.2", + "php": "^7.4 || ^8.0", + "psr/container": "^1.1 || ^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^1.0", + "symfony/config": "^5.4", + "symfony/console": "^5.4", + "symfony/dependency-injection": "^5.4", + "symfony/event-dispatcher-contracts": "^1.1 || ^2.0", + "symfony/expression-language": "^5.4", + "symfony/filesystem": "^5.4", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "symfony/mailer": "^5.4", + "symfony/mime": "^5.4", + "symfony/options-resolver": "^5.4", + "symfony/polyfill-intl-icu": "^1.23.0", + "symfony/polyfill-intl-idn": "^1.23.0", + "symfony/polyfill-intl-normalizer": "^1.27", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1", + "symfony/polyfill-php81": "^1.23", + "symfony/polyfill-php83": "^1.31", + "symfony/rate-limiter": "^5.4.8", + "symfony/routing": "^5.4", + "symfony/yaml": "^5.4", + "typo3/class-alias-loader": "^1.1.4", + "typo3/cms-cli": "^3.1", + "typo3/cms-composer-installers": "^2.0 || ^3.0 || ^4.0", + "typo3/html-sanitizer": "^2.1.4", + "typo3/phar-stream-wrapper": "^3.1.7", + "typo3/symfony-psr-event-dispatcher-adapter": "^1.0 || ^2.0", + "typo3fluid/fluid": "^2.7.2" + }, + "conflict": { + "hoa/core": "*", + "typo3/cms": "*" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "replace": { + "typo3/cms-lang": "self.version", + "typo3/cms-saltedpasswords": "self.version", + "typo3/cms-sv": "self.version" + }, + "suggest": { + "ext-fileinfo": "Used for proper file type detection in the file abstraction layer", + "ext-gd": "GDlib/Freetype is required for building images with text (GIFBUILDER) and can also be used to scale images", + "ext-intl": "TYPO3 with unicode-based filesystems", + "ext-mysqli": "", + "ext-openssl": "OpenSSL is required for sending SMTP mails over an encrypted channel endpoint", + "ext-zip": "", + "ext-zlib": "TYPO3 uses zlib for amongst others output compression and un/packing t3x extension files" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "serviceProvider": "TYPO3\\CMS\\Core\\ServiceProvider", + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "core" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "files": [ + "Resources/PHP/GlobalDebugFunctions.php" + ], + "psr-4": { + "TYPO3\\CMS\\Core\\": "Classes/" + }, + "classmap": [ + "Resources/PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The core library of TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-dashboard", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/dashboard.git", + "reference": "9cbf64d358f6b380f588b86f536c827a97970ae5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/dashboard/zipball/9cbf64d358f6b380f588b86f536c827a97970ae5", + "reference": "9cbf64d358f6b380f588b86f536c827a97970ae5", + "shasum": "" + }, + "require": { + "typo3/cms-backend": "11.5.41", + "typo3/cms-core": "11.5.41", + "typo3/cms-extbase": "11.5.41", + "typo3/cms-fluid": "11.5.41", + "typo3/cms-frontend": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Dashboard\\ServiceProvider", + "partOfFactoryDefault": true + }, + "extension-key": "dashboard" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Dashboard\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Dashboard for TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-dashboard/11.5/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-extbase", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/extbase.git", + "reference": "373a6115683261da595f9191bff88c90e962e523" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/373a6115683261da595f9191bff88c90e962e523", + "reference": "373a6115683261da595f9191bff88c90e962e523", + "shasum": "" + }, + "require": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/type-resolver": "^1.4", + "symfony/dependency-injection": "^5.4", + "symfony/property-access": "^5.4", + "symfony/property-info": "^5.4", + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-scheduler": "Additional scheduler tasks" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "serviceProvider": "TYPO3\\CMS\\Extbase\\ServiceProvider", + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "extbase" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Extbase\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "A framework to build extensions for TYPO3 CMS.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-extensionmanager", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/extensionmanager.git", + "reference": "52045f9740341b39d6b21c408b81e2dbf0c3a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/extensionmanager/zipball/52045f9740341b39d6b21c408b81e2dbf0c3a163", + "reference": "52045f9740341b39d6b21c408b81e2dbf0c3a163", + "shasum": "" + }, + "require": { + "ext-libxml": "*", + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "extensionmanager" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Extensionmanager\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 Extension Manager", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-felogin", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/felogin.git", + "reference": "c2d3896f00b2b8927ece41d54046298967f8e83f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/felogin/zipball/c2d3896f00b2b8927ece41d54046298967f8e83f", + "reference": "c2d3896f00b2b8927ece41d54046298967f8e83f", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "felogin" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\FrontendLogin\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "A template-based plugin to log in Website Users in the Frontend", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-felogin/11.5/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-filelist", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/filelist.git", + "reference": "9904c03ff1aabb2eec7c8795364560904f4490ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/filelist/zipball/9904c03ff1aabb2eec7c8795364560904f4490ea", + "reference": "9904c03ff1aabb2eec7c8795364560904f4490ea", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "filelist" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Filelist\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Listing of files in the directory", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-fluid", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/fluid.git", + "reference": "94e30bbf5a2476fdf5881b11b795849c41393292" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/94e30bbf5a2476fdf5881b11b795849c41393292", + "reference": "94e30bbf5a2476fdf5881b11b795849c41393292", + "shasum": "" + }, + "require": { + "symfony/dependency-injection": "^5.4", + "typo3/cms-core": "11.5.41", + "typo3/cms-extbase": "11.5.41", + "typo3fluid/fluid": "^2.7.2" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "serviceProvider": "TYPO3\\CMS\\Fluid\\ServiceProvider", + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "fluid" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Fluid\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Fluid is a next-generation templating engine which makes the life of extension authors a lot easier!", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/other/typo3/view-helper-reference/main/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-fluid-styled-content", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/fluid_styled_content.git", + "reference": "1e12ebe6739032dd7705b8a109a246023714b31f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid_styled_content/zipball/1e12ebe6739032dd7705b8a109a246023714b31f", + "reference": "1e12ebe6739032dd7705b8a109a246023714b31f", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41", + "typo3/cms-fluid": "11.5.41", + "typo3/cms-frontend": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "fluid_styled_content" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\FluidStyledContent\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "A set of common content elements based on Fluid for Frontend output.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-fluid-styled-content/main/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-form", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/form.git", + "reference": "396587e413fba68b1665d4a4e430f9a0284b2922" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/form/zipball/396587e413fba68b1665d4a4e430f9a0284b2922", + "reference": "396587e413fba68b1665d4a4e430f9a0284b2922", + "shasum": "" + }, + "require": { + "psr/http-message": "^1.0", + "symfony/expression-language": "^5.4", + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-filelist": "Listing of files in the directory", + "typo3/cms-impexp": "Import and Export of records from TYPO3 in a custom serialized format (.T3D) for data exchange with other TYPO3 systems." + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "form" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Form\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Form Library, Plugin and Editor", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-form/11.5/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-frontend", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/frontend.git", + "reference": "6a812823d392fcab40144121db357b61929b2e31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/6a812823d392fcab40144121db357b61929b2e31", + "reference": "6a812823d392fcab40144121db357b61929b2e31", + "shasum": "" + }, + "require": { + "ext-libxml": "*", + "symfony/polyfill-mbstring": "^1.23.1", + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-adminpanel": "Provides additional information and functionality for backend users in the frontend." + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "serviceProvider": "TYPO3\\CMS\\Frontend\\ServiceProvider", + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "frontend" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Frontend\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Classes for the frontend of TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-impexp", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/impexp.git", + "reference": "0271b272993c8d845566b09280dd4c547b3686ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/impexp/zipball/0271b272993c8d845566b09280dd4c547b3686ff", + "reference": "0271b272993c8d845566b09280dd4c547b3686ff", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "impexp" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Impexp\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Import and Export of records from TYPO3 in a custom serialized format (.T3D) for data exchange with other TYPO3 systems.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-impexp/11.5/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-info", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/info.git", + "reference": "d08d9992f0ff75b9bb61742d21d87e25eb54a66b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/info/zipball/d08d9992f0ff75b9bb61742d21d87e25eb54a66b", + "reference": "d08d9992f0ff75b9bb61742d21d87e25eb54a66b", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "replace": { + "typo3/cms-info-pagetsconfig": "self.version" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "info" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Info\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Shows various infos", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-install", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/install.git", + "reference": "7364ae581b33e535b508155dc753ea3bba5a3a7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/7364ae581b33e535b508155dc753ea3bba5a3a7d", + "reference": "7364ae581b33e535b508155dc753ea3bba5a3a7d", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.13.8", + "guzzlehttp/promises": "^1.5.2 || ^2.0", + "nikic/php-parser": "^4.13.2", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "typo3/cms-core": "11.5.41", + "typo3/cms-extbase": "11.5.41", + "typo3/cms-fluid": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "serviceProvider": "TYPO3\\CMS\\Install\\ServiceProvider", + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "install" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Install\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The Install Tool mounted as the module Tools>Install in TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-lowlevel", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/lowlevel.git", + "reference": "20ff5881a8f8e865079c05fe3790f8abe00487ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/lowlevel/zipball/20ff5881a8f8e865079c05fe3790f8abe00487ed", + "reference": "20ff5881a8f8e865079c05fe3790f8abe00487ed", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Lowlevel\\ServiceProvider", + "partOfFactoryDefault": true + }, + "extension-key": "lowlevel" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Lowlevel\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Enables the 'Config' and 'DB Check' modules for technical analysis of the system. This includes raw database search, checking relations, counting pages and records etc.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-opendocs", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/opendocs.git", + "reference": "3f5d7a2012488a5995fae94e8397e3832df9d94f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/opendocs/zipball/3f5d7a2012488a5995fae94e8397e3832df9d94f", + "reference": "3f5d7a2012488a5995fae94e8397e3832df9d94f", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "extension-key": "opendocs" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Opendocs\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Shows opened documents by the user.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-recordlist", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/recordlist.git", + "reference": "71bd2e22e196e96a93f6c0213de755e0af6d3cb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/recordlist/zipball/71bd2e22e196e96a93f6c0213de755e0af6d3cb8", + "reference": "71bd2e22e196e96a93f6c0213de755e0af6d3cb8", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "recordlist" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Recordlist\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "List of database-records", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-recycler", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/recycler.git", + "reference": "b649b293a82ec151dbfa4ccb561a88abd57a1923" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/recycler/zipball/b649b293a82ec151dbfa4ccb561a88abd57a1923", + "reference": "b649b293a82ec151dbfa4ccb561a88abd57a1923", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-scheduler": "Remove deleted records after given time" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "extension-key": "recycler" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Recycler\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The recycler offers the possibility to restore deleted records or remove them from the database permanently. These actions can be applied to a single record, multiple records, and recursively to child records (ex. restoring a page can restore all content elements on that page). Filtering by page and by table provides a quick overview of deleted records before taking action on them.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-recycler/11.5/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-redirects", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/redirects.git", + "reference": "2b10082a0c3a8fa66a78259c24db5d856650180e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/redirects/zipball/2b10082a0c3a8fa66a78259c24db5d856650180e", + "reference": "2b10082a0c3a8fa66a78259c24db5d856650180e", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.13.8", + "psr/http-message": "^1.0", + "psr/log": "^1.0", + "symfony/console": "^5.4", + "typo3/cms-backend": "11.5.41", + "typo3/cms-core": "11.5.41", + "typo3fluid/fluid": "^2.7.2" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-reports": "Get reports of redirects", + "typo3/cms-scheduler": "Execute commands to update redirect status" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "redirects" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Redirects\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Custom redirects in TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-redirects/11.5/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-reports", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/reports.git", + "reference": "67f0a28b4ab7fc272e34d6dcd0f6d4df69efbe39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/reports/zipball/67f0a28b4ab7fc272e34d6dcd0f6d4df69efbe39", + "reference": "67f0a28b4ab7fc272e34d6dcd0f6d4df69efbe39", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-scheduler": "Determine system's status and send it via email" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "reports" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Reports\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The reports module groups several system reports.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-rte-ckeditor", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/rte_ckeditor.git", + "reference": "d9a7cf09be268dccc7d92fd7ff856c851d4d7cba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/rte_ckeditor/zipball/d9a7cf09be268dccc7d92fd7ff856c851d4d7cba", + "reference": "d9a7cf09be268dccc7d92fd7ff856c851d4d7cba", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-setup": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "rte_ckeditor" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\RteCKEditor\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Integration of CKEditor as Rich Text Editor.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-rte-ckeditor/11.5/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-scheduler", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/scheduler.git", + "reference": "40b5369dea148a8bed3752230bff423aab3a6e01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/scheduler/zipball/40b5369dea148a8bed3752230bff423aab3a6e01", + "reference": "40b5369dea148a8bed3752230bff423aab3a6e01", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "extension-key": "scheduler" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Scheduler\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "The TYPO3 Scheduler lets you register tasks to happen at a specific time", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-scheduler/11.5/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-seo", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/seo.git", + "reference": "eb5ca5e7ff4253e9790e706ab97d97f77afd9456" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/seo/zipball/eb5ca5e7ff4253e9790e706ab97d97f77afd9456", + "reference": "eb5ca5e7ff4253e9790e706ab97d97f77afd9456", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41", + "typo3/cms-extbase": "11.5.41", + "typo3/cms-frontend": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "seo" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Seo\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "SEO features for TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-seo/11.5/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-setup", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/setup.git", + "reference": "e6eb22e70b5fa3ad3dc57956df65b0d51b2ba6c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/setup/zipball/e6eb22e70b5fa3ad3dc57956df65b0d51b2ba6c3", + "reference": "e6eb22e70b5fa3ad3dc57956df65b0d51b2ba6c3", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "setup" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Setup\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Allows users to edit a limited set of options for their user profile, eg. preferred language and their name and email address.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-sys-note", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/sys_note.git", + "reference": "e1bac2277714817a57b1840015d429f79c53f0a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/sys_note/zipball/e1bac2277714817a57b1840015d429f79c53f0a0", + "reference": "e1bac2277714817a57b1840015d429f79c53f0a0", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "sys_note" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\SysNote\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Records with messages which can be placed on any page and contain instructions or other information related to a page or section.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-t3editor", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/t3editor.git", + "reference": "6b3eeeb24f615b5759b2a81b62b5ddf1ca5b16af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/t3editor/zipball/6b3eeeb24f615b5759b2a81b62b5ddf1ca5b16af", + "reference": "6b3eeeb24f615b5759b2a81b62b5ddf1ca5b16af", + "shasum": "" + }, + "require": { + "ext-libxml": "*", + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "t3editor" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\T3editor\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "JavaScript-driven editor with syntax highlighting and code completion. Based on CodeMirror.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/c/typo3/cms-t3editor/11.5/en-us", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-tstemplate", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/tstemplate.git", + "reference": "f4df4e41499e7965a6758d9b631f87f4c4d7c7bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/tstemplate/zipball/f4df4e41499e7965a6758d9b631f87f4c4d7c7bd", + "reference": "f4df4e41499e7965a6758d9b631f87f4c4d7c7bd", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "tstemplate" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Tstemplate\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Framework for management of TypoScript template records for the CMS frontend.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/cms-viewpage", + "version": "v11.5.41", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/viewpage.git", + "reference": "b74824c98c8265fdb652651a7f0209a51c42e9d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/viewpage/zipball/b74824c98c8265fdb652651a7f0209a51c42e9d9", + "reference": "b74824c98c8265fdb652651a7f0209a51c42e9d9", + "shasum": "" + }, + "require": { + "typo3/cms-core": "11.5.41" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "viewpage" + }, + "branch-alias": { + "dev-master": "11.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Viewpage\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "Shows the frontend webpage inside the backend frameset.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-10-15T08:52:52+00:00" + }, + { + "name": "typo3/html-sanitizer", + "version": "v2.2.0", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/html-sanitizer.git", + "reference": "c672a2e02925de8eed0dcaeb3a3c90d3642049a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/c672a2e02925de8eed0dcaeb3a3c90d3642049a0", + "reference": "c672a2e02925de8eed0dcaeb3a3c90d3642049a0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "masterminds/html5": "^2.7.6", + "php": "^7.2 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\HtmlSanitizer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Hader", + "email": "oliver@typo3.org" + } + ], + "description": "HTML sanitizer aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.", + "support": { + "issues": "https://github.com/TYPO3/html-sanitizer/issues", + "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.2.0" + }, + "time": "2024-07-12T15:52:25+00:00" + }, + { + "name": "typo3/minimal", + "version": "v11.5.0", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/minimal.git", + "reference": "28c3d3b2b0fcd872eb51d8f4c26594284a3eb1fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/minimal/zipball/28c3d3b2b0fcd872eb51d8f4c26594284a3eb1fe", + "reference": "28c3d3b2b0fcd872eb51d8f4c26594284a3eb1fe", + "shasum": "" + }, + "require": { + "typo3/cms-backend": "^11.5", + "typo3/cms-core": "^11.5", + "typo3/cms-extbase": "^11.5", + "typo3/cms-extensionmanager": "^11.5", + "typo3/cms-filelist": "^11.5", + "typo3/cms-fluid": "^11.5", + "typo3/cms-frontend": "^11.5", + "typo3/cms-install": "^11.5", + "typo3/cms-recordlist": "^11.5" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 CMS Core Team", + "homepage": "https://forge.typo3.org/projects/typo3cms-core", + "role": "Developer" + }, + { + "name": "The TYPO3 Community", + "homepage": "https://typo3.org/community/", + "role": "Contributor" + } + ], + "description": "Minimal required set of TYPO3 extensions", + "support": { + "general": "https://typo3.org/support/", + "irc": "irc://irc.freenode.net/#typo3-cms", + "issues": "https://forge.typo3.org", + "news": "nntp://lists.typo3.org", + "source": "https://github.com/TYPO3/minimal/tree/v11.5.0" + }, + "time": "2021-10-05T11:29:15+00:00" + }, + { + "name": "typo3/phar-stream-wrapper", + "version": "v3.1.8", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/phar-stream-wrapper.git", + "reference": "a931b28f422a60052db85c0a84a05a366453b2c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/phar-stream-wrapper/zipball/a931b28f422a60052db85c0a84a05a366453b2c0", + "reference": "a931b28f422a60052db85c0a84a05a366453b2c0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.0 || ~8.0 || ~8.1 || ~8.2 || ~8.3" + }, + "require-dev": { + "ext-xdebug": "*", + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^5.1" + }, + "suggest": { + "ext-fileinfo": "For PHP builtin file type guessing, otherwise uses internal processing" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "v3.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\PharStreamWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Interceptors for PHP's native phar:// stream handling", + "homepage": "https://typo3.org/", + "keywords": [ + "phar", + "php", + "security", + "stream-wrapper" + ], + "support": { + "issues": "https://github.com/TYPO3/phar-stream-wrapper/issues", + "source": "https://github.com/TYPO3/phar-stream-wrapper/tree/v3.1.8" + }, + "time": "2024-12-09T23:06:33+00:00" + }, + { + "name": "typo3/symfony-psr-event-dispatcher-adapter", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter.git", + "reference": "c93fd7cc9f215cfbbc6ce89089eadabedf65a21f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/symfony-psr-event-dispatcher-adapter/zipball/c93fd7cc9f215cfbbc6ce89089eadabedf65a21f", + "reference": "c93fd7cc9f215cfbbc6ce89089eadabedf65a21f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/event-dispatcher-contracts": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "TYPO3\\SymfonyPsrEventDispatcherAdapter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Adapter to provide compatibility with the Symfony's event dispatcher interface in all versions with the PSR-14 specification.", + "homepage": "https://typo3.org/", + "keywords": [ + "adapter", + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter/issues", + "source": "https://github.com/TYPO3/symfony-psr-event-dispatcher-adapter/tree/v2.1.0" + }, + "time": "2021-03-02T09:36:49+00:00" + }, + { + "name": "typo3fluid/fluid", + "version": "2.7.4", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/Fluid.git", + "reference": "24f4494083c8d304680e4c9c38667dff33720dd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/24f4494083c8d304680e4c9c38667dff33720dd4", + "reference": "24f4494083c8d304680e4c9c38667dff33720dd4", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "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" + }, + "suggest": { + "ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case" + }, + "bin": [ + "bin/fluid" + ], + "type": "library", + "autoload": { + "psr-4": { + "TYPO3Fluid\\Fluid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "description": "The TYPO3 Fluid template rendering engine", + "homepage": "https://github.com/TYPO3/Fluid", + "support": { + "docs": "https://docs.typo3.org/other/typo3fluid/fluid/main/en-us/", + "issues": "https://github.com/TYPO3/Fluid/issues", + "source": "https://github.com/TYPO3/Fluid" + }, + "time": "2023-03-23T12:04:09+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "hermanntelser/zuladungsliste": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/sites/app/config.yaml b/config/sites/app/config.yaml new file mode 100644 index 0000000..62941b0 --- /dev/null +++ b/config/sites/app/config.yaml @@ -0,0 +1,26 @@ +base: 'https://steiermark.test/app' +errorHandling: + - + errorCode: 404 + errorHandler: Page + errorContentSource: 't3://page?uid=1' + - + errorCode: 403 + errorHandler: Page + errorContentSource: 't3://page?uid=1' +languages: + - + title: Deutsch + enabled: true + base: / + typo3Language: de + locale: de_DE.UTF-8 + iso-639-1: de + websiteTitle: '' + navigationTitle: '' + hreflang: de_DE + direction: '' + flag: global + languageId: 0 +rootPageId: 50 +websiteTitle: '' diff --git a/config/sites/zuladungsliste/config.yaml b/config/sites/zuladungsliste/config.yaml new file mode 100644 index 0000000..6da194e --- /dev/null +++ b/config/sites/zuladungsliste/config.yaml @@ -0,0 +1,26 @@ +base: 'https://steiermark.test' +errorHandling: + - + errorCode: 403 + errorHandler: Page + errorContentSource: 't3://page?uid=1' + - + errorCode: 404 + errorHandler: Page + errorContentSource: 't3://page?uid=1' +languages: + - + title: Deutsch + enabled: true + base: / + typo3Language: de + locale: de_DE.UTF-8 + iso-639-1: de + navigationTitle: '' + hreflang: de-DE + direction: '' + flag: global + languageId: 0 + websiteTitle: '' +rootPageId: 1 +websiteTitle: '' diff --git a/packages/zuladungsliste/.gitignore b/packages/zuladungsliste/.gitignore new file mode 100644 index 0000000..394abcc --- /dev/null +++ b/packages/zuladungsliste/.gitignore @@ -0,0 +1,5 @@ +composer.lock +Resources/Public/Css/node_modules +Resources/Public/Css/package-lock.json +Resources/Public/JavaScript/package-lock.json +Resources/Public/JavaScript/node_modules \ No newline at end of file diff --git a/packages/zuladungsliste/.vscode/settings.json b/packages/zuladungsliste/.vscode/settings.json new file mode 100644 index 0000000..75a748d --- /dev/null +++ b/packages/zuladungsliste/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "workbench.colorCustomizations": { + "activityBar.activeBackground": "#fa1b49", + "activityBar.background": "#fa1b49", + "activityBar.foreground": "#e7e7e7", + "activityBar.inactiveForeground": "#e7e7e799", + "activityBarBadge.background": "#155e02", + "activityBarBadge.foreground": "#e7e7e7", + "commandCenter.border": "#e7e7e799", + "sash.hoverBorder": "#fa1b49", + "statusBar.background": "#dd0531", + "statusBar.foreground": "#e7e7e7", + "statusBarItem.hoverBackground": "#fa1b49", + "statusBarItem.remoteBackground": "#dd0531", + "statusBarItem.remoteForeground": "#e7e7e7", + "titleBar.activeBackground": "#dd0531", + "titleBar.activeForeground": "#e7e7e7", + "titleBar.inactiveBackground": "#dd053199", + "titleBar.inactiveForeground": "#e7e7e799" + }, + "peacock.remoteColor": "#dd0531" +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Backend/FixUser.php b/packages/zuladungsliste/Classes/Backend/FixUser.php new file mode 100644 index 0000000..24bee6d --- /dev/null +++ b/packages/zuladungsliste/Classes/Backend/FixUser.php @@ -0,0 +1,45 @@ +getQueryBuilderForTable('fe_users'); + $statement = $queryBuilder + ->select('*') + ->from('fe_users') + ->where( + $queryBuilder->expr()->neq('date_of_birth', (int) 0) + )->execute() + ->fetchAll(); + + foreach ($statement as $key => $row) { + $queryBuilder + ->update('fe_users') + ->where( + $queryBuilder->expr()->eq('uid', (int) $row['uid']) + ) + ->set('tx_extbase_type', (string) 'Tx_Zuladungsliste_Architekten') + ->set('vereidigung', (string) date("Y-m-d", $row['date_of_birth'])) + ->set('name', (string) $row['first_name'] . " " . $row['last_name']) + ->set('date_of_birth', (int) 0) + ->execute(); + } + } +} diff --git a/packages/zuladungsliste/Classes/Backend/Labels.php b/packages/zuladungsliste/Classes/Backend/Labels.php new file mode 100755 index 0000000..90c3a9e --- /dev/null +++ b/packages/zuladungsliste/Classes/Backend/Labels.php @@ -0,0 +1,251 @@ +getQueryBuilderForTable('tx_zuladungsliste_konto_aufloesung_mm'); + $count = $queryBuilder + ->count('uid') + ->from('tx_zuladungsliste_konto_aufloesung_mm') + ->where( + $queryBuilder->expr()->eq('uid_empfaenger', $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)) + )->execute() + ->fetchColumn(0); + + $company = $record['company'] != " " ? $record['company'] : ''; + if ($count) { + $parameters['title'] = $company . ' [EMPFÄNGER]'; + } elseif ($record["kontoaufloesung_active"] > 0) { + $parameters['title'] = $company . "\n [" . $record["kontoaufloesung_active"] . " AUFGELÖST]"; + } else { + $parameters['title'] = $company; + } + + FixUser::set(); + } + + public function loadKriterienPunkte(&$parameters) + { + $kriterien_label = ''; + if (isset($parameters['options']['tx_zuladungsliste_punkte_kriterien_mm']) && is_array($parameters['options']['tx_zuladungsliste_punkte_kriterien_mm'])) { + $kriterien_id = $parameters['row']['uid_kriterien']; + $record = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('tx_zuladungsliste_domain_model_kriterien', $kriterien_id); + $kriterien_label = $record['bezeichnung']; + + $punkte_id = $parameters['row']['uid_punkte'][0]; + $item = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('tx_zuladungsliste_domain_model_punkte', $punkte_id); + $kriterien_label .= '
' . $item['bezeichnung'] . ''; + + //\TYPO3\CMS\Core\Utility\DebugUtility::debug($parameters['row']['uid_punkte'][0]); + + if ($parameters['row']['punkte'] == 1) { + $kriterien_label .= '
' . $parameters['row']['punkte'] . ' Punkt'; + } else { + $kriterien_label .= '
' . $parameters['row']['punkte'] . ' Punkte'; + } + } else { + $kriterien_label = '[Fehler!]'; + } + $parameters['title'] = $kriterien_label; + } + + public function loadPunkteVerteilungs(&$parameters) + { + $parameters['title'] = "ERROR"; + if (isset($parameters['options']['tx_zuladungsliste_konto_aufloesung_mm']) && is_array($parameters['options']['tx_zuladungsliste_konto_aufloesung_mm'])) { + $uid_empfaenger = $parameters['row']['uid_empfaenger'][0]; + + //\TYPO3\CMS\Core\Utility\DebugUtility::debug($uid_empfaenger); + + $prozente = $parameters['row']['prozente']; + + $record = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('fe_users', $uid_empfaenger); + + $colorclass = "zuladungsliste-kammern-" . $record["kammernid"]; + + $parameters['title'] = '' . $record['name']; + $parameters['title'] .= " (" . $prozente . "%) "; + } + } + + public function loadWettbewerbArchitekten(&$parameters) + { + if (isset($parameters['options']['tx_zuladungsliste_wettbewerbe_architekten_mm']) && is_array($parameters['options']['tx_zuladungsliste_wettbewerbe_architekten_mm'])) { + + if (is_array($parameters['row']['uid_wettbewerbe'])) { + $wettbewerbe_id = (int) $parameters['row']['uid_wettbewerbe'][0]; + } else { + $wettbewerbe_id = (int) $parameters['row']['uid_wettbewerbe']; + } + + if (is_array($parameters['row']['tstamp_zuordnung'])) { + $tstamp_zuordnung = (int) $parameters['row']['tstamp_zuordnung'][0]; + } else { + $tstamp_zuordnung = (int) $parameters['row']['tstamp_zuordnung']; + } + + if (is_array($parameters['row']['tstamp_aktivierung'])) { + $tstamp_aktivierung = (int) $parameters['row']['tstamp_aktivierung'][0]; + } else { + $tstamp_aktivierung = (int) $parameters['row']['tstamp_aktivierung']; + } + + if (is_array($parameters['row']['tstamp_ablehnen'])) { + $tstamp_ablehnen = (int) $parameters['row']['tstamp_ablehnen'][0]; + } else { + $tstamp_ablehnen = (int) $parameters['row']['tstamp_ablehnen']; + } + + if (is_array($parameters['row']['ist_befangen'])) { + $ist_befangen = (int) $parameters['row']['ist_befangen'][0]; + } else { + $ist_befangen = (int) $parameters['row']['ist_befangen']; + } + + if (is_array($parameters['row']['uid_user'])) { + $user_id = (int) $parameters['row']['uid_user'][0]; + } else { + $user_id = (int) $parameters['row']['uid_user']; + } + + if (is_array($parameters['row']['uid_punkte'])) { + $punkte_id = (int) $parameters['row']['uid_punkte'][0]; + } else { + $punkte_id = (int) $parameters['row']['uid_punkte']; + } + + // echo json_encode($parameters); + + // \TYPO3\CMS\Core\Utility\DebugUtility::debug(implode(", ",array_keys($parameters["row"]))); + // \TYPO3\CMS\Core\Utility\DebugUtility::debug(implode(", ",$parameters["row"])); + // \TYPO3\CMS\Core\Utility\DebugUtility::debug($parameters["row"]["uid_user"],"uid_user 1: "); + // \TYPO3\CMS\Core\Utility\DebugUtility::debug($user_id,"uid_user 2: "); + // \TYPO3\CMS\Core\Utility\DebugUtility::debug(implode(", ",array_keys($parameters["options"]))); + // \TYPO3\CMS\Core\Utility\DebugUtility::debug($wettbewerbe_id,$punkte_id); + + if (isset($wettbewerbe_id)) { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe'); + $record = $queryBuilder + ->select('kriteriumid', 'wettbewerb') + ->from('tx_zuladungsliste_domain_model_wettbewerbe') + ->where( + $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($wettbewerbe_id, \PDO::PARAM_INT)) + )->execute(); + + while ($row = $record->fetch()) { + $kriterien_id = $row['kriteriumid']; + $wettbewerb_label = $row['wettbewerb']; + } + + // $wettbewerb_label .= '' . $wettbewerbe_id . ''; + // \TYPO3\CMS\Core\Utility\DebugUtility::debug($record); + // return; + // $record = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows("kriteriumid,wettbewerb", "tx_zuladungsliste_domain_model_wettbewerbe", "uid=$wettbewerbe_id"); + + $parameters['row']['uid'] = strpos($parameters['row']['uid'], "NEW") !== false ? "Neuer Eintrag Bitte Sichern" : $parameters['row']['uid']; + + if ($user_id) { + $record = \TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('fe_users', $user_id); + $wettbewerb_label .= '
' . $record['company'] . ''; + } + if ($tstamp_ablehnen || $ist_befangen) { + $tstamp_ablehnen = $tstamp_ablehnen ? date("d. M. Y", $tstamp_ablehnen) : false; + $label_abge = $ist_befangen ? 'Befangen' : 'Abgelehnt am:'; + $wettbewerb_label .= '
' . $label_abge . '' . $tstamp_ablehnen . ''; + } + if ($punkte_id) { + $tstamp_zuordnung = $tstamp_zuordnung ? date("d. M. Y", $tstamp_zuordnung) : false; + $tstamp_aktivierung = $tstamp_aktivierung ? date("d. M. Y", $tstamp_aktivierung) : false; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_punkte'); + $record = $queryBuilder + ->select('tx_zuladungsliste_domain_model_punkte.bezeichnung', 'k.uid', 'k.punkte') + ->from('tx_zuladungsliste_domain_model_punkte') + ->join( + 'tx_zuladungsliste_domain_model_punkte', + 'tx_zuladungsliste_punkte_kriterien_mm', + 'k', + $queryBuilder->expr()->eq('k.uid_punkte', $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_punkte.uid')) + ) + ->where( + $queryBuilder->expr()->eq('k.uid_kriterien', $queryBuilder->createNamedParameter($kriterien_id, \PDO::PARAM_INT)), + $queryBuilder->expr()->eq('k.uid_punkte', $queryBuilder->createNamedParameter($punkte_id, \PDO::PARAM_INT)) + ) + ->execute(); + + while ($row = $record->fetch()) { + $punkte = $row['punkte'] == 0 ? "Keine " : $row['punkte']; + $bezeichnung = $row['bezeichnung']; + } + + $wettbewerb_label .= '
' . $bezeichnung . ' (' . $punkte; + $wettbewerb_label .= $punkte == 1 ? ' Punkt)' : ' Punkte)
'; + if ($punkte != 0) { + if ($tstamp_zuordnung) { + $wettbewerb_label .= '
Zugeordnet am:' . $tstamp_zuordnung . ''; + } + + if ($tstamp_aktivierung) { + $wettbewerb_label .= '
Freigeschaltet am:' . $tstamp_aktivierung . ''; + } + } + + } + } + } else { + $wettbewerb_label = '[Fehler!]'; + } + + $parameters['title'] = '' . $wettbewerb_label . ''; + // $parameters['title'] = '' . $wettbewerb_label . '
' . $kriterium_label . ''; + } +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Backend/Selecting.php b/packages/zuladungsliste/Classes/Backend/Selecting.php new file mode 100644 index 0000000..fbda9c2 --- /dev/null +++ b/packages/zuladungsliste/Classes/Backend/Selecting.php @@ -0,0 +1,68 @@ +getQueryBuilderForTable('tx_zuladungsliste_domain_model_punkte'); + + $resource = $queryBuilder + ->select('tx_zuladungsliste_domain_model_punkte.bezeichnung', 'tx_zuladungsliste_domain_model_punkte.uid', 'k.punkte') + ->from('tx_zuladungsliste_domain_model_punkte') + ->join( + 'tx_zuladungsliste_domain_model_punkte', + 'tx_zuladungsliste_punkte_kriterien_mm', + 'k', + $queryBuilder->expr()->eq('k.uid_punkte', $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_punkte.uid')) + ) + ->where( + $queryBuilder->expr()->eq('k.uid_kriterien', $queryBuilder->createNamedParameter($kriterien_id, \PDO::PARAM_INT)) + ) + ->orderBy('tx_zuladungsliste_domain_model_punkte.sorting') + ->execute() + ->fetchAll(); + + foreach ($resource as $key => $row) { + if ($row['punkte']==0) { + $parameters["items"][] = array($row['bezeichnung'].' (Keine Punkte Zugeordnet)', $row['uid']); + } else { + $parameters["items"][] = array($row['bezeichnung'].' ('.$row['punkte'].' Punkte)', $row['uid']); + } + } + } else { + $parameters["items"][] = array('Punkte für Kriterium fehlen',''); + } + } else { + $parameters["items"][] = array('Wettbewerb auswählen und speichern',''); + } + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/Architekten.php b/packages/zuladungsliste/Classes/Berechnung/Architekten.php new file mode 100644 index 0000000..81d3674 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/Architekten.php @@ -0,0 +1,72 @@ +, NUH-Odds GmbH + * + ***/ + +class Architekten +{ + /** + * @param mixed $uid + * + * @return void + */ + public static function load($uid = 0) + { + + // _Berechnung::$debug = 1; + + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, 'Load Architekten'); + } + + // 2 usergroup => Ordentliche Registrierung zur Zuladungsliste + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('uid', 'disable', 'email', 'name', 'last_name', 'company', 'vereidigung', 'frauenfoerderpunkt', 'solidaritaetserklaerung', 'extrasperrung', 'kontoaufloesung', 'kontoaufloesung_active', 'wettbewerbe', 'kammernid', 'kammermitgliedsnummer', 'gender', 'date_of_birth') + ->from('fe_users') + ->where( + $queryBuilder->expr()->eq('kammernid', (int) _Berechnung::$_config['kammernid']), + $queryBuilder->expr()->eq('pid', (int) _Berechnung::$_config['pid']), + $queryBuilder->expr()->eq('usergroup', (int) _Berechnung::$_config['usergroup']), + ); + + if (is_array($uid)) { + $queryBuilder->andWhere($queryBuilder->expr()->in('uid', $uid)); + } elseif (0 != $uid) { + $queryBuilder->andWhere($queryBuilder->expr()->eq('uid', (int) $uid)); + } + if (0 != _Berechnung::$_config['berechne_bis']) { + $queryBuilder->andWhere('crdate <= ' . _Berechnung::$_config['berechne_bis']); + $date = date('Y-m-d', _Berechnung::$_config['berechne_bis']); + $queryBuilder->andWhere("vereidigung < '$date' or vereidigung IS NULL"); + } + + $statement = $queryBuilder->execute()->fetchAll(); + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + + foreach ($statement as $value) { + _Berechnung::$_data['architekten_uids'][] = $value['uid']; + } + + _Berechnung::$_data['architekten'] = $statement; + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/AufloesungPunkteVerteilung.php b/packages/zuladungsliste/Classes/Berechnung/AufloesungPunkteVerteilung.php new file mode 100644 index 0000000..7976937 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/AufloesungPunkteVerteilung.php @@ -0,0 +1,164 @@ +, NUH-Odds GmbH + * + ***/ + +class AufloesungPunkteVerteilung +{ + /** + * @return void + */ + public static function manage() + { + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, 'Manage Auflösung Punkte Verteilung'); + } + + // 2 usergroup => Ordentliche Registrierung zur Zuladungsliste + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder->select('uid')->from('fe_users') + ->where($queryBuilder->expr()->isNotNull('kontoaufloesung_active')); + if(_Berechnung::$_config['berechne_bis'] != 0) + { + $date = date('Y-m-d', _Berechnung::$_config['berechne_bis']); + $queryBuilder->andWhere("kontoaufloesung_active < '$date'"); + } + $statement = $queryBuilder->execute()->fetchAll(); + + // Message::note($queryBuilder->getSQL()); + // exit; + + + $_geber = []; + if(count($statement)){ + foreach ($statement as $value) { + $_geber[] = $value['uid']; + } + } + + if(count($_geber) == 0){ + return; + } + + $_geber_list = implode($_geber, ","); + + // echo $_geber_list; + // exit; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_konto_aufloesung_mm'); + $statement = $queryBuilder + ->select('uid_geber', ' uid_empfaenger', ' prozente') + ->from('tx_zuladungsliste_konto_aufloesung_mm') + ->where( + $queryBuilder->expr()->gt('prozente', (int) 0), + $queryBuilder->expr()->in('uid_geber', $_geber_list) + )->execute()->fetchAll(); + + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + + $verteiler_arr = []; + foreach ($statement as $key => $value) { + $uid = $value['uid_geber']; + $verteiler_arr[$uid][] = $value; + } + + foreach ($verteiler_arr as $uid_geber => $empfaener_arr) { + $frauenpunkt_abgezogen = ''; + $neueinsteigerpunkt_abgezogen = ''; + $solidaritaetserklaerung_abgezogen = ''; + + foreach (_Berechnung::$_data['liste'] as $key_geber => $_value_liste) { + if ($_value_liste['user_id'] == $uid_geber) { + + $geber_punkte = $_value_liste['punkte']; + if ($geber_punkte > 0) { + $geber_company = $_value_liste['company']; + + _Berechnung::$_data['liste'][$key_geber]['company'] .= ' ( Kontoauflösung '._Berechnung::$_data['liste'][$key_geber]['kontoaufloesung_active'].')'; + _Berechnung::$_data['liste'][$key_geber]['punkte'] = 0; + _Berechnung::$_data['liste'][$key_geber]['nominiert'] = 0; + _Berechnung::$_data['liste'][$key_geber]['auswertung']['wettbewerbe']['punkte'] = 0; + _Berechnung::$_data['liste'][$key_geber]['auswertung']['neueinsteigerpunkt']['punkte'] = 0; + if (1 == _Berechnung::$_data['liste'][$key_geber]['auswertung']['frauenfoerderpunkt']['punkte']) { + $frauenpunkt_abgezogen = ', Frauenförderpunkt wurde abgezogen'; + --$geber_punkte; + _Berechnung::$_data['liste'][$key_geber]['auswertung']['frauenfoerderpunkt']['punkte'] = 0; + } + if (1 == _Berechnung::$_data['liste'][$key_geber]['auswertung']['neueinsteigerpunkt']['punkte']) { + $neueinsteigerpunkt_abgezogen = ', Neueinsteigerpunkt wurde abgezogen'; + --$geber_punkte; + _Berechnung::$_data['liste'][$key_geber]['auswertung']['neueinsteigerpunkt']['punkte'] = 0; + } + if (1 == _Berechnung::$_data['liste'][$key_geber]['auswertung']['solidaritaetserklaerung']['punkte']) { + $solidaritaetserklaerung_abgezogen = ', Solidaritätserklärungspunkt wurde abgezogen'; + --$geber_punkte; + _Berechnung::$_data['liste'][$key_geber]['auswertung']['solidaritaetserklaerung']['punkte'] = 0; + } + + foreach ($empfaener_arr as $key => $_empfaenger) { + $uid_empfaenger = $_empfaenger['uid_empfaenger']; + $prozente = $_empfaenger['prozente']; + + // SET EMPFÄNGER + foreach (_Berechnung::$_data['liste'] as $key => $value) { + if ($value['user_id'] == $uid_empfaenger) { + // if($uid_empfaenger==326){ + // print_r(_Berechnung::$_data['liste'][$key]); + // exit; + // } + $punkte_empf_anteil = round($geber_punkte * ($prozente / 100), 2); + if(_Berechnung::$_data['liste'][$key]['gesperrt'] == 0) + { + _Berechnung::$_data['liste'][$key]['nominiert'] = 1; + } + _Berechnung::$_data['liste'][$key]['punkte'] = _Berechnung::$_data['liste'][$key]['punkte'] + $punkte_empf_anteil; + _Berechnung::$_data['liste'][$key]['istempfaenger'] = '1'; + _Berechnung::$_data['liste'][$key]['auswertung']['wettbewerbe']['punkte'] += $punkte_empf_anteil; + _Berechnung::$_data['liste'][$key]['auswertung']['wettbewerbe'][] = [ + 'wettbewerb' => "$prozente% von Kontoauflösung " . $frauenpunkt_abgezogen . $neueinsteigerpunkt_abgezogen . $solidaritaetserklaerung_abgezogen, + 'verfahrensid' => '', + 'verfahrensort' => '', + 'entscheidungstermin' => '', + 'mit_sperrung' => '', + 'punkte' => $punkte_empf_anteil, + 'bezeichnung' => '', + 'bezeichnung_punkte' => '', + 'regelwerk' => '', + 'monate_seit_entscheidungstermin' => '', + 'punkte_aktive' => '', + 'gueltig_bis' => '', + 'von_transfer' => $geber_company, + ]; + } + } + } + // unset geber punkte + unset(_Berechnung::$_data['liste'][$key_geber]); + } + } + } + } + + // print_r(_Berechnung::$_data['liste']); + // exit; + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/Erfolgspunkte.php b/packages/zuladungsliste/Classes/Berechnung/Erfolgspunkte.php new file mode 100644 index 0000000..d0a081a --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/Erfolgspunkte.php @@ -0,0 +1,214 @@ +, NUH-Odds GmbH + * + ***/ + +class Erfolgspunkte +{ + /** + * @return string + */ + public static function load_user($_liste, $user_objekt) + { + // _Berechnung::$debug = 1; + + if (_Berechnung::$debug) { + Message::debug( + __FILE__, + __LINE__, + "Erfolgspunkte" + ); + } + + if (!isset(_Berechnung::$_data['sektionstage'])) { + Sektionstage::load(); + } + + // _Berechnung::$_config['berechne_bis'] = mktime(0, 0, 0, 7, 15, 2021); + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe'); + $queryBuilder + ->select( + 'tx_zuladungsliste_domain_model_wettbewerbe.uid', + 'tx_zuladungsliste_domain_model_wettbewerbe.wettbewerb', + 'tx_zuladungsliste_domain_model_wettbewerbe.verfahrensid', + 'tx_zuladungsliste_domain_model_wettbewerbe.verfahrensort', + 'tx_zuladungsliste_domain_model_wettbewerbe.entscheidungstermin', + 'tx_zuladungsliste_domain_model_wettbewerbe.abgabetermin', + 'tx_zuladungsliste_domain_model_wettbewerbe.sperre_deaktiviert', + 'b.ladung_durch_auslober', + 'c.punkte', + 'd.sperrung AS mit_sperrung', + 'd.bezeichnung', + 'e.bezeichnung AS bezeichnung_punkte' + ) + ->from('tx_zuladungsliste_domain_model_wettbewerbe') + ->leftJoin( + 'tx_zuladungsliste_domain_model_wettbewerbe', + 'tx_zuladungsliste_wettbewerbe_architekten_mm', + 'b', + $queryBuilder->expr()->eq( + 'b.uid_wettbewerbe', + $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_wettbewerbe.uid') + ) + ) + ->leftJoin( + 'b', + 'tx_zuladungsliste_punkte_kriterien_mm', + 'c', + $queryBuilder->expr()->eq( + 'c.uid_punkte', + $queryBuilder->quoteIdentifier('b.uid_punkte') + ) + )->leftJoin( + 'tx_zuladungsliste_domain_model_wettbewerbe', + 'tx_zuladungsliste_domain_model_kriterien', + 'd', + $queryBuilder->expr()->eq( + 'd.uid', + $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_wettbewerbe.kriteriumid') + ) + )->leftJoin( + 'c', + 'tx_zuladungsliste_domain_model_punkte', + 'e', + $queryBuilder->expr()->eq( + 'e.uid', + $queryBuilder->quoteIdentifier('c.uid_punkte') + ) + ) + ->where( + $queryBuilder->expr()->eq('c.uid_kriterien', 'tx_zuladungsliste_domain_model_wettbewerbe.kriteriumid'), + $queryBuilder->expr()->eq('b.tstamp_ablehnen', 0), + $queryBuilder->expr()->gt('b.tstamp_aktivierung', 0), + $queryBuilder->expr()->eq('b.uid_user', (int) $user_objekt['uid']) + ) + ->groupBy('tx_zuladungsliste_domain_model_wettbewerbe.verfahrensid') + ->orderBy('tx_zuladungsliste_domain_model_wettbewerbe.uid','DESC'); + + if (_Berechnung::$_config['berechne_bis'] != 0) { + $date = date("Y-m-d", _Berechnung::$_config['berechne_bis']); + $queryBuilder->andWhere("b.tstamp_aktivierung <= " . _Berechnung::$_config['berechne_bis']); + $queryBuilder->andWhere("tx_zuladungsliste_domain_model_wettbewerbe.entscheidungstermin < '$date'"); + } + + $statement = $queryBuilder->execute()->fetchAll(); + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + + $_liste["gesperrt_bis"] = 0; + $_liste["kommentar"] = 0; + $_liste["gesperrt"] = 0; + $_liste["nominiert"] = 1; + + $_return_sort = []; + foreach ($statement as $key => $row) { + + if ((int) $row["entscheidungstermin"] > 0) { + $entscheidungstermin = strtotime($row["entscheidungstermin"]); + $datetime2 = new \DateTime($row["entscheidungstermin"]); + } else { + $entscheidungstermin = strtotime($row["abgabetermin"]); + $datetime2 = new \DateTime($row["abgabetermin"]); + } + + // Message::note($row['wettbewerb']); + $_sektionstag = Sektionstage::filter($entscheidungstermin); + + $datetime1 = new \DateTime(); + if (_Berechnung::$_config['berechne_bis'] != 0) { + $datetime1->setTimestamp(_Berechnung::$_config['berechne_bis']); + } + $interval = $datetime1->diff($datetime2); + $monate_seit_entscheidungstermin = $interval->m + ($interval->y * 12); + + $row["regelwerk"] = $_sektionstag["bezeichnung"]; + $row["monate_seit_entscheidungstermin"] = $monate_seit_entscheidungstermin; + + // PUNKTE GÜLTIGKEIT + $row["punkte_aktive"] = $monate_seit_entscheidungstermin <= $_sektionstag["punktezeit"] ? 1 : 0; + + if ($row["punkte_aktive"] == 1) { + $_liste["punkte"] = $_liste["punkte"] + $row["punkte"]; + } + + $datetime3 = clone $datetime2; + $datetime3->modify("+" . $_sektionstag["punktezeit"] . " months"); + $row["gueltig_bis"] = date("d.m.Y", $datetime3->format("U")); + $row["wettbewerb_sort"] = $datetime3->format("U"); + + // SPERRZEIT + if ($row["mit_sperrung"] and $row["sperre_deaktiviert"] == 0) { + if ($row['ladung_durch_auslober'] == 1) { + // Active Sperrzeit wird auf 9 Monate verkürzt + $_sektionstag["sperrzeit"] = 9; + } + $row["sperrung_aktive"] = $monate_seit_entscheidungstermin <= $_sektionstag["sperrzeit"] ? 1 : 0; + $datetime2->modify("+" . $_sektionstag["sperrzeit"] . " months"); + $row["gesperrt_bis"] = date("d.m.Y", $datetime2->format("U")); + + $_liste['controll']['gesperrt_bis'] = $row["gesperrt_bis"]; + $_liste['controll']['sperrung_aktive'] = $datetime2->format("U"); + $_liste['controll']['berechne_bis'] = _Berechnung::$_config['berechne_bis']; + + // salam 28.4.2022 + $sperreZeitLimit = (_Berechnung::$_config['berechne_bis'] != 0) ? _Berechnung::$_config['berechne_bis'] : time(); + + if ($row["sperrung_aktive"] and $datetime2->format("U") > $sperreZeitLimit) { + + // echo "\n"; + // echo $row["gesperrt_bis"]; + // echo "\n"; + // echo $_liste["gesperrt_bis"]; + // echo "\n"; + // exit; + + + if ($_liste["gesperrt_bis"] != "" and $row["gesperrt_bis"] != "") { + + $tmp1 = new \DateTime($row["gesperrt_bis"]); + $tmp2 = new \DateTime($_liste["gesperrt_bis"]); + + if ($tmp1 > $tmp2) + $_liste["gesperrt_bis"] = $row["gesperrt_bis"]; + } else { + $_liste["gesperrt_bis"] = $row["gesperrt_bis"]; + } + if ($row['ladung_durch_auslober'] == 1) { + $_liste["kommentar"] = $row["wettbewerb"] . ' (Ladung durch Auslober/in, Sperrzeit wird auf 9 Monate verkürzt)'; + } else { + $_liste["kommentar"] = $row["wettbewerb"]; + } + $_liste["gesperrt"] = 1; + $_liste["nominiert"] = 0; + } + } + $_return_sort[] = $row; + } + + if ($_return_sort) { + $wettbewerb_sort = array_column($_return_sort, 'wettbewerb_sort'); + array_multisort($wettbewerb_sort, SORT_DESC, $_return_sort); + } + + // WETTBEWERBE ERFOLGSPUNKTE + $_liste["auswertung"]["wettbewerbe"] = $_return_sort; + + return $_liste; + } +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Berechnung/Frauen.php b/packages/zuladungsliste/Classes/Berechnung/Frauen.php new file mode 100644 index 0000000..b7e63c2 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/Frauen.php @@ -0,0 +1,78 @@ +, NUH-Odds GmbH + * + ***/ + +class Frauen +{ + /** + * @return void + */ + public static function load($_liste, $user_objekt) + { + if (_Berechnung::$debug) { + Message::debug(__file__, __line__, "Load Frauen Förderungs Punkt"); + } + + // FRAUEN FÖRDERUNGS PUNKT + // $_liste["auswertung"]["frauenfoerderpunkt"] = Frauen::load($_liste, $user_objekt, $_liste["punkte"]); + // $_liste["punkte"] += $_liste["auswertung"]["frauenfoerderpunkt"]["punkte"]; + + + + if ($user_objekt["frauenfoerderpunkt"]==0) { + $_liste["auswertung"]["frauenfoerderpunkt"]['punkte'] = 0; + $_liste["auswertung"]["frauenfoerderpunkt"]['kommentar'] = "Kein Anspruch"; + return $_liste; + } else { + // Frauenförderung ohne Punkte immer Gültig + if ($_liste["punkte"] > 0) { + $_liste["auswertung"]["frauenfoerderpunkt"]['punkte'] = 1; + $_liste["auswertung"]["frauenfoerderpunkt"]['kommentar'] = "Punktestand > 0; Punkt gültig"; + $_liste["punkte"]++; + return $_liste; + } + + $vereidigung = strtotime($user_objekt["vereidigung"]); + $sektionstag = Sektionstage::filter($vereidigung); + + $frauenfoerderung_monate = $sektionstag["frauenfoerderung"]; + + $datetime1 = new \DateTime(); + if (_Berechnung::$_config['berechne_bis'] != 0) { + $datetime1->setTimestamp(_Berechnung::$_config['berechne_bis']); + } + $datetime2 = new \DateTime($user_objekt["vereidigung"]); + + $interval = $datetime1->diff($datetime2); + $monate_seit_vereidigung = $interval->m + ($interval->y * 12); + + if ($monate_seit_vereidigung < $frauenfoerderung_monate) { + $monate = $frauenfoerderung_monate-$monate_seit_vereidigung; + + $_liste["auswertung"]["frauenfoerderpunkt"]['punkte'] = 1; + $_liste["auswertung"]["frauenfoerderpunkt"]['kommentar'] = "Frauenförderung ohne Punkte noch $monate Monate gültig"; + $_liste["punkte"]++; + } else { + $_liste["auswertung"]["frauenfoerderpunkt"]['punkte'] = 0; + $_liste["auswertung"]["frauenfoerderpunkt"]['kommentar'] = "Keine Einreichungen, Zeitspanne seit Vereidigung größer als 5 Jahre, Punkt ist verfallen"; + } + + return $_liste; + } + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/Neueinsteiger.php b/packages/zuladungsliste/Classes/Berechnung/Neueinsteiger.php new file mode 100644 index 0000000..5d21c29 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/Neueinsteiger.php @@ -0,0 +1,75 @@ +, NUH-Odds GmbH + * + ***/ + +class Neueinsteiger +{ + /** + * @param mixed $_liste + * @param mixed $user_objekt + * + * @return void + */ + public static function load($_liste, $user_objekt) + { + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, 'Load NeueinsteigerPunkt'); + } + + if ($user_objekt['vereidigung'] == "") { + $_liste['auswertung']['neueinsteigerpunkt']['punkte'] = 0; + $_liste['auswertung']['neueinsteigerpunkt']['kommentar'] = 'Kein Vereidigungsdatum verfügbar'; + + return $_liste; + } + + $vereidigung = strtotime($user_objekt['vereidigung']); + $_sektionstag = Sektionstage::filter($vereidigung); + + $datetime1 = new \DateTime(); + if (0 != _Berechnung::$_config['berechne_bis']) { + $datetime1->setTimestamp(_Berechnung::$_config['berechne_bis']); + } + $datetime2 = new \DateTime($user_objekt['vereidigung']); + + $interval = $datetime1->diff($datetime2); + $monate_seit_vereidigung = $interval->m + ($interval->y * 12); + + if ($monate_seit_vereidigung > $_sektionstag['neueinsteiger']) { + $_liste['auswertung']['neueinsteigerpunkt']['punkte'] = 0; + $_liste['auswertung']['neueinsteigerpunkt']['kommentar'] = 'Neueinsteigerpunkt ist verfallen. Vereidigung '.$user_objekt['vereidigung']; + + return $_liste; + } + + $jahre_seit_vereidigung = $interval->y; + + if ($jahre_seit_vereidigung < 5) { + $neueinsteigerpunkt = 5 - $jahre_seit_vereidigung; + $datetime2->modify('+5 year'); + + $_liste['auswertung']['neueinsteigerpunkt']['punkte'] = $neueinsteigerpunkt; + $_liste['punkte'] = $_liste['punkte'] + $neueinsteigerpunkt; + $_liste['auswertung']['neueinsteigerpunkt']['kommentar'] = 'Neueinsteigerpunkt Vereidigung '.$user_objekt['vereidigung']; + $_liste['auswertung']['neueinsteigerpunkt']['gueltig_bis'] = $datetime2->format('Y-m-d'); + } else { + $_liste['auswertung']['neueinsteigerpunkt']['punkte'] = 0; + $_liste['auswertung']['neueinsteigerpunkt']['kommentar'] = 'Neueinsteigerpunkt ist verfallen. Vereidigung '.$user_objekt['vereidigung']; + } + + return $_liste; + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/PunkteKriterien.php b/packages/zuladungsliste/Classes/Berechnung/PunkteKriterien.php new file mode 100644 index 0000000..a746eac --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/PunkteKriterien.php @@ -0,0 +1,62 @@ +, NUH-Odds GmbH + * + ***/ + +class PunkteKriterien +{ + public static function load() + { + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, 'Load Punkte Kriterien'); + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_punkte_kriterien_mm'); + $queryBuilder + ->select( + 'tx_zuladungsliste_punkte_kriterien_mm.uid', + 'tx_zuladungsliste_punkte_kriterien_mm.uid_punkte', + 'tx_zuladungsliste_punkte_kriterien_mm.uid_kriterien', + 'tx_zuladungsliste_punkte_kriterien_mm.punkte', + 'a.bezeichnung AS bezeichnung_punkte', + 'b.bezeichnung AS bezeichnung_kritierien' + )->from('tx_zuladungsliste_punkte_kriterien_mm') + ->join( + 'tx_zuladungsliste_punkte_kriterien_mm', + 'tx_zuladungsliste_domain_model_punkte', + 'a', + $queryBuilder->expr()->eq('a.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_punkte_kriterien_mm.uid_punkte')) + ) + ->join( + 'tx_zuladungsliste_punkte_kriterien_mm', + 'tx_zuladungsliste_domain_model_kriterien', + 'b', + $queryBuilder->expr()->eq('b.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_punkte_kriterien_mm.uid_kriterien')) + ); + + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + $tmp = $queryBuilder->execute()->fetchAll(); + $return = []; + foreach ($tmp as $key => $value) + { + $return[$value['uid_punkte']][$value['uid_kriterien']] = $value; + } + return $return; + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/PunkteVerschiebung.php b/packages/zuladungsliste/Classes/Berechnung/PunkteVerschiebung.php new file mode 100644 index 0000000..2e94b00 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/PunkteVerschiebung.php @@ -0,0 +1,168 @@ +, NUH-Odds GmbH + * + ***/ + +class PunkteVerschiebung +{ + /** + * @return array + */ + public static function load() + { + // _Berechnung::$debug = 1; + + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, "Punkte Verschiebung"); + } + + // 2 usergroup => Ordentliche Registrierung zur Zuladungsliste + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_punkte_verschiebung_mm'); + $statement = $queryBuilder + ->select("a.company", "tx_zuladungsliste_punkte_verschiebung_mm.uid_geber", "tx_zuladungsliste_punkte_verschiebung_mm.uid_empfaenger", "tx_zuladungsliste_punkte_verschiebung_mm.verschiebung_ab", "tx_zuladungsliste_punkte_verschiebung_mm.verschiebung_stichtag", "tx_zuladungsliste_punkte_verschiebung_mm.prozente") + ->from('tx_zuladungsliste_punkte_verschiebung_mm') + ->join( + 'tx_zuladungsliste_punkte_verschiebung_mm', + 'fe_users', + 'a', + $queryBuilder->expr()->eq('a.uid', 'tx_zuladungsliste_punkte_verschiebung_mm.uid_empfaenger') + ) + ->orderBy('verschiebung_stichtag'); + + $statement = $queryBuilder->execute()->fetchAll(); + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + + return $statement; + } + + /** + * @return void + */ + public static function manage() + { + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, 'Manage Auflösung Punkte Verteilung'); + } + + $_punkte_geber = self::load(); + if (!$_punkte_geber) { + return; + } + + foreach (_Berechnung::$_data['liste'] as $key => $_value_liste) { + foreach ($_punkte_geber as $geber) { + if ($_value_liste['user_id'] == $geber['uid_geber']) { + + if($geber['verschiebung_ab'] <= _Berechnung::$_config['berechne_bis_datum']){ + + // echo "\n" . _Berechnung::$_data['liste'][$key]['punkte']; + + $punkte_zu_verschieben = self::collectPunkte($geber, $_value_liste); + + // nur aufführen wenn noch Punkte übrig sind und der Emfänger schon existiert (für berechnung des Archieves) + if ($punkte_zu_verschieben > 0 and in_array($geber['uid_empfaenger'], _Berechnung::$_data['architekten_uids'])) { + // GEBER + _Berechnung::$_data['liste'][$key]['punkte'] = _Berechnung::$_data['liste'][$key]['punkte'] - $punkte_zu_verschieben; + $tmp = []; + $tmp['punkte'] = $punkte_zu_verschieben; + $tmp['kommentar'] = $geber['company']; + $tmp['prozente'] = $geber['prozente']; + $tmp['verschiebung_stichtag'] = $geber['verschiebung_stichtag']; + $tmp['verschiebung_ab'] = $geber['verschiebung_ab']; + _Berechnung::$_data['liste'][$key]['auswertung']['verschiebung_gegeben'][] = $tmp; + + // EMPFÄNGER + $tmp = []; + $tmp['punkte'] = $punkte_zu_verschieben; + $tmp['kommentar'] = $_value_liste['company']; + $tmp['prozente'] = $geber['prozente']; + $tmp['verschiebung_stichtag'] = $geber['verschiebung_stichtag']; + $tmp['verschiebung_ab'] = $geber['verschiebung_ab']; + self::addToEmpfaenger($geber, $tmp); + } + } + } + } + } + } + + /** + * @return void + * "id": 61, + */ + public static function addToEmpfaenger(&$geber, $tmp) + { + foreach (_Berechnung::$_data['liste'] as $key => $_value_liste) { + if ($_value_liste['user_id'] == $geber['uid_empfaenger']) { + if(_Berechnung::$_data['liste'][$key]['gesperrt'] == 0){ + _Berechnung::$_data['liste'][$key]['nominiert'] = 1; + } + _Berechnung::$_data['liste'][$key]['auswertung']['verschiebung_empfangen'][] = $tmp; + _Berechnung::$_data['liste'][$key]['punkte'] = _Berechnung::$_data['liste'][$key]['punkte'] + $tmp['punkte']; + } + } + } + + /** + * @return int + */ + public static function collectPunkte(&$geber, &$_value_liste) + { + $debug = 0; + // print_r($_value_liste['auswertung']['wettbewerbe']); + if($debug){ + // print_r($geber); + echo PHP_EOL; + echo _Berechnung::$_config['berechne_bis_datum']; + echo PHP_EOL; + $punkte2 = 0; + $punkte = 0; + } + + foreach ($_value_liste['auswertung']['wettbewerbe'] as $value) { + + // print_r($value); + + if ($value["punkte_aktive"] == 1){ + $punkte2 += $value['punkte']; + } + + if ($value["punkte_aktive"] == 1 and $value['entscheidungstermin'] < $geber['verschiebung_stichtag']) { + if($debug){ + echo "\n" . '"' . $value['wettbewerb'] . '","' . $value['entscheidungstermin'] . '","' . $value['gueltig_bis'] . '","' . number_format($value['punkte'], 2, ',','.') . '"'; + } + $punkte += $value['punkte']; + } + } + if($debug){ + // echo "\n"; + // echo "\n"; + echo "\n"; + echo "\n"; + echo "Punkte zum Verschieben: " . $punkte . "\n"; + echo "\n"; + echo "Punkte aktuell: " . $punkte2 . "\n"; + echo "\n"; + echo "Punkte prozentueller Anteil: " . round($punkte * ($geber['prozente'] / 100), 2); + exit; + } + return round($punkte * ($geber['prozente'] / 100), 2); + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/Sektionstage.php b/packages/zuladungsliste/Classes/Berechnung/Sektionstage.php new file mode 100644 index 0000000..c0da826 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/Sektionstage.php @@ -0,0 +1,105 @@ +, NUH-Odds GmbH + * + ***/ + +class Sektionstage +{ + /** + * @return void + */ + public static function load() + { + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, "Lade Sektionstage"); + } + + // 2 usergroup => Ordentliche Registrierung zur Zuladungsliste + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_sektionstage'); + $statement = $queryBuilder + ->select("bezeichnung", "stichtag", "sperrzeit", "sperrzeitstart", "punktezeit", "punktezeitstart", "neueinsteiger", "neueinsteigerstart", "frauenfoerderung", "frauenfoerderungstart", "frauenfoerderungsonderstart", "kammernid") + ->from('tx_zuladungsliste_domain_model_sektionstage') + ->where( + $queryBuilder->expr()->eq('kammernid', (int) _Berechnung::$_config['kammernid']) + ); + + if (_Berechnung::$_config['berechne_bis'] != 0) { + $date = date("Y-m-d", _Berechnung::$_config['berechne_bis']); + $queryBuilder->andWhere("stichtag < '" . $date . "'"); + } + + $statement = $queryBuilder->execute()->fetchAll(); + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + + $_arr = []; + foreach ($statement as $key => $value) { + $stichtag = strtotime(trim($value['stichtag'])); + $_arr[$stichtag] = $value; + } + ksort($_arr); + _Berechnung::$_data['sektionstage'] = $_arr; + } + + /** + * @return array + */ + public static function filter($entscheidungstermin) + { + // echo "\nEntscheidungstermin: " . date("d. m. Y", $entscheidungstermin) , "\n"; + $_sektionstage = _Berechnung::$_data['sektionstage']; + foreach ($_sektionstage as $stichtag => $_stichtagdetails) { + if ($entscheidungstermin <= $stichtag) { + // print_r($_stichtagdetails); + return $_stichtagdetails; + } + } + // print_r($_stichtagdetails); + return $_stichtagdetails; + } +// public static function filter($stichtag) +// { + +// // krsort(_Berechnung::$_data['sektionstage'], SORT_NUMERIC); +// echo "\nSTICHTAG: " . date("d. m. Y", $stichtag); +// echo "\n"; +// $_stichtagdetails = []; +// foreach (_Berechnung::$_data['sektionstage'] as $entscheidungstermin => $_stichtagdetails) { +// // echo "\nENTSCHEIDUNGSTERMIN: " . date("d. m. Y", $entscheidungstermin); +// if ($stichtag < $entscheidungstermin) { +// return $_stichtagdetails; +// } +// } +// // echo "\nHERE"; +// // echo "\nENTSCHEIDUNGSTERMIN: " . date("d. m. Y", $entscheidungstermin); +// print_r($_stichtagdetails); +// return $_stichtagdetails; +// } +// public static function filter($stichtag) +// { +// $_stichtagdetails = []; +// $entscheidungstermin = 0; +// foreach (_Berechnung::$_data['sektionstage'] as $stichtag => $_stichtagdetails) { +// if ($entscheidungstermin >= $stichtag) { +// return $_stichtagdetails; +// } +// } +// return array_shift(array_slice(_Berechnung::$_data['sektionstage'], 0, 1)); +// } +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Berechnung/Solidaritaetserklaerung.php b/packages/zuladungsliste/Classes/Berechnung/Solidaritaetserklaerung.php new file mode 100644 index 0000000..d64a407 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/Solidaritaetserklaerung.php @@ -0,0 +1,43 @@ +, NUH-Odds GmbH + * + ***/ + +class Solidaritaetserklaerung +{ + /** + * @return void + */ + public static function filter($_liste, $user_objekt) + { + if (_Berechnung::$debug) { + Message::debug(__file__, __line__, "Filter Solidaritaetserklaerung"); + } + // Datum Start SOLIDARITÄTSERKLÄRUNG ab 15. Juni "2021" + if (_Berechnung::$_config['berechne_bis'] == 0 or _Berechnung::$_config['berechne_bis'] > mktime(0, 0, 0, 6, 15, 2021)) { + if ($user_objekt["solidaritaetserklaerung"]==0) { + $_liste["auswertung"]["solidaritaetserklaerung"]["kommentar"] = "Solidaritätserklärung nicht zugestimmt"; + $_liste["auswertung"]["solidaritaetserklaerung"]["punkte"] = 0; + } else { + $_liste["auswertung"]["solidaritaetserklaerung"]["kommentar"] = "Solidaritätserklärung zugestimmt"; + $_liste["auswertung"]["solidaritaetserklaerung"]["punkte"] = 1; + $_liste["punkte"]++; + } + } + return $_liste; + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/Sondersperrungen.php b/packages/zuladungsliste/Classes/Berechnung/Sondersperrungen.php new file mode 100644 index 0000000..37072ef --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/Sondersperrungen.php @@ -0,0 +1,98 @@ +, NUH-Odds GmbH + * + ***/ + +class Sondersperrungen +{ + /** + * @return void + */ + public static function load() + { + // _Berechnung::$debug = 1; + + if (_Berechnung::$debug) { + Message::debug( + __FILE__, + __LINE__, + "Load ListeBerechnung" + ); + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_extrasperrung'); + $statement = $queryBuilder + ->select('tx_zuladungsliste_domain_model_extrasperrung.begruendung', 'tx_zuladungsliste_domain_model_extrasperrung.sperrzeitbis', 'b.uid_user', 'c.company') + ->from('tx_zuladungsliste_domain_model_extrasperrung') + ->join( + 'tx_zuladungsliste_domain_model_extrasperrung', + 'tx_zuladungsliste_extrasperrung_user_mm', + 'b', + $queryBuilder->expr()->eq('b.uid_extrasperrung', $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_extrasperrung.uid')) + ) + ->join( + 'b', + 'fe_users', + 'c', + $queryBuilder->expr()->eq('c.uid', $queryBuilder->quoteIdentifier('b.uid_user')) + ) + ->where( + $queryBuilder->expr()->eq('c.kammernid', _Berechnung::$_config['kammernid']) + )->execute()->fetchAll(); + + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + + $_sondersperrungen = []; + foreach ($statement as $key => $value) { + $uid_user = $value['uid_user']; + $value['sperrzeitbis_timestamp'] = strtotime($value['sperrzeitbis']); + $_sondersperrungen[$uid_user][] = $value; + } + _Berechnung::$_data['sondersperrungen'] = $_sondersperrungen; + } + + /** + * @return void + */ + public static function filter($_liste, $user_objekt) + { + $sperrzeitbis = 0; + $user_id = $user_objekt["uid"]; + if (isset(_Berechnung::$_data['sondersperrungen'][$user_id])) { + foreach (_Berechnung::$_data['sondersperrungen'][$user_id] as $key => $value_sperrung) { + $brechnen_bis = _Berechnung::$_config['berechne_bis']; + $brechnen_bis = !$brechnen_bis ? time() : $brechnen_bis; + if ($brechnen_bis < $value_sperrung["sperrzeitbis_timestamp"] + and $data["gesperrt_bis"] < $value_sperrung["sperrzeitbis"] + and $value_sperrung["sperrzeitbis"] > $sperrzeitbis) { + // $return["gesperrt_bis"] = $value_sperrung["sperrzeitbis_timestamp"]; + $sperrzeitbis = $value_sperrung["sperrzeitbis"]; + $data = []; + $data["gesperrt"] = 1; + $data["gesperrt_bis"] = $value_sperrung["sperrzeitbis"]; + $data["kommentar"] = $value_sperrung["begruendung"]; + $_liste["auswertung"]['sondersperrungen']['data'] = $data; + $_liste["gesperrt_bis"] = $value_sperrung["sperrzeitbis"]; + $_liste["nominiert"] = 0; + } + } + } + return $_liste; + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/WettbewerbeArchitekten.php b/packages/zuladungsliste/Classes/Berechnung/WettbewerbeArchitekten.php new file mode 100644 index 0000000..d7253b5 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/WettbewerbeArchitekten.php @@ -0,0 +1,63 @@ +, NUH-Odds GmbH + * + ***/ + +class WettbewerbeArchitekten +{ + /** + * @return void + */ + public static function load() + { + if (_Berechnung::$debug) { + Message::debug(__FILE__, __LINE__, 'Load Wettbewerbe Architekten'); + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder + ->select( + 'tx_zuladungsliste_wettbewerbe_architekten_mm.uid AS uid_wettarch', + 'tx_zuladungsliste_wettbewerbe_architekten_mm.uid_wettbewerbe', + 'tx_zuladungsliste_wettbewerbe_architekten_mm.uid_user', + 'tx_zuladungsliste_wettbewerbe_architekten_mm.uid_punkte', + 'tx_zuladungsliste_wettbewerbe_architekten_mm.tstamp_zuordnung', + 'tx_zuladungsliste_wettbewerbe_architekten_mm.tstamp_aktivierung', + 'tx_zuladungsliste_wettbewerbe_architekten_mm.tstamp_ablehnen', + 'a.wettbewerb', + 'a.bundesland', + 'a.entscheidungstermin', + 'a.abgabetermin', + 'a.kriteriumid' + ) + ->from('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->join( + 'tx_zuladungsliste_wettbewerbe_architekten_mm', + 'tx_zuladungsliste_domain_model_wettbewerbe', + 'a', + $queryBuilder->expr()->eq('a.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_wettbewerbe_architekten_mm.uid_wettbewerbe')) + )->where( + $queryBuilder->expr()->gt('tx_zuladungsliste_wettbewerbe_architekten_mm.uid_punkte', 0), + // $queryBuilder->expr()->eq('tx_zuladungsliste_wettbewerbe_architekten_mm.uid_wettbewerbe', 729) + ); + + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + return $queryBuilder->execute()->fetchAll(); + } +} diff --git a/packages/zuladungsliste/Classes/Berechnung/_Berechnung.php b/packages/zuladungsliste/Classes/Berechnung/_Berechnung.php new file mode 100644 index 0000000..7d42d43 --- /dev/null +++ b/packages/zuladungsliste/Classes/Berechnung/_Berechnung.php @@ -0,0 +1,287 @@ +, NUH-Odds GmbH + * + ***/ + +class _Berechnung +{ + public static $_return = []; + public static $_data = []; + public static $_config = []; + public static $debug = 0; + + /** + * @return string + */ + public function __construct($berechne_bis = 0) + { + self::$debug = 0; + + // $berechne_bis = mktime(0, 0, 0, 6, 15, 2023); + + self::$_data = []; + $user = $GLOBALS['TSFE']->fe_user->user; + self::$_config['pid'] = 41; // Ordner ID der gültigen Architeken + self::$_config['kammernid'] = 1; // Kammer ID is fixed to Steiermarkfor now + self::$_config['userid'] = $user['uid']; + self::$_config['usergroup'] = 2; // 2 => Ordentliche Registrierung zur Zuladungsliste + self::$_config['liste_start'] = mktime(0, 0, 0, 6, 15, 2017); // 15 July 2017 12:00:00 AM CEST + + if ($berechne_bis) { + self::$_config['berechne_bis'] = $berechne_bis; + } else { + self::$_config['berechne_bis'] = 0; + } + + // self::$_config['berechne_bis'] = 1707748093; + + if(self::$_config['berechne_bis']) + _Berechnung::$_config['berechne_bis_datum'] = date('Y-m-d', _Berechnung::$_config['berechne_bis']); + else + _Berechnung::$_config['berechne_bis_datum'] = date('Y-m-d'); + } + + /** + * @return string + */ + public static function berechnen() + { + self::$_data = []; + + self::$debug = 0; + + Sondersperrungen::load(); + + // controllo = 0 => all + $architekt_uid = 0; + // $architekt_uid = [326,259]; + // $architekt_uid = [280,244]; + // $architekt_uid = [132, 366]; + + Architekten::load($architekt_uid); + + // print_r(self::$_data); exit; + + Sektionstage::load(); + + foreach (self::$_data['architekten'] as $key => $user_objekt) { + $_liste = []; + $_liste["id"] = $user_objekt["uid"]; + $_liste["disable"] = $user_objekt["disable"]; + $_liste["user_id"] = $user_objekt["uid"]; + $_liste["company"] = $user_objekt["company"]; + $_liste["name"] = $user_objekt["name"]; + // $_liste["last_name"] = $user_objekt["last_name"]; + // $_liste["vereidigung"] = $user_objekt["vereidigung"]; + $_liste["kontoaufloesung"] = $user_objekt["kontoaufloesung"]; + $_liste["kontoaufloesung_active"] = $user_objekt["kontoaufloesung_active"]; + // $_liste["nameorder"] = $_liste["last_name"]!="" ? $_liste["last_name"] : $_liste["company"]; + + $_liste["punkte"] = 0; + $_liste["auswertung"] = []; + + + // WETTBEWERBE ERFOLGSPUNKTE + $_liste = Erfolgspunkte::load_user($_liste, $user_objekt); + + // SONDER SPERRUNGEN + $_liste = Sondersperrungen::filter($_liste, $user_objekt); + + // NEUEINSTEIGERPUNKT + $_liste = Neueinsteiger::load($_liste, $user_objekt); + + // FRAUEN FÖRDERUNGS PUNKT + $_liste = Frauen::load($_liste, $user_objekt); + + // SOLIDARITÄTSERKLÄRUNG + $_liste = Solidaritaetserklaerung::filter($_liste, $user_objekt); + + + $_liste["aeltestes_entscheidungs_datum"] = isset($_liste["auswertung"]["wettbewerbe"][0]) ? $_liste["auswertung"]["wettbewerbe"][0]["entscheidungstermin"] : 0; + + if ($user_objekt["vereidigung"]) { + $vereidigung = strtotime($user_objekt["vereidigung"]); + } + if ($_liste["aeltestes_entscheidungs_datum"] != 0) { + $aeltestes_entscheidungs_datum = strtotime($_liste["aeltestes_entscheidungs_datum"]); + } + + if ($_liste["punkte"] == 0) { + $_liste["nominiert"] = 0; + } + + + + if ($_liste["punkte"] == 0) { + $_liste["sortdatum"] = 100000000; + } elseif (isset($vereidigung) and isset($aeltestes_entscheidungs_datum)) { + $_liste["sortdatum"] = $aeltestes_entscheidungs_datum < $vereidigung ? $aeltestes_entscheidungs_datum : $vereidigung; + } elseif (isset($vereidigung)) { + $_liste["sortdatum"] = $vereidigung; + } elseif (isset($aeltestes_entscheidungs_datum)) { + $_liste["sortdatum"] = $aeltestes_entscheidungs_datum; + } else { + $_liste["sortdatum"] = 100000000; + } + + // if($user_objekt["uid"]==353){ + // print_r($_liste['punkte']); + // exit; + // } + + self::$_data['liste'][] = $_liste; + } + + + if (is_array(self::$_data['liste'])) { + + AufloesungPunkteVerteilung::manage(); + // print_r(self::$_data['liste']); + // exit; + /*** + Reihung der Liste absolut + a) Punktezahl + b) bei Gleichstand: Ältestes in der Wertung befindliche Zuerkennungs-, Entscheidungs- oder Vereidigungsdatum geht vor + c) falls immer noch Gleichstand: Reihung alphabetisch nach Nach- bzw. Firmennamen + */ + + PunkteVerschiebung::manage(); + + $punkte = array_column(self::$_data['liste'], 'punkte'); + $sortdatum = array_column(self::$_data['liste'], 'sortdatum'); + $nameorder = array_column(self::$_data['liste'], 'company'); + foreach ($nameorder as $key => $value) { + $nameorder[$key] = strtolower($value); + } + array_multisort($punkte, SORT_NUMERIC, SORT_DESC, $sortdatum, SORT_NUMERIC, SORT_DESC, $nameorder, SORT_ASC, SORT_STRING, self::$_data['liste']); + + // print_r(self::$_data['liste']); + // exit; + + /*** + Reihung für Nominierung Wie Reihung absolut, aber ohne Zählung von gesperrten Teilnehmern (Sperre bei WB-Teilnahme an geladenen WB, aber nicht nur durch Nominierung aus der Liste(!), dzt. 18 Monate) + Nominierung Herangezogen wird die Nominierungsreihung. + 1 Nominierung: Nr. 1 der Nominierungsreihung + 2 Nominierungen: Nr. 1 und die Nr. des Absolutwerts der Hälfte des Maximalwerts der Nominierungsreihung (z.B. 35 in der Nominierungswertung, gezogen wird Nr. 1 und Nr. 17) + 3 Nominierungen: Nr. 1, die Nr. des Absolutwerts von 2/3 des Maximalwerts der Nominierungsreihung, die Nr. des Absolutwerts von 1/3 des Maximalwerts der Nominierungsreihung (z.B. 35 in der Nominierungswertung, gezogen wird Nr. 1, Nr. 11, Nr. 23) + ab 4 Nominierungen: Die ersten 3 Nominierungen wie oben, nächste ist die Nr. 2, nächste die dem Absolutwert von 2/3 des Maximalwerts der Nominierungreihung folgende Zahl (z.B. bei obigem Beispiel, aber 5 aus 35: Nr. 1,2,11,12,23) + */ + + $arr = []; + $pos = 1; + $rang = 1; + foreach (self::$_data['liste'] as $key => $value) { + if ($value["disable"] == 0) { + $value["rang"] = $rang; + $rang++; + + $sperre_wettbewerbe = $value["auswertung"]["wettbewerbe"]["gesperrt_bis"]; + $sperre_sondersperrungen = $value["auswertung"]["sondersperrungen"]['data']["gesperrt_bis"]; + + $sperre_wettbewerbe = str_replace(". ", "-", $sperre_wettbewerbe); + if (strtotime($sperre_wettbewerbe) > self::$_config['berechne_bis']) { + $value["gesperrt_bis"] = $sperre_wettbewerbe; + } + if (strtotime($sperre_sondersperrungen) > self::$_config['berechne_bis']) { + $value["gesperrt_bis"] = $sperre_sondersperrungen; + } + + $value["punkte"] = (float) $value["punkte"]; + if ($value["nominiert"] == 1 and $value["punkte"] > 0) { + $value["pos"] = $pos; + $pos++; + } else { + $value["pos"] = 0; + } + // unset($value["auswertung"]); + unset($value["nameorder"]); + unset($value["aeltestes_entscheidungs_datum"]); + unset($value["last_name"]); + unset($value["vereidigung"]); + + $arr[] = $value; + } + } + + // print_r(self::$_data['liste']); + // exit; + + $eins = $pos; + $zwei = floor($pos / 2); + $drei = floor($pos / 3); + $vier = floor($pos / 4); + $fuenf = floor($pos / 5); + $sechs = floor($pos / 6); + + // echo "\neins: " . $eins; + // echo "\nzwei: " . $zwei; + // echo "\ndrei: " . $drei; + // echo "\nvier: " . $vier; + // echo "\nfünf: " . $fuenf; + // echo "\nsechs: " . $sechs; + + self::$_data['liste'] = []; + foreach ($arr as $key => $value) { + $pos = $value["pos"]; + if ($pos == 1) { + $value["n1"] = 1; + $value["n2"] = 1; + $value["n3"] = 1; + $value["n4"] = 1; + $value["n5"] = 1; + $value["n6"] = 1; + } elseif ($pos > 1) { + $value["n2"] = ($pos == $zwei) ? 1 : 0; + $value["n3"] = ($pos == $drei || $pos == $drei * 2) ? 1 : 0; + $value["n4"] = ($pos == 2 || $pos == $drei || $pos == $drei * 2) ? 1 : 0; + $value["n5"] = ($pos == 2 || $pos == $drei || $pos == $drei + 1 || $pos == $drei * 2) ? 1 : 0; + $value["n6"] = ($pos == 2 || $pos == $drei || $pos == $drei + 1 || $pos == $drei * 2 || $pos == $drei * 2 + 1) ? 1 : 0; + // $value["n4"] = $pos==$vier || $pos==$vier*2 || $pos==$vier*3?1:0; + // $value["n5"] = $pos==$fuenf || $pos==$fuenf*2 || $pos==$fuenf*3 || $pos==$fuenf*4?1:0; + } + + if ($pos == 2) { + $value["e1"] = 1; + $value["e2"] = 1; + $value["e3"] = 1; + } + if ($pos == 3) { + $value["e4"] = 1; + $value["e5"] = 1; + $value["e6"] = 1; + } elseif ($pos > 3) { + $value["e2"] = ($pos == $zwei + 1) ? 1 : 0; + $value["e3"] = ($pos == $drei + 1 || $pos == $drei * 2 + 1) ? 1 : 0; + $value["e4"] = ($pos == 4 || $pos == $drei + 1 || $pos == $drei * 2 + 1) ? 1 : 0; + $value["e5"] = ($pos == 4 || $pos == $drei + 2 || $pos == $drei + 3 || $pos == $drei * 2 + 1) ? 1 : 0; + $value["e6"] = ($pos == 4 || $pos == $drei + 2 || $pos == $drei + 3 || $pos == $drei * 2 + 2 || $pos == $drei * 2 + 3) ? 1 : 0; + // e6 condition needs controll todo + } + self::$_data['liste'][] = $value; + + } + } + + // print_r(self::$_data['liste']); + // exit; + } +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Bootstrap/KammerById.php b/packages/zuladungsliste/Classes/Bootstrap/KammerById.php new file mode 100644 index 0000000..5d80fca --- /dev/null +++ b/packages/zuladungsliste/Classes/Bootstrap/KammerById.php @@ -0,0 +1,41 @@ +, NUH-Odds GmbH + * + ***/ + +class KammerById +{ + /** + * @param mixed $kammerid + * + * @return string + */ + public static function load($kammerid = 0) + { + if ($kammerid == 0) { + Message::warning(__file__, __line__, "KammerID fehlt"); + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_zuladungsliste_domain_model_kammern')->createQueryBuilder(); + $statement = $queryBuilder->select('bezeichnung')->from('tx_zuladungsliste_domain_model_kammern') + ->where($queryBuilder->expr()->in('uid', $kammerid)) + ->execute(); + while ($row = $statement->fetch()) { + return $row['bezeichnung']; + } + } +} diff --git a/packages/zuladungsliste/Classes/Bootstrap/UserSettings.php b/packages/zuladungsliste/Classes/Bootstrap/UserSettings.php new file mode 100644 index 0000000..f0dafbe --- /dev/null +++ b/packages/zuladungsliste/Classes/Bootstrap/UserSettings.php @@ -0,0 +1,71 @@ +, NUH-Odds GmbH + * + ***/ + + use HermannTelser\Zuladungsliste\Utilities\Resources; + +class UserSettings +{ + /** + * + * @return array + */ + public static function load() + { + $user = $GLOBALS['TSFE']->fe_user->user; + + if ($user['gender'] == 0) { + $gender = 'Herr'; + } elseif ($user['gender'] == 1) { + $gender = 'Frau'; + } else { + $gender = ''; + } + + _Berechnung::$_return = [ + ['key' => 'userid', 'value' => $user['uid']], + ['key' => 'isadmin', 'value' => self::is_admin($user['usergroup'])], + ['key' => 'usergroup', 'value' => $user['usergroup']], + ['key' => 'gender', 'value' => $gender], + ['key' => 'username', 'value' => $user['username']], + ['key' => 'fullname', 'value' => $user['title'] . " " . $user['first_name'] . " " . $user['last_name']], + ['key' => 'company', 'value' => $user['company']], + ['key' => 'email', 'value' => $user['email']], + ['key' => 'inliste', 'value' => $user['inliste']], + ['key' => 'vereidigung', 'value' => $user['vereidigung']], + ['key' => 'frauenfoerderpunkt', 'value' => $user['frauenfoerderpunkt']], + ['key' => 'kammernid', 'value' => $user['kammernid']], + ['key' => 'kammermitgliedsnummer', 'value' => $user['kammermitgliedsnummer']], + ['key' => 'kammer', 'value' => KammerById::load($user['kammernid'])], + ['key' => 'displaymenu', 'value' => Resources::displaymenu()], + ['key' => 'sperren', 'value' => Resources::sperren()], + ['key' => 'years', 'value' => Resources::years()], + ['key' => 'next', 'value' => Resources::next()], + ['key' => 'bundeslaender', 'value' => Resources::bundeslaender()]]; + } + /** + * + * @return bool + */ + public static function is_admin($str) + { + $_arr = \explode(",", $str); + foreach ($_arr as $key => $value) { + if($value == '3') { + return true; + } + } + return false; + } +} diff --git a/packages/zuladungsliste/Classes/Bootstrap/_BootstrapController.php b/packages/zuladungsliste/Classes/Bootstrap/_BootstrapController.php new file mode 100644 index 0000000..aad22ec --- /dev/null +++ b/packages/zuladungsliste/Classes/Bootstrap/_BootstrapController.php @@ -0,0 +1,42 @@ + + * + * All rights reserved + * ************************************************************* */ + + +class _BootstrapController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'administrator': + UserSettings::load(); + break; + case 'start_liste': + UserSettings::load(); + break; + case 'load_archive_menu': + ArchiveMenu::load(); + break; + default: + Message::error(__FILE__, __LINE__, "no xaction switch defined"); + } + } +} diff --git a/packages/zuladungsliste/Classes/Controller/AdministrationController.php b/packages/zuladungsliste/Classes/Controller/AdministrationController.php new file mode 100644 index 0000000..46ca1df --- /dev/null +++ b/packages/zuladungsliste/Classes/Controller/AdministrationController.php @@ -0,0 +1,35 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Test case for class HermannTelser\Zuladungsliste\Controller\ExtrasperrungController. + * + * @author Hermann Telser + */ + class AdministrationController extends \TYPO3\CMS\Core\Tests\UnitTestCase +{ +} diff --git a/packages/zuladungsliste/Classes/Controller/ArchitektenController.php b/packages/zuladungsliste/Classes/Controller/ArchitektenController.php new file mode 100644 index 0000000..46e69b8 --- /dev/null +++ b/packages/zuladungsliste/Classes/Controller/ArchitektenController.php @@ -0,0 +1,150 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Test case for class HermannTelser\Zuladungsliste\Controller\KriterienController. + * + * @author Hermann Telser + */ +class ArchitektenController extends ActionController +{ + + /** + * @var \HermannTelser\Zuladungsliste\Controller\KriterienController + */ + protected $subject = NULL; + + public function setUp() + { + $this->subject = $this->getMock('HermannTelser\Zuladungsliste\Controller\KriterienController', array('redirect', 'forward', 'addFlashMessage'), array(), '', FALSE); + } + + public function tearDown() + { + unset($this->subject); + } + + /** + * @test + */ + public function listActionFetchesAllKriteriensFromRepositoryAndAssignsThemToView() + { + $allKriteriens = $this->getMock('TYPO3\CMS\Extbase\Persistence\ObjectStorage', array(), array(), '', FALSE); + $kriterienRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\KriterienRepository', array('findAll'), array(), '', FALSE); + $kriterienRepository->expects($this->once())->method('findAll')->will($this->returnValue($allKriteriens)); + $this->inject($this->subject, 'kriterienRepository', $kriterienRepository); + $view = $this->getMock('TYPO3\CMS\Extbase\Mvc\View\ViewInterface'); + $view->expects($this->once())->method('assign')->with('kriteriens', $allKriteriens); + $this->inject($this->subject, 'view', $view); + $this->subject->listAction(); + } + + /** + * @test + */ + public function showActionAssignsTheGivenKriterienToView() + { + $kriterien = new \HermannTelser\Zuladungsliste\Domain\Model\Kriterien(); + $view = $this->getMock('TYPO3\CMS\Extbase\Mvc\View\ViewInterface'); + $this->inject($this->subject, 'view', $view); + $view->expects($this->once())->method('assign')->with('kriterien', $kriterien); + $this->subject->showAction($kriterien); + } + + /** + * @test + */ + public function createActionAddsTheGivenKriterienToKriterienRepository() + { + $kriterien = new \HermannTelser\Zuladungsliste\Domain\Model\Kriterien(); + $kriterienRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\KriterienRepository', array('add'), array(), '', FALSE); + $kriterienRepository->expects($this->once())->method('add')->with($kriterien); + $this->inject($this->subject, 'kriterienRepository', $kriterienRepository); + $this->subject->createAction($kriterien); + } + + /** + * @test + */ + public function editActionAssignsTheGivenKriterienToView() + { + $kriterien = new \HermannTelser\Zuladungsliste\Domain\Model\Kriterien(); + $view = $this->getMock('TYPO3\CMS\Extbase\Mvc\View\ViewInterface'); + $this->inject($this->subject, 'view', $view); + $view->expects($this->once())->method('assign')->with('kriterien', $kriterien); + $this->subject->editAction($kriterien); + } + + /** + * @test + */ + public function updateActionUpdatesTheGivenKriterienInKriterienRepository() + { + $kriterien = new \HermannTelser\Zuladungsliste\Domain\Model\Kriterien(); + $kriterienRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\KriterienRepository', array('update'), array(), '', FALSE); + $kriterienRepository->expects($this->once())->method('update')->with($kriterien); + $this->inject($this->subject, 'kriterienRepository', $kriterienRepository); + $this->subject->updateAction($kriterien); + } + + /** + * @test + */ + public function deleteActionRemovesTheGivenKriterienFromKriterienRepository() + { + $kriterien = new \HermannTelser\Zuladungsliste\Domain\Model\Kriterien(); + $kriterienRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\KriterienRepository', array('remove'), array(), '', FALSE); + $kriterienRepository->expects($this->once())->method('remove')->with($kriterien); + $this->inject($this->subject, 'kriterienRepository', $kriterienRepository); + $this->subject->deleteAction($kriterien); + } + + /** + * action list + * + * @return void + */ + public function listAction() + { + // $architektens = $this->architektenRepository->findAll(); + // $this->view->assign('architektens', $architektens); + } + + /** + * action + * + * @return void + */ + public function Action() + { + + } + +} diff --git a/packages/zuladungsliste/Classes/Controller/EditController.php b/packages/zuladungsliste/Classes/Controller/EditController.php new file mode 100644 index 0000000..e26e2b1 --- /dev/null +++ b/packages/zuladungsliste/Classes/Controller/EditController.php @@ -0,0 +1,20 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Test case for class HermannTelser\Zuladungsliste\Controller\WettbewerbeController. + * + * @author Hermann Telser + */ +class ExtrasperrungController extends \TYPO3\CMS\Core\Tests\UnitTestCase +{ + + /** + * @var \HermannTelser\Zuladungsliste\Controller\WettbewerbeController + */ + protected $subject = NULL; + + public function setUp() + { + $this->subject = $this->getMock('HermannTelser\Zuladungsliste\Controller\WettbewerbeController', array('redirect', 'forward', 'addFlashMessage'), array(), '', FALSE); + } + + public function tearDown() + { + unset($this->subject); + } + + /** + * @test + */ + public function listActionFetchesAllWettbewerbesFromRepositoryAndAssignsThemToView() + { + $allWettbewerbes = $this->getMock('TYPO3\CMS\Extbase\Persistence\ObjectStorage', array(), array(), '', FALSE); + $wettbewerbeRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\WettbewerbeRepository', array('findAll'), array(), '', FALSE); + $wettbewerbeRepository->expects($this->once())->method('findAll')->will($this->returnValue($allWettbewerbes)); + $this->inject($this->subject, 'wettbewerbeRepository', $wettbewerbeRepository); + $view = $this->getMock('TYPO3\CMS\Extbase\Mvc\View\ViewInterface'); + $view->expects($this->once())->method('assign')->with('wettbewerbes', $allWettbewerbes); + $this->inject($this->subject, 'view', $view); + $this->subject->listAction(); + } + + /** + * @test + */ + public function showActionAssignsTheGivenWettbewerbeToView() + { + $wettbewerbe = new \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe(); + $view = $this->getMock('TYPO3\CMS\Extbase\Mvc\View\ViewInterface'); + $this->inject($this->subject, 'view', $view); + $view->expects($this->once())->method('assign')->with('wettbewerbe', $wettbewerbe); + $this->subject->showAction($wettbewerbe); + } + + /** + * @test + */ + public function createActionAddsTheGivenWettbewerbeToWettbewerbeRepository() + { + $wettbewerbe = new \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe(); + $wettbewerbeRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\WettbewerbeRepository', array('add'), array(), '', FALSE); + $wettbewerbeRepository->expects($this->once())->method('add')->with($wettbewerbe); + $this->inject($this->subject, 'wettbewerbeRepository', $wettbewerbeRepository); + $this->subject->createAction($wettbewerbe); + } + + /** + * @test + */ + public function editActionAssignsTheGivenWettbewerbeToView() + { + $wettbewerbe = new \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe(); + $view = $this->getMock('TYPO3\CMS\Extbase\Mvc\View\ViewInterface'); + $this->inject($this->subject, 'view', $view); + $view->expects($this->once())->method('assign')->with('wettbewerbe', $wettbewerbe); + $this->subject->editAction($wettbewerbe); + } + + /** + * @test + */ + public function updateActionUpdatesTheGivenWettbewerbeInWettbewerbeRepository() + { + $wettbewerbe = new \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe(); + $wettbewerbeRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\WettbewerbeRepository', array('update'), array(), '', FALSE); + $wettbewerbeRepository->expects($this->once())->method('update')->with($wettbewerbe); + $this->inject($this->subject, 'wettbewerbeRepository', $wettbewerbeRepository); + $this->subject->updateAction($wettbewerbe); + } + + /** + * @test + */ + public function deleteActionRemovesTheGivenWettbewerbeFromWettbewerbeRepository() + { + $wettbewerbe = new \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe(); + $wettbewerbeRepository = $this->getMock('HermannTelser\Zuladungsliste\Domain\Repository\WettbewerbeRepository', array('remove'), array(), '', FALSE); + $wettbewerbeRepository->expects($this->once())->method('remove')->with($wettbewerbe); + $this->inject($this->subject, 'wettbewerbeRepository', $wettbewerbeRepository); + $this->subject->deleteAction($wettbewerbe); + } + + /** + * action + * + * @return void + */ + public function Action() + { + + } + +} diff --git a/packages/zuladungsliste/Classes/Controller/KriterienController.php b/packages/zuladungsliste/Classes/Controller/KriterienController.php new file mode 100644 index 0000000..2a0224c --- /dev/null +++ b/packages/zuladungsliste/Classes/Controller/KriterienController.php @@ -0,0 +1,142 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Test case for class HermannTelser\Zuladungsliste\Controller\ExtrasperrungController. + * + * @author Hermann Telser + */ +class KriterienController extends \TYPO3\CMS\Core\Tests\UnitTestCase +{ + + /** + * @var \HermannTelser\Zuladungsliste\Controller\ExtrasperrungController + */ + protected $subject = NULL; + + /** + * kriterienRepository + * + * @var \HermannTelser\Zuladungsliste\Domain\Repository\KriterienRepository + * @TYPO3CMSExtbaseAnnotationInject + */ + protected $kriterienRepository = NULL; + + public function setUp() + { + $this->subject = $this->getMock('HermannTelser\Zuladungsliste\Controller\ExtrasperrungController', array('redirect', 'forward', 'addFlashMessage'), array(), '', FALSE); + } + + public function tearDown() + { + unset($this->subject); + } + + /** + * action list + * + * @return void + */ + public function listAction() + { + $kriteriens = $this->kriterienRepository->findAll(); + $this->view->assign('kriteriens', $kriteriens); + } + + /** + * action show + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien + * @return void + */ + public function showAction(\HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien) + { + $this->view->assign('kriterien', $kriterien); + } + + /** + * action new + * + * @return void + */ + public function newAction() + { + + } + + /** + * action create + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Kriterien $newKriterien + * @return void + */ + public function createAction(\HermannTelser\Zuladungsliste\Domain\Model\Kriterien $newKriterien) + { + $this->addFlashMessage('The object was created. Please be aware that this action is publicly accessible unless you implement an access check. See http://wiki.typo3.org/T3Doc/Extension_Builder/Using_the_Extension_Builder#1._Model_the_domain', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); + $this->kriterienRepository->add($newKriterien); + $this->redirect('list'); + } + + /** + * action edit + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien + * @TYPO3CMS\Extbase\Annotation\IgnoreValidation $kriterien + * @return void + */ + public function editAction(\HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien) + { + $this->view->assign('kriterien', $kriterien); + } + + /** + * action update + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien + * @return void + */ + public function updateAction(\HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien) + { + $this->addFlashMessage('The object was updated. Please be aware that this action is publicly accessible unless you implement an access check. See http://wiki.typo3.org/T3Doc/Extension_Builder/Using_the_Extension_Builder#1._Model_the_domain', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); + $this->kriterienRepository->update($kriterien); + $this->redirect('list'); + } + + /** + * action delete + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien + * @return void + */ + public function deleteAction(\HermannTelser\Zuladungsliste\Domain\Model\Kriterien $kriterien) + { + $this->addFlashMessage('The object was deleted. Please be aware that this action is publicly accessible unless you implement an access check. See http://wiki.typo3.org/T3Doc/Extension_Builder/Using_the_Extension_Builder#1._Model_the_domain', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); + $this->kriterienRepository->remove($kriterien); + $this->redirect('list'); + } + +} diff --git a/packages/zuladungsliste/Classes/Controller/NewController.php b/packages/zuladungsliste/Classes/Controller/NewController.php new file mode 100644 index 0000000..1230dd1 --- /dev/null +++ b/packages/zuladungsliste/Classes/Controller/NewController.php @@ -0,0 +1,20 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +use TYPO3\CMS\Extbase\Annotation\Inject; + +/** + * Test case for class \HermannTelser\Zuladungsliste\Domain\Model\Architekten. + * + * @copyright Copyright belongs to the respective authors + * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later + * @author Hermann Telser + */ +class WettbewerbeController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController +{ + + /** + * @var \HermannTelser\Zuladungsliste\Domain\Model\Architekten + */ + protected $subject = NULL; + + /** + * wettbewerbeRepository + * + * @var \HermannTelser\Zuladungsliste\Domain\Repository\WettbewerbeRepository + * @TYPO3\CMS\Extbase\Annotation\Inject + */ + protected $wettbewerbeRepository = NULL; + + public function setUp() + { + $this->subject = new \HermannTelser\Zuladungsliste\Domain\Model\Architekten(); + } + + public function tearDown() + { + unset($this->subject); + } + + + + /** + * @test + */ + public function getInlisteReturnsInitialValueForBool() + { + $this->assertSame(FALSE, $this->subject->getInliste()); + } + + /** + * @test + */ + public function setInlisteForBoolSetsInliste() + { + $this->subject->setInliste(TRUE); + $this->assertAttributeEquals(TRUE, 'inliste', $this->subject); + } + + /** + * @test + */ + public function getVereidigungReturnsInitialValueForDateTime() + { + $this->assertEquals(NULL, $this->subject->getVereidigung()); + } + + /** + * @test + */ + public function setVereidigungForDateTimeSetsVereidigung() + { + $dateTimeFixture = new \DateTime(); + $this->subject->setVereidigung($dateTimeFixture); + $this->assertAttributeEquals($dateTimeFixture, 'vereidigung', $this->subject); + } + + /** + * @test + */ + public function getGeburtsdatumReturnsInitialValueForDateTime() + { + $this->assertEquals(NULL, $this->subject->getGeburtsdatum()); + } + + /** + * @test + */ + public function setGeburtsdatumForDateTimeSetsGeburtsdatum() + { + $dateTimeFixture = new \DateTime(); + $this->subject->setGeburtsdatum($dateTimeFixture); + $this->assertAttributeEquals($dateTimeFixture, 'geburtsdatum', $this->subject); + } + + /** + * @test + */ + public function getfrauenfoerderpunktReturnsInitialValueForBool() + { + $this->assertSame(FALSE, $this->subject->getfrauenfoerderpunkt()); + } + + /** + * @test + */ + public function setfrauenfoerderpunktForBoolSetsfrauenfoerderpunkt() + { + $this->subject->setfrauenfoerderpunkt(TRUE); + $this->assertAttributeEquals(TRUE, 'frauenfoerderpunkt', $this->subject); + } + + /** + * action list + * + * @return void + */ + public function listAction() + { + $wettbewerbes = $this->wettbewerbeRepository->findAll(); + $this->view->assign('wettbewerbes', $wettbewerbes); + } + + /** + * action show + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe + * @return void + */ + public function showAction(\HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe) + { + $this->view->assign('wettbewerbe', $wettbewerbe); + } + + /** + * action new + * + * @return void + */ + public function newAction() + { + //// top.TYPO3.Backend.NavigationContainer.PageTree.select(38); + echo ''; + exit(); + } + + /** + * action create + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $newWettbewerbe + * @return void + */ + public function createAction(\HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $newWettbewerbe) + { + $this->addFlashMessage('The object was created. Please be aware that this action is publicly accessible unless you implement an access check. See http://wiki.typo3.org/T3Doc/Extension_Builder/Using_the_Extension_Builder#1._Model_the_domain', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); + $this->wettbewerbeRepository->add($newWettbewerbe); + $this->redirect('list'); + } + + /** + * action edit + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe + * @TYPO3\CMS\Extbase\Annotation\IgnoreValidation $wettbewerbe + * @return void + */ + public function editAction(\HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe) + { + $this->view->assign('wettbewerbe', $wettbewerbe); + } + + /** + * action update + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe + * @return void + */ + public function updateAction(\HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe) + { + $this->addFlashMessage('The object was updated. Please be aware that this action is publicly accessible unless you implement an access check. See http://wiki.typo3.org/T3Doc/Extension_Builder/Using_the_Extension_Builder#1._Model_the_domain', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); + $this->wettbewerbeRepository->update($wettbewerbe); + $this->redirect('list'); + } + + /** + * action delete + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe + * @return void + */ + public function deleteAction(\HermannTelser\Zuladungsliste\Domain\Model\Wettbewerbe $wettbewerbe) + { + $this->addFlashMessage('The object was deleted. Please be aware that this action is publicly accessible unless you implement an access check. See http://wiki.typo3.org/T3Doc/Extension_Builder/Using_the_Extension_Builder#1._Model_the_domain', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); + $this->wettbewerbeRepository->remove($wettbewerbe); + $this->redirect('list'); + } + +} diff --git a/packages/zuladungsliste/Classes/Domain/Model/Architekten.php b/packages/zuladungsliste/Classes/Domain/Model/Architekten.php new file mode 100644 index 0000000..03b559f --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Architekten.php @@ -0,0 +1,193 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Architeckten model extends FrondenUser model + */ +class Architekten extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser +{ + + /** + * kammermitgliedsnummer + * + * @var string + */ + protected $kammermitgliedsnummer; + + /** + * inliste + * + * @var bool + */ + protected $inliste = false; + + /** + * vereidigung + * + * @var \DateTime + */ + protected $vereidigung = null; + + /** + * geburtsdatum + * + * @var \DateTime + */ + protected $geburtsdatum = null; + + /** + * frauenfoerderpunkt + * + * @var bool + */ + protected $frauenfoerderpunkt = false; + + /** + * Returns the kammermitgliedsnummer + * + * @return string $kammermitgliedsnummer + */ + public function getKammermitgliedsnummer() { + return $this->kammermitgliedsnummer; + } + + /** + * Sets the kammermitgliedsnummer + * + * @param string $kammermitgliedsnummer + * @return void + */ + public function setKammermitgliedsnummer($kammermitgliedsnummer) { + $this->kammermitgliedsnummer = $kammermitgliedsnummer; + } + + /** + * Returns the inliste + * + * @return bool $inliste + */ + public function getInliste() + { + return $this->inliste; + } + + /** + * Sets the inliste + * + * @param bool $inliste + * @return void + */ + public function setInliste($inliste) + { + $this->inliste = $inliste; + } + + /** + * Returns the boolean state of inliste + * + * @return bool + */ + public function isInliste() + { + return $this->inliste; + } + + /** + * Returns the vereidigung + * + * @return \DateTime $vereidigung + */ + public function getVereidigung() + { + return $this->vereidigung; + } + + /** + * Sets the vereidigung + * + * @param \DateTime $vereidigung + * @return void + */ + public function setVereidigung(\DateTime $vereidigung) + { + $this->vereidigung = $vereidigung; + } + + /** + * Returns the geburtsdatum + * + * @return \DateTime $geburtsdatum + */ + public function getGeburtsdatum() + { + return $this->geburtsdatum; + } + + /** + * Sets the geburtsdatum + * + * @param \DateTime $geburtsdatum + * @return void + */ + public function setGeburtsdatum(\DateTime $geburtsdatum) + { + $this->geburtsdatum = $geburtsdatum; + } + + /** + * Returns the frauenfoerderpunkt + * + * @return bool $frauenfoerderpunkt + */ + public function getfrauenfoerderpunkt() + { + return $this->frauenfoerderpunkt; + } + + /** + * Sets the frauenfoerderpunkt + * + * @param bool $frauenfoerderpunkt + * @return void + */ + public function setfrauenfoerderpunkt($frauenfoerderpunkt) + { + $this->frauenfoerderpunkt = $frauenfoerderpunkt; + } + + /** + * Returns the boolean state of frauenfoerderpunkt + * + * @return bool + */ + public function isfrauenfoerderpunkt() + { + return $this->frauenfoerderpunkt; + } + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Model/Extrasperrung.php b/packages/zuladungsliste/Classes/Domain/Model/Extrasperrung.php new file mode 100644 index 0000000..129bbaf --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Extrasperrung.php @@ -0,0 +1,120 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Extrasperrung + */ +class Extrasperrung extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity +{ + + /** + * begruendung + * + * @var string + */ + protected $begruendung = ''; + + /** + * sperrzeitbis + * + * @var \DateTime + */ + protected $sperrzeitbis = null; + + /** + * extrasperrungUser + * + * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<> + */ + protected $extrasperrungUser = null; + + /** + * Returns the begruendung + * + * @return string $begruendung + */ + public function getBegruendung() + { + return $this->begruendung; + } + + /** + * Sets the begruendung + * + * @param string $begruendung + * @return void + */ + public function setBegruendung($begruendung) + { + $this->begruendung = $begruendung; + } + + /** + * Returns the sperrzeitbis + * + * @return \DateTime $sperrzeitbis + */ + public function getSperrzeitbis() + { + return $this->sperrzeitbis; + } + + /** + * Sets the sperrzeitbis + * + * @param \DateTime $sperrzeitbis + * @return void + */ + public function setSperrzeitbis(\DateTime $sperrzeitbis) + { + $this->sperrzeitbis = $sperrzeitbis; + } + + /** + * __construct + */ + public function __construct() + { + //Do not remove the next line: It would break the functionality + $this->initStorageObjects(); + } + + /** + * Initializes all ObjectStorage properties + * Do not modify this method! + * It will be rewritten on each save in the extension builder + * You may modify the constructor of this class instead + * + * @return void + */ + protected function initStorageObjects() + { + $this->extrasperrungUser = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); + } + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Model/Kammern.php b/packages/zuladungsliste/Classes/Domain/Model/Kammern.php new file mode 100644 index 0000000..1d993a9 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Kammern.php @@ -0,0 +1,63 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Kammern + */ +class Kammern extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity +{ + + /** + * bezeichnung + * + * @var string + */ + protected $bezeichnung = ''; + + /** + * Returns the bezeichnung + * + * @return string $bezeichnung + */ + public function getBezeichnung() + { + return $this->bezeichnung; + } + + /** + * Sets the bezeichnung + * + * @param string $bezeichnung + * @return void + */ + public function setBezeichnung($bezeichnung) + { + $this->bezeichnung = $bezeichnung; + } + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Model/Kriterien.php b/packages/zuladungsliste/Classes/Domain/Model/Kriterien.php new file mode 100644 index 0000000..6823534 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Kriterien.php @@ -0,0 +1,119 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Wetbewerbsarten mit Bewertung + */ +class Kriterien extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity +{ + + /** + * bezeichnung + * + * @var string + */ + protected $bezeichnung = ''; + + /** + * preisartid + * + * @var \HermannTelser\Zuladungsliste\Domain\Model\Preisart + */ + protected $preisartid = null; + + /** + * sektinstagid + * + * @var \HermannTelser\Zuladungsliste\Domain\Model\Sektionstage + */ + protected $sektinstagid = null; + + /** + * Returns the bezeichnung + * + * @return string $bezeichnung + */ + public function getBezeichnung() + { + return $this->bezeichnung; + } + + /** + * Sets the bezeichnung + * + * @param string $bezeichnung + * @return void + */ + public function setBezeichnung($bezeichnung) + { + $this->bezeichnung = $bezeichnung; + } + + /** + * Returns the preisartid + * + * @return \HermannTelser\Zuladungsliste\Domain\Model\Preisart $preisartid + */ + public function getPreisartid() + { + return $this->preisartid; + } + + /** + * Sets the preisartid + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Preisart $preisartid + * @return void + */ + public function setPreisartid(\HermannTelser\Zuladungsliste\Domain\Model\Preisart $preisartid) + { + $this->preisartid = $preisartid; + } + + /** + * Returns the sektinstagid + * + * @return \HermannTelser\Zuladungsliste\Domain\Model\Sektionstage $sektinstagid + */ + public function getSektinstagid() + { + return $this->sektinstagid; + } + + /** + * Sets the sektinstagid + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Sektionstage $sektinstagid + * @return void + */ + public function setSektinstagid(\HermannTelser\Zuladungsliste\Domain\Model\Sektionstage $sektinstagid) + { + $this->sektinstagid = $sektinstagid; + } + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Model/Preisart.php b/packages/zuladungsliste/Classes/Domain/Model/Preisart.php new file mode 100644 index 0000000..d87c7a1 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Preisart.php @@ -0,0 +1,63 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Preisart + */ +class Preisart extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity +{ + + /** + * preisart + * + * @var string + */ + protected $preisart = ''; + + /** + * Returns the preisart + * + * @return string $preisart + */ + public function getPreisart() + { + return $this->preisart; + } + + /** + * Sets the preisart + * + * @param string $preisart + * @return void + */ + public function setPreisart($preisart) + { + $this->preisart = $preisart; + } + +} diff --git a/packages/zuladungsliste/Classes/Domain/Model/Punkte.php b/packages/zuladungsliste/Classes/Domain/Model/Punkte.php new file mode 100644 index 0000000..2406dbb --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Punkte.php @@ -0,0 +1,63 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Punkte + */ +class Punkte extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity +{ + + /** + * bezeichnung + * + * @var string + */ + protected $bezeichnung = ''; + + /** + * Returns the bezeichnung + * + * @return string $bezeichnung + */ + public function getBezeichnung() + { + return $this->bezeichnung; + } + + /** + * Sets the bezeichnung + * + * @param string $bezeichnung + * @return void + */ + public function setBezeichnung($bezeichnung) + { + $this->bezeichnung = $bezeichnung; + } + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Model/Sektionstage.php b/packages/zuladungsliste/Classes/Domain/Model/Sektionstage.php new file mode 100644 index 0000000..ae03968 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Sektionstage.php @@ -0,0 +1,371 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Sektionstage + */ +class Sektionstage extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity +{ + + /** + * bezeichnung + * + * @var string + */ + protected $bezeichnung = ''; + + /** + * stichtag + * + * @var \DateTime + */ + protected $stichtag = null; + + /** + * sperrzeit + * + * @var int + */ + protected $sperrzeit = 0; + + /** + * sperrzeitstart + * + * @var \DateTime + */ + protected $sperrzeitstart = null; + + /** + * punktezeit + * + * @var int + */ + protected $punktezeit = 0; + + /** + * punktezeitstart + * + * @var \DateTime + */ + protected $punktezeitstart = null; + + /** + * neueinsteiger + * + * @var int + */ + protected $neueinsteiger = 0; + + /** + * neueinsteigerstart + * + * @var \DateTime + */ + protected $neueinsteigerstart = null; + + /** + * frauenfoerderung + * + * @var int + */ + protected $frauenfoerderung = 0; + + /** + * frauenfoerderungstart + * + * @var \DateTime + */ + protected $frauenfoerderungstart = null; + + /** + * frauenfoerderungsonderstart + * + * @var \DateTime + */ + protected $frauenfoerderungsonderstart = null; + + /** + * kammernid + * + * @var \HermannTelser\Zuladungsliste\Domain\Model\Kammern + */ + protected $kammernid = null; + + /** + * Returns the bezeichnung + * + * @return string $bezeichnung + */ + public function getBezeichnung() + { + return $this->bezeichnung; + } + + /** + * Sets the bezeichnung + * + * @param string $bezeichnung + * @return void + */ + public function setBezeichnung($bezeichnung) + { + $this->bezeichnung = $bezeichnung; + } + + /** + * Returns the stichtag + * + * @return \DateTime $stichtag + */ + public function getStichtag() + { + return $this->stichtag; + } + + /** + * Sets the stichtag + * + * @param \DateTime $stichtag + * @return void + */ + public function setStichtag(\DateTime $stichtag) + { + $this->stichtag = $stichtag; + } + + /** + * Returns the sperrzeit + * + * @return int $sperrzeit + */ + public function getSperrzeit() + { + return $this->sperrzeit; + } + + /** + * Sets the sperrzeit + * + * @param int $sperrzeit + * @return void + */ + public function setSperrzeit($sperrzeit) + { + $this->sperrzeit = $sperrzeit; + } + + /** + * Returns the sperrzeitstart + * + * @return \DateTime $sperrzeitstart + */ + public function getSperrzeitstart() + { + return $this->sperrzeitstart; + } + + /** + * Sets the sperrzeitstart + * + * @param \DateTime $sperrzeitstart + * @return void + */ + public function setSperrzeitstart(\DateTime $sperrzeitstart) + { + $this->sperrzeitstart = $sperrzeitstart; + } + + /** + * Returns the punktezeit + * + * @return int $punktezeit + */ + public function getPunktezeit() + { + return $this->punktezeit; + } + + /** + * Sets the punktezeit + * + * @param int $punktezeit + * @return void + */ + public function setPunktezeit($punktezeit) + { + $this->punktezeit = $punktezeit; + } + + /** + * Returns the punktezeitstart + * + * @return \DateTime $punktezeitstart + */ + public function getPunktezeitstart() + { + return $this->punktezeitstart; + } + + /** + * Sets the punktezeitstart + * + * @param \DateTime $punktezeitstart + * @return void + */ + public function setPunktezeitstart(\DateTime $punktezeitstart) + { + $this->punktezeitstart = $punktezeitstart; + } + + /** + * Returns the neueinsteiger + * + * @return int $neueinsteiger + */ + public function getNeueinsteiger() + { + return $this->neueinsteiger; + } + + /** + * Sets the neueinsteiger + * + * @param int $neueinsteiger + * @return void + */ + public function setNeueinsteiger($neueinsteiger) + { + $this->neueinsteiger = $neueinsteiger; + } + + /** + * Returns the neueinsteigerstart + * + * @return \DateTime $neueinsteigerstart + */ + public function getNeueinsteigerstart() + { + return $this->neueinsteigerstart; + } + + /** + * Sets the neueinsteigerstart + * + * @param \DateTime $neueinsteigerstart + * @return void + */ + public function setNeueinsteigerstart(\DateTime $neueinsteigerstart) + { + $this->neueinsteigerstart = $neueinsteigerstart; + } + + /** + * Returns the frauenfoerderung + * + * @return int $frauenfoerderung + */ + public function getFrauenfoerderung() + { + return $this->frauenfoerderung; + } + + /** + * Sets the frauenfoerderung + * + * @param int $frauenfoerderung + * @return void + */ + public function setFrauenfoerderung($frauenfoerderung) + { + $this->frauenfoerderung = $frauenfoerderung; + } + + /** + * Returns the frauenfoerderungstart + * + * @return \DateTime $frauenfoerderungstart + */ + public function getFrauenfoerderungstart() + { + return $this->frauenfoerderungstart; + } + + /** + * Sets the frauenfoerderungstart + * + * @param \DateTime $frauenfoerderungstart + * @return void + */ + public function setFrauenfoerderungstart(\DateTime $frauenfoerderungstart) + { + $this->frauenfoerderungstart = $frauenfoerderungstart; + } + + /** + * Returns the frauenfoerderungsonderstart + * + * @return \DateTime $frauenfoerderungsonderstart + */ + public function getFrauenfoerderungsonderstart() + { + return $this->frauenfoerderungsonderstart; + } + + /** + * Sets the frauenfoerderungsonderstart + * + * @param \DateTime $frauenfoerderungsonderstart + * @return void + */ + public function setFrauenfoerderungsonderstart(\DateTime $frauenfoerderungsonderstart) + { + $this->frauenfoerderungsonderstart = $frauenfoerderungsonderstart; + } + + /** + * Returns the kammernid + * + * @return \HermannTelser\Zuladungsliste\Domain\Model\Kammern kammernid + */ + public function getKammernid() + { + return $this->kammernid; + } + + /** + * Sets the kammernid + * + * @param \HermannTelser\Zuladungsliste\Domain\Model\Kammern $kammernid + * @return void + */ + public function setKammernid(\HermannTelser\Zuladungsliste\Domain\Model\Kammern $kammernid) + { + $this->kammernid = $kammernid; + } + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Model/User.php b/packages/zuladungsliste/Classes/Domain/Model/User.php new file mode 100644 index 0000000..2cf611d --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/User.php @@ -0,0 +1,90 @@ +kammermitgliedsnummer; + } + + /** + * Sets the kammermitgliedsnummer + * + * @param string $kammermitgliedsnummer + * @return void + */ + public function setKammermitgliedsnummer($kammermitgliedsnummer) + { + $this->kammermitgliedsnummer = $kammermitgliedsnummer; + } + + + /** + * @return bool + */ + public function getFrauenfoerderpunkt() + { + return $this->frauenfoerderpunkt; + } + + /** + * Sets the frauenfoerderpunkt + * + * @param bool $frauenfoerderpunkt + * @return void + */ + public function setFrauenfoerderpunkt($frauenfoerderpunkt) + { + $this->frauenfoerderpunkt = $frauenfoerderpunkt; + } + + + /** + * @return string + */ + public function getVereidigung() + { + return $this->vereidigung; + } + + /** + * Sets the Vereidigung + * + * @param string $vereidigung + * @return void + */ + public function setVereidigung($vereidigung) + { + $this->vereidigung = $vereidigung; + } +} diff --git a/packages/zuladungsliste/Classes/Domain/Model/Wettbewerbe.php b/packages/zuladungsliste/Classes/Domain/Model/Wettbewerbe.php new file mode 100644 index 0000000..248e6b0 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Model/Wettbewerbe.php @@ -0,0 +1,355 @@ + + */ + protected $wettbewerbUser = null; + + /** + * Returns the wettbewerb + * + * @return string $wettbewerb + */ + public function getWettbewerb() + { + return $this->wettbewerb; + } + + /** + * Sets the wettbewerb + * + * @param string $wettbewerb + * @return void + */ + public function setWettbewerb($wettbewerb) + { + $this->wettbewerb = $wettbewerb; + } + + /** + * Returns the beschreibung + * + * @return string $beschreibung + */ + public function getBeschreibung() + { + return $this->beschreibung; + } + + /** + * Sets the beschreibung + * + * @param string $beschreibung + * @return void + */ + public function setBeschreibung($beschreibung) + { + $this->beschreibung = $beschreibung; + } + + /** + * Returns the registrierung + * + * @return string $registrierung + */ + public function getRegistrierung() + { + return $this->registrierung; + } + + /** + * Sets the registrierung + * + * @param string $registrierung + * @return void + */ + public function setRegistrierung($registrierung) + { + $this->registrierung = $registrierung; + } + + /** + * Returns the verfahrensort + * + * @return string $verfahrensort + */ + public function getVerfahrensort() + { + return $this->verfahrensort; + } + + /** + * Sets the verfahrensort + * + * @param string $verfahrensort + * @return void + */ + public function setVerfahrensort($verfahrensort) + { + $this->verfahrensort = $verfahrensort; + } + + /** + * Returns the bundesland + * + * @return string $bundesland + */ + public function getBundesland() + { + return $this->bundesland; + } + + /** + * Sets the bundesland + * + * @param string $bundesland + * @return void + */ + public function setBundesland($bundesland) + { + $this->bundesland = $bundesland; + } + + /** + * Returns the abgabetermin + * + * @return \DateTime $abgabetermin + */ + public function getAbgabetermin() + { + return $this->abgabetermin; + } + + /** + * Sets the abgabetermin + * + * @param \DateTime $abgabetermin + * @return void + */ + public function setAbgabetermin(\DateTime $abgabetermin) + { + $this->abgabetermin = $abgabetermin; + } + + /** + * Returns the kammerbeschluss + * + * @return \DateTime $kammerbeschluss + */ + public function getKammerbeschluss() + { + return $this->kammerbeschluss; + } + + /** + * Sets the kammerbeschluss + * + * @param \DateTime $kammerbeschluss + * @return void + */ + public function setKammerbeschluss(\DateTime $kammerbeschluss) + { + $this->kammerbeschluss = $kammerbeschluss; + } + + /** + * Returns the entscheidungstermin + * + * @return \DateTime $entscheidungstermin + */ + public function getEntscheidungstermin() + { + return $this->entscheidungstermin; + } + + /** + * Sets the entscheidungstermin + * + * @param \DateTime $entscheidungstermin + * @return void + */ + public function setEntscheidungstermin(\DateTime $entscheidungstermin) + { + $this->entscheidungstermin = $entscheidungstermin; + } + + /** + * Returns the sperrung + * + * @return bool $sperrung + */ + public function getSperrung() + { + return $this->sperrung; + } + + /** + * Sets the sperrung + * + * @param bool $sperrung + * @return void + */ + public function setSperrung($sperrung) + { + $this->sperrung = $sperrung; + } + + /** + * Returns the boolean state of sperrung + * + * @return bool + */ + public function isSperrung() + { + return $this->sperrung; + } + + /** + * Returns the aufgabenstellung + * + * @return string $aufgabenstellung + */ + public function getAufgabenstellung() + { + return $this->aufgabenstellung; + } + + /** + * Sets the aufgabenstellung + * + * @param string $aufgabenstellung + * @return void + */ + public function setAufgabenstellung($aufgabenstellung) + { + $this->aufgabenstellung = $aufgabenstellung; + } + + /** + * __construct + */ + public function __construct() + { + //Do not remove the next line: It would break the functionality + $this->initStorageObjects(); + } + + /** + * Initializes all ObjectStorage properties + * Do not modify this method! + * It will be rewritten on each save in the extension builder + * You may modify the constructor of this class instead + * + * @return void + */ + protected function initStorageObjects() + { + $this->wettbewerbUser = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); + } + +} diff --git a/packages/zuladungsliste/Classes/Domain/Repository/ArchitektenRepository.php b/packages/zuladungsliste/Classes/Domain/Repository/ArchitektenRepository.php new file mode 100644 index 0000000..633f038 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Repository/ArchitektenRepository.php @@ -0,0 +1,36 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * The repository for Architektens + */ +class ArchitektenRepository extends \TYPO3\CMS\Extbase\Persistence\Repository +{ + + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Repository/KriterienRepository.php b/packages/zuladungsliste/Classes/Domain/Repository/KriterienRepository.php new file mode 100644 index 0000000..cbc47e1 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Repository/KriterienRepository.php @@ -0,0 +1,36 @@ +, Hermann Telser + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * The repository for Kriteriens + */ +class KriterienRepository extends \TYPO3\CMS\Extbase\Persistence\Repository +{ + + +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Domain/Repository/WettbewerbeRepository.php b/packages/zuladungsliste/Classes/Domain/Repository/WettbewerbeRepository.php new file mode 100644 index 0000000..63c3753 --- /dev/null +++ b/packages/zuladungsliste/Classes/Domain/Repository/WettbewerbeRepository.php @@ -0,0 +1,36 @@ +getQueryBuilderForTable('tx_zuladungsliste_archive_admin'); + $statement = $queryBuilder + ->select('liste', 'crdate') + ->from('tx_zuladungsliste_archive_admin') + ->where( + $queryBuilder->expr()->eq('uid', (int) $pdf_archive_id) + ) + ->execute()->fetchAll(); + $_liste = json_decode($statement[0]['liste'], true); + $timestamp = $statement[0]['crdate']; + $timestamp_formattet = (strftime('%A %d. %B %Y', $statement[0]['crdate'])); + $timestamp_titel = (strftime('%d. %b. %Y', $statement[0]['crdate'])); + } else { + $berechnene::berechnen(); + ListeTree::set_dijit(); + $_liste = $berechnene::$_return; + $timestamp = time(); + $timestamp_formattet = strftime('%A %d. %B %Y', time()); + $timestamp_titel = strftime('%d. %b. %Y', time()); + } + + self::$Mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'format' => 'A4-P', + 'margin_left' => 7, + 'margin_right' => 7, + 'margin_top' => 12, + 'margin_bottom' => 12, + 'margin_header' => 0, + 'margin_footer' => 0, + ]); + self::$Mpdf->SetTitle("ZL vom " . $timestamp_titel); + $stylesheet = file_get_contents($extPath.'Classes/Download/style.css'); + self::$Mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS); + + // logo + $html = '
'; + $image = $extPath.'Resources/Public/Images/ztkammer-logo.png'; + $html .= ''; + + // header + $html .= '
Zuladungsliste Wettbewerbe Steiermark
'; + + // sub header + $sektionstag = Sektionstage::filter($timestamp); + $html .= '

Stand '.$timestamp_formattet.', auf Basis des Sektionstages vom '.$sektionstag['stichtag'].', '.$sektionstag['bezeichnung'].'

'; + + // tabelle + $html .= ''; + $html .= ''; + foreach ($_liste as $key => $value) { + if (isset($value['user_id'])) { + if (0 == $value['pos']) { + $value['pos'] = ''; + $color = "rot"; + } else { + $value['gesperrt_bis'] = 'Frei'; + $color = "gruen"; + } + + $html .= ''; + $html .= "'; + $html .= "'; + $html .= "'; + $html .= "'; + $html .= "'; + $html .= ''; + } + } + $html .= '
RangPosBüroPunkteSperrung bis
".$value['rang'].'".$value['pos'].'".$value['company'].'".number_format($value['punkte'], 2).'".$value['gesperrt_bis'].'
'; + + self::$Mpdf->WriteHTML($html, \Mpdf\HTMLParserMode::HTML_BODY); + + self::$Mpdf->Output('Standard.pdf', Mpdf\Output\Destination::INLINE); + + exit; + } +} diff --git a/packages/zuladungsliste/Classes/Download/_DownloadController.php b/packages/zuladungsliste/Classes/Download/_DownloadController.php new file mode 100644 index 0000000..2228b64 --- /dev/null +++ b/packages/zuladungsliste/Classes/Download/_DownloadController.php @@ -0,0 +1,39 @@ + + * + * All rights reserved + * ************************************************************* */ + + +class _DownloadController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'download_pdf': + PdfListe::download(); + break; + case 'download_einreichung': + PdfEinreichung::download(); + break; + } + } +} diff --git a/packages/zuladungsliste/Classes/Download/print.css b/packages/zuladungsliste/Classes/Download/print.css new file mode 100644 index 0000000..100e64f --- /dev/null +++ b/packages/zuladungsliste/Classes/Download/print.css @@ -0,0 +1,98 @@ +body { + font-family: sans-serif; + font-size: 0.9em; + line-height: 1.1em; + margin: 0; + padding: 0; +} + +.liste-titel { + font-family: sans-serif; + padding: 15mm 0 0; + font-size: 2em; + font-weight: bold; + text-align: center; + margin: 1em auto; +} + +.rot { + color: #800; +} + +table { + width: 100%; +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +.filter { + background-color: #eee; + border: 1px solid #cbcbcb; + padding: 0.5rem 1rem; + margin: 0.5rem 0; +} + +/* PURE TABLES START */ +.pure-table { + /* Remove spacing between table cells (from Normalize.css) */ + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + border: 1px solid #cbcbcb; +} + +.pure-table td, +.pure-table th, +.pure-table-noborder td, +.pure-table-noborder th { + border-left: 1px solid #cbcbcb; + border-bottom: 1px solid #cbcbcb; + /* inner column border */ + border-width: 0 0 1px 1px; + font-size: inherit; + margin: 0; + overflow: visible; + /*to make ths where the title is really long work*/ + padding: .7em 1em; + /* cell padding */ +} + +.pure-table td { + background-color: transparent; +} + +.pure-table-odd td { + background-color: #eee; +} + +/* nth-child selector for modern browsers */ +.pure-table-striped tr:nth-child(2n-1) td { + background-color: #eee; + border-bottom: 1px solid #cbcbcb; +} + +/* BORDERED TABLES */ +.pure-table-bordered td { + border-bottom: 1px solid #cbcbcb; +} + +.pure-table-bordered tbody>tr:last-child>td { + border-bottom-width: 0; +} + +/* HORIZONTAL BORDERED TABLES */ +.pure-table-horizontal td, +.pure-table-horizontal th { + border-width: 0 0 1px 0; + border-bottom: 1px solid #cbcbcb; +} + +.pure-table-horizontal tbody>tr:last-child>td { + border-bottom-width: 0; +} diff --git a/packages/zuladungsliste/Classes/Download/style.css b/packages/zuladungsliste/Classes/Download/style.css new file mode 100644 index 0000000..ba50455 --- /dev/null +++ b/packages/zuladungsliste/Classes/Download/style.css @@ -0,0 +1,121 @@ +body { + font-family: sans-serif; + font-size: 1em; + line-height: 18pt; + margin: 0; + padding: 0; +} + +.liste-titel { + font-family: sans-serif; + padding: 15mm 0 0; + font-size: 1.5em; + text-align: center; +} + +table.liste { + width: 100%; + font-size: .9em; + margin-top: 15mm; +} + +.rot { + color: #800; +} + +.gruen { + color: green; +} + +.center { + text-align: center; +} + +.right { + text-align: right; +} + +/* PURE TABLES START */ +.pure-table { + /* Remove spacing between table cells (from Normalize.css) */ + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; + border: 1px solid #cbcbcb; +} + +.pure-table-noborder { + /* Remove spacing between table cells (from Normalize.css) */ + border-collapse: collapse; + border-spacing: 0; + empty-cells: show; +} + +.pure-table caption { + color: #000; + font: italic 85%/1 arial, sans-serif; + padding: 1em 0; + text-align: center; +} + +.pure-table td, +.pure-table th, +.pure-table-noborder td, +.pure-table-noborder th { + border-left: 1px solid #cbcbcb; + border-bottom: 1px solid #cbcbcb; + /* inner column border */ + border-width: 0 0 1px 1px; + font-size: inherit; + margin: 0; + overflow: visible; + /*to make ths where the title is really long work*/ + padding: .7em 1em; + /* cell padding */ +} + +.pure-table thead { + background-color: #e0e0e0; + color: #000; + text-align: left; + vertical-align: bottom; +} + +/* +striping: + even - #fff (white) + odd - #f2f2f2 (light gray) +*/ +.pure-table td { + background-color: transparent; +} + +.pure-table-odd td { + background-color: #f2f2f2; +} + +/* nth-child selector for modern browsers */ +.pure-table-striped tr:nth-child(2n-1) td { + background-color: #f2f2f2; + border-bottom: 1px solid #cbcbcb; +} + +/* BORDERED TABLES */ +.pure-table-bordered td { + border-bottom: 1px solid #cbcbcb; +} + +.pure-table-bordered tbody>tr:last-child>td { + border-bottom-width: 0; +} + +/* HORIZONTAL BORDERED TABLES */ +.pure-table-horizontal td, +.pure-table-horizontal th { + border-width: 0 0 1px 0; + border-bottom: 1px solid #cbcbcb; +} + +.pure-table-horizontal tbody>tr:last-child>td { + border-bottom-width: 0; +} diff --git a/packages/zuladungsliste/Classes/Einreichen/EinreichungDelete.php b/packages/zuladungsliste/Classes/Einreichen/EinreichungDelete.php new file mode 100644 index 0000000..7ac89f6 --- /dev/null +++ b/packages/zuladungsliste/Classes/Einreichen/EinreichungDelete.php @@ -0,0 +1,47 @@ + + * + * All rights reserved + * ************************************************************* */ + +class EinreichungDelete +{ + public static function laden() + { + // lösche Einreichung + $uid = GeneralUtility::_GP('uid'); + if (!is_numeric($uid)) { + exit; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen'); + $queryBuilder + ->update('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->where( + $queryBuilder->expr()->eq('uid', (int) $uid) + ) + ->set('tstamp', time()) + ->set('deleted', (int) 1) + ->execute(); + + echo $queryBuilder->getSQL(); + } +} diff --git a/packages/zuladungsliste/Classes/Einreichen/EinreichungenUser.php b/packages/zuladungsliste/Classes/Einreichen/EinreichungenUser.php new file mode 100644 index 0000000..017e5d3 --- /dev/null +++ b/packages/zuladungsliste/Classes/Einreichen/EinreichungenUser.php @@ -0,0 +1,57 @@ + + * + * All rights reserved + * ************************************************************* */ + +class EinreichungenUser +{ + public static function laden() + { + // EIGEREICHTE PROJEKT + $user = $GLOBALS['TSFE']->fe_user->user; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen'); + // $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('uid', 'crdate', 'wettbewerb', 'beschreibung', 'entscheidungstermin', 'verfahrensort', 'bundesland', 'dokument_orig_name', 'aufgenommen', 'abgelehnt', 'begruendung') + ->from('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->where($queryBuilder->expr()->eq('cruser_id', $user['uid'])) + ->orderBy('aufgenommen'); + $statement = $queryBuilder->execute()->fetchAll(); + + $arr = array(); + foreach ($statement as $key => $value) { + $value["status"] = 0; + if($value["aufgenommen"] > 0){ + $value["status"] = 1; + } + else if ($value["abgelehnt"] > 0){ + $value["status"] = 2; + } + $arr[] = $value; + } + + header('Content-Type: application/json'); + echo json_encode($arr); + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/Einreichen/_EinreichenController.php b/packages/zuladungsliste/Classes/Einreichen/_EinreichenController.php new file mode 100644 index 0000000..aba0a32 --- /dev/null +++ b/packages/zuladungsliste/Classes/Einreichen/_EinreichenController.php @@ -0,0 +1,36 @@ + + * + * All rights reserved + * ************************************************************* */ + +class _EinreichenController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'lade_einreichungen': + return EinreichungenUser::laden(); + break; + default: + Message::error(__FILE__, __LINE__, 'no xaction switch defined'); + } + } +} diff --git a/packages/zuladungsliste/Classes/Liste/Archive.php b/packages/zuladungsliste/Classes/Liste/Archive.php new file mode 100644 index 0000000..02d6f86 --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/Archive.php @@ -0,0 +1,41 @@ +getQueryBuilderForTable('tx_zuladungsliste_archive_admin'); + $statement = $queryBuilder + ->select('liste') + ->from('tx_zuladungsliste_archive_admin') + ->where($queryBuilder->expr()->eq('uid', (int) $archive_id)) + ->addOrderBy('uid', 'DESC') + ->execute() + ->fetchAll(); + + header('Content-Type: application/json'); + echo $statement[0]['liste']; + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/Liste/ArchiveMenu.php b/packages/zuladungsliste/Classes/Liste/ArchiveMenu.php new file mode 100644 index 0000000..bf48247 --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/ArchiveMenu.php @@ -0,0 +1,55 @@ +, NUH-Odds GmbH + * + ***/ + +class ArchiveMenu +{ + /** + * + * @return string + */ + public static function load() + { + $queryBuilder = GeneralUtility::makeInstance( + ConnectionPool::class + )->getQueryBuilderForTable('tx_zuladungsliste_archive_admin'); + $statement = $queryBuilder + ->select('uid', 'crdate') + ->from('tx_zuladungsliste_archive_admin') + ->addOrderBy('uid', 'DESC') + ->execute(); + + $tmp=[]; + foreach ($statement as $key => $value) { + $year = date("Y", $value["crdate"]); + $tmp[$year][] = $value; + } + _Berechnung::$_return = []; + foreach ($tmp as $year => $value) { + $t = array(); + $t["year"] = $year; + foreach ($value as $key => $val) { + $t2 = array(); + $t2["id"] = $val["uid"]; + $t2["titel"] = strftime("%e. %b. %G", $val["crdate"]); + $t["subdata"][] = $t2; + } + _Berechnung::$_return[] = $t; + } + } +} diff --git a/packages/zuladungsliste/Classes/Liste/EinreichungenAdmin.php b/packages/zuladungsliste/Classes/Liste/EinreichungenAdmin.php new file mode 100644 index 0000000..7b7c9bd --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/EinreichungenAdmin.php @@ -0,0 +1,149 @@ +getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen'); + $queryBuilder + ->update('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->where( + $queryBuilder->expr()->eq('uid', (int) $uid), + $queryBuilder->expr()->eq('aufgenommen', 0), + $queryBuilder->expr()->eq('abgelehnt', 0) + )->set('deleted', '1')->execute(); + // echo $queryBuilder->getSQL(); + echo 1; + exit; + } + + /** + * @return bool + */ + public static function update() + { + // EINGEREICHTE PROJEKT UPDATE + $uid = preg_replace("'\D'", "", $_GET['uid']); + if (!is_numeric($uid)) { + exit; + } + $field = preg_replace("'\W'", "", $_GET['field']); + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen'); + if ($field=="aufgenommen") { + $queryBuilder + ->update('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->where($queryBuilder->expr()->eq('uid', (int) $uid)) + ->set('aufgenommen', (int) time()) + ->set('abgelehnt', 0) + ->execute(); + } elseif ($field=="abgelehnt") { + $queryBuilder + ->update('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->where($queryBuilder->expr()->eq('uid', (int) $uid)) + ->set('aufgenommen', 0) + ->set('abgelehnt', (int) time()) + ->execute(); + } + + // echo $queryBuilder->getSQL(); + echo 1; + exit; + } + + + /** + * @return bool + */ + public static function load() + { + // EINGEREICHTE PROJEKT LOAD + + // _Berechnung::$debug = 1; + + if (_Berechnung::$debug) { + Message::debug( + __FILE__, + __LINE__, + 'Load ListeBerechnung' + ); + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen'); + $statement = $queryBuilder + ->select( + 'a.company', + 'a.name', + 'a.uid AS user_uid', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.uid', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.crdate', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.wettbewerb', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.beschreibung', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.entscheidungstermin', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.verfahrensort', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.bundesland', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.dokument_orig_name', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.aufgenommen', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.abgelehnt', + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.begruendung' + ) + ->from('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->join( + 'tx_zuladungsliste_domain_model_wettbewerbe_einreichungen', + 'fe_users', + 'a', + $queryBuilder->expr()->eq('a.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.cruser_id')) + ) + ->where( + $queryBuilder->expr()->eq('a.deleted', (int) 0), + $queryBuilder->expr()->eq('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen.deleted', (int) 0) + )->execute()->fetchAll(); + + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + + $bundeslaender_map = array_flip(Resources::bundeslaender()); + + + $_return = []; + foreach ($statement as $key => $value) { + $value['id'] = (int) $value['uid']; + unset($value['uid']); + $value['aufgenommen'] = (int) $value['aufgenommen']; + $value['abgelehnt'] = (int) $value['abgelehnt']; + $value['year'] = (int) substr($value['entscheidungstermin'], 0, 4); + $value['bundeslandid'] = $bundeslaender_map[$value['bundesland']]; + + $value['status'] = 1; + if ($value['abgelehnt'] > 0) { + $value['status'] = 3; + } elseif ($value['aufgenommen'] > 0) { + $value['status'] = 2; + } + + $_return[] = $value; + } + + header('Content-Type: application/json'); + echo json_encode($_return); + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/Liste/Freischaltungen.php b/packages/zuladungsliste/Classes/Liste/Freischaltungen.php new file mode 100644 index 0000000..034205b --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/Freischaltungen.php @@ -0,0 +1,175 @@ +getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder->update('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->where( + $queryBuilder->expr()->eq('uid', (int) $uid_wettarch) + ) + ->set('tstamp', (int) time()) + ->set('tstamp_aktivierung', (int) time()) + ->set('tstamp_ablehnen', 0) + ->execute(); + + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + echo 1; + exit; + } + + /** + * @return bool + */ + public static function ablehnen() + { + // _Berechnung::$debug = 1; + + $uid_wettarch = GeneralUtility::_GP('uid_wettarch'); + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder->update('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->where( + $queryBuilder->expr()->eq('uid', (int) $uid_wettarch) + ) + ->set('tstamp', (int)time()) + ->set('tstamp_aktivierung', 0) + ->set('tstamp_ablehnen', (int)time()) + ->execute(); + + if (_Berechnung::$debug) { + Message::note($queryBuilder->getSQL()); + } + echo 1; + exit; + } + + /** + * @return void + */ + public static function load() + { + $webvalue = GeneralUtility::_GP('value'); + $webkey = GeneralUtility::_GP('key'); + + new _Berechnung(); + + _Berechnung::$debug = 0; + + if (_Berechnung::$debug) { + Message::debug( + __FILE__, + __LINE__, + 'Load Liste Freischaltungen' + ); + } + Architekten::load(); + $Architekten = []; + foreach (_Berechnung::$_data['architekten'] as $key => $_row) { + $Architekten[$_row['uid']] = $_row; + } + $PunkteKriterien = PunkteKriterien::load(); + + $WettbewerbeArchitekten = WettbewerbeArchitekten::load(); + + $_data = []; + foreach ($WettbewerbeArchitekten as $key => $_row) { + $uid_user = $_row['uid_user']; + if (isset($Architekten[$uid_user])) { + $_row = array_merge($_row, $Architekten[$uid_user]); + + $uid_punkte = $_row['uid_punkte']; + $kriteriumid = $_row['kriteriumid']; + if (!$PunkteKriterien[$uid_punkte][$kriteriumid]) { + print_r($_row); + exit; + } + $_row = array_merge($_row, $PunkteKriterien[$uid_punkte][$kriteriumid]); + $_data[] = $_row; + } + } + + $bundeslaender_map = array_flip(Resources::bundeslaender()); + + _Berechnung::$_return = []; + foreach ($_data as $key => $_row) { + $_row['id'] = $key; + $entyear = (int) substr($_row['entscheidungstermin'], 0, 4); + $abgyear = (int) substr($_row['abgabetermin'], 0, 4); + if ($entyear) { + $_row['jahr'] = $entyear; + } elseif ($abgyear) { + $_row['jahr'] = $abgyear; + } else { + $_row['jahr'] = 'fehlt!'; + } + // anstehend + $_row['status'] = 0; + if (0 != $_row['tstamp_zuordnung'] and 0 == $_row['tstamp_aktivierung'] and 0 == $_row['tstamp_ablehnen']) { + $_row['status'] = 1; + } + // freie + if (0 != $_row['tstamp_aktivierung']) { + $_row['status'] = 2; + } + // freie + if (0 != $_row['tstamp_ablehnen']) { + $_row['status'] = 3; + } + $_row['bundeslandid'] = $bundeslaender_map[$_row['bundesland']]; + if ('jahr' == $webkey) { + if ($_row['jahr'] == $webvalue) { + _Berechnung::$_return[] = $_row; + } + } else { + _Berechnung::$_return[] = $_row; + } + } + } +} diff --git a/packages/zuladungsliste/Classes/Liste/ListeAdmin.php b/packages/zuladungsliste/Classes/Liste/ListeAdmin.php new file mode 100644 index 0000000..124c4eb --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/ListeAdmin.php @@ -0,0 +1,45 @@ +, NUH-Odds GmbH + * + ***/ + +class ListeAdmin +{ + /** + * + * @return string + */ + public static function load() + { + $archive_id = GeneralUtility::_GP('archive_id'); + + if ($archive_id) { + Archive::load($archive_id); + } + + $berechnen = new _Berechnung(); + + $berechnen::berechnen(); + + ListeTree::set_dijit(); + + + header('Content-Type: application/json'); + echo json_encode(_Berechnung::$_return); + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/Liste/ListeTree.php b/packages/zuladungsliste/Classes/Liste/ListeTree.php new file mode 100644 index 0000000..5ceec99 --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/ListeTree.php @@ -0,0 +1,214 @@ + $value) { + //if($value["user_id"]==140){ + // print_r($value); + // _Berechnung::$_return = array(); + //} + $wettbewerbe = $value["auswertung"]["wettbewerbe"]; + $neueinsteigerpunkt = $value["auswertung"]["neueinsteigerpunkt"]; + $frauenfoerderpunkt = $value["auswertung"]["frauenfoerderpunkt"]; + $solidaritaetserklaerung = $value["auswertung"]["solidaritaetserklaerung"]; + $sondersperrungen = $value["auswertung"]["sondersperrungen"]; + $verschiebung_gegeben = $value["auswertung"]["verschiebung_gegeben"]; + $verschiebung_empfangen = $value["auswertung"]["verschiebung_empfangen"]; + unset($value["auswertung"]); + $value["id"] = (int) $i; + $value["hasChildren"] = (int) 1; + $value["parent"] = null; + $value["punkte"] = (float) $value["punkte"]; + $value["sortdatum"] = (int) $value["sortdatum"]; + $value["gesperrt_bis_sort"] = strtotime($value["gesperrt_bis"]); + _Berechnung::$_return[] = $value; + $i++; + + // neueinsteigerpunkt + if ($neueinsteigerpunkt) { + $tmp = []; + $tmp["id"] = (int) $i; + $i++; + $tmp["company"] = ' Neueinsteigerpunkt' . $neueinsteigerpunkt["kommentar"] . ''; + $tmp["hasChildren"] = (int) 0; + $tmp["parent"] = (int) $value["id"]; + $tmp["punkte"] = (float) $neueinsteigerpunkt["punkte"]; + $tmp["nominiert"] = (int) 2; + $tmp["type"] = "neueinsteiger"; + $tmp["gesperrt_bis"] = ''; + _Berechnung::$_return[] = $tmp; + } + // frauenfoerderpunkt + if ($frauenfoerderpunkt) { + $tmp = []; + $tmp["id"] = (int) $i; + $i++; + $tmp["company"] = ' Frauenförderpunkt' . $frauenfoerderpunkt["kommentar"] . ''; + $tmp["hasChildren"] = (int) 0; + $tmp["parent"] = (int) $value["id"]; + $tmp["punkte"] = (float) $frauenfoerderpunkt["punkte"]; + $tmp["nominiert"] = (int) 2; + $tmp["type"] = "frauenfoerderpunkt"; + $tmp["gesperrt_bis"] = ''; + _Berechnung::$_return[] = $tmp; + } + + // solidaritaetserklaerung + if ($solidaritaetserklaerung) { + $tmp = []; + $tmp["id"] = (int) $i; + $i++; + $tmp["company"] = ' Solidaritätserklärung' . $solidaritaetserklaerung["kommentar"] . ''; + $tmp["hasChildren"] = (int) 0; + $tmp["parent"] = (int) $value["id"]; + $tmp["punkte"] = (float) $solidaritaetserklaerung["punkte"]; + $tmp["nominiert"] = (int) 2; + $tmp["type"] = "solidaritaetserklaerung"; + $tmp["gesperrt_bis"] = ''; + _Berechnung::$_return[] = $tmp; + } + + // sondersperrungen + if (isset($sondersperrungen)) { + foreach ($sondersperrungen as $key => $sperre) { + + $tmp = []; + $tmp["id"] = (int) $i; + $i++; + $tmp["company"] = ' Sondersperrung' . $sperre["kommentar"] . ''; + $tmp["hasChildren"] = (int) 0; + $tmp["parent"] = (int) $value["id"]; + $tmp["punkte"] = 0; + $tmp["nominiert"] = (int) 2; + $tmp["type"] = "sondersperrung"; + $tmp["gesperrt_bis"] = $sperre["gesperrt_bis"]; + $tmp["gesperrt_bis_sort"] = strtotime($sperre["gesperrt_bis"]); + _Berechnung::$_return[] = $tmp; + } + } + + // verschiebung_gegeben + if (isset($verschiebung_gegeben)) { + foreach ($verschiebung_gegeben as $key => $gegeben) { + $tmp = []; + $tmp["id"] = (int) $i; + $i++; + $tmp["company"] = ' '. $gegeben['prozente'] . '% der Punkte wurden übertragen zu ' . $gegeben["kommentar"] . ' Zeitraum bis zum ' . $gegeben['verschiebung_stichtag'] . ''; + $tmp["hasChildren"] = (int) 0; + $tmp["parent"] = (int) $value["id"]; + $tmp["punkte"] = "-" . $gegeben['punkte']; + $tmp["nominiert"] = (int) 2; + $tmp["type"] = "verschiebung_gegeben"; + $tmp["gesperrt_bis"] = ''; + _Berechnung::$_return[] = $tmp; + } + } + // verschiebung_empfangen + if (isset($verschiebung_empfangen)) { + foreach ($verschiebung_empfangen as $key => $empfangen) { + $tmp = []; + $tmp["id"] = (int) $i; + $i++; + $tmp["company"] = ' Punkte empfangen von ' . $empfangen["kommentar"] . 'Zeitraum bis zum ' . $empfangen['verschiebung_stichtag'] .''; + $tmp["hasChildren"] = (int) 0; + $tmp["parent"] = (int) $value["id"]; + $tmp["punkte"] = $empfangen['punkte']; + $tmp["nominiert"] = (int) 2; + $tmp["type"] = "verschiebung_empfangen"; + $tmp["gesperrt_bis"] = ''; + _Berechnung::$_return[] = $tmp; + } + } + + // $wettbewerbe = array_reverse($wettbewerbe); + foreach ($wettbewerbe as $key => $value2) { + if (is_array($value2)) { + /*** + [wettbewerb] => Bebauung Conrad v. Hötzendorfstr./Fröhlichgasse Graz + [verfahrensid] => 1628 + [verfahrensort] => Graz + [entscheidungstermin] => + [punkte] => 1.00 + [bezeichnung] => Regional beschränkt offener WB (1- oder mehrstufig) - Zulassungsgebiet Befugnis AT oder Stmk./Ktn. + [regelwerk] => Regelwerk V1 02/2016 + [monate_seit_entscheidungstermin] => 24208 + [punkte_aktive] => 0 + [gueltig_bis] => 30. Nov. 0004. + [sperrung_aktive] => 0 + [gesperrt_bis] => 30. May. 0001. + */ + // print_r($value2); + // exit; + $tmp = []; + $tmp["id"] = (int) $i; + $i++; + $tmp["info"] = $value2["bezeichnung"] . '
' . $value2["bezeichnung_punkte"]; + + + if ($value2["mit_sperrung"] == 0) { + $tmp["info"] .= '
Preis ohne Sperrung'; + } elseif (isset($value2["sperre_deaktiviert"]) and $value2["sperre_deaktiviert"] == 1) { + $tmp["info"] .= '
Wettbewerb mit Sperrung, Sperrung deaktiviert'; + } else { + $tmp["info"] .= '
Wettbewerb mit Sperrung'; + } + + $tmp["company"] = '' . $value2["verfahrensid"] . ''; + + if ($value2["mit_sperrung"] == 1) { + $tmp["company"] .= ' Geladen'; + } + + $tmp["company"] .= $value2["wettbewerb"]; + + $tmp["gesperrt_bis"] = ''; + if (isset($value2["sperrung_aktive"]) and $value2["sperrung_aktive"] == 1) { + $tmp["gesperrt_bis"] = $value2["gesperrt_bis"]; + $tmp["gesperrt_bis_sort"] = strtotime($value2["gesperrt_bis"]); + } + + // $tmp["company"] .= ''; + // if (isset($value2["sperrung_aktive"]) and $value2["sperrung_aktive"]==1) { + // $tmp["company"] .= 'Sperrung bis: '.$value2["gesperrt_bis"].''; + // } + // + // if (isset($value2["von_transfer"])) { + // $tmp["company"] .= $value2["von_transfer"]; + // $tmp["info"] = ""; + // } else { + // $tmp["company"] .= 'Gültig bis:'; + // } + // $tmp["company"] .= ''; + + $tmp["hasChildren"] = (int) 0; + $tmp["parent"] = (int) $value["id"]; + $tmp["punkte"] = (float) $value2["punkte"]; + if ((float) $value2["punkte"]) { + $tmp["valid"] = $value2["gueltig_bis"]; + } + $tmp["nominiert"] = (int) 2; + // $tmp["sortdatum"] = (int)$value2["sortdatum"]+$key; + $tmp["punkte_aktive"] = $value2["punkte_aktive"]; + $tmp["geladen"] = $value2["mit_sperrung"]; + $tmp["type"] = "wettbewerb"; + _Berechnung::$_return[] = $tmp; + } + } + //if($value["user_id"]==140){ + // print_r(_Berechnung::$_return); + // exit; + //} + } + } +} diff --git a/packages/zuladungsliste/Classes/Liste/Recalculate.php b/packages/zuladungsliste/Classes/Liste/Recalculate.php new file mode 100644 index 0000000..0bc23a1 --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/Recalculate.php @@ -0,0 +1,101 @@ +getConnectionForTable('tx_zuladungsliste_archive_admin'); + $connection->truncate('tx_zuladungsliste_archive_admin'); + $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tx_zuladungsliste_archive_user'); + $connection->truncate('tx_zuladungsliste_archive_user'); + + $month = 6; + $timestamp = 0; + while ($timestamp < time()) { + ++$month; + // fixed to 15 + $timestamp = mktime(0, 0, 0, $month, 15, 2017); + // $timestamp = mktime(0, 0, 0, $month, 15, 2023); + + if ($timestamp >= time()) { + echo 1; + exit; + } + + $berechnen::$_config['berechne_bis'] = $timestamp; + $berechnen::berechnen(); + + if (isset($berechnen::$_data['liste'])) { + + ListeTree::set_dijit(); + + $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_archive_admin'); + $connection + ->insert('tx_zuladungsliste_archive_admin') + ->values([ + 'tstamp' => time(), + 'crdate' => $timestamp, + 'liste' => json_encode(Encoding::fixUTF8($berechnen::$_return)), + ]) + ->execute(); + $uid_archive_admin = $connection->getConnection()->lastInsertId(); + + + $userid = 0; + $user_arr = []; + foreach ($berechnen::$_return as $key => $value) { + if ($value["hasChildren"] == 1) { + $insert_array = []; + $insert_array["tstamp"] = $timestamp; + $insert_array["crdate"] = $timestamp; + $insert_array["user_id"] = $value["user_id"]; + $insert_array["archive_admin_uid"] = $uid_archive_admin; + $insert_array["company"] = $value["company"]; + $insert_array["name"] = $value["name"]; + $insert_array["punkte"] = $value["punkte"]; + $insert_array["nominiert"] = $value["nominiert"]; + $insert_array["rang"] = $value["rang"]; + $insert_array["pos"] = $value["pos"]; + $insert_array["gesperrt_bis"] = $value["gesperrt_bis"]; + + $userid = $value["id"]; + $user_arr[$userid]["user"] = $insert_array; + } else { + $user_arr[$userid]["data"][] = $value; + } + } + foreach ($user_arr as $key => $value) { + $insert_array = []; + $insert_array = $value["user"]; + + if (is_array($value["data"]) and count($value["data"]) > 0) { + + $insert_array["auswertung"] = json_encode(Encoding::fixUTF8($value["data"])); + $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_archive_user'); + $connection + ->insert('tx_zuladungsliste_archive_user') + ->values($insert_array) + ->execute(); + } + } + } + } + echo 1; + exit; + } +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Liste/_ListeController.php b/packages/zuladungsliste/Classes/Liste/_ListeController.php new file mode 100644 index 0000000..097b085 --- /dev/null +++ b/packages/zuladungsliste/Classes/Liste/_ListeController.php @@ -0,0 +1,61 @@ + + * + * All rights reserved + * ************************************************************* */ + +class _ListeController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'load_liste_admin': + ListeAdmin::load(); + break; + case 'load_freischaltungen': + Freischaltungen::load(); + break; + case 'freischaltung_aktivieren': + Freischaltungen::aktivieren(); + break; + case 'freischaltung_ablehnen': + Freischaltungen::ablehnen(); + break; + case "load_einreichungen": + EinreichungenAdmin::load(); + break; + case "disable_einreichung": + EinreichungenAdmin::disable(); + break; + case "update_einreichung": + EinreichungenAdmin::update(); + break; + case 'liste_alles_neu': + Recalculate::run(); + break; + case 'cron_latest': + // https://zuladungsliste.nuhodds.com/app/administration?zlcontroller=liste_controller&xaction=liste_alles_neu + break; + default: + Message::error(__FILE__, __LINE__, 'no xaction switch defined'); + } + } +} diff --git a/packages/zuladungsliste/Classes/Middleware/Ajax.php b/packages/zuladungsliste/Classes/Middleware/Ajax.php new file mode 100644 index 0000000..a1ff53c --- /dev/null +++ b/packages/zuladungsliste/Classes/Middleware/Ajax.php @@ -0,0 +1,74 @@ +handle($request); + if (!isset($request->getQueryParams()['zlcontroller'])) { + return $response; + } + $xaction = $request->getQueryParams()['xaction']; + // $user = $GLOBALS['TSFE']->fe_user->user; + $zlcontroller = $request->getQueryParams()['zlcontroller']; + + switch ($zlcontroller) { + case 'bootstrap_controller': + new _BootstrapController($xaction); + break; + case 'liste_controller': + new _ListeController($xaction); + break; + case 'download_controller': + new _DownloadController($xaction); + break; + case 'zuteilungen_controller': + new _ZuteilungenController($xaction); + break; + case 'zuladungsliste_controller': + new _ZuladungslisteController($xaction); + break; + case 'punktezuweisung_controller': + new _PunkteZuweisungController($xaction); + break; + case 'einreichen_controller': + new _EinreichenController($xaction); + break; + case 'user_controller': + new _UserController($xaction); + break; + case 'upload_controller': + new _UploadController($xaction); + break; + default: + _Berechnung::$_return = ['error' => __FILE__.': call \''.$zlcontroller.'\' not implemented']; + break; + } + + return new JsonResponse(_Berechnung::$_return); + } +} diff --git a/packages/zuladungsliste/Classes/PunkteZuweisung/Preise.php b/packages/zuladungsliste/Classes/PunkteZuweisung/Preise.php new file mode 100644 index 0000000..47f08e5 --- /dev/null +++ b/packages/zuladungsliste/Classes/PunkteZuweisung/Preise.php @@ -0,0 +1,118 @@ + + *¨ + * All rights reserved + * ************************************************************* */ + +class Preise +{ + /** + * @return void + */ + public static function laden() + { + $kriteriumid = GeneralUtility::_GP('kriteriumid'); + $wettbewerbid = GeneralUtility::_GP('wettbewerbid'); + + $user = $GLOBALS['TSFE']->fe_user->user; + + // $punktestatus = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows("uid_punkte, tstamp_zuordnung, tstamp_aktivierung", "tx_zuladungsliste_wettbewerbe_architekten_mm", + // "uid_wettbewerbe=$wettbewerb_id AND uid_user=$user_id AND uid_punkte>0", "", "", "", "uid_punkte"); + + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder + ->select('uid_punkte', 'tstamp_zuordnung', 'tstamp_aktivierung') + ->from('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->where( + $queryBuilder->expr()->eq('uid_user', (int) $user['uid']), + $queryBuilder->expr()->gt('uid_punkte', 0), + $queryBuilder->expr()->eq('uid_wettbewerbe', (int) $wettbewerbid) + ) + ->orderBy('uid_punkte'); + $res = $queryBuilder->execute()->fetchAll(); + + $punktestatus = []; + $closed=false; + foreach ($res as $key => $value) { + $punktestatus[$value['uid_punkte']] = $value; + if ($value["tstamp_aktivierung"]>0) { + $closed=true; + } + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_punkte'); + $queryBuilder + ->select( + 'tx_zuladungsliste_domain_model_punkte.uid', + 'tx_zuladungsliste_domain_model_punkte.bezeichnung', + 'b.sorting', + 'b.punkte', + 'b.uid_punkte' + ) + ->from('tx_zuladungsliste_domain_model_punkte') + ->leftJoin( + 'tx_zuladungsliste_domain_model_punkte', + 'tx_zuladungsliste_punkte_kriterien_mm', + 'b', + $queryBuilder->expr()->eq( + 'b.uid_punkte', + $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_punkte.uid') + ) + ) + ->where( + $queryBuilder->expr()->eq('b.uid_kriterien', (int) $kriteriumid) + ); + $_punkte_kriterien = $queryBuilder->execute()->fetchAll(); + + // echo $queryBuilder->getSQL(); + $_return = []; + foreach ($_punkte_kriterien as $key => $value) { + $value["sorting"] = (int)$value["sorting"]; + $value["status"] = 0; + $value["tstamp_zuordnung"] = ""; + $value["tstamp_aktivierung"] = ""; + + $punkteId = $value["uid_punkte"]; + if (isset($punktestatus[$punkteId])) { + $tmp = $punktestatus[$punkteId]; + + if ($tmp["tstamp_zuordnung"]>0) { + $value["tstamp_zuordnung"] = date("d. M. Y", $tmp["tstamp_zuordnung"]); + $value["status"] = 1; + } + if ($tmp["tstamp_aktivierung"]>0) { + $value["tstamp_aktivierung"] = date("d. M. Y", $tmp["tstamp_aktivierung"]); + } + } + if ($closed) { + $value["status"] = 2; + } + $_return[] = $value; + } + + header('Content-Type: application/json'); + echo json_encode($_return); + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/PunkteZuweisung/PunkteZuweisen.php b/packages/zuladungsliste/Classes/PunkteZuweisung/PunkteZuweisen.php new file mode 100644 index 0000000..ef0e60e --- /dev/null +++ b/packages/zuladungsliste/Classes/PunkteZuweisung/PunkteZuweisen.php @@ -0,0 +1,170 @@ + + *¨ + * All rights reserved + * ************************************************************* */ + +class PunkteZuweisen +{ + /** + * @return void + */ + public static function setzen() + { + $user = $GLOBALS['TSFE']->fe_user->user; + + $debug = 0; + + $kriteriumid = GeneralUtility::_GP('kriteriumid'); + $wettbewerbid = GeneralUtility::_GP('wettbewerbid'); + + $arr = json_decode(GeneralUtility::_GP('data'), true); + $zuweisung_uid_punkte = (int) $arr["uid_punkte"]; + + if (!is_numeric($zuweisung_uid_punkte)) { + if ($debug) { + Message::note("zuweisung_uid_punkte fehlt"); + } + exit; + } + if (!is_numeric($kriteriumid)) { + if ($debug) { + Message::note("kriteriumid fehlt"); + } + exit; + } + if (!is_numeric($wettbewerbid)) { + if ($debug) { + Message::note("wettbewerbid fehlt"); + } + exit; + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder + ->select('uid', 'uid_wettbewerbe', 'uid_user', 'uid_punkte', 'sorting', 'tstamp', 'crdate', 'tstamp_zuordnung', 'tstamp_aktivierung') + ->from('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->where( + $queryBuilder->expr()->eq('uid_user', (int) $user['uid']), + $queryBuilder->expr()->eq('uid_wettbewerbe', (int) $wettbewerbid) + ) + ->orderBy('uid_punkte'); + $active_punkte = $queryBuilder->execute()->fetchAll(); + + // echo $queryBuilder->getSQL(); + // + // print_r($active_punkte); + // + // exit; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_punkte'); + $queryBuilder + ->select( + 'tx_zuladungsliste_domain_model_punkte.uid', + 'tx_zuladungsliste_domain_model_punkte.bezeichnung', + 'b.sorting', + 'b.punkte', + 'b.uid_punkte' + ) + ->from('tx_zuladungsliste_domain_model_punkte') + ->leftJoin( + 'tx_zuladungsliste_domain_model_punkte', + 'tx_zuladungsliste_punkte_kriterien_mm', + 'b', + $queryBuilder->expr()->eq( + 'b.uid_punkte', + $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_punkte.uid') + ) + ) + ->where( + $queryBuilder->expr()->eq('b.uid_kriterien', (int) $kriteriumid) + ); + $kriterien = $queryBuilder->execute()->fetchAll(); + + if ($debug) { + Message::note($queryBuilder->getSQL()); + } + + //Kontrolle if uid_punkte existiert in den kriterien für diesen wettbewerb + $_uid_punkte = array_column($kriterien, 'uid_punkte'); + if (!in_array($zuweisung_uid_punkte, $_uid_punkte)) { + if ($debug) { + Message::note("uid_punkte existiert nicht in den kriterien für diesen wettbewerb"); + } + exit; + } + + + + if (count($active_punkte)) { + if ($active_punkte[0]["uid_punkte"]==$zuweisung_uid_punkte) { + // PUNKTE ZUWEISUNG VOM BENUTZER GELÖSCHT + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder + ->delete('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->where( + $queryBuilder->expr()->eq('uid_user', (int) $user['uid']), + $queryBuilder->expr()->eq('uid_wettbewerbe', (int) $wettbewerbid) + ) + ->execute(); + } else { + // UPDATE PUNKTE + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder->update('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->where( + $queryBuilder->expr()->eq('uid_user', (int) $user['uid']), + $queryBuilder->expr()->eq('uid_wettbewerbe', (int) $wettbewerbid) + ) + ->set('tstamp', (int) time()) + ->set('tstamp_zuordnung', (int) time()) + ->set('uid_punkte', (int) $zuweisung_uid_punkte) + ->execute(); + } + } else { + // PUNKTE NEU ZUGETEILT + + $insertArray = array(); + $insertArray['crdate'] = time(); + $insertArray['pid'] = WETTBEWERBE_PID; + $insertArray['tstamp_zuordnung'] = time(); + $insertArray['uid_punkte'] = $zuweisung_uid_punkte; + $insertArray['uid_wettbewerbe'] = $wettbewerbid; + $insertArray['uid_user'] = $user['uid']; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + $queryBuilder + ->insert('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->values($insertArray) + ->execute(); + } + + if ($debug) { + Message::note($queryBuilder->getSQL()); + } + + echo 1; + exit; + } +} diff --git a/packages/zuladungsliste/Classes/PunkteZuweisung/PunkteZuweisungen.php b/packages/zuladungsliste/Classes/PunkteZuweisung/PunkteZuweisungen.php new file mode 100644 index 0000000..74dbbef --- /dev/null +++ b/packages/zuladungsliste/Classes/PunkteZuweisung/PunkteZuweisungen.php @@ -0,0 +1,94 @@ + + *¨ + * All rights reserved + * ************************************************************* */ + +class PunkteZuweisungen +{ + /** + * @return void + */ + public static function laden() + { + $user = $GLOBALS['TSFE']->fe_user->user; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe'); + // $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('uid', 'wettbewerb', 'bundesland', 'kriteriumid', 'entscheidungstermin', 'abgabetermin') + ->from('tx_zuladungsliste_domain_model_wettbewerbe'); + $_wettbewerbe = $queryBuilder->execute()->fetchAll(); + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_wettbewerbe_architekten_mm'); + // $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('uid_wettbewerbe', 'tstamp_zuordnung', 'tstamp_aktivierung') + ->from('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->where($queryBuilder->expr()->eq('uid_user', (int) $user['uid'])); + $res = $queryBuilder->execute()->fetchAll(); + $punktestatus = []; + foreach ($res as $key => $value) { + $punktestatus[$value['uid_wettbewerbe']] = $value; + } + + $bundeslaender = Resources::bundeslaender(); + $bundeslaender = array_flip($bundeslaender); + + $_return = []; + foreach ($_wettbewerbe as $key => $value) { + $value["bundeslandid"] = $bundeslaender[$value["bundesland"]]; + $year = date('Y', strtotime($value["entscheidungstermin"])); + + if (strtotime($value["entscheidungstermin"]) > 0) { + $value["jahr"] = (int) $year; + } else { + $value["jahr"] = (int) date('Y', strtotime($value["abgabetermin"])); + } + + unset($value["entscheidungstermin"]); + unset($value["abgabetermin"]); + + $wettbewerbeId = $value["uid"]; + + $value["status"] = 0; + if (isset($punktestatus[$wettbewerbeId])) { + $tmp = $punktestatus[$wettbewerbeId]; + + if ($tmp["tstamp_zuordnung"]>0) { + $value["status"] = 1; + } + + if ($tmp["tstamp_aktivierung"]>0) { + $value["status"] = 2; + } + } + + $_return[] = $value; + } + + header('Content-Type: application/json'); + echo json_encode($_return); + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/PunkteZuweisung/_PunkteZuweisungController.php b/packages/zuladungsliste/Classes/PunkteZuweisung/_PunkteZuweisungController.php new file mode 100644 index 0000000..83a4aa7 --- /dev/null +++ b/packages/zuladungsliste/Classes/PunkteZuweisung/_PunkteZuweisungController.php @@ -0,0 +1,41 @@ + + * + * All rights reserved + * ************************************************************* */ + +class _PunkteZuweisungController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'lade_punktezuweisungen': + PunkteZuweisungen::laden(); + break; + case 'lade_preise': + Preise::laden(); + break; + case 'setze_punktezuweisungen': + PunkteZuweisen::setzen(); + break; + default: + Message::error(__FILE__, __LINE__, 'no xaction switch defined'); + } + } +} diff --git a/packages/zuladungsliste/Classes/Scheduler/CronTask.php b/packages/zuladungsliste/Classes/Scheduler/CronTask.php new file mode 100644 index 0000000..ef7ce20 --- /dev/null +++ b/packages/zuladungsliste/Classes/Scheduler/CronTask.php @@ -0,0 +1,17 @@ +run(); + } +} diff --git a/packages/zuladungsliste/Classes/Upload/Upload.php b/packages/zuladungsliste/Classes/Upload/Upload.php new file mode 100644 index 0000000..5ac8d6d --- /dev/null +++ b/packages/zuladungsliste/Classes/Upload/Upload.php @@ -0,0 +1,118 @@ + + * + * All rights reserved + * ************************************************************* */ + +class Upload +{ + /** + * + * @return bool + */ + public static function einreichen() + { + /*** UPLOAD FILE start ***/ + $user = $GLOBALS['TSFE']->fe_user->user; + $user_id = $user['uid']; + $upload_dir = Environment::getPublicPath() . "/uploads/tx_zuladungsliste/$user_id"; + if (!is_dir($upload_dir)) { + GeneralUtility::mkdir($upload_dir); + } + $insert_array = []; + $insert_array['dokument_orig_name'] = ""; + $insert_array['dokument_size'] = ""; + $insert_array['dokument_type'] = ""; + if (isset($_FILES['uploadedfile'])) { + $dokument_size = $_FILES['uploadedfile']['size']; + $dokument_orig_name = $_FILES['uploadedfile']['name']; + $dokument_orig_type = $_FILES['uploadedfile']['type']; + move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $upload_dir . '/' . $dokument_orig_name); + } + foreach ($_POST as $nm => $val) { + $postdata[$nm] = $val; // array for html + } + $data = ["Bitte Wählen","Burgenland","Kärnten","Niederösterreich","Oberösterreich","Salzburg","Steiermark","Tirol","Vorarlberg","Wien"]; + $insert_array = []; + $insert_array['crdate'] = time(); + $insert_array['tstamp'] = time(); + $insert_array['cruser_id'] = $user_id; + $insert_array['wettbewerb'] = htmlspecialchars($postdata['formwettbewerb']); + $insert_array['beschreibung'] = htmlspecialchars($postdata["formbeschreibung"]); + $insert_array['entscheidungstermin'] = htmlspecialchars($postdata["formentscheidungstermin"]); + $insert_array['verfahrensort'] = htmlspecialchars($postdata["formverfahrensort"]); + $insert_array['bundesland'] = $data[$postdata["formbundesland"]]; + $insert_array['dokument_orig_name'] = $dokument_orig_name; + $insert_array['dokument_size'] = round($dokument_size/1024, 2) . "k"; + $insert_array['dokument_type'] = "pdf"; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen'); + $queryBuilder + ->insert('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->values($insert_array) + ->execute(); + + echo 1; + exit; + } + + /** + * + * @return bool + */ + public static function aktualisieren() + { + /*** UPLOAD FILE start ***/ + $uid = GeneralUtility::_GP("uid"); + if (!is_numeric($uid)) { + echo 1; + exit; + } + + $user = $GLOBALS['TSFE']->fe_user->user; + $user_id = $user['uid']; + $upload_dir = Environment::getPublicPath() . "/uploads/tx_zuladungsliste/$user_id"; + if (!is_dir($upload_dir)) { + GeneralUtility::mkdir($upload_dir); + } + if (isset($_FILES['uploadedfile'])) { + $dokument_size = $_FILES['uploadedfile']['size']; + $dokument_orig_name = $_FILES['uploadedfile']['name']; + $dokument_orig_type = $_FILES['uploadedfile']['type']; + move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $upload_dir . '/' . $dokument_orig_name); + } + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen'); + $queryBuilder + ->update('tx_zuladungsliste_domain_model_wettbewerbe_einreichungen') + ->where( + $queryBuilder->expr()->eq('uid', (int) $uid) + ) + ->set('tstamp', time()) + ->set('dokument_orig_name', (string) $dokument_orig_name) + ->set('dokument_size', (string) round($dokument_size/1024, 2) . "k") + ->execute(); + + echo 1; + exit; + } +} diff --git a/packages/zuladungsliste/Classes/Upload/_UploadController.php b/packages/zuladungsliste/Classes/Upload/_UploadController.php new file mode 100644 index 0000000..7f2ae39 --- /dev/null +++ b/packages/zuladungsliste/Classes/Upload/_UploadController.php @@ -0,0 +1,41 @@ + + * + * All rights reserved + * ************************************************************* */ + +class _UploadController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'dokument_einreichen': + Upload::einreichen(); + break; + case 'dokument_aktualisieren': + Upload::aktualisieren(); + break; + default: + Message::error(__FILE__, __LINE__, 'no xaction switch defined'); + } + } +} diff --git a/packages/zuladungsliste/Classes/User/UserKonto.php b/packages/zuladungsliste/Classes/User/UserKonto.php new file mode 100644 index 0000000..80ec1d3 --- /dev/null +++ b/packages/zuladungsliste/Classes/User/UserKonto.php @@ -0,0 +1,199 @@ + + * + * All rights reserved + * ************************************************************* */ + +class UserKonto +{ + + public static function sichern(){ + $user = $GLOBALS['TSFE']->fe_user->user; + $data = GeneralUtility::_GP('data'); + $data = json_decode($data, true); + + $update_array = []; + foreach ($data as $key => $value) + { + switch ($value["fieldname"]) { + case "address": + $update_array["address"] = $value["value"]; + break; + case "zip": + $update_array["zip"] = $value["value"]; + break; + case "city": + $update_array["city"] = $value["value"]; + break; + case "title": + $update_array["title"] = $value["value"]; + break; + case "first_name": + $update_array["first_name"] = $value["value"]; + break; + case "last_name": + $update_array["last_name"] = $value["value"]; + break; + case "telephone": + $update_array["telephone"] = $value["value"]; + break; + } + } + + $user = $GLOBALS['TSFE']->fe_user->user; + + if(\count($update_array) == 7){ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users'); + $queryBuilder->update('fe_users') + ->where($queryBuilder->expr()->eq('uid', (int) $user['uid'])) + ->set('address', (string) $update_array['address']) + ->set('zip', (string) $update_array['zip']) + ->set('city', (string) $update_array['city']) + ->set('title', (string) $update_array['title']) + ->set('first_name', (string) $update_array['first_name']) + ->set('last_name', (string) $update_array['last_name']) + ->set('telephone', (string) $update_array['telephone']) + ->execute(); + } + // echo $queryBuilder->getSQL(); + + echo 1; + exit; + } + + public static function laden() + { + $user = $GLOBALS['TSFE']->fe_user->user; + + $return = []; + + $tmp = []; + $tmp['id'] = 0; + $tmp['editable'] = 0; + $tmp['title'] = 1; + $tmp['beschreibung'] = "Architektur"; + $tmp['value'] = 'Büro'; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 1; + $tmp['editable'] = 0; + $tmp['fieldname'] = 'company'; + $tmp['beschreibung'] = "Büroname:"; + $tmp['value'] = $user['company']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 2; + $tmp['editable'] = 0; + $tmp['fieldname'] = 'email'; + $tmp['beschreibung'] = "E-Mail:"; + $tmp['value'] = $user['email']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 3; + $tmp['editable'] = 1; + $tmp['fieldname'] = 'address'; + $tmp['beschreibung'] = "Büroanschrift:"; + $tmp['value'] = $user['address']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 4; + $tmp['editable'] = 1; + $tmp['fieldname'] = 'zip'; + $tmp['beschreibung'] = "PLZ:"; + $tmp['value'] = $user['zip']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 5; + $tmp['editable'] = 1; + $tmp['fieldname'] = 'city'; + $tmp['beschreibung'] = "Ort:"; + $tmp['value'] = $user['city']; + $return[] = $tmp; + + + + $tmp = []; + $tmp['id'] = 6; + $tmp['editable'] = 0; + $tmp['title'] = 1; + $tmp['beschreibung'] = "Verantwortliche"; + $tmp['value'] = 'Person'; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 7; + $tmp['editable'] = 1; + $tmp['fieldname'] = 'title'; + $tmp['beschreibung'] = "Titel:"; + $tmp['value'] = $user['title']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 8; + $tmp['editable'] = 1; + $tmp['fieldname'] = 'first_name'; + $tmp['beschreibung'] = "Vorname:"; + $tmp['value'] = $user['first_name']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 9; + $tmp['editable'] = 1; + $tmp['fieldname'] = 'last_name'; + $tmp['beschreibung'] = "Nachname:"; + $tmp['value'] = $user['last_name']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 10; + $tmp['editable'] = 0; + $tmp['fieldname'] = 'vereidigung'; + $tmp['beschreibung'] = "Tag der Vereidigung:"; + $tmp['value'] = $user['vereidigung']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 11; + $tmp['editable'] = 0; + $tmp['fieldname'] = 'kammermitgliedsnummer'; + $tmp['beschreibung'] = "Mitgliedsnummer:"; + $tmp['value'] = $user['kammermitgliedsnummer']; + $return[] = $tmp; + + $tmp = []; + $tmp['id'] = 12; + $tmp['editable'] = 1; + $tmp['fieldname'] = 'telephone'; + $tmp['beschreibung'] = "Telefon:"; + $tmp['value'] = $user['telephone']; + $return[] = $tmp; + + $return = json_encode($return); + header('Content-Type: application/json'); + echo $return; + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/User/_UserController.php b/packages/zuladungsliste/Classes/User/_UserController.php new file mode 100644 index 0000000..a369d63 --- /dev/null +++ b/packages/zuladungsliste/Classes/User/_UserController.php @@ -0,0 +1,40 @@ + + * + * All rights reserved + * ************************************************************* */ + +class _UserController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'lade_konto': + return UserKonto::laden(); + break; + case 'sichern_konto': + return UserKonto::sichern(); + break; + default: + Message::error(__FILE__, __LINE__, 'no xaction switch defined'); + } + } +} diff --git a/packages/zuladungsliste/Classes/Utilities/FileUtility.php b/packages/zuladungsliste/Classes/Utilities/FileUtility.php new file mode 100644 index 0000000..f06be27 --- /dev/null +++ b/packages/zuladungsliste/Classes/Utilities/FileUtility.php @@ -0,0 +1,40 @@ + 'Begründungen', 'id' => 'begruendung', 'ckecked' => false], + ['label' => 'Titel', 'id' => 'titel', 'ckecked' => false], + ['label' => 'Name', 'id' => 'name', 'ckecked' => true], + ['label' => 'Geburtsdatum', 'id' => 'geburtsdatum', 'ckecked' => true], + ['label' => 'Vereidigung', 'id' => 'vereidigung', 'ckecked' => true], + ['label' => 'Ältest Projekt in Wertung', 'id' => 'aeltesterEntscheidungstermin', 'ckecked' => false], + ['label' => 'Punkte', 'id' => 'punkte', 'ckecked' => true], + ['label' => 'Sperre', 'id' => 'sperre', 'ckecked' => true], + ['label' => 'Id', 'id' => 'id', 'ckecked' => false] + ]; + } + + public static function sperren() + { + return [ + ['id' => '1', 'label' => 'Default', 'value' => '0', 'selected' => true], + ['id' => '2', 'label' => '3 Monare', 'value' => '3'], + ['id' => '3', 'label' => '4 Monare', 'value' => '4'], + ['id' => '4', 'label' => '5 Monare', 'value' => '5'], + ['id' => '5', 'label' => '6 Monare', 'value' => '6'], + ['id' => '6', 'label' => '8 Monare', 'value' => '8'], + ['id' => '7', 'label' => '10 Monare', 'value' => '10'], + ['id' => '8', 'label' => '12 Monare', 'value' => '12'], + ['id' => '9', 'label' => '18 Monare', 'value' => '18'], + ['id' => '10', 'label' => '24 Monare', 'value' => '24'], + ]; + } + + public static function bundeslaender() + { + return [ + 'Burgenland', + 'Kärnten', + 'Niederösterreich', + 'Oberösterreich', + 'Salzburg', + 'Steiermark', + 'Tirol', + 'Vorarlberg', + 'Wien' + ]; + } + + public static function years() + { + $arr = range(2012, date('Y')); + rsort($arr); + return $arr; + } + + + public static function next() + { + return[ + ['id' => '1', 'label' => 'Nächste(r)'], + ['id' => '2', 'label' => 'Nächsten Zwei'] , + ['id' => '3', 'label' => 'Nächsten Drei'] , + ['id' => '4', 'label' => 'Nächsten Vier'] , + ['id' => '5', 'label' => 'Nächsten Fünf'] , + ['id' => '6', 'label' => 'Nächsten Sechs'] + ]; + } +} diff --git a/packages/zuladungsliste/Classes/Zuladungsliste/PositionArchitekt.php b/packages/zuladungsliste/Classes/Zuladungsliste/PositionArchitekt.php new file mode 100644 index 0000000..b5cb2e9 --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuladungsliste/PositionArchitekt.php @@ -0,0 +1,44 @@ + + * + * All rights reserved + * ************************************************************* */ + +class PositionArchitekt +{ + public static function laden() + { + //LOAD POSITION TREE Menu + // echo $GLOBALS['TYPO3_DB']->SELECTquery("uid, tstamp, punkte, rang, nominiert", "tx_zuladungsliste_archive_user", "user_id=$user_id AND hidden=0", "", "tstamp DESC"); + // exit; + $uid = preg_replace("'\D'", "", $_GET['uid']); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_archive_user'); + $queryBuilder + ->select('auswertung') + ->from('tx_zuladungsliste_archive_user') + ->where($queryBuilder->expr()->eq('uid', (int) $uid)); + $tmp = $queryBuilder->execute()->fetchAll(); + // echo $queryBuilder->getSQL(); + + header('Content-Type: application/json'); + echo $tmp[0]["auswertung"]; + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/Zuladungsliste/Punktezuweisung.php b/packages/zuladungsliste/Classes/Zuladungsliste/Punktezuweisung.php new file mode 100644 index 0000000..ef338c9 --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuladungsliste/Punktezuweisung.php @@ -0,0 +1,78 @@ + + * + * All rights reserved + * ************************************************************* */ + +// class PositionArchitekt +// { +// public static function laden() +// { +// //LOAD POSITION TREE Menu +// // echo $GLOBALS['TYPO3_DB']->SELECTquery("uid, tstamp, punkte, rang, nominiert", "tx_zuladungsliste_archive_user", "user_id=$user_id AND hidden=0", "", "tstamp DESC"); +// // exit; +// $uid = preg_replace("'\D'", "", $_GET['uid']); +// $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_archive_user'); +// $queryBuilder +// ->select('auswertung') +// ->from('tx_zuladungsliste_archive_user') +// ->where($queryBuilder->expr()->eq('uid', (int) $uid)); +// $tmp = $queryBuilder->execute()->fetchAll(); +// // echo $queryBuilder->getSQL(); +// +// // ---------- +// +// $arr2 = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows("uid id, wettbewerb, kriteriumid, bundesland, EXTRACT(YEAR FROM entscheidungstermin) entyear, EXTRACT(YEAR FROM abgabetermin) abgyear", "tx_zuladungsliste_domain_model_wettbewerbe", "deleted=0 AND hidden=0"); +// +// $punktestatus = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows("uid_wettbewerbe, tstamp_zuordnung, tstamp_aktivierung", "tx_zuladungsliste_wettbewerbe_architekten_mm", "uid_user=$user_id AND uid_punkte>0", "", "", "", "uid_wettbewerbe"); +// +// $arr = array(); +// foreach ($arr2 as $key => $value) { +// $value["status"] = 0; +// +// if ($value["entyear"]!=0) { +// $value["jahr"] = $value["entyear"]; +// } else { +// $value["jahr"] = $value["abgyear"]; +// } +// unset($value["entyear"]); +// unset($value["abgyear"]); +// +// $wettbewerbeId = $value["id"]; +// if (isset($punktestatus[$wettbewerbeId])) { +// $tmp = $punktestatus[$wettbewerbeId]; +// +// if ($tmp["tstamp_zuordnung"]>0) { +// $value["status"] = 1; +// } +// +// if ($tmp["tstamp_aktivierung"]>0) { +// $value["status"] = 2; +// } +// } +// $arr[] = $value; +// } +// +// +// header('Content-Type: application/json'); +// echo $tmp[0]["auswertung"]; +// exit(); +// } +// } diff --git a/packages/zuladungsliste/Classes/Zuladungsliste/TreemenuPosition.php b/packages/zuladungsliste/Classes/Zuladungsliste/TreemenuPosition.php new file mode 100644 index 0000000..55323c8 --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuladungsliste/TreemenuPosition.php @@ -0,0 +1,97 @@ + + * + * All rights reserved + * ************************************************************* */ + +class TreemenuPosition +{ + public static function laden() + { + //LOAD POSITION TREE Menu + // echo $GLOBALS['TYPO3_DB']->SELECTquery("uid, tstamp, punkte, rang, nominiert", "tx_zuladungsliste_archive_user", "user_id=$user_id AND hidden=0", "", "tstamp DESC"); + // exit; + $user = $GLOBALS['TSFE']->fe_user->user; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users'); + // $queryBuilder + // ->getRestrictions() + // ->removeByType(StartTimeRestriction::class) + // ->removeByType(EndTimeRestriction::class); + // $queryBuilder->getRestrictions()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('uid', 'tstamp', 'punkte', 'rang', 'nominiert', 'gesperrt_bis') + ->from('tx_zuladungsliste_archive_user') + ->where( + $queryBuilder->expr()->eq('user_id', (int) $user['uid']), + )->orderBy('tstamp', 'DESC'); + $tmp = $queryBuilder->execute()->fetchAll(); + + // echo $queryBuilder->getSQL(); + // debug($queryBuilder->getSQL()); + + // $tmp = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('uid, tstamp, punkte, rang, nominiert', 'tx_zuladungsliste_archive_user', "user_id=$user_id AND hidden=0", '', 'tstamp DESC'); + $arr = []; + $i = 1; + $p_year = 0; + foreach ($tmp as $value) { + //print_r($value); + $year = date('Y', $value['tstamp']); + if ($p_year != $year) { + $p_year = $year; + $arr[] = [ + 'title' => $year, + 'id' => (int) $i, + 'hasChildren' => (int) 1, + 'type' => 'year', + 'parent' => null, + ]; + $parentid = $i; + ++$i; + } + + $value["tstamp"] += 3600 * 12; + $date = new DateTime(); + $date->setTimestamp($value["tstamp"]); + $formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT); + $formatter->setPattern('dd. MMMM YYYY'); + $arr[] = [ + 'title' => $formatter->format($date), + 'hasChildren' => 0, + 'parent' => $parentid, + 'type' => 'month', + 'punkte' => $value['punkte'], + 'rang' => $value['rang'], + 'nominiert' => $value['nominiert'], + 'gesperrt_bis' => $value['gesperrt_bis'], + 'id' => $i, + 'uid' => $value['uid'], + ]; + ++$i; + } + + header('Content-Type: application/json'); + echo json_encode($arr); + exit(); + } +} \ No newline at end of file diff --git a/packages/zuladungsliste/Classes/Zuladungsliste/_ZuladungslisteController.php b/packages/zuladungsliste/Classes/Zuladungsliste/_ZuladungslisteController.php new file mode 100644 index 0000000..a097ddd --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuladungsliste/_ZuladungslisteController.php @@ -0,0 +1,40 @@ + + * + * All rights reserved + * ************************************************************* */ + +class _ZuladungslisteController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'lade_treemenu_position': + return TreemenuPosition::laden(); + case 'lade_position_architekt': + return PositionArchitekt::laden(); + case 'lade_punktezuweisung': + break; + default: + Message::error(__FILE__, __LINE__, 'no xaction switch defined'); + } + } +} diff --git a/packages/zuladungsliste/Classes/Zuteilungen/Zuteilung.php b/packages/zuladungsliste/Classes/Zuteilungen/Zuteilung.php new file mode 100644 index 0000000..3906dfc --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuteilungen/Zuteilung.php @@ -0,0 +1,140 @@ + + * + * All rights reserved + * ************************************************************* */ + +class Zuteilung +{ + /** + * @return void + */ + public static function laden() + { + // load for prit zuteilungen + $zuteilung_uid = preg_replace("'\D'", "", $_GET['zuladungid']); + if (!is_numeric($zuteilung_uid)) { + exit; + } + + // $arr = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows("a.uid id, a.tstamp, b.wettbewerb, a.anzahl_architekten", + // "tx_zuladungsliste_zuteilungen a, tx_zuladungsliste_domain_model_wettbewerbe b", + // "a.hidden=0 AND a.uid_wettbewerbe=b.uid AND a.uid=$zuteilung_uid"); + + + $limitSelection=date('Y-m-d', strtotime('-1 year')); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_zuteilungen'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('tx_zuladungsliste_zuteilungen.uid', 'tx_zuladungsliste_zuteilungen.tstamp', 'b.wettbewerb', 'tx_zuladungsliste_zuteilungen.anzahl_architekten') + ->from('tx_zuladungsliste_zuteilungen') + ->join( + 'tx_zuladungsliste_zuteilungen', + 'tx_zuladungsliste_domain_model_wettbewerbe', + 'b', + $queryBuilder->expr()->eq('b.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_zuteilungen.uid_wettbewerbe')), + ) + ->where($queryBuilder->expr()->eq('tx_zuladungsliste_zuteilungen.uid', $zuteilung_uid)); + $statement = $queryBuilder->execute()->fetchAll(); + + // Message::note($queryBuilder->getSQL()); + + $$print = ' + Print Zuladungsliste'; + + if (isset($_GET['print'])) { + $print .= '
'; + } else { + $print .= ''; + } + $print .= '

'.$statement[0]["wettbewerb"].'
vom '.date("d. M. y", (int)$statement[0]["tstamp"]).'

'; + + $limitSelection=date('Y-m-d', strtotime('-1 year')); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_zuteilungen'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select( + 'tx_zuladungsliste_zuteilungen_user.uid', + 'tx_zuladungsliste_zuteilungen_user.tstamp', + 'tx_zuladungsliste_zuteilungen_user.position', + 'tx_zuladungsliste_zuteilungen_user.ersatz', + 'b.company', + 'b.name' + ) + ->from('tx_zuladungsliste_zuteilungen_user') + ->join( + 'tx_zuladungsliste_zuteilungen_user', + 'fe_users', + 'b', + $queryBuilder->expr()->eq('b.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_zuteilungen_user.user_id')), + ) + ->where($queryBuilder->expr()->eq('tx_zuladungsliste_zuteilungen_user.uid_zuteilungen_user', $zuteilung_uid)) + ->orderBy('ersatz')->addOrderBy('position'); + + // Message::note($queryBuilder->getSQL()); + + + + $statement = $queryBuilder->execute()->fetchAll(); + + $nomiert = '

Nominierungen

'; + $nomiert .= ''; + $ersatz = '

Ersatz Nominierungen

'; + $ersatz .= ''; + + // if (count($statement)/2==$key) { + // $print .= ''; + // } + + foreach ($statement as $key => $value) { + $colorclass = $value["ersatz"] ? "ersatz" : "gewaehlt"; + + if ($value["ersatz"]) { + $ersatz .= ''; + $ersatz .= ''; + $ersatz .= ''; + $ersatz .= ''; + $ersatz .= ''; + $ersatz .= ''; + } else { + $nomiert .= ''; + $nomiert .= ''; + $nomiert .= ''; + $nomiert .= ''; + $nomiert .= ''; + $nomiert .= ''; + } + } + $nomiert .= '
'; + $ersatz .= ''; + + $print .= $nomiert; + $print .= $ersatz; + + if (isset($_GET['print'])) { + $print .= ''; + } + echo $print; + exit; + } +} diff --git a/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungNeu.php b/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungNeu.php new file mode 100644 index 0000000..c05a603 --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungNeu.php @@ -0,0 +1,122 @@ + + * + * All rights reserved + * ************************************************************* */ + +class ZuteilungNeu +{ + /** + * @return void + */ + public static function zuteilen() + { + $user = $GLOBALS['TSFE']->fe_user->user; + + /******************************************************** + * VARS + ********************************************************/ + $kammernid = GeneralUtility::_GP("kammernid"); + if (!is_numeric($kammernid)) { + exit; + } + $wettbewerb_uid = GeneralUtility::_GP("wettbewerb_uid"); + if (!is_numeric($wettbewerb_uid)) { + exit; + } + $next = GeneralUtility::_GP("next"); + if (!is_numeric($next)) { + exit; + } + + /******************************************************** + * NEXT + ********************************************************/ + $arr = Zuteilungen::laden($returnAsArray = true); + $next_array = Zuteilungen::filterNaechsten($arr, $next); + + /******************************************************** + * punkte uid with 0 punkte + * Platzhalter für Zuteilung + * bei gewinn erden punkte später zugeteilt + ********************************************************/ + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_punkte_kriterien_mm'); + $queryBuilder + ->select( + 'a.uid', + 'a.bezeichnung', + )->from('tx_zuladungsliste_punkte_kriterien_mm') + ->join( + 'tx_zuladungsliste_punkte_kriterien_mm', + 'tx_zuladungsliste_domain_model_punkte', + 'a', + $queryBuilder->expr()->eq('a.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_punkte_kriterien_mm.uid_punkte')) + ) + ->where($queryBuilder->expr()->eq('tx_zuladungsliste_punkte_kriterien_mm.punkte', 0)); + // Message::note($queryBuilder->getSQL()); + $zuweisung_uid_punkte = $queryBuilder->execute()->fetchOne(); + + $insert_array = []; + $insert_array['tstamp'] = time(); + $insert_array['crdate'] = time(); + $insert_array['pid'] = WETTBEWERBE_PID; + $insert_array['uid_user'] = $user['uid']; // Ersteller + $insert_array['uid_wettbewerbe'] = $wettbewerb_uid; + $insert_array['anzahl_architekten'] = $next; + + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_zuteilungen'); + $queryBuilder->insert('tx_zuladungsliste_zuteilungen')->values($insert_array)->execute(); + $uid_zuteilungen_user = $queryBuilder->getConnection()->lastInsertId(); + + foreach ($next_array as $key => $value) { + if ($value["ersatz"]==0) { + $insert_array = array(); + $insert_array['crdate'] = time(); + $insert_array['pid'] = WETTBEWERBE_PID; + $insert_array['tstamp_zuordnung'] = time(); + $insert_array['tstamp_aktivierung'] = time(); + $insert_array['uid_punkte'] = $zuweisung_uid_punkte; + $insert_array['uid_wettbewerbe'] = $wettbewerb_uid; + $insert_array['uid_user'] = $value["user_id"]; // Architekten + $queryBuilder + ->insert('tx_zuladungsliste_wettbewerbe_architekten_mm') + ->values($insert_array) + ->execute(); + } + $insert_array = array(); + $insert_array['tstamp'] = time(); + $insert_array['crdate'] = time(); + $insert_array['pid'] = WETTBEWERBE_PID; + $insert_array['uid_zuteilungen_user'] = $uid_zuteilungen_user; + $insert_array['user_id'] = $value["user_id"]; // Architekten + $insert_array['position'] = $key+1; + $insert_array['ersatz'] = $value["ersatz"]; + $queryBuilder + ->insert('tx_zuladungsliste_zuteilungen_user') + ->values($insert_array) + ->execute(); + } + sleep(1); + echo $uid_zuteilungen_user; + exit; + } +} diff --git a/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungWettbewerbe.php b/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungWettbewerbe.php new file mode 100644 index 0000000..d43b5f8 --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungWettbewerbe.php @@ -0,0 +1,78 @@ + + * + * All rights reserved + * ************************************************************* */ + +class ZuteilungWettbewerbe +{ + /** + * @return void + */ + public static function laden() + { + $limitSelection=date('Y-m-d', strtotime('-1 year')); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_domain_model_wettbewerbe'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('tx_zuladungsliste_domain_model_wettbewerbe.uid', 'tx_zuladungsliste_domain_model_wettbewerbe.wettbewerb', 'tx_zuladungsliste_domain_model_wettbewerbe.sperre_deaktiviert') + ->from('tx_zuladungsliste_domain_model_wettbewerbe') + ->join( + 'tx_zuladungsliste_domain_model_wettbewerbe', + 'tx_zuladungsliste_domain_model_kriterien', + 'b', + $queryBuilder->expr()->eq('b.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_domain_model_wettbewerbe.kriteriumid')) + ) + ->where( + $queryBuilder->expr()->gt('tx_zuladungsliste_domain_model_wettbewerbe.entscheidungstermin', $queryBuilder->createNamedParameter($limitSelection)), + $queryBuilder->expr()->eq('b.sperrung', (int) 1) + ); + $statement = $queryBuilder->execute()->fetchAll(); + + // Message::note($queryBuilder->getSQL()); + + // select wettbewerb für zuteilung + // $limitSelection=date('Y-m-d', strtotime('-1 year')); + // // echo $GLOBALS['TYPO3_DB']->SELECTquery("a.uid id, a.wettbewerb name", "tx_zuladungsliste_domain_model_wettbewerbe a, tx_zuladungsliste_domain_model_kriterien b", "a.deleted=0 AND a.hidden=0 AND a.entscheidungstermin>'".$limitSelection."' AND a.kriteriumid=b.uid AND b.sperrung=1","","a.sperre_deaktiviert ASC, a.entscheidungstermin ASC"); + // $tmp = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows( + // "a.uid id, a.wettbewerb name, a.sperre_deaktiviert", + // "tx_zuladungsliste_domain_model_wettbewerbe a, tx_zuladungsliste_domain_model_kriterien b", + // "a.deleted=0 AND a.hidden=0 AND a.entscheidungstermin>'".$limitSelection."' AND a.kriteriumid=b.uid AND b.sperrung=1", + // "", + // "a.uid DESC" + // ); + // $arr=[]; + // while (list($key, $value) = each($tmp)) { + // if ($value["sperre_deaktiviert"]==1) { + // $value["label"] = '
' . $value["name"] . '
(Sperre deaktiviert).'; + // } else { + // $value["label"] = '' . $value["name"] . ""; + // } + // $arr[] = $value; + // } + + + header('Content-Type: application/json'); + echo json_encode($statement); + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/Zuteilungen/Zuteilungen.php b/packages/zuladungsliste/Classes/Zuteilungen/Zuteilungen.php new file mode 100644 index 0000000..f47aaa2 --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuteilungen/Zuteilungen.php @@ -0,0 +1,86 @@ + + * + * All rights reserved + * ************************************************************* */ + +class Zuteilungen +{ + /** + * @return void + */ + public static function laden($return_array = false) + { + $liste = new _Berechnung(); + $liste::berechnen(); + + $_p = ['n2','n3','n4','n5','n6','e2','e3','e4','e5','e6']; + + $_arr = []; + foreach (_Berechnung::$_data['liste'] as $key => $value) { + $door = false; + foreach ($_p as $k => $v) { + if (isset($value[$v]) and $value[$v] == 1) { + $value[$v] = (int) $value[$v]; + $door = true; + } + } + if ($door) { + unset($value['auswertung']); + $_arr[] = $value; + } + } + + if ($return_array) { + return $_arr; + } + + header('Content-Type: application/json'); + echo json_encode($_arr); + exit(); + } + + /** + * @return void + */ + public static function filterNaechsten($_arr, $dienaechsten) + { + $f1 = "n".$dienaechsten; + $f2 = "e".$dienaechsten; + // echo "\nf1: " . $f1; + // echo "\nf2: " . $f2; + // echo "\n"; + $next = []; + foreach ($_arr as $key => $value) { + if ((isset($value[$f1]) and $value[$f1]==1) || (isset($value[$f2]) and $value[$f2]==1)) { + $tmp = []; + $tmp['user_id'] = $value['user_id']; + $tmp['pos'] = $value['pos']; + $tmp['rang'] = $value['rang']; + $tmp["ersatz"] = $value[$f2] ? $value[$f2] : 0; + $tmp[$f1] = $value[$f1]; + $tmp[$f2] = $value[$f2]; + $next[] = $tmp; + } + } + return $next; + } +} diff --git a/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungenErteilt.php b/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungenErteilt.php new file mode 100644 index 0000000..88dd313 --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuteilungen/ZuteilungenErteilt.php @@ -0,0 +1,53 @@ + + * + * All rights reserved + * ************************************************************* */ + +class ZuteilungenErteilt +{ + /** + * @return void + */ + public static function laden() + { + $limitSelection=date('Y-m-d', strtotime('-1 year')); + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_zuladungsliste_zuteilungen'); + $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class)); + $queryBuilder + ->select('tx_zuladungsliste_zuteilungen.uid', 'tx_zuladungsliste_zuteilungen.tstamp', 'b.wettbewerb', 'tx_zuladungsliste_zuteilungen.anzahl_architekten') + ->from('tx_zuladungsliste_zuteilungen') + ->join( + 'tx_zuladungsliste_zuteilungen', + 'tx_zuladungsliste_domain_model_wettbewerbe', + 'b', + $queryBuilder->expr()->eq('b.uid', $queryBuilder->quoteIdentifier('tx_zuladungsliste_zuteilungen.uid_wettbewerbe')) + ); + $statement = $queryBuilder->execute()->fetchAll(); + + // Message::note($queryBuilder->getSQL()); + + header('Content-Type: application/json'); + echo json_encode($statement); + exit(); + } +} diff --git a/packages/zuladungsliste/Classes/Zuteilungen/_ZuteilungenController.php b/packages/zuladungsliste/Classes/Zuteilungen/_ZuteilungenController.php new file mode 100644 index 0000000..25bf0fb --- /dev/null +++ b/packages/zuladungsliste/Classes/Zuteilungen/_ZuteilungenController.php @@ -0,0 +1,50 @@ + + * + * All rights reserved + * ************************************************************* */ + +class _ZuteilungenController +{ + public function __construct($xaction) + { + switch ($xaction) { + case 'lade_zuteilungen': + Zuteilungen::laden(); + break; + case 'zuteilungen_wettbewerbe': + ZuteilungWettbewerbe::laden(); + break; + case 'zuteilungen_erteilt': + ZuteilungenErteilt::laden(); + break; + case 'zuteilung_laden': + Zuteilung::laden(); + break; + case 'neu_zuteilen': + ZuteilungNeu::zuteilen(); + break; + default: + Message::error(__FILE__, __LINE__, 'no xaction switch defined'); + } + } +} diff --git a/packages/zuladungsliste/Configuration/Extbase/Persistence/Classes.php b/packages/zuladungsliste/Configuration/Extbase/Persistence/Classes.php new file mode 100644 index 0000000..d7f06f2 --- /dev/null +++ b/packages/zuladungsliste/Configuration/Extbase/Persistence/Classes.php @@ -0,0 +1,21 @@ + [ + 'tableName' => 'fe_users', + 'recordType' => 'Tx_Zuladungsliste_Architekten', + 'subclasses' => [ + \HermannTelser\Zuladungsliste\Domain\Model\User::class + ] + ], + \HermannTelser\Zuladungsliste\Domain\Model\User::class => [ + 'tableName' => 'fe_users', + 'recordType' => 'Tx_Zuladungsliste_Architekten', + ], + \HermannTelser\Zuladungsliste\Domain\Model\Architekten::class => [ + 'tableName' => 'fe_users', + 'recordType' => 'Tx_Zuladungsliste_Architekten', + ] +]; diff --git a/packages/zuladungsliste/Configuration/FlexForms/flexform_zuladungsliste.xml b/packages/zuladungsliste/Configuration/FlexForms/flexform_zuladungsliste.xml new file mode 100644 index 0000000..e910621 --- /dev/null +++ b/packages/zuladungsliste/Configuration/FlexForms/flexform_zuladungsliste.xml @@ -0,0 +1,37 @@ + + + 1 + + + + + + Zuladungsliste Konfiguration + + array + + + + + reload + + select + + + Administration + 1 + + + Zuladungsliste + 2 + + + 0 + + + + + + + + diff --git a/packages/zuladungsliste/Configuration/RequestMiddlewares.php b/packages/zuladungsliste/Configuration/RequestMiddlewares.php new file mode 100644 index 0000000..b966e22 --- /dev/null +++ b/packages/zuladungsliste/Configuration/RequestMiddlewares.php @@ -0,0 +1,12 @@ + [ + 'HermannTelser/zuladungsliste/ajaxzuladungsliste' => [ + 'target' => \HermannTelser\Zuladungsliste\Middleware\Ajax::class, + 'after' => [ + 'typo3/cms-frontend/prepare-tsfe-rendering' + ] + ], + ], +]; diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/fe_users.php b/packages/zuladungsliste/Configuration/TCA/Overrides/fe_users.php new file mode 100644 index 0000000..7070271 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/fe_users.php @@ -0,0 +1,206 @@ + 0, + 'label' => 'LLL:EXT:zuladungsliste/Resources/Private/Language/locallang_db.xlf:tx_zuladungsliste.tx_extbase_type', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => array( + array('Architekten','Tx_Zuladungsliste_Architekten') + ), + 'default' => 'Tx_Zuladungsliste_Architekten', + 'size' => 1, + 'maxitems' => 1, + ) + ); + \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('fe_users', $tempColumnstx_zuladungsliste_fe_users, 1); +} + +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( + 'fe_users', + $GLOBALS['TCA']['fe_users']['ctrl']['type'], + '', + 'after:' . $GLOBALS['TCA']['fe_users']['ctrl']['label'] +); + +$GLOBALS['TCA']['fe_users']['ctrl']['formattedLabel_userFunc'] = 'HermannTelser\\Zuladungsliste\\Backend\\Labels->loadArchitekten'; +$GLOBALS['TCA']['fe_users']['feInterface']['fe_admin_fieldList'] .= ',kammermitgliedsnummer'; +$GLOBALS['TCA']['fe_users']['ctrl']['label'] = 'company'; +$tmp_zuladungsliste_columns = array( + 'kammermitgliedsnummer' => array( + 'exclude' => 0, + 'label' => 'ZT Kammer Mitgliedsnummer', + 'config' => array( + 'type' => 'input', + 'size' => 10, + 'eval' => 'unique' + ) + ), + 'inliste' => array( + 'exclude' => 0, + 'label' => 'In Zuladungsliste', + 'config' => array( + 'type' => 'check', + 'default' => 0 + ) + ), + 'vereidigung' => array( + 'exclude' => 0, + 'label' => 'Tag der Vereidigung', + 'config' => array( + 'renderType' => 'inputDateTime', + 'dbType' => 'date', + 'type' => 'input', + 'size' => 7, + 'format' => 'date', + 'eval' => 'date', + 'checkbox' => 1, + 'disableAgeDisplay' => 1, + 'default' => '0000-00-00' + ), + ), + 'frauenfoerderpunkt' => array( + 'exclude' => 0, + 'label' => 'Frauenförderpunkt', + 'config' => array( + 'type' => 'check', + 'default' => 0 + ) + ), + 'solidaritaetserklaerung' => array( + 'exclude' => 0, + 'label' => 'Solidaritätserklärung', + 'config' => array( + 'type' => 'check', + 'default' => 0 + ) + ), + 'kontoaufloesung_active' => array( + 'exclude' => 0, + 'label' => 'Kontoauflösung (gültig nur mit Stichtag)', + 'config' => array( + 'renderType' => 'inputDateTime', + 'dbType' => 'date', + 'type' => 'input', + 'size' => 7, + 'format' => 'date', + 'eval' => 'date', + 'checkbox' => 1, + 'disableAgeDisplay' => 1, + 'default' => '0000-00-00' + ), + ), + 'kontoaufloesung_begruendung' => [ + 'label' => 'Begründung der Auslistung, z.B.: Pension, Abmeldung, Zusammenlegung..)', + 'config' => array( + 'type' => 'text' + ), + ], + 'extrasperrung' => array( + 'exclude' => 0, + 'label' => 'Sperrungen', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_extrasperrung_user_mm', + 'foreign_field' => 'uid_user', + 'foreign_label' => 'uid_extrasperrung', + 'appearance' => array( + 'expandSingle' => 1, + 'newRecordLinkAddTitle' => 0, + 'levelLinksPosition' => 'both', + ), + ), + ), + 'wettbewerbe' => array( + 'exclude' => 0, + 'label' => 'Wettbewerbe', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_wettbewerbe_architekten_mm', + 'foreign_field' => 'uid_user', + 'foreign_label' => 'uid_wettbewerbe', + 'appearance' => array( + 'expandSingle' => 1, + 'newRecordLinkAddTitle' => 0, + 'levelLinksPosition' => 'both', + ), + ), + ), + 'kammernid' => array( + 'exclude' => 0, + 'label' => 'Kammer Zuordnung', + 'config' => array( + 'type' => 'select', + 'size' => 1, + 'renderType' => 'selectSingle', + 'items' => array( + array(' --- Bitte wählen --- ',0) + ), + 'foreign_table' => 'tx_zuladungsliste_domain_model_kammern', + ) + ), + 'kontoaufloesung' => array( + 'exclude' => 0, + 'label' => 'Punkte Verteilung (optional)', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_konto_aufloesung_mm', + 'foreign_field' => 'uid_geber', + 'foreign_label' => 'uid_empfaenger', + ), + ), + 'punkteverschiebung' => array( + 'exclude' => 0, + 'label' => 'Punkte verschieben', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_punkte_verschiebung_mm', + 'foreign_field' => 'uid_geber', + 'foreign_label' => 'uid_empfaenger', + ), + ), +); + +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('fe_users', $tmp_zuladungsliste_columns); + + +/* inherit and extend the show items from the parent class */ + +// debug($GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']); + +// if (isset($GLOBALS['TCA']['fe_users']['types']['0']['showitem'])) { +// $GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] = $GLOBALS['TCA']['fe_users']['types']['0']['showitem']; +// } elseif (is_array($GLOBALS['TCA']['fe_users']['types'])) { +// // use first entry in types array +// $fe_users_type_definition = reset($GLOBALS['TCA']['fe_users']['types']); +// $GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] = $fe_users_type_definition['showitem']; +// } else { +// $GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] = ''; +// } + + +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] = '--div--;Allgemein,username,password,usergroup'; +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] .= ',--div--;Persönliche Daten,company,title,gender,first_name,last_name,date_of_birth,address,zip,city,static_info_country,telephone,email,comments'; +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] .= ',--div--;Hinweise,description'; +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] .= ',--div--;Zuladungsliste,kammermitgliedsnummer, kammernid, vereidigung, geburtsdatum, frauenfoerderpunkt, solidaritaetserklaerung'; +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] .= ',--div--;Wettbewerbe,wettbewerbe'; +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] .= ',--div--;Besondere Sperrungen,extrasperrung'; +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] .= ',--div--;Konto Auflösung, kontoaufloesung_active, kontoaufloesung_begruendung, kontoaufloesung'; +$GLOBALS['TCA']['fe_users']['types']['Tx_Zuladungsliste_Architekten']['showitem'] .= ',--div--;Punkte Verschiebung,punkteverschiebung'; + +$GLOBALS['TCA']['fe_users']['columns'][$GLOBALS['TCA']['fe_users']['ctrl']['type']]['config']['items'][] = ['Zuladungsliste ZT Kammer Architekten']; + +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr( + 'Zuladungsliste', + 'EXT:/Resources/Private/Language/locallang_csh_.xlf' +); diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/sys_template.php b/packages/zuladungsliste/Configuration/TCA/Overrides/sys_template.php new file mode 100644 index 0000000..777b6d6 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/sys_template.php @@ -0,0 +1,5 @@ + $fakeField, +// 'config' => [ +// 'type' => 'passthrough', +// ] +// ]; +// } +// } + + +// $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['zuladungsliste_pi1'] = 'pi_flexform'; +// \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( +// 'zuladungsliste_pi1', +// 'FILE:EXT:zuladungsliste/Configuration/FlexForms/flexform_zuladungsliste.xml' +// ); diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_extrasperrung.php b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_extrasperrung.php new file mode 100644 index 0000000..b6a5df9 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_extrasperrung.php @@ -0,0 +1,10 @@ +loadKriterien'; diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_preisart.php b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_preisart.php new file mode 100644 index 0000000..ea7e35a --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_preisart.php @@ -0,0 +1,9 @@ +loadSektionstag'; diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_wettbewerbe.php b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_wettbewerbe.php new file mode 100644 index 0000000..9ace1b3 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_domain_model_wettbewerbe.php @@ -0,0 +1,9 @@ +loadPunkteVerteilungs' ; +$GLOBALS['TCA']['tx_zuladungsliste_konto_aufloesung_mm']['ctrl']['formattedLabel_userFunc_options'] = array( + 'tx_zuladungsliste_konto_aufloesung_mm' => array( + 'uid_empfaenger', + 'prozente' + ) +); diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_punkte_kriterien_mm.php b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_punkte_kriterien_mm.php new file mode 100644 index 0000000..510bb19 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_punkte_kriterien_mm.php @@ -0,0 +1,12 @@ +loadKriterienPunkte' ; +$GLOBALS['TCA']['tx_zuladungsliste_punkte_kriterien_mm']['ctrl']['formattedLabel_userFunc_options'] = [ + 'tx_zuladungsliste_punkte_kriterien_mm' => [ + 'uid_kriterien', + 'uid_punkte', + 'punkte' + ] +]; diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_punkte_verschiebung_mm.php b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_punkte_verschiebung_mm.php new file mode 100644 index 0000000..9cd9884 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_punkte_verschiebung_mm.php @@ -0,0 +1,13 @@ +loadTeilnehmer' ; +$GLOBALS['TCA']['tx_zuladungsliste_punkte_verschiebung_mm']['ctrl']['formattedLabel_userFunc_options'] = array( + 'tx_zuladungsliste_wettbewerbe_architekten_mm' => array( + 'uid_geber', + 'uid_empfaenger', + 'prozente', + 'wettbewerbe', + ) +); \ No newline at end of file diff --git a/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_wettbewerbe_architekten_mm.php b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_wettbewerbe_architekten_mm.php new file mode 100644 index 0000000..806d218 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/Overrides/tx_zuladungsliste_wettbewerbe_architekten_mm.php @@ -0,0 +1,15 @@ +loadWettbewerbArchitekten' ; +$GLOBALS['TCA']['tx_zuladungsliste_wettbewerbe_architekten_mm']['ctrl']['formattedLabel_userFunc_options'] = array( + 'tx_zuladungsliste_wettbewerbe_architekten_mm' => array( + 'uid_wettbewerbe', + 'uid_user', + 'uid_punkte', + 'notizen', + 'tstamp_zuordnung', + 'tstamp_aktivierung' + ) +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_extrasperrung.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_extrasperrung.php new file mode 100644 index 0000000..b49f580 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_extrasperrung.php @@ -0,0 +1,174 @@ + array( + 'title' => 'Besondere Sperrung', + 'label' => 'begruendung', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => true, + 'versioningWS' => true, + 'delete' => 'deleted', + 'searchFields' => 'begruendung,sperrzeitbis,extrasperrung_user,', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.svg' + ), + 'interface' => array( + 'showRecordFieldList' => 'begruendung, sperrzeitbis,extrasperrung_user', + ), + 'types' => array( + '1' => array('showitem' => 'begruendung, sperrzeitbis, extrasperrung_user'), + ), + 'palettes' => array( + '1' => array('showitem' => ''), + ), + 'columns' => array( + + // 'sys_language_uid' => array( + // 'exclude' => 1, + // 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.language', + // 'config' => array( + // 'type' => 'select', + // 'renderType' => 'selectSingle', + // 'foreign_table' => 'sys_language', + // 'foreign_table_where' => 'ORDER BY sys_language.title', + // 'items' => array( + // array('LLL:EXT:lang/locallang_general.xlf:LGL.allLanguages', -1), + // array('LLL:EXT:lang/locallang_general.xlf:LGL.default_value', 0) + // ), + // ), + // ), + // 'l10n_parent' => array( + // 'displayCond' => 'FIELD:sys_language_uid:>:0', + // 'exclude' => 1, + // 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.l18n_parent', + // 'config' => array( + // 'type' => 'select', + // 'renderType' => 'selectSingle', + // 'items' => array( + // array('', 0), + // ), + // 'foreign_table' => 'tx_zuladungsliste_domain_model_extrasperrung', + // 'foreign_table_where' => 'AND tx_zuladungsliste_domain_model_extrasperrung.pid=###CURRENT_PID### AND tx_zuladungsliste_domain_model_extrasperrung.sys_language_uid IN (-1,0)', + // ), + // ), + // 'l10n_diffsource' => array( + // 'config' => array( + // 'type' => 'passthrough', + // ), + // ), + // + // 't3ver_label' => array( + // 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.versionLabel', + // 'config' => array( + // 'type' => 'input', + // 'size' => 30, + // 'max' => 255, + // ) + // ), + + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + # TODO + 'begruendung' => array( + 'exclude' => 1, + 'label' => 'Besondere Sperrung', + 'formattedLabel_userFunc' => 'HermannTelser\Zuladungsliste\Classes\Utilities\ZuladungslisteLabelHelper->sperrung_user', + 'formattedLabel_userFunc_options' => array( + 'special' => array( + 'begruendung', + 'sperrzeitbis' + ) + ), + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'max' => 255, + 'eval' => 'trim,required', + ) + ), + 'sperrzeitbis' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:zuladungsliste/Resources/Private/Language/locallang_db.xlf:tx_zuladungsliste_domain_model_extrasperrung.sperrzeitbis', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'size' => 7, + 'eval' => 'date', + 'checkbox' => 0, + ), + ), + 'extrasperrung_user' => array( + 'exclude' => 1, + 'label' => 'Sperrungen Architekten', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_extrasperrung_user_mm', + 'foreign_field' => 'uid_extrasperrung', + // 'foreign_label' => 'uid_user', + // 'foreign_selector' => 'uid_user', + // 'foreign_unique' => 'uid_user', + 'foreign_sortby' => 'sorting', + 'appearance' => array( + 'collapseAll' => true, + 'expandSingle' => true, + //'newRecordLinkAddTitle' => FALSE, + //'useCombination' => TRUE, + //'useSortable' => TRUE, + 'enabledControls' => array( + 'info' => false, + 'new' => false, + 'dragdrop' => false, + 'sort' => false, + //'hide' => false, + //'delete' => false, + //'localize' => false, + ), + + ), + ), + ), + ), +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_kammern.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_kammern.php new file mode 100644 index 0000000..a8ec6af --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_kammern.php @@ -0,0 +1,101 @@ + [ + 'title' => 'Kammern', + 'label' => 'bezeichnung', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => true, + 'versioningWS' => true, + 'typeicon_column' => 'uid', + 'delete' => 'deleted', + 'enablecolumns' => [ + //'disabled' => 'hidden', + //'starttime' => 'starttime', + //'endtime' => 'endtime', + ], + 'searchFields' => 'bezeichnung,einsichtstag', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/kammer.svg', + ], + 'interface' => [ + 'showRecordFieldList' => 'bezeichnung,einsichtstag', + ], + 'types' => [ + '1' => ['showitem' => 'bezeichnung,einsichtstag'], + ], + 'palettes' => [ + '1' => ['showitem' => ''], + ], + 'columns' => [ + 'hidden' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden', + 'config' => [ + 'type' => 'check', + ], + ], + 'starttime' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => [ + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')), + ], + ], + ], + 'endtime' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime', + 'config' => [ + 'type' => 'input', + 'size' => 13, + 'eval' => 'datetime', + 'renderType' => 'inputDateTime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => [ + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')), + ], + ], + ], + 'bezeichnung' => [ + 'exclude' => 1, + 'label' => 'Kammer der Architekten', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim', + ], + ], + 'einsichtstag' => [ + 'exclude' => 1, + 'label' => 'Monatlicher Stichtag für Stand der Einsichtnahme', + 'config' => [ + 'type' => 'input', + 'size' => 5, + 'max' => 2, + 'eval' => 'int,required', + 'checkbox' => 1, + 'default' => 1, + 'range' => [ + 'lower' => 1, + 'upper' => 31, + ], + ], + ], + ], +]; diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_kriterien.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_kriterien.php new file mode 100644 index 0000000..f7aa397 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_kriterien.php @@ -0,0 +1,187 @@ + [ + 'title' => 'LLL:EXT:zuladungsliste/Resources/Private/Language/locallang_db.xlf:tx_zuladungsliste_domain_model_kriterien', + 'label' => 'bezeichnung', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => true, + 'versioningWS' => true, + 'typeicon_column' => 'kammernid', + 'delete' => 'deleted', + 'enablecolumns' => [ + //'disabled' => 'hidden', + //'starttime' => 'starttime', + //'endtime' => 'endtime', + ], + 'default_sortby' => 'ORDER BY sorting', + 'sortby' => 'sorting', + 'searchFields' => 'bezeichnung,sektinstagid,', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/list.svg', + ], + 'interface' => [ + 'showRecordFieldList' => 'bezeichnung, kammernid, sektinstagid, sperrung', + ], + 'types' => [ + '1' => ['showitem' => 'bezeichnung, kammernid, sperrung, sektinstagid, --div--;Punktezuordnung,punkteid'], + ], + 'palettes' => [ + '1' => ['showitem' => ''], + ], + 'columns' => [ + 'hidden' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden', + 'config' => [ + 'type' => 'check', + ], + ], + 'starttime' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => [ + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')), + ], + ], + ], + 'endtime' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => [ + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')), + ], + ], + ], + + 'bezeichnung' => [ + 'exclude' => 1, + 'label' => 'Kriterium', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim', + ], + ], + // 'preisartid' => [ + // 'exclude' => 1, + // 'label' => 'Kriterium des Preises', + // 'config' => [ + // 'fieldWizard' => [ + // 'selectIcons' => [ + // 'disabled' => false + // ] + // ], + // 'type' => 'select', + // 'renderType' => 'selectSingle', + // 'items' => [ + // ['Kriterium wählen', '--div--'], + // ], + // 'foreign_table' => 'tx_zuladungsliste_domain_model_preisart', + // 'foreign_table_where' => 'ORDER BY tx_zuladungsliste_domain_model_preisart.uid ASC', + // 'size' => 1, + // 'minitems' => 1, + // 'maxitems' => 1, + // ], + // ], + 'kammernid' => [ + 'exclude' => 1, + 'label' => 'Kammer', + + 'config' => [ + 'fieldWizard' => [ + 'selectIcons' => [ + 'disabled' => true + ] + ], + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['Kammer wählen', '--div--'], + ], + 'foreign_table' => 'tx_zuladungsliste_domain_model_kammern', + 'foreign_table_where' => 'ORDER BY tx_zuladungsliste_domain_model_kammern.uid ASC', + 'size' => 1, + 'minitems' => 1, + 'maxitems' => 1, + ], + ], + 'sperrung' => [ + 'exclude' => 0, + 'label' => 'Wettbewerbe mit Sperrung', + 'config' => [ + 'type' => 'check', + 'default' => 0, + ], + ], + 'sektinstagid' => [ + 'exclude' => 1, + 'label' => 'Sektionstag', + + 'config' => [ + 'fieldWizard' => [ + 'selectIcons' => [ + 'disabled' => true + ] + ], + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['Sektionstag wählen', '--div--'], + ], + 'foreign_table' => 'tx_zuladungsliste_domain_model_sektionstage', + 'foreign_table_where' => 'ORDER BY tx_zuladungsliste_domain_model_sektionstage.stichtag ASC', + 'size' => 1, + 'minitems' => 1, + 'maxitems' => 1, + ], + ], + 'punkteid' => [ + 'exclude' => 1, + 'label' => 'Kriterien', + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_punkte_kriterien_mm', + 'foreign_field' => 'uid_kriterien', + 'foreign_label' => 'uid_punkte', + 'foreign_table_where' => 'ORDER BY tx_zuladungsliste_domain_model_punkte.sorting ASC', + 'appearance' => [ + 'collapseAll' => true, + 'expandSingle' => true, + 'useCombination' => 1, + 'useSortable' => true, + 'enabledControls' => [ + 'info', + 'new', + 'dragdrop', + 'sort', + 'hide', + 'delete', + 'localize', + ], + ], + ], + ], + ], +]; diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_preisart.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_preisart.php new file mode 100644 index 0000000..1f9f69b --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_preisart.php @@ -0,0 +1,84 @@ + array( + 'title' => 'LLL:EXT:zuladungsliste/Resources/Private/Language/locallang_db.xlf:tx_zuladungsliste_domain_model_preisart', + 'label' => 'preisart', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => true, + 'versioningWS' => true, + 'delete' => 'deleted', + 'enablecolumns' => array( + 'disabled' => 'hidden', + //'starttime' => 'starttime', + //'endtime' => 'endtime', + ), + 'searchFields' => 'preisart,', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/preis.svg' + ), + 'interface' => array( + 'showRecordFieldList' => 'preisart', + ), + 'types' => array( + '1' => array('showitem' => 'preisart'), + ), + 'palettes' => array( + '1' => array('showitem' => ''), + ), + 'columns' => array( + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'preisart' => array( + 'exclude' => 1, + 'label' => 'Art des Preises', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + ), +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_punkte.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_punkte.php new file mode 100644 index 0000000..28d5f76 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_punkte.php @@ -0,0 +1,98 @@ + array( + 'title' => 'LLL:EXT:zuladungsliste/Resources/Private/Language/locallang_db.xlf:tx_zuladungsliste_domain_model_punkte', + 'label' => 'bezeichnung', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => true, + 'versioningWS' => true, + 'delete' => 'deleted', + 'dividers2tabs' => true, + 'default_sortby' => 'ORDER BY sorting', + 'sortby' => 'sorting', + 'enablecolumns' => array( + ), + 'searchFields' => 'bezeichnung,', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/preis.svg' + ), + 'interface' => array( + 'showRecordFieldList' => 'bezeichnung, kriterienid', + ), + 'types' => array( + '1' => array('showitem' => 'bezeichnung, kriterienid'), + ), + 'palettes' => array( + '1' => array('showitem' => ''), + ), + 'columns' => array( + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'bezeichnung' => array( + 'exclude' => 1, + 'label' => 'Punkte', + 'config' => array( + 'type' => 'input', + 'size' => 20, + 'max' => 50, + 'eval' => 'trim,required', + ), + ), + 'kriterienid' => array( + 'exclude' => 1, + 'label' => 'Verwendet bei diesen Kriterien', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_punkte_kriterien_mm', + 'foreign_field' => 'uid_punkte', + // 'foreign_label' => 'uid_kriterien', + // 'foreign_selector' => 'uid_kriterien', + // 'foreign_unique' => 'uid_kriterien', + 'foreign_sortby' => 'sorting', + ), + ), + ), +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_sektionstage.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_sektionstage.php new file mode 100644 index 0000000..e828ce1 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_sektionstage.php @@ -0,0 +1,263 @@ + array( + 'title' => 'Sektionstage', + 'label' => 'bezeichnung', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => true, + 'versioningWS' => true, + 'typeicon_column' => 'kammernid', + 'delete' => 'deleted', + 'enablecolumns' => array( + 'disabled' => 'hidden', + //'starttime' => 'starttime', + //'endtime' => 'endtime', + ), + 'searchFields' => 'bezeichnung,stichtag,sperrzeit,sperrzeitstart,punktezeit,punktezeitstart,neueinsteiger,neueinsteigerstart,frauenfoerderung,frauenfoerderungstart,frauenfoerderungsonderstart,sektionstage_notizen,', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/waage.svg' + ), + 'interface' => array( + 'showRecordFieldList' => 'hidden, bezeichnung, rwcode, stichtag, sperrzeit, sperrzeitstart, punktezeit, punktezeitstart, neueinsteiger, neueinsteigerstart, frauenfoerderung, frauenfoerderungstart, frauenfoerderungsonderstart, sektionstage_notizen', + ), + 'types' => array( + '0' => array('showitem' => 'bezeichnung, rwcode, kammernid, stichtag, + --palette--;Sperrzeiten;sperrzeit, + --palette--;Gültigkeit Punkte Allgemein;punktezeit, + --palette--;Gültigkeit Neueinsteiger;neueinsteiger, + --palette--;Gültigkeit Frauenförderung;frauenfoerderung, + --palette--;Frauenförderung Sonderstart;frauenfoerderungsonderstart, + --palette--;Bemerkungen zum Sektionstag, sektionstage_notizen') + // (wenn nicht 0 wird ab Stichtag die Sperrung monatlich angepasst, von Sperrzeit auf Sperzeit Transit) + ), + 'palettes' => array( + '1' => array('showitem' => 'bezeichnung, rwcode, kammernid, stichtag'), + 'sperrzeit' => array('showitem' => 'sperrzeit, sperrzeitstart'), + 'punktezeit' => array('showitem' => 'punktezeit, punktezeitstart'), + 'neueinsteiger' => array('showitem' => 'neueinsteiger, neueinsteigerstart'), + 'frauenfoerderung' => array('showitem' => 'frauenfoerderung, frauenfoerderungstart'), + 'frauenfoerderungsonderstart' => array('showitem' => 'frauenfoerderungsonderstart'), + 'sektionstage_notizen' => array('showitem' => 'sektionstage_notizen') + + ), + 'columns' => array( + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'rwcode' => array( + 'exclude' => 1, + 'label' => 'Kürzel', + 'config' => array( + 'type' => 'input', + 'size' => 5, + 'max' => 5, + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'bezeichnung' => array( + 'exclude' => 1, + 'label' => 'Sektionstag', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'kammernid' => [ + 'exclude' => 1, + 'label' => 'Kammer Zuordnung', + 'config' => [ + 'fieldWizard' => [ + 'selectIcons' => [ + 'disabled' => true + ] + ], + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['Bitte Wählen', 0], + ], + 'foreign_table' => 'tx_zuladungsliste_domain_model_kammern', + ] + ], + 'stichtag' => array( + 'exclude' => 1, + 'label' => 'Stichtag', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'sperrzeit' => array( + 'exclude' => 1, + 'label' => 'In Monaten', + 'config' => array( + 'type' => 'input', + 'size' => 4, + 'eval' => 'int,required', + 'range' => array('lower'=>12,'upper'=>60), + 'checkbox' => '1', + 'default' => '1', + ) + ), + 'sperrzeitstart' => array( + 'exclude' => 1, + 'label' => 'Start Datum', + 'description' => 'Gültig für Wettbewerbe mit Freigabe jünger als Feldwert, wenn leer wird der Wert des vorherigen Sektionstages übernommen, wenn alle ohne Wert wird die Bedingung ingnoriert', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'punktezeit' => array( + 'exclude' => 1, + 'label' => 'In Monaten', + 'config' => array( + 'type' => 'input', + 'size' => 4, + 'eval' => 'int' + ) + ), + 'punktezeitstart' => array( + 'exclude' => 1, + 'label' => 'Start Datum', + 'description' => 'Gültig wenn Vereidigungsdatum jünger als Feldwert, wenn leer wird der Wert des vorherigen Sektionstages übernommen, wenn alle ohne Wert wird die Bedingung ingnoriert', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'neueinsteiger' => array( + 'exclude' => 1, + 'label' => 'In Monaten', + 'config' => array( + 'type' => 'input', + 'size' => 4, + 'eval' => 'int' + ) + ), + 'neueinsteigerstart' => array( + 'exclude' => 1, + 'label' => 'Start Datum', + 'description' => 'Gültig wenn Vereidigungsdatum jünger als Feldwert, wenn leer wird der Wert des vorherigen Sektionstages übernommen, wenn alle ohne Wert wird die Bedingung ingnoriert', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'frauenfoerderung' => array( + 'exclude' => 1, + 'label' => 'In Monaten', + 'config' => array( + 'type' => 'input', + 'size' => 4, + 'eval' => 'int' + ) + ), + 'frauenfoerderungstart' => array( + 'exclude' => 1, + 'label' => 'Start Datum', + 'description' => 'Gültig wenn Vereidigungsdatum jünger als Feldwert, wenn leer wird der Wert des vorherigen Sektionstages übernommen, wenn alle ohne Wert wird die Bedingung ingnoriert', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'frauenfoerderungsonderstart' => array( + 'exclude' => 1, + 'label' => 'Start Datum', + 'description' => 'Bei Eingabe eines Datums wird der Frauenförderungspunkt ab diesem Zeitpunkt anstatt dem Datum der Vereidigung berechnet, wenn im Vergleich dazu eine längere Gültigkeit erzielt wird.', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'sektionstage_notizen' => array( + 'exclude' => 0, + 'label' => 'Bemerkungen', + 'config' => array( + 'type' => 'text', + 'cols' => 48, + 'rows' => 5, + ), + ), + + ), +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_wettbewerbe.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_wettbewerbe.php new file mode 100644 index 0000000..cdf01e3 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_domain_model_wettbewerbe.php @@ -0,0 +1,263 @@ + array( + 'title' => 'Wettbewerbe', + 'label' => 'wettbewerb', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'dividers2tabs' => true, + 'versioningWS' => true, + 'delete' => 'deleted', + 'enablecolumns' => array( + 'disabled' => 'hidden', + //'starttime' => 'starttime', + //'endtime' => 'endtime', + ), + 'searchFields' => 'wettbewerb,beschreibung,', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/wettbewerb.svg', + 'default_sortby' => 'uid DESC' + ), + 'interface' => array( + // Feld "kammerbeschluss" für stmk nicht in verwendung, sperrung + 'showRecordFieldList' => 'hidden, wettbewerb, beschreibung, registrierung, verfahrensort, bundesland, abgabetermin, entscheidungstermin, aufgabenstellung, wettbewerb_user', + ), + 'types' => array( + '1' => array('showitem' => ' + --div--;Wettbewerbe & Preise, wettbewerb, verfahrensid, kriteriumid, entscheidungstermin, sperre_deaktiviert, + --div--;Auszeichnungen, wettbewerb_user, + --div--;Beschreibung, beschreibung, + --div--;Zusätzliche Informationen, registrierung, verfahrensort, bundesland, aufgabenstellung' + ), + ), + 'palettes' => array( + '1' => array('showitem' => ''), + ), + 'columns' => array( + + 'hidden' => array( + 'exclude' => 0, + 'label' => 'Verborgen', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 0, + 'label' => 'Startzeit', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 0, + 'label' => 'Endzeit', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'size' => 13, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'behaviour' => [ + 'allowLanguageSynchronization' => true + ], + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + + 'wettbewerb' => array( + 'exclude' => 0, + 'label' => 'Wettbewerb oder Preis', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim,required' + ), + ), + 'verfahrensid' => array( + 'exclude' => 0, + 'label' => 'Verfahren Id', + 'description' => "Projekt Nummer gelisted auf 'www.architekturwettbewerb.at'", + 'config' => array( + 'type' => 'input', + 'size' => 10, + 'eval' => 'int,required,unique' + ), + ), + 'beschreibung' => array( + 'exclude' => 0, + 'label' => 'Beschreibung', + 'config' => array( + 'type' => 'text', + 'cols' => 40, + 'rows' => 15, + 'eval' => 'trim', + ), + ), + 'registrierung' => array( + 'exclude' => 0, + 'label' => 'Registrierung', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'verfahrensort' => array( + 'exclude' => 0, + 'label' => 'Verfahrensort', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'bundesland' => array( + 'exclude' => 0, + 'label' => 'Bundesland', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'abgabetermin' => array( + 'exclude' => 0, + 'label' => 'Abgabetermin', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'kammerbeschluss' => array( + 'exclude' => 0, + 'label' => 'Kammerbeschluss Freigabedatum', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'entscheidungstermin' => array( + 'exclude' => 0, + 'label' => 'Entscheidungstermin', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'sperrung' => array( + 'exclude' => 0, + 'label' => 'Wettbewerb mit Sperrung', + 'config' => array( + 'type' => 'check', + 'default' => 0 + ) + ), + 'sperre_deaktiviert' => array( + 'exclude' => 0, + 'label' => 'Sperrung deaktivieren', + 'description' => "Bei Wettbewerb mit Sperrung diese für diesen Wettbewerb deaktivieren", + 'config' => array( + 'type' => 'check', + 'default' => 0 + ) + ), + 'aufgabenstellung' => array( + 'exclude' => 0, + 'label' => 'Aufgabenstellung', + 'config' => array( + 'type' => 'text', + 'cols' => 40, + 'rows' => 15, + 'eval' => 'trim' + ) + ), + 'wettbewerb_user' => array( + 'exclude' => 0, + 'label' => 'Architekten', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_zuladungsliste_wettbewerbe_architekten_mm', + 'foreign_table_where' => 'ORDER BY fe_users.company DESC', + 'foreign_field' => 'uid_wettbewerbe', + // 'foreign_sortby' => 'tx_zuladungsliste_wettbewerbe_architekten_mm.uid', + // 'foreign_label' => 'tx_zuladungsliste_wettbewerbe_architekten_mm.uid_user', + // 'foreign_selector' => 'uid_user', + // 'foreign_unique' => 'uid_user', + 'appearance' => array( + 'levelLinksPosition' => 'both', + 'collapseAll' => true, + 'expandSingle' => true, + //'newRecordLinkAddTitle' => FALSE, + //'useCombination' => TRUE, + //'useSortable' => TRUE, + 'enabledControls' => array( + 'info' => false, + 'new' => false, + 'dragdrop' => false, + 'sort' => false, + //'hide' => false, + //'delete' => false, + //'localize' => false, + ), + + ), + ), + ), + 'kriteriumid' => array( + 'exclude' => 0, + 'label' => 'Kriterium des Preises', + 'config' => array( + 'fieldWizard' => [ + 'selectIcons' => [ + 'disabled' => true + ] + ], + "type" => "select", + 'renderType' => 'selectSingle', + 'items' => array( + array('Kriterium wählen', '--div--'), + ), + "foreign_table" => "tx_zuladungsliste_domain_model_kriterien", + 'foreign_table_where' => 'ORDER BY uid', + //'foreign_table_where' => ' AND tx_zuladungsliste_domain_model_kriterien.uid=###REC_FIELD_[kriteriumid]### ORDER BY tx_zuladungsliste_domain_model_kriterien.bezeichnung ASC', + "size" => 1, + "minitems" => 1, + "maxitems" => 1, + ), + ), + ), +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_extrasperrung_user_mm.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_extrasperrung_user_mm.php new file mode 100644 index 0000000..e567824 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_extrasperrung_user_mm.php @@ -0,0 +1,48 @@ + array( + 'title' => 'Besondere Sperrungen', + 'hideTable' => true, + 'sortby' => 'sorting', + 'label' => 'Besondere Sperrungen User Relation', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.svg', + 'typeicon_classes' => [ + 'default' => 'zuladungsliste-sperrung', + ], + ), + 'columns' => array( + 'uid_extrasperrung' => array( + 'label' => 'Besondere Sperrungen', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tx_zuladungsliste_domain_model_extrasperrung', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'uid_user' => array( + 'label' => 'Architekt', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => array( array(' --- Bitte wählen --- ',0) ), + 'foreign_table' => 'fe_users', + 'foreign_table_where' => ' ORDER BY company', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + ), + 'types' => array( + '0' => array('showitem' => 'uid_extrasperrung,uid_user') + ), + 'palettes' => array() +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_konto_aufloesung_mm.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_konto_aufloesung_mm.php new file mode 100644 index 0000000..40172a0 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_konto_aufloesung_mm.php @@ -0,0 +1,62 @@ + array( + 'title' => 'Kontoauflösung', + 'hideTable' => true, + 'label' => 'Konto Auflösen', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_punkte.gif', + 'typeicon_classes' => [ + 'default' => 'zuladungsliste-kontoclosed', + ], + ), + 'columns' => array( + 'uid_geber' => array( + 'label' => 'Aufzulösendes Konto', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'fe_users', + //'foreign_table_where' => ' AND sys_language_uid IN (0,-1)', + 'foreign_table_where' => ' ORDER BY company', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'uid_empfaenger' => array( + 'label' => 'Punkte Empfänger', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'fe_users', + //'foreign_table_where' => ' AND sys_language_uid IN (0,-1)', + 'foreign_table_where' => ' AND fe_users.pid=41 AND kontoaufloesung=0 ORDER BY company', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'prozente' => array( + 'exclude' => 1, + 'label' => 'Prozentuelle Verteilung', + 'config' => array( + 'type' => 'input', + 'size' => 5, + 'eval' => 'double2' + ), + 'range' => array( + 'lower' => 0, + 'upper' => 100 + ), + ), + ), + 'types' => array( + '0' => array('showitem' => 'uid_geber,uid_empfaenger,prozente') + ), + 'palettes' => array() +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_punkte_kriterien_mm.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_punkte_kriterien_mm.php new file mode 100644 index 0000000..d23877a --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_punkte_kriterien_mm.php @@ -0,0 +1,59 @@ + array( + 'title' => 'Punkte Kriterien', + 'hideTable' => TRUE, + 'sortby' => 'sorting', + 'label' => 'Punkte Kriterien Relation', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/preis.svg' + ), + 'columns' => array( + 'uid_punkte' => Array( + 'label' => 'Punkte', + 'config' => Array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'selectedListStyle' => '200px', + 'foreign_table' => 'tx_zuladungsliste_domain_model_punkte', + 'foreign_table_where' => ' ORDER BY tx_zuladungsliste_domain_model_punkte.sorting ASC', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'uid_kriterien' => Array( + 'label' => 'Kriterien', + 'config' => Array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tx_zuladungsliste_domain_model_kriterien', + //'foreign_table_where' => ' AND sys_language_uid IN (0,-1)', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'punkte' => array( + 'exclude' => 1, + 'label' => 'Punkte (0 - 10.0)', + 'config' => array( + 'type' => 'input', + 'size' => 5, + 'eval' => 'double2' + ), + 'range' => array( + 'lower' => 0, + 'upper' => 10 + ), + ), + ), + 'types' => array( + '0' => array('showitem' => 'uid_punkte,uid_kriterien,punkte') + ), + 'palettes' => array() +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_punkte_verschiebung_mm.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_punkte_verschiebung_mm.php new file mode 100644 index 0000000..bc6b464 --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_punkte_verschiebung_mm.php @@ -0,0 +1,109 @@ + array( + 'title' => 'Punkte Verschieben', + 'hideTable' => true, + 'label' => 'Punkte verschieben', + // 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/svg/transfer.svg', + 'typeicon_classes' => [ + 'default' => 'zuladungsliste-kontoclosed', + ], + ), + 'columns' => array( + 'uid_geber' => array( + 'label' => 'Punkte Geber', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'fe_users', + 'foreign_table_where' => ' ORDER BY company', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'uid_empfaenger' => array( + 'label' => 'Punkte Empfänger', + 'config' => array( + 'eval' => 'required', + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'fe_users', + 'foreign_table_field' => 'company', + 'foreign_table_where' => ' AND fe_users.pid=41 AND kontoaufloesung=0 ORDER BY uid', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'verschiebung_ab' => array( + 'exclude' => 0, + 'label' => 'Datum der Punkteverschiebung Start', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'verschiebung_stichtag' => array( + 'exclude' => 0, + 'label' => 'Punkteverschiebung (gültig nur mit Stichtag)', + 'description' => 'Beinhalted alle gültigen Punkte der Geberliste deren Entscheidungstermin vor dem eingegebenen Stichtag liegt.', + 'config' => array( + 'dbType' => 'date', + 'renderType' => 'inputDateTime', + 'type' => 'input', + 'format' => 'date', + 'size' => 10, + 'eval' => 'date,null', + 'checkbox' => 1, + 'disableAgeDisplay' => 1 + ), + ), + 'prozente' => array( + 'exclude' => 1, + 'eval' => 'required', + 'label' => 'Prozentuelle Punkte', + 'description' => 'Prozentueller Anteil der zu verschiebenden Punkte.', + 'config' => array( + 'type' => 'input', + 'size' => 5, + 'eval' => 'double2' + ), + 'range' => array( + 'lower' => 0, + 'upper' => 100 + ), + ), + // Implementierung nur auf Anfrage (05.03.2024) + // aktuell diabled + 'wettbewerbe' => array( + 'exclude' => 0, + 'label' => 'Wettbewerbe', + 'description' => 'Sollten die zu verschiebenden Punkte auf spezielle Wettbewerbe limitiert werden können diese hier selektioniert werden.', + 'config' => array( + 'default' => '0', + 'type' => 'select', + 'renderType' => 'selectMultipleSideBySide', + 'foreign_table' => 'tx_zuladungsliste_domain_model_wettbewerbe', + 'foreign_table_where' => ' AND tx_zuladungsliste_domain_model_wettbewerbe.uid in (SELECT uid_wettbewerbe FROM tx_zuladungsliste_wettbewerbe_architekten_mm WHERE uid_user=###REC_FIELD_uid_geber###)', + 'size' => 3, + 'autoSizeMax' => 10, + ), + ), + ), + 'types' => array( + '0' => array('showitem' => 'uid_geber,uid_empfaenger,verschiebung_ab,verschiebung_stichtag,prozente') + ), + 'palettes' => array() +); diff --git a/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_wettbewerbe_architekten_mm.php b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_wettbewerbe_architekten_mm.php new file mode 100644 index 0000000..9dd981f --- /dev/null +++ b/packages/zuladungsliste/Configuration/TCA/tx_zuladungsliste_wettbewerbe_architekten_mm.php @@ -0,0 +1,128 @@ + array( + 'title' => 'Wettbewerbe Architekten', + 'hideTable' => true, + 'sortby' => 'sorting', + 'label' => 'Wettbewerbe Architekten', + 'iconfile' => 'EXT:zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_wettbewerbe.svg' + ), + 'columns' => array( + 'tstamp_zuordnung' => array( + 'exclude' => 0, + 'label' => 'Datum Zuordnung', + 'config' => array( + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'date', + ), + ), + 'tstamp_aktivierung' => array( + 'exclude' => 0, + 'label' => 'Datum Freischaltung', + 'config' => array( + 'type' => 'input', + 'eval' => 'date', + 'renderType' => 'inputDateTime', + ), + ), + 'tstamp_ablehnen' => array( + 'exclude' => 0, + 'label' => 'Datum Ablehnung', + 'config' => array( + 'type' => 'input', + 'eval' => 'date', + 'renderType' => 'inputDateTime', + ), + ), + 'ist_befangen' => [ + 'exclude' => 0, + 'label' => 'Befangen', + 'config' => [ + 'type' => 'check', + ], + ], + 'bemerkungen' => [ + 'exclude' => 0, + 'label' => 'Bemerkungen zu Ablehnung/Befangenheit', + 'config' => [ + 'type' => 'text', + 'size' => 30, + 'eval' => 'trim' + ] + ], + // popup in liste + 'uid_wettbewerbe' => array( + 'label' => 'Wettbewerb', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => array( array(' --- Bitte wählen --- ',0) ), + 'foreign_table' => 'tx_zuladungsliste_domain_model_wettbewerbe', + 'foreign_table_where' => 'ORDER BY uid DESC', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + 'default' => 0, + ), + ), + 'uid_user' => array( + 'label' => 'Architekt', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => array( array(' --- Bitte wählen --- ',0) ), + 'foreign_table' => 'fe_users', + 'foreign_table_where' => 'ORDER BY company', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + ), + ), + 'ladung_durch_auslober' => array( + 'exclude' => 1, + 'label' => 'Ladung durch Auslober/in', + 'description' => 'Bei einer Ladung durch Auslober wird die aktive Sperrzeit auf 9 Monate verkürzt', + 'config' => array( + 'type' => 'check', + ), + ), + 'uid_punkte' => array( + 'label' => 'Punkte', + 'config' => array( + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemListStyle' => '200px', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1, + 'itemsProcFunc' => 'HermannTelser\\Zuladungsliste\\Backend\\Selecting->loadPunkte' + ), + ), + 'notizen' => array( + 'exclude' => 0, + 'label' => 'Bemerkungen zur Punktevergabe', + // 'displayCond' => 'FIELD:uid_user:REQ:true', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + ), + 'types' => [ + '0' => [ + 'showitem' => 'uid_wettbewerbe, uid_user, ladung_durch_auslober, uid_punkte,notizen, tstamp_zuordnung,tstamp_aktivierung, --palette--; Ablehnung/Befangenheit; ablehnung', + ] + ], + 'palettes' => [ + 'ablehnung' => [ + 'showitem' => 'tstamp_ablehnen, ist_befangen, bemerkungen', + ], + ], +); diff --git a/packages/zuladungsliste/Configuration/TypoScript/constants.typoscript b/packages/zuladungsliste/Configuration/TypoScript/constants.typoscript new file mode 100644 index 0000000..a21ff9b --- /dev/null +++ b/packages/zuladungsliste/Configuration/TypoScript/constants.typoscript @@ -0,0 +1,30 @@ + +plugin.tx_zuladungsliste { + view { + # cat=plugin.tx_zuladungsliste_zuladungsliste/file; type=string; label=Path to template root (FE) + templateRootPath = EXT:zuladungsliste/Resources/Private/Templates/ + # cat=plugin.tx_zuladungsliste_zuladungsliste/file; type=string; label=Path to template partials (FE) + partialRootPath = EXT:zuladungsliste/Resources/Private/Partials/ + # cat=plugin.tx_zuladungsliste_zuladungsliste/file; type=string; label=Path to template layouts (FE) + layoutRootPath = EXT:zuladungsliste/Resources/Private/Layouts/ + } + persistence { + # cat=plugin.tx_zuladungsliste_zuladungsliste//a; type=string; label=Default storage PID + storagePid = + } +} + +module.tx_zuladungsliste { + view { + # cat=module.tx_zuladungsliste/file; type=string; label=Path to template root (BE) + templateRootPath = EXT:zuladungsliste/Resources/Private/Backend/Templates/ + # cat=module.tx_zuladungsliste/file; type=string; label=Path to template partials (BE) + partialRootPath = EXT:zuladungsliste/Resources/Private/Backend/Partials/ + # cat=module.tx_zuladungsliste/file; type=string; label=Path to template layouts (BE) + layoutRootPath = EXT:zuladungsliste/Resources/Private/Backend/Layouts/ + } + persistence { + # cat=module.tx_zuladungsliste//a; type=string; label=Default storage PID + storagePid = + } +} diff --git a/packages/zuladungsliste/Configuration/TypoScript/setup.typoscript b/packages/zuladungsliste/Configuration/TypoScript/setup.typoscript new file mode 100644 index 0000000..0eebd7e --- /dev/null +++ b/packages/zuladungsliste/Configuration/TypoScript/setup.typoscript @@ -0,0 +1,101 @@ +################ +#### PAGE #### +################ +page > +page = PAGE +page { + + typeNum = 0 + bodyTag = + + includeCSS { + fontawesome = typo3conf/ext/zuladungsliste/Resources/Public/Css/node_modules/@fortawesome/fontawesome-free/css/all.css + claro = typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/node_modules/dijit/themes/claro/claro.css + dgrid = typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/node_modules/dgrid/css/dgrid.css + zuladungsliste = typo3conf/ext/zuladungsliste/Resources/Public/Css/zuladungsliste.css + } + + includeJSLibs { + file1 = typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_modul_loader.js + file1.type = application/x-javascript + } + + includeJS { + file3 = typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/node_modules/dojo/dojo.js + file3.type = application/x-javascript + } + + #noPageTitle=2 + shortcutIcon = typo3conf/ext/zuladungsliste/Resources/Public/Icons/Extension.png +} + +[loginUser('*') && page["uid"] in [34,44]] +page { + headerData { + 5 = TEXT + 5 { + field = title + noTrimWrap = || + } + 15 = CONTENT + 15.select.pidInList = this + 15.table = tt_content + 15.renderObj = COA + 15.renderObj { + 10 = TEXT + 10.field = list_type + 10.noTrimWrap = || + } + } +} +[End] +################ +#### CONFIG #### +################ +config { + admPanel=0 + doctype=html5 + disablePrefixComment = 1 + + spamProtectEmailAddresses = 2 + spamProtectEmailAddresses_atSubst = (at) + + extTarget = _blank + intTarget = _top + + xhtml_cleaning=all + prefixLocalAnchors = all + + noPageTitle = 2 + #pageTitleFirst = 1 + + linkVars = L + sys_language_uid = 0 + + # DEVELOPMENT + compressJs = 0 + compressCss = 0 + concatenateJs = 0 + concatenateCss = 0 + minifyJs = 0 + minifyCSS = 0 + + + disableAllHeaderCode = 0 + disablePrefixComment = 1 + inlineStyle2TempFile = 1 + removePageCss = 0 + removeDefaultCss = 1 + removeDefaultJS = 1 + moveJsFromHeaderToFooter = 0 + prefixLocalAnchors = all + disableBodyTag = 0 + + #pageRendererTemplateFile = typo3conf/ext/zuladungsliste/Resources/Private/Layouts/EmptyPageRenderer.html + + headerComment ( + --------------------------------------------- + contact & info -> hermann.telser(at)gmail.com + --------------------------------------------- + ) +} diff --git a/packages/zuladungsliste/Readme.md b/packages/zuladungsliste/Readme.md new file mode 100644 index 0000000..32926cc --- /dev/null +++ b/packages/zuladungsliste/Readme.md @@ -0,0 +1,29 @@ +# Zuladungsliste für die Steiermark + +Typo3 Erweiterung zur verwaltung der Zuladungsliste für die Steiermark +Verion TYPO3 CMS 11.5.19 + +### Installing + +``` +* git clone http://gitea.nuhodds.com:3000/salam/nuh_1x2.git +``` + +## Authors + +Hermann Telser + +## Version History + +* 0.1 + * Create Repository + +## License + +This project is privat + +## Acknowledgments + +Website Produktion +* [Zuladungsliste Prod](https://zuladungsliste.ztkammer.at/) +* [Zuladungsliste Dev](https://devzuladungsliste.betaid.info/) \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/.htaccess b/packages/zuladungsliste/Resources/Private/.htaccess new file mode 100644 index 0000000..96d0729 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/.htaccess @@ -0,0 +1,11 @@ +# Apache < 2.3 + + Order allow,deny + Deny from all + Satisfy All + + +# Apache >= 2.3 + + Require all denied + diff --git a/packages/zuladungsliste/Resources/Private/Backend/Layouts/Default.html b/packages/zuladungsliste/Resources/Private/Backend/Layouts/Default.html new file mode 100644 index 0000000..5506c5c --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Layouts/Default.html @@ -0,0 +1,36 @@ + + +
+
+
+
+ + + + + + +
+
+ + +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Backend/Partials/FormErrors.html b/packages/zuladungsliste/Resources/Private/Backend/Partials/FormErrors.html new file mode 100644 index 0000000..bdf280a --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Partials/FormErrors.html @@ -0,0 +1,13 @@ + + + +
    + +
  • + {propertyPath}:
      +
    • {error}
    • +
    +
  • +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Partials/Kriterien/FormFields.html b/packages/zuladungsliste/Resources/Private/Backend/Partials/Kriterien/FormFields.html new file mode 100644 index 0000000..e816efc --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Partials/Kriterien/FormFields.html @@ -0,0 +1,5 @@ + +
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Partials/Kriterien/Properties.html b/packages/zuladungsliste/Resources/Private/Backend/Partials/Kriterien/Properties.html new file mode 100644 index 0000000..741e956 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Partials/Kriterien/Properties.html @@ -0,0 +1,11 @@ + + + + + + +
+ + + {kriterien.bezeichnung} +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Partials/Wettbewerbe/FormFields.html b/packages/zuladungsliste/Resources/Private/Backend/Partials/Wettbewerbe/FormFields.html new file mode 100644 index 0000000..f2f0973 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Partials/Wettbewerbe/FormFields.html @@ -0,0 +1,41 @@ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Partials/Wettbewerbe/Properties.html b/packages/zuladungsliste/Resources/Private/Backend/Partials/Wettbewerbe/Properties.html new file mode 100644 index 0000000..2ace066 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Partials/Wettbewerbe/Properties.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + {wettbewerbe.wettbewerb} +
+ + + {wettbewerbe.beschreibung} +
+ + + {wettbewerbe.registrierung} +
+ + + {wettbewerbe.verfahrensort} +
+ + + {wettbewerbe.bundesland} +
+ + + {wettbewerbe.abgabetermin -> f:format.date()} +
+ + + {wettbewerbe.kammerbeschluss -> f:format.date()} +
+ + + {wettbewerbe.entscheidungstermin -> f:format.date()} +
+ + + {wettbewerbe.sperrung} +
+ + + {wettbewerbe.aufgabenstellung} +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Architekten/List.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Architekten/List.html new file mode 100644 index 0000000..caec484 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Architekten/List.html @@ -0,0 +1,43 @@ + + + +This Template is responsible for creating a table of domain objects. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + List.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Listing for Architekten

+ + + + + + + + + + + + + + + + + + + + + + + +
{architekten.inliste} {architekten.vereidigung -> f:format.date()} {architekten.geburtsdatum -> f:format.date()} {architekten.freuenfoerderpunkt}EditDelete
+ +New Architekten +
diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/Edit.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/Edit.html new file mode 100644 index 0000000..d0155a2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/Edit.html @@ -0,0 +1,26 @@ + + + +This template displays a EDIT form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Edit.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Edit Kriterien

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/List.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/List.html new file mode 100644 index 0000000..21a11fc --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/List.html @@ -0,0 +1,37 @@ + + + +This Template is responsible for creating a table of domain objects. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + List.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Listing for Kriterien

+ + + + + + + + + + + + + + + + + +
{kriterien.bezeichnung}EditDelete
+ +New Kriterien +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/New.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/New.html new file mode 100644 index 0000000..8a66b76 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/New.html @@ -0,0 +1,26 @@ + + + +This template displays a NEW form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + New.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

New Kriterien

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/Show.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/Show.html new file mode 100644 index 0000000..cc9c29f --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Kriterien/Show.html @@ -0,0 +1,22 @@ + + + +This Template is responsible for displaying a single view for a domain object + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Show.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Single View for Kriterien

+ + + +Back to list
+New Kriterien +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Edit.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Edit.html new file mode 100644 index 0000000..91abdee --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Edit.html @@ -0,0 +1,26 @@ + + + +This template displays a EDIT form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Edit.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Edit Wettbewerbe

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Front.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Front.html new file mode 100644 index 0000000..8b05f93 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Front.html @@ -0,0 +1,5 @@ + + + +

Weiterleitung zum Frontend

+
diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/List.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/List.html new file mode 100644 index 0000000..e209267 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/List.html @@ -0,0 +1,55 @@ + + + +This Template is responsible for creating a table of domain objects. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + List.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Listing for Wettbewerbe

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{wettbewerbe.wettbewerb} {wettbewerbe.beschreibung} {wettbewerbe.registrierung} {wettbewerbe.verfahrensort} {wettbewerbe.bundesland} {wettbewerbe.abgabetermin -> f:format.date()} {wettbewerbe.kammerbeschluss -> f:format.date()} {wettbewerbe.entscheidungstermin -> f:format.date()} {wettbewerbe.sperrung} {wettbewerbe.aufgabenstellung}EditDelete
+ +New Wettbewerbe +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/New.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/New.html new file mode 100644 index 0000000..c0cba40 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/New.html @@ -0,0 +1,26 @@ + + + +This template displays a NEW form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + New.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

New Wettbewerbe

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Show.html b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Show.html new file mode 100644 index 0000000..14a3f9e --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Backend/Templates/Wettbewerbe/Show.html @@ -0,0 +1,22 @@ + + + +This Template is responsible for displaying a single view for a domain object + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Show.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Single View for Wettbewerbe

+ + + +Back to list
+New Wettbewerbe +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang.xlf new file mode 100644 index 0000000..fe8839e --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang.xlf @@ -0,0 +1,140 @@ + + + +
+ + + Wettbewerbe + + + Wettbewerb + + + Beschreibung + + + Registrierung + + + Verfahrensort + + + Bundesland + + + Abgabetermin + + + Kammerbeschluss + + + Entscheidungstermin + + + Sperrung + + + Aufgabenstellung + + + Wettbewerb User + + + Extrasperrung + + + Begruendung + + + Sperrzeitbis + + + Extrasperrung User + + + Kriterien + + + Bezeichnung + + + Preisartid + + + Sektinstagid + + + Punkte + + + Bezeichnung + + + Preisart + + + Preisart + + + Sektionstage + + + Bezeichnung + + + Stichtag + + + Sperrzeit + + + Sperrzeitstart + + + Punktezeit + + + Punktezeitstart + + + Neueinsteiger + + + Neueinsteigerstart + + + Frauenfoerderung + + + Frauenfoerderungstart + + + Frauenfoerderungsonderstart + + + Kammernid + + + Kammern + + + Bezeichnung + + + + + diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_bezuladungsliste.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_bezuladungsliste.xlf new file mode 100644 index 0000000..2e8399e --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_bezuladungsliste.xlf @@ -0,0 +1,14 @@ + + + +
+ + + zuladungsliste + + + + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_bmzuladungsliste.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_bmzuladungsliste.xlf new file mode 100644 index 0000000..224629a --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_bmzuladungsliste.xlf @@ -0,0 +1,18 @@ + + + +
+ + + Zuladungsliste + + + Administration der Zuladungsliste + + + Diese Modul dient zur Administration der Wettbewerbszuladungsliste für der Kammer der ZiviltechnikerInnen für Steiermark und Kärnten + in Österrreich + + + + diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_fe_users.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_fe_users.xlf new file mode 100644 index 0000000..e428903 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_fe_users.xlf @@ -0,0 +1,20 @@ + + + +
+ + + inliste + + + vereidigung + + + geburtsdatum + + + frauenfoerderpunkt + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_extrasperrung.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_extrasperrung.xlf new file mode 100644 index 0000000..6573aa6 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_extrasperrung.xlf @@ -0,0 +1,17 @@ + + + +
+ + + begruendung + + + sperrzeitbis + + + extrasperrungUser + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_kammern.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_kammern.xlf new file mode 100644 index 0000000..c2704bc --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_kammern.xlf @@ -0,0 +1,11 @@ + + + +
+ + + bezeichnung + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_kriterien.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_kriterien.xlf new file mode 100644 index 0000000..90fc619 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_kriterien.xlf @@ -0,0 +1,17 @@ + + + +
+ + + bezeichnung + + + preisartid + + + sektinstagid + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_preisart.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_preisart.xlf new file mode 100644 index 0000000..8dcb2aa --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_preisart.xlf @@ -0,0 +1,11 @@ + + + +
+ + + preisart + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_punkte.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_punkte.xlf new file mode 100644 index 0000000..c2704bc --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_punkte.xlf @@ -0,0 +1,11 @@ + + + +
+ + + bezeichnung + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_sektionstage.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_sektionstage.xlf new file mode 100644 index 0000000..486cc95 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_sektionstage.xlf @@ -0,0 +1,44 @@ + + + +
+ + + bezeichnung + + + stichtag + + + sperrzeit + + + sperrzeitstart + + + punktezeit + + + punktezeitstart + + + neueinsteiger + + + neueinsteigerstart + + + frauenfoerderung + + + frauenfoerderungstart + + + frauenfoerderungsonderstart + + + kammernid + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_wettbewerbe.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_wettbewerbe.xlf new file mode 100644 index 0000000..dc5a129 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_csh_tx_zuladungsliste_domain_model_wettbewerbe.xlf @@ -0,0 +1,41 @@ + + + +
+ + + wettbewerb + + + beschreibung + + + registrierung + + + verfahrensort + + + bundesland + + + abgabetermin + + + kammerbeschluss + + + entscheidungstermin + + + sperrung + + + aufgabenstellung + + + wettbewerbUser + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Language/locallang_db.xlf b/packages/zuladungsliste/Resources/Private/Language/locallang_db.xlf new file mode 100644 index 0000000..0fae40e --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Language/locallang_db.xlf @@ -0,0 +1,143 @@ + + + +
+ + + Wettbewerbe + + + Wettbewerb + + + Beschreibung + + + Registrierung + + + Verfahrensort + + + Bundesland + + + Abgabetermin + + + Kammerbeschluss + + + Entscheidungstermin + + + Sperrung + + + Aufgabenstellung + + + Wettbewerb User + + + Extrasperrung + + + Begruendung + + + Sperrzeitbis + + + Extrasperrung User + + + Kriterien + + + Bezeichnung + + + Preisartid + + + Sektinstagid + + + Punkte + + + Bezeichnung + + + Preisart + + + Preisart + + + Sektionstage + + + Bezeichnung + + + Stichtag + + + Sperrzeit + + + Sperrzeitstart + + + Punktezeit + + + Punktezeitstart + + + Neueinsteiger + + + Neueinsteigerstart + + + Frauenfoerderung + + + Frauenfoerderungstart + + + Frauenfoerderungsonderstart + + + Kammernid + + + Kammern + + + Bezeichnung + + + + Zuladungsliste ZT Kammer Architekten + + + + diff --git a/packages/zuladungsliste/Resources/Private/Layouts/Default.html b/packages/zuladungsliste/Resources/Private/Layouts/Default.html new file mode 100644 index 0000000..5f6208e --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Layouts/Default.html @@ -0,0 +1,4 @@ + +
+ +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Layouts/EmptyPageRenderer.html b/packages/zuladungsliste/Resources/Private/Layouts/EmptyPageRenderer.html new file mode 100644 index 0000000..6ec46cc --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Layouts/EmptyPageRenderer.html @@ -0,0 +1,27 @@ +###XMLPROLOG_DOCTYPE### +###HTMLTAG### +###HEADTAG### + +###METACHARSET### +###INLINECOMMENT### + +###BASEURL### +###SHORTCUT### +###TITLE### +###META### + +###CSS_LIBS### +###CSS_INCLUDE### +###CSS_INLINE### + +###JS_LIBS### +###JS_INCLUDE### +###JS_INLINE### + +###HEADERDATA### +###POSTJSMARKER### + + +###BODY### + + diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Address.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Address.html new file mode 100644 index 0000000..d243a1d --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Address.html @@ -0,0 +1,15 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Captcha.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Captcha.html new file mode 100644 index 0000000..e03f7b6 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Captcha.html @@ -0,0 +1,33 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} + + + + + + + + + + + +
+ +
+
    +
  • + Please install extension sr_freecap +
  • +
  • + And enable it with + plugin.tx_femanager.settings.new.validation.captcha.captcha = 1 or + plugin.tx_femanager.settings.edit.validation.captcha.captcha = 1 + in TypoScript +
  • +
+ +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/CaptchaField.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/CaptchaField.html new file mode 100644 index 0000000..da83dcb --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/CaptchaField.html @@ -0,0 +1,21 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +{namespace freeCap=SJBR\SrFreecap\ViewHelpers} +
+
+ +
+ + + +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/City.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/City.html new file mode 100644 index 0000000..57e2f4b --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/City.html @@ -0,0 +1,15 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Company.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Company.html new file mode 100644 index 0000000..c1aabda --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Company.html @@ -0,0 +1,15 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Country.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Country.html new file mode 100644 index 0000000..b4f3122 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Country.html @@ -0,0 +1,62 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ + + + + + + + +
+
+
+ + + + + + + + + + + {countryName} + + + {countryName} + + + + + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/DateOfBirth.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/DateOfBirth.html new file mode 100644 index 0000000..d7037ce --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/DateOfBirth.html @@ -0,0 +1,18 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Email.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Email.html new file mode 100644 index 0000000..223e7d3 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Email.html @@ -0,0 +1,16 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+ +
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Fax.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Fax.html new file mode 100644 index 0000000..26ffde6 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Fax.html @@ -0,0 +1,16 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+ +
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/FirstName.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/FirstName.html new file mode 100644 index 0000000..0005d53 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/FirstName.html @@ -0,0 +1,15 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Frauenfoerderpunkt.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Frauenfoerderpunkt.html new file mode 100644 index 0000000..3fe07bc --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Frauenfoerderpunkt.html @@ -0,0 +1,17 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+
+
+ +
+
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Image.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Image.html new file mode 100644 index 0000000..ede5f6d --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Image.html @@ -0,0 +1,29 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+ +
+ + + + + +
+ + + Delete image +
+
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Kammermitgliedsnummer.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Kammermitgliedsnummer.html new file mode 100644 index 0000000..1ca0ad2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Kammermitgliedsnummer.html @@ -0,0 +1,14 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/LastName.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/LastName.html new file mode 100644 index 0000000..f2c63f0 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/LastName.html @@ -0,0 +1,15 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/MiddleName.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/MiddleName.html new file mode 100644 index 0000000..eec5386 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/MiddleName.html @@ -0,0 +1,16 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+ +
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Name.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Name.html new file mode 100644 index 0000000..6da532b --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Name.html @@ -0,0 +1,16 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+ +
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Password.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Password.html new file mode 100644 index 0000000..e29b144 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Password.html @@ -0,0 +1,36 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/State.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/State.html new file mode 100644 index 0000000..f8f3c90 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/State.html @@ -0,0 +1,19 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} + +
+ +
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/SubmitCreate.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/SubmitCreate.html new file mode 100644 index 0000000..f7a268b --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/SubmitCreate.html @@ -0,0 +1,8 @@ +
+
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/SubmitUpdate.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/SubmitUpdate.html new file mode 100644 index 0000000..424f2b3 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/SubmitUpdate.html @@ -0,0 +1,8 @@ +
+
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Telephone.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Telephone.html new file mode 100644 index 0000000..46e3c33 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Telephone.html @@ -0,0 +1,15 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Terms.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Terms.html new file mode 100644 index 0000000..8caa771 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Terms.html @@ -0,0 +1,24 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+
+ +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Title.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Title.html new file mode 100644 index 0000000..112d8a3 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Title.html @@ -0,0 +1,19 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+Ansprechpartner: +
+
+
+
+ +
+ +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Usergroup.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Usergroup.html new file mode 100644 index 0000000..3fe67d2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Usergroup.html @@ -0,0 +1,61 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} + + + + + +
+ +
+ +
+
+
+ + + + + +
+ +
+ + + ]]>
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Username.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Username.html new file mode 100644 index 0000000..9e35d77 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Username.html @@ -0,0 +1,18 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Vereidigung.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Vereidigung.html new file mode 100644 index 0000000..4baa59a --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Vereidigung.html @@ -0,0 +1,13 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Www.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Www.html new file mode 100644 index 0000000..b5ed9e0 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Www.html @@ -0,0 +1,16 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+ +
+ +
+
diff --git a/packages/zuladungsliste/Resources/Private/Partials/Fields/Zip.html b/packages/zuladungsliste/Resources/Private/Partials/Fields/Zip.html new file mode 100644 index 0000000..86e4fc0 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Fields/Zip.html @@ -0,0 +1,15 @@ +{namespace femanager=In2code\Femanager\ViewHelpers} +
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/FormErrors.html b/packages/zuladungsliste/Resources/Private/Partials/FormErrors.html new file mode 100644 index 0000000..bdf280a --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/FormErrors.html @@ -0,0 +1,13 @@ + + + +
    + +
  • + {propertyPath}:
      +
    • {error}
    • +
    +
  • +
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Kriterien/FormFields.html b/packages/zuladungsliste/Resources/Private/Partials/Kriterien/FormFields.html new file mode 100644 index 0000000..e816efc --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Kriterien/FormFields.html @@ -0,0 +1,5 @@ + +
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Kriterien/Properties.html b/packages/zuladungsliste/Resources/Private/Partials/Kriterien/Properties.html new file mode 100644 index 0000000..fdd9b19 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Kriterien/Properties.html @@ -0,0 +1,11 @@ + + + + + + +
+ + + {kriterien.bezeichnung} +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Wettbewerbe/FormFields.html b/packages/zuladungsliste/Resources/Private/Partials/Wettbewerbe/FormFields.html new file mode 100644 index 0000000..f2f0973 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Wettbewerbe/FormFields.html @@ -0,0 +1,41 @@ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Partials/Wettbewerbe/Properties.html b/packages/zuladungsliste/Resources/Private/Partials/Wettbewerbe/Properties.html new file mode 100644 index 0000000..cfb7313 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Partials/Wettbewerbe/Properties.html @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + {wettbewerbe.wettbewerb} +
+ + + {wettbewerbe.beschreibung} +
+ + + {wettbewerbe.registrierung} +
+ + + {wettbewerbe.verfahrensort} +
+ + + {wettbewerbe.bundesland} +
+ + + {wettbewerbe.abgabetermin -> f:format.date()} +
+ + + {wettbewerbe.kammerbeschluss -> f:format.date()} +
+ + + {wettbewerbe.entscheidungstermin -> f:format.date()} +
+ + + {wettbewerbe.sperrung} +
+ + + {wettbewerbe.aufgabenstellung} +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Architekten/List.html b/packages/zuladungsliste/Resources/Private/Templates/Architekten/List.html new file mode 100644 index 0000000..7d7de08 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Architekten/List.html @@ -0,0 +1,43 @@ + + + +This Template is responsible for creating a table of domain objects. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + List.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Listing for Architekten

+ + + + + + + + + + + + + + + + + + + + + + + +
{architekten.inliste} {architekten.vereidigung -> f:format.date()} {architekten.geburtsdatum -> f:format.date()} {architekten.freuenfoerderpunkt}EditDelete
+ +New Architekten +
diff --git a/packages/zuladungsliste/Resources/Private/Templates/Felogin/Login/Login.html b/packages/zuladungsliste/Resources/Private/Templates/Felogin/Login/Login.html new file mode 100644 index 0000000..b230da9 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Felogin/Login/Login.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+
+ + + + + + + + + + + +
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + {extraHidden} +
+
+
+ + diff --git a/packages/zuladungsliste/Resources/Private/Templates/Felogin/Login/Logout.html b/packages/zuladungsliste/Resources/Private/Templates/Felogin/Login/Logout.html new file mode 100644 index 0000000..614c5e0 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Felogin/Login/Logout.html @@ -0,0 +1,46 @@ + + + + + + +

+ +

+

+ +

+ + +
+ + + +
+ + {user.username} +
+
+ +
+ +
+ + +
+
+
+ + diff --git a/packages/zuladungsliste/Resources/Private/Templates/Kriterien/Edit.html b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/Edit.html new file mode 100644 index 0000000..36d8b66 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/Edit.html @@ -0,0 +1,26 @@ + + + +This template displays a EDIT form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Edit.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Edit Kriterien

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Kriterien/List.html b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/List.html new file mode 100644 index 0000000..5bd0ed3 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/List.html @@ -0,0 +1,37 @@ + + + +This Template is responsible for creating a table of domain objects. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + List.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Listing for Kriterien

+ + + + + + + + + + + + + + + + + +
{kriterien.bezeichnung}EditDelete
+ +New Kriterien +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Kriterien/New.html b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/New.html new file mode 100644 index 0000000..40d8feb --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/New.html @@ -0,0 +1,26 @@ + + + +This template displays a NEW form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + New.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

New Kriterien

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Kriterien/Show.html b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/Show.html new file mode 100644 index 0000000..73a1350 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Kriterien/Show.html @@ -0,0 +1,22 @@ + + + +This Template is responsible for displaying a single view for a domain object + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Show.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Single View for Kriterien

+ + + +Back to list
+New Kriterien +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/Edit.html b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/Edit.html new file mode 100644 index 0000000..6533dc9 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/Edit.html @@ -0,0 +1,26 @@ + + + +This template displays a EDIT form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Edit.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Edit Wettbewerbe

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/List.html b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/List.html new file mode 100644 index 0000000..91287f0 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/List.html @@ -0,0 +1,55 @@ + + + +This Template is responsible for creating a table of domain objects. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + List.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Listing for Wettbewerbe

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{wettbewerbe.wettbewerb} {wettbewerbe.beschreibung} {wettbewerbe.registrierung} {wettbewerbe.verfahrensort} {wettbewerbe.bundesland} {wettbewerbe.abgabetermin -> f:format.date()} {wettbewerbe.kammerbeschluss -> f:format.date()} {wettbewerbe.entscheidungstermin -> f:format.date()} {wettbewerbe.sperrung} {wettbewerbe.aufgabenstellung}EditDelete
+ +New Wettbewerbe +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/New.html b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/New.html new file mode 100644 index 0000000..347cc41 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/New.html @@ -0,0 +1,26 @@ + + + +This template displays a NEW form for the current domain object. + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + New.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

New Wettbewerbe

+ + + + + + + + + +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/Show.html b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/Show.html new file mode 100644 index 0000000..5a05ac2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Private/Templates/Wettbewerbe/Show.html @@ -0,0 +1,22 @@ + + + +This Template is responsible for displaying a single view for a domain object + +If you modify this template, do not forget to change the overwrite settings +in /Configuration/ExtensionBuilder/settings.yaml: + Resources: + Private: + Templates: + Show.html: keep + +Otherwise your changes will be overwritten the next time you save the extension in the extension builder + + +

Single View for Wettbewerbe

+ + + +Back to list
+New Wettbewerbe +
\ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Public/Css/Backend/backend.css b/packages/zuladungsliste/Resources/Public/Css/Backend/backend.css new file mode 100644 index 0000000..d6ec9b2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Css/Backend/backend.css @@ -0,0 +1,59 @@ +.icon-zuladungsliste-kammern-1 .fa { + color: #006400; +} +.icon-zuladungsliste-kammern-2 .fa { + color: #4169e1; +} +.icon-zuladungsliste-kammern-3 .fa { + color: #a52a2a; +} +.icon-zuladungsliste-kammern-4 .fa { + color: #daa520; +} +.icon-zuladungsliste-kriterium-1 .fa { + color: #006400; +} +.icon-zuladungsliste-kriterium-2 .fa { + color: #4169e1; +} +.icon-zuladungsliste-kriterium-3 .fa { + color: #a52a2a; +} +.icon-zuladungsliste-kriterium-4 .fa { + color: #daa520; +} +.zuladungsliste-kammern-1 { + color: #006400; +} +.zuladungsliste-kammern-2 { + color: #4169e1; +} +.zuladungsliste-kammern-3 { + color: #a52a2a; +} +.zuladungsliste-kammern-4 { + color: #daa520; +} +.be_punktestatus { + color: green; +} +.be_punktestatus span { + width: 250px; + display: inline-block; + color: #666; +} +.typo3-login { + background-image: none !important; + background-color: #369; +} +.btn-login { + background-color: #a00 !important; +} +.panel-login .panel-body { + border-color: #369; +} +.small { + font-size: 80%; + font-weight: normal; + margin-left: 25px; +} diff --git a/packages/zuladungsliste/Resources/Public/Css/img/filter.png b/packages/zuladungsliste/Resources/Public/Css/img/filter.png new file mode 100644 index 0000000..ba5c3fc Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Css/img/filter.png differ diff --git a/packages/zuladungsliste/Resources/Public/Css/img/lupe.png b/packages/zuladungsliste/Resources/Public/Css/img/lupe.png new file mode 100644 index 0000000..4b14c18 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Css/img/lupe.png differ diff --git a/packages/zuladungsliste/Resources/Public/Css/visual/backend.css b/packages/zuladungsliste/Resources/Public/Css/visual/backend.css new file mode 100644 index 0000000..554f7c1 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Css/visual/backend.css @@ -0,0 +1,54 @@ +.icon-zuladungsliste-kammern-1 .fa { + color: #006400; +} +.icon-zuladungsliste-kammern-2 .fa { + color: #4169e1; +} +.icon-zuladungsliste-kammern-3 .fa { + color: #a52a2a; +} +.icon-zuladungsliste-kammern-4 .fa { + color: #daa520; +} +.icon-zuladungsliste-kriterium-1 .fa { + color: #006400; +} +.icon-zuladungsliste-kriterium-2 .fa { + color: #4169e1; +} +.icon-zuladungsliste-kriterium-3 .fa { + color: #a52a2a; +} +.icon-zuladungsliste-kriterium-4 .fa { + color: #daa520; +} +.zuladungsliste-kammern-1 { + color: #006400; +} +.zuladungsliste-kammern-2 { + color: #4169e1; +} +.zuladungsliste-kammern-3 { + color: #a52a2a; +} +.zuladungsliste-kammern-4 { + color: #daa520; +} +.be_punktestatus { + color: green; +} +.be_punktestatus span { + width: 250px; + display: inline-block; + color: #666; +} +.typo3-login { + background-image: none !important; + background-color: #369; +} +.btn-login { + background-color: #a00 !important; +} +.panel-login .panel-body { + border-color: #369; +} diff --git a/packages/zuladungsliste/Resources/Public/Css/zuladungsliste.css b/packages/zuladungsliste/Resources/Public/Css/zuladungsliste.css new file mode 100644 index 0000000..7853243 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Css/zuladungsliste.css @@ -0,0 +1,1401 @@ +@font-face { + font-family: 'Raleway'; + src: url('../Fonts/Raleway/raleway-v28-latin-regular.woff') format('woff'), + url('../Fonts/Raleway/raleway-v28-latin-regular.woff2') format('woff2'); +} + +h1 { + font-family: 'Raleway'; +} + +.element-subheader { + font-size: 1.4rem; +} + +html, +body { + width: 100%; + height: 100%; + margin: 0; +} + +body { + padding: 0; + background: #fff; + color: #424242; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1rem; +} + +.floatright { + float: right; +} + +/*************************************************** + tx-srfeuserregister-pi1 +***************************************************/ + +.mytooltip { + position: relative; + display: inline-block; + cursor: pointer; + color: #088930; +} + +.mytooltip .mytooltiptext { + visibility: hidden; + width: 220px; + background-color: #555; + color: #fff; + text-align: left; + border-radius: 6px; + padding: 15px; + position: absolute; + z-index: 1; + bottom: 125%; + left: 50%; + margin-left: -60px; + opacity: 0; + transition: opacity 1s; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + line-height: 1.55; +} + +.mytooltip .mytooltiptext::after { + content: ''; + position: absolute; + top: 100%; + left: 27%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: #555 transparent transparent transparent; +} + +.mytooltip:hover .mytooltiptext { + visibility: visible; + opacity: 1; +} + +.tx-srfreecap-cant-read { + height: 30px; + display: block; +} + +#protokoll2_label, +#protokoll_label { + cursor: pointer !important; +} + +#maincontainer { + width: 100%; + height: 100%; + margin: 0; + padding: 2rem; +} + +.page_title { + text-align: center; + font-size: 110%; + font-weight: bold; +} + +:focus { + outline: 0; +} + +*:focus { + outline: 0; +} + +.position_top2 { + position: relative; + top: 2px; +} + +.dijitMenuItemLabel .fa { + position: relative; + right: 1px; + top: -1px; +} + +::-webkit-scrollbar { + display: none; +} + +.primary { + color: #0099ff; +} + +.secondary { + color: #088930; +} + +.dgrid-row-expanded .gesperrt{ + color: #fff; +} + +.gesperrt, +.tertiary { + color: #cf202c; +} + +.fourthly { + color: #8c9089; +} + +.fiftly { + color: #b09c57; +} + +a:link, +a:visited { + text-decoration: none; + color: #088930; +} + +a:hover, +a:active { + color: #cf202c; +} + +.position_year { + line-height: 20px; + font-weight: bold; +} + +.line-height-50 { + line-height: 50px; + padding-left: 2px; +} + +/* +find . -name '*.js' -exec sed -i -e 's/gray/fiftly/g' {}; +find . -name '*.js' -exec sed -i -e 's/gray/fiftly/g' {} \; +*/ +.border-l-red { + border-left: 2px solid #cf202c; +} + +.enabled { + cursor: pointer; + background-color: #aad7b8 !important; +} + +.no-border-l { + border-left: 0; +} + +.pointer { + cursor: pointer; +} + +.no-padding { + padding: 0; +} + +.fp70 { + font-size: 70%; +} + +.margintop5 { + margin-top: 5px; +} + +.mr5 { + margin-right: 5px; +} + +.company_line2 { + margin-left: 20px; + color: inherit; + font-style: italic; +} + +.width125 { + width: 125px; + text-align: right; + display: inline-block; +} + +.right { + text-align: right; +} + +.center { + text-align: center; +} + +.bold { + font-weight: bold; +} + +/************************************************* + MENU +*************************************************/ +#topmenu { + background-image: url('/typo3conf/ext/zuladungsliste/Resources/Public/Images/logo-neu.png'); + background-repeat: no-repeat; + background-position: 5px center; + background-size: auto 50px; + background-color: #efefef !important; + text-align: right; + line-height: 44px; +} + +#infobox, +#infobox2 { + margin: 1em; + font-family: 'Raleway'; + font-size: 1.8rem; + color: #088930; +} + +.claro .dijitTab { + border: 1px solid #088930; + text-align: center; +} + +.claro .dijitMenu { + border: 1px solid #088930; +} + +.claro .dijitMenuBar .dijitMenuItemHover, +.claro .dijitMenuBar .dijitMenuItemSelected { + border: solid 1px #088930; +} + +.claro .dijitMenu .dijitMenuItemHover td, +.claro .dijitMenu .dijitMenuItemSelected td, +.claro .dijitMenuItemHover, +.claro .dijitComboBoxMenu .dijitMenuItemHover, +.claro .dijitMenuItemSelected { + border-color: #088930; + background-color: #aad7b8; +} + +/************************************************* + TAB +*************************************************/ +.claro .dijitTabHover { + border-color: #088930; + background-color: #aad7b8; +} + +.claro .dijitTabActive { + border-color: #088930; + background-color: #aad7b8; +} + +.claro .dijitTabChecked { + border-color: #b5bcc7; + background-color: #e8f4ec; +} + +.claro .tabStripButtonHover { + background-color: #c2f0c2; +} + +.claro .tabStripButtonActive { + background-color: #aad7b8; +} + +.claro .dijitTabContainerLeft .tabLabel { + text-align: left; + padding-left: 5px; +} + +.mr7 { + margin-right: 7px; +} + +.mr10 { + margin-right: 10px; +} + +.ml10 { + margin-left: 10px; +} + +.pl100 { + padding-left: 100px; +} + +.pointer { + cursor: pointer; +} + +.claro .dijitTab .tabLabel { + display: inline-block; + cursor: pointer; + line-height: 32px; + min-height: 15px; + min-width: 180px; + color: #424242; +} + +.tab-header { + background-color: #efefef !important; + text-align: center; + overflow: hidden; + height: 34px; + line-height: 35px; + font-size: 1.5rem; +} + +.text-header { + font-family: 'Raleway'; + font-size: 2.5rem; + color: #088930; + background-image: url('../Images/panther.png'); + background-position: 99.7% center; + background-repeat: no-repeat; + background-size: 35px; +} + +.text-subheader { + font-family: 'Raleway'; + font-size: 1.8rem; + color: #088930; +} + +.filter-header { + background: #efefef !important; + height: 34px; + line-height: 34px; + text-align: center; +} + +.textbox { + width: 142px; +} + +.filter-box .dijitPlaceHolder { + cursor: text; + text-align: left; + margin-top: 1px; + text-indent: 2px; + width: 93%; + background-image: url('img/filter.png'); + background-repeat: no-repeat; + background-position: right center; +} + +.search-box .dijitPlaceHolder { + cursor: text; + text-align: left; + margin-top: 1px; + text-indent: 2px; + width: 93%; + background-image: url('img/lupe.png'); + background-repeat: no-repeat; + background-position: right center; +} + +.cell-icon { + width: 50px; + text-align: center; + padding: auto 0; +} + +.ce7-100 { + width: 100px; + text-align: center; + padding: auto 0; +} + +.cell-50 { + text-align: center; + width: 50px; +} + +.cell-100 { + width: 100px; +} + +.cell-110 { + text-align: center; + width: 110px; +} + +.cell-120 { + width: 120px; +} + +.cell-140 { + width: 140px; +} + +.cell-200 { + width: 200px; +} + +.cell-420 { + width: 420px; +} + +.childelement_even { + background-color: #f8f8f8 !important; + cursor: default; +} + +.childelement_even:hover { + background-color: #d3d3d3 !important; + cursor: default; +} + +.childelement_odd { + background-color: #f0f0f0 !important; + cursor: default; +} + +.childelement_odd:hover { + background-color: #d3d3d3 !important; + cursor: default; +} + +.childelement_act_even { + background-color: #e6ffe6 !important; + cursor: default; +} + +.childelement_act_even:hover { + background-color: #c2f0c2 !important; + cursor: default; +} + +.childelement_act_odd { + background-color: #f7fff7 !important; + cursor: default; +} + +.childelement_act_odd:hover { + background-color: #c2f0c2 !important; + cursor: default; +} + +.childelement_frauen_even { + background-color: #f2e6ff !important; + cursor: default; +} + +.childelement_frauen_even:hover { + background-color: #d7b3ff !important; + cursor: default; +} + +.childelement_frauen_odd { + background-color: #fcf3ff !important; + cursor: default; +} + +.childelement_frauen_odd:hover { + background-color: #d7b3ff !important; + cursor: default; +} + +.childelement_neu_even { + background-color: #fffae6 !important; + cursor: default; +} + +.childelement_neu_even:hover { + background-color: #ffe066 !important; + cursor: default; +} + +.childelement_neu_odd { + background-color: #fff5cc !important; + cursor: default; +} + +.childelement_neu_odd:hover { + background-color: #ffe066 !important; + cursor: default; +} + +.childelement_sperre_even { + background-color: #ffe6e6 !important; + cursor: default; +} + +.childelement_sperre_even:hover { + background-color: #fcc !important; + cursor: default; +} + +.childelement_sperre_odd { + background-color: #f5d6d6 !important; + cursor: default; +} + +.childelement_sperre_odd:hover { + background-color: #fcc !important; + cursor: default; +} + +.vfid { + display: inline-block; + width: 50px; + font-weight: bold; + text-align: left; +} + +.vfid20 { + display: inline-block; + width: 25px; + font-weight: bold; + text-align: left; +} + +.geladen { + display: inline-block; + width: 70px; + font-weight: bold; + color: #538cc6; +} + +/* from zl.css */ +.dijitTooltipContainer { + width: 350px; + border-radius: 5px; + padding: 10px; + border: 1px solid #000 !important; + font-size: normal; + line-height: 1.5rem; +} + +#zl_maincontainer_bc { + height: 100%; + width: 100%; +} + +#cp_print { + display: none; + overflow: hidden; + height: 26cm; +} + +#zl_menu { + line-height: 36px; +} + +#zl_menu .dijitMenuItem { + padding-top: 10px !important; +} + +#zl_menu_liste { + text-align: center; +} + +#dijit_MenuBarItem_0 { + background: transparent !important; +} + +#copyright_information { + font-size: 14px; + background: #fff; +} + +#copyright_information .dijitDialogPaneContent { + padding: 23px; + line-height: 18px; +} + +.color_white { + color: #fff; +} + +#menu_einzelansicht, +#zl_menu { + background-image: url('/typo3conf/ext/zuladungsliste/Resources/Public/Images/ztkammer-logo-adler.png'); + background-repeat: no-repeat; + background-position: 3px center; + background-size: auto 50px; + background-color: #f9f9f9 !important; + text-align: right; + line-height: 52px; + height: 54px; +} + +.zlicon { + background-repeat: no-repeat; + background-position: left center; + height: 18px; + text-align: center; + width: 22px; +} + +.zliconAlle { + background-image: url('../Icons/zuladungalle.png'); +} + +.zliconTwo { + background-image: url('../Icons/zuladungzwei.png'); +} + +.zliconThree { + background-image: url('../Icons/zuladungdrei.png'); +} + +.zliconFour { + background-image: url('../Icons/zuladungvier.png'); +} + +.zliconFive { + background-image: url('../Icons/zuladungfuenf.png'); +} + +.zliconGesperrt { + background-image: url('../Icons/zuladunggesperrt.png'); +} + +.zliconFree { + background-image: url('../Icons/zuladungfree.png'); +} + +.downloadPDF { + background-image: url('../Icons/zuladungpdf.png'); +} + +#searchbox_zutl, +#searchbox_preis, +#searchbox_ein, +#searchbox_frei, +#searchbox_zuw, +#searchbox_zu { + border: 1px solid #ccc; + margin: 0 3px; + text-align: center; +} + +#widget_searchbox_zutl, +#widget_searchbox_preis, +#widget_searchbox_ein, +#widget_searchbox_zuw, +#widget_searchbox_frei, +#widget_searchbox_zu { + width: 120px; +} + +#widget_searchbox_zutl .dijitPlaceHolder, +#widget_searchbox_preis .dijitPlaceHolder, +#widget_searchbox_ein .dijitPlaceHolder, +#widget_searchbox_zuw .dijitPlaceHolder, +#widget_searchbox_frei .dijitPlaceHolder, +#widget_searchbox_zu .dijitPlaceHolder { + background-image: url('../Icons/lupe.png'); + background-position: right center; + background-repeat: no-repeat; + display: block; + text-align: left; + padding: 2px 2px 2px 5px; + width: 110px; +} + +#print_header { + background-image: url('/typo3conf/ext/zuladungsliste/Resources/Public/Images/ztkammer-logo-adler.png'); + background-repeat: no-repeat; + background-position: 3px center; + background-size: auto 50px; + text-align: right; + line-height: 52px; + height: 54px; +} + +.printcontainer { + border: 1px solid #aaa; +} + +table.print_zladungen { + width: 100%; +} + +table.print_zladungen td { + border-collapse: separate; + padding: 5px; +} + +table.print_zladungen td.gewaehlt { + background: #e9f9ee; + text-align: right; +} + +table.print_zladungen td.ersatz { + background: #e9f2f9; + text-align: right; +} + +table.print_zladungen td.company { + width: 60%; + text-align: left; +} + +#cp_naechsten_menu { + padding: 0; + width: 220px; + cursor: pointer; +} + +#cp_naechsten_menu .field-label { + padding: 10px; +} + +#cp_naechsten { + padding: 0; + cursor: pointer; + height: 290px; +} + +#cp_naechsten_top { + padding: 0; + cursor: pointer; + height: 80px; + padding: 20px; + background: #eee; +} + +.cp_naechsten_ersatz_header { + height: 28px; + background-color: #efefef !important; + line-height: 28px; + text-align: center; + font-weight: bold; + font-size: 16px; + color: #424242; + border: 0; +} + +#cp_naechsten_ersatz { + padding: 0; + cursor: pointer; +} + +#select_wettbewerb { + width: 500px; + height: 22px; + line-height: 23px; +} + +#cp_zuteilungen_bestehende { + border: 0; + padding: 0; + width: 420px; +} + +#positionierung_menu { + border-left: 0; + width: 200px; + text-align: left; +} + +#positionierung_top { + text-align: center; + line-height: 30px; + background-color: #efefef; +} + +#position_datum { + display: inline-block; + font-size: 18px; + margin: auto 20px; + font-weight: bold; +} + +#position_punkte, +#position_rang, +#position_sperrung { + display: inline-block; + margin: auto 20px; + font-size: 18px; +} + +#position_sperrung { + color: #cf122c !important; +} + +#positionierung_data { + border: 0; + padding: 0; +} + +#positionierung_menu .field-title { + cursor: pointer; + line-height: 26px; +} + +#positionierung .ui-icon { + color: #369; +} + +#positionierung_center { + background: #efefef; + border: 0; + padding: 0; +} + +#positionierung_center .vfid { + display: none; +} + +#menu_einreichung, +#menu_freischalten { + text-align: center; +} + +#bc_einzelansicht { + height: 100%; + width: 100%; +} + +/* tab list left */ +#tab_container_tablist, +#tab_container_achitekten_tablist { + padding-top: 35px; +} + +#tab_container_tablist .dijitTab, +#tab_container_achitekten_tablist .dijitTab { + margin-top: 5px; +} + +#bc_punkte { + width: 49%; +} + +#bc_search { + height: 32px; + border: 1px solid #d0d0d0; + overflow: hidden; +} + +#logout { + margin-right: 20px; +} + +#preise, +#wettbewerbe { + padding: 0; + cursor: pointer; +} + +#punkte_erklarung { + padding: 10px; + color: #424242; + line-height: 18px; +} + +#widget_search_wettbewerbe { + border: 0; + box-shadow: unset !important; +} + +#widget_search_wettbewerbe .dijitPlaceHolder { + background-position: right center; + background-repeat: no-repeat; + line-height: 24px; + height: 24px; + margin: auto 5px; + text-align: left; + border: 0; + overflow: hidden; +} + +#search_wettbewerbe { + text-indent: 5px; + border: 0; + line-height: 32px; + height: 32px; + overflow: hidden; +} + +#search_wettbewerbe .dijitBorderContainer-child, +#search_wettbewerbe .dijitSplitContainer-child { + border: 0; + overflow: hidden; +} + +#reset_search { + margin: 0; + padding: 0; + width: 36px; + line-height: 32px; + height: 32px; + border: 0; + text-align: center; + cursor: pointer; + overflow: hidden; +} + +#menu_wettbewerbe { + text-align: center; +} + +#wettbewerbe_selected { + text-align: center; + line-height: 26px; + height: 26px; + font-size: 20px; + background-color: #efefef; + background-image: url(images/standardGradient.png); + background-repeat: repeat-x; + background-image: -moz-linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + background-image: -webkit-linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + background-image: -o-linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + background-image: linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + _background-image: none; +} + +#einreichen, +#kontoedit { + padding: 10px 50px; +} + +table, +td, +th { + border-collapse: separate; +} + +table { + border-spacing: 6px; +} + +table.zuladungsliste_table { + border-spacing: 5px; + margin: 20px 0; +} + +table.zuladungsliste_table td { + padding: 10px; +} + +.dojoxUploaderFileListTable thead { + display: none; +} + +/* #address, +#city, +#company, +#date_of_birth, +#first_name, +#formbundesland, +#formverfahrensort, +#formwettbewerb, +#last_name, +#static_info_country, +#telephone, +#title, +#zip { + line-height: 24px; + height: 24px; +} + +#formabgabetermin, +#formregistrierung { + line-height: 24px; + height: 24px; + margin-top: 2px; +} + +#formbeschreibung { + line-height: 24px; +} + */ +#kontoeditheader { + height: 80px; + border: 0; + text-indent: 100px; + font-size: 1.5rem; + padding-top: 60px; +} + +#cp_kontoedit { + width: 400px; + border: 0; +} + +.editable { + cursor: pointer; +} + +.dojoxUploaderFileListProgress { + font-size: 24px; + color: orange; + font-weight: bold; + margin: 5px; +} + +#infobox { + height: 50px; + width: 500px; + text-align: center; +} + +a.icon { + color: #369; + cursor: pointer; +} + +a.icon:hover { + color: red; + cursor: pointer; +} + +.button-submit { + border: 0 none; + border-radius: 5px; + cursor: pointer; + height: 22px; + line-height: 16px; + background: #7db500 linear-gradient(to bottom, #fbfbfb, #e1e1e1) repeat scroll + 0 0; + border: 1px solid #d4d4d4; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, + 0 1px 2px rgba(0, 0, 0, 0.15); + color: #424242; + display: inline-block; + font-weight: 300; + height: 32px; + line-height: 30px; + margin: 0; + padding: 2px 12px; + text-align: center; + text-decoration: none; + text-shadow: 0 1px 1px white; + vertical-align: middle; +} + +.button-submit:focus, +.button-submit:hover { + background: #7db500 linear-gradient(to bottom, #a0e800, #6b9c00) repeat scroll + 0 0; + text-shadow: 0 -1px 1px rgba(19, 28, 0, 0.35); + color: white; +} + +.button-submit:active { + background: #76a312 none repeat scroll 0 0; + color: #374f00; + text-shadow: 0 -1px 1px rgba(19, 28, 0, 0.35); +} + +.dijitButton .dijitButtonNode, +.dijitComboButton .dijitButtonNode, +.dijitDropDownButton .dijitButtonNode, +.dijitToggleButton .dijitButtonNode { + background: transparent none repeat scroll 0 0 !important; + border-width: 0; +} + +.button-action { + background: #7db500 linear-gradient(to bottom, #8fcf00, #6b9c00) repeat scroll + 0 0; + border-color: #5a8200; + color: white; + text-shadow: 0 -1px 1px rgba(19, 28, 0, 0.35); +} + +.button-action:focus, +.button-action:hover { + background: #7db500 linear-gradient(to bottom, #a0e800, #6b9c00) repeat scroll + 0 0; +} + +.button-action:active { + background: #76a312 none repeat scroll 0 0; + color: #374f00; + box-shadow: none; + text-shadow: none; +} + +.dijitButtonHover .dijitButtonNode { + box-shadow: none; + text-shadow: none; +} + +.button-small { + background: #7db500 linear-gradient(to bottom, #fbfbfb, #e1e1e1) repeat scroll + 0 0; + border: 1px solid #d4d4d4; + border-radius: 5px; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, + 0 1px 2px rgba(0, 0, 0, 0.15); + color: #424242; + display: inline-block; + font-size: 12px; + line-height: 14px; + margin: 0; + padding: 5px 3px; + text-align: center; + text-decoration: none; + text-shadow: 0 1px 1px white; + vertical-align: middle; + min-width: 60px; + cursor: pointer; +} + +.button-circle { + border-radius: 240px; + border-width: 4px; + box-shadow: 0 1px 1px rgba(255, 255, 255, 0.5) inset, + 0 1px 2px rgba(0, 0, 0, 0.2); + font-size: 19px; + height: 120px; + line-height: 120px; + padding: 0; + width: 120px; +} + +.flat-button { + background: #7db500 linear-gradient(to bottom, #fbfbfb, #e1e1e1) repeat scroll + 0 0; + border: 1px solid #d4d4d4; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, + 0 1px 2px rgba(0, 0, 0, 0.15); + color: #424242; + display: inline-block; + font-family: 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, + 'Lucida Grande', sans-serif; + font-size: 14px; + font-weight: 300; + height: 32px; + line-height: 32px; + margin: 0; + padding: 0 25.6px; + text-align: center; + text-decoration: none; + text-shadow: 0 1px 1px white; + vertical-align: middle; +} + +.uploadBtn { + background: #7db500 linear-gradient(to bottom, #fbfbfb, #e1e1e1) repeat scroll + 0 0; + border: 1px solid #d4d4d4; + border-radius: 5px; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, + 0 1px 2px rgba(0, 0, 0, 0.15); + color: #424242; + display: inline-block; + font-size: 12px; + line-height: 14px; + margin: 0; + padding: 7px 5px 3px; + text-align: center; + text-decoration: none; + text-shadow: 0 1px 1px white; + vertical-align: middle; + width: 160px; + cursor: pointer; +} + +.uploadHover { + background: #7db500 linear-gradient(to bottom, #a0e800, #6b9c00) repeat scroll + 0 0; + border: 1px solid #d4d4d4; + border-radius: 5px; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, + 0 1px 2px rgba(0, 0, 0, 0.15); + color: #424242; + display: inline-block; + font-size: 12px; + line-height: 14px; + margin: 0; + padding: 7px 5px 3px; + text-align: center; + text-decoration: none; + text-shadow: 0 1px 1px white; + vertical-align: middle; + width: 160px; + cursor: pointer; + font-weight: bold; +} + +.uploadPress { + background-image: url('buttonActive.png'); +} + +.uploadDisabled { + background-image: none; + background-color: #424242; + color: #999; + border: 1px solid #999; +} + +#printIFrame1 { + z-index: 100; +} + +@media print { + body { + font: 13px Myriad, Helvetica, Tahoma, Arial, clean, sans-serif; + width: 100%; + height: 100%; + margin: 20px; + padding: 0; + overflow: hidden; + color: #000; + background: #fff; + } + + h1 { + font: 16px Myriad, Helvetica, Tahoma, Arial, clean, sans-serif; + } +} + +.claro .dijitComboBoxMenu .dijitMenuItem, +.claro .dijitMenu .dijitMenuItem td { + padding: 5px; +} + +.claro .dijitMenuBar { + padding: 7px; +} + +/********************************************************************** + DGRID +**********************************************************************/ +.dgrid-footer { + padding: 2px; +} + +.dgrid-status { + text-align: center; +} + +.dgrid-navigation { + text-align: center; +} + +.claro .dgrid-row-odd { + background-color: #fff; +} + +.claro .dgrid-row-even { + background-color: #efefef; +} + +.claro .dgrid { + border: 1px solid #b5bcc7; + background: #fff; + color: #333; +} + +.claro .dgrid-header { + font-weight: bold; +} + +.claro .dgrid-footer, +.claro .dgrid-header { + background-color: #efefef; + background-image: url(images/standardGradient.png); + background-repeat: repeat-x; + background-image: -moz-linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + background-image: -webkit-linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + background-image: -o-linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + background-image: linear-gradient( + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 100% + ); + _background-image: none; +} + +.dgrid-pagination .dgrid-status { + float: none; +} + +.dgrid-pagination .dgrid-navigation, +.dgrid-pagination .dgrid-page-size { + float: none; +} + +.claro .dgrid-row { + line-height: 32px; +} + +.claro .dgrid-row:hover { + background-color: #aad7b8; +} + +#cp_zuweisung_wettbewerbe .dgrid-selected, +#positionierung_menu .dgrid-selected { + background-color: rgb(8, 137, 48); + color: rgb(255, 255, 255); +} +.claro .dijitButton .dijitButtonNode, +.claro .dijitDropDownButton .dijitButtonNode, +.claro .dijitComboButton .dijitButtonNode, +.claro .dijitToggleButton .dijitButtonNode { + border: 0; + padding: 0; +} + +.claro .dgrid-selected:hover { + background-color: #aad7b8; +} + +.claro .dgrid-highlight { + background-color: #ff6; +} + +.claro .dgrid-cell { + border-color: #b5bcc7; + line-height: 18px; + border-right: 0; + vertical-align: middle; + padding: 7px; +} + +.claro .dgrid-header .dgrid-cell { + border-color: #b5bcc7; +} + +.dgrid-hider-toggle { + display: none; +} + +.dgrid { + height: 100%; + margin: 0; + padding: 0; + border: 0; +} + +.dgrid-row-expanded { + background-color: rgb(80, 135, 97) !important; + color: rgb(255, 255, 255); +} + +.claro .dgrid-pagination { + border-top: 1px solid #d9dde2; +} + +.dojoxUploaderFileListTable { + background-color: #aad7b8; +} + +.bg-danger { + color: #fff !important; +} diff --git a/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.eot b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.eot new file mode 100644 index 0000000..72121ea Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.eot differ diff --git a/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.svg b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.svg new file mode 100644 index 0000000..eca08e1 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.svg @@ -0,0 +1,326 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.ttf b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.ttf new file mode 100644 index 0000000..0ceb1cc Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.ttf differ diff --git a/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.woff b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.woff new file mode 100644 index 0000000..c5bf2f0 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.woff differ diff --git a/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.woff2 b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.woff2 new file mode 100644 index 0000000..eec1e74 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Fonts/Raleway/raleway-v28-latin-regular.woff2 differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/Extension.png b/packages/zuladungsliste/Resources/Public/Icons/Extension.png new file mode 100644 index 0000000..6f73b57 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/Extension.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/ExtensionAdler.png b/packages/zuladungsliste/Resources/Public/Icons/ExtensionAdler.png new file mode 100644 index 0000000..d5eff3a Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/ExtensionAdler.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/ExtensionBgWhite.png b/packages/zuladungsliste/Resources/Public/Icons/ExtensionBgWhite.png new file mode 100644 index 0000000..315274a Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/ExtensionBgWhite.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/ext_icon.gif b/packages/zuladungsliste/Resources/Public/Icons/ext_icon.gif new file mode 100644 index 0000000..9651890 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/ext_icon.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/lupe.png b/packages/zuladungsliste/Resources/Public/Icons/lupe.png new file mode 100644 index 0000000..a774a89 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/lupe.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/relation.gif b/packages/zuladungsliste/Resources/Public/Icons/relation.gif new file mode 100644 index 0000000..db61d7e Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/relation.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/svg/competition.svg b/packages/zuladungsliste/Resources/Public/Icons/svg/competition.svg new file mode 100644 index 0000000..4291ce6 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/svg/competition.svg @@ -0,0 +1,59 @@ + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/svg/kammer.svg b/packages/zuladungsliste/Resources/Public/Icons/svg/kammer.svg new file mode 100644 index 0000000..79efa2c --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/svg/kammer.svg @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Public/Icons/svg/list.svg b/packages/zuladungsliste/Resources/Public/Icons/svg/list.svg new file mode 100644 index 0000000..bf76281 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/svg/list.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Public/Icons/svg/preis.svg b/packages/zuladungsliste/Resources/Public/Icons/svg/preis.svg new file mode 100644 index 0000000..6f2f8aa --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/svg/preis.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Public/Icons/svg/transfer.svg b/packages/zuladungsliste/Resources/Public/Icons/svg/transfer.svg new file mode 100644 index 0000000..4b57593 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/svg/transfer.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/svg/waage.svg b/packages/zuladungsliste/Resources/Public/Icons/svg/waage.svg new file mode 100644 index 0000000..dfe6a56 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/svg/waage.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/packages/zuladungsliste/Resources/Public/Icons/svg/wettbewerb.svg b/packages/zuladungsliste/Resources/Public/Icons/svg/wettbewerb.svg new file mode 100644 index 0000000..5d7ad5f --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/svg/wettbewerb.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.gif b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.gif new file mode 100755 index 0000000..95dbf79 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.svg b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.svg new file mode 100644 index 0000000..4d98f06 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_extrasperrung.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kammern.gif b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kammern.gif new file mode 100755 index 0000000..bea27d8 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kammern.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kammern.svg b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kammern.svg new file mode 100644 index 0000000..7df4544 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kammern.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kriterien.gif b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kriterien.gif new file mode 100755 index 0000000..6433374 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kriterien.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kriterien.svg b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kriterien.svg new file mode 100644 index 0000000..1859122 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_kriterien.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_preisart.gif b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_preisart.gif new file mode 100755 index 0000000..c517fa3 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_preisart.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_preisart.svg b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_preisart.svg new file mode 100644 index 0000000..95433ff --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_preisart.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_punkte.gif b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_punkte.gif new file mode 100755 index 0000000..26a7a1d Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_punkte.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_punkte.svg b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_punkte.svg new file mode 100644 index 0000000..b1d2afa --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_punkte.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_sektionstage.gif b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_sektionstage.gif new file mode 100755 index 0000000..113d93c Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_sektionstage.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_sektionstage.svg b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_sektionstage.svg new file mode 100644 index 0000000..9d8e01a --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_sektionstage.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_wettbewerbe.gif b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_wettbewerbe.gif new file mode 100755 index 0000000..4686042 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_wettbewerbe.gif differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_wettbewerbe.svg b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_wettbewerbe.svg new file mode 100644 index 0000000..4871dd2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/Icons/tx_zuladungsliste_domain_model_wettbewerbe.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungacht.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungacht.png new file mode 100755 index 0000000..05245c5 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungacht.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungalle.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungalle.png new file mode 100755 index 0000000..7596eaa Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungalle.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungdrei.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungdrei.png new file mode 100755 index 0000000..147ed9e Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungdrei.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungfree.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungfree.png new file mode 100755 index 0000000..8f74fc3 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungfree.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungfuenf.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungfuenf.png new file mode 100755 index 0000000..b681e87 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungfuenf.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladunggesperrt.png b/packages/zuladungsliste/Resources/Public/Icons/zuladunggesperrt.png new file mode 100755 index 0000000..5d64be1 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladunggesperrt.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungneun.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungneun.png new file mode 100755 index 0000000..0ef7869 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungneun.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungpdf.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungpdf.png new file mode 100755 index 0000000..cf659f2 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungpdf.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungsechs.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungsechs.png new file mode 100755 index 0000000..b7c7211 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungsechs.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungsieben.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungsieben.png new file mode 100755 index 0000000..7818a8b Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungsieben.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungsliste.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungsliste.png new file mode 100644 index 0000000..d5eff3a Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungsliste.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungvier.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungvier.png new file mode 100755 index 0000000..0011ff7 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungvier.png differ diff --git a/packages/zuladungsliste/Resources/Public/Icons/zuladungzwei.png b/packages/zuladungsliste/Resources/Public/Icons/zuladungzwei.png new file mode 100755 index 0000000..648efcc Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Icons/zuladungzwei.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/Historic_City_Center_of_Graz.jpg b/packages/zuladungsliste/Resources/Public/Images/Historic_City_Center_of_Graz.jpg new file mode 100644 index 0000000..84d3fc3 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/Historic_City_Center_of_Graz.jpg differ diff --git a/packages/zuladungsliste/Resources/Public/Images/arching.png b/packages/zuladungsliste/Resources/Public/Images/arching.png new file mode 100644 index 0000000..eedbbf7 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/arching.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/bgpattern.png b/packages/zuladungsliste/Resources/Public/Images/bgpattern.png new file mode 100644 index 0000000..75bf749 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/bgpattern.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/ext_icon.png b/packages/zuladungsliste/Resources/Public/Images/ext_icon.png new file mode 100644 index 0000000..d5eff3a Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/ext_icon.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/logo-neu.png b/packages/zuladungsliste/Resources/Public/Images/logo-neu.png new file mode 100644 index 0000000..bfe92ef Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/logo-neu.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/logo.png b/packages/zuladungsliste/Resources/Public/Images/logo.png new file mode 100644 index 0000000..39a3623 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/logo.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/panther.png b/packages/zuladungsliste/Resources/Public/Images/panther.png new file mode 100644 index 0000000..bec89db Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/panther.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/zt-kammer-logo-504x100.png b/packages/zuladungsliste/Resources/Public/Images/zt-kammer-logo-504x100.png new file mode 100644 index 0000000..bbcac0b Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/zt-kammer-logo-504x100.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/zt-logo-tr.png b/packages/zuladungsliste/Resources/Public/Images/zt-logo-tr.png new file mode 100644 index 0000000..b5fa57a Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/zt-logo-tr.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/zt-logo.JPG b/packages/zuladungsliste/Resources/Public/Images/zt-logo.JPG new file mode 100644 index 0000000..c88d36a Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/zt-logo.JPG differ diff --git a/packages/zuladungsliste/Resources/Public/Images/zt-logo.png b/packages/zuladungsliste/Resources/Public/Images/zt-logo.png new file mode 100644 index 0000000..f3e9f13 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/zt-logo.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/ztkammer-adler.png b/packages/zuladungsliste/Resources/Public/Images/ztkammer-adler.png new file mode 100644 index 0000000..ddf18d9 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/ztkammer-adler.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/ztkammer-logo-adler.png b/packages/zuladungsliste/Resources/Public/Images/ztkammer-logo-adler.png new file mode 100644 index 0000000..52233dc Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/ztkammer-logo-adler.png differ diff --git a/packages/zuladungsliste/Resources/Public/Images/ztkammer-logo.png b/packages/zuladungsliste/Resources/Public/Images/ztkammer-logo.png new file mode 100644 index 0000000..80798b0 Binary files /dev/null and b/packages/zuladungsliste/Resources/Public/Images/ztkammer-logo.png differ diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/auswertung_alle.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/auswertung_alle.js new file mode 100644 index 0000000..a5a2bd8 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/auswertung_alle.js @@ -0,0 +1,231 @@ +define([ + 'dojo/_base/declare', + 'dijit/layout/ContentPane', + 'dijit/layout/BorderContainer', + 'dijit/MenuBar', + 'dijit/form/TextBox', + 'dstore/Memory', + 'dstore/Trackable', + 'dstore/Tree', + 'dgrid/Grid', + 'dgrid/Tree', + 'dgrid/extensions/ColumnHider', + 'dgrid/extensions/Pagination', + 'zuladungsliste/menus/menuitems_zuladungsliste_admin', + 'zuladungsliste/columns/columns_auswertungen', + 'zuladungsliste/zuladungsliste_xhr', + 'dojo/domReady!' +], function ( + declare, + ContentPane, + BorderContainer, + MenuBar, + TextBox, + Memory, + Trackable, + TreeStoreMixin, + Grid, + Tree, + ColumnHider, + Pagination, + menuitems_zuladungsliste_admin, + columns_auswertungen, + zuladungsliste_xhr +) { + return { + init: function (tab_container) { + /******************************************************* + * Layout + *******************************************************/ + window.filterListe = function () { + var filter_f + var str = dijit.byId('searchbox_zu').get('value') + + if (str != '') { + str = str.toLowerCase() + filter_f = store_auswertung + .filter(function (object) { + company = object.company.toLowerCase() + if (~company.indexOf(str) && object.hasChildren) { + return true + } + return false + }) + .sort('id') + } else { + filter_f = store_auswertung.filter({ hasChildren: 1 }).sort('id') + } + grid_auswertung.set('collection', filter_f) + grid_auswertung.startup() + grid_auswertung.refresh() + } + + window.ladeListe = function (archive_id, archivedatum) { + if (!archive_id) { + archive_id = 0 + } + + if (archivedatum) { + dijit + .byId('cp_adminliste_header') + .set( + 'content', + 'Zuladungsliste vom ' + + archivedatum + + '' + ) + } else { + dijit + .byId('cp_adminliste_header') + .set('content', 'Aktuelle Zuladungsliste') + } + + var callback = function (response) { + var store_auswertung = (window.store_auswertung = new (declare([ + Memory, + Trackable, + TreeStoreMixin + ]))({ + data: response, + idProperty: 'id' + })) + filterListe() + } + zuladungsliste_xhr.call_function( + callback, + 'liste_controller', + 'load_liste_admin', + '&archive_id=' + archive_id + ) + } + + /******************************************************* + * BASE BC + *******************************************************/ + var tab_auswertung = new BorderContainer({ + design: 'headline', + id: 'tab_auswertung', + title: ' Zuladungsliste', + onShow: function () { + ladeListe() + } + }) + /******************************************************* + * info header + *******************************************************/ + var cp_adminliste_header = new ContentPane({ + id: 'cp_adminliste_header', + region: 'top', + className: 'tab-header center' + }) + tab_auswertung.addChild(cp_adminliste_header) + + /******************************************************* + * MENU + *******************************************************/ + var cp_adminliste_menu = new ContentPane({ + id: 'cp_adminliste_menu', + style: 'padding:0;border:0;', + region: 'top' + }) + tab_auswertung.addChild(cp_adminliste_menu) + var menu_auswertungen = new MenuBar({ + id: 'menu_auswertungen', + className: 'center', + region: 'top', + splitter: false + }) + menu_auswertungen.addChild( + new TextBox({ + region: 'left', + type: 'text', + selectOnClick: false, + trim: false, + id: 'searchbox_zu', + placeHolder: 'Filter ..', + _setSelected: function () {}, + onKeyUp: function () { + filterListe() + } + }) + ) + menu_auswertungen.addChild( + new dijit.MenuBarItem({ + label: '', + id: 'resetbutton', + style: 'margin-right: 15px;', + onClick: function () { + dijit.byId('searchbox_zu').reset() + filterListe() + } + }) + ) + menuitems_zuladungsliste_admin.load_items(menu_auswertungen) + cp_adminliste_menu.addChild(menu_auswertungen) + + /******************************************************* + * GRID CP + *******************************************************/ + + var cp_adminliste_center = new ContentPane({ + id: 'cp_adminliste_center', + region: 'center', + style: 'padding:0; border:0' + }) + tab_auswertung.addChild(cp_adminliste_center) + + /******************************************************* + * GRID + *******************************************************/ + var PaginationGrid = declare([Grid, Pagination, Tree, ColumnHider]) + var grid_auswertung = (window.grid_auswertung = new PaginationGrid({ + collapseOnRefresh: true, + selectionMode: 'none', + columns: columns_auswertungen.load(), + pagingLinks: true, + pagingTextBox: false, + firstLastArrows: true, + rowsPerPage: 100, + renderRow: function (object, i) { + var rowElement = this.inherited(arguments) + if (object.type == 'frauenfoerderpunkt') { + if (object.id % 2 == 0) + rowElement.className += 'childelement_frauen_even' + else rowElement.className += 'childelement_frauen_odd' + } else if (object.type == 'neueinsteiger') { + if (object.id % 2 == 0) + rowElement.className += 'childelement_neu_even' + else rowElement.className += 'childelement_neu_odd' + } else if (object.type == 'sondersperrung') { + if (object.id % 2 == 0) + rowElement.className += 'childelement_sperre_even' + else rowElement.className += 'childelement_sperre_odd' + } else if (object.hasChildren == 0 && object.punkte_aktive == 1) { + if (object.id % 2 == 0) + rowElement.className += 'childelement_act_even' + else rowElement.className += 'childelement_act_odd' + } else if (object.hasChildren == 0) { + if (object.id % 2 == 0) rowElement.className += 'childelement_even' + else rowElement.className += 'childelement_odd' + } + if (object.kontoaufloesung == 1) { + if (object.id % 2 == 0) rowElement.className += 'aufgeloest_even' + else rowElement.className += 'aufgeloest_odd' + } + return rowElement + } + })) + cp_adminliste_center.addChild(grid_auswertung) + + // grid_auswertung.on("dgrid-refresh-complete", function(evt) { + // window.line.destroy(); + // dojo.byId("cp_adminliste_header").set("content", "some text"); + // }); + + /******************************************************* + * START + *******************************************************/ + tab_container.addChild(tab_auswertung) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/einreichungen.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/einreichungen.js new file mode 100644 index 0000000..5d476e1 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/einreichungen.js @@ -0,0 +1,314 @@ +define([ + 'dojo/_base/declare', + 'dijit/layout/ContentPane', + 'dijit/layout/BorderContainer', + 'dijit/form/TextBox', + 'dijit/MenuBar', + 'dijit/MenuBarItem', + 'dstore/Memory', + 'dstore/Trackable', + 'dgrid/Grid', + 'dgrid/CellSelection', + 'dgrid/extensions/Pagination', + 'dgrid/Tree', + 'zuladungsliste/menus/menuitems_einreichungen', + 'zuladungsliste/columns/columns_einreichungen_administrator', + 'zuladungsliste/zuladungsliste_xhr', + 'dojo/domReady!' +], function ( + declare, + ContentPane, + BorderContainer, + TextBox, + MenuBar, + MenuBarItem, + Memory, + Trackable, + Grid, + CellSelection, + Pagination, + Tree, + menuitems_einreichungen, + columns_einreichungen_administrator, + zuladungsliste_xhr +) { + return { + init: function (tab_container) { + LOCALSCOPE.filter_ein = [] + LOCALSCOPE.print_ein = '' + /******************************************************* + * Filter + *******************************************************/ + window.remove_ein = function (id) { + switch (id) { + case 1: + delete LOCALSCOPE.filter_ein.bundeslandid + break + case 2: + delete LOCALSCOPE.filter_ein.year + break + case 3: + delete LOCALSCOPE.filter_ein.status + break + case 4: + dijit.byId('searchbox_ein').reset() + break + } + filterEinreichungen() + } + + window.filterEinreichungen = function () { + var str = '' + if (LOCALSCOPE.filter_ein.bundeslandid != undefined) { + str += '    ' + str += + ' ' + LOCALSCOPE.bundeslaender[LOCALSCOPE.filter_ein.bundeslandid] + str += + ' ' + } + if (LOCALSCOPE.filter_ein.year != undefined) { + str += '    ' + str += ' ' + LOCALSCOPE.filter_ein.year + str += + ' ' + } + if (LOCALSCOPE.filter_ein.status != undefined) { + switch (LOCALSCOPE.filter_ein.status) { + case 1: + str += + '    Anstehend' + break + case 2: + str += + '    Angenommen' + break + case 3: + str += + '    Abgelehnt' + break + } + str += + ' ' + } + + LOCALSCOPE.filter_f = [] + var string = dijit.byId('searchbox_ein').get('value') + if (string != '') { + str += '    ' + str += + string + + ' ' + string = string.toLowerCase() + LOCALSCOPE.filter_f = store_einreichungen.filter(function (object) { + wettbewerb = object.wettbewerb.toLowerCase() + company = object.company.toLowerCase() + if (~wettbewerb.indexOf(string) || ~company.indexOf(string)) { + return true + } + return false + }) + LOCALSCOPE.filter_f = LOCALSCOPE.filter_f + .filter(LOCALSCOPE.filter_ein) + .sort('wettbewerb') + } else { + LOCALSCOPE.filter_f = store_einreichungen + .filter(LOCALSCOPE.filter_ein) + .sort('wettbewerb') + } + + LOCALSCOPE.print_ein = str + + grid_einreichungen.set('collection', LOCALSCOPE.filter_f) + grid_einreichungen.startup() + grid_einreichungen.refresh() + + if (str) { + dijit.byId('cp_einreichungen_filter').set('content', str) + } else { + dijit.byId('cp_einreichungen_filter').set('content', '') + } + } + + /******************************************************* + * Load Data + *******************************************************/ + window.loadEinreichungen = function () { + var callback = function (response) { + window.store_einreichungen = new (declare([Memory, Trackable]))({ + data: response, + idProperty: 'id' + }) + filterEinreichungen() + } + zuladungsliste_xhr.call_function( + callback, + 'liste_controller', + 'load_einreichungen' + ) + } + + var tab_einreichung = new BorderContainer({ + design: 'headline', + title: ' Einreichungen', + id: 'einreichungen', + onShow: function () { + loadEinreichungen() + } + }) + + /******************************************************* + * info header + *******************************************************/ + var cp_einreichung_header = new ContentPane({ + id: 'cp_einreichung_header', + content: 'Einreichungen', + region: 'top', + className: 'tab-header center' + }) + tab_einreichung.addChild(cp_einreichung_header) + + /******************************************************* + * menu_einreichung + *******************************************************/ + + var menu_einreichung = new MenuBar({ + region: 'top', + id: 'menu_einreichung', + splitter: false + }) + menu_einreichung.addChild( + new TextBox({ + name: 'searchbox_ein', + id: 'searchbox_ein', + disabled: false, + trim: true, + placeHolder: ' Filter...', + _setSelected: function () {}, + onKeyUp: function () { + filterEinreichungen() + } + }) + ) + menu_einreichung.addChild( + new dijit.MenuBarItem({ + label: '', + _setSelected: function () {}, + onClick: function () { + loadEinreichungen() + dijit.byId('searchbox_ein').reset() + } + }) + ) + menu_einreichung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Neu Laden', + _setSelected: function () {}, + onClick: function () { + dijit.byId('searchbox_ein').reset() + LOCALSCOPE.filter_ein = [] + LOCALSCOPE.search_ein = '' + loadEinreichungen() + } + }) + ) + menuitems_einreichungen.load_items(menu_einreichung) + tab_einreichung.addChild(menu_einreichung) + + /******************************************************* + * filter header + *******************************************************/ + var cp_einreichungen_filter = new ContentPane({ + id: 'cp_einreichungen_filter', + style: 'padding:0;', + region: 'top', + className: 'filter-header center' + }) + tab_einreichung.addChild(cp_einreichungen_filter) + + /******************************************************* + * cp grid + *******************************************************/ + + var CellSelectionGridEditor = declare([ + Grid, + Pagination, + Tree, + CellSelection + ]) + var grid_einreichungen = (window.grid_einreichungen = + new CellSelectionGridEditor({ + collection: new Memory(), + columns: columns_einreichungen_administrator.load(), + idProperty: 'id', + pagingLinks: true, + pagingTextBox: false, + firstLastArrows: true, + maxRowsPerPage: 25, + rowsPerPage: 100, + pageSkip: 25, + sort: 'sorting' + })) + tab_einreichung.addChild( + new ContentPane({ + id: 'cp_einreichungen', + region: 'center', + style: 'padding:0; border: 0;', + content: grid_einreichungen + }) + ) + grid_einreichungen.on('.dgrid-content .dgrid-cell:click', function (evt) { + var cell = grid_einreichungen.cell(evt) + var item = grid_einreichungen.row(evt) + var column = grid_einreichungen.column(evt) + var field = column.field + + switch (field) { + case 'delete': + if (item.status == 0 && confirm('Einreichung löschen?')) { + zuladungsliste_xhr.call_function( + loadEinreichungen, + 'liste_controller', + 'disable_einreichung', + '&uid=' + cell.row.id + ) + } + break + case 'aufgenommen': + zuladungsliste_xhr.call_function( + loadEinreichungen, + 'liste_controller', + 'update_einreichung', + '&field=' + field + '&uid=' + cell.row.id + ) + break + case 'abgelehnt': + zuladungsliste_xhr.call_function( + loadEinreichungen, + 'liste_controller', + 'update_einreichung', + '&field=' + field + '&uid=' + cell.row.id + ) + break + case 'dokument_orig_name': + // direkter zugriff auf "/uploads/tx_zuladungsliste/" mit htaccess file unterbunden + // öffnen nur mit gültigem login + // var url = "public/uploads/tx_zuladungsliste/" + cell.row.data.user_uid + "/" + cell.row.data.dokument_orig_name; + // window.open(url, "_blank"); + // return; + zuladungsliste_xhr.call_download( + 'download_controller', + 'download_einreichung', + '&userid=' + + cell.row.data.user_uid + + '&pdf=' + + encodeURIComponent(cell.row.data.dokument_orig_name) + ) + break + default: + } + }) + tab_container.addChild(tab_einreichung) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/punkte_freischalten.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/punkte_freischalten.js new file mode 100644 index 0000000..cf703f7 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/punkte_freischalten.js @@ -0,0 +1,280 @@ +define([ + 'dojo/_base/array', + 'dojo/_base/declare', + 'dijit/layout/ContentPane', + 'dijit/layout/BorderContainer', + 'dstore/Memory', + 'dstore/Trackable', + 'dgrid/Grid', + 'dgrid/CellSelection', + 'dgrid/extensions/Pagination', + 'dijit/MenuBar', + 'dijit/form/TextBox', + 'zuladungsliste/menus/menuitems_freischalten', + 'zuladungsliste/columns/columns_freischaltungen_administrator', + 'zuladungsliste/zuladungsliste_xhr', + 'dojo/domReady!' +], function ( + arrayUtil, + declare, + ContentPane, + BorderContainer, + Memory, + Trackable, + Grid, + CellSelection, + Pagination, + MenuBar, + TextBox, + menuitems_freischalten, + columns_freischaltungen_administrator, + zuladungsliste_xhr +) { + return { + init: function (tab_container) { + LOCALSCOPE.filter_frei = [] + /******************************************************* + * Layout + *******************************************************/ + + window.remove = function (id) { + switch (id) { + case 1: + delete LOCALSCOPE.filter_frei.bundeslandid + break + case 2: + delete LOCALSCOPE.filter_frei.jahr + break + case 3: + delete LOCALSCOPE.filter_frei.status + break + case 4: + dijit.byId('searchbox_frei').reset() + break + } + filterFreischalten() + } + + window.filterFreischalten = function () { + var str = '' + if (LOCALSCOPE.filter_frei.bundeslandid != undefined) { + str += '    ' + str += + ' ' + LOCALSCOPE.bundeslaender[LOCALSCOPE.filter_frei.bundeslandid] + str += + ' ' + } + if (LOCALSCOPE.filter_frei.jahr != undefined) { + str += '    ' + str += ' ' + LOCALSCOPE.filter_frei.jahr + str += + ' ' + } + if (LOCALSCOPE.filter_frei.status != undefined) { + switch (LOCALSCOPE.filter_frei.status) { + case 1: + str += + '    Anstehend' + break + case 2: + str += + '    Freigegeben' + break + case 3: + str += + '    Abgelehnt' + break + } + str += + ' ' + } + + LOCALSCOPE.filter_f = [] + var string = dijit.byId('searchbox_frei').get('value') + if (string != '') { + str += '    ' + str += + string + + ' ' + string = string.toLowerCase() + LOCALSCOPE.filter_f = store_freischalten.filter(function (object) { + wettbewerb = object.wettbewerb.toLowerCase() + company = object.company.toLowerCase() + if (~wettbewerb.indexOf(string) || ~company.indexOf(string)) { + return true + } + return false + }) + LOCALSCOPE.filter_f = LOCALSCOPE.filter_f + .filter(LOCALSCOPE.filter_frei) + .sort('wettbewerb') + } else { + LOCALSCOPE.filter_f = store_freischalten + .filter(LOCALSCOPE.filter_frei) + .sort('wettbewerb') + } + + LOCALSCOPE.print_frei = str + + grid_freischalten.set('collection', LOCALSCOPE.filter_f) + grid_freischalten.startup() + grid_freischalten.refresh() + + if (str) { + dijit.byId('cp_freischalten_filter').set('content', str) + } else { + dijit.byId('cp_freischalten_filter').set('content', '') + } + } + + window.loadPunkteFreischalten = function (key, value) { + var callback = function (response) { + var store_freischalten = (window.store_freischalten = new (declare([ + Memory, + Trackable + ]))({ + data: response, + idProperty: 'id' + })) + filterFreischalten() + } + + var parameters = '' + if (key && value) parameters = '&key=' + key + '&value=' + value + + zuladungsliste_xhr.call_function( + callback, + 'liste_controller', + 'load_freischaltungen', + parameters + ) + } + + var tab_freischalten = new BorderContainer({ + design: 'headline', + title: ' Punkte Freischalten', + onShow: function () { + loadPunkteFreischalten() + dijit.byId('searchbox_frei').reset() + } + }) + + /******************************************************* + * info header + *******************************************************/ + var cp_freischaltung_header = new ContentPane({ + id: 'cp_freischaltung_header', + region: 'top', + className: 'tab-header center', + content: 'Punkte Freischalten' + }) + tab_freischalten.addChild(cp_freischaltung_header) + + /******************************************************* + * MENU + *******************************************************/ + var menu_freischalten = new MenuBar({ + id: 'menu_freischalten', + className: 'center', + region: 'top', + splitter: false + }) + menu_freischalten.addChild( + new TextBox({ + name: 'searchbox_frei', + id: 'searchbox_frei', + disabled: false, + trim: true, + placeHolder: ' Filter...', + _setSelected: function () {}, + onKeyUp: function () { + filterFreischalten() + } + }) + ) + menu_freischalten.addChild( + new dijit.MenuBarItem({ + label: '', + onClick: function () { + dijit.byId('searchbox_frei').reset() + filterFreischalten() + } + }) + ) + menuitems_freischalten.load_items(menu_freischalten) + tab_freischalten.addChild(menu_freischalten) + + /******************************************************* + * filter header + *******************************************************/ + var cp_freischalten_filter = new ContentPane({ + id: 'cp_freischalten_filter', + style: 'padding:0;', + region: 'top', + className: 'filter-header center' + }) + tab_freischalten.addChild(cp_freischalten_filter) + + /******************************************************* + * GRID + *******************************************************/ + var CellSelectionGrid = declare([Grid, Pagination, CellSelection]) + var grid_freischalten = (window.grid_freischalten = new CellSelectionGrid( + { + idProperty: 'id', + pagingLinks: true, + pagingTextBox: false, + firstLastArrows: true, + rowsPerPage: 25, + sort: 'name', + columns: columns_freischaltungen_administrator.load() + // columnSets: columns_freischaltungen_administrator.load() + } + )) + tab_freischalten.addChild( + new ContentPane({ + id: 'cp_freischalten_liste', + style: 'padding:0; border:0', + region: 'center', + content: grid_freischalten + }) + ) + grid_freischalten.on('dgrid-select', function (evt) { + var conf + var what = false + arrayUtil.map(evt.cells, function (cell) { + var field = cell.column.field + var item = cell.row.data + switch (field) { + case 'search': + dijit.byId('searchbox_frei').set('value', item.company) + filterFreischalten() + break + case 'tstamp_aktivierung': + if (confirm('Punkte aktivieren?')) { + zuladungsliste_xhr.call_function( + loadPunkteFreischalten, + 'liste_controller', + 'freischaltung_aktivieren', + '&uid_wettarch=' + item.uid_wettarch + ) + } + break + case 'tstamp_ablehnen': + if (confirm('Punkteaktivierung ablehnen?')) { + zuladungsliste_xhr.call_function( + loadPunkteFreischalten, + 'liste_controller', + 'freischaltung_ablehnen', + '&uid_wettarch=' + item.uid_wettarch + ) + } + break + } + }) + }) + + tab_container.addChild(tab_freischalten) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/zuteilungen.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/zuteilungen.js new file mode 100644 index 0000000..e0fb88d --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/administrator/zuteilungen.js @@ -0,0 +1,462 @@ +define([ + 'dojo/_base/array', + 'dojo/_base/declare', + 'dijit/layout/ContentPane', + 'dijit/layout/BorderContainer', + 'dijit/layout/TabContainer', + 'dstore/Memory', + 'dgrid/OnDemandGrid', + 'dgrid/Selection', + 'dijit/Menu', + 'dijit/MenuItem', + 'dijit/MenuBar', + 'dijit/MenuBarItem', + 'dijit/MenuSeparator', + 'dijit/PopupMenuBarItem', + 'dijit/DropDownMenu', + 'dijit/ToolbarSeparator', + 'dijit/form/TextBox', + 'zuladungsliste/columns/columns_zuteilungen_administrator', + 'zuladungsliste/zuladungsliste_xhr', + 'zuladungsliste/zuladungsliste_functions', + 'dojo/domReady!' +], function ( + arrayUtil, + declare, + ContentPane, + BorderContainer, + TabContainer, + Memory, + OnDemandGrid, + Selection, + Menu, + MenuItem, + MenuBar, + MenuBarItem, + MenuSeparator, + PopupMenuBarItem, + DropDownMenu, + ToolbarSeparator, + TextBox, + columns_zuteilungen_administrator, + zuladungsliste_xhr, + zuladungsliste_functions +) { + return { + init: function (tab_container) { + LOCALSCOPE.filter_next = 0 + + var SelectionGrid = declare([OnDemandGrid, Selection]) + /******************************************************* + * Layout + *******************************************************/ + + var bc_zuteilung = new BorderContainer({ + design: 'headline', + title: ' Zuteilungen', + id: 'zuteilungen', + onShow: function () {} + }) + tab_container.addChild(bc_zuteilung) + + /******************************************************* + * info header + *******************************************************/ + var cp_zuteilung_header = new ContentPane({ + id: 'cp_zuteilung_header', + region: 'top', + className: 'tab-header center', + content: 'Zuteilungen' + }) + bc_zuteilung.addChild(cp_zuteilung_header) + + /******************************************************* + * Tab Container + *******************************************************/ + var tab_zuteilung = new TabContainer({ + region: 'center', + id: 'tab_zuteilung' + }) + bc_zuteilung.addChild(tab_zuteilung) + + var bc_bestehende = new BorderContainer({ + title: ' Erstellte Zuteilungen', + id: 'bc_bestehende', + design: 'headline', + onShow: function () { + ladeErteilteZuladungen() + } + }) + tab_zuteilung.addChild(bc_bestehende) + + /******************************************************* + * MENU + *******************************************************/ + var menu_zuteilungen = new MenuBar({ + id: 'menu_zuteilungen', + className: 'center', + region: 'top', + splitter: false + }) + menu_zuteilungen.addChild( + new TextBox({ + name: 'searchbox_zutl', + id: 'searchbox_zutl', + disabled: false, + trim: true, + placeHolder: ' Filter...', + _setSelected: function () {}, + onKeyUp: function () { + filterErteilteZuladungen() + } + }) + ) + menu_zuteilungen.addChild( + new dijit.MenuBarItem({ + label: '', + onClick: function () { + dijit.byId('searchbox_zutl').reset() + filterErteilteZuladungen() + } + }) + ) + menu_zuteilungen.addChild(new ToolbarSeparator()) + + menu_zuteilungen.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Drucken', + onClick: function () { + zuladungsliste_xhr.call_print( + 'zuteilungen_controller', + 'zuteilung_laden', + '&print=1&zuladungid=' + LOCALSCOPE.zuladungid + ) + } + }) + ) + bc_bestehende.addChild(menu_zuteilungen) + + var cp_zuteilungen_bestehende = new ContentPane({ + id: 'cp_zuteilungen_bestehende', + style: 'width:35%', + region: 'left' + }) + bc_bestehende.addChild(cp_zuteilungen_bestehende) + + var cp_zuteilungen_bestehende_print = new ContentPane({ + id: 'cp_zuteilungen_bestehende_print', + style: 'padding: 10px', + region: 'center' + }) + bc_bestehende.addChild(cp_zuteilungen_bestehende_print) + + var grid_zuteilungen_bestehende = (window.grid_zuteilungen_bestehende = + new SelectionGrid({ + columns: columns_zuteilungen_administrator.bestehende(), + idProperty: 'uid' + })) + cp_zuteilungen_bestehende.addChild(grid_zuteilungen_bestehende) + grid_zuteilungen_bestehende.on('dgrid-select', function (e) { + var row = e.rows[0], + item = row.data + LOCALSCOPE.zuladungid = item.uid + + var callback = function (response) { + dijit.byId('cp_zuteilungen_bestehende_print').set('content', response) + } + zuladungsliste_xhr.call_function_text( + callback, + 'zuteilungen_controller', + 'zuteilung_laden', + '&zuladungid=' + LOCALSCOPE.zuladungid + ) + }) + var bc_neue = new BorderContainer({ + title: ' Neue Zuteilungen', + id: 'bc_neue', + design: 'sidebar', + onShow: function () { + ladeZuladungen() + ladeZuladungenWettbewerbe() + LOCALSCOPE.zuladungid = 0 + grid_naechsten_menu.refresh() + dijit + .byId('wettbewerbe_zuteilen') + .set( + 'label', + 'Wettbewerb Zuteilen ' + ) + } + }) + tab_zuteilung.addChild(bc_neue) + + bc_neue.addChild( + new ContentPane({ + id: 'cp_naechsten_menu', + region: 'left' + }) + ) + bc_neue.addChild( + new ContentPane({ + className: 'text-subheader center', + region: 'top', + id: 'nomtop', + content: 'Nominierungen' + }) + ) + var menu_zuteilen = new MenuBar({ + id: 'menu_zuteilen', + className: 'center', + region: 'top', + splitter: false + }) + bc_neue.addChild(menu_zuteilen) + menu_zuteilen.addChild( + new MenuBarItem({ + label: 'Neu Laden', + onClick: function () { + ladeZuladungen() + } + }) + ) + menu_zuteilen.addChild(new ToolbarSeparator()) + menu_zuteilen.addChild( + new PopupMenuBarItem({ + id: 'wettbewerbe_zuteilen', + region: 'center', + label: 'Wettbewerb Zuteilen ', + popup: new DropDownMenu() + }) + ) + + bc_neue.addChild( + new ContentPane({ + id: 'cp_naechsten', + region: 'top' + }) + ) + bc_neue.addChild( + new ContentPane({ + className: 'text-subheader center', + region: 'top', + id: 'nomtoper', + content: 'Ersatz - Nominierungen' + }) + ) + bc_neue.addChild( + new ContentPane({ + id: 'cp_naechsten_ersatz', + region: 'center' + }) + ) + + var grid_naechsten_menu = (window.grid_naechsten_menu = new SelectionGrid( + { + collection: new Memory({ + data: LOCALSCOPE.next + }), + columns: [ + { + label: 'Nächsten', + field: 'label', + className: 'no-border-l', + sortable: false, + renderCell: function (object, data) { + return zuladungsliste_functions.renderIconText( + 'fa fa-list-ol', + data + ) + } + } + ] + }, + 'cp_naechsten_menu' + )) + + function filterNaechsten () { + var filter_f = [] + var c = [] + c['n' + LOCALSCOPE.filter_next] = 1 + filter_f = store_zuladungen.filter(c).sort('pos') + grid_naechsten_data.set('collection', filter_f) + grid_naechsten_data.startup() + grid_naechsten_data.resize() + c = [] + c['e' + LOCALSCOPE.filter_next] = 1 + filter_f = store_zuladungen.filter(c).sort('pos') + grid_naechsten_ersatz_data.set('collection', filter_f) + grid_naechsten_ersatz_data.startup() + grid_naechsten_ersatz_data.resize() + } + + grid_naechsten_menu.on('dgrid-select', function (e) { + var row = e.rows[0], + item = row.data + LOCALSCOPE.filter_next = item.id + dijit.byId('nomtop').set('content', 'Nominierung: ' + item.label) + dijit + .byId('nomtoper') + .set('content', 'Ersatz - Nominierung: ' + item.label) + filterNaechsten() + }) + + var grid_naechsten_data = (window.grid_naechsten_data = new SelectionGrid( + { + columns: columns_zuteilungen_administrator.naechsten_columns() + }, + 'cp_naechsten' + )) + var grid_naechsten_ersatz_data = (window.grid_naechsten_ersatz_data = + new SelectionGrid( + { + columns: columns_zuteilungen_administrator.naechsten_columns2() + }, + 'cp_naechsten_ersatz' + )) + + function filterErteilteZuladungen () { + var filter_f + var str = dijit.byId('searchbox_zutl').get('value') + if (str != '') { + str = str.toLowerCase() + filter_f = store_zuteilungen + .filter(function (object) { + wettbewerb = object.wettbewerb.toLowerCase() + if (~wettbewerb.indexOf(str)) { + return true + } + return false + }) + .sort([ + { + property: 'tstamp', + descending: true + } + ]) + } else { + filter_f = store_zuteilungen.sort([ + { + property: 'tstamp', + descending: true + } + ]) + } + grid_zuteilungen_bestehende.set('collection', filter_f) + grid_zuteilungen_bestehende.startup() + grid_zuteilungen_bestehende.resize() + } + + function ladeErteilteZuladungen () { + var callback = function (response) { + var Store = declare([Memory]) + var store_zuteilungen = (window.store_zuteilungen = new Store({ + data: response, + idProperty: 'uid' + })) + filterErteilteZuladungen() + } + zuladungsliste_xhr.call_function( + callback, + 'zuteilungen_controller', + 'zuteilungen_erteilt' + ) + } + + function ladeZuladungen () { + var callback = function (response) { + var store_zuladungen = (window.store_zuladungen = new (declare([ + Memory + ]))({ + data: response, + idProperty: 'id' + })) + filterNaechsten() + } + zuladungsliste_xhr.call_function( + callback, + 'zuteilungen_controller', + 'lade_zuteilungen' + ) + } + + function wettbewerbeZuteilen (item) { + if (LOCALSCOPE.filter_next == 0) { + zuladungsliste_functions.showAlertDialog( + 'Bitte die nächsten Architekten auswählen.' + ) + return + } + + dijit + .byId('wettbewerbe_zuteilen') + .set( + 'label', + '' + ) + + var callback = function (response) { + dijit + .byId('wettbewerbe_zuteilen') + .set( + 'label', + 'Wettbewerb Zuteilen ' + ) + var tabContainer = dijit.byId('tab_zuteilung') + tabContainer.selectChild(dijit.byId('bc_bestehende')) + var tab_callback = function (response) { + dijit + .byId('cp_zuteilungen_bestehende_print') + .set('content', response) + } + zuladungsliste_xhr.call_function_text( + tab_callback, + 'zuteilungen_controller', + 'zuteilung_laden', + '&zuladungid=' + response + ) + } + zuladungsliste_xhr.call_function( + callback, + 'zuteilungen_controller', + 'neu_zuteilen', + '&kammernid=' + + LOCALSCOPE.kammernid + + '&wettbewerb_uid=' + + item.uid + + '&next=' + + LOCALSCOPE.filter_next + ) + } + + function ladeZuladungenWettbewerbe () { + var callback = function (response) { + var pSubMenu = new Menu({ + region: 'center' + }) + arrayUtil.forEach(response, function (item, i) { + pSubMenu.addChild( + new MenuItem({ + label: + item.sperre_deaktiviert == 1 + ? item.wettbewerb + + ' (Sperre deaktiviert)' + : item.wettbewerb, + onClick: function () { + wettbewerbeZuteilen(item) + } + }) + ) + if (i < response.length - 1) pSubMenu.addChild(new MenuSeparator()) + }) + dijit.byId('wettbewerbe_zuteilen').set('popup', pSubMenu) + } + zuladungsliste_xhr.call_function( + callback, + 'zuteilungen_controller', + 'zuteilungen_wettbewerbe' + ) + } + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/einreichung.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/einreichung.js new file mode 100644 index 0000000..0596033 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/einreichung.js @@ -0,0 +1,371 @@ +define([ + 'dojo/_base/array', + 'dojo/_base/declare', + 'dojo/dom', + 'dojo/query', + 'dijit/layout/ContentPane', + 'dijit/layout/BorderContainer', + 'dijit/layout/TabContainer', + 'dijit/form/Button', + 'dijit/Dialog', + 'dojox/form/Uploader', + 'dojo/io/iframe', + 'dstore/Memory', + 'dgrid/Grid', + 'dgrid/CellSelection', + 'dgrid/extensions/Pagination', + 'zuladungsliste/columns/columns_eigereichte_architekt', + 'zuladungsliste/zuladungsliste_xhr', + 'zuladungsliste/zuladungsliste_functions', + 'dojo/domReady!' +], function ( + arrayUtil, + declare, + dom, + query, + ContentPane, + BorderContainer, + TabContainer, + Button, + Dialog, + Uploader, + iframe, + Memory, + Grid, + CellSelection, + Pagination, + columns_eigereichte_architekt, + zuladungsliste_xhr, + zuladungsliste_functions +) { + return { + init: function (tab_container_achitekten) { + /******************************************************* + * Layout + *******************************************************/ + + var tab_einreichung = new BorderContainer({ + design: 'headline', + id: 'tab_einreichung', + title: ' Eingereichte Projekte' + }) + + var cp_einreichung_header = new ContentPane({ + id: 'cp_einreichung_header', + region: 'top', + className: 'tab-header center', + content: 'Eingereichte Projekte' + }) + tab_einreichung.addChild(cp_einreichung_header) + + /******************************************************* + * einreichen + *******************************************************/ + + window.setEinreichung = function () { + var FormEinreichen = '' + FormEinreichen += '
Neues Projekt einreichen
' + FormEinreichen += + '
' + FormEinreichen += + '' + FormEinreichen += '' + FormEinreichen += + '' + FormEinreichen += + '' + FormEinreichen += + '' + FormEinreichen += + '' + var options = + '' + FormEinreichen += + '' + FormEinreichen += + '' + FormEinreichen += + '' + FormEinreichen += + '' + FormEinreichen += '
' + dijit.byId('einreichen').set('content', FormEinreichen) + var einreichen_content = 0 + var EinreichenUploader = new Uploader( + { + label: 'Dokument auswählen (pdf)', + multiple: false, + url: '../index.php?zlcontroller=upload_controller&xaction=dokument_einreichen', + uploadOnChange: false, + showInput: true, + isDebug: true, + method: 'POST', + content: einreichen_content + }, + 'protokoll' + ) + var resetButtonEin = new Button( + { + label: ' Zurücksetzen', + className: 'button-submit', + onClick: function () { + sendform.reset() + EinreichenUploader.reset() + dom.byId('infobox').innerHTML = 'Neues Projekt einreichen' + query('.dojoxUploaderFileListProgress').style({ + display: 'none' + }) + } + }, + 'reset_button' + ) + var uploadButtonEin = new Button( + { + label: + ' Projekt einreichen', + id: 'uploadButtonEin', + className: 'button-submit', + onClick: function () { + var f = query('td.dojoxUploaderIcon', 'einreichen_filelist') + sendform.validate() + arrayUtil.forEach(f, function (item) { + if (item.innerHTML == 'PDF' || item.innerHTML == 'pdf') { + if (sendform.validate()) { + dom.byId('infobox').innerHTML = + '' + EinreichenUploader.submit(dom.byId('sendform')) + } + } else { + zuladungsliste_functions.showAlertDialog( + 'Bitte das Protokoll im PDF Format einreichen.' + ) + return + } + }) + } + }, + 'upload_button' + ) + dojo.connect(EinreichenUploader, 'onComplete', function (dataArray) { + dom.byId('infobox').innerHTML = + 'Projekt erfolgreich eingereicht' + sendform.reset() + EinreichenUploader.reset() + setTimeout(function () { + dom.byId('infobox').innerHTML = 'Neues Projekt einreichen' + }, 3e3) + }) + } + + window.resendPdfAgain = function (uid) { + /******************************************************* + * Aktualisieren + *******************************************************/ + + var FormAktualisieren = '' + FormAktualisieren += + '
Einreichung aktualisieren
' + FormAktualisieren += + '
' + FormAktualisieren += '' + FormAktualisieren += + '' + FormAktualisieren += + '' + FormAktualisieren += + '' + FormAktualisieren += '
' + + var aktualisieren_dialog = new Dialog({ + title: + ' Dokument auf den Server laden', + style: 'width: 600px; padding:20px auto;', + id: 'aktualisieren_dialog', + region: 'center', + content: FormAktualisieren, + onHide: function () { + dijit.byId('aktualisieren_dialog').destroyRecursive() + } + }) + + setTimeout(function () { + var aktual_content = 0 + var AktualisiererUpload = new Uploader( + { + label: 'Dokument auswählen (pdf)', + multiple: false, + url: + 'index.php?zlcontroller=upload_controller&xaction=dokument_aktualisieren&uid=' + + uid, + uploadOnChange: false, + showInput: true, + isDebug: true, + method: 'POST', + content: aktual_content + }, + 'protokoll2' + ) + var resetButtonAkt = new Button( + { + label: ' Zurücksetzen', + className: 'button-submit', + onClick: function () { + sendform2.reset() + AktualisiererUpload.reset() + dom.byId('infobox2').innerHTML = 'Einreichung aktualisieren' + query('.dojoxUploaderFileListProgress').style({ + display: 'none' + }) + } + }, + 'reset_button2' + ) + var uploadButtonAkt = new Button( + { + label: ' Hochladen', + id: 'uploadButtonAkt', + className: 'button-submit', + onClick: function () { + var f = query('td.dojoxUploaderIcon', 'aktualisieren_filelist') + sendform2.validate() + arrayUtil.forEach(f, function (item) { + if (item.innerHTML == 'PDF' || item.innerHTML == 'pdf') { + if (sendform2.validate()) { + dom.byId('infobox2').innerHTML = + '' + AktualisiererUpload.submit(dom.byId('sendform2')) + } + } else { + zuladungsliste_functions.showAlertDialog( + 'Bitte das Protokoll im PDF Format einreichen.' + ) + return + } + }) + } + }, + 'upload_button2' + ) + dijit.byId('aktualisieren_dialog').show() + dojo.connect(AktualisiererUpload, 'onComplete', function (dataArray) { + loadEinreichungen() + dijit.byId('aktualisieren_dialog').hide() + }) + }, 100) + } + + /******************************************************* + * eingereichte + *******************************************************/ + var CellSelectionGrid = declare([Grid, Pagination, CellSelection]) + var grid_einreichte_projekte = (window.grid_einreichte_projekte = + new CellSelectionGrid({ + collection: new Memory(), + columns: columns_eigereichte_architekt.projekte(), + idProperty: 'uid', + pagingLinks: true, + pagingTextBox: false, + firstLastArrows: true, + rowsPerPage: 100, + sort: 'sorting' + })) + grid_einreichte_projekte.on( + '.dgrid-content .dgrid-cell:click', + function (evt) { + var cell = grid_einreichte_projekte.cell(evt) + var item = grid_einreichte_projekte.row(evt) + var column = grid_einreichte_projekte.column(evt) + var field = column.field + + switch (field) { + case 'hochladen': + resendPdfAgain(item.id) + break + case 'delete': + if (item.status == 0 && confirm('Einreichung löschen?')) { + zuladungsliste_xhr.call_function( + loadEinreichungen, + 'einreichen_controller', + 'delete_einreichung', + '&uid=' + item.id + ) + } + break + case 'dokument_orig_name': + // direkter zugriff auf "/uploads/tx_zuladungsliste/" mit htaccess file unterbunden + // öffnen nur mit gültigem login + // var url = "../uploads/tx_zuladungsliste/" + LOCALSCOPE.userid + "/" + item.data.dokument_orig_name; + // window.open(url, "_blank"); + // return; + zuladungsliste_xhr.call_download( + 'download_controller', + 'download_einreichung', + '&userid=' + + LOCALSCOPE.userid + + '&pdf=' + + encodeURIComponent(cell.row.data.dokument_orig_name) + ) + break + default: + } + } + ) + /******************************************************* + * layout + *******************************************************/ + function loadEinreichungen() { + var callback = function (response) { + var store_einreichte_projekte = (window.store_einreichte_projekte = + new Memory({ + data: response, + idProperty: 'uid' + })) + grid_einreichte_projekte.set('collection', store_einreichte_projekte) + grid_einreichte_projekte.startup() + grid_einreichte_projekte.refresh() + } + + zuladungsliste_xhr.call_function( + callback, + 'einreichen_controller', + 'lade_einreichungen' + ) + } + + var einreichenTabs_einzelansicht = new TabContainer({ + title: 'Eingereichte Projekte', + id: 'einreichenTabs_einzelansicht', + tabPosition: 'top', + region: 'center', + class: 'centerPanel' + }) + einreichenTabs_einzelansicht.addChild( + new ContentPane({ + title: 'Projekt einreichen', + id: 'einreichen' + }) + ) + einreichenTabs_einzelansicht.addChild( + new ContentPane({ + title: 'Eingereichte Projekte', + id: 'tab_einreichte_projekte', + content: grid_einreichte_projekte, + onShow: function () { + loadEinreichungen() + } + }) + ) + tab_einreichung.addChild(einreichenTabs_einzelansicht) + + tab_container_achitekten.addChild(tab_einreichung) + + /******************************************************* + * start up + *******************************************************/ + + setEinreichung() + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/konto.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/konto.js new file mode 100644 index 0000000..600d3f5 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/konto.js @@ -0,0 +1,166 @@ +define([ + 'dojo/_base/declare', + 'dijit/MenuBar', + 'dijit/MenuBarItem', + 'dijit/ToolbarSeparator', + 'dijit/layout/ContentPane', + 'dijit/layout/BorderContainer', + 'dstore/Memory', + 'dgrid/OnDemandGrid', + 'dgrid/Editor', + 'zuladungsliste/columns/columns_konto_architekt', + 'zuladungsliste/zuladungsliste_xhr', + 'zuladungsliste/zuladungsliste_functions', + 'dojo/domReady!' +], function ( + declare, + MenuBar, + MenuBarItem, + ToolbarSeparator, + ContentPane, + BorderContainer, + Memory, + OnDemandGrid, + Editor, + columns_konto_architekt, + zuladungsliste_xhr, + zuladungsliste_functions +) { + return { + init: function (tab_container_achitekten) { + /******************************************************* + * funtion + *******************************************************/ + function loadKonto () { + var callback = function (response) { + var store_konto = (window.store_konto = new Memory({ + data: response + })) + grid_konto.set('collection', store_konto) + grid_konto.startup() + grid_konto.refresh() + + dijit.byId('sichern').set('disabled', true) + dijit.byId('sichern').set('label', 'Änderungen Sichern') + } + + zuladungsliste_xhr.call_function( + callback, + 'user_controller', + 'lade_konto' + ) + } + + function sichernKonto () { + dijit + .byId('sichern') + .set('label', '') + var callback = function (response) { + setTimeout(function () { + dijit.byId('sichern').set('disabled', true) + dijit.byId('sichern').set('label', 'Änderungen Sichern') + }, 1000) + } + zuladungsliste_xhr.post_function( + callback, + 'user_controller', + 'sichern_konto', + store_konto.data + ) + } + + /******************************************************* + * Layout + *******************************************************/ + var tab_konto = new BorderContainer({ + design: 'headline', + id: 'tab_konto', + title: ' Ihr Benutzerkonto', + onShow: function () { + loadKonto() + } + }) + var cp_konto_header = new ContentPane({ + id: 'cp_konto_header', + region: 'top', + className: 'tab-header center', + content: 'Ihr Benutzerkonto' + }) + tab_konto.addChild(cp_konto_header) + + /******************************************************* + * Punkte Menu + *******************************************************/ + var menu_konto = new MenuBar({ + id: 'menu_konto', + class: 'center', + region: 'top', + splitter: false + }) + menu_konto.addChild( + new MenuBarItem({ + label: 'Neu laden', + onClick: function () { + loadKonto() + } + }) + ) + menu_konto.addChild(new ToolbarSeparator()) + menu_konto.addChild( + new MenuBarItem({ + label: 'Änderungen Sichern', + id: 'sichern', + disabled: true, + onClick: function () { + sichernKonto() + } + }) + ) + tab_konto.addChild(menu_konto) + + /******************************************************* + * änderungen + *******************************************************/ + tab_konto.addChild( + new ContentPane({ + region: 'bottom', + className: 'center', + style: 'padding: 50px; border: 0', + content: + 'Für Änderungen der E-Mail Adesse, des Büronamens oder dem Tag der Vereidigung
wenden Sie sich bitte an den/die Administrator/in der Zuladungsliste.
zuladungsliste@ztkammer.at' + }) + ) + + /******************************************************* + * gird + *******************************************************/ + + var cp_konto = new ContentPane({ + region: 'center', + style: 'padding: 0; border: 0;', + id: 'cp_konto' + }) + tab_konto.addChild(cp_konto) + + var CellSelectionGrid = declare([OnDemandGrid, Editor]) + + var grid_konto = (window.grid_konto = new CellSelectionGrid({ + collection: new Memory(), + columns: columns_konto_architekt.laden(), + style: 'border:0;', + showHeader: false, + idProperty: 'id' + })) + dijit.byId('cp_konto').set('content', grid_konto) + + grid_konto.on('dgrid-datachange', function (evt) { + dijit.byId('sichern').set('disabled', false) + dijit + .byId('sichern') + .set('label', '
Änderungen Sichern
') + }) + + tab_container_achitekten.addChild(tab_konto) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/position.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/position.js new file mode 100644 index 0000000..c6693da --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/position.js @@ -0,0 +1,270 @@ +define([ + 'dojo/_base/declare', + 'dojo/dom', + 'dijit/layout/ContentPane', + 'dijit/layout/BorderContainer', + 'dstore/Memory', + 'dstore/Trackable', + 'dstore/Tree', + 'dgrid/OnDemandGrid', + 'dgrid/Selection', + 'dgrid/Tree', + 'zuladungsliste/zuladungsliste_xhr', + 'zuladungsliste/zuladungsliste_functions', + 'dojo/domReady!' +], function ( + declare, + dom, + ContentPane, + BorderContainer, + Memory, + Trackable, + TreeStoreMixin, + OnDemandGrid, + Selection, + Tree, + zuladungsliste_xhr, + zuladungsliste_functions +) { + return { + init: function (tab_container_achitekten) { + /******************************************************* + * Functions + *******************************************************/ + var currentYear = (window.currentYear = new Date().getFullYear()) + + var StandardGrid = declare([OnDemandGrid, Selection]) + var grid_position = (window.grid_position = new StandardGrid({ + collection: new Memory(), + columns: [ + { + label: 'Projekte', + field: 'company', + className: 'no-border-l', + unhidable: true, + sortable: true, + renderCell: zuladungsliste_functions.renderCompany + }, + { + label: 'Gültig', + className: 'cell-140 center', + field: 'rang', + sortable: true + }, + { + label: 'Punkte', + field: 'punkte', + className: 'cell-100 center', + sortable: false, + renderCell: zuladungsliste_functions.formatPunkte + }, + { + label: ' ', + field: 'info', + className: 'cell-50 center', + renderCell: zuladungsliste_functions.renderInfoIcon, + hidden: false + } + ], + idProperty: 'id', + sort: 'id', + renderRow: function (object, i) { + var rowElement = this.inherited(arguments) + if (object.type == 'frauenfoerderpunkt') { + if (object.id % 2 == 0) + rowElement.className += 'childelement_frauen_even' + else rowElement.className += 'childelement_frauen_odd' + } else if (object.type == 'neueinsteiger') { + if (object.id % 2 == 0) + rowElement.className += 'childelement_neu_even' + else rowElement.className += 'childelement_neu_odd' + } else if (object.type == 'sondersperrung') { + if (object.id % 2 == 0) + rowElement.className += 'childelement_sperre_even' + else rowElement.className += 'childelement_sperre_odd' + } else if (object.hasChildren == 0 && object.punkte_aktive == 1) { + if (object.id % 2 == 0) + rowElement.className += 'childelement_act_even' + else rowElement.className += 'childelement_act_odd' + } else if (object.hasChildren == 0) { + if (object.id % 2 == 0) rowElement.className += 'childelement_even' + else rowElement.className += 'childelement_odd' + } + if (object.kontoaufloesung == 1) { + if (object.id % 2 == 0) rowElement.className += 'aufgeloest_even' + else rowElement.className += 'aufgeloest_odd' + } + return rowElement + } + })) + + function openAtStart() { + var row = position_store.filter({ id: 2 }) + row.forEach(function (item) { + dom.byId('position_datum').innerHTML = 'Stand: ' + item.title + dom.byId('position_punkte').innerHTML = 'Punkte: ' + item.punkte + dom.byId('position_rang').innerHTML = 'Rang: ' + item.rang + if (item.nominiert) { + dom.byId('position_sperrung').innerHTML = '' + } + else { + dom.byId('position_sperrung').innerHTML = 'Gesperrt bis ' + item.gesperrt_bis + } + + var callback = function (response) { + var store_user_pos = new Memory({ + data: response, + idProperty: 'id' + }) + grid_position.set('collection', store_user_pos) + grid_position.startup() + grid_position.refresh() + } + + zuladungsliste_xhr.call_function( + callback, + 'zuladungsliste_controller', + 'lade_position_architekt', + '&uid=' + item.uid + ) + }) + } + + function setPositonMenu() { + var callback = function (response) { + var position_store = (window.position_store = new (declare([ + Memory, + Trackable, + TreeStoreMixin + ]))({ + data: response + })) + var columns = { + title: { + label: ' ', + sortable: false, + field: 'title', + expandOn: 'click', + renderExpando: true, + renderCell: zuladungsliste_functions.renderPositionMenu + } + } + var position_tree_grid = new (declare([ + OnDemandGrid, + Selection, + Tree + ]))( + { + collection: position_store.getRootCollection(), + columns: columns, + id: 'position_tree_grid', + showHeader: 0, + shouldExpand: function (row, level, previouslyExpanded) { + if (row.data.type == 'year' && row.data.title == currentYear) { + return true + } + } + }, + 'positionierung_menu' + ) + + position_tree_grid.startup() + position_tree_grid.refresh() + + position_tree_grid.on('dgrid-select', function (eve) { + var row = eve.rows[0], + item = row.data + if (item.type == 'month') { + dom.byId('position_datum').innerHTML = 'Stand: ' + item.title + dom.byId('position_punkte').innerHTML = 'Punkte: ' + item.punkte + dom.byId('position_rang').innerHTML = 'Rang: ' + item.rang + if (item.nominiert) { + dom.byId('position_sperrung').innerHTML = '' + } + else { + dom.byId('position_sperrung').innerHTML = 'Gesperrt bis ' + item.gesperrt_bis + } + + var callback = function (response) { + var store_user_pos = new Memory({ + data: response, + idProperty: 'id' + }) + grid_position.set('collection', store_user_pos) + grid_position.startup() + grid_position.refresh() + } + + zuladungsliste_xhr.call_function( + callback, + 'zuladungsliste_controller', + 'lade_position_architekt', + '&uid=' + item.uid + ) + } else { + dom.byId('position_datum').innerHTML = '' + dom.byId('position_punkte').innerHTML = '' + dom.byId('position_rang').innerHTML = '' + dom.byId('position_sperrung').innerHTML = '' + grid_position.set('collection', new Memory()) + grid_position.startup() + grid_position.refresh() + } + }) + } + zuladungsliste_xhr.call_function( + callback, + 'zuladungsliste_controller', + 'lade_treemenu_position' + ) + } + + /******************************************************* + * Layout + *******************************************************/ + var tab_position = new BorderContainer({ + design: 'headline', + id: 'tab_position', + title: ' Zuladungsliste' + }) + + var cp_position_header = new ContentPane({ + id: 'cp_position_header', + region: 'top', + className: 'tab-header center', + content: 'Zuladungliste' + }) + tab_position.addChild(cp_position_header) + + tab_position.addChild( + new ContentPane({ + region: 'left', + id: 'positionierung_menu' + }) + ) + tab_position.addChild( + new ContentPane({ + region: 'top', + id: 'positionierung_top', + content: + '' + }) + ) + tab_position.addChild( + new ContentPane({ + region: 'center', + id: 'positionierung_center', + content: grid_position + }) + ) + + tab_container_achitekten.addChild(tab_position) + + setPositonMenu() + + setTimeout(function () { + openAtStart() + }, 1000) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/zuweisung.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/zuweisung.js new file mode 100644 index 0000000..7ba51d2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/architekt/zuweisung.js @@ -0,0 +1,301 @@ +define([ + "dojo/_base/declare", + "dijit/layout/ContentPane", + "dijit/layout/BorderContainer", + "dijit/MenuBar", + "dijit/MenuBarItem", + "dijit/form/TextBox", + "dstore/Memory", + "dgrid/Grid", + "dgrid/Selection", + "dgrid/extensions/Pagination", + "zuladungsliste/columns/columns_zuweisung_architekt", + "zuladungsliste/menus/menuitems_zuweisung", + "zuladungsliste/zuladungsliste_xhr", + "zuladungsliste/zuladungsliste_functions", + + "dojo/domReady!" +], function( + declare, + ContentPane, + BorderContainer, + MenuBar, + MenuBarItem, + TextBox, + Memory, + Grid, + Selection, + Pagination, + columns_zuweisung_architekt, + menuitems_zuweisung, + zuladungsliste_xhr, + zuladungsliste_functions +) { + return { + init: function(tab_container_achitekten) { + var SelectionGrid = declare([Grid, Pagination, Selection]); + + /******************************************************* + * PUNKTE ZUWEISUNG + *******************************************************/ + LOCALSCOPE.filter_zuweisung_status = 0; + LOCALSCOPE.filter_zuweisung_bundeslandid = -1; + LOCALSCOPE.filter_zuweisung_year = 0; + window.filterPunkteZuweisungen = function() { + var filter_f = []; + + var string = dijit.byId("searchbox_zuw").get("value"); + if (string != "") { + string = string.toLowerCase(); + filter_f = store_wettbewerbe.filter(function(object) { + wettbewerb = object.wettbewerb.toLowerCase(); + if (~wettbewerb.indexOf(string)) { + return true; + } + return false; + }); + } else { + filter_f = store_wettbewerbe; + } + var conditions = []; + if (LOCALSCOPE.filter_zuweisung_status) { + // 3 => not 1 or 2 + // 0 => all + if (LOCALSCOPE.filter_zuweisung_status == 3) + conditions.status = 0; + else conditions.status = LOCALSCOPE.filter_zuweisung_status; + } + + if (LOCALSCOPE.filter_zuweisung_bundeslandid > -1) { + conditions.bundeslandid = + LOCALSCOPE.filter_zuweisung_bundeslandid; + } + if (LOCALSCOPE.filter_zuweisung_year) { + conditions.jahr = LOCALSCOPE.filter_zuweisung_year; + } + + filter_f = filter_f.filter(conditions); + grid_zuweisung_wettbewerbe.set("collection", filter_f); + grid_zuweisung_wettbewerbe.startup(); + grid_zuweisung_wettbewerbe.refresh(); + }; + + function loadWettbewerbe() { + var callback = function(response) { + var store_wettbewerbe = (window.store_wettbewerbe = new Memory( + { + data: response, + idProperty: "uid" + } + )); + filterPunkteZuweisungen(); + }; + + zuladungsliste_xhr.call_function( + callback, + "punktezuweisung_controller", + "lade_punktezuweisungen" + ); + } + + function loadPreise() { + if (LOCALSCOPE.kriteriumid == 0 || LOCALSCOPE.wettbewerbid == 0) + return false; + + var callback = function(response) { + var store_preise = (window.store_preise = new Memory({ + data: response, + idProperty: "uid" + })); + grid_preise.set("collection", store_preise); + grid_preise.startup(); + grid_preise.refresh(); + }; + + zuladungsliste_xhr.call_function( + callback, + "punktezuweisung_controller", + "lade_preise", + "&kriteriumid=" + + LOCALSCOPE.kriteriumid + + "&wettbewerbid=" + + LOCALSCOPE.wettbewerbid + ); + } + var tab_zuweisung = new BorderContainer({ + design: "headline", + id: "tab_zuweisung", + title: ' Punktezuweisung', + onShow: function() { + loadWettbewerbe(); + } + }); + + var cp_zuweisung_header = new ContentPane({ + id: "cp_zuweisung_header", + region: "top", + className: "tab-header center", + content: 'Punktezuweisung' + }); + tab_zuweisung.addChild(cp_zuweisung_header); + + /******************************************************* + * PUNKTE left + *******************************************************/ + var bc_punkte = new BorderContainer({ + design: "headline", + region: "left", + id: "bc_punkte" + }); + tab_zuweisung.addChild(bc_punkte); + + /******************************************************* + * Punkte Menu + *******************************************************/ + var cp_preiszuweisung_menu = new ContentPane({ + id: "cp_preiszuweisung_menu", + style: "padding:0;border:0;", + region: "top" + }); + bc_punkte.addChild(cp_preiszuweisung_menu); + var menu_preiszuweisung = new MenuBar({ + id: "menu_preiszuweisung", + class: "center", + region: "top", + splitter: false + }); + menu_preiszuweisung.addChild( + new TextBox({ + region: "left", + type: "text", + selectOnClick: false, + trim: false, + id: "searchbox_zuw", + placeHolder: "Filter ..", + _setSelected: function() {}, + onKeyUp: function() { + filterPunkteZuweisungen(); + } + }) + ); + menu_preiszuweisung.addChild( + new MenuBarItem({ + label: '', + id: "resetbutton", + onClick: function() { + dijit.byId("searchbox_zuw").reset(); + filterPunkteZuweisungen(); + } + }) + ); + menuitems_zuweisung.load_items(menu_preiszuweisung); + cp_preiszuweisung_menu.addChild(menu_preiszuweisung); + /******************************************************* + * WETTBEWERBE grid + *******************************************************/ + var grid_zuweisung_wettbewerbe = (window.grid_zuweisung_wettbewerbe = new SelectionGrid( + { + collection: new Memory(), + columns: columns_zuweisung_architekt.wettbewerbe(), + idProperty: "uid", + collapseOnRefresh: true, + selectionMode: "single", + pagingLinks: true, + pagingTextBox: false, + firstLastArrows: true, + rowsPerPage: 25 + } + )); + grid_zuweisung_wettbewerbe.on("dgrid-select", function(evt) { + var row = evt.rows[0], + item = row.data; + + dijit + .byId("wettbewerbe_selected") + .set("content", item.wettbewerb); + + LOCALSCOPE.wettbewerbid = item.uid; + LOCALSCOPE.kriteriumid = item.kriteriumid; + + loadPreise(); + }); + + var cp_zuweisung_wettbewerbe = new ContentPane({ + id: "cp_zuweisung_wettbewerbe", + style: "padding:0;border:0;", + region: "center", + content: grid_zuweisung_wettbewerbe + }); + bc_punkte.addChild(cp_zuweisung_wettbewerbe); + /******************************************************* + * PREISE grid + *******************************************************/ + var grid_preise = (window.grid_preise = new SelectionGrid({ + collection: new Memory(), + columns: columns_zuweisung_architekt.preise(), + renderRow: function(object) { + var rowElement = this.inherited(arguments); + if (object.status == 2) { + rowElement.className += " " + " disabled"; + } else if (object.status == 1) { + rowElement.className += " " + " enabled"; + } + if (object.tstamp_aktivierung != "") + rowElement.className += " " + " enabled"; + return rowElement; + }, + idProperty: "id", + pagingLinks: true, + pagingTextBox: false, + firstLastArrows: true, + rowsPerPage: 100, + sort: "sorting" + })); + grid_preise.on("dgrid-select", function(e) { + var row = e.rows[0], + item = row.data; + if (item.status == 2) { + zuladungsliste_functions.showAlertDialog("Zugeordnete Preise werden kontrolliert und nach einer Freigabe gesperrt.
Bei Änderungswünschen wenden Sie sich bitte an den Administrator."); + return false; + } + zuladungsliste_xhr.post_function( + loadPreise, + "punktezuweisung_controller", + "setze_punktezuweisungen", + item, + "&kriteriumid=" + + LOCALSCOPE.kriteriumid + + "&wettbewerbid=" + + LOCALSCOPE.wettbewerbid + ); + + }); + /******************************************************* + * PREISE right + *******************************************************/ + var bc_preise = new BorderContainer({ + design: "headline", + region: "center", + id: "bc_preise" + }); + tab_zuweisung.addChild(bc_preise); + bc_preise.addChild( + new ContentPane({ + region: "top", + id: "wettbewerbe_selected" + }) + ); + bc_preise.addChild( + new ContentPane({ + region: "center", + id: "preise", + style: "padding:0;border:0;", + content: grid_preise + }) + ); + + tab_container_achitekten.addChild(tab_zuweisung); + + } + }; +}); diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_auswertungen.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_auswertungen.js new file mode 100644 index 0000000..95ab7ff --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_auswertungen.js @@ -0,0 +1,73 @@ +define(['zuladungsliste/zuladungsliste_functions', 'dojo/domReady!'], function ( + zuladungsliste_functions +) { + return { + load: function () { + return [ + { + label: 'Büro', + field: 'company', + renderExpando: true, + expandOn: 'click', + unhidable: true, + sortable: true, + className: 'pointer no-border-l', + renderCell: zuladungsliste_functions.renderCompany + }, + { + label: 'Id', + field: 'id', + hidden: true, + className: 'cell-110' + }, + { + label: 'Rang', + field: 'rang', + sortable: true, + className: 'cell-110 bold' + }, + { + label: 'Position', + field: 'pos', + unhidable: true, + sortable: true, + className: 'cell-110 bold', + renderCell: zuladungsliste_functions.renderPosition + }, + { + label: 'Sperrung', + field: 'gesperrt_bis_sort', + className: 'cell-110', + renderCell: zuladungsliste_functions.formatSperre, + sortable: true + }, + { + label: 'Gültig', + field: 'valid', + className: 'cell-110', + sortable: true + }, + { + label: 'Punkte', + field: 'punkte', + sortable: false, + className: 'cell-110', + renderCell: zuladungsliste_functions.formatPunkte + }, + { field: 'sortdate', hidden: true }, + { + label: ' ', + field: 'info', + className: 'cell-icon', + renderHeaderCell: function () { + return zuladungsliste_functions.renderIcon( + 'fa fa-question-circle pointer' + ) + }, + renderCell: zuladungsliste_functions.renderInfoIcon, + hidden: false + } + ] + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_eigereichte_architekt.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_eigereichte_architekt.js new file mode 100644 index 0000000..1f31267 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_eigereichte_architekt.js @@ -0,0 +1,101 @@ +define(['zuladungsliste/zuladungsliste_functions', 'dojo/domReady!'], function ( + zuladungsliste_functions +) { + return { + projekte: function () { + return [ + { + label: 'Datum', + field: 'crdate', + className: 'cell-120 no-border-l', + sortable: true, + formatter: zuladungsliste_functions.formatDate + }, + { label: 'Projekt', field: 'wettbewerb', sortable: true }, + { + label: 'Beschreibung', + field: 'beschreibung', + className: 'cell-120', + sortable: false, + renderCell: zuladungsliste_functions.renderToolTipMaxLength + }, + { + label: 'Entschieden', + field: 'entscheidungstermin', + className: 'cell-120 center', + sortable: true + }, + { + label: 'Verfahrensort', + field: 'verfahrensort', + className: 'cell-120', + sortable: true, + renderCell: zuladungsliste_functions.renderToolTipMaxLength + }, + { + label: 'Bundesland', + field: 'bundesland', + className: 'cell-140', + sortable: true + }, + { + label: 'Protokoll', + field: 'dokument_orig_name', + className: 'cell-120 pointer', + sortable: true, + renderCell: function (object, data) { + return zuladungsliste_functions.renderIconText( + 'fa fa-file-pdf fourthly', + 'Öffnen', + data + ) + } + }, + { + label: 'Aktualisieren', + className: 'cell-120 pointer', + field: 'hochladen', + sortable: true, + renderCell: function (object, data) { + return zuladungsliste_functions.renderIconText( + 'fa fa-file-upload secondary', + 'Hochladen', + 'PDF Dokument aktualisieren
Ersetzt bestehendes Dokument' + ) + } + }, + { + label: 'Status', + field: 'status', + className: 'cell-120', + sortable: true, + renderCell: function (object, data, td) { + var div = document.createElement('div') + switch (data) { + case 0: + // div.className = "tertiary"; + div.innerHTML = 'Anhängig' + break + case 1: + // div.className = "secondary"; + div.innerHTML = 'Aufgenommen' + break + case 2: + div.className = 'tertiary' + div.innerHTML = 'Abgelehnt' + break + } + return div + } + }, + { + label: 'Begründung', + field: 'begruendung', + className: 'cell-120', + renderCell: zuladungsliste_functions.renderToolTipMaxLength, + sortable: false + } + ] + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_einreichungen_administrator.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_einreichungen_administrator.js new file mode 100644 index 0000000..e2e55c7 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_einreichungen_administrator.js @@ -0,0 +1,105 @@ +define(['zuladungsliste/zuladungsliste_functions', 'dojo/domReady!'], function ( + zuladungsliste_functions +) { + return { + load: function () { + return [ + { + label: 'Erstellt', + field: 'crdate', + sortable: true, + className: 'cell-100 no-border-l', + formatter: zuladungsliste_functions.formatDate + }, + { + label: 'Büro', + field: 'company', + className: 'bold', + sortable: true + }, + { + label: 'Ansprechpartner', + className: 'cell-140', + field: 'name', + sortable: true + }, + { + label: 'Projekt', + field: 'wettbewerb', + sortable: true + }, + { + field: 'beschreibung', + className: 'pointer', + sortable: false, + renderHeaderCell: function () { + return zuladungsliste_functions.renderTextIcon( + 'Beschreibung', + 'fa fa-question-circle pointer' + ) + }, + renderCell: zuladungsliste_functions.renderPopupText + }, + { + label: 'Verfahrensort', + className: 'cell-120', + field: 'verfahrensort', + sortable: true, + renderCell: zuladungsliste_functions.renderToolTipMaxLength + }, + { + label: 'Bundesland', + className: 'cell-100', + field: 'bundesland', + sortable: true + }, + { + label: 'Protokoll', + field: 'dokument_orig_name', + className: 'cell-120 pointer', + sortable: true, + renderCell: function (object, data) { + return zuladungsliste_functions.renderIconText( + 'fa fa-file-pdf fourthly', + 'Öffnen', + data + ) + } + }, + { + label: 'Entschieden', + className: 'cell-110', + field: 'entscheidungstermin', + sortable: true + }, + { + label: 'Annehmen', + field: 'aufgenommen', + className: 'cell-110', + sortable: true, + renderCell: zuladungsliste_functions.renderButtonGreen + }, + { + label: 'Ablehnen', + className: 'cell-110', + field: 'abgelehnt', + sortable: true, + renderCell: zuladungsliste_functions.renderButtonRed + }, + { + field: 'delete', + sortable: false, + className: 'center cell-50 pointer', + renderHeaderCell: function () { + return zuladungsliste_functions.renderIcon('fa fa-trash-alt') + }, + renderCell: function () { + return zuladungsliste_functions.renderIcon( + 'fa fa-trash-alt tertiary' + ) + } + } + ] + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_freischaltungen_administrator.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_freischaltungen_administrator.js new file mode 100644 index 0000000..5e780ef --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_freischaltungen_administrator.js @@ -0,0 +1,87 @@ +define(['zuladungsliste/zuladungsliste_functions', 'dojo/domReady!'], function ( + zuladungsliste_functions +) { + return { + load: function () { + return [ + { + className: 'cell-icon pointer no-border-l', + renderHeaderCell: function () { + return zuladungsliste_functions.renderIcon('fa fa-search fourthly') + }, + renderCell: function () { + return zuladungsliste_functions.renderIcon('fa fa-search fourthly') + }, + field: 'search', + rowSpan: 2 + }, + { + label: 'Architekturbüro', + field: 'company', + sortable: true + }, + { + label: 'Ansprechpartner', + field: 'name', + sortable: true + }, + { + label: 'Wettbewerb', + field: 'wettbewerb', + sortable: true + }, + { + label: 'Jahr', + field: 'jahr', + className: 'cell-100', + sortable: true + }, + { + label: 'Bundesland', + field: 'bundesland', + className: 'cell-140', + sortable: true + }, + { + label: 'Preis', + field: 'bezeichnung_punkte', + className: 'left pointer', + renderCell: function (object, data) { + return zuladungsliste_functions.renderToolTip( + data, + object.bezeichnung_kritierien + ) + }, + sortable: true + }, + { + label: 'Punkte', + className: 'cell-100 bold center', + field: 'punkte', + sortable: true + }, + { + label: 'Aktivierung', + className: 'cell-110 center', + field: 'tstamp_zuordnung', + renderCell: zuladungsliste_functions.renderButton, + sortable: true + }, + { + label: 'Freigegeben', + field: 'tstamp_aktivierung', + className: 'cell-110 center', + sortable: true, + renderCell: zuladungsliste_functions.renderButtonGreen + }, + { + label: 'Abgelehnt', + className: 'cell-110 center', + field: 'tstamp_ablehnen', + sortable: true, + renderCell: zuladungsliste_functions.renderButtonRed + } + ] + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_konto_architekt.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_konto_architekt.js new file mode 100644 index 0000000..2473d45 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_konto_architekt.js @@ -0,0 +1,42 @@ +define(['dijit/form/TextBox', 'dojo/domReady!'], function (TextBox) { + return { + laden: function () { + return [ + { + field: 'beschreibung', + className: 'right no-border-l', + sortable: false, + renderCell: function (object, data) { + var div = document.createElement('div') + div.innerHTML = data + if (object.title) { + div.className = 'text-subheader line-height-50' + } + return div + } + }, + { + field: 'value', + editor: TextBox, + autoSave: true, + sortable: true, + renderCell: function (object, data) { + var div = document.createElement('div') + div.innerHTML = data + if (object.title) { + div.className = 'text-subheader line-height-50' + } + return div + }, + canEdit: function (object) { + return object.editable + }, + editorArgs: { + selectOnClick: true, + class: 'cell-200' + } + } + ] + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_zuteilungen_administrator.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_zuteilungen_administrator.js new file mode 100644 index 0000000..536f226 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_zuteilungen_administrator.js @@ -0,0 +1,114 @@ +define(['zuladungsliste/zuladungsliste_functions', 'dojo/domReady!'], function ( + zuladungsliste_functions +) { + return { + bestehende: function () { + return [ + { + label: 'Wettbewerb', + field: 'wettbewerb', + className: 'pointer no-border-l', + sortable: true + }, + { + label: 'Datum', + className: 'pointer cell-100 center', + field: 'tstamp', + sortable: true, + renderCell: zuladungsliste_functions.renderDate + }, + { + label: 'Anz.', + className: 'pointer cell-100 center', + field: 'anzahl_architekten', + sortable: true + } + ] + }, + + naechsten_columns: function () { + return [ + { + label: 'Position', + field: 'pos', + className: 'cell-100 center no-border-l', + unhidable: true, + sortable: true, + renderCell: zuladungsliste_functions.renderPosition + }, + { + label: 'Büro', + field: 'company', + renderExpando: true, + expandOn: 'click', + unhidable: true, + sortable: true, + renderCell: zuladungsliste_functions.renderCompany + }, + { + label: 'Rang', + field: 'rang', + className: 'cell-100 center', + sortable: true + }, + { + label: 'Status', + field: 'pos', + unhidable: true, + className: 'cell-100 center', + sortable: true, + renderCell: zuladungsliste_functions.renderStatus + }, + { + label: 'Punkte', + field: 'punkte', + className: 'cell-100 center', + sortable: false, + renderCell: zuladungsliste_functions.formatPunkte + } + ] + }, + naechsten_columns2: function () { + return [ + { + label: 'Position', + field: 'pos', + className: 'cell-100 center no-border-l', + unhidable: true, + sortable: true, + renderCell: zuladungsliste_functions.renderPosition + }, + { + label: 'Büro', + field: 'company', + renderExpando: true, + expandOn: 'click', + unhidable: true, + sortable: true, + renderCell: zuladungsliste_functions.renderCompany + }, + { + label: 'Rang', + field: 'rang', + className: 'cell-100 center', + sortable: true + }, + { + label: 'Status', + field: 'pos', + className: 'cell-100 center', + unhidable: true, + sortable: true, + renderCell: zuladungsliste_functions.renderStatus + }, + { + label: 'Punkte', + field: 'punkte', + className: 'cell-100 center', + sortable: false, + renderCell: zuladungsliste_functions.formatPunkte + } + ] + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_zuweisung_architekt.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_zuweisung_architekt.js new file mode 100644 index 0000000..f6cd443 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/columns/columns_zuweisung_architekt.js @@ -0,0 +1,75 @@ +define(['zuladungsliste/zuladungsliste_functions', 'dojo/domReady!'], function ( + zuladungsliste_functions +) { + return { + wettbewerbe: function () { + return [ + { + label: 'Id', + field: 'uid', + hidden: true, + className: 'cell-50 pointer no-border-l' + }, + { + label: 'Wettbewerb', + field: 'wettbewerb', + className: 'pointer', + sortable: true + }, + { + label: 'Jahr', + field: 'jahr', + className: 'cell-100 center pointer', + sortable: true + }, + { + label: 'Bundesland', + field: 'bundesland', + className: 'cell-140 pointer', + sortable: true + } + ] + }, + preise: function () { + return [ + { + label: 'Preise', + field: 'bezeichnung', + sortable: true, + className: 'pointer no-border-l' + }, + { + label: 'Punkte', + field: 'punkte', + sortable: true, + className: 'cell-100 center pointer' + }, + { + label: 'Zuordnung', + field: 'tstamp_zuordnung', + className: 'cell-120 pointer center', + sortable: true + }, + { + label: 'Freigegeben', + field: 'tstamp_aktivierung', + className: 'cell-120 pointer center', + sortable: true + }, + { + label: 'An/Aus', + field: 'status', + className: 'cell-100 center pointer', + renderHeaderCell: function () { + return zuladungsliste_functions.renderToolTip( + 'An/Aus ', + '
Erläuterung
Ganze Punkte (1/1) werden bei Wettbewerbsteilnahmen, Erfolgen bzw. Preisen verwendet, die als Einzelmitglied oder ständige Arbeitsgemeinschaft / Gesellschaft (welche auch in der Zuladungsliste registriert ist) erlangt wurde.
Wenn diese Punkte für Leistungen einer nicht ständigen (also nicht in der Zuladungsliste erfassten) Arbeitsgemeinschaft erzielt wurden, sind von den Mitgliedern nur jew. anteilige Punkte (1/2, 1/3, 1/4) anzuführen!
Maßgeblich ist das Juryprotokoll oder ein vergleichbares Dokument.
' + ) + }, + renderCell: zuladungsliste_functions.renderToggleIcon, + sortable: true + } + ] + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_einreichungen.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_einreichungen.js new file mode 100644 index 0000000..9fc6797 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_einreichungen.js @@ -0,0 +1,120 @@ +define([ + 'dojo/_base/array', + 'dijit/MenuItem', + 'dijit/MenuBarItem', + 'dijit/MenuSeparator', + 'dijit/PopupMenuBarItem', + 'dijit/DropDownMenu', + 'dijit/ToolbarSeparator', + 'zuladungsliste/zuladungsliste_functions', + 'dojo/domReady!' +], function ( + arrayUtil, + MenuItem, + MenuBarItem, + MenuSeparator, + PopupMenuBarItem, + DropDownMenu, + ToolbarSeparator, + zuladungsliste_functions +) { + return { + load_items: function (menu_einreichung) { + menu_einreichung.addChild(new ToolbarSeparator()) + var bundesland_popup_einreichung = new DropDownMenu({ + region: 'top' + }) + arrayUtil.forEach(LOCALSCOPE.bundeslaender, function (item, index) { + bundesland_popup_einreichung.addChild( + new MenuItem({ + label: ' ' + item, + style: 'width: 200px;', + _setSelected: function () {}, + onClick: function () { + LOCALSCOPE.filter_ein.bundeslandid = index + filterEinreichungen() + } + }) + ) + bundesland_popup_einreichung.addChild(new MenuSeparator()) + }) + menu_einreichung.addChild( + new PopupMenuBarItem({ + label: 'Bundesland ', + popup: bundesland_popup_einreichung + }) + ) + menu_einreichung.addChild(new ToolbarSeparator()) + var years_popup_einreichung = new DropDownMenu({ + region: 'top' + }) + arrayUtil.forEach(LOCALSCOPE.years, function (item) { + years_popup_einreichung.addChild( + new MenuItem({ + label: ' ' + item, + _setSelected: function () {}, + onClick: function () { + LOCALSCOPE.filter_ein.year = item + filterEinreichungen() + } + }) + ) + years_popup_einreichung.addChild(new MenuSeparator()) + }) + menu_einreichung.addChild( + new PopupMenuBarItem({ + id: 'years_popup', + label: 'Jahr ', + popup: years_popup_einreichung + }) + ) + + menu_einreichung.addChild(new ToolbarSeparator()) + menu_einreichung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Anstehend', + _setSelected: function () {}, + onClick: function () { + LOCALSCOPE.filter_ein.status = 1 + filterEinreichungen() + } + }) + ) + menu_einreichung.addChild(new ToolbarSeparator()) + menu_einreichung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Angenommen', + onClick: function () { + LOCALSCOPE.filter_ein.status = 2 + filterEinreichungen() + } + }) + ) + menu_einreichung.addChild(new ToolbarSeparator()) + menu_einreichung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Abgelehnt', + _setSelected: function () {}, + onClick: function () { + LOCALSCOPE.filter_ein.status = 3 + filterEinreichungen() + } + }) + ) + menu_einreichung.addChild(new ToolbarSeparator()) + menu_einreichung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Drucken', + _setSelected: function () {}, + onClick: function () { + zuladungsliste_functions.print_einreichungen() + } + }) + ) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_freischalten.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_freischalten.js new file mode 100644 index 0000000..fa26276 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_freischalten.js @@ -0,0 +1,128 @@ +define([ + 'dojo/_base/array', + 'dijit/MenuItem', + 'dijit/MenuBarItem', + 'dijit/MenuSeparator', + 'dijit/PopupMenuBarItem', + 'dijit/DropDownMenu', + 'dijit/ToolbarSeparator', + 'zuladungsliste/zuladungsliste_functions', + 'dojo/domReady!' +], function ( + arrayUtil, + MenuItem, + MenuBarItem, + MenuSeparator, + PopupMenuBarItem, + DropDownMenu, + ToolbarSeparator, + zuladungsliste_functions +) { + return { + load_items: function (menu_freischalten) { + menu_freischalten.addChild( + new MenuBarItem({ + label: 'Neu Laden', + onClick: function () { + dijit.byId('searchbox_frei').reset() + LOCALSCOPE.filter_frei = [] + LOCALSCOPE.search = '' + loadPunkteFreischalten() + } + }) + ) + + menu_freischalten.addChild(new ToolbarSeparator()) + + var bundesland_popup_freischalten = new DropDownMenu({ + region: 'top' + }) + arrayUtil.forEach(LOCALSCOPE.bundeslaender, function (item, index) { + bundesland_popup_freischalten.addChild( + new MenuItem({ + label: ' ' + item, + style: 'width: 200px;', + _setSelected: function () {}, + onClick: function () { + LOCALSCOPE.filter_frei.bundeslandid = index + filterFreischalten() + } + }) + ) + bundesland_popup_freischalten.addChild(new MenuSeparator()) + }) + menu_freischalten.addChild( + new PopupMenuBarItem({ + label: 'Bundesland ', + popup: bundesland_popup_freischalten + }) + ) + menu_freischalten.addChild(new ToolbarSeparator()) + var years_popup_freischalten = new DropDownMenu({ + region: 'top' + }) + arrayUtil.forEach(LOCALSCOPE.years, function (item) { + years_popup_freischalten.addChild( + new MenuItem({ + label: ' ' + item, + onClick: function () { + LOCALSCOPE.filter_frei.jahr = item + filterFreischalten() + } + }) + ) + years_popup_freischalten.addChild(new MenuSeparator()) + }) + menu_freischalten.addChild( + new PopupMenuBarItem({ + id: 'years_popup_freischalten', + label: 'Jahr ', + popup: years_popup_freischalten + }) + ) + menu_freischalten.addChild(new ToolbarSeparator()) + menu_freischalten.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Anstehend', + onClick: function () { + LOCALSCOPE.filter_frei.status = 1 + filterFreischalten() + } + }) + ) + menu_freischalten.addChild(new ToolbarSeparator()) + menu_freischalten.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Freigegeben', + onClick: function () { + LOCALSCOPE.filter_frei.status = 2 + filterFreischalten() + } + }) + ) + menu_freischalten.addChild(new ToolbarSeparator()) + menu_freischalten.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Abgelehnt', + onClick: function () { + LOCALSCOPE.filter_frei.status = 3 + filterFreischalten() + } + }) + ) + menu_freischalten.addChild(new ToolbarSeparator()) + menu_freischalten.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Drucken', + onClick: function () { + zuladungsliste_functions.print_freischaltungen() + } + }) + ) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuladungsliste_admin.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuladungsliste_admin.js new file mode 100644 index 0000000..05716a2 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuladungsliste_admin.js @@ -0,0 +1,331 @@ +define([ + 'dojo/_base/array', + 'dijit/MenuItem', + 'dijit/MenuBarItem', + 'dijit/MenuSeparator', + 'dijit/PopupMenuBarItem', + 'dijit/PopupMenuItem', + 'dijit/DropDownMenu', + 'dijit/ToolbarSeparator', + 'zuladungsliste/zuladungsliste_xhr', + 'dojo/domReady!' +], function ( + arrayUtil, + MenuItem, + MenuBarItem, + MenuSeparator, + PopupMenuBarItem, + PopupMenuItem, + DropDownMenu, + ToolbarSeparator, + zuladungsliste_xhr +) { + return { + load_items: function (menu_auswertungen) { + var callback = function (response) { + menu_auswertungen.addChild( + new MenuBarItem({ + title: 'Die Liste mit dem Stand von heute wird neu geladen', + label: ' Neu Laden', + onClick: function () { + ladeListe() + } + }) + ) + + if (LOCALSCOPE.userid == 18) { + menu_auswertungen.addChild(new ToolbarSeparator()) + menu_auswertungen.addChild( + new MenuBarItem({ + title: 'Die gesammte Liste wird über alle Jahre neu berechnet', + label: 'Neu Berechnen', + // label: ' Neu Berechnen', + calssName: 'right', + id: 'liste_neu', + onClick: function () { + dijit + .byId('liste_neu') + .set( + 'label', + ' Rechnen..' + ) + var callback = function (response) { + dijit.byId('liste_neu').set('label', 'Neu Berechnen') + if (response == 1) window.location.reload() + } + zuladungsliste_xhr.call_function( + callback, + 'liste_controller', + 'liste_alles_neu' + ) + } + }) + ) + } + + menu_auswertungen.addChild(new ToolbarSeparator()) + var subMenuArchive = new DropDownMenu({ + region: 'top', + style: 'max-width: 200px;' + }) + var pSubMenu = [] + arrayUtil.forEach(response, function (item) { + subMenuArchive.addChild(new MenuSeparator()) + + var year = item.year + pSubMenu[year] = new DropDownMenu({ + style: 'max-width: 200px;', + region: 'top' + }) + arrayUtil.forEach(item.subdata, function (item2, i) { + if (i > 0) pSubMenu[year].addChild(new MenuSeparator()) + pSubMenu[year].addChild( + new MenuItem({ + label: + ' ' + + item2.titel, + onClick: function () { + ladeListe(item2.id, item2.titel) + } + }) + ) + }) + subMenuArchive.addChild( + new PopupMenuItem({ + label: ' JAHR ' + year, + popup: pSubMenu[year] + }) + ) + }) + menu_auswertungen.addChild( + new PopupMenuBarItem({ + title: + 'Die Listen mit dem Stand der vergangenen Jahr seit dem Begin der Zuladungsliste können aufgerufen werden.', + label: 'Archive ', + popup: subMenuArchive + }) + ) + + menu_auswertungen.addChild(new ToolbarSeparator()) + + var subMenuFilter = new DropDownMenu({ + style: 'max-width: 200px;', + region: 'top' + }) + subMenuFilter.addChild( + new MenuItem({ + label: ' Alle', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + hasChildren: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Gesperrte', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + nominiert: 0 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Freie', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + nominiert: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Nächste(r)', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + n1: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Nächsten Zwei', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + n2: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Nächsten Drei', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + n3: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Nächsten Vier', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + n4: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Nächsten Fünf', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + n5: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: ' Nächsten Sechs', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + n6: 1 + }) + ) + } + }) + ) + subMenuFilter.addChild(new MenuSeparator()) + subMenuFilter.addChild( + new MenuItem({ + label: + ' Punkte von Kontoauflösung', + onClick: function () { + grid_auswertung.set( + 'collection', + store_auswertung.filter({ + istempfaenger: '1' + }) + ) + } + }) + ) + menu_auswertungen.addChild( + new PopupMenuBarItem({ + title: + 'Filtert die Zuladungsliste nache den aktuellen Nominierungen.', + label: 'Nominierung ', + popup: subMenuFilter, + disabled: 0, + id: 'nominierung' + }) + ) + + menu_auswertungen.addChild(new ToolbarSeparator()) + + var subMenuDownload = new DropDownMenu({ + style: 'max-width: 200px;', + region: 'top' + }) + subMenuDownload.addChild( + new MenuItem({ + title: 'Aktuelle Zuladungsliste als PDF aufrufen.', + label: ' Aktuelle Liste', + onClick: function () { + zuladungsliste_xhr.call_download( + 'download_controller', + 'download_pdf' + ) + } + }) + ) + var pSubMenuPdf = [] + arrayUtil.forEach(response, function (item, i) { + subMenuDownload.addChild(new MenuSeparator()) + + var year = item.year + pSubMenuPdf[year] = new DropDownMenu({ + style: 'max-width: 200px;', + region: 'top' + }) + arrayUtil.forEach(item.subdata, function (item2, j) { + if (j > 0) pSubMenuPdf[year].addChild(new MenuSeparator()) + pSubMenuPdf[year].addChild( + new MenuItem({ + label: + ' ' + item2.titel, + onClick: function () { + zuladungsliste_xhr.call_download( + 'download_controller', + 'download_pdf', + '&pdf_archive_id=' + item2.id + ) + } + }) + ) + }) + subMenuDownload.addChild( + new PopupMenuItem({ + label: ' JAHR ' + year, + popup: pSubMenuPdf[year] + }) + ) + }) + menu_auswertungen.addChild( + new PopupMenuBarItem({ + label: 'Download ', + popup: subMenuDownload + }) + ) + } + + zuladungsliste_xhr.call_function( + callback, + 'bootstrap_controller', + 'load_archive_menu' + ) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuteilung.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuteilung.js new file mode 100644 index 0000000..90d9371 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuteilung.js @@ -0,0 +1,147 @@ +define([ + 'dijit/MenuBarItem', + 'dijit/ToolbarSeparator', + 'dojo/domReady!' +], function (MenuBarItem, ToolbarSeparator) { + return { + load_items: function (menu_zuteilungen) { + menu_zuteilungen.addChild(new ToolbarSeparator()) + + menu_zuteilungen.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Drucken', + onClick: function () { + zuladungsliste_xhr.call_print( + 'zuteilungen_controller', + 'zuteilung_laden', + '&zuladungid=' + LOCALSCOPE.zuladungid + ) + } + }) + ) + // menu_freischalten.addChild( + // new MenuBarItem( + // { + // label: ' Neu Laden', + // onClick: function () + // { + // dijit.byId("searchboxfrei") + // .reset(); + // LOCALSCOPE.filter = []; + // LOCALSCOPE.search = ""; + // filterEinreichungen(); + // } + // }) + // ); + // + // menu_freischalten.addChild(new ToolbarSeparator()); + // + // var bundesland_popup_freischalten = new DropDownMenu({ + // region: "top" + // }); + // arrayUtil.forEach(LOCALSCOPE.bundeslaender, function (item, index) + // { + // bundesland_popup_freischalten.addChild( + // new MenuItem( + // { + // label: ' ' + item, + // style: "width: 200px;", + // _setSelected: function () {}, + // onClick: function () + // { + // LOCALSCOPE.filter.bundeslandid = index; + // filterStore(); + // } + // }) + // ); + // bundesland_popup_freischalten.addChild(new MenuSeparator()); + // }); + // menu_freischalten.addChild( + // new PopupMenuBarItem( + // { + // label: ' Bundesland ', + // popup: bundesland_popup_freischalten + // }) + // ); + // menu_freischalten.addChild(new ToolbarSeparator()); + // var years_popup_freischalten = new DropDownMenu({ + // region: "top" + // }); + // arrayUtil.forEach(LOCALSCOPE.years, function (item) + // { + // years_popup_freischalten.addChild( + // new MenuItem( + // { + // label: ' ' + item, + // onClick: function () + // { + // LOCALSCOPE.filter.jahr = item; + // filterStore(); + // } + // }) + // ); + // years_popup_freischalten.addChild(new MenuSeparator()); + // }); + // menu_freischalten.addChild( + // new PopupMenuBarItem( + // { + // id: "years_popup_freischalten", + // label: ' Jahr ', + // popup: years_popup_freischalten + // }) + // ); + // menu_freischalten.addChild(new ToolbarSeparator()); + // menu_freischalten.addChild( + // new MenuBarItem( + // { + // showLabel: true, + // label: ' Anstehend', + // onClick: function () + // { + // LOCALSCOPE.filter.status = 1; + // filterStore(); + // } + // }) + // ); + // menu_freischalten.addChild(new ToolbarSeparator()); + // menu_freischalten.addChild( + // new MenuBarItem( + // { + // showLabel: true, + // label: ' Freigegeben', + // onClick: function () + // { + // LOCALSCOPE.filter.status = 2; + // filterStore(); + // } + // }) + // ); + // menu_freischalten.addChild(new ToolbarSeparator()); + // menu_freischalten.addChild( + // new MenuBarItem( + // { + // showLabel: true, + // label: ' Abgelehnt', + // onClick: function () + // { + // LOCALSCOPE.filter.status = 3; + // filterStore(); + // } + // }) + // ); + // menu_freischalten.addChild(new ToolbarSeparator()); + // menu_freischalten.addChild( + // new MenuBarItem( + // { + // showLabel: true, + // label: ' Drucken', + // onClick: function () + // { + // zuladungsliste_functions.function_print("Freischaltungen"); + // } + // }) + // ); + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuweisung.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuweisung.js new file mode 100644 index 0000000..6959e7b --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/menus/menuitems_zuweisung.js @@ -0,0 +1,124 @@ +define([ + 'dojo/_base/array', + 'dijit/MenuItem', + 'dijit/MenuBarItem', + 'dijit/MenuSeparator', + 'dijit/PopupMenuBarItem', + 'dijit/DropDownMenu', + 'dijit/ToolbarSeparator', + 'dojo/domReady!' +], function ( + arrayUtil, + MenuItem, + MenuBarItem, + MenuSeparator, + PopupMenuBarItem, + DropDownMenu, + ToolbarSeparator +) { + return { + load_items: function (menu_preiszuweisung) { + menu_preiszuweisung.addChild(new ToolbarSeparator()) + menu_preiszuweisung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Freie', + onClick: function () { + LOCALSCOPE.filter_zuweisung_status = 3 + filterPunkteZuweisungen() + } + }) + ) + menu_preiszuweisung.addChild(new ToolbarSeparator()) + menu_preiszuweisung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Zugeordnet', + onClick: function () { + LOCALSCOPE.filter_zuweisung_status = 1 + filterPunkteZuweisungen() + } + }) + ) + menu_preiszuweisung.addChild(new ToolbarSeparator()) + menu_preiszuweisung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Freigegeben', + onClick: function () { + LOCALSCOPE.filter_zuweisung_status = 2 + filterPunkteZuweisungen() + } + }) + ) + + menu_preiszuweisung.addChild(new ToolbarSeparator()) + + var bundesland_popup_einreichung = new DropDownMenu({ + region: 'top', + style: 'max-width: 200px;' + }) + arrayUtil.forEach(LOCALSCOPE.bundeslaender, function (item, index) { + bundesland_popup_einreichung.addChild( + new MenuItem({ + label: ' ' + item, + onClick: function () { + LOCALSCOPE.filter_zuweisung_bundeslandid = index + filterPunkteZuweisungen() + } + }) + ) + bundesland_popup_einreichung.addChild(new MenuSeparator()) + }) + menu_preiszuweisung.addChild( + new PopupMenuBarItem({ + label: 'Bundesland ', + popup: bundesland_popup_einreichung + }) + ) + + menu_preiszuweisung.addChild(new ToolbarSeparator()) + + var years_popup_einreichung = new DropDownMenu({ + style: 'max-width: 120px;', + region: 'top' + }) + arrayUtil.forEach(LOCALSCOPE.years, function (item) { + years_popup_einreichung.addChild( + new MenuItem({ + label: ' ' + item, + _setSelected: function () {}, + onClick: function () { + LOCALSCOPE.filter_zuweisung_year = item + filterPunkteZuweisungen() + } + }) + ) + years_popup_einreichung.addChild(new MenuSeparator()) + }) + menu_preiszuweisung.addChild( + new PopupMenuBarItem({ + id: 'years_popup', + label: 'Jahr ', + popup: years_popup_einreichung, + disabled: 0 + }) + ) + + menu_preiszuweisung.addChild(new ToolbarSeparator()) + menu_preiszuweisung.addChild( + new MenuBarItem({ + showLabel: true, + label: 'Reset', + onClick: function () { + dijit.byId('searchbox_zuw').reset() + LOCALSCOPE.filter_zuweisung_status = 0 + LOCALSCOPE.filter_zuweisung_bundeslandid = -1 + LOCALSCOPE.filter_zuweisung_year = 0 + filterPunkteZuweisungen() + } + }) + ) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_functions.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_functions.js new file mode 100644 index 0000000..4d7509b --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_functions.js @@ -0,0 +1,698 @@ +define([ + 'dojo/date/locale', + 'dojo/_base/array', + 'dojo/number', + 'dijit/Tooltip', + 'dijit/ConfirmDialog', + 'dojo/domReady!' +], function (locale, arrayUtil, number, Tooltip, ConfirmDialog) { + return { + reload: function () { + location.reload() + }, + + isInt: function (n) { + return n % 1 === 0 + }, + + isFloat: function (n) { + return n === +n && n !== (n | 0) + }, + + isInteger: function (n) { + return n === +n && n === (n | 0) + }, + + unique: function (arr) { + var obj = {} + for (var i = 0, l = arr.length; i < l; i++) { + if (!(arr[i] in obj)) { + obj[arr[i]] = true + } + } + var ret = [] + for (var p in obj) { + ret.push(p) + } + ret.sort() + return ret + }, + + launchIntoFullscreen: function (element) { + if (element.requestFullscreen) { + element.requestFullscreen() + } else if (element.mozRequestFullScreen) { + element.mozRequestFullScreen() + } else if (element.webkitRequestFullscreen) { + element.webkitRequestFullscreen() + } else if (element.msRequestFullscreen) { + element.msRequestFullscreen() + } + }, + + exitFullscreen: function () { + if (document.exitFullscreen) { + document.exitFullscreen() + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen() + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen() + } + }, + + destroy_it: function (element) { + if (dijit.byId(element) != undefined) { + dijit.byId(element).destroyRecursive() + } + }, + + array_add: function (array, item) { + if (arrayUtil.indexOf(array, item) != -1) { + array.push(item) + } + return array + }, + + array_remove: function (array, xitem) { + var r = [] + arrayUtil.forEach(array, function (item) { + if (item != xitem) { + r.push(item) + } + }) + return r + }, + + // css tag for keyboard indicator + ucfirst: function (string) { + string = string.toLowerCase() + return string.charAt(0).toUpperCase() + string.slice(1) + }, + + /** + * Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1 + * @param obj1 + * @param obj2 + * @returns obj3 a new object based on obj1 and obj2 + */ + merge_objects: function (obj1, obj2) { + var obj3 = {} + var attrname + for (attrname in obj1) { + obj3[attrname] = obj1[attrname] + } + for (attrname in obj2) { + obj3[attrname] = obj2[attrname] + } + return obj3 + }, + + showAlertDialog: function (data, alertclass) { + /******************************************************* + * Alert Dialog + *******************************************************/ + // console.log("Alert", data); + if (alertclass == undefined) alertclass = 'blank' + if (dijit.byId('alertDialog') == undefined) { + var alertDialog = new ConfirmDialog({ + title: ' Achtung', + style: 'width: 400px; cursor: text; padding:20px auto;', + id: 'alertDialog', + class: alertclass + }) + alertDialog.cancelButton.set('style', { + display: 'none' + }) + } + dijit.byId('alertDialog').set('content', data) + dijit.byId('alertDialog').show() + }, + + confirm: function (text) { + /******************************************************* + * Confirm Dialog + *******************************************************/ + return new ConfirmDialog({ + title: ' Please Confirm', + content: text, + style: + 'width: 300px; cursor: text; padding:20px auto; text-align:center;' + }) + }, + + toType: function (obj) { + return {}.toString + .call(obj) + .match(/\s([a-zA-Z]+)/)[1] + .toLowerCase() + }, + + safeRefesh: function () { + var page = matches_grid._currentPage + matches_grid.refresh({ + keepScrollPosition: true + }) + matches_grid.gotoPage(page) + }, + + showCopy: function (object, data) { + var div = document.createElement('div') + var id = Math.floor(Math.random() * 1000000) + 1 + div.innerHTML = + '" + + data + + '' + return div + }, + + copyStringToClipoard: function (string) { + var copybox = document.createElement('input') + copybox.setAttribute('value', string) + document.body.appendChild(copybox) + copybox.select() + document.execCommand('copy') + document.body.removeChild(copybox) + }, + + formatDate: function (unixtimestamp) { + if (unixtimestamp == undefined || unixtimestamp == '0') return ' ' + var date = new Date(unixtimestamp * 1000) + return locale.format(date, { + selector: 'date', + datePattern: 'yyyy-MM-dd' + }) + }, + + formatDateTime: function (unixtimestamp) { + if (unixtimestamp == undefined || unixtimestamp == '0') return ' ' + var date = new Date(unixtimestamp * 1000) + return locale.format(date, { + selector: 'date', + datePattern: 'dd.MM.yy HH:mm' + }) + }, + + renderDate: function (object, unixtimestamp) { + if (unixtimestamp == undefined || unixtimestamp == '0') return ' ' + var date = new Date(unixtimestamp * 1000) + var div = document.createElement('div') + div.innerHTML = locale.format(date, { + selector: 'date', + datePattern: 'dd.MM.yyyy' + }) + return div + }, + + renderDateTime: function (object, unixtimestamp) { + if (unixtimestamp == undefined || unixtimestamp == '0') return ' ' + var date = new Date(unixtimestamp * 1000) + var div = document.createElement('div') + div.innerHTML = locale.format(date, { + selector: 'date', + datePattern: 'dd.MM.yy HH:mm' + }) + return div + }, + + renderTextNbsp: function (object, data) { + var div = document.createElement('div') + div.className = 'text-nbsp' + div.innerHTML = data + return div + }, + + renderHTML: function (object, text) { + var div = document.createElement('div') + div.innerHTML = text + return div + }, + + renderDecimal: function (value, places, id) { + var div = document.createElement('div') + if (value == 0) return '' + if (places == undefined) { + places = 1 + } + if (id != undefined) { + div.id = id + } + div.innerHTML = number.format(value, { + places: places, + locale: 'us' + }) + return div + }, + + formatZeprimaryoEmpty: function (str) { + str = str.toString() + + if (str == undefined || str == 0) { + return ' ' + } else if (str.indexOf(',') == 1) { + return replace(',', '.') + } else { + return str + } + }, + + renderToolTip: function (title, tooltip, className) { + var div = document.createElement('div') + div.className = 'pointer center' + if (className != undefined) { + div.className += className + } + div.innerHTML = title + new Tooltip({ + position: ['above', 'below'], + connectId: div, + label: tooltip + }) + return div + }, + + renderToolTipMaxLength: function (object, text) { + if (!text) { + return + } + var div = document.createElement('div') + if (text.length > 15) { + div.className = 'pointer' + div.innerHTML = text.substring(0, 15) + '..' + new Tooltip({ + connectId: div, + label: text + }) + } else { + div.innerHTML = text + } + return div + }, + + plainToolTip: function (txt) { + var div = document.createElement('div') + new Tooltip({ + connectId: div, + label: txt + }) + return div + }, + + plainText: function (txt, classname) { + var div = document.createElement('div') + if (classname != undefined) { + div.className = classname + } + div.innerHTML = txt + return div + }, + + checkSessionExpired: function (response) { + arrayUtil.forEach(response, function (item) { + if (item.logout == 1) + document.location.href = + 'index.php?id=1&submit=Logout&logintype=logout&pid=1&tx_felogin_pi1[noredirect]=0' + }) + }, + + isJson: function (string) { + item = typeof item !== 'string' ? JSON.stringify(item) : item + + try { + item = JSON.parse(item) + } catch (e) { + return false + } + + if (typeof item === 'object' && item !== null) { + return true + } + + return false + }, + + renderIcon: function (iconclass, tooltip) { + var div = document.createElement('span') + div.className = iconclass + if (tooltip) { + new Tooltip({ + connectId: div, + label: tooltip, + position: ['above', 'below'] + }) + } + return div + }, + + renderTextIcon: function (string, iconclass, tooltip) { + var div = document.createElement('div') + div.innerHTML = string + div.innerHTML += ' ' + if (tooltip) { + new Tooltip({ + connectId: div, + label: tooltip, + position: ['above', 'below'] + }) + } + return div + }, + + renderIconText: function (iconclass, string, tooltip) { + var div = document.createElement('div') + div.innerHTML = ' ' + div.innerHTML += string + if (tooltip) { + new Tooltip({ + connectId: div, + label: tooltip, + position: ['above', 'below'] + }) + } + return div + }, + + htmlTooltip: function (object, data) { + var div = document.createElement('div') + div.className += ' pointer' + data = data.replace(/_/g, ' ') + div.innerHTML = data + div.title = data + return div + }, + + formatPunkte: function (object, data) { + var div = document.createElement('div') + if (object.type == 'verschiebung_gegeben') { + div.className = 'gesperrt' + } + if (data == '' || data == 0) return '' + div.innerHTML = number.format(data, { + places: 2 + }) + return div + }, + formatSperre: function (object, data, td, options) { + if (data == undefined || data == '' || data == 0) return false + var div = document.createElement('div') + div.className = 'gesperrt' + var date = new Date(data * 1000) + div.innerHTML = locale.format(date, { + selector: 'date', + datePattern: 'yyyy-MM-dd' + }) + return div + }, + + renderColorStatus: function (object, data, td, options) { + var div = document.createElement('div') + div.innerHTML = data + switch (object.status) { + case 1: + div.className = 'tertiary' + break + case 2: + div.className = 'secondary' + break + case 3: + div.className = 'primary' + break + } + return div + }, + + renderColorStatusTimestamp: function (object, data, td, options) { + var div = document.createElement('div') + var date = new Date(data * 1e3) + div.innerHTML = locale.format(date, { + selector: 'date', + datePattern: 'yyyy-MM-dd' + }) + switch (object.status) { + case 1: + div.className = 'tertiary' + break + case 2: + div.className = 'secondary' + break + case 3: + div.className = 'primary' + break + } + return div + }, + + renderPosition: function (object, value) { + var div = document.createElement('div') + if (object.hasChildren == 0 || value == 0) div.innerHTML = ' ' + else div.innerHTML = value + return div + }, + + renderStatus: function (object, data, td, options) { + var div = document.createElement('div') + if (object.hasChildren == 0) div.innerHTML = ' ' + else if (object.punkte == 0) div.innerHTML = '-' + else if (data == 0) + div.innerHTML = 'Gesperrt' + else div.innerHTML = 'Frei' + return div + }, + + renderCompany: function (object, data, td, options) { + var div = document.createElement('div') + if (object.hasChildren == 1) + div.innerHTML = + '' + + data + + '
Ansprechpartner ' + + object.name + + '
' + else { + div.innerHTML = data + } + return div + }, + renderInfoIcon: function (object, data, td, options) { + var div = document.createElement('div') + if (data == '') return div + if (object.hasChildren == 0 && object.type == 'wettbewerb') { + div.innerHTML = '' + var tp = new Tooltip({ + connectId: [div], + showDelay: 0, + label: data + }) + } + return div + }, + + renderPopupText: function (object, data, td, options) { + var div = document.createElement('div') + if (data == '') return div + div.innerHTML = data.substr(0, 35) + '...' + new Tooltip({ + connectId: [div], + showDelay: 0, + label: data + }) + return div + }, + + renderBeschreibung: function (object, data, td, options) { + var div = document.createElement('div') + if (data == '') return div + div.innerHTML = data.substring(0, 25) + '...' + var tp = new Tooltip({ + connectId: [div], + showDelay: 0, + label: data + }) + return div + }, + + renderToggleIcon: function (object, data, td, obj) { + var div = document.createElement('div') + + if (object.tstamp_aktivierung != '') { + div.innerHTML = '' + } else if (data == 2) { + div.innerHTML = '' + } else if (data == 1) { + div.innerHTML = '' + } else { + div.innerHTML = '' + } + return div + }, + + renderButton: function (object, data, td, options) { + var div = document.createElement('div') + if (data != 0) { + var date = new Date(data * 1e3) + div.innerHTML = locale.format(date, { + selector: 'date', + datePattern: 'yyyy-MM-dd' + }) + } else { + div.innerHTML = + 'OK' + } + return div + }, + + renderButtonRed: function (object, data, td, options) { + var div = document.createElement('div') + if (data != 0) { + var date = new Date(data * 1e3) + div.className = 'tertiary' + div.innerHTML = locale.format(date, { + selector: 'date', + datePattern: 'yyyy-MM-dd' + }) + } else { + div.innerHTML = + 'OK' + } + return div + }, + + renderButtonGreen: function (object, data, td, options) { + var div = document.createElement('div') + if (data != 0) { + var date = new Date(data * 1e3) + div.className = 'secondary' + div.innerHTML = locale.format(date, { + selector: 'date', + datePattern: 'yyyy-MM-dd' + }) + } else { + div.innerHTML = + 'OK' + } + return div + }, + + /******************************************************* + * PRINT EINREISCHNUGEN + *******************************************************/ + print_einreichungen: function () { + var html = + '' + html += '

Einreichungen



' + if (LOCALSCOPE.print_ein != '') { + html += '

Filter:' + LOCALSCOPE.print_ein + '

' + } + html += + '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + + var filtered = LOCALSCOPE.filter_f.track() + arrayUtil.forEach(filtered.data, function (item) { + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + }) + html += '' + html += '
BüroAnsprechpartnerProjektVerfahrensortBundeslandEntscheidung
' + item.company + '' + item.name + '' + item.wettbewerb + '' + item.verfahrensort + '' + item.bundesland + '' + item.entscheidungstermin + '
' + + html += '' + html += '' + + var iframe = document.createElement('iframe') + iframe.style = 'position: absolute; width:0; height:0; border:0;' + document.body.appendChild(iframe) + iframe.contentWindow.document.open() + iframe.contentWindow.document.write(html) + iframe.contentWindow.document.close() + + // iframe document.createElement('iframe'); + // iframe.src = 'data:text/html;charset=utf-8,' + encodeURI(html); + // iframe.focus(); + // var node = dom.byId("printable"); + // node.innerHTML = html; + // setTimeout(function () { + // window.print(); + // }, 100); + + // console.log("data", header, LOCALSCOPE.filter_f.track()); + // return; + }, + + renderPositionMenu: function (object, data) { + var div = document.createElement('div') + if (object.type == 'year') { + div.innerHTML = '' + data + '' + } else { + div.innerHTML = '' + data + '' + } + return div + }, + + /******************************************************* + * PRINT FREISCHALTUNGEN + *******************************************************/ + print_freischaltungen: function () { + var html = + '' + html += '

Freischaltungen



' + if (LOCALSCOPE.filter_frei != '') { + html += '

Filter:' + LOCALSCOPE.filter_frei + '

' + } + html += + '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + + var filtered = LOCALSCOPE.filter_f.track() + arrayUtil.forEach(filtered.data, function (item) { + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + html += '' + }) + + html += '' + html += '
BüroAnsprechpartnerWettbewerbJahrBundeslandPreisPunkte
' + item.company + '' + item.name + '' + item.wettbewerb + '' + item.jahr + '' + item.bundesland + '' + item.bezeichnung_punkte + '' + item.punkte + '
' + + html += '' + html += '' + + var iframe = document.createElement('iframe') + iframe.style = 'position: absolute; width:0; height:0; border:0;' + document.body.appendChild(iframe) + iframe.contentWindow.document.open() + iframe.contentWindow.document.write(html) + iframe.contentWindow.document.close() + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_modul_loader.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_modul_loader.js new file mode 100644 index 0000000..b626c26 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_modul_loader.js @@ -0,0 +1,39 @@ +dojoConfig = { + locale: 'de', + has: { + 'dojo-firebug': true, + 'dojo-debug-messages': true + }, + parseOnLoad: true, + waitSeconds: 10, + cacheBust: true, + async: true, + isDebug: true, + packages: [ + { + name: 'dgrid', + location: + '/typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/node_modules/dgrid' + }, + { + name: 'dijit', + location: + '/typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/node_modules/dijit' + }, + { + name: 'dojox', + location: + '/typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/node_modules/dojox' + }, + { + name: 'dstore', + location: + '/typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/node_modules/dojo-dstore' + }, + { + name: 'zuladungsliste', + location: + '/typo3conf/ext/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste' + } + ] +} diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_pi1.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_pi1.js new file mode 100644 index 0000000..1c243b4 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_pi1.js @@ -0,0 +1,92 @@ +require([ + 'dojo/ready', + 'dojo/_base/array', + 'dijit/layout/BorderContainer', + 'dijit/layout/TabContainer', + 'zuladungsliste/zuladungsliste_topmenu', + 'zuladungsliste/zuladungsliste_xhr', + 'zuladungsliste/administrator/auswertung_alle', + 'zuladungsliste/administrator/punkte_freischalten', + 'zuladungsliste/administrator/einreichungen', + 'zuladungsliste/administrator/zuteilungen' +], function ( + ready, + arrayUtil, + BorderContainer, + TabContainer, + zuladungsliste_topmenu, + zuladungsliste_xhr, + auswertung_alle, + punkte_freischalten, + einreichungen, + zuteilungen +) { + ready(function () { + // on(window, "resize", function() { + // document.location.reload(); + // }); + + var maincontainer = new BorderContainer( + { + design: 'headline', + id: 'maincontainer' + }, + 'base' + ) + + var callback = function (response) { + arrayUtil.forEach(response, function (item) { + LOCALSCOPE[item.key] = item.value + }) + + /******************************************************* + * Topmenu + *******************************************************/ + zuladungsliste_topmenu.create(maincontainer, 'administration') + + /******************************************************* + * Tabcontainer + *******************************************************/ + var tab_container = new TabContainer({ + region: 'center', + tabPosition: 'left', + id: 'tab_container' + }) + maincontainer.addChild(tab_container) + + /******************************************************* + * Tab Auswertung Alle + *******************************************************/ + auswertung_alle.init(tab_container) + + /******************************************************* + * Tab Punkte Freischalten + *******************************************************/ + setTimeout(function () { + punkte_freischalten.init(tab_container) + + /******************************************************* + * Tab Einreichungen + *******************************************************/ + einreichungen.init(tab_container) + + /******************************************************* + * Tab Zuteilungen + *******************************************************/ + zuteilungen.init(tab_container) + + /******************************************************* + * Startup App + *******************************************************/ + }, 100) + + maincontainer.startup() + } + + zuladungsliste_xhr.call_function( + callback, + 'bootstrap_controller', + 'administrator' + ) + }) +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_pi2.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_pi2.js new file mode 100644 index 0000000..bcad5af --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_pi2.js @@ -0,0 +1,89 @@ +require([ + 'dojo/ready', + 'dojo/_base/array', + 'dijit/layout/BorderContainer', + 'dijit/layout/TabContainer', + 'zuladungsliste/zuladungsliste_topmenu', + 'zuladungsliste/zuladungsliste_xhr', + + 'zuladungsliste/architekt/position', + 'zuladungsliste/architekt/zuweisung', + 'zuladungsliste/architekt/einreichung', + 'zuladungsliste/architekt/konto' +], function ( + ready, + arrayUtil, + BorderContainer, + TabContainer, + zuladungsliste_topmenu, + zuladungsliste_xhr, + position, + zuweisung, + einreichung, + konto +) { + ready(function () { + // on(window, "resize", function() { + // document.location.reload(); + // }); + + var maincontainer = new BorderContainer( + { + design: 'headline', + id: 'maincontainer' + }, + 'base' + ) + + if (LOCALSCOPE.length == 0) { + var callback = function (response) { + arrayUtil.forEach(response, function (item) { + LOCALSCOPE[item.key] = item.value + }) + + /******************************************************* + * Topmenu + *******************************************************/ + zuladungsliste_topmenu.create(maincontainer, 'zuladungsliste') + + /******************************************************* + * Tabcontainer + *******************************************************/ + var tab_container_achitekten = new TabContainer({ + region: 'center', + tabPosition: 'left', + id: 'tab_container_achitekten' + }) + maincontainer.addChild(tab_container_achitekten) + + /******************************************************* + * Tab Position + *******************************************************/ + position.init(tab_container_achitekten) + + /******************************************************* + * Tab Zuweisung + *******************************************************/ + zuweisung.init(tab_container_achitekten) + + /******************************************************* + * Tab Einreichung + *******************************************************/ + einreichung.init(tab_container_achitekten) + + /******************************************************* + * Tab Konto + *******************************************************/ + konto.init(tab_container_achitekten) + + maincontainer.startup() + } + + zuladungsliste_xhr.call_function( + callback, + 'bootstrap_controller', + 'start_liste' + ) + } + }) +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_topmenu.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_topmenu.js new file mode 100644 index 0000000..3a9887c --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_topmenu.js @@ -0,0 +1,92 @@ +define([ + 'dijit/MenuBar', + 'dijit/MenuBarItem', + 'dijit/ToolbarSeparator', + 'dojo/domReady!' +], function (MenuBar, MenuBarItem, ToolbarSeparator) { + return { + create: function (maincontainer, loaction) { + var topmenu = new MenuBar({ + id: 'topmenu', + region: 'top', + splitter: false + }) + maincontainer.addChild(topmenu) + + topmenu.addChild( + new MenuBarItem({ + style: 'margin-right: 20rem;', + label: ' Anleitung', + onClick: function () { + window.open('/fileadmin/Anleitung_Zuladungsliste.pdf', '_blank') + } + }) + ) + + topmenu.addChild( + new MenuBarItem({ + label: ' Home', + onClick: function () { + document.location = window.location.origin + } + }) + ) + + if (LOCALSCOPE.isadmin) { + topmenu.addChild(new ToolbarSeparator()) + + if (loaction == 'administration') { + topmenu.addChild( + new MenuBarItem({ + label: ' Zuladungsliste', + onClick: function () { + document.location = window.location.origin + '/app/liste' + } + }) + ) + } else { + topmenu.addChild( + new MenuBarItem({ + label: ' Administration', + onClick: function () { + document.location = + window.location.origin + '/app/administration' + } + }) + ) + } + + topmenu.addChild(new ToolbarSeparator()) + + topmenu.addChild( + new MenuBarItem({ + label: ' Backend', + onClick: function () { + document.location = window.location.origin + '/typo3' + } + }) + ) + } + + topmenu.addChild(new ToolbarSeparator()) + + topmenu.addChild( + new MenuBarItem({ + label: ' Logout', + onClick: function () { + document.location = window.location.origin + '?logintype=logout' + } + }) + ) + + topmenu.addChild(new ToolbarSeparator()) + + topmenu.addChild( + new MenuBarItem({ + id: 'topmenu_user', + label: ' ' + LOCALSCOPE.fullname + }) + ) + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_xhr.js b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_xhr.js new file mode 100644 index 0000000..b829c02 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/Zuladungsliste/zuladungsliste_xhr.js @@ -0,0 +1,126 @@ +define([ + 'dojo/dom', + 'zuladungsliste/zuladungsliste_functions', + 'dojo/domReady!' +], function (dom, zuladungsliste_functions) { + return { + /******************************************************* + * CALL FUNCTION + *******************************************************/ + + call_function: function ( + callback, + controller, + xaction, + additional_parameters + ) { + var url = '?zlcontroller=' + controller + '&xaction=' + xaction + if (additional_parameters != undefined) { + url = url + additional_parameters + } + var xhrArgs = { + url: url, + handleAs: 'json', + preventCache: true, + error: function (error) { + // console.log('error',error); + // location.reload(); + } + } + deferred = dojo.xhrGet(xhrArgs) + deferred.then(function (response) { + zuladungsliste_functions.checkSessionExpired(response) + if (typeof callback === 'function') { + callback(response) + } + }) + }, + + call_function_text: function ( + callback, + controller, + xaction, + additional_parameters + ) { + var url = '?zlcontroller=' + controller + '&xaction=' + xaction + if (additional_parameters != undefined) { + url = url + additional_parameters + } + xhrArgs = { + url: url, + handleAs: 'text', + preventCache: true + } + deferred = dojo.xhrGet(xhrArgs) + deferred.then(function (response) { + zuladungsliste_functions.checkSessionExpired(response) + + if (typeof callback === 'function') { + callback(response) + } + }) + }, + + /******************************************************* + * POST DOWNLOAD + *******************************************************/ + + post_function: function ( + callback, + controller, + xaction, + value_array, + additional_parameters + ) { + var url = '?zlcontroller=' + controller + '&xaction=' + xaction + if (additional_parameters != undefined) { + url = url + additional_parameters + } + xhrArgs = { + url: url, + handleAs: 'json', + postData: { + data: JSON.stringify(value_array) + }, + preventCache: true, + error: function (error) { + // location.reload(); + } + } + deferred = dojo.xhrPost(xhrArgs) + deferred.then(function (response) { + zuladungsliste_functions.checkSessionExpired(response) + + if (typeof callback === 'function') { + callback(response) + } + }) + }, + + /******************************************************* + * CALL DOWNLOAD + *******************************************************/ + + call_download: function (controller, xaction, additional_parameters) { + var url = '?zlcontroller=' + controller + '&xaction=' + xaction + if (additional_parameters) { + url += additional_parameters + } + + window.open(url, '_blank') + }, + + /******************************************************* + * CALL DOWNLOAD + *******************************************************/ + + call_print: function (controller, xaction, additional_parameters) { + var url = + '../index.php?zlcontroller=' + controller + '&xaction=' + xaction + if (additional_parameters) { + url += additional_parameters + } + dom.byId('printIFrame1').src = url + } + } +}) diff --git a/packages/zuladungsliste/Resources/Public/JavaScript/package.json b/packages/zuladungsliste/Resources/Public/JavaScript/package.json new file mode 100644 index 0000000..c5ec1b1 --- /dev/null +++ b/packages/zuladungsliste/Resources/Public/JavaScript/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "dgrid": "^1.3.3", + "dijit": "^1.17.3", + "dojo-dstore": "^1.2.1", + "dojox": "^1.17.3" + } +} diff --git a/packages/zuladungsliste/composer.json b/packages/zuladungsliste/composer.json new file mode 100644 index 0000000..8ee550d --- /dev/null +++ b/packages/zuladungsliste/composer.json @@ -0,0 +1,38 @@ +{ + "name": "hermanntelser/zuladungsliste", + "type": "typo3-cms-extension", + "description": "Programm zur Verwaltung Zuladungsliste für die Architektenkammer in Österrreich", + "license": ["GPL-2.0-or-later"], + "authors": [{ + "name": "Hermann Telser", + "email": "hermann.telser@gmail.com", + "role": "Developer" + }], + "autoload": { + "psr-4": { + "HermannTelser\\Zuladungsliste\\": "Classes" + } + }, + "require": { + "typo3/cms-core": "^11.5" + }, + "replace": { + "typo3-ter/zuladungsliste": "self.version" + }, + "config": { + "vendor-dir": ".Build/vendor", + "bin-dir": ".Build/bin" + }, + "scripts": { + "post-autoload-dump": [ + "TYPO3\\TestingFramework\\Composer\\ExtensionTestEnvironment::prepare" + ] + }, + "extra": { + "typo3/cms": { + "cms-package-dir": "{$vendor-dir}/typo3/cms", + "web-dir": ".Build/public", + "extension-key": "zuladungsliste" + } + } +} diff --git a/packages/zuladungsliste/ext_emconf.php b/packages/zuladungsliste/ext_emconf.php new file mode 100644 index 0000000..a55ce55 --- /dev/null +++ b/packages/zuladungsliste/ext_emconf.php @@ -0,0 +1,34 @@ + 'Zuladungsliste ZT Kammer', + 'description' => 'Verwaltung der Wettbewerbszuladungsliste für ZT Kammern in Österrreich', + 'category' => 'services', + 'author' => 'Hermann Telser', + 'author_email' => 'hermann.telser@gmail.com', + 'author_company' => 'Hermann Telser', + 'internal' => '', + 'uploadfolder' => '1', + 'state' => 'stable', + 'clearCacheOnLoad' => 0, + 'version' => '10.0.0', + 'createDirs' => '', + 'constraints' => [ + 'depends' => ['typo3' => '10.0.0-11.99.99',] + ], + 'autoload' => [ + 'psr-4' => [ + 'HermannTelser\\Zuladungsliste\\' => 'Classes' + ] + ], +]; diff --git a/packages/zuladungsliste/ext_localconf.php b/packages/zuladungsliste/ext_localconf.php new file mode 100644 index 0000000..5a04760 --- /dev/null +++ b/packages/zuladungsliste/ext_localconf.php @@ -0,0 +1,94 @@ + 'list,detail'], + [\HermannTelser\Zuladungsliste\Controller\ArchitektenController::class => 'detail'] +); + +$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\HermannTelser\Zuladungsliste\Scheduler\CronTask::class] = array( + 'extension' => 'zuladungsliste', + 'title' => 'Zuladungsliste erstellen', + 'description' => 'Mit diesem Aufruf kann mit Hilfe eines Cron Jobs eine neue Version der Zuladungsliste erstellt werden.' +); + + +$extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\Container\Container::class); +$extbaseObjectContainer->registerImplementation( + \In2code\Femanager\Controller\NewController::class, + \HermannTelser\Zuladungsliste\Controller\NewController::class +); +$extbaseObjectContainer->registerImplementation( + \In2code\Femanager\Controller\EditController::class, + \HermannTelser\Zuladungsliste\Controller\EditController::class +); + + +$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\In2code\Femanager\Domain\Model\User::class] = [ + 'className' => \HermannTelser\Zuladungsliste\Domain\Model\User::class, +]; +\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\Container\Container::class) +->registerImplementation( + \In2code\Femanager\Domain\Model\User::class, + \HermannTelser\Zuladungsliste\Domain\Model\User::class +); + +if (TYPO3_MODE === 'BE') { + $iconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class); + + $iconRegistry->registerIcon( + 'web_list', + \TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class, + ['source' => 'EXT:zuladungsliste/Resources/Public/Icons/ExtensionBgWhite.png'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kammern-1', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'university'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kammern-2', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'university'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-sperrung', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'lock'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kriterium', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'trophy'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kriterium-1', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'trophy'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kriterium-2', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'trophy'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kriterium-3', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'trophy'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kriterium-4', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'trophy'] + ); + $iconRegistry->registerIcon( + 'zuladungsliste-kontoclosed', + \TYPO3\CMS\Core\Imaging\IconProvider\FontawesomeIconProvider::class, + ['name' => 'share'] + ); +} diff --git a/packages/zuladungsliste/ext_tables.php b/packages/zuladungsliste/ext_tables.php new file mode 100644 index 0000000..c16e240 --- /dev/null +++ b/packages/zuladungsliste/ext_tables.php @@ -0,0 +1,60 @@ + 'EXT:zuladungsliste/Resources/Public/Css/Backend/', +); + +/** + * Add new fields to fe_users table + */ +$GLOBALS['TCA']['fe_users']['ctrl']['type'] = 'tx_extbase_type'; +$tmpFeUsersColumns = [ + 'kammermitgliedsnummer' => [ + 'exclude' => 0, + 'label' => 'Kammermitgliedsnummer', + 'config' => [ + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ], + ], + 'frauenfoerderpunkt' => array( + 'exclude' => 0, + 'label' => 'Frauenförderpunkt', + 'config' => array( + 'type' => 'check', + 'default' => 0 + ) + ), + 'vereidigung' => array( + 'exclude' => 0, + 'label' => 'Vereidigung', + 'config' => [ + 'renderType' => 'inputDateTime', + 'dbType' => 'date', + 'type' => 'input', + 'size' => 7, + 'format' => 'date', + 'eval' => 'date', + 'checkbox' => 1, + 'disableAgeDisplay' => 1, + 'default' => '0000-00-00' + ], + ), +]; + +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('fe_users', $tmpFeUsersColumns, true); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('fe_users', 'kammermitgliedsnummer,frauenfoerderpunkt,vereidigung'); + +/** + * Add page TSConfig for the two new fields + */ +$tsConfig = 'tx_femanager.flexForm.new.addFieldOptions.kammermitgliedsnummer = Kammermitgliedsnummer' . PHP_EOL; +$tsConfig .= 'tx_femanager.flexForm.new.addFieldOptions.frauenfoerderpunkt = Frauenförderpunkt' . PHP_EOL; +$tsConfig .= 'tx_femanager.flexForm.new.addFieldOptions.vereidigung = Vereidigung' . PHP_EOL; +$tsConfig .= 'tx_femanager.flexForm.edit < tx_femanager.flexForm.new'; +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig($tsConfig); diff --git a/packages/zuladungsliste/ext_tables.sql b/packages/zuladungsliste/ext_tables.sql new file mode 100644 index 0000000..fa01608 --- /dev/null +++ b/packages/zuladungsliste/ext_tables.sql @@ -0,0 +1,333 @@ +CREATE TABLE fe_users ( + kammermitgliedsnummer varchar(20) DEFAULT '0', + inliste int(11) DEFAULT '0' NOT NULL, + vereidigung date DEFAULT NULL, + frauenfoerderpunkt tinyint(1) DEFAULT '0' NOT NULL, + solidaritaetserklaerung int(11) DEFAULT '0', + extrasperrung int(11) DEFAULT '0', + kontoaufloesung int(11) DEFAULT '0', + kontoaufloesung_begruendung varchar(255) DEFAULT '' NOT NULL, + kontoaufloesung_active date DEFAULT NULL, + wettbewerbe int(11) DEFAULT '0', + kammernid int(11) DEFAULT '0', + punkteverschiebung varchar(255) NOT NULL DEFAULT '', +); + +CREATE TABLE tx_zuladungsliste_archive_admin ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + tstamp int(11) NOT NULL DEFAULT '0', + crdate int(11) NOT NULL DEFAULT '0', + hidden tinyint(4) NOT NULL DEFAULT '0', + liste longtext, + PRIMARY KEY (uid) +) ENGINE=InnoDB DEFAULT; + + +CREATE TABLE tx_zuladungsliste_archive_user ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + user_id int(11) DEFAULT NULL, + archive_admin_uid int(11) unsigned NOT NULL DEFAULT '0', + tstamp int(11) unsigned NOT NULL DEFAULT '0', + crdate int(11) unsigned NOT NULL DEFAULT '0', + hidden tinyint(4) unsigned NOT NULL DEFAULT '0', + company varchar(120) NOT NULL DEFAULT '', + name varchar(120) NOT NULL DEFAULT '', + punkte varchar(20) NOT NULL DEFAULT '', + nominiert int(11) unsigned NOT NULL DEFAULT '0', + rang int(11) unsigned NOT NULL DEFAULT '0', + pos int(11) unsigned NOT NULL DEFAULT '0', + gesperrt_bis varchar(20) NOT NULL DEFAULT '', + auswertung longtext, + PRIMARY KEY (uid) +) ENGINE=InnoDB DEFAULT; + + +CREATE TABLE tx_zuladungsliste_domain_model_extrasperrung ( + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + + begruendung varchar(255) NOT NULL DEFAULT '', + sperrzeitbis date DEFAULT NULL, + extrasperrung_user int(11) unsigned DEFAULT '0' NOT NULL, + + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_domain_model_kammern ( + + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + + bezeichnung varchar(255) DEFAULT '' NOT NULL, + einsichtstag int(11) unsigned DEFAULT '0' NOT NULL, + + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_punkte_kriterien_mm ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + uid_punkte int(11) unsigned NOT NULL DEFAULT '0', + uid_kriterien int(11) unsigned NOT NULL DEFAULT '0', + sorting int(11) unsigned NOT NULL DEFAULT '0', + punkte varchar(10) NOT NULL DEFAULT '0', + + PRIMARY KEY (uid), + KEY parent (pid) +) ENGINE=InnoDB; + +CREATE TABLE tx_zuladungsliste_domain_model_wettbewerbe ( + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + + wettbewerb varchar(255) DEFAULT '' NOT NULL, + beschreibung text NOT NULL, + registrierung varchar(255) DEFAULT '' NOT NULL, + verfahrensid int(11) NOT NULL DEFAULT '0', + verfahrensort varchar(255) DEFAULT '' NOT NULL, + bundesland varchar(255) DEFAULT '' NOT NULL, + abgabetermin date DEFAULT NULL, + kammerbeschluss date DEFAULT NULL, + entscheidungstermin date DEFAULT NULL, + sperrung tinyint(1) unsigned DEFAULT '0' NOT NULL, + aufgabenstellung text NOT NULL, + wettbewerb_user int(11) unsigned DEFAULT '0' NOT NULL, + kriteriumid int(11) unsigned NOT NULL DEFAULT '0', + sperre_deaktiviert tinyint(4) NOT NULL DEFAULT '0', + + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_domain_model_kriterien ( + + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + + bezeichnung varchar(255) NOT NULL DEFAULT '', + punkteid int(11) unsigned DEFAULT '0', + preisartid int(11) unsigned DEFAULT '0', + sektinstagid int(11) unsigned DEFAULT '0', + kriterien_punkte int(11) unsigned DEFAULT '0', + kriterien_preisart int(11) unsigned DEFAULT '0', + kammernid int(11) unsigned DEFAULT '0', + sperrung int(11) unsigned DEFAULT '0', + + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + sorting int(11) unsigned DEFAULT '0' NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_domain_model_punkte ( + + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + + bezeichnung varchar(255) DEFAULT '' NOT NULL, + kriterienid int(11) NOT NULL DEFAULT '0', + + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + sorting int(11) unsigned DEFAULT '0' NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) + +); + +CREATE TABLE tx_zuladungsliste_domain_model_preisart ( + + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + + preisart varchar(255) DEFAULT '' NOT NULL, + + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_domain_model_sektionstage ( + uid int(11) NOT NULL auto_increment, + pid int(11) DEFAULT '0' NOT NULL, + rwcode varchar(10) DEFAULT '' NOT NULL, + bezeichnung varchar(255) DEFAULT '' NOT NULL, + stichtag date DEFAULT NULL, + sperrzeit int(11) DEFAULT '0' NOT NULL, + sperrzeitstart date DEFAULT NULL, + punktezeit int(11) DEFAULT '0' NOT NULL, + punktezeitstart date DEFAULT NULL, + neueinsteiger int(11) DEFAULT '0' NOT NULL, + neueinsteigerstart date DEFAULT NULL, + frauenfoerderung int(11) DEFAULT '0' NOT NULL, + frauenfoerderungstart date DEFAULT NULL, + frauenfoerderungsonderstart date DEFAULT NULL, + kammernid int(11) unsigned DEFAULT '0', + sektionstage_notizen text NOT NULL, + + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + cruser_id int(11) unsigned DEFAULT '0' NOT NULL, + deleted tinyint(4) unsigned DEFAULT '0' NOT NULL, + hidden tinyint(4) unsigned DEFAULT '0' NOT NULL, + starttime int(11) unsigned DEFAULT '0' NOT NULL, + endtime int(11) unsigned DEFAULT '0' NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_wettbewerbe_architekten_mm ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + tstamp int(11) unsigned DEFAULT '0' NOT NULL, + crdate int(11) unsigned DEFAULT '0' NOT NULL, + tstamp_zuordnung int(11) unsigned DEFAULT '0' NOT NULL, + tstamp_aktivierung int(11) unsigned DEFAULT '0' NOT NULL, + tstamp_ablehnen int(11) unsigned DEFAULT '0' NOT NULL, + uid_wettbewerbe int(11) unsigned NOT NULL DEFAULT '0', + uid_user int(11) unsigned NOT NULL DEFAULT '0', + uid_punkte int(11) unsigned NOT NULL DEFAULT '0', + ladung_durch_auslober int(11) unsigned NOT NULL DEFAULT '0', + notizen varchar(155) DEFAULT NULL, + sorting int(11) unsigned NOT NULL DEFAULT '0', + ist_befangen int(11) unsigned DEFAULT '0' NOT NULL, + bemerkungen text NOT NULL, + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_extrasperrung_user_mm ( + + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + uid_extrasperrung int(11) unsigned NOT NULL DEFAULT '0', + uid_user int(11) unsigned NOT NULL DEFAULT '0', + sorting int(11) unsigned NOT NULL DEFAULT '0', + + PRIMARY KEY (uid), + KEY parent (pid) +); + +CREATE TABLE tx_zuladungsliste_konto_aufloesung_mm ( + + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + uid_geber int(11) unsigned NOT NULL DEFAULT '0', + uid_empfaenger int(11) unsigned NOT NULL DEFAULT '0', + prozente double(5,2) DEFAULT '0.00', + + PRIMARY KEY (uid), + KEY parent (pid) +) ENGINE=InnoDB; + +CREATE TABLE tx_zuladungsliste_domain_model_wettbewerbe_einreichungen ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + tstamp int(11) unsigned NOT NULL DEFAULT '0', + crdate int(11) unsigned NOT NULL DEFAULT '0', + deleted tinyint(4) unsigned NOT NULL DEFAULT '0', + hidden tinyint(4) unsigned NOT NULL DEFAULT '0', + cruser_id int(11) unsigned NOT NULL DEFAULT '0', + wettbewerb varchar(255) NOT NULL DEFAULT '', + beschreibung text NOT NULL, + entscheidungstermin date DEFAULT NULL, + verfahrensort varchar(255) NOT NULL DEFAULT '', + bundesland varchar(255) NOT NULL DEFAULT '', + dokument_name varchar(20) DEFAULT NULL, + dokument_orig_name varchar(220) DEFAULT NULL, + dokument_size varchar(10) DEFAULT NULL, + dokument_type varchar(20) DEFAULT NULL, + aufgenommen int(11) unsigned NOT NULL DEFAULT '0', + abgelehnt int(11) unsigned NOT NULL DEFAULT '0', + begruendung varchar(255) NOT NULL DEFAULT '', + + PRIMARY KEY (uid) +) ENGINE=InnoDB; + +CREATE TABLE tx_zuladungsliste_zuteilungen ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + tstamp int(11) unsigned NOT NULL DEFAULT '0', + crdate int(11) unsigned NOT NULL DEFAULT '0', + hidden tinyint(4) unsigned NOT NULL DEFAULT '0', + uid_user int(11) DEFAULT '0', + uid_wettbewerbe int(11) unsigned NOT NULL DEFAULT '0', + anzahl_architekten int(11) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (uid) +) ENGINE=InnoDB; + +CREATE TABLE tx_zuladungsliste_zuteilungen_user ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + tstamp int(11) unsigned NOT NULL DEFAULT '0', + crdate int(11) unsigned NOT NULL DEFAULT '0', + hidden tinyint(4) unsigned NOT NULL DEFAULT '0', + uid_zuteilungen_user int(11) unsigned NOT NULL DEFAULT '0', + user_id int(11) DEFAULT NULL, + position int(11) DEFAULT NULL, + ersatz tinyint(4) unsigned DEFAULT '0' NOT NULL, + PRIMARY KEY (uid) +) ENGINE=InnoDB; + + +CREATE TABLE tx_zuladungsliste_punkte_verschiebung_mm ( + uid int(11) NOT NULL auto_increment, + pid int(11) NOT NULL DEFAULT '0', + uid_geber int(11) unsigned NOT NULL DEFAULT '0', + uid_empfaenger int(11) unsigned NOT NULL DEFAULT '0', + verschiebung_ab date DEFAULT NULL, + verschiebung_stichtag date DEFAULT NULL, + prozente double(5,2) DEFAULT '0.00', + wettbewerbe varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (uid) +) ENGINE=InnoDB; diff --git a/packages/zuladungsliste/fix-table-datetime.sql b/packages/zuladungsliste/fix-table-datetime.sql new file mode 100644 index 0000000..5fe3296 --- /dev/null +++ b/packages/zuladungsliste/fix-table-datetime.sql @@ -0,0 +1,35 @@ +vereidigung date DEFAULT '0000-00-00' NOT NULL, +kontoaufloesung_active date DEFAULT '0000-00-00' NOT NULL, + +sperrzeitbis date DEFAULT '0000-00-00' NOT NULL, + +abgabetermin date DEFAULT '0000-00-00' NOT NULL, +kammerbeschluss date DEFAULT '0000-00-00' NOT NULL, +entscheidungstermin date DEFAULT '0000-00-00' NOT NULL, + +stichtag date DEFAULT '0000-00-00' NOT NULL, +sperrzeitstart date DEFAULT '0000-00-00' NOT NULL, +punktezeitstart date DEFAULT '0000-00-00' NOT NULL, +neueinsteigerstart date DEFAULT '0000-00-00' NOT NULL, +frauenfoerderungstart date DEFAULT '0000-00-00' NOT NULL, +frauenfoerderungsonderstart date DEFAULT '0000-00-00' NOT NULL, +entscheidungstermin date DEFAULT '0000-00-00' NOT NULL, + + +update fe_users set vereidigung = NULL where vereidigung = '0000-00-00'; +update fe_users set kontoaufloesung_active = NULL where kontoaufloesung_active = '0000-00-00'; + +update tx_zuladungsliste_domain_model_extrasperrung set sperrzeitbis = NULL where sperrzeitbis = '0000-00-00'; + +update tx_zuladungsliste_domain_model_wettbewerbe set abgabetermin = NULL where abgabetermin = '0000-00-00'; +update tx_zuladungsliste_domain_model_wettbewerbe set kammerbeschluss = NULL where kammerbeschluss = '0000-00-00'; +update tx_zuladungsliste_domain_model_wettbewerbe set entscheidungstermin = NULL where entscheidungstermin = '0000-00-00'; + +update tx_zuladungsliste_domain_model_sektionstage set stichtag = NULL where stichtag = '0000-00-00'; +update tx_zuladungsliste_domain_model_sektionstage set sperrzeitstart = NULL where sperrzeitstart = '0000-00-00'; +update tx_zuladungsliste_domain_model_sektionstage set punktezeitstart = NULL where punktezeitstart = '0000-00-00'; +update tx_zuladungsliste_domain_model_sektionstage set neueinsteigerstart = NULL where neueinsteigerstart = '0000-00-00'; +update tx_zuladungsliste_domain_model_sektionstage set frauenfoerderungstart = NULL where frauenfoerderungstart = '0000-00-00'; +update tx_zuladungsliste_domain_model_sektionstage set frauenfoerderungsonderstart = NULL where frauenfoerderungsonderstart = '0000-00-00'; + +update tx_zuladungsliste_domain_model_wettbewerbe_einreichungen set entscheidungstermin = NULL where entscheidungstermin = '0000-00-00'; diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..d39e2af --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,395 @@ +##### +# +# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver +# +# This file includes settings for the following configuration options: +# +# - Compression +# - Caching +# - MIME types +# - Cross Origin requests +# - Rewriting and Access +# - Miscellaneous +# - PHP optimisation +# +# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its +# not there already) and rename it to '.htaccess'. To make .htaccess files work, you might need to +# adjust the 'AllowOverride' directive in your Apache configuration file. +# +# IMPORTANT: You may need to change this file depending on your TYPO3 installation! +# Consider adding this file's content to your webserver's configuration directly for speed improvement +# +# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess +# +#### + + +### Begin: Compression ### + +# Compressing resource files will save bandwidth and so improve loading speed especially for users +# with slower internet connections. TYPO3 can compress the .js and .css files for you. +# *) Uncomment the following lines and +# *) Set $GLOBALS['TYPO3_CONF_VARS']['BE']['compressionLevel'] = 9 for the Backend +# *) Set $GLOBALS['TYPO3_CONF_VARS']['FE']['compressionLevel'] = 9 together with the TypoScript properties +# config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files. + +# +# AddType "text/javascript" .gz +# +# +# AddType "text/css" .gz +# +#AddEncoding x-gzip .gz + + + # Force compression for mangled `Accept-Encoding` request headers + + + SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding + RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding + + + + # Compress all output labeled with one of the following media types. + # + # (!) For Apache versions below version 2.3.7 you don't need to + # enable `mod_filter` and can remove the `` + # and `` lines as `AddOutputFilterByType` is still in + # the core directives. + # + # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype + + + AddOutputFilterByType DEFLATE application/atom+xml \ + application/javascript \ + application/json \ + application/ld+json \ + application/manifest+json \ + application/rdf+xml \ + application/rss+xml \ + application/schema+json \ + application/vnd.geo+json \ + application/geo+json \ + application/vnd.ms-fontobject \ + application/x-font-ttf \ + application/x-javascript \ + application/x-web-app-manifest+json \ + application/xhtml+xml \ + application/xml \ + font/eot \ + font/opentype \ + font/otf \ + font/ttf \ + image/bmp \ + image/svg+xml \ + image/vnd.microsoft.icon \ + image/x-icon \ + text/cache-manifest \ + text/css \ + text/html \ + text/javascript \ + text/plain \ + text/vcard \ + text/vnd.rim.location.xloc \ + text/vtt \ + text/x-component \ + text/x-cross-domain-policy \ + text/xml + + + + AddEncoding gzip svgz + + + +### End: Compression ### + + + +### Begin: Browser caching of resource files ### + +# This affects Frontend and Backend and increases performance. + + + ExpiresActive On + ExpiresDefault "access plus 1 month" + + ExpiresByType text/css "access plus 1 year" + + ExpiresByType application/json "access plus 0 seconds" + ExpiresByType application/ld+json "access plus 0 seconds" + ExpiresByType application/schema+json "access plus 0 seconds" + ExpiresByType application/vnd.geo+json "access plus 0 seconds" + ExpiresByType application/geo+json "access plus 0 seconds" + ExpiresByType application/xml "access plus 0 seconds" + ExpiresByType text/xml "access plus 0 seconds" + + ExpiresByType image/vnd.microsoft.icon "access plus 1 week" + ExpiresByType image/x-icon "access plus 1 week" + + ExpiresByType text/x-component "access plus 1 month" + + ExpiresByType text/html "access plus 0 seconds" + + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType application/x-javascript "access plus 1 year" + ExpiresByType text/javascript "access plus 1 year" + + ExpiresByType application/manifest+json "access plus 1 week" + ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" + ExpiresByType text/cache-manifest "access plus 0 seconds" + + ExpiresByType audio/ogg "access plus 1 month" + ExpiresByType image/apng "access plus 1 month" + ExpiresByType image/avif "access plus 1 month" + ExpiresByType image/avif-sequence "access plus 1 month" + ExpiresByType image/bmp "access plus 1 month" + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType image/jxl "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" + ExpiresByType image/webp "access plus 1 month" + ExpiresByType video/mp4 "access plus 1 month" + ExpiresByType video/ogg "access plus 1 month" + ExpiresByType video/webm "access plus 1 month" + + ExpiresByType application/atom+xml "access plus 1 hour" + ExpiresByType application/rdf+xml "access plus 1 hour" + ExpiresByType application/rss+xml "access plus 1 hour" + + ExpiresByType font/collection "access plus 1 month" + ExpiresByType application/vnd.ms-fontobject "access plus 1 month" + ExpiresByType font/eot "access plus 1 month" + ExpiresByType font/opentype "access plus 1 month" + ExpiresByType font/otf "access plus 1 month" + ExpiresByType application/x-font-ttf "access plus 1 month" + ExpiresByType font/ttf "access plus 1 month" + ExpiresByType application/font-woff "access plus 1 month" + ExpiresByType application/x-font-woff "access plus 1 month" + ExpiresByType font/woff "access plus 1 month" + ExpiresByType application/font-woff2 "access plus 1 month" + ExpiresByType font/woff2 "access plus 1 month" + + ExpiresByType text/x-cross-domain-policy "access plus 1 week" + + + +### End: Browser caching of resource files ### + + +### Begin: MIME types ### + +# Proper MIME types for all files + + # Security configuration + RemoveType .html .htm + + AddType text/html .html .htm + + + RemoveType .svg .svgz + + AddType image/svg+xml .svg .svgz + + + # Data interchange + AddType application/atom+xml atom + AddType application/json json map topojson + AddType application/ld+json jsonld + AddType application/rss+xml rss + AddType application/vnd.geo+json geojson + AddType application/xml rdf xml + + # JavaScript + AddType application/javascript js + + # Manifest files + AddType application/manifest+json webmanifest + AddType application/x-web-app-manifest+json webapp + AddType text/cache-manifest appcache + + # Media files + + AddType audio/mp4 f4a f4b m4a + AddType audio/ogg oga ogg opus + AddType image/avif avif + AddType image/avif-sequence avifs + AddType image/bmp bmp + AddType image/jxl jxl + AddType image/webp webp + AddType video/mp4 f4v f4p m4v mp4 + AddType video/ogg ogv + AddType video/webm webm + AddType video/x-flv flv + AddType image/x-icon cur ico + + # Web fonts + AddType font/woff woff + AddType font/woff2 woff2 + AddType application/vnd.ms-fontobject eot + AddType font/ttf ttc ttf + AddType font/otf otf + + # Other + AddType application/octet-stream safariextz + AddType application/x-bb-appworld bbaw + AddType application/x-chrome-extension crx + AddType application/x-opera-extension oex + AddType application/x-xpinstall xpi + AddType text/vcard vcard vcf + AddType text/vnd.rim.location.xloc xloc + AddType text/vtt vtt + AddType text/x-component htc + + + +# UTF-8 encoding +AddDefaultCharset utf-8 + + AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml + + +### End: MIME types ### + + + +### Begin: Cross Origin ### + +# Send the CORS header for images when browsers request it. + + + + SetEnvIf Origin ":" IS_CORS + Header set Access-Control-Allow-Origin "*" env=IS_CORS + + + + +# Allow cross-origin access to web fonts. + + + Header set Access-Control-Allow-Origin "*" + + + +### End: Cross Origin ### + + + +### Begin: Rewriting and Access ### + + + + # Enable URL rewriting + RewriteEngine On + + # Store the current location in an environment variable CWD to use + # mod_rewrite in .htaccess files without knowing the RewriteBase + RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$ + RewriteRule ^.*$ - [E=CWD:%2] + + # Rules to set ApplicationContext based on hostname + #RewriteCond %{HTTP_HOST} ^dev\.example\.com$ + #RewriteRule .? - [E=TYPO3_CONTEXT:Development] + #RewriteCond %{HTTP_HOST} ^staging\.example\.com$ + #RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging] + #RewriteCond %{HTTP_HOST} ^www\.example\.com$ + #RewriteRule .? - [E=TYPO3_CONTEXT:Production] + + # Rule for versioned static files, configured through: + # - $GLOBALS['TYPO3_CONF_VARS']['BE']['versionNumberInFilename'] + # - $GLOBALS['TYPO3_CONF_VARS']['FE']['versionNumberInFilename'] + # IMPORTANT: This rule has to be the very first RewriteCond in order to work! + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gz)$ %{ENV:CWD}$1.$3 [L] + + # Access block for folders + RewriteRule _(?:recycler|temp)_/ - [F] + RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F] + RewriteRule ^(?:vendor|typo3_src|typo3temp/var) - [F] + RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F] + + # Block access to all hidden files and directories with the exception of + # the visible content from within the `/.well-known/` hidden directory (RFC 5785). + RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC] + RewriteCond %{SCRIPT_FILENAME} -d [OR] + RewriteCond %{SCRIPT_FILENAME} -f + RewriteRule (?:^|/)\. - [F] + + # Stop rewrite processing, if we are in any other known directory + # NOTE: Add your additional local storages here + RewriteRule ^(?:fileadmin/|typo3conf/|typo3temp/|uploads/) - [L] + + # If the file/symlink/directory does not exist but is below /typo3/, redirect to the TYPO3 Backend entry point. + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-l + RewriteRule ^typo3/(.*)$ %{ENV:CWD}typo3/index.php [QSA,L] + + # If the file/symlink/directory does not exist => Redirect to index.php. + # For httpd.conf, you need to prefix each '%{REQUEST_FILENAME}' with '%{DOCUMENT_ROOT}'. + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-l + RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L] + + + +# Access block for files +# Apache < 2.3 + + + Order allow,deny + Deny from all + Satisfy All + + +# Apache ≥ 2.3 + + + Require all denied + + + +# Block access to vcs directories + + RedirectMatch 404 /\.(?:git|svn|hg)/ + + +### End: Rewriting and Access ### + + + +### Begin: Miscellaneous ### + +# 404 error prevention for non-existing redirected folders +Options -MultiViews + +# Make sure that directory listings are disabled. + + Options -Indexes + + + + # Force IE to render pages in the highest available mode + Header set X-UA-Compatible "IE=edge" + + Header unset X-UA-Compatible + + + # Reducing MIME type security risks + Header set X-Content-Type-Options "nosniff" + + +# ETag removal + + Header unset ETag + +FileETag None + +### End: Miscellaneous ### + + +# Add your own rules here. diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..49affc5 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/typo3conf/.LocalConfiguration.php.swp b/public/typo3conf/.LocalConfiguration.php.swp new file mode 100644 index 0000000..ee23b69 Binary files /dev/null and b/public/typo3conf/.LocalConfiguration.php.swp differ diff --git a/public/typo3conf/PackageStates.php b/public/typo3conf/PackageStates.php new file mode 100644 index 0000000..27bf280 --- /dev/null +++ b/public/typo3conf/PackageStates.php @@ -0,0 +1,109 @@ + [ + 'core' => [ + 'packagePath' => 'typo3/sysext/core/', + ], + 'scheduler' => [ + 'packagePath' => 'typo3/sysext/scheduler/', + ], + 'extbase' => [ + 'packagePath' => 'typo3/sysext/extbase/', + ], + 'fluid' => [ + 'packagePath' => 'typo3/sysext/fluid/', + ], + 'frontend' => [ + 'packagePath' => 'typo3/sysext/frontend/', + ], + 'fluid_styled_content' => [ + 'packagePath' => 'typo3/sysext/fluid_styled_content/', + ], + 'filelist' => [ + 'packagePath' => 'typo3/sysext/filelist/', + ], + 'impexp' => [ + 'packagePath' => 'typo3/sysext/impexp/', + ], + 'form' => [ + 'packagePath' => 'typo3/sysext/form/', + ], + 'install' => [ + 'packagePath' => 'typo3/sysext/install/', + ], + 'reports' => [ + 'packagePath' => 'typo3/sysext/reports/', + ], + 'redirects' => [ + 'packagePath' => 'typo3/sysext/redirects/', + ], + 'recordlist' => [ + 'packagePath' => 'typo3/sysext/recordlist/', + ], + 'backend' => [ + 'packagePath' => 'typo3/sysext/backend/', + ], + 'setup' => [ + 'packagePath' => 'typo3/sysext/setup/', + ], + 'rte_ckeditor' => [ + 'packagePath' => 'typo3/sysext/rte_ckeditor/', + ], + 'adminpanel' => [ + 'packagePath' => 'typo3/sysext/adminpanel/', + ], + 'belog' => [ + 'packagePath' => 'typo3/sysext/belog/', + ], + 'beuser' => [ + 'packagePath' => 'typo3/sysext/beuser/', + ], + 'extensionmanager' => [ + 'packagePath' => 'typo3/sysext/extensionmanager/', + ], + 'felogin' => [ + 'packagePath' => 'typo3/sysext/felogin/', + ], + 'info' => [ + 'packagePath' => 'typo3/sysext/info/', + ], + 'seo' => [ + 'packagePath' => 'typo3/sysext/seo/', + ], + 'sys_note' => [ + 'packagePath' => 'typo3/sysext/sys_note/', + ], + 't3editor' => [ + 'packagePath' => 'typo3/sysext/t3editor/', + ], + 'tstemplate' => [ + 'packagePath' => 'typo3/sysext/tstemplate/', + ], + 'viewpage' => [ + 'packagePath' => 'typo3/sysext/viewpage/', + ], + 'workspaces' => [ + 'packagePath' => 'typo3/sysext/workspaces/', + ], + 'sr_freecap' => [ + 'packagePath' => 'typo3conf/ext/sr_freecap/', + ], + 'femanager' => [ + 'packagePath' => 'typo3conf/ext/femanager/', + ], + 'bootstrap_package' => [ + 'packagePath' => 'typo3conf/ext/bootstrap_package/', + ], + 'zuladungsliste' => [ + 'packagePath' => 'typo3conf/ext/zuladungsliste/', + ], + ], + 'version' => 5, +]; diff --git a/public/typo3conf/autoload/autoload_classaliasmap.php b/public/typo3conf/autoload/autoload_classaliasmap.php new file mode 100644 index 0000000..13b6277 --- /dev/null +++ b/public/typo3conf/autoload/autoload_classaliasmap.php @@ -0,0 +1,9 @@ + + array ( + ), + 'classNameToAliasMapping' => + array ( + ), +); diff --git a/public/typo3conf/autoload/autoload_classmap.php b/public/typo3conf/autoload/autoload_classmap.php new file mode 100644 index 0000000..141a58d --- /dev/null +++ b/public/typo3conf/autoload/autoload_classmap.php @@ -0,0 +1,167 @@ + $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Composer/ChangelogScript.php', + 'BK2K\\BootstrapPackage\\Composer\\VersionScript' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Composer/VersionScript.php', + 'BK2K\\BootstrapPackage\\DataProcessing\\FlexFormProcessor' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/DataProcessing/FlexFormProcessor.php', + 'BK2K\\BootstrapPackage\\DataProcessing\\MenuProcessor' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/DataProcessing/MenuProcessor.php', + 'BK2K\\BootstrapPackage\\Hooks\\PageRenderer\\PreProcessHook' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Hooks/PageRenderer/PreProcessHook.php', + 'BK2K\\BootstrapPackage\\Hooks\\TceMain\\ClearCacheHook' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Hooks/TceMain/ClearCacheHook.php', + 'BK2K\\BootstrapPackage\\Service\\BrandingService' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Service/BrandingService.php', + 'BK2K\\BootstrapPackage\\Service\\CompileService' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Service/CompileService.php', + 'BK2K\\BootstrapPackage\\Service\\InstallService' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Service/InstallService.php', + 'BK2K\\BootstrapPackage\\Updates\\AccordionContentElementUpdate' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/AccordionContentElementUpdate.php', + 'BK2K\\BootstrapPackage\\Updates\\BulletContentElementUpdate' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/BulletContentElementUpdate.php', + 'BK2K\\BootstrapPackage\\Updates\\CarouselContentElementUpdate' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/CarouselContentElementUpdate.php', + 'BK2K\\BootstrapPackage\\Updates\\ExternalMediaContentElement' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/ExternalMediaContentElement.php', + 'BK2K\\BootstrapPackage\\Updates\\ListGroupContentElement' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/ListGroupContentElement.php', + 'BK2K\\BootstrapPackage\\Updates\\PanelContentElementUpdate' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/PanelContentElementUpdate.php', + 'BK2K\\BootstrapPackage\\Updates\\SectionFrameToFrameClassUpdate' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/SectionFrameToFrameClassUpdate.php', + 'BK2K\\BootstrapPackage\\Updates\\TabContentElementUpdate' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/TabContentElementUpdate.php', + 'BK2K\\BootstrapPackage\\Updates\\TableContentElementUpdate' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/TableContentElementUpdate.php', + 'BK2K\\BootstrapPackage\\Updates\\TexticonContentElement' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Updates/TexticonContentElement.php', + 'BK2K\\BootstrapPackage\\Utility\\ExternalMediaUtility' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Utility/ExternalMediaUtility.php', + 'BK2K\\BootstrapPackage\\Utility\\TextIconUtility' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/Utility/TextIconUtility.php', + 'BK2K\\BootstrapPackage\\ViewHelpers\\DataRelationViewHelper' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/ViewHelpers/DataRelationViewHelper.php', + 'BK2K\\BootstrapPackage\\ViewHelpers\\ExplodeViewHelper' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExplodeViewHelper.php', + 'BK2K\\BootstrapPackage\\ViewHelpers\\ExternalMediaViewHelper' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExternalMediaViewHelper.php', + 'BK2K\\BootstrapPackage\\ViewHelpers\\FalViewHelper' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/ViewHelpers/FalViewHelper.php', + 'BK2K\\BootstrapPackage\\ViewHelpers\\LastImageInfoViewHelper' => $typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes/ViewHelpers/LastImageInfoViewHelper.php', + 'DieMedialen\\DmDeveloperlog\\Controller\\Devlog62Controller' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/Controller/Devlog62Controller.php', + 'DieMedialen\\DmDeveloperlog\\Controller\\DevlogController' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/Controller/DevlogController.php', + 'DieMedialen\\DmDeveloperlog\\Domain\\Model\\Constraint' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/Domain/Model/Constraint.php', + 'DieMedialen\\DmDeveloperlog\\Domain\\Model\\Logentry' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/Domain/Model/Logentry.php', + 'DieMedialen\\DmDeveloperlog\\Domain\\Repository\\LogentryRepository' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/Domain/Repository/LogentryRepository.php', + 'DieMedialen\\DmDeveloperlog\\Utility\\Developerlog' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/Utility/Developerlog.php', + 'DieMedialen\\DmDeveloperlog\\ViewHelpers\\BitMaskViewHelper' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/ViewHelpers/BitMaskViewHelper.php', + 'DieMedialen\\DmDeveloperlog\\ViewHelpers\\MapToHelperClassViewHelper' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/ViewHelpers/MapToHelperClassViewHelper.php', + 'DieMedialen\\DmDeveloperlog\\ViewHelpers\\UsernameViewHelper' => $typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes/ViewHelpers/UsernameViewHelper.php', + 'HermannTelser\\Zuladungsliste\\Controller\\ArchitektenController' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Controller/ArchitektenController.php', + 'HermannTelser\\Zuladungsliste\\Controller\\ExtrasperrungController' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Controller/ExtrasperrungController.php', + 'HermannTelser\\Zuladungsliste\\Controller\\KriterienController' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Controller/KriterienController.php', + 'HermannTelser\\Zuladungsliste\\Controller\\WettbewerbeController' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Controller/WettbewerbeController.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Architekten' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Architekten.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Extrasperrung' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Extrasperrung.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Kammern' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Kammern.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Kriterien' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Kriterien.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Preisart' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Preisart.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Punkte' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Punkte.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Sektionstage' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Sektionstage.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Model\\Wettbewerbe' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Model/Wettbewerbe.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Repository\\ArchitektenRepository' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Repository/ArchitektenRepository.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Repository\\KriterienRepository' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Repository/KriterienRepository.php', + 'HermannTelser\\Zuladungsliste\\Domain\\Repository\\WettbewerbeRepository' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Domain/Repository/WettbewerbeRepository.php', + 'HermannTelser\\Zuladungsliste\\Utility\\Labels' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Utility/Labels.php', + 'HermannTelser\\Zuladungsliste\\Utility\\ListToPdf' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Utility/ListToPdf.php', + 'HermannTelser\\Zuladungsliste\\Utility\\Select' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Utility/Select.php', + 'MYPDF' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Utility/eIDDispatcher.php', + 'SJBR\\SrFeuserRegister\\Captcha\\Captcha' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Captcha/Captcha.php', + 'SJBR\\SrFeuserRegister\\Captcha\\CaptchaInterface' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Captcha/CaptchaInterface.php', + 'SJBR\\SrFeuserRegister\\Captcha\\CaptchaManager' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Captcha/CaptchaManager.php', + 'SJBR\\SrFeuserRegister\\Captcha\\Freecap' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Captcha/Freecap.php', + 'SJBR\\SrFeuserRegister\\Configuration\\ConfigurationCheck' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Configuration/ConfigurationCheck.php', + 'SJBR\\SrFeuserRegister\\Configuration\\Reports\\StatusProvider' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Configuration/Reports/StatusProvider.php', + 'SJBR\\SrFeuserRegister\\Controller\\AbstractActionController' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Controller/AbstractActionController.php', + 'SJBR\\SrFeuserRegister\\Controller\\CreateActionController' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Controller/CreateActionController.php', + 'SJBR\\SrFeuserRegister\\Controller\\DeleteActionController' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Controller/DeleteActionController.php', + 'SJBR\\SrFeuserRegister\\Controller\\EditActionController' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Controller/EditActionController.php', + 'SJBR\\SrFeuserRegister\\Controller\\InfomailActionController' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Controller/InfomailActionController.php', + 'SJBR\\SrFeuserRegister\\Controller\\RegisterPluginController' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Controller/RegisterPluginController.php', + 'SJBR\\SrFeuserRegister\\Controller\\SetfixedActionController' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Controller/SetfixedActionController.php', + 'SJBR\\SrFeuserRegister\\Domain\\Data' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Domain/Data.php', + 'SJBR\\SrFeuserRegister\\Exception' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Exception.php', + 'SJBR\\SrFeuserRegister\\Hooks\\FileUploadHooks' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Hooks/FileUploadHooks.php', + 'SJBR\\SrFeuserRegister\\Hooks\\RegistrationProcessHooks' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Hooks/RegistrationProcessHooks.php', + 'SJBR\\SrFeuserRegister\\Hooks\\UsergroupHooks' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Hooks/UsergroupHooks.php', + 'SJBR\\SrFeuserRegister\\Mail\\Message' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Mail/Message.php', + 'SJBR\\SrFeuserRegister\\Request\\Parameters' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Request/Parameters.php', + 'SJBR\\SrFeuserRegister\\Security\\Authentication' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Security/Authentication.php', + 'SJBR\\SrFeuserRegister\\Security\\SecuredData' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Security/SecuredData.php', + 'SJBR\\SrFeuserRegister\\Security\\SessionData' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Security/SessionData.php', + 'SJBR\\SrFeuserRegister\\Security\\StorageSecurity' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Security/StorageSecurity.php', + 'SJBR\\SrFeuserRegister\\Security\\TransmissionSecurity' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Security/TransmissionSecurity.php', + 'SJBR\\SrFeuserRegister\\Setfixed\\SetfixedUrls' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Setfixed/SetfixedUrls.php', + 'SJBR\\SrFeuserRegister\\Utility\\CssUtility' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Utility/CssUtility.php', + 'SJBR\\SrFeuserRegister\\Utility\\HashUtility' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Utility/HashUtility.php', + 'SJBR\\SrFeuserRegister\\Utility\\HtmlUtility' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Utility/HtmlUtility.php', + 'SJBR\\SrFeuserRegister\\Utility\\LocalizationUtility' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Utility/LocalizationUtility.php', + 'SJBR\\SrFeuserRegister\\Utility\\UrlUtility' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/Utility/UrlUtility.php', + 'SJBR\\SrFeuserRegister\\View\\AbstractView' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/AbstractView.php', + 'SJBR\\SrFeuserRegister\\View\\AfterSaveView' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/AfterSaveView.php', + 'SJBR\\SrFeuserRegister\\View\\CreateView' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/CreateView.php', + 'SJBR\\SrFeuserRegister\\View\\DeleteView' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/DeleteView.php', + 'SJBR\\SrFeuserRegister\\View\\EditView' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/EditView.php', + 'SJBR\\SrFeuserRegister\\View\\Email' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/Email.php', + 'SJBR\\SrFeuserRegister\\View\\Marker' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/Marker.php', + 'SJBR\\SrFeuserRegister\\View\\PlainView' => $typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes/View/PlainView.php', + 'SJBR\\SrFreecap\\Configuration\\ConfigurationHelper' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Configuration/ConfigurationHelper.php', + 'SJBR\\SrFreecap\\Controller\\AudioPlayerController' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Controller/AudioPlayerController.php', + 'SJBR\\SrFreecap\\Controller\\FontMakerController' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Controller/FontMakerController.php', + 'SJBR\\SrFreecap\\Controller\\ImageGeneratorController' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Controller/ImageGeneratorController.php', + 'SJBR\\SrFreecap\\Domain\\Model\\Font' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Domain/Model/Font.php', + 'SJBR\\SrFreecap\\Domain\\Model\\Word' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Domain/Model/Word.php', + 'SJBR\\SrFreecap\\Domain\\Repository\\FontRepository' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Domain/Repository/FontRepository.php', + 'SJBR\\SrFreecap\\Domain\\Repository\\WordRepository' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Domain/Repository/WordRepository.php', + 'SJBR\\SrFreecap\\Domain\\Session\\SessionStorage' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Domain/Session/SessionStorage.php', + 'SJBR\\SrFreecap\\PiBaseApi' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/PiBaseApi.php', + 'SJBR\\SrFreecap\\Utility\\AudioContentUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/AudioContentUtility.php', + 'SJBR\\SrFreecap\\Utility\\EidUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/EidUtility.php', + 'SJBR\\SrFreecap\\Utility\\EncryptionUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/EncryptionUtility.php', + 'SJBR\\SrFreecap\\Utility\\FontMakingUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/FontMakingUtility.php', + 'SJBR\\SrFreecap\\Utility\\GifBuilderUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/GifBuilderUtility.php', + 'SJBR\\SrFreecap\\Utility\\ImageContentUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/ImageContentUtility.php', + 'SJBR\\SrFreecap\\Utility\\LocalizationUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/LocalizationUtility.php', + 'SJBR\\SrFreecap\\Utility\\Mp3ContentUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/Mp3ContentUtility.php', + 'SJBR\\SrFreecap\\Utility\\RandomContentUtility' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Utility/RandomContentUtility.php', + 'SJBR\\SrFreecap\\Validation\\Validator\\CaptchaValidator' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Validation/Validator/CaptchaValidator.php', + 'SJBR\\SrFreecap\\Validation\\Validator\\TtfFileValidator' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/Validation/Validator/TtfFileValidator.php', + 'SJBR\\SrFreecap\\ViewHelpers\\AudioViewHelper' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/ViewHelpers/AudioViewHelper.php', + 'SJBR\\SrFreecap\\ViewHelpers\\ImageViewHelper' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/ViewHelpers/ImageViewHelper.php', + 'SJBR\\SrFreecap\\ViewHelpers\\TranslateViewHelper' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/ViewHelpers/TranslateViewHelper.php', + 'SJBR\\SrFreecap\\View\\AudioPlayer\\AbstractPlayFormat' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/View/AudioPlayer/AbstractPlayFormat.php', + 'SJBR\\SrFreecap\\View\\AudioPlayer\\PlayMp3' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/View/AudioPlayer/PlayMp3.php', + 'SJBR\\SrFreecap\\View\\AudioPlayer\\PlayWav' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/View/AudioPlayer/PlayWav.php', + 'SJBR\\SrFreecap\\View\\ImageGenerator\\ShowPng' => $typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes/View/ImageGenerator/ShowPng.php', + 'SJBR\\StaticInfoTables\\Cache\\CachedClassLoader' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Cache/CachedClassLoader.php', + 'SJBR\\StaticInfoTables\\Cache\\ClassCacheManager' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Cache/ClassCacheManager.php', + 'SJBR\\StaticInfoTables\\Configuration\\TypoScript\\ConfigurationHelper' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Configuration/TypoScript/ConfigurationHelper.php', + 'SJBR\\StaticInfoTables\\Controller\\ManagerController' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Controller/ManagerController.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\AbstractEntity' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Model/AbstractEntity.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\Country' => $typo3InstallDir . 'typo3conf/ext/static_info_tables_de/Classes/Domain/Model/Country.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\CountryZone' => $typo3InstallDir . 'typo3conf/ext/static_info_tables_de/Classes/Domain/Model/CountryZone.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\Currency' => $typo3InstallDir . 'typo3conf/ext/static_info_tables_de/Classes/Domain/Model/Currency.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\Language' => $typo3InstallDir . 'typo3conf/ext/static_info_tables_de/Classes/Domain/Model/Language.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\LanguagePack' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Model/LanguagePack.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\SystemLanguage' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Model/SystemLanguage.php', + 'SJBR\\StaticInfoTables\\Domain\\Model\\Territory' => $typo3InstallDir . 'typo3conf/ext/static_info_tables_de/Classes/Domain/Model/Territory.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\AbstractEntityRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/AbstractEntityRepository.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\CountryRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/CountryRepository.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\CountryZoneRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/CountryZoneRepository.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\CurrencyRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/CurrencyRepository.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\LanguagePackRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/LanguagePackRepository.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\LanguageRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/LanguageRepository.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\SystemLanguageRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/SystemLanguageRepository.php', + 'SJBR\\StaticInfoTables\\Domain\\Repository\\TerritoryRepository' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Domain/Repository/TerritoryRepository.php', + 'SJBR\\StaticInfoTables\\Hook\\Backend\\Form\\FormDataProvider\\SuggestLabelProcessor' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Hook/Backend/Form/FormDataProvider/SuggestLabelProcessor.php', + 'SJBR\\StaticInfoTables\\Hook\\Backend\\Form\\FormDataProvider\\TcaLabelProcessor' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Hook/Backend/Form/FormDataProvider/TcaLabelProcessor.php', + 'SJBR\\StaticInfoTables\\Hook\\Backend\\Form\\FormDataProvider\\TcaSelectItemsProcessor' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Hook/Backend/Form/FormDataProvider/TcaSelectItemsProcessor.php', + 'SJBR\\StaticInfoTables\\Hook\\Backend\\Form\\Wizard\\SuggestReceiver' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Hook/Backend/Form/Wizard/SuggestReceiver.php', + 'SJBR\\StaticInfoTables\\Hook\\Backend\\Recordlist\\BuildQueryParameters' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Hook/Backend/Recordlist/BuildQueryParameters.php', + 'SJBR\\StaticInfoTables\\Hook\\Backend\\Recordlist\\ModifyQuery' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Hook/Backend/Recordlist/ModifyQuery.php', + 'SJBR\\StaticInfoTables\\Hook\\Core\\DataHandling\\ProcessDataMap' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Hook/Core/DataHandling/ProcessDataMap.php', + 'SJBR\\StaticInfoTables\\PiBaseApi' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/PiBaseApi.php', + 'SJBR\\StaticInfoTables\\Service\\SqlSchemaMigrationService' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Service/SqlSchemaMigrationService.php', + 'SJBR\\StaticInfoTables\\Slot\\Extensionmanager\\AfterExtensionInstall' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Slot/Extensionmanager/AfterExtensionInstall.php', + 'SJBR\\StaticInfoTables\\Utility\\DatabaseUpdateUtility' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Utility/DatabaseUpdateUtility.php', + 'SJBR\\StaticInfoTables\\Utility\\DatabaseUtility' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Utility/DatabaseUtility.php', + 'SJBR\\StaticInfoTables\\Utility\\HtmlElementUtility' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Utility/HtmlElementUtility.php', + 'SJBR\\StaticInfoTables\\Utility\\LocaleUtility' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Utility/LocaleUtility.php', + 'SJBR\\StaticInfoTables\\Utility\\LocalizationUtility' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Utility/LocalizationUtility.php', + 'SJBR\\StaticInfoTables\\Utility\\ModelUtility' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/Utility/ModelUtility.php', + 'SJBR\\StaticInfoTables\\ViewHelpers\\Form\\SelectViewHelper' => $typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes/ViewHelpers/Form/SelectViewHelper.php', + 'medoo' => $typo3InstallDir . 'typo3conf/ext/zuladungsliste/Classes/Utility/medoo.min.php', +); diff --git a/public/typo3conf/autoload/autoload_psr4.php b/public/typo3conf/autoload/autoload_psr4.php new file mode 100644 index 0000000..af4d245 --- /dev/null +++ b/public/typo3conf/autoload/autoload_psr4.php @@ -0,0 +1,13 @@ + array($typo3InstallDir . 'typo3conf/ext/bootstrap_package/Classes'), + 'DieMedialen\\DmDeveloperlog\\' => array($typo3InstallDir . 'typo3conf/ext/dm_developerlog/Classes'), + 'SJBR\\SrFeuserRegister\\' => array($typo3InstallDir . 'typo3conf/ext/sr_feuser_register/Classes'), + 'SJBR\\SrFreecap\\' => array($typo3InstallDir . 'typo3conf/ext/sr_freecap/Classes'), + 'SJBR\\StaticInfoTables\\' => array($typo3InstallDir . 'typo3conf/ext/static_info_tables/Classes'), +); diff --git a/public/typo3conf/ext/bootstrap_package/.php-cs-fixer.dist.php b/public/typo3conf/ext/bootstrap_package/.php-cs-fixer.dist.php new file mode 100644 index 0000000..959c38f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/.php-cs-fixer.dist.php @@ -0,0 +1,74 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + 'header_comment' => [ + 'header' => $header + ], + 'general_phpdoc_annotation_remove' => [ + 'annotations' => [ + 'author' + ] + ], + 'no_leading_import_slash' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_unused_imports' => true, + 'concat_space' => ['spacing' => 'one'], + 'no_whitespace_in_blank_line' => true, + 'ordered_imports' => true, + 'single_quote' => true, + 'no_empty_statement' => true, + 'no_extra_blank_lines' => true, + 'phpdoc_no_package' => true, + 'phpdoc_scalar' => true, + 'no_blank_lines_after_phpdoc' => true, + 'array_syntax' => ['syntax' => 'short'], + 'whitespace_after_comma_in_array' => true, + 'function_typehint_space' => true, + 'single_line_comment_style' => true, + 'no_alias_functions' => true, + 'lowercase_cast' => true, + 'no_leading_namespace_whitespace' => true, + 'native_function_casing' => true, + 'self_accessor' => true, + 'no_short_bool_cast' => true, + 'no_unneeded_control_parentheses' => true + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->exclude('.build') + ->exclude('Build/node_modules') + ->exclude('Contrib') + ->exclude('var') + ->in(__DIR__) + ); diff --git a/public/typo3conf/ext/bootstrap_package/.phplint.yml b/public/typo3conf/ext/bootstrap_package/.phplint.yml new file mode 100644 index 0000000..cc3c4fe --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/.phplint.yml @@ -0,0 +1,7 @@ +path: ./ +jobs: 10 +cache: .phplint.cache +extensions: + - php +exclude: + - .build diff --git a/public/typo3conf/ext/bootstrap_package/CHANGELOG.md b/public/typo3conf/ext/bootstrap_package/CHANGELOG.md new file mode 100644 index 0000000..65e4fdb --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/CHANGELOG.md @@ -0,0 +1,2477 @@ +# 12.0.10 + +## BUGFIX + +- 55483400 [BUGFIX] Make IconWizard compatible with v11 + +## Contributors + +- Benjamin Kott + +# 12.0.9 + +## TASK + +- a3e541d1 [TASK] Improve icon selector performance in backend (#1392) + +## BUGFIX + +- fdab10e2 [BUGFIX] Correct docs for overrideParserVariables + +## Contributors + +- Benjamin Kott + +# 12.0.8 + +## TASK + +- 2d078989 [TASK] Add tests for update scripts (#1388) + +## BUGFIX + +- d43358be [BUGFIX] Only call fetchAllAssociative if its available + +## Contributors + +- Benjamin Kott + +# 12.0.7 + +## BUGFIX + +- 9ea9f265 [BUGFIX] Correct image scaling in thumbnail menus +- c261a730 [BUGFIX] Correct image scaling in card menus +- 87f0457e [BUGFIX] Correct image scaling in card groups +- 5cdfd76b [BUGFIX] Correct image scaling in accordions +- bf98657a [BUGFIX] Correct image scaling in tabs + +## Contributors + +- Benjamin Kott + +# 12.0.6 + +## TASK + +- 7f16644f [TASK] Update actions to v3 +- 22a3a4f6 [TASK] Replace deprecated set-output command (#1213) +- 59d1c325 [TASK] Streamline upgrade wizards (#1210) +- ec4476b6 [TASK] Use public directory for setup instead of web +- ab2d4d8c [TASK] Adapt ddev config for BP_12 +- d2deb08e [TASK] Fix indention + +## BUGFIX + +- c500ed01 [BUGFIX] Add figure tag to external blocks in rte parsing +- e22a400c [BUGFIX] Prevent PHP Warning: Undefined array key (#1208) +- aee78298 [BUGFIX] PHPStan return types (#1199) +- 8e519af9 [BUGFIX] Properly check return type (#1182) +- 7342e2a6 [BUGFIX] Swap caption and title in photoswipe if no title is given (#1181) +- 061a6d84 [BUGFIX] Replace deprecated PHP 8.1 filter FILTER_SANITIZE_STRING + +## Contributors + +- Andreas Fernandez +- Benjamin Kott +- Florian +- Frank Nägler +- Simon Gilli + +# 12.0.5 + +## BREAKING + +- 2532ccc9 [!!!][TASK] Adapt useragent to fetch woff2 - fixes #840 + +## FEATURE + +- 390d91a4 [FEATURE] Use translatable labels for container names and columns (#1110) + +## TASK + +- b03a87eb [TASK] Update frontend dependencies +- 76ced494 [TASK] Remove obsolete labeler config +- a8e72b97 [TASK] Update bootstrap versions to 4.6.1 and 5.1.3 +- 6ff185a7 [TASK] Allow composer plugins +- 32625b2f [TASK] Drop commit message check and labeler to avoid unnessesary long ci runs +- 2532ccc9 [!!!][TASK] Adapt useragent to fetch woff2 - fixes #840 +- eb8826f5 [TASK] Update scssphp to v1.8.1 (#1114) + +## BUGFIX + +- 70ce1396 [BUGFIX] Respect target and add rel in all page template menus +- 57c4987d [BUGFIX] PHPStan issues (#1133) +- 5fbef46e [BUGFIX] Add missing xlarge crop variant - fixes #1088 + +## Contributors + +- Benjamin Kott +- Gilbertsoft +- Sven Jürgens + +# 12.0.4 + +## TASK + +- fa4aa4a1 [TASK] Use @import syntax for TS includes (#1090) +- 33135fc1 [TASK] Require at least v11.5 LTS on the 11 cycle + +## BUGFIX + +- 940986b4 [BUGFIX] Do not call "libxml_disable_entity_loader" in PHP 8 (#1105) +- 84dff11e [BUGFIX] Respect and adjust responsive image configuration for carousel background_image +- d2a44582 [BUGFIX] Get frontend controller from request if available +- 0d8e0f1b [BUGFIX] Use bootstrap 5 styles in RTE (#1091) +- 28dda974 [BUGFIX] Do not pass absolute path to resource factory + +## Contributors + +- Benjamin Kott +- Gilbertsoft +- Patrick Lenk + +# 12.0.3 + +## TASK + +- 13707e54 [TASK] Migrate form definition (#1095) + +## BUGFIX + +- 41718f62 [BUGFIX] BrandingService conditions (#1094) +- add3aeac [BUGFIX] Remove pollution of global scss variables +- c2ea116b [BUGFIX] Ensure accordion elements collapse as intended with bootstrap 5 +- 05ef945f [BUGFIX] Avoid overrides of global scss variables within card-panel comonent +- 576014e7 [BUGFIX] Fix breadcrumb when "breadcrumbExtendedValue" is used + +## Contributors + +- Benjamin Kott +- Gilbertsoft + +# 12.0.2 + +## TASK + +- 151f4877 [TASK] Update frontend dependencies +- 168b6c90 [TASK] Update scssphp to v1.7.0 +- 95ba43c4 [TASK] Update Bug Report template (#1069) +- 6c56d7ba [TASK] Provide frontend build custom commands (#1068) +- 1c4b80a2 [TASK] Exclude submenues from indexing (#1061) +- 3a6f50cd [TASK] correct Photoswipe opening animation (#941) + +## BUGFIX + +- e56f5ec4 [BUGFIX] Add automatic contrast calculations again for backgrounds - fixes #1057 +- 98faa9ad [BUGFIX] Hide header for container elements - fixes #1079 +- 48ec125d [BUGFIX] Ensure spacing for frames is applied when set to none +- 85867a1b [BUGFIX] Missing theme colors (#1067) +- 1511a449 [BUGFIX] Array access warnings in PHP 8 (#1063) +- 7dafab16 [BUGFIX] CGL in CI workflow (#1064) +- 2122e791 [BUGFIX] Docs rendering (#1062) +- 9bc37078 [BUGFIX] Mark menu items correctly as closed - fixes #1052 +- f9fccd09 [BUGFIX] Include correct popper.js version for bootstrap 5 +- faaa75c7 [BUGFIX] Wrong table classes and add missing ones (#927) +- 63667857 [BUGFIX] Preserve custom layout values (#1055) +- 10b2eced [BUGFIX] Add Bootstrap v5 options to Fullscreen and Small carousel (#1053) +- 07bdd774 [BUGFIX] Remove deprecated softref `images` (#1046) +- 42395176 [BUGFIX] Make embedded layouts more strict and reset backgrounds properly + +## Contributors + +- Benjamin Kott +- Gilbertsoft +- Stephan Sellner +- Sven Burkert +- Sven Jürgens + +# 12.0.1 + +## BUGFIX + +- e763705f [BUGFIX] Let image service resolve svgicon - fixes #1042 +- 1e8864b4 [REVERT][BUGFIX] Update doctrine usages (#1037) (#1044) +- c6addb4b [BUGFIX] Add missing embed css to bootstrap 5 (#1043) +- 7345b209 [BUGFIX] Remove external softref to ext:rtehtmlarea (#1039) + +## Contributors + +- Benjamin Kott +- Gilbertsoft + +# 12.0.0 + +## SECURITY + +- de3a568f [SECURITY] Ensure content element subheader is HTML encoded + +## BREAKING + +- 8c63fd58 [!!!][TASK] Add support for Bootstrap v5 (#1016) +- f5657558 [!!!][TASK] Replace fluid pagination widget (#1012) +- e4c07088 [!!!][TASK] Drop webfontloader (#1011) +- 8323a17b [!!!][FEATURE] Introduce embedded frames and improve rendering +- 34a9680b [!!!][TASK] Replace deprecated lastImageInfo access (#1005) +- 82b21786 [!!!][TASK] Remove TYPO3 9.5 support (#979) +- c0ba1c96 [!!!][TASK] Remove InstallService (#977) +- 35fdfd78 [!!!][TASK] Remove bootstrap3 (#826) + +## FEATURE + +- 0e55bdc0 [FEATURE] Improve icon registry (#1038) +- bd1e172d [FEATURE] Add container support (#1035) +- 35fd14b1 [FEATURE] Add tca defaults for imagecol +- ef50a0cb [FEATURE] Make theme colors selectable for carousel items (#1032) +- 1801887d [FEATURE] Extend RTE config for links and lists (#1031) +- dde661e1 [FEATURE] Extend color palette (#1030) +- 5207c194 [FEATURE] Add new DropIns to page before and after +- 8323a17b [!!!][FEATURE] Introduce embedded frames and improve rendering +- 3a809980 [FEATURE] Set font display to swap by default +- cd08510a [FEATURE] Add gallery content block (#765) +- 561c9298 [FEATURE] Add header position for carousel items + +## TASK + +- 317595f4 [TASK] Raise version constraints to support released v11 +- b65e3044 [TASK] Remove workaround for v11 (#1036) +- 2ff1b43a [TASK] Upgrade bootstrap to 5.1 +- 74ba9040 [TASK] Streamline bp icons +- f6d8de81 [TASK] Reduce default size of gallery-gap +- 86b596d0 [TASK] Use fantasticon to build icon font (#1028) +- 0c6d842f [TASK] Allow REVERT key word in commit messages (#1026) +- 8c63fd58 [!!!][TASK] Add support for Bootstrap v5 (#1016) +- 5188f94f [TASK] Upgrade bundled and minimum required version of scssphp/scssphp to ^1.6.0 +- 04efddec [TASK] Remove all showRemovedLocalizationRecords occurrences (#1019) +- f31359d3 [TASK] Use SiteConfiguration for website title +- 357bc410 [TASK] Remove obsolete hammer.js polyfill for swipe gestures on carousel +- 49af9a0f [TASK] Reduce jquery usage on navbar +- 52c99601 [TASK] Remove jquery from lightbox (#1014) +- 4560df58 [TASK] Drop yarn as dependency manager (#1013) +- 48d98cc5 [TASK] Remove jquery from form custom file input +- f5657558 [!!!][TASK] Replace fluid pagination widget (#1012) +- e4c07088 [!!!][TASK] Drop webfontloader (#1011) +- 203668a9 [TASK] Drop feedit +- ae3aced3 [TASK] Disable deployment and publish workflows for forks (#1010) +- fdeaf209 [TASK] Don´t continue on PHPStan errors +- 34a9680b [!!!][TASK] Replace deprecated lastImageInfo access (#1005) +- 4ccae72b [TASK] PHPStan clean ups (#1004) +- 48ae9da1 [TASK] Allow tests to pass for phpstan and build result for now (#1003) +- 1f753fb2 [TASK] Add phpstan +- 966b8f9d [TASK] Update scssphp/scssphp +- b442b35b [TASK] Update phplint +- 247cddab [TASK] Update php-cs-fixer +- 3df72439 [TASK] Upgrade frontend dependencies +- 36f60ba0 [TASK] Setup mysql server in docker container +- d2bfa0a9 [TASK] Update ddev config +- 31b8a64f [TASK] Upgrade dependencies +- 511db515 [TASK] Upgrade ddev config +- 76cec4ec [TASK] Remove yarn ddev wrapper +- f1c86d8f [TASK] Add extension-key to demo package +- f4f6ad21 [TASK] Enable deployment again (#985) +- c703ad7b [TASK] Replace TYPO3_MODE and TYPO3_REQUESTTYPE (#984) +- 3f8e38a6 [TASK] Migrate signals to PSR-14 events (#983) +- b0e10f5e [TASK] Update branch-alias and package sorting (#982) +- dbabe541 [TASK] Remove TYPO3 9 from CI (#981) +- 82b21786 [!!!][TASK] Remove TYPO3 9.5 support (#979) +- c0ba1c96 [!!!][TASK] Remove InstallService (#977) +- 35fdfd78 [!!!][TASK] Remove bootstrap3 (#826) +- 6d4fd9dd [TASK] Allow installation with testing framework ^6.4 +- db0ad783 [TASK] Update bundled scssphp to 1.4.1 +- db8fc926 [TASK] Let all actions run +- c2da8dcf [TASK] Remove travis and scrutinizer from readme +- a38ad36c [TASK] drop scrutinizer +- f9201716 [TASK] Drop travis ci +- 4c546808 [TASK] Update actions +- ab622fe4 [TASK] Update dependencies +- ed1f28e9 [TASK] Remove tempfs for dev environment +- f77265bb [TASK] Add publishing TER workflow +- 77488690 [TASK] Allow installation on TYPO3 v11 for development purposes +- d5e9632b [TASK] Update DDEV configuration (#962) +- 8a1beef2 [TASK] WSL2 support (#961) +- 209753a8 [TASK] Reintroduce prefer-stable (#960) +- 34fc1bd9 [TASK] Bump labeler to v3 and enable sync-labels (#952) +- f7b08da6 [TASK] Update Pull Request template (#950) +- 26d5ae30 [TASK] Update pull request types for Check PR workflow (#949) +- 240e2dfb [TASK] Replace GeneralUtility::getUrl by RequestFactory (#910) +- c2b2918b [TASK] Migrate to afterExtensionInstall signal (#909) +- d5af9cfd [TASK] Update README.rst (#900) +- 000bc1bc [TASK] Add workspaces as dev dependency +- bf94f47b [TASK] Bump actions/checkout to v2 +- f13a42dd [TASK] Move path repository for testing to Tests (#882) +- 4527808a [TASK] Downgrade to labeler v2 (#881) +- 85b0dcae [TASK] Use v3-preview labeler (#880) +- c3dfcf41 [TASK] Add functional test setup (#879) +- 4651154e [TASK] Add typo3fluid/fluid to composer dependencies (#876) +- ecdb0252 [TASK] Update frontend build dependencies +- 9175ab4a [TASK] Update ddev to 1.14.0 +- becff742 [TASK] Add missing extension key (#874) +- aca79603 [TASK] Bump DDEV to 1.13.1 (#863) +- 47b2a3da [TASK] Add PHP 7.4 to workflow (#855) +- 477c7c4e [TASK] Ignore false positives in extension scanner (#854) +- 051f3f0c [TASK] Update DDEV to 1.13.0 (#853) +- 2deb9684 [TASK] Slim down documentation configuration +- b5a591b2 [TASK] Remove path in ExtensionConfiguration::set call (#836) +- 7f5ffb1f [TASK] Update bootstrap 4.1 constants (#831) +- 8dc2ab29 [TASK] Remove scssphp/scssphp conflict (#832) +- 5e2881c2 [TASK] Add check commit message workflow for pull requests (#828) +- 6f30d904 [TASK] Add Github workflow badge (#824) +- 255407cb [TASK] Update bootstrap.stickyheader.min.js (#823) +- c0a3d485 [TASK] Rename DDEV build command to yarn (#821) +- f41102e0 [TASK] Bump modernizr to version 3.8.0 (#820) +- 689784dc [TASK] Bump grunt-stylelint to version 0.11.1 (#819) +- 41475573 [TASK] Bump grunt-sass to version 3.1.0 (#818) +- 8bce4872 [TASK] Bump bootstrap 4 to version 4.4.1 (#817) +- 861b43bc [TASK] Bump popperjs to version 1.16.0 (#816) +- be48491d [TASK] Add lowlevel module as dev dependency for debugging (#810) +- be12760a [TASK] Configure markdown lint (#811) +- 2473a78e [TASK] Add info module as dev dependency for debugging (#809) +- 00f77921 [TASK] Update labeler to version 2.1.0 (#812) +- 2d49db12 [TASK] Introduce DDEV build script (#808) +- 69843d4f [TASK] Update ddev to 1.12.0 (#783) +- b18d7755 [TASK] Change build order (#793) +- 76061f01 [TASK] Automatic label dependency changes (#796) +- d863cc7d [TASK] Remove deprecated translateToHidden option (#800) +- b9b6ba3c [TASK] Update issue and pull request templates (#795) +- 9d444b13 [TASK] Remove double inclusion of content elements (#792) +- 71c4da3f [TASK] Update build dependencies (#790) +- c6c7ea69 [TASK] Add DDEV custom command description (#782) +- 8d9143e4 [TASK] Fix typo in image variants view helper (#769) +- d8799321 [TASK] Update bundled scssphp/scssphp version to 1.0.4 +- d9a9ac48 [TASK] Add width, height and intrinsicsize to images +- 770fc438 [TASK] Remove update build script +- 88ca8d91 [TASK] Extend CI to 10.x and master (#755) +- 7114b00f [TASK] Make typo3/cms-* requirements less strict +- 6e8ddee7 [TASK] Update ddev to 1.11.1 +- 87222fc7 [TASK] Use github actions for ci (#741) +- 2a294542 [TASK] Disable xdebug by default for dev environment +- 5a82470b [TASK] Update ddev to 1.10.2 +- 2847fd3e [TASK] Streamline database field types +- ac916e7b [TASK] Enable tmpfs for dev environment + +## BUGFIX + +- 0398bebb [BUGFIX] Add space between gallery and navigaiton +- de2c69c2 [BUGFIX] Update doctrine usages (#1037) +- 8c4e4cab [BUGFIX] Correct image calculation +- 34fb30af [BUGFIX] Streamline card paddings +- a6aa8244 [BUGFIX] Ignore phpstan error for dom_import_simplexml (#1033) +- f3959528 [BUGFIX] Update icon css (#1034) +- 0ecbeb8c [BUGFIX] Ensure correct correct scaling of special links +- df42070f [BUGFIX] Remove obsolete margin from gallery +- 4c514238 [BUGFIX] SassError: compound selectors may no longer be extended. #1023 (#1029) +- 18af0848 [REVERT][BUGFIX] SassError: compound selectors may no longer be extended. Consider `@extend .form-control, .is-invalid` instead. https://sass-lang.com/documentation/breaking-changes/extend-compound (#1023) (#1025) +- 834a1576 [BUGFIX] Remove wrong !default from monospace (#1024) +- d8350fef [BUGFIX] SassError: compound selectors may no longer be extended. Consider `@extend .form-control, .is-invalid` instead. https://sass-lang.com/documentation/breaking-changes/extend-compound (#1023) +- fcbcbe5e [BUGFIX] Workaround core issue #94422 in ci (#1020) +- b14e4adf [BUGFIX] Migrate phpunit functional test configuration +- 7174037b [BUGFIX] Correct default image height calculation +- 28446c5a [BUGFIX] Correct frame collapsing for no backgrounds +- 7b522d97 [BUGFIX] Restore grouping in ctype selector +- 238f48e0 [BUGFIX] Only call getIcons if value is not null +- bd81170d [BUGFIX] Correct label for processing css files +- b5107f2a [BUGFIX] Adapt to changes in fluid contexts between v10 and v11 +- abc20109 [BUGFIX] Add missing spacers for frames aagain +- b73c95c1 [BUGFIX] Minor fixes to frame layout +- 78a2bd94 [BUGFIX] Revert unintended revert of TYPO3 constant (#1008) +- 34ef3de5 [BUGFIX] Respect gallery size settings instead of beeing smart +- e4623ce3 [BUGFIX] Correct extension manager dependencies to match composer requirements +- 1a951398 [BUGFIX] Update form definition (#980) +- 1238613b [BUGFIX] Apply latest scssphp changes to import behavior (#948) +- 4543ad16 [BUGFIX] Remove minimum stability dev from composer.json (#936) +- 1c590d82 Revert "[BUGFIX] Use image vh for image types to enable thumbnails for non images like PDF files (#913)" (#914) +- 826f6beb [BUGFIX] Use image vh for image types to enable thumbnails for non images like PDF files (#913) +- d5af3aac [BUGFIX] Introduce table-condensed class again for compatibility (#908) +- 6c1e3da1 [BUGFIX] Missing body class for current language (#906) +- 41879dba [BUGFIX] Fix paths in url() statements (#868) +- 063af998 [BUGFIX] Do not force a specific RTE configuration for content elements +- b5c83cfc [BUGFIX] Change controllerActionName in extbase configuration of gallery (#890) +- 6cded416 [BUGFIX] Adapt server ip address for deployment +- 245c8f89 [BUGFIX] Correct path to temp directory in compile service (#884) +- 1e4d71ed [BUGFIX] Resolve SCSS files correctly when using symlinked paths (#866) +- cb712010 [BUGFIX] Correct test location +- 6b3237af [BUGFIX] Add missing extension dependencies (#871) +- 5b40d7ab [BUGFIX] Add missing filter extension dependency (#870) +- 50f45603 [BUGFIX] Change TCA escaping for database compatibility (#865) +- b9124c3b [BUGFIX] Ensure correct field casing and escaping in TCA for database compatibility (#862) +- b9ac3bb0 [BUGFIX] Update dependencies and rebuild assets +- 453f56e1 [BUGFIX] Add compiled css +- 5da26ce3 [BUGFIX] Restrict fixed menu overflows to mobile resolutions - fixes #837 +- 7d6597ab [BUGFIX] Hide link text for carousel bg image +- 631161b7 [BUGFIX] Ensure elements exist before accessing +- ed586c88 [BUGFIX] Conflict scssphp/scssphp 1.0.4 and 1.0.5 for composer installs (#764) +- 9c26f626 [BUGFIX] Escape special chars in bootstrap.smoothscroll.js (#786) +- da4d4436 [BUGFIX] Use correct category for texticon constants (#781) +- 4c0bff4d [BUGFIX] Resolve plain bootstrap 4 accordion conflicts (#775) +- 4850c2db [BUGFIX] Ensure frame collapsing for node-sass compilations on theme +- b00bda82 [BUGFIX] Add missing compiled and minified assets for for gallery +- 124b4fad [BUGFIX] Include autoloader for parser class check (#776) +- db2c2487 [BUGFIX] Correct pseudo controller for pagination +- b448c076 [BUGFIX] Force node version during build (#771) +- cc8d51fe [BUGFIX] Disable RTE for carousel type html - fixes #770 +- 740d9fe2 [BUGFIX] Correct feature flag evaluation +- 50110eee [BUGFIX] Respect sorting in section menus +- 94a14e8b [BUGFIX] Set default header position for carousel items +- bbe6f235 [BUGFIX] Add check for cached file in GoogleFont Service again +- 2ace8816 [BUGFIX] Switch GoogleFont Cache to woff for broader support - fixes #751 +- b4e04b0c [BUGFIX] Keep viewbox attribute for photoswipe skin +- a4b9e1bb [BUGFIX] Restore missing viewBox attribute for glyphicon icons +- 089ff319 [BUGFIX] Use correct constant for texticon width (#736) +- a4e0276f [BUGFIX] Remove invalid date default value for timeline item +- 42386ff2 [BUGFIX] Ensure timeline item can be translated +- 96aaa454 [BUGFIX] Remove default alignment of carousel header item +- ab6a7d74 [BUGFIX] Correct wrapping for icongroup with less + +## MISC + +- 3c501e44 [DOCS] Fix some typos (#1001) +- bd79929d [DOCS] Fix bullet lists (#1000) +- bc68d846 [DOCS] Fix typo (#998) +- 6d0a6581 [DOCS] Add render-docs helpers (#901) +- 4bca8502 [DOCS] Fix code blocks (#825) +- 279c9761 [DOCS] Add documentation hints to README (#802) +- 016bf027 Fix Header on PageLoad if scrolled (#784) +- 2058d12a [DOCS] Add Image Rendering (#767) +- cde513ac [DOCS] Fix duplicated label (#772) +- fae0ae81 [REVERT] "Update _texticon.scss" +- 8015f856 Update _texticon.scss + +## Contributors + +- Andrea Moroni +- Andreas Fernandez +- Benjamin Kott +- Daniel Haupt +- David Zach +- Franz Holzinger +- Gilbertsoft +- Helmut Hummel +- MartinH0 +- Nikita Hovratov +- Oliver Hader +- Son Tung Ngo +- Tomas Norre Mikkelsen +- jonaseberle + +# 11.0.0 + +## BREAKING + +- 1dc73ff4 [!!!][TASK] Drop seo related meta tag settings +- b47e8480 [!!!][TASK] Section Menu hides single page header and empty entries (#707) +- e4a6434d [!!!][FEATURE] Make timeline more flexible +- 0f449765 [!!!][FEATURE] Enable time settings for timeline +- 207de1cf [!!!][TASK] Drop jquery dependency from cookie consent wrapper +- a18c46d4 [!!!][TASK] Drop data relation viewhelper +- d3fcd7d3 [!!!][TASK] Remove fallback for extension configuration +- 6989ed65 [!!!][TASK] Drop automatic language menu polyfill + +## FEATURE + +- 2a7e5299 [FEATURE] Introduce text carousel item +- 3049b345 [FEATURE] Enable rich text editor for call to action carousel item +- 76d883a4 [FEATURE] Make media renderer options configurable +- 04225dc1 [FEATURE] Make header display date format configurable +- d05ca34f [FEATURE] Add make icon position in icongroup configurable +- 77549d30 [FEATURE] Allow processing of configured file types (#709) +- e4a6434d [!!!][FEATURE] Make timeline more flexible +- 57c71ddc [FEATURE] Make icon spacing configurable in timeline +- 0039dc64 [FEATURE] Add variables to configure timeline headline and date size +- 0f449765 [!!!][FEATURE] Enable time settings for timeline +- b8f7d912 [FEATURE] Add support for highres images (#678) +- 13f70718 [FEATURE] Support class attribute in inline svg viewhelper +- eb1508d1 [FEATURE] Add rss social media icon - fixes #629 +- 9fcf8dec [FEATURE] Add vk social media icon - fixes #651 +- 159dda4d [FEATURE] Allow content slide configuration for all layouts and colPos +- f7672c3c [FEATURE] Make icongroup more usable by allowing to change visual behaviour +- a530ee95 [FEATURE] Enable links in icon group +- 4a128363 [FEATURE] Collapsible in accordion should scroll to the top of its contents (#589) + +## TASK + +- ff143de6 [TASK] Add linter configuration for less files +- 1dc73ff4 [!!!][TASK] Drop seo related meta tag settings +- a7da4e2f [TASK] Remove obsolete useCacheHash option for pagebrowser +- 14b7e8da [TASK] Add stylelint for scss linting (#711) +- ab93487c [TASK] Mark TYPO3 v10.0.0 as compatible +- 7fb656dc [TASK] Add dependency to scssphp/scssphp and update bundled code +- e7a0b2bc [TASK] Configure app-dir +- 4d196f02 [TASK] Set loading attribute to lazy for images +- 6c69d817 [TASK] Optimize cardgroup and menus +- 1a51d24e [TASK] Bump stringstream from 0.0.5 to 0.0.6 (#713) +- d786efcc [TASK] Bump lodash.mergewith from 4.6.1 to 4.6.2 (#730) +- 41dc8da7 [TASK] Add FUNDING.yml +- 48b881ae [TASK] Bumb bootstrap3 to 3.4.1 +- cefce3a3 [TASK] Bumb popperjs to 1.15.0 +- eb3ce179 [TASK] Update slack register link (#722) +- e1ec2e40 [TASK] Bumb cookieconsent to 3.1.1 +- 8b073ba2 [TASK] Bumb jQuery to 3.4.1 +- f84b1a3d [TASK] Update ddev to 1.9.1 +- b47e8480 [!!!][TASK] Section Menu hides single page header and empty entries (#707) +- 08a4487f [TASK] Update ddev to 1.8.0 +- 5c4ed238 [TASK] Bump tar from 2.2.1 to 2.2.2 (#694) +- c063b54e [TASK] Bump fstream from 1.0.11 to 1.0.12 (#700) +- 97d9da82 [TASK] Bump sshpk from 1.13.1 to 1.16.1 (#702) +- 1b81159b [TASK] Update ddev to 1.7.1 +- aa76461f [TASK] Disable deploy stage on forks +- 292a489b [TASK] Extract cookie consent from main setup and constants +- f4f6815f [TASK] Add watch task to package.json +- 207de1cf [!!!][TASK] Drop jquery dependency from cookie consent wrapper +- 5c881c96 [TASK] Use file objects for logo +- 386ca145 [TASK] Cleanup svg viewhelper +- e632786c [TASK] Add cgl command to composer.json +- e46a2ba2 [TASK] Change build order +- 75941808 [TASK] Optimize all SVGs +- d252cb09 [TASK] Update build dependencies +- df9f64f2 [TASK] Remove unused image lazyload css +- 8c0b16d7 [TASK] Expose grunt build tasks to yarn +- 625902bf [TASK] Remove changelog from documentation and refer to release notes on github +- 9fe82881 [TASK] Use bk2k/extension-helper for release support +- 991f2d40 [TASK] Enable xdebug for development setup +- a8f15484 [TASK] Require seo extension +- 0e4f4438 [TASK] Update modernizr to 3.7.0 +- 292ef67a [TASK] Update photoswipe to 4.1.3 +- 7ab26105 [TASK] Require supported core extensions in development mode +- 849b941b [TASK] Update to bootstrap 4.3.1 +- 15957604 [TASK] Update scssphp and use fork to apply patches. +- c1f4cb89 [TASK] Ensure scss and lf files are checked out with lf +- c382b4fe [TASK] Add ddev development configuration +- fbc40d09 [TASK] Strip pagets_ from pagelayout variable and set default if empty +- 95a30c73 [TASK] Remove typolinkEnableLinksAcrossDomains since its obsolete with siteconfiguration +- 14115584 [TASK] Enable css und js compression by default +- c1a5d22f [TASK] Remove obsolete realurl setting +- a18c46d4 [!!!][TASK] Drop data relation viewhelper +- f980445e [TASK] Cleanup extension configuration +- 3267945d [TASK] Include seo extension by default if installed +- fd28722d [TASK] Use symfony expression language for typoscript conditions +- 962a84c6 [TASK] Remove legacy config settings from documentation +- a788f76a [TASK] Remove deprecated TCA options - fixes #543 +- 68d7bb12 [TASK] Use UpgradeWizardInterface in upgrade wizards +- b33103f2 [TASK] Drop usage of PATH_site +- d3fcd7d3 [!!!][TASK] Remove fallback for extension configuration +- 6989ed65 [!!!][TASK] Drop automatic language menu polyfill +- 6c8395e5 [TASK] Adjust to use Core's FlexFormService directly +- 9ea0cb13 [TASK] Adjust to use Fluid's AbstractViewHelper directly +- ba8dbc33 [TASK] Adjust for removed code in TemplateService +- 9f55be45 [TASK] Remove PHP 7.3 from travis until php-cs-fixer is compatible +- 9abfd3b5 [TASK] Update travis configuration +- 6ee8af67 [TASK] Adjust version constraints for TYPO3 v10 +- 94b5e1be [TASK] Add config directory to demo site deployment +- ac6541ab [TASK] Update bootstrap to 4.2.1 - fixes #627 +- e50ea553 [TASK] Add vscode to gitignore +- 3ed67ceb [TASK] Update npm dependencies +- 030e972d [TASK] Update Bootstrap 3.x to 3.4.0 +- 270616e7 [TASK] Update leafo/scssphp to v0.7.7 - fixes #612 +- 17072560 [TASK] Name hooks and always register them, regardless of context +- b3bfa57a [TASK] Add option to disable the web font loader +- a9890dca [TASK] Mention site introduction repository in readme +- 88492bc5 [TASK] Cleanup issue templates +- 6983c7aa [TASK] Update issue template (#599) +- 93731a7c [TASK] Include TYPO3 v9.5 in pull request template +- 579da24b [TASK] Include TYPO3 v9.5 in issue template +- 078950ef [TASK] Add minimum scale to viewport configuration +- f69e9644 [TASK] Use ip instead of url for deployment travis ssh known hosts +- 67ab683d [TASK] Remove install notification for unsupported webservers - fixes #562 +- 7f0ba945 [TASK] Add forgotten textpic and textmedia alignment + +## BUGFIX + +- bcf69eb5 [BUGFIX] Make UpgradeWizards repeatable (#720) +- f348098c [BUGFIX] Add missing aria-label translations for breadcrumb and nav toggle +- 76e8add0 [BUGFIX] Add missing space correction for icongroup in scss +- c37061e1 [BUGFIX] Correct false typoscript default for 'custom-select-indicator' (#724) +- ba633faf [BUGFIX] Avoid spooky random fluid compilation errors +- 867b2927 [BUGFIX] Avoid card-header link color inheritance +- c9d4862f [BUGFIX] Remove travis deploy stage for pull requests (#710) +- 538d3a7d [BUGFIX] Add remove obsolete comma +- 0fffbbd1 [BUGFIX] Add missing default parameter for icongroup +- d0efeeb0 [BUGFIX] Add fontloader css and js only to header if content exists - fixes #703 +- 24da8939 [BUGFIX] Make cookieconsent variables overwriteable - fixes #704 +- 9280a6df [BUGFIX] Add missing description field to timeline images +- eaf0c40f [BUGFIX] Correct icon placement in navbar +- 201969b7 [BUGFIX] Correct variable spelling error and set variables of timeline to default +- 961ebcc6 [BUGFIX] Use full datetime format for timeline items +- e4b9f5ba [BUGFIX] $_EXTKEY is not available anymore in v10 +- 7f2225c9 [BUGFIX] Respect target option for title link in card-group +- 132a5d32 [BUGFIX] Respect target option for links in card-group +- 95d45cf5 [BUGFIX] Restore IE11 compatibility for cookie consent +- 82e8fd19 [BUGFIX] Prevent collapsing of frames - fixes #618 +- 571dbf88 [BUGFIX] Add missing crop variants to carousel image - fixes #665 +- 55a6eb9d [BUGFIX] Disable rendering of footer-section-meta if all containing elements are disabled - fixes #657 +- 716f8074 [BUGFIX] Remove obsolete/invalid replacements in composer.json +- 0f4a2633 [BUGFIX] Correct comment formatting +- 24e38e18 [BUGFIX] Use lf instead of crlf in tab svg +- 25af394a [BUGFIX] htaccess does not allow pages that end with "rc" - fixes #652 +- 26b2fa91 [BUGFIX] Use error object in form field template (#641) +- 15b6626a [BUGFIX] Ensure type safety for ViewHelper calling ImageService (#640) +- 409ddd4d [BUGFIX] Ensure type safety for ViewHelper calling ImageService (#639) +- ab754c69 [BUGFIX] Render data-interval only on carousel if value exists +- bd8169c5 [BUGFIX] Do not process svg file if it does not contain content +- fcd180a0 [BUGFIX] Add table context to typoscriptObjectPath for tt_content rendering +- e04fd7c7 [BUGFIX] ce uploads accepts sorting direction (#630) +- a459c577 [BUGFIX] Correct spelling error in install service +- 39f19fcb [BUGFIX] Remove empty line to match cgl +- de164cea [BUGFIX] Enable basic tests again (#628) +- 10295654 [BUGFIX] Correct dependencies in composer.json +- 2bd79cdd [BUGFIX] Show caption in lightbox when title is empty - fixes #626 +- ed1c0fb0 [BUGFIX] Minimize word breaks in figure captions (#621) +- 9b7c43f0 [BUGFIX] Typo: 'boostrap' should be 'bootstrap' (#625) +- 1cf21edc [BUGFIX] Do not overwrite button stylings in footer sections +- 4e532573 [BUGFIX] Make Less Parser PHP 7.3 compatible (#617) +- e912374b [BUGFIX] Ensure parallax effect works across all desktop browsers - fixes #610 +- 8f8c0c80 [BUGFIX] Keep page accessible on early javascript errors +- 021a9a5f [BUGFIX] Catch exception in TYPO3 8.7 backend on database configuration missmatch +- a2d31480 [BUGFIX] Minor fixes to wording - fixes #606 +- 465f5e1e [BUGFIX] Avoid update problems and always include sql adjustments for sys_language +- bb7f3a8d [BUGFIX] Move parsefunc and dynamic content to content rendering definition +- 6cf28f73 [BUGFIX] Use typolink instead of page viewhelper for wizard fields +- dcbc912b [BUGFIX] Do not use rem in bootstrap 3 context - part 2 +- 4ebffc55 [BUGFIX] Do not use rem in bootstrap 3 context +- f21b759b [BUGFIX] Make standalone element configuration availabe as rendering template +- 91a1b681 [BUGFIX] Remove obsolete unsetting of the list content element for plugins +- 4c9fd781 [BUGFIX] Correct path in comment to bootstrap resource files - fixes #590 +- c0ed7e59 [BUGFIX] Respect title configuration in menu card and menu thumbnail elements - fixes #591 +- 1325f3e1 [BUGFIX] Streamline file property access to also lead sys_file data - #578 +- 535596db [BUGFIX] Add fallback handling for unsupported pointer events in safari - #571 +- 6ed0e904 [BUGFIX] Correct styling of accordion - fixes #579 +- a301039c [BUGFIX] Ensure element browser links working in carousel - fixes #575 +- f0df62c3 [BUGFIX] Adjust comment in ext_tables.php +- 166a63d1 [BUGFIX] Fix typo in comment (#580) +- 4837b063 [BUGFIX] Ensure photoswipe scss vars can be adjusted +- ced0fd77 [BUGFIX] Adapt navigation documentation for TypoScript changes since v9 (#567) +- 72427d02 [BUGFIX] Correct placement of main navigation dropdowns on small viewports - fixes #561, #565 +- 2d6754fc [BUGFIX] Respect overrides for enable-rounded scss variable - #558 +- 6c8a631a [BUGFIX] Correct TCA for carousel small (#557) +- d378b0ab [BUGFIX] use correct default value for texticon icon type (#559) +- 4d23a561 [BUGFIX] Correct link color bubbling for sections in bootstrap 4 +- 8ab40f07 [BUGFIX] Prevent color bubbling for cards +- ee8a02b3 [BUGFIX] Correct primary label in bs4 typoscript constants (#554) + +## MISC + +- 63029706 Update issue templates + +## Contributors + +- Anja +- Benjamin Kott +- Charles Coleman +- Christian Kuhn +- Dennis Metz +- Gilbertsoft +- Jacob Dreesen +- Oliver Hader +- Patrick Lenk +- Ralf Merz +- Seb Red +- Stephan Großberndt +- Susi +- Sven Burkert +- cristianbuja +- dependabot[bot] +- dependabot[bot] +- eckard gehrke +- florian-nolte +- jazzica +- jokumer +- wow-solution + +# 10.0.0 + +## BREAKING + +- 6dee2d12 [!!!][FEATURE] Use bootstrap 4 the default frontend framework +- 3f837892 [!!!][TASK] Use dedicated thumbnail field for card menu thumbnails +- c3ad7208 [!!!][TASK] Drop signal to modify less settings +- 5331a4c9 [!!!][FEATURE] Provide new design for thumbnail menu content element +- ea583f11 [!!!][TASK] Use dedicated thumbnail field for thumbnail menu content element +- c9e9a12f [!!!][FEATURE] Allow multiple icon sources for text and icon - fixes #504 +- c49ff60f [!!!][TASK] Ensure classes and ids on template areas are unique +- 14584e13 [!!!][TASK] Use .form.yaml instead of .yaml +- a8381110 [!!!][TASK] Add google webfont support for bs4 and add option to disable them +- 2a69a265 [!!!][TASK] Move navigation constants to dedicated namespace +- 67a16bfb [!!!][TASK] Enable css und js concatenation by default +- 0d35fdcb [!!!][FEATURE] Improve responsive image rendering (#517) +- 7adb559a [!!!][TASK] Move footer column rendering to page templates +- 0a67f114 [!!!][TASK] Drop clean backendlayout in favor of simple +- 8b36dea0 [!!!][TASK] Move border column rendering to new section above breadcrumb +- 92ad8d7c [!!!][TASK] Migrate frame classes well and jumbotron to background color classes +- 0603d551 [!!!][TASK] Make mainnavigation compatible with bs3 and bs4 +- 6495106d [!!!][TASK] Use theme constants instead of settings +- 367bce19 [!!!][TASK] Drop show footer option + +## FEATURE + +- 6dee2d12 [!!!][FEATURE] Use bootstrap 4 the default frontend framework +- 72e7d85a [FEATURE] Enable responsive images for carousel item text and image - #552 +- 73610170 [FEATURE] Enable responsive images for carousel item image - #552 +- bca28395 [FEATURE] Enable responsive images for carousel backgrounds - #552 +- 01c43298 [FEATURE] Enable responsive images for content element background images - #552 +- 13ce83b6 [FEATURE] Enable responsive images for timeline - #552 +- a477eab3 [FEATURE] Enable responsive images for card menu +- d4a8579f [FEATURE] Make columns and alignment of card menu configurable +- 76306b15 [FEATURE] Enable responsive images for tab items +- e2c66719 [FEATURE] Enable crop variants for tab items +- ec36d86d [FEATURE] Enable columns and image zoom for tab items +- 00bb80da [FEATURE] Allow multiple assets rendered in tab item +- bf3712aa [FEATURE] Add additional media positions to tab content element +- 26d4df87 [FEATURE] Enable crop variants for carousel items +- 269cf956 [FEATURE] Enable responsive images for accordion items #552 +- 0dcfc49d [FEATURE] Enable columns and image zoom for accordion items +- 2f068bfb [FEATURE] Allow multiple assets rendered in accordion item +- 2b516cbd [FEATURE] Enable more image positions for accordion content element +- 5b2a6e52 [FEATURE] Add gutter support for image variants utility +- 5331a4c9 [!!!][FEATURE] Provide new design for thumbnail menu content element +- 66bb5d91 [FEATURE] Add dedicated thumbnail fied to pages +- 7dad8771 [FEATURE] Add card group content element +- b56137c6 [FEATURE] Add trim viewhelper +- c9e9a12f [!!!][FEATURE] Allow multiple icon sources for text and icon - fixes #504 +- 1b00a01e [FEATURE] Add more content positions to existing layouts +- 0cf36666 [FEATURE] Add static file processor +- 2f322aec [FEATURE] Add DropIn locations to page footer +- b43d641f [FEATURE] Make frame inner and outer spacing configurable +- f089fcac [FEATURE] Add secondary colors and introduce outline buttons +- 1eb026fd [FEATURE] Add folder support for textpic content element +- 394cfce7 [FEATURE] Add text indention plugin to ckeditor +- 426fb781 [FEATURE] Add options to disable icon rendering in main and subnavigation +- 1a85bb06 [FEATURE] Add optional nav icon rendering to card menu +- 57b7af70 [FEATURE] Add css columns to ckeditor - fixes #386 #387 +- f5c34ea2 [FEATURE] Add background image effects to content elements and carousel +- 6bd31e52 [FEATURE] Add src support for inline svg viewhelper +- 043e18c1 [FEATURE] Add content element to render csv files +- 42ac9416 [FEATURE] Add navigation icon support in dropdown +- 0d35fdcb [!!!][FEATURE] Improve responsive image rendering (#517) +- 873cfd19 [FEATURE] Add automatic local google font cache (#522) +- f5d2b862 [FEATURE] Add typoscript condition to check typo3 core version +- c00e337b [FEATURE] Add popup close and open events to cookieconsent - fixes (#526) +- 4c0eb29b [FEATURE] Add support for folders in image and media element +- 5333b3bb [FEATURE] Add data processor to filter files by extension +- 5acd6904 [FEATURE] Make lightbox max image dimensions configurable +- cf9df4d1 [FEATURE] Automatic language menus and configuration for TYPO3 8.7 and >= 9.3 (#511) +- 9d72dbde [FEATURE] Add placeholder for google analytics opt-out / opt-in +- 408d9aef [FEATURE] Introduce template blocks +- fcebc2ac [FEATURE] Add cookieconsent +- b4780c2d [FEATURE] Add additional header and subheader classes for carousel items +- 49566185 [FEATURE] Make timeline sorting direction adjustable +- b211afc1 [FEATURE] Add timeline content element +- 6a59f738 [FEATURE] Add drop-in support for main navigation +- c9d9b25f [FEATURE] Add border column to all simple layouts - fixes #235 +- bd4ef154 [FEATURE] Allow navigation icons in breadcrumb +- b26225c9 [FEATURE] Add call to action carousel item +- eb0b5ddc [FEATURE] Add ckeditor plugin to insert address +- a01e493d [FEATURE] Add social links content element +- 983f1692 [FEATURE] Add simple backendlayout without container +- 4ceaa7b1 [FEATURE] Provide form styling for bs3 and bs4 and add basic contact form +- f3cfc372 [FEATURE] Add typoscript constant viewhelper +- 03c1bde0 [FEATURE] Add lowercase dashed formatting viewhelper +- b673ffbb [FEATURE] Allow to set width and height to inline svgs +- 567ac5f6 [FEATURE] Add anchor classes to linkbrowser +- e1a612ff [FEATURE] Add icon group content element +- 44d2562b [FEATURE] Add viewhelper to render inline svgs +- b9425dde [FEATURE] Add card menu +- cb2d6cae [FEATURE] Add social media channels to page footer +- c5ce95f8 [FEATURE] Add processor to make typoscript constants available in templates +- 744d2066 [FEATURE] Add bootstrap 4 sources +- 50a88494 [FEATURE] Load webfonts via fontloader to avoid blocking rendering - fixes #491 +- b725c3b9 [FEATURE] Enable scss and less processing for includeCSSLibs +- e0e487da [FEATURE] Introduce new parser for scss css files + +## TASK + +- c8e036f6 [TASK] Enable ckeditor autolink plugin per default +- 3871e4df [TASK] Add rel noopener to links in default copyright text +- 3a3699ee [TASK] Update webserver configs to mach typo3 v9 defaults +- b0b29c01 [TASK] Optimize modernizr footprint +- 6e9fcbfd [TASK] Update frontend build chain to latest versions +- 2cb81a65 [TASK] Update grunt-webfont to 1.7.2 and rebuild assets +- 2efd4f31 [TASK] Update popper.js to 1.14.4 +- a6cf9707 [TASK] Update cookieconsent to 3.1.0 +- 4b3c8fb4 [TASK] Optimize backgroundimages to avoid frame overflows +- 5a00518c [TASK] Add TypoScript variables for Bootstrap 4 (#500) +- 89239ace [TASK] Streamline database definition with TYPO3 v9 +- 210ecacb [TASK] Use rel noopener for social links +- 11c38ed3 [TASK] Streamline placement of background image templates +- 3e189728 [TASK] Add tests for ExternalMediaUtility +- 3f837892 [!!!][TASK] Use dedicated thumbnail field for card menu thumbnails +- 24cb62c1 [TASK] Code cleanups +- 541e6aaf [TASK] Streamline less and scss caching +- c3ad7208 [!!!][TASK] Drop signal to modify less settings +- a3dbc22f [TASK] Prefer wording gutters over gutter to show that this are multiple +- 0260c4b4 [TASK] Optimize CSS compiler code and caches (#550) +- 4d19411a [TASK] Harden image variants utility +- c4281da8 [TASK] Add first unit tests for image variants utility +- 2066dd13 [TASK] Optimize responsive image rendering of thumbnail menu +- ea583f11 [!!!][TASK] Use dedicated thumbnail field for thumbnail menu content element +- 31271643 [TASK] Improve config scoping of textpic and textmedia responsive image settings +- 892055b8 [TASK] Streamline card link classes with rte buttons +- d75bbcaf [TASK] Remove misleading doccomments in viewhelpers +- 3cf162e0 [TASK] Slightly improve gallery image handling +- c9abe8ec [TASK] Simplify Icon Group handling +- 4a6b07e5 [TASK] Cleanup install service +- 21d424bf [TASK] Make list-inline compatible +- fd09a19c [TASK] Use typo3 v9 minimal distribution for scrutinizer +- c9d1507f [TASK] Correct CGL +- ace965d5 [TASK] Add svgo config +- f1624c9a [TASK] Cleanup glyphicons and ensure all icons are correctly rendered +- 4c1b1c37 [TASK] Cleanup ionicons and ensure all icons are correctly rendered +- 6a306ddc [TASK] Add fill currentColor to all svg icons +- 3ccac18e [TASK] Optimize svg images +- c20e6285 [TASK] Use svgs as backend icons for ionicons +- 7b62c2c1 [TASK] Use svgs as backend icons for glyphicons +- 1c4ce066 [TASK] Migrate text and icon types to string classes +- 1d24a7b6 [TASK] Migrate text and icon sizes to string classes +- 099e4597 [TASK] Migrate textteaser +- 4b225eac [TASK] Prefix region classes to avoid conflics with bootstrap 3 +- c49ff60f [!!!][TASK] Ensure classes and ids on template areas are unique +- 1c9acdb1 [TASK] Add missing html tags to page layout +- 23bef5a1 [TASK] Make page footer more easy to identify +- 147a0170 [TASK] Streamline navbar fixed behaviour +- d8704eb8 [TASK] Enhance placement of carousel content for overlays +- d708838c [TASK] Add border column to simple layout +- 9708334b [TASK] Migrate well styling to bs4 +- 44ec77c0 [TASK] Update bootstrap 4 to 4.1.3 +- cacbfd67 [TASK] Use .tsconfig fileending and official structure for page tsconfig +- 67a7e7d7 [TASK] Seperate the configuration of content elements +- 679d40f5 [TASK] Change primary default color +- 672c495d [TASK] Make translations more easy and hide layout fields in irre records +- e59e818d [TASK] Add NetBeans IDE configuration to gitignore - fixes #539 (#540) +- 34960362 [TASK] Sort typoscript constants to make them more accessible +- d388cbc7 [TASK] Add sudo command again +- f0e058c3 [TASK] Use sudo for deployment stage +- cc7f1b42 [TASK] Split deploy scripts +- 14584e13 [!!!][TASK] Use .form.yaml instead of .yaml +- 3660b3a8 [TASK] Simplify icon registration +- c0b131fd [TASK] Optimize content element header spacing +- a8381110 [!!!][TASK] Add google webfont support for bs4 and add option to disable them +- 9801de64 [TASK] Make subnavigation compatible with bs 4 and 3 +- 2a69a265 [!!!][TASK] Move navigation constants to dedicated namespace +- 44d55a70 [TASK] Remove copyright from custom js files +- 50face99 [TASK] Only keep minified contrib libs and remove sourcemaps +- 618aec9d [TASK] Update grunt-modules and recompile sources +- 9d88f30d [TASK] Update bootstrap to 4.1.1 +- 6bf0e920 [TASK] Improve quality of PHP code (#534) +- 6572d347 [TASK] Use travis build stages - fixes #531 (#533) +- 68ba47cb [TASK] Add AdditionalConfiguration.php as shared file to deployment script +- 67a16bfb [!!!][TASK] Enable css und js concatenation by default +- ae0176df [TASK] Remove deployer configuration from scrutinizer analysis +- f2e0fd17 [TASK] Remove unused code in DataRelationViewHelper +- fb832331 [TASK] Use local webfontloader library +- 736a403d [TASK] Add php version and TYPO3 dev-master prerequisites to pull request template (#527) +- d33a2449 [TASK] Use youtube-nocookie url in external media utility +- c9579ed6 [TASK] Migrate headline styling scaling to bs4 +- ee1504d3 [TASK] Streamline container width between bootstrap 3 and 4 +- dab69c2c [TASK] Simplify image gallery column rendering +- c558c631 [TASK] Extract setup and constants for content elements +- 85e2edf8 [TASK] Drop obsolete constant +- 0b094476 [TASK] Add picture support for figures +- 94b98fc3 [TASK] Use local ratio labels for image croppings +- b19b234e [TASK] Remove unused $rootPage +- c6df2ccf [TASK] Trigger plain js cookie consent events +- 37d58a43 [TASK] Optimize typoscript constants for cookie consent +- eb322f14 [TASK] Update node dependencies +- 2e68b65f [TASK] Reduce webfont loader timeout to one second +- 3cc31760 [TASK] Remove role from carousel-inner +- 56eb6fdd [TASK] Mention bootstrap-package.com in default header comment +- 4eb0562e [TASK] Remove whitespace from header layouts +- 7f9ebc6b [TASK] Always anonymize ip if google analytics is used +- 10a00ca1 [TASK] Update bootstrap 4 branch to 4.1.0 +- d47ba6d4 [TASK] Add date to timeline label +- e2538f36 [TASK] Make textpic and textmedia positions compatible with bs3 and bs4 +- 86d80760 [TASK] Optimize space usage of frame indentions +- 160c5223 [TASK] Add additional stylings for file and mail links +- f438e726 [TASK] Add card menu styling for bs4 +- 5a8036cf [TASK] Remove obsolete container wrappings for single columns +- 7adb559a [!!!][TASK] Move footer column rendering to page templates +- 0e44a772 [TASK] Add robots.txt symlink in deployment +- daa5e2c6 [TASK] Change default copyright text +- 0a67f114 [!!!][TASK] Drop clean backendlayout in favor of simple +- 8b36dea0 [!!!][TASK] Move border column rendering to new section above breadcrumb +- 6942d61a [TASK] Drop hardcoded template column sizes from templates - fixes #391 +- 6527c8a1 [TASK] Migrate panel element to bs4 +- 97343a06 [TASK] Add additional css classes to teaser elements +- ef345269 [TASK] Add additional css classes to footer columns +- e9568713 [TASK] Split footer sections into dedicated partials +- 973aa54f [TASK] Migrate frames and sections to bs4 +- 80d7233b [TASK] Map button default to secondary in bs4 +- 5bd887fc [TASK] Add migration wizard for frame classes +- 92ad8d7c [!!!][TASK] Migrate frame classes well and jumbotron to background color classes +- 6136dfc4 [TASK] Split sections in special feature template +- 4302fb9a [TASK] Migrate uploads to bs4 +- db2591cf [TASK] Rename socialmedia icons to bootstrappackageicon +- b6dd3687 [TASK] Migrate quote to bs4 +- 3796c740 [TASK] Migrate text in columns to bs4 +- 6ef8f486 [TASK] Adjust default variables in bs4 +- 2bb85568 [TASK] Adjust indentions of scss variables +- 0feccd00 [TASK] Migrate thumbnail menu to bs4 +- 652775d1 [TASK] Update modernizr to 3.6.0 and add css/focuswithin test +- 99d001b5 [TASK] Add more meaningful defaults for contactform +- 47ccec07 [TASK] Move form configuration file +- ab7f64e3 [TASK] Disable obsolete share element in lightbox +- 52f3aabf [TASK] Migrate photoswipe lightbox to bs4 +- 8bb2325e [TASK] Make gallery compatible with bs3 and bs4 +- 9dfbca1a [TASK] Make accordion compatible with bs3 and bs4 +- 0603d551 [!!!][TASK] Make mainnavigation compatible with bs3 and bs4 +- dc75c4a9 [TASK] Move active bar styling of mainnavigation to pseudo element +- c969834b [TASK] Streamline behaviour of icongroup +- 7d949b24 [TASK] Finetune styling of icongroup content element +- 05d6a80e [TASK] Migrate navbar toggle to bs4 +- 02714085 [TASK] Reduce timeout for font loading +- 7ce6b005 [TASK] Migrate texticon styling to bs4 +- 6495106d [!!!][TASK] Use theme constants instead of settings +- 367bce19 [!!!][TASK] Drop show footer option +- ff157633 [TASK] Streamline usages of frames +- f69ee8f6 [TASK] Migrate figure styling to bs4 +- b2c1244e [TASK] Migrate carousel base styling to bs4 +- 67d0551a [TASK] Adjust audio styling in bs4 +- d0d872c1 [TASK] Migrate scroll-top styling to bs4 +- 6ebf8668 [TASK] Streamline rendering of breadcrump in bs3 and bs4 +- 93ab4137 [TASK] Include framework name and version in generated css files +- 390bb387 [TASK] Load bootstrap 3 with a different package name to avoid later conflicts +- 3aa8a39e [TASK] Move ionicons to contrib folder +- be3dc438 [TASK] Move all bootstrap 3 resources to contrib +- 617911fc [TASK] Move bootstrap 3 includes to dedicated folders +- 9959417a [TASK] Move bootstrap 3.x specific constants +- 6fea42d1 [TASK] Drop empty line in minified js files +- 3ea9aa5c [TASK] Move javascript assets to contrib avoid naming conflicts +- 02665eac [TASK] Update jquery to 3.3.1 +- d8f151a2 [TASK] Replace npm with yarn to ensure correct versions are always loaded +- 68039777 [TASK] Cleanup gitignore +- 07e55d58 [TASK] Remove TYPO3-9.x from testing until new testing setup available + +## BUGFIX + +- 667ca02a [BUGFIX] Ensure popper.js is loaded before bootstrap.js +- 8154ef41 [BUGFIX] Get rid of warning for count() thrown in less compiler with PHP 7.2 +- 30a93524 [BUGFIX] Ensure condition matching assigns correct matches +- 3d212b9b [BUGFIX] Correct loading order of content elements in type select +- 71e4b681 [BUGFIX] Google font hook must modify setup after caching font files +- bc9442fa [BUGFIX] Fix issue in ChangeLogScript after cleanup +- 836dbb6a [BUGFIX] Ensure ensure typoscript language hook is working correctly +- 78a33947 [BUGFIX] Do not override function param +- 8ed59cc0 [BUGFIX] Correct CGL +- 53cf8ac4 [BUGFIX] Remove unsupported rendertype checkboxtoggle in accordion item +- 479963b6 [BUGFIX] Correct defaults for accordion item +- 4c4a221b [BUGFIX] Correct relative urls +- d744e1c8 [BUGFIX] Respect backendlayout gutter in image generation +- b91bc79c [BUGFIX] Correct phpunit call in composer json +- 12890b8a [BUGFIX] Correct cgl in unit test +- 94a4038b [BUGFIX] Use full command to run unit tests +- bb610941 [BUGFIX] Correct travis config +- 1a417fae [BUGFIX] Correct menu thumbnail constant assignments +- cc12bc3f [BUGFIX] Use correct storage for media assets crop configuration +- df6de77d [BUGFIX] Use correct interface in data relation viewhelper +- a2c5588c [BUGFIX] Remove unused code in texticon utility +- acf91f2c [BUGFIX] Add missing namespace declaration in google font service +- f1268e8b [BUGFIX] Adapt icon type checks in text icon partials +- 019fa878 [BUGFIX] Add missing frame layout class +- 95f0940d [BUGFIX] Correct typo in docheader of file filter processor (#545) +- 4103992f [BUGFIX] Add missing color information for navbar toggler in bs3 +- 9348605b [BUGFIX] Correct position of above and below rendering in textpic and textmedia +- dd195c60 [BUGFIX] Correct grouping of icon enable toggle for subnavigation +- 85958995 [BUGFIX] Make complete background transparent if navigation is in transition mode +- 337728e4 [BUGFIX] Remove obsolete console.log from box plugin +- 04efa9ec [BUGFIX] Use TsConfig instead of TSconfig +- 4db1d7f8 [BUGFIX] Correct CGL +- bc894830 [BUGFIX] Ensure correct positioning of preloader +- a9595535 [BUGFIX] Process fieldName correctly in flexform data processor +- 67e6d65d [BUGFIX] Enable translations of timeline content element +- e4c992fa [BUGFIX] Add missing sorting field for timeline item +- d5691ecd [BUGFIX] Add missing system information icon +- 84ae0e8e [BUGFIX] Respect conditions in webfont includes +- 75d222be [BUGFIX] Use correct namespace for navigation constants in layout +- 21984c17 [BUGFIX] Override width and height attributes correctly in InlineSvgViewHelper +- 70de407e [BUGFIX] Correct docheader of CoreVersionCondition +- b0fe904d [BUGFIX] Load extension configuration only when extensions are installed +- a6b972b8 [BUGFIX] Correct return type in GoogleFontService +- 4bc84b4b [BUGFIX] Correct typo in AdditionalFieldInformation +- 92673368 [BUGFIX] Correct parsefunc to allow address tags outside p tags +- d2483f32 [BUGFIX] Correct ckeditor address plugin to allow links for mail and www +- 53ecaaf6 [BUGFIX] Resolve deprecation for EXT:lang in TYPO3 v9.x +- f4281b22 [BUGFIX] Correct return types in GoogleFontHook and PreProcessHook +- cf067eab [BUGFIX] Correct doc comments in LanguageMenuProcessor +- 82704b5e [BUGFIX] Correct return type in ConstantsProcessor +- d68a3cbc [BUGFIX] Update scrutinizer configuration (#532) +- 34a276fe [BUGFIX] Correct CGL +- aba2db81 [BUGFIX] Use .typoscript fileeindng for configuratio files in TYPO3 >= 9.3 for external includes +- fdd59ef5 [BUGFIX] Remove double BackendLayouts in comment (#528) +- 04c8039b [BUGFIX] Remove unavailable return type void to support php < 7.2.x +- 6d00567f [BUGFIX] Correct several typos - fixes #525 +- ac3e4be9 [BUGFIX] Add missing height and width attributes to backend layout icons +- f7876d99 [BUGFIX] Ensure links have adjustable colors for frame backgrounds +- cdc5b127 [BUGFIX] Strip new lines before and after pre tag +- 3e297f68 [BUGFIX] Correct spacings +- 34fc0d95 [BUGFIX] Caption alignment should follow image alignment - fixes #515 +- 4f315c39 [BUGFIX] Rename folder to macht includes +- 9a423a06 [BUGFIX] Ensure language typoscript is added correctly +- 38b17767 [BUGFIX] Check if array is empty in language utility +- 0dce3aaf [BUGFIX] Use twoLetterIsoCode instead of language field +- a32f777e [BUGFIX] Ensure language configuration is not overwritten +- 0d447094 [BUGFIX] Correct syntax error in php 7.0 in LanguageMenuProcessor +- 1800e07a [BUGFIX] Correct comment +- bbb2069d [BUGFIX] Make datefield required again +- 617e5227 [BUGFIX] Use datefield to save date values in timeline +- c0715ca1 [BUGFIX] Correct php-cs-fixer command in github issue template - fixes #512 +- 92953da0 [BUGFIX] Properly close html tag in navigation partial +- 10554117 [BUGFIX] Add missing compiled css files +- 18faa42a [BUGFIX] Ensure that em is used instead of rem in bs3 card layouts +- ae4eb8c4 [BUGFIX] Ensure section index menu is also available for hidden pages if directly assigned +- df258c96 [BUGFIX] Correct calculations for border radius +- e08f1c3b [BUGFIX] Correct language label +- 2eea1879 [BUGFIX] Correct identifier for button text in call to action item +- 86f03457 [BUGFIX] Properly close html tag in content element dropins +- 89709cd7 [BUGFIX] Correct cgl violations +- f409290e [BUGFIX] Remove obsolete class from footer section meta frame +- 4989d842 [BUGFIX] Ensure that selected pages are shown in menu content elements +- 836ad213 [BUGFIX] Adjust form override key to avoid conflicts with introduction +- a0240a95 [BUGFIX] Add active state to meta menu +- dd6ba018 [BUGFIX] Add default if background color class is not set +- 68f5f5a7 [BUGFIX] Remove debug message +- 272052f4 [BUGFIX] Use english in contact form subject +- b672ac93 [BUGFIX] Correct icongroup css +- b052c855 [BUGFIX] Use href instead of data attribute to avoid messing of urls +- 4c63f0ac [BUGFIX] Remove testing console.log calls +- 0e1d92b2 [BUGFIX] Correct toggle selector for main navigation hover +- b6720e5b [BUGFIX] Use correct accordion_item language label in Backend.xlf (#490) +- 42e1fd94 [BUGFIX] Show navigation toggler only above grid float breakpoint +- d02ed354 [BUGFIX] Remove wrong placed closing html tag in copyright partial +- 1307dd7d [BUGFIX] Remove wrong placed space +- a8b11121 [BUGFIX] Attributes on breadcrumb list item should be separated by whitespace +- 08a45ed7 [BUGFIX] Remove false condition for abstracts in card menus +- b45b3bd5 [BUGFIX] Unset file array in css processing hook +- 0ae48e6d [BUGFIX] Correct CGL +- fdd2b8ed Revert "[BUGFIX] Set correct type for svg files in apache configuration" +- 2d90873f [BUGFIX] Set correct type for svg files in apache configuration +- e950b85b [BUGFIX] Set correct type for javascript files in apache configuration + +## MISC + +- d900028c [CLEANUP] Move additional field information node to language compat +- d6462e4b [CLEANUP] Move extension icon +- a7f5f09c [CLEANUP] Correct text and icon migration leftovers +- edd29832 [CLEANUP] Correct class comment in abstract parser +- 6f0d9786 [CLEANUP] Minor cleanups +- f2d0be5c [CLEANUP] Remove obsolete background image width settings + +## Contributors + +- Ben Abbott +- Benjamin Kott +- Benjamin Kott +- Dennis +- Dennis Pfahlbusch +- Frank Naegler +- Frank Nägler +- Frans Saris +- Georg Ringer +- Gilbertsoft +- Jacob Dreesen +- buechlerpro +- netbrothers-tr +- ute-arbeit + +# 9.1.0 + +## BREAKING + +- c00049b0 [!!!][BUGFIX] Make DataRelationViewHelper compatible with doctrine. +- 7b1fbdfe [!!!][FEATURE] Add auto lookup for page templates + +## FEATURE + +- 7b1fbdfe [!!!][FEATURE] Add auto lookup for page templates +- 2505133a [FEATURE] Add auto lookup for page templates + +## TASK + +- ec395387 [TASK] Raise allowed TYPO3 version to 9.5.99 +- c489860b [TASK] Add travis tests for php 7.2 on typo3 master +- c677ad9f [TASK] Move CMS9 backend branding to service that is only called on installation +- c7d0fc17 [TASK] Only write backend configuration if it has changes +- b8f92490 [TASK] Remove correct addStaticFile function from extension scanner +- edf09e63 [TASK] Move icon registration to localconf +- da16625d [TASK] Exclude php less libary from extension scanner + +## BUGFIX + +- c00049b0 [!!!][BUGFIX] Make DataRelationViewHelper compatible with doctrine. +- 98680104 [BUGFIX] Set default backend configuration for CMS9 +- 00a28673 [REVERT][BUGFIX] Install php extension intl on travis ci +- 33330645 [BUGFIX] Install php extension intl on travis ci +- 80121cd8 [BUGFIX] Adapt travisci build configuration to documentation +- 2fc802bd [BUGFIX] Ensure page layout class is never empty + +## Contributors + +- Benjamin Kott + +# 9.0.0 + +## BREAKING + +- 20124b9a [!!!][TASK] Remove obsolete pagetype popup - fixes #476 +- a500b6d6 [!!!][FEATURE] Make css classes of footer columns directly addressable +- 625af26f [!!!][TASK] Remove fallback menu processor since it was merged into TYPO3 core +- da1db9d8 [!!!][TASK] Remove mod_filter check by default +- 4036bd30 [!!!][FEATURE] Load bootstrap rte configuration for all records by default +- 4b8baeec [!!!][FEATURE] Enable links on dropdown menus in main navigation +- 25b731d4 [!!!][FEATURE] Split menus instead of adding text when adding a spacer on main level +- 9583970b [!!!][TASK] Use .typoscript instead of .txt for configuration files +- 3123bd22 [!!!][BUGFIX] Streamline grunt less and less.php rendering +- a2f9deaf [!!!][TASK] Drop obsolete windows phone fix +- 835b16b3 [!!!][TASK] Drop equalheight script + +## FEATURE + +- 450e4651 [FEATURE] Pass current element on trigger loaded.bk2k.responsiveimage - fixes #471 +- 33e6ffeb [FEATURE] Allow links on carousel type background image - fixes #455 +- 48ef140a [FEATURE] Enable frontend editing for pages +- 8d064573 [FEATURE] Enable frontend editing for content elements +- dca76d18 [FEATURE] Make open accordion item configurable +- e5d9cade [FEATURE] Make gallery item column sizes configurable - fixes #465 +- 6fbd0f29 [FEATURE] Add table class in ckeditor by default +- a54478ba [FEATURE] Add ckeditor plugin to insert boxes +- e85c213f [FEATURE] Add carousel item type image +- e13a417f [FEATURE] Add configurable header and subheader css classes +- 5a60918f [FEATURE] Add additional inline text style classes to editor config +- a9bd8c59 [FEATURE] Add background image and base coloring support for content elements +- 34e00390 [FEATURE] Introduce frame-container and frame-inner for more detailed control options +- 42a676db [FEATURE] Add auto lookup for carousel item templates and move wrapping links to partials +- 7b0f4067 [FEATURE] Add UpperCamelCaseViewHelper +- 88e86ecf [FEATURE] Add option to show navigation title in carousel navigation +- 642eaff7 [FEATURE] Add navigation icons for main navigation +- aad4bf53 [FEATURE] Add current version to system information toolbar +- 4be3c373 [FEATURE] Make scaling options for headlines configurable +- a500b6d6 [!!!][FEATURE] Make css classes of footer columns directly addressable +- 0d6c2ebe [FEATURE] Make footer meta section colors configurable +- 57ca0055 [FEATURE] Make breadcrumb extendable to show title of single records +- 33d85248 [FEATURE] Add example configuration for Microsoft-IIS +- 7a19e6e2 [FEATURE] Add support for google-site-verification meta tag +- 4f93616d [FEATURE] add element wrap in lib.dynamicContent +- 4036bd30 [!!!][FEATURE] Load bootstrap rte configuration for all records by default +- 4b8baeec [!!!][FEATURE] Enable links on dropdown menus in main navigation +- 25b731d4 [!!!][FEATURE] Split menus instead of adding text when adding a spacer on main level +- cd475449 [FEATURE] Make config.typolinkEnableLinksAcrossDomains available through constant +- 770c96ae [FEATURE] Enable cropping of carousel background image +- 42558aec [FEATURE] Enable cropping for image in carousel + +## TASK + +- 20124b9a [!!!][TASK] Remove obsolete pagetype popup - fixes #476 +- cf4cefc1 [TASK] Push notifications to slack +- ba56d072 [TASK] Register bk2k as global namespace for viewhelpers +- 849d9dd4 [TASK] Check for explicit for null value in version toolbar item +- 6da63b5c [TASK] Adjust scrutinizer build +- b9c14b20 [TASK] Remove obsolete divider to tabs option +- 22077d2b [TASK] Rename ckeditor box plugin to avoid naming conflicts +- 4245a426 [TASK] Reduce form css to minimum and adapt to new form elements +- 8299c8c2 [TASK] Update package-lock +- ff4d2f7e [TASK] Remove obsolete watch task for viewportfix +- a5628c4e [TASK] Add small option to ckeditor +- fff4b2c3 [TASK] Add default css class to unordered lists from rte +- 2104e7ba [TASK] Reduce default fields of carousel item +- 3d2c4b00 [TASK] Streamline element quote TCA +- 014fb170 [TASK] Hide relation tables to avoid problems when managed without proper context +- 7d66f2ee [TASK] Remove authors from phpdoc +- ddd4880b [TASK] Streamline php header comments and add fixer rule +- c991413d [TASK] Remove obsolete margin bottom from breadcrumb +- b13a1bd2 [TASK] Enhance positioning of scroll to top button +- b839cb20 [TASK] Avoid ambiguous "uid" error (#480) +- 430fb3a3 [TASK] Use initialize arguments instead of render arguments in FalViewHelper +- 769928f4 [TASK] Use initialize arguments instead of render arguments in DataRelationViewHelper +- 60eb7600 [TASK] Use initialize arguments instead of render arguments in ExplodeViewHelper +- 092eb3a8 [TASK] Add mini section styling +- e9394bb1 [TASK] Use initialize arguments instead of render arguments in ExternalMediaViewHelper +- 228aeb8c [TASK] Use initialize arguments instead of render arguments in LastImageInfoViewHelper +- cc8328e1 [TASK] Remove obsolete tt_content palettes +- 625af26f [!!!][TASK] Remove fallback menu processor since it was merged into TYPO3 core +- d70b031b [TASK] Update readme and include frontend screenshot +- d0bf8348 [TASK] Add .rst and .typoscript to editorconfig +- 1d36a5bf [TASK] Add deployment for www.bootstrap-package.com +- da1db9d8 [!!!][TASK] Remove mod_filter check by default +- 9e13ae1f [TASK] Ensure link target attribute is only rendered if target is set - fixes #468 +- 9583970b [!!!][TASK] Use .typoscript instead of .txt for configuration files +- a702b26a [TASK] Update npm dependencies +- a2f9deaf [!!!][TASK] Drop obsolete windows phone fix +- 835b16b3 [!!!][TASK] Drop equalheight script +- 528b8510 [TASK] Remove release commit from changelog +- 61ce04b2 [TASK] Replace unwanted characters in commit messages +- bdef9ab9 [TASK] Add composer changelog script +- 9e1456f9 [TASK] Drop development affix for version numbers +- cb2480b2 [TASK] Add composer version script +- 2c224fd3 [TASK] Cleanup code formatting for palette configuration +- c22ff319 [TASK] Use php-cs-fixer instead of php-codesniffer +- 6773db49 [TASK] Adjust composer keywords +- c1007227 [TASK] Raise php dependency to 7.x +- 05c42f69 [TASK] Remove not working ter upload +- 88fa5d67 [TASK] Add typo3 8.7 to travis + +## BUGFIX + +- c105a130 [BUGFIX] Correct css selector for carousel item type text and image +- bb499d76 [BUGFIX] Correct indentions +- 54dc3d26 [BUGFIX] Show correct translations in language menu (#487) +- 6b0551a6 [BUGFIX] Ensure aria-expanded is correctly set for accordion items +- e0b8ceff [BUGFIX] Ensure selected tab item is shown in the backend +- a5925b1c [BUGFIX] Only support hover for on navbar toggle if hover is completely supported - fixes #459 +- 5e4a16dd [BUGFIX] Add missing namespaces to carousel small and fullscreen templates +- 6cd74910 [BUGFIX] Use self instead of static in DataRelationViewHelper +- 617e8981 [BUGFIX] Add css to precompiled css files +- 3fd55f64 [BUGFIX] Correct jumbotron button styling +- 47bfded3 [BUGFIX] Add missing list styles to rte configuration +- c8ae888b [BUGFIX] Correct bootstraps calculation of container widths +- 537fe9d6 [BUGFIX] Ensure correct link colors are loaded for footer meta section +- 84a6674e [BUGFIX] Ensure footer list are actually centered +- b441bc8c [BUGFIX] Correct preview template assignments for listgroup and external_media +- 1f8fb5c4 [BUGFIX] Set default value for tt_content reference fields in *_item tables (#482) +- 34834d8f [BUGFIX] Add parseFunc handling to pre tags +- 7e3565d2 [BUGFIX] Correct rendering method of LastImageInfoVIewHelper +- 7267a2e3 [BUGFIX] Correct indention in generic template +- c9cd0a0e [BUGFIX] Limit media element to youtube and vimeo +- 49f894f5 [BUGFIX] Display cropping variants for textmedia - fixes #438 +- 8411a1d5 [BUGFIX] Ensure link is displayed correctly in readme +- e842ce9c [BUGFIX] Correct image link in readme +- fa32c509 [BUGFIX] Add boostrap-package.com as known host +- c0826c4d [BUGFIX] Specify Deployer file +- 5a91e6fe [BUGFIX] Fix sys_language_uid when adding item to translated tt_content (#458) +- 7f7b7888 [BUGFIX] Only show content in MenuSectionPages that is marked for section index - fixes #466 +- 191395dc [BUGFIX] Close tags in meta menu properly - fixes #469 +- 024c5325 [BUGFIX] Remove unused constant assignments - fixes #477 +- 9bf16d50 [BUGFIX] Remove padding of navbar-collapse on desktop +- 3123bd22 [!!!][BUGFIX] Streamline grunt less and less.php rendering +- afead779 [BUGFIX] Remove wrong placed comma in navbar less file - fixes #460 +- 498f9700 [BUGFIX] Prepare colPos field for proper quoting (#452) +- d9a56f4b [BUGFIX] Correct texticon preview paths on windows +- 439c38eb [BUGFIX] Remove .php_cs.dist from export +- 13edd339 [BUGFIX] Correct less variable: @icon-font-path (#450) +- a740752d [BUGFIX] Correct sys_file_referece palettes for tab items +- ef33c3e1 [BUGFIX] Correct sys_file_referece palettes for accordion items +- e6871525 [BUGFIX] Use override child tca for carousel background image +- dc47cc99 [BUGFIX] Correct value type of data-wrap for bootstrap carousels - fixes #437 +- ce256fe3 [BUGFIX] Remove conflicting btn stylings for legacy rtehtmlarea - fixes #447 +- 9ce70d27 [BUGFIX] Correct dependencies for typo3 cms 9.x + +## MISC + +- 448d684d [CLEANUP] Fix typo by adding missing c to "seletor" +- 8ae85ef1 Use correct closing tag + +## Contributors + +- Anja +- Benjamin Kott +- Benjamin Kott +- Cedric Ziel +- Mathias Brodala +- Oliver Hader +- Pat +- Sascha Egerer +- Tymoteusz Motylewski +- mickenorlen + +# 8.0.0 + +## BREAKING + +- e33f0ed8 [!!!][TASK] Drop obsolete var viewhelper - use f:variable instead + +## FEATURE + +- 4b39a415 [FEATURE] Enable compression of generated css files +- caac09a6 [FEATURE] Add bootstrap responsive wrapper to table ce - fixes #385 +- efde1cb1 [FEATURE] Add art direction for image, media, textpic and textmedia + +## TASK + +- d1594b66 [TASK] Force captions to break +- a122f485 [TASK] Make thumbnail menu more flexible +- 7fd49b6f [TASK] Apply more flexible style on thumbnail menus +- 0fd71212 [TASK] Remove cropping from text an image carousel item +- 7431a082 [TASK] Add missing rte configuration for content element panel +- 4c3209f3 [TASK] Optimize brand placement +- 2dd177b7 [TASK] Use SVGs files instead of png for logos in frontend +- c751d36d [TASK] Raise TYPO3 dependency in scrutinizer config +- 13837b08 [TASK] Remove obsolete adjustments for indexed search +- 54b46e5c [TASK] Update missleading informations +- 7ff8f0dc [TASK] Raise TYPO3 Version requirement to 8.7 LTS +- 65315cdb [TASK] Migrate foreign selector to override child tca +- 215fb15e [TASK] Remove default rendering fallback, core provides information already +- d761f7d2 [TASK] Remove deprecated localizationMode from TCA +- d0d5ef42 [TASK] Use new form framework instead of old mailform element +- 2d28eee0 [TASK] Change seperator of page title +- 760f7ebd [TASK] Remove obsolete typoscript configuration +- 960d40fe [TASK] Adapt generic fluid template to match requirements for plugins +- 17071d44 [TASK] Remove obsolete assignment for felogin +- f50b57f1 [TASK] Adapt childtca override config for cropping variants +- c9ce1dd2 [TASK] Adapt indexed search to CMS8 +- 0ed67059 [TASK] Remove obsolete login template +- 75ea29eb [TASK] Adapt frontend login to CMS8 +- d55863b0 [TASK] Add generic template for general usage +- c3b01a98 [TASK] Remove obsolete tt_content typoscript configuration +- b84a29dc [TASK] Add rte configuration for tabs and accordions +- 5b5fca09 [TASK] Restore typical content elements panel +- 7672bfd4 [TASK] Add textpic and textmedia to content element wizard media and text +- ad73b38e [TASK] Add ckeditor as dependency - fixes #431 +- 47410a83 [TASK] Adapt php-cs-fixer configuration +- 6547a491 [TASK] Remove obsolete canNotCollapse attribute +- d83b10e6 [TASK] Resolve deprecation for general language file +- 743782cf [TASK] Optimize gallery rendering to use flexbox for better performance +- 0fc62dac [TASK] Enhance gallery template +- 3e08b28f [TASK] Honor CMS8 cache convention for processed less files - fixes #371 +- 2c635f0c [TASK] Resolve deprecation and use f:defaultCase for default in f:switch +- 60dd67fd [TASK] Remove deprecated TypoScript property config.noScaleUp +- 18e4d890 [TASK] Enable accessibility options to bypass navigation content elements +- b76d3550 [TASK] Streamline blockquote RTE rendering +- 69fa8326 [TASK] Enable RTE h4 and h5 format tags +- 043ef722 [TASK] Add table RTE configuration +- aae55947 [TASK] Add basic RTE styling +- e33f0ed8 [!!!][TASK] Drop obsolete var viewhelper - use f:variable instead +- 09d97efd [TASK] Add html tag with namespace definitions to fluid tempaltes +- 85d2dbff [TASK] Streamline carousel content element +- 3b310f45 [TASK] Streamline accordion content element +- 0ea92635 [TASK] Remove type from content element configuration comment +- 33dc2fff [TASK] Streamline tab content element +- a4686fe6 [TASK] Move bullets content element in wizard to text +- a0b94c45 [TASK] Streamline bullet content element with fsc +- 53a574ef [TASK] Move table content element to text tab in wizard +- d2394149 [TASK] Streamline external media element key +- ed8c8e79 [TASK] Streamline listgroup rendering +- 3a73d617 [TASK] Move image content element in wizard to media tab +- 4c086721 [TASK] Move default content elements in wizard to dedicated tabs +- dd81e21e [TASK] Remove header palette override +- 9e9b6c8d [TASK] Streamline uploads content element with fluid_styled_content +- caec788e [TASK] Use more simple ctype for text and icon content element +- d0ce21ae [TASK] Adapt panel element for CMS8 +- d277dea7 [TASK] Move texticon to text palette in content element wizard +- e75c292d [TASK] Streamline default, div, header, and html templates +- ab971f69 [TASK] Streamline quote definition and rendering +- 5d5cdddb [TASK] Remove obsolete thumbnail icon since its now available in core iconset +- 11fb8efa [TASK] Remove obsolete textmedia icon +- 105c6901 [TASK] Remove obsolete textteaser icon since its now available in core iconset +- f2dedfad [TASK] Streamline tabecolumn rendering +- 6eea9543 [TASK] Streamline textteaser definition and rendering +- 079f7bb2 [TASK] Add html tag with fluid namespace to text template +- 7b307864 [TASK] Add html tag with fluid namespace to shortcut template +- c79fed5c [TASK] Convert new lines to break for captions +- 80901d17 [TASK] Adapt media gallery from fluid_styled_content +- 6952b1eb [TASK] Adapt media element for CMS8 +- 1fb86cf3 [TASK] Move external media content element to media group +- 7a6e6034 [TASK] Move audio content element to new media group +- 1c8eb6a0 [TASK] Set default header to h2 +- ec2a31d2 [TASK] Enforce linux lf for xml files +- 5445e4bb [TASK] Update default .htaccess +- e0d1f40b [TASK] Remove RTE HtmlArea config +- 7dfee8fa [TASK] Minor cleanups +- 0de50f80 [TASK] Streamline table rendering with fluid_styled_content +- 1d92fe4d [TASK] Remove indexed search from new content element wizard +- 12a9269a [TASK] Cleanup new content element wizard configuration +- c36fb42e [TASK] Move thumbnail menus to menu tab in content element wizard +- 58effa99 [TASK] Migrate pages and subpages menus to dedicated content elements +- 4b602622 [TASK] Migrate abstract menu to dedicated content element +- f1ea58a7 [TASK] Migrate recently updated pages menu to dedicated content element +- e0399886 [TASK] Migrate related pages menu to dedicated content element +- 1e6844ab [TASK] Migrate section menus to dedicated content elements +- 0eae5023 [TASK] Migrate sitemap menus to dedicated content elements +- 043e07e9 [TASK] Migrate categorized content and pages menus to dedicated menus +- fefdc5b9 [TASK] Migrate thumbnail menus to dedicated menus +- 3f6571e0 [TASK] Remove obsolete fields from sql file +- 26d12f4f [TASK] Remove obsolete tt_content categorizable call +- c53d6cb0 [TASK] Remove obsolete bullets content element definition +- 20206b23 [TASK] Remove obsolete menu content element definition +- 708f6d2e [TASK] Remove obsolete table content element definition +- ecebab1f [TASK] Remove obsolete uploads content element definition +- 02e0101e [TASK] Remove obsolete textmedia content element definition +- 68f62f5b [TASK] Remove admin panel pagets configuration +- 5f9a4f18 [TASK] Remove obsolete mailform content element definition +- b0742436 [TASK] Remove obsolete shortcut content element definition +- e655ea37 [TASK] Remove obsolete html content element definition +- 7e4ae2f9 [TASK] Remove obsolete list content element definition +- 9d536a3e [TASK] Remove obsolete div content element definition +- a5a3eb0f [TASK] Remove obsolete tceform corrections +- 2efd5fd3 [TASK] Remove obsolete image content element definition +- c0bd8fc7 [TASK] Remove obsolete imageorient definition +- 792f857b [TASK] Remove obsolete textpic content element definition +- aa884691 [TASK] Remove obsolete text content element definition +- bf467eb9 [TASK] Remove obsolete header content element definition +- 355afcdd [TASK] Remove obsolete header_position +- 97cba7d7 [TASK] Adapt texticon element for CMS 8 +- 1fd6e966 [TASK] Adapt tab element for CMS 8 +- a11094b1 [TASK] Adapt panel element for CMS 8 +- e2b86797 [TASK] Adapt carousel element for CMS 8 +- 9cc5d981 [TASK] Adapt accordion element for CMS 8 +- 4eb7fa6f [TASK] Adapt audio element for CMS 8 +- dfcd4d26 [TASK] Adapt externalmedia element for CMS 8 +- b3d49090 [TASK] Adapt listgroup element for CMS 8 +- 2443f84f [TASK] Streamline content element definitions and apply new header +- e383d975 [TASK] Add fallback to header section and remove overrides +- d7d72d08 [TASK] Update loginscreen and extension configuration experience +- 872afa4e [TASK] Enable appearanceLinks palette for all content elements and add footer +- 2299ebe6 [TASK] Mark default content element layout sections as optional +- 682c36f9 [TASK] Adapt DropIn's from Fluid Styled Content +- 1b0d8527 [TASK] Migrate sectionframe to frame class, enable spacebefore and after +- 607de8f0 [TASK] Hide accordion-, carousel- and tabitems after copy +- 12dd0438 [TASK] Migrate requestUpdate to onChange +- 5055e31d [TASK] Migrate showIconTable to selectIcons configuration +- 0584b7fe [TASK] Migrate colorChoice wizard to render type colorpicker +- 92cd67d7 [TASK] Migrate TCA field quote_link and link inputLink +- 5d0d01f0 [TASK] Set versioningWS to true +- 2f8cafba [TASK] Remove unused TCA control setting versioning_followPages +- c1438159 [TASK] Migrate TCA field bodytext to match new wizards +- 35135f5f [TASK] Migrate TCA fields starttime and endtime to inputDateTime + +## BUGFIX + +- 85429004 [BUGFIX] Adapt thumbnail list template +- 12946cd2 [BUGFIX] Remove all typolinks from backend preview of quote element +- 2306885d [BUGFIX] Remove typolink from backend preview of quote element +- 179e73fa [BUGFIX] Add missing data prefix for lightbox caption +- 6a8037d9 [BUGFIX] Set lightbox caption +- c59d57d0 [BUGFIX] Add missing compiled css +- 14150c00 [BUGFIX] Correct font size for text and image carousel item +- 50256dab [BUGFIX] Add missing support for subheader on carousel text and image +- c25bfe94 [BUGFIX] Exclude buttons from section link styling +- d6237f37 [BUGFIX] Add missing link colors to sections +- e339b4c7 [BUGFIX] Use correct external media palette +- ee95762c [BUGFIX] Correct spacing between carousel indicators +- 7e909ea0 [BUGFIX] Correct sorting in content element type select +- 49318ceb [BUGFIX] Correct resolving of less sourcemaps - fixes #413 +- 571192e5 [BUGFIX] Set default language value for custom records +- 99fbf8ff [BUGFIX] Add hammer.js mapping files for debugging - fixes #396 +- 5d7521c6 [BUGFIX] Resolve deprecation for language file usage +- f9b5e59f [BUGFIX] Remove focus after clicking on scroll-top link - fixes #432 +- eaa579fc [BUGFIX] Add missing html tags and streamline selfclosing tags +- e890dc88 [BUGFIX] Correct hook to clear less caches +- 324e83ff [BUGFIX] Correct relative path for less processing +- a4f0a2a3 [BUGFIX] Ensure correct preformatted text rendering +- b3ca827a [BUGFIX] Correct TCA for parent record in accordion and tab item +- f05fc557 [BUGFIX] Correct spelling of temp folder +- 0f0e61b4 [BUGFIX] Add type to linkVars language parameter +- a49c3995 [REVERT][BUGFIX] Remove tools from scrutinizer config but disable analyzer +- b74c7d0e [BUGFIX] Remove tools from scrutinizer config +- 4d0453f3 [BUGFIX] Set TYPO3 version for scrutinizer build +- fa4c2787 [BUGFIX] Require typo3/cms for scrutinizer build +- a65475ec [BUGFIX] Restore location of well and jumbotron in frame class + +## Contributors + +- Andrea Moroni +- Benjamin Kott + +# 7.1.0 + +## BREAKING + +- d2b23d1f [!!!][FEATURE] Use explicit templates instead of conditions in carousel templates - relates #356 +- f2b06d7d [!!!][TASK] Reintroduce "no frame" option - fixes #319 +- eedb60dc [!!!][FEATURE] Add sections to visually group elements +- 9001189d [!!!][FEATURE] Adjust make footer color configurable +- 7d58ac63 [!!!][FEATURE] Add support for google webfonts - fixes #115 +- 5d0a76cd [!!!][FEATURE] Add support for spacer in menu processor - fixes #335 + +## FEATURE + +- d07e219a [FEATURE] Make language uids for menu configurable +- c7ac13dd [FEATURE] Add audio content element - fixes #399 +- add8bc0d [FEATURE] Add preview for quote content element +- 3c2ddf2c [FEATURE] rearrange settings for images and media assets (#395) +- 2b0e5772 [FEATURE] Add signal to compile service - fixes #371 +- 1b528c48 [FEATURE] Add quotation content element +- 0f206e87 [FEATURE] Provide generated link and target from hmenu in menu resultset - fixes #380 +- d5218b19 [FEATURE] Add smothscrolling and back to top link +- 477a83e1 [FEATURE] Add content element text with teaser +- 41f2413a [FEATURE] Add constant for absolute favicon path +- 9d54f211 [FEATURE] Add subheader to carousel item header +- ceaa9695 [FEATURE] Add stickyheader to overlay carousel +- b6518150 [FEATURE] Add fullscreen variant of carousel +- c5c6f615 [FEATURE] Add support for additional iconsets and ionicons - fixes #357 +- b34960fa [FEATURE] Add header_link to the icon of text widh icon content element - fixes #154 +- 66c76500 [FEATURE] Add meta navigation support +- 8f23e439 [FEATURE] Add marker for frontendurl +- ef7bcf09 [FEATURE] Add content element to display regular text in columns +- f043d601 [FEATURE] Allow html entities in carousel header +- 9430c1e9 [FEATURE] Colorize text selection in primary color +- 37658b84 [FEATURE] Make imported font weights of google webfonts editable +- 7da14da1 [FEATURE] Add transition option to switch from fade to slide - #356 #347 +- d2b23d1f [!!!][FEATURE] Use explicit templates instead of conditions in carousel templates - relates #356 +- eedb60dc [!!!][FEATURE] Add sections to visually group elements +- 9001189d [!!!][FEATURE] Adjust make footer color configurable +- 7d58ac63 [!!!][FEATURE] Add support for google webfonts - fixes #115 +- 5d0a76cd [!!!][FEATURE] Add support for spacer in menu processor - fixes #335 +- d36a8b22 [FEATURE] Add content element for vimeo and youtube videos +- ad695e01 [FEATURE] Clear less cache when all caches are cleared + +## TASK + +- 63fa499f [TASK] Optimize html output +- bcfd9ef1 [TASK] Update dependencies +- 5cd45254 [TASK] Add instruction to clear initial TypoScript (#420) +- 93e55e84 [TASK] Use typo3/cms classname for menu processor and provide alias as fallback for versions below 8.5 +- 82be428f [TASK] Update changelog schema +- ad98cd53 [TASK] Optimize travis and composer configuration for automatic ter uploading +- 6deb2785 [TASK] Add TYPO3 8 dev-master to issue template +- 0bb032e0 [TASK] Add GitHub pull request template +- 722b4426 [TASK] Add GitHub issue template +- 7e79b774 [TASK] remove uniqueLinkVars (#407) +- 4921d82a [REVERT][TASK] Use typo3/cms classname for menu processor and provide alias as fallback for versions below 8.5 +- 7537983c [TASK] Use typo3/cms classname for menu processor and provide alias as fallback for versions below 8.5 +- fb6467b2 [TASK] Streamline php_cs fixer configuration with TYPO3 core +- 60beeb92 [TASK] Add checks for TYPO3_MODE to all tca override files configuration files +- 8979cb4c [TASK] Throw exception if invalid arguments are passed to menu processor +- 53ea6d26 [TASK] Drop IE8 and IE9 support for background images in carousel +- 62e88701 [TASK] Always trim assigned variables in var viewhelper +- af899668 [TASK] Streamline position of columns for images and media to match textpic and textmedia +- b74db027 [TASK] Use shorthand array syntax in custom record tca +- 25797b05 [TASK] Do not set links bold in navigation bar +- 82e3c2a0 [TASK] Remove obsolete use statement +- 9cfb3659 [TASK] Update menu templates to use the generated links and targets from menuDataProcessor +- 1ce0019d [TASK] Replace f:link.page with static link (#370) +- eae382e0 [TASK] Exclude fixed navbar from scrolling to anchor +- 0946712d [TASK] Add border between same sections +- f9920241 [TASK] Allow html entities for content element header +- b7b67d5a [TASK] Remove obsolete constants +- 15a6926d [TASK] Update modernizr to 3.3.1 +- 1fa43ee8 [TASK] Adjust section size +- 19d15904 [TASK] Move icon selector to new tab to have enough space for large icon sets - relates #357 +- c43ab1ea [TASK] Move icon registration for text with icon to itemsProcFunc - relates #357 +- 1cb56ab9 [TASK] Remove unnessesary margin for last element in texticon content +- 8b1ae0a3 [TASK] Remove dependency to glyphicons in carousel control - relates #356 +- 9a573c1e [TASK] Move carousel controls to partials - relates #356 +- 145e1645 [TASK] Adjust indentions +- 83baee48 [TASK] Enable default and rename current to normal to ensure it can be overridden without removing the normal template +- f2b06d7d [!!!][TASK] Reintroduce "no frame" option - fixes #319 +- 89cb1f8f [TASK] Correct indention according to PSR2 +- 7827744b [TASK] Do not exclude composer.json from export +- 86306a43 [TASK] Add CType as class to outer content element frame +- 8f982e48 [TASK] Add scaling for text-icon +- 2fff83a0 [TASK] Scale headlines on smaller devices +- 468c5ad3 [TASK] Use dataprocessors instead of viewhelpers for carousel rendering +- 148b159a [TASK] Scale margin of frames +- 1740c475 [TASK] Move page class and id from section to bodytag +- b714e05c [TASK] Remove override for hover link decoration and use bootstrap variables instead - fixes #321 +- cde7cf04 [TASK] Split tt_content overrides +- 9ae55e7a [TASK] Optimize images +- 10c8ce0c [TASK] Use correct icons for tt_content imageorient palette - fixes #352 +- eb7036dd [TASK] Remove bower from travis tests +- 96c2a40a [TASK] Include photoswipe via npm instead of bower +- 283fce82 [TASK] Include hammerjs via npm instead of bower +- 9f8820d2 [TASK] Include bootstrap via npm instead of bower +- 389afc83 [TASK] Update jquery to 2.2.4 +- cda5f1ee [TASK] Update hammer.js to 2.0.8 +- 6af9bbaa [TASK] Update grunt +- 9a43942a [TASK] Correct composer requirements for TYPO3 +- d5c20452 [TASK] Remove unit tests from travis +- 374250e8 [TASK] Fix Travis 2 +- 000d0d83 [TASK] Add color option to phpunit for travis +- ad0828b1 [TASK] Add typo3 unit tests to travis +- dfe05c93 [TASK] Remove version from composer.json to prefer git tags +- b58e6299 [TASK] Adjust editorconfig +- b8fe3c75 [TASK] Add changelog for release 7.0.0 +- 3ceaaf1e [TASK] Add missing changelog entries for 7.1.0 +- 00d42a06 [TASK] Enable basic frontend editing +- c49042da [TASK] Add missing css fixes for #325 +- c733ffdd [TASK] Accessibility - fix of landmark error added role and aria- labelledby attribute +- bef517e2 [TASK] Accessabiliy - added role navigation to breadcrumb +- 9a5a6a8c [TASK] Accessibility - delete role contentinfo because you cant nest the same landmark in itself +- a2810cb2 [TASK] Accessibility - correction of landmark +- 2c9ee0e2 [TASK] Accessibility - Add link title attributes to logo constants, setup and html +- bf80fe37 [BUGFIX][REVERT][TASK] Remove unneeded rte_transform options + +## BUGFIX + +- ec643241 [BUGFIX] Add missing icon for text & media missing - fixes #417 +- 46697bdc [BUGFIX] Adapt link tag parsing for RTE fields +- a04a6c7f [BUGFIX] Move class alias for menu processor to localconf to ensure correct loading +- cdd2005d [BUGFIX] Ensure that variables are not converted to strings by variable viewhelper +- 72bb577c [BUGFIX] Use correct layout (#408) +- c0c3cc55 [BUGFIX] Correct position of carousel with fixed transparent header +- b698328f [BUGFIX] Ensure that navbar-collapse has a maxheight if menu is fixed +- 6886bc8e [BUGFIX] Enforce checkout with linux lf consistent over all plattforms +- 0dff0700 [BUGFIX] Respect show in section menus option for pages in section index menu +- a91373e8 [BUGFIX] Use smooth scroll only on elements that have an hash... (#398) +- dd66961d [BUGFIX] Move temp folder back to root of typo3 temp +- 485ab966 [BUGFIX] Remove double imagecols field in showitem configuration +- b27d0173 [BUGFIX] Workaround variable name cut off in CMS8 - fixes #388 +- ed63827f [BUGFIX] Use string to identify bootstrap_package for adding static template +- f46a6317 [BUGFIX] Allow non ID values for language fields to avoid errors on mysql strict mode +- 4b855079 [BUGFIX] Correct sql definitions for bodytextfields for carousel, accordion and tab content element item +- 0645bb31 [BUGFIX] Correct indention of sql definition +- f1b42b47 [BUGFIX] Correct teaser sql field definition +- e0892160 [BUGFIX] Move TCA change in ext_tables.php to Configuration/TCA/Overrides (#389) +- c0ba7863 [BUGFIX] Avoid specific DBMS literals in database queries (#384) +- 64f98070 [BUGFIX] Fix inline documentation of MenuProcessor (#369) +- bcddcaf5 [BUGFIX] Correct dependency for namelesscoder/typo3-repository-client +- cc39afcc [BUGFIX] Correct positioning of carousel when header is fixed +- 8ac31002 [BUGFIX] Correct case error in ionicons template +- 9553484d [BUGFIX] Use correct less variable in font-family-base +- 566d1352 [BUGFIX] Correct position of carousels on sticky header +- 90fb0b24 [BUGFIX] Add missing active state to stickyheader +- e6cc5ab5 [BUGFIX] Correct navbar z-index in combination with fullscreen carousel in border column +- 446435fe [BUGFIX] Ensure color for headlines is correclty inherited in footer sections +- aa388a27 [BUGFIX] Correct output of texticon if no icon is selected +- eb894e19 [BUGFIX] Ensure carousel headline color is inherited +- c2db0763 [BUGFIX] Remove duplicate case in content element layout +- c04e2b02 [BUGFIX] Correct paragraph rte classes +- ac12a519 [BUGFIX] Fix tab elements missing on slided content +- a994f777 [BUGFIX] Fix carousel elements missing on slided content +- ddaab8b8 [BUGFIX] Fix accordion elements missing on slided content +- 5fb24e9d [BUGFIX] Correct texticon content element rendering with default layout - fixes #336 +- 08f69947 [BUGFIX] Correct PSR-2 issues +- a39c6bb5 [BUGFIX] Tabs, Accordion, and Carousel Items not referencing files on sys_file_reference and sys_refindex - fixes #349 +- 9413d781 [BUGFIX] Bugfix/menuprocessor (#354) +- 58824f97 [BUGFIX] Prevent double escaping of menu titles +- 63909ec4 [BUGFIX] Remove vendor dir from php lint tests +- e39df3fc [BUGFIX] Load form configuration only if ext:form is installed +- a8bb806f [BUGFIX] Respect padding in equalheight script +- 9b16ef3f [BUGFIX] Correct overlapping of content elements with indention - fixes #325 +- 17bf663e [BUGFIX] Corrected label for attribute +- bf80fe37 [BUGFIX][REVERT][TASK] Remove unneeded rte_transform options + +## MISC + +- 0459bd33 "usind" is wrong +- 0a22336a Correct php-cs-fixer command + +## Contributors + +- Andrea Moroni +- Benjamin Kott +- Benjamin Kott +- Cedric Ziel +- Christian Kuhn +- Christian Toffolo +- Frans Saris +- Franz Holzinger +- Georg Ringer +- Martin Bless +- Nicole Cordes +- Oliver Hader +- s-leger + +# 7.0.0 + +## BREAKING + +- 9b9f9452 [!!!][TASK] Send cache headers per default +- 5ecadef4 [!!!][TASK] Conflict css_styled_content and fluid_styled_content due inconsistencies and incompatability to each other +- 22d60c8b [!!!][TASK] Replace FlexFormViewHelper with FlexFormProcessor +- bd62ef80 [!!!][TASK] Disable link to top +- 1761622a [!!!][TASK] Use more strict template names and flatten folder structure for templates to avoid conflicts +- fe5b5b88 [!!!][TASK] Disable compressing and concatenation of CSS and JS files by default +- c9a9ffb5 [!!!][TASK] Drop IE8 support +- e9caa18c [!!!][FEATURE] Register optional PageTS config files +- 8ade18a3 [!!!][TASK] Remove some 6.2 specific fallbacks +- 569df457 [!!!][TASK] Drop TypoScript fallbacks for 6.2, 7.4 +- d70ee66d [!!!][TASK] Drop TemplateFileResolver fallback for 6.2 +- dd81e0c1 [!!!][TASK] Drop BackendLayoutDataProvider since its part of the core now +- 0bc14990 [!!!][TASK] Dropping TYPO3 6.2 support and raise version to 7.0.0-dev + +## FEATURE + +- 7806d37a [FEATURE] Remaining PageTS templates are configurable +- 561cb0ed [FEATURE] Allow to disable footer-section with Typoscript constant. +- 317032be [FEATURE] Allow photoswipe to be opened by url params +- a00e0117 [FEATURE] Add PhotoSwipe as lightbox +- b6bdc425 [FEATURE] Thumbnail Menu +- 9ffce33a [FEATURE] Include records without default translation in content select +- a16b6255 [FEATURE] Allow media content in accordion +- 9ccf082c [FEATURE] Allow media content in tabs +- e9caa18c [!!!][FEATURE] Register optional PageTS config files + +## TASK + +- 42001a96 [TASK] Set defaults for backend configuration +- bdd51ada [TASK] Remove backend_layout upgrade wizard +- a2f2e591 [TASK] Update hammerjs to 2.0.6 +- 977a9977 [TASK] Update jQuery to 2.2.1 +- fa1f19f3 [TASK] Update bootstrap to 3.3.6 +- 4a28bad3 [TASK] Update oyejorge/less.php to 1.7.0.10 +- 070ad6cf [TASK] Remove unneeded rte_transform options +- b7012da5 [TASK] Optimize export +- 444df863 [TASK] Correct accordion rendering +- f3a4be1d [TASK] Correct tab rendering when no media is selected +- b44a7983 [TASK] Remove realurl autoconfiguration in preparation for realurl 2 +- 34640fd5 [TASK] Add TYPO3 branch for 7.6 and exclude php versions < 7 on master +- 9f51a7e1 [TASK] Add php7 to travis +- 89906d1a [TASK] Fix typo +- 55c4a1e6 [TASK] RTE: Classes for links, see benjaminkott#281 +- 5ddf090a [TASK] Add note to vagrant box +- 9b9f9452 [!!!][TASK] Send cache headers per default +- bee69553 [TASK] Update jQuery to 2.2.0 +- 91496d3d [TASK] Test asset pipe on travis +- 9a20304c [TASK] Fix Code according to CGL +- a334f7fb [TASK] Add php cs fixer config +- ccbbd11d [TASK] Add TYPO3 CMS 8 as compatible version +- 291e83bc [TASK] Split source and distribution javascript files and use static paths +- 4182473c [TASK] Adjust frontend login configuration +- 9bb70a91 [TASK] Add basic configuration and template overrides for indexed_search +- 1a479e19 [TASK] Add notice about content rendering extensions +- 7d4cb61a [TASK] Add header palette to cType list +- fc228b00 [TASK] Use default layout as identifier when not backend_layout is selected +- 36b9428f [TASK] Use use titlefield instead of raw data in menus - fixes #273 +- 0217d687 [TASK] Add escaped class to example in lib.dynamicContent +- 35c2cedc [TASK] Use fluidtemplate for languagemenu rendering +- 51b40492 [TASK] Use fluidtemplate for breadcrumb rendering +- f3998640 [TASK] Use fluidtemplate for mainnavigation rendering +- a6b62f1d [TASK] Use fluidtemplate for subnavigation rendering +- 57e2acc7 [TASK] Add configuration for felogin +- b772f398 [TASK] Remove unneeded typo3_mode check +- aa91cb09 [TASK] Add textmedia content element +- 7cb7fa1f [TASK] Add typoscript parse functions +- abae4dc9 [TASK] Add basic FluidTemplate for mailform and set paths +- 540e7df8 [TASK] Add FluidTemplate for list +- 9b06797e [TASK] Add typoscript setup as content rendering template +- bade03ab [TASK] Add FluidTemplate for shortcut +- d417401f [TASK] Add description to menu processor +- 37676d76 [TASK] Add FluidTemplate for menus +- 0e4fe0b2 [TASK] Move uploads to typical page content tab +- 34483ee8 [TASK] Remove unnessesary adjustment of the header palette +- cc096ca1 [TASK] Remove leftover mention of css_styled_content +- 06f96ad3 [TASK] Add FluidTemplate for uploads content element +- 40ceba9c [TASK] Add TCA and wizard for content element div +- 5e20f7f4 [TASK] Add TCA and wizard for content element html +- a2a3a120 [TASK] Add content element wizard items for table +- eee3c634 [TASK] Add FluidTemplate for table content element +- 47396322 [TASK] Add TCA for content element bullet list +- 1257178d [TASK] Enable header position again +- feaf2e3b [TASK] Enable section frame again +- fb6ba2aa [TASK] Add TCA for content element header +- dc99388d [TASK] Add TCA for content element image +- 455cbdbe [TASK] Add content element wizard items for header, text, textpic +- bd201a54 [TASK] Add TCA for content element textpic +- 863c9fd9 [TASK] Add TCA for content element text +- 5ecadef4 [!!!][TASK] Conflict css_styled_content and fluid_styled_content due inconsistencies and incompatability to each other +- 2f6db377 [TASK] Add case for tt_content rendering +- 22d60c8b [!!!][TASK] Replace FlexFormViewHelper with FlexFormProcessor +- b8281971 [TASK] Drop experimental OnePage setup +- a110a615 [TASK] Flatten content element setup and add layouts and sections +- ce1abd1b [TASK] Several adjustments +- b9f023bb [TASK] Make css adjustments +- a7f894e5 [TASK] Remove unnessesary column classes +- d5c1071d [TASK] Move section frames to fluid +- bd62ef80 [!!!][TASK] Disable link to top +- ba7d160c [TASK] Add FluidTemplate for image content element +- b418c7fc [TASK] Flatten content element rendering +- 6e0a8823 [TASK] Steamline header usage templates +- bc5183e9 [TASK] Add FluidTemplate for image content element +- df93601d [TASK] Add FluidTemplate for textpic content element +- c032f2c0 [TASK] Add FluidTemplate for text content element +- a43eb908 [TASK] Add FluidTemplate for header content element +- c39d30bb [TASK] Add FluidTemplate for bullets content element +- 5bbc988b [TASK] Add FluidTemplate for html content element +- 8aa6302a [TASK] Remove dependency to styles.content.get definition +- c13ffdd2 [TASK] Add FluidTemplate for divider content element +- 7f11f4d6 [TASK] Migrate reference to "wizard_element_browser" to new "wizard_link" - fixes #258 +- 3db17119 [TASK] Harden template names for page module previews +- 1761622a [!!!][TASK] Use more strict template names and flatten folder structure for templates to avoid conflicts +- 4fcbcbf1 [TASK] Use dataprocessing in listgroup content element +- 737797d3 [TASK] Use fluid template name for panel content element +- f5c02601 [TASK] Use fluid template name for list group content element +- 3fd77ae9 [TASK] Use fluid template name for external media content element +- 64142fc8 [TASK] Use fluid template name for default content element +- d370a037 [TASK] Use fluid template name for tab content element +- f3e9c385 [TASK] Use fluid template name for carousel content element +- 5e2836f0 [TASK] Use fluid template name for accordion content element +- 2c6bde2d [TASK] Move css_styled_content typoscript configuration +- 174fa1be [TASK] Extract lib.dynamicContent from Base.ts +- 4c39c52e [TASK] Remove iconInOptionTags and noIconsBelowSelect - fixes #243 +- 50242215 [TASK] Add preview for content element list-group +- 729d4a8f [TASK] Reduce size of external media preview +- 4adf3956 [TASK] Update less.php to 1.7.0.9 +- f93cb034 [TASK] Update jQuery to 2.1.4 +- e42c4e60 [TASK] Add recommended apache modules +- 823460f9 [TASK] Enable async loading for modernizr and windowsphone-fix +- fe5b5b88 [!!!][TASK] Disable compressing and concatenation of CSS and JS files by default +- c9a9ffb5 [!!!][TASK] Drop IE8 support +- 2f0d6693 [TASK] Harden expression in PreProcessHook +- f7954151 [TASK] Register content element listgroup icon +- 72c29292 [TASK] Register content element external-media icon +- 500bf8e6 [TASK] Register icon for element accordion-item +- 73145e59 [TASK] Adjust icons for element carousel-item types +- 13eb28dd [TASK] Register icons for element carousel-item types +- 37c46b2b [TASK] Register content element carousel icon +- f66d935d [TASK] Register content element accordion +- 3db5c2a4 [TASK] Register content element panel +- b4734d93 [TASK] Register content element texticon +- 92e017a3 [TASK] Register content element tab-item icon +- 286d4418 [TASK] Register content element tab icon +- bffb89b6 [TASK] Harden expression in ExternalMediaUtility +- 8ade18a3 [!!!][TASK] Remove some 6.2 specific fallbacks +- 569df457 [!!!][TASK] Drop TypoScript fallbacks for 6.2, 7.4 +- d70ee66d [!!!][TASK] Drop TemplateFileResolver fallback for 6.2 +- dd81e0c1 [!!!][TASK] Drop BackendLayoutDataProvider since its part of the core now +- 0bc14990 [!!!][TASK] Dropping TYPO3 6.2 support and raise version to 7.0.0-dev +- e4bbd6ce [TASK] Add preview for external media content element in page module - CMS7 only +- 8c96100a [TASK] Keep additional params for youtube urls +- 2a4aa973 [TASK] Add psr-4 autoload config to ext_emconf +- 8ef1ecdd [TASK] add classes to containers useful to better select them with CSS and Javascript +- 1a007489 [TASK] fix tag closure for HTML5 head meta and link +- b7511944 [TASK] breadcrumb: include the homepage link at the beginning of the breadcrumb. +- 4e01a9e4 [TASK] breadcrumb: for the content of the links use alternative navigation title if it is set, else use page title. + +## BUGFIX + +- 3a6d10a6 [BUGFIX] Remove skin setting from RTE configuration to ensure correct file is loaded in cms 8 +- c8b881a0 [BUGFIX] Disable output escaping for viewhelpers +- cd18e0ee [BUGFIX] Remove spaceless viewhelper +- be974578 [BUGFIX] gallery in 2 cols also for devices >= 768px and < 992px +- 3a5c5a79 [BUGFIX] use the correct Typoscript constant in setup +- 49abd2e5 [BUGFIX] Correct grunt watch tasks +- 5c64e395 [BUGFIX] Add header to cType List +- 2f4d942f [BUGFIX] Respect sorting for tab items +- 4e1895c3 [BUGFIX] Respect sorting for accordion items +- d2f3858f [BUGFIX] Correct PSR2 issue +- 0e750f0f [BUGFIX] Add missing column overrides for text and textpic content elements +- f59acadd [BUGFIX] Check if content element type exists before merging +- fef0fc6e [BUGFIX] Merge type configuration in TCA instead of overriding +- 9a6506c1 [BUGFIX] Add missing comma in uploads field selection +- 3e87fca5 [BUGFIX] Correct accordion content element markup +- 142a0400 [BUGFIX] Add missing showIconTable setting for field icon +- 003489f6 [BUGFIX] Adjust imagepath and wizard settings for carousel links +- b44bcf36 [BUGFIX] Adapt moved language file +- 2bd94955 [BUGFIX] Add missing renderTypes to tt_content fields +- f460fa78 [BUGFIX] Add missing renderTypes to tab item +- 553f48f7 [BUGFIX] Add missing renderTypes to accordion item +- 39ec0279 [BUGFIX] Add missing renderTypes to carousel item +- 534fa91e [BUGFIX] Correct typoscript paths +- 3ddad628 [BUGFIX] Add missing link for media type image in tabs +- a9bf6dff [BUGFIX] Add missing link for media type image in accordion +- 353e3b50 [BUGFIX] Correct composer branch-alias +- 9bf49a18 [BUGFIX] Make links visible in jumbotron - fixes #248 +- 3bef8e04 [BUGFIX] Fix behaviour of strictly allowed RTE classes +- 46f24a1c [BUGFIX] Add the table colspan and rowspan attributes to allowed attributes in RTE configuration +- 0da305fc [BUGFIX] Correct height operator for opengraph image - fixes #227 + +## MISC + +- ce3f8df6 Fix more typos / grammar issues +- 3b25d805 Fix typos found by codespell +- a50ed6e4 Followup: Use spaces instead of tabs +- 62ade32e Fix grammar +- 2edeebce Removed duplicate "List Group" entry +- b917eaef add static to getVariablesFromConstants() because of deprecation notice +- fbbe0cf9 Add crop to carousel background image +- f0966b5a Use settings instead of variables for configuration in FLUIDTEMPLATE +- c596fd73 [WIP] Image rendering +- 663af6aa [WIP] Adjust Tab Rendering +- 01a006c8 [CLEANUP] Bootstrap Package external media item +- 66e3090d [CLEANUP] Bootstrap Package list group item +- ea5db05c [CLEANUP] Rendering definition for default content element +- bec55b68 [CLEANUP] Remove unused header partial +- 1c2db8b7 Add namespace to ext_update class +- 6c19cf4b Update constants.txt +- 57a6a177 Update CssStyledContent.txt +- fddd5e23 Add data-preload to force image preload +- 3205507e Merge remote-tracking branch 'upstream/master' +- 12e6e6e6 [CLEANUP] Remove unused file +- 09711654 [CLEANUP] Correct email in bower setup +- e1df0753 Merge remote-tracking branch 'upstream/master' into disable-meta-section +- 7998c5bd Add mod_filter to apache recommendations +- 7cc4feee [CLEANUP] Correct Readme +- f8475694 [CLEANUP] PSR-2 stuff +- 1cb8469e [CLEANUP] Remove unused use statements in install service +- fba18057 [TROLL] Update copyright text +- 020bf697 [CLEANUP] Initialize fieldsToUpdate in ext_update +- b91e71d1 Merge remote-tracking branch 'upstream/master' into disable-meta-section +- 7f2b9d7a [CLEANUP] Remove unused Hooks and Xclass +- 7897a86e [CLEANUP] Remove TYPO3 6.2 and PHP5.3 and PHP5.4 from Travis CI +- a75a0278 [CLEANUP] Remove unused use statements in realurl autoconfig +- 83088bba bring metaSection enable setting to constants +- fb68e002 Update setup.txt with default meta section enabled +- 100a1084 change Footer.html to disable meta output +- 2cf4e9ba Fixed typos +- aa88fbbc Fixed typos +- db95d9ab Correction of minor typo +- 1b5581d8 Force preload images to allow print +- fbb6fa12 Add useful RTE buttons + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Benjamin Kott +- Cedric Ziel +- Ian Excedo +- Markus Dreyer +- Peter Kühn +- Stefan Weil +- Stephan Großberndt +- Steven Strehl +- Sven Burkert +- buffcode +- metaxos +- phvt +- s-leger +- sebastianseidelmann + +# 6.2.15 + +## TASK + +- 3e5f00f2 [TASK] Add travis-ci build status image +- f0ef2c5f [TASK] Remove unused coverage from travis +- 50d372c3 [TASK] Add phpcs as dev dependency to composer.json +- 3dc0c1df [TASK] Remove TYPO3 dependencies and conflicts from composer.json +- b103871a [TASK] Add travis-ci support +- 1737339c [TASK] Unify license comment +- aaad7a4f [TASK] Static declaration should come after the visibility declaration +- a8a589e4 [TASK] Apply PSR-2 +- 023b9859 [TASK] Add scrutinizer code style fixer for psr-2 +- 42381a08 [TASK] Convert tabs to spaces 2 +- 82ee78a6 [TASK] Convert tabs to spaces +- 4dac59ff [TASK] Add scrutinizer psr-2 settings +- ab4dcafe [TASK] Add braces in condition +- e4e3e9b0 [TASK] Add code quality section to readme +- 82bae492 [TASK] Add YML to editorconfig +- 756f96ab [TASK] Add scrutinizer configuration +- 6c9570f0 [TASK] Change TYPO3 composer dependency to typo3-cms +- d359261c [TASK] Update less.php to 1.7.0.5 + +## BUGFIX + +- aa587827 [BUGFIX] Ignore PSR-2 check for legacy core classes +- d176687a [BUGFIX] Use camel caps format for functions in external media utility +- f15a896f [BUGFIX] PSR-2 Violations +- 914a4254 [BUGFIX] Add composer self-update to travis +- da8c97d0 [BUGFIX] Correct indention +- 1e798736 [BUGFIX] Use correct assignment for TypoScript value +- b8d89b14 [BUGFIX] Make class.ext_update.php work on PHP +- 1cf9b927 [BUGFIX] There is no boostrap package + +## MISC + +- ffe5e3e4 Scrutinizer Auto-Fixes +- 3d6b3427 Scrutinizer Auto-Fixes +- 6bd65dd0 Scrutinizer Auto-Fixes + +## Contributors + +- Benjamin Kott +- Cedric Ziel +- Scrutinizer Auto-Fixer +- Stefan Neufeind + +# 6.2.14 + +## FEATURE + +- 2734c162 [FEATURE] Add advanced Open Graph support, support new meta notation for 7.4 + +## TASK + +- ad9f9282 [TASK] Add migration information for backend layout prefix change +- fc482ca9 [TASK] Add missing changelog for 6.2.12 and 6.2.13 +- 5162b178 [TASK] Update TypoScript template mapping for backend layouts +- fe57d19c [TASK] Add update script to migrate old backend layout prefix to new prefix in table pages +- d467590b [TASK] Disable BackendLayoutDataProvider for TYPO3 versions below 7.4 and adapt registration to core provider prefix for PageTS +- b90c08db [TASK] Move column labels for border, normal, left, right to bootstrap_package, files moved in CMS 7 +- 99c82668 [TASK] fix whitespaces +- eb23a66f [TASK] Add 'active' class for shortcuts in sub navigation + +## BUGFIX + +- f0f8c620 [BUGFIX] Use always $GLOBALS[TCA] +- b0bde8ab [BUGFIX] fix missing TYPO3SEARCH_end marker + +## MISC + +- 04d164d9 Update Index.rst +- 63473434 Rename index.rst to Index.rst +- 9826f5ab Update Index.rst +- bf873ff4 Create index.rst + +## Contributors + +- Anja Leichsenring +- Benjamin Kott +- Benjamin Kott +- Ian Excedo +- Philipp Roski +- s-leger + +# 6.2.13 + +## TASK + +- 4f031d5d [TASK] Include css_styled_content and form in static template + +## BUGFIX + +- 92c7c219 [BUGFIX] Remove leading slash from classnames in typoscript setup +- 287e8df7 [BUGFIX] Restrict options for default tab to currently assigned items - fixes #197 + +## MISC + +- 76a411b0 Fix 'overridden' typos +- e27b03e4 Multiple fixes to composer.json +- e141e230 Fix whitespace in ext_emconf.php + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Florian Fida +- Helmut Hummel + +# 6.2.12 + +## BUGFIX + +- 9347264e [BUGFIX] Add missing static template for bootstrap package + +## Contributors + +- Benjamin Kott + +# 6.2.11 + +## BREAKING + +- 987c2032 [!!!][TASK] Remove compatibility to ext:themes through lack of resources +- 4b16e85f [!!!][TASK] Cleanup deprecated template fallbacks +- 20ec25cf [!!!][FEATURE] Add template fallback support +- 729e9667 [!!!][BUGFIX] Wrong path to font files - fixes #139 +- c43a35e4 [!!!][TASK] Make less files public available +- 305139fc [!!!][TASK] Move lightbox implemantation to a own file and remove main.js +- f0bee946 [!!!][TASK] Make navbar toggle button compatible with bootstrap default markup +- 3f8f04c6 [!!!][TASK] Use version number independent filename for jQuery and update to v1.11.3 +- 1f861227 [!!!][FEATURE] Support multilevel tree in subnavigation - fixes #186 + +## FEATURE + +- 20ec25cf [!!!][FEATURE] Add template fallback support +- 45ffc2c6 [FEATURE] Make DynamicContent wrappable +- 94b74d51 [FEATURE] Add swipe support for carousels - fixes #161 +- 1c50ebcf [FEATURE] Add new page type for popup usage without header and footer typeNum 1000 - fixes #70 +- 8975391d [FEATURE] Enable support in lib.dynamicContent to support content from pid - fixes #185 +- 78c19a7b [FEATURE] Make breadcrumb enable treelevel configurable - fixes #191 +- aa242026 [FEATURE] Add TypoScript TYPO3 version condition +- 13d4410a [FEATURE] Add selectivizr to add CSS3 pseudo selector support to IE8 +- 1f861227 [!!!][FEATURE] Support multilevel tree in subnavigation - fixes #186 +- 8a1f1837 [FEATURE] Add carousel type backgroundimage - #188 +- 224287ab [FEATURE] Make carousel header layout configurable - #188 +- 7d2c7c9c [FEATURE] Add CSS status classes to content wrappers - #fixes 85 +- 993eb4f6 [FEATURE] Add tab content element +- 02ec26fb [FEATURE] Add external media content element for youtube and vimeo videos +- 77639ab9 [FEATURE] New advanced constant to enable/disable CSS source mapping + +## TASK + +- ed01b96e [TASK] Update Documentation for TypoScript constants +- 0eeeac64 [TASK] Update Documentation +- 987c2032 [!!!][TASK] Remove compatibility to ext:themes through lack of resources +- 13ac5ee6 [TASK] Use TCA renderTypes - fixes #192 +- 4b16e85f [!!!][TASK] Cleanup deprecated template fallbacks +- 2f207e70 [TASK] Copy Bootstrap font files during build process +- 27d47b7a [TASK] Update Bootstrap to 3.3.5 +- c43a35e4 [!!!][TASK] Make less files public available +- 0e48e798 [TASK] Use absRefPrefix = auto instead of baseURL in TYPO3 CMS 7 +- 0d727e22 [TASK] Add application context examples to .htaccess file +- 305139fc [!!!][TASK] Move lightbox implemantation to a own file and remove main.js +- 882bfb50 [TASK] Add hires extension icon +- f0bee946 [!!!][TASK] Make navbar toggle button compatible with bootstrap default markup +- a8aed629 [TASK] Add grunt watcher for JavaScript files +- ad3b9928 [TASK] Add RespondJs to Bower +- 3f8f04c6 [!!!][TASK] Use version number independent filename for jQuery and update to v1.11.3 +- 40e41071 [TASK] Include bootstrap with Bower and Grunt +- a761175d [TASK] Add Grunt uglify for JavaScripts +- d8881b36 [TASK] Add initial Grunt setup for RTE and precompiled theme +- db6a5c30 [TASK] Add less variables file to bootstrap theme +- 3c4cec5e [TASK] Unify namespace name in templates +- 328e3596 [TASK] Make ContextualClassViewHelper compilable +- a233f389 [TASK] Make FalViewHelper compilable +- fb7f968a [TASK] Make ExternalMediaViewHelper compilable +- 95d83e96 [TASK] Make VarViewHelper compilable +- 92eafd19 [TASK] Make ExplodeViewHelper compilable +- 9e2c3f1e [TASK] Make DataRelationViewHelper compilable +- fc62a800 [TASK] Remove leftover FormEngineViewHelper +- bd5d285f [TASK] Make FlexFormViewHelper compilable +- b15ee411 [TASK] Update jquery.responsiveimages.js +- 09434679 [TASK] Reintroduce css class for first headline in column rendering +- 9ba2483b [TASK] Move custom content element renderings to typoscript folder +- 848ec4ef [TASK] Cleanup extension declaration file to match documentation +- 6767c334 [TASK] Add individual icons for content elements in wizard +- 35a6156f [TASK] Added missing description to Bootstrap elements +- 7d6e5fc7 [TASK] Add field subheader to header palette of tt_content +- ea2a5296 [TASK] Remove csc-firstHeader CSS class in lib.stdHeader +- 473ccd24 [TASK] Use references instead of hard copies in lib.stdheader +- c2367fdc [TASK] Use ExtensionManagementUtility in autoload.php - fixes #172 +- 791356db [TASK] Update bootstrap to 3.3.4 + +## BUGFIX + +- e84055e3 [BUGFIX] Add disablePageTsRTE option to extension configuration again +- 729e9667 [!!!][BUGFIX] Wrong path to font files - fixes #139 +- 10a0d604 [BUGFIX] Correct overflow problem +- 9273d3e8 [BUGFIX] Deprecation of page.includeJSlibs in TYPO3 CMS 7 +- 566968ec [BUGFIX] Ensure column CSS class is also set for imagecols set to 1 - fixes #138 +- 9be58651 [BUGFIX] Set BackendLayouts columns correctly if PageTs is set via page record +- 61a3fc85 [BUGFIX] Section Index content item produces incorrect links - fixes #150 +- bf4b1815 [BUGFIX] Correct OnePage Markup +- c6f65941 [BUGFIX] Add missing restore register in text with icon - fixes #174 + +## MISC + +- 825d4b26 slightly smarter TypoScript +- 193983b8 FLUIDTEMPLATE.templateName and templateRootPaths +- a066650a Update jquery.responsiveimages.js +- 10f0fbcb Collision with jQuery width and height methods +- 7ee19d4b Update jquery.responsiveimages.js +- 8fddd3b1 Update jquery.responsiveimages.js +- 496e017d Update jquery.responsiveimages.js +- a2bf2d30 Update jquery.responsiveimages.js +- b0a54d66 Event optimisation +- cdefdf81 Fine tune jquery.responsiveimage.js +- 36b97037 Update jquery.responsiveimages.js +- fe803ca5 Update jquery.responsiveimages.js +- 3ab416b1 Update jquery.responsiveimages.js +- fcef312b Fix indents in tab feature + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Harry Glatz +- Ian Excedo +- Konstantin Krauter +- s-leger +- till busch + +# 6.2.10 + +## FEATURE + +- e01b136d [FEATURE] New advanced constant to enable/disable the use of Typoscript constants as Less variables +- a7544c25 [FEATURE] new constant $page.logo.alt used to overwrite the default alt attribute of the logo image +- 5e1d06f6 [FEATURE] make site logo alt attribute configurable +- 1eef6627 [FEATURE] Disable automatic less compiling - fixes #162 + +## TASK + +- 2d3dc52c [TASK] Add changelog +- 0f90334b [TASK] Refactor jquery.responsiveimages.js +- 604ea24e [TASK] HTML5 markup for sub navigation - fixes #171 +- 20333053 [TASK] Make RealUrl autoconfig compatible with the version from Helmut Hummel for 7.x +- c3e76016 [TASK] Protect configuration of extensions in default .htaccess +- a598a4df [TASK] Remove migration of realurl in favor of Helmut Hummels release for TYPO3 CMS 7.2 +- 39d46854 [TASK] Carousel: allow to set the max width of background images +- c29b6227 [TASK] Update oyejorge/less.php to 1.7.0.3 +- 35b81ccf [TASK] Remove automatic cache clearing - fixes #126 +- 7e746fd6 [TASK] Add slack to contact and communication +- 29b666b5 [TASK] replaced with +- 761bd5c7 [TASK] Add admin panel config to typoscript constants +- 88139537 [TASK] Update changelog in documentation + +## BUGFIX + +- 4cce784c [BUGFIX] Correct overlapping elements on centered image - fixes #113, #159 +- 0af8bc02 [BUGFIX] Correct media display for file links content element - fixes #164 +- b5776a1c [BUGFIX] fix for HTML5 markup validation +- e6c0cf9f [BUGFIX] Missing container in default clean layout +- 863615c6 [BUGFIX] Adjust language uids to match introduction database - fixes #135 + +## MISC + +- 9aef5248 Stop using deprecated XHTML cleaning +- 653bd30a Allow "target" attribute inside tags. +- a44d88f1 added "br" to "allowedTags" +- a7a74f0c [CLEANUP] Correct indention to CGL +- 4aa5c42a Modified footer and header +- e57bc95e [Bugfix] fixes sorting on localized relations +- fe208bdc Update FalViewHelper.php +- 7769afed [Bugfix] FalViewHelper.php +- 697bedc4 Update Base.ts + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Carla +- Christopher +- Ian Excedo +- Marco Ziesing +- R B +- Thomas Löffler + +# 6.2.9 + +## TASK + +- e8822fce [TASK] Update jquery to 1.11.2 +- 559ff0c8 [TASK] Update modernizr to 2.8.3 +- d065a0be [TASK] Update less.php to current master +- 70249bf3 [TASK] Throw exception on less compile error +- c056ffd9 [TASK] Rise dependency of TYPO3 and css_styled_content version to 7.99.99 +- 4d78373c [TASK] Add backend skin changes to the documentation +- 7d9fb372 [TASK] Use realurl autoconfig hook instead of overriding every config + +## BUGFIX + +- c7d64280 [BUGFIX] Remove problematic whitespace +- 115a9d58 [BUGFIX] Remove superfluous slash in font definition - fixes #132 +- 095c2a17 [BUGFIX] Classname must not start with a backslash in ext_conf_template.txt + +## MISC + +- 4660037b Update Index.rst +- ca4d0322 Use array_merge_recursive() instead +- 18f1ca82 Don't overwrite existing configuration completely + +## Contributors + +- Aimeos +- Benjamin Kott +- Benjamin Kott +- Cedric Ziel +- buxit + +# 6.2.8 + +## TASK + +- 6f92339a [TASK] Make realurl optional +- b162f602 [TASK] Remove e-mail from contact +- f8ad4af7 [TASK] Minify responsiveimages.js and and cleanup +- c1956cf1 [TASK] Cleanup CGL +- aebd1fcd [TASK] Make removeDefaultJs configurable. fixes #105 + +## BUGFIX + +- 21735bde [BUGFIX] Use correct rte transform in accordion textfield - fixes #67 +- 146a8659 [BUGFIX] Wrong calculation in news pagination - fixes #106 +- f0508a9d [BUGFIX] Flashmessage queue throws error while installing - fixes #116 + +## MISC + +- 94a1a165 Update newContentElement.txt +- c7e27ab8 Update newContentElement.txt +- e40750d9 Update jquery.responsiveimages.js + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Oliver Meckel +- s-leger + +# 6.2.7 + +## TASK + +- 66ce0a66 [TASK] Include respond.js with conditional comment to work with static cache - fixes #101 +- b5cd79d2 [TASK] Cleanup CGL +- 7a86c368 [TASK] Reformat all project-specific content to TYPO3.CMS CGL +- 6541519a [TASK] Make getCompiledFile a static method - fixes #103 #104 +- 279601a6 [TASK] Deprecate backend skin for CMS7 and provide new logos +- c000a5bf [TASK] Carousel needs to have background-image and background-color at the same time available +- cf164b64 [TASK] Add .editorconfig file + +## BUGFIX + +- 5e0d2741 [BUGFIX] Wrong colpos was used in layout "Default, Subnavigation Left and 2 Columns" fixes #98 + +## MISC + +- 14d4eb34 Fix for columns in backend layout +- 7b676ed6 Add 25/75 backend layout +- cd232393 Add missing migrations for realurl +- 880b198b Add migrations for realurl to be compatible with CMS 7.0 +- 614a1eb9 Remove unused template variable - fixes #93 +- df58daa6 typo +- 884dc404 Updated RTE configuration. Implemented a workaround to get enableWordClean work again. +- 7aebd4e1 Finish Hotfix-lead-text +- c0f69b38 Fixes Lead text in RTE that is not saved cause not in allowedClasses + +## Contributors + +- Aimeos +- Benjamin Kott +- Benjamin Kott +- Cedric Ziel +- Dennis Rheinfelder +- Exapoint Solutions AG +- Ian Excedo +- Stefan Froemken + +# 6.2.6 + +## FEATURE + +- 2c668813 [FEATURE] add composer.json + +## MISC + +- 26b6ed91 Release 6.2.6 +- 51f177e3 Correct colPos for left column on Layout: Default, Subnavigation Left and 2 Columns - fixes #62 +- f8ff29b3 Add Google Analytics tracking code anonymization - fixes #84 +- 1b9b1c5e Adjust processing rules for rte +- be860ade Add missing styling for rte table contextual classes +- 7540ed6a Enhance accessibility for the accordion +- 1217a36e Describe and enhance rte config, tables are now responsive by default, css classes have translations now +- 23bec274 Fix role="main" position in 2 columns layout. +- 2784053b Add backend layout with 2 columns 50/50% +- 9b2c649d Use DIR option instead of FILE to include backend layouts. +- 8e5cfe13 Remove superfluous text "Bootstrap Package: " from layouts names. +- e4529ffd Exclude page also from search engine index if no_search is set to the page - fixes #69 +- 0db789b2 Enhance accessibility for the carousel +- f32ea4ae Adjustments to skip to content - resolves #63 +- 71163c16 Add marker for current year. Move replacements directly to the fluidtempalte - fixes #72 +- 706df22c Add missing alt and title attributes on noscript fallback for image rendering - fixes #77 +- e8214f8e TASK: Skip to content Resolves https://github.com/benjaminkott/bootstrap_package/issues/63 +- e3c8ba0c Update bootstrap css file for the backend to 3.3.0 +- 6e317ce4 Adjust gitignore +- de9f8ca0 Remove the automatic appending icons for content links +- f20efcf0 Fix navbar-brand-image position +- 9938953f Fix Carousel fading in chrome +- 5091bd83 Update Bootstrap to version 3.3.0 +- 618350db Display Problems in IE8 for "width: 100% \9;" +- 84a357f1 Move css files for the backend to avoid missunderstandings and add plain default bootstrap.min.css - fixes #61 +- 7dbb159a Adjust language menu for smaller viewports - #65 +- bd77e0a0 Adjust font-size and line-height for better readability +- 1d697bc3 We are always stable ;) +- eb9a85e0 Backendskin is not disabled correctly if option is set +- 5474be4b Add backend layouts for left navigation - fixes #62 +- 1f1ac900 Adjust carousel - fixes #51 +- 3886f279 Add missing space in news date format - fixes #59 +- bb491586 Add caption alignment - fixes #58 +- e7a23a26 Fix small typo +- 13498efd Cleanup configuration for indention frames - fixes #57 +- a5720c9c Cleanup RTE config +- b77c4ce6 Cleanup Tabs #52 +- 9035ae18 Remove forgotten typoscript code for searchbar and login - #50 +- 17695a1c Set cache period to 24h - fixes #55 +- 242d37f0 Correct linkToTop rendering - fixes #54 +- b44573a1 Correct composer.json +- b3196163 Move PARAMS before SOURCECOLLECTION for better HTML code readability. +- 8b2704cd Move img class to params for easier customization. +- aa7d6de8 Add basic google analytics settings +- ddd18ee7 Provide open graph image for social networks +- 672bd9cf Cleanup flip ahead browsing for IE +- 5b12351b Correct dependency to TYPO3 version to ensure that the correct forms are loaded +- e3c3bb94 Update composer.json +- 31a8d99b Fix dynamic rewrite base +- e0cd37b4 Implement a dynamic rewrite base solution reduce problems with some hosters +- 0375b126 Remove some image orient fields to avoid distraction +- b6f1da7c Remove unused link for the image in text with image - fixes #49 +- e8e33893 Avoid error if data for lib.dynamicContent is not provided as array +- e8cd26a3 The title attribute remains empty in mainmenu of onepage variant - fixes #44 +- 7631b768 Allow link tag usage in html content element +- fbe94f93 Split theme less file +- d64540c6 Add new clean backend layout +- 354bd9d2 Add styling constants for ext:themes +- c02611bf Provide options to disable parts of the auto included PageTs settings +- 291515cd Cleanup +- 676034fd Make Bootstrap Package run as a OnePage Website +- c17e975f fix 'Boostrap' typos + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Chris Rebert +- Felix Oertel +- Ian Excedo +- SventB + +# 6.2.5 + +## FEATURE + +- 187c8581 [FEATURE] use SymLinksIfOwnerMatch in .htaccess + +## MISC + +- c86a3480 Release 6.2.5 +- 966bd586 Update Documentation +- 858253eb Add support for link "Edit me on Github" +- d2484b99 Fix workspace problem for related records #37 +- 45db7c4e Make main navbar position configurable +- 9aec7779 Combine less files to avoid dublicate css definitions +- 3d72ea3d Allow Backend Layouts to be configured via PageTsConfig +- 1f50d81f Cleanup less.php integration - fixes #32 +- 60f71fc3 Correct display of tx_form - hopefully +- dc732035 Correct type of baseURL typoscript constant +- bd33fa10 Correct default icon-font-path to avoid problems if page is deployed in a folder - fixes #31 +- 1f78758f Update jQuery version to 1.11.1 +- e2e19f65 Disable imageheight and imagewidth for textpic and image content elements to avoid wrong rendering +- 16a6f996 Avoid problems with hardcoded resource links in login template, remove overriding - fixes #28 +- d9b5c101 Correct label definitions for content elements, $_EXTKEY is not available here - fixes #27 +- 605db345 Add conflict to dyncss to ensure correct less rendering +- 53251485 Cleanup spaces +- 4cbf85f7 Images displayed in one column have no restriction to current layout column - fixes #19 +- adef7ece Update Bootstrap to 3.2.0 +- 58180a16 Correct file locations +- 25fce394 Fix bootstrap less compiler if flattensetup is not available - fixes #20 +- e55d0f17 Cleanup bootstrap file locations +- f016b287 Move bootstrap js to separate folder +- 538ef39c Removing symlink option due problems on windows apache with symlinks - affects #25 +- 46147ae2 Add missing default variables file for bootstrap +- 2f0b0cea Remove backend style module - introduce typoscript constants instead to provide a more flexible less configuration - fixes #5 #20 +- 4160b7aa Update less.php +- c6cfb0ed Move TCA +- 18e5cb33 Text and image - center top was not centered - fixes #21 +- 80993edb Add missing bodytext field to carousel "text and image" and enable rte for accordion - fixes #23 +- a164e5a1 Allow table in RTE +- ed55a6fc Adjust LogoView to make it a bit more secure +- e8a32c06 added fluidpages to conflicts fixes #18 +- 2967c55a Add link to the complete teaser item and fix the relations +- dfa694ca Fix typo +- 2ef1c553 Make it possible to enable backend skin if themes is loaded. +- fdfa43af Make bootstrap_package compatible with themes (part 2) +- 661886df Correct version number +- 1e422c8b Cleanup formatting +- 77414e69 Make bootstrap_package compatible with themes (part 1) +- a8879cda Correct types in constants +- 55b24006 Add TYPO3 version to sitename in backend header +- d97a9d43 Correct wizard registration +- 55e18f4a Add links for carousel images in FE, optimize fal fields. fixes #15 +- 342917cb Update Accordion.html +- 971cc247 add missing text_color field to carousel textwithimage #10 +- 5e1bb9c6 carousel interval and wrap needs to be configurable #10 +- daff0c1c wrong label for header in carousel textwithimage #10 +- 331e51fa cleanup wrong committed stuff before +- fc3b6b8d - cleanup wrong formatting in base.ts - add chash for pagination to prevent cashing issues described in #9 + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Benjamin Kott +- Felix Oertel +- Gökhan Sirin + +# 6.2.4 + +## MISC + +- 52370906 ter does not allow long version numbers ... +- a4608ef1 ter ist fucking up ;( +- c7aaf3c8 set version to 6.2.2.2 +- a3fb4c45 Add Basic Documentation +- 54518d62 correct version to 6.2.2.1 and adjust description +- 84c7b738 Hide navigation toggle if no subpages exist. +- a57cbc3f Fix the height of the header if no subpages available +- da841fe4 Provide an example .htaccess file after installation - fixes #3 +- 72dbbaec tabs and spaces ... +- d3bf38b1 Remove absRefPrefix und add automatic baseURL determination instead. This will ensure that the links and pages are correct if you are running TYPO3 in a subfolder. +- 3bbfa467 Change README to .rst format. Change spelling and wording. +- b79952aa Change README to .rst format. Change spelling and wording. +- 4e6ccbc2 image fix IE +- 4f906769 set version to 6.2.3 for further development +- c407babd cleanup main.js +- 66d905d6 remove rootpage id from realurl due complication with import +- 95e1772c Make absRefPrefix configurable, this is needed when typo3 is running in a subfolder +- 65aac304 set version to 6.2.2 for further development +- 174e9fb7 Remove generated variables from repository +- 93f4c39f Add RealUrl Config +- 27e6edcb Update description +- 1667b223 Update README.md +- 536466a9 set version to 6.2.1 for further development +- 31783df8 set version to 6.2.0 - initial release in ter +- eecd180a RC 6.2 +- 8a43508f Initial commit + +## Contributors + +- Benjamin Kott +- Benjamin Kott +- Martin Bless + diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Backend/ToolbarItem/VersionToolbarItem.php b/public/typo3conf/ext/bootstrap_package/Classes/Backend/ToolbarItem/VersionToolbarItem.php new file mode 100644 index 0000000..de5a570 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Backend/ToolbarItem/VersionToolbarItem.php @@ -0,0 +1,67 @@ +addVersionInformation($event->getToolbarItem()); + } + + /** + * Called by the system information toolbar signal/slot dispatch. + * + * @param SystemInformationToolbarItem $systemInformation + */ + public function addVersionInformation(SystemInformationToolbarItem $systemInformation): void + { + $value = null; + $extensionDirectory = ExtensionManagementUtility::extPath('bootstrap_package'); + + // Try to get current version from git + if (file_exists($extensionDirectory . '.git')) { + CommandUtility::exec('git --version', $_, $returnCode); + if ((int)$returnCode === 0) { + $currentDir = (string) getcwd(); + chdir($extensionDirectory); + $tag = trim(CommandUtility::exec('git tag -l --points-at HEAD')); + if ($tag !== '') { + $value = $tag; + } else { + $branch = trim(CommandUtility::exec('git rev-parse --abbrev-ref HEAD')); + $revision = trim(CommandUtility::exec('git rev-parse --short HEAD')); + $value = $branch . ', ' . $revision; + } + chdir($currentDir); + } + } + + // Fallback to version from extension manager + if ($value === null) { + $value = ExtensionManagementUtility::getExtensionVersion('bootstrap_package'); + } + + // Set system information entry + $systemInformation->addSystemInformation( + 'Bootstrap Package', + htmlspecialchars($value, ENT_QUOTES | ENT_HTML5), + 'systeminformation-bootstrappackage' + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/ConstantsProcessor.php b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/ConstantsProcessor.php new file mode 100644 index 0000000..b10c862 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/ConstantsProcessor.php @@ -0,0 +1,90 @@ +stdWrapValue('key', $processorConfiguration); + if ($key === '') { + $key = 'page'; + } + + // Collect variables + $flatConstants = $this->getFlatConstants($key); + $typoScriptParser = GeneralUtility::makeInstance(TypoScriptParser::class); + $typoScriptParser->parse($flatConstants); + $typoScriptArray = $typoScriptParser->setup; + $typoScriptService = GeneralUtility::makeInstance(TypoScriptService::class); + $constants = $typoScriptService->convertTypoScriptArrayToPlainArray($typoScriptArray); + + // Set the target variable + $targetVariableName = (string) $cObj->stdWrapValue('as', $processorConfiguration); + if ($targetVariableName !== '') { + $processedData[$targetVariableName] = $constants; + } else { + $processedData['constants'] = $constants; + } + + return $processedData; + } + + /** + * @param string $key + * @return string + */ + protected function getFlatConstants($key): string + { + $flatvariables = ''; + $prefix = $key . '.'; + if ($GLOBALS['TSFE']->tmpl->flatSetup === null + || !is_array($GLOBALS['TSFE']->tmpl->flatSetup) + || count($GLOBALS['TSFE']->tmpl->flatSetup) === 0) { + $GLOBALS['TSFE']->tmpl->generateConfig(); + } + foreach ($GLOBALS['TSFE']->tmpl->flatSetup as $constant => $value) { + if (strpos($constant, $prefix) === 0) { + $flatvariables .= substr($constant, strlen($prefix)) . ' = ' . $value . PHP_EOL; + } + } + return $flatvariables; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/ContainerContextProcessor.php b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/ContainerContextProcessor.php new file mode 100644 index 0000000..01e67c7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/ContainerContextProcessor.php @@ -0,0 +1,79 @@ +getContainerContext( + $this->getPageRecords($cObj, $processedData['data']['pid']), + $processedData['data'] + ); + $processedData['containerContext'] = array_reverse($processedData['containerContext']); + + return $processedData; + } + + public function getContainerContext(array $pageRecords, array $data, int $level = 1): array + { + $containerContext = []; + if (isset($data['tx_container_parent']) && isset($pageRecords[$data['tx_container_parent']])) { + $parent = $pageRecords[$data['tx_container_parent']]; + $containerContext[] = $parent; + $containerContext = array_merge( + $containerContext, + $this->getContainerContext($pageRecords, $parent, $level++) + ); + } + + return $containerContext; + } + + public function getPageRecords(ContentObjectRenderer $cObj, int $pid): array + { + $runtimeCache = GeneralUtility::makeInstance(CacheManager::class)->getCache('runtime'); + $cache = \is_array($runtimeCache->get('containerContext')) ? $runtimeCache->get('containerContext') : []; + $cacheIdentifier = 'containerContext:' . $pid; + + if (!isset($cache[$cacheIdentifier])) { + $records = $cObj->getRecords('tt_content', ['pidInList' => $pid]); + $dataset = []; + foreach ($records as $record) { + $dataset[$record['uid']] = $record; + } + + $cache[$cacheIdentifier] = $dataset; + $runtimeCache->set('containerContext', $cache); + } + + return $cache[$cacheIdentifier]; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/CsvFileProcessor.php b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/CsvFileProcessor.php new file mode 100644 index 0000000..01ee5c5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/CsvFileProcessor.php @@ -0,0 +1,74 @@ +stdWrapValue('maximumColumns', $processorConfiguration, '0'); + + // Set the field delimiter which is "," by default + $fieldDelimiter = (string) $cObj->stdWrapValue('fieldDelimiter', $processorConfiguration, ','); + + // Set the field enclosure which is " by default + $fieldEnclosure = (string) $cObj->stdWrapValue('fieldEnclosure', $processorConfiguration, '"'); + + // Get processed files + $processedData = parent::process($cObj, $contentObjectConfiguration, $processorConfiguration, $processedData); + $targetVariableName = (string) $cObj->stdWrapValue('as', $processorConfiguration, 'files'); + $files = $processedData[$targetVariableName]; + unset($processedData[$targetVariableName]); + + foreach ($files as $key => $value) { + if (is_object($value) && ($value instanceof FileReference || $value instanceof File)) { + /** @var ProcessedFile $value */ + if ($value->getExtension() !== 'csv') { + unset($files[$key]); + } else { + $originalFile = $value->getOriginalFile(); + $content = $originalFile->getContents(); + $files[$key] = [ + 'file' => $value, + 'bodytext' => $content, + 'table' => CsvUtility::csvToArray( + $content, + $fieldDelimiter, + $fieldEnclosure, + $maximumColumns + ) + ]; + } + } + } + $files = array_values(array_filter($files)); + $processedData[$targetVariableName] = $files; + + return $processedData; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/FileFilterProcessor.php b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/FileFilterProcessor.php new file mode 100644 index 0000000..185b503 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/FileFilterProcessor.php @@ -0,0 +1,102 @@ + isset($confVars['GFX']['imagefile_ext']) ? $confVars['GFX']['imagefile_ext'] : 'gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai,svg', + 'media' => isset($confVars['SYS']['mediafile_ext']) ? $confVars['SYS']['mediafile_ext'] : 'gif,jpg,jpeg,bmp,png,pdf,svg,ai,mp3,wav,mp4,ogg,flac,opus,webm,youtube,vimeo', + 'text' => isset($confVars['SYS']['textfile_ext']) ? $confVars['SYS']['textfile_ext'] : 'txt,ts,typoscript,html,htm,css,tmpl,js,sql,xml,csv,xlf,yaml,yml', + ]; + $predefinedList = (string) $cObj->stdWrapValue('predefinedList', $processorConfiguration, 'image'); + $allowedFileExtensions = isset($predefinedLists[$predefinedList]) ? $predefinedLists[$predefinedList] : ''; + $allowedFileExtensions = GeneralUtility::trimExplode(',', (string) $cObj->stdWrapValue('allowedFileExtensions', $processorConfiguration, $allowedFileExtensions)); + if (count($allowedFileExtensions) === 0) { + return $processedData; + } + + $variableName = (string) $cObj->stdWrapValue('variableName', $processorConfiguration, 'files'); + if (!isset($processedData[$variableName]) || count($processedData[$variableName]) === 0) { + return $processedData; + } + + foreach ($processedData[$variableName] as $key => $value) { + if (is_object($value) + && ($value instanceof FileReference || $value instanceof File) + && !in_array($value->getExtension(), $allowedFileExtensions, true) + ) { + unset($processedData[$variableName][$key]); + } + } + + return $processedData; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/FlexFormProcessor.php b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/FlexFormProcessor.php new file mode 100644 index 0000000..e2a25d0 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/FlexFormProcessor.php @@ -0,0 +1,84 @@ +flexFormService = GeneralUtility::makeInstance(FlexFormService::class); + } + + /** + * @param ContentObjectRenderer $cObj The data of the content element or page + * @param array $contentObjectConfiguration The configuration of Content Object + * @param array $processorConfiguration The configuration of this processor + * @param array $processedData Key/value store of processed data (e.g. to be passed to a Fluid View) + * @return array the processed data as key/value store + */ + public function process(ContentObjectRenderer $cObj, array $contentObjectConfiguration, array $processorConfiguration, array $processedData) + { + // The field name to process + $fieldName = (string) $cObj->stdWrapValue('fieldName', $processorConfiguration); + if ($fieldName === '') { + $fieldName = 'pi_flexform'; + } + if (!isset($processedData['data'][$fieldName])) { + return $processedData; + } + + // Process Flexform + $originalValue = $processedData['data'][$fieldName]; + if (!is_string($originalValue)) { + return $processedData; + } + $flexformData = $this->flexFormService->convertFlexFormContentToArray($originalValue); + + // Set the target variable + $targetVariableName = (string) $cObj->stdWrapValue('as', $processorConfiguration); + if ($targetVariableName !== '') { + $processedData[$targetVariableName] = $flexformData; + } else { + $processedData['data'][$fieldName] = $flexformData; + } + + return $processedData; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/IconsDataProcessor.php b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/IconsDataProcessor.php new file mode 100644 index 0000000..ab8f70f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/IconsDataProcessor.php @@ -0,0 +1,91 @@ +iconService = GeneralUtility::makeInstance(IconService::class); + } + + /** + * @param ContentObjectRenderer $cObj The data of the content element or page + * @param array $contentObjectConfiguration The configuration of Content Object + * @param array $processorConfiguration The configuration of this processor + * @param array $processedData Key/value store of processed data (e.g. to be passed to a Fluid View) + * @return array the processed data as key/value store + */ + public function process(ContentObjectRenderer $cObj, array $contentObjectConfiguration, array $processorConfiguration, array $processedData) + { + $icon = null; + $config = [ + 'iconSet' => (string) $cObj->stdWrapValue('iconSet', $processorConfiguration, ''), + 'iconIdentifier' => (string) $cObj->stdWrapValue('iconIdentifier', $processorConfiguration, ''), + 'iconFileFieldName' => (string) $cObj->stdWrapValue('iconFileFieldName', $processorConfiguration, ''), + ]; + + if ($config['iconSet'] !== '' && $config['iconIdentifier'] !== '') { + $iconProvider = $this->iconService->getIconProviderForIdentifier($config['iconSet']); + if ($iconProvider !== null) { + $icon = $iconProvider->getIconList()->getIcon($config['iconIdentifier']); + } + } elseif ($config['iconFileFieldName'] !== '') { + $filesProcessor = GeneralUtility::makeInstance(FilesProcessor::class); + $filesData = $filesProcessor->process( + $cObj, + $contentObjectConfiguration, + ['references.' => ['fieldName' => $config['iconFileFieldName']]], + ['data' => $processedData['data']] + ); + if (isset($filesData['files'][0])) { + $file = $filesData['files'][0]; + $icon = (new FileIcon()) + ->setFile($file) + ->setIdentifier($file->getIdentifier()) + ->setName($file->getName()) + ->setPreviewImage($file->getPublicUrl()) + ; + } + } + + $targetVariableName = (string) $cObj->stdWrapValue('as', $processorConfiguration, 'icon'); + $processedData[$targetVariableName] = $icon; + + return $processedData; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/StaticFilesProcessor.php b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/StaticFilesProcessor.php new file mode 100644 index 0000000..a05e446 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/DataProcessing/StaticFilesProcessor.php @@ -0,0 +1,81 @@ +checkIf($processorConfiguration['if.'])) { + return $processedData; + } + + // Collect possible files + $files = []; + if (count($processorConfiguration['files.']) > 0) { + $filesConfiguration = $processorConfiguration['files.']; + foreach ($filesConfiguration as $key => $file) { + $key = substr($key, -1) === '.' ? substr_replace($key, '', -1) : $key; + $value = (string) $cObj->stdWrapValue($key, $filesConfiguration); + if ($value !== '') { + $files[$key] = $value; + } + } + } + + // Get file objects + $images = []; + if (count($files) !== 0) { + $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class); + foreach ($files as $key => $file) { + $absFilename = GeneralUtility::getFileAbsFileName($file); + if (file_exists($absFilename)) { + // Do not use absolute file name to ensure correct path resolution from ResourceFactory. + $images[$key] = $resourceFactory->retrieveFileOrFolderObject($file); + } + } + } + + // Set the target variable + $targetVariableName = (string) $cObj->stdWrapValue('as', $processorConfiguration); + if ($targetVariableName !== '') { + $processedData[$targetVariableName] = $images; + } else { + $processedData['staticFiles'] = $images; + } + + return $processedData; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ExpressionLanguage/ConditionProvider.php b/public/typo3conf/ext/bootstrap_package/Classes/ExpressionLanguage/ConditionProvider.php new file mode 100644 index 0000000..597ec9a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ExpressionLanguage/ConditionProvider.php @@ -0,0 +1,27 @@ +expressionLanguageVariables = [ + 'extension' => GeneralUtility::makeInstance(ExtensionWrapper::class) + ]; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ExpressionLanguage/ExtensionWrapper.php b/public/typo3conf/ext/bootstrap_package/Classes/ExpressionLanguage/ExtensionWrapper.php new file mode 100644 index 0000000..805987b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ExpressionLanguage/ExtensionWrapper.php @@ -0,0 +1,28 @@ +initializeResultArray(); + $parameterArray = $this->data['parameterArray']; + + $iconSetField = $parameterArray['fieldConf']['config']['itemsProcConfig']['iconSetField'] ?? 'icon_set'; + $iconProviderIdentifier = $this->data['databaseRow'][$iconSetField][0] ?? ''; + $iconProvider = GeneralUtility::makeInstance(IconService::class)->getIconProviderForIdentifier($iconProviderIdentifier); + $iconList = $iconProvider !== null ? $iconProvider->getIconList() : null; + + $selectItems = $parameterArray['fieldConf']['config']['items']; + $selectItemCounter = 0; + foreach ($selectItems as $item) { + if ((new Typo3Version())->getMajorVersion() < 12) { + $item = [ + 'label' => $item[0] ?? '', + 'value' => $item[1] ?? '', + 'icon' => $item[2] ?? '', + ]; + } + + if ($item['value'] === '--div--') { + continue; + } + + $icon = null; + if ($iconList !== null) { + $iconSetIcon = $iconList->getIcon((string) $item['value']); + if ($iconSetIcon !== null) { + $iconSetIcon->setHeight(32); + $iconSetIcon->setWidth(32); + $icon = $iconSetIcon->render(); + } + } + + if ($icon === null) { + $icon = isset($item['icon']) && trim($item['icon']) !== '' ? FormEngineUtility::getIconHtml($item['icon'], $item['label'], $item['label']) : ''; + } + + if ($icon !== '') { + $fieldValue = $this->data['databaseRow'][$this->data['fieldName']]; + $selectIcons[] = [ + 'title' => $item['label'], + 'active' => ($fieldValue[0] ?? false) === (string)($item['value'] ?? ''), + 'icon' => $icon, + 'index' => $selectItemCounter, + ]; + } + $selectItemCounter++; + } + + $html = []; + if (count($selectIcons) > 0) { + if ((new Typo3Version())->getMajorVersion() < 12) { + $html[] = '
'; + $html[] = '
'; + foreach ($selectIcons as $selectIcon) { + $active = $selectIcon['active'] ? ' active' : ''; + $html[] = ''; + } + $html[] = '
'; + $html[] = '
'; + } else { + $html[] = '
'; + foreach ($selectIcons as $selectIcon) { + $active = $selectIcon['active'] ? ' active' : ''; + $html[] = ''; + } + $html[] = '
'; + } + } + + $result['html'] = implode(LF, $html); + return $result; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Hooks/PageRenderer/GoogleFontHook.php b/public/typo3conf/ext/bootstrap_package/Classes/Hooks/PageRenderer/GoogleFontHook.php new file mode 100644 index 0000000..34cef74 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Hooks/PageRenderer/GoogleFontHook.php @@ -0,0 +1,110 @@ + 'cssLibs', + 'includeCSS' => 'cssFiles' + ]; + + /** + * @var \BK2K\BootstrapPackage\Service\GoogleFontService + */ + protected $googleFontService; + + /** + * @param array $params + * @param \TYPO3\CMS\Core\Page\PageRenderer $pagerenderer + */ + public function execute(&$params, &$pagerenderer): void + { + if (!($GLOBALS['TYPO3_REQUEST'] ?? null) instanceof ServerRequestInterface || + !ApplicationType::fromRequest($GLOBALS['TYPO3_REQUEST'])->isFrontend() || + (!is_array($params['cssFiles']) && !is_array($params['cssLibs'])) + ) { + return; + } + + foreach ($this->includeMapping as $include => $section) { + if (is_array($params[$section])) { + $files = []; + foreach ($params[$section] as $file => $settings) { + $cachedFile = $this->getGoogleFontService()->getCachedFile($file); + if ($cachedFile !== null) { + $this->adjustTypoScriptCssConfiguration($include, $file, $cachedFile); + $settings['file'] = $cachedFile; + $files[$cachedFile] = $settings; + } else { + $files[$file] = $settings; + } + $params[$section] = $files; + } + } + } + } + + /** + * @param string $include + * @param string $file + * @param string $cachedFile + */ + protected function adjustTypoScriptCssConfiguration($include, $file, $cachedFile): void + { + $includeFilesConfiguration = $this->getTemplateService()->setup['page.'][$include . '.']; + if (is_array($includeFilesConfiguration) && count($includeFilesConfiguration) > 0) { + foreach ($includeFilesConfiguration as $includeKey => $includeFilename) { + if (substr($includeKey, -1) === '.') { + continue; + } + if ($file === $includeFilename) { + $this->getTemplateService()->setup['page.'][$include . '.'][$includeKey] = $cachedFile; + break; + } + } + } + } + + /** + * Get the google font service + * + * @return GoogleFontService + */ + protected function getGoogleFontService(): GoogleFontService + { + if ($this->googleFontService === null) { + $this->googleFontService = GeneralUtility::makeInstance(GoogleFontService::class); + } + return $this->googleFontService; + } + + /** + * @return TemplateService + */ + private function getTemplateService(): TemplateService + { + $frontendController = $GLOBALS['TYPO3_REQUEST']->getAttribute('frontend.controller', $GLOBALS['TSFE']); + return $frontendController->tmpl; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Hooks/PageRenderer/PreProcessHook.php b/public/typo3conf/ext/bootstrap_package/Classes/Hooks/PageRenderer/PreProcessHook.php new file mode 100644 index 0000000..0fea7fe --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Hooks/PageRenderer/PreProcessHook.php @@ -0,0 +1,67 @@ +isFrontend()) { + return; + } + + foreach (['cssLibs', 'cssFiles'] as $key) { + $files = []; + if (is_array($params[$key])) { + foreach ($params[$key] as $file => $settings) { + $compiledFile = $this->getCompileService()->getCompiledFile($file); + if ($compiledFile !== null) { + $settings['file'] = $compiledFile; + $files[$compiledFile] = $settings; + } else { + $files[$file] = $settings; + } + } + $params[$key] = $files; + } + } + } + + /** + * Get the compile service + * + * @return CompileService + */ + protected function getCompileService(): CompileService + { + if ($this->compileService === null) { + $this->compileService = GeneralUtility::makeInstance(CompileService::class); + } + return $this->compileService; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Icons/AbstractIcon.php b/public/typo3conf/ext/bootstrap_package/Classes/Icons/AbstractIcon.php new file mode 100644 index 0000000..2ce0e06 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Icons/AbstractIcon.php @@ -0,0 +1,140 @@ +identifier = $identifier; + return $this; + } + + /** + * @return string + */ + public function getIdentifier(): string + { + return $this->identifier; + } + + /** + * @param string $name + * @return self + */ + public function setName(string $name) + { + $this->name = $name; + return $this; + } + + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * @param string $previewImage + * @return self + */ + public function setPreviewImage(string $previewImage) + { + $this->previewImage = $previewImage; + return $this; + } + + /** + * @return string + */ + public function getPreviewImage(): string + { + return $this->previewImage; + } + + /** + * @param int $height + * @return self + */ + public function setHeight(int $height) + { + $this->height = $height; + return $this; + } + + /** + * @return int + */ + public function getHeight(): int + { + return $this->height; + } + + /** + * @param int $width + * @return self + */ + public function setWidth(int $width) + { + $this->width = $width; + return $this; + } + + /** + * @return int + */ + public function getWidth(): int + { + return $this->width; + } + + /** + * @return string + */ + public function render(): string + { + return ''; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Icons/FileIcon.php b/public/typo3conf/ext/bootstrap_package/Classes/Icons/FileIcon.php new file mode 100644 index 0000000..f8473c5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Icons/FileIcon.php @@ -0,0 +1,84 @@ +file = $file; + return $this; + } + + /** + * @return FileInterface + */ + public function getFile(): FileInterface + { + return $this->file; + } + + /** + * @return string + */ + public function render(): string + { + try { + $imageService = GeneralUtility::makeInstance(ImageService::class); + $image = $imageService->getImage('', $this->file, false); + $height = $this->getHeight(); + $width = $this->getWidth(); + + if ($image->getExtension() === 'svg') { + return SvgUtility::getInlineSvg('', $image, $width, $height); + } + + $processingInstructions = [ + 'width' => $width . 'c', + 'height' => $height . 'c' + ]; + $processedImage = $imageService->applyProcessingInstructions($image, $processingInstructions); + $imageUri = $imageService->getImageUri($processedImage); + + return ''; + } catch (ResourceDoesNotExistException $e) { + // thrown if file does not exist + throw new \Exception($e->getMessage(), 1628773040, $e); + } catch (\UnexpectedValueException $e) { + // thrown if a file has been replaced with a folder + throw new \Exception($e->getMessage(), 1628773041, $e); + } catch (\RuntimeException $e) { + // RuntimeException thrown if a file is outside of a storage + throw new \Exception($e->getMessage(), 1628773042, $e); + } catch (\InvalidArgumentException $e) { + // thrown if file storage does not exist + throw new \Exception($e->getMessage(), 1628773043, $e); + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Icons/GlyphiconsProvider.php b/public/typo3conf/ext/bootstrap_package/Classes/Icons/GlyphiconsProvider.php new file mode 100644 index 0000000..b0f7cca --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Icons/GlyphiconsProvider.php @@ -0,0 +1,74 @@ + $fileinfo) { + if ($fileinfo instanceof \SplFileInfo + && $fileinfo->isFile() + && strtolower($fileinfo->getExtension()) === 'svg' + ) { + $icons->addIcon( + (new SvgIcon()) + ->setSrc($directory . $fileinfo->getFilename()) + ->setIdentifier($directory . $fileinfo->getFilename()) + ->setName($fileinfo->getBasename('.' . $fileinfo->getExtension())) + ->setPreviewImage($directory . $fileinfo->getFilename()) + ); + } + } + + return $icons; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Icons/IconInterface.php b/public/typo3conf/ext/bootstrap_package/Classes/Icons/IconInterface.php new file mode 100644 index 0000000..1293b01 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Icons/IconInterface.php @@ -0,0 +1,76 @@ +icons; + } + + /** + * @param IconInterface $icon + * @return self + */ + public function addIcon(IconInterface $icon): self + { + $this->icons[$icon->getIdentifier()] = $icon; + return $this; + } + + /** + * @param IconInterface $icon + * @return self + */ + public function removeIcon(IconInterface $icon): self + { + if (isset($this->icons[$icon->getIdentifier()])) { + unset($this->icons[$icon->getIdentifier()]); + } + return $this; + } + + /** + * @param string $identifier + * @return IconInterface|null + */ + public function getIcon(string $identifier): ?IconInterface + { + return $this->icons[$identifier] ?? null; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Icons/IconProviderInterface.php b/public/typo3conf/ext/bootstrap_package/Classes/Icons/IconProviderInterface.php new file mode 100644 index 0000000..282a38c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Icons/IconProviderInterface.php @@ -0,0 +1,37 @@ + $fileinfo) { + if ($fileinfo instanceof \SplFileInfo + && $fileinfo->isFile() + && strtolower($fileinfo->getExtension()) === 'svg' + ) { + $icons->addIcon( + (new SvgIcon()) + ->setSrc($directory . $fileinfo->getFilename()) + ->setIdentifier($directory . $fileinfo->getFilename()) + ->setName($fileinfo->getBasename('.' . $fileinfo->getExtension())) + ->setPreviewImage($directory . $fileinfo->getFilename()) + ); + } + } + + return $icons; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Icons/SvgIcon.php b/public/typo3conf/ext/bootstrap_package/Classes/Icons/SvgIcon.php new file mode 100644 index 0000000..385f396 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Icons/SvgIcon.php @@ -0,0 +1,54 @@ +src = $src; + return $this; + } + + /** + * @return string + */ + public function getSrc(): string + { + return $this->src; + } + + /** + * @return string + */ + public function render(): string + { + $src = $this->getSrc(); + $height = $this->getHeight(); + $width = $this->getWidth(); + + return SvgUtility::getInlineSvg($src, null, $width, $height); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Parser/AbstractParser.php b/public/typo3conf/ext/bootstrap_package/Classes/Parser/AbstractParser.php new file mode 100644 index 0000000..79898fd --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Parser/AbstractParser.php @@ -0,0 +1,133 @@ +getCacheIdentifier($file, $settings); + $cacheFile = $this->getCacheFile($cacheIdentifier, $settings['cache']['tempDirectory']); + $cacheFileMeta = $this->getCacheFileMeta($cacheFile); + + return file_exists($cacheFile) && file_exists($cacheFileMeta); + } + + /** + * @param string $cacheFile + * @param string $cacheFileMeta + * @param array $settings + * @return bool + */ + protected function needsCompile(string $cacheFile, string $cacheFileMeta, array $settings): bool + { + $needCompilation = false; + $fileModificationTime = filemtime($cacheFile); + $metadata = unserialize((string) file_get_contents($cacheFileMeta), ['allowed_classes' => false]); + + foreach ($metadata['files'] as $file) { + if (filemtime($file) > $fileModificationTime) { + $needCompilation = true; + break; + } + } + + if (!$needCompilation && $settings['variables'] !== $metadata['variables']) { + $needCompilation = true; + } + + if (!$needCompilation && $settings['options']['sourceMap'] !== $metadata['sourceMap']) { + $needCompilation = true; + } + + return $needCompilation; + } + + /** + * @param string $cacheIdentifier + * @param string $tempDirectory + * @return string + */ + protected function getCacheFile(string $cacheIdentifier, string $tempDirectory): string + { + return $tempDirectory . $cacheIdentifier . '.css'; + } + + /** + * @param string $filename + * @return string + */ + protected function getCacheFileMeta(string $filename) + { + return $filename . '.meta'; + } + + /** + * @param string $file + * @param array $settings + * @return string + */ + protected function getCacheIdentifier(string $file, array $settings): string + { + $filehash = md5($file); + $hash = hash('sha256', $filehash . serialize($settings)); + $extension = pathinfo($file, PATHINFO_EXTENSION); + + return basename($file, '.' . $extension) . '-' . $hash; + } + + /** + * @return string + */ + protected function getPathSite(): string + { + return Environment::getPublicPath() . '/'; + } + + /** + * Clear all page caches + * @throws \TYPO3\CMS\Core\Cache\Exception\NoSuchCacheGroupException + */ + protected function clearPageCaches(): void + { + GeneralUtility::makeInstance(CacheManager::class)->flushCachesInGroup('pages'); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Parser/ParserInterface.php b/public/typo3conf/ext/bootstrap_package/Classes/Parser/ParserInterface.php new file mode 100644 index 0000000..0054c9b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Parser/ParserInterface.php @@ -0,0 +1,29 @@ +getCacheIdentifier($file, $settings); + $cacheFile = $this->getCacheFile($cacheIdentifier, $settings['cache']['tempDirectory']); + $cacheFileMeta = $this->getCacheFileMeta($cacheFile); + $compile = false; + + if (!$this->isCached($file, $settings) + || $this->needsCompile($cacheFile, $cacheFileMeta, $settings)) { + $compile = true; + } + + if ($compile) { + $result = $this->parseFile($file, $settings); + GeneralUtility::writeFile(GeneralUtility::getFileAbsFileName($cacheFile), $result['css']); + GeneralUtility::writeFile(GeneralUtility::getFileAbsFileName($cacheFileMeta), serialize($result['cache'])); + $this->clearPageCaches(); + } + + return $cacheFile; + } + + /** + * @param string $file + * @param array $settings + * @return array + */ + protected function parseFile(string $file, array $settings): array + { + $scss = new Compiler(); + $scss->setOutputStyle(OutputStyle::COMPRESSED); + $scss->addVariables($settings['variables']); + if ($settings['options']['sourceMap']) { + $scss->setSourceMap(Compiler::SOURCE_MAP_INLINE); + $scss->setSourceMapOptions([ + 'sourceMapRootpath' => $settings['cache']['tempDirectoryRelativeToRoot'], + 'sourceMapBasepath' => '' + ]); + } + $absoluteFilename = $settings['file']['absolute']; + // Adds visual directory path of the initial file as import path + // This scenarios happens, when e.g. developing packages using the `path` + // repository feature of Composer - having one package in `public/typo3conf/ext/` + // and the other one symlinked in e.g. `packages/`. + // Since the PHP SCSS parser works on resolved real paths, the symlinked context is lost. + $visualImportPath = dirname($absoluteFilename); + $scss->addImportPath(function ($url) use ($visualImportPath): ?string { + // Resolve potential back paths manually using PathUtility::getCanonicalPath, + // but make sure we do not break out of TYPO3 application path using GeneralUtility::getFileAbsFileName + // Also resolve EXT: paths if given + $isTypo3Absolute = (strpos($url, 'EXT:') === 0) || PathUtility::isAbsolutePath($url); + $fileName = $isTypo3Absolute ? $url : $visualImportPath . '/' . $url; + $full = GeneralUtility::getFileAbsFileName(PathUtility::getCanonicalPath($fileName)); + // The API forces us to check the existence of files paths, with or without url. + // We must only return a string if the file to be imported actually exists. + $hasExtension = (bool) preg_match('/[.]s?css$/', $url); + if ( + is_file($file = $full . '.scss') || + ($hasExtension && is_file($file = $full)) + ) { + // We could trigger a deprecation message here at some point + return $file; + } + + return null; + }); + // Add extensions path to import paths, so that we can use paths relative to this directory to resolve imports + $scss->addImportPath(Environment::getExtensionsPath()); + + // Make paths in url() statements relative to site root + $absoluteFilePath = dirname($absoluteFilename); + $relativeFilePath = PathUtility::getAbsoluteWebPath($absoluteFilePath); + $absoluteBootstrapPackageThemePath = + ExtensionManagementUtility::extPath('bootstrap_package') . 'Resources/Public/Scss/Theme'; + $relativeBootstrapPackageThemePath = PathUtility::getAbsoluteWebPath($absoluteBootstrapPackageThemePath); + $scss->registerFunction( + 'url', + function ($args) use ( + $scss, + $absoluteFilePath, + $relativeFilePath, + $absoluteBootstrapPackageThemePath, + $relativeBootstrapPackageThemePath + ) : string { + $marker = $args[0][1]; + $args[0][1] = ''; + $result = $scss->compileValue($args[0]); + if (substr_compare($result, 'data:', 0, 5, true) !== 0) { + if (is_file(PathUtility::getCanonicalPath($absoluteFilePath . '/' . $result))) { + $result = PathUtility::getCanonicalPath($relativeFilePath . '/' . $result); + } elseif (is_file(PathUtility::getCanonicalPath($absoluteBootstrapPackageThemePath . '/' . $result))) { + $result = PathUtility::getCanonicalPath($relativeBootstrapPackageThemePath . '/' . $result); + } + $result = substr($result, 0, 1) === '/' ? substr($result, 1) : $result; + } + return 'url(' . $marker . $result . $marker . ')'; + } + ); + + // Compile file + $compilationResult = $scss->compileString('@import "' . $absoluteFilename . '"'); + $css = $compilationResult->getCss(); + + // Fix paths in url() statements to be relative to temp directory + $relativeTempPath = $settings['cache']['tempDirectoryRelativeToRoot']; + $search = '%url\s*\(\s*[\\\'"]?(?!(((?:https?:)?\/\/)|(?:data:?:)))([^\\\'")]+)[\\\'"]?\s*\)%'; + $replace = 'url("' . $relativeTempPath . '$3")'; + $css = (string) preg_replace($search, $replace, $css); + + return [ + 'css' => $css, + 'cache' => [ + 'version' => Version::VERSION, + 'date' => date('r'), + 'css' => $css, + 'etag' => md5($css), + 'files' => $compilationResult->getIncludedFiles(), + 'variables' => $settings['variables'], + 'sourceMap' => $settings['options']['sourceMap'] + ] + ]; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Service/BrandingService.php b/public/typo3conf/ext/bootstrap_package/Classes/Service/BrandingService.php new file mode 100644 index 0000000..d7a67f0 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Service/BrandingService.php @@ -0,0 +1,60 @@ +getPackageKey() === 'bootstrap_package') { + $this->setBackendStyling(); + } + } + + public function setBackendStyling(): void + { + if (class_exists(ExtensionConfiguration::class)) { + $extensionConfiguration = GeneralUtility::makeInstance( + ExtensionConfiguration::class + ); + $backendConfiguration = $extensionConfiguration->get('backend'); + + if (!isset($backendConfiguration['loginLogo']) || trim($backendConfiguration['loginLogo']) === '') { + $backendConfiguration['loginLogo'] = 'EXT:bootstrap_package/Resources/Public/Images/Backend/login-logo.svg'; + } + if (!isset($backendConfiguration['loginBackgroundImage']) || trim($backendConfiguration['loginBackgroundImage']) === '') { + $backendConfiguration['loginBackgroundImage'] = 'EXT:bootstrap_package/Resources/Public/Images/Backend/login-background-image.jpg'; + } + if (!isset($backendConfiguration['backendLogo']) || trim($backendConfiguration['backendLogo']) === '') { + $backendConfiguration['backendLogo'] = 'EXT:bootstrap_package/Resources/Public/Images/Backend/backend-logo.svg'; + } + + // Workaround for + // https://review.typo3.org/c/Packages/TYPO3.CMS/+/62650 + $reflection = new \ReflectionClass(ExtensionConfiguration::class); + $parameters = $reflection->getMethod('set')->getParameters(); + $arguments = []; + $arguments[] = 'backend'; + if (count($parameters) === 3) { + $arguments[] = ''; + } + $arguments[] = $backendConfiguration; + + $extensionConfiguration->set(...$arguments); + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Service/CompileService.php b/public/typo3conf/ext/bootstrap_package/Classes/Service/CompileService.php new file mode 100644 index 0000000..3c028e2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Service/CompileService.php @@ -0,0 +1,142 @@ +tmpl->setup['plugin.']['tx_bootstrappackage.']['settings.'] ?? []; + + // Ensure cache directory exists + if (!file_exists(Environment::getPublicPath() . '/' . $this->tempDirectory)) { + GeneralUtility::mkdir_deep(Environment::getPublicPath() . '/' . $this->tempDirectory); + } + + // Settings + $settings = [ + 'file' => [ + 'absolute' => $absoluteFile, + 'relative' => $file, + 'info' => pathinfo($absoluteFile) + ], + 'cache' => [ + 'tempDirectory' => $this->tempDirectory, + 'tempDirectoryRelativeToRoot' => $this->tempDirectoryRelativeToRoot, + ], + 'options' => [ + 'override' => $configuration['overrideParserVariables'] ? true: false, + 'sourceMap' => $configuration['cssSourceMapping'] ? true : false, + 'compress' => true + ], + 'variables' => [] + ]; + + // Parser + if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/bootstrap-package/css']['parser']) + && is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/bootstrap-package/css']['parser']) + ) { + foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/bootstrap-package/css']['parser'] as $className) { + $parser = GeneralUtility::makeInstance($className); + if ($parser instanceof ParserInterface + && isset($settings['file']['info']['extension']) + && $parser->supports($settings['file']['info']['extension']) + ) { + if ($configuration['overrideParserVariables']) { + $settings['variables'] = $this->getVariablesFromConstants($settings['file']['info']['extension']); + } + try { + return $parser->compile($file, $settings); + } catch (\Exception $e) { + $this->clearCompilerCaches(); + throw $e; + } + } + } + } + + return null; + } + + /** + * @param string $extension + * @return array + */ + protected function getVariablesFromConstants(string $extension): array + { + $constants = $this->getConstants(); + $extension = strtolower($extension); + $variables = []; + + // Fetch Google Font + $variables['google-webfont'] = 'sans-serif'; + if (isset($constants['page.theme.googleFont.enable']) + && (bool) $constants['page.theme.googleFont.enable'] + && isset($constants['page.theme.googleFont.font']) + && $constants['page.theme.googleFont.font'] !== '' + ) { + $variables['google-webfont'] = $constants['page.theme.googleFont.font']; + } + + // Fetch settings + $prefix = 'plugin.bootstrap_package.settings.' . $extension . '.'; + foreach ($constants as $constant => $value) { + if (strpos($constant, $prefix) === 0) { + $variables[substr($constant, strlen($prefix))] = $value; + } + } + + return $variables; + } + + /** + * @return array + */ + protected function getConstants(): array + { + if ($GLOBALS['TSFE']->tmpl->flatSetup === null + || !is_array($GLOBALS['TSFE']->tmpl->flatSetup) + || count($GLOBALS['TSFE']->tmpl->flatSetup) === 0) { + $GLOBALS['TSFE']->tmpl->generateConfig(); + } + return $GLOBALS['TSFE']->tmpl->flatSetup; + } + + /** + * Clear all caches for the compiler. + */ + protected function clearCompilerCaches(): void + { + GeneralUtility::rmdir(Environment::getPublicPath() . '/' . $this->tempDirectory, true); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Service/GoogleFontService.php b/public/typo3conf/ext/bootstrap_package/Classes/Service/GoogleFontService.php new file mode 100644 index 0000000..986e6f5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Service/GoogleFontService.php @@ -0,0 +1,157 @@ +supports($file)) { + return null; + } + if ($this->isCached($file)) { + return $this->getCssFileCacheName($file); + } + return $this->cacheFile($file) ? $this->getCssFileCacheName($file) : null; + } + + /** + * @param string $file + * @return bool + */ + protected function cacheFile(string $file): bool + { + /** @var RequestFactory */ + $requestFactory = GeneralUtility::makeInstance(RequestFactory::class); + + /** @var ResponseInterface */ + $response = $requestFactory->request($file, 'GET', [ + 'headers' => ['User-Agent' => 'Mozilla/5.0 Gecko/20100101 Firefox/94.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'] + ]); + + if ($response->getStatusCode() >= 300) { + return false; + } else { + $content = $response->getBody()->getContents(); + } + + // Ensure cache directory exists + GeneralUtility::mkdir_deep($this->tempDirectory . '/' . $this->getCacheIdentifier($file)); + + // Find and Download font files + $pattern = '%url\((.*?)\)%'; + preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); + $fontFiles = []; + foreach ($matches as $match) { + $fontFiles[$match[1]] = $match[1]; + } + foreach ($fontFiles as $fontFile) { + $localFontFile = $this->getCacheDirectory($file) . '/' . basename($fontFile); + /** @var ResponseInterface */ + $response = $requestFactory->request($fontFile); + if ($response->getStatusCode() >= 300) { + continue; + } else { + $fontFileContent = $response->getBody()->getContents(); + } + file_put_contents($localFontFile, $fontFileContent); + GeneralUtility::fixPermissions($localFontFile); + $content = str_replace($fontFile, basename($fontFile), $content); + } + + // Save CSS File + $cacheFile = $this->getCacheDirectory($file) . '/' . 'webfont.css'; + file_put_contents(GeneralUtility::getFileAbsFileName($cacheFile), $content); + GeneralUtility::fixPermissions($cacheFile); + + return true; + } + + /** + * @param string $file + * @return bool + */ + protected function supports(string $file): bool + { + return (bool) strpos($file, $this->googleFontApiUrl); + } + + /** + * @param string $file + * @return bool + */ + protected function isCached(string $file): bool + { + $cacheFile = $this->getCssFileCacheName($file); + $absoluteFile = GeneralUtility::getFileAbsFileName($cacheFile); + + if (!file_exists($absoluteFile)) { + return false; + } + + // Discard cache after 24 hours + if ((time() - (int) filemtime($absoluteFile)) > 86400) { + GeneralUtility::rmdir($this->getCacheDirectory($file)); + return false; + } + + return true; + } + + /** + * @param string $file + * @return string + */ + protected function getCssFileCacheName(string $file): string + { + return $this->getCacheDirectory($file) . '/' . 'webfont.css'; + } + + /** + * @param string $file + * @return string + */ + protected function getCacheDirectory(string $file): string + { + return $this->tempDirectory . '/' . $this->getCacheIdentifier($file); + } + + /** + * @param string $file + * @return string + */ + protected function getCacheIdentifier(string $file): string + { + return hash('sha256', $file); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Service/IconService.php b/public/typo3conf/ext/bootstrap_package/Classes/Service/IconService.php new file mode 100644 index 0000000..50f49de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Service/IconService.php @@ -0,0 +1,88 @@ +getIconProviders(); + foreach ($iconProviders as $iconProvider) { + $iconSets[] = [ + $iconProvider->getName(), + $iconProvider->getIdentifier() + ]; + } + + $configuration['items'] = $iconSets; + } + + public function getIconItems(array &$configuration): void + { + $iconItems = []; + $iconItems[] = [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.none', + 0, + 'EXT:bootstrap_package/Resources/Public/Images/Icons/none.svg' + ]; + + $iconSetField = $configuration['config']['itemsProcConfig']['iconSetField'] ?? 'icon_set'; + $iconProviderIdentifier = $configuration['row'][$iconSetField][0] ?? ''; + $iconProvider = $this->getIconProviderForIdentifier($iconProviderIdentifier); + if ($iconProvider !== null) { + $icons = $iconProvider->getIconList()->getIcons(); + foreach ($icons as $icon) { + $iconItems[] = [ + $icon->getName(), + $icon->getIdentifier(), + $icon->getPreviewImage() + ]; + } + } + + $configuration['items'] = $iconItems; + } + + public function getIconProviderForIdentifier(string $identifier): ?IconProviderInterface + { + $iconProviders = $this->getIconProviders(); + foreach ($iconProviders as $iconProvider) { + if ($iconProvider->supports($identifier)) { + return $iconProvider; + } + } + return null; + } + + public function getIconProviders(): array + { + $iconProviders = []; + + if (isset($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/bootstrap-package/icons']['provider']) + && is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/bootstrap-package/icons']['provider']) + ) { + foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['ext/bootstrap-package/icons']['provider'] as $className) { + $iconProviders[] = GeneralUtility::makeInstance($className); + } + } + + return $iconProviders; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/AbstractUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/AbstractUpdate.php new file mode 100644 index 0000000..c3f1b5c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/AbstractUpdate.php @@ -0,0 +1,173 @@ +title; + } + + public function getDescription(): string + { + return $this->description; + } + + public function getPrerequisites(): array + { + return [ + DatabaseUpdatedPrerequisite::class + ]; + } + + protected function getConnection(): Connection + { + if ($this->connection === null) { + $this->connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($this->table); + } + + return $this->connection; + } + + protected function createQueryBuilder(): QueryBuilder + { + $queryBuilder = $this->getConnection()->createQueryBuilder(); + $queryBuilder->getRestrictions()->removeAll(); + + return $queryBuilder; + } + + protected function tableHasColumn(string $column): bool + { + /** @phpstan-ignore-next-line */ + if (method_exists($this->getConnection(), 'createSchemaManager')) { + $schemaManager = $this->getConnection()->createSchemaManager(); + } else { + $schemaManager = $this->getConnection()->getSchemaManager(); + } + $tableColumns = $schemaManager->listTableColumns($this->table); + + if (array_key_exists($column, $tableColumns)) { + return true; + } + + return false; + } + + protected function createCreaterThanCriteria(QueryBuilder $queryBuilder, string $field, int $value): CreaterThanCriteria + { + return (new CreaterThanCriteria($queryBuilder, $field)) + ->setValue($value); + } + + protected function createEqualStringCriteria(QueryBuilder $queryBuilder, string $field, string $value): EqualStringCriteria + { + return (new EqualStringCriteria($queryBuilder, $field)) + ->setValue($value); + } + + protected function createInCriteria(QueryBuilder $queryBuilder, string $field, array $values): InCriteria + { + return (new InCriteria($queryBuilder, $field)) + ->setValues($values); + } + + protected function createLikeCriteria(QueryBuilder $queryBuilder, string $field, string $value): LikeCriteria + { + return (new LikeCriteria($queryBuilder, $field)) + ->setValue($value); + } + + protected function getRecordsByCriteria(QueryBuilder $queryBuilder, array $criteria, string $condition = self::CONDITION_AND): array + { + $queryBuilder->select('*'); + $queryBuilder->from($this->table); + if ($condition === self::CONDITION_AND) { + $queryBuilder->where(...$criteria); + } else { + $queryBuilder->orWhere(...$criteria); + } + + /** @phpstan-ignore-next-line */ + if (method_exists($queryBuilder, 'executeQuery')) { + $result = $queryBuilder->executeQuery(); + } else { + /** @var Result $result */ + /** @phpstan-ignore-next-line */ + $result = $queryBuilder->execute(); + } + + /** @phpstan-ignore-next-line */ + if (method_exists($result, 'fetchAllAssociative')) { + return $result->fetchAllAssociative(); /** @phpstan-ignore-line */ + } + + return $result->fetchAll(\PDO::FETCH_ASSOC); /** @phpstan-ignore-line */ + } + + protected function updateRecord(int $uid, array $values): void + { + $queryBuilder = $this->createQueryBuilder(); + $queryBuilder->update($this->table) + ->where($queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT))); + + foreach ($values as $field => $value) { + $queryBuilder->set($field, $value); + } + + /** @phpstan-ignore-next-line */ + if (method_exists($queryBuilder, 'executeStatement')) { + $queryBuilder->executeStatement(); + } else { + $queryBuilder->execute(); + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/AccordionContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/AccordionContentElementUpdate.php new file mode 100644 index 0000000..e98f1ed --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/AccordionContentElementUpdate.php @@ -0,0 +1,60 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_accordion')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_accordion')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => 'accordion'] + ); + } + + return true; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/AccordionMediaOrientUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/AccordionMediaOrientUpdate.php new file mode 100644 index 0000000..342f6d7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/AccordionMediaOrientUpdate.php @@ -0,0 +1,78 @@ + 'left', + 1 => 'right' + ]; + + public function updateNecessary(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + if (null !== $newValue = $this->mapValues(intval($record[$this->field]))) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => $newValue] + ); + } + } + + return true; + } + + protected function mapValues(int $value): ?string + { + if (array_key_exists($value, $this->mapping)) { + return $this->mapping[$value]; + } + return null; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/BackendLayoutUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/BackendLayoutUpdate.php new file mode 100644 index 0000000..8594682 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/BackendLayoutUpdate.php @@ -0,0 +1,89 @@ + 'pagets__simple', + 'pagets__default_clean' => 'pagets__simple', + 'pagets__default_2_columns' => 'pagets__2_columns', + 'pagets__default_2_columns_25_75' => 'pagets__2_columns_25_75', + 'pagets__default_2_columns_50_50' => 'pagets__2_columns_50_50', + 'pagets__default_2_columns_offset_right' => 'pagets__2_columns_offset_right', + 'pagets__default_3_columns' => 'pagets__3_columns', + 'pagets__default_subnavigation_right' => 'pagets__subnavigation_right', + 'pagets__default_subnavigation_right_2_columns' => 'pagets__subnavigation_right_2_columns', + 'pagets__default_subnavigation_left' => 'pagets__subnavigation_left', + 'pagets__default_subnavigation_left_2_columns' => 'pagets__subnavigation_left_2_columns' + ]; + + public function updateNecessary(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [ + $this->createInCriteria($queryBuilder, 'backend_layout', array_keys($this->mapping)), + $this->createInCriteria($queryBuilder, 'backend_layout_next_level', array_keys($this->mapping)), + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria, AbstractUpdate::CONDITION_OR); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [ + $this->createInCriteria($queryBuilder, 'backend_layout', array_keys($this->mapping)), + $this->createInCriteria($queryBuilder, 'backend_layout_next_level', array_keys($this->mapping)), + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria, AbstractUpdate::CONDITION_OR); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [ + 'backend_layout' => $this->mapValues(strval($record['backend_layout'])), + 'backend_layout_next_level' => $this->mapValues(strval($record['backend_layout_next_level'])) + ] + ); + } + + return true; + } + + protected function mapValues(string $value): string + { + if (array_key_exists($value, $this->mapping)) { + return $this->mapping[$value]; + } + return $value; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/BulletContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/BulletContentElementUpdate.php new file mode 100644 index 0000000..52f2735 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/BulletContentElementUpdate.php @@ -0,0 +1,75 @@ +createQueryBuilder(); + $criteria = [ + $this->createEqualStringCriteria($queryBuilder, 'CType', 'bullets'), + $this->createInCriteria($queryBuilder, 'layout', [100, 110, 120, 130]), + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [ + $this->createEqualStringCriteria($queryBuilder, 'CType', 'bullets'), + $this->createInCriteria($queryBuilder, 'layout', [100, 110, 120, 130]), + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [ + 'layout' => (string) 0, + 'bullets_type' => (string) $this->mapValues(intval($record['layout'])) + ] + ); + } + + return true; + } + + protected function mapValues(int $layout): int + { + $mapping = [ + 110 => 1 + ]; + if (array_key_exists($layout, $mapping)) { + return $mapping[$layout]; + } + return 0; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselContentElementUpdate.php new file mode 100644 index 0000000..6d48781 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselContentElementUpdate.php @@ -0,0 +1,78 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, 'CType', 'bootstrap_package_carousel')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, 'CType', 'bootstrap_package_carousel')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [ + 'layout' => $this->resetLayout(intval($record['layout'])), + 'CType' => $this->mapValues(intval($record['layout'])) + ] + ); + } + + return true; + } + + protected function resetLayout(int $layout): string + { + if (in_array($layout, [100, 110, 120], true)) { + return '0'; + } + return (string)$layout; + } + + protected function mapValues(int $layout): string + { + $mapping = [ + 110 => 'carousel_small', + 120 => 'carousel_fullscreen' + ]; + if (array_key_exists($layout, $mapping)) { + return $mapping[$layout]; + } + return 'carousel'; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselItemLayoutUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselItemLayoutUpdate.php new file mode 100644 index 0000000..2c73911 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselItemLayoutUpdate.php @@ -0,0 +1,55 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, 'layout', '')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, 'layout', '')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + ['layout' => 'custom'] + ); + } + + return true; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselItemTypeUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselItemTypeUpdate.php new file mode 100644 index 0000000..d4893aa --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/CarouselItemTypeUpdate.php @@ -0,0 +1,67 @@ +createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, 'item_type', ['textandimage', 'backgroundimage'])]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, 'item_type', ['textandimage', 'backgroundimage'])]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + ['item_type' => $this->mapValues(strval($record['item_type']))] + ); + } + + return true; + } + + protected function mapValues(string $type): string + { + $mapping = [ + 'textandimage' => 'text_and_image', + 'backgroundimage' => 'background_image' + ]; + if (array_key_exists($type, $mapping)) { + return $mapping[$type]; + } + return 'header'; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/AbstractCriteria.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/AbstractCriteria.php new file mode 100644 index 0000000..c83e33e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/AbstractCriteria.php @@ -0,0 +1,37 @@ +queryBuilder = $queryBuilder; + $this->field = $field; + } + + public function getField(): string + { + return $this->field; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/CreaterThanCriteria.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/CreaterThanCriteria.php new file mode 100644 index 0000000..69c40d8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/CreaterThanCriteria.php @@ -0,0 +1,38 @@ +value = $value; + return $this; + } + + public function getValue(): int + { + return $this->value; + } + + public function __toString(): string + { + return $this->queryBuilder->expr()->gt( + $this->getField(), + $this->getValue() + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/CriteriaInterface.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/CriteriaInterface.php new file mode 100644 index 0000000..5691cbb --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/CriteriaInterface.php @@ -0,0 +1,16 @@ +value = $value; + return $this; + } + + public function getValue(): string + { + return $this->value; + } + + public function __toString(): string + { + return $this->queryBuilder->expr()->eq( + $this->getField(), + $this->queryBuilder->createNamedParameter( + $this->getValue(), + Connection::PARAM_STR + ) + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/InCriteria.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/InCriteria.php new file mode 100644 index 0000000..edd3b89 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/InCriteria.php @@ -0,0 +1,43 @@ +values = $values; + return $this; + } + + public function getValues(): array + { + return $this->values; + } + + public function __toString(): string + { + return $this->queryBuilder->expr()->in( + $this->getField(), + $this->queryBuilder->createNamedParameter( + $this->getValues(), + Connection::PARAM_STR_ARRAY + ) + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/LikeCriteria.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/LikeCriteria.php new file mode 100644 index 0000000..ba44def --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/Criteria/LikeCriteria.php @@ -0,0 +1,38 @@ +value = $value; + return $this; + } + + public function getValue(): string + { + return $this->value; + } + + public function __toString(): string + { + return $this->queryBuilder->expr()->like( + $this->getField(), + $this->queryBuilder->expr()->literal($this->getValue()) + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/ExternalMediaContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/ExternalMediaContentElementUpdate.php new file mode 100644 index 0000000..be850d8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/ExternalMediaContentElementUpdate.php @@ -0,0 +1,60 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_external_media')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_external_media')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => 'external_media'] + ); + } + + return true; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/FrameClassToBackgroundUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/FrameClassToBackgroundUpdate.php new file mode 100644 index 0000000..2b9b184 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/FrameClassToBackgroundUpdate.php @@ -0,0 +1,81 @@ + 'light', + 'jumbotron' => 'primary' + ]; + + public function updateNecessary(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + if (null !== $newValue = $this->mapValues(strval($record[$this->field]))) { + $this->updateRecord( + (int) $record['uid'], + [ + $this->field => 'default', + 'background_color_class' => $newValue + ] + ); + } + } + + return true; + } + + protected function mapValues(string $value): ?string + { + if (array_key_exists($value, $this->mapping)) { + return $this->mapping[$value]; + } + return null; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/FrameClassUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/FrameClassUpdate.php new file mode 100644 index 0000000..ba5bd03 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/FrameClassUpdate.php @@ -0,0 +1,81 @@ +tableHasColumn('section_frame')) { + return false; + } + + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createCreaterThanCriteria($queryBuilder, 'section_frame', 0)]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createCreaterThanCriteria($queryBuilder, 'section_frame', 0)]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [ + 'section_frame' => '0', + 'frame_class' => $this->mapSectionFrame(intval($record['section_frame'])) + ] + ); + } + + return true; + } + + protected function mapSectionFrame(int $sectionFrame): string + { + $mapping = [ + 0 => 'default', + 5 => 'ruler-before', + 6 => 'ruler-after', + 10 => 'indent', + 11 => 'indent-left', + 12 => 'indent-right', + 20 => 'well', + 21 => 'jumbotron', + 66 => 'none' + ]; + if (array_key_exists($sectionFrame, $mapping)) { + return $mapping[$sectionFrame]; + } + return 'custom-' . $sectionFrame; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/ListGroupContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/ListGroupContentElementUpdate.php new file mode 100644 index 0000000..f80f4ec --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/ListGroupContentElementUpdate.php @@ -0,0 +1,60 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_listgroup')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_listgroup')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => 'listgroup'] + ); + } + + return true; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/PanelContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/PanelContentElementUpdate.php new file mode 100644 index 0000000..491838a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/PanelContentElementUpdate.php @@ -0,0 +1,74 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, 'CType', 'bootstrap_package_panel')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, 'CType', 'bootstrap_package_panel')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [ + 'CType' => 'panel', + 'layout' => '0', + 'panel_class' => $this->mapValues(intval($record['layout'])) + ] + ); + } + + return true; + } + + protected function mapValues(int $layout): string + { + $mapping = [ + 110 => 'primary', + 120 => 'success', + 130 => 'info', + 140 => 'warning', + 150 => 'danger', + ]; + if (array_key_exists($layout, $mapping)) { + return $mapping[$layout]; + } + return 'default'; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/TabContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TabContentElementUpdate.php new file mode 100644 index 0000000..76b7638 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TabContentElementUpdate.php @@ -0,0 +1,60 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_tab')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_tab')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => 'tab'] + ); + } + + return true; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/TabMediaOrientUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TabMediaOrientUpdate.php new file mode 100644 index 0000000..8cec8a8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TabMediaOrientUpdate.php @@ -0,0 +1,78 @@ + 'left', + 1 => 'right' + ]; + + public function updateNecessary(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + if (null !== $newValue = $this->mapValues(intval($record[$this->field]))) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => $newValue] + ); + } + } + + return true; + } + + protected function mapValues(int $value): ?string + { + if (array_key_exists($value, $this->mapping)) { + return $this->mapping[$value]; + } + return null; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/TableContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TableContentElementUpdate.php new file mode 100644 index 0000000..52d696b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TableContentElementUpdate.php @@ -0,0 +1,77 @@ +createQueryBuilder(); + $criteria = [ + $this->createEqualStringCriteria($queryBuilder, 'CType', 'table'), + $this->createInCriteria($queryBuilder, 'layout', [100, 110, 120, 130, 140, 150]), + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [ + $this->createEqualStringCriteria($queryBuilder, 'CType', 'table'), + $this->createInCriteria($queryBuilder, 'layout', [100, 110, 120, 130, 140, 150]), + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [ + 'layout' => '0', + 'table_class' => $this->mapValues(intval($record['layout'])) + ] + ); + } + + return true; + } + + protected function mapValues(int $layout): string + { + $mapping = [ + 100 => '', + 110 => '', + 120 => 'striped', + 130 => 'bordered', + 140 => 'hover', + 150 => 'condensed', + ]; + return $mapping[$layout]; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonContentElementUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonContentElementUpdate.php new file mode 100644 index 0000000..eb37718 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonContentElementUpdate.php @@ -0,0 +1,60 @@ +createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_texticon')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createEqualStringCriteria($queryBuilder, $this->field, 'bootstrap_package_texticon')]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => 'texticon'] + ); + } + + return true; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonIconUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonIconUpdate.php new file mode 100644 index 0000000..de3b77b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonIconUpdate.php @@ -0,0 +1,65 @@ +createQueryBuilder(); + $criteria = [ + $this->createLikeCriteria($queryBuilder, 'icon', 'Glyphicons%'), + $this->createLikeCriteria($queryBuilder, 'icon', 'Ionicons%') + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria, AbstractUpdate::CONDITION_OR); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [ + $this->createLikeCriteria($queryBuilder, 'icon', 'Glyphicons%'), + $this->createLikeCriteria($queryBuilder, 'icon', 'Ionicons%') + ]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria, AbstractUpdate::CONDITION_OR); + + foreach ($records as $record) { + $icon = explode('__', strval($record['icon'])); + $this->updateRecord( + (int) $record['uid'], + [ + 'icon' => 'EXT:bootstrap_package/Resources/Public/Images/Icons/' . $icon[0] . '/' . $icon[1] . '.svg', + 'icon_set' => 'EXT:bootstrap_package/Resources/Public/Images/Icons/' . $icon[0] . '/', + ] + ); + } + + return true; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonSizeUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonSizeUpdate.php new file mode 100644 index 0000000..e55219c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonSizeUpdate.php @@ -0,0 +1,80 @@ + 'default', + 1 => 'medium', + 2 => 'large', + 3 => 'awesome' + ]; + + public function updateNecessary(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + if (null !== $newValue = $this->mapValues(intval($record[$this->field]))) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => $newValue] + ); + } + } + + return true; + } + + protected function mapValues(int $value): ?string + { + if (array_key_exists($value, $this->mapping)) { + return $this->mapping[$value]; + } + return null; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonTypeUpdate.php b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonTypeUpdate.php new file mode 100644 index 0000000..7bdcbc1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Updates/TexticonTypeUpdate.php @@ -0,0 +1,79 @@ + 'default', + 1 => 'square', + 2 => 'circle' + ]; + + public function updateNecessary(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + return (bool) count($records); + } + + public function executeUpdate(): bool + { + $queryBuilder = $this->createQueryBuilder(); + $criteria = [$this->createInCriteria($queryBuilder, $this->field, array_keys($this->mapping))]; + $records = $this->getRecordsByCriteria($queryBuilder, $criteria); + + foreach ($records as $record) { + if (null !== $newValue = $this->mapValues(intval($record[$this->field]))) { + $this->updateRecord( + (int) $record['uid'], + [$this->field => $newValue] + ); + } + } + + return true; + } + + protected function mapValues(int $value): ?string + { + if (array_key_exists($value, $this->mapping)) { + return $this->mapping[$value]; + } + return null; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Userfuncs/Tca.php b/public/typo3conf/ext/bootstrap_package/Classes/Userfuncs/Tca.php new file mode 100644 index 0000000..b352b2b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Userfuncs/Tca.php @@ -0,0 +1,21 @@ +setProtocolToHttps($url); + // Get method + $method = $this->getMethod($url); + if ($method !== null) { + $embedUrl = $this->{$method}($url); + if ($embedUrl !== null) { + return ''; + } + } + return null; + } + + /** + * Resolves if possible a method name to process the url + * + * @param string $url + * @return string|null + */ + protected function getMethod(string $url): ?string + { + $urlInformation = @parse_url($url); + if (is_array($urlInformation) && isset($urlInformation['host'])) { + $hostName = GeneralUtility::trimExplode('.', $urlInformation['host'], true); + foreach ($this->mediaProvider as $provider) { + $functionName = 'process' . ucfirst($provider); + if (in_array($provider, $hostName, true) && is_callable([$this, $functionName])) { + return $functionName; + } + } + } + return null; + } + + /** + * Processes YouTube url + * + * @param string $url + * @return string|null + */ + protected function processYoutube(string $url): ?string + { + $firstMatches = []; + $pattern = '%^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=))([^"&?/ ]{11})(?:.+)?$%xs'; + if ((bool) preg_match($pattern, $url, $firstMatches)) { + $toEmbed = $firstMatches[1]; + $patternForAdditionalParams = '%^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=))(?:[^"&?\/ ]{11})(.+)?(?:.+)?$%xs'; + $secondMatches = []; + if (preg_match($patternForAdditionalParams, $url, $secondMatches) > 1) { + $toEmbed .= '?' . substr($secondMatches[1], 1); + } + return 'https://www.youtube-nocookie.com/embed/' . $toEmbed; + } + return null; + } + + /** + * Process YouTube short url + * + * @param string $url + * @return string|null + */ + protected function processYoutu(string $url): ?string + { + return $this->processYoutube($url); + } + + /** + * Processes Vimeo url + * + * @param string $url + * @return string + */ + protected function processVimeo(string $url): ?string + { + $matches = []; + if ((bool) preg_match('/[\\/#](\\d+)$/', $url, $matches)) { + return 'https://player.vimeo.com/video/' . $matches[1]; + } + return null; + } + + /** + * Change every protocol to https and add it if missing + * + * @param string $url URL + * @return string + */ + protected function setProtocolToHttps(string $url): string + { + $processUrl = trim($url); + if (strpos($url, 'http://') === 0) { + $processUrl = substr($processUrl, 7); + } elseif (strpos($processUrl, 'https://') === 0) { + $processUrl = substr($processUrl, 8); + } elseif (strpos($processUrl, '//') === 0) { + $processUrl = substr($processUrl, 2); + } + return 'https://' . $processUrl; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Utility/ImageVariantsUtility.php b/public/typo3conf/ext/bootstrap_package/Classes/Utility/ImageVariantsUtility.php new file mode 100644 index 0000000..15c3008 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Utility/ImageVariantsUtility.php @@ -0,0 +1,246 @@ + [ + 'breakpoint' => 1400, + 'width' => 1280 + ], + 'xlarge' => [ + 'breakpoint' => 1200, + 'width' => 1100 + ], + 'large' => [ + 'breakpoint' => 992, + 'width' => 920 + ], + 'medium' => [ + 'breakpoint' => 768, + 'width' => 680 + ], + 'small' => [ + 'breakpoint' => 576, + 'width' => 500 + ], + 'extrasmall' => [ + 'width' => 374 + ] + ]; + + /** + * @param array|null $variants + * @param array|null $multiplier + * @param array|null $gutters + * @param array|null $corrections + * @param float|null $aspectRatio + * @return array + */ + public static function getImageVariants(?array $variants = null, ?array $multiplier = null, ?array $gutters = null, ?array $corrections = null, ?float $aspectRatio = null): array + { + $variants = $variants !== null ? $variants : []; + $variants = self::processVariants($variants); + $variants = self::processResolutions($variants); + if ($gutters !== null) { + $variants = self::removeGutters($variants, $gutters); + } + if ($multiplier !== null) { + $variants = self::processMultiplier($variants, $multiplier); + } + if ($corrections !== null) { + $variants = self::processCorrections($variants, $corrections); + } + if ($aspectRatio !== null) { + $variants = self::processAspectRatio($variants, $aspectRatio); + } + return $variants; + } + + /** + * @param array $variants + * @return array + */ + protected static function processResolutions(array $variants): array + { + foreach ($variants as $variant => $properties) { + if (!array_key_exists('sizes', $properties)) { + $properties['sizes'] = []; + } + $properties['sizes'] = self::processSizes($properties['sizes']); + $variants[$variant] = $properties; + } + return $variants; + } + + /** + * @param array $sizes + * @return array + */ + protected static function processSizes(array $sizes): array + { + $resultSizes = []; + $workingSizes = []; + foreach ($sizes as $key => $settings) { + if (!array_key_exists('multiplier', $settings) || + !is_numeric($settings['multiplier']) || + $settings['multiplier'] < 1 || + !self::isValidSizeKey($key) + ) { + continue; + } + $settings['multiplier'] = gettype($settings['multiplier']) === 'double' ? $settings['multiplier'] : (int) $settings['multiplier']; + $workingSizes[substr($key, 0, -1) . ''] = [ + 'multiplier' => 1 * $settings['multiplier'], + ]; + } + + if (!isset($workingSizes['1'])) { + $workingSizes['1'] = ['multiplier' => 1]; + } + ksort($workingSizes); + foreach ($workingSizes as $workingKey => $workingSettings) { + $resultSizes[$workingKey . 'x'] = $workingSettings; + } + + return $resultSizes; + } + + /** + * @param array $variants + * @return array + */ + protected static function processVariants(array $variants): array + { + $variants = count($variants) > 0 ? $variants : self::$defaultVariants; + foreach ($variants as $variant => $properties) { + if (!is_array($properties)) { + unset($variants[$variant]); + continue; + } + foreach ($properties as $key => $value) { + if (!in_array($key, self::$allowedVariantProperties, true)) { + unset($variants[$variant][$key]); + continue; + } + if ($key === 'sizes') { + continue; + } elseif ($key === 'aspectRatio') { + if (is_numeric($value) && $value > 0) { + $variants[$variant][$key] = (float) $value; + } else { + unset($variants[$variant][$key]); + } + } elseif (is_numeric($value) && $value > 0) { + $variants[$variant][$key] = (int) $value; + } else { + unset($variants[$variant][$key]); + } + } + if (count($variants[$variant]) === 0 || !isset($variants[$variant]['width'])) { + unset($variants[$variant]); + } + } + return $variants; + } + + /** + * @param array $variants + * @param array $gutters + * @return array + */ + protected static function removeGutters(array $variants, array $gutters): array + { + foreach ($gutters as $variant => $value) { + if (is_numeric($value) && $value > 0 && isset($variants[$variant]['width'])) { + $variants[$variant]['width'] = (int) ceil($variants[$variant]['width'] - (float) $value); + } + } + return $variants; + } + + /** + * @param array $variants + * @param array $multiplier + * @return array + */ + protected static function processMultiplier(array $variants, array $multiplier): array + { + foreach ($multiplier as $variant => $value) { + if (is_numeric($value) && $value > 0 && isset($variants[$variant]['width'])) { + $variants[$variant]['width'] = (int) ceil($variants[$variant]['width'] * (float) $value); + } + } + return $variants; + } + + /** + * @param array $variants + * @param array $corrections + * @return array + */ + protected static function processCorrections(array $variants, array $corrections): array + { + foreach ($corrections as $variant => $value) { + if (is_numeric($value) && $value > 0 && isset($variants[$variant]['width'])) { + $variants[$variant]['width'] -= $value; + } + } + return $variants; + } + + /** + * @param array $variants + * @param float $aspectRatio + * @return array + */ + protected static function processAspectRatio(array $variants, float $aspectRatio): array + { + if ($aspectRatio > 0) { + foreach ($variants as $variant => $value) { + $variants[$variant]['aspectRatio'] = $aspectRatio; + } + } + return $variants; + } + + /** + * @param mixed $key + * @return bool + */ + public static function isValidSizeKey($key): bool + { + return !( + !is_string($key) || + substr($key, -1, 1) !== 'x' || + !is_numeric(substr($key, 0, -1)) || + (float) substr($key, 0, -1) < 1 || + (float) substr($key, 0, -1) !== round((float) substr($key, 0, -1), 1) + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/Utility/SvgUtility.php b/public/typo3conf/ext/bootstrap_package/Classes/Utility/SvgUtility.php new file mode 100644 index 0000000..5b53373 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/Utility/SvgUtility.php @@ -0,0 +1,128 @@ +getImage($src, $image, false); + if ($image->getProperty('extension') !== 'svg') { + return ''; + } + + $svgContent = $image->getContents(); + $svgContent = trim((string) preg_replace('/[\s\S]*?<\/script>/i', '', $svgContent)); + + // Exit if file does not contain content + if ($svgContent === '') { + return ''; + } + + // Disables the functionality to allow external entities to be loaded when parsing the XML, must be kept + $previousValueOfEntityLoader = false; + if (PHP_MAJOR_VERSION < 8) { + $previousValueOfEntityLoader = libxml_disable_entity_loader(true); + } + $svgElement = simplexml_load_string($svgContent); + if (PHP_MAJOR_VERSION < 8) { + libxml_disable_entity_loader($previousValueOfEntityLoader); + } + if (!$svgElement instanceof \SimpleXMLElement) { + return ''; + } + + // Override attributes + $class = htmlspecialchars($class ?? ''); + $svgElement = self::setAttribute($svgElement, 'class', $class); + $width = intval($width) > 0 ? (string) intval($width) : null; + $svgElement = self::setAttribute($svgElement, 'width', $width); + $height = intval($height) > 0 ? (string) intval($height) : null; + $svgElement = self::setAttribute($svgElement, 'height', $height); + + // remove xml version tag + $domXml = dom_import_simplexml($svgElement); + /** @phpstan-ignore-next-line */ + if (!$domXml instanceof \DOMElement || !$domXml->ownerDocument instanceof \DOMDocument) { + return ''; + } + + return (string) $domXml->ownerDocument->saveXML($domXml->ownerDocument->documentElement); + } catch (ResourceDoesNotExistException $e) { + // thrown if file does not exist + throw new \Exception($e->getMessage(), 1530601100, $e); + } catch (\UnexpectedValueException $e) { + // thrown if a file has been replaced with a folder + throw new \Exception($e->getMessage(), 1530601101, $e); + } catch (\RuntimeException $e) { + // RuntimeException thrown if a file is outside of a storage + throw new \Exception($e->getMessage(), 1530601102, $e); + } catch (\InvalidArgumentException $e) { + // thrown if file storage does not exist + throw new \Exception($e->getMessage(), 1530601103, $e); + } + } + + /** + * @param \SimpleXMLElement $element + * @param string $attribute + * @param string $value + */ + protected static function setAttribute(\SimpleXMLElement $element, string $attribute, ?string $value): \SimpleXMLElement + { + if ($value !== null) { + if (isset($element->attributes()->$attribute)) { + $element->attributes()->$attribute = $value; + } else { + $element->addAttribute($attribute, $value); + } + } + + return $element; + } + + /** + * Return an instance of ImageService using object manager + * + * @return ImageService + */ + protected static function getImageService(): ImageService + { + return GeneralUtility::makeInstance(ImageService::class); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/ImageInfoViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/ImageInfoViewHelper.php new file mode 100644 index 0000000..8bc2544 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/ImageInfoViewHelper.php @@ -0,0 +1,82 @@ + + */ + protected static $supportedProperties = [ + 'width' => 0, + 'height' => 1, + 'type' => 3, + 'origFile' => 'origFile', + 'origFile_mtime' => 'origFile_mtime', + ]; + + /** + * Initialize arguments. + * + * @throws \TYPO3Fluid\Fluid\Core\ViewHelper\Exception + * @return void + */ + public function initializeArguments() + { + $this->registerArgument('src', 'string', 'Path to a file'); + $this->registerArgument('property', 'string', 'Possible values: width, height, type, origFile, origFile_mtime'); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + */ + public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) + { + $src = $arguments['src']; + $property = $arguments['property']; + + if (!array_key_exists($property, self::$supportedProperties)) { + throw new \InvalidArgumentException('The value of property is invalid. Valid properties are: width, height, type, origFile or origFile_mtime'); + } + + $assetCollector = self::getAssetCollector(); + $mediaOnPage = $assetCollector->getMedia(); + + foreach ($mediaOnPage as $mediaName => $mediaData) { + if (strpos($src, $mediaName) !== false) { + return (string) $mediaData[self::$supportedProperties[$property]]; + } + } + + return ''; + } + + /** + * @return AssetCollector + */ + protected static function getAssetCollector(): AssetCollector + { + return GeneralUtility::makeInstance(AssetCollector::class); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/ImageVariantsViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/ImageVariantsViewHelper.php new file mode 100644 index 0000000..1685077 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/ImageVariantsViewHelper.php @@ -0,0 +1,53 @@ +registerArgument('as', 'string', 'Name of variable to create.', true); + $this->registerArgument('variants', 'array', 'Variants for responsive images.', false); + $this->registerArgument('multiplier', 'array', 'Multiplier to calculate responsive image widths.', false); + $this->registerArgument('gutters', 'array', 'Gutter that needs to be respected when calculating responsive image widths.', false); + $this->registerArgument('corrections', 'array', 'Corrections to be applied after calculation of image widths.', false); + $this->registerArgument('aspectRatio', 'float', 'Set aspect ratio for all variants.', false); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $variants = ImageVariantsUtility::getImageVariants($arguments['variants'], $arguments['multiplier'], $arguments['gutters'], $arguments['corrections'], $arguments['aspectRatio']); + $renderingContext->getVariableProvider()->add($arguments['as'], $variants); + return ''; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/PaginateViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/PaginateViewHelper.php new file mode 100644 index 0000000..7ba4b33 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Data/PaginateViewHelper.php @@ -0,0 +1,123 @@ +registerArgument('id', 'string', 'Identifier of the pagination', true); + $this->registerArgument('objects', 'mixed', 'Object', true); + $this->registerArgument('configuration', 'array', 'configuration', false, ['itemsPerPage' => 10, 'insertAbove' => false, 'insertBelow' => true]); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + * @throws \Exception + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $objects = $arguments['objects']; + if (!($objects instanceof QueryResultInterface || is_array($objects))) { + throw new \UnexpectedValueException('Supplied file object type ' . get_class($objects) . ' must be QueryResultInterface or be an array.', 1623322979); + } + + $configuration = [ + 'itemsPerPage' => 10, + 'insertAbove' => false, + 'insertBelow' => true, + 'section' => '' + ]; + ArrayUtility::mergeRecursiveWithOverrule($configuration, $arguments['configuration'], false); + $id = $arguments['id']; + $itemsPerPage = (int) $configuration['itemsPerPage']; + $currentPage = (int) (self::getRequest()->getQueryParams()['paginate'][$id]['page'] ?? 1); + + if ($objects instanceof QueryResultInterface) { + $paginator = new QueryResultPaginator($objects, $currentPage, $itemsPerPage); + } else { + $paginator = new ArrayPaginator($objects, $currentPage, $itemsPerPage); + } + $pagination = new SimplePagination($paginator); + + $paginationView = self::getPaginationTemplateObject(); + $paginationView->assignMultiple( + [ + 'id' => $id, + 'paginator' => $paginator, + 'pagination' => $pagination, + 'configuration' => $configuration + ] + ); + $paginationRendered = $paginationView->render(); + + $variableProvider = $renderingContext->getVariableProvider(); + $variableProvider->add('paginator', $paginator); + + $contents = []; + $contents[] = $configuration['insertAbove'] === true ? $paginationRendered : ''; + $contents[] = $renderChildrenClosure(); + $contents[] = $configuration['insertBelow'] === true ? $paginationRendered : ''; + + $variableProvider->remove('paginator'); + + return implode('', $contents); + } + + protected static function getPaginationTemplateObject(): StandaloneView + { + /** @var StandaloneView $view */ + $view = GeneralUtility::makeInstance(StandaloneView::class); + $view->setLayoutRootPaths([GeneralUtility::getFileAbsFileName('EXT:bootstrap_package/Resources/Private/Layouts')]); + $view->setPartialRootPaths([GeneralUtility::getFileAbsFileName('EXT:bootstrap_package/Resources/Private/Partials')]); + $view->setTemplateRootPaths([GeneralUtility::getFileAbsFileName('EXT:bootstrap_package/Resources/Private/Templates')]); + $view->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:bootstrap_package/Resources/Private/Templates/ViewHelpers/Paginate/Index.html')); + + return $view; + } + + protected static function getRequest(): ServerRequestInterface + { + return $GLOBALS['TYPO3_REQUEST']; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExplodeViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExplodeViewHelper.php new file mode 100644 index 0000000..a1a66ba --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExplodeViewHelper.php @@ -0,0 +1,64 @@ +registerArgument('data', 'string', 'The input string', true); + $this->registerArgument('as', 'string', 'Name of variable to create', false, 'items'); + $this->registerArgument('delimiter', 'string', 'The boundary string', false, "\n"); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $content = ''; + if (isset($arguments['data'])) { + $variableProvider = $renderingContext->getVariableProvider(); + $items = GeneralUtility::trimExplode($arguments['delimiter'], $arguments['data']); + $variableProvider->add($arguments['as'], $items); + $content = $renderChildrenClosure(); + $variableProvider->remove($arguments['as']); + } + return $content; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExternalMediaViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExternalMediaViewHelper.php new file mode 100644 index 0000000..cc7d1b4 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/ExternalMediaViewHelper.php @@ -0,0 +1,66 @@ +registerArgument('url', 'string', 'External media url'); + $this->registerArgument('class', 'string', 'CSS class rendered on the generated iframe code'); + } + + /** + * Checks if the URL is a valid YouTube/Vimeo Link is. If the video id can + * be extracted the embed code will be returned, else the content of the + * ViewHelper will be displayed. + * + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $variableProvider = $renderingContext->getVariableProvider(); + $externalMediaUtility = GeneralUtility::makeInstance(ExternalMediaUtility::class); + $externalMedia = $externalMediaUtility->getEmbedCode($arguments['url'], $arguments['class']); + $variableProvider->add('externalMedia', $externalMedia); + $content = $renderChildrenClosure(); + $variableProvider->remove('externalMedia'); + return $content; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/FalViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/FalViewHelper.php new file mode 100644 index 0000000..82e0d8d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/FalViewHelper.php @@ -0,0 +1,87 @@ +registerArgument('data', 'array', 'Data of current record', true); + $this->registerArgument('table', 'string', 'table', false, 'tt_content'); + $this->registerArgument('field', 'string', 'field', false, 'image'); + $this->registerArgument('as', 'string', 'Name of variable to create', false, 'items'); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $variableProvider = $renderingContext->getVariableProvider(); + if (is_array($arguments['data']) && $arguments['data']['uid'] && $arguments['data'][$arguments['field']]) { + $fileRepository = GeneralUtility::makeInstance(FileRepository::class); + $items = $fileRepository->findByRelation( + $arguments['table'], + $arguments['field'], + $arguments['data']['uid'] + ); + $localizedId = null; + if (isset($arguments['data']['_LOCALIZED_UID'])) { + $localizedId = $arguments['data']['_LOCALIZED_UID']; + } elseif (isset($arguments['data']['_PAGES_OVERLAY_UID'])) { + $localizedId = $arguments['data']['_PAGES_OVERLAY_UID']; + } + $isTableLocalizable = ( + isset($GLOBALS['TCA'][$arguments['table']]['ctrl']['languageField']) + && $GLOBALS['TCA'][$arguments['table']]['ctrl']['languageField'] !== '' + && isset($GLOBALS['TCA'][$arguments['table']]['ctrl']['transOrigPointerField']) + && $GLOBALS['TCA'][$arguments['table']]['ctrl']['transOrigPointerField'] !== '' + ); + if ($isTableLocalizable && $localizedId !== null) { + $items = $fileRepository->findByRelation($arguments['table'], $arguments['field'], $localizedId); + } + } else { + $items = null; + } + $variableProvider->add($arguments['as'], $items); + $content = $renderChildrenClosure(); + $variableProvider->remove($arguments['as']); + return $content; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsAudioViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsAudioViewHelper.php new file mode 100644 index 0000000..3e0d73f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsAudioViewHelper.php @@ -0,0 +1,50 @@ +getExtension(), $allowedFileExtensions, true) + || $file->getType() === File::FILETYPE_AUDIO + ) + ) { + return true; + } + + return false; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsImageViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsImageViewHelper.php new file mode 100644 index 0000000..7a2e436 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsImageViewHelper.php @@ -0,0 +1,50 @@ +getExtension(), $allowedFileExtensions, true) + || $file->getType() === File::FILETYPE_IMAGE + ) + ) { + return true; + } + + return false; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsMediaViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsMediaViewHelper.php new file mode 100644 index 0000000..196d0ce --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/File/IsMediaViewHelper.php @@ -0,0 +1,50 @@ +getExtension(), $allowedFileExtensions, true) + || $file->getType() === File::FILETYPE_VIDEO + ) + ) { + return true; + } + + return false; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Format/LowercaseDashedViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Format/LowercaseDashedViewHelper.php new file mode 100644 index 0000000..4bb8386 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Format/LowercaseDashedViewHelper.php @@ -0,0 +1,43 @@ +registerArgument('icon', 'object', 'Icon to render', true); + $this->registerArgument('height', 'int', 'Height'); + $this->registerArgument('width', 'int', 'Width'); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + * @throws \Exception + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $icon = $arguments['icon']; + + if (isset($arguments['width'])) { + $icon->setWidth((int) $arguments['width']); + } + if (isset($arguments['height'])) { + $icon->setHeight((int) $arguments['height']); + } + + return $icon->render(); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/InlineSvgViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/InlineSvgViewHelper.php new file mode 100644 index 0000000..53e845b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/InlineSvgViewHelper.php @@ -0,0 +1,65 @@ +registerArgument('image', 'object', 'a FAL object'); + $this->registerArgument('src', 'string', 'a path to a file'); + $this->registerArgument('class', 'string', 'Css class for the svg'); + $this->registerArgument('width', 'string', 'Width of the svg.', false); + $this->registerArgument('height', 'string', 'Height of the svg.', false); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + * @throws \Exception + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $src = (string)$arguments['src']; + $image = $arguments['image']; + $width = $arguments['width'] ? (int) $arguments['width'] : null; + $height = $arguments['height'] ? (int) $arguments['height'] : null; + $class = $arguments['class'] ? (string) $arguments['class'] : null; + + return SvgUtility::getInlineSvg($src, $image, $width, $height, $class); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Link/LightboxViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Link/LightboxViewHelper.php new file mode 100644 index 0000000..069ac49 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Link/LightboxViewHelper.php @@ -0,0 +1,106 @@ +registerUniversalTagAttributes(); + $this->registerTagAttribute('rel', 'string', 'Specifies the relationship between the current document and the linked document', false); + + $this->registerArgument('caption', 'string', 'Specifies an caption text', false); + + $this->registerArgument('image', 'object', 'image', true); + $this->registerArgument('crop', 'string|bool', 'overrule cropping of image (setting to FALSE disables the cropping set in FileReference)'); + $this->registerArgument('cropVariant', 'string', 'select a cropping variant, in case multiple croppings have been specified or stored in FileReference', false, 'default'); + $this->registerArgument('width', 'string', 'width of the image. This can be a numeric value representing the fixed width of the image in pixels. But you can also perform simple calculations by adding "m" or "c" to the value. See imgResource.width for possible options.'); + $this->registerArgument('height', 'string', 'height of the image. This can be a numeric value representing the fixed height of the image in pixels. But you can also perform simple calculations by adding "m" or "c" to the value. See imgResource.width for possible options.'); + $this->registerArgument('minWidth', 'int', 'minimum width of the image'); + $this->registerArgument('minHeight', 'int', 'minimum height of the image'); + $this->registerArgument('maxWidth', 'int', 'maximum width of the image'); + $this->registerArgument('maxHeight', 'int', 'maximum height of the image'); + $this->registerArgument('absolute', 'bool', 'Force absolute URL', false, false); + } + + public function render(): string + { + try { + $imageService = $this->getImageService(); + $image = $imageService->getImage('', $this->arguments['image'], false); + + $cropString = $this->arguments['crop']; + if ($cropString === null && $image->hasProperty('crop') && $image->getProperty('crop') !== '') { + $cropString = $image->getProperty('crop'); + } + + $cropVariantCollection = CropVariantCollection::create((string)$cropString); + $cropVariant = $this->arguments['cropVariant'] ?? 'default'; + $cropArea = $cropVariantCollection->getCropArea($cropVariant); + $processingInstructions = [ + 'width' => $this->arguments['width'], + 'height' => $this->arguments['height'], + 'minWidth' => $this->arguments['minWidth'], + 'minHeight' => $this->arguments['minHeight'], + 'maxWidth' => $this->arguments['maxWidth'], + 'maxHeight' => $this->arguments['maxHeight'], + 'crop' => $cropArea->isEmpty() ? null : $cropArea->makeAbsoluteBasedOnFile($image), + ]; + + $processedImage = $imageService->applyProcessingInstructions($image, $processingInstructions); + $imageUri = $imageService->getImageUri($processedImage, isset($this->arguments['absolute']) ? $this->arguments['absolute'] : false); + + $this->tag->addAttribute('href', $imageUri); + $this->tag->addAttribute('data-lightbox-width', $processedImage->getProperty('width')); + $this->tag->addAttribute('data-lightbox-height', $processedImage->getProperty('height')); + $this->tag->addAttribute('data-lightbox-caption', isset($this->arguments['caption']) ? $this->arguments['caption'] : null); + $this->tag->setContent($this->renderChildren()); + $this->tag->forceClosingTag(true); + } catch (ResourceDoesNotExistException $e) { + // thrown if file does not exist + throw new Exception($e->getMessage(), 1622197950, $e); + } catch (\UnexpectedValueException $e) { + // thrown if a file has been replaced with a folder + throw new Exception($e->getMessage(), 1622197951, $e); + } catch (\RuntimeException $e) { + // RuntimeException thrown if a file is outside of a storage + throw new Exception($e->getMessage(), 1622197952, $e); + } catch (\InvalidArgumentException $e) { + // thrown if file storage does not exist + throw new Exception($e->getMessage(), 1622197953, $e); + } + + return $this->tag->render(); + } + + /** + * @return ImageService + */ + protected function getImageService(): ImageService + { + return GeneralUtility::makeInstance(ImageService::class); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Link/PaginateViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Link/PaginateViewHelper.php new file mode 100644 index 0000000..812e469 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/Link/PaginateViewHelper.php @@ -0,0 +1,71 @@ +registerUniversalTagAttributes(); + + $this->registerArgument('paginationId', 'string', 'id', true); + $this->registerArgument('paginationPage', 'int', 'page', true); + } + + public function render(): string + { + $paginationId = (string) $this->arguments['paginationId']; + $paginationPage = (int) $this->arguments['paginationPage']; + $section = isset($this->arguments['section']) ? (string)$this->arguments['section'] : ''; + + $arguments = []; + if ($paginationPage > 1) { + $arguments['paginate'][$paginationId]['page'] = $paginationPage; + } + + if (method_exists($this->renderingContext, 'getUriBuilder')) { + /** @var UriBuilder $uriBuilder */ + $uriBuilder = $this->renderingContext->getUriBuilder(); + } elseif (method_exists($this->renderingContext, 'getControllerContext')) { + /** @var UriBuilder $uriBuilder */ + $uriBuilder = $this->renderingContext->getControllerContext()->getUriBuilder(); + } else { + return $this->renderChildren(); + } + + $uriBuilder->reset()->setArguments($arguments); + + $uri = $uriBuilder->build(); + if ($uri !== '') { + $this->tag->addAttribute('href', $uri); + $this->tag->setContent($this->renderChildren()); + $this->tag->forceClosingTag(true); + $result = $this->tag->render(); + } else { + $result = $this->renderChildren(); + } + + return $result; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/TypoScript/ConstantViewHelper.php b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/TypoScript/ConstantViewHelper.php new file mode 100644 index 0000000..c45e772 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Classes/ViewHelpers/TypoScript/ConstantViewHelper.php @@ -0,0 +1,64 @@ +registerArgument('constant', 'string', 'TypoScript constant'); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ) { + $constant = trim($arguments['constant']); + if ($GLOBALS['TSFE']->tmpl->flatSetup === null + || !is_array($GLOBALS['TSFE']->tmpl->flatSetup) + || count($GLOBALS['TSFE']->tmpl->flatSetup) === 0) { + $GLOBALS['TSFE']->tmpl->generateConfig(); + } + if (!array_key_exists($constant, $GLOBALS['TSFE']->tmpl->flatSetup)) { + return ''; + } + + return $GLOBALS['TSFE']->tmpl->flatSetup[$constant]; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/.htaccess b/public/typo3conf/ext/bootstrap_package/Configuration/.htaccess new file mode 100644 index 0000000..896fbc5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all \ No newline at end of file diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/ExpressionLanguage.php b/public/typo3conf/ext/bootstrap_package/Configuration/ExpressionLanguage.php new file mode 100644 index 0000000..a48a053 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/ExpressionLanguage.php @@ -0,0 +1,14 @@ + [ + \BK2K\BootstrapPackage\ExpressionLanguage\ConditionProvider::class, + ] +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Accordion.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Accordion.xml new file mode 100644 index 0000000..bcaea3f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Accordion.xml @@ -0,0 +1,36 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + select + selectSingle + tx_bootstrappackage_accordion_item + AND tx_bootstrappackage_accordion_item.tt_content = ###THIS_UID### + + + None + 0 + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/BackgroundImage.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/BackgroundImage.xml new file mode 100644 index 0000000..8f21500 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/BackgroundImage.xml @@ -0,0 +1,74 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + check + 0 + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.background_image.parallax.description + + + + + + + + + + check + 0 + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.background_image.fade.description + + + + + + + + + + select + selectSingle + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.background_image.filter.none + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.background_image.filter.blur + blur + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.background_image.filter.grayscale + grayscale + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.background_image.filter.sepia + sepia + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/CardGroup.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/CardGroup.xml new file mode 100644 index 0000000..045d043 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/CardGroup.xml @@ -0,0 +1,70 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + select + selectSingle + left + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group.align.left + left + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group.align.center + center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group.align.right + right + + + + + + + + + + select + selectSingle + 2 + + + 1 + 1 + + + 2 + 2 + + + 3 + 3 + + + 4 + 4 + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Carousel.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Carousel.xml new file mode 100644 index 0000000..f9347d1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Carousel.xml @@ -0,0 +1,79 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + input + 8 + 5000 + required,int + + + + + + + + select + selectSingle + fade + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel.transition.fade + fade + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel.transition.slide + slide + + + + + + + + + + check + 1 + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel.wrap.description + + + + + + + + + + check + 0 + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel.show_nav_title.description + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/IconGroup.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/IconGroup.xml new file mode 100644 index 0000000..3bef206 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/IconGroup.xml @@ -0,0 +1,110 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + select + selectSingle + center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.align.left + left + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.align.center + center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.align.right + right + + + + + + + + + + select + selectSingle + auto + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.columns.auto + auto + + + 1 + 1 + + + 2 + 2 + + + 3 + 3 + + + 4 + 4 + + + + + + + + + + select + selectSingle + left-center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.icon_position.left-top + left-top + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.icon_position.left-center + left-center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.icon_position.right-top + right-top + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.icon_position.right-center + right-center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.icon_position.above + above + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.icon_position.below + below + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/MenuCard.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/MenuCard.xml new file mode 100644 index 0000000..eb118e2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/MenuCard.xml @@ -0,0 +1,70 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + select + selectSingle + left + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card.align.left + left + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card.align.center + center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card.align.right + right + + + + + + + + + + select + selectSingle + 2 + + + 1 + 1 + + + 2 + 2 + + + 3 + 3 + + + 4 + 4 + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/MenuThumbnail.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/MenuThumbnail.xml new file mode 100644 index 0000000..02a86bf --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/MenuThumbnail.xml @@ -0,0 +1,70 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + select + selectSingle + left + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail.align.left + left + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail.align.center + center + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail.align.right + right + + + + + + + + + + select + selectSingle + 2 + + + 1 + 1 + + + 2 + 2 + + + 3 + 3 + + + 4 + 4 + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Tab.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Tab.xml new file mode 100644 index 0000000..0f50ae4 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Tab.xml @@ -0,0 +1,36 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + select + selectSingle + tx_bootstrappackage_tab_item + AND tx_bootstrappackage_tab_item.tt_content = ###THIS_UID### + + + + 0 + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Timeline.xml b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Timeline.xml new file mode 100644 index 0000000..21aca5b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/FlexForms/Timeline.xml @@ -0,0 +1,38 @@ + + + + 1 + + + + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:settings + + array + + + + + + select + selectSingle + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline.sorting.desc + date desc + + + LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline.sorting.asc + date asc + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/Form/Setup.yaml b/public/typo3conf/ext/bootstrap_package/Configuration/Form/Setup.yaml new file mode 100644 index 0000000..f2c5643 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/Form/Setup.yaml @@ -0,0 +1,25 @@ +TYPO3: + CMS: + Form: + persistenceManager: + allowedExtensionPaths: + 110: EXT:bootstrap_package/Resources/Private/Forms/ + prototypes: + standard: + formElementsDefinition: + Form: + renderingOptions: + translation: + translationFiles: + 110: 'EXT:bootstrap_package/Resources/Private/Language/locallang.xlf' + layoutRootPaths: + 20: 'EXT:bootstrap_package/Resources/Private/Layouts/Form/' + templateRootPaths: + 20: 'EXT:bootstrap_package/Resources/Private/Templates/Form/' + partialRootPaths: + 20: 'EXT:bootstrap_package/Resources/Private/Partials/Form/' + ImageUpload: + properties: + imageLinkMaxWidth: 1200 + imageMaxWidth: 200 + imageMaxHeight: 200 diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/RTE/Default.yaml b/public/typo3conf/ext/bootstrap_package/Configuration/RTE/Default.yaml new file mode 100644 index 0000000..4e5fb8b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/RTE/Default.yaml @@ -0,0 +1,151 @@ +imports: + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" } + - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" } + +editor: + externalPlugins: + bootstrappackage_address: + resource: "EXT:bootstrap_package/Resources/Public/CKEditor/Plugins/Address/plugin.min.js" + bootstrappackage_box: + resource: "EXT:bootstrap_package/Resources/Public/CKEditor/Plugins/Box/plugin.min.js" + bootstrappackage_columns: + resource: "EXT:bootstrap_package/Resources/Public/CKEditor/Plugins/Columns/plugin.min.js" + bootstrappackage_indent: + resource: "EXT:bootstrap_package/Resources/Public/CKEditor/Plugins/Indent/plugin.min.js" + bootstrappackage_table: + resource: "EXT:bootstrap_package/Resources/Public/CKEditor/Plugins/Table/plugin.min.js" + + config: + contentsCss: "EXT:bootstrap_package/Resources/Public/Css/bootstrap5-rte.min.css" + + stylesSet: + - { name: "Lead", element: "p", attributes: { 'class': 'lead' } } + - { name: "Small", element: "small" } + + - { name: "Table", element: "table", attributes: { 'class': 'table' } } + - { name: "Table Striped", element: "table", attributes: { 'class': 'table table-striped' } } + - { name: "Table Bordered", element: "table", attributes: { 'class': 'table table-bordered' } } + - { name: "Table Condensed", element: "table", attributes: { 'class': 'table table-condensed' } } + + - { name: "Row Active", element: "tr", attributes: { 'class': 'table-active' } } + - { name: "Row Success", element: "tr", attributes: { 'class': 'table-success' } } + - { name: "Row Info", element: "tr", attributes: { 'class': 'table-info' } } + - { name: "Row Warning", element: "tr", attributes: { 'class': 'table-warning' } } + - { name: "Row Danger", element: "tr", attributes: { 'class': 'table-danger' } } + + - { name: "Cell Active", element: "td", attributes: { 'class': 'table-active' } } + - { name: "Cell Success", element: "td", attributes: { 'class': 'table-success' } } + - { name: "Cell Info", element: "td", attributes: { 'class': 'table-info' } } + - { name: "Cell Warning", element: "td", attributes: { 'class': 'table-warning' } } + - { name: "Cell Danger", element: "td", attributes: { 'class': 'table-danger' } } + + - { name: "Button Default", element: "a", attributes: { 'class': 'btn btn-default' } } + - { name: "Button Primary", element: "a", attributes: { 'class': 'btn btn-primary' } } + - { name: "Button Secondary", element: "a", attributes: { 'class': 'btn btn-secondary' } } + - { name: "Button Tertiary", element: "a", attributes: { 'class': 'btn btn-tertiary' } } + - { name: "Button Quaternary", element: "a", attributes: { 'class': 'btn btn-quaternary' } } + - { name: "Button Success", element: "a", attributes: { 'class': 'btn btn-success' } } + - { name: "Button Info", element: "a", attributes: { 'class': 'btn btn-info' } } + - { name: "Button Warning", element: "a", attributes: { 'class': 'btn btn-warning' } } + - { name: "Button Danger", element: "a", attributes: { 'class': 'btn btn-danger' } } + + - { name: "Button Outline Default", element: "a", attributes: { 'class': 'btn btn-outline-default' } } + - { name: "Button Outline Primary", element: "a", attributes: { 'class': 'btn btn-outline-primary' } } + - { name: "Button Outline Secondary", element: "a", attributes: { 'class': 'btn btn-outline-secondary' } } + - { name: "Button Outline Tertiary", element: "a", attributes: { 'class': 'btn btn-outline-tertiary' } } + - { name: "Button Outline Quaternary", element: "a", attributes: { 'class': 'btn btn-outline-quaternary' } } + - { name: "Button Outline Success", element: "a", attributes: { 'class': 'btn btn-outline-success' } } + - { name: "Button Outline Info", element: "a", attributes: { 'class': 'btn btn-outline-info' } } + - { name: "Button Outline Warning", element: "a", attributes: { 'class': 'btn btn-outline-warning' } } + - { name: "Button Outline Danger", element: "a", attributes: { 'class': 'btn btn-outline-danger' } } + + - { name: "Link Arrow", element: "a", attributes: { 'class': 'link-arrow' } } + - { name: "Link Chevron", element: "a", attributes: { 'class': 'link-chevron' } } + - { name: "Link Page", element: "a", attributes: { 'class': 'link-page' } } + - { name: "Link Folder", element: "a", attributes: { 'class': 'link-folder' } } + - { name: "Link File", element: "a", attributes: { 'class': 'link-file' } } + - { name: "Link External", element: "a", attributes: { 'class': 'link-external' } } + - { name: "Link Mail", element: "a", attributes: { 'class': 'link-mail' } } + - { name: "Link Globe", element: "a", attributes: { 'class': 'link-globe' } } + + - { name: "List Unstyled", element: "ul", attributes: { 'class': 'list-unstyled' } } + - { name: "List Inline", element: "ul", attributes: { 'class': 'list-inline' } } + - { name: "List Check", element: "ul", attributes: { 'class': 'list-check' } } + - { name: "List Info", element: "ul", attributes: { 'class': 'list-info' } } + - { name: "List Warning", element: "ul", attributes: { 'class': 'list-warning' } } + - { name: "List Ban", element: "ul", attributes: { 'class': 'list-ban' } } + - { name: "List Chevron", element: "ul", attributes: { 'class': 'list-chevron' } } + + - { name: "Lowercased text", element: "span", attributes: { 'class': 'text-lowercase' } } + - { name: "Uppercased text", element: "span", attributes: { 'class': 'text-uppercase' } } + - { name: "Capitalized text", element: "span", attributes: { 'class': 'text-capitalize' } } + - { name: "Muted", element: "span", attributes: { 'class': 'text-muted' } } + - { name: "Primary", element: "span", attributes: { 'class': 'text-primary' } } + - { name: "Secondary", element: "span", attributes: { 'class': 'text-secondary' } } + - { name: "Tertiary", element: "span", attributes: { 'class': 'text-tertiary' } } + - { name: "Quaternary", element: "span", attributes: { 'class': 'text-quaternary' } } + - { name: "Success", element: "span", attributes: { 'class': 'text-success' } } + - { name: "Info", element: "span", attributes: { 'class': 'text-info' } } + - { name: "Warning", element: "span", attributes: { 'class': 'text-warning' } } + - { name: "Danger", element: "span", attributes: { 'class': 'text-danger' } } + + toolbarGroups: + - { name: styles, groups: [ format, styles ] } + - { name: basicstyles, groups: [ basicstyles ] } + - { name: paragraph, groups: [ list, indent, blocks, align ] } + - "/" + - { name: links, groups: [ links ] } + - { name: clipboard, groups: [ clipboard, cleanup, undo ] } + - { name: editing, groups: [ spellchecker ] } + - { name: insert, groups: [ insert ] } + - { name: tools, groups: [ table, specialchar ] } + - { name: document, groups: [ mode ] } + + format_tags: "p;h1;h2;h3;h4;h5;pre" + + justifyClasses: + - text-left + - text-center + - text-right + - text-justify + + extraPlugins: + - justify + - autolink + - bootstrappackage_address + - bootstrappackage_box + - bootstrappackage_columns + - bootstrappackage_indent + - bootstrappackage_table + + removePlugins: + - image + + removeButtons: + - Anchor + - Underline + - Strike + +classesAnchor: + page: + class: 'link-page' + type: 'page' + folder: + class: 'link-folder' + type: 'folder' + file: + class: 'link-file' + type: 'file' + external: + class: 'link-external' + type: 'url' + mail: + class: 'link-mail' + type: 'mail' + +buttons: + link: + properties: + class: + allowedClasses: 'link-arrow, link-page, link-folder, link-file, link-external, link-mail' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/Services.yaml b/public/typo3conf/ext/bootstrap_package/Configuration/Services.yaml new file mode 100644 index 0000000..4902651 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/Services.yaml @@ -0,0 +1,11 @@ +services: + BK2K\BootstrapPackage\Service\BrandingService: + tags: + - name: event.listener + identifier: 'bk2k/bootstrap-package/set-backend-styling' + event: TYPO3\CMS\Core\Package\Event\AfterPackageActivationEvent + BK2K\BootstrapPackage\Backend\ToolbarItem\VersionToolbarItem: + tags: + - name: event.listener + identifier: 'bk2k/bootstrap-package/add-version-information' + event: TYPO3\CMS\Backend\Backend\Event\SystemInformationToolbarCollectorEvent diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/100_pages.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/100_pages.php new file mode 100644 index 0000000..5128f55 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/100_pages.php @@ -0,0 +1,186 @@ + [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_set', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconSetItems', + ], + ], + 'nav_icon_identifier' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon', + 'displayCond' => 'FIELD:nav_icon_set:REQ:true', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconItems', + 'itemsProcConfig' => [ + 'iconSetField' => 'nav_icon_set' + ], + 'fieldWizard' => [ + 'selectIcons' => [ + 'renderType' => 'iconWizard', + 'disabled' => false, + ], + ], + ], + ], + 'nav_icon' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:pages.nav_icon', + 'displayCond' => 'FIELD:nav_icon_set:REQ:false', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'nav_icon', + [ + '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' => ' + --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 + ' + ], + ], + ], + 'maxitems' => 1, + ], + 'gif,png,svg' + ), + ], + 'thumbnail' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:pages.thumbnail', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'thumbnail', + [ + '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'] + ), + 'l10n_mode' => 'exclude', + ], + ] +); + +// Assign position to fields +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('pages', 'nav_icon_set', '1,3,4', 'after:nav_title'); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('pages', 'nav_icon_identifier', '1,3,4', 'after:nav_icon_set'); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('pages', 'nav_icon', '1,3,4', 'after:nav_icon_set'); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('pages', 'thumbnail', '1,3,4', 'after:backend_layout_next_level'); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/101_sys_template.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/101_sys_template.php new file mode 100644 index 0000000..a012e35 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/101_sys_template.php @@ -0,0 +1,50 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_accordion_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'tx_bootstrappackage_accordion_item' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item', + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_bootstrappackage_accordion_item', + 'foreign_field' => 'tt_content', + 'appearance' => [ + 'useSortable' => true, + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + 'expandSingle' => true, + 'enabledControls' => [ + 'localize' => true, + ] + ], + 'behaviour' => [ + 'mode' => 'select', + ] + ] + ] + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/Accordion.xml', + 'accordion' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/201_content_element_audio.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/201_content_element_audio.php new file mode 100644 index 0000000..a94f801 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/201_content_element_audio.php @@ -0,0 +1,90 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.media, + assets, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'assets' => [ + 'config' => [ + 'filter' => [ + 0 => [ + 'parameters' => [ + 'allowedFileExtensions' => 'mp3' + ] + ] + ], + 'overrideChildTca' => [ + 'columns' => [ + 'uid_local' => [ + 'config' => [ + 'appearance' => [ + 'elementBrowserAllowed' => 'mp3' + ] + ] + ] + ] + ] + ] + ] + ] + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/202_content_element_bullets.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/202_content_element_bullets.php new file mode 100644 index 0000000..56e8ff2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/202_content_element_bullets.php @@ -0,0 +1,17 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_card_group_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'tx_bootstrappackage_card_group_item' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item', + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_bootstrappackage_card_group_item', + 'foreign_field' => 'tt_content', + 'appearance' => [ + 'useSortable' => true, + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + 'expandSingle' => true, + 'enabledControls' => [ + 'localize' => true, + ] + ], + 'behaviour' => [ + 'mode' => 'select', + ] + ] + ] + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/CardGroup.xml', + 'card_group' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/204_content_element_carousel.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/204_content_element_carousel.php new file mode 100644 index 0000000..81aff5a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/204_content_element_carousel.php @@ -0,0 +1,74 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_carousel_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/Carousel.xml', + 'carousel' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/205_content_element_carousel_small.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/205_content_element_carousel_small.php new file mode 100644 index 0000000..b4e2adc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/205_content_element_carousel_small.php @@ -0,0 +1,74 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_carousel_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/Carousel.xml', + 'carousel_small' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/206_content_element_carousel_fullscreen.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/206_content_element_carousel_fullscreen.php new file mode 100644 index 0000000..dacacb9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/206_content_element_carousel_fullscreen.php @@ -0,0 +1,74 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_carousel_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/Carousel.xml', + 'carousel_fullscreen' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/207_content_element_csv.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/207_content_element_csv.php new file mode 100644 index 0000000..86f830a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/207_content_element_csv.php @@ -0,0 +1,93 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + media;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:media.ALT.uploads_formlabel, + --palette--;;tableconfiguration, + --palette--;;tablelayout, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'media' => [ + 'config' => [ + 'filter' => [ + 0 => [ + 'parameters' => [ + 'allowedFileExtensions' => 'csv' + ] + ] + ], + 'minitems' => 0, + 'maxitems' => 1, + 'overrideChildTca' => [ + 'columns' => [ + 'uid_local' => [ + 'config' => [ + 'appearance' => [ + 'elementBrowserAllowed' => 'csv' + ] + ] + ] + ] + ] + ] + ] + ] + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/208_content_element_externalmedia.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/208_content_element_externalmedia.php new file mode 100644 index 0000000..5d493fe --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/208_content_element_externalmedia.php @@ -0,0 +1,100 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.palette.external_media;external_media, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'external_media_source' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.external_media_source', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim', + 'max' => 1024, + ] + ], + 'external_media_ratio' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.external_media_ratio', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['16:9', '16by9'], + ['4:3', '4by3'], + ] + ] + ] + ] +); + +// Register palettes +$GLOBALS['TCA']['tt_content']['palettes']['external_media'] = [ + 'showitem' => ' + external_media_source, --linebreak--, + external_media_ratio + ' +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/209_content_element_header.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/209_content_element_header.php new file mode 100644 index 0000000..009ddea --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/209_content_element_header.php @@ -0,0 +1,17 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_icon_group_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'tx_bootstrappackage_icon_group_item' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item', + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_bootstrappackage_icon_group_item', + 'foreign_field' => 'tt_content', + 'appearance' => [ + 'useSortable' => true, + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + 'expandSingle' => true, + 'enabledControls' => [ + 'localize' => true, + ] + ], + 'behaviour' => [ + 'mode' => 'select', + ] + ] + ] + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/IconGroup.xml', + 'icon_group' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/211_content_element_image.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/211_content_element_image.php new file mode 100644 index 0000000..7e615b9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/211_content_element_image.php @@ -0,0 +1,25 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + bodytext, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'bodytext' => [ + 'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext.ALT.bulletlist_formlabel', + 'config' => [ + 'wrap' => 'off', + ] + ] + ] + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/213_content_element_media.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/213_content_element_media.php new file mode 100644 index 0000000..95b46c5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/213_content_element_media.php @@ -0,0 +1,95 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.media, + assets, + file_folder, + filelink_sorting, + --palette--;LLL:EXT:frontend/Resources/Private/Language/Database.xlf:tt_content.palette.mediaAdjustments;mediaAdjustments, + --palette--;LLL:EXT:frontend/Resources/Private/Language/Database.xlf:tt_content.palette.gallerySettings;gallerySettings, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.imagelinks;imagelinks, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'assets' => [ + 'config' => [ + 'filter' => [ + 0 => [ + 'parameters' => [ + 'allowedFileExtensions' => 'youtube, vimeo' + ] + ] + ], + 'overrideChildTca' => [ + 'columns' => [ + 'uid_local' => [ + 'config' => [ + 'appearance' => [ + 'elementBrowserAllowed' => 'youtube, vimeo' + ] + ] + ] + ] + ] + ] + ] + ] + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/214_content_element_menu_card_list.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/214_content_element_menu_card_list.php new file mode 100644 index 0000000..1339651 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/214_content_element_menu_card_list.php @@ -0,0 +1,77 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, + readmore_label, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.accessibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.menu_accessibility;menu_accessibility, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/MenuCard.xml', + 'menu_card_list' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/215_content_element_menu_card_dir.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/215_content_element_menu_card_dir.php new file mode 100644 index 0000000..5b3e0ba --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/215_content_element_menu_card_dir.php @@ -0,0 +1,77 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, + readmore_label, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.accessibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.menu_accessibility;menu_accessibility, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/MenuCard.xml', + 'menu_card_dir' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/216_content_element_menu_thumbnail_list.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/216_content_element_menu_thumbnail_list.php new file mode 100644 index 0000000..85d274e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/216_content_element_menu_thumbnail_list.php @@ -0,0 +1,76 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.accessibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.menu_accessibility;menu_accessibility, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/MenuThumbnail.xml', + 'menu_thumbnail_list' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/217_content_element_menu_thumbnail_dir.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/217_content_element_menu_thumbnail_dir.php new file mode 100644 index 0000000..c5dd69c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/217_content_element_menu_thumbnail_dir.php @@ -0,0 +1,76 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + pages;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:pages.ALT.menu_formlabel, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.accessibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.menu_accessibility;menu_accessibility, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/MenuThumbnail.xml', + 'menu_thumbnail_dir' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/218_content_element_panel.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/218_content_element_panel.php new file mode 100644 index 0000000..05282c9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/218_content_element_panel.php @@ -0,0 +1,103 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;header_minimal, + bodytext, + panel_class, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'bodytext' => [ + 'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel', + 'config' => [ + 'enableRichtext' => true + ] + ] + ] + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'panel_class' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.panel_class', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.default', 'default'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.primary', 'primary'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.secondary', 'secondary'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.tertiary', 'tertiary'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.quaternary', 'quaternary'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.success', 'success'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.info', 'info'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.warning', 'warning'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.danger', 'danger'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.lighter', 'lighter'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.light', 'light'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.dark', 'dark'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.darker', 'darker'], + ], + ], + ], + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/219_content_element_quote.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/219_content_element_quote.php new file mode 100644 index 0000000..a49986b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/219_content_element_quote.php @@ -0,0 +1,101 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.div_formlabel, + quote_link;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:quote.link, + quote_source;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:quote.source, + bodytext;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:quote.text, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'quote_source' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:quote.source', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'max' => 255 + ] + ], + 'quote_link' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:quote.link', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputLink', + 'size' => 50, + 'max' => 1024, + 'eval' => 'trim', + 'fieldControl' => [ + 'linkPopup' => [ + 'options' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:quote.link', + ], + ], + ], + 'softref' => 'typolink' + ] + ], + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/220_content_element_social_links.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/220_content_element_social_links.php new file mode 100644 index 0000000..212ed80 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/220_content_element_social_links.php @@ -0,0 +1,72 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'bodytext' => [ + 'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel', + 'config' => [ + 'enableRichtext' => true + ] + ] + ] + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/221_content_element_tab.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/221_content_element_tab.php new file mode 100644 index 0000000..56cbe54 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/221_content_element_tab.php @@ -0,0 +1,102 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_tab_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'tx_bootstrappackage_tab_item' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item', + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_bootstrappackage_tab_item', + 'foreign_field' => 'tt_content', + 'appearance' => [ + 'useSortable' => true, + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + 'expandSingle' => true, + 'enabledControls' => [ + 'localize' => true, + ] + ], + 'behaviour' => [ + 'mode' => 'select', + ] + ] + ] + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/Tab.xml', + 'tab' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/222_content_element_table.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/222_content_element_table.php new file mode 100644 index 0000000..25221de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/222_content_element_table.php @@ -0,0 +1,17 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + bodytext, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'bodytext' => [ + 'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel', + 'config' => [ + 'enableRichtext' => true + ] + ] + ] + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/225_content_element_texticon.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/225_content_element_texticon.php new file mode 100644 index 0000000..0c91ebf --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/225_content_element_texticon.php @@ -0,0 +1,222 @@ + ' + icon_position, icon_type, icon_size, --linebreak--, + icon_color, icon_background, --linebreak--, + icon_set, --linebreak--, + icon, icon_file + ' +]; + +// Configure element type +$GLOBALS['TCA']['tt_content']['types']['texticon'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['types']['texticon'], + [ + 'showitem' => ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + bodytext, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tabs.icon, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon;bootstrap_package_icons, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'bodytext' => [ + 'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel', + 'config' => [ + 'enableRichtext' => true + ] + ] + ] + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'icon_set' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_set', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconSetItems', + ], + ], + 'icon' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon', + 'displayCond' => 'FIELD:icon_set:REQ:true', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconItems', + 'fieldWizard' => [ + 'selectIcons' => [ + 'renderType' => 'iconWizard', + 'disabled' => false, + ], + ], + ], + ], + 'icon_file' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_file', + 'displayCond' => 'FIELD:icon_set:REQ:false', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'icon_file', + [ + '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' => ' + --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' => 1, + 'maxitems' => 1, + ], + 'gif,png,svg' + ), + ], + 'icon_position' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_position', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.left', 'left'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.right', 'right'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.top', 'top'], + ], + ], + ], + 'icon_type' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_type', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'default' => 'default', + 'items' => [ + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.default', 'default'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.square', 'square'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.circle', 'circle'], + ], + ], + ], + 'icon_size' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_size', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.default', 'default'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.medium', 'medium'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.large', 'large'], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.awesome', 'awesome'], + ], + ], + ], + 'icon_color' => [ + 'displayCond' => 'FIELD:icon_type:!=:default', + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_color', + 'config' => [ + 'type' => 'input', + 'renderType' => 'colorpicker', + 'default' => '#FFFFFF', + ], + ], + 'icon_background' => [ + 'displayCond' => 'FIELD:icon_type:!=:default', + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.icon_background', + 'config' => [ + 'type' => 'input', + 'renderType' => 'colorpicker', + 'default' => '#333333', + ], + ], + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/226_content_element_textmedia.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/226_content_element_textmedia.php new file mode 100644 index 0000000..c361932 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/226_content_element_textmedia.php @@ -0,0 +1,17 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + teaser, + bodytext, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ', + 'columnsOverrides' => [ + 'bodytext' => [ + 'label' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext_formlabel', + 'config' => [ + 'enableRichtext' => true + ] + ] + ] + ] +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/229_content_element_timeline.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/229_content_element_timeline.php new file mode 100644 index 0000000..b2820af --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/229_content_element_timeline.php @@ -0,0 +1,102 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.headers;headers, + tx_bootstrappackage_timeline_item, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline.options, + pi_flexform;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:advanced, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.appearanceLinks;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended, + ' + ] +); + +// Register fields +$GLOBALS['TCA']['tt_content']['columns'] = array_replace_recursive( + $GLOBALS['TCA']['tt_content']['columns'], + [ + 'tx_bootstrappackage_timeline_item' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item', + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_bootstrappackage_timeline_item', + 'foreign_field' => 'tt_content', + 'appearance' => [ + 'useSortable' => true, + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + 'expandSingle' => true, + 'enabledControls' => [ + 'localize' => true, + ] + ], + 'behaviour' => [ + 'mode' => 'select', + ] + ] + ] + ] +); + +// Add flexForms for content element configuration +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue( + '*', + 'FILE:EXT:bootstrap_package/Configuration/FlexForms/Timeline.xml', + 'timeline' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/230_content_element_uploads.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/230_content_element_uploads.php new file mode 100644 index 0000000..403b01f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/230_content_element_uploads.php @@ -0,0 +1,17 @@ + ' + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:general, + --palette--;;general, + --palette--;;headers, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.images, + image, + file_folder, + filelink_sorting, + --palette--;;mediaAdjustments, + --palette--;;gallerySettings, + --palette--;;imagelinks, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance, + --palette--;;frames, + --palette--;;appearanceLinks, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language, + --palette--;;language, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access, + --palette--;;hidden, + --palette--;;access, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories, + categories, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:notes, + rowDescription, + --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:extended + ' + ] +); + +// Add additional fields +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( + 'tt_content', + 'aspect_ratio, items_per_page', + 'gallery', + 'after:imagecols' +); diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/300_content_general_columns.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/300_content_general_columns.php new file mode 100644 index 0000000..9457dd3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/300_content_general_columns.php @@ -0,0 +1,221 @@ + true, + 'displayCond' => 'FIELD:frame_class:!=:none', + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.frame_layout', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['default', 'default'], + ['embedded', 'embedded'] + ] + ], + 'l10n_mode' => 'exclude', +]; +$GLOBALS['TCA']['tt_content']['columns']['background_color_class'] = [ + 'exclude' => true, + 'displayCond' => 'FIELD:frame_class:!=:none', + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.background_color_class', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['none', 'none'], + ['primary', 'primary'], + ['secondary', 'secondary'], + ['tertiary', 'tertiary'], + ['quaternary', 'quaternary'], + ['light', 'light'], + ['dark', 'dark'] + ] + ], + 'l10n_mode' => 'exclude', +]; +$GLOBALS['TCA']['tt_content']['columns']['background_image'] = [ + 'exclude' => true, + 'displayCond' => 'FIELD:frame_class:!=:none', + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.background_image', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'background_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' => ' + 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'] + ), + 'l10n_mode' => 'exclude', +]; +$GLOBALS['TCA']['tt_content']['columns']['background_image_options'] = [ + 'exclude' => true, + 'displayCond' => 'FIELD:frame_class:!=:none', + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.background_image_options', + 'config' => [ + 'type' => 'flex', + 'ds' => [ + 'default' => 'FILE:EXT:bootstrap_package/Configuration/FlexForms/BackgroundImage.xml', + ], + ], + 'l10n_mode' => 'exclude', +]; +$GLOBALS['TCA']['tt_content']['columns']['readmore_label'] = [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.readmore_label', + 'config' => [ + 'type' => 'input', + 'eval' => 'trim', + 'size' => 50, + 'max' => 255 + ] +]; +$GLOBALS['TCA']['tt_content']['columns']['teaser'] = [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.teaser', + 'exclude' => true, + 'config' => [ + 'type' => 'text', + 'softref' => 'typolink_tag', + 'cols' => '40', + 'rows' => '3' + ] +]; +$GLOBALS['TCA']['tt_content']['columns']['tx_bootstrappackage_carousel_item'] = [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item', + 'config' => [ + 'type' => 'inline', + 'foreign_table' => 'tx_bootstrappackage_carousel_item', + 'foreign_field' => 'tt_content', + 'appearance' => [ + 'useSortable' => true, + 'showSynchronizationLink' => true, + 'showAllLocalizationLink' => true, + 'showPossibleLocalizationRecords' => true, + 'expandSingle' => true, + 'enabledControls' => [ + 'localize' => true, + ] + ], + 'behaviour' => [ + 'mode' => 'select', + ] + ] +]; +$GLOBALS['TCA']['tt_content']['columns']['file_folder'] = [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.file_folder', + 'config' => [ + 'type' => 'group', + 'internal_type' => 'folder', + ] +]; +$GLOBALS['TCA']['tt_content']['columns']['aspect_ratio'] = [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.aspect_ratio', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:ratio.4_3', (string) (4/3)], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:ratio.16_9', (string) (16/9)], + ['LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:ratio.1_1', (string) (1/1)], + ] + ], + 'l10n_mode' => 'exclude', +]; +$GLOBALS['TCA']['tt_content']['columns']['items_per_page'] = [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.items_per_page', + 'config' => [ + 'type' => 'input', + 'size' => 2, + 'eval' => 'trim,int', + 'range' => [ + 'lower' => 1, + 'upper' => 50, + ], + 'default' => 10, + ], + 'l10n_mode' => 'exclude', +]; + +// Adjust default fields +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( + 'tt_content', + 'imageorient', + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.imageorient.125', + (string) 125, + 'content-bootstrappackage-beside-text-img-centered-right' + ], + (string) 125, + 'after' +); +\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTcaSelectItem( + 'tt_content', + 'imageorient', + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.imageorient.126', + (string) 126, + 'content-bootstrappackage-beside-text-img-centered-left' + ], + (string) 126, + 'after' +); +$GLOBALS['TCA']['tt_content']['columns']['frame_class']['onChange'] = 'reload'; + +// Add fields to default palettes +$GLOBALS['TCA']['tt_content']['palettes']['frames']['showitem'] .= ' + --linebreak--, + frame_layout, + --linebreak--, + background_color_class, + --linebreak--, + background_image, + background_image_options, +'; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/301_content_general_palettes.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/301_content_general_palettes.php new file mode 100644 index 0000000..f85268a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/301_content_general_palettes.php @@ -0,0 +1,19 @@ + ' + header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header_formlabel, + --linebreak--, + header_layout;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header_layout_formlabel, + ' +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/400_bootstrappackage_carousel_item.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/400_bootstrappackage_carousel_item.php new file mode 100644 index 0000000..2dc37e6 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/400_bootstrappackage_carousel_item.php @@ -0,0 +1,23 @@ + [ + 'config' => [ + 'renderType' => 't3editor', + 'wrap' => 'off', + 'format' => 'html' + ] + ] + ]; +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/500_cropping.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/500_cropping.php new file mode 100644 index 0000000..55eaec2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/500_cropping.php @@ -0,0 +1,148 @@ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.default', + 'allowedAspectRatios' => [ + '16:9' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:ratio.16_9', + 'value' => 16 / 9 + ], + '4:3' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:ratio.4_3', + 'value' => 4 / 3 + ], + '1:1' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:ratio.1_1', + 'value' => 1.0 + ], + 'NaN' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:ratio.free', + 'value' => 0.0 + ], + ], + 'selectedRatio' => 'NaN', + 'cropArea' => [ + 'x' => 0.0, + 'y' => 0.0, + 'width' => 1.0, + 'height' => 1.0, + ] +]; +$xlargeCropSettings = $defaultCropSettings; +$xlargeCropSettings['title'] = 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.xlarge'; +$largeCropSettings = $defaultCropSettings; +$largeCropSettings['title'] = 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.large'; +$mediumCropSettings = $defaultCropSettings; +$mediumCropSettings['title'] = 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.medium'; +$smallCropSettings = $defaultCropSettings; +$smallCropSettings['title'] = 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.small'; +$extrasmallCropSettings = $defaultCropSettings; +$extrasmallCropSettings['title'] = 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:option.extrasmall'; + +// Content Element Background Image +$GLOBALS['TCA']['tt_content']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tt_content']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tt_content']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tt_content']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tt_content']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tt_content']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Image content element +$GLOBALS['TCA']['tt_content']['types']['image']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tt_content']['types']['image']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['image']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['image']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tt_content']['types']['image']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tt_content']['types']['image']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Textpic content element +$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Media content element +$GLOBALS['TCA']['tt_content']['types']['media']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tt_content']['types']['media']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['media']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['media']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tt_content']['types']['media']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tt_content']['types']['media']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Textmedia content element +$GLOBALS['TCA']['tt_content']['types']['textmedia']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textmedia']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textmedia']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textmedia']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textmedia']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tt_content']['types']['textmedia']['columnsOverrides']['assets']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Card Group +$GLOBALS['TCA']['tx_bootstrappackage_card_group_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_card_group_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_card_group_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_card_group_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_card_group_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_card_group_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Accordion +$GLOBALS['TCA']['tx_bootstrappackage_accordion_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_accordion_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_accordion_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_accordion_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_accordion_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_accordion_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Carousel Background Image +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['background_image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Carousel Image +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_carousel_item']['columns']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Tab +$GLOBALS['TCA']['tx_bootstrappackage_tab_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_tab_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_tab_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_tab_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_tab_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_tab_item']['types']['1']['columnsOverrides']['media']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Timeline +$GLOBALS['TCA']['tx_bootstrappackage_timeline_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_timeline_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_timeline_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_timeline_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_timeline_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; +$GLOBALS['TCA']['tx_bootstrappackage_timeline_item']['types']['1']['columnsOverrides']['image']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; + +// Pages +foreach ([1, 3, 4] as $type) { + $GLOBALS['TCA']['pages']['types'][$type]['columnsOverrides']['thumbnail']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['default'] = $defaultCropSettings; + $GLOBALS['TCA']['pages']['types'][$type]['columnsOverrides']['thumbnail']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['xlarge'] = $xlargeCropSettings; + $GLOBALS['TCA']['pages']['types'][$type]['columnsOverrides']['thumbnail']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['large'] = $largeCropSettings; + $GLOBALS['TCA']['pages']['types'][$type]['columnsOverrides']['thumbnail']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['medium'] = $mediumCropSettings; + $GLOBALS['TCA']['pages']['types'][$type]['columnsOverrides']['thumbnail']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['small'] = $smallCropSettings; + $GLOBALS['TCA']['pages']['types'][$type]['columnsOverrides']['thumbnail']['config']['overrideChildTca']['columns']['crop']['config']['cropVariants']['extrasmall'] = $extrasmallCropSettings; +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/600_ext_container.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/600_ext_container.php new file mode 100644 index 0000000..74da5b3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/Overrides/600_ext_container.php @@ -0,0 +1,152 @@ +configureContainer( + ( + new \B13\Container\Tca\ContainerConfiguration( + 'container_1_columns', + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.container_1_columns.name', + '', + [ + [ + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.middle', + 'colPos' => 201 + ] + ] + ] + ) + )->setIcon('EXT:bootstrap_package/Resources/Public/Icons/ContentElements/container-columns-1.svg') + ); + \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\B13\Container\Tca\Registry::class)->configureContainer( + ( + new \B13\Container\Tca\ContainerConfiguration( + 'container_2_columns', + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.container_2_columns.name', + '', + [ + [ + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.left', + 'colPos' => 201 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.right', + 'colPos' => 202 + ] + ] + ] + ) + )->setIcon('EXT:bootstrap_package/Resources/Public/Icons/ContentElements/container-columns-2.svg') + ); + \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\B13\Container\Tca\Registry::class)->configureContainer( + ( + new \B13\Container\Tca\ContainerConfiguration( + 'container_2_columns_right', + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.container_2_columns_right.name', + '', + [ + [ + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.left', + 'colspan' => 1, + 'colPos' => 201 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.right', + 'colspan' => 3, + 'colPos' => 202 + ] + ] + ] + ) + )->setIcon('EXT:bootstrap_package/Resources/Public/Icons/ContentElements/container-columns-2-right.svg') + ); + \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\B13\Container\Tca\Registry::class)->configureContainer( + ( + new \B13\Container\Tca\ContainerConfiguration( + 'container_2_columns_left', + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.container_2_columns_left.name', + '', + [ + [ + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.left', + 'colspan' => 3, + 'colPos' => 201 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.right', + 'colspan' => 2, + 'colPos' => 202 + ] + ] + ] + ) + )->setIcon('EXT:bootstrap_package/Resources/Public/Icons/ContentElements/container-columns-2-left.svg') + ); + \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\B13\Container\Tca\Registry::class)->configureContainer( + ( + new \B13\Container\Tca\ContainerConfiguration( + 'container_3_columns', + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.container_3_columns.name', + '', + [ + [ + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.left', + 'colPos' => 201 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.middle', + 'colPos' => 203 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.right', + 'colPos' => 202 + ] + ] + ] + ) + )->setIcon('EXT:bootstrap_package/Resources/Public/Icons/ContentElements/container-columns-3.svg') + ); + \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\B13\Container\Tca\Registry::class)->configureContainer( + ( + new \B13\Container\Tca\ContainerConfiguration( + 'container_4_columns', + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.container_4_columns.name', + '', + [ + [ + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.left', + 'colPos' => 201 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.middle_left', + 'colPos' => 203 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.middle_right', + 'colPos' => 204 + ], + [ + 'name' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:container.column.right', + 'colPos' => 202 + ] + ] + ] + ) + )->setIcon('EXT:bootstrap_package/Resources/Public/Icons/ContentElements/container-columns-4.svg') + ); +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_accordion_item.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_accordion_item.php new file mode 100644 index 0000000..86a69bb --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_accordion_item.php @@ -0,0 +1,341 @@ + [ + 'label' => 'header', + 'label_alt' => 'bodytext', + 'sortby' => 'sorting', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item', + 'delete' => 'deleted', + 'versioningWS' => true, + 'origUid' => 't3_origuid', + 'hideTable' => true, + 'hideAtCopy' => true, + 'prependAtCopy' => 'LLL:' . $generalLanguageFile . ':LGL.prependAtCopy', + 'transOrigPointerField' => 'l10n_parent', + 'transOrigDiffSourceField' => 'l10n_diffsource', + 'languageField' => 'sys_language_uid', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + ], + 'typeicon_classes' => [ + 'default' => 'content-bootstrappackage-accordion-item', + ] + ], + 'interface' => [ + 'showRecordFieldList' => ' + hidden, + tt_content, + header, + bodytext + ', + ], + 'types' => [ + '1' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header, + bodytext, + media, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.mediaposition;mediaposition, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + ], + 'palettes' => [ + '1' => [ + 'showitem' => '' + ], + 'access' => [ + 'showitem' => ' + starttime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:starttime_formlabel, + endtime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:endtime_formlabel + ' + ], + 'general' => [ + 'showitem' => ' + tt_content + ' + ], + 'mediaposition' => [ + 'showitem' => ' + mediaorient, + imagecols, + image_zoom, + ' + ], + 'visibility' => [ + 'showitem' => ' + hidden;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item + ' + ], + // hidden but needs to be included all the time, so sys_language_uid is set correctly + 'hiddenLanguagePalette' => [ + 'showitem' => 'sys_language_uid, l10n_parent', + 'isHiddenPalette' => true, + ], + ], + 'columns' => [ + 'tt_content' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.tt_content', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tt_content', + 'foreign_table_where' => 'AND tt_content.pid=###CURRENT_PID### AND tt_content.{#CType}=\'accordion\'', + 'maxitems' => 1, + 'default' => 0, + ], + ], + 'hidden' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.hidden', + 'config' => [ + 'type' => 'check', + 'items' => [ + '1' => [ + '0' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:hidden.I.0' + ] + ] + ] + ], + 'starttime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0 + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'endtime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.endtime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0, + 'range' => [ + 'upper' => mktime(0, 0, 0, 1, 1, 2038) + ] + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'sys_language_uid' => [ + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.language', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => [ + [ + 'LLL:' . $generalLanguageFile . ':LGL.allLanguages', + -1 + ], + [ + 'LLL:' . $generalLanguageFile . ':LGL.default_value', + 0 + ] + ], + 'allowNonIdValues' => true, + ] + ], + 'l10n_parent' => [ + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.l18n_parent', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '', + 0 + ] + ], + 'foreign_table' => 'tx_bootstrappackage_accordion_item', + 'foreign_table_where' => 'AND tx_bootstrappackage_accordion_item.pid=###CURRENT_PID### AND tx_bootstrappackage_accordion_item.sys_language_uid IN (-1,0)', + 'default' => 0 + ] + ], + 'l10n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough' + ] + ], + 'header' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.header', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim,required' + ], + ], + 'bodytext' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.bodytext', + 'l10n_mode' => 'prefixLangTitle', + 'l10n_cat' => 'text', + 'config' => [ + 'type' => 'text', + 'cols' => '80', + 'rows' => '15', + 'softref' => 'typolink_tag,email[subst],url', + 'enableRichtext' => true + ], + ], + 'media' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.media', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'media', + [ + 'appearance' => [ + 'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference' + ], + 'overrideChildTca' => [ + 'types' => [ + \TYPO3\CMS\Core\Resource\File::FILETYPE_UNKNOWN => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_TEXT => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.audioOverlayPalette;audioOverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_VIDEO => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.videoOverlayPalette;videoOverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_APPLICATION => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ] + ] + ] + ], + $GLOBALS['TYPO3_CONF_VARS']['SYS']['mediafile_ext'] + ), + ], + 'mediaorient' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.mediaorient', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.mediaorient.left', + 'left' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.mediaorient.top', + 'top' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.mediaorient.right', + 'right' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.mediaorient.bottom', + 'bottom' + ], + ], + 'default' => 'left', + ], + 'l10n_mode' => 'exclude' + ], + 'imagecols' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.imagecols', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '1', + 1 + ], + [ + '2', + 2 + ], + [ + '3', + 3 + ], + [ + '4', + 4 + ], + [ + '5', + 5 + ], + [ + '6', + 6 + ] + ], + 'default' => 2 + ], + 'l10n_mode' => 'exclude' + ], + 'image_zoom' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:accordion_item.image_zoom', + 'config' => [ + 'type' => 'check', + 'items' => [ + [ + 0 => '', + 1 => '', + ] + ], + ] + ] + ] +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_card_group_item.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_card_group_item.php new file mode 100644 index 0000000..af9b200 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_card_group_item.php @@ -0,0 +1,420 @@ + [ + 'label' => 'header', + 'sortby' => 'sorting', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item', + 'delete' => 'deleted', + 'versioningWS' => true, + 'origUid' => 't3_origuid', + 'hideTable' => true, + 'hideAtCopy' => true, + 'prependAtCopy' => 'LLL:' . $generalLanguageFile . ':LGL.prependAtCopy', + 'transOrigPointerField' => 'l10n_parent', + 'transOrigDiffSourceField' => 'l10n_diffsource', + 'languageField' => 'sys_language_uid', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + ], + 'typeicon_classes' => [ + 'default' => 'content-bootstrappackage-card-group-item' + ], + ], + 'interface' => [ + 'showRecordFieldList' => ' + hidden, + tt_content, + header + ', + ], + 'types' => [ + '1' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.header;header, + image, + bodytext, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link;link, + icon_file, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + ], + 'palettes' => [ + '1' => [ + 'showitem' => '' + ], + 'access' => [ + 'showitem' => ' + starttime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:starttime_formlabel, + endtime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:endtime_formlabel + ' + ], + 'header' => [ + 'showitem' => ' + header, + --linebreak--, + subheader, + ' + ], + 'link' => [ + 'showitem' => ' + link, + link_title, + --linebreak--, + link_class, + --linebreak--, + link_icon_set, + --linebreak--, + link_icon_identifier, + link_icon, + ' + ], + 'general' => [ + 'showitem' => ' + tt_content + ' + ], + 'visibility' => [ + 'showitem' => ' + hidden;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item + ' + ], + // hidden but needs to be included all the time, so sys_language_uid is set correctly + 'hiddenLanguagePalette' => [ + 'showitem' => 'sys_language_uid, l10n_parent', + 'isHiddenPalette' => true, + ], + ], + 'columns' => [ + 'tt_content' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.tt_content', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tt_content', + 'foreign_table_where' => 'AND tt_content.pid=###CURRENT_PID### AND tt_content.{#CType}=\'card_group\'', + 'maxitems' => 1, + 'default' => 0, + ], + ], + 'hidden' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.hidden', + 'config' => [ + 'type' => 'check', + 'items' => [ + '1' => [ + '0' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:hidden.I.0' + ] + ] + ] + ], + 'starttime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0 + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'endtime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.endtime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0, + 'range' => [ + 'upper' => mktime(0, 0, 0, 1, 1, 2038) + ] + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'sys_language_uid' => [ + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.language', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => [ + [ + 'LLL:' . $generalLanguageFile . ':LGL.allLanguages', + -1 + ], + [ + 'LLL:' . $generalLanguageFile . ':LGL.default_value', + 0 + ] + ], + 'allowNonIdValues' => true, + ] + ], + 'l10n_parent' => [ + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.l18n_parent', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '', + 0 + ] + ], + 'foreign_table' => 'tx_bootstrappackage_card_group_item', + 'foreign_table_where' => 'AND tx_bootstrappackage_card_group_item.pid=###CURRENT_PID### AND tx_bootstrappackage_card_group_item.sys_language_uid IN (-1,0)', + 'default' => 0 + ] + ], + 'l10n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough' + ] + ], + 'header' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.header', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim,required' + ], + ], + 'subheader' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.subheader', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim' + ], + ], + 'image' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.image', + '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'] + ), + ], + 'bodytext' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.bodytext', + 'exclude' => true, + 'config' => [ + 'type' => 'text', + 'cols' => '80', + 'rows' => '15', + 'softref' => 'typolink_tag,email[subst],url', + 'enableRichtext' => true + ], + ], + 'link' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputLink', + 'size' => 50, + 'max' => 1024, + 'eval' => 'trim', + 'fieldControl' => [ + 'linkPopup' => [ + 'options' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link', + ], + ], + ], + 'softref' => 'typolink' + ], + ], + 'link_title' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link_title', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim' + ], + ], + 'link_icon_set' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link_icon_set', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconSetItems', + ], + ], + 'link_icon_identifier' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link_icon_identifier', + 'displayCond' => 'FIELD:link_icon_set:REQ:true', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconItems', + 'itemsProcConfig' => [ + 'iconSetField' => 'link_icon_set' + ], + 'fieldWizard' => [ + 'selectIcons' => [ + 'renderType' => 'iconWizard', + 'disabled' => false, + ], + ], + ], + ], + 'link_icon' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link_icon', + 'displayCond' => 'FIELD:link_icon_set:REQ:false', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'link_icon', + [ + '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' => ' + --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 + ' + ], + ], + ], + 'maxitems' => 1, + ], + 'gif,png,svg' + ), + ], + 'link_class' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:card_group_item.link_class', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['default', 'default'], + ['primary', 'primary'], + ['secondary', 'secondary'], + ['tertiary', 'tertiary'], + ['quaternary', 'quaternary'], + ['success', 'success'], + ['info', 'info'], + ['warning', 'warning'], + ['danger', 'danger'], + ['outline-default', 'outline-default'], + ['outline-primary', 'outline-primary'], + ['outline-secondary', 'outline-secondary'], + ['outline-tertiary', 'outline-tertiary'], + ['outline-quaternary', 'outline-quaternary'], + ['outline-success', 'outline-success'], + ['outline-info', 'outline-info'], + ['outline-warning', 'outline-warning'], + ['outline-danger', 'outline-danger'], + ] + ] + ], + ], +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_carousel_item.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_carousel_item.php new file mode 100644 index 0000000..922a90f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_carousel_item.php @@ -0,0 +1,728 @@ + [ + 'label' => 'header', + 'sortby' => 'sorting', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item', + 'type' => 'item_type', + 'delete' => 'deleted', + 'versioningWS' => true, + 'origUid' => 't3_origuid', + 'hideTable' => true, + 'hideAtCopy' => true, + 'prependAtCopy' => 'LLL:' . $generalLanguageFile . ':LGL.prependAtCopy', + 'transOrigPointerField' => 'l10n_parent', + 'transOrigDiffSourceField' => 'l10n_diffsource', + 'languageField' => 'sys_language_uid', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + ], + 'typeicon_column' => 'item_type', + 'typeicon_classes' => [ + 'default' => 'content-bootstrappackage-carousel-item', + 'header' => 'content-bootstrappackage-carousel-item-header', + 'call_to_action' => 'content-bootstrappackage-carousel-item-calltoaction', + 'image' => 'content-bootstrappackage-carousel-item-image', + 'text' => 'content-bootstrappackage-carousel-item-text', + 'text_and_image' => 'content-bootstrappackage-carousel-item-textandimage', + 'background_image' => 'content-bootstrappackage-carousel-item-backgroundimage', + 'html' => 'content-bootstrappackage-carousel-item-html' + ] + ], + 'interface' => [ + 'showRecordFieldList' => ' + hidden, + tt_content, + header, + header_layout, + header_class, + subheader, + subheader_layout, + subheader_class + bodytext, + image, + text_color, + background_color, + background_image + ', + ], + 'types' => [ + '1' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.html_formlabel, + nav_title, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + 'header' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header;header, + nav_title, + text_color, + link, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tabs.background, + background_color, + background_image, + background_image_options, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + 'text' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header;header, + nav_title, + bodytext, + text_color, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tabs.background, + background_color, + background_image, + background_image_options, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + 'call_to_action' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header;header, + nav_title, + bodytext, + button_text, + link, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tabs.background, + background_color, + background_image, + background_image_options, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + 'image' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.html_formlabel, + nav_title, + image, + link, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tabs.background, + background_color, + background_image, + background_image_options, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + 'text_and_image' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header;header, + nav_title, + bodytext, + text_color, + image, + link, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tabs.background, + background_color, + background_image, + background_image_options, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + 'background_image' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.html_formlabel, + nav_title, + background_color, + background_image, + background_image_options, + link, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + 'html' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:header.ALT.html_formlabel, + nav_title, + bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:bodytext.ALT.html_formlabel, + --div--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tabs.background, + background_color, + background_image, + background_image_options, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ', + 'columnsOverrides' => [ + 'bodytext' => [ + 'config' => [ + 'enableRichtext' => false + ] + ] + ] + ], + ], + 'palettes' => [ + '1' => [ + 'showitem' => '' + ], + 'access' => [ + 'showitem' => ' + starttime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:starttime_formlabel, + endtime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:endtime_formlabel + ' + ], + 'header' => [ + 'showitem' => ' + header, + header_layout, + header_class, + --linebreak--, + subheader, + subheader_layout, + subheader_class, + --linebreak--, + header_position, + ' + ], + 'general' => [ + 'showitem' => ' + tt_content, + item_type;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:CType_formlabel, + --linebreak--, + layout, + ' + ], + 'visibility' => [ + 'showitem' => ' + hidden;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item + ' + ], + // hidden but needs to be included all the time, so sys_language_uid is set correctly + 'hiddenLanguagePalette' => [ + 'showitem' => 'sys_language_uid, l10n_parent', + 'isHiddenPalette' => true, + ], + ], + 'columns' => [ + 'tt_content' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.tt_content', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tt_content', + 'foreign_table_where' => 'AND tt_content.pid=###CURRENT_PID### AND tt_content.{#CType} IN (\'carousel\',\'carousel_small\',\'carousel_fullscreen\')', + 'maxitems' => 1, + 'default' => 0, + ], + ], + 'item_type' => [ + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.type', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.item_type.header', + 'header', + 'content-bootstrappackage-carousel-item-header' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.item_type.text', + 'text', + 'content-bootstrappackage-carousel-item-text' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.item_type.calltoaction', + 'call_to_action', + 'content-bootstrappackage-carousel-item-calltoaction' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.item_type.image', + 'image', + 'content-bootstrappackage-carousel-item-image' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.item_type.textandimage', + 'text_and_image', + 'content-bootstrappackage-carousel-item-textandimage' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.item_type.backgroundimage', + 'background_image', + 'content-bootstrappackage-carousel-item-backgroundimage' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.item_type.html', + 'html', + 'content-bootstrappackage-carousel-item-html' + ], + ], + 'default' => 'header', + 'authMode' => $GLOBALS['TYPO3_CONF_VARS']['BE']['explicitADmode'], + 'authMode_enforce' => 'strict' + ], + 'l10n_mode' => 'exclude', + ], + 'hidden' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.hidden', + 'config' => [ + 'type' => 'check', + 'items' => [ + '1' => [ + '0' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:hidden.I.0' + ] + ] + ] + ], + 'starttime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0 + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'endtime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.endtime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0, + 'range' => [ + 'upper' => mktime(0, 0, 0, 1, 1, 2038) + ] + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'sys_language_uid' => [ + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.language', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => [ + [ + 'LLL:' . $generalLanguageFile . ':LGL.allLanguages', + -1 + ], + [ + 'LLL:' . $generalLanguageFile . ':LGL.default_value', + 0 + ] + ], + 'allowNonIdValues' => true, + ] + ], + 'l10n_parent' => [ + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.l18n_parent', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '', + 0 + ] + ], + 'foreign_table' => 'tx_bootstrappackage_carousel_item', + 'foreign_table_where' => 'AND tx_bootstrappackage_carousel_item.pid=###CURRENT_PID### AND tx_bootstrappackage_carousel_item.sys_language_uid IN (-1,0)', + 'default' => 0 + ] + ], + 'l10n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough' + ] + ], + 'layout' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.layout', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['custom', 'custom'], + ['primary', 'primary'], + ['secondary', 'secondary'], + ['tertiary', 'tertiary'], + ['quaternary', 'quaternary'], + ['light', 'light'], + ['dark', 'dark'] + ], + 'default' => 'secondary' + ], + 'l10n_mode' => 'exclude', + ], + 'link' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.link', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputLink', + 'size' => 50, + 'max' => 1024, + 'eval' => 'trim', + 'fieldControl' => [ + 'linkPopup' => [ + 'options' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.link', + ], + ], + ], + 'softref' => 'typolink' + ], + ], + 'header' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim,required' + ], + ], + 'header_layout' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header_layout', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + 'H1', + '1' + ], + [ + 'H2', + '2' + ], + [ + 'H3', + '3' + ], + [ + 'H4', + '4' + ], + ], + 'default' => '1' + ], + 'l10n_mode' => 'exclude', + ], + 'header_position' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header_position', + 'exclude' => true, + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header_position.default', + '' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header_position.center', + 'center' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header_position.right', + 'right' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header_position.left', + 'left' + ] + ], + 'default' => '' + ] + ], + 'header_class' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.header_class', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['', 'none'], + ['h1', 'h1'], + ['h2', 'h2'], + ['h3', 'h3'], + ['h4', 'h4'], + ['h5', 'h5'] + ] + ], + 'l10n_mode' => 'exclude', + ], + 'subheader' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.subheader', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim' + ], + ], + 'subheader_layout' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.subheader_layout', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + 'H2', + '2' + ], + [ + 'H3', + '3' + ], + [ + 'H4', + '4' + ], + ], + 'default' => '2' + ], + 'l10n_mode' => 'exclude', + ], + 'subheader_class' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.subheader_class', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['', 'none'], + ['h1', 'h1'], + ['h2', 'h2'], + ['h3', 'h3'], + ['h4', 'h4'], + ['h5', 'h5'] + ] + ], + 'l10n_mode' => 'exclude', + ], + 'nav_title' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.nav_title', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim' + ], + ], + 'bodytext' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.bodytext', + 'l10n_mode' => 'prefixLangTitle', + 'l10n_cat' => 'text', + 'config' => [ + 'type' => 'text', + 'cols' => '80', + 'rows' => '5', + 'softref' => 'typolink_tag,email[subst],url', + 'enableRichtext' => true + ], + ], + 'button_text' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.button_text', + 'config' => [ + 'type' => 'input', + 'size' => 20, + 'max' => 255 + ] + ], + 'image' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.image', + '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'] + ), + ], + 'text_color' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.text_color', + 'displayCond' => 'FIELD:layout:=:custom', + 'config' => [ + 'type' => 'input', + 'renderType' => 'colorpicker', + 'default' => '#FFFFFF', + ], + 'l10n_mode' => 'exclude', + ], + 'background_color' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.background_color', + 'displayCond' => 'FIELD:layout:=:custom', + 'config' => [ + 'type' => 'input', + 'renderType' => 'colorpicker', + 'default' => '#333333', + ], + 'l10n_mode' => 'exclude', + ], + 'background_image' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:carousel_item.background_image', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'background_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' => ' + 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'] + ), + 'l10n_mode' => 'exclude', + ], + 'background_image_options' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:field.background_image_options', + 'config' => [ + 'type' => 'flex', + 'ds' => [ + 'default' => 'FILE:EXT:bootstrap_package/Configuration/FlexForms/BackgroundImage.xml', + ], + ], + 'l10n_mode' => 'exclude', + ] + ], +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_icon_group_item.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_icon_group_item.php new file mode 100644 index 0000000..ab6ccec --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_icon_group_item.php @@ -0,0 +1,315 @@ + [ + 'label' => 'header', + 'sortby' => 'sorting', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item', + 'delete' => 'deleted', + 'versioningWS' => true, + 'origUid' => 't3_origuid', + 'hideTable' => true, + 'hideAtCopy' => true, + 'prependAtCopy' => 'LLL:' . $generalLanguageFile . ':LGL.prependAtCopy', + 'transOrigPointerField' => 'l10n_parent', + 'transOrigDiffSourceField' => 'l10n_diffsource', + 'languageField' => 'sys_language_uid', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + ], + 'typeicon_classes' => [ + 'default' => 'content-bootstrappackage-icon-group-item' + ], + ], + 'interface' => [ + 'showRecordFieldList' => ' + hidden, + tt_content, + header, + subheader, + bodytext, + icon_file, + ', + ], + 'types' => [ + '1' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header, + subheader, + bodytext, + link, + icon_set, + icon_identifier, + icon_file, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + ], + 'palettes' => [ + '1' => [ + 'showitem' => '' + ], + 'access' => [ + 'showitem' => ' + starttime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:starttime_formlabel, + endtime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:endtime_formlabel + ' + ], + 'general' => [ + 'showitem' => ' + tt_content + ' + ], + 'visibility' => [ + 'showitem' => ' + hidden;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item + ' + ], + // hidden but needs to be included all the time, so sys_language_uid is set correctly + 'hiddenLanguagePalette' => [ + 'showitem' => 'sys_language_uid, l10n_parent', + 'isHiddenPalette' => true, + ], + ], + 'columns' => [ + 'tt_content' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.tt_content', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tt_content', + 'foreign_table_where' => 'AND tt_content.pid=###CURRENT_PID### AND tt_content.{#CType}=\'icon_group\'', + 'maxitems' => 1, + 'default' => 0, + ], + ], + 'hidden' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.hidden', + 'config' => [ + 'type' => 'check', + 'items' => [ + '1' => [ + '0' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:hidden.I.0' + ] + ] + ] + ], + 'starttime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0 + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'endtime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.endtime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0, + 'range' => [ + 'upper' => mktime(0, 0, 0, 1, 1, 2038) + ] + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'sys_language_uid' => [ + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.language', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => [ + [ + 'LLL:' . $generalLanguageFile . ':LGL.allLanguages', + -1 + ], + [ + 'LLL:' . $generalLanguageFile . ':LGL.default_value', + 0 + ] + ], + 'allowNonIdValues' => true, + ] + ], + 'l10n_parent' => [ + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.l18n_parent', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '', + 0 + ] + ], + 'foreign_table' => 'tx_bootstrappackage_icon_group_item', + 'foreign_table_where' => 'AND tx_bootstrappackage_icon_group_item.pid=###CURRENT_PID### AND tx_bootstrappackage_icon_group_item.sys_language_uid IN (-1,0)', + 'default' => 0 + ] + ], + 'l10n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough' + ] + ], + 'header' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.header', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim,required' + ], + ], + 'subheader' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.subheader', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim' + ], + ], + 'bodytext' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.bodytext', + 'l10n_mode' => 'prefixLangTitle', + 'l10n_cat' => 'text', + 'config' => [ + 'type' => 'text', + 'cols' => '80', + 'rows' => '15', + 'softref' => 'typolink_tag,email[subst],url', + 'enableRichtext' => true + ], + ], + 'link' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.link', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputLink', + 'size' => 50, + 'max' => 1024, + 'eval' => 'trim', + 'fieldControl' => [ + 'linkPopup' => [ + 'options' => [ + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.link', + ], + ], + ], + 'softref' => 'typolink' + ], + 'l10n_mode' => 'exclude', + ], + 'icon_set' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.icon_set', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconSetItems', + ], + ], + 'icon_identifier' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.icon_identifier', + 'displayCond' => 'FIELD:icon_set:REQ:true', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconItems', + 'itemsProcConfig' => [ + 'iconSetField' => 'icon_set' + ], + 'fieldWizard' => [ + 'selectIcons' => [ + 'renderType' => 'iconWizard', + 'disabled' => false, + ], + ], + ], + ], + 'icon_file' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:icon_group_item.icon_file', + 'displayCond' => 'FIELD:icon_set:REQ:false', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'icon_file', + [ + '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' => ' + --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 + ' + ], + ], + ], + 'maxitems' => 1, + ], + 'gif,png,svg' + ), + ], + ], +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_tab_item.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_tab_item.php new file mode 100644 index 0000000..a391229 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_tab_item.php @@ -0,0 +1,341 @@ + [ + 'label' => 'header', + 'label_alt' => 'bodytext', + 'sortby' => 'sorting', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item', + 'delete' => 'deleted', + 'versioningWS' => true, + 'origUid' => 't3_origuid', + 'hideTable' => true, + 'hideAtCopy' => true, + 'prependAtCopy' => 'LLL:' . $generalLanguageFile . ':LGL.prependAtCopy', + 'transOrigPointerField' => 'l10n_parent', + 'transOrigDiffSourceField' => 'l10n_diffsource', + 'languageField' => 'sys_language_uid', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + ], + 'typeicon_classes' => [ + 'default' => 'content-bootstrappackage-tab-item' + ], + ], + 'interface' => [ + 'showRecordFieldList' => ' + hidden, + tt_content, + header, + bodytext + ', + ], + 'types' => [ + '1' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + header, + bodytext, + media, + --palette--;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.mediaposition;mediaposition, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + ], + 'palettes' => [ + '1' => [ + 'showitem' => '' + ], + 'access' => [ + 'showitem' => ' + starttime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:starttime_formlabel, + endtime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:endtime_formlabel + ' + ], + 'general' => [ + 'showitem' => ' + tt_content + ' + ], + 'mediaposition' => [ + 'showitem' => ' + mediaorient, + imagecols, + image_zoom, + ' + ], + 'visibility' => [ + 'showitem' => ' + hidden;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item + ' + ], + // hidden but needs to be included all the time, so sys_language_uid is set correctly + 'hiddenLanguagePalette' => [ + 'showitem' => 'sys_language_uid, l10n_parent', + 'isHiddenPalette' => true, + ], + ], + 'columns' => [ + 'tt_content' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.tt_content', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tt_content', + 'foreign_table_where' => 'AND tt_content.pid=###CURRENT_PID### AND tt_content.{#CType}=\'tab\'', + 'maxitems' => 1, + 'default' => 0, + ], + ], + 'hidden' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.hidden', + 'config' => [ + 'type' => 'check', + 'items' => [ + '1' => [ + '0' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:hidden.I.0' + ] + ] + ] + ], + 'starttime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0 + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'endtime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.endtime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0, + 'range' => [ + 'upper' => mktime(0, 0, 0, 1, 1, 2038) + ] + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'sys_language_uid' => [ + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.language', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => [ + [ + 'LLL:' . $generalLanguageFile . ':LGL.allLanguages', + -1 + ], + [ + 'LLL:' . $generalLanguageFile . ':LGL.default_value', + 0 + ] + ], + 'allowNonIdValues' => true, + ] + ], + 'l10n_parent' => [ + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.l18n_parent', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '', + 0 + ] + ], + 'foreign_table' => 'tx_bootstrappackage_tab_item', + 'foreign_table_where' => 'AND tx_bootstrappackage_tab_item.pid=###CURRENT_PID### AND tx_bootstrappackage_tab_item.sys_language_uid IN (-1,0)', + 'default' => 0 + ] + ], + 'l10n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough' + ] + ], + 'header' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.header', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim,required' + ], + ], + 'bodytext' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.bodytext', + 'l10n_mode' => 'prefixLangTitle', + 'l10n_cat' => 'text', + 'config' => [ + 'type' => 'text', + 'cols' => '80', + 'rows' => '15', + 'softref' => 'typolink_tag,email[subst],url', + 'enableRichtext' => true + ], + ], + 'media' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.media', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'media', + [ + 'appearance' => [ + 'createNewRelationLinkTitle' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference' + ], + 'overrideChildTca' => [ + 'types' => [ + \TYPO3\CMS\Core\Resource\File::FILETYPE_UNKNOWN => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_TEXT => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_IMAGE => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_AUDIO => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.audioOverlayPalette;audioOverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_VIDEO => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.videoOverlayPalette;videoOverlayPalette, + --palette--;;filePalette' + ], + \TYPO3\CMS\Core\Resource\File::FILETYPE_APPLICATION => [ + 'showitem' => ' + --palette--;LLL:EXT:lang/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette, + --palette--;;filePalette' + ] + ], + ], + ], + $GLOBALS['TYPO3_CONF_VARS']['SYS']['mediafile_ext'] + ), + ], + 'mediaorient' => [ + 'exclude' => 1, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.mediaorient', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.mediaorient.left', + 'left' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.mediaorient.top', + 'top' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.mediaorient.right', + 'right' + ], + [ + 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.mediaorient.bottom', + 'bottom' + ], + ], + 'default' => 'left', + ], + 'l10n_mode' => 'exclude' + ], + 'imagecols' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.imagecols', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '1', + 1 + ], + [ + '2', + 2 + ], + [ + '3', + 3 + ], + [ + '4', + 4 + ], + [ + '5', + 5 + ], + [ + '6', + 6 + ] + ], + 'default' => 2 + ], + 'l10n_mode' => 'exclude' + ], + 'image_zoom' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tab_item.image_zoom', + 'config' => [ + 'type' => 'check', + 'items' => [ + [ + 0 => '', + 1 => '', + ] + ], + ] + ] + ], +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_timeline_item.php b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_timeline_item.php new file mode 100644 index 0000000..de501ad --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TCA/tx_bootstrappackage_timeline_item.php @@ -0,0 +1,351 @@ + [ + 'label' => 'header', + 'label_userFunc' => BK2K\BootstrapPackage\Userfuncs\Tca::class . '->timelineItemLabel', + 'tstamp' => 'tstamp', + 'crdate' => 'crdate', + 'cruser_id' => 'cruser_id', + 'title' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item', + 'delete' => 'deleted', + 'versioningWS' => true, + 'origUid' => 't3_origuid', + 'hideTable' => true, + 'hideAtCopy' => true, + 'prependAtCopy' => 'LLL:' . $generalLanguageFile . ':LGL.prependAtCopy', + 'transOrigPointerField' => 'l10n_parent', + 'transOrigDiffSourceField' => 'l10n_diffsource', + 'languageField' => 'sys_language_uid', + 'default_sortby' => 'date', + 'enablecolumns' => [ + 'disabled' => 'hidden', + 'starttime' => 'starttime', + 'endtime' => 'endtime', + ], + 'typeicon_classes' => [ + 'default' => 'content-bootstrappackage-timeline-item' + ], + ], + 'interface' => [ + 'showRecordFieldList' => ' + hidden, + tt_content, + header + ', + ], + 'types' => [ + '1' => [ + 'showitem' => ' + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.general;general, + date, + header, + bodytext, + icon_set, + icon_identifier, + icon_file, + image, + --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility, + --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access, + --palette--;;hiddenLanguagePalette, + ' + ], + ], + 'palettes' => [ + '1' => [ + 'showitem' => '' + ], + 'access' => [ + 'showitem' => ' + starttime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:starttime_formlabel, + endtime;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:endtime_formlabel + ' + ], + 'general' => [ + 'showitem' => ' + tt_content + ' + ], + 'visibility' => [ + 'showitem' => ' + hidden;LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item + ' + ], + // hidden but needs to be included all the time, so sys_language_uid is set correctly + 'hiddenLanguagePalette' => [ + 'showitem' => 'sys_language_uid, l10n_parent', + 'isHiddenPalette' => true, + ], + ], + 'columns' => [ + 'tt_content' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.tt_content', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'tt_content', + 'foreign_table_where' => 'AND tt_content.pid=###CURRENT_PID### AND tt_content.{#CType}=\'timeline\'', + 'maxitems' => 1, + 'default' => 0, + ], + ], + 'hidden' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.hidden', + 'config' => [ + 'type' => 'check', + 'items' => [ + '1' => [ + '0' => 'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:hidden.I.0' + ] + ] + ] + ], + 'starttime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.starttime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0 + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'endtime' => [ + 'exclude' => true, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.endtime', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'eval' => 'datetime', + 'default' => 0, + 'range' => [ + 'upper' => mktime(0, 0, 0, 1, 1, 2038) + ] + ], + 'l10n_mode' => 'exclude', + 'l10n_display' => 'defaultAsReadonly' + ], + 'sys_language_uid' => [ + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.language', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => [ + [ + 'LLL:' . $generalLanguageFile . ':LGL.allLanguages', + -1 + ], + [ + 'LLL:' . $generalLanguageFile . ':LGL.default_value', + 0 + ] + ], + 'allowNonIdValues' => true, + ] + ], + 'l10n_parent' => [ + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:' . $generalLanguageFile . ':LGL.l18n_parent', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + [ + '', + 0 + ] + ], + 'foreign_table' => 'tx_bootstrappackage_timeline_item', + 'foreign_table_where' => 'AND tx_bootstrappackage_timeline_item.pid=###CURRENT_PID### AND tx_bootstrappackage_timeline_item.sys_language_uid IN (-1,0)', + 'default' => 0 + ] + ], + 'l10n_diffsource' => [ + 'config' => [ + 'type' => 'passthrough' + ] + ], + 'date' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.date', + 'config' => [ + 'type' => 'input', + 'renderType' => 'inputDateTime', + 'dbType' => 'datetime', + 'eval' => 'datetime,required' + ], + 'l10n_mode' => 'exclude', + ], + 'header' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.header', + 'config' => [ + 'type' => 'input', + 'size' => 50, + 'eval' => 'trim,required' + ], + ], + 'bodytext' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.bodytext', + 'l10n_mode' => 'prefixLangTitle', + 'l10n_cat' => 'text', + 'config' => [ + 'type' => 'text', + 'cols' => '80', + 'rows' => '15', + 'softref' => 'typolink_tag,email[subst],url', + 'enableRichtext' => true + ], + ], + 'icon_set' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.icon_set', + 'onChange' => 'reload', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconSetItems', + ], + ], + 'icon_identifier' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.icon_identifier', + 'displayCond' => 'FIELD:icon_set:REQ:true', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'BK2K\BootstrapPackage\Service\IconService->getIconItems', + 'itemsProcConfig' => [ + 'iconSetField' => 'icon_set' + ], + 'fieldWizard' => [ + 'selectIcons' => [ + 'renderType' => 'iconWizard', + 'disabled' => false, + ], + ], + ], + ], + 'icon_file' => [ + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.icon_file', + 'displayCond' => 'FIELD:icon_set:REQ:false', + 'config' => \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::getFileFieldTCAConfig( + 'icon_file', + [ + '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' => ' + --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 + ' + ], + ], + ], + 'maxitems' => 1, + ], + 'gif,png,svg' + ), + ], + 'image' => [ + 'exclude' => true, + 'label' => 'LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:timeline_item.image', + '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, + description, + 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'] + ), + ], + ], +]; diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/All.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/All.tsconfig new file mode 100644 index 0000000..2f24d85 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/All.tsconfig @@ -0,0 +1,5 @@ +########################## +#### CONTENT ELEMENTS #### +########################## +@import 'EXT:bootstrap_package/Configuration/TsConfig/Page/ContentElement/Categories.tsconfig' +@import 'EXT:bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/*.tsconfig' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Categories.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Categories.tsconfig new file mode 100644 index 0000000..07ea309 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Categories.tsconfig @@ -0,0 +1,10 @@ +#################### +#### CATEGORIES #### +#################### +mod.wizards.newContentElement.wizardItems { + interactive.header = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_group.interactive + media.header = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_group.media + text.header = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_group.text + social.header = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_group.social_media + data.header = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_group.data +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Accordion.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Accordion.tsconfig new file mode 100644 index 0000000..942b6c3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Accordion.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.interactive { + elements { + accordion { + iconIdentifier = content-bootstrappackage-accordion + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.accordion + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.accordion.description + tt_content_defValues { + CType = accordion + } + } + } + show := addToList(accordion) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Audio.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Audio.tsconfig new file mode 100644 index 0000000..c44d89c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Audio.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + audio { + iconIdentifier = content-audio + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.audio + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.audio.description + tt_content_defValues { + CType = audio + } + } + } + show := addToList(audio) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Bullets.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Bullets.tsconfig new file mode 100644 index 0000000..3eb1ba9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Bullets.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + bullets { + iconIdentifier = content-bullets + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_bulletList_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_bulletList_description + tt_content_defValues { + CType = bullets + } + } + } + show := addToList(bullets) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CardGroup.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CardGroup.tsconfig new file mode 100644 index 0000000..949a777 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CardGroup.tsconfig @@ -0,0 +1,29 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + card_group { + iconIdentifier = content-bootstrappackage-card-group + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group.description + tt_content_defValues { + CType = card_group + } + } + } + show := addToList(card_group) +} +mod.wizards.newContentElement.wizardItems.text { + elements { + card_group { + iconIdentifier = content-bootstrappackage-card-group + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.card_group.description + tt_content_defValues { + CType = card_group + } + } + } + show := addToList(card_group) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Carousel.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Carousel.tsconfig new file mode 100644 index 0000000..e336333 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Carousel.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.interactive { + elements { + carousel { + iconIdentifier = content-bootstrappackage-carousel + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.carousel + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.carousel.description + tt_content_defValues { + CType = carousel + } + } + } + show := addToList(carousel) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CarouselFullscreen.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CarouselFullscreen.tsconfig new file mode 100644 index 0000000..cc2b6b9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CarouselFullscreen.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.interactive { + elements { + carousel_fullscreen { + iconIdentifier = content-bootstrappackage-carousel + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.carousel_fullscreen + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.carousel_fullscreen.description + tt_content_defValues { + CType = carousel_fullscreen + } + } + } + show := addToList(carousel_fullscreen) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CarouselSmall.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CarouselSmall.tsconfig new file mode 100644 index 0000000..15626e0 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/CarouselSmall.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.interactive { + elements { + carousel_small { + iconIdentifier = content-bootstrappackage-carousel + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.carousel_small + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.carousel_small.description + tt_content_defValues { + CType = carousel_small + } + } + } + show := addToList(carousel_small) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Csv.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Csv.tsconfig new file mode 100644 index 0000000..6f3e9c8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Csv.tsconfig @@ -0,0 +1,25 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.data { + elements { + csv { + iconIdentifier = content-bootstrappackage-csv + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.csv + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.csv.description + tt_content_defValues { + CType = csv + } + } + } + show := addToList(csv) +} + +################# +#### PREVIEW #### +################# +mod.web_layout.tt_content { + preview { + csv = EXT:bootstrap_package/Resources/Private/Templates/Preview/Csv.html + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/ExternalMedia.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/ExternalMedia.tsconfig new file mode 100644 index 0000000..fdc9090 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/ExternalMedia.tsconfig @@ -0,0 +1,25 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + external_media { + iconIdentifier = content-bootstrappackage-externalmedia + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.external_media + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.external_media.description + tt_content_defValues { + CType = external_media + } + } + } + show := addToList(external_media) +} + +################# +#### PREVIEW #### +################# +mod.web_layout.tt_content { + preview { + external_media = EXT:bootstrap_package/Resources/Private/Templates/Preview/ExternalMedia.html + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Gallery.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Gallery.tsconfig new file mode 100644 index 0000000..ab77f84 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Gallery.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + gallery { + iconIdentifier = content-bootstrappackage-gallery + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.gallery + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.gallery.description + tt_content_defValues { + CType = gallery + } + } + } + show := addToList(gallery) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Header.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Header.tsconfig new file mode 100644 index 0000000..4a81729 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Header.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + header { + iconIdentifier = content-header + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_headerOnly_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_headerOnly_description + tt_content_defValues { + CType = header + } + } + } + show := addToList(header) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/IconGroup.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/IconGroup.tsconfig new file mode 100644 index 0000000..3987d09 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/IconGroup.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + icon_group { + iconIdentifier = content-bootstrappackage-icon-group + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.icon_group.description + tt_content_defValues { + CType = icon_group + } + } + } + show := addToList(icon_group) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Image.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Image.tsconfig new file mode 100644 index 0000000..345a9e3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Image.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + image { + iconIdentifier = content-image + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_imagesOnly_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_imagesOnly_description + tt_content_defValues { + CType = image + } + } + } + show := addToList(image) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/ListGroup.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/ListGroup.tsconfig new file mode 100644 index 0000000..e81c181 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/ListGroup.tsconfig @@ -0,0 +1,25 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + listgroup { + iconIdentifier = content-bootstrappackage-listgroup + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.listgroup + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.listgroup.description + tt_content_defValues { + CType = listgroup + } + } + } + show := addToList(listgroup) +} + +################# +#### PREVIEW #### +################# +mod.web_layout.tt_content { + preview { + listgroup = EXT:bootstrap_package/Resources/Private/Templates/Preview/ListGroup.html + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Media.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Media.tsconfig new file mode 100644 index 0000000..9d950a6 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Media.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + media { + iconIdentifier = mimetypes-x-content-multimedia + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.media + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.media.description + tt_content_defValues { + CType = media + } + } + } + show := addToList(media) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuCardDir.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuCardDir.tsconfig new file mode 100644 index 0000000..0943a15 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuCardDir.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.menu { + elements { + menu_card_dir { + iconIdentifier = content-bootstrappackage-menu-card + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card_dir + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card_dir.description + tt_content_defValues { + CType = menu_card_dir + } + } + } + show := addToList(menu_card_dir) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuCardList.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuCardList.tsconfig new file mode 100644 index 0000000..6294cf5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuCardList.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.menu { + elements { + menu_card_list { + iconIdentifier = content-bootstrappackage-menu-card + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card_list + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.card_list.description + tt_content_defValues { + CType = menu_card_list + } + } + } + show := addToList(menu_card_list) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuThumbnailDir.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuThumbnailDir.tsconfig new file mode 100644 index 0000000..95f7c3f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuThumbnailDir.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.menu { + elements { + menu_thumbnail_dir { + iconIdentifier = content-menu-thumbnail + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail_dir + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail_dir.description + tt_content_defValues { + CType = menu_thumbnail_dir + } + } + } + show := addToList(menu_thumbnail_dir) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuThumbnailList.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuThumbnailList.tsconfig new file mode 100644 index 0000000..cee7e74 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/MenuThumbnailList.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.menu { + elements { + menu_thumbnail_list { + iconIdentifier = content-menu-thumbnail + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail_list + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:menu.thumbnail_list.description + tt_content_defValues { + CType = menu_thumbnail_list + } + } + } + show := addToList(menu_thumbnail_list) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Panel.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Panel.tsconfig new file mode 100644 index 0000000..6d06ed2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Panel.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + panel { + iconIdentifier = content-panel + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.panel + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.panel.description + tt_content_defValues { + CType = panel + } + } + } + show := addToList(panel) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Quote.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Quote.tsconfig new file mode 100644 index 0000000..fcc85d6 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Quote.tsconfig @@ -0,0 +1,25 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + quote { + iconIdentifier = content-quote + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.quote + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.quote.description + tt_content_defValues { + CType = quote + } + } + } + show := addToList(quote) +} + +################# +#### PREVIEW #### +################# +mod.web_layout.tt_content { + preview { + quote = EXT:bootstrap_package/Resources/Private/Templates/Preview/Quote.html + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/SocialLinks.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/SocialLinks.tsconfig new file mode 100644 index 0000000..f21ece1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/SocialLinks.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.social { + elements { + social_links { + iconIdentifier = content-bootstrappackage-social-links + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.social_links + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.social_links.description + tt_content_defValues { + CType = social_links + } + } + } + show := addToList(social_links) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Tab.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Tab.tsconfig new file mode 100644 index 0000000..fe8d69f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Tab.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + tab { + iconIdentifier = content-bootstrappackage-tab + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.tab + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.tab.description + tt_content_defValues { + CType = tab + } + } + } + show := addToList(tab) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Table.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Table.tsconfig new file mode 100644 index 0000000..8c38188 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Table.tsconfig @@ -0,0 +1,29 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.data { + elements { + table { + iconIdentifier = content-table + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_table_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_table_description + tt_content_defValues { + CType = table + } + } + } + show := addToList(table) +} +mod.wizards.newContentElement.wizardItems.text { + elements { + table { + iconIdentifier = content-table + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_table_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_table_description + tt_content_defValues { + CType = table + } + } + } + show := addToList(table) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Text.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Text.tsconfig new file mode 100644 index 0000000..ef0cf18 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Text.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + text { + iconIdentifier = content-text + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_regularText_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_regularText_description + tt_content_defValues { + CType = text + } + } + } + show := addToList(text) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textcolumn.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textcolumn.tsconfig new file mode 100644 index 0000000..8eb1549 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textcolumn.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + textcolumn { + iconIdentifier = content-text-columns + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.textcolumn + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.textcolumn.description + tt_content_defValues { + CType = textcolumn + } + } + } + show := addToList(textcolumn) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Texticon.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Texticon.tsconfig new file mode 100644 index 0000000..fe16a2f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Texticon.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + texticon { + iconIdentifier = content-bootstrappackage-texticon + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.texticon + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.texticon.description + tt_content_defValues { + CType = texticon + } + } + } + show := addToList(texticon) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textmedia.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textmedia.tsconfig new file mode 100644 index 0000000..4fce3ca --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textmedia.tsconfig @@ -0,0 +1,29 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + textmedia { + iconIdentifier = content-textmedia + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textMedia_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textMedia_description + tt_content_defValues { + CType = textmedia + } + } + } + show := addToList(textmedia) +} +mod.wizards.newContentElement.wizardItems.text { + elements { + textmedia { + iconIdentifier = content-textmedia + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textMedia_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textMedia_description + tt_content_defValues { + CType = textmedia + } + } + } + show := addToList(textmedia) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textpic.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textpic.tsconfig new file mode 100644 index 0000000..c227358 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textpic.tsconfig @@ -0,0 +1,29 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + textpic { + iconIdentifier = content-textpic + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textImage_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textImage_description + tt_content_defValues { + CType = textpic + } + } + } + show := addToList(textpic) +} +mod.wizards.newContentElement.wizardItems.text { + elements { + textpic { + iconIdentifier = content-textpic + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textImage_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:common_textImage_description + tt_content_defValues { + CType = textpic + } + } + } + show := addToList(textpic) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textteaser.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textteaser.tsconfig new file mode 100644 index 0000000..9e07d51 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Textteaser.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.text { + elements { + textteaser { + iconIdentifier = content-text-teaser + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.textteaser + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.textteaser.description + tt_content_defValues { + CType = textteaser + } + } + } + show := addToList(textteaser) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Timeline.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Timeline.tsconfig new file mode 100644 index 0000000..b55242d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Timeline.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.interactive { + elements { + timeline { + iconIdentifier = content-bootstrappackage-timeline + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.timeline + description = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:content_element.timeline.description + tt_content_defValues { + CType = timeline + } + } + } + show := addToList(timeline) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Uploads.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Uploads.tsconfig new file mode 100644 index 0000000..9ec7618 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/ContentElement/Element/Uploads.tsconfig @@ -0,0 +1,16 @@ +#################################### +#### NEW CONTENT ELEMENT WIZARD #### +#################################### +mod.wizards.newContentElement.wizardItems.media { + elements { + uploads { + iconIdentifier = content-special-uploads + title = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:special_filelinks_title + description = LLL:EXT:backend/Resources/Private/Language/locallang_db_new_content_el.xlf:special_filelinks_description + tt_content_defValues { + CType = uploads + } + } + } + show := addToList(uploads) +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig new file mode 100644 index 0000000..6c6fb6a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig @@ -0,0 +1,4 @@ +######################## +#### BACKENDLAYOUTS #### +######################## +@import 'EXT:bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/*.tsconfig' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns.tsconfig new file mode 100644 index 0000000..363be4e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns.tsconfig @@ -0,0 +1,81 @@ +################################## +#### BACKENDLAYOUT: 2 COLUMNS #### +################################## +mod { + web_layout { + BackendLayouts { + 2_columns { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.2_columns + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 8 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.right + colPos = 2 + colspan = 4 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/2_columns.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_25_75.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_25_75.tsconfig new file mode 100644 index 0000000..6fad19b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_25_75.tsconfig @@ -0,0 +1,81 @@ +######################################## +#### BACKENDLAYOUT: 2 COLUMNS 25/75 #### +######################################## +mod { + web_layout { + BackendLayouts { + 2_columns_25_75 { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.2_columns_25_75 + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.left + colPos = 1 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 8 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/2_columns_25_75.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_50_50.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_50_50.tsconfig new file mode 100644 index 0000000..5de9f6a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_50_50.tsconfig @@ -0,0 +1,81 @@ +######################################## +#### BACKENDLAYOUT: 2 COLUMNS 50/50 #### +######################################## +mod { + web_layout { + BackendLayouts { + 2_columns_50_50 { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.2_columns_50_50 + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 6 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.right + colPos = 2 + colspan = 6 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/2_columns_50_50.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_offset_right.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_offset_right.tsconfig new file mode 100644 index 0000000..c675a04 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/2_columns_offset_right.tsconfig @@ -0,0 +1,81 @@ +############################################### +#### BACKENDLAYOUT: 2 COLUMNS OFFSET RIGHT #### +############################################### +mod { + web_layout { + BackendLayouts { + 2_columns_offset_right { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.2_columns_offset_right + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 8 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.right + colPos = 2 + colspan = 4 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/2_columns_offset_right.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/3_columns.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/3_columns.tsconfig new file mode 100644 index 0000000..17104e6 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/3_columns.tsconfig @@ -0,0 +1,86 @@ +################################## +#### BACKENDLAYOUT: 3 COLUMNS #### +################################## +mod { + web_layout { + BackendLayouts { + 3_columns { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.3_columns + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.left + colPos = 1 + colspan = 3 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 6 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.right + colPos = 2 + colspan = 3 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/3_columns.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig new file mode 100644 index 0000000..59eab70 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/default.tsconfig @@ -0,0 +1,76 @@ +################################ +#### BACKENDLAYOUT: DEFAULT #### +################################ +mod { + web_layout { + BackendLayouts { + default { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.default + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 12 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/default.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/simple.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/simple.tsconfig new file mode 100644 index 0000000..c96a9d1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/simple.tsconfig @@ -0,0 +1,57 @@ +############################### +#### BACKENDLAYOUT: SIMPLE #### +############################### +mod { + web_layout { + BackendLayouts { + simple { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.simple + config { + backend_layout { + colCount = 12 + rowCount = 4 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 12 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/simple.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/special_feature.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/special_feature.tsconfig new file mode 100644 index 0000000..9458bb5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/special_feature.tsconfig @@ -0,0 +1,141 @@ +######################################## +#### BACKENDLAYOUT: SPECIAL FEATURE #### +######################################## +mod { + web_layout { + BackendLayouts { + special_feature { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.special_feature + config { + backend_layout { + colCount = 12 + rowCount = 10 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 12 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special1 + colPos = 30 + colspan = 6 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special2 + colPos = 31 + colspan = 6 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special3 + colPos = 32 + colspan = 6 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special4 + colPos = 33 + colspan = 6 + } + } + } + 6 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.main2 + colPos = 4 + colspan = 12 + } + } + } + 7 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special5 + colPos = 34 + colspan = 6 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special6 + colPos = 35 + colspan = 6 + } + } + } + 8 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special7 + colPos = 36 + colspan = 6 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.special8 + colPos = 37 + colspan = 6 + } + } + } + 9 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 10 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/special_feature.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/special_start.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/special_start.tsconfig new file mode 100644 index 0000000..d83557d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/special_start.tsconfig @@ -0,0 +1,95 @@ +###################################### +#### BACKENDLAYOUT: SPECIAL START #### +###################################### +mod { + web_layout { + BackendLayouts { + special_start { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.special_start + config { + backend_layout { + colCount = 12 + rowCount = 6 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.middle1 + colPos = 20 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.middle2 + colPos = 21 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.middle3 + colPos = 22 + colspan = 4 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 6 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/special_start.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_left.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_left.tsconfig new file mode 100644 index 0000000..a302170 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_left.tsconfig @@ -0,0 +1,80 @@ +########################################### +#### BACKENDLAYOUT: SUBNAVIGATION LEFT #### +########################################### +mod { + web_layout { + BackendLayouts { + subnavigation_left { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.subnavigation_left + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.subnav + colspan = 3 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 9 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/subnavigation_left.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_left_2_columns.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_left_2_columns.tsconfig new file mode 100644 index 0000000..deb513c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_left_2_columns.tsconfig @@ -0,0 +1,85 @@ +##################################################### +#### BACKENDLAYOUT: SUBNAVIGATION LEFT 2 COLUMNS #### +##################################################### +mod { + web_layout { + BackendLayouts { + subnavigation_left_2_columns { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.subnavigation_left_2_columns + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.subnav + colspan = 3 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.left + colPos = 1 + colspan = 3 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 6 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/subnavigation_left_2_columns.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_right.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_right.tsconfig new file mode 100644 index 0000000..0a235ef --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_right.tsconfig @@ -0,0 +1,80 @@ +############################################ +#### BACKENDLAYOUT: SUBNAVIGATION RIGHT #### +############################################ +mod { + web_layout { + BackendLayouts { + subnavigation_right { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.subnavigation_right + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 9 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.subnav + colspan = 3 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/subnavigation_right.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_right_2_columns.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_right_2_columns.tsconfig new file mode 100644 index 0000000..6154bd7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts/subnavigation_right_2_columns.tsconfig @@ -0,0 +1,85 @@ +###################################################### +#### BACKENDLAYOUT: SUBNAVIGATION RIGHT 2 COLUMNS #### +###################################################### +mod { + web_layout { + BackendLayouts { + subnavigation_right_2_columns { + title = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.subnavigation_right_2_columns + config { + backend_layout { + colCount = 12 + rowCount = 5 + rows { + 1 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.border + colPos = 3 + colspan = 12 + } + } + } + 2 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentbefore + colPos = 8 + colspan = 12 + } + } + } + 3 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.normal + colPos = 0 + colspan = 6 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.right + colPos = 2 + colspan = 3 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.subnav + colspan = 3 + } + } + } + 4 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.contentafter + colPos = 9 + colspan = 12 + } + } + } + 5 { + columns { + 1 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer1 + colPos = 10 + colspan = 4 + } + 2 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer2 + colPos = 11 + colspan = 4 + } + 3 { + name = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:backend_layout.column.footer3 + colPos = 12 + colspan = 4 + } + } + } + } + } + } + icon = EXT:bootstrap_package/Resources/Public/Icons/BackendLayouts/subnavigation_right_2_columns.svg + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/RTE.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/RTE.tsconfig new file mode 100644 index 0000000..cd256e1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/RTE.tsconfig @@ -0,0 +1,8 @@ +############# +#### RTE #### +############# +RTE { + default { + preset = bootstrap + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCADefaults.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCADefaults.tsconfig new file mode 100644 index 0000000..218df5c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCADefaults.tsconfig @@ -0,0 +1,8 @@ +##################### +#### TCAdefaults #### +##################### +TCAdefaults { + tt_content { + imagecols = 1 + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCEFORM.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCEFORM.tsconfig new file mode 100644 index 0000000..9173b9f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCEFORM.tsconfig @@ -0,0 +1,72 @@ +################# +#### TCEFORM #### +################# +TCEFORM { + pages { + layout { + removeItems = 1,2,3 + } + } + tt_content { + header_layout { + altLabels { + 1 = H1 + 2 = H2 + 3 = H3 + 4 = H4 + 5 = H5 + } + } + layout { + removeItems = 1,2,3 + disableNoMatchingValueElement = 1 + types { + uploads { + removeItems = 3 + altLabels { + 0 = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:uploadslayout.default + 1 = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:uploadslayout.icons + 2 = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:uploadslayout.iconsandpreview + } + } + } + } + table_class { + addItems { + hover = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tablelayout.hover + condensed = LLL:EXT:bootstrap_package/Resources/Private/Language/Backend.xlf:tablelayout.condensed + } + } + imageborder { + disabled = 1 + } + imagecols { + removeItems = 7,8 + } + image_zoom { + types { + media { + disabled = 1 + } + } + } + imageorient { + removeItems = 1,2,9,10,17,18 + types { + image { + disabled = 1 + } + media { + disabled = 1 + } + } + } + accessibility_title { + disabled = 1 + } + // Disable imageheight and imagewidth for textpic and image + // to avoid incorrect rendering in frontend + imageheight.disabled = 1 + imagewidth.disabled = 1 + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCEMAIN.tsconfig b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCEMAIN.tsconfig new file mode 100644 index 0000000..eb6aded --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TsConfig/Page/TCEMAIN.tsconfig @@ -0,0 +1,11 @@ +################# +#### TCEMAIN #### +################# +TCEMAIN { + permissions { + groupid = 1 + user = show, editcontent, edit, new, delete + group = show, editcontent, edit, new, delete + everybody = + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap4/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap4/constants.typoscript new file mode 100644 index 0000000..442b70f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap4/constants.typoscript @@ -0,0 +1,105 @@ +##################### +### BOOTSTRAP 4.x ### +##################### +plugin.bootstrap_package.settings.scss > + +############################ +### CUSTOM SUBCATEGORIES ### +############################ +# customsubcategory=bp4_001=Grayscale +# customsubcategory=bp4_002=Colors +# customsubcategory=bp4_003=Contrast +# customsubcategory=bp4_004=Body +# customsubcategory=bp4_005=Links +# customsubcategory=bp4_006=Fonts +# customsubcategory=bp4_010=Options + +plugin.bootstrap_package { + settings { + scss { + + # cat=bootstrap 4.x: styling/bp4_001/001; type=string; label=$white: + white = #ffffff + # cat=bootstrap 4.x: styling/bp4_001/002; type=string; label=$gray-100: + gray-100 = #f8f8f8 + # cat=bootstrap 4.x: styling/bp4_001/003; type=string; label=$gray-200: + gray-200 = #e9e9e9 + # cat=bootstrap 4.x: styling/bp4_001/004; type=string; label=$gray-300: + gray-300 = #dedede + # cat=bootstrap 4.x: styling/bp4_001/005; type=string; label=$gray-400: + gray-400 = #cecece + # cat=bootstrap 4.x: styling/bp4_001/006; type=string; label=$gray-500: + gray-500 = #ababab + # cat=bootstrap 4.x: styling/bp4_001/007; type=string; label=$gray-600: + gray-600 = #6c6c6c + # cat=bootstrap 4.x: styling/bp4_001/008; type=string; label=$gray-700: + gray-700 = #494949 + # cat=bootstrap 4.x: styling/bp4_001/009; type=string; label=$gray-800: + gray-800 = #313131 + # cat=bootstrap 4.x: styling/bp4_001/010; type=string; label=$gray-900: + gray-900 = #212121 + # cat=bootstrap 4.x: styling/bp4_001/011; type=string; label=$black: + black = #000000 + + # cat=bootstrap 4.x: styling/bp4_002/001; type=string; label=$primary: + primary = #2a9d8f + # cat=bootstrap 4.x: styling/bp4_002/002; type=string; label=$secondary: + secondary = #e76f51 + # cat=bootstrap 4.x: styling/bp4_002/003; type=string; label=$tertiary: + tertiary = #f4a261 + # cat=bootstrap 4.x: styling/bp4_002/004; type=string; label=$quaternary: + quaternary = #e9c46a + + # cat=bootstrap 4.x: styling/bp4_002/005; type=string; label=$default: + default = #eaebec + # cat=bootstrap 4.x: styling/bp4_002/006; type=string; label=$success: + success = #5cb85c + # cat=bootstrap 4.x: styling/bp4_002/007; type=string; label=$info: + info = #319fc0 + # cat=bootstrap 4.x: styling/bp4_002/008; type=string; label=$warning: + warning = #f0ad4e + # cat=bootstrap 4.x: styling/bp4_002/009; type=string; label=$danger: + danger = #d9534f + # cat=bootstrap 4.x: styling/bp4_002/010; type=string; label=$lighter: + lighter = $gray-100 + # cat=bootstrap 4.x: styling/bp4_002/011; type=string; label=$light: + light = $gray-200 + # cat=bootstrap 4.x: styling/bp4_002/012; type=string; label=$dark: + dark = $gray-800 + # cat=bootstrap 4.x: styling/bp4_002/013; type=string; label=$darker: + darker = $gray-900 + + # cat=bootstrap 4.x: styling/bp4_003/001; type=string; label=$yiq-contrasted-threshold: + yiq-contrasted-threshold = 160 + + # cat=bootstrap 4.x: styling/bp4_004/001; type=string; label=$body-bg: + body-bg = $white + # cat=bootstrap 4.x: styling/bp4_004/002; type=string; label=$body-color: + body-color = $gray-900 + + # cat=bootstrap 4.x: styling/bp4_005/001; type=string; label=$link-color: + link-color = theme-color("primary") + # cat=bootstrap 4.x: styling/bp4_005/002; type=string; label=$link-decoration: + link-decoration = none + # cat=bootstrap 4.x: styling/bp4_005/003; type=string; label=$link-hover-color: + link-hover-color = darken($link-color, 15%) + # cat=bootstrap 4.x: styling/bp4_005/004; type=string; label=$link-hover-decoration: + link-hover-decoration = underline + + # cat=bootstrap 4.x: styling/bp4_006/001; type=string; label=$font-family-sans-serif: + font-family-sans-serif = "#{$google-webfont}", sans-serif + # cat=bootstrap 4.x: styling/bp4_006/002; type=string; label=$font-family-monospace: + font-family-monospace = SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace + + # cat=bootstrap 4.x: styling/bp4_010/001; type=options[Enabled=true, Disabled=false]; label=$enable-rounded: + enable-rounded = true + # cat=bootstrap 4.x: styling/bp4_010/002; type=options[Enabled=true, Disabled=false]; label=$enable-shadows: + enable-shadows = true + # cat=bootstrap 4.x: styling/bp4_010/003; type=options[Enabled=true, Disabled=false]; label=$enable-gradients: + enable-gradients = false + # cat=bootstrap 4.x: styling/bp4_010/004; type=options[Enabled=true, Disabled=false]; label=$enable-transitions: + enable-transitions = true + + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap4/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap4/setup.typoscript new file mode 100644 index 0000000..dcb8fa1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap4/setup.typoscript @@ -0,0 +1,15 @@ +############## +#### PAGE #### +############## +page { + includeCSS { + # bootstrap 4.x will be included in the themes.scss file + # for standalone usage just uncomment the following line + # bootstrap = EXT:bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/bootstrap.scss + theme = EXT:bootstrap_package/Resources/Public/Scss/bootstrap4/theme.scss + } + includeJSFooterlibs { + popper = EXT:bootstrap_package/Resources/Public/Contrib/popper/popper.min.js + bootstrap = EXT:bootstrap_package/Resources/Public/Contrib/bootstrap4/js/bootstrap.min.js + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap5/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap5/constants.typoscript new file mode 100644 index 0000000..f41b6b8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap5/constants.typoscript @@ -0,0 +1,107 @@ +##################### +### BOOTSTRAP 5.x ### +##################### +plugin.bootstrap_package.settings.scss > + +############################ +### CUSTOM SUBCATEGORIES ### +############################ +# customsubcategory=bp5_001=Grayscale +# customsubcategory=bp5_002=Colors +# customsubcategory=bp5_003=Contrast +# customsubcategory=bp5_004=Body +# customsubcategory=bp5_005=Links +# customsubcategory=bp5_006=Fonts +# customsubcategory=bp5_010=Options + +plugin.bootstrap_package { + settings { + scss { + + # cat=bootstrap 5.x: styling/bp5_001/001; type=string; label=$white: + white = #ffffff + # cat=bootstrap 5.x: styling/bp5_001/002; type=string; label=$gray-100: + gray-100 = #f8f8f8 + # cat=bootstrap 5.x: styling/bp5_001/003; type=string; label=$gray-200: + gray-200 = #e9e9e9 + # cat=bootstrap 5.x: styling/bp5_001/004; type=string; label=$gray-300: + gray-300 = #dedede + # cat=bootstrap 5.x: styling/bp5_001/005; type=string; label=$gray-400: + gray-400 = #cecece + # cat=bootstrap 5.x: styling/bp5_001/006; type=string; label=$gray-500: + gray-500 = #ababab + # cat=bootstrap 5.x: styling/bp5_001/007; type=string; label=$gray-600: + gray-600 = #6c6c6c + # cat=bootstrap 5.x: styling/bp5_001/008; type=string; label=$gray-700: + gray-700 = #494949 + # cat=bootstrap 5.x: styling/bp5_001/009; type=string; label=$gray-800: + gray-800 = #313131 + # cat=bootstrap 5.x: styling/bp5_001/010; type=string; label=$gray-900: + gray-900 = #212121 + # cat=bootstrap 5.x: styling/bp5_001/011; type=string; label=$black: + black = #000000 + + # cat=bootstrap 5.x: styling/bp5_002/001; type=string; label=$primary: + primary = #2a9d8f + # cat=bootstrap 5.x: styling/bp5_002/002; type=string; label=$secondary: + secondary = #e76f51 + # cat=bootstrap 5.x: styling/bp5_002/003; type=string; label=$tertiary: + tertiary = #f4a261 + # cat=bootstrap 5.x: styling/bp5_002/004; type=string; label=$quaternary: + quaternary = #e9c46a + + # cat=bootstrap 5.x: styling/bp5_002/005; type=string; label=$default: + default = #eaebec + # cat=bootstrap 5.x: styling/bp5_002/006; type=string; label=$success: + success = #5cb85c + # cat=bootstrap 5.x: styling/bp5_002/007; type=string; label=$info: + info = #319fc0 + # cat=bootstrap 5.x: styling/bp5_002/008; type=string; label=$warning: + warning = #f0ad4e + # cat=bootstrap 5.x: styling/bp5_002/009; type=string; label=$danger: + danger = #d9534f + # cat=bootstrap 5.x: styling/bp5_002/010; type=string; label=$lighter: + lighter = $gray-100 + # cat=bootstrap 5.x: styling/bp5_002/011; type=string; label=$light: + light = $gray-200 + # cat=bootstrap 5.x: styling/bp5_002/012; type=string; label=$dark: + dark = $gray-800 + # cat=bootstrap 5.x: styling/bp5_002/013; type=string; label=$darker: + darker = $gray-900 + + # cat=bootstrap 5.x: styling/bp5_003/001; type=string; label=$min-contrast-ratio: + min-contrast-ratio = 2.4 + + # cat=bootstrap 5.x: styling/bp5_004/001; type=string; label=$body-bg: + body-bg = $white + # cat=bootstrap 5.x: styling/bp5_004/002; type=string; label=$body-color: + body-color = $gray-900 + + # cat=bootstrap 5.x: styling/bp5_005/001; type=string; label=$link-color: + link-color = $primary + # cat=bootstrap 5.x: styling/bp5_005/002; type=string; label=$link-decoration: + link-decoration = none + # cat=bootstrap 5.x: styling/bp5_005/003; type=string; label=$link-shade-percentage: + link-shade-percentage = 20% + # cat=bootstrap 5.x: styling/bp5_005/004; type=string; label=$link-hover-color: + link-hover-color = shift-color($link-color, $link-shade-percentage) + # cat=bootstrap 5.x: styling/bp5_005/005; type=string; label=$link-hover-decoration: + link-hover-decoration = underline + + # cat=bootstrap 5.x: styling/bp5_006/001; type=string; label=$font-family-sans-serif: + font-family-sans-serif = "#{$google-webfont}", sans-serif + # cat=bootstrap 5.x: styling/bp5_006/002; type=string; label=$font-family-monospace: + font-family-monospace = SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + + # cat=bootstrap 5.x: styling/bp5_010/001; type=options[Enabled=true, Disabled=false]; label=$enable-rounded: + enable-rounded = true + # cat=bootstrap 5.x: styling/bp5_010/002; type=options[Enabled=true, Disabled=false]; label=$enable-shadows: + enable-shadows = true + # cat=bootstrap 5.x: styling/bp5_010/003; type=options[Enabled=true, Disabled=false]; label=$enable-gradients: + enable-gradients = false + # cat=bootstrap 5.x: styling/bp5_010/004; type=options[Enabled=true, Disabled=false]; label=$enable-transitions: + enable-transitions = true + + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap5/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap5/setup.typoscript new file mode 100644 index 0000000..d890bb4 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Bootstrap5/setup.typoscript @@ -0,0 +1,15 @@ +############## +#### PAGE #### +############## +page { + includeCSS { + # bootstrap 5.x will be included in the themes.scss file + # for standalone usage just uncomment the following line + # bootstrap = EXT:bootstrap_package/Resources/Public/Contrib/bootstrap5/scss/bootstrap.scss + theme = EXT:bootstrap_package/Resources/Public/Scss/bootstrap5/theme.scss + } + includeJSFooterlibs { + popper = EXT:bootstrap_package/Resources/Public/Contrib/popper-core/popper.min.js + bootstrap = EXT:bootstrap_package/Resources/Public/Contrib/bootstrap5/js/bootstrap.min.js + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Accordion.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Accordion.typoscript new file mode 100644 index 0000000..b3b755c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Accordion.typoscript @@ -0,0 +1,111 @@ +############################################ +#### CTYPE: BOOTSTRAP PACKAGE ACCORDION #### +############################################ + +tt_content.accordion > +tt_content.accordion =< lib.contentElement +tt_content.accordion { + + ################ + ### TEMPLATE ### + ################ + templateName = Accordion + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tx_bootstrappackage_accordion_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + accordion { + left { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + } + corrections { + default = 21 + xlarge = 21 + large = 21 + medium = 21 + small = 42 + extrasmall = 42 + } + } + top { + corrections { + default = 42 + xlarge = 42 + large = 42 + medium = 42 + small = 42 + extrasmall = 42 + } + } + right { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + } + corrections { + default = 21 + xlarge = 21 + large = 21 + medium = 21 + small = 42 + extrasmall = 42 + } + } + bottom { + corrections { + default = 42 + xlarge = 42 + large = 42 + medium = 42 + small = 42 + extrasmall = 42 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Audio.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Audio.typoscript new file mode 100644 index 0000000..3e601ef --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Audio.typoscript @@ -0,0 +1,24 @@ +###################### +#### CTYPE: AUDIO #### +###################### + +tt_content.audio > +tt_content.audio =< lib.contentElement +tt_content.audio { + + ################ + ### TEMPLATE ### + ################ + templateName = Audio + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = assets + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Bullets.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Bullets.typoscript new file mode 100644 index 0000000..2793ec3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Bullets.typoscript @@ -0,0 +1,40 @@ +######################## +#### CTYPE: BULLETS #### +######################## + +tt_content.bullets > +tt_content.bullets =< lib.contentElement +tt_content.bullets { + + ################ + ### TEMPLATE ### + ################ + templateName = Bullets + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\SplitProcessor + 10 { + if { + value = 2 + isLessThan.field = bullets_type + } + fieldName = bodytext + removeEmptyEntries = 1 + as = bullets + } + 20 = TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor + 20 { + fieldName = bodytext + if { + value = 2 + equals.field = bullets_type + } + fieldDelimiter = | + as = bullets + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CardGroup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CardGroup.typoscript new file mode 100644 index 0000000..f310635 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CardGroup.typoscript @@ -0,0 +1,135 @@ +########################## +#### CTYPE: CARDGROUP #### +########################## + +tt_content.card_group > +tt_content.card_group =< lib.contentElement +tt_content.card_group { + + ################ + ### TEMPLATE ### + ################ + templateName = CardGroup + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tx_bootstrappackage_card_group_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = image + as = image + } + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = link_icon_set + iconIdentifier.field = link_icon_identifier + iconFileFieldName = link_icon + as = linkIcon + } + } + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + card_group { + 1 { + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 2 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + small = 16 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 3 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + } + gutters { + default = 32 + xlarge = 32 + large = 32 + medium = 32 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 4 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 48 + xlarge = 48 + large = 16 + medium = 16 + small = 16 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Carousel.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Carousel.typoscript new file mode 100644 index 0000000..013dd59 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Carousel.typoscript @@ -0,0 +1,73 @@ +########################################### +#### CTYPE: BOOTSTRAP PACKAGE CAROUSEL #### +########################################### + +tt_content.carousel > +tt_content.carousel =< lib.contentElement +tt_content.carousel { + + ################ + ### TEMPLATE ### + ################ + templateName = Carousel + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tx_bootstrappackage_carousel_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = background_image + as = backgroundImage + } + 20 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 20 { + references.fieldName = image + as = images + } + 1532633187 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 1532633187 { + fieldName = background_image_options + } + } + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + carousel { + background_image { + multiplier { + default = 1.5 + xlarge = 1.5 + large = 1.5 + } + } + text_and_image { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselFullscreen.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselFullscreen.typoscript new file mode 100644 index 0000000..12774de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselFullscreen.typoscript @@ -0,0 +1,73 @@ +###################################################### +#### CTYPE: BOOTSTRAP PACKAGE CAROUSEL FULLSCREEN #### +###################################################### + +tt_content.carousel_fullscreen > +tt_content.carousel_fullscreen =< lib.contentElement +tt_content.carousel_fullscreen { + + ################ + ### TEMPLATE ### + ################ + templateName = CarouselFullscreen + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tx_bootstrappackage_carousel_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = background_image + as = backgroundImage + } + 20 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 20 { + references.fieldName = image + as = images + } + 1532633187 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 1532633187 { + fieldName = background_image_options + } + } + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + carousel_fullscreen { + background_image { + multiplier { + default = 1.5 + xlarge = 1.5 + large = 1.5 + } + } + text_and_image { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselSmall.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselSmall.typoscript new file mode 100644 index 0000000..1ebb0dd --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselSmall.typoscript @@ -0,0 +1,73 @@ +################################################# +#### CTYPE: BOOTSTRAP PACKAGE CAROUSEL SMALL #### +################################################# + +tt_content.carousel_small > +tt_content.carousel_small =< lib.contentElement +tt_content.carousel_small { + + ################ + ### TEMPLATE ### + ################ + templateName = CarouselSmall + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tx_bootstrappackage_carousel_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = background_image + as = backgroundImage + } + 20 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 20 { + references.fieldName = image + as = images + } + 1532633187 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 1532633187 { + fieldName = background_image_options + } + } + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + carousel_small { + background_image { + multiplier { + default = 1.5 + xlarge = 1.5 + large = 1.5 + } + } + text_and_image { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Csv.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Csv.typoscript new file mode 100644 index 0000000..dae81a8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Csv.typoscript @@ -0,0 +1,33 @@ +#################### +#### CTYPE: CSV #### +#################### + +tt_content.csv > +tt_content.csv =< lib.contentElement +tt_content.csv { + + ################ + ### TEMPLATE ### + ################ + templateName = Csv + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\CsvFileProcessor + 10 { + references.fieldName = media + fieldDelimiter.char.cObject = TEXT + fieldDelimiter.char.cObject { + field = table_delimiter + } + fieldEnclosure.char.cObject = TEXT + fieldEnclosure.char.cObject { + field = table_enclosure + } + maximumColumns.field = cols + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Div.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Div.typoscript new file mode 100644 index 0000000..a041f65 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Div.typoscript @@ -0,0 +1,14 @@ +#################### +#### CTYPE: DIV #### +#################### + +tt_content.div > +tt_content.div =< lib.contentElement +tt_content.div { + + ################ + ### TEMPLATE ### + ################ + templateName = Div + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/ExternalMedia.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/ExternalMedia.typoscript new file mode 100644 index 0000000..0e131ef --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/ExternalMedia.typoscript @@ -0,0 +1,14 @@ +################################################# +#### CTYPE: BOOTSTRAP PACKAGE EXTERNAL MEDIA #### +################################################# + +tt_content.external_media > +tt_content.external_media =< lib.contentElement +tt_content.external_media { + + ################ + ### TEMPLATE ### + ################ + templateName = ExternalMedia + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Gallery.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Gallery.typoscript new file mode 100644 index 0000000..3058068 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Gallery.typoscript @@ -0,0 +1,29 @@ +######################## +#### CTYPE: GALLERY #### +######################## + +tt_content.gallery > +tt_content.gallery =< lib.contentElement +tt_content.gallery { + + ################ + ### TEMPLATE ### + ################ + templateName = Gallery + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = image + folders.field = file_folder + sorting.field = filelink_sorting + } + 20 = BK2K\BootstrapPackage\DataProcessing\FileFilterProcessor + 20 { + predefinedList = image + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Header.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Header.typoscript new file mode 100644 index 0000000..82cdcf3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Header.typoscript @@ -0,0 +1,14 @@ +####################### +#### CTYPE: HEADER #### +####################### + +tt_content.header > +tt_content.header =< lib.contentElement +tt_content.header { + + ################ + ### TEMPLATE ### + ################ + templateName = Header + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Html.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Html.typoscript new file mode 100644 index 0000000..517fdad --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Html.typoscript @@ -0,0 +1,14 @@ +##################### +#### CTYPE: HTML #### +##################### + +tt_content.html > +tt_content.html =< lib.contentElement +tt_content.html { + + ################ + ### TEMPLATE ### + ################ + templateName = Html + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/IconGroup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/IconGroup.typoscript new file mode 100644 index 0000000..4a72bf5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/IconGroup.typoscript @@ -0,0 +1,41 @@ +##################### +#### CTYPE: HTML #### +##################### + +tt_content.icon_group > +tt_content.icon_group =< lib.contentElement +tt_content.icon_group { + + ################ + ### TEMPLATE ### + ################ + templateName = IconGroup + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tx_bootstrappackage_icon_group_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy = sorting + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = icon_set + iconIdentifier.field = icon_identifier + iconFileFieldName = icon_file + as = icon + } + } + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Image.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Image.typoscript new file mode 100644 index 0000000..992b2aa --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Image.typoscript @@ -0,0 +1,30 @@ +###################### +#### CTYPE: IMAGE #### +###################### + +tt_content.image > +tt_content.image =< lib.contentElement +tt_content.image { + + ################ + ### TEMPLATE ### + ################ + templateName = Image + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = image + folders.field = file_folder + sorting.field = filelink_sorting + } + 20 = BK2K\BootstrapPackage\DataProcessing\FileFilterProcessor + 20 { + predefinedList = image + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/List.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/List.typoscript new file mode 100644 index 0000000..4ad0bf8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/List.typoscript @@ -0,0 +1,13 @@ +##################### +#### CTYPE: LIST #### +##################### + +tt_content.list =< lib.contentElement +tt_content.list { + + ################ + ### TEMPLATE ### + ################ + templateName = List + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/ListGroup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/ListGroup.typoscript new file mode 100644 index 0000000..4c7617f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/ListGroup.typoscript @@ -0,0 +1,26 @@ +############################################ +#### CTYPE: BOOTSTRAP PACKAGE LISTGROUP #### +############################################ + +tt_content.listgroup > +tt_content.listgroup =< lib.contentElement +tt_content.listgroup { + + ################ + ### TEMPLATE ### + ################ + templateName = ListGroup + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\SplitProcessor + 10 { + fieldName = bodytext + removeEmptyEntries = 1 + as = items + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Media.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Media.typoscript new file mode 100644 index 0000000..16b57d9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Media.typoscript @@ -0,0 +1,30 @@ +###################### +#### CTYPE: MEDIA #### +###################### + +tt_content.media > +tt_content.media =< lib.contentElement +tt_content.media { + + ################ + ### TEMPLATE ### + ################ + templateName = Media + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = assets + folders.field = file_folder + sorting.field = filelink_sorting + } + 20 = BK2K\BootstrapPackage\DataProcessing\FileFilterProcessor + 20 { + allowedFileExtensions = youtube, vimeo + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuAbstract.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuAbstract.typoscript new file mode 100644 index 0000000..42d5751 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuAbstract.typoscript @@ -0,0 +1,45 @@ +############################################################## +#### CTYPE: MENU OF SUBPAGES TO THESE PAGES WITH ABSTRACT #### +############################################################## + +tt_content.menu_abstract > +tt_content.menu_abstract =< lib.contentElement +tt_content.menu_abstract { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuAbstract + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = directory + special.value.field = pages + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardDir.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardDir.typoscript new file mode 100644 index 0000000..5a0f4d8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardDir.typoscript @@ -0,0 +1,148 @@ +################################### +#### CTYPE: MENU CARD SUBPAGES #### +################################### + +tt_content.menu_card_dir > +tt_content.menu_card_dir =< lib.contentElement +tt_content.menu_card_dir { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuCardDir + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + special = directory + special.value.field = pages + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = thumbnail + if { + isTrue = {$plugin.bootstrap_package_contentelements.menu_card.thumbnail.enable} + } + } + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + if { + isTrue = {$plugin.bootstrap_package_contentelements.menu_card.icon.enable} + } + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + menu_card_dir { + 1 { + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 2 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + small = 16 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 3 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + } + gutters { + default = 32 + xlarge = 32 + large = 32 + medium = 32 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 4 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 48 + xlarge = 48 + large = 16 + medium = 16 + small = 16 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardList.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardList.typoscript new file mode 100644 index 0000000..01ad23d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardList.typoscript @@ -0,0 +1,149 @@ +################################### +#### CTYPE: MENU CARD SUBPAGES #### +################################### + +tt_content.menu_card_list > +tt_content.menu_card_list =< lib.contentElement +tt_content.menu_card_list { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuCardList + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + special = list + special.value.field = pages + includeNotInMenu = 1 + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = thumbnail + if { + isTrue = {$plugin.bootstrap_package_contentelements.menu_card.thumbnail.enable} + } + } + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + if { + isTrue = {$plugin.bootstrap_package_contentelements.menu_card.icon.enable} + } + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + menu_card_list { + 1 { + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 2 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + small = 16 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 3 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + } + gutters { + default = 32 + xlarge = 32 + large = 32 + medium = 32 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + 4 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 48 + xlarge = 48 + large = 16 + medium = 16 + small = 16 + } + corrections { + default = 2 + xlarge = 2 + large = 2 + medium = 2 + small = 2 + extrasmall = 2 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedContent.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedContent.typoscript new file mode 100644 index 0000000..5547960 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedContent.typoscript @@ -0,0 +1,54 @@ +############################################ +#### CTYPE: MENU OF CATEGORIZED CONTENT #### +############################################ + +tt_content.menu_categorized_content > +tt_content.menu_categorized_content =< lib.contentElement +tt_content.menu_categorized_content { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuCategorizedContent + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 10 { + table = tt_content + selectFields = tt_content.* + groupBy = uid + pidInList.data = leveluid : 0 + recursive = 99 + join.data = field:selected_categories + join.wrap = sys_category_record_mm ON tt_content.uid = sys_category_record_mm.uid_foreign AND sys_category_record_mm.uid_local IN(|) + where.data = field:category_field + where.wrap = tablenames='tt_content' and fieldname='|' + as = content + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = image + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} + diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedPages.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedPages.typoscript new file mode 100644 index 0000000..5d305f0 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedPages.typoscript @@ -0,0 +1,50 @@ +########################################## +#### CTYPE: MENU OF CATEGORIZED PAGES #### +########################################## + +tt_content.menu_categorized_pages > +tt_content.menu_categorized_pages =< lib.contentElement +tt_content.menu_categorized_pages { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuCategorizedPages + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = categories + special { + value.field = selected_categories + relation.field = category_field + sorting = title + order = asc + } + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuPages.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuPages.typoscript new file mode 100644 index 0000000..b548c62 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuPages.typoscript @@ -0,0 +1,46 @@ +##################### +#### CTYPE: MENU #### +##################### + +tt_content.menu_pages > +tt_content.menu_pages =< lib.contentElement +tt_content.menu_pages { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuPages + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = list + special.value.field = pages + includeNotInMenu = 1 + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRecentlyUpdated.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRecentlyUpdated.typoscript new file mode 100644 index 0000000..4f06601 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRecentlyUpdated.typoscript @@ -0,0 +1,49 @@ +############################################ +#### CTYPE: MENU RECENTLY UPDATED PAGES #### +############################################ + +tt_content.menu_recently_updated > +tt_content.menu_recently_updated =< lib.contentElement +tt_content.menu_recently_updated { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuRecentlyUpdated + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = updated + special { + value.field = pages + maxAge = 3600*24*7 + excludeNoSearchPages = 1 + } + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRelatedPages.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRelatedPages.typoscript new file mode 100644 index 0000000..b0e60f7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRelatedPages.typoscript @@ -0,0 +1,48 @@ +##################################################### +#### CTYPE: MENU RELATED PAGES BASED ON KEYWORDS #### +##################################################### + +tt_content.menu_related_pages > +tt_content.menu_related_pages =< lib.contentElement +tt_content.menu_related_pages { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuRelatedPages + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = keywords + special { + value.field = pages + excludeNoSearchPages = 1 + } + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSection.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSection.typoscript new file mode 100644 index 0000000..e7f0d55 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSection.typoscript @@ -0,0 +1,70 @@ +################################### +#### CTYPE: MENU SECTION INDEX #### +################################### + +tt_content.menu_section > +tt_content.menu_section =< lib.contentElement +tt_content.menu_section { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuSection + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = list + special { + value { + field = pages + override { + data = page:uid + if { + isFalse.field = pages + } + } + } + } + includeNotInMenu = 1 + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tt_content + pidInList.field = uid + as = content + where = sectionIndex = 1 + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = image + } + } + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSectionPages.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSectionPages.typoscript new file mode 100644 index 0000000..d9a0a9c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSectionPages.typoscript @@ -0,0 +1,59 @@ +############################################################# +#### CTYPE: MENU OF SUBPAGES TO THESE PAGES AND SECTIONS #### +############################################################# + +tt_content.menu_section_pages > +tt_content.menu_section_pages =< lib.contentElement +tt_content.menu_section_pages { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuSectionPages + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = directory + special.value.field = pages + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tt_content + pidInList.field = uid + as = content + where = sectionIndex = 1 + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = image + } + } + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemap.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemap.typoscript new file mode 100644 index 0000000..7f89ad5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemap.typoscript @@ -0,0 +1,46 @@ +############################# +#### CTYPE: MENU SITEMAP #### +############################# + +tt_content.menu_sitemap > +tt_content.menu_sitemap =< lib.contentElement +tt_content.menu_sitemap { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuSitemap + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = list + special.value.field = pages + levels = 7 + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemapPages.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemapPages.typoscript new file mode 100644 index 0000000..1e1005e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemapPages.typoscript @@ -0,0 +1,46 @@ +############################################### +#### CTYPE: MENU SITEMAP OF SELECTED PAGES #### +############################################### + +tt_content.menu_sitemap_pages > +tt_content.menu_sitemap_pages =< lib.contentElement +tt_content.menu_sitemap_pages { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuSitemapPages + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = directory + special.value.field = pages + levels = 7 + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSubpages.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSubpages.typoscript new file mode 100644 index 0000000..f9437f8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSubpages.typoscript @@ -0,0 +1,45 @@ +################################################ +#### CTYPE: MENU OF SUBPAGES TO THESE PAGES #### +################################################ + +tt_content.menu_subpages > +tt_content.menu_subpages =< lib.contentElement +tt_content.menu_subpages { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuSubpages + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + special = directory + special.value.field = pages + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailDir.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailDir.typoscript new file mode 100644 index 0000000..61895bf --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailDir.typoscript @@ -0,0 +1,103 @@ +######################################## +#### CTYPE: MENU THUMBNAIL SUBPAGES #### +######################################## + +tt_content.menu_thumbnail_dir > +tt_content.menu_thumbnail_dir =< lib.contentElement +tt_content.menu_thumbnail_dir { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuThumbnailDir + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + special = directory + special.value.field = pages + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = thumbnail + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + menu_thumbnail_dir { + 2 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 8 + xlarge = 8 + large = 8 + medium = 8 + small = 8 + } + } + 3 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + small = 0.3333 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + small = 16 + } + } + 4 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.5 + small = 0.5 + } + gutters { + default = 24 + xlarge = 24 + large = 24 + medium = 16 + small = 16 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailList.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailList.typoscript new file mode 100644 index 0000000..7b61c5e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailList.typoscript @@ -0,0 +1,104 @@ +######################################## +#### CTYPE: MENU THUMBNAIL SUBPAGES #### +######################################## + +tt_content.menu_thumbnail_list > +tt_content.menu_thumbnail_list =< lib.contentElement +tt_content.menu_thumbnail_list { + + ################ + ### TEMPLATE ### + ################ + templateName = MenuThumbnailList + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + special = list + special.value.field = pages + includeNotInMenu = 1 + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = thumbnail + } + } + } + 90 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 90 { + if { + isTrue.field = accessibility_bypass + } + table = tt_content + pidInList = this + orderBy = sorting + max = 1 + where { + dataWrap = colPos = {field:colPos} AND sorting > {field:sorting} + } + as = nextContentElement + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + menu_thumbnail_list { + 2 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 8 + xlarge = 8 + large = 8 + medium = 8 + small = 8 + } + } + 3 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + small = 0.3333 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + small = 16 + } + } + 4 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.5 + small = 0.5 + } + gutters { + default = 24 + xlarge = 24 + large = 24 + medium = 16 + small = 16 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Panel.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Panel.typoscript new file mode 100644 index 0000000..f932a51 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Panel.typoscript @@ -0,0 +1,14 @@ +######################################## +#### CTYPE: BOOTSTRAP PACKAGE PANEL #### +######################################## + +tt_content.panel > +tt_content.panel =< lib.contentElement +tt_content.panel { + + ################ + ### TEMPLATE ### + ################ + templateName = Panel + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Quote.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Quote.typoscript new file mode 100644 index 0000000..7775f72 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Quote.typoscript @@ -0,0 +1,14 @@ +###################### +#### CTYPE: QUOTE #### +###################### + +tt_content.quote > +tt_content.quote =< lib.contentElement +tt_content.quote { + + ################ + ### TEMPLATE ### + ################ + templateName = Quote + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Shortcut.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Shortcut.typoscript new file mode 100644 index 0000000..7f91302 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Shortcut.typoscript @@ -0,0 +1,25 @@ +######################### +#### CTYPE: SHORTCUT #### +######################### + +tt_content.shortcut > +tt_content.shortcut =< lib.contentElement +tt_content.shortcut { + + ################ + ### TEMPLATE ### + ################ + templateName = Shortcut + + ################# + ### VARIABLES ### + ################# + variables { + shortcuts = RECORDS + shortcuts { + source.field = records + tables = tt_content + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/SocialLinks.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/SocialLinks.typoscript new file mode 100644 index 0000000..706e765 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/SocialLinks.typoscript @@ -0,0 +1,25 @@ +############################# +#### CTYPE: SOCIAL LINKS #### +############################# + +tt_content.social_links > +tt_content.social_links =< lib.contentElement +tt_content.social_links { + + ################ + ### TEMPLATE ### + ################ + templateName = SocialLinks + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 1 = BK2K\BootstrapPackage\DataProcessing\ConstantsProcessor + 1 { + as = socialmedia + key = page.theme.socialmedia + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Tab.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Tab.typoscript new file mode 100644 index 0000000..2cce802 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Tab.typoscript @@ -0,0 +1,75 @@ +###################################### +#### CTYPE: BOOTSTRAP PACKAGE TAB #### +###################################### + +tt_content.tab > +tt_content.tab =< lib.contentElement +tt_content.tab { + + ################ + ### TEMPLATE ### + ################ + templateName = Tab + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 20 { + table = tx_bootstrappackage_tab_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy = sorting + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + } + } + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + tab { + left { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + } + } + right { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Table.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Table.typoscript new file mode 100644 index 0000000..207853a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Table.typoscript @@ -0,0 +1,33 @@ +###################### +#### CTYPE: TABLE #### +###################### + +tt_content.table > +tt_content.table =< lib.contentElement +tt_content.table { + + ################ + ### TEMPLATE ### + ################ + templateName = Table + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\CommaSeparatedValueProcessor + 10 { + fieldName = bodytext + fieldDelimiter.char.cObject = TEXT + fieldDelimiter.char.cObject { + field = table_delimiter + } + fieldEnclosure.char.cObject = TEXT + fieldEnclosure.char.cObject { + field = table_enclosure + } + as = table + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Text.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Text.typoscript new file mode 100644 index 0000000..3aec48f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Text.typoscript @@ -0,0 +1,14 @@ +##################### +#### CTYPE: TEXT #### +##################### + +tt_content.text > +tt_content.text =< lib.contentElement +tt_content.text { + + ################ + ### TEMPLATE ### + ################ + templateName = Text + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textcolumn.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textcolumn.typoscript new file mode 100644 index 0000000..2a7f68e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textcolumn.typoscript @@ -0,0 +1,14 @@ +########################### +#### CTYPE: TEXTCOLUMN #### +########################### + +tt_content.textcolumn > +tt_content.textcolumn =< lib.contentElement +tt_content.textcolumn { + + ################ + ### TEMPLATE ### + ################ + templateName = Textcolumn + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Texticon.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Texticon.typoscript new file mode 100644 index 0000000..73d276c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Texticon.typoscript @@ -0,0 +1,27 @@ +########################################### +#### CTYPE: BOOTSTRAP PACKAGE TEXTICON #### +########################################### + +tt_content.texticon > +tt_content.texticon =< lib.contentElement +tt_content.texticon { + + ################ + ### TEMPLATE ### + ################ + templateName = Texticon + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = icon_set + iconIdentifier.field = icon + iconFileFieldName = icon_file + as = icon + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textmedia.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textmedia.typoscript new file mode 100644 index 0000000..206fc9c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textmedia.typoscript @@ -0,0 +1,105 @@ +########################## +#### CTYPE: TEXTMEDIA #### +########################## + +tt_content.textmedia > +tt_content.textmedia =< lib.contentElement +tt_content.textmedia { + + ################ + ### TEMPLATE ### + ################ + templateName = TEXT + templateName.stdWrap.cObject = CASE + templateName.stdWrap.cObject { + key.field = imageorient + 8 = TEXT + 8.value = TextmediaBelow + 25 = TEXT + 25.value = TextmediaRight + 26 = TEXT + 26.value = TextmediaLeft + 125 = TEXT + 125.value = TextmediaCenteredRight + 126 = TEXT + 126.value = TextmediaCenteredLeft + default = TEXT + default.value = TextmediaAbove + } + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = assets + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + textmedia { + centered_left { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + centered_right { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + left { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + right { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textpic.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textpic.typoscript new file mode 100644 index 0000000..8c79b9e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textpic.typoscript @@ -0,0 +1,111 @@ +######################## +#### CTYPE: TEXTPIC #### +######################## + +tt_content.textpic > +tt_content.textpic =< lib.contentElement +tt_content.textpic { + + ################ + ### TEMPLATE ### + ################ + templateName = TEXT + templateName.stdWrap.cObject = CASE + templateName.stdWrap.cObject { + key.field = imageorient + 8 = TEXT + 8.value = TextpicBelow + 25 = TEXT + 25.value = TextpicRight + 26 = TEXT + 26.value = TextpicLeft + 125 = TEXT + 125.value = TextpicCenteredRight + 126 = TEXT + 126.value = TextpicCenteredLeft + default = TEXT + default.value = TextpicAbove + } + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = image + folders.field = file_folder + sorting.field = filelink_sorting + } + 20 = BK2K\BootstrapPackage\DataProcessing\FileFilterProcessor + 20 { + predefinedList = image + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + textpic { + centered_left { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + centered_right { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + left { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + right { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textteaser.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textteaser.typoscript new file mode 100644 index 0000000..3902e55 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textteaser.typoscript @@ -0,0 +1,14 @@ +########################### +#### CTYPE: TEXTTEASER #### +########################### + +tt_content.textteaser > +tt_content.textteaser =< lib.contentElement +tt_content.textteaser { + + ################ + ### TEMPLATE ### + ################ + templateName = Textteaser + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Timeline.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Timeline.typoscript new file mode 100644 index 0000000..f3bacc3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Timeline.typoscript @@ -0,0 +1,76 @@ +######################### +#### CTYPE: TIMELINE #### +######################### + +tt_content.timeline > +tt_content.timeline =< lib.contentElement +tt_content.timeline { + + ################ + ### TEMPLATE ### + ################ + templateName = Timeline + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor + 10 { + table = tx_bootstrappackage_timeline_item + pidInList.field = pid + where { + data = field:uid + intval = 1 + wrap = tt_content=| + } + orderBy.stdWrap.cObject = TEXT + orderBy.stdWrap.cObject { + data = flexform:pi_flexform:sorting + ifEmpty.cObject = TEXT + ifEmpty.cObject { + value.current = 1 + ifEmpty = date desc + } + } + dataProcessing { + 20 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 20 { + references.fieldName = image + as = image + } + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = icon_set + iconIdentifier.field = icon_identifier + iconFileFieldName = icon_file + as = icon + } + } + } + } + +} + + +######################### +### RESPONSIVE IMAGES ### +######################### +lib.contentElement.settings.responsiveimages.contentelements { + timeline { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + corrections { + default = 49 + xlarge = 49 + large = 49 + medium = 49 + small = 72 + extrasmall = 72 + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Uploads.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Uploads.typoscript new file mode 100644 index 0000000..044b987 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Element/Uploads.typoscript @@ -0,0 +1,27 @@ +######################## +#### CTYPE: UPLOADS #### +######################## + +tt_content.uploads > +tt_content.uploads =< lib.contentElement +tt_content.uploads { + + ################ + ### TEMPLATE ### + ################ + templateName = Uploads + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 10 { + references.fieldName = media + collections.field = file_collections + sorting.field = filelink_sorting + sorting.direction.field = filelink_sorting_direction + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ContentElement.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ContentElement.typoscript new file mode 100644 index 0000000..7dac937 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ContentElement.typoscript @@ -0,0 +1,687 @@ +################################################## +### CONTENT ELEMENT SETTINGS ### +### Shared settings for TYPO3 content elements ### +################################################## +lib.contentElement = FLUIDTEMPLATE +lib.contentElement { + + ################ + ### TEMPLATE ### + ################ + templateName = Default + templateRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Templates/ContentElements/ + 10 = {$plugin.bootstrap_package_contentelements.view.templateRootPath} + } + partialRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Partials/ContentElements/ + 10 = {$plugin.bootstrap_package_contentelements.view.partialRootPath} + } + layoutRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Layouts/ContentElements/ + 10 = {$plugin.bootstrap_package_contentelements.view.layoutRootPath} + } + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 1509614342 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor + 1509614342 { + references.fieldName = background_image + as = backgroundImage + } + 1532626753 = BK2K\BootstrapPackage\DataProcessing\FlexFormProcessor + 1532626753 { + fieldName = background_image_options + } + } + + ################# + ### VARIABLES ### + ################# + variables { + backendlayout = TEXT + backendlayout { + data = pagelayout + replacement.10 { + search = pagets__ + replace = + } + ifEmpty = default + } + } + + ################ + ### SETTINGS ### + ################ + settings { + header { + defaultHeaderType = {$plugin.bootstrap_package_contentelements.header.defaultHeaderType} + class = {$plugin.bootstrap_package_contentelements.header.class} + date { + format = {$plugin.bootstrap_package_contentelements.header.date.format} + } + } + subheader { + class = {$plugin.bootstrap_package_contentelements.subheader.class} + } + lightbox { + cssClass = {$plugin.bootstrap_package_contentelements.lightbox.cssClass} + prefix = {$plugin.bootstrap_package_contentelements.lightbox.prefix} + image { + maxHeight = {$plugin.bootstrap_package_contentelements.lightbox.image.maxHeight} + maxWidth = {$plugin.bootstrap_package_contentelements.lightbox.image.maxWidth} + } + } + media { + additionalConfig { + autoplay = {$plugin.bootstrap_package_contentelements.media.additionalConfig.autoplay} + controls = {$plugin.bootstrap_package_contentelements.media.additionalConfig.controls} + loop = {$plugin.bootstrap_package_contentelements.media.additionalConfig.loop} + enablejsapi = {$plugin.bootstrap_package_contentelements.media.additionalConfig.enablejsapi} + showinfo = {$plugin.bootstrap_package_contentelements.media.additionalConfig.showinfo} + relatedVideos = {$plugin.bootstrap_package_contentelements.media.additionalConfig.relatedVideos} + modestbranding = {$plugin.bootstrap_package_contentelements.media.additionalConfig.modestbranding} + } + } + gallery { + columns { + 1 { + class = {$plugin.bootstrap_package_contentelements.gallery.columns.1.class} + } + 2 { + class = {$plugin.bootstrap_package_contentelements.gallery.columns.2.class} + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + extrasmall = 0.5 + } + gutters { + default = 8 + xlarge = 8 + large = 8 + medium = 8 + small = 8 + extrasmall = 8 + } + } + 3 { + class = {$plugin.bootstrap_package_contentelements.gallery.columns.3.class} + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + small = 0.3333 + extrasmall = 0.3333 + } + gutters { + default = 16 + xlarge = 16 + large = 16 + medium = 16 + small = 16 + extrasmall = 16 + } + } + 4 { + class = {$plugin.bootstrap_package_contentelements.gallery.columns.4.class} + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.5 + small = 0.5 + extrasmall = 0.5 + } + gutters { + default = 24 + xlarge = 24 + large = 24 + medium = 8 + small = 8 + extrasmall = 8 + } + } + 5 { + class = {$plugin.bootstrap_package_contentelements.gallery.columns.5.class} + multiplier { + default = 0.2 + xlarge = 0.2 + large = 0.2 + medium = 0.3333 + small = 0.3333 + extrasmall = 0.5 + } + gutters { + default = 32 + xlarge = 32 + large = 32 + medium = 16 + small = 16 + extrasmall = 8 + } + } + 6 { + class = {$plugin.bootstrap_package_contentelements.gallery.columns.6.class} + multiplier { + default = 0.1666 + xlarge = 0.16666 + large = 0.16666 + medium = 0.3333 + small = 0.3333 + extrasmall = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 16 + small = 16 + extrasmall = 8 + } + } + } + } + responsiveimages { + variants { + default { + breakpoint = 1400 + width = 1280 + } + xlarge { + breakpoint = 1200 + width = 1100 + } + large { + breakpoint = 992 + width = 920 + } + medium { + breakpoint = 768 + width = 680 + } + small { + breakpoint = 576 + width = 500 + } + extrasmall { + breakpoint = unset + width = 374 + } + } + backendlayout { + 2_columns { + 0 { + multiplier { + default = 0.75 + xlarge = 0.75 + large = 0.75 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 2 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + 2_columns_25_75 { + 0 { + multiplier { + default = 0.75 + xlarge = 0.75 + large = 0.75 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 1 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + 2_columns_50_50 { + 0 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 2 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + subnavigation_left { + 0 { + multiplier { + default = 0.75 + xlarge = 0.75 + large = 0.75 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + 2_columns_offset_right { + 0 { + multiplier { + default = 0.6666 + xlarge = 0.6666 + large = 0.6666 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 2 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + 3_columns { + 0 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 1 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 2 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + special_feature { + 30 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + 31 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + 32 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + 33 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + 34 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + 35 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + 36 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + 37 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + small = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + small = 40 + } + } + } + special_start { + 20 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + } + gutters { + default = 80 + xlarge = 80 + large = 80 + medium = 80 + } + } + 21 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + } + gutters { + default = 80 + xlarge = 80 + large = 80 + medium = 80 + } + } + 22 { + multiplier { + default = 0.3333 + xlarge = 0.3333 + large = 0.3333 + medium = 0.3333 + } + gutters { + default = 80 + xlarge = 80 + large = 80 + medium = 80 + } + } + } + subnavigation_left { + 0 { + multiplier { + default = 0.75 + xlarge = 0.75 + large = 0.75 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + subnavigation_left_2_columns { + 0 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 1 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + subnavigation_right { + 0 { + multiplier { + default = 0.75 + xlarge = 0.75 + large = 0.75 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + subnavigation_right_2_columns { + 0 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + 2 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + } + } + } + } + } + menuthumbnail { + title { + crop = {$plugin.bootstrap_package_contentelements.menu_thumbnail.title.crop} + } + subtitle { + crop = {$plugin.bootstrap_package_contentelements.menu_thumbnail.subtitle.crop} + } + } + menucard { + icon { + enable = {$plugin.bootstrap_package_contentelements.menu_card.icon.enable} + height = {$plugin.bootstrap_package_contentelements.menu_card.icon.height} + width = {$plugin.bootstrap_package_contentelements.menu_card.icon.width} + } + title { + crop = {$plugin.bootstrap_package_contentelements.menu_card.title.crop} + } + subtitle { + crop = {$plugin.bootstrap_package_contentelements.menu_card.subtitle.crop} + } + abstract { + crop = {$plugin.bootstrap_package_contentelements.menu_card.abstract.crop} + } + } + texticon { + icon { + default { + height = {$plugin.bootstrap_package_contentelements.texticon.icon.default.height} + width = {$plugin.bootstrap_package_contentelements.texticon.icon.default.width} + } + medium { + height = {$plugin.bootstrap_package_contentelements.texticon.icon.medium.height} + width = {$plugin.bootstrap_package_contentelements.texticon.icon.medium.width} + } + large { + height = {$plugin.bootstrap_package_contentelements.texticon.icon.large.height} + width = {$plugin.bootstrap_package_contentelements.texticon.icon.large.width} + } + awesome { + height = {$plugin.bootstrap_package_contentelements.texticon.icon.awesome.height} + width = {$plugin.bootstrap_package_contentelements.texticon.icon.awesome.width} + } + } + } + timeline { + date { + format = {$plugin.bootstrap_package_contentelements.timeline.date.format} + } + } + uploads { + preview { + height = {$plugin.bootstrap_package_contentelements.uploads.preview.height} + width = {$plugin.bootstrap_package_contentelements.uploads.preview.width} + } + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/DynamicContent.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/DynamicContent.typoscript new file mode 100644 index 0000000..6f43143 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/DynamicContent.typoscript @@ -0,0 +1,118 @@ +################################################ +#### DYNAMIC CONTENT LIB FOR USAGE IN FLUID #### +################################################ +# +# EXAMPLE +# --------------- +# |', +# elementWrap: '
|
' +# }" /> +# +# +# COLUMN NUMBERS +# --------------- +# +# 0 = main +# 1 = left +# 2 = right +# 3 = border +# 4 = main2 +# +# 8 = content before +# 9 = content after +# +# 10 = footer1 +# 11 = footer2 +# 12 = footer3 +# +# 20 = middle1 +# 21 = middle2 +# 22 = middle3 +# +# 30 = special1 +# 31 = special2 +# 32 = special3 +# 33 = special4 +# 34 = special5 +# 35 = special6 +# 36 = special7 +# 37 = special8 +# 38 = special9 +# 39 = special10 +# +################# +lib.dynamicContent = COA +lib.dynamicContent { + 5 = LOAD_REGISTER + 5 { + colPos.cObject = TEXT + colPos.cObject { + field = colPos + ifEmpty.cObject = TEXT + ifEmpty.cObject { + value.current = 1 + ifEmpty = 0 + } + } + slide.cObject = TEXT + slide.cObject { + override { + field = slide + if { + isInList.field = slide + value = -1, 0, 1, 2 + } + } + ifEmpty = 0 + } + pageUid.cObject = TEXT + pageUid.cObject { + field = pageUid + ifEmpty.data = TSFE:id + } + contentFromPid.cObject = TEXT + contentFromPid.cObject { + data = DB:pages:{register:pageUid}:content_from_pid + data.insertData = 1 + } + wrap.cObject = TEXT + wrap.cObject { + field = wrap + } + elementWrap.cObject = TEXT + elementWrap.cObject{ + field = elementWrap + } + } + 20 = CONTENT + 20 { + table = tt_content + select { + includeRecordsWithoutDefaultTranslation = 1 + orderBy = sorting + where = {#colPos}={register:colPos} + where.insertData = 1 + pidInList.data = register:pageUid + pidInList.override.data = register:contentFromPid + } + slide = {register:slide} + slide.insertData = 1 + renderObj { + stdWrap{ + dataWrap = {register:elementWrap} + required = 1 + } + } + stdWrap { + dataWrap = {register:wrap} + required = 1 + } + } + 90 = RESTORE_REGISTER +} +lib.dynamicContentSlide =< lib.dynamicContent +lib.dynamicContentSlide.20.slide = -1 diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ParseFunc.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ParseFunc.typoscript new file mode 100644 index 0000000..1cc445a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ParseFunc.typoscript @@ -0,0 +1,141 @@ +################### +#### PARSEFUNC #### +################### +lib.parseFunc { + makelinks = 1 + makelinks { + http { + keep = path + extTarget = _blank + } + mailto { + keep = path + } + } + tags { + link = TEXT + link { + current = 1 + typolink { + parameter { + data = parameters : allParams + } + extTarget = _blank + } + parseFunc.constants = 1 + } + a = TEXT + a { + current = 1 + typolink { + parameter.data = parameters:href + title.data = parameters:title + ATagParams.data = parameters:allParams + target.data = parameters:target + extTarget = _blank + extTarget.override.data = parameters:target + } + } + } + allowTags := addToList(a, abbr, acronym, address, article, aside, b, bdo) + allowTags := addToList(big, blockquote, br, caption, center, cite, code, col) + allowTags := addToList(colgroup, dd, del, dfn, dl, div, dt, em, font) + allowTags := addToList(footer, header, h1, h2, h3, h4, h5, h6, hr, i, img) + allowTags := addToList(ins, kbd, label, li, link, meta, nav, ol, p, pre, q) + allowTags := addToList(samp, sdfield, section, small, span, strike, strong) + allowTags := addToList(style, sub, sup, table, thead, tbody, tfoot, td, th) + allowTags := addToList(tr, title, tt, u, ul, var) + denyTags = * + sword = | + constants = 1 + nonTypoTagStdWrap { + HTMLparser = 1 + HTMLparser { + keepNonMatchedTags = 1 + htmlSpecialChars = 2 + } + } +} + + +####################### +#### PARSEFUNC RTE #### +####################### +lib.parseFunc_RTE < lib.parseFunc +lib.parseFunc_RTE { + externalBlocks := addToList(article, address, aside, blockquote, div, dd, dl, footer) + externalBlocks := addToList(header, nav, ol, section, table, ul, pre, figure) + externalBlocks { + ol { + stripNL = 1 + stdWrap { + parseFunc = < lib.parseFunc + } + } + ul { + stripNL = 1 + stdWrap { + parseFunc = < lib.parseFunc + HTMLparser = 1 + HTMLparser { + tags.ul.fixAttrib.class { + default = list-normal + } + keepNonMatchedTags = 1 + } + } + } + table { + stripNL = 1 + stdWrap { + wrap =
|
+ } + HTMLtableCells = 1 + HTMLtableCells { + default.stdWrap { + parseFunc = < lib.parseFunc_RTE + parseFunc { + nonTypoTagStdWrap { + encapsLines { + nonWrappedTag = + } + } + } + } + } + } + pre { + stripNL = 1 + stdWrap.parseFunc < lib.parseFunc + } + div { + stripNL = 1 + callRecursive = 1 + } + article < .div + aside < .div + figure < .div + blockquote < .div + footer < .div + header < .div + nav < .div + section < .div + dl < .div + dd < .div + } + nonTypoTagStdWrap { + encapsLines { + encapsTagList = p, pre, h1, h2, h3, h4, h5, h6, hr, dt + remapTag.DIV = P + nonWrappedTag = P + innerStdWrap_all.ifBlank =   + } + } + nonTypoTagStdWrap { + HTMLparser = 1 + HTMLparser { + keepNonMatchedTags = 1 + htmlSpecialChars = 2 + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/constants.typoscript new file mode 100644 index 0000000..d9f7d22 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/constants.typoscript @@ -0,0 +1,175 @@ +################## +### CATEGORIES ### +################## +# customsubcategory=100_contentelement=Templates +# customsubcategory=110_contentelement=Header +# customsubcategory=120_contentelement=Subheader +# customsubcategory=130_contentelement=Lightbox +# customsubcategory=131_contentelement=Media +# customsubcategory=140_contentelement=Gallery +# customsubcategory=150_contentelement=Menu Thumbnail +# customsubcategory=160_contentelement=Menu Card +# customsubcategory=170_contentelement=Text and Icon +# customsubcategory=180_contentelement=Timeline +# customsubcategory=190_contentelement=Uploads + + +######################## +### CONTENT ELEMENTS ### +######################## +plugin.bootstrap_package_contentelements { + view { + # cat=bootstrap package: content elements/100_contentelement/001_layoutRootPath; type=string; label=Layout Root Path: Path to layouts + layoutRootPath = EXT:bootstrap_package/Resources/Private/Layouts/ContentElements/ + # cat=bootstrap package: content elements/100_contentelement/002_partialRootPath; type=string; label=Partial Root Path: Path to partials + partialRootPath = EXT:bootstrap_package/Resources/Private/Partials/ContentElements/ + # cat=bootstrap package: content elements/100_contentelement/003_templateRootPath; type=string; label=Template Root Path: Path to templates + templateRootPath = EXT:bootstrap_package/Resources/Private/Templates/ContentElements/ + } + header { + # cat=bootstrap package: content elements/110_contentelement/001_defaultHeaderType; type=int[1-5]; label=Default Header type: Enter the number of the header layout to be used by default + defaultHeaderType = 2 + # cat=bootstrap package: content elements/110_contentelement/002_class; type=string; label=Default Header class + class = element-header + date { + # cat=bootstrap package: content elements/110_contentelement/003_date_format; type=string; label=Header date format + format = %B %e, %Y + } + } + subheader { + # cat=bootstrap package: content elements/120_contentelement/001_class; type=string; label=Default Subheader class + class = element-subheader + } + lightbox { + # cat=bootstrap package: content elements/130_contentelement/001_cssclass; type=string; label=Css Class + cssClass = lightbox + # cat=bootstrap package: content elements/130_contentelement/002_prefix; type=string; label=Group Prefix + prefix = lightbox-group + image { + # cat=bootstrap package: content elements/130_contentelement/003_image_maxheight; type=int+; label=Max Image Hight + maxHeight = 1200 + # cat=bootstrap package: content elements/130_contentelement/003_image_maxwidth; type=int+; label=Max Image Width + maxWidth = 1200 + } + } + media { + additionalConfig { + # cat=bootstrap package: content elements/131_contentelement/001_autoplay; type=boolean; label=Autoplay + autoplay = 0 + # cat=bootstrap package: content elements/131_contentelement/002_controls; type=boolean; label=Controls + controls = 1 + # cat=bootstrap package: content elements/131_contentelement/003_loop; type=boolean; label=Loop + loop = 0 + # cat=bootstrap package: content elements/131_contentelement/004_enablejsapi; type=boolean; label=Enable JavaScript API + enablejsapi = 1 + # cat=bootstrap package: content elements/131_contentelement/005_showinfo; type=boolean; label=Show Info + showinfo = 0 + # cat=bootstrap package: content elements/131_contentelement/005_relatedVideos; type=boolean; label=Related Videos + relatedVideos = 0 + # cat=bootstrap package: content elements/131_contentelement/005_relatedVideos; type=boolean; label=Modest Branding + modestbranding = 0 + } + } + gallery { + columns { + 1 { + # cat=bootstrap package: content elements/140_contentelement/001_columns_1_class; type=string; label=Item CSS Class for 1 column + class = gallery-item-size-1 + } + 2 { + # cat=bootstrap package: content elements/140_contentelement/002_columns_2_class; type=string; label=Item CSS Class for 2 columns + class = gallery-item-size-2 + } + 3 { + # cat=bootstrap package: content elements/140_contentelement/003_columns_3_class; type=string; label=Item CSS Class for 3 columns + class = gallery-item-size-3 + } + 4 { + # cat=bootstrap package: content elements/140_contentelement/004_columns_4_class; type=string; label=Item CSS Class for 4 Columns + class = gallery-item-size-4 + } + 5 { + # cat=bootstrap package: content elements/140_contentelement/005_columns_5_class; type=string; label=Item CSS Class for 5 Columns + class = gallery-item-size-5 + } + 6 { + # cat=bootstrap package: content elements/140_contentelement/006_columns_6_class; type=string; label=Item CSS Class for 6 Columns + class = gallery-item-size-6 + } + } + } + menu_thumbnail { + title { + # cat=bootstrap package: content elements/150_contentelement/001_title_crop; type=string; label=Crop Title + crop = 100 + } + subtitle { + # cat=bootstrap package: content elements/150_contentelement/002_subtitle_crop; type=string; label=Crop Subtitle + crop = 80 + } + } + menu_card { + icon { + # cat=bootstrap package: content elements/160_contentelement/001_icon_enable; type=boolean; label=Enable Icon + enable = 0 + # cat=bootstrap package: content elements/160_contentelement/002_icon_height; type=string; label=Icon Height + height = 32 + # cat=bootstrap package: content elements/160_contentelement/003_icon_width; type=string; label=Icon Width + width = 32c + } + title { + # cat=bootstrap package: content elements/160_contentelement/004_title_crop; type=string; label=Crop Title + crop = 100 + } + subtitle { + # cat=bootstrap package: content elements/160_contentelement/005_subtitle_crop; type=string; label=Crop Subtitle + crop = 100 + } + abstract { + # cat=bootstrap package: content elements/160_contentelement/006_abstract_crop; type=string; label=Crop Abstract + crop = 250 + } + } + texticon { + icon { + default { + # cat=bootstrap package: content elements/170_contentelement/001_default_icon_height; type=string; label=Default Icon Height + height = 32 + # cat=bootstrap package: content elements/170_contentelement/002_default_icon_width; type=string; label=Default Icon Width + width = 32 + } + medium { + # cat=bootstrap package: content elements/170_contentelement/003_medium_icon_height; type=string; label=Medium Icon Height + height = 48 + # cat=bootstrap package: content elements/170_contentelement/004_medium_icon_width; type=string; label=Medium Icon Width + width = 48 + } + large { + # cat=bootstrap package: content elements/170_contentelement/005_large_icon_height; type=string; label=Large Icon Height + height = 64 + # cat=bootstrap package: content elements/170_contentelement/006_large_icon_width; type=string; label=Large Icon Width + width = 64 + } + awesome { + # cat=bootstrap package: content elements/170_contentelement/007_awesome_icon_height; type=string; label=Awesome Icon Height + height = 80 + # cat=bootstrap package: content elements/170_contentelement/008_awesome_icon_width; type=string; label=Awesome Icon Width + width = 80 + } + } + } + timeline { + date { + # cat=bootstrap package: content elements/180_contentelement/001_date_format; type=string; label=Date Format + format = %B %e, %Y - %H:%M + } + } + uploads { + preview { + # cat=bootstrap package: content elements/190_contentelement/001_preview_height; type=string; label=Preview Height + height = 100c + # cat=bootstrap package: content elements/190_contentelement/001_preview_width; type=string; label=Preview Width + width = 100c + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/setup.typoscript new file mode 100644 index 0000000..9f7fab6 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/ContentElement/setup.typoscript @@ -0,0 +1,59 @@ +################ +#### HELPER #### +################ +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ContentElement.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Helper/DynamicContent.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Helper/ParseFunc.typoscript' + + +############################################################# +#### CONTENT ELEMENT RENDERING #### +#### Manual inclusion to keep control over loading order #### +############################################################# +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Audio.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Bullets.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Csv.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Div.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Header.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Html.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Image.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/List.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Media.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuAbstract.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedContent.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCategorizedPages.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuPages.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSubpages.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRecentlyUpdated.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuRelatedPages.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSection.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSectionPages.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemap.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuSitemapPages.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Quote.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Shortcut.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/SocialLinks.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Table.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Text.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textcolumn.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textteaser.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textpic.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Textmedia.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Uploads.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Accordion.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/CardGroup.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Carousel.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselSmall.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/CarouselFullscreen.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/ExternalMedia.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Gallery.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/IconGroup.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/ListGroup.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Panel.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Tab.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Texticon.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/Timeline.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardDir.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuCardList.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailDir.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/Element/MenuThumbnailList.typoscript' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/CookieConsent/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/CookieConsent/constants.typoscript new file mode 100644 index 0000000..f03057e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/CookieConsent/constants.typoscript @@ -0,0 +1,42 @@ +############################ +### CUSTOM SUBCATEGORIES ### +############################ +# customsubcategory=230=Cookie Consent + +############ +### PAGE ### +############ +page { + theme { + cookieconsent { + # cat=bootstrap package: cookie consent/230/01_enable; type=boolean; label=Enable Cookie Consent: For more information about this solution please head over to https://cookieconsent.insites.com/ + enable = 1 + # cat=bootstrap package: cookie consent/230/02_layout; type=options[Basic=basic, Basic Close=basic-close, Basic Header=basic-header]; label=Layout + layout = basic + # cat=bootstrap package: cookie consent/230/03_position; type=options[Banner Top=top, Banner Bottom=bottom, Floating Top Left=top-left, Floating Top Right=top-right, Floating Bottom Left=bottom-left, Floating Bottom Right=bottom-right]; label=Position: Position is used to describe where on the screen your popup should display. We also use 'position' to assume the shape of your popup. If you specify 'top' or 'bottom', we assume that a full width 'banner' is required. If however you specify a horizontal direction, we assume that a corner popup is required (which we call 'floating'). + position = bottom + # cat=bootstrap package: cookie consent/230/04_static; type=boolean; label=Static Position: The popup uses position fixed to stay in one place on the screen despite any scroll bars. This option makes the popup position static so it displays at the top of the page. A height animation has also been added by default so the popup doesn’t make the page jump, but gradually grows and fades in. + static = 0 + content { + # cat=bootstrap package: cookie consent/230/05_content_href; type=string; label=Privacy Police: Insert a full Link to the privacy police page or a page uid from your current TYPO3 System. + href = + } + # cat=bootstrap package: cookie consent/230/06_revokable; type=boolean; label=Revokable: If set true, revoke button is displayed every time. If false, revoke button is only displayed for advanced compliance options (opt-in and opt-out) and in countries that require revokable consent. The latter can be disabled by regionalLaw. + revokable = 0 + # cat=bootstrap package: cookie consent/230/07_location; type=boolean; label=Location Detection: Location is simply a tool for getting the two letter country code that the user is in. + location = 0 + law { + # cat=bootstrap package: cookie consent/230/08_law_countryCode; type=string; label=Country Code: Rather than getting the country code from the location services, you can hard code a particular country into the tool. + countryCode = + # cat=bootstrap package: cookie consent/230/09_law_regionalLaw; type=boolean; label=Regional Law: If false, then we only enable the popup if the country has the cookie law. We ignore all other country specific rules. + regionalLaw = 1 + } + # cat=bootstrap package: cookie consent/230/10_type; type=options[Informal=info, Opt-In=opt-in, Opt-Out=opt-out]; label=Compliance: The informal confirmation does not require any further adjustments to your JavaScript. The Opt-In and Opt-Out options are not out-of-the-box solutions, manual adjustments to your software are necessary. For your support we provide the events bk2k.cookie.enable, bk2k.cookie.disable and bk2k.cookie.revoke. These events allow you to let your application react to them and to set or remove cookies accordingly. The cookie that contains the current status is called cookieconsent_status. + type = info + cookie { + # cat=bootstrap package: cookie consent/230/11_expiryDays; type=int; label=Expiry Days: The cookies expire date, specified in days (specify -1 for no expiry) + expiryDays = 365 + } + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/CookieConsent/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/CookieConsent/setup.typoscript new file mode 100644 index 0000000..2688d71 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/CookieConsent/setup.typoscript @@ -0,0 +1,11 @@ +######################## +#### COOKIE CONSENT #### +######################## +[{$page.theme.cookieconsent.enable} == 1] + page { + includeJSFooterlibs { + contrib_cookieconsent = EXT:bootstrap_package/Resources/Public/Contrib/cookieconsent/cookieconsent.min.js + bootstrap_cookieconsent = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.cookieconsent.min.js + } + } +[end] diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Container/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Container/setup.typoscript new file mode 100644 index 0000000..634207c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Container/setup.typoscript @@ -0,0 +1,229 @@ +############################### +### RESPONSIVE IMAGE CONFIG ### +############################### +lib.contentElement { + settings { + responsiveimages { + container { + container_2_columns { + 201 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 202 { + multiplier { + default = 0.5 + xlarge = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + } + container_2_columns_right { + 201 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.33 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 202 { + multiplier { + default = 0.75 + xlarge = 0.75 + large = 0.75 + medium = 0.66 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + } + container_2_columns_left { + 201 { + multiplier { + default = 0.75 + xlarge = 0.75 + large = 0.75 + medium = 0.66 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 202 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.33 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + } + container_3_columns { + 201 { + multiplier { + default = 0.33 + xlarge = 0.33 + large = 0.33 + medium = 0.33 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 202 { + multiplier { + default = 0.33 + xlarge = 0.33 + large = 0.33 + medium = 0.33 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 203 { + multiplier { + default = 0.33 + xlarge = 0.33 + large = 0.33 + medium = 0.33 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + } + container_4_columns { + 201 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 202 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 203 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + 204 { + multiplier { + default = 0.25 + xlarge = 0.25 + large = 0.25 + medium = 0.5 + } + gutters { + default = 40 + xlarge = 40 + large = 40 + medium = 40 + } + } + } + } + } + } +} + +############################### +### RESPONSIVE IMAGE CONFIG ### +############################### +lib.contentElement { + dataProcessing { + 1628591788 = BK2K\BootstrapPackage\DataProcessing\ContainerContextProcessor + } +} + +######################## +### CONTAINER CONFIG ### +######################## +lib.contentContainer < lib.contentElement +lib.contentContainer { + templateName = Container + dataProcessing { + 1628519620 = B13\Container\DataProcessing\ContainerProcessor + } +} +tt_content.container_1_columns < lib.contentContainer +tt_content.container_2_columns < lib.contentContainer +tt_content.container_2_columns_right < lib.contentContainer +tt_content.container_2_columns_left < lib.contentContainer +tt_content.container_3_columns < lib.contentContainer +tt_content.container_4_columns < lib.contentContainer diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Felogin/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Felogin/constants.typoscript new file mode 100644 index 0000000..1912a5f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Felogin/constants.typoscript @@ -0,0 +1,6 @@ +######################## +#### FRONTEND LOGIN #### +######################## +styles.content.loginform { + templateFile = EXT:bootstrap_package/Resources/Private/Templates/Felogin/FrontendLogin.html +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Felogin/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Felogin/setup.typoscript new file mode 100644 index 0000000..ffe6797 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Felogin/setup.typoscript @@ -0,0 +1,19 @@ +######################## +#### FRONTEND LOGIN #### +######################## +plugin.tx_felogin_pi1 { + wrapContentInBaseClass = 0 + welcomeMessage_stdWrap.wrap =

|

+ logoutMessage_stdWrap.wrap =

|

+ errorMessage_stdWrap.wrap =

|

+ successMessage_stdWrap.wrap =

|

+ cookieWarning_stdWrap.wrap =

|

+ forgotMessage_stdWrap.wrap =

|

+ forgotErrorMessage_stdWrap.wrap =

|

+ forgotResetMessageEmailSentMessage_stdWrap.wrap =

|

+ changePasswordNotValidMessage_stdWrap.wrap =

|

+ changePasswordTooShortMessage_stdWrap.wrap =

|

+ changePasswordNotEqualMessage_stdWrap.wrap =

|

+ changePasswordMessage_stdWrap.wrap =

|

+ changePasswordDoneMessage_stdWrap.wrap =

|

+} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Form/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Form/constants.typoscript new file mode 100644 index 0000000..0dd38ee --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Form/constants.typoscript @@ -0,0 +1,3 @@ +######################## +#### FORM FRAMEWORK #### +######################## diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Form/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Form/setup.typoscript new file mode 100644 index 0000000..c5665d9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Form/setup.typoscript @@ -0,0 +1,5 @@ +######################## +#### FORM FRAMEWORK #### +######################## + +@import 'EXT:form/Configuration/TypoScript/setup.typoscript' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/IndexedSearch/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/IndexedSearch/constants.typoscript new file mode 100644 index 0000000..aaced09 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/IndexedSearch/constants.typoscript @@ -0,0 +1,5 @@ +######################## +#### INDEXED SEARCH #### +######################## + +@import 'EXT:indexed_search/Configuration/TypoScript/constants.typoscript' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/IndexedSearch/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/IndexedSearch/setup.typoscript new file mode 100644 index 0000000..1a004ff --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/IndexedSearch/setup.typoscript @@ -0,0 +1,22 @@ +######################## +#### INDEXED SEARCH #### +######################## + +@import 'EXT:indexed_search/Configuration/TypoScript/setup.typoscript' + +plugin.tx_indexedsearch { + view { + templateRootPaths { + 20 = EXT:bootstrap_package/Resources/Private/Templates/IndexedSearch/ + 21 = {$plugin.bootstrap_package.view.templateRootPath}IndexedSearch/ + } + partialRootPaths { + 20 = EXT:bootstrap_package/Resources/Private/Partials/IndexedSearch/ + 21 = {$plugin.bootstrap_package.view.partialRootPath}IndexedSearch/ + } + layoutRootPaths { + 20 = EXT:bootstrap_package/Resources/Private/Layouts/IndexedSearch/ + 21 = {$plugin.bootstrap_package.view.layoutRootPath}IndexedSearch/ + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Seo/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Seo/constants.typoscript new file mode 100644 index 0000000..3731f4a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Seo/constants.typoscript @@ -0,0 +1,5 @@ +############# +#### SEO #### +############# + +@import 'EXT:seo/Configuration/TypoScript/XmlSitemap/constants.typoscript' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Seo/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Seo/setup.typoscript new file mode 100644 index 0000000..4d747f5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Extension/Seo/setup.typoscript @@ -0,0 +1,22 @@ +############# +#### SEO #### +############# + +@import 'EXT:seo/Configuration/TypoScript/XmlSitemap/setup.typoscript' + +plugin.tx_seo { + view { + templateRootPaths { + 20 = EXT:bootstrap_package/Resources/Private/Templates/Seo/ + 21 = {$plugin.bootstrap_package.view.templateRootPath}Seo/ + } + partialRootPaths { + 20 = EXT:bootstrap_package/Resources/Private/Partials/Seo/ + 21 = {$plugin.bootstrap_package.view.partialRootPath}Seo/ + } + layoutRootPaths { + 20 = EXT:bootstrap_package/Resources/Private/Layouts/Seo/ + 21 = {$plugin.bootstrap_package.view.layoutRootPath}Seo/ + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Helper/Block.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Helper/Block.typoscript new file mode 100644 index 0000000..095cbbe --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Helper/Block.typoscript @@ -0,0 +1,54 @@ +###################### +### TEMPLATE BLOCK ### +###################### +# +# TypoScript Example: +# --------------- +# +# 10 < lib.block +# 10.templateName = MyBlock +# +# +# Fluid Example: +# --------------- +# +# +# +###################### +lib.block = FLUIDTEMPLATE +lib.block { + + ################ + ### TEMPLATE ### + ################ + templateName = Default + templateName { + override { + field = template + } + } + templateRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Templates/Blocks/ + 10 = {$plugin.bootstrap_package_blocks.view.templateRootPath} + } + partialRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Partials/Blocks/ + 10 = {$plugin.bootstrap_package_blocks.view.partialRootPath} + } + layoutRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Layouts/Blocks/ + 10 = {$plugin.bootstrap_package_blocks.view.layoutRootPath} + } + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 1 = BK2K\BootstrapPackage\DataProcessing\ConstantsProcessor + 1 { + as = theme + key = page.theme + } + } + +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Helper/PageClass.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Helper/PageClass.typoscript new file mode 100644 index 0000000..1f21f67 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/Helper/PageClass.typoscript @@ -0,0 +1,42 @@ +#################### +#### PAGE CLASS #### +#################### +lib.page.class = COA +lib.page.class { + // Page alias or id as fallback + 10 = TEXT + 10 { + field = alias // uid + noTrimWrap = |page-|| + } + // Current level of the page within the tree structure + 20 = TEXT + 20 { + data = level:1 + noTrimWrap = | pagelevel-|| + } + // Language + 30 = TEXT + 30 { + data = siteLanguage:languageId + noTrimWrap = | language-|| + } + // Backend layout + 40 = TEXT + 40 { + data = pagelayout + replacement.10 { + search = pagets__ + replace = + } + ifEmpty = default + noTrimWrap = | backendlayout-|| + } + // Layout + 50 = TEXT + 50 { + field = layout + noTrimWrap = | layout-|| + ifEmpty = default + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/constants.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/constants.typoscript new file mode 100644 index 0000000..aa3fd51 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/constants.typoscript @@ -0,0 +1,316 @@ +############################ +### CUSTOM SUBCATEGORIES ### +############################ +# customsubcategory=100=Page Template +# customsubcategory=110=Logo +# customsubcategory=111=Favicon +# customsubcategory=120=Meta Settings +# customsubcategory=150=Config +# customsubcategory=151=Navigation +# customsubcategory=152=Subnavigation +# customsubcategory=160=Theme +# customsubcategory=161=Font +# customsubcategory=162=Breadcrumb +# customsubcategory=165=Social Media +# customsubcategory=167=Meta +# customsubcategory=168=Language +# customsubcategory=169=Copyright +# customsubcategory=180=Tracking +# customsubcategory=190=Bootstrap Package Settings +# customsubcategory=200=Extension Overrides +# customsubcategory=201=Blocks + +###################### +#### DEPENDENCIES #### +###################### +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/constants.typoscript' + +############ +### PAGE ### +############ +page { + logo { + # cat=bootstrap package: logo/110/100; type=string; label=Logo: Leave blank to use website title from template instead + file = EXT:bootstrap_package/Resources/Public/Images/BootstrapPackage.svg + # cat=bootstrap package: logo/110/110; type=string; label=Logo Inverted: Leave blank to use website title from template instead + fileInverted = EXT:bootstrap_package/Resources/Public/Images/BootstrapPackageInverted.svg + # cat=bootstrap package: logo/110/120; type=int+; label=Height: The image will not be resized! + height = 52 + # cat=bootstrap package: logo/110/130; type=int+; label=Width: The image will not be resized! + width = 180 + # cat=bootstrap package: logo/110/140; type=string; label=Alternative text: Text of the alt attribute of the logo image (default: " logo") + alt = + # cat=bootstrap package: logo/110/150; type=string; label=Link title: Title of the link attribute of the logo image + linktitle = + } + + favicon { + # cat=bootstrap package: logo/111/100; type=string; label=Favicon + file = EXT:bootstrap_package/Resources/Public/Icons/favicon.ico + } + + theme { + googleFont { + # cat=bootstrap package: google font/161/1_enable; type=boolean; label=Enable + enable = 1 + # cat=bootstrap package: google font/161/2_font; type=options[Lora=Lora, Merriweather=Merriweather, Nunito=Nunito, Raleway=Raleway, Roboto=Roboto, Source Sans Pro=Source Sans Pro, Quattrocento=Quattrocento, Ubuntu=Ubuntu]; label=Font + font = Source Sans Pro + # cat=bootstrap package: google font/161/3_weight; type=string; label=Font Weights: Comma separated list of font weights + weight = 300,400,700 + } + + navigation { + # cat=bootstrap package: navigation/151/100; type=options[Default=default, Default Transition=default-transition, Inverse=inverse, Inverse Transition=inverse-transition]; label=Navigation Style + style = default + # cat=bootstrap package: navigation/151/101; type=options[Default=, Fixed Top=top]; label=Navigation Type + type = + icon { + # cat=bootstrap package: navigation/151/102; type=boolean; label=Navigation Icon Enable + enable = 1 + # cat=bootstrap package: navigation/151/103; type=int+; label=Navigation Icon Width + width = 20 + # cat=bootstrap package: navigation/151/104; type=int+; label=Navigation Icon Height + height = 20 + } + dropdown { + icon { + # cat=bootstrap package: navigation/151/105; type=boolean; label=Dropdown Icon Enable + enable = 1 + # cat=bootstrap package: navigation/151/106; type=int+; label=Dropdown Icon Width + width = 16 + # cat=bootstrap package: navigation/151/107; type=int+; label=Dropdown Icon Height + height = 16 + } + } + } + + subnavigation { + icon { + # cat=bootstrap package: navigation/152/108; type=boolean; label=SubNavigation Icon Enable + enable = 1 + # cat=bootstrap package: navigation/152/109; type=int+; label=SubNavigation Icon Width + width = 16 + # cat=bootstrap package: navigation/152/110; type=int+; label=SubNavigation Icon Width + height = 16 + } + } + + breadcrumb { + # cat=bootstrap package: navigation/162/breadcrumb_enable; type=boolean; label=Breadcrumb: Enable to display the breadcrumb + enable = 1 + # cat=bootstrap package: navigation/162/breadcrumb_enableLevel; type=int+; label=Breadcrumb Enable Level: Enable breadcrumb menu is greater or equal this value + enableLevel = 2 + icon { + # cat=bootstrap package: navigation/162/breadcrumb_icon_enable; type=boolean; label=Breadcrumb Icon: Enable navigation icons in the breadcrumb + enable = 0 + # cat=bootstrap package: navigation/162/breadcrumb_icon_width; type=int+; label=Breadcrumb Icon Width + width = 16 + # cat=bootstrap package: navigation/162/breadcrumb_icon_height; type=int+; label=Breadcrumb Icon Height + height = 16 + } + } + + meta { + # cat=bootstrap package: navigation/167/meta_enable; type=boolean; label=MetaSection: Enable to display the MetaSection at bottom + enable = 1 + # cat=bootstrap package: navigation/167/meta_navigationValue; type=string; label=Meta Navigation Values: Comma separated list of page uids + navigationValue = + # cat=bootstrap package: navigation/167/meta_navigationType; type=options[List=list, Directory=directory]; label=Meta Navigation Type + navigationType = list + # cat=bootstrap package: navigation/167/meta_includeNotInMenu; type=boolean; label=Meta Navigation include items not in menu + includeNotInMenu = 1 + } + + language { + # cat=bootstrap package: language/168/language_enable; type=boolean; label=LanguageSection: Enable to display the LanguageSection at bottom + enable = 1 + # cat=bootstrap package: language/168/language_languageValue; type=string; label=Language Navigation Values: Comma separated list of language uids or set to 'auto' to load all enabled system languages + languageValue = auto + } + + socialmedia { + # cat=bootstrap package: social media/165/00_enable; type=boolean; label=Social Media: Enable to display the social media links + enable = 1 + channels { + facebook { + label = Facebook + # cat=bootstrap package: social media/165/01_facebook_url; type=string; label=Facebook: Insert the full account url + url = + } + twitter { + label = Twitter + # cat=bootstrap package: social media/165/02_twitter_url; type=string; label=Twitter: Insert the full account url + url = + } + instagram { + label = Instagram + # cat=bootstrap package: social media/165/03_instagram_url; type=string; label=Instagram: Insert the full account url + url = + } + github { + label = GitHub + # cat=bootstrap package: social media/165/04_googleplus_url; type=string; label=GitHub: Insert the full account url + url = + } + googleplus { + label = Google+ + # cat=bootstrap package: social media/165/04_googleplus_url; type=string; label=Google+: Insert the full account url + url = + } + linkedin { + label = LinkedIn + # cat=bootstrap package: social media/165/05_linkedin_url; type=string; label=LinkedIn: Insert the full account url + url = + } + xing { + label = Xing + # cat=bootstrap package: social media/165/06_xing_url; type=string; label=Xing: Insert the full account url + url = + } + youtube { + label = YouTube + # cat=bootstrap package: social media/165/07_youtube_url; type=string; label=YouTube: Insert the full account url + url = + } + vk { + label = VK + # cat=bootstrap package: social media/165/08_vk_url; type=string; label=VK: Insert the full account url + url = + } + vimeo { + label = Vimeo + # cat=bootstrap package: social media/165/09_vimeo_url; type=string; label=Vimeo: Insert the full account url + url = + } + rss { + label = RSS + # cat=bootstrap package: social media/165/10_rss_url; type=string; label=RSS: Insert the full url + url = + } + } + } + + copyright { + # cat=bootstrap package: copyright/169/120; type=boolean; label=Copyright: Enable to display the copyright + enable = 1 + # cat=bootstrap package: copyright/169/121; type=string; label=Copyright Text + text = Running with TYPO3 and Bootstrap Package. + } + } + + fluidtemplate { + # cat=bootstrap package: templates/100/100; type=string; label=Layout Root Path: Path to layouts + layoutRootPath = EXT:bootstrap_package/Resources/Private/Layouts/Page/ + # cat=bootstrap package: templates/100/110; type=string; label=Partial Root Path: Path to partials + partialRootPath = EXT:bootstrap_package/Resources/Private/Partials/Page/ + # cat=bootstrap package: templates/100/120; type=string; label=Template Root Path: Path to templates + templateRootPath = EXT:bootstrap_package/Resources/Private/Templates/Page/ + } + + meta { + # cat=bootstrap package: meta data/120/100; type=string; label=viewport + viewport = width=device-width, initial-scale=1, minimum-scale=1 + # cat=bootstrap package: meta data/120/110; type=string; label=robots + robots = index,follow + # cat=bootstrap package: meta data/120/120; type=string; label=apple-mobile-web-app-capable + apple-mobile-web-app-capable = no + # cat=bootstrap package: meta data/120/130; type=string; label=compatible + compatible = IE=edge + # cat=bootstrap package: meta data/120/140; type=string; label=google + google = notranslate + # cat=bootstrap package: meta data/120/150; type=string; label=google-site-verification + google-site-verification = + } + + tracking { + google { + # cat=bootstrap package: tracking/180/100; type=string; label=Google Analytics: Tracking-ID + trackingID = + } + } +} + +############## +### CONFIG ### +############## +config { + # cat=bootstrap package: config/150/110; type=boolean; label=No Cache + no_cache = 0 + # cat=bootstrap package: config/150/120; type=options[Do not remove=0,Remove=1,Move to external file=external]; label=Remove default JavaScript + removeDefaultJS = 0 + # cat=bootstrap package: config/150/130; type=boolean; label=Compress JavaScript + compressJs = 1 + # cat=bootstrap package: config/150/140; type=boolean; label=Compress CSS + compressCss = 1 + # cat=bootstrap package: config/150/150; type=boolean; label=Concatenate JavaScript + concatenateJs = 1 + # cat=bootstrap package: config/150/160; type=boolean; label=Concatenate CSS + concatenateCss = 1 + # cat=bootstrap package: config/150/170; type=boolean; label=Admin Panel + admPanel = 1 + # cat=bootstrap package: config/150/180; type=options[None=,All=all,Cached=cached,Output=output]; label=Prefix local Anchors: See [http://docs.typo3.org/typo3cms/TyposcriptReference/Setup/Config/Index.html#prefixlocalanchors] for explanation. + prefixLocalAnchors = all + # cat=bootstrap package: config/150/190; type=string; label=Header Comment + headerComment = Based on the TYPO3 Bootstrap Package by Benjamin Kott - https://www.bootstrap-package.com/ + # cat=bootstrap package: config/150/210; type=boolean; label=Send cache headers: Allow appropriate caching by transparent proxies and browser clients + sendCacheHeaders = 1 +} + +######################### +### BOOTSTRAP PACKAGE ### +######################### +plugin.bootstrap_package { + settings { + # cat=bootstrap package: css parser/190/100; type=boolean; label=Override Parser Variables: If enabled the variables defined in your SCSS files will be overridden with the ones defined as TypoScript Constants. + overrideParserVariables = 1 + # cat=bootstrap package: css parser/190/110; type=boolean; label=CSS source mapping: Create a CSS source map useful to debug CSS in browser developer tools. Note: CSS compression will be disabled. + cssSourceMapping = 0 + } +} + +################################# +### BOOTSTRAP PACKAGE BLOCKS #### +################################# +plugin.bootstrap_package_blocks { + view { + # cat=bootstrap package: blocks/201/layoutRootPath; type=string; label=Layout Root Path: Path to layouts + layoutRootPath = EXT:bootstrap_package/Resources/Private/Layouts/Blocks/ + # cat=bootstrap package: blocks/201/partialRootPath; type=string; label=Partial Root Path: Path to partials + partialRootPath = EXT:bootstrap_package/Resources/Private/Partials/Blocks/ + # cat=bootstrap package: blocks/201/templateRootPath; type=string; label=Template Root Path: Path to templates + templateRootPath = EXT:bootstrap_package/Resources/Private/Templates/Blocks/ + } +} + +#################################### +### BOOTSTRAP PACKAGE EXTENSIONS ### +#################################### +plugin.bootstrap_package { + view { + # cat=bootstrap package: templates/200/layoutRootPath; type=string; label=Layout Root Path: Path to layouts + layoutRootPath = EXT:bootstrap_package/Resources/Private/Layouts/ + # cat=bootstrap package: templates/200/partialRootPath; type=string; label=Partial Root Path: Path to partials + partialRootPath = EXT:bootstrap_package/Resources/Private/Partials/ + # cat=bootstrap package: templates/200/templateRootPath; type=string; label=Template Root Path: Path to templates + templateRootPath = EXT:bootstrap_package/Resources/Private/Templates/ + } +} + +#################### +#### COMPONENTS #### +#################### +@import 'EXT:bootstrap_package/Configuration/TypoScript/CookieConsent/constants.typoscript' + +############################################################# +#### EXTENSIONS #### +#### Manual inclusion to keep control over loading order #### +############################################################# + + + + + +################### +#### FRAMEWORK #### +################### +@import 'EXT:bootstrap_package/Configuration/TypoScript/Bootstrap5/constants.typoscript' diff --git a/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/setup.typoscript b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/setup.typoscript new file mode 100644 index 0000000..da20be2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Configuration/TypoScript/setup.typoscript @@ -0,0 +1,478 @@ +###################### +#### DEPENDENCIES #### +###################### +@import 'EXT:bootstrap_package/Configuration/TypoScript/ContentElement/setup.typoscript' + + +################ +#### HELPER #### +################ +@import 'EXT:bootstrap_package/Configuration/TypoScript/Helper/Block.typoscript' +@import 'EXT:bootstrap_package/Configuration/TypoScript/Helper/PageClass.typoscript' + + +############################################################# +#### EXTENSIONS #### +#### Manual inclusion to keep control over loading order #### +############################################################# + + + + + + + +################### +#### FRAMEWORK #### +################### +@import 'EXT:bootstrap_package/Configuration/TypoScript/Bootstrap5/setup.typoscript' + + +#################################### +#### BOOTSTRAP PACKAGE SETTINGS #### +#################################### +plugin.tx_bootstrappackage { + settings { + overrideParserVariables = {$plugin.bootstrap_package.settings.overrideParserVariables} + cssSourceMapping = {$plugin.bootstrap_package.settings.cssSourceMapping} + } +} + + +############## +#### PAGE #### +############## +page = PAGE +page { + typeNum = 0 + shortcutIcon = {$page.favicon.file} + + bodyTagCObject = COA + bodyTagCObject { + 10 = TEXT + 10.data = TSFE:id + 10.noTrimWrap = | id="p|"| + 20 =< lib.page.class + 20.stdWrap.noTrimWrap = | class="|"| + wrap = + } + + headerData { + // Flip ahead browsing for IE10/11 + // http://msdn.microsoft.com/en-us/library/ie/jj883726(v=vs.85).aspx + 10 = HMENU + 10 { + special = browse + special { + items = prev|next + } + 1 = TMENU + 1.NO { + allWrap = |*| + doNotLinkIt = 1 + stdWrap { + typolink { + parameter.data = field:uid + returnLast = url + } + } + } + } + } + + 10 = FLUIDTEMPLATE + 10 { + # Template names will be generated automatically by converting the applied + # backend_layout, there is no explicit mapping necessary anymore. + # + # BackendLayout Key + # subnavigation_right_2_columns -> SubnavigationRight2Columns.html + # + # Backend Record + # uid: 1 -> 1.html + # + # Database Entry + # value: -1 -> None.html + # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html + templateName = TEXT + templateName { + cObject = TEXT + cObject { + data = pagelayout + required = 1 + case = uppercamelcase + split { + token = pagets__ + cObjNum = 1 + 1.current = 1 + } + } + ifEmpty = Default + } + + templateRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Templates/Page/ + 1 = {$page.fluidtemplate.templateRootPath} + } + partialRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Partials/Page/ + 1 = {$page.fluidtemplate.partialRootPath} + } + layoutRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Layouts/Page/ + 1 = {$page.fluidtemplate.layoutRootPath} + } + + ########################## + ### DATA PREPROCESSING ### + ########################## + dataProcessing { + 1 = BK2K\BootstrapPackage\DataProcessing\ConstantsProcessor + 1 { + as = theme + key = page.theme + } + 10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 10 { + levels = 2 + includeSpacer = 1 + as = mainnavigation + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + if { + isTrue.stdWrap.cObject = COA + isTrue.stdWrap.cObject { + 10 = TEXT + 10.value = 1 + 10.if.isTrue = {$page.theme.navigation.icon.enable} + 20 = TEXT + 20.value = 1 + 20.if.isTrue = {$page.theme.navigation.dropdown.icon.enable} + } + } + } + } + } + 20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 20 { + entryLevel = 1 + levels = 2 + expandAll = 0 + includeSpacer = 1 + as = subnavigation + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + if { + isTrue = {$page.theme.subnavigation.icon.enable} + } + } + } + } + 30 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 30 { + special = rootline + special.range = 0|-1 + includeNotInMenu = 1 + as = breadcrumb + if { + value = {$page.theme.breadcrumb.enableLevel} + value { + insertData = 1 + prioriCalc = 1 + stdWrap.wrap = |-1 + } + isGreaterThan { + data = level + } + } + dataProcessing { + 1628754217 = BK2K\BootstrapPackage\DataProcessing\IconsDataProcessor + 1628754217 { + iconSet.field = nav_icon_set + iconIdentifier.field = nav_icon_identifier + iconFileFieldName = nav_icon + as = icon + } + } + } + 40 = TYPO3\CMS\Frontend\DataProcessing\LanguageMenuProcessor + 40 { + languages = {$page.theme.language.languageValue} + as = languagenavigation + } + 50 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor + 50 { + special = {$page.theme.meta.navigationType} + special.value = {$page.theme.meta.navigationValue} + includeNotInMenu = {$page.theme.meta.includeNotInMenu} + as = metanavigation + if { + isTrue = {$page.theme.meta.navigationValue} + } + } + 1553883874 = BK2K\BootstrapPackage\DataProcessing\StaticFilesProcessor + 1553883874 { + files { + normal = {$page.logo.file} + inverted = {$page.logo.fileInverted} + } + as = logo + } + } + + ################ + ### SETTINGS ### + ################ + settings { + logo { + height = {$page.logo.height} + width = {$page.logo.width} + linktitle = {$page.logo.linktitle} + } + } + + ################# + ### VARIABLES ### + ################# + variables { + pageTitle = TEXT + pageTitle.data = page:title + siteTitle = TEXT + siteTitle.data = siteLanguage:websiteTitle//site:websiteTitle//site:identifier + rootPage = TEXT + rootPage.data = leveluid:0 + pagelayout = TEXT + pagelayout { + data = pagelayout + replacement.10 { + search = pagets__ + replace = + } + ifEmpty = default + } + logoAlt = COA + logoAlt { + 10 = TEXT + 10 { + data = siteLanguage:websiteTitle//site:websiteTitle//site:identifier + noTrimWrap = || logo| + if.isFalse = {$page.logo.alt} + } + 20 = TEXT + 20 { + value = {$page.logo.alt} + if.isTrue = {$page.logo.alt} + } + } + # BreadcrumbExtendedValue should be used to display the title of a + # single record. For example the title of a news record. + breadcrumbExtendedValue = COA + breadcrumbExtendedValue { + } + } + + stdWrap.replacement { + 1 { + search = http://###BACKEND_URL###/ + replace.typolink { + parameter = typo3/ + returnLast = url + } + } + 2 { + search = ###FRONTEND_URL### + replace.typolink { + parameter.data = leveluid:0 + returnLast = url + } + } + 3 { + search = ###CURRENTYEAR### + replace { + data = date:U + strftime = %Y + } + } + 4 { + search = ###SPACE### + replace { + char = 32 + } + } + } + } + + meta { + viewport = {$page.meta.viewport} + robots = {$page.meta.robots} + apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable} + + X-UA-Compatible = {$page.meta.compatible} + X-UA-Compatible { + attribute = http-equiv + } + + # Google + google = {$page.meta.google} + google-site-verification = {$page.meta.google-site-verification} + } + + includeCSSLibs { + googlewebfont = https://fonts.googleapis.com/css?display=swap&family={$page.theme.googleFont.font}:{$page.theme.googleFont.weight} + googlewebfont { + external = 1 + disableCompression = 1 + excludeFromConcatenation = 1 + if { + isTrue = {$page.theme.googleFont.enable} + } + } + bootstrappackageicon = EXT:bootstrap_package/Resources/Public/Fonts/bootstrappackageicon.min.css + } + + includeJSLibs { + modernizr = EXT:bootstrap_package/Resources/Public/Contrib/modernizr/modernizr.min.js + modernizr.forceOnTop = 1 + modernizr.async = 1 + } + + includeJSFooterlibs { + #### Contrib + jquery = EXT:bootstrap_package/Resources/Public/Contrib/jquery/jquery.min.js + jquery.forceOnTop = 1 + photoswipe_core = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe.min.js + photoswipe_ui = EXT:bootstrap_package/Resources/Public/Contrib/photoswipe/photoswipe-ui-default.min.js + + #### Custom Modules + bootstrap_accordion = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.accordion.min.js + bootstrap_popover = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.popover.min.js + bootstrap_stickyheader = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.stickyheader.min.js + bootstrap_smoothscroll = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.smoothscroll.min.js + bootstrap_lightbox = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.lightbox.min.js + bootstrap_navbar = EXT:bootstrap_package/Resources/Public/JavaScript/Dist/bootstrap.navbar.min.js + } +} + + +########################## +#### GOOGLE ANALYTICS #### +########################## +page { + 10.stdWrap.replacement { + 99 { + search = ###GoogleAnalyticsStatus### + replace { + cObject < lib.block + cObject.templateName = GoogleAnalyticsStatus + } + } + } + jsInline { + 99 = COA + 99 { + if { + isTrue = {$page.tracking.google.trackingID} + } + 10 = TEXT + 10.value ( + var gaProperty = '{$page.tracking.google.trackingID}'; + var disableStr = 'ga-disable-' + gaProperty; + if (document.cookie.indexOf(disableStr + '=true') > -1) { + window[disableStr] = true; + } + function googleAnalyticsToggle(event) { + if (document.cookie.indexOf(disableStr + '=true') > -1) { + event.target.innerHTML = event.target.getAttribute('data-label-disable'); + googleAnalyticsOptIn(); + } else { + event.target.innerHTML = event.target.getAttribute('data-label-enable'); + googleAnalyticsOptOut(); + } + } + function googleAnalyticsOptOut() { + document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/'; + window[disableStr] = true; + } + function googleAnalyticsOptIn() { + document.cookie = disableStr + '=; expires=Thu, 01 Jan 1970 00:00:01 UTC; path=/'; + window[disableStr] = false; + } + document.addEventListener('DOMContentLoaded', function() { + var matches = document.querySelectorAll('[data-action="googleAnalyticsToggle"]'); + for (i=0; i -1) { + matches[i].innerHTML = matches[i].getAttribute('data-label-enable'); + } else { + matches[i].innerHTML = matches[i].getAttribute('data-label-disable'); + } + matches[i].onclick = function(event) { + event.preventDefault(); + event.stopPropagation(); + googleAnalyticsToggle(event); + } + } + }); + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + ga('create', '{$page.tracking.google.trackingID}', 'auto'); + ga('set', 'anonymizeIp', true); + ) + 90 = TEXT + 90.value ( + + ga('send', 'pageview'); + ) + } + } +} + + +#################### +#### COMPONENTS #### +#################### +@import 'EXT:bootstrap_package/Configuration/TypoScript/CookieConsent/setup.typoscript' + + +################ +#### CONFIG #### +################ +config { + absRefPrefix = auto + no_cache = {$config.no_cache} + pageTitleFirst = 1 + pageTitleSeparator = - + pageTitleSeparator.noTrimWrap = | | | + linkVars = L(int) + prefixLocalAnchors = {$config.prefixLocalAnchors} + doctype = html5 + removeDefaultJS = {$config.removeDefaultJS} + admPanel = {$config.admPanel} + debug = 0 + sendCacheHeaders = {$config.sendCacheHeaders} + index_enable = 1 + index_externals = 1 + index_metatags = 1 + headerComment = {$config.headerComment} + + // Language Settings + sys_language_overlay = 1 + sys_language_mode = content_fallback + + // Compression and Concatenation of CSS and JS Files + compressJs = {$config.compressJs} + compressCss = {$config.compressCss} + concatenateJs = {$config.concatenateJs} + concatenateCss = {$config.concatenateCss} +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/.htaccess b/public/typo3conf/ext/bootstrap_package/Contrib/.htaccess new file mode 100644 index 0000000..b26e123 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/.htaccess @@ -0,0 +1,6 @@ +# This file restricts access to the fileadmin/_temp_ directory. It is +# meant to protect temporary files which could contain sensible +# information. Please do not touch. + +Order deny,allow +Deny from all diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/LICENSE.md b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/LICENSE.md new file mode 100644 index 0000000..afcfdfb --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/LICENSE.md @@ -0,0 +1,20 @@ +Copyright (c) 2015 Leaf Corcoran, http://scssphp.github.io/scssphp + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/README.md b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/README.md new file mode 100644 index 0000000..65bb93e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/README.md @@ -0,0 +1,71 @@ +# scssphp +### + +![Build](https://github.com/scssphp/scssphp/workflows/CI/badge.svg) +[![License](https://poser.pugx.org/scssphp/scssphp/license)](https://packagist.org/packages/scssphp/scssphp) + +`scssphp` is a compiler for SCSS written in PHP. + +Checkout the homepage, , for directions on how to use. + +## Running Tests + +`scssphp` uses [PHPUnit](https://github.com/sebastianbergmann/phpunit) for testing. + +Run the following command from the root directory to run every test: + + vendor/bin/phpunit tests + +There are several tests in the `tests/` directory: + +* `ApiTest.php` contains various unit tests that test the PHP interface. +* `ExceptionTest.php` contains unit tests that test for exceptions thrown by the parser and compiler. +* `FailingTest.php` contains tests reported in Github issues that demonstrate compatibility bugs. +* `InputTest.php` compiles every `.scss` file in the `tests/inputs` directory + then compares to the respective `.css` file in the `tests/outputs` directory. +* `SassSpecTest.php` extracts tests from the `sass/sass-spec` repository. + +When changing any of the tests in `tests/inputs`, the tests will most likely +fail because the output has changed. Once you verify that the output is correct +you can run the following command to rebuild all the tests: + + BUILD=1 vendor/bin/phpunit tests + +This will compile all the tests, and save results into `tests/outputs`. It also +updates the list of excluded specs from sass-spec. + +To enable the full `sass-spec` compatibility tests: + + TEST_SASS_SPEC=1 vendor/bin/phpunit tests + +## Coding Standard + +`scssphp` source conforms to [PSR12](https://www.php-fig.org/psr/psr-12/). + +Run the following command from the root directory to check the code for "sniffs". + + vendor/bin/phpcs --standard=PSR12 --extensions=php bin src tests *.php + +## Static Analysis + +`scssphp` uses [phpstan](https://phpstan.org/) for static analysis. + +Run the following command from the root directory to analyse the codebase: + + make phpstan + +As most of the codebase is composed of legacy code which cannot be type-checked +fully, the setup contains a baseline file with all errors we want to ignore. In +particular, we ignore all errors related to not specifying the types inside arrays +when these arrays correspond to the representation of Sass values and Sass AST nodes +in the parser and compiler. +When contributing, the proper process to deal with static analysis is the following: + +1. Make your change in the codebase +2. Run `make phpstan` +3. Fix errors reported by phpstan when possible +4. Repeat step 2 and 3 until nothing gets fixed anymore at step 3 +5. Run `make phpstan-baseline` to regenerate the phpstan baseline + +Additions to the baseline will be reviewed to avoid ignoring errors that should have +been fixed. diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/bin/pscss b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/bin/pscss new file mode 100644 index 0000000..e622398 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/bin/pscss @@ -0,0 +1,244 @@ +#!/usr/bin/env php +parse($data)), true)); + + fwrite(STDERR, 'Warning: the --dump-tree option is deprecated. Use proper debugging tools instead.'); + + exit(); +} + +$scss = new Compiler(); + +if ($loadPaths) { + $scss->setImportPaths($loadPaths); +} + +if ($style) { + if ($style === OutputStyle::COMPRESSED || $style === OutputStyle::EXPANDED) { + $scss->setOutputStyle($style); + } else { + fwrite(STDERR, "WARNING: the $style style is deprecated.\n"); + $scss->setFormatter('ScssPhp\\ScssPhp\\Formatter\\' . ucfirst($style)); + } +} + +$outputFile = isset($arguments[1]) ? $arguments[1] : null; +$sourceMapFile = null; + +if ($sourceMap) { + $sourceMapOptions = array( + 'outputSourceFiles' => $embedSources, + ); + if ($embedSourceMap || $outputFile === null) { + $scss->setSourceMap(Compiler::SOURCE_MAP_INLINE); + } else { + $sourceMapFile = $outputFile . '.map'; + $sourceMapOptions['sourceMapWriteTo'] = $sourceMapFile; + $sourceMapOptions['sourceMapURL'] = basename($sourceMapFile); + $sourceMapOptions['sourceMapBasepath'] = getcwd(); + $sourceMapOptions['sourceMapFilename'] = basename($outputFile); + + $scss->setSourceMap(Compiler::SOURCE_MAP_FILE); + } + + $scss->setSourceMapOptions($sourceMapOptions); +} + +if ($encoding) { + $scss->setEncoding($encoding); +} + +try { + $result = $scss->compileString($data, $inputFile); +} catch (SassException $e) { + fwrite(STDERR, 'Error: '.$e->getMessage()."\n"); + exit(1); +} + +if ($outputFile) { + file_put_contents($outputFile, $result->getCss()); + + if ($sourceMapFile !== null && $result->getSourceMap() !== null) { + file_put_contents($sourceMapFile, $result->getSourceMap()); + } +} else { + echo $result->getCss(); +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/composer.json b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/composer.json new file mode 100644 index 0000000..86cd396 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/composer.json @@ -0,0 +1,108 @@ +{ + "name": "scssphp/scssphp", + "type": "library", + "description": "scssphp is a compiler for SCSS written in PHP.", + "keywords": ["css", "stylesheet", "scss", "sass", "less"], + "homepage": "http://scssphp.github.io/scssphp/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "autoload": { + "psr-4": { "ScssPhp\\ScssPhp\\": "src/" } + }, + "autoload-dev": { + "psr-4": { "ScssPhp\\ScssPhp\\Tests\\": "tests/" } + }, + "require": { + "php": ">=5.6.0", + "ext-json": "*", + "ext-ctype": "*" + }, + "suggest": { + "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv", + "ext-iconv": "Can be used as fallback when ext-mbstring is not available" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^5.1", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "~5.0", + "twbs/bootstrap4": "4.6.0", + "zurb/foundation": "~6.5" + }, + "repositories": [ + { + "type": "package", + "package": { + "name": "sass/sass-spec", + "version": "2021.09.15", + "source": { + "type": "git", + "url": "https://github.com/sass/sass-spec.git", + "reference": "eb2d7a0865c1faf0b55a39ff962b24aca9b4c955" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sass/sass-spec/zipball/eb2d7a0865c1faf0b55a39ff962b24aca9b4c955", + "reference": "eb2d7a0865c1faf0b55a39ff962b24aca9b4c955", + "shasum": "" + } + } + }, + { + "type": "package", + "package": { + "name": "thoughtbot/bourbon", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/thoughtbot/bourbon.git", + "reference": "fbe338ee6807e7f7aa996d82c8a16f248bb149b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thoughtbot/bourbon/zipball/fbe338ee6807e7f7aa996d82c8a16f248bb149b3", + "reference": "fbe338ee6807e7f7aa996d82c8a16f248bb149b3", + "shasum": "" + } + } + }, + { + "type": "package", + "package": { + "name": "twbs/bootstrap4", + "version": "v4.6.0", + "source": { + "type": "git", + "url": "https://github.com/twbs/bootstrap.git", + "reference": "6ffb0b48e455430f8a5359ed689ad64c1143fac2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/6ffb0b48e455430f8a5359ed689ad64c1143fac2", + "reference": "6ffb0b48e455430f8a5359ed689ad64c1143fac2", + "shasum": "" + } + } + } + ], + "bin": ["bin/pscss"], + "config": { + "sort-packages": true + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/phpcs.xml.dist b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/phpcs.xml.dist new file mode 100644 index 0000000..b162dbd --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/phpcs.xml.dist @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/scss.inc.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/scss.inc.php new file mode 100644 index 0000000..4598378 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/scss.inc.php @@ -0,0 +1,21 @@ + + * + * @internal + */ +class Range +{ + /** + * @var float|int + */ + public $first; + + /** + * @var float|int + */ + public $last; + + /** + * Initialize range + * + * @param integer|float $first + * @param integer|float $last + */ + public function __construct($first, $last) + { + $this->first = $first; + $this->last = $last; + } + + /** + * Test for inclusion in range + * + * @param integer|float $value + * + * @return boolean + */ + public function includes($value) + { + return $value >= $this->first && $value <= $this->last; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Block.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Block.php new file mode 100644 index 0000000..3ae49d0 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Block.php @@ -0,0 +1,73 @@ + + * + * @internal + */ +class Block +{ + /** + * @var string + */ + public $type; + + /** + * @var \ScssPhp\ScssPhp\Block + */ + public $parent; + + /** + * @var string + */ + public $sourceName; + + /** + * @var integer + */ + public $sourceIndex; + + /** + * @var integer + */ + public $sourceLine; + + /** + * @var integer + */ + public $sourceColumn; + + /** + * @var array|null + */ + public $selectors; + + /** + * @var array + */ + public $comments; + + /** + * @var array + */ + public $children; + + /** + * @var \ScssPhp\ScssPhp\Block|null + */ + public $selfParent; +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Cache.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Cache.php new file mode 100644 index 0000000..9731c60 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Cache.php @@ -0,0 +1,272 @@ + + * + * @internal + */ +class Cache +{ + const CACHE_VERSION = 1; + + /** + * directory used for storing data + * + * @var string|false + */ + public static $cacheDir = false; + + /** + * prefix for the storing data + * + * @var string + */ + public static $prefix = 'scssphp_'; + + /** + * force a refresh : 'once' for refreshing the first hit on a cache only, true to never use the cache in this hit + * + * @var bool|string + */ + public static $forceRefresh = false; + + /** + * specifies the number of seconds after which data cached will be seen as 'garbage' and potentially cleaned up + * + * @var int + */ + public static $gcLifetime = 604800; + + /** + * array of already refreshed cache if $forceRefresh==='once' + * + * @var array + */ + protected static $refreshed = []; + + /** + * Constructor + * + * @param array $options + * + * @phpstan-param array{cacheDir?: string, prefix?: string, forceRefresh?: string} $options + */ + public function __construct($options) + { + // check $cacheDir + if (isset($options['cacheDir'])) { + self::$cacheDir = $options['cacheDir']; + } + + if (empty(self::$cacheDir)) { + throw new Exception('cacheDir not set'); + } + + if (isset($options['prefix'])) { + self::$prefix = $options['prefix']; + } + + if (empty(self::$prefix)) { + throw new Exception('prefix not set'); + } + + if (isset($options['forceRefresh'])) { + self::$forceRefresh = $options['forceRefresh']; + } + + self::checkCacheDir(); + } + + /** + * Get the cached result of $operation on $what, + * which is known as dependant from the content of $options + * + * @param string $operation parse, compile... + * @param mixed $what content key (e.g., filename to be treated) + * @param array $options any option that affect the operation result on the content + * @param int|null $lastModified last modified timestamp + * + * @return mixed + * + * @throws \Exception + */ + public function getCache($operation, $what, $options = [], $lastModified = null) + { + $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options); + + if ( + ((self::$forceRefresh === false) || (self::$forceRefresh === 'once' && + isset(self::$refreshed[$fileCache]))) && file_exists($fileCache) + ) { + $cacheTime = filemtime($fileCache); + + if ( + (\is_null($lastModified) || $cacheTime > $lastModified) && + $cacheTime + self::$gcLifetime > time() + ) { + $c = file_get_contents($fileCache); + $c = unserialize($c); + + if (\is_array($c) && isset($c['value'])) { + return $c['value']; + } + } + } + + return null; + } + + /** + * Put in cache the result of $operation on $what, + * which is known as dependant from the content of $options + * + * @param string $operation + * @param mixed $what + * @param mixed $value + * @param array $options + * + * @return void + */ + public function setCache($operation, $what, $value, $options = []) + { + $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options); + + $c = ['value' => $value]; + $c = serialize($c); + + file_put_contents($fileCache, $c); + + if (self::$forceRefresh === 'once') { + self::$refreshed[$fileCache] = true; + } + } + + /** + * Get the cache name for the caching of $operation on $what, + * which is known as dependant from the content of $options + * + * @param string $operation + * @param mixed $what + * @param array $options + * + * @return string + */ + private static function cacheName($operation, $what, $options = []) + { + $t = [ + 'version' => self::CACHE_VERSION, + 'scssphpVersion' => Version::VERSION, + 'operation' => $operation, + 'what' => $what, + 'options' => $options + ]; + + $t = self::$prefix + . sha1(json_encode($t)) + . ".$operation" + . ".scsscache"; + + return $t; + } + + /** + * Check that the cache dir exists and is writeable + * + * @return void + * + * @throws \Exception + */ + public static function checkCacheDir() + { + self::$cacheDir = str_replace('\\', '/', self::$cacheDir); + self::$cacheDir = rtrim(self::$cacheDir, '/') . '/'; + + if (! is_dir(self::$cacheDir)) { + throw new Exception('Cache directory doesn\'t exist: ' . self::$cacheDir); + } + + if (! is_writable(self::$cacheDir)) { + throw new Exception('Cache directory isn\'t writable: ' . self::$cacheDir); + } + } + + /** + * Delete unused cached files + * + * @return void + */ + public static function cleanCache() + { + static $clean = false; + + if ($clean || empty(self::$cacheDir)) { + return; + } + + $clean = true; + + // only remove files with extensions created by SCSSPHP Cache + // css files removed based on the list files + $removeTypes = ['scsscache' => 1]; + + $files = scandir(self::$cacheDir); + + if (! $files) { + return; + } + + $checkTime = time() - self::$gcLifetime; + + foreach ($files as $file) { + // don't delete if the file wasn't created with SCSSPHP Cache + if (strpos($file, self::$prefix) !== 0) { + continue; + } + + $parts = explode('.', $file); + $type = array_pop($parts); + + if (! isset($removeTypes[$type])) { + continue; + } + + $fullPath = self::$cacheDir . $file; + $mtime = filemtime($fullPath); + + // don't delete if it's a relatively new file + if ($mtime > $checkTime) { + continue; + } + + unlink($fullPath); + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Colors.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Colors.php new file mode 100644 index 0000000..e836e3f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Colors.php @@ -0,0 +1,247 @@ + + * + * @internal + */ +class Colors +{ + /** + * CSS Colors + * + * @see http://www.w3.org/TR/css3-color + * + * @var array + */ + protected static $cssColors = [ + 'aliceblue' => '240,248,255', + 'antiquewhite' => '250,235,215', + 'aqua' => '0,255,255', + 'cyan' => '0,255,255', + 'aquamarine' => '127,255,212', + 'azure' => '240,255,255', + 'beige' => '245,245,220', + 'bisque' => '255,228,196', + 'black' => '0,0,0', + 'blanchedalmond' => '255,235,205', + 'blue' => '0,0,255', + 'blueviolet' => '138,43,226', + 'brown' => '165,42,42', + 'burlywood' => '222,184,135', + 'cadetblue' => '95,158,160', + 'chartreuse' => '127,255,0', + 'chocolate' => '210,105,30', + 'coral' => '255,127,80', + 'cornflowerblue' => '100,149,237', + 'cornsilk' => '255,248,220', + 'crimson' => '220,20,60', + 'darkblue' => '0,0,139', + 'darkcyan' => '0,139,139', + 'darkgoldenrod' => '184,134,11', + 'darkgray' => '169,169,169', + 'darkgrey' => '169,169,169', + 'darkgreen' => '0,100,0', + 'darkkhaki' => '189,183,107', + 'darkmagenta' => '139,0,139', + 'darkolivegreen' => '85,107,47', + 'darkorange' => '255,140,0', + 'darkorchid' => '153,50,204', + 'darkred' => '139,0,0', + 'darksalmon' => '233,150,122', + 'darkseagreen' => '143,188,143', + 'darkslateblue' => '72,61,139', + 'darkslategray' => '47,79,79', + 'darkslategrey' => '47,79,79', + 'darkturquoise' => '0,206,209', + 'darkviolet' => '148,0,211', + 'deeppink' => '255,20,147', + 'deepskyblue' => '0,191,255', + 'dimgray' => '105,105,105', + 'dimgrey' => '105,105,105', + 'dodgerblue' => '30,144,255', + 'firebrick' => '178,34,34', + 'floralwhite' => '255,250,240', + 'forestgreen' => '34,139,34', + 'fuchsia' => '255,0,255', + 'magenta' => '255,0,255', + 'gainsboro' => '220,220,220', + 'ghostwhite' => '248,248,255', + 'gold' => '255,215,0', + 'goldenrod' => '218,165,32', + 'gray' => '128,128,128', + 'grey' => '128,128,128', + 'green' => '0,128,0', + 'greenyellow' => '173,255,47', + 'honeydew' => '240,255,240', + 'hotpink' => '255,105,180', + 'indianred' => '205,92,92', + 'indigo' => '75,0,130', + 'ivory' => '255,255,240', + 'khaki' => '240,230,140', + 'lavender' => '230,230,250', + 'lavenderblush' => '255,240,245', + 'lawngreen' => '124,252,0', + 'lemonchiffon' => '255,250,205', + 'lightblue' => '173,216,230', + 'lightcoral' => '240,128,128', + 'lightcyan' => '224,255,255', + 'lightgoldenrodyellow' => '250,250,210', + 'lightgray' => '211,211,211', + 'lightgrey' => '211,211,211', + 'lightgreen' => '144,238,144', + 'lightpink' => '255,182,193', + 'lightsalmon' => '255,160,122', + 'lightseagreen' => '32,178,170', + 'lightskyblue' => '135,206,250', + 'lightslategray' => '119,136,153', + 'lightslategrey' => '119,136,153', + 'lightsteelblue' => '176,196,222', + 'lightyellow' => '255,255,224', + 'lime' => '0,255,0', + 'limegreen' => '50,205,50', + 'linen' => '250,240,230', + 'maroon' => '128,0,0', + 'mediumaquamarine' => '102,205,170', + 'mediumblue' => '0,0,205', + 'mediumorchid' => '186,85,211', + 'mediumpurple' => '147,112,219', + 'mediumseagreen' => '60,179,113', + 'mediumslateblue' => '123,104,238', + 'mediumspringgreen' => '0,250,154', + 'mediumturquoise' => '72,209,204', + 'mediumvioletred' => '199,21,133', + 'midnightblue' => '25,25,112', + 'mintcream' => '245,255,250', + 'mistyrose' => '255,228,225', + 'moccasin' => '255,228,181', + 'navajowhite' => '255,222,173', + 'navy' => '0,0,128', + 'oldlace' => '253,245,230', + 'olive' => '128,128,0', + 'olivedrab' => '107,142,35', + 'orange' => '255,165,0', + 'orangered' => '255,69,0', + 'orchid' => '218,112,214', + 'palegoldenrod' => '238,232,170', + 'palegreen' => '152,251,152', + 'paleturquoise' => '175,238,238', + 'palevioletred' => '219,112,147', + 'papayawhip' => '255,239,213', + 'peachpuff' => '255,218,185', + 'peru' => '205,133,63', + 'pink' => '255,192,203', + 'plum' => '221,160,221', + 'powderblue' => '176,224,230', + 'purple' => '128,0,128', + 'red' => '255,0,0', + 'rosybrown' => '188,143,143', + 'royalblue' => '65,105,225', + 'saddlebrown' => '139,69,19', + 'salmon' => '250,128,114', + 'sandybrown' => '244,164,96', + 'seagreen' => '46,139,87', + 'seashell' => '255,245,238', + 'sienna' => '160,82,45', + 'silver' => '192,192,192', + 'skyblue' => '135,206,235', + 'slateblue' => '106,90,205', + 'slategray' => '112,128,144', + 'slategrey' => '112,128,144', + 'snow' => '255,250,250', + 'springgreen' => '0,255,127', + 'steelblue' => '70,130,180', + 'tan' => '210,180,140', + 'teal' => '0,128,128', + 'thistle' => '216,191,216', + 'tomato' => '255,99,71', + 'turquoise' => '64,224,208', + 'violet' => '238,130,238', + 'wheat' => '245,222,179', + 'white' => '255,255,255', + 'whitesmoke' => '245,245,245', + 'yellow' => '255,255,0', + 'yellowgreen' => '154,205,50', + 'rebeccapurple' => '102,51,153', + 'transparent' => '0,0,0,0', + ]; + + /** + * Convert named color in a [r,g,b[,a]] array + * + * @param string $colorName + * + * @return int[]|null + */ + public static function colorNameToRGBa($colorName) + { + if (\is_string($colorName) && isset(static::$cssColors[$colorName])) { + $rgba = explode(',', static::$cssColors[$colorName]); + + // only case with opacity is transparent, with opacity=0, so we can intval on opacity also + $rgba = array_map('intval', $rgba); + + return $rgba; + } + + return null; + } + + /** + * Reverse conversion : from RGBA to a color name if possible + * + * @param integer $r + * @param integer $g + * @param integer $b + * @param integer|float $a + * + * @return string|null + */ + public static function RGBaToColorName($r, $g, $b, $a = 1) + { + static $reverseColorTable = null; + + if (! is_numeric($r) || ! is_numeric($g) || ! is_numeric($b) || ! is_numeric($a)) { + return null; + } + + if ($a < 1) { + return null; + } + + if (\is_null($reverseColorTable)) { + $reverseColorTable = []; + + foreach (static::$cssColors as $name => $rgb_str) { + $rgb_str = explode(',', $rgb_str); + + if ( + \count($rgb_str) == 3 && + ! isset($reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])]) + ) { + $reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])] = $name; + } + } + } + + if (isset($reverseColorTable[\intval($r)][\intval($g)][\intval($b)])) { + return $reverseColorTable[\intval($r)][\intval($g)][\intval($b)]; + } + + return null; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/CompilationResult.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/CompilationResult.php new file mode 100644 index 0000000..36adb0d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/CompilationResult.php @@ -0,0 +1,69 @@ +css = $css; + $this->sourceMap = $sourceMap; + $this->includedFiles = $includedFiles; + } + + /** + * @return string + */ + public function getCss() + { + return $this->css; + } + + /** + * @return string[] + */ + public function getIncludedFiles() + { + return $this->includedFiles; + } + + /** + * The sourceMap content, if it was generated + * + * @return null|string + */ + public function getSourceMap() + { + return $this->sourceMap; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler.php new file mode 100644 index 0000000..58ba795 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler.php @@ -0,0 +1,10087 @@ + + * + * @final Extending the Compiler is deprecated + */ +class Compiler +{ + /** + * @deprecated + */ + const LINE_COMMENTS = 1; + /** + * @deprecated + */ + const DEBUG_INFO = 2; + + /** + * @deprecated + */ + const WITH_RULE = 1; + /** + * @deprecated + */ + const WITH_MEDIA = 2; + /** + * @deprecated + */ + const WITH_SUPPORTS = 4; + /** + * @deprecated + */ + const WITH_ALL = 7; + + const SOURCE_MAP_NONE = 0; + const SOURCE_MAP_INLINE = 1; + const SOURCE_MAP_FILE = 2; + + /** + * @var array + */ + protected static $operatorNames = [ + '+' => 'add', + '-' => 'sub', + '*' => 'mul', + '/' => 'div', + '%' => 'mod', + + '==' => 'eq', + '!=' => 'neq', + '<' => 'lt', + '>' => 'gt', + + '<=' => 'lte', + '>=' => 'gte', + ]; + + /** + * @var array + */ + protected static $namespaces = [ + 'special' => '%', + 'mixin' => '@', + 'function' => '^', + ]; + + public static $true = [Type::T_KEYWORD, 'true']; + public static $false = [Type::T_KEYWORD, 'false']; + /** @deprecated */ + public static $NaN = [Type::T_KEYWORD, 'NaN']; + /** @deprecated */ + public static $Infinity = [Type::T_KEYWORD, 'Infinity']; + public static $null = [Type::T_NULL]; + public static $nullString = [Type::T_STRING, '', []]; + public static $defaultValue = [Type::T_KEYWORD, '']; + public static $selfSelector = [Type::T_SELF]; + public static $emptyList = [Type::T_LIST, '', []]; + public static $emptyMap = [Type::T_MAP, [], []]; + public static $emptyString = [Type::T_STRING, '"', []]; + public static $with = [Type::T_KEYWORD, 'with']; + public static $without = [Type::T_KEYWORD, 'without']; + + /** + * @var array + */ + protected $importPaths = []; + /** + * @var array + */ + protected $importCache = []; + + /** + * @var string[] + */ + protected $importedFiles = []; + + /** + * @var array + * @phpstan-var array + */ + protected $userFunctions = []; + /** + * @var array + */ + protected $registeredVars = []; + /** + * @var array + */ + protected $registeredFeatures = [ + 'extend-selector-pseudoclass' => false, + 'at-error' => true, + 'units-level-3' => true, + 'global-variable-shadowing' => false, + ]; + + /** + * @var string|null + */ + protected $encoding = null; + /** + * @var null + * @deprecated + */ + protected $lineNumberStyle = null; + + /** + * @var int|SourceMapGenerator + * @phpstan-var self::SOURCE_MAP_*|SourceMapGenerator + */ + protected $sourceMap = self::SOURCE_MAP_NONE; + + /** + * @var array + * @phpstan-var array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} + */ + protected $sourceMapOptions = []; + + /** + * @var bool + */ + private $charset = true; + + /** + * @var string|\ScssPhp\ScssPhp\Formatter + */ + protected $formatter = Expanded::class; + + /** + * @var Environment + */ + protected $rootEnv; + /** + * @var OutputBlock|null + */ + protected $rootBlock; + + /** + * @var \ScssPhp\ScssPhp\Compiler\Environment + */ + protected $env; + /** + * @var OutputBlock|null + */ + protected $scope; + /** + * @var Environment|null + */ + protected $storeEnv; + /** + * @var bool|null + * + * @deprecated + */ + protected $charsetSeen; + /** + * @var array + */ + protected $sourceNames; + + /** + * @var Cache|null + */ + protected $cache; + + /** + * @var bool + */ + protected $cacheCheckImportResolutions = false; + + /** + * @var int + */ + protected $indentLevel; + /** + * @var array[] + */ + protected $extends; + /** + * @var array + */ + protected $extendsMap; + + /** + * @var array + */ + protected $parsedFiles = []; + + /** + * @var Parser|null + */ + protected $parser; + /** + * @var int|null + */ + protected $sourceIndex; + /** + * @var int|null + */ + protected $sourceLine; + /** + * @var int|null + */ + protected $sourceColumn; + /** + * @var bool|null + */ + protected $shouldEvaluate; + /** + * @var null + * @deprecated + */ + protected $ignoreErrors; + /** + * @var bool + */ + protected $ignoreCallStackMessage = false; + + /** + * @var array[] + */ + protected $callStack = []; + + /** + * @var array + * @phpstan-var list + */ + private $resolvedImports = []; + + /** + * The directory of the currently processed file + * + * @var string|null + */ + private $currentDirectory; + + /** + * The directory of the input file + * + * @var string + */ + private $rootDirectory; + + /** + * @var bool + */ + private $legacyCwdImportPath = true; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * @var array + */ + private $warnedChildFunctions = []; + + /** + * Constructor + * + * @param array|null $cacheOptions + * @phpstan-param array{cacheDir?: string, prefix?: string, forceRefresh?: string, checkImportResolutions?: bool}|null $cacheOptions + */ + public function __construct($cacheOptions = null) + { + $this->sourceNames = []; + + if ($cacheOptions) { + $this->cache = new Cache($cacheOptions); + if (!empty($cacheOptions['checkImportResolutions'])) { + $this->cacheCheckImportResolutions = true; + } + } + + $this->logger = new StreamLogger(fopen('php://stderr', 'w'), true); + } + + /** + * Get compiler options + * + * @return array + * + * @internal + */ + public function getCompileOptions() + { + $options = [ + 'importPaths' => $this->importPaths, + 'registeredVars' => $this->registeredVars, + 'registeredFeatures' => $this->registeredFeatures, + 'encoding' => $this->encoding, + 'sourceMap' => serialize($this->sourceMap), + 'sourceMapOptions' => $this->sourceMapOptions, + 'formatter' => $this->formatter, + 'legacyImportPath' => $this->legacyCwdImportPath, + ]; + + return $options; + } + + /** + * Sets an alternative logger. + * + * Changing the logger in the middle of the compilation is not + * supported and will result in an undefined behavior. + * + * @param LoggerInterface $logger + * + * @return void + */ + public function setLogger(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * Set an alternative error output stream, for testing purpose only + * + * @param resource $handle + * + * @return void + * + * @deprecated Use {@see setLogger} instead + */ + public function setErrorOuput($handle) + { + @trigger_error('The method "setErrorOuput" is deprecated. Use "setLogger" instead.', E_USER_DEPRECATED); + + $this->logger = new StreamLogger($handle); + } + + /** + * Compile scss + * + * @param string $code + * @param string|null $path + * + * @return string + * + * @throws SassException when the source fails to compile + * + * @deprecated Use {@see compileString} instead. + */ + public function compile($code, $path = null) + { + @trigger_error(sprintf('The "%s" method is deprecated. Use "compileString" instead.', __METHOD__), E_USER_DEPRECATED); + + $result = $this->compileString($code, $path); + + $sourceMap = $result->getSourceMap(); + + if ($sourceMap !== null) { + if ($this->sourceMap instanceof SourceMapGenerator) { + $this->sourceMap->saveMap($sourceMap); + } elseif ($this->sourceMap === self::SOURCE_MAP_FILE) { + $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions); + $sourceMapGenerator->saveMap($sourceMap); + } + } + + return $result->getCss(); + } + + /** + * Compile scss + * + * @param string $source + * @param string|null $path + * + * @return CompilationResult + * + * @throws SassException when the source fails to compile + */ + public function compileString($source, $path = null) + { + if ($this->cache) { + $cacheKey = ($path ? $path : '(stdin)') . ':' . md5($source); + $compileOptions = $this->getCompileOptions(); + $cachedResult = $this->cache->getCache('compile', $cacheKey, $compileOptions); + + if ($cachedResult instanceof CachedResult && $this->isFreshCachedResult($cachedResult)) { + return $cachedResult->getResult(); + } + } + + $this->indentLevel = -1; + $this->extends = []; + $this->extendsMap = []; + $this->sourceIndex = null; + $this->sourceLine = null; + $this->sourceColumn = null; + $this->env = null; + $this->scope = null; + $this->storeEnv = null; + $this->shouldEvaluate = null; + $this->ignoreCallStackMessage = false; + $this->parsedFiles = []; + $this->importedFiles = []; + $this->resolvedImports = []; + + if (!\is_null($path) && is_file($path)) { + $path = realpath($path) ?: $path; + $this->currentDirectory = dirname($path); + $this->rootDirectory = $this->currentDirectory; + } else { + $this->currentDirectory = null; + $this->rootDirectory = getcwd(); + } + + try { + $this->parser = $this->parserFactory($path); + $tree = $this->parser->parse($source); + $this->parser = null; + + $this->formatter = new $this->formatter(); + $this->rootBlock = null; + $this->rootEnv = $this->pushEnv($tree); + + $warnCallback = function ($message, $deprecation) { + $this->logger->warn($message, $deprecation); + }; + $previousWarnCallback = Warn::setCallback($warnCallback); + + try { + $this->injectVariables($this->registeredVars); + $this->compileRoot($tree); + $this->popEnv(); + } finally { + Warn::setCallback($previousWarnCallback); + } + + $sourceMapGenerator = null; + + if ($this->sourceMap) { + if (\is_object($this->sourceMap) && $this->sourceMap instanceof SourceMapGenerator) { + $sourceMapGenerator = $this->sourceMap; + $this->sourceMap = self::SOURCE_MAP_FILE; + } elseif ($this->sourceMap !== self::SOURCE_MAP_NONE) { + $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions); + } + } + + $out = $this->formatter->format($this->scope, $sourceMapGenerator); + + $prefix = ''; + + if ($this->charset && strlen($out) !== Util::mbStrlen($out)) { + $prefix = '@charset "UTF-8";' . "\n"; + $out = $prefix . $out; + } + + $sourceMap = null; + + if (! empty($out) && $this->sourceMap && $this->sourceMap !== self::SOURCE_MAP_NONE) { + $sourceMap = $sourceMapGenerator->generateJson($prefix); + $sourceMapUrl = null; + + switch ($this->sourceMap) { + case self::SOURCE_MAP_INLINE: + $sourceMapUrl = sprintf('data:application/json,%s', Util::encodeURIComponent($sourceMap)); + break; + + case self::SOURCE_MAP_FILE: + if (isset($this->sourceMapOptions['sourceMapURL'])) { + $sourceMapUrl = $this->sourceMapOptions['sourceMapURL']; + } + break; + } + + if ($sourceMapUrl !== null) { + $out .= sprintf('/*# sourceMappingURL=%s */', $sourceMapUrl); + } + } + } catch (SassScriptException $e) { + throw new CompilerException($this->addLocationToMessage($e->getMessage()), 0, $e); + } + + $includedFiles = []; + + foreach ($this->resolvedImports as $resolvedImport) { + $includedFiles[$resolvedImport['filePath']] = $resolvedImport['filePath']; + } + + $result = new CompilationResult($out, $sourceMap, array_values($includedFiles)); + + if ($this->cache && isset($cacheKey) && isset($compileOptions)) { + $this->cache->setCache('compile', $cacheKey, new CachedResult($result, $this->parsedFiles, $this->resolvedImports), $compileOptions); + } + + // Reset state to free memory + // TODO in 2.0, reset parsedFiles as well when the getter is removed. + $this->resolvedImports = []; + $this->importedFiles = []; + + return $result; + } + + /** + * @param CachedResult $result + * + * @return bool + */ + private function isFreshCachedResult(CachedResult $result) + { + // check if any dependency file changed since the result was compiled + foreach ($result->getParsedFiles() as $file => $mtime) { + if (! is_file($file) || filemtime($file) !== $mtime) { + return false; + } + } + + if ($this->cacheCheckImportResolutions) { + $resolvedImports = []; + + foreach ($result->getResolvedImports() as $import) { + $currentDir = $import['currentDir']; + $path = $import['path']; + // store the check across all the results in memory to avoid multiple findImport() on the same path + // with same context. + // this is happening in a same hit with multiple compilations (especially with big frameworks) + if (empty($resolvedImports[$currentDir][$path])) { + $resolvedImports[$currentDir][$path] = $this->findImport($path, $currentDir); + } + + if ($resolvedImports[$currentDir][$path] !== $import['filePath']) { + return false; + } + } + } + + return true; + } + + /** + * Instantiate parser + * + * @param string|null $path + * + * @return \ScssPhp\ScssPhp\Parser + */ + protected function parserFactory($path) + { + // https://sass-lang.com/documentation/at-rules/import + // CSS files imported by Sass don’t allow any special Sass features. + // In order to make sure authors don’t accidentally write Sass in their CSS, + // all Sass features that aren’t also valid CSS will produce errors. + // Otherwise, the CSS will be rendered as-is. It can even be extended! + $cssOnly = false; + + if ($path !== null && substr($path, -4) === '.css') { + $cssOnly = true; + } + + $parser = new Parser($path, \count($this->sourceNames), $this->encoding, $this->cache, $cssOnly, $this->logger); + + $this->sourceNames[] = $path; + $this->addParsedFile($path); + + return $parser; + } + + /** + * Is self extend? + * + * @param array $target + * @param array $origin + * + * @return boolean + */ + protected function isSelfExtend($target, $origin) + { + foreach ($origin as $sel) { + if (\in_array($target, $sel)) { + return true; + } + } + + return false; + } + + /** + * Push extends + * + * @param array $target + * @param array $origin + * @param array|null $block + * + * @return void + */ + protected function pushExtends($target, $origin, $block) + { + $i = \count($this->extends); + $this->extends[] = [$target, $origin, $block]; + + foreach ($target as $part) { + if (isset($this->extendsMap[$part])) { + $this->extendsMap[$part][] = $i; + } else { + $this->extendsMap[$part] = [$i]; + } + } + } + + /** + * Make output block + * + * @param string|null $type + * @param string[]|null $selectors + * + * @return \ScssPhp\ScssPhp\Formatter\OutputBlock + */ + protected function makeOutputBlock($type, $selectors = null) + { + $out = new OutputBlock(); + $out->type = $type; + $out->lines = []; + $out->children = []; + $out->parent = $this->scope; + $out->selectors = $selectors; + $out->depth = $this->env->depth; + + if ($this->env->block instanceof Block) { + $out->sourceName = $this->env->block->sourceName; + $out->sourceLine = $this->env->block->sourceLine; + $out->sourceColumn = $this->env->block->sourceColumn; + } else { + $out->sourceName = null; + $out->sourceLine = null; + $out->sourceColumn = null; + } + + return $out; + } + + /** + * Compile root + * + * @param \ScssPhp\ScssPhp\Block $rootBlock + * + * @return void + */ + protected function compileRoot(Block $rootBlock) + { + $this->rootBlock = $this->scope = $this->makeOutputBlock(Type::T_ROOT); + + $this->compileChildrenNoReturn($rootBlock->children, $this->scope); + $this->flattenSelectors($this->scope); + $this->missingSelectors(); + } + + /** + * Report missing selectors + * + * @return void + */ + protected function missingSelectors() + { + foreach ($this->extends as $extend) { + if (isset($extend[3])) { + continue; + } + + list($target, $origin, $block) = $extend; + + // ignore if !optional + if ($block[2]) { + continue; + } + + $target = implode(' ', $target); + $origin = $this->collapseSelectors($origin); + + $this->sourceLine = $block[Parser::SOURCE_LINE]; + throw $this->error("\"$origin\" failed to @extend \"$target\". The selector \"$target\" was not found."); + } + } + + /** + * Flatten selectors + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + * @param string $parentKey + * + * @return void + */ + protected function flattenSelectors(OutputBlock $block, $parentKey = null) + { + if ($block->selectors) { + $selectors = []; + + foreach ($block->selectors as $s) { + $selectors[] = $s; + + if (! \is_array($s)) { + continue; + } + + // check extends + if (! empty($this->extendsMap)) { + $this->matchExtends($s, $selectors); + + // remove duplicates + array_walk($selectors, function (&$value) { + $value = serialize($value); + }); + + $selectors = array_unique($selectors); + + array_walk($selectors, function (&$value) { + $value = unserialize($value); + }); + } + } + + $block->selectors = []; + $placeholderSelector = false; + + foreach ($selectors as $selector) { + if ($this->hasSelectorPlaceholder($selector)) { + $placeholderSelector = true; + continue; + } + + $block->selectors[] = $this->compileSelector($selector); + } + + if ($placeholderSelector && 0 === \count($block->selectors) && null !== $parentKey) { + unset($block->parent->children[$parentKey]); + + return; + } + } + + foreach ($block->children as $key => $child) { + $this->flattenSelectors($child, $key); + } + } + + /** + * Glue parts of :not( or :nth-child( ... that are in general split in selectors parts + * + * @param array $parts + * + * @return array + */ + protected function glueFunctionSelectors($parts) + { + $new = []; + + foreach ($parts as $part) { + if (\is_array($part)) { + $part = $this->glueFunctionSelectors($part); + $new[] = $part; + } else { + // a selector part finishing with a ) is the last part of a :not( or :nth-child( + // and need to be joined to this + if ( + \count($new) && \is_string($new[\count($new) - 1]) && + \strlen($part) && substr($part, -1) === ')' && strpos($part, '(') === false + ) { + while (\count($new) > 1 && substr($new[\count($new) - 1], -1) !== '(') { + $part = array_pop($new) . $part; + } + $new[\count($new) - 1] .= $part; + } else { + $new[] = $part; + } + } + } + + return $new; + } + + /** + * Match extends + * + * @param array $selector + * @param array $out + * @param integer $from + * @param boolean $initial + * + * @return void + */ + protected function matchExtends($selector, &$out, $from = 0, $initial = true) + { + static $partsPile = []; + $selector = $this->glueFunctionSelectors($selector); + + if (\count($selector) == 1 && \in_array(reset($selector), $partsPile)) { + return; + } + + $outRecurs = []; + + foreach ($selector as $i => $part) { + if ($i < $from) { + continue; + } + + // check that we are not building an infinite loop of extensions + // if the new part is just including a previous part don't try to extend anymore + if (\count($part) > 1) { + foreach ($partsPile as $previousPart) { + if (! \count(array_diff($previousPart, $part))) { + continue 2; + } + } + } + + $partsPile[] = $part; + + if ($this->matchExtendsSingle($part, $origin, $initial)) { + $after = \array_slice($selector, $i + 1); + $before = \array_slice($selector, 0, $i); + list($before, $nonBreakableBefore) = $this->extractRelationshipFromFragment($before); + + foreach ($origin as $new) { + $k = 0; + + // remove shared parts + if (\count($new) > 1) { + while ($k < $i && isset($new[$k]) && $selector[$k] === $new[$k]) { + $k++; + } + } + + if (\count($nonBreakableBefore) && $k === \count($new)) { + $k--; + } + + $replacement = []; + $tempReplacement = $k > 0 ? \array_slice($new, $k) : $new; + + for ($l = \count($tempReplacement) - 1; $l >= 0; $l--) { + $slice = []; + + foreach ($tempReplacement[$l] as $chunk) { + if (! \in_array($chunk, $slice)) { + $slice[] = $chunk; + } + } + + array_unshift($replacement, $slice); + + if (! $this->isImmediateRelationshipCombinator(end($slice))) { + break; + } + } + + $afterBefore = $l != 0 ? \array_slice($tempReplacement, 0, $l) : []; + + // Merge shared direct relationships. + $mergedBefore = $this->mergeDirectRelationships($afterBefore, $nonBreakableBefore); + + $result = array_merge( + $before, + $mergedBefore, + $replacement, + $after + ); + + if ($result === $selector) { + continue; + } + + $this->pushOrMergeExtentedSelector($out, $result); + + // recursively check for more matches + $startRecurseFrom = \count($before) + min(\count($nonBreakableBefore), \count($mergedBefore)); + + if (\count($origin) > 1) { + $this->matchExtends($result, $out, $startRecurseFrom, false); + } else { + $this->matchExtends($result, $outRecurs, $startRecurseFrom, false); + } + + // selector sequence merging + if (! empty($before) && \count($new) > 1) { + $preSharedParts = $k > 0 ? \array_slice($before, 0, $k) : []; + $postSharedParts = $k > 0 ? \array_slice($before, $k) : $before; + + list($betweenSharedParts, $nonBreakabl2) = $this->extractRelationshipFromFragment($afterBefore); + + $result2 = array_merge( + $preSharedParts, + $betweenSharedParts, + $postSharedParts, + $nonBreakabl2, + $nonBreakableBefore, + $replacement, + $after + ); + + $this->pushOrMergeExtentedSelector($out, $result2); + } + } + } + array_pop($partsPile); + } + + while (\count($outRecurs)) { + $result = array_shift($outRecurs); + $this->pushOrMergeExtentedSelector($out, $result); + } + } + + /** + * Test a part for being a pseudo selector + * + * @param string $part + * @param array $matches + * + * @return boolean + */ + protected function isPseudoSelector($part, &$matches) + { + if ( + strpos($part, ':') === 0 && + preg_match(",^::?([\w-]+)\((.+)\)$,", $part, $matches) + ) { + return true; + } + + return false; + } + + /** + * Push extended selector except if + * - this is a pseudo selector + * - same as previous + * - in a white list + * in this case we merge the pseudo selector content + * + * @param array $out + * @param array $extended + * + * @return void + */ + protected function pushOrMergeExtentedSelector(&$out, $extended) + { + if (\count($out) && \count($extended) === 1 && \count(reset($extended)) === 1) { + $single = reset($extended); + $part = reset($single); + + if ( + $this->isPseudoSelector($part, $matchesExtended) && + \in_array($matchesExtended[1], [ 'slotted' ]) + ) { + $prev = end($out); + $prev = $this->glueFunctionSelectors($prev); + + if (\count($prev) === 1 && \count(reset($prev)) === 1) { + $single = reset($prev); + $part = reset($single); + + if ( + $this->isPseudoSelector($part, $matchesPrev) && + $matchesPrev[1] === $matchesExtended[1] + ) { + $extended = explode($matchesExtended[1] . '(', $matchesExtended[0], 2); + $extended[1] = $matchesPrev[2] . ', ' . $extended[1]; + $extended = implode($matchesExtended[1] . '(', $extended); + $extended = [ [ $extended ]]; + array_pop($out); + } + } + } + } + $out[] = $extended; + } + + /** + * Match extends single + * + * @param array $rawSingle + * @param array $outOrigin + * @param boolean $initial + * + * @return boolean + */ + protected function matchExtendsSingle($rawSingle, &$outOrigin, $initial = true) + { + $counts = []; + $single = []; + + // simple usual cases, no need to do the whole trick + if (\in_array($rawSingle, [['>'],['+'],['~']])) { + return false; + } + + foreach ($rawSingle as $part) { + // matches Number + if (! \is_string($part)) { + return false; + } + + if (! preg_match('/^[\[.:#%]/', $part) && \count($single)) { + $single[\count($single) - 1] .= $part; + } else { + $single[] = $part; + } + } + + $extendingDecoratedTag = false; + + if (\count($single) > 1) { + $matches = null; + $extendingDecoratedTag = preg_match('/^[a-z0-9]+$/i', $single[0], $matches) ? $matches[0] : false; + } + + $outOrigin = []; + $found = false; + + foreach ($single as $k => $part) { + if (isset($this->extendsMap[$part])) { + foreach ($this->extendsMap[$part] as $idx) { + $counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1; + } + } + + if ( + $initial && + $this->isPseudoSelector($part, $matches) && + ! \in_array($matches[1], [ 'not' ]) + ) { + $buffer = $matches[2]; + $parser = $this->parserFactory(__METHOD__); + + if ($parser->parseSelector($buffer, $subSelectors, false)) { + foreach ($subSelectors as $ksub => $subSelector) { + $subExtended = []; + $this->matchExtends($subSelector, $subExtended, 0, false); + + if ($subExtended) { + $subSelectorsExtended = $subSelectors; + $subSelectorsExtended[$ksub] = $subExtended; + + foreach ($subSelectorsExtended as $ksse => $sse) { + $subSelectorsExtended[$ksse] = $this->collapseSelectors($sse); + } + + $subSelectorsExtended = implode(', ', $subSelectorsExtended); + $singleExtended = $single; + $singleExtended[$k] = str_replace('(' . $buffer . ')', "($subSelectorsExtended)", $part); + $outOrigin[] = [ $singleExtended ]; + $found = true; + } + } + } + } + } + + foreach ($counts as $idx => $count) { + list($target, $origin, /* $block */) = $this->extends[$idx]; + + $origin = $this->glueFunctionSelectors($origin); + + // check count + if ($count !== \count($target)) { + continue; + } + + $this->extends[$idx][3] = true; + + $rem = array_diff($single, $target); + + foreach ($origin as $j => $new) { + // prevent infinite loop when target extends itself + if ($this->isSelfExtend($single, $origin) && ! $initial) { + return false; + } + + $replacement = end($new); + + // Extending a decorated tag with another tag is not possible. + if ( + $extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag && + preg_match('/^[a-z0-9]+$/i', $replacement[0]) + ) { + unset($origin[$j]); + continue; + } + + $combined = $this->combineSelectorSingle($replacement, $rem); + + if (\count(array_diff($combined, $origin[$j][\count($origin[$j]) - 1]))) { + $origin[$j][\count($origin[$j]) - 1] = $combined; + } + } + + $outOrigin = array_merge($outOrigin, $origin); + + $found = true; + } + + return $found; + } + + /** + * Extract a relationship from the fragment. + * + * When extracting the last portion of a selector we will be left with a + * fragment which may end with a direction relationship combinator. This + * method will extract the relationship fragment and return it along side + * the rest. + * + * @param array $fragment The selector fragment maybe ending with a direction relationship combinator. + * + * @return array The selector without the relationship fragment if any, the relationship fragment. + */ + protected function extractRelationshipFromFragment(array $fragment) + { + $parents = []; + $children = []; + + $j = $i = \count($fragment); + + for (;;) { + $children = $j != $i ? \array_slice($fragment, $j, $i - $j) : []; + $parents = \array_slice($fragment, 0, $j); + $slice = end($parents); + + if (empty($slice) || ! $this->isImmediateRelationshipCombinator($slice[0])) { + break; + } + + $j -= 2; + } + + return [$parents, $children]; + } + + /** + * Combine selector single + * + * @param array $base + * @param array $other + * + * @return array + */ + protected function combineSelectorSingle($base, $other) + { + $tag = []; + $out = []; + $wasTag = false; + $pseudo = []; + + while (\count($other) && strpos(end($other), ':') === 0) { + array_unshift($pseudo, array_pop($other)); + } + + foreach ([array_reverse($base), array_reverse($other)] as $single) { + $rang = count($single); + + foreach ($single as $part) { + if (preg_match('/^[\[:]/', $part)) { + $out[] = $part; + $wasTag = false; + } elseif (preg_match('/^[\.#]/', $part)) { + array_unshift($out, $part); + $wasTag = false; + } elseif (preg_match('/^[^_-]/', $part) && $rang === 1) { + $tag[] = $part; + $wasTag = true; + } elseif ($wasTag) { + $tag[\count($tag) - 1] .= $part; + } else { + array_unshift($out, $part); + } + $rang--; + } + } + + if (\count($tag)) { + array_unshift($out, $tag[0]); + } + + while (\count($pseudo)) { + $out[] = array_shift($pseudo); + } + + return $out; + } + + /** + * Compile media + * + * @param \ScssPhp\ScssPhp\Block $media + * + * @return void + */ + protected function compileMedia(Block $media) + { + $this->pushEnv($media); + + $mediaQueries = $this->compileMediaQuery($this->multiplyMedia($this->env)); + + if (! empty($mediaQueries)) { + $previousScope = $this->scope; + $parentScope = $this->mediaParent($this->scope); + + foreach ($mediaQueries as $mediaQuery) { + $this->scope = $this->makeOutputBlock(Type::T_MEDIA, [$mediaQuery]); + + $parentScope->children[] = $this->scope; + $parentScope = $this->scope; + } + + // top level properties in a media cause it to be wrapped + $needsWrap = false; + + foreach ($media->children as $child) { + $type = $child[0]; + + if ( + $type !== Type::T_BLOCK && + $type !== Type::T_MEDIA && + $type !== Type::T_DIRECTIVE && + $type !== Type::T_IMPORT + ) { + $needsWrap = true; + break; + } + } + + if ($needsWrap) { + $wrapped = new Block(); + $wrapped->sourceName = $media->sourceName; + $wrapped->sourceIndex = $media->sourceIndex; + $wrapped->sourceLine = $media->sourceLine; + $wrapped->sourceColumn = $media->sourceColumn; + $wrapped->selectors = []; + $wrapped->comments = []; + $wrapped->parent = $media; + $wrapped->children = $media->children; + + $media->children = [[Type::T_BLOCK, $wrapped]]; + } + + $this->compileChildrenNoReturn($media->children, $this->scope); + + $this->scope = $previousScope; + } + + $this->popEnv(); + } + + /** + * Media parent + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope + * + * @return \ScssPhp\ScssPhp\Formatter\OutputBlock + */ + protected function mediaParent(OutputBlock $scope) + { + while (! empty($scope->parent)) { + if (! empty($scope->type) && $scope->type !== Type::T_MEDIA) { + break; + } + + $scope = $scope->parent; + } + + return $scope; + } + + /** + * Compile directive + * + * @param \ScssPhp\ScssPhp\Block|array $directive + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * + * @return void + */ + protected function compileDirective($directive, OutputBlock $out) + { + if (\is_array($directive)) { + $directiveName = $this->compileDirectiveName($directive[0]); + $s = '@' . $directiveName; + + if (! empty($directive[1])) { + $s .= ' ' . $this->compileValue($directive[1]); + } + // sass-spec compliance on newline after directives, a bit tricky :/ + $appendNewLine = (! empty($directive[2]) || strpos($s, "\n")) ? "\n" : ""; + if (\is_array($directive[0]) && empty($directive[1])) { + $appendNewLine = "\n"; + } + + if (empty($directive[3])) { + $this->appendRootDirective($s . ';' . $appendNewLine, $out, [Type::T_COMMENT, Type::T_DIRECTIVE]); + } else { + $this->appendOutputLine($out, Type::T_DIRECTIVE, $s . ';'); + } + } else { + $directive->name = $this->compileDirectiveName($directive->name); + $s = '@' . $directive->name; + + if (! empty($directive->value)) { + $s .= ' ' . $this->compileValue($directive->value); + } + + if ($directive->name === 'keyframes' || substr($directive->name, -10) === '-keyframes') { + $this->compileKeyframeBlock($directive, [$s]); + } else { + $this->compileNestedBlock($directive, [$s]); + } + } + } + + /** + * directive names can include some interpolation + * + * @param string|array $directiveName + * @return string + * @throws CompilerException + */ + protected function compileDirectiveName($directiveName) + { + if (is_string($directiveName)) { + return $directiveName; + } + + return $this->compileValue($directiveName); + } + + /** + * Compile at-root + * + * @param \ScssPhp\ScssPhp\Block $block + * + * @return void + */ + protected function compileAtRoot(Block $block) + { + $env = $this->pushEnv($block); + $envs = $this->compactEnv($env); + list($with, $without) = $this->compileWith(isset($block->with) ? $block->with : null); + + // wrap inline selector + if ($block->selector) { + $wrapped = new Block(); + $wrapped->sourceName = $block->sourceName; + $wrapped->sourceIndex = $block->sourceIndex; + $wrapped->sourceLine = $block->sourceLine; + $wrapped->sourceColumn = $block->sourceColumn; + $wrapped->selectors = $block->selector; + $wrapped->comments = []; + $wrapped->parent = $block; + $wrapped->children = $block->children; + $wrapped->selfParent = $block->selfParent; + + $block->children = [[Type::T_BLOCK, $wrapped]]; + $block->selector = null; + } + + $selfParent = $block->selfParent; + assert($selfParent !== null, 'at-root blocks must have a selfParent set.'); + + if ( + ! $selfParent->selectors && + isset($block->parent) && $block->parent && + isset($block->parent->selectors) && $block->parent->selectors + ) { + $selfParent = $block->parent; + } + + $this->env = $this->filterWithWithout($envs, $with, $without); + + $saveScope = $this->scope; + $this->scope = $this->filterScopeWithWithout($saveScope, $with, $without); + + // propagate selfParent to the children where they still can be useful + $this->compileChildrenNoReturn($block->children, $this->scope, $selfParent); + + $this->scope = $this->completeScope($this->scope, $saveScope); + $this->scope = $saveScope; + $this->env = $this->extractEnv($envs); + + $this->popEnv(); + } + + /** + * Filter at-root scope depending of with/without option + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope + * @param array $with + * @param array $without + * + * @return OutputBlock + */ + protected function filterScopeWithWithout($scope, $with, $without) + { + $filteredScopes = []; + $childStash = []; + + if ($scope->type === Type::T_ROOT) { + return $scope; + } + + // start from the root + while ($scope->parent && $scope->parent->type !== Type::T_ROOT) { + array_unshift($childStash, $scope); + $scope = $scope->parent; + } + + for (;;) { + if (! $scope) { + break; + } + + if ($this->isWith($scope, $with, $without)) { + $s = clone $scope; + $s->children = []; + $s->lines = []; + $s->parent = null; + + if ($s->type !== Type::T_MEDIA && $s->type !== Type::T_DIRECTIVE) { + $s->selectors = []; + } + + $filteredScopes[] = $s; + } + + if (\count($childStash)) { + $scope = array_shift($childStash); + } elseif ($scope->children) { + $scope = end($scope->children); + } else { + $scope = null; + } + } + + if (! \count($filteredScopes)) { + return $this->rootBlock; + } + + $newScope = array_shift($filteredScopes); + $newScope->parent = $this->rootBlock; + + $this->rootBlock->children[] = $newScope; + + $p = &$newScope; + + while (\count($filteredScopes)) { + $s = array_shift($filteredScopes); + $s->parent = $p; + $p->children[] = $s; + $newScope = &$p->children[0]; + $p = &$p->children[0]; + } + + return $newScope; + } + + /** + * found missing selector from a at-root compilation in the previous scope + * (if at-root is just enclosing a property, the selector is in the parent tree) + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $previousScope + * + * @return OutputBlock + */ + protected function completeScope($scope, $previousScope) + { + if (! $scope->type && (! $scope->selectors || ! \count($scope->selectors)) && \count($scope->lines)) { + $scope->selectors = $this->findScopeSelectors($previousScope, $scope->depth); + } + + if ($scope->children) { + foreach ($scope->children as $k => $c) { + $scope->children[$k] = $this->completeScope($c, $previousScope); + } + } + + return $scope; + } + + /** + * Find a selector by the depth node in the scope + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope + * @param integer $depth + * + * @return array + */ + protected function findScopeSelectors($scope, $depth) + { + if ($scope->depth === $depth && $scope->selectors) { + return $scope->selectors; + } + + if ($scope->children) { + foreach (array_reverse($scope->children) as $c) { + if ($s = $this->findScopeSelectors($c, $depth)) { + return $s; + } + } + } + + return []; + } + + /** + * Compile @at-root's with: inclusion / without: exclusion into 2 lists uses to filter scope/env later + * + * @param array $withCondition + * + * @return array + */ + protected function compileWith($withCondition) + { + // just compile what we have in 2 lists + $with = []; + $without = ['rule' => true]; + + if ($withCondition) { + if ($withCondition[0] === Type::T_INTERPOLATE) { + $w = $this->compileValue($withCondition); + + $buffer = "($w)"; + $parser = $this->parserFactory(__METHOD__); + + if ($parser->parseValue($buffer, $reParsedWith)) { + $withCondition = $reParsedWith; + } + } + + if ($this->mapHasKey($withCondition, static::$with)) { + $without = []; // cancel the default + $list = $this->coerceList($this->libMapGet([$withCondition, static::$with])); + + foreach ($list[2] as $item) { + $keyword = $this->compileStringContent($this->coerceString($item)); + + $with[$keyword] = true; + } + } + + if ($this->mapHasKey($withCondition, static::$without)) { + $without = []; // cancel the default + $list = $this->coerceList($this->libMapGet([$withCondition, static::$without])); + + foreach ($list[2] as $item) { + $keyword = $this->compileStringContent($this->coerceString($item)); + + $without[$keyword] = true; + } + } + } + + return [$with, $without]; + } + + /** + * Filter env stack + * + * @param Environment[] $envs + * @param array $with + * @param array $without + * + * @return Environment + * + * @phpstan-param non-empty-array $envs + */ + protected function filterWithWithout($envs, $with, $without) + { + $filtered = []; + + foreach ($envs as $e) { + if ($e->block && ! $this->isWith($e->block, $with, $without)) { + $ec = clone $e; + $ec->block = null; + $ec->selectors = []; + + $filtered[] = $ec; + } else { + $filtered[] = $e; + } + } + + return $this->extractEnv($filtered); + } + + /** + * Filter WITH rules + * + * @param \ScssPhp\ScssPhp\Block|\ScssPhp\ScssPhp\Formatter\OutputBlock $block + * @param array $with + * @param array $without + * + * @return boolean + */ + protected function isWith($block, $with, $without) + { + if (isset($block->type)) { + if ($block->type === Type::T_MEDIA) { + return $this->testWithWithout('media', $with, $without); + } + + if ($block->type === Type::T_DIRECTIVE) { + if (isset($block->name)) { + return $this->testWithWithout($this->compileDirectiveName($block->name), $with, $without); + } elseif (isset($block->selectors) && preg_match(',@(\w+),ims', json_encode($block->selectors), $m)) { + return $this->testWithWithout($m[1], $with, $without); + } else { + return $this->testWithWithout('???', $with, $without); + } + } + } elseif (isset($block->selectors)) { + // a selector starting with number is a keyframe rule + if (\count($block->selectors)) { + $s = reset($block->selectors); + + while (\is_array($s)) { + $s = reset($s); + } + + if (\is_object($s) && $s instanceof Number) { + return $this->testWithWithout('keyframes', $with, $without); + } + } + + return $this->testWithWithout('rule', $with, $without); + } + + return true; + } + + /** + * Test a single type of block against with/without lists + * + * @param string $what + * @param array $with + * @param array $without + * + * @return boolean + * true if the block should be kept, false to reject + */ + protected function testWithWithout($what, $with, $without) + { + // if without, reject only if in the list (or 'all' is in the list) + if (\count($without)) { + return (isset($without[$what]) || isset($without['all'])) ? false : true; + } + + // otherwise reject all what is not in the with list + return (isset($with[$what]) || isset($with['all'])) ? true : false; + } + + + /** + * Compile keyframe block + * + * @param \ScssPhp\ScssPhp\Block $block + * @param string[] $selectors + * + * @return void + */ + protected function compileKeyframeBlock(Block $block, $selectors) + { + $env = $this->pushEnv($block); + + $envs = $this->compactEnv($env); + + $this->env = $this->extractEnv(array_filter($envs, function (Environment $e) { + return ! isset($e->block->selectors); + })); + + $this->scope = $this->makeOutputBlock($block->type, $selectors); + $this->scope->depth = 1; + $this->scope->parent->children[] = $this->scope; + + $this->compileChildrenNoReturn($block->children, $this->scope); + + $this->scope = $this->scope->parent; + $this->env = $this->extractEnv($envs); + + $this->popEnv(); + } + + /** + * Compile nested properties lines + * + * @param \ScssPhp\ScssPhp\Block $block + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * + * @return void + */ + protected function compileNestedPropertiesBlock(Block $block, OutputBlock $out) + { + $prefix = $this->compileValue($block->prefix) . '-'; + + $nested = $this->makeOutputBlock($block->type); + $nested->parent = $out; + + if ($block->hasValue) { + $nested->depth = $out->depth + 1; + } + + $out->children[] = $nested; + + foreach ($block->children as $child) { + switch ($child[0]) { + case Type::T_ASSIGN: + array_unshift($child[1][2], $prefix); + break; + + case Type::T_NESTED_PROPERTY: + array_unshift($child[1]->prefix[2], $prefix); + break; + } + + $this->compileChild($child, $nested); + } + } + + /** + * Compile nested block + * + * @param \ScssPhp\ScssPhp\Block $block + * @param string[] $selectors + * + * @return void + */ + protected function compileNestedBlock(Block $block, $selectors) + { + $this->pushEnv($block); + + $this->scope = $this->makeOutputBlock($block->type, $selectors); + $this->scope->parent->children[] = $this->scope; + + // wrap assign children in a block + // except for @font-face + if ($block->type !== Type::T_DIRECTIVE || $this->compileDirectiveName($block->name) !== 'font-face') { + // need wrapping? + $needWrapping = false; + + foreach ($block->children as $child) { + if ($child[0] === Type::T_ASSIGN) { + $needWrapping = true; + break; + } + } + + if ($needWrapping) { + $wrapped = new Block(); + $wrapped->sourceName = $block->sourceName; + $wrapped->sourceIndex = $block->sourceIndex; + $wrapped->sourceLine = $block->sourceLine; + $wrapped->sourceColumn = $block->sourceColumn; + $wrapped->selectors = []; + $wrapped->comments = []; + $wrapped->parent = $block; + $wrapped->children = $block->children; + $wrapped->selfParent = $block->selfParent; + + $block->children = [[Type::T_BLOCK, $wrapped]]; + } + } + + $this->compileChildrenNoReturn($block->children, $this->scope); + + $this->scope = $this->scope->parent; + + $this->popEnv(); + } + + /** + * Recursively compiles a block. + * + * A block is analogous to a CSS block in most cases. A single SCSS document + * is encapsulated in a block when parsed, but it does not have parent tags + * so all of its children appear on the root level when compiled. + * + * Blocks are made up of selectors and children. + * + * The children of a block are just all the blocks that are defined within. + * + * Compiling the block involves pushing a fresh environment on the stack, + * and iterating through the props, compiling each one. + * + * @see Compiler::compileChild() + * + * @param \ScssPhp\ScssPhp\Block $block + * + * @return void + */ + protected function compileBlock(Block $block) + { + $env = $this->pushEnv($block); + $env->selectors = $this->evalSelectors($block->selectors); + + $out = $this->makeOutputBlock(null); + + $this->scope->children[] = $out; + + if (\count($block->children)) { + $out->selectors = $this->multiplySelectors($env, $block->selfParent); + + // propagate selfParent to the children where they still can be useful + $selfParentSelectors = null; + + if (isset($block->selfParent->selectors)) { + $selfParentSelectors = $block->selfParent->selectors; + $block->selfParent->selectors = $out->selectors; + } + + $this->compileChildrenNoReturn($block->children, $out, $block->selfParent); + + // and revert for the following children of the same block + if ($selfParentSelectors) { + $block->selfParent->selectors = $selfParentSelectors; + } + } + + $this->popEnv(); + } + + + /** + * Compile the value of a comment that can have interpolation + * + * @param array $value + * @param boolean $pushEnv + * + * @return string + */ + protected function compileCommentValue($value, $pushEnv = false) + { + $c = $value[1]; + + if (isset($value[2])) { + if ($pushEnv) { + $this->pushEnv(); + } + + try { + $c = $this->compileValue($value[2]); + } catch (SassScriptException $e) { + $this->logger->warn('Ignoring interpolation errors in multiline comments is deprecated and will be removed in ScssPhp 2.0. ' . $this->addLocationToMessage($e->getMessage()), true); + // ignore error in comment compilation which are only interpolation + } catch (SassException $e) { + $this->logger->warn('Ignoring interpolation errors in multiline comments is deprecated and will be removed in ScssPhp 2.0. ' . $e->getMessage(), true); + // ignore error in comment compilation which are only interpolation + } + + if ($pushEnv) { + $this->popEnv(); + } + } + + return $c; + } + + /** + * Compile root level comment + * + * @param array $block + * + * @return void + */ + protected function compileComment($block) + { + $out = $this->makeOutputBlock(Type::T_COMMENT); + $out->lines[] = $this->compileCommentValue($block, true); + + $this->scope->children[] = $out; + } + + /** + * Evaluate selectors + * + * @param array $selectors + * + * @return array + */ + protected function evalSelectors($selectors) + { + $this->shouldEvaluate = false; + + $selectors = array_map([$this, 'evalSelector'], $selectors); + + // after evaluating interpolates, we might need a second pass + if ($this->shouldEvaluate) { + $selectors = $this->replaceSelfSelector($selectors, '&'); + $buffer = $this->collapseSelectors($selectors); + $parser = $this->parserFactory(__METHOD__); + + try { + $isValid = $parser->parseSelector($buffer, $newSelectors, true); + } catch (ParserException $e) { + throw $this->error($e->getMessage()); + } + + if ($isValid) { + $selectors = array_map([$this, 'evalSelector'], $newSelectors); + } + } + + return $selectors; + } + + /** + * Evaluate selector + * + * @param array $selector + * + * @return array + */ + protected function evalSelector($selector) + { + return array_map([$this, 'evalSelectorPart'], $selector); + } + + /** + * Evaluate selector part; replaces all the interpolates, stripping quotes + * + * @param array $part + * + * @return array + */ + protected function evalSelectorPart($part) + { + foreach ($part as &$p) { + if (\is_array($p) && ($p[0] === Type::T_INTERPOLATE || $p[0] === Type::T_STRING)) { + $p = $this->compileValue($p); + + // force re-evaluation if self char or non standard char + if (preg_match(',[^\w-],', $p)) { + $this->shouldEvaluate = true; + } + } elseif ( + \is_string($p) && \strlen($p) >= 2 && + ($first = $p[0]) && ($first === '"' || $first === "'") && + substr($p, -1) === $first + ) { + $p = substr($p, 1, -1); + } + } + + return $this->flattenSelectorSingle($part); + } + + /** + * Collapse selectors + * + * @param array $selectors + * + * @return string + */ + protected function collapseSelectors($selectors) + { + $parts = []; + + foreach ($selectors as $selector) { + $output = []; + + foreach ($selector as $node) { + $compound = ''; + + array_walk_recursive( + $node, + function ($value, $key) use (&$compound) { + $compound .= $value; + } + ); + + $output[] = $compound; + } + + $parts[] = implode(' ', $output); + } + + return implode(', ', $parts); + } + + /** + * Collapse selectors + * + * @param array $selectors + * + * @return array + */ + private function collapseSelectorsAsList($selectors) + { + $parts = []; + + foreach ($selectors as $selector) { + $output = []; + $glueNext = false; + + foreach ($selector as $node) { + $compound = ''; + + array_walk_recursive( + $node, + function ($value, $key) use (&$compound) { + $compound .= $value; + } + ); + + if ($this->isImmediateRelationshipCombinator($compound)) { + if (\count($output)) { + $output[\count($output) - 1] .= ' ' . $compound; + } else { + $output[] = $compound; + } + + $glueNext = true; + } elseif ($glueNext) { + $output[\count($output) - 1] .= ' ' . $compound; + $glueNext = false; + } else { + $output[] = $compound; + } + } + + foreach ($output as &$o) { + $o = [Type::T_STRING, '', [$o]]; + } + + $parts[] = [Type::T_LIST, ' ', $output]; + } + + return [Type::T_LIST, ',', $parts]; + } + + /** + * Parse down the selector and revert [self] to "&" before a reparsing + * + * @param array $selectors + * @param string|null $replace + * + * @return array + */ + protected function replaceSelfSelector($selectors, $replace = null) + { + foreach ($selectors as &$part) { + if (\is_array($part)) { + if ($part === [Type::T_SELF]) { + if (\is_null($replace)) { + $replace = $this->reduce([Type::T_SELF]); + $replace = $this->compileValue($replace); + } + $part = $replace; + } else { + $part = $this->replaceSelfSelector($part, $replace); + } + } + } + + return $selectors; + } + + /** + * Flatten selector single; joins together .classes and #ids + * + * @param array $single + * + * @return array + */ + protected function flattenSelectorSingle($single) + { + $joined = []; + + foreach ($single as $part) { + if ( + empty($joined) || + ! \is_string($part) || + preg_match('/[\[.:#%]/', $part) + ) { + $joined[] = $part; + continue; + } + + if (\is_array(end($joined))) { + $joined[] = $part; + } else { + $joined[\count($joined) - 1] .= $part; + } + } + + return $joined; + } + + /** + * Compile selector to string; self(&) should have been replaced by now + * + * @param string|array $selector + * + * @return string + */ + protected function compileSelector($selector) + { + if (! \is_array($selector)) { + return $selector; // media and the like + } + + return implode( + ' ', + array_map( + [$this, 'compileSelectorPart'], + $selector + ) + ); + } + + /** + * Compile selector part + * + * @param array $piece + * + * @return string + */ + protected function compileSelectorPart($piece) + { + foreach ($piece as &$p) { + if (! \is_array($p)) { + continue; + } + + switch ($p[0]) { + case Type::T_SELF: + $p = '&'; + break; + + default: + $p = $this->compileValue($p); + break; + } + } + + return implode($piece); + } + + /** + * Has selector placeholder? + * + * @param array $selector + * + * @return boolean + */ + protected function hasSelectorPlaceholder($selector) + { + if (! \is_array($selector)) { + return false; + } + + foreach ($selector as $parts) { + foreach ($parts as $part) { + if (\strlen($part) && '%' === $part[0]) { + return true; + } + } + } + + return false; + } + + /** + * @param string $name + * + * @return void + */ + protected function pushCallStack($name = '') + { + $this->callStack[] = [ + 'n' => $name, + Parser::SOURCE_INDEX => $this->sourceIndex, + Parser::SOURCE_LINE => $this->sourceLine, + Parser::SOURCE_COLUMN => $this->sourceColumn + ]; + + // infinite calling loop + if (\count($this->callStack) > 25000) { + // not displayed but you can var_dump it to deep debug + $msg = $this->callStackMessage(true, 100); + $msg = 'Infinite calling loop'; + + throw $this->error($msg); + } + } + + /** + * @return void + */ + protected function popCallStack() + { + array_pop($this->callStack); + } + + /** + * Compile children and return result + * + * @param array $stms + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * @param string $traceName + * + * @return array|Number|null + */ + protected function compileChildren($stms, OutputBlock $out, $traceName = '') + { + $this->pushCallStack($traceName); + + foreach ($stms as $stm) { + $ret = $this->compileChild($stm, $out); + + if (isset($ret)) { + $this->popCallStack(); + + return $ret; + } + } + + $this->popCallStack(); + + return null; + } + + /** + * Compile children and throw exception if unexpected `@return` + * + * @param array $stms + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * @param \ScssPhp\ScssPhp\Block $selfParent + * @param string $traceName + * + * @return void + * + * @throws \Exception + */ + protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '') + { + $this->pushCallStack($traceName); + + foreach ($stms as $stm) { + if ($selfParent && isset($stm[1]) && \is_object($stm[1]) && $stm[1] instanceof Block) { + $stm[1]->selfParent = $selfParent; + $ret = $this->compileChild($stm, $out); + $stm[1]->selfParent = null; + } elseif ($selfParent && \in_array($stm[0], [Type::T_INCLUDE, Type::T_EXTEND])) { + $stm['selfParent'] = $selfParent; + $ret = $this->compileChild($stm, $out); + unset($stm['selfParent']); + } else { + $ret = $this->compileChild($stm, $out); + } + + if (isset($ret)) { + throw $this->error('@return may only be used within a function'); + } + } + + $this->popCallStack(); + } + + + /** + * evaluate media query : compile internal value keeping the structure unchanged + * + * @param array $queryList + * + * @return array + */ + protected function evaluateMediaQuery($queryList) + { + static $parser = null; + + $outQueryList = []; + + foreach ($queryList as $kql => $query) { + $shouldReparse = false; + + foreach ($query as $kq => $q) { + for ($i = 1; $i < \count($q); $i++) { + $value = $this->compileValue($q[$i]); + + // the parser had no mean to know if media type or expression if it was an interpolation + // so you need to reparse if the T_MEDIA_TYPE looks like anything else a media type + if ( + $q[0] == Type::T_MEDIA_TYPE && + (strpos($value, '(') !== false || + strpos($value, ')') !== false || + strpos($value, ':') !== false || + strpos($value, ',') !== false) + ) { + $shouldReparse = true; + } + + $queryList[$kql][$kq][$i] = [Type::T_KEYWORD, $value]; + } + } + + if ($shouldReparse) { + if (\is_null($parser)) { + $parser = $this->parserFactory(__METHOD__); + } + + $queryString = $this->compileMediaQuery([$queryList[$kql]]); + $queryString = reset($queryString); + + if (strpos($queryString, '@media ') === 0) { + $queryString = substr($queryString, 7); + $queries = []; + + if ($parser->parseMediaQueryList($queryString, $queries)) { + $queries = $this->evaluateMediaQuery($queries[2]); + + while (\count($queries)) { + $outQueryList[] = array_shift($queries); + } + + continue; + } + } + } + + $outQueryList[] = $queryList[$kql]; + } + + return $outQueryList; + } + + /** + * Compile media query + * + * @param array $queryList + * + * @return string[] + */ + protected function compileMediaQuery($queryList) + { + $start = '@media '; + $default = trim($start); + $out = []; + $current = ''; + + foreach ($queryList as $query) { + $type = null; + $parts = []; + + $mediaTypeOnly = true; + + foreach ($query as $q) { + if ($q[0] !== Type::T_MEDIA_TYPE) { + $mediaTypeOnly = false; + break; + } + } + + foreach ($query as $q) { + switch ($q[0]) { + case Type::T_MEDIA_TYPE: + $newType = array_map([$this, 'compileValue'], \array_slice($q, 1)); + + // combining not and anything else than media type is too risky and should be avoided + if (! $mediaTypeOnly) { + if (\in_array(Type::T_NOT, $newType) || ($type && \in_array(Type::T_NOT, $type) )) { + if ($type) { + array_unshift($parts, implode(' ', array_filter($type))); + } + + if (! empty($parts)) { + if (\strlen($current)) { + $current .= $this->formatter->tagSeparator; + } + + $current .= implode(' and ', $parts); + } + + if ($current) { + $out[] = $start . $current; + } + + $current = ''; + $type = null; + $parts = []; + } + } + + if ($newType === ['all'] && $default) { + $default = $start . 'all'; + } + + // all can be safely ignored and mixed with whatever else + if ($newType !== ['all']) { + if ($type) { + $type = $this->mergeMediaTypes($type, $newType); + + if (empty($type)) { + // merge failed : ignore this query that is not valid, skip to the next one + $parts = []; + $default = ''; // if everything fail, no @media at all + continue 3; + } + } else { + $type = $newType; + } + } + break; + + case Type::T_MEDIA_EXPRESSION: + if (isset($q[2])) { + $parts[] = '(' + . $this->compileValue($q[1]) + . $this->formatter->assignSeparator + . $this->compileValue($q[2]) + . ')'; + } else { + $parts[] = '(' + . $this->compileValue($q[1]) + . ')'; + } + break; + + case Type::T_MEDIA_VALUE: + $parts[] = $this->compileValue($q[1]); + break; + } + } + + if ($type) { + array_unshift($parts, implode(' ', array_filter($type))); + } + + if (! empty($parts)) { + if (\strlen($current)) { + $current .= $this->formatter->tagSeparator; + } + + $current .= implode(' and ', $parts); + } + } + + if ($current) { + $out[] = $start . $current; + } + + // no @media type except all, and no conflict? + if (! $out && $default) { + $out[] = $default; + } + + return $out; + } + + /** + * Merge direct relationships between selectors + * + * @param array $selectors1 + * @param array $selectors2 + * + * @return array + */ + protected function mergeDirectRelationships($selectors1, $selectors2) + { + if (empty($selectors1) || empty($selectors2)) { + return array_merge($selectors1, $selectors2); + } + + $part1 = end($selectors1); + $part2 = end($selectors2); + + if (! $this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) { + return array_merge($selectors1, $selectors2); + } + + $merged = []; + + do { + $part1 = array_pop($selectors1); + $part2 = array_pop($selectors2); + + if (! $this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) { + if ($this->isImmediateRelationshipCombinator(reset($merged)[0])) { + array_unshift($merged, [$part1[0] . $part2[0]]); + $merged = array_merge($selectors1, $selectors2, $merged); + } else { + $merged = array_merge($selectors1, [$part1], $selectors2, [$part2], $merged); + } + + break; + } + + array_unshift($merged, $part1); + } while (! empty($selectors1) && ! empty($selectors2)); + + return $merged; + } + + /** + * Merge media types + * + * @param array $type1 + * @param array $type2 + * + * @return array|null + */ + protected function mergeMediaTypes($type1, $type2) + { + if (empty($type1)) { + return $type2; + } + + if (empty($type2)) { + return $type1; + } + + if (\count($type1) > 1) { + $m1 = strtolower($type1[0]); + $t1 = strtolower($type1[1]); + } else { + $m1 = ''; + $t1 = strtolower($type1[0]); + } + + if (\count($type2) > 1) { + $m2 = strtolower($type2[0]); + $t2 = strtolower($type2[1]); + } else { + $m2 = ''; + $t2 = strtolower($type2[0]); + } + + if (($m1 === Type::T_NOT) ^ ($m2 === Type::T_NOT)) { + if ($t1 === $t2) { + return null; + } + + return [ + $m1 === Type::T_NOT ? $m2 : $m1, + $m1 === Type::T_NOT ? $t2 : $t1, + ]; + } + + if ($m1 === Type::T_NOT && $m2 === Type::T_NOT) { + // CSS has no way of representing "neither screen nor print" + if ($t1 !== $t2) { + return null; + } + + return [Type::T_NOT, $t1]; + } + + if ($t1 !== $t2) { + return null; + } + + // t1 == t2, neither m1 nor m2 are "not" + return [empty($m1) ? $m2 : $m1, $t1]; + } + + /** + * Compile import; returns true if the value was something that could be imported + * + * @param array $rawPath + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * @param boolean $once + * + * @return boolean + */ + protected function compileImport($rawPath, OutputBlock $out, $once = false) + { + if ($rawPath[0] === Type::T_STRING) { + $path = $this->compileStringContent($rawPath); + + if (strpos($path, 'url(') !== 0 && $filePath = $this->findImport($path, $this->currentDirectory)) { + $this->registerImport($this->currentDirectory, $path, $filePath); + + if (! $once || ! \in_array($filePath, $this->importedFiles)) { + $this->importFile($filePath, $out); + $this->importedFiles[] = $filePath; + } + + return true; + } + + $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out); + + return false; + } + + if ($rawPath[0] === Type::T_LIST) { + // handle a list of strings + if (\count($rawPath[2]) === 0) { + return false; + } + + foreach ($rawPath[2] as $path) { + if ($path[0] !== Type::T_STRING) { + $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out); + + return false; + } + } + + foreach ($rawPath[2] as $path) { + $this->compileImport($path, $out, $once); + } + + return true; + } + + $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out); + + return false; + } + + /** + * @param array $rawPath + * @return string + * @throws CompilerException + */ + protected function compileImportPath($rawPath) + { + $path = $this->compileValue($rawPath); + + // case url() without quotes : suppress \r \n remaining in the path + // if this is a real string there can not be CR or LF char + if (strpos($path, 'url(') === 0) { + $path = str_replace(array("\r", "\n"), array('', ' '), $path); + } else { + // if this is a file name in a string, spaces should be escaped + $path = $this->reduce($rawPath); + $path = $this->escapeImportPathString($path); + $path = $this->compileValue($path); + } + + return $path; + } + + /** + * @param array $path + * @return array + * @throws CompilerException + */ + protected function escapeImportPathString($path) + { + switch ($path[0]) { + case Type::T_LIST: + foreach ($path[2] as $k => $v) { + $path[2][$k] = $this->escapeImportPathString($v); + } + break; + case Type::T_STRING: + if ($path[1]) { + $path = $this->compileValue($path); + $path = str_replace(' ', '\\ ', $path); + $path = [Type::T_KEYWORD, $path]; + } + break; + } + + return $path; + } + + /** + * Append a root directive like @import or @charset as near as the possible from the source code + * (keeping before comments, @import and @charset coming before in the source code) + * + * @param string $line + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * @param array $allowed + * + * @return void + */ + protected function appendRootDirective($line, $out, $allowed = [Type::T_COMMENT]) + { + $root = $out; + + while ($root->parent) { + $root = $root->parent; + } + + $i = 0; + + while ($i < \count($root->children)) { + if (! isset($root->children[$i]->type) || ! \in_array($root->children[$i]->type, $allowed)) { + break; + } + + $i++; + } + + // remove incompatible children from the bottom of the list + $saveChildren = []; + + while ($i < \count($root->children)) { + $saveChildren[] = array_pop($root->children); + } + + // insert the directive as a comment + $child = $this->makeOutputBlock(Type::T_COMMENT); + $child->lines[] = $line; + $child->sourceName = $this->sourceNames[$this->sourceIndex]; + $child->sourceLine = $this->sourceLine; + $child->sourceColumn = $this->sourceColumn; + + $root->children[] = $child; + + // repush children + while (\count($saveChildren)) { + $root->children[] = array_pop($saveChildren); + } + } + + /** + * Append lines to the current output block: + * directly to the block or through a child if necessary + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * @param string $type + * @param string $line + * + * @return void + */ + protected function appendOutputLine(OutputBlock $out, $type, $line) + { + $outWrite = &$out; + + // check if it's a flat output or not + if (\count($out->children)) { + $lastChild = &$out->children[\count($out->children) - 1]; + + if ( + $lastChild->depth === $out->depth && + \is_null($lastChild->selectors) && + ! \count($lastChild->children) + ) { + $outWrite = $lastChild; + } else { + $nextLines = $this->makeOutputBlock($type); + $nextLines->parent = $out; + $nextLines->depth = $out->depth; + + $out->children[] = $nextLines; + $outWrite = &$nextLines; + } + } + + $outWrite->lines[] = $line; + } + + /** + * Compile child; returns a value to halt execution + * + * @param array $child + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * + * @return array|Number|null + */ + protected function compileChild($child, OutputBlock $out) + { + if (isset($child[Parser::SOURCE_LINE])) { + $this->sourceIndex = isset($child[Parser::SOURCE_INDEX]) ? $child[Parser::SOURCE_INDEX] : null; + $this->sourceLine = isset($child[Parser::SOURCE_LINE]) ? $child[Parser::SOURCE_LINE] : -1; + $this->sourceColumn = isset($child[Parser::SOURCE_COLUMN]) ? $child[Parser::SOURCE_COLUMN] : -1; + } elseif (\is_array($child) && isset($child[1]->sourceLine)) { + $this->sourceIndex = $child[1]->sourceIndex; + $this->sourceLine = $child[1]->sourceLine; + $this->sourceColumn = $child[1]->sourceColumn; + } elseif (! empty($out->sourceLine) && ! empty($out->sourceName)) { + $this->sourceLine = $out->sourceLine; + $sourceIndex = array_search($out->sourceName, $this->sourceNames); + $this->sourceColumn = $out->sourceColumn; + + if ($sourceIndex === false) { + $sourceIndex = null; + } + $this->sourceIndex = $sourceIndex; + } + + switch ($child[0]) { + case Type::T_SCSSPHP_IMPORT_ONCE: + $rawPath = $this->reduce($child[1]); + + $this->compileImport($rawPath, $out, true); + break; + + case Type::T_IMPORT: + $rawPath = $this->reduce($child[1]); + + $this->compileImport($rawPath, $out); + break; + + case Type::T_DIRECTIVE: + $this->compileDirective($child[1], $out); + break; + + case Type::T_AT_ROOT: + $this->compileAtRoot($child[1]); + break; + + case Type::T_MEDIA: + $this->compileMedia($child[1]); + break; + + case Type::T_BLOCK: + $this->compileBlock($child[1]); + break; + + case Type::T_CHARSET: + break; + + case Type::T_CUSTOM_PROPERTY: + list(, $name, $value) = $child; + $compiledName = $this->compileValue($name); + + // if the value reduces to null from something else then + // the property should be discarded + if ($value[0] !== Type::T_NULL) { + $value = $this->reduce($value); + + if ($value[0] === Type::T_NULL || $value === static::$nullString) { + break; + } + } + + $compiledValue = $this->compileValue($value); + + $line = $this->formatter->customProperty( + $compiledName, + $compiledValue + ); + + $this->appendOutputLine($out, Type::T_ASSIGN, $line); + break; + + case Type::T_ASSIGN: + list(, $name, $value) = $child; + + if ($name[0] === Type::T_VARIABLE) { + $flags = isset($child[3]) ? $child[3] : []; + $isDefault = \in_array('!default', $flags); + $isGlobal = \in_array('!global', $flags); + + if ($isGlobal) { + $this->set($name[1], $this->reduce($value), false, $this->rootEnv, $value); + break; + } + + $shouldSet = $isDefault && + (\is_null($result = $this->get($name[1], false)) || + $result === static::$null); + + if (! $isDefault || $shouldSet) { + $this->set($name[1], $this->reduce($value), true, null, $value); + } + break; + } + + $compiledName = $this->compileValue($name); + + // handle shorthand syntaxes : size / line-height... + if (\in_array($compiledName, ['font', 'grid-row', 'grid-column', 'border-radius'])) { + if ($value[0] === Type::T_VARIABLE) { + // if the font value comes from variable, the content is already reduced + // (i.e., formulas were already calculated), so we need the original unreduced value + $value = $this->get($value[1], true, null, true); + } + + $shorthandValue=&$value; + + $shorthandDividerNeedsUnit = false; + $maxListElements = null; + $maxShorthandDividers = 1; + + switch ($compiledName) { + case 'border-radius': + $maxListElements = 4; + $shorthandDividerNeedsUnit = true; + break; + } + + if ($compiledName === 'font' && $value[0] === Type::T_LIST && $value[1] === ',') { + // this is the case if more than one font is given: example: "font: 400 1em/1.3 arial,helvetica" + // we need to handle the first list element + $shorthandValue=&$value[2][0]; + } + + if ($shorthandValue[0] === Type::T_EXPRESSION && $shorthandValue[1] === '/') { + $revert = true; + + if ($shorthandDividerNeedsUnit) { + $divider = $shorthandValue[3]; + + if (\is_array($divider)) { + $divider = $this->reduce($divider, true); + } + + if ($divider instanceof Number && \intval($divider->getDimension()) && $divider->unitless()) { + $revert = false; + } + } + + if ($revert) { + $shorthandValue = $this->expToString($shorthandValue); + } + } elseif ($shorthandValue[0] === Type::T_LIST) { + foreach ($shorthandValue[2] as &$item) { + if ($item[0] === Type::T_EXPRESSION && $item[1] === '/') { + if ($maxShorthandDividers > 0) { + $revert = true; + + // if the list of values is too long, this has to be a shorthand, + // otherwise it could be a real division + if (\is_null($maxListElements) || \count($shorthandValue[2]) <= $maxListElements) { + if ($shorthandDividerNeedsUnit) { + $divider = $item[3]; + + if (\is_array($divider)) { + $divider = $this->reduce($divider, true); + } + + if ($divider instanceof Number && \intval($divider->getDimension()) && $divider->unitless()) { + $revert = false; + } + } + } + + if ($revert) { + $item = $this->expToString($item); + $maxShorthandDividers--; + } + } + } + } + } + } + + // if the value reduces to null from something else then + // the property should be discarded + if ($value[0] !== Type::T_NULL) { + $value = $this->reduce($value); + + if ($value[0] === Type::T_NULL || $value === static::$nullString) { + break; + } + } + + $compiledValue = $this->compileValue($value); + + // ignore empty value + if (\strlen($compiledValue)) { + $line = $this->formatter->property( + $compiledName, + $compiledValue + ); + $this->appendOutputLine($out, Type::T_ASSIGN, $line); + } + break; + + case Type::T_COMMENT: + if ($out->type === Type::T_ROOT) { + $this->compileComment($child); + break; + } + + $line = $this->compileCommentValue($child, true); + $this->appendOutputLine($out, Type::T_COMMENT, $line); + break; + + case Type::T_MIXIN: + case Type::T_FUNCTION: + list(, $block) = $child; + // the block need to be able to go up to it's parent env to resolve vars + $block->parentEnv = $this->getStoreEnv(); + $this->set(static::$namespaces[$block->type] . $block->name, $block, true); + break; + + case Type::T_EXTEND: + foreach ($child[1] as $sel) { + $replacedSel = $this->replaceSelfSelector($sel); + + if ($replacedSel !== $sel) { + throw $this->error('Parent selectors aren\'t allowed here.'); + } + + $results = $this->evalSelectors([$sel]); + + foreach ($results as $result) { + if (\count($result) !== 1) { + throw $this->error('complex selectors may not be extended.'); + } + + // only use the first one + $result = $result[0]; + $selectors = $out->selectors; + + if (! $selectors && isset($child['selfParent'])) { + $selectors = $this->multiplySelectors($this->env, $child['selfParent']); + } + + if (\count($result) > 1) { + $replacement = implode(', ', $result); + $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); + $line = $this->sourceLine; + + $message = <<logger->warn($message); + } + + $this->pushExtends($result, $selectors, $child); + } + } + break; + + case Type::T_IF: + list(, $if) = $child; + + if ($this->isTruthy($this->reduce($if->cond, true))) { + return $this->compileChildren($if->children, $out); + } + + foreach ($if->cases as $case) { + if ( + $case->type === Type::T_ELSE || + $case->type === Type::T_ELSEIF && $this->isTruthy($this->reduce($case->cond)) + ) { + return $this->compileChildren($case->children, $out); + } + } + break; + + case Type::T_EACH: + list(, $each) = $child; + + $list = $this->coerceList($this->reduce($each->list), ',', true); + + $this->pushEnv(); + + foreach ($list[2] as $item) { + if (\count($each->vars) === 1) { + $this->set($each->vars[0], $item, true); + } else { + list(,, $values) = $this->coerceList($item); + + foreach ($each->vars as $i => $var) { + $this->set($var, isset($values[$i]) ? $values[$i] : static::$null, true); + } + } + + $ret = $this->compileChildren($each->children, $out); + + if ($ret) { + $store = $this->env->store; + $this->popEnv(); + $this->backPropagateEnv($store, $each->vars); + + return $ret; + } + } + $store = $this->env->store; + $this->popEnv(); + $this->backPropagateEnv($store, $each->vars); + + break; + + case Type::T_WHILE: + list(, $while) = $child; + + while ($this->isTruthy($this->reduce($while->cond, true))) { + $ret = $this->compileChildren($while->children, $out); + + if ($ret) { + return $ret; + } + } + break; + + case Type::T_FOR: + list(, $for) = $child; + + $startNumber = $this->assertNumber($this->reduce($for->start, true)); + $endNumber = $this->assertNumber($this->reduce($for->end, true)); + + $start = $this->assertInteger($startNumber); + + $numeratorUnits = $startNumber->getNumeratorUnits(); + $denominatorUnits = $startNumber->getDenominatorUnits(); + + $end = $this->assertInteger($endNumber->coerce($numeratorUnits, $denominatorUnits)); + + $d = $start < $end ? 1 : -1; + + $this->pushEnv(); + + for (;;) { + if ( + (! $for->until && $start - $d == $end) || + ($for->until && $start == $end) + ) { + break; + } + + $this->set($for->var, new Number($start, $numeratorUnits, $denominatorUnits)); + $start += $d; + + $ret = $this->compileChildren($for->children, $out); + + if ($ret) { + $store = $this->env->store; + $this->popEnv(); + $this->backPropagateEnv($store, [$for->var]); + + return $ret; + } + } + + $store = $this->env->store; + $this->popEnv(); + $this->backPropagateEnv($store, [$for->var]); + + break; + + case Type::T_RETURN: + return $this->reduce($child[1], true); + + case Type::T_NESTED_PROPERTY: + $this->compileNestedPropertiesBlock($child[1], $out); + break; + + case Type::T_INCLUDE: + // including a mixin + list(, $name, $argValues, $content, $argUsing) = $child; + + $mixin = $this->get(static::$namespaces['mixin'] . $name, false); + + if (! $mixin) { + throw $this->error("Undefined mixin $name"); + } + + $callingScope = $this->getStoreEnv(); + + // push scope, apply args + $this->pushEnv(); + $this->env->depth--; + + // Find the parent selectors in the env to be able to know what '&' refers to in the mixin + // and assign this fake parent to childs + $selfParent = null; + + if (isset($child['selfParent']) && isset($child['selfParent']->selectors)) { + $selfParent = $child['selfParent']; + } else { + $parentSelectors = $this->multiplySelectors($this->env); + + if ($parentSelectors) { + $parent = new Block(); + $parent->selectors = $parentSelectors; + + foreach ($mixin->children as $k => $child) { + if (isset($child[1]) && \is_object($child[1]) && $child[1] instanceof Block) { + $mixin->children[$k][1]->parent = $parent; + } + } + } + } + + // clone the stored content to not have its scope spoiled by a further call to the same mixin + // i.e., recursive @include of the same mixin + if (isset($content)) { + $copyContent = clone $content; + $copyContent->scope = clone $callingScope; + + $this->setRaw(static::$namespaces['special'] . 'content', $copyContent, $this->env); + } else { + $this->setRaw(static::$namespaces['special'] . 'content', null, $this->env); + } + + // save the "using" argument list for applying it to when "@content" is invoked + if (isset($argUsing)) { + $this->setRaw(static::$namespaces['special'] . 'using', $argUsing, $this->env); + } else { + $this->setRaw(static::$namespaces['special'] . 'using', null, $this->env); + } + + if (isset($mixin->args)) { + $this->applyArguments($mixin->args, $argValues); + } + + $this->env->marker = 'mixin'; + + if (! empty($mixin->parentEnv)) { + $this->env->declarationScopeParent = $mixin->parentEnv; + } else { + throw $this->error("@mixin $name() without parentEnv"); + } + + $this->compileChildrenNoReturn($mixin->children, $out, $selfParent, $this->env->marker . ' ' . $name); + + $this->popEnv(); + break; + + case Type::T_MIXIN_CONTENT: + $env = isset($this->storeEnv) ? $this->storeEnv : $this->env; + $content = $this->get(static::$namespaces['special'] . 'content', false, $env); + $argUsing = $this->get(static::$namespaces['special'] . 'using', false, $env); + $argContent = $child[1]; + + if (! $content) { + break; + } + + $storeEnv = $this->storeEnv; + $varsUsing = []; + + if (isset($argUsing) && isset($argContent)) { + // Get the arguments provided for the content with the names provided in the "using" argument list + $this->storeEnv = null; + $varsUsing = $this->applyArguments($argUsing, $argContent, false); + } + + // restore the scope from the @content + $this->storeEnv = $content->scope; + + // append the vars from using if any + foreach ($varsUsing as $name => $val) { + $this->set($name, $val, true, $this->storeEnv); + } + + $this->compileChildrenNoReturn($content->children, $out); + + $this->storeEnv = $storeEnv; + break; + + case Type::T_DEBUG: + list(, $value) = $child; + + $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); + $line = $this->sourceLine; + $value = $this->compileDebugValue($value); + + $this->logger->debug("$fname:$line DEBUG: $value"); + break; + + case Type::T_WARN: + list(, $value) = $child; + + $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); + $line = $this->sourceLine; + $value = $this->compileDebugValue($value); + + $this->logger->warn("$value\n on line $line of $fname"); + break; + + case Type::T_ERROR: + list(, $value) = $child; + + $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); + $line = $this->sourceLine; + $value = $this->compileValue($this->reduce($value, true)); + + throw $this->error("File $fname on line $line ERROR: $value\n"); + + default: + throw $this->error("unknown child type: $child[0]"); + } + } + + /** + * Reduce expression to string + * + * @param array $exp + * @param bool $keepParens + * + * @return array + */ + protected function expToString($exp, $keepParens = false) + { + list(, $op, $left, $right, $inParens, $whiteLeft, $whiteRight) = $exp; + + $content = []; + + if ($keepParens && $inParens) { + $content[] = '('; + } + + $content[] = $this->reduce($left); + + if ($whiteLeft) { + $content[] = ' '; + } + + $content[] = $op; + + if ($whiteRight) { + $content[] = ' '; + } + + $content[] = $this->reduce($right); + + if ($keepParens && $inParens) { + $content[] = ')'; + } + + return [Type::T_STRING, '', $content]; + } + + /** + * Is truthy? + * + * @param array|Number $value + * + * @return boolean + */ + public function isTruthy($value) + { + return $value !== static::$false && $value !== static::$null; + } + + /** + * Is the value a direct relationship combinator? + * + * @param string $value + * + * @return boolean + */ + protected function isImmediateRelationshipCombinator($value) + { + return $value === '>' || $value === '+' || $value === '~'; + } + + /** + * Should $value cause its operand to eval + * + * @param array $value + * + * @return boolean + */ + protected function shouldEval($value) + { + switch ($value[0]) { + case Type::T_EXPRESSION: + if ($value[1] === '/') { + return $this->shouldEval($value[2]) || $this->shouldEval($value[3]); + } + + // fall-thru + case Type::T_VARIABLE: + case Type::T_FUNCTION_CALL: + return true; + } + + return false; + } + + /** + * Reduce value + * + * @param array|Number $value + * @param boolean $inExp + * + * @return array|Number + */ + protected function reduce($value, $inExp = false) + { + if ($value instanceof Number) { + return $value; + } + + switch ($value[0]) { + case Type::T_EXPRESSION: + list(, $op, $left, $right, $inParens) = $value; + + $opName = isset(static::$operatorNames[$op]) ? static::$operatorNames[$op] : $op; + $inExp = $inExp || $this->shouldEval($left) || $this->shouldEval($right); + + $left = $this->reduce($left, true); + + if ($op !== 'and' && $op !== 'or') { + $right = $this->reduce($right, true); + } + + // special case: looks like css shorthand + if ( + $opName == 'div' && ! $inParens && ! $inExp && + (($right[0] !== Type::T_NUMBER && isset($right[2]) && $right[2] != '') || + ($right[0] === Type::T_NUMBER && ! $right->unitless())) + ) { + return $this->expToString($value); + } + + $left = $this->coerceForExpression($left); + $right = $this->coerceForExpression($right); + $ltype = $left[0]; + $rtype = $right[0]; + + $ucOpName = ucfirst($opName); + $ucLType = ucfirst($ltype); + $ucRType = ucfirst($rtype); + + // this tries: + // 1. op[op name][left type][right type] + // 2. op[left type][right type] (passing the op as first arg + // 3. op[op name] + $fn = "op${ucOpName}${ucLType}${ucRType}"; + + if ( + \is_callable([$this, $fn]) || + (($fn = "op${ucLType}${ucRType}") && + \is_callable([$this, $fn]) && + $passOp = true) || + (($fn = "op${ucOpName}") && + \is_callable([$this, $fn]) && + $genOp = true) + ) { + $shouldEval = $inParens || $inExp; + + if (isset($passOp)) { + $out = $this->$fn($op, $left, $right, $shouldEval); + } else { + $out = $this->$fn($left, $right, $shouldEval); + } + + if (isset($out)) { + return $out; + } + } + + return $this->expToString($value); + + case Type::T_UNARY: + list(, $op, $exp, $inParens) = $value; + + $inExp = $inExp || $this->shouldEval($exp); + $exp = $this->reduce($exp); + + if ($exp instanceof Number) { + switch ($op) { + case '+': + return $exp; + + case '-': + return $exp->unaryMinus(); + } + } + + if ($op === 'not') { + if ($inExp || $inParens) { + if ($exp === static::$false || $exp === static::$null) { + return static::$true; + } + + return static::$false; + } + + $op = $op . ' '; + } + + return [Type::T_STRING, '', [$op, $exp]]; + + case Type::T_VARIABLE: + return $this->reduce($this->get($value[1])); + + case Type::T_LIST: + foreach ($value[2] as &$item) { + $item = $this->reduce($item); + } + unset($item); + + if (isset($value[3]) && \is_array($value[3])) { + foreach ($value[3] as &$item) { + $item = $this->reduce($item); + } + unset($item); + } + + return $value; + + case Type::T_MAP: + foreach ($value[1] as &$item) { + $item = $this->reduce($item); + } + + foreach ($value[2] as &$item) { + $item = $this->reduce($item); + } + + return $value; + + case Type::T_STRING: + foreach ($value[2] as &$item) { + if (\is_array($item) || $item instanceof Number) { + $item = $this->reduce($item); + } + } + + return $value; + + case Type::T_INTERPOLATE: + $value[1] = $this->reduce($value[1]); + + if ($inExp) { + return [Type::T_KEYWORD, $this->compileValue($value, false)]; + } + + return $value; + + case Type::T_FUNCTION_CALL: + return $this->fncall($value[1], $value[2]); + + case Type::T_SELF: + $selfParent = ! empty($this->env->block->selfParent) ? $this->env->block->selfParent : null; + $selfSelector = $this->multiplySelectors($this->env, $selfParent); + $selfSelector = $this->collapseSelectorsAsList($selfSelector); + + return $selfSelector; + + default: + return $value; + } + } + + /** + * Function caller + * + * @param string|array $functionReference + * @param array $argValues + * + * @return array|Number + */ + protected function fncall($functionReference, $argValues) + { + // a string means this is a static hard reference coming from the parsing + if (is_string($functionReference)) { + $name = $functionReference; + + $functionReference = $this->getFunctionReference($name); + if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) { + $functionReference = [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]]; + } + } + + // a function type means we just want a plain css function call + if ($functionReference[0] === Type::T_FUNCTION) { + // for CSS functions, simply flatten the arguments into a list + $listArgs = []; + + foreach ((array) $argValues as $arg) { + if (empty($arg[0]) || count($argValues) === 1) { + $listArgs[] = $this->reduce($this->stringifyFncallArgs($arg[1])); + } + } + + return [Type::T_FUNCTION, $functionReference[1], [Type::T_LIST, ',', $listArgs]]; + } + + if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) { + return static::$defaultValue; + } + + + switch ($functionReference[1]) { + // SCSS @function + case 'scss': + return $this->callScssFunction($functionReference[3], $argValues); + + // native PHP functions + case 'user': + case 'native': + list(,,$name, $fn, $prototype) = $functionReference; + + // special cases of css valid functions min/max + $name = strtolower($name); + if (\in_array($name, ['min', 'max']) && count($argValues) >= 1) { + $cssFunction = $this->cssValidArg( + [Type::T_FUNCTION_CALL, $name, $argValues], + ['min', 'max', 'calc', 'env', 'var'] + ); + if ($cssFunction !== false) { + return $cssFunction; + } + } + $returnValue = $this->callNativeFunction($name, $fn, $prototype, $argValues); + + if (! isset($returnValue)) { + return $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $argValues); + } + + return $returnValue; + + default: + return static::$defaultValue; + } + } + + /** + * @param array|Number $arg + * @param string[] $allowed_function + * @param bool $inFunction + * + * @return array|Number|false + */ + protected function cssValidArg($arg, $allowed_function = [], $inFunction = false) + { + if ($arg instanceof Number) { + return $this->stringifyFncallArgs($arg); + } + + switch ($arg[0]) { + case Type::T_INTERPOLATE: + return [Type::T_KEYWORD, $this->CompileValue($arg)]; + + case Type::T_FUNCTION: + if (! \in_array($arg[1], $allowed_function)) { + return false; + } + if ($arg[2][0] === Type::T_LIST) { + foreach ($arg[2][2] as $k => $subarg) { + $arg[2][2][$k] = $this->cssValidArg($subarg, $allowed_function, $arg[1]); + if ($arg[2][2][$k] === false) { + return false; + } + } + } + return $arg; + + case Type::T_FUNCTION_CALL: + if (! \in_array($arg[1], $allowed_function)) { + return false; + } + $cssArgs = []; + foreach ($arg[2] as $argValue) { + if ($argValue === static::$null) { + return false; + } + $cssArg = $this->cssValidArg($argValue[1], $allowed_function, $arg[1]); + if (empty($argValue[0]) && $cssArg !== false) { + $cssArgs[] = [$argValue[0], $cssArg]; + } else { + return false; + } + } + + return $this->fncall([Type::T_FUNCTION, $arg[1], [Type::T_LIST, ',', []]], $cssArgs); + + case Type::T_STRING: + case Type::T_KEYWORD: + if (!$inFunction or !\in_array($inFunction, ['calc', 'env', 'var'])) { + return false; + } + return $this->stringifyFncallArgs($arg); + + case Type::T_LIST: + if (!$inFunction) { + return false; + } + if (empty($arg['enclosing']) and $arg[1] === '') { + foreach ($arg[2] as $k => $subarg) { + $arg[2][$k] = $this->cssValidArg($subarg, $allowed_function, $inFunction); + if ($arg[2][$k] === false) { + return false; + } + } + $arg[0] = Type::T_STRING; + return $arg; + } + return false; + + case Type::T_EXPRESSION: + if (! \in_array($arg[1], ['+', '-', '/', '*'])) { + return false; + } + $arg[2] = $this->cssValidArg($arg[2], $allowed_function, $inFunction); + $arg[3] = $this->cssValidArg($arg[3], $allowed_function, $inFunction); + if ($arg[2] === false || $arg[3] === false) { + return false; + } + return $this->expToString($arg, true); + + case Type::T_VARIABLE: + case Type::T_SELF: + default: + return false; + } + } + + + /** + * Reformat fncall arguments to proper css function output + * + * @param array|Number $arg + * + * @return array|Number + */ + protected function stringifyFncallArgs($arg) + { + if ($arg instanceof Number) { + return $arg; + } + + switch ($arg[0]) { + case Type::T_LIST: + foreach ($arg[2] as $k => $v) { + $arg[2][$k] = $this->stringifyFncallArgs($v); + } + break; + + case Type::T_EXPRESSION: + if ($arg[1] === '/') { + $arg[2] = $this->stringifyFncallArgs($arg[2]); + $arg[3] = $this->stringifyFncallArgs($arg[3]); + $arg[5] = $arg[6] = false; // no space around / + $arg = $this->expToString($arg); + } + break; + + case Type::T_FUNCTION_CALL: + $name = strtolower($arg[1]); + + if (in_array($name, ['max', 'min', 'calc'])) { + $args = $arg[2]; + $arg = $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $args); + } + break; + } + + return $arg; + } + + /** + * Find a function reference + * @param string $name + * @param bool $safeCopy + * @return array + */ + protected function getFunctionReference($name, $safeCopy = false) + { + // SCSS @function + if ($func = $this->get(static::$namespaces['function'] . $name, false)) { + if ($safeCopy) { + $func = clone $func; + } + + return [Type::T_FUNCTION_REFERENCE, 'scss', $name, $func]; + } + + // native PHP functions + + // try to find a native lib function + $normalizedName = $this->normalizeName($name); + + if (isset($this->userFunctions[$normalizedName])) { + // see if we can find a user function + list($f, $prototype) = $this->userFunctions[$normalizedName]; + + return [Type::T_FUNCTION_REFERENCE, 'user', $name, $f, $prototype]; + } + + $lowercasedName = strtolower($normalizedName); + + // Special functions overriding a CSS function are case-insensitive. We normalize them as lowercase + // to avoid the deprecation warning about the wrong case being used. + if ($lowercasedName === 'min' || $lowercasedName === 'max') { + $normalizedName = $lowercasedName; + } + + if (($f = $this->getBuiltinFunction($normalizedName)) && \is_callable($f)) { + $libName = $f[1]; + $prototype = isset(static::$$libName) ? static::$$libName : null; + + // All core functions have a prototype defined. Not finding the + // prototype can mean 2 things: + // - the function comes from a child class (deprecated just after) + // - the function was found with a different case, which relates to calling the + // wrong Sass function due to our camelCase usage (`fade-in()` vs `fadein()`), + // because PHP method names are case-insensitive while property names are + // case-sensitive. + if ($prototype === null || strtolower($normalizedName) !== $normalizedName) { + $r = new \ReflectionMethod($this, $libName); + $actualLibName = $r->name; + + if ($actualLibName !== $libName || strtolower($normalizedName) !== $normalizedName) { + $kebabCaseName = preg_replace('~(?<=\\w)([A-Z])~', '-$1', substr($actualLibName, 3)); + assert($kebabCaseName !== null); + $originalName = strtolower($kebabCaseName); + $warning = "Calling built-in functions with a non-standard name is deprecated since Scssphp 1.8.0 and will not work anymore in 2.0 (they will be treated as CSS function calls instead).\nUse \"$originalName\" instead of \"$name\"."; + @trigger_error($warning, E_USER_DEPRECATED); + $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); + $line = $this->sourceLine; + Warn::deprecation("$warning\n on line $line of $fname"); + + // Use the actual function definition + $prototype = isset(static::$$actualLibName) ? static::$$actualLibName : null; + $f[1] = $libName = $actualLibName; + } + } + + if (\get_class($this) !== __CLASS__ && !isset($this->warnedChildFunctions[$libName])) { + $r = new \ReflectionMethod($this, $libName); + $declaringClass = $r->getDeclaringClass()->name; + + $needsWarning = $this->warnedChildFunctions[$libName] = $declaringClass !== __CLASS__; + + if ($needsWarning) { + if (method_exists(__CLASS__, $libName)) { + @trigger_error(sprintf('Overriding the "%s" core function by extending the Compiler is deprecated and will be unsupported in 2.0. Remove the "%s::%s" method.', $normalizedName, $declaringClass, $libName), E_USER_DEPRECATED); + } else { + @trigger_error(sprintf('Registering custom functions by extending the Compiler and using the lib* discovery mechanism is deprecated and will be removed in 2.0. Replace the "%s::%s" method with registering the "%s" function through "Compiler::registerFunction".', $declaringClass, $libName, $normalizedName), E_USER_DEPRECATED); + } + } + } + + return [Type::T_FUNCTION_REFERENCE, 'native', $name, $f, $prototype]; + } + + return static::$null; + } + + + /** + * Normalize name + * + * @param string $name + * + * @return string + */ + protected function normalizeName($name) + { + return str_replace('-', '_', $name); + } + + /** + * Normalize value + * + * @internal + * + * @param array|Number $value + * + * @return array|Number + */ + public function normalizeValue($value) + { + $value = $this->coerceForExpression($this->reduce($value)); + + if ($value instanceof Number) { + return $value; + } + + switch ($value[0]) { + case Type::T_LIST: + $value = $this->extractInterpolation($value); + + if ($value[0] !== Type::T_LIST) { + return [Type::T_KEYWORD, $this->compileValue($value)]; + } + + foreach ($value[2] as $key => $item) { + $value[2][$key] = $this->normalizeValue($item); + } + + if (! empty($value['enclosing'])) { + unset($value['enclosing']); + } + + return $value; + + case Type::T_STRING: + return [$value[0], '"', [$this->compileStringContent($value)]]; + + case Type::T_INTERPOLATE: + return [Type::T_KEYWORD, $this->compileValue($value)]; + + default: + return $value; + } + } + + /** + * Add numbers + * + * @param Number $left + * @param Number $right + * + * @return Number + */ + protected function opAddNumberNumber(Number $left, Number $right) + { + return $left->plus($right); + } + + /** + * Multiply numbers + * + * @param Number $left + * @param Number $right + * + * @return Number + */ + protected function opMulNumberNumber(Number $left, Number $right) + { + return $left->times($right); + } + + /** + * Subtract numbers + * + * @param Number $left + * @param Number $right + * + * @return Number + */ + protected function opSubNumberNumber(Number $left, Number $right) + { + return $left->minus($right); + } + + /** + * Divide numbers + * + * @param Number $left + * @param Number $right + * + * @return Number + */ + protected function opDivNumberNumber(Number $left, Number $right) + { + return $left->dividedBy($right); + } + + /** + * Mod numbers + * + * @param Number $left + * @param Number $right + * + * @return Number + */ + protected function opModNumberNumber(Number $left, Number $right) + { + return $left->modulo($right); + } + + /** + * Add strings + * + * @param array $left + * @param array $right + * + * @return array|null + */ + protected function opAdd($left, $right) + { + if ($strLeft = $this->coerceString($left)) { + if ($right[0] === Type::T_STRING) { + $right[1] = ''; + } + + $strLeft[2][] = $right; + + return $strLeft; + } + + if ($strRight = $this->coerceString($right)) { + if ($left[0] === Type::T_STRING) { + $left[1] = ''; + } + + array_unshift($strRight[2], $left); + + return $strRight; + } + + return null; + } + + /** + * Boolean and + * + * @param array|Number $left + * @param array|Number $right + * @param boolean $shouldEval + * + * @return array|Number|null + */ + protected function opAnd($left, $right, $shouldEval) + { + $truthy = ($left === static::$null || $right === static::$null) || + ($left === static::$false || $left === static::$true) && + ($right === static::$false || $right === static::$true); + + if (! $shouldEval) { + if (! $truthy) { + return null; + } + } + + if ($left !== static::$false && $left !== static::$null) { + return $this->reduce($right, true); + } + + return $left; + } + + /** + * Boolean or + * + * @param array|Number $left + * @param array|Number $right + * @param boolean $shouldEval + * + * @return array|Number|null + */ + protected function opOr($left, $right, $shouldEval) + { + $truthy = ($left === static::$null || $right === static::$null) || + ($left === static::$false || $left === static::$true) && + ($right === static::$false || $right === static::$true); + + if (! $shouldEval) { + if (! $truthy) { + return null; + } + } + + if ($left !== static::$false && $left !== static::$null) { + return $left; + } + + return $this->reduce($right, true); + } + + /** + * Compare colors + * + * @param string $op + * @param array $left + * @param array $right + * + * @return array + */ + protected function opColorColor($op, $left, $right) + { + if ($op !== '==' && $op !== '!=') { + $warning = "Color arithmetic is deprecated and will be an error in future versions.\n" + . "Consider using Sass's color functions instead."; + $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); + $line = $this->sourceLine; + + Warn::deprecation("$warning\n on line $line of $fname"); + } + + $out = [Type::T_COLOR]; + + foreach ([1, 2, 3] as $i) { + $lval = isset($left[$i]) ? $left[$i] : 0; + $rval = isset($right[$i]) ? $right[$i] : 0; + + switch ($op) { + case '+': + $out[] = $lval + $rval; + break; + + case '-': + $out[] = $lval - $rval; + break; + + case '*': + $out[] = $lval * $rval; + break; + + case '%': + if ($rval == 0) { + throw $this->error("color: Can't take modulo by zero"); + } + + $out[] = $lval % $rval; + break; + + case '/': + if ($rval == 0) { + throw $this->error("color: Can't divide by zero"); + } + + $out[] = (int) ($lval / $rval); + break; + + case '==': + return $this->opEq($left, $right); + + case '!=': + return $this->opNeq($left, $right); + + default: + throw $this->error("color: unknown op $op"); + } + } + + if (isset($left[4])) { + $out[4] = $left[4]; + } elseif (isset($right[4])) { + $out[4] = $right[4]; + } + + return $this->fixColor($out); + } + + /** + * Compare color and number + * + * @param string $op + * @param array $left + * @param Number $right + * + * @return array + */ + protected function opColorNumber($op, $left, Number $right) + { + if ($op === '==') { + return static::$false; + } + + if ($op === '!=') { + return static::$true; + } + + $value = $right->getDimension(); + + return $this->opColorColor( + $op, + $left, + [Type::T_COLOR, $value, $value, $value] + ); + } + + /** + * Compare number and color + * + * @param string $op + * @param Number $left + * @param array $right + * + * @return array + */ + protected function opNumberColor($op, Number $left, $right) + { + if ($op === '==') { + return static::$false; + } + + if ($op === '!=') { + return static::$true; + } + + $value = $left->getDimension(); + + return $this->opColorColor( + $op, + [Type::T_COLOR, $value, $value, $value], + $right + ); + } + + /** + * Compare number1 == number2 + * + * @param array|Number $left + * @param array|Number $right + * + * @return array + */ + protected function opEq($left, $right) + { + if (($lStr = $this->coerceString($left)) && ($rStr = $this->coerceString($right))) { + $lStr[1] = ''; + $rStr[1] = ''; + + $left = $this->compileValue($lStr); + $right = $this->compileValue($rStr); + } + + return $this->toBool($left === $right); + } + + /** + * Compare number1 != number2 + * + * @param array|Number $left + * @param array|Number $right + * + * @return array + */ + protected function opNeq($left, $right) + { + if (($lStr = $this->coerceString($left)) && ($rStr = $this->coerceString($right))) { + $lStr[1] = ''; + $rStr[1] = ''; + + $left = $this->compileValue($lStr); + $right = $this->compileValue($rStr); + } + + return $this->toBool($left !== $right); + } + + /** + * Compare number1 == number2 + * + * @param Number $left + * @param Number $right + * + * @return array + */ + protected function opEqNumberNumber(Number $left, Number $right) + { + return $this->toBool($left->equals($right)); + } + + /** + * Compare number1 != number2 + * + * @param Number $left + * @param Number $right + * + * @return array + */ + protected function opNeqNumberNumber(Number $left, Number $right) + { + return $this->toBool(!$left->equals($right)); + } + + /** + * Compare number1 >= number2 + * + * @param Number $left + * @param Number $right + * + * @return array + */ + protected function opGteNumberNumber(Number $left, Number $right) + { + return $this->toBool($left->greaterThanOrEqual($right)); + } + + /** + * Compare number1 > number2 + * + * @param Number $left + * @param Number $right + * + * @return array + */ + protected function opGtNumberNumber(Number $left, Number $right) + { + return $this->toBool($left->greaterThan($right)); + } + + /** + * Compare number1 <= number2 + * + * @param Number $left + * @param Number $right + * + * @return array + */ + protected function opLteNumberNumber(Number $left, Number $right) + { + return $this->toBool($left->lessThanOrEqual($right)); + } + + /** + * Compare number1 < number2 + * + * @param Number $left + * @param Number $right + * + * @return array + */ + protected function opLtNumberNumber(Number $left, Number $right) + { + return $this->toBool($left->lessThan($right)); + } + + /** + * Cast to boolean + * + * @api + * + * @param bool $thing + * + * @return array + */ + public function toBool($thing) + { + return $thing ? static::$true : static::$false; + } + + /** + * Escape non printable chars in strings output as in dart-sass + * + * @internal + * + * @param string $string + * @param bool $inKeyword + * + * @return string + */ + public function escapeNonPrintableChars($string, $inKeyword = false) + { + static $replacement = []; + if (empty($replacement[$inKeyword])) { + for ($i = 0; $i < 32; $i++) { + if ($i !== 9 || $inKeyword) { + $replacement[$inKeyword][chr($i)] = '\\' . dechex($i) . ($inKeyword ? ' ' : chr(0)); + } + } + } + $string = str_replace(array_keys($replacement[$inKeyword]), array_values($replacement[$inKeyword]), $string); + // chr(0) is not a possible char from the input, so any chr(0) comes from our escaping replacement + if (strpos($string, chr(0)) !== false) { + if (substr($string, -1) === chr(0)) { + $string = substr($string, 0, -1); + } + $string = str_replace( + [chr(0) . '\\',chr(0) . ' '], + [ '\\', ' '], + $string + ); + if (strpos($string, chr(0)) !== false) { + $parts = explode(chr(0), $string); + $string = array_shift($parts); + while (count($parts)) { + $next = array_shift($parts); + if (strpos("0123456789abcdefABCDEF" . chr(9), $next[0]) !== false) { + $string .= " "; + } + $string .= $next; + } + } + } + + return $string; + } + + /** + * Compiles a primitive value into a CSS property value. + * + * Values in scssphp are typed by being wrapped in arrays, their format is + * typically: + * + * array(type, contents [, additional_contents]*) + * + * The input is expected to be reduced. This function will not work on + * things like expressions and variables. + * + * @api + * + * @param array|Number $value + * @param bool $quote + * + * @return string + */ + public function compileValue($value, $quote = true) + { + $value = $this->reduce($value); + + if ($value instanceof Number) { + return $value->output($this); + } + + switch ($value[0]) { + case Type::T_KEYWORD: + return $this->escapeNonPrintableChars($value[1], true); + + case Type::T_COLOR: + // [1] - red component (either number for a %) + // [2] - green component + // [3] - blue component + // [4] - optional alpha component + list(, $r, $g, $b) = $value; + + $r = $this->compileRGBAValue($r); + $g = $this->compileRGBAValue($g); + $b = $this->compileRGBAValue($b); + + if (\count($value) === 5) { + $alpha = $this->compileRGBAValue($value[4], true); + + if (! is_numeric($alpha) || $alpha < 1) { + $colorName = Colors::RGBaToColorName($r, $g, $b, $alpha); + + if (! \is_null($colorName)) { + return $colorName; + } + + if (is_numeric($alpha)) { + $a = new Number($alpha, ''); + } else { + $a = $alpha; + } + + return 'rgba(' . $r . ', ' . $g . ', ' . $b . ', ' . $a . ')'; + } + } + + if (! is_numeric($r) || ! is_numeric($g) || ! is_numeric($b)) { + return 'rgb(' . $r . ', ' . $g . ', ' . $b . ')'; + } + + $colorName = Colors::RGBaToColorName($r, $g, $b); + + if (! \is_null($colorName)) { + return $colorName; + } + + $h = sprintf('#%02x%02x%02x', $r, $g, $b); + + // Converting hex color to short notation (e.g. #003399 to #039) + if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) { + $h = '#' . $h[1] . $h[3] . $h[5]; + } + + return $h; + + case Type::T_STRING: + $content = $this->compileStringContent($value, $quote); + + if ($value[1] && $quote) { + $content = str_replace('\\', '\\\\', $content); + + $content = $this->escapeNonPrintableChars($content); + + // force double quote as string quote for the output in certain cases + if ( + $value[1] === "'" && + (strpos($content, '"') === false or strpos($content, "'") !== false) && + strpbrk($content, '{}\\\'') !== false + ) { + $value[1] = '"'; + } elseif ( + $value[1] === '"' && + (strpos($content, '"') !== false and strpos($content, "'") === false) + ) { + $value[1] = "'"; + } + + $content = str_replace($value[1], '\\' . $value[1], $content); + } + + return $value[1] . $content . $value[1]; + + case Type::T_FUNCTION: + $args = ! empty($value[2]) ? $this->compileValue($value[2], $quote) : ''; + + return "$value[1]($args)"; + + case Type::T_FUNCTION_REFERENCE: + $name = ! empty($value[2]) ? $value[2] : ''; + + return "get-function(\"$name\")"; + + case Type::T_LIST: + $value = $this->extractInterpolation($value); + + if ($value[0] !== Type::T_LIST) { + return $this->compileValue($value, $quote); + } + + list(, $delim, $items) = $value; + $pre = $post = ''; + + if (! empty($value['enclosing'])) { + switch ($value['enclosing']) { + case 'parent': + //$pre = '('; + //$post = ')'; + break; + case 'forced_parent': + $pre = '('; + $post = ')'; + break; + case 'bracket': + case 'forced_bracket': + $pre = '['; + $post = ']'; + break; + } + } + + $prefix_value = ''; + + if ($delim !== ' ') { + $prefix_value = ' '; + } + + $filtered = []; + + $same_string_quote = null; + foreach ($items as $item) { + if (\is_null($same_string_quote)) { + $same_string_quote = false; + if ($item[0] === Type::T_STRING) { + $same_string_quote = $item[1]; + foreach ($items as $ii) { + if ($ii[0] !== Type::T_STRING) { + $same_string_quote = false; + break; + } + } + } + } + if ($item[0] === Type::T_NULL) { + continue; + } + if ($same_string_quote === '"' && $item[0] === Type::T_STRING && $item[1]) { + $item[1] = $same_string_quote; + } + + $compiled = $this->compileValue($item, $quote); + + if ($prefix_value && \strlen($compiled)) { + $compiled = $prefix_value . $compiled; + } + + $filtered[] = $compiled; + } + + return $pre . substr(implode("$delim", $filtered), \strlen($prefix_value)) . $post; + + case Type::T_MAP: + $keys = $value[1]; + $values = $value[2]; + $filtered = []; + + for ($i = 0, $s = \count($keys); $i < $s; $i++) { + $filtered[$this->compileValue($keys[$i], $quote)] = $this->compileValue($values[$i], $quote); + } + + array_walk($filtered, function (&$value, $key) { + $value = $key . ': ' . $value; + }); + + return '(' . implode(', ', $filtered) . ')'; + + case Type::T_INTERPOLATED: + // node created by extractInterpolation + list(, $interpolate, $left, $right) = $value; + list(,, $whiteLeft, $whiteRight) = $interpolate; + + $delim = $left[1]; + + if ($delim && $delim !== ' ' && ! $whiteLeft) { + $delim .= ' '; + } + + $left = \count($left[2]) > 0 + ? $this->compileValue($left, $quote) . $delim . $whiteLeft + : ''; + + $delim = $right[1]; + + if ($delim && $delim !== ' ') { + $delim .= ' '; + } + + $right = \count($right[2]) > 0 ? + $whiteRight . $delim . $this->compileValue($right, $quote) : ''; + + return $left . $this->compileValue($interpolate, $quote) . $right; + + case Type::T_INTERPOLATE: + // strip quotes if it's a string + $reduced = $this->reduce($value[1]); + + if ($reduced instanceof Number) { + return $this->compileValue($reduced, $quote); + } + + switch ($reduced[0]) { + case Type::T_LIST: + $reduced = $this->extractInterpolation($reduced); + + if ($reduced[0] !== Type::T_LIST) { + break; + } + + list(, $delim, $items) = $reduced; + + if ($delim !== ' ') { + $delim .= ' '; + } + + $filtered = []; + + foreach ($items as $item) { + if ($item[0] === Type::T_NULL) { + continue; + } + + if ($item[0] === Type::T_STRING) { + $filtered[] = $this->compileStringContent($item, $quote); + } elseif ($item[0] === Type::T_KEYWORD) { + $filtered[] = $item[1]; + } else { + $filtered[] = $this->compileValue($item, $quote); + } + } + + $reduced = [Type::T_KEYWORD, implode("$delim", $filtered)]; + break; + + case Type::T_STRING: + $reduced = [Type::T_STRING, '', [$this->compileStringContent($reduced)]]; + break; + + case Type::T_NULL: + $reduced = [Type::T_KEYWORD, '']; + } + + return $this->compileValue($reduced, $quote); + + case Type::T_NULL: + return 'null'; + + case Type::T_COMMENT: + return $this->compileCommentValue($value); + + default: + throw $this->error('unknown value type: ' . json_encode($value)); + } + } + + /** + * @param array|Number $value + * + * @return string + */ + protected function compileDebugValue($value) + { + $value = $this->reduce($value, true); + + if ($value instanceof Number) { + return $this->compileValue($value); + } + + switch ($value[0]) { + case Type::T_STRING: + return $this->compileStringContent($value); + + default: + return $this->compileValue($value); + } + } + + /** + * Flatten list + * + * @param array $list + * + * @return string + * + * @deprecated + */ + protected function flattenList($list) + { + @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED); + + return $this->compileValue($list); + } + + /** + * Gets the text of a Sass string + * + * Calling this method on anything else than a SassString is unsupported. Use {@see assertString} first + * to ensure that the value is indeed a string. + * + * @param array $value + * + * @return string + */ + public function getStringText(array $value) + { + if ($value[0] !== Type::T_STRING) { + throw new \InvalidArgumentException('The argument is not a sass string. Did you forgot to use "assertString"?'); + } + + return $this->compileStringContent($value); + } + + /** + * Compile string content + * + * @param array $string + * @param bool $quote + * + * @return string + */ + protected function compileStringContent($string, $quote = true) + { + $parts = []; + + foreach ($string[2] as $part) { + if (\is_array($part) || $part instanceof Number) { + $parts[] = $this->compileValue($part, $quote); + } else { + $parts[] = $part; + } + } + + return implode($parts); + } + + /** + * Extract interpolation; it doesn't need to be recursive, compileValue will handle that + * + * @param array $list + * + * @return array + */ + protected function extractInterpolation($list) + { + $items = $list[2]; + + foreach ($items as $i => $item) { + if ($item[0] === Type::T_INTERPOLATE) { + $before = [Type::T_LIST, $list[1], \array_slice($items, 0, $i)]; + $after = [Type::T_LIST, $list[1], \array_slice($items, $i + 1)]; + + return [Type::T_INTERPOLATED, $item, $before, $after]; + } + } + + return $list; + } + + /** + * Find the final set of selectors + * + * @param \ScssPhp\ScssPhp\Compiler\Environment $env + * @param \ScssPhp\ScssPhp\Block $selfParent + * + * @return array + */ + protected function multiplySelectors(Environment $env, $selfParent = null) + { + $envs = $this->compactEnv($env); + $selectors = []; + $parentSelectors = [[]]; + + $selfParentSelectors = null; + + if (! \is_null($selfParent) && $selfParent->selectors) { + $selfParentSelectors = $this->evalSelectors($selfParent->selectors); + } + + while ($env = array_pop($envs)) { + if (empty($env->selectors)) { + continue; + } + + $selectors = $env->selectors; + + do { + $stillHasSelf = false; + $prevSelectors = $selectors; + $selectors = []; + + foreach ($parentSelectors as $parent) { + foreach ($prevSelectors as $selector) { + if ($selfParentSelectors) { + foreach ($selfParentSelectors as $selfParent) { + // if no '&' in the selector, each call will give same result, only add once + $s = $this->joinSelectors($parent, $selector, $stillHasSelf, $selfParent); + $selectors[serialize($s)] = $s; + } + } else { + $s = $this->joinSelectors($parent, $selector, $stillHasSelf); + $selectors[serialize($s)] = $s; + } + } + } + } while ($stillHasSelf); + + $parentSelectors = $selectors; + } + + $selectors = array_values($selectors); + + // case we are just starting a at-root : nothing to multiply but parentSelectors + if (! $selectors && $selfParentSelectors) { + $selectors = $selfParentSelectors; + } + + return $selectors; + } + + /** + * Join selectors; looks for & to replace, or append parent before child + * + * @param array $parent + * @param array $child + * @param boolean $stillHasSelf + * @param array $selfParentSelectors + + * @return array + */ + protected function joinSelectors($parent, $child, &$stillHasSelf, $selfParentSelectors = null) + { + $setSelf = false; + $out = []; + + foreach ($child as $part) { + $newPart = []; + + foreach ($part as $p) { + // only replace & once and should be recalled to be able to make combinations + if ($p === static::$selfSelector && $setSelf) { + $stillHasSelf = true; + } + + if ($p === static::$selfSelector && ! $setSelf) { + $setSelf = true; + + if (\is_null($selfParentSelectors)) { + $selfParentSelectors = $parent; + } + + foreach ($selfParentSelectors as $i => $parentPart) { + if ($i > 0) { + $out[] = $newPart; + $newPart = []; + } + + foreach ($parentPart as $pp) { + if (\is_array($pp)) { + $flatten = []; + + array_walk_recursive($pp, function ($a) use (&$flatten) { + $flatten[] = $a; + }); + + $pp = implode($flatten); + } + + $newPart[] = $pp; + } + } + } else { + $newPart[] = $p; + } + } + + $out[] = $newPart; + } + + return $setSelf ? $out : array_merge($parent, $child); + } + + /** + * Multiply media + * + * @param \ScssPhp\ScssPhp\Compiler\Environment $env + * @param array $childQueries + * + * @return array + */ + protected function multiplyMedia(Environment $env = null, $childQueries = null) + { + if ( + ! isset($env) || + ! empty($env->block->type) && $env->block->type !== Type::T_MEDIA + ) { + return $childQueries; + } + + // plain old block, skip + if (empty($env->block->type)) { + return $this->multiplyMedia($env->parent, $childQueries); + } + + $parentQueries = isset($env->block->queryList) + ? $env->block->queryList + : [[[Type::T_MEDIA_VALUE, $env->block->value]]]; + + $store = [$this->env, $this->storeEnv]; + + $this->env = $env; + $this->storeEnv = null; + $parentQueries = $this->evaluateMediaQuery($parentQueries); + + list($this->env, $this->storeEnv) = $store; + + if (\is_null($childQueries)) { + $childQueries = $parentQueries; + } else { + $originalQueries = $childQueries; + $childQueries = []; + + foreach ($parentQueries as $parentQuery) { + foreach ($originalQueries as $childQuery) { + $childQueries[] = array_merge( + $parentQuery, + [[Type::T_MEDIA_TYPE, [Type::T_KEYWORD, 'all']]], + $childQuery + ); + } + } + } + + return $this->multiplyMedia($env->parent, $childQueries); + } + + /** + * Convert env linked list to stack + * + * @param Environment $env + * + * @return Environment[] + * + * @phpstan-return non-empty-array + */ + protected function compactEnv(Environment $env) + { + for ($envs = []; $env; $env = $env->parent) { + $envs[] = $env; + } + + return $envs; + } + + /** + * Convert env stack to singly linked list + * + * @param Environment[] $envs + * + * @return Environment + * + * @phpstan-param non-empty-array $envs + */ + protected function extractEnv($envs) + { + for ($env = null; $e = array_pop($envs);) { + $e->parent = $env; + $env = $e; + } + + return $env; + } + + /** + * Push environment + * + * @param \ScssPhp\ScssPhp\Block $block + * + * @return \ScssPhp\ScssPhp\Compiler\Environment + */ + protected function pushEnv(Block $block = null) + { + $env = new Environment(); + $env->parent = $this->env; + $env->parentStore = $this->storeEnv; + $env->store = []; + $env->block = $block; + $env->depth = isset($this->env->depth) ? $this->env->depth + 1 : 0; + + $this->env = $env; + $this->storeEnv = null; + + return $env; + } + + /** + * Pop environment + * + * @return void + */ + protected function popEnv() + { + $this->storeEnv = $this->env->parentStore; + $this->env = $this->env->parent; + } + + /** + * Propagate vars from a just poped Env (used in @each and @for) + * + * @param array $store + * @param null|string[] $excludedVars + * + * @return void + */ + protected function backPropagateEnv($store, $excludedVars = null) + { + foreach ($store as $key => $value) { + if (empty($excludedVars) || ! \in_array($key, $excludedVars)) { + $this->set($key, $value, true); + } + } + } + + /** + * Get store environment + * + * @return \ScssPhp\ScssPhp\Compiler\Environment + */ + protected function getStoreEnv() + { + return isset($this->storeEnv) ? $this->storeEnv : $this->env; + } + + /** + * Set variable + * + * @param string $name + * @param mixed $value + * @param boolean $shadow + * @param \ScssPhp\ScssPhp\Compiler\Environment $env + * @param mixed $valueUnreduced + * + * @return void + */ + protected function set($name, $value, $shadow = false, Environment $env = null, $valueUnreduced = null) + { + $name = $this->normalizeName($name); + + if (! isset($env)) { + $env = $this->getStoreEnv(); + } + + if ($shadow) { + $this->setRaw($name, $value, $env, $valueUnreduced); + } else { + $this->setExisting($name, $value, $env, $valueUnreduced); + } + } + + /** + * Set existing variable + * + * @param string $name + * @param mixed $value + * @param \ScssPhp\ScssPhp\Compiler\Environment $env + * @param mixed $valueUnreduced + * + * @return void + */ + protected function setExisting($name, $value, Environment $env, $valueUnreduced = null) + { + $storeEnv = $env; + $specialContentKey = static::$namespaces['special'] . 'content'; + + $hasNamespace = $name[0] === '^' || $name[0] === '@' || $name[0] === '%'; + + $maxDepth = 10000; + + for (;;) { + if ($maxDepth-- <= 0) { + break; + } + + if (\array_key_exists($name, $env->store)) { + break; + } + + if (! $hasNamespace && isset($env->marker)) { + if (! empty($env->store[$specialContentKey])) { + $env = $env->store[$specialContentKey]->scope; + continue; + } + + if (! empty($env->declarationScopeParent)) { + $env = $env->declarationScopeParent; + continue; + } else { + $env = $storeEnv; + break; + } + } + + if (isset($env->parentStore)) { + $env = $env->parentStore; + } elseif (isset($env->parent)) { + $env = $env->parent; + } else { + $env = $storeEnv; + break; + } + } + + $env->store[$name] = $value; + + if ($valueUnreduced) { + $env->storeUnreduced[$name] = $valueUnreduced; + } + } + + /** + * Set raw variable + * + * @param string $name + * @param mixed $value + * @param \ScssPhp\ScssPhp\Compiler\Environment $env + * @param mixed $valueUnreduced + * + * @return void + */ + protected function setRaw($name, $value, Environment $env, $valueUnreduced = null) + { + $env->store[$name] = $value; + + if ($valueUnreduced) { + $env->storeUnreduced[$name] = $valueUnreduced; + } + } + + /** + * Get variable + * + * @internal + * + * @param string $name + * @param boolean $shouldThrow + * @param \ScssPhp\ScssPhp\Compiler\Environment $env + * @param boolean $unreduced + * + * @return mixed|null + */ + public function get($name, $shouldThrow = true, Environment $env = null, $unreduced = false) + { + $normalizedName = $this->normalizeName($name); + $specialContentKey = static::$namespaces['special'] . 'content'; + + if (! isset($env)) { + $env = $this->getStoreEnv(); + } + + $hasNamespace = $normalizedName[0] === '^' || $normalizedName[0] === '@' || $normalizedName[0] === '%'; + + $maxDepth = 10000; + + for (;;) { + if ($maxDepth-- <= 0) { + break; + } + + if (\array_key_exists($normalizedName, $env->store)) { + if ($unreduced && isset($env->storeUnreduced[$normalizedName])) { + return $env->storeUnreduced[$normalizedName]; + } + + return $env->store[$normalizedName]; + } + + if (! $hasNamespace && isset($env->marker)) { + if (! empty($env->store[$specialContentKey])) { + $env = $env->store[$specialContentKey]->scope; + continue; + } + + if (! empty($env->declarationScopeParent)) { + $env = $env->declarationScopeParent; + } else { + $env = $this->rootEnv; + } + continue; + } + + if (isset($env->parentStore)) { + $env = $env->parentStore; + } elseif (isset($env->parent)) { + $env = $env->parent; + } else { + break; + } + } + + if ($shouldThrow) { + throw $this->error("Undefined variable \$$name" . ($maxDepth <= 0 ? ' (infinite recursion)' : '')); + } + + // found nothing + return null; + } + + /** + * Has variable? + * + * @param string $name + * @param \ScssPhp\ScssPhp\Compiler\Environment $env + * + * @return boolean + */ + protected function has($name, Environment $env = null) + { + return ! \is_null($this->get($name, false, $env)); + } + + /** + * Inject variables + * + * @param array $args + * + * @return void + */ + protected function injectVariables(array $args) + { + if (empty($args)) { + return; + } + + $parser = $this->parserFactory(__METHOD__); + + foreach ($args as $name => $strValue) { + if ($name[0] === '$') { + $name = substr($name, 1); + } + + if (!\is_string($strValue) || ! $parser->parseValue($strValue, $value)) { + $value = $this->coerceValue($strValue); + } + + $this->set($name, $value); + } + } + + /** + * Replaces variables. + * + * @param array $variables + * + * @return void + */ + public function replaceVariables(array $variables) + { + $this->registeredVars = []; + $this->addVariables($variables); + } + + /** + * Replaces variables. + * + * @param array $variables + * + * @return void + */ + public function addVariables(array $variables) + { + $triggerWarning = false; + + foreach ($variables as $name => $value) { + if (!$value instanceof Number && !\is_array($value)) { + $triggerWarning = true; + } + + $this->registeredVars[$name] = $value; + } + + if ($triggerWarning) { + @trigger_error('Passing raw values to as custom variables to the Compiler is deprecated. Use "\ScssPhp\ScssPhp\ValueConverter::parseValue" or "\ScssPhp\ScssPhp\ValueConverter::fromPhp" to convert them instead.', E_USER_DEPRECATED); + } + } + + /** + * Set variables + * + * @api + * + * @param array $variables + * + * @return void + * + * @deprecated Use "addVariables" or "replaceVariables" instead. + */ + public function setVariables(array $variables) + { + @trigger_error('The method "setVariables" of the Compiler is deprecated. Use the "addVariables" method for the equivalent behavior or "replaceVariables" if merging with previous variables was not desired.'); + + $this->addVariables($variables); + } + + /** + * Unset variable + * + * @api + * + * @param string $name + * + * @return void + */ + public function unsetVariable($name) + { + unset($this->registeredVars[$name]); + } + + /** + * Returns list of variables + * + * @api + * + * @return array + */ + public function getVariables() + { + return $this->registeredVars; + } + + /** + * Adds to list of parsed files + * + * @internal + * + * @param string|null $path + * + * @return void + */ + public function addParsedFile($path) + { + if (! \is_null($path) && is_file($path)) { + $this->parsedFiles[realpath($path)] = filemtime($path); + } + } + + /** + * Returns list of parsed files + * + * @deprecated + * @return array + */ + public function getParsedFiles() + { + @trigger_error('The method "getParsedFiles" of the Compiler is deprecated. Use the "getIncludedFiles" method on the CompilationResult instance returned by compileString() instead. Be careful that the signature of the method is different.', E_USER_DEPRECATED); + return $this->parsedFiles; + } + + /** + * Add import path + * + * @api + * + * @param string|callable $path + * + * @return void + */ + public function addImportPath($path) + { + if (! \in_array($path, $this->importPaths)) { + $this->importPaths[] = $path; + } + } + + /** + * Set import paths + * + * @api + * + * @param string|array $path + * + * @return void + */ + public function setImportPaths($path) + { + $paths = (array) $path; + $actualImportPaths = array_filter($paths, function ($path) { + return $path !== ''; + }); + + $this->legacyCwdImportPath = \count($actualImportPaths) !== \count($paths); + + if ($this->legacyCwdImportPath) { + @trigger_error('Passing an empty string in the import paths to refer to the current working directory is deprecated. If that\'s the intended behavior, the value of "getcwd()" should be used directly instead. If this was used for resolving relative imports of the input alongside "chdir" with the source directory, the path of the input file should be passed to "compileString()" instead.', E_USER_DEPRECATED); + } + + $this->importPaths = $actualImportPaths; + } + + /** + * Set number precision + * + * @api + * + * @param integer $numberPrecision + * + * @return void + * + * @deprecated The number precision is not configurable anymore. The default is enough for all browsers. + */ + public function setNumberPrecision($numberPrecision) + { + @trigger_error('The number precision is not configurable anymore. ' + . 'The default is enough for all browsers.', E_USER_DEPRECATED); + } + + /** + * Sets the output style. + * + * @api + * + * @param string $style One of the OutputStyle constants + * + * @return void + * + * @phpstan-param OutputStyle::* $style + */ + public function setOutputStyle($style) + { + switch ($style) { + case OutputStyle::EXPANDED: + $this->formatter = Expanded::class; + break; + + case OutputStyle::COMPRESSED: + $this->formatter = Compressed::class; + break; + + default: + throw new \InvalidArgumentException(sprintf('Invalid output style "%s".', $style)); + } + } + + /** + * Set formatter + * + * @api + * + * @param string $formatterName + * + * @return void + * + * @deprecated Use {@see setOutputStyle} instead. + */ + public function setFormatter($formatterName) + { + if (!\in_array($formatterName, [Expanded::class, Compressed::class], true)) { + @trigger_error('Formatters other than Expanded and Compressed are deprecated.', E_USER_DEPRECATED); + } + @trigger_error('The method "setFormatter" is deprecated. Use "setOutputStyle" instead.', E_USER_DEPRECATED); + + $this->formatter = $formatterName; + } + + /** + * Set line number style + * + * @api + * + * @param string $lineNumberStyle + * + * @return void + * + * @deprecated The line number output is not supported anymore. Use source maps instead. + */ + public function setLineNumberStyle($lineNumberStyle) + { + @trigger_error('The line number output is not supported anymore. ' + . 'Use source maps instead.', E_USER_DEPRECATED); + } + + /** + * Configures the handling of non-ASCII outputs. + * + * If $charset is `true`, this will include a `@charset` declaration or a + * UTF-8 [byte-order mark][] if the stylesheet contains any non-ASCII + * characters. Otherwise, it will never include a `@charset` declaration or a + * byte-order mark. + * + * [byte-order mark]: https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 + * + * @param bool $charset + * + * @return void + */ + public function setCharset($charset) + { + $this->charset = $charset; + } + + /** + * Enable/disable source maps + * + * @api + * + * @param integer $sourceMap + * + * @return void + * + * @phpstan-param self::SOURCE_MAP_* $sourceMap + */ + public function setSourceMap($sourceMap) + { + $this->sourceMap = $sourceMap; + } + + /** + * Set source map options + * + * @api + * + * @param array $sourceMapOptions + * + * @phpstan-param array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} $sourceMapOptions + * + * @return void + */ + public function setSourceMapOptions($sourceMapOptions) + { + $this->sourceMapOptions = $sourceMapOptions; + } + + /** + * Register function + * + * @api + * + * @param string $name + * @param callable $callback + * @param string[]|null $argumentDeclaration + * + * @return void + */ + public function registerFunction($name, $callback, $argumentDeclaration = null) + { + if (self::isNativeFunction($name)) { + @trigger_error(sprintf('The "%s" function is a core sass function. Overriding it with a custom implementation through "%s" is deprecated and won\'t be supported in ScssPhp 2.0 anymore.', $name, __METHOD__), E_USER_DEPRECATED); + } + + if ($argumentDeclaration === null) { + @trigger_error('Omitting the argument declaration when registering custom function is deprecated and won\'t be supported in ScssPhp 2.0 anymore.', E_USER_DEPRECATED); + } + + $this->userFunctions[$this->normalizeName($name)] = [$callback, $argumentDeclaration]; + } + + /** + * Unregister function + * + * @api + * + * @param string $name + * + * @return void + */ + public function unregisterFunction($name) + { + unset($this->userFunctions[$this->normalizeName($name)]); + } + + /** + * Add feature + * + * @api + * + * @param string $name + * + * @return void + * + * @deprecated Registering additional features is deprecated. + */ + public function addFeature($name) + { + @trigger_error('Registering additional features is deprecated.', E_USER_DEPRECATED); + + $this->registeredFeatures[$name] = true; + } + + /** + * Import file + * + * @param string $path + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out + * + * @return void + */ + protected function importFile($path, OutputBlock $out) + { + $this->pushCallStack('import ' . $this->getPrettyPath($path)); + // see if tree is cached + $realPath = realpath($path); + + if (substr($path, -5) === '.sass') { + $this->sourceIndex = \count($this->sourceNames); + $this->sourceNames[] = $path; + $this->sourceLine = 1; + $this->sourceColumn = 1; + + throw $this->error('The Sass indented syntax is not implemented.'); + } + + if (isset($this->importCache[$realPath])) { + $this->handleImportLoop($realPath); + + $tree = $this->importCache[$realPath]; + } else { + $code = file_get_contents($path); + $parser = $this->parserFactory($path); + $tree = $parser->parse($code); + + $this->importCache[$realPath] = $tree; + } + + $currentDirectory = $this->currentDirectory; + $this->currentDirectory = dirname($path); + + $this->compileChildrenNoReturn($tree->children, $out); + $this->currentDirectory = $currentDirectory; + $this->popCallStack(); + } + + /** + * Save the imported files with their resolving path context + * + * @param string|null $currentDirectory + * @param string $path + * @param string $filePath + * + * @return void + */ + private function registerImport($currentDirectory, $path, $filePath) + { + $this->resolvedImports[] = ['currentDir' => $currentDirectory, 'path' => $path, 'filePath' => $filePath]; + } + + /** + * Detects whether the import is a CSS import. + * + * For legacy reasons, custom importers are called for those, allowing them + * to replace them with an actual Sass import. However this behavior is + * deprecated. Custom importers are expected to return null when they receive + * a CSS import. + * + * @param string $url + * + * @return bool + */ + public static function isCssImport($url) + { + return 1 === preg_match('~\.css$|^https?://|^//~', $url); + } + + /** + * Return the file path for an import url if it exists + * + * @internal + * + * @param string $url + * @param string|null $currentDir + * + * @return string|null + */ + public function findImport($url, $currentDir = null) + { + // Vanilla css and external requests. These are not meant to be Sass imports. + // Callback importers are still called for BC. + if (self::isCssImport($url)) { + foreach ($this->importPaths as $dir) { + if (\is_string($dir)) { + continue; + } + + if (\is_callable($dir)) { + // check custom callback for import path + $file = \call_user_func($dir, $url); + + if (! \is_null($file)) { + if (\is_array($dir)) { + $callableDescription = (\is_object($dir[0]) ? \get_class($dir[0]) : $dir[0]).'::'.$dir[1]; + } elseif ($dir instanceof \Closure) { + $r = new \ReflectionFunction($dir); + if (false !== strpos($r->name, '{closure}')) { + $callableDescription = sprintf('closure{%s:%s}', $r->getFileName(), $r->getStartLine()); + } elseif ($class = $r->getClosureScopeClass()) { + $callableDescription = $class->name.'::'.$r->name; + } else { + $callableDescription = $r->name; + } + } elseif (\is_object($dir)) { + $callableDescription = \get_class($dir) . '::__invoke'; + } else { + $callableDescription = 'callable'; // Fallback if we don't have a dedicated description + } + @trigger_error(sprintf('Returning a file to import for CSS or external references in custom importer callables is deprecated and will not be supported anymore in ScssPhp 2.0. This behavior is not compliant with the Sass specification. Update your "%s" importer.', $callableDescription), E_USER_DEPRECATED); + + return $file; + } + } + } + return null; + } + + if (!\is_null($currentDir)) { + $relativePath = $this->resolveImportPath($url, $currentDir); + + if (!\is_null($relativePath)) { + return $relativePath; + } + } + + foreach ($this->importPaths as $dir) { + if (\is_string($dir)) { + $path = $this->resolveImportPath($url, $dir); + + if (!\is_null($path)) { + return $path; + } + } elseif (\is_callable($dir)) { + // check custom callback for import path + $file = \call_user_func($dir, $url); + + if (! \is_null($file)) { + return $file; + } + } + } + + if ($this->legacyCwdImportPath) { + $path = $this->resolveImportPath($url, getcwd()); + + if (!\is_null($path)) { + @trigger_error('Resolving imports relatively to the current working directory is deprecated. If that\'s the intended behavior, the value of "getcwd()" should be added as an import path explicitly instead. If this was used for resolving relative imports of the input alongside "chdir" with the source directory, the path of the input file should be passed to "compileString()" instead.', E_USER_DEPRECATED); + + return $path; + } + } + + throw $this->error("`$url` file not found for @import"); + } + + /** + * @param string $url + * @param string $baseDir + * + * @return string|null + */ + private function resolveImportPath($url, $baseDir) + { + $path = Path::join($baseDir, $url); + + $hasExtension = preg_match('/.s[ac]ss$/', $url); + + if ($hasExtension) { + return $this->checkImportPathConflicts($this->tryImportPath($path)); + } + + $result = $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path)); + + if (!\is_null($result)) { + return $result; + } + + return $this->tryImportPathAsDirectory($path); + } + + /** + * @param string[] $paths + * + * @return string|null + */ + private function checkImportPathConflicts(array $paths) + { + if (\count($paths) === 0) { + return null; + } + + if (\count($paths) === 1) { + return $paths[0]; + } + + $formattedPrettyPaths = []; + + foreach ($paths as $path) { + $formattedPrettyPaths[] = ' ' . $this->getPrettyPath($path); + } + + throw $this->error("It's not clear which file to import. Found:\n" . implode("\n", $formattedPrettyPaths)); + } + + /** + * @param string $path + * + * @return string[] + */ + private function tryImportPathWithExtensions($path) + { + $result = array_merge( + $this->tryImportPath($path.'.sass'), + $this->tryImportPath($path.'.scss') + ); + + if ($result) { + return $result; + } + + return $this->tryImportPath($path.'.css'); + } + + /** + * @param string $path + * + * @return string[] + */ + private function tryImportPath($path) + { + $partial = dirname($path).'/_'.basename($path); + + $candidates = []; + + if (is_file($partial)) { + $candidates[] = $partial; + } + + if (is_file($path)) { + $candidates[] = $path; + } + + return $candidates; + } + + /** + * @param string $path + * + * @return string|null + */ + private function tryImportPathAsDirectory($path) + { + if (!is_dir($path)) { + return null; + } + + return $this->checkImportPathConflicts($this->tryImportPathWithExtensions($path.'/index')); + } + + /** + * @param string|null $path + * + * @return string + */ + private function getPrettyPath($path) + { + if ($path === null) { + return '(unknown file)'; + } + + $normalizedPath = $path; + $normalizedRootDirectory = $this->rootDirectory.'/'; + + if (\DIRECTORY_SEPARATOR === '\\') { + $normalizedRootDirectory = str_replace('\\', '/', $normalizedRootDirectory); + $normalizedPath = str_replace('\\', '/', $path); + } + + if (0 === strpos($normalizedPath, $normalizedRootDirectory)) { + return substr($path, \strlen($normalizedRootDirectory)); + } + + return $path; + } + + /** + * Set encoding + * + * @api + * + * @param string|null $encoding + * + * @return void + * + * @deprecated Non-compliant support for other encodings than UTF-8 is deprecated. + */ + public function setEncoding($encoding) + { + if (!$encoding || strtolower($encoding) === 'utf-8') { + @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED); + } else { + @trigger_error(sprintf('The "%s" method is deprecated. Parsing will only support UTF-8 in ScssPhp 2.0. The non-UTF-8 parsing of ScssPhp 1.x is not spec compliant.', __METHOD__), E_USER_DEPRECATED); + } + + $this->encoding = $encoding; + } + + /** + * Ignore errors? + * + * @api + * + * @param boolean $ignoreErrors + * + * @return \ScssPhp\ScssPhp\Compiler + * + * @deprecated Ignoring Sass errors is not longer supported. + */ + public function setIgnoreErrors($ignoreErrors) + { + @trigger_error('Ignoring Sass errors is not longer supported.', E_USER_DEPRECATED); + + return $this; + } + + /** + * Get source position + * + * @api + * + * @return array + * + * @deprecated + */ + public function getSourcePosition() + { + @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED); + + $sourceFile = isset($this->sourceNames[$this->sourceIndex]) ? $this->sourceNames[$this->sourceIndex] : ''; + + return [$sourceFile, $this->sourceLine, $this->sourceColumn]; + } + + /** + * Throw error (exception) + * + * @api + * + * @param string $msg Message with optional sprintf()-style vararg parameters + * + * @throws \ScssPhp\ScssPhp\Exception\CompilerException + * + * @deprecated use "error" and throw the exception in the caller instead. + */ + public function throwError($msg) + { + @trigger_error( + 'The method "throwError" is deprecated. Use "error" and throw the exception in the caller instead', + E_USER_DEPRECATED + ); + + throw $this->error(...func_get_args()); + } + + /** + * Build an error (exception) + * + * @internal + * + * @param string $msg Message with optional sprintf()-style vararg parameters + * + * @return CompilerException + */ + public function error($msg, ...$args) + { + if ($args) { + $msg = sprintf($msg, ...$args); + } + + if (! $this->ignoreCallStackMessage) { + $msg = $this->addLocationToMessage($msg); + } + + return new CompilerException($msg); + } + + /** + * @param string $msg + * + * @return string + */ + private function addLocationToMessage($msg) + { + $line = $this->sourceLine; + $column = $this->sourceColumn; + + $loc = isset($this->sourceNames[$this->sourceIndex]) + ? $this->getPrettyPath($this->sourceNames[$this->sourceIndex]) . " on line $line, at column $column" + : "line: $line, column: $column"; + + $msg = "$msg: $loc"; + + $callStackMsg = $this->callStackMessage(); + + if ($callStackMsg) { + $msg .= "\nCall Stack:\n" . $callStackMsg; + } + + return $msg; + } + + /** + * @param string $functionName + * @param array $ExpectedArgs + * @param int $nbActual + * @return CompilerException + * + * @deprecated + */ + public function errorArgsNumber($functionName, $ExpectedArgs, $nbActual) + { + @trigger_error(sprintf('The "%s" method is deprecated.', __METHOD__), E_USER_DEPRECATED); + + $nbExpected = \count($ExpectedArgs); + + if ($nbActual > $nbExpected) { + return $this->error( + 'Error: Only %d arguments allowed in %s(), but %d were passed.', + $nbExpected, + $functionName, + $nbActual + ); + } else { + $missing = []; + + while (count($ExpectedArgs) && count($ExpectedArgs) > $nbActual) { + array_unshift($missing, array_pop($ExpectedArgs)); + } + + return $this->error( + 'Error: %s() argument%s %s missing.', + $functionName, + count($missing) > 1 ? 's' : '', + implode(', ', $missing) + ); + } + } + + /** + * Beautify call stack for output + * + * @param boolean $all + * @param int|null $limit + * + * @return string + */ + protected function callStackMessage($all = false, $limit = null) + { + $callStackMsg = []; + $ncall = 0; + + if ($this->callStack) { + foreach (array_reverse($this->callStack) as $call) { + if ($all || (isset($call['n']) && $call['n'])) { + $msg = '#' . $ncall++ . ' ' . $call['n'] . ' '; + $msg .= (isset($this->sourceNames[$call[Parser::SOURCE_INDEX]]) + ? $this->getPrettyPath($this->sourceNames[$call[Parser::SOURCE_INDEX]]) + : '(unknown file)'); + $msg .= ' on line ' . $call[Parser::SOURCE_LINE]; + + $callStackMsg[] = $msg; + + if (! \is_null($limit) && $ncall > $limit) { + break; + } + } + } + } + + return implode("\n", $callStackMsg); + } + + /** + * Handle import loop + * + * @param string $name + * + * @throws \Exception + */ + protected function handleImportLoop($name) + { + for ($env = $this->env; $env; $env = $env->parent) { + if (! $env->block) { + continue; + } + + $file = $this->sourceNames[$env->block->sourceIndex]; + + if ($file === null) { + continue; + } + + if (realpath($file) === $name) { + throw $this->error('An @import loop has been found: %s imports %s', $file, basename($file)); + } + } + } + + /** + * Call SCSS @function + * + * @param Object $func + * @param array $argValues + * + * @return array|Number + */ + protected function callScssFunction($func, $argValues) + { + if (! $func) { + return static::$defaultValue; + } + $name = $func->name; + + $this->pushEnv(); + + // set the args + if (isset($func->args)) { + $this->applyArguments($func->args, $argValues); + } + + // throw away lines and children + $tmp = new OutputBlock(); + $tmp->lines = []; + $tmp->children = []; + + $this->env->marker = 'function'; + + if (! empty($func->parentEnv)) { + $this->env->declarationScopeParent = $func->parentEnv; + } else { + throw $this->error("@function $name() without parentEnv"); + } + + $ret = $this->compileChildren($func->children, $tmp, $this->env->marker . ' ' . $name); + + $this->popEnv(); + + return ! isset($ret) ? static::$defaultValue : $ret; + } + + /** + * Call built-in and registered (PHP) functions + * + * @param string $name + * @param callable $function + * @param array $prototype + * @param array $args + * + * @return array|Number|null + */ + protected function callNativeFunction($name, $function, $prototype, $args) + { + $libName = (is_array($function) ? end($function) : null); + $sorted_kwargs = $this->sortNativeFunctionArgs($libName, $prototype, $args); + + if (\is_null($sorted_kwargs)) { + return null; + } + @list($sorted, $kwargs) = $sorted_kwargs; + + if ($name !== 'if') { + foreach ($sorted as &$val) { + if ($val !== null) { + $val = $this->reduce($val, true); + } + } + } + + $returnValue = \call_user_func($function, $sorted, $kwargs); + + if (! isset($returnValue)) { + return null; + } + + if (\is_array($returnValue) || $returnValue instanceof Number) { + return $returnValue; + } + + @trigger_error(sprintf('Returning a PHP value from the "%s" custom function is deprecated. A sass value must be returned instead.', $name), E_USER_DEPRECATED); + + return $this->coerceValue($returnValue); + } + + /** + * Get built-in function + * + * @param string $name Normalized name + * + * @return array + */ + protected function getBuiltinFunction($name) + { + $libName = self::normalizeNativeFunctionName($name); + return [$this, $libName]; + } + + /** + * Normalize native function name + * + * @internal + * + * @param string $name + * + * @return string + */ + public static function normalizeNativeFunctionName($name) + { + $name = str_replace("-", "_", $name); + $libName = 'lib' . preg_replace_callback( + '/_(.)/', + function ($m) { + return ucfirst($m[1]); + }, + ucfirst($name) + ); + return $libName; + } + + /** + * Check if a function is a native built-in scss function, for css parsing + * + * @internal + * + * @param string $name + * + * @return bool + */ + public static function isNativeFunction($name) + { + return method_exists(Compiler::class, self::normalizeNativeFunctionName($name)); + } + + /** + * Sorts keyword arguments + * + * @param string $functionName + * @param array|null $prototypes + * @param array $args + * + * @return array|null + */ + protected function sortNativeFunctionArgs($functionName, $prototypes, $args) + { + static $parser = null; + + if (! isset($prototypes)) { + $keyArgs = []; + $posArgs = []; + + if (\is_array($args) && \count($args) && \end($args) === static::$null) { + array_pop($args); + } + + // separate positional and keyword arguments + foreach ($args as $arg) { + list($key, $value) = $arg; + + if (empty($key) or empty($key[1])) { + $posArgs[] = empty($arg[2]) ? $value : $arg; + } else { + $keyArgs[$key[1]] = $value; + } + } + + return [$posArgs, $keyArgs]; + } + + // specific cases ? + if (\in_array($functionName, ['libRgb', 'libRgba', 'libHsl', 'libHsla'])) { + // notation 100 127 255 / 0 is in fact a simple list of 4 values + foreach ($args as $k => $arg) { + if ($arg[1][0] === Type::T_LIST && \count($arg[1][2]) === 3) { + $args[$k][1][2] = $this->extractSlashAlphaInColorFunction($arg[1][2]); + } + } + } + + list($positionalArgs, $namedArgs, $names, $separator, $hasSplat) = $this->evaluateArguments($args, false); + + if (! \is_array(reset($prototypes))) { + $prototypes = [$prototypes]; + } + + $parsedPrototypes = array_map([$this, 'parseFunctionPrototype'], $prototypes); + assert(!empty($parsedPrototypes)); + $matchedPrototype = $this->selectFunctionPrototype($parsedPrototypes, \count($positionalArgs), $names); + + $this->verifyPrototype($matchedPrototype, \count($positionalArgs), $names, $hasSplat); + + $vars = $this->applyArgumentsToDeclaration($matchedPrototype, $positionalArgs, $namedArgs, $separator); + + $finalArgs = []; + $keyArgs = []; + + foreach ($matchedPrototype['arguments'] as $argument) { + list($normalizedName, $originalName, $default) = $argument; + + if (isset($vars[$normalizedName])) { + $value = $vars[$normalizedName]; + } else { + $value = $default; + } + + // special null value as default: translate to real null here + if ($value === [Type::T_KEYWORD, 'null']) { + $value = null; + } + + $finalArgs[] = $value; + $keyArgs[$originalName] = $value; + } + + if ($matchedPrototype['rest_argument'] !== null) { + $value = $vars[$matchedPrototype['rest_argument']]; + + $finalArgs[] = $value; + $keyArgs[$matchedPrototype['rest_argument']] = $value; + } + + return [$finalArgs, $keyArgs]; + } + + /** + * Parses a function prototype to the internal representation of arguments. + * + * The input is an array of strings describing each argument, as supported + * in {@see registerFunction}. Argument names don't include the `$`. + * The output contains the list of positional argument, with their normalized + * name (underscores are replaced by dashes), their original name (to be used + * in case of error reporting) and their default value. The output also contains + * the normalized name of the rest argument, or null if the function prototype + * is not variadic. + * + * @param string[] $prototype + * + * @return array + * @phpstan-return array{arguments: list, rest_argument: string|null} + */ + private function parseFunctionPrototype(array $prototype) + { + static $parser = null; + + $arguments = []; + $restArgument = null; + + foreach ($prototype as $p) { + if (null !== $restArgument) { + throw new \InvalidArgumentException('The argument declaration is invalid. The rest argument must be the last one.'); + } + + $default = null; + $p = explode(':', $p, 2); + $name = str_replace('_', '-', $p[0]); + + if (isset($p[1])) { + $defaultSource = trim($p[1]); + + if ($defaultSource === 'null') { + // differentiate this null from the static::$null + $default = [Type::T_KEYWORD, 'null']; + } else { + if (\is_null($parser)) { + $parser = $this->parserFactory(__METHOD__); + } + + $parser->parseValue($defaultSource, $default); + } + } + + if (substr($name, -3) === '...') { + $restArgument = substr($name, 0, -3); + } else { + $arguments[] = [$name, $p[0], $default]; + } + } + + return [ + 'arguments' => $arguments, + 'rest_argument' => $restArgument, + ]; + } + + /** + * Returns the function prototype for the given positional and named arguments. + * + * If no exact match is found, finds the closest approximation. Note that this + * doesn't guarantee that $positional and $names are valid for the returned + * prototype. + * + * @param array[] $prototypes + * @param int $positional + * @param array $names A set of names, as both keys and values + * + * @return array + * + * @phpstan-param non-empty-list, rest_argument: string|null}> $prototypes + * @phpstan-return array{arguments: list, rest_argument: string|null} + */ + private function selectFunctionPrototype(array $prototypes, $positional, array $names) + { + $fuzzyMatch = null; + $minMismatchDistance = null; + + foreach ($prototypes as $prototype) { + // Ideally, find an exact match. + if ($this->checkPrototypeMatches($prototype, $positional, $names)) { + return $prototype; + } + + $mismatchDistance = \count($prototype['arguments']) - $positional; + + if ($minMismatchDistance !== null) { + if (abs($mismatchDistance) > abs($minMismatchDistance)) { + continue; + } + + // If two overloads have the same mismatch distance, favor the overload + // that has more arguments. + if (abs($mismatchDistance) === abs($minMismatchDistance) && $mismatchDistance < 0) { + continue; + } + } + + $minMismatchDistance = $mismatchDistance; + $fuzzyMatch = $prototype; + } + + return $fuzzyMatch; + } + + /** + * Checks whether the argument invocation matches the callable prototype. + * + * The rules are similar to {@see verifyPrototype}. The boolean return value + * avoids the overhead of building and catching exceptions when the reason of + * not matching the prototype does not need to be known. + * + * @param array $prototype + * @param int $positional + * @param array $names + * + * @return bool + * + * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype + */ + private function checkPrototypeMatches(array $prototype, $positional, array $names) + { + $nameUsed = 0; + + foreach ($prototype['arguments'] as $i => $argument) { + list ($name, $originalName, $default) = $argument; + + if ($i < $positional) { + if (isset($names[$name])) { + return false; + } + } elseif (isset($names[$name])) { + $nameUsed++; + } elseif ($default === null) { + return false; + } + } + + if ($prototype['rest_argument'] !== null) { + return true; + } + + if ($positional > \count($prototype['arguments'])) { + return false; + } + + if ($nameUsed < \count($names)) { + return false; + } + + return true; + } + + /** + * Verifies that the argument invocation is valid for the callable prototype. + * + * @param array $prototype + * @param int $positional + * @param array $names + * @param bool $hasSplat + * + * @return void + * + * @throws SassScriptException + * + * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype + */ + private function verifyPrototype(array $prototype, $positional, array $names, $hasSplat) + { + $nameUsed = 0; + + foreach ($prototype['arguments'] as $i => $argument) { + list ($name, $originalName, $default) = $argument; + + if ($i < $positional) { + if (isset($names[$name])) { + throw new SassScriptException(sprintf('Argument $%s was passed both by position and by name.', $originalName)); + } + } elseif (isset($names[$name])) { + $nameUsed++; + } elseif ($default === null) { + throw new SassScriptException(sprintf('Missing argument $%s', $originalName)); + } + } + + if ($prototype['rest_argument'] !== null) { + return; + } + + if ($positional > \count($prototype['arguments'])) { + $message = sprintf( + 'Only %d %sargument%s allowed, but %d %s passed.', + \count($prototype['arguments']), + empty($names) ? '' : 'positional ', + \count($prototype['arguments']) === 1 ? '' : 's', + $positional, + $positional === 1 ? 'was' : 'were' + ); + if (!$hasSplat) { + throw new SassScriptException($message); + } + + $message = $this->addLocationToMessage($message); + $message .= "\nThis will be an error in future versions of Sass."; + $this->logger->warn($message, true); + } + + if ($nameUsed < \count($names)) { + $unknownNames = array_values(array_diff($names, array_column($prototype['arguments'], 0))); + $lastName = array_pop($unknownNames); + $message = sprintf( + 'No argument%s named $%s%s.', + $unknownNames ? 's' : '', + $unknownNames ? implode(', $', $unknownNames) . ' or $' : '', + $lastName + ); + throw new SassScriptException($message); + } + } + + /** + * Evaluates the argument from the invocation. + * + * This returns several things about this invocation: + * - the list of positional arguments + * - the map of named arguments, indexed by normalized names + * - the set of names used in the arguments (that's an array using the normalized names as keys for O(1) access) + * - the separator used by the list using the splat operator, if any + * - a boolean indicator whether any splat argument (list or map) was used, to support the incomplete error reporting. + * + * @param array[] $args + * @param bool $reduce Whether arguments should be reduced to their value + * + * @return array + * + * @throws SassScriptException + * + * @phpstan-return array{0: list, 1: array, 2: array, 3: string|null, 4: bool} + */ + private function evaluateArguments(array $args, $reduce = true) + { + // this represents trailing commas + if (\count($args) && end($args) === static::$null) { + array_pop($args); + } + + $splatSeparator = null; + $keywordArgs = []; + $names = []; + $positionalArgs = []; + $hasKeywordArgument = false; + $hasSplat = false; + + foreach ($args as $arg) { + if (!empty($arg[0])) { + $hasKeywordArgument = true; + + assert(\is_string($arg[0][1])); + $name = str_replace('_', '-', $arg[0][1]); + + if (isset($keywordArgs[$name])) { + throw new SassScriptException(sprintf('Duplicate named argument $%s.', $arg[0][1])); + } + + $keywordArgs[$name] = $this->maybeReduce($reduce, $arg[1]); + $names[$name] = $name; + } elseif (! empty($arg[2])) { + // $arg[2] means a var followed by ... in the arg ($list... ) + $val = $this->reduce($arg[1], true); + $hasSplat = true; + + if ($val[0] === Type::T_LIST) { + foreach ($val[2] as $item) { + if (\is_null($splatSeparator)) { + $splatSeparator = $val[1]; + } + + $positionalArgs[] = $this->maybeReduce($reduce, $item); + } + + if (isset($val[3]) && \is_array($val[3])) { + foreach ($val[3] as $name => $item) { + assert(\is_string($name)); + + $normalizedName = str_replace('_', '-', $name); + + if (isset($keywordArgs[$normalizedName])) { + throw new SassScriptException(sprintf('Duplicate named argument $%s.', $name)); + } + + $keywordArgs[$normalizedName] = $this->maybeReduce($reduce, $item); + $names[$normalizedName] = $normalizedName; + $hasKeywordArgument = true; + } + } + } elseif ($val[0] === Type::T_MAP) { + foreach ($val[1] as $i => $name) { + $name = $this->compileStringContent($this->coerceString($name)); + $item = $val[2][$i]; + + if (! is_numeric($name)) { + $normalizedName = str_replace('_', '-', $name); + + if (isset($keywordArgs[$normalizedName])) { + throw new SassScriptException(sprintf('Duplicate named argument $%s.', $name)); + } + + $keywordArgs[$normalizedName] = $this->maybeReduce($reduce, $item); + $names[$normalizedName] = $normalizedName; + $hasKeywordArgument = true; + } else { + if (\is_null($splatSeparator)) { + $splatSeparator = $val[1]; + } + + $positionalArgs[] = $this->maybeReduce($reduce, $item); + } + } + } elseif ($val[0] !== Type::T_NULL) { // values other than null are treated a single-element lists, while null is the empty list + $positionalArgs[] = $this->maybeReduce($reduce, $val); + } + } elseif ($hasKeywordArgument) { + throw new SassScriptException('Positional arguments must come before keyword arguments.'); + } else { + $positionalArgs[] = $this->maybeReduce($reduce, $arg[1]); + } + } + + return [$positionalArgs, $keywordArgs, $names, $splatSeparator, $hasSplat]; + } + + /** + * @param bool $reduce + * @param array|Number $value + * + * @return array|Number + */ + private function maybeReduce($reduce, $value) + { + if ($reduce) { + return $this->reduce($value, true); + } + + return $value; + } + + /** + * Apply argument values per definition + * + * @param array[] $argDef + * @param array|null $argValues + * @param boolean $storeInEnv + * @param boolean $reduce + * only used if $storeInEnv = false + * + * @return array + * + * @phpstan-param list $argDef + * + * @throws \Exception + */ + protected function applyArguments($argDef, $argValues, $storeInEnv = true, $reduce = true) + { + $output = []; + + if (\is_null($argValues)) { + $argValues = []; + } + + if ($storeInEnv) { + $storeEnv = $this->getStoreEnv(); + + $env = new Environment(); + $env->store = $storeEnv->store; + } + + $prototype = ['arguments' => [], 'rest_argument' => null]; + $originalRestArgumentName = null; + + foreach ($argDef as $i => $arg) { + list($name, $default, $isVariable) = $arg; + $normalizedName = str_replace('_', '-', $name); + + if ($isVariable) { + $originalRestArgumentName = $name; + $prototype['rest_argument'] = $normalizedName; + } else { + $prototype['arguments'][] = [$normalizedName, $name, !empty($default) ? $default : null]; + } + } + + list($positionalArgs, $namedArgs, $names, $splatSeparator, $hasSplat) = $this->evaluateArguments($argValues, $reduce); + + $this->verifyPrototype($prototype, \count($positionalArgs), $names, $hasSplat); + + $vars = $this->applyArgumentsToDeclaration($prototype, $positionalArgs, $namedArgs, $splatSeparator); + + foreach ($prototype['arguments'] as $argument) { + list($normalizedName, $name) = $argument; + + if (!isset($vars[$normalizedName])) { + continue; + } + + $val = $vars[$normalizedName]; + + if ($storeInEnv) { + $this->set($name, $this->reduce($val, true), true, $env); + } else { + $output[$name] = ($reduce ? $this->reduce($val, true) : $val); + } + } + + if ($prototype['rest_argument'] !== null) { + assert($originalRestArgumentName !== null); + $name = $originalRestArgumentName; + $val = $vars[$prototype['rest_argument']]; + + if ($storeInEnv) { + $this->set($name, $this->reduce($val, true), true, $env); + } else { + $output[$name] = ($reduce ? $this->reduce($val, true) : $val); + } + } + + if ($storeInEnv) { + $storeEnv->store = $env->store; + } + + foreach ($prototype['arguments'] as $argument) { + list($normalizedName, $name, $default) = $argument; + + if (isset($vars[$normalizedName])) { + continue; + } + assert($default !== null); + + if ($storeInEnv) { + $this->set($name, $this->reduce($default, true), true); + } else { + $output[$name] = ($reduce ? $this->reduce($default, true) : $default); + } + } + + return $output; + } + + /** + * Apply argument values per definition. + * + * This method assumes that the arguments are valid for the provided prototype. + * The validation with {@see verifyPrototype} must have been run before calling + * it. + * Arguments are returned as a map from the normalized argument names to the + * value. Additional arguments are collected in a sass argument list available + * under the name of the rest argument in the result. + * + * Defaults are not applied as they are resolved in a different environment. + * + * @param array $prototype + * @param array $positionalArgs + * @param array $namedArgs + * @param string|null $splatSeparator + * + * @return array + * + * @phpstan-param array{arguments: list, rest_argument: string|null} $prototype + */ + private function applyArgumentsToDeclaration(array $prototype, array $positionalArgs, array $namedArgs, $splatSeparator) + { + $output = []; + $minLength = min(\count($positionalArgs), \count($prototype['arguments'])); + + for ($i = 0; $i < $minLength; $i++) { + list($name) = $prototype['arguments'][$i]; + $val = $positionalArgs[$i]; + + $output[$name] = $val; + } + + $restNamed = $namedArgs; + + for ($i = \count($positionalArgs); $i < \count($prototype['arguments']); $i++) { + $argument = $prototype['arguments'][$i]; + list($name) = $argument; + + if (isset($namedArgs[$name])) { + $val = $namedArgs[$name]; + unset($restNamed[$name]); + } else { + continue; + } + + $output[$name] = $val; + } + + if ($prototype['rest_argument'] !== null) { + $name = $prototype['rest_argument']; + $rest = array_values(array_slice($positionalArgs, \count($prototype['arguments']))); + + $val = [Type::T_LIST, \is_null($splatSeparator) ? ',' : $splatSeparator , $rest, $restNamed]; + + $output[$name] = $val; + } + + return $output; + } + + /** + * Coerce a php value into a scss one + * + * @param mixed $value + * + * @return array|Number + */ + protected function coerceValue($value) + { + if (\is_array($value) || $value instanceof Number) { + return $value; + } + + if (\is_bool($value)) { + return $this->toBool($value); + } + + if (\is_null($value)) { + return static::$null; + } + + if (is_numeric($value)) { + return new Number($value, ''); + } + + if ($value === '') { + return static::$emptyString; + } + + $value = [Type::T_KEYWORD, $value]; + $color = $this->coerceColor($value); + + if ($color) { + return $color; + } + + return $value; + } + + /** + * Coerce something to map + * + * @param array|Number $item + * + * @return array|Number + */ + protected function coerceMap($item) + { + if ($item[0] === Type::T_MAP) { + return $item; + } + + if ( + $item[0] === Type::T_LIST && + $item[2] === [] + ) { + return static::$emptyMap; + } + + return $item; + } + + /** + * Coerce something to list + * + * @param array|Number $item + * @param string $delim + * @param boolean $removeTrailingNull + * + * @return array + */ + protected function coerceList($item, $delim = ',', $removeTrailingNull = false) + { + if ($item instanceof Number) { + return [Type::T_LIST, $delim, [$item]]; + } + + if ($item[0] === Type::T_LIST) { + // remove trailing null from the list + if ($removeTrailingNull && end($item[2]) === static::$null) { + array_pop($item[2]); + } + + return $item; + } + + if ($item[0] === Type::T_MAP) { + $keys = $item[1]; + $values = $item[2]; + $list = []; + + for ($i = 0, $s = \count($keys); $i < $s; $i++) { + $key = $keys[$i]; + $value = $values[$i]; + + switch ($key[0]) { + case Type::T_LIST: + case Type::T_MAP: + case Type::T_STRING: + case Type::T_NULL: + break; + + default: + $key = [Type::T_KEYWORD, $this->compileStringContent($this->coerceString($key))]; + break; + } + + $list[] = [ + Type::T_LIST, + '', + [$key, $value] + ]; + } + + return [Type::T_LIST, ',', $list]; + } + + return [Type::T_LIST, $delim, [$item]]; + } + + /** + * Coerce color for expression + * + * @param array|Number $value + * + * @return array|Number + */ + protected function coerceForExpression($value) + { + if ($color = $this->coerceColor($value)) { + return $color; + } + + return $value; + } + + /** + * Coerce value to color + * + * @param array|Number $value + * @param bool $inRGBFunction + * + * @return array|null + */ + protected function coerceColor($value, $inRGBFunction = false) + { + if ($value instanceof Number) { + return null; + } + + switch ($value[0]) { + case Type::T_COLOR: + for ($i = 1; $i <= 3; $i++) { + if (! is_numeric($value[$i])) { + $cv = $this->compileRGBAValue($value[$i]); + + if (! is_numeric($cv)) { + return null; + } + + $value[$i] = $cv; + } + + if (isset($value[4])) { + if (! is_numeric($value[4])) { + $cv = $this->compileRGBAValue($value[4], true); + + if (! is_numeric($cv)) { + return null; + } + + $value[4] = $cv; + } + } + } + + return $value; + + case Type::T_LIST: + if ($inRGBFunction) { + if (\count($value[2]) == 3 || \count($value[2]) == 4) { + $color = $value[2]; + array_unshift($color, Type::T_COLOR); + + return $this->coerceColor($color); + } + } + + return null; + + case Type::T_KEYWORD: + if (! \is_string($value[1])) { + return null; + } + + $name = strtolower($value[1]); + + // hexa color? + if (preg_match('/^#([0-9a-f]+)$/i', $name, $m)) { + $nofValues = \strlen($m[1]); + + if (\in_array($nofValues, [3, 4, 6, 8])) { + $nbChannels = 3; + $color = []; + $num = hexdec($m[1]); + + switch ($nofValues) { + case 4: + $nbChannels = 4; + // then continuing with the case 3: + case 3: + for ($i = 0; $i < $nbChannels; $i++) { + $t = $num & 0xf; + array_unshift($color, $t << 4 | $t); + $num >>= 4; + } + + break; + + case 8: + $nbChannels = 4; + // then continuing with the case 6: + case 6: + for ($i = 0; $i < $nbChannels; $i++) { + array_unshift($color, $num & 0xff); + $num >>= 8; + } + + break; + } + + if ($nbChannels === 4) { + if ($color[3] === 255) { + $color[3] = 1; // fully opaque + } else { + $color[3] = round($color[3] / 255, Number::PRECISION); + } + } + + array_unshift($color, Type::T_COLOR); + + return $color; + } + } + + if ($rgba = Colors::colorNameToRGBa($name)) { + return isset($rgba[3]) + ? [Type::T_COLOR, $rgba[0], $rgba[1], $rgba[2], $rgba[3]] + : [Type::T_COLOR, $rgba[0], $rgba[1], $rgba[2]]; + } + + return null; + } + + return null; + } + + /** + * @param integer|Number $value + * @param boolean $isAlpha + * + * @return integer|mixed + */ + protected function compileRGBAValue($value, $isAlpha = false) + { + if ($isAlpha) { + return $this->compileColorPartValue($value, 0, 1, false); + } + + return $this->compileColorPartValue($value, 0, 255, true); + } + + /** + * @param mixed $value + * @param integer|float $min + * @param integer|float $max + * @param boolean $isInt + * + * @return integer|mixed + */ + protected function compileColorPartValue($value, $min, $max, $isInt = true) + { + if (! is_numeric($value)) { + if (\is_array($value)) { + $reduced = $this->reduce($value); + + if ($reduced instanceof Number) { + $value = $reduced; + } + } + + if ($value instanceof Number) { + if ($value->unitless()) { + $num = $value->getDimension(); + } elseif ($value->hasUnit('%')) { + $num = $max * $value->getDimension() / 100; + } else { + throw $this->error('Expected %s to have no units or "%%".', $value); + } + + $value = $num; + } elseif (\is_array($value)) { + $value = $this->compileValue($value); + } + } + + if (is_numeric($value)) { + if ($isInt) { + $value = round($value); + } + + $value = min($max, max($min, $value)); + + return $value; + } + + return $value; + } + + /** + * Coerce value to string + * + * @param array|Number $value + * + * @return array + */ + protected function coerceString($value) + { + if ($value[0] === Type::T_STRING) { + return $value; + } + + return [Type::T_STRING, '', [$this->compileValue($value)]]; + } + + /** + * Assert value is a string + * + * This method deals with internal implementation details of the value + * representation where unquoted strings can sometimes be stored under + * other types. + * The returned value is always using the T_STRING type. + * + * @api + * + * @param array|Number $value + * @param string|null $varName + * + * @return array + * + * @throws SassScriptException + */ + public function assertString($value, $varName = null) + { + // case of url(...) parsed a a function + if ($value[0] === Type::T_FUNCTION) { + $value = $this->coerceString($value); + } + + if (! \in_array($value[0], [Type::T_STRING, Type::T_KEYWORD])) { + $value = $this->compileValue($value); + throw SassScriptException::forArgument("$value is not a string.", $varName); + } + + return $this->coerceString($value); + } + + /** + * Coerce value to a percentage + * + * @param array|Number $value + * + * @return integer|float + * + * @deprecated + */ + protected function coercePercent($value) + { + @trigger_error(sprintf('"%s" is deprecated since 1.7.0.', __METHOD__), E_USER_DEPRECATED); + + if ($value instanceof Number) { + if ($value->hasUnit('%')) { + return $value->getDimension() / 100; + } + + return $value->getDimension(); + } + + return 0; + } + + /** + * Assert value is a map + * + * @api + * + * @param array|Number $value + * @param string|null $varName + * + * @return array + * + * @throws SassScriptException + */ + public function assertMap($value, $varName = null) + { + $value = $this->coerceMap($value); + + if ($value[0] !== Type::T_MAP) { + $value = $this->compileValue($value); + + throw SassScriptException::forArgument("$value is not a map.", $varName); + } + + return $value; + } + + /** + * Assert value is a list + * + * @api + * + * @param array|Number $value + * + * @return array + * + * @throws \Exception + */ + public function assertList($value) + { + if ($value[0] !== Type::T_LIST) { + throw $this->error('expecting list, %s received', $value[0]); + } + + return $value; + } + + /** + * Gets the keywords of an argument list. + * + * Keys in the returned array are normalized names (underscores are replaced with dashes) + * without the leading `$`. + * Calling this helper with anything that an argument list received for a rest argument + * of the function argument declaration is not supported. + * + * @param array|Number $value + * + * @return array + */ + public function getArgumentListKeywords($value) + { + if ($value[0] !== Type::T_LIST || !isset($value[3]) || !\is_array($value[3])) { + throw new \InvalidArgumentException('The argument is not a sass argument list.'); + } + + return $value[3]; + } + + /** + * Assert value is a color + * + * @api + * + * @param array|Number $value + * @param string|null $varName + * + * @return array + * + * @throws SassScriptException + */ + public function assertColor($value, $varName = null) + { + if ($color = $this->coerceColor($value)) { + return $color; + } + + $value = $this->compileValue($value); + + throw SassScriptException::forArgument("$value is not a color.", $varName); + } + + /** + * Assert value is a number + * + * @api + * + * @param array|Number $value + * @param string|null $varName + * + * @return Number + * + * @throws SassScriptException + */ + public function assertNumber($value, $varName = null) + { + if (!$value instanceof Number) { + $value = $this->compileValue($value); + throw SassScriptException::forArgument("$value is not a number.", $varName); + } + + return $value; + } + + /** + * Assert value is a integer + * + * @api + * + * @param array|Number $value + * @param string|null $varName + * + * @return integer + * + * @throws SassScriptException + */ + public function assertInteger($value, $varName = null) + { + $value = $this->assertNumber($value, $varName)->getDimension(); + if (round($value - \intval($value), Number::PRECISION) > 0) { + throw SassScriptException::forArgument("$value is not an integer.", $varName); + } + + return intval($value); + } + + /** + * Extract the ... / alpha on the last argument of channel arg + * in color functions + * + * @param array $args + * @return array + */ + private function extractSlashAlphaInColorFunction($args) + { + $last = end($args); + if (\count($args) === 3 && $last[0] === Type::T_EXPRESSION && $last[1] === '/') { + array_pop($args); + $args[] = $last[2]; + $args[] = $last[3]; + } + return $args; + } + + + /** + * Make sure a color's components don't go out of bounds + * + * @param array $c + * + * @return array + */ + protected function fixColor($c) + { + foreach ([1, 2, 3] as $i) { + if ($c[$i] < 0) { + $c[$i] = 0; + } + + if ($c[$i] > 255) { + $c[$i] = 255; + } + + if (!\is_int($c[$i])) { + $c[$i] = round($c[$i]); + } + } + + return $c; + } + + /** + * Convert RGB to HSL + * + * @internal + * + * @param integer $red + * @param integer $green + * @param integer $blue + * + * @return array + */ + public function toHSL($red, $green, $blue) + { + $min = min($red, $green, $blue); + $max = max($red, $green, $blue); + + $l = $min + $max; + $d = $max - $min; + + if ((int) $d === 0) { + $h = $s = 0; + } else { + if ($l < 255) { + $s = $d / $l; + } else { + $s = $d / (510 - $l); + } + + if ($red == $max) { + $h = 60 * ($green - $blue) / $d; + } elseif ($green == $max) { + $h = 60 * ($blue - $red) / $d + 120; + } elseif ($blue == $max) { + $h = 60 * ($red - $green) / $d + 240; + } + } + + return [Type::T_HSL, fmod($h + 360, 360), $s * 100, $l / 5.1]; + } + + /** + * Hue to RGB helper + * + * @param float $m1 + * @param float $m2 + * @param float $h + * + * @return float + */ + protected function hueToRGB($m1, $m2, $h) + { + if ($h < 0) { + $h += 1; + } elseif ($h > 1) { + $h -= 1; + } + + if ($h * 6 < 1) { + return $m1 + ($m2 - $m1) * $h * 6; + } + + if ($h * 2 < 1) { + return $m2; + } + + if ($h * 3 < 2) { + return $m1 + ($m2 - $m1) * (2 / 3 - $h) * 6; + } + + return $m1; + } + + /** + * Convert HSL to RGB + * + * @internal + * + * @param int|float $hue H from 0 to 360 + * @param int|float $saturation S from 0 to 100 + * @param int|float $lightness L from 0 to 100 + * + * @return array + */ + public function toRGB($hue, $saturation, $lightness) + { + if ($hue < 0) { + $hue += 360; + } + + $h = $hue / 360; + $s = min(100, max(0, $saturation)) / 100; + $l = min(100, max(0, $lightness)) / 100; + + $m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s; + $m1 = $l * 2 - $m2; + + $r = $this->hueToRGB($m1, $m2, $h + 1 / 3) * 255; + $g = $this->hueToRGB($m1, $m2, $h) * 255; + $b = $this->hueToRGB($m1, $m2, $h - 1 / 3) * 255; + + $out = [Type::T_COLOR, $r, $g, $b]; + + return $out; + } + + /** + * Convert HWB to RGB + * https://www.w3.org/TR/css-color-4/#hwb-to-rgb + * + * @api + * + * @param integer $hue H from 0 to 360 + * @param integer $whiteness W from 0 to 100 + * @param integer $blackness B from 0 to 100 + * + * @return array + */ + private function HWBtoRGB($hue, $whiteness, $blackness) + { + $w = min(100, max(0, $whiteness)) / 100; + $b = min(100, max(0, $blackness)) / 100; + + $sum = $w + $b; + if ($sum > 1.0) { + $w = $w / $sum; + $b = $b / $sum; + } + $b = min(1.0 - $w, $b); + + $rgb = $this->toRGB($hue, 100, 50); + for($i = 1; $i < 4; $i++) { + $rgb[$i] *= (1.0 - $w - $b); + $rgb[$i] = round($rgb[$i] + 255 * $w + 0.0001); + } + + return $rgb; + } + + /** + * Convert RGB to HWB + * + * @api + * + * @param integer $red + * @param integer $green + * @param integer $blue + * + * @return array + */ + private function RGBtoHWB($red, $green, $blue) + { + $min = min($red, $green, $blue); + $max = max($red, $green, $blue); + + $d = $max - $min; + + if ((int) $d === 0) { + $h = 0; + } else { + + if ($red == $max) { + $h = 60 * ($green - $blue) / $d; + } elseif ($green == $max) { + $h = 60 * ($blue - $red) / $d + 120; + } elseif ($blue == $max) { + $h = 60 * ($red - $green) / $d + 240; + } + } + + return [Type::T_HWB, fmod($h, 360), $min / 255 * 100, 100 - $max / 255 *100]; + } + + + // Built in functions + + protected static $libCall = ['function', 'args...']; + protected function libCall($args) + { + $functionReference = $args[0]; + + if (in_array($functionReference[0], [Type::T_STRING, Type::T_KEYWORD])) { + $name = $this->compileStringContent($this->coerceString($functionReference)); + $warning = "Passing a string to call() is deprecated and will be illegal\n" + . "in Sass 4.0. Use call(function-reference($name)) instead."; + Warn::deprecation($warning); + $functionReference = $this->libGetFunction([$this->assertString($functionReference, 'function')]); + } + + if ($functionReference === static::$null) { + return static::$null; + } + + if (! in_array($functionReference[0], [Type::T_FUNCTION_REFERENCE, Type::T_FUNCTION])) { + throw $this->error('Function reference expected, got ' . $functionReference[0]); + } + + $callArgs = [ + [null, $args[1], true] + ]; + + return $this->reduce([Type::T_FUNCTION_CALL, $functionReference, $callArgs]); + } + + + protected static $libGetFunction = [ + ['name'], + ['name', 'css'] + ]; + protected function libGetFunction($args) + { + $name = $this->compileStringContent($this->assertString(array_shift($args), 'name')); + $isCss = false; + + if (count($args)) { + $isCss = array_shift($args); + $isCss = (($isCss === static::$true) ? true : false); + } + + if ($isCss) { + return [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]]; + } + + return $this->getFunctionReference($name, true); + } + + protected static $libIf = ['condition', 'if-true', 'if-false:']; + protected function libIf($args) + { + list($cond, $t, $f) = $args; + + if (! $this->isTruthy($this->reduce($cond, true))) { + return $this->reduce($f, true); + } + + return $this->reduce($t, true); + } + + protected static $libIndex = ['list', 'value']; + protected function libIndex($args) + { + list($list, $value) = $args; + + if ( + $list[0] === Type::T_MAP || + $list[0] === Type::T_STRING || + $list[0] === Type::T_KEYWORD || + $list[0] === Type::T_INTERPOLATE + ) { + $list = $this->coerceList($list, ' '); + } + + if ($list[0] !== Type::T_LIST) { + return static::$null; + } + + // Numbers are represented with value objects, for which the PHP equality operator does not + // match the Sass rules (and we cannot overload it). As they are the only type of values + // represented with a value object for now, they require a special case. + if ($value instanceof Number) { + $key = 0; + foreach ($list[2] as $item) { + $key++; + $itemValue = $this->normalizeValue($item); + + if ($itemValue instanceof Number && $value->equals($itemValue)) { + return new Number($key, ''); + } + } + return static::$null; + } + + $values = []; + + + foreach ($list[2] as $item) { + $values[] = $this->normalizeValue($item); + } + + $key = array_search($this->normalizeValue($value), $values); + + return false === $key ? static::$null : new Number($key + 1, ''); + } + + protected static $libRgb = [ + ['color'], + ['color', 'alpha'], + ['channels'], + ['red', 'green', 'blue'], + ['red', 'green', 'blue', 'alpha'] ]; + protected function libRgb($args, $kwargs, $funcName = 'rgb') + { + switch (\count($args)) { + case 1: + if (! $color = $this->coerceColor($args[0], true)) { + $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ')']]; + } + break; + + case 3: + $color = [Type::T_COLOR, $args[0], $args[1], $args[2]]; + + if (! $color = $this->coerceColor($color)) { + $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']]; + } + + return $color; + + case 2: + if ($color = $this->coerceColor($args[0], true)) { + $alpha = $this->compileRGBAValue($args[1], true); + + if (is_numeric($alpha)) { + $color[4] = $alpha; + } else { + $color = [Type::T_STRING, '', + [$funcName . '(', $color[1], ', ', $color[2], ', ', $color[3], ', ', $alpha, ')']]; + } + } else { + $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ')']]; + } + break; + + case 4: + default: + $color = [Type::T_COLOR, $args[0], $args[1], $args[2], $args[3]]; + + if (! $color = $this->coerceColor($color)) { + $color = [Type::T_STRING, '', + [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ', ', $args[3], ')']]; + } + break; + } + + return $color; + } + + protected static $libRgba = [ + ['color'], + ['color', 'alpha'], + ['channels'], + ['red', 'green', 'blue'], + ['red', 'green', 'blue', 'alpha'] ]; + protected function libRgba($args, $kwargs) + { + return $this->libRgb($args, $kwargs, 'rgba'); + } + + /** + * Helper function for adjust_color, change_color, and scale_color + * + * @param array $args + * @param string $operation + * @param callable $fn + * + * @return array + * + * @phpstan-param callable(float|int, float|int|null, float|int): (float|int) $fn + */ + protected function alterColor(array $args, $operation, $fn) + { + $color = $this->assertColor($args[0], 'color'); + + if ($args[1][2]) { + throw new SassScriptException('Only one positional argument is allowed. All other arguments must be passed by name.'); + } + + $kwargs = $this->getArgumentListKeywords($args[1]); + + $scale = $operation === 'scale'; + $change = $operation === 'change'; + + /** + * @param string $name + * @param float|int $max + * @param bool $checkPercent + * @param bool $assertPercent + * + * @return float|int|null + */ + $getParam = function ($name, $max, $checkPercent = false, $assertPercent = false) use (&$kwargs, $scale, $change) { + if (!isset($kwargs[$name])) { + return null; + } + + $number = $this->assertNumber($kwargs[$name], $name); + unset($kwargs[$name]); + + if (!$scale && $checkPercent) { + if (!$number->hasUnit('%')) { + $warning = $this->error("{$name} Passing a number `$number` without unit % is deprecated."); + $this->logger->warn($warning->getMessage(), true); + } + } + + if ($scale || $assertPercent) { + $number->assertUnit('%', $name); + } + + if ($scale) { + $max = 100; + } + + return $number->valueInRange($change ? 0 : -$max, $max, $name); + }; + + $alpha = $getParam('alpha', 1); + $red = $getParam('red', 255); + $green = $getParam('green', 255); + $blue = $getParam('blue', 255); + + if ($scale || !isset($kwargs['hue'])) { + $hue = null; + } else { + $hueNumber = $this->assertNumber($kwargs['hue'], 'hue'); + unset($kwargs['hue']); + $hue = $hueNumber->getDimension(); + } + $saturation = $getParam('saturation', 100, true); + $lightness = $getParam('lightness', 100, true); + $whiteness = $getParam('whiteness', 100, false, true); + $blackness = $getParam('blackness', 100, false, true); + + if (!empty($kwargs)) { + $unknownNames = array_keys($kwargs); + $lastName = array_pop($unknownNames); + $message = sprintf( + 'No argument%s named $%s%s.', + $unknownNames ? 's' : '', + $unknownNames ? implode(', $', $unknownNames) . ' or $' : '', + $lastName + ); + throw new SassScriptException($message); + } + + $hasRgb = $red !== null || $green !== null || $blue !== null; + $hasSL = $saturation !== null || $lightness !== null; + $hasWB = $whiteness !== null || $blackness !== null; + $found = false; + + if ($hasRgb && ($hasSL || $hasWB || $hue !== null)) { + throw new SassScriptException(sprintf('RGB parameters may not be passed along with %s parameters.', $hasWB ? 'HWB' : 'HSL')); + } + + if ($hasWB && $hasSL) { + throw new SassScriptException('HSL parameters may not be passed along with HWB parameters.'); + } + + if ($hasRgb) { + $color[1] = round($fn($color[1], $red, 255)); + $color[2] = round($fn($color[2], $green, 255)); + $color[3] = round($fn($color[3], $blue, 255)); + } elseif ($hasWB) { + $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]); + if ($hue !== null) { + $hwb[1] = $change ? $hue : $hwb[1] + $hue; + } + $hwb[2] = $fn($hwb[2], $whiteness, 100); + $hwb[3] = $fn($hwb[3], $blackness, 100); + + $rgb = $this->HWBtoRGB($hwb[1], $hwb[2], $hwb[3]); + + if (isset($color[4])) { + $rgb[4] = $color[4]; + } + + $color = $rgb; + } elseif ($hue !== null || $hasSL) { + $hsl = $this->toHSL($color[1], $color[2], $color[3]); + + if ($hue !== null) { + $hsl[1] = $change ? $hue : $hsl[1] + $hue; + } + $hsl[2] = $fn($hsl[2], $saturation, 100); + $hsl[3] = $fn($hsl[3], $lightness, 100); + + $rgb = $this->toRGB($hsl[1], $hsl[2], $hsl[3]); + + if (isset($color[4])) { + $rgb[4] = $color[4]; + } + + $color = $rgb; + } + + if ($alpha !== null) { + $existingAlpha = isset($color[4]) ? $color[4] : 1; + $color[4] = $fn($existingAlpha, $alpha, 1); + } + + return $color; + } + + protected static $libAdjustColor = ['color', 'kwargs...']; + protected function libAdjustColor($args) + { + return $this->alterColor($args, 'adjust', function ($base, $alter, $max) { + if ($alter === null) { + return $base; + } + + $new = $base + $alter; + + if ($new < 0) { + return 0; + } + + if ($new > $max) { + return $max; + } + + return $new; + }); + } + + protected static $libChangeColor = ['color', 'kwargs...']; + protected function libChangeColor($args) + { + return $this->alterColor($args,'change', function ($base, $alter, $max) { + if ($alter === null) { + return $base; + } + + return $alter; + }); + } + + protected static $libScaleColor = ['color', 'kwargs...']; + protected function libScaleColor($args) + { + return $this->alterColor($args, 'scale', function ($base, $scale, $max) { + if ($scale === null) { + return $base; + } + + $scale = $scale / 100; + + if ($scale < 0) { + return $base * $scale + $base; + } + + return ($max - $base) * $scale + $base; + }); + } + + protected static $libIeHexStr = ['color']; + protected function libIeHexStr($args) + { + $color = $this->coerceColor($args[0]); + + if (\is_null($color)) { + throw $this->error('Error: argument `$color` of `ie-hex-str($color)` must be a color'); + } + + $color[4] = isset($color[4]) ? round(255 * $color[4]) : 255; + + return [Type::T_STRING, '', [sprintf('#%02X%02X%02X%02X', $color[4], $color[1], $color[2], $color[3])]]; + } + + protected static $libRed = ['color']; + protected function libRed($args) + { + $color = $this->coerceColor($args[0]); + + if (\is_null($color)) { + throw $this->error('Error: argument `$color` of `red($color)` must be a color'); + } + + return new Number((int) $color[1], ''); + } + + protected static $libGreen = ['color']; + protected function libGreen($args) + { + $color = $this->coerceColor($args[0]); + + if (\is_null($color)) { + throw $this->error('Error: argument `$color` of `green($color)` must be a color'); + } + + return new Number((int) $color[2], ''); + } + + protected static $libBlue = ['color']; + protected function libBlue($args) + { + $color = $this->coerceColor($args[0]); + + if (\is_null($color)) { + throw $this->error('Error: argument `$color` of `blue($color)` must be a color'); + } + + return new Number((int) $color[3], ''); + } + + protected static $libAlpha = ['color']; + protected function libAlpha($args) + { + if ($color = $this->coerceColor($args[0])) { + return new Number(isset($color[4]) ? $color[4] : 1, ''); + } + + // this might be the IE function, so return value unchanged + return null; + } + + protected static $libOpacity = ['color']; + protected function libOpacity($args) + { + $value = $args[0]; + + if ($value instanceof Number) { + return null; + } + + return $this->libAlpha($args); + } + + // mix two colors + protected static $libMix = [ + ['color1', 'color2', 'weight:50%'], + ['color-1', 'color-2', 'weight:50%'] + ]; + protected function libMix($args) + { + list($first, $second, $weight) = $args; + + $first = $this->assertColor($first, 'color1'); + $second = $this->assertColor($second, 'color2'); + $weightScale = $this->assertNumber($weight, 'weight')->valueInRange(0, 100, 'weight') / 100; + + $firstAlpha = isset($first[4]) ? $first[4] : 1; + $secondAlpha = isset($second[4]) ? $second[4] : 1; + + $normalizedWeight = $weightScale * 2 - 1; + $alphaDistance = $firstAlpha - $secondAlpha; + + $combinedWeight = $normalizedWeight * $alphaDistance == -1 ? $normalizedWeight : ($normalizedWeight + $alphaDistance) / (1 + $normalizedWeight * $alphaDistance); + $weight1 = ($combinedWeight + 1) / 2.0; + $weight2 = 1.0 - $weight1; + + $new = [Type::T_COLOR, + $weight1 * $first[1] + $weight2 * $second[1], + $weight1 * $first[2] + $weight2 * $second[2], + $weight1 * $first[3] + $weight2 * $second[3], + ]; + + if ($firstAlpha != 1.0 || $secondAlpha != 1.0) { + $new[] = $firstAlpha * $weightScale + $secondAlpha * (1 - $weightScale); + } + + return $this->fixColor($new); + } + + protected static $libHsl = [ + ['channels'], + ['hue', 'saturation'], + ['hue', 'saturation', 'lightness'], + ['hue', 'saturation', 'lightness', 'alpha'] ]; + protected function libHsl($args, $kwargs, $funcName = 'hsl') + { + $args_to_check = $args; + + if (\count($args) == 1) { + if ($args[0][0] !== Type::T_LIST || \count($args[0][2]) < 3 || \count($args[0][2]) > 4) { + return [Type::T_STRING, '', [$funcName . '(', $args[0], ')']]; + } + + $args = $args[0][2]; + $args_to_check = $kwargs['channels'][2]; + } + + if (\count($args) === 2) { + // if var() is used as an argument, return as a css function + foreach ($args as $arg) { + if ($arg[0] === Type::T_FUNCTION && in_array($arg[1], ['var'])) { + return null; + } + } + + throw new SassScriptException('Missing argument $lightness.'); + } + + foreach ($kwargs as $k => $arg) { + if (in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && in_array($arg[1], ['min', 'max'])) { + return null; + } + } + + foreach ($args_to_check as $k => $arg) { + if (in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && in_array($arg[1], ['min', 'max'])) { + if (count($kwargs) > 1 || ($k >= 2 && count($args) === 4)) { + return null; + } + + $args[$k] = $this->stringifyFncallArgs($arg); + } + + if ( + $k >= 2 && count($args) === 4 && + in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && + in_array($arg[1], ['calc','env']) + ) { + return null; + } + } + + $hue = $this->reduce($args[0]); + $saturation = $this->reduce($args[1]); + $lightness = $this->reduce($args[2]); + $alpha = null; + + if (\count($args) === 4) { + $alpha = $this->compileColorPartValue($args[3], 0, 100, false); + + if (!$hue instanceof Number || !$saturation instanceof Number || ! $lightness instanceof Number || ! is_numeric($alpha)) { + return [Type::T_STRING, '', + [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ', ', $args[3], ')']]; + } + } else { + if (!$hue instanceof Number || !$saturation instanceof Number || ! $lightness instanceof Number) { + return [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']]; + } + } + + $hueValue = fmod($hue->getDimension(), 360); + + while ($hueValue < 0) { + $hueValue += 360; + } + + $color = $this->toRGB($hueValue, max(0, min($saturation->getDimension(), 100)), max(0, min($lightness->getDimension(), 100))); + + if (! \is_null($alpha)) { + $color[4] = $alpha; + } + + return $color; + } + + protected static $libHsla = [ + ['channels'], + ['hue', 'saturation'], + ['hue', 'saturation', 'lightness'], + ['hue', 'saturation', 'lightness', 'alpha']]; + protected function libHsla($args, $kwargs) + { + return $this->libHsl($args, $kwargs, 'hsla'); + } + + protected static $libHue = ['color']; + protected function libHue($args) + { + $color = $this->assertColor($args[0], 'color'); + $hsl = $this->toHSL($color[1], $color[2], $color[3]); + + return new Number($hsl[1], 'deg'); + } + + protected static $libSaturation = ['color']; + protected function libSaturation($args) + { + $color = $this->assertColor($args[0], 'color'); + $hsl = $this->toHSL($color[1], $color[2], $color[3]); + + return new Number($hsl[2], '%'); + } + + protected static $libLightness = ['color']; + protected function libLightness($args) + { + $color = $this->assertColor($args[0], 'color'); + $hsl = $this->toHSL($color[1], $color[2], $color[3]); + + return new Number($hsl[3], '%'); + } + + /* + * Todo : a integrer dans le futur module color + protected static $libHwb = [ + ['channels'], + ['hue', 'whiteness', 'blackness'], + ['hue', 'whiteness', 'blackness', 'alpha'] ]; + protected function libHwb($args, $kwargs, $funcName = 'hwb') + { + $args_to_check = $args; + + if (\count($args) == 1) { + if ($args[0][0] !== Type::T_LIST) { + throw $this->error("Missing elements \$whiteness and \$blackness"); + } + + if (\trim($args[0][1])) { + throw $this->error("\$channels must be a space-separated list."); + } + + if (! empty($args[0]['enclosing'])) { + throw $this->error("\$channels must be an unbracketed list."); + } + + $args = $args[0][2]; + if (\count($args) > 3) { + throw $this->error("hwb() : Only 3 elements are allowed but ". \count($args) . "were passed"); + } + + $args_to_check = $this->extractSlashAlphaInColorFunction($kwargs['channels'][2]); + if (\count($args_to_check) !== \count($kwargs['channels'][2])) { + $args = $args_to_check; + } + } + + if (\count($args_to_check) < 2) { + throw $this->error("Missing elements \$whiteness and \$blackness"); + } + if (\count($args_to_check) < 3) { + throw $this->error("Missing element \$blackness"); + } + if (\count($args_to_check) > 4) { + throw $this->error("hwb() : Only 4 elements are allowed but ". \count($args) . "were passed"); + } + + foreach ($kwargs as $k => $arg) { + if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) { + return null; + } + } + + foreach ($args_to_check as $k => $arg) { + if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) { + if (count($kwargs) > 1 || ($k >= 2 && count($args) === 4)) { + return null; + } + + $args[$k] = $this->stringifyFncallArgs($arg); + } + + if ( + $k >= 2 && count($args) === 4 && + in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) && + in_array($arg[1], ['calc','env']) + ) { + return null; + } + } + + $hue = $this->reduce($args[0]); + $whiteness = $this->reduce($args[1]); + $blackness = $this->reduce($args[2]); + $alpha = null; + + if (\count($args) === 4) { + $alpha = $this->compileColorPartValue($args[3], 0, 1, false); + + if (! \is_numeric($alpha)) { + $val = $this->compileValue($args[3]); + throw $this->error("\$alpha: $val is not a number"); + } + } + + $this->assertNumber($hue, 'hue'); + $this->assertUnit($whiteness, ['%'], 'whiteness'); + $this->assertUnit($blackness, ['%'], 'blackness'); + + $this->assertRange($whiteness, 0, 100, "0% and 100%", "whiteness"); + $this->assertRange($blackness, 0, 100, "0% and 100%", "blackness"); + + $w = $whiteness->getDimension(); + $b = $blackness->getDimension(); + + $hueValue = $hue->getDimension() % 360; + + while ($hueValue < 0) { + $hueValue += 360; + } + + $color = $this->HWBtoRGB($hueValue, $w, $b); + + if (! \is_null($alpha)) { + $color[4] = $alpha; + } + + return $color; + } + + protected static $libWhiteness = ['color']; + protected function libWhiteness($args, $kwargs, $funcName = 'whiteness') { + + $color = $this->assertColor($args[0]); + $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]); + + return new Number($hwb[2], '%'); + } + + protected static $libBlackness = ['color']; + protected function libBlackness($args, $kwargs, $funcName = 'blackness') { + + $color = $this->assertColor($args[0]); + $hwb = $this->RGBtoHWB($color[1], $color[2], $color[3]); + + return new Number($hwb[3], '%'); + } + */ + + protected function adjustHsl($color, $idx, $amount) + { + $hsl = $this->toHSL($color[1], $color[2], $color[3]); + $hsl[$idx] += $amount; + + if ($idx !== 1) { + // Clamp the saturation and lightness + $hsl[$idx] = min(max(0, $hsl[$idx]), 100); + } + + $out = $this->toRGB($hsl[1], $hsl[2], $hsl[3]); + + if (isset($color[4])) { + $out[4] = $color[4]; + } + + return $out; + } + + protected static $libAdjustHue = ['color', 'degrees']; + protected function libAdjustHue($args) + { + $color = $this->assertColor($args[0], 'color'); + $degrees = $this->assertNumber($args[1], 'degrees')->getDimension(); + + return $this->adjustHsl($color, 1, $degrees); + } + + protected static $libLighten = ['color', 'amount']; + protected function libLighten($args) + { + $color = $this->assertColor($args[0], 'color'); + $amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%'); + + return $this->adjustHsl($color, 3, $amount); + } + + protected static $libDarken = ['color', 'amount']; + protected function libDarken($args) + { + $color = $this->assertColor($args[0], 'color'); + $amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%'); + + return $this->adjustHsl($color, 3, -$amount); + } + + protected static $libSaturate = [['color', 'amount'], ['amount']]; + protected function libSaturate($args) + { + $value = $args[0]; + + if (count($args) === 1) { + $this->assertNumber($args[0], 'amount'); + + return null; + } + + $color = $this->assertColor($args[0], 'color'); + $amount = $this->assertNumber($args[1], 'amount'); + + return $this->adjustHsl($color, 2, $amount->valueInRange(0, 100, 'amount')); + } + + protected static $libDesaturate = ['color', 'amount']; + protected function libDesaturate($args) + { + $color = $this->assertColor($args[0], 'color'); + $amount = $this->assertNumber($args[1], 'amount'); + + return $this->adjustHsl($color, 2, -$amount->valueInRange(0, 100, 'amount')); + } + + protected static $libGrayscale = ['color']; + protected function libGrayscale($args) + { + $value = $args[0]; + + if ($value instanceof Number) { + return null; + } + + return $this->adjustHsl($this->assertColor($value, 'color'), 2, -100); + } + + protected static $libComplement = ['color']; + protected function libComplement($args) + { + return $this->adjustHsl($this->assertColor($args[0], 'color'), 1, 180); + } + + protected static $libInvert = ['color', 'weight:100%']; + protected function libInvert($args) + { + $value = $args[0]; + + $weight = $this->assertNumber($args[1], 'weight'); + + if ($value instanceof Number) { + if ($weight->getDimension() != 100 || !$weight->hasUnit('%')) { + throw new SassScriptException('Only one argument may be passed to the plain-CSS invert() function.'); + } + + return null; + } + + $color = $this->assertColor($value, 'color'); + $inverted = $color; + $inverted[1] = 255 - $inverted[1]; + $inverted[2] = 255 - $inverted[2]; + $inverted[3] = 255 - $inverted[3]; + + return $this->libMix([$inverted, $color, $weight]); + } + + // increases opacity by amount + protected static $libOpacify = ['color', 'amount']; + protected function libOpacify($args) + { + $color = $this->assertColor($args[0], 'color'); + $amount = $this->assertNumber($args[1], 'amount'); + + $color[4] = (isset($color[4]) ? $color[4] : 1) + $amount->valueInRange(0, 1, 'amount'); + $color[4] = min(1, max(0, $color[4])); + + return $color; + } + + protected static $libFadeIn = ['color', 'amount']; + protected function libFadeIn($args) + { + return $this->libOpacify($args); + } + + // decreases opacity by amount + protected static $libTransparentize = ['color', 'amount']; + protected function libTransparentize($args) + { + $color = $this->assertColor($args[0], 'color'); + $amount = $this->assertNumber($args[1], 'amount'); + + $color[4] = (isset($color[4]) ? $color[4] : 1) - $amount->valueInRange(0, 1, 'amount'); + $color[4] = min(1, max(0, $color[4])); + + return $color; + } + + protected static $libFadeOut = ['color', 'amount']; + protected function libFadeOut($args) + { + return $this->libTransparentize($args); + } + + protected static $libUnquote = ['string']; + protected function libUnquote($args) + { + try { + $str = $this->assertString($args[0], 'string'); + } catch (SassScriptException $e) { + $value = $this->compileValue($args[0]); + $fname = $this->getPrettyPath($this->sourceNames[$this->sourceIndex]); + $line = $this->sourceLine; + + $message = "Passing $value, a non-string value, to unquote() +will be an error in future versions of Sass.\n on line $line of $fname"; + + $this->logger->warn($message, true); + + return $args[0]; + } + + $str[1] = ''; + + return $str; + } + + protected static $libQuote = ['string']; + protected function libQuote($args) + { + $value = $this->assertString($args[0], 'string'); + + $value[1] = '"'; + + return $value; + } + + protected static $libPercentage = ['number']; + protected function libPercentage($args) + { + $num = $this->assertNumber($args[0], 'number'); + $num->assertNoUnits('number'); + + return new Number($num->getDimension() * 100, '%'); + } + + protected static $libRound = ['number']; + protected function libRound($args) + { + $num = $this->assertNumber($args[0], 'number'); + + return new Number(round($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); + } + + protected static $libFloor = ['number']; + protected function libFloor($args) + { + $num = $this->assertNumber($args[0], 'number'); + + return new Number(floor($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); + } + + protected static $libCeil = ['number']; + protected function libCeil($args) + { + $num = $this->assertNumber($args[0], 'number'); + + return new Number(ceil($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); + } + + protected static $libAbs = ['number']; + protected function libAbs($args) + { + $num = $this->assertNumber($args[0], 'number'); + + return new Number(abs($num->getDimension()), $num->getNumeratorUnits(), $num->getDenominatorUnits()); + } + + protected static $libMin = ['numbers...']; + protected function libMin($args) + { + /** + * @var Number|null + */ + $min = null; + + foreach ($args[0][2] as $arg) { + $number = $this->assertNumber($arg); + + if (\is_null($min) || $min->greaterThan($number)) { + $min = $number; + } + } + + if (!\is_null($min)) { + return $min; + } + + throw $this->error('At least one argument must be passed.'); + } + + protected static $libMax = ['numbers...']; + protected function libMax($args) + { + /** + * @var Number|null + */ + $max = null; + + foreach ($args[0][2] as $arg) { + $number = $this->assertNumber($arg); + + if (\is_null($max) || $max->lessThan($number)) { + $max = $number; + } + } + + if (!\is_null($max)) { + return $max; + } + + throw $this->error('At least one argument must be passed.'); + } + + protected static $libLength = ['list']; + protected function libLength($args) + { + $list = $this->coerceList($args[0], ',', true); + + return new Number(\count($list[2]), ''); + } + + protected static $libListSeparator = ['list']; + protected function libListSeparator($args) + { + if (! \in_array($args[0][0], [Type::T_LIST, Type::T_MAP])) { + return [Type::T_KEYWORD, 'space']; + } + + $list = $this->coerceList($args[0]); + + if (\count($list[2]) <= 1 && empty($list['enclosing'])) { + return [Type::T_KEYWORD, 'space']; + } + + if ($list[1] === ',') { + return [Type::T_KEYWORD, 'comma']; + } + + return [Type::T_KEYWORD, 'space']; + } + + protected static $libNth = ['list', 'n']; + protected function libNth($args) + { + $list = $this->coerceList($args[0], ',', false); + $n = $this->assertNumber($args[1])->getDimension(); + + if ($n > 0) { + $n--; + } elseif ($n < 0) { + $n += \count($list[2]); + } + + return isset($list[2][$n]) ? $list[2][$n] : static::$defaultValue; + } + + protected static $libSetNth = ['list', 'n', 'value']; + protected function libSetNth($args) + { + $list = $this->coerceList($args[0]); + $n = $this->assertNumber($args[1])->getDimension(); + + if ($n > 0) { + $n--; + } elseif ($n < 0) { + $n += \count($list[2]); + } + + if (! isset($list[2][$n])) { + throw $this->error('Invalid argument for "n"'); + } + + $list[2][$n] = $args[2]; + + return $list; + } + + protected static $libMapGet = ['map', 'key']; + protected function libMapGet($args) + { + $map = $this->assertMap($args[0], 'map'); + $key = $args[1]; + + if (! \is_null($key)) { + $key = $this->compileStringContent($this->coerceString($key)); + + for ($i = \count($map[1]) - 1; $i >= 0; $i--) { + if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) { + return $map[2][$i]; + } + } + } + + return static::$null; + } + + protected static $libMapKeys = ['map']; + protected function libMapKeys($args) + { + $map = $this->assertMap($args[0], 'map'); + $keys = $map[1]; + + return [Type::T_LIST, ',', $keys]; + } + + protected static $libMapValues = ['map']; + protected function libMapValues($args) + { + $map = $this->assertMap($args[0], 'map'); + $values = $map[2]; + + return [Type::T_LIST, ',', $values]; + } + + protected static $libMapRemove = [ + ['map'], + ['map', 'key', 'keys...'], + ]; + protected function libMapRemove($args) + { + $map = $this->assertMap($args[0], 'map'); + + if (\count($args) === 1) { + return $map; + } + + $keys = []; + $keys[] = $this->compileStringContent($this->coerceString($args[1])); + + foreach ($args[2][2] as $key) { + $keys[] = $this->compileStringContent($this->coerceString($key)); + } + + for ($i = \count($map[1]) - 1; $i >= 0; $i--) { + if (in_array($this->compileStringContent($this->coerceString($map[1][$i])), $keys)) { + array_splice($map[1], $i, 1); + array_splice($map[2], $i, 1); + } + } + + return $map; + } + + protected static $libMapHasKey = ['map', 'key']; + protected function libMapHasKey($args) + { + $map = $this->assertMap($args[0], 'map'); + + return $this->toBool($this->mapHasKey($map, $args[1])); + } + + /** + * @param array|Number $keyValue + * + * @return bool + */ + private function mapHasKey(array $map, $keyValue) + { + $key = $this->compileStringContent($this->coerceString($keyValue)); + + for ($i = \count($map[1]) - 1; $i >= 0; $i--) { + if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) { + return true; + } + } + + return false; + } + + protected static $libMapMerge = [ + ['map1', 'map2'], + ['map-1', 'map-2'] + ]; + protected function libMapMerge($args) + { + $map1 = $this->assertMap($args[0], 'map1'); + $map2 = $this->assertMap($args[1], 'map2'); + + foreach ($map2[1] as $i2 => $key2) { + $key = $this->compileStringContent($this->coerceString($key2)); + + foreach ($map1[1] as $i1 => $key1) { + if ($key === $this->compileStringContent($this->coerceString($key1))) { + $map1[2][$i1] = $map2[2][$i2]; + continue 2; + } + } + + $map1[1][] = $map2[1][$i2]; + $map1[2][] = $map2[2][$i2]; + } + + return $map1; + } + + protected static $libKeywords = ['args']; + protected function libKeywords($args) + { + $value = $args[0]; + + if ($value[0] !== Type::T_LIST || !isset($value[3]) || !\is_array($value[3])) { + $compiledValue = $this->compileValue($value); + + throw SassScriptException::forArgument($compiledValue . ' is not an argument list.', 'args'); + } + + $keys = []; + $values = []; + + foreach ($this->getArgumentListKeywords($value) as $name => $arg) { + $keys[] = [Type::T_KEYWORD, $name]; + $values[] = $arg; + } + + return [Type::T_MAP, $keys, $values]; + } + + protected static $libIsBracketed = ['list']; + protected function libIsBracketed($args) + { + $list = $args[0]; + $this->coerceList($list, ' '); + + if (! empty($list['enclosing']) && $list['enclosing'] === 'bracket') { + return self::$true; + } + + return self::$false; + } + + /** + * @param array $list1 + * @param array|Number|null $sep + * + * @return string + * @throws CompilerException + */ + protected function listSeparatorForJoin($list1, $sep) + { + if (! isset($sep)) { + return $list1[1]; + } + + switch ($this->compileValue($sep)) { + case 'comma': + return ','; + + case 'space': + return ' '; + + default: + return $list1[1]; + } + } + + protected static $libJoin = ['list1', 'list2', 'separator:null', 'bracketed:auto']; + protected function libJoin($args) + { + list($list1, $list2, $sep, $bracketed) = $args; + + $list1 = $this->coerceList($list1, ' ', true); + $list2 = $this->coerceList($list2, ' ', true); + $sep = $this->listSeparatorForJoin($list1, $sep); + + if ($bracketed === static::$true) { + $bracketed = true; + } elseif ($bracketed === static::$false) { + $bracketed = false; + } elseif ($bracketed === [Type::T_KEYWORD, 'auto']) { + $bracketed = 'auto'; + } elseif ($bracketed === static::$null) { + $bracketed = false; + } else { + $bracketed = $this->compileValue($bracketed); + $bracketed = ! ! $bracketed; + + if ($bracketed === true) { + $bracketed = true; + } + } + + if ($bracketed === 'auto') { + $bracketed = false; + + if (! empty($list1['enclosing']) && $list1['enclosing'] === 'bracket') { + $bracketed = true; + } + } + + $res = [Type::T_LIST, $sep, array_merge($list1[2], $list2[2])]; + + if (isset($list1['enclosing'])) { + $res['enlcosing'] = $list1['enclosing']; + } + + if ($bracketed) { + $res['enclosing'] = 'bracket'; + } + + return $res; + } + + protected static $libAppend = ['list', 'val', 'separator:null']; + protected function libAppend($args) + { + list($list1, $value, $sep) = $args; + + $list1 = $this->coerceList($list1, ' ', true); + $sep = $this->listSeparatorForJoin($list1, $sep); + $res = [Type::T_LIST, $sep, array_merge($list1[2], [$value])]; + + if (isset($list1['enclosing'])) { + $res['enclosing'] = $list1['enclosing']; + } + + return $res; + } + + protected static $libZip = ['lists...']; + protected function libZip($args) + { + $argLists = []; + foreach ($args[0][2] as $arg) { + $argLists[] = $this->coerceList($arg); + } + + $lists = []; + $firstList = array_shift($argLists); + + $result = [Type::T_LIST, ',', $lists]; + if (! \is_null($firstList)) { + foreach ($firstList[2] as $key => $item) { + $list = [Type::T_LIST, '', [$item]]; + + foreach ($argLists as $arg) { + if (isset($arg[2][$key])) { + $list[2][] = $arg[2][$key]; + } else { + break 2; + } + } + + $lists[] = $list; + } + + $result[2] = $lists; + } else { + $result['enclosing'] = 'parent'; + } + + return $result; + } + + protected static $libTypeOf = ['value']; + protected function libTypeOf($args) + { + $value = $args[0]; + + return [Type::T_KEYWORD, $this->getTypeOf($value)]; + } + + /** + * @param array|Number $value + * + * @return string + */ + private function getTypeOf($value) + { + switch ($value[0]) { + case Type::T_KEYWORD: + if ($value === static::$true || $value === static::$false) { + return 'bool'; + } + + if ($this->coerceColor($value)) { + return 'color'; + } + + // fall-thru + case Type::T_FUNCTION: + return 'string'; + + case Type::T_FUNCTION_REFERENCE: + return 'function'; + + case Type::T_LIST: + if (isset($value[3]) && \is_array($value[3])) { + return 'arglist'; + } + + // fall-thru + default: + return $value[0]; + } + } + + protected static $libUnit = ['number']; + protected function libUnit($args) + { + $num = $this->assertNumber($args[0], 'number'); + + return [Type::T_STRING, '"', [$num->unitStr()]]; + } + + protected static $libUnitless = ['number']; + protected function libUnitless($args) + { + $value = $this->assertNumber($args[0], 'number'); + + return $this->toBool($value->unitless()); + } + + protected static $libComparable = [ + ['number1', 'number2'], + ['number-1', 'number-2'] + ]; + protected function libComparable($args) + { + list($number1, $number2) = $args; + + if ( + ! $number1 instanceof Number || + ! $number2 instanceof Number + ) { + throw $this->error('Invalid argument(s) for "comparable"'); + } + + return $this->toBool($number1->isComparableTo($number2)); + } + + protected static $libStrIndex = ['string', 'substring']; + protected function libStrIndex($args) + { + $string = $this->assertString($args[0], 'string'); + $stringContent = $this->compileStringContent($string); + + $substring = $this->assertString($args[1], 'substring'); + $substringContent = $this->compileStringContent($substring); + + if (! \strlen($substringContent)) { + $result = 0; + } else { + $result = Util::mbStrpos($stringContent, $substringContent); + } + + return $result === false ? static::$null : new Number($result + 1, ''); + } + + protected static $libStrInsert = ['string', 'insert', 'index']; + protected function libStrInsert($args) + { + $string = $this->assertString($args[0], 'string'); + $stringContent = $this->compileStringContent($string); + + $insert = $this->assertString($args[1], 'insert'); + $insertContent = $this->compileStringContent($insert); + + $index = $this->assertInteger($args[2], 'index'); + if ($index > 0) { + $index = $index - 1; + } + if ($index < 0) { + $index = Util::mbStrlen($stringContent) + 1 + $index; + } + + $string[2] = [ + Util::mbSubstr($stringContent, 0, $index), + $insertContent, + Util::mbSubstr($stringContent, $index) + ]; + + return $string; + } + + protected static $libStrLength = ['string']; + protected function libStrLength($args) + { + $string = $this->assertString($args[0], 'string'); + $stringContent = $this->compileStringContent($string); + + return new Number(Util::mbStrlen($stringContent), ''); + } + + protected static $libStrSlice = ['string', 'start-at', 'end-at:-1']; + protected function libStrSlice($args) + { + $string = $this->assertString($args[0], 'string'); + $stringContent = $this->compileStringContent($string); + + $start = $this->assertNumber($args[1], 'start-at'); + $start->assertNoUnits('start-at'); + $startInt = $this->assertInteger($start, 'start-at'); + $end = $this->assertNumber($args[2], 'end-at'); + $end->assertNoUnits('end-at'); + $endInt = $this->assertInteger($end, 'end-at'); + + if ($endInt === 0) { + return [Type::T_STRING, $string[1], []]; + } + + if ($startInt > 0) { + $startInt--; + } + + if ($endInt < 0) { + $endInt = Util::mbStrlen($stringContent) + $endInt; + } else { + $endInt--; + } + + if ($endInt < $startInt) { + return [Type::T_STRING, $string[1], []]; + } + + $length = $endInt - $startInt + 1; // The end of the slice is inclusive + + $string[2] = [Util::mbSubstr($stringContent, $startInt, $length)]; + + return $string; + } + + protected static $libToLowerCase = ['string']; + protected function libToLowerCase($args) + { + $string = $this->assertString($args[0], 'string'); + $stringContent = $this->compileStringContent($string); + + $string[2] = [$this->stringTransformAsciiOnly($stringContent, 'strtolower')]; + + return $string; + } + + protected static $libToUpperCase = ['string']; + protected function libToUpperCase($args) + { + $string = $this->assertString($args[0], 'string'); + $stringContent = $this->compileStringContent($string); + + $string[2] = [$this->stringTransformAsciiOnly($stringContent, 'strtoupper')]; + + return $string; + } + + /** + * Apply a filter on a string content, only on ascii chars + * let extended chars untouched + * + * @param string $stringContent + * @param callable $filter + * @return string + */ + protected function stringTransformAsciiOnly($stringContent, $filter) + { + $mblength = Util::mbStrlen($stringContent); + if ($mblength === strlen($stringContent)) { + return $filter($stringContent); + } + $filteredString = ""; + for ($i = 0; $i < $mblength; $i++) { + $char = Util::mbSubstr($stringContent, $i, 1); + if (strlen($char) > 1) { + $filteredString .= $char; + } else { + $filteredString .= $filter($char); + } + } + + return $filteredString; + } + + protected static $libFeatureExists = ['feature']; + protected function libFeatureExists($args) + { + $string = $this->assertString($args[0], 'feature'); + $name = $this->compileStringContent($string); + + return $this->toBool( + \array_key_exists($name, $this->registeredFeatures) ? $this->registeredFeatures[$name] : false + ); + } + + protected static $libFunctionExists = ['name']; + protected function libFunctionExists($args) + { + $string = $this->assertString($args[0], 'name'); + $name = $this->compileStringContent($string); + + // user defined functions + if ($this->has(static::$namespaces['function'] . $name)) { + return self::$true; + } + + $name = $this->normalizeName($name); + + if (isset($this->userFunctions[$name])) { + return self::$true; + } + + // built-in functions + $f = $this->getBuiltinFunction($name); + + return $this->toBool(\is_callable($f)); + } + + protected static $libGlobalVariableExists = ['name']; + protected function libGlobalVariableExists($args) + { + $string = $this->assertString($args[0], 'name'); + $name = $this->compileStringContent($string); + + return $this->toBool($this->has($name, $this->rootEnv)); + } + + protected static $libMixinExists = ['name']; + protected function libMixinExists($args) + { + $string = $this->assertString($args[0], 'name'); + $name = $this->compileStringContent($string); + + return $this->toBool($this->has(static::$namespaces['mixin'] . $name)); + } + + protected static $libVariableExists = ['name']; + protected function libVariableExists($args) + { + $string = $this->assertString($args[0], 'name'); + $name = $this->compileStringContent($string); + + return $this->toBool($this->has($name)); + } + + protected static $libCounter = ['args...']; + /** + * Workaround IE7's content counter bug. + * + * @param array $args + * + * @return array + */ + protected function libCounter($args) + { + $list = array_map([$this, 'compileValue'], $args[0][2]); + + return [Type::T_STRING, '', ['counter(' . implode(',', $list) . ')']]; + } + + protected static $libRandom = ['limit:null']; + protected function libRandom($args) + { + if (isset($args[0]) && $args[0] !== static::$null) { + $n = $this->assertInteger($args[0], 'limit'); + + if ($n < 1) { + throw new SassScriptException("\$limit: Must be greater than 0, was $n."); + } + + return new Number(mt_rand(1, $n), ''); + } + + $max = mt_getrandmax(); + return new Number(mt_rand(0, $max - 1) / $max, ''); + } + + protected static $libUniqueId = []; + protected function libUniqueId() + { + static $id; + + if (! isset($id)) { + $id = PHP_INT_SIZE === 4 + ? mt_rand(0, pow(36, 5)) . str_pad(mt_rand(0, pow(36, 5)) % 10000000, 7, '0', STR_PAD_LEFT) + : mt_rand(0, pow(36, 8)); + } + + $id += mt_rand(0, 10) + 1; + + return [Type::T_STRING, '', ['u' . str_pad(base_convert($id, 10, 36), 8, '0', STR_PAD_LEFT)]]; + } + + /** + * @param array|Number $value + * @param bool $force_enclosing_display + * + * @return array + */ + protected function inspectFormatValue($value, $force_enclosing_display = false) + { + if ($value === static::$null) { + $value = [Type::T_KEYWORD, 'null']; + } + + $stringValue = [$value]; + + if ($value instanceof Number) { + return [Type::T_STRING, '', $stringValue]; + } + + if ($value[0] === Type::T_LIST) { + if (end($value[2]) === static::$null) { + array_pop($value[2]); + $value[2][] = [Type::T_STRING, '', ['']]; + $force_enclosing_display = true; + } + + if ( + ! empty($value['enclosing']) && + ($force_enclosing_display || + ($value['enclosing'] === 'bracket') || + ! \count($value[2])) + ) { + $value['enclosing'] = 'forced_' . $value['enclosing']; + $force_enclosing_display = true; + } + + foreach ($value[2] as $k => $listelement) { + $value[2][$k] = $this->inspectFormatValue($listelement, $force_enclosing_display); + } + + $stringValue = [$value]; + } + + return [Type::T_STRING, '', $stringValue]; + } + + protected static $libInspect = ['value']; + protected function libInspect($args) + { + $value = $args[0]; + + return $this->inspectFormatValue($value); + } + + /** + * Preprocess selector args + * + * @param array $arg + * @param string|null $varname + * @param bool $allowParent + * + * @return array + */ + protected function getSelectorArg($arg, $varname = null, $allowParent = false) + { + static $parser = null; + + if (\is_null($parser)) { + $parser = $this->parserFactory(__METHOD__); + } + + if (! $this->checkSelectorArgType($arg)) { + $var_value = $this->compileValue($arg); + throw SassScriptException::forArgument("$var_value is not a valid selector: it must be a string, a list of strings, or a list of lists of strings", $varname); + } + + + if ($arg[0] === Type::T_STRING) { + $arg[1] = ''; + } + $arg = $this->compileValue($arg); + + $parsedSelector = []; + + if ($parser->parseSelector($arg, $parsedSelector, true)) { + $selector = $this->evalSelectors($parsedSelector); + $gluedSelector = $this->glueFunctionSelectors($selector); + + if (! $allowParent) { + foreach ($gluedSelector as $selector) { + foreach ($selector as $s) { + if (in_array(static::$selfSelector, $s)) { + throw SassScriptException::forArgument("Parent selectors aren't allowed here.", $varname); + } + } + } + } + + return $gluedSelector; + } + + throw SassScriptException::forArgument("expected more input, invalid selector.", $varname); + } + + /** + * Check variable type for getSelectorArg() function + * @param array $arg + * @param int $maxDepth + * @return bool + */ + protected function checkSelectorArgType($arg, $maxDepth = 2) + { + if ($arg[0] === Type::T_LIST && $maxDepth > 0) { + foreach ($arg[2] as $elt) { + if (! $this->checkSelectorArgType($elt, $maxDepth - 1)) { + return false; + } + } + return true; + } + if (!in_array($arg[0], [Type::T_STRING, Type::T_KEYWORD])) { + return false; + } + return true; + } + + /** + * Postprocess selector to output in right format + * + * @param array $selectors + * + * @return array + */ + protected function formatOutputSelector($selectors) + { + $selectors = $this->collapseSelectorsAsList($selectors); + + return $selectors; + } + + protected static $libIsSuperselector = ['super', 'sub']; + protected function libIsSuperselector($args) + { + list($super, $sub) = $args; + + $super = $this->getSelectorArg($super, 'super'); + $sub = $this->getSelectorArg($sub, 'sub'); + + return $this->toBool($this->isSuperSelector($super, $sub)); + } + + /** + * Test a $super selector again $sub + * + * @param array $super + * @param array $sub + * + * @return boolean + */ + protected function isSuperSelector($super, $sub) + { + // one and only one selector for each arg + if (! $super) { + throw $this->error('Invalid super selector for isSuperSelector()'); + } + + if (! $sub) { + throw $this->error('Invalid sub selector for isSuperSelector()'); + } + + if (count($sub) > 1) { + foreach ($sub as $s) { + if (! $this->isSuperSelector($super, [$s])) { + return false; + } + } + return true; + } + + if (count($super) > 1) { + foreach ($super as $s) { + if ($this->isSuperSelector([$s], $sub)) { + return true; + } + } + return false; + } + + $super = reset($super); + $sub = reset($sub); + + $i = 0; + $nextMustMatch = false; + + foreach ($super as $node) { + $compound = ''; + + array_walk_recursive( + $node, + function ($value, $key) use (&$compound) { + $compound .= $value; + } + ); + + if ($this->isImmediateRelationshipCombinator($compound)) { + if ($node !== $sub[$i]) { + return false; + } + + $nextMustMatch = true; + $i++; + } else { + while ($i < \count($sub) && ! $this->isSuperPart($node, $sub[$i])) { + if ($nextMustMatch) { + return false; + } + + $i++; + } + + if ($i >= \count($sub)) { + return false; + } + + $nextMustMatch = false; + $i++; + } + } + + return true; + } + + /** + * Test a part of super selector again a part of sub selector + * + * @param array $superParts + * @param array $subParts + * + * @return boolean + */ + protected function isSuperPart($superParts, $subParts) + { + $i = 0; + + foreach ($superParts as $superPart) { + while ($i < \count($subParts) && $subParts[$i] !== $superPart) { + $i++; + } + + if ($i >= \count($subParts)) { + return false; + } + + $i++; + } + + return true; + } + + protected static $libSelectorAppend = ['selector...']; + protected function libSelectorAppend($args) + { + // get the selector... list + $args = reset($args); + $args = $args[2]; + + if (\count($args) < 1) { + throw $this->error('selector-append() needs at least 1 argument'); + } + + $selectors = []; + foreach ($args as $arg) { + $selectors[] = $this->getSelectorArg($arg, 'selector'); + } + + return $this->formatOutputSelector($this->selectorAppend($selectors)); + } + + /** + * Append parts of the last selector in the list to the previous, recursively + * + * @param array $selectors + * + * @return array + * + * @throws \ScssPhp\ScssPhp\Exception\CompilerException + */ + protected function selectorAppend($selectors) + { + $lastSelectors = array_pop($selectors); + + if (! $lastSelectors) { + throw $this->error('Invalid selector list in selector-append()'); + } + + while (\count($selectors)) { + $previousSelectors = array_pop($selectors); + + if (! $previousSelectors) { + throw $this->error('Invalid selector list in selector-append()'); + } + + // do the trick, happening $lastSelector to $previousSelector + $appended = []; + + foreach ($lastSelectors as $lastSelector) { + $previous = $previousSelectors; + + foreach ($lastSelector as $lastSelectorParts) { + foreach ($lastSelectorParts as $lastSelectorPart) { + foreach ($previous as $i => $previousSelector) { + foreach ($previousSelector as $j => $previousSelectorParts) { + $previous[$i][$j][] = $lastSelectorPart; + } + } + } + } + + foreach ($previous as $ps) { + $appended[] = $ps; + } + } + + $lastSelectors = $appended; + } + + return $lastSelectors; + } + + protected static $libSelectorExtend = [ + ['selector', 'extendee', 'extender'], + ['selectors', 'extendee', 'extender'] + ]; + protected function libSelectorExtend($args) + { + list($selectors, $extendee, $extender) = $args; + + $selectors = $this->getSelectorArg($selectors, 'selector'); + $extendee = $this->getSelectorArg($extendee, 'extendee'); + $extender = $this->getSelectorArg($extender, 'extender'); + + if (! $selectors || ! $extendee || ! $extender) { + throw $this->error('selector-extend() invalid arguments'); + } + + $extended = $this->extendOrReplaceSelectors($selectors, $extendee, $extender); + + return $this->formatOutputSelector($extended); + } + + protected static $libSelectorReplace = [ + ['selector', 'original', 'replacement'], + ['selectors', 'original', 'replacement'] + ]; + protected function libSelectorReplace($args) + { + list($selectors, $original, $replacement) = $args; + + $selectors = $this->getSelectorArg($selectors, 'selector'); + $original = $this->getSelectorArg($original, 'original'); + $replacement = $this->getSelectorArg($replacement, 'replacement'); + + if (! $selectors || ! $original || ! $replacement) { + throw $this->error('selector-replace() invalid arguments'); + } + + $replaced = $this->extendOrReplaceSelectors($selectors, $original, $replacement, true); + + return $this->formatOutputSelector($replaced); + } + + /** + * Extend/replace in selectors + * used by selector-extend and selector-replace that use the same logic + * + * @param array $selectors + * @param array $extendee + * @param array $extender + * @param boolean $replace + * + * @return array + */ + protected function extendOrReplaceSelectors($selectors, $extendee, $extender, $replace = false) + { + $saveExtends = $this->extends; + $saveExtendsMap = $this->extendsMap; + + $this->extends = []; + $this->extendsMap = []; + + foreach ($extendee as $es) { + if (\count($es) !== 1) { + throw $this->error('Can\'t extend complex selector.'); + } + + // only use the first one + $this->pushExtends(reset($es), $extender, null); + } + + $extended = []; + + foreach ($selectors as $selector) { + if (! $replace) { + $extended[] = $selector; + } + + $n = \count($extended); + + $this->matchExtends($selector, $extended); + + // if didnt match, keep the original selector if we are in a replace operation + if ($replace && \count($extended) === $n) { + $extended[] = $selector; + } + } + + $this->extends = $saveExtends; + $this->extendsMap = $saveExtendsMap; + + return $extended; + } + + protected static $libSelectorNest = ['selector...']; + protected function libSelectorNest($args) + { + // get the selector... list + $args = reset($args); + $args = $args[2]; + + if (\count($args) < 1) { + throw $this->error('selector-nest() needs at least 1 argument'); + } + + $selectorsMap = []; + foreach ($args as $arg) { + $selectorsMap[] = $this->getSelectorArg($arg, 'selector', true); + } + + $envs = []; + + foreach ($selectorsMap as $selectors) { + $env = new Environment(); + $env->selectors = $selectors; + + $envs[] = $env; + } + + $envs = array_reverse($envs); + $env = $this->extractEnv($envs); + $outputSelectors = $this->multiplySelectors($env); + + return $this->formatOutputSelector($outputSelectors); + } + + protected static $libSelectorParse = [ + ['selector'], + ['selectors'] + ]; + protected function libSelectorParse($args) + { + $selectors = reset($args); + $selectors = $this->getSelectorArg($selectors, 'selector'); + + return $this->formatOutputSelector($selectors); + } + + protected static $libSelectorUnify = ['selectors1', 'selectors2']; + protected function libSelectorUnify($args) + { + list($selectors1, $selectors2) = $args; + + $selectors1 = $this->getSelectorArg($selectors1, 'selectors1'); + $selectors2 = $this->getSelectorArg($selectors2, 'selectors2'); + + if (! $selectors1 || ! $selectors2) { + throw $this->error('selector-unify() invalid arguments'); + } + + // only consider the first compound of each + $compound1 = reset($selectors1); + $compound2 = reset($selectors2); + + // unify them and that's it + $unified = $this->unifyCompoundSelectors($compound1, $compound2); + + return $this->formatOutputSelector($unified); + } + + /** + * The selector-unify magic as its best + * (at least works as expected on test cases) + * + * @param array $compound1 + * @param array $compound2 + * + * @return array + */ + protected function unifyCompoundSelectors($compound1, $compound2) + { + if (! \count($compound1)) { + return $compound2; + } + + if (! \count($compound2)) { + return $compound1; + } + + // check that last part are compatible + $lastPart1 = array_pop($compound1); + $lastPart2 = array_pop($compound2); + $last = $this->mergeParts($lastPart1, $lastPart2); + + if (! $last) { + return [[]]; + } + + $unifiedCompound = [$last]; + $unifiedSelectors = [$unifiedCompound]; + + // do the rest + while (\count($compound1) || \count($compound2)) { + $part1 = end($compound1); + $part2 = end($compound2); + + if ($part1 && ($match2 = $this->matchPartInCompound($part1, $compound2))) { + list($compound2, $part2, $after2) = $match2; + + if ($after2) { + $unifiedSelectors = $this->prependSelectors($unifiedSelectors, $after2); + } + + $c = $this->mergeParts($part1, $part2); + $unifiedSelectors = $this->prependSelectors($unifiedSelectors, [$c]); + + $part1 = $part2 = null; + + array_pop($compound1); + } + + if ($part2 && ($match1 = $this->matchPartInCompound($part2, $compound1))) { + list($compound1, $part1, $after1) = $match1; + + if ($after1) { + $unifiedSelectors = $this->prependSelectors($unifiedSelectors, $after1); + } + + $c = $this->mergeParts($part2, $part1); + $unifiedSelectors = $this->prependSelectors($unifiedSelectors, [$c]); + + $part1 = $part2 = null; + + array_pop($compound2); + } + + $new = []; + + if ($part1 && $part2) { + array_pop($compound1); + array_pop($compound2); + + $s = $this->prependSelectors($unifiedSelectors, [$part2]); + $new = array_merge($new, $this->prependSelectors($s, [$part1])); + $s = $this->prependSelectors($unifiedSelectors, [$part1]); + $new = array_merge($new, $this->prependSelectors($s, [$part2])); + } elseif ($part1) { + array_pop($compound1); + + $new = array_merge($new, $this->prependSelectors($unifiedSelectors, [$part1])); + } elseif ($part2) { + array_pop($compound2); + + $new = array_merge($new, $this->prependSelectors($unifiedSelectors, [$part2])); + } + + if ($new) { + $unifiedSelectors = $new; + } + } + + return $unifiedSelectors; + } + + /** + * Prepend each selector from $selectors with $parts + * + * @param array $selectors + * @param array $parts + * + * @return array + */ + protected function prependSelectors($selectors, $parts) + { + $new = []; + + foreach ($selectors as $compoundSelector) { + array_unshift($compoundSelector, $parts); + + $new[] = $compoundSelector; + } + + return $new; + } + + /** + * Try to find a matching part in a compound: + * - with same html tag name + * - with some class or id or something in common + * + * @param array $part + * @param array $compound + * + * @return array|false + */ + protected function matchPartInCompound($part, $compound) + { + $partTag = $this->findTagName($part); + $before = $compound; + $after = []; + + // try to find a match by tag name first + while (\count($before)) { + $p = array_pop($before); + + if ($partTag && $partTag !== '*' && $partTag == $this->findTagName($p)) { + return [$before, $p, $after]; + } + + $after[] = $p; + } + + // try again matching a non empty intersection and a compatible tagname + $before = $compound; + $after = []; + + while (\count($before)) { + $p = array_pop($before); + + if ($this->checkCompatibleTags($partTag, $this->findTagName($p))) { + if (\count(array_intersect($part, $p))) { + return [$before, $p, $after]; + } + } + + $after[] = $p; + } + + return false; + } + + /** + * Merge two part list taking care that + * - the html tag is coming first - if any + * - the :something are coming last + * + * @param array $parts1 + * @param array $parts2 + * + * @return array + */ + protected function mergeParts($parts1, $parts2) + { + $tag1 = $this->findTagName($parts1); + $tag2 = $this->findTagName($parts2); + $tag = $this->checkCompatibleTags($tag1, $tag2); + + // not compatible tags + if ($tag === false) { + return []; + } + + if ($tag) { + if ($tag1) { + $parts1 = array_diff($parts1, [$tag1]); + } + + if ($tag2) { + $parts2 = array_diff($parts2, [$tag2]); + } + } + + $mergedParts = array_merge($parts1, $parts2); + $mergedOrderedParts = []; + + foreach ($mergedParts as $part) { + if (strpos($part, ':') === 0) { + $mergedOrderedParts[] = $part; + } + } + + $mergedParts = array_diff($mergedParts, $mergedOrderedParts); + $mergedParts = array_merge($mergedParts, $mergedOrderedParts); + + if ($tag) { + array_unshift($mergedParts, $tag); + } + + return $mergedParts; + } + + /** + * Check the compatibility between two tag names: + * if both are defined they should be identical or one has to be '*' + * + * @param string $tag1 + * @param string $tag2 + * + * @return array|false + */ + protected function checkCompatibleTags($tag1, $tag2) + { + $tags = [$tag1, $tag2]; + $tags = array_unique($tags); + $tags = array_filter($tags); + + if (\count($tags) > 1) { + $tags = array_diff($tags, ['*']); + } + + // not compatible nodes + if (\count($tags) > 1) { + return false; + } + + return $tags; + } + + /** + * Find the html tag name in a selector parts list + * + * @param string[] $parts + * + * @return string + */ + protected function findTagName($parts) + { + foreach ($parts as $part) { + if (! preg_match('/^[\[.:#%_-]/', $part)) { + return $part; + } + } + + return ''; + } + + protected static $libSimpleSelectors = ['selector']; + protected function libSimpleSelectors($args) + { + $selector = reset($args); + $selector = $this->getSelectorArg($selector, 'selector'); + + // remove selectors list layer, keeping the first one + $selector = reset($selector); + + // remove parts list layer, keeping the first part + $part = reset($selector); + + $listParts = []; + + foreach ($part as $p) { + $listParts[] = [Type::T_STRING, '', [$p]]; + } + + return [Type::T_LIST, ',', $listParts]; + } + + protected static $libScssphpGlob = ['pattern']; + protected function libScssphpGlob($args) + { + @trigger_error(sprintf('The "scssphp-glob" function is deprecated an will be removed in ScssPhp 2.0. Register your own alternative through "%s::registerFunction', __CLASS__), E_USER_DEPRECATED); + + $this->logger->warn('The "scssphp-glob" function is deprecated an will be removed in ScssPhp 2.0.', true); + + $string = $this->assertString($args[0], 'pattern'); + $pattern = $this->compileStringContent($string); + $matches = glob($pattern); + $listParts = []; + + foreach ($matches as $match) { + if (! is_file($match)) { + continue; + } + + $listParts[] = [Type::T_STRING, '"', [$match]]; + } + + return [Type::T_LIST, ',', $listParts]; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler/CachedResult.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler/CachedResult.php new file mode 100644 index 0000000..a662919 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler/CachedResult.php @@ -0,0 +1,77 @@ + + */ + private $parsedFiles; + + /** + * @var array + * @phpstan-var list + */ + private $resolvedImports; + + /** + * @param CompilationResult $result + * @param array $parsedFiles + * @param array $resolvedImports + * + * @phpstan-param list $resolvedImports + */ + public function __construct(CompilationResult $result, array $parsedFiles, array $resolvedImports) + { + $this->result = $result; + $this->parsedFiles = $parsedFiles; + $this->resolvedImports = $resolvedImports; + } + + /** + * @return CompilationResult + */ + public function getResult() + { + return $this->result; + } + + /** + * @return array + */ + public function getParsedFiles() + { + return $this->parsedFiles; + } + + /** + * @return array + * + * @phpstan-return list + */ + public function getResolvedImports() + { + return $this->resolvedImports; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler/Environment.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler/Environment.php new file mode 100644 index 0000000..306b15a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Compiler/Environment.php @@ -0,0 +1,48 @@ + + * + * @internal + */ +class Environment +{ + /** + * @var \ScssPhp\ScssPhp\Block|null + */ + public $block; + + /** + * @var \ScssPhp\ScssPhp\Compiler\Environment|null + */ + public $parent; + + /** + * @var array + */ + public $store; + + /** + * @var array + */ + public $storeUnreduced; + + /** + * @var integer + */ + public $depth; +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/CompilerException.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/CompilerException.php new file mode 100644 index 0000000..0b00cf5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/CompilerException.php @@ -0,0 +1,24 @@ + + * + * @internal + */ +class CompilerException extends \Exception implements SassException +{ +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/ParserException.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/ParserException.php new file mode 100644 index 0000000..00d77ec --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/ParserException.php @@ -0,0 +1,50 @@ + + * + * @internal + */ +class ParserException extends \Exception implements SassException +{ + /** + * @var array + */ + private $sourcePosition; + + /** + * Get source position + * + * @api + */ + public function getSourcePosition() + { + return $this->sourcePosition; + } + + /** + * Set source position + * + * @api + * + * @param array $sourcePosition + */ + public function setSourcePosition($sourcePosition) + { + $this->sourcePosition = $sourcePosition; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/RangeException.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/RangeException.php new file mode 100644 index 0000000..4be4dee --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/RangeException.php @@ -0,0 +1,24 @@ + + * + * @internal + */ +class RangeException extends \Exception implements SassException +{ +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/SassException.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/SassException.php new file mode 100644 index 0000000..9f62b3c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Exception/SassException.php @@ -0,0 +1,7 @@ + + * + * @deprecated The Scssphp server should define its own exception instead. + */ +class ServerException extends \Exception implements SassException +{ +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter.php new file mode 100644 index 0000000..cc42ae8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter.php @@ -0,0 +1,364 @@ + + * + * @internal + */ +abstract class Formatter +{ + /** + * @var integer + */ + public $indentLevel; + + /** + * @var string + */ + public $indentChar; + + /** + * @var string + */ + public $break; + + /** + * @var string + */ + public $open; + + /** + * @var string + */ + public $close; + + /** + * @var string + */ + public $tagSeparator; + + /** + * @var string + */ + public $assignSeparator; + + /** + * @var boolean + */ + public $keepSemicolons; + + /** + * @var \ScssPhp\ScssPhp\Formatter\OutputBlock + */ + protected $currentBlock; + + /** + * @var integer + */ + protected $currentLine; + + /** + * @var integer + */ + protected $currentColumn; + + /** + * @var \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null + */ + protected $sourceMapGenerator; + + /** + * @var string + */ + protected $strippedSemicolon; + + /** + * Initialize formatter + * + * @api + */ + abstract public function __construct(); + + /** + * Return indentation (whitespace) + * + * @return string + */ + protected function indentStr() + { + return ''; + } + + /** + * Return property assignment + * + * @api + * + * @param string $name + * @param mixed $value + * + * @return string + */ + public function property($name, $value) + { + return rtrim($name) . $this->assignSeparator . $value . ';'; + } + + /** + * Return custom property assignment + * differs in that you have to keep spaces in the value as is + * + * @api + * + * @param string $name + * @param mixed $value + * + * @return string + */ + public function customProperty($name, $value) + { + return rtrim($name) . trim($this->assignSeparator) . $value . ';'; + } + + /** + * Output lines inside a block + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + * + * @return void + */ + protected function blockLines(OutputBlock $block) + { + $inner = $this->indentStr(); + $glue = $this->break . $inner; + + $this->write($inner . implode($glue, $block->lines)); + + if (! empty($block->children)) { + $this->write($this->break); + } + } + + /** + * Output block selectors + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + * + * @return void + */ + protected function blockSelectors(OutputBlock $block) + { + assert(! empty($block->selectors)); + + $inner = $this->indentStr(); + + $this->write($inner + . implode($this->tagSeparator, $block->selectors) + . $this->open . $this->break); + } + + /** + * Output block children + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + * + * @return void + */ + protected function blockChildren(OutputBlock $block) + { + foreach ($block->children as $child) { + $this->block($child); + } + } + + /** + * Output non-empty block + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + * + * @return void + */ + protected function block(OutputBlock $block) + { + if (empty($block->lines) && empty($block->children)) { + return; + } + + $this->currentBlock = $block; + + $pre = $this->indentStr(); + + if (! empty($block->selectors)) { + $this->blockSelectors($block); + + $this->indentLevel++; + } + + if (! empty($block->lines)) { + $this->blockLines($block); + } + + if (! empty($block->children)) { + $this->blockChildren($block); + } + + if (! empty($block->selectors)) { + $this->indentLevel--; + + if (! $this->keepSemicolons) { + $this->strippedSemicolon = ''; + } + + if (empty($block->children)) { + $this->write($this->break); + } + + $this->write($pre . $this->close . $this->break); + } + } + + /** + * Test and clean safely empty children + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + * + * @return boolean + */ + protected function testEmptyChildren($block) + { + $isEmpty = empty($block->lines); + + if ($block->children) { + foreach ($block->children as $k => &$child) { + if (! $this->testEmptyChildren($child)) { + $isEmpty = false; + continue; + } + + if ($child->type === Type::T_MEDIA || $child->type === Type::T_DIRECTIVE) { + $child->children = []; + $child->selectors = null; + } + } + } + + return $isEmpty; + } + + /** + * Entry point to formatting a block + * + * @api + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block An abstract syntax tree + * @param \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null $sourceMapGenerator Optional source map generator + * + * @return string + */ + public function format(OutputBlock $block, SourceMapGenerator $sourceMapGenerator = null) + { + $this->sourceMapGenerator = null; + + if ($sourceMapGenerator) { + $this->currentLine = 1; + $this->currentColumn = 0; + $this->sourceMapGenerator = $sourceMapGenerator; + } + + $this->testEmptyChildren($block); + + ob_start(); + + $this->block($block); + + $out = ob_get_clean(); + + return $out; + } + + /** + * Output content + * + * @param string $str + * + * @return void + */ + protected function write($str) + { + if (! empty($this->strippedSemicolon)) { + echo $this->strippedSemicolon; + + $this->strippedSemicolon = ''; + } + + /* + * Maybe Strip semi-colon appended by property(); it's a separator, not a terminator + * will be striped for real before a closing, otherwise displayed unchanged starting the next write + */ + if ( + ! $this->keepSemicolons && + $str && + (strpos($str, ';') !== false) && + (substr($str, -1) === ';') + ) { + $str = substr($str, 0, -1); + + $this->strippedSemicolon = ';'; + } + + if ($this->sourceMapGenerator) { + $lines = explode("\n", $str); + $lastLine = array_pop($lines); + + foreach ($lines as $line) { + // If the written line starts is empty, adding a mapping would add it for + // a non-existent column as we are at the end of the line + if ($line !== '') { + $this->sourceMapGenerator->addMapping( + $this->currentLine, + $this->currentColumn, + $this->currentBlock->sourceLine, + //columns from parser are off by one + $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0, + $this->currentBlock->sourceName + ); + } + + $this->currentLine++; + $this->currentColumn = 0; + } + + if ($lastLine !== '') { + $this->sourceMapGenerator->addMapping( + $this->currentLine, + $this->currentColumn, + $this->currentBlock->sourceLine, + //columns from parser are off by one + $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0, + $this->currentBlock->sourceName + ); + } + + $this->currentColumn += \strlen($lastLine); + } + + echo $str; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Compact.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Compact.php new file mode 100644 index 0000000..22f2268 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Compact.php @@ -0,0 +1,52 @@ + + * + * @deprecated since 1.4.0. Use the Compressed formatter instead. + * + * @internal + */ +class Compact extends Formatter +{ + /** + * {@inheritdoc} + */ + public function __construct() + { + @trigger_error('The Compact formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', E_USER_DEPRECATED); + + $this->indentLevel = 0; + $this->indentChar = ''; + $this->break = ''; + $this->open = ' {'; + $this->close = "}\n\n"; + $this->tagSeparator = ','; + $this->assignSeparator = ':'; + $this->keepSemicolons = true; + } + + /** + * {@inheritdoc} + */ + public function indentStr() + { + return ' '; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Compressed.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Compressed.php new file mode 100644 index 0000000..de13c18 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Compressed.php @@ -0,0 +1,85 @@ + + * + * @internal + */ +class Compressed extends Formatter +{ + /** + * {@inheritdoc} + */ + public function __construct() + { + $this->indentLevel = 0; + $this->indentChar = ' '; + $this->break = ''; + $this->open = '{'; + $this->close = '}'; + $this->tagSeparator = ','; + $this->assignSeparator = ':'; + $this->keepSemicolons = false; + } + + /** + * {@inheritdoc} + */ + public function blockLines(OutputBlock $block) + { + $inner = $this->indentStr(); + + $glue = $this->break . $inner; + + foreach ($block->lines as $index => $line) { + if (substr($line, 0, 2) === '/*' && substr($line, 2, 1) !== '!') { + unset($block->lines[$index]); + } elseif (substr($line, 0, 3) === '/*!') { + $block->lines[$index] = '/*' . substr($line, 3); + } + } + + $this->write($inner . implode($glue, $block->lines)); + + if (! empty($block->children)) { + $this->write($this->break); + } + } + + /** + * Output block selectors + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + */ + protected function blockSelectors(OutputBlock $block) + { + assert(! empty($block->selectors)); + + $inner = $this->indentStr(); + + $this->write( + $inner + . implode( + $this->tagSeparator, + str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors) + ) + . $this->open . $this->break + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Crunched.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Crunched.php new file mode 100644 index 0000000..2bc1e92 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Crunched.php @@ -0,0 +1,87 @@ + + * + * @deprecated since 1.4.0. Use the Compressed formatter instead. + * + * @internal + */ +class Crunched extends Formatter +{ + /** + * {@inheritdoc} + */ + public function __construct() + { + @trigger_error('The Crunched formatter is deprecated since 1.4.0. Use the Compressed formatter instead.', E_USER_DEPRECATED); + + $this->indentLevel = 0; + $this->indentChar = ' '; + $this->break = ''; + $this->open = '{'; + $this->close = '}'; + $this->tagSeparator = ','; + $this->assignSeparator = ':'; + $this->keepSemicolons = false; + } + + /** + * {@inheritdoc} + */ + public function blockLines(OutputBlock $block) + { + $inner = $this->indentStr(); + + $glue = $this->break . $inner; + + foreach ($block->lines as $index => $line) { + if (substr($line, 0, 2) === '/*') { + unset($block->lines[$index]); + } + } + + $this->write($inner . implode($glue, $block->lines)); + + if (! empty($block->children)) { + $this->write($this->break); + } + } + + /** + * Output block selectors + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + */ + protected function blockSelectors(OutputBlock $block) + { + assert(! empty($block->selectors)); + + $inner = $this->indentStr(); + + $this->write( + $inner + . implode( + $this->tagSeparator, + str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors) + ) + . $this->open . $this->break + ); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Debug.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Debug.php new file mode 100644 index 0000000..b3f4422 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Debug.php @@ -0,0 +1,127 @@ + + * + * @deprecated since 1.4.0. + * + * @internal + */ +class Debug extends Formatter +{ + /** + * {@inheritdoc} + */ + public function __construct() + { + @trigger_error('The Debug formatter is deprecated since 1.4.0.', E_USER_DEPRECATED); + + $this->indentLevel = 0; + $this->indentChar = ''; + $this->break = "\n"; + $this->open = ' {'; + $this->close = ' }'; + $this->tagSeparator = ', '; + $this->assignSeparator = ': '; + $this->keepSemicolons = true; + } + + /** + * {@inheritdoc} + */ + protected function indentStr() + { + return str_repeat(' ', $this->indentLevel); + } + + /** + * {@inheritdoc} + */ + protected function blockLines(OutputBlock $block) + { + $indent = $this->indentStr(); + + if (empty($block->lines)) { + $this->write("{$indent}block->lines: []\n"); + + return; + } + + foreach ($block->lines as $index => $line) { + $this->write("{$indent}block->lines[{$index}]: $line\n"); + } + } + + /** + * {@inheritdoc} + */ + protected function blockSelectors(OutputBlock $block) + { + $indent = $this->indentStr(); + + if (empty($block->selectors)) { + $this->write("{$indent}block->selectors: []\n"); + + return; + } + + foreach ($block->selectors as $index => $selector) { + $this->write("{$indent}block->selectors[{$index}]: $selector\n"); + } + } + + /** + * {@inheritdoc} + */ + protected function blockChildren(OutputBlock $block) + { + $indent = $this->indentStr(); + + if (empty($block->children)) { + $this->write("{$indent}block->children: []\n"); + + return; + } + + $this->indentLevel++; + + foreach ($block->children as $i => $child) { + $this->block($child); + } + + $this->indentLevel--; + } + + /** + * {@inheritdoc} + */ + protected function block(OutputBlock $block) + { + $indent = $this->indentStr(); + + $this->write("{$indent}block->type: {$block->type}\n" . + "{$indent}block->depth: {$block->depth}\n"); + + $this->currentBlock = $block; + + $this->blockSelectors($block); + $this->blockLines($block); + $this->blockChildren($block); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Expanded.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Expanded.php new file mode 100644 index 0000000..a280416 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Expanded.php @@ -0,0 +1,70 @@ + + * + * @internal + */ +class Expanded extends Formatter +{ + /** + * {@inheritdoc} + */ + public function __construct() + { + $this->indentLevel = 0; + $this->indentChar = ' '; + $this->break = "\n"; + $this->open = ' {'; + $this->close = '}'; + $this->tagSeparator = ', '; + $this->assignSeparator = ': '; + $this->keepSemicolons = true; + } + + /** + * {@inheritdoc} + */ + protected function indentStr() + { + return str_repeat($this->indentChar, $this->indentLevel); + } + + /** + * {@inheritdoc} + */ + protected function blockLines(OutputBlock $block) + { + $inner = $this->indentStr(); + + $glue = $this->break . $inner; + + foreach ($block->lines as $index => $line) { + if (substr($line, 0, 2) === '/*') { + $block->lines[$index] = preg_replace('/\r\n?|\n|\f/', $this->break, $line); + } + } + + $this->write($inner . implode($glue, $block->lines)); + + if (empty($block->selectors) || ! empty($block->children)) { + $this->write($this->break); + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Nested.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Nested.php new file mode 100644 index 0000000..9e72956 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/Nested.php @@ -0,0 +1,236 @@ + + * + * @deprecated since 1.4.0. Use the Expanded formatter instead. + * + * @internal + */ +class Nested extends Formatter +{ + /** + * @var integer + */ + private $depth; + + /** + * {@inheritdoc} + */ + public function __construct() + { + @trigger_error('The Nested formatter is deprecated since 1.4.0. Use the Expanded formatter instead.', E_USER_DEPRECATED); + + $this->indentLevel = 0; + $this->indentChar = ' '; + $this->break = "\n"; + $this->open = ' {'; + $this->close = ' }'; + $this->tagSeparator = ', '; + $this->assignSeparator = ': '; + $this->keepSemicolons = true; + } + + /** + * {@inheritdoc} + */ + protected function indentStr() + { + $n = $this->depth - 1; + + return str_repeat($this->indentChar, max($this->indentLevel + $n, 0)); + } + + /** + * {@inheritdoc} + */ + protected function blockLines(OutputBlock $block) + { + $inner = $this->indentStr(); + $glue = $this->break . $inner; + + foreach ($block->lines as $index => $line) { + if (substr($line, 0, 2) === '/*') { + $block->lines[$index] = preg_replace('/\r\n?|\n|\f/', $this->break, $line); + } + } + + $this->write($inner . implode($glue, $block->lines)); + } + + /** + * {@inheritdoc} + */ + protected function block(OutputBlock $block) + { + static $depths; + static $downLevel; + static $closeBlock; + static $previousEmpty; + static $previousHasSelector; + + if ($block->type === 'root') { + $depths = [ 0 ]; + $downLevel = ''; + $closeBlock = ''; + $this->depth = 0; + $previousEmpty = false; + $previousHasSelector = false; + } + + $isMediaOrDirective = \in_array($block->type, [Type::T_DIRECTIVE, Type::T_MEDIA]); + $isSupport = ($block->type === Type::T_DIRECTIVE + && $block->selectors && strpos(implode('', $block->selectors), '@supports') !== false); + + while ($block->depth < end($depths) || ($block->depth == 1 && end($depths) == 1)) { + array_pop($depths); + $this->depth--; + + if ( + ! $this->depth && ($block->depth <= 1 || (! $this->indentLevel && $block->type === Type::T_COMMENT)) && + (($block->selectors && ! $isMediaOrDirective) || $previousHasSelector) + ) { + $downLevel = $this->break; + } + + if (empty($block->lines) && empty($block->children)) { + $previousEmpty = true; + } + } + + if (empty($block->lines) && empty($block->children)) { + return; + } + + $this->currentBlock = $block; + + if (! empty($block->lines) || (! empty($block->children) && ($this->depth < 1 || $isSupport))) { + if ($block->depth > end($depths)) { + if (! $previousEmpty || $this->depth < 1) { + $this->depth++; + + $depths[] = $block->depth; + } else { + // keep the current depth unchanged but take the block depth as a new reference for following blocks + array_pop($depths); + + $depths[] = $block->depth; + } + } + } + + $previousEmpty = ($block->type === Type::T_COMMENT); + $previousHasSelector = false; + + if (! empty($block->selectors)) { + if ($closeBlock) { + $this->write($closeBlock); + $closeBlock = ''; + } + + if ($downLevel) { + $this->write($downLevel); + $downLevel = ''; + } + + $this->blockSelectors($block); + + $this->indentLevel++; + } + + if (! empty($block->lines)) { + if ($closeBlock) { + $this->write($closeBlock); + $closeBlock = ''; + } + + if ($downLevel) { + $this->write($downLevel); + $downLevel = ''; + } + + $this->blockLines($block); + + $closeBlock = $this->break; + } + + if (! empty($block->children)) { + if ($this->depth > 0 && ($isMediaOrDirective || ! $this->hasFlatChild($block))) { + array_pop($depths); + + $this->depth--; + $this->blockChildren($block); + $this->depth++; + + $depths[] = $block->depth; + } else { + $this->blockChildren($block); + } + } + + // reclear to not be spoiled by children if T_DIRECTIVE + if ($block->type === Type::T_DIRECTIVE) { + $previousHasSelector = false; + } + + if (! empty($block->selectors)) { + $this->indentLevel--; + + if (! $this->keepSemicolons) { + $this->strippedSemicolon = ''; + } + + $this->write($this->close); + + $closeBlock = $this->break; + + if ($this->depth > 1 && ! empty($block->children)) { + array_pop($depths); + $this->depth--; + } + + if (! $isMediaOrDirective) { + $previousHasSelector = true; + } + } + + if ($block->type === 'root') { + $this->write($this->break); + } + } + + /** + * Block has flat child + * + * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block + * + * @return boolean + */ + private function hasFlatChild($block) + { + foreach ($block->children as $child) { + if (empty($child->selectors)) { + return true; + } + } + + return false; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/OutputBlock.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/OutputBlock.php new file mode 100644 index 0000000..88deb2d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Formatter/OutputBlock.php @@ -0,0 +1,68 @@ + + * + * @internal + */ +class OutputBlock +{ + /** + * @var string + */ + public $type; + + /** + * @var integer + */ + public $depth; + + /** + * @var array|null + */ + public $selectors; + + /** + * @var string[] + */ + public $lines; + + /** + * @var OutputBlock[] + */ + public $children; + + /** + * @var OutputBlock|null + */ + public $parent; + + /** + * @var string|null + */ + public $sourceName; + + /** + * @var integer|null + */ + public $sourceLine; + + /** + * @var integer|null + */ + public $sourceColumn; +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Logger/LoggerInterface.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Logger/LoggerInterface.php new file mode 100644 index 0000000..7c0a2f7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Logger/LoggerInterface.php @@ -0,0 +1,48 @@ +stream = $stream; + $this->closeOnDestruct = $closeOnDestruct; + } + + /** + * @internal + */ + public function __destruct() + { + if ($this->closeOnDestruct) { + fclose($this->stream); + } + } + + /** + * @inheritDoc + */ + public function warn($message, $deprecation = false) + { + $prefix = ($deprecation ? 'DEPRECATION ' : '') . 'WARNING: '; + + fwrite($this->stream, $prefix . $message . "\n\n"); + } + + /** + * @inheritDoc + */ + public function debug($message) + { + fwrite($this->stream, $message . "\n"); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Node.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Node.php new file mode 100644 index 0000000..5301937 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Node.php @@ -0,0 +1,43 @@ + + * + * @internal + */ +abstract class Node +{ + /** + * @var string + */ + public $type; + + /** + * @var integer + */ + public $sourceIndex; + + /** + * @var int|null + */ + public $sourceLine; + + /** + * @var int|null + */ + public $sourceColumn; +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Node/Number.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Node/Number.php new file mode 100644 index 0000000..b326906 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Node/Number.php @@ -0,0 +1,804 @@ + + * + * @template-implements \ArrayAccess + */ +class Number extends Node implements \ArrayAccess +{ + const PRECISION = 10; + + /** + * @var integer + * @deprecated use {Number::PRECISION} instead to read the precision. Configuring it is not supported anymore. + */ + public static $precision = self::PRECISION; + + /** + * @see http://www.w3.org/TR/2012/WD-css3-values-20120308/ + * + * @var array + * @phpstan-var array> + */ + protected static $unitTable = [ + 'in' => [ + 'in' => 1, + 'pc' => 6, + 'pt' => 72, + 'px' => 96, + 'cm' => 2.54, + 'mm' => 25.4, + 'q' => 101.6, + ], + 'turn' => [ + 'deg' => 360, + 'grad' => 400, + 'rad' => 6.28318530717958647692528676, // 2 * M_PI + 'turn' => 1, + ], + 's' => [ + 's' => 1, + 'ms' => 1000, + ], + 'Hz' => [ + 'Hz' => 1, + 'kHz' => 0.001, + ], + 'dpi' => [ + 'dpi' => 1, + 'dpcm' => 1 / 2.54, + 'dppx' => 1 / 96, + ], + ]; + + /** + * @var integer|float + */ + private $dimension; + + /** + * @var string[] + * @phpstan-var list + */ + private $numeratorUnits; + + /** + * @var string[] + * @phpstan-var list + */ + private $denominatorUnits; + + /** + * Initialize number + * + * @param integer|float $dimension + * @param string[]|string $numeratorUnits + * @param string[] $denominatorUnits + * + * @phpstan-param list|string $numeratorUnits + * @phpstan-param list $denominatorUnits + */ + public function __construct($dimension, $numeratorUnits, array $denominatorUnits = []) + { + if (is_string($numeratorUnits)) { + $numeratorUnits = $numeratorUnits ? [$numeratorUnits] : []; + } elseif (isset($numeratorUnits['numerator_units'], $numeratorUnits['denominator_units'])) { + // TODO get rid of this once `$number[2]` is not used anymore + $denominatorUnits = $numeratorUnits['denominator_units']; + $numeratorUnits = $numeratorUnits['numerator_units']; + } + + $this->dimension = $dimension; + $this->numeratorUnits = $numeratorUnits; + $this->denominatorUnits = $denominatorUnits; + } + + /** + * @return float|int + */ + public function getDimension() + { + return $this->dimension; + } + + /** + * @return string[] + */ + public function getNumeratorUnits() + { + return $this->numeratorUnits; + } + + /** + * @return string[] + */ + public function getDenominatorUnits() + { + return $this->denominatorUnits; + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + if ($offset === -3) { + return ! \is_null($this->sourceColumn); + } + + if ($offset === -2) { + return ! \is_null($this->sourceLine); + } + + if ( + $offset === -1 || + $offset === 0 || + $offset === 1 || + $offset === 2 + ) { + return true; + } + + return false; + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + switch ($offset) { + case -3: + return $this->sourceColumn; + + case -2: + return $this->sourceLine; + + case -1: + return $this->sourceIndex; + + case 0: + return Type::T_NUMBER; + + case 1: + return $this->dimension; + + case 2: + return array('numerator_units' => $this->numeratorUnits, 'denominator_units' => $this->denominatorUnits); + } + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetSet($offset, $value) + { + throw new \BadMethodCallException('Number is immutable'); + } + + /** + * {@inheritdoc} + */ + #[\ReturnTypeWillChange] + public function offsetUnset($offset) + { + throw new \BadMethodCallException('Number is immutable'); + } + + /** + * Returns true if the number is unitless + * + * @return boolean + */ + public function unitless() + { + return \count($this->numeratorUnits) === 0 && \count($this->denominatorUnits) === 0; + } + + /** + * Checks whether the number has exactly this unit + * + * @param string $unit + * + * @return bool + */ + public function hasUnit($unit) + { + return \count($this->numeratorUnits) === 1 && \count($this->denominatorUnits) === 0 && $this->numeratorUnits[0] === $unit; + } + + /** + * Returns unit(s) as the product of numerator units divided by the product of denominator units + * + * @return string + */ + public function unitStr() + { + if ($this->unitless()) { + return ''; + } + + return self::getUnitString($this->numeratorUnits, $this->denominatorUnits); + } + + /** + * @param float|int $min + * @param float|int $max + * @param string|null $name + * + * @return float|int + * @throws SassScriptException + */ + public function valueInRange($min, $max, $name = null) + { + try { + return Util::checkRange('', new Range($min, $max), $this); + } catch (RangeException $e) { + throw SassScriptException::forArgument(sprintf('Expected %s to be within %s%s and %s%3$s', $this, $min, $this->unitStr(), $max), $name); + } + } + + /** + * @param string|null $varName + * + * @return void + */ + public function assertNoUnits($varName = null) + { + if ($this->unitless()) { + return; + } + + throw SassScriptException::forArgument(sprintf('Expected %s to have no units.', $this), $varName); + } + + /** + * @param string $unit + * @param string|null $varName + * + * @return void + */ + public function assertUnit($unit, $varName = null) + { + if ($this->hasUnit($unit)) { + return; + } + + throw SassScriptException::forArgument(sprintf('Expected %s to have unit "%s".', $this, $unit), $varName); + } + + /** + * @param Number $other + * + * @return void + */ + public function assertSameUnitOrUnitless(Number $other) + { + if ($other->unitless()) { + return; + } + + if ($this->numeratorUnits === $other->numeratorUnits && $this->denominatorUnits === $other->denominatorUnits) { + return; + } + + throw new SassScriptException(sprintf( + 'Incompatible units %s and %s.', + self::getUnitString($this->numeratorUnits, $this->denominatorUnits), + self::getUnitString($other->numeratorUnits, $other->denominatorUnits) + )); + } + + /** + * Returns a copy of this number, converted to the units represented by $newNumeratorUnits and $newDenominatorUnits. + * + * This does not throw an error if this number is unitless and + * $newNumeratorUnits/$newDenominatorUnits are not empty, or vice versa. Instead, + * it treats all unitless numbers as convertible to and from all units without + * changing the value. + * + * @param string[] $newNumeratorUnits + * @param string[] $newDenominatorUnits + * + * @return Number + * + * @phpstan-param list $newNumeratorUnits + * @phpstan-param list $newDenominatorUnits + * + * @throws SassScriptException if this number's units are not compatible with $newNumeratorUnits and $newDenominatorUnits + */ + public function coerce(array $newNumeratorUnits, array $newDenominatorUnits) + { + return new Number($this->valueInUnits($newNumeratorUnits, $newDenominatorUnits), $newNumeratorUnits, $newDenominatorUnits); + } + + /** + * @param Number $other + * + * @return bool + */ + public function isComparableTo(Number $other) + { + if ($this->unitless() || $other->unitless()) { + return true; + } + + try { + $this->greaterThan($other); + return true; + } catch (SassScriptException $e) { + return false; + } + } + + /** + * @param Number $other + * + * @return bool + */ + public function lessThan(Number $other) + { + return $this->coerceUnits($other, function ($num1, $num2) { + return $num1 < $num2; + }); + } + + /** + * @param Number $other + * + * @return bool + */ + public function lessThanOrEqual(Number $other) + { + return $this->coerceUnits($other, function ($num1, $num2) { + return $num1 <= $num2; + }); + } + + /** + * @param Number $other + * + * @return bool + */ + public function greaterThan(Number $other) + { + return $this->coerceUnits($other, function ($num1, $num2) { + return $num1 > $num2; + }); + } + + /** + * @param Number $other + * + * @return bool + */ + public function greaterThanOrEqual(Number $other) + { + return $this->coerceUnits($other, function ($num1, $num2) { + return $num1 >= $num2; + }); + } + + /** + * @param Number $other + * + * @return Number + */ + public function plus(Number $other) + { + return $this->coerceNumber($other, function ($num1, $num2) { + return $num1 + $num2; + }); + } + + /** + * @param Number $other + * + * @return Number + */ + public function minus(Number $other) + { + return $this->coerceNumber($other, function ($num1, $num2) { + return $num1 - $num2; + }); + } + + /** + * @return Number + */ + public function unaryMinus() + { + return new Number(-$this->dimension, $this->numeratorUnits, $this->denominatorUnits); + } + + /** + * @param Number $other + * + * @return Number + */ + public function modulo(Number $other) + { + return $this->coerceNumber($other, function ($num1, $num2) { + if ($num2 == 0) { + return NAN; + } + + $result = fmod($num1, $num2); + + if ($result == 0) { + return 0; + } + + if ($num2 < 0 xor $num1 < 0) { + $result += $num2; + } + + return $result; + }); + } + + /** + * @param Number $other + * + * @return Number + */ + public function times(Number $other) + { + return $this->multiplyUnits($this->dimension * $other->dimension, $this->numeratorUnits, $this->denominatorUnits, $other->numeratorUnits, $other->denominatorUnits); + } + + /** + * @param Number $other + * + * @return Number + */ + public function dividedBy(Number $other) + { + if ($other->dimension == 0) { + if ($this->dimension == 0) { + $value = NAN; + } elseif ($this->dimension > 0) { + $value = INF; + } else { + $value = -INF; + } + } else { + $value = $this->dimension / $other->dimension; + } + + return $this->multiplyUnits($value, $this->numeratorUnits, $this->denominatorUnits, $other->denominatorUnits, $other->numeratorUnits); + } + + /** + * @param Number $other + * + * @return bool + */ + public function equals(Number $other) + { + // Unitless numbers are convertable to unit numbers, but not equal, so we special-case unitless here. + if ($this->unitless() !== $other->unitless()) { + return false; + } + + // In Sass, neither NaN nor Infinity are equal to themselves, while PHP defines INF==INF + if (is_nan($this->dimension) || is_nan($other->dimension) || !is_finite($this->dimension) || !is_finite($other->dimension)) { + return false; + } + + if ($this->unitless()) { + return round($this->dimension, self::PRECISION) == round($other->dimension, self::PRECISION); + } + + try { + return $this->coerceUnits($other, function ($num1, $num2) { + return round($num1,self::PRECISION) == round($num2, self::PRECISION); + }); + } catch (SassScriptException $e) { + return false; + } + } + + /** + * Output number + * + * @param \ScssPhp\ScssPhp\Compiler $compiler + * + * @return string + */ + public function output(Compiler $compiler = null) + { + $dimension = round($this->dimension, self::PRECISION); + + if (is_nan($dimension)) { + return 'NaN'; + } + + if ($dimension === INF) { + return 'Infinity'; + } + + if ($dimension === -INF) { + return '-Infinity'; + } + + if ($compiler) { + $unit = $this->unitStr(); + } elseif (isset($this->numeratorUnits[0])) { + $unit = $this->numeratorUnits[0]; + } else { + $unit = ''; + } + + $dimension = number_format($dimension, self::PRECISION, '.', ''); + + return rtrim(rtrim($dimension, '0'), '.') . $unit; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return $this->output(); + } + + /** + * @param Number $other + * @param callable $operation + * + * @return Number + * + * @phpstan-param callable(int|float, int|float): (int|float) $operation + */ + private function coerceNumber(Number $other, $operation) + { + $result = $this->coerceUnits($other, $operation); + + if (!$this->unitless()) { + return new Number($result, $this->numeratorUnits, $this->denominatorUnits); + } + + return new Number($result, $other->numeratorUnits, $other->denominatorUnits); + } + + /** + * @param Number $other + * @param callable $operation + * + * @return mixed + * + * @phpstan-template T + * @phpstan-param callable(int|float, int|float): T $operation + * @phpstan-return T + */ + private function coerceUnits(Number $other, $operation) + { + if (!$this->unitless()) { + $num1 = $this->dimension; + $num2 = $other->valueInUnits($this->numeratorUnits, $this->denominatorUnits); + } else { + $num1 = $this->valueInUnits($other->numeratorUnits, $other->denominatorUnits); + $num2 = $other->dimension; + } + + return \call_user_func($operation, $num1, $num2); + } + + /** + * @param string[] $numeratorUnits + * @param string[] $denominatorUnits + * + * @return int|float + * + * @phpstan-param list $numeratorUnits + * @phpstan-param list $denominatorUnits + * + * @throws SassScriptException if this number's units are not compatible with $numeratorUnits and $denominatorUnits + */ + private function valueInUnits(array $numeratorUnits, array $denominatorUnits) + { + if ( + $this->unitless() + || (\count($numeratorUnits) === 0 && \count($denominatorUnits) === 0) + || ($this->numeratorUnits === $numeratorUnits && $this->denominatorUnits === $denominatorUnits) + ) { + return $this->dimension; + } + + $value = $this->dimension; + $oldNumerators = $this->numeratorUnits; + + foreach ($numeratorUnits as $newNumerator) { + foreach ($oldNumerators as $key => $oldNumerator) { + $conversionFactor = self::getConversionFactor($newNumerator, $oldNumerator); + + if (\is_null($conversionFactor)) { + continue; + } + + $value *= $conversionFactor; + unset($oldNumerators[$key]); + continue 2; + } + + throw new SassScriptException(sprintf( + 'Incompatible units %s and %s.', + self::getUnitString($this->numeratorUnits, $this->denominatorUnits), + self::getUnitString($numeratorUnits, $denominatorUnits) + )); + } + + $oldDenominators = $this->denominatorUnits; + + foreach ($denominatorUnits as $newDenominator) { + foreach ($oldDenominators as $key => $oldDenominator) { + $conversionFactor = self::getConversionFactor($newDenominator, $oldDenominator); + + if (\is_null($conversionFactor)) { + continue; + } + + $value /= $conversionFactor; + unset($oldDenominators[$key]); + continue 2; + } + + throw new SassScriptException(sprintf( + 'Incompatible units %s and %s.', + self::getUnitString($this->numeratorUnits, $this->denominatorUnits), + self::getUnitString($numeratorUnits, $denominatorUnits) + )); + } + + if (\count($oldNumerators) || \count($oldDenominators)) { + throw new SassScriptException(sprintf( + 'Incompatible units %s and %s.', + self::getUnitString($this->numeratorUnits, $this->denominatorUnits), + self::getUnitString($numeratorUnits, $denominatorUnits) + )); + } + + return $value; + } + + /** + * @param int|float $value + * @param string[] $numerators1 + * @param string[] $denominators1 + * @param string[] $numerators2 + * @param string[] $denominators2 + * + * @return Number + * + * @phpstan-param list $numerators1 + * @phpstan-param list $denominators1 + * @phpstan-param list $numerators2 + * @phpstan-param list $denominators2 + */ + private function multiplyUnits($value, array $numerators1, array $denominators1, array $numerators2, array $denominators2) + { + $newNumerators = array(); + + foreach ($numerators1 as $numerator) { + foreach ($denominators2 as $key => $denominator) { + $conversionFactor = self::getConversionFactor($numerator, $denominator); + + if (\is_null($conversionFactor)) { + continue; + } + + $value /= $conversionFactor; + unset($denominators2[$key]); + continue 2; + } + + $newNumerators[] = $numerator; + } + + foreach ($numerators2 as $numerator) { + foreach ($denominators1 as $key => $denominator) { + $conversionFactor = self::getConversionFactor($numerator, $denominator); + + if (\is_null($conversionFactor)) { + continue; + } + + $value /= $conversionFactor; + unset($denominators1[$key]); + continue 2; + } + + $newNumerators[] = $numerator; + } + + $newDenominators = array_values(array_merge($denominators1, $denominators2)); + + return new Number($value, $newNumerators, $newDenominators); + } + + /** + * Returns the number of [unit1]s per [unit2]. + * + * Equivalently, `1unit1 * conversionFactor(unit1, unit2) = 1unit2`. + * + * @param string $unit1 + * @param string $unit2 + * + * @return float|int|null + */ + private static function getConversionFactor($unit1, $unit2) + { + if ($unit1 === $unit2) { + return 1; + } + + foreach (static::$unitTable as $unitVariants) { + if (isset($unitVariants[$unit1]) && isset($unitVariants[$unit2])) { + return $unitVariants[$unit1] / $unitVariants[$unit2]; + } + } + + return null; + } + + /** + * Returns unit(s) as the product of numerator units divided by the product of denominator units + * + * @param string[] $numerators + * @param string[] $denominators + * + * @phpstan-param list $numerators + * @phpstan-param list $denominators + * + * @return string + */ + private static function getUnitString(array $numerators, array $denominators) + { + if (!\count($numerators)) { + if (\count($denominators) === 0) { + return 'no units'; + } + + if (\count($denominators) === 1) { + return $denominators[0] . '^-1'; + } + + return '(' . implode('*', $denominators) . ')^-1'; + } + + return implode('*', $numerators) . (\count($denominators) ? '/' . implode('*', $denominators) : ''); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/OutputStyle.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/OutputStyle.php new file mode 100644 index 0000000..c284639 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/OutputStyle.php @@ -0,0 +1,9 @@ + + * + * @internal + */ +class Parser +{ + const SOURCE_INDEX = -1; + const SOURCE_LINE = -2; + const SOURCE_COLUMN = -3; + + /** + * @var array + */ + protected static $precedence = [ + '=' => 0, + 'or' => 1, + 'and' => 2, + '==' => 3, + '!=' => 3, + '<=' => 4, + '>=' => 4, + '<' => 4, + '>' => 4, + '+' => 5, + '-' => 5, + '*' => 6, + '/' => 6, + '%' => 6, + ]; + + /** + * @var string + */ + protected static $commentPattern; + /** + * @var string + */ + protected static $operatorPattern; + /** + * @var string + */ + protected static $whitePattern; + + /** + * @var Cache|null + */ + protected $cache; + + private $sourceName; + private $sourceIndex; + /** + * @var array + */ + private $sourcePositions; + /** + * @var array|null + */ + private $charset; + /** + * The current offset in the buffer + * + * @var int + */ + private $count; + /** + * @var Block|null + */ + private $env; + /** + * @var bool + */ + private $inParens; + /** + * @var bool + */ + private $eatWhiteDefault; + /** + * @var bool + */ + private $discardComments; + private $allowVars; + /** + * @var string + */ + private $buffer; + private $utf8; + /** + * @var string|null + */ + private $encoding; + private $patternModifiers; + private $commentsSeen; + + private $cssOnly; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * Constructor + * + * @api + * + * @param string|null $sourceName + * @param integer $sourceIndex + * @param string|null $encoding + * @param Cache|null $cache + * @param bool $cssOnly + * @param LoggerInterface|null $logger + */ + public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', Cache $cache = null, $cssOnly = false, LoggerInterface $logger = null) + { + $this->sourceName = $sourceName ?: '(stdin)'; + $this->sourceIndex = $sourceIndex; + $this->charset = null; + $this->utf8 = ! $encoding || strtolower($encoding) === 'utf-8'; + $this->patternModifiers = $this->utf8 ? 'Aisu' : 'Ais'; + $this->commentsSeen = []; + $this->commentsSeen = []; + $this->allowVars = true; + $this->cssOnly = $cssOnly; + $this->logger = $logger ?: new QuietLogger(); + + if (empty(static::$operatorPattern)) { + static::$operatorPattern = '([*\/%+-]|[!=]\=|\>\=?|\<\=?|and|or)'; + + $commentSingle = '\/\/'; + $commentMultiLeft = '\/\*'; + $commentMultiRight = '\*\/'; + + static::$commentPattern = $commentMultiLeft . '.*?' . $commentMultiRight; + static::$whitePattern = $this->utf8 + ? '/' . $commentSingle . '[^\n]*\s*|(' . static::$commentPattern . ')\s*|\s+/AisuS' + : '/' . $commentSingle . '[^\n]*\s*|(' . static::$commentPattern . ')\s*|\s+/AisS'; + } + + $this->cache = $cache; + } + + /** + * Get source file name + * + * @api + * + * @return string + */ + public function getSourceName() + { + return $this->sourceName; + } + + /** + * Throw parser error + * + * @api + * + * @param string $msg + * + * @phpstan-return never-return + * + * @throws ParserException + * + * @deprecated use "parseError" and throw the exception in the caller instead. + */ + public function throwParseError($msg = 'parse error') + { + @trigger_error( + 'The method "throwParseError" is deprecated. Use "parseError" and throw the exception in the caller instead', + E_USER_DEPRECATED + ); + + throw $this->parseError($msg); + } + + /** + * Creates a parser error + * + * @api + * + * @param string $msg + * + * @return ParserException + */ + public function parseError($msg = 'parse error') + { + list($line, $column) = $this->getSourcePosition($this->count); + + $loc = empty($this->sourceName) + ? "line: $line, column: $column" + : "$this->sourceName on line $line, at column $column"; + + if ($this->peek('(.*?)(\n|$)', $m, $this->count)) { + $this->restoreEncoding(); + + $e = new ParserException("$msg: failed at `$m[1]` $loc"); + $e->setSourcePosition([$this->sourceName, $line, $column]); + + return $e; + } + + $this->restoreEncoding(); + + $e = new ParserException("$msg: $loc"); + $e->setSourcePosition([$this->sourceName, $line, $column]); + + return $e; + } + + /** + * Parser buffer + * + * @api + * + * @param string $buffer + * + * @return Block + */ + public function parse($buffer) + { + if ($this->cache) { + $cacheKey = $this->sourceName . ':' . md5($buffer); + $parseOptions = [ + 'charset' => $this->charset, + 'utf8' => $this->utf8, + ]; + $v = $this->cache->getCache('parse', $cacheKey, $parseOptions); + + if (! \is_null($v)) { + return $v; + } + } + + // strip BOM (byte order marker) + if (substr($buffer, 0, 3) === "\xef\xbb\xbf") { + $buffer = substr($buffer, 3); + } + + $this->buffer = rtrim($buffer, "\x00..\x1f"); + $this->count = 0; + $this->env = null; + $this->inParens = false; + $this->eatWhiteDefault = true; + + $this->saveEncoding(); + $this->extractLineNumbers($buffer); + + $this->pushBlock(null); // root block + $this->whitespace(); + $this->pushBlock(null); + $this->popBlock(); + + while ($this->parseChunk()) { + ; + } + + if ($this->count !== \strlen($this->buffer)) { + throw $this->parseError(); + } + + if (! empty($this->env->parent)) { + throw $this->parseError('unclosed block'); + } + + if ($this->charset) { + array_unshift($this->env->children, $this->charset); + } + + $this->restoreEncoding(); + + if ($this->cache) { + $this->cache->setCache('parse', $cacheKey, $this->env, $parseOptions); + } + + return $this->env; + } + + /** + * Parse a value or value list + * + * @api + * + * @param string $buffer + * @param string|array $out + * + * @return boolean + */ + public function parseValue($buffer, &$out) + { + $this->count = 0; + $this->env = null; + $this->inParens = false; + $this->eatWhiteDefault = true; + $this->buffer = (string) $buffer; + + $this->saveEncoding(); + $this->extractLineNumbers($this->buffer); + + $list = $this->valueList($out); + + $this->restoreEncoding(); + + return $list; + } + + /** + * Parse a selector or selector list + * + * @api + * + * @param string $buffer + * @param string|array $out + * @param bool $shouldValidate + * + * @return boolean + */ + public function parseSelector($buffer, &$out, $shouldValidate = true) + { + $this->count = 0; + $this->env = null; + $this->inParens = false; + $this->eatWhiteDefault = true; + $this->buffer = (string) $buffer; + + $this->saveEncoding(); + $this->extractLineNumbers($this->buffer); + + // discard space/comments at the start + $this->discardComments = true; + $this->whitespace(); + $this->discardComments = false; + + $selector = $this->selectors($out); + + $this->restoreEncoding(); + + if ($shouldValidate && $this->count !== strlen($buffer)) { + throw $this->parseError("`" . substr($buffer, $this->count) . "` is not a valid Selector in `$buffer`"); + } + + return $selector; + } + + /** + * Parse a media Query + * + * @api + * + * @param string $buffer + * @param string|array $out + * + * @return boolean + */ + public function parseMediaQueryList($buffer, &$out) + { + $this->count = 0; + $this->env = null; + $this->inParens = false; + $this->eatWhiteDefault = true; + $this->buffer = (string) $buffer; + + $this->saveEncoding(); + $this->extractLineNumbers($this->buffer); + + $isMediaQuery = $this->mediaQueryList($out); + + $this->restoreEncoding(); + + return $isMediaQuery; + } + + /** + * Parse a single chunk off the head of the buffer and append it to the + * current parse environment. + * + * Returns false when the buffer is empty, or when there is an error. + * + * This function is called repeatedly until the entire document is + * parsed. + * + * This parser is most similar to a recursive descent parser. Single + * functions represent discrete grammatical rules for the language, and + * they are able to capture the text that represents those rules. + * + * Consider the function Compiler::keyword(). (All parse functions are + * structured the same.) + * + * The function takes a single reference argument. When calling the + * function it will attempt to match a keyword on the head of the buffer. + * If it is successful, it will place the keyword in the referenced + * argument, advance the position in the buffer, and return true. If it + * fails then it won't advance the buffer and it will return false. + * + * All of these parse functions are powered by Compiler::match(), which behaves + * the same way, but takes a literal regular expression. Sometimes it is + * more convenient to use match instead of creating a new function. + * + * Because of the format of the functions, to parse an entire string of + * grammatical rules, you can chain them together using &&. + * + * But, if some of the rules in the chain succeed before one fails, then + * the buffer position will be left at an invalid state. In order to + * avoid this, Compiler::seek() is used to remember and set buffer positions. + * + * Before parsing a chain, use $s = $this->count to remember the current + * position into $s. Then if a chain fails, use $this->seek($s) to + * go back where we started. + * + * @return boolean + */ + protected function parseChunk() + { + $s = $this->count; + + // the directives + if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] === '@') { + if ( + $this->literal('@at-root', 8) && + ($this->selectors($selector) || true) && + ($this->map($with) || true) && + (($this->matchChar('(') && + $this->interpolation($with) && + $this->matchChar(')')) || true) && + $this->matchChar('{', false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $atRoot = $this->pushSpecialBlock(Type::T_AT_ROOT, $s); + $atRoot->selector = $selector; + $atRoot->with = $with; + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@media', 6) && + $this->mediaQueryList($mediaQueryList) && + $this->matchChar('{', false) + ) { + $media = $this->pushSpecialBlock(Type::T_MEDIA, $s); + $media->queryList = $mediaQueryList[2]; + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@mixin', 6) && + $this->keyword($mixinName) && + ($this->argumentDef($args) || true) && + $this->matchChar('{', false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $mixin = $this->pushSpecialBlock(Type::T_MIXIN, $s); + $mixin->name = $mixinName; + $mixin->args = $args; + + return true; + } + + $this->seek($s); + + if ( + ($this->literal('@include', 8) && + $this->keyword($mixinName) && + ($this->matchChar('(') && + ($this->argValues($argValues) || true) && + $this->matchChar(')') || true) && + ($this->end()) || + ($this->literal('using', 5) && + $this->argumentDef($argUsing) && + ($this->end() || $this->matchChar('{') && $hasBlock = true)) || + $this->matchChar('{') && $hasBlock = true) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $child = [ + Type::T_INCLUDE, + $mixinName, + isset($argValues) ? $argValues : null, + null, + isset($argUsing) ? $argUsing : null + ]; + + if (! empty($hasBlock)) { + $include = $this->pushSpecialBlock(Type::T_INCLUDE, $s); + $include->child = $child; + } else { + $this->append($child, $s); + } + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@scssphp-import-once', 20) && + $this->valueList($importPath) && + $this->end() + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + list($line, $column) = $this->getSourcePosition($s); + $file = $this->sourceName; + $this->logger->warn("The \"@scssphp-import-once\" directive is deprecated and will be removed in ScssPhp 2.0, in \"$file\", line $line, column $column.", true); + + $this->append([Type::T_SCSSPHP_IMPORT_ONCE, $importPath], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@import', 7) && + $this->valueList($importPath) && + $importPath[0] !== Type::T_FUNCTION_CALL && + $this->end() + ) { + if ($this->cssOnly) { + $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s); + $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]); + return true; + } + + $this->append([Type::T_IMPORT, $importPath], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@import', 7) && + $this->url($importPath) && + $this->end() + ) { + if ($this->cssOnly) { + $this->assertPlainCssValid([Type::T_IMPORT, $importPath], $s); + $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]); + return true; + } + + $this->append([Type::T_IMPORT, $importPath], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@extend', 7) && + $this->selectors($selectors) && + $this->end() + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + // check for '!flag' + $optional = $this->stripOptionalFlag($selectors); + $this->append([Type::T_EXTEND, $selectors, $optional], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@function', 9) && + $this->keyword($fnName) && + $this->argumentDef($args) && + $this->matchChar('{', false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $func = $this->pushSpecialBlock(Type::T_FUNCTION, $s); + $func->name = $fnName; + $func->args = $args; + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@return', 7) && + ($this->valueList($retVal) || true) && + $this->end() + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $this->append([Type::T_RETURN, isset($retVal) ? $retVal : [Type::T_NULL]], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@each', 5) && + $this->genericList($varNames, 'variable', ',', false) && + $this->literal('in', 2) && + $this->valueList($list) && + $this->matchChar('{', false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $each = $this->pushSpecialBlock(Type::T_EACH, $s); + + foreach ($varNames[2] as $varName) { + $each->vars[] = $varName[1]; + } + + $each->list = $list; + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@while', 6) && + $this->expression($cond) && + $this->matchChar('{', false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + while ( + $cond[0] === Type::T_LIST && + ! empty($cond['enclosing']) && + $cond['enclosing'] === 'parent' && + \count($cond[2]) == 1 + ) { + $cond = reset($cond[2]); + } + + $while = $this->pushSpecialBlock(Type::T_WHILE, $s); + $while->cond = $cond; + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@for', 4) && + $this->variable($varName) && + $this->literal('from', 4) && + $this->expression($start) && + ($this->literal('through', 7) || + ($forUntil = true && $this->literal('to', 2))) && + $this->expression($end) && + $this->matchChar('{', false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $for = $this->pushSpecialBlock(Type::T_FOR, $s); + $for->var = $varName[1]; + $for->start = $start; + $for->end = $end; + $for->until = isset($forUntil); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@if', 3) && + $this->functionCallArgumentsList($cond, false, '{', false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $if = $this->pushSpecialBlock(Type::T_IF, $s); + + while ( + $cond[0] === Type::T_LIST && + ! empty($cond['enclosing']) && + $cond['enclosing'] === 'parent' && + \count($cond[2]) == 1 + ) { + $cond = reset($cond[2]); + } + + $if->cond = $cond; + $if->cases = []; + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@debug', 6) && + $this->functionCallArgumentsList($value, false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $this->append([Type::T_DEBUG, $value], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@warn', 5) && + $this->functionCallArgumentsList($value, false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $this->append([Type::T_WARN, $value], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@error', 6) && + $this->functionCallArgumentsList($value, false) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $this->append([Type::T_ERROR, $value], $s); + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@content', 8) && + ($this->end() || + $this->matchChar('(') && + $this->argValues($argContent) && + $this->matchChar(')') && + $this->end()) + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + $this->append([Type::T_MIXIN_CONTENT, isset($argContent) ? $argContent : null], $s); + + return true; + } + + $this->seek($s); + + $last = $this->last(); + + if (isset($last) && $last[0] === Type::T_IF) { + list(, $if) = $last; + + if ($this->literal('@else', 5)) { + if ($this->matchChar('{', false)) { + $else = $this->pushSpecialBlock(Type::T_ELSE, $s); + } elseif ( + $this->literal('if', 2) && + $this->functionCallArgumentsList($cond, false, '{', false) + ) { + $else = $this->pushSpecialBlock(Type::T_ELSEIF, $s); + $else->cond = $cond; + } + + if (isset($else)) { + $else->dontAppend = true; + $if->cases[] = $else; + + return true; + } + } + + $this->seek($s); + } + + // only retain the first @charset directive encountered + if ( + $this->literal('@charset', 8) && + $this->valueList($charset) && + $this->end() + ) { + if (! isset($this->charset)) { + $statement = [Type::T_CHARSET, $charset]; + + list($line, $column) = $this->getSourcePosition($s); + + $statement[static::SOURCE_LINE] = $line; + $statement[static::SOURCE_COLUMN] = $column; + $statement[static::SOURCE_INDEX] = $this->sourceIndex; + + $this->charset = $statement; + } + + return true; + } + + $this->seek($s); + + if ( + $this->literal('@supports', 9) && + ($t1 = $this->supportsQuery($supportQuery)) && + ($t2 = $this->matchChar('{', false)) + ) { + $directive = $this->pushSpecialBlock(Type::T_DIRECTIVE, $s); + $directive->name = 'supports'; + $directive->value = $supportQuery; + + return true; + } + + $this->seek($s); + + // doesn't match built in directive, do generic one + if ( + $this->matchChar('@', false) && + $this->mixedKeyword($dirName) && + $this->directiveValue($dirValue, '{') + ) { + if (count($dirName) === 1 && is_string(reset($dirName))) { + $dirName = reset($dirName); + } else { + $dirName = [Type::T_STRING, '', $dirName]; + } + if ($dirName === 'media') { + $directive = $this->pushSpecialBlock(Type::T_MEDIA, $s); + } else { + $directive = $this->pushSpecialBlock(Type::T_DIRECTIVE, $s); + $directive->name = $dirName; + } + + if (isset($dirValue)) { + ! $this->cssOnly || ($dirValue = $this->assertPlainCssValid($dirValue)); + $directive->value = $dirValue; + } + + return true; + } + + $this->seek($s); + + // maybe it's a generic blockless directive + if ( + $this->matchChar('@', false) && + $this->mixedKeyword($dirName) && + ! $this->isKnownGenericDirective($dirName) && + ($this->end(false) || ($this->directiveValue($dirValue, '') && $this->end(false))) + ) { + if (\count($dirName) === 1 && \is_string(\reset($dirName))) { + $dirName = \reset($dirName); + } else { + $dirName = [Type::T_STRING, '', $dirName]; + } + if ( + ! empty($this->env->parent) && + $this->env->type && + ! \in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA]) + ) { + $plain = \trim(\substr($this->buffer, $s, $this->count - $s)); + throw $this->parseError( + "Unknown directive `{$plain}` not allowed in `" . $this->env->type . "` block" + ); + } + // blockless directives with a blank line after keeps their blank lines after + // sass-spec compliance purpose + $s = $this->count; + $hasBlankLine = false; + if ($this->match('\s*?\n\s*\n', $out, false)) { + $hasBlankLine = true; + $this->seek($s); + } + $isNotRoot = ! empty($this->env->parent); + $this->append([Type::T_DIRECTIVE, [$dirName, $dirValue, $hasBlankLine, $isNotRoot]], $s); + $this->whitespace(); + + return true; + } + + $this->seek($s); + + return false; + } + + $inCssSelector = null; + if ($this->cssOnly) { + $inCssSelector = (! empty($this->env->parent) && + ! in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA])); + } + // custom properties : right part is static + if (($this->customProperty($name) ) && $this->matchChar(':', false)) { + $start = $this->count; + + // but can be complex and finish with ; or } + foreach ([';','}'] as $ending) { + if ( + $this->openString($ending, $stringValue, '(', ')', false) && + $this->end() + ) { + $end = $this->count; + $value = $stringValue; + + // check if we have only a partial value due to nested [] or { } to take in account + $nestingPairs = [['[', ']'], ['{', '}']]; + + foreach ($nestingPairs as $nestingPair) { + $p = strpos($this->buffer, $nestingPair[0], $start); + + if ($p && $p < $end) { + $this->seek($start); + + if ( + $this->openString($ending, $stringValue, $nestingPair[0], $nestingPair[1], false) && + $this->end() && + $this->count > $end + ) { + $end = $this->count; + $value = $stringValue; + } + } + } + + $this->seek($end); + $this->append([Type::T_CUSTOM_PROPERTY, $name, $value], $s); + + return true; + } + } + + // TODO: output an error here if nothing found according to sass spec + } + + $this->seek($s); + + // property shortcut + // captures most properties before having to parse a selector + if ( + $this->keyword($name, false) && + $this->literal(': ', 2) && + $this->valueList($value) && + $this->end() + ) { + $name = [Type::T_STRING, '', [$name]]; + $this->append([Type::T_ASSIGN, $name, $value], $s); + + return true; + } + + $this->seek($s); + + // variable assigns + if ( + $this->variable($name) && + $this->matchChar(':') && + $this->valueList($value) && + $this->end() + ) { + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + + // check for '!flag' + $assignmentFlags = $this->stripAssignmentFlags($value); + $this->append([Type::T_ASSIGN, $name, $value, $assignmentFlags], $s); + + return true; + } + + $this->seek($s); + + // opening css block + if ( + $this->selectors($selectors) && + $this->matchChar('{', false) + ) { + ! $this->cssOnly || ! $inCssSelector || $this->assertPlainCssValid(false); + + $this->pushBlock($selectors, $s); + + if ($this->eatWhiteDefault) { + $this->whitespace(); + $this->append(null); // collect comments at the beginning if needed + } + + return true; + } + + $this->seek($s); + + // property assign, or nested assign + if ( + $this->propertyName($name) && + $this->matchChar(':') + ) { + $foundSomething = false; + + if ($this->valueList($value)) { + if (empty($this->env->parent)) { + throw $this->parseError('expected "{"'); + } + + $this->append([Type::T_ASSIGN, $name, $value], $s); + $foundSomething = true; + } + + if ($this->matchChar('{', false)) { + ! $this->cssOnly || $this->assertPlainCssValid(false); + + $propBlock = $this->pushSpecialBlock(Type::T_NESTED_PROPERTY, $s); + $propBlock->prefix = $name; + $propBlock->hasValue = $foundSomething; + + $foundSomething = true; + } elseif ($foundSomething) { + $foundSomething = $this->end(); + } + + if ($foundSomething) { + return true; + } + } + + $this->seek($s); + + // closing a block + if ($this->matchChar('}', false)) { + $block = $this->popBlock(); + + if (! isset($block->type) || $block->type !== Type::T_IF) { + if ($this->env->parent) { + $this->append(null); // collect comments before next statement if needed + } + } + + if (isset($block->type) && $block->type === Type::T_INCLUDE) { + $include = $block->child; + unset($block->child); + $include[3] = $block; + $this->append($include, $s); + } elseif (empty($block->dontAppend)) { + $type = isset($block->type) ? $block->type : Type::T_BLOCK; + $this->append([$type, $block], $s); + } + + // collect comments just after the block closing if needed + if ($this->eatWhiteDefault) { + $this->whitespace(); + + if ($this->env->comments) { + $this->append(null); + } + } + + return true; + } + + // extra stuff + if ($this->matchChar(';')) { + return true; + } + + return false; + } + + /** + * Push block onto parse tree + * + * @param array|null $selectors + * @param integer $pos + * + * @return Block + */ + protected function pushBlock($selectors, $pos = 0) + { + list($line, $column) = $this->getSourcePosition($pos); + + $b = new Block(); + $b->sourceName = $this->sourceName; + $b->sourceLine = $line; + $b->sourceColumn = $column; + $b->sourceIndex = $this->sourceIndex; + $b->selectors = $selectors; + $b->comments = []; + $b->parent = $this->env; + + if (! $this->env) { + $b->children = []; + } elseif (empty($this->env->children)) { + $this->env->children = $this->env->comments; + $b->children = []; + $this->env->comments = []; + } else { + $b->children = $this->env->comments; + $this->env->comments = []; + } + + $this->env = $b; + + // collect comments at the beginning of a block if needed + if ($this->eatWhiteDefault) { + $this->whitespace(); + + if ($this->env->comments) { + $this->append(null); + } + } + + return $b; + } + + /** + * Push special (named) block onto parse tree + * + * @param string $type + * @param integer $pos + * + * @return Block + */ + protected function pushSpecialBlock($type, $pos) + { + $block = $this->pushBlock(null, $pos); + $block->type = $type; + + return $block; + } + + /** + * Pop scope and return last block + * + * @return Block + * + * @throws \Exception + */ + protected function popBlock() + { + + // collect comments ending just before of a block closing + if ($this->env->comments) { + $this->append(null); + } + + // pop the block + $block = $this->env; + + if (empty($block->parent)) { + throw $this->parseError('unexpected }'); + } + + if ($block->type == Type::T_AT_ROOT) { + // keeps the parent in case of self selector & + $block->selfParent = $block->parent; + } + + $this->env = $block->parent; + + unset($block->parent); + + return $block; + } + + /** + * Peek input stream + * + * @param string $regex + * @param array $out + * @param integer $from + * + * @return integer + */ + protected function peek($regex, &$out, $from = null) + { + if (! isset($from)) { + $from = $this->count; + } + + $r = '/' . $regex . '/' . $this->patternModifiers; + $result = preg_match($r, $this->buffer, $out, 0, $from); + + return $result; + } + + /** + * Seek to position in input stream (or return current position in input stream) + * + * @param integer $where + */ + protected function seek($where) + { + $this->count = $where; + } + + /** + * Assert a parsed part is plain CSS Valid + * + * @param array|false $parsed + * @param int $startPos + * @throws ParserException + */ + protected function assertPlainCssValid($parsed, $startPos = null) + { + $type = ''; + if ($parsed) { + $type = $parsed[0]; + $parsed = $this->isPlainCssValidElement($parsed); + } + if (! $parsed) { + if (! \is_null($startPos)) { + $plain = rtrim(substr($this->buffer, $startPos, $this->count - $startPos)); + $message = "Error : `{$plain}` isn't allowed in plain CSS"; + } else { + $message = 'Error: SCSS syntax not allowed in CSS file'; + } + if ($type) { + $message .= " ($type)"; + } + throw $this->parseError($message); + } + + return $parsed; + } + + /** + * Check a parsed element is plain CSS Valid + * @param array $parsed + * @return bool|array + */ + protected function isPlainCssValidElement($parsed, $allowExpression = false) + { + // keep string as is + if (is_string($parsed)) { + return $parsed; + } + + if ( + \in_array($parsed[0], [Type::T_FUNCTION, Type::T_FUNCTION_CALL]) && + !\in_array($parsed[1], [ + 'alpha', + 'attr', + 'calc', + 'cubic-bezier', + 'env', + 'grayscale', + 'hsl', + 'hsla', + 'hwb', + 'invert', + 'linear-gradient', + 'min', + 'max', + 'radial-gradient', + 'repeating-linear-gradient', + 'repeating-radial-gradient', + 'rgb', + 'rgba', + 'rotate', + 'saturate', + 'var', + ]) && + Compiler::isNativeFunction($parsed[1]) + ) { + return false; + } + + switch ($parsed[0]) { + case Type::T_BLOCK: + case Type::T_KEYWORD: + case Type::T_NULL: + case Type::T_NUMBER: + case Type::T_MEDIA: + return $parsed; + + case Type::T_COMMENT: + if (isset($parsed[2])) { + return false; + } + return $parsed; + + case Type::T_DIRECTIVE: + if (\is_array($parsed[1])) { + $parsed[1][1] = $this->isPlainCssValidElement($parsed[1][1]); + if (! $parsed[1][1]) { + return false; + } + } + + return $parsed; + + case Type::T_IMPORT: + if ($parsed[1][0] === Type::T_LIST) { + return false; + } + $parsed[1] = $this->isPlainCssValidElement($parsed[1]); + if ($parsed[1] === false) { + return false; + } + return $parsed; + + case Type::T_STRING: + foreach ($parsed[2] as $k => $substr) { + if (\is_array($substr)) { + $parsed[2][$k] = $this->isPlainCssValidElement($substr); + if (! $parsed[2][$k]) { + return false; + } + } + } + return $parsed; + + case Type::T_LIST: + if (!empty($parsed['enclosing'])) { + return false; + } + foreach ($parsed[2] as $k => $listElement) { + $parsed[2][$k] = $this->isPlainCssValidElement($listElement); + if (! $parsed[2][$k]) { + return false; + } + } + return $parsed; + + case Type::T_ASSIGN: + foreach ([1, 2, 3] as $k) { + if (! empty($parsed[$k])) { + $parsed[$k] = $this->isPlainCssValidElement($parsed[$k]); + if (! $parsed[$k]) { + return false; + } + } + } + return $parsed; + + case Type::T_EXPRESSION: + list( ,$op, $lhs, $rhs, $inParens, $whiteBefore, $whiteAfter) = $parsed; + if (! $allowExpression && ! \in_array($op, ['and', 'or', '/'])) { + return false; + } + $lhs = $this->isPlainCssValidElement($lhs, true); + if (! $lhs) { + return false; + } + $rhs = $this->isPlainCssValidElement($rhs, true); + if (! $rhs) { + return false; + } + + return [ + Type::T_STRING, + '', [ + $this->inParens ? '(' : '', + $lhs, + ($whiteBefore ? ' ' : '') . $op . ($whiteAfter ? ' ' : ''), + $rhs, + $this->inParens ? ')' : '' + ] + ]; + + case Type::T_CUSTOM_PROPERTY: + case Type::T_UNARY: + $parsed[2] = $this->isPlainCssValidElement($parsed[2]); + if (! $parsed[2]) { + return false; + } + return $parsed; + + case Type::T_FUNCTION: + $argsList = $parsed[2]; + foreach ($argsList[2] as $argElement) { + if (! $this->isPlainCssValidElement($argElement)) { + return false; + } + } + return $parsed; + + case Type::T_FUNCTION_CALL: + $parsed[0] = Type::T_FUNCTION; + $argsList = [Type::T_LIST, ',', []]; + foreach ($parsed[2] as $arg) { + if ($arg[0] || ! empty($arg[2])) { + // no named arguments possible in a css function call + // nor ... argument + return false; + } + $arg = $this->isPlainCssValidElement($arg[1], $parsed[1] === 'calc'); + if (! $arg) { + return false; + } + $argsList[2][] = $arg; + } + $parsed[2] = $argsList; + return $parsed; + } + + return false; + } + + /** + * Match string looking for either ending delim, escape, or string interpolation + * + * {@internal This is a workaround for preg_match's 250K string match limit. }} + * + * @param array $m Matches (passed by reference) + * @param string $delim Delimiter + * + * @return boolean True if match; false otherwise + */ + protected function matchString(&$m, $delim) + { + $token = null; + + $end = \strlen($this->buffer); + + // look for either ending delim, escape, or string interpolation + foreach (['#{', '\\', "\r", $delim] as $lookahead) { + $pos = strpos($this->buffer, $lookahead, $this->count); + + if ($pos !== false && $pos < $end) { + $end = $pos; + $token = $lookahead; + } + } + + if (! isset($token)) { + return false; + } + + $match = substr($this->buffer, $this->count, $end - $this->count); + $m = [ + $match . $token, + $match, + $token + ]; + $this->count = $end + \strlen($token); + + return true; + } + + /** + * Try to match something on head of buffer + * + * @param string $regex + * @param array $out + * @param boolean $eatWhitespace + * + * @return boolean + */ + protected function match($regex, &$out, $eatWhitespace = null) + { + $r = '/' . $regex . '/' . $this->patternModifiers; + + if (! preg_match($r, $this->buffer, $out, 0, $this->count)) { + return false; + } + + $this->count += \strlen($out[0]); + + if (! isset($eatWhitespace)) { + $eatWhitespace = $this->eatWhiteDefault; + } + + if ($eatWhitespace) { + $this->whitespace(); + } + + return true; + } + + /** + * Match a single string + * + * @param string $char + * @param boolean $eatWhitespace + * + * @return boolean + */ + protected function matchChar($char, $eatWhitespace = null) + { + if (! isset($this->buffer[$this->count]) || $this->buffer[$this->count] !== $char) { + return false; + } + + $this->count++; + + if (! isset($eatWhitespace)) { + $eatWhitespace = $this->eatWhiteDefault; + } + + if ($eatWhitespace) { + $this->whitespace(); + } + + return true; + } + + /** + * Match literal string + * + * @param string $what + * @param integer $len + * @param boolean $eatWhitespace + * + * @return boolean + */ + protected function literal($what, $len, $eatWhitespace = null) + { + if (strcasecmp(substr($this->buffer, $this->count, $len), $what) !== 0) { + return false; + } + + $this->count += $len; + + if (! isset($eatWhitespace)) { + $eatWhitespace = $this->eatWhiteDefault; + } + + if ($eatWhitespace) { + $this->whitespace(); + } + + return true; + } + + /** + * Match some whitespace + * + * @return boolean + */ + protected function whitespace() + { + $gotWhite = false; + + while (preg_match(static::$whitePattern, $this->buffer, $m, 0, $this->count)) { + if (isset($m[1]) && empty($this->commentsSeen[$this->count])) { + // comment that are kept in the output CSS + $comment = []; + $startCommentCount = $this->count; + $endCommentCount = $this->count + \strlen($m[1]); + + // find interpolations in comment + $p = strpos($this->buffer, '#{', $this->count); + + while ($p !== false && $p < $endCommentCount) { + $c = substr($this->buffer, $this->count, $p - $this->count); + $comment[] = $c; + $this->count = $p; + $out = null; + + if ($this->interpolation($out)) { + // keep right spaces in the following string part + if ($out[3]) { + while ($this->buffer[$this->count - 1] !== '}') { + $this->count--; + } + + $out[3] = ''; + } + + $comment[] = [Type::T_COMMENT, substr($this->buffer, $p, $this->count - $p), $out]; + } else { + list($line, $column) = $this->getSourcePosition($this->count); + $file = $this->sourceName; + if (!$this->discardComments) { + $this->logger->warn("Unterminated interpolations in multiline comments are deprecated and will be removed in ScssPhp 2.0, in \"$file\", line $line, column $column.", true); + } + $comment[] = substr($this->buffer, $this->count, 2); + + $this->count += 2; + } + + $p = strpos($this->buffer, '#{', $this->count); + } + + // remaining part + $c = substr($this->buffer, $this->count, $endCommentCount - $this->count); + + if (! $comment) { + // single part static comment + $this->appendComment([Type::T_COMMENT, $c]); + } else { + $comment[] = $c; + $staticComment = substr($this->buffer, $startCommentCount, $endCommentCount - $startCommentCount); + $commentStatement = [Type::T_COMMENT, $staticComment, [Type::T_STRING, '', $comment]]; + + list($line, $column) = $this->getSourcePosition($startCommentCount); + $commentStatement[self::SOURCE_LINE] = $line; + $commentStatement[self::SOURCE_COLUMN] = $column; + $commentStatement[self::SOURCE_INDEX] = $this->sourceIndex; + + $this->appendComment($commentStatement); + } + + $this->commentsSeen[$startCommentCount] = true; + $this->count = $endCommentCount; + } else { + // comment that are ignored and not kept in the output css + $this->count += \strlen($m[0]); + // silent comments are not allowed in plain CSS files + ! $this->cssOnly + || ! \strlen(trim($m[0])) + || $this->assertPlainCssValid(false, $this->count - \strlen($m[0])); + } + + $gotWhite = true; + } + + return $gotWhite; + } + + /** + * Append comment to current block + * + * @param array $comment + */ + protected function appendComment($comment) + { + if (! $this->discardComments) { + $this->env->comments[] = $comment; + } + } + + /** + * Append statement to current block + * + * @param array|null $statement + * @param integer $pos + */ + protected function append($statement, $pos = null) + { + if (! \is_null($statement)) { + ! $this->cssOnly || ($statement = $this->assertPlainCssValid($statement, $pos)); + + if (! \is_null($pos)) { + list($line, $column) = $this->getSourcePosition($pos); + + $statement[static::SOURCE_LINE] = $line; + $statement[static::SOURCE_COLUMN] = $column; + $statement[static::SOURCE_INDEX] = $this->sourceIndex; + } + + $this->env->children[] = $statement; + } + + $comments = $this->env->comments; + + if ($comments) { + $this->env->children = array_merge($this->env->children, $comments); + $this->env->comments = []; + } + } + + /** + * Returns last child was appended + * + * @return array|null + */ + protected function last() + { + $i = \count($this->env->children) - 1; + + if (isset($this->env->children[$i])) { + return $this->env->children[$i]; + } + } + + /** + * Parse media query list + * + * @param array $out + * + * @return boolean + */ + protected function mediaQueryList(&$out) + { + return $this->genericList($out, 'mediaQuery', ',', false); + } + + /** + * Parse media query + * + * @param array $out + * + * @return boolean + */ + protected function mediaQuery(&$out) + { + $expressions = null; + $parts = []; + + if ( + ($this->literal('only', 4) && ($only = true) || + $this->literal('not', 3) && ($not = true) || true) && + $this->mixedKeyword($mediaType) + ) { + $prop = [Type::T_MEDIA_TYPE]; + + if (isset($only)) { + $prop[] = [Type::T_KEYWORD, 'only']; + } + + if (isset($not)) { + $prop[] = [Type::T_KEYWORD, 'not']; + } + + $media = [Type::T_LIST, '', []]; + + foreach ((array) $mediaType as $type) { + if (\is_array($type)) { + $media[2][] = $type; + } else { + $media[2][] = [Type::T_KEYWORD, $type]; + } + } + + $prop[] = $media; + $parts[] = $prop; + } + + if (empty($parts) || $this->literal('and', 3)) { + $this->genericList($expressions, 'mediaExpression', 'and', false); + + if (\is_array($expressions)) { + $parts = array_merge($parts, $expressions[2]); + } + } + + $out = $parts; + + return true; + } + + /** + * Parse supports query + * + * @param array $out + * + * @return boolean + */ + protected function supportsQuery(&$out) + { + $expressions = null; + $parts = []; + + $s = $this->count; + + $not = false; + + if ( + ($this->literal('not', 3) && ($not = true) || true) && + $this->matchChar('(') && + ($this->expression($property)) && + $this->literal(': ', 2) && + $this->valueList($value) && + $this->matchChar(')') + ) { + $support = [Type::T_STRING, '', [[Type::T_KEYWORD, ($not ? 'not ' : '') . '(']]]; + $support[2][] = $property; + $support[2][] = [Type::T_KEYWORD, ': ']; + $support[2][] = $value; + $support[2][] = [Type::T_KEYWORD, ')']; + + $parts[] = $support; + $s = $this->count; + } else { + $this->seek($s); + } + + if ( + $this->matchChar('(') && + $this->supportsQuery($subQuery) && + $this->matchChar(')') + ) { + $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, '('], $subQuery, [Type::T_KEYWORD, ')']]]; + $s = $this->count; + } else { + $this->seek($s); + } + + if ( + $this->literal('not', 3) && + $this->supportsQuery($subQuery) + ) { + $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, 'not '], $subQuery]]; + $s = $this->count; + } else { + $this->seek($s); + } + + if ( + $this->literal('selector(', 9) && + $this->selector($selector) && + $this->matchChar(')') + ) { + $support = [Type::T_STRING, '', [[Type::T_KEYWORD, 'selector(']]]; + + $selectorList = [Type::T_LIST, '', []]; + + foreach ($selector as $sc) { + $compound = [Type::T_STRING, '', []]; + + foreach ($sc as $scp) { + if (\is_array($scp)) { + $compound[2][] = $scp; + } else { + $compound[2][] = [Type::T_KEYWORD, $scp]; + } + } + + $selectorList[2][] = $compound; + } + + $support[2][] = $selectorList; + $support[2][] = [Type::T_KEYWORD, ')']; + $parts[] = $support; + $s = $this->count; + } else { + $this->seek($s); + } + + if ($this->variable($var) or $this->interpolation($var)) { + $parts[] = $var; + $s = $this->count; + } else { + $this->seek($s); + } + + if ( + $this->literal('and', 3) && + $this->genericList($expressions, 'supportsQuery', ' and', false) + ) { + array_unshift($expressions[2], [Type::T_STRING, '', $parts]); + + $parts = [$expressions]; + $s = $this->count; + } else { + $this->seek($s); + } + + if ( + $this->literal('or', 2) && + $this->genericList($expressions, 'supportsQuery', ' or', false) + ) { + array_unshift($expressions[2], [Type::T_STRING, '', $parts]); + + $parts = [$expressions]; + $s = $this->count; + } else { + $this->seek($s); + } + + if (\count($parts)) { + if ($this->eatWhiteDefault) { + $this->whitespace(); + } + + $out = [Type::T_STRING, '', $parts]; + + return true; + } + + return false; + } + + + /** + * Parse media expression + * + * @param array $out + * + * @return boolean + */ + protected function mediaExpression(&$out) + { + $s = $this->count; + $value = null; + + if ( + $this->matchChar('(') && + $this->expression($feature) && + ($this->matchChar(':') && + $this->expression($value) || true) && + $this->matchChar(')') + ) { + $out = [Type::T_MEDIA_EXPRESSION, $feature]; + + if ($value) { + $out[] = $value; + } + + return true; + } + + $this->seek($s); + + return false; + } + + /** + * Parse argument values + * + * @param array $out + * + * @return boolean + */ + protected function argValues(&$out) + { + $discardComments = $this->discardComments; + $this->discardComments = true; + + if ($this->genericList($list, 'argValue', ',', false)) { + $out = $list[2]; + + $this->discardComments = $discardComments; + + return true; + } + + $this->discardComments = $discardComments; + + return false; + } + + /** + * Parse argument value + * + * @param array $out + * + * @return boolean + */ + protected function argValue(&$out) + { + $s = $this->count; + + $keyword = null; + + if (! $this->variable($keyword) || ! $this->matchChar(':')) { + $this->seek($s); + + $keyword = null; + } + + if ($this->genericList($value, 'expression', '', true)) { + $out = [$keyword, $value, false]; + $s = $this->count; + + if ($this->literal('...', 3)) { + $out[2] = true; + } else { + $this->seek($s); + } + + return true; + } + + return false; + } + + /** + * Check if a generic directive is known to be able to allow almost any syntax or not + * @param mixed $directiveName + * @return bool + */ + protected function isKnownGenericDirective($directiveName) + { + if (\is_array($directiveName) && \is_string(reset($directiveName))) { + $directiveName = reset($directiveName); + } + if (! \is_string($directiveName)) { + return false; + } + if ( + \in_array($directiveName, [ + 'at-root', + 'media', + 'mixin', + 'include', + 'scssphp-import-once', + 'import', + 'extend', + 'function', + 'break', + 'continue', + 'return', + 'each', + 'while', + 'for', + 'if', + 'debug', + 'warn', + 'error', + 'content', + 'else', + 'charset', + 'supports', + // Todo + 'use', + 'forward', + ]) + ) { + return true; + } + return false; + } + + /** + * Parse directive value list that considers $vars as keyword + * + * @param array $out + * @param boolean|string $endChar + * + * @return boolean + */ + protected function directiveValue(&$out, $endChar = false) + { + $s = $this->count; + + if ($this->variable($out)) { + if ($endChar && $this->matchChar($endChar, false)) { + return true; + } + + if (! $endChar && $this->end()) { + return true; + } + } + + $this->seek($s); + + if (\is_string($endChar) && $this->openString($endChar ? $endChar : ';', $out, null, null, true, ";}{")) { + if ($endChar && $this->matchChar($endChar, false)) { + return true; + } + $ss = $this->count; + if (!$endChar && $this->end()) { + $this->seek($ss); + return true; + } + } + + $this->seek($s); + + $allowVars = $this->allowVars; + $this->allowVars = false; + + $res = $this->genericList($out, 'spaceList', ','); + $this->allowVars = $allowVars; + + if ($res) { + if ($endChar && $this->matchChar($endChar, false)) { + return true; + } + + if (! $endChar && $this->end()) { + return true; + } + } + + $this->seek($s); + + if ($endChar && $this->matchChar($endChar, false)) { + return true; + } + + return false; + } + + /** + * Parse comma separated value list + * + * @param array $out + * + * @return boolean + */ + protected function valueList(&$out) + { + $discardComments = $this->discardComments; + $this->discardComments = true; + $res = $this->genericList($out, 'spaceList', ','); + $this->discardComments = $discardComments; + + return $res; + } + + /** + * Parse a function call, where externals () are part of the call + * and not of the value list + * + * @param $out + * @param bool $mandatoryEnclos + * @param null|string $charAfter + * @param null|bool $eatWhiteSp + * @return bool + */ + protected function functionCallArgumentsList(&$out, $mandatoryEnclos = true, $charAfter = null, $eatWhiteSp = null) + { + $s = $this->count; + + if ( + $this->matchChar('(') && + $this->valueList($out) && + $this->matchChar(')') && + ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end()) + ) { + return true; + } + + if (! $mandatoryEnclos) { + $this->seek($s); + + if ( + $this->valueList($out) && + ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end()) + ) { + return true; + } + } + + $this->seek($s); + + return false; + } + + /** + * Parse space separated value list + * + * @param array $out + * + * @return boolean + */ + protected function spaceList(&$out) + { + return $this->genericList($out, 'expression'); + } + + /** + * Parse generic list + * + * @param array $out + * @param string $parseItem The name of the method used to parse items + * @param string $delim + * @param boolean $flatten + * + * @return boolean + */ + protected function genericList(&$out, $parseItem, $delim = '', $flatten = true) + { + $s = $this->count; + $items = []; + $value = null; + + while ($this->$parseItem($value)) { + $trailing_delim = false; + $items[] = $value; + + if ($delim) { + if (! $this->literal($delim, \strlen($delim))) { + break; + } + + $trailing_delim = true; + } else { + // if no delim watch that a keyword didn't eat the single/double quote + // from the following starting string + if ($value[0] === Type::T_KEYWORD) { + $word = $value[1]; + + $last_char = substr($word, -1); + + if ( + strlen($word) > 1 && + in_array($last_char, [ "'", '"']) && + substr($word, -2, 1) !== '\\' + ) { + // if there is a non escaped opening quote in the keyword, this seems unlikely a mistake + $word = str_replace('\\' . $last_char, '\\\\', $word); + if (strpos($word, $last_char) < strlen($word) - 1) { + continue; + } + + $currentCount = $this->count; + + // let's try to rewind to previous char and try a parse + $this->count--; + // in case the keyword also eat spaces + while (substr($this->buffer, $this->count, 1) !== $last_char) { + $this->count--; + } + + $nextValue = null; + if ($this->$parseItem($nextValue)) { + if ($nextValue[0] === Type::T_KEYWORD && $nextValue[1] === $last_char) { + // bad try, forget it + $this->seek($currentCount); + continue; + } + if ($nextValue[0] !== Type::T_STRING) { + // bad try, forget it + $this->seek($currentCount); + continue; + } + + // OK it was a good idea + $value[1] = substr($value[1], 0, -1); + array_pop($items); + $items[] = $value; + $items[] = $nextValue; + } else { + // bad try, forget it + $this->seek($currentCount); + continue; + } + } + } + } + } + + if (! $items) { + $this->seek($s); + + return false; + } + + if ($trailing_delim) { + $items[] = [Type::T_NULL]; + } + + if ($flatten && \count($items) === 1) { + $out = $items[0]; + } else { + $out = [Type::T_LIST, $delim, $items]; + } + + return true; + } + + /** + * Parse expression + * + * @param array $out + * @param boolean $listOnly + * @param boolean $lookForExp + * + * @return boolean + */ + protected function expression(&$out, $listOnly = false, $lookForExp = true) + { + $s = $this->count; + $discard = $this->discardComments; + $this->discardComments = true; + $allowedTypes = ($listOnly ? [Type::T_LIST] : [Type::T_LIST, Type::T_MAP]); + + if ($this->matchChar('(')) { + if ($this->enclosedExpression($lhs, $s, ')', $allowedTypes)) { + if ($lookForExp) { + $out = $this->expHelper($lhs, 0); + } else { + $out = $lhs; + } + + $this->discardComments = $discard; + + return true; + } + + $this->seek($s); + } + + if (\in_array(Type::T_LIST, $allowedTypes) && $this->matchChar('[')) { + if ($this->enclosedExpression($lhs, $s, ']', [Type::T_LIST])) { + if ($lookForExp) { + $out = $this->expHelper($lhs, 0); + } else { + $out = $lhs; + } + + $this->discardComments = $discard; + + return true; + } + + $this->seek($s); + } + + if (! $listOnly && $this->value($lhs)) { + if ($lookForExp) { + $out = $this->expHelper($lhs, 0); + } else { + $out = $lhs; + } + + $this->discardComments = $discard; + + return true; + } + + $this->discardComments = $discard; + + return false; + } + + /** + * Parse expression specifically checking for lists in parenthesis or brackets + * + * @param array $out + * @param integer $s + * @param string $closingParen + * @param array $allowedTypes + * + * @return boolean + */ + protected function enclosedExpression(&$out, $s, $closingParen = ')', $allowedTypes = [Type::T_LIST, Type::T_MAP]) + { + if ($this->matchChar($closingParen) && \in_array(Type::T_LIST, $allowedTypes)) { + $out = [Type::T_LIST, '', []]; + + switch ($closingParen) { + case ')': + $out['enclosing'] = 'parent'; // parenthesis list + break; + + case ']': + $out['enclosing'] = 'bracket'; // bracketed list + break; + } + + return true; + } + + if ( + $this->valueList($out) && + $this->matchChar($closingParen) && ! ($closingParen === ')' && + \in_array($out[0], [Type::T_EXPRESSION, Type::T_UNARY])) && + \in_array(Type::T_LIST, $allowedTypes) + ) { + if ($out[0] !== Type::T_LIST || ! empty($out['enclosing'])) { + $out = [Type::T_LIST, '', [$out]]; + } + + switch ($closingParen) { + case ')': + $out['enclosing'] = 'parent'; // parenthesis list + break; + + case ']': + $out['enclosing'] = 'bracket'; // bracketed list + break; + } + + return true; + } + + $this->seek($s); + + if (\in_array(Type::T_MAP, $allowedTypes) && $this->map($out)) { + return true; + } + + return false; + } + + /** + * Parse left-hand side of subexpression + * + * @param array $lhs + * @param integer $minP + * + * @return array + */ + protected function expHelper($lhs, $minP) + { + $operators = static::$operatorPattern; + + $ss = $this->count; + $whiteBefore = isset($this->buffer[$this->count - 1]) && + ctype_space($this->buffer[$this->count - 1]); + + while ($this->match($operators, $m, false) && static::$precedence[$m[1]] >= $minP) { + $whiteAfter = isset($this->buffer[$this->count]) && + ctype_space($this->buffer[$this->count]); + $varAfter = isset($this->buffer[$this->count]) && + $this->buffer[$this->count] === '$'; + + $this->whitespace(); + + $op = $m[1]; + + // don't turn negative numbers into expressions + if ($op === '-' && $whiteBefore && ! $whiteAfter && ! $varAfter) { + break; + } + + if (! $this->value($rhs) && ! $this->expression($rhs, true, false)) { + break; + } + + if ($op === '-' && ! $whiteAfter && $rhs[0] === Type::T_KEYWORD) { + break; + } + + // consume higher-precedence operators on the right-hand side + $rhs = $this->expHelper($rhs, static::$precedence[$op] + 1); + + $lhs = [Type::T_EXPRESSION, $op, $lhs, $rhs, $this->inParens, $whiteBefore, $whiteAfter]; + + $ss = $this->count; + $whiteBefore = isset($this->buffer[$this->count - 1]) && + ctype_space($this->buffer[$this->count - 1]); + } + + $this->seek($ss); + + return $lhs; + } + + /** + * Parse value + * + * @param array $out + * + * @return boolean + */ + protected function value(&$out) + { + if (! isset($this->buffer[$this->count])) { + return false; + } + + $s = $this->count; + $char = $this->buffer[$this->count]; + + if ( + $this->literal('url(', 4) && + $this->match('data:([a-z]+)\/([a-z0-9.+-]+);base64,', $m, false) + ) { + $len = strspn( + $this->buffer, + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz0123456789+/=', + $this->count + ); + + $this->count += $len; + + if ($this->matchChar(')')) { + $content = substr($this->buffer, $s, $this->count - $s); + $out = [Type::T_KEYWORD, $content]; + + return true; + } + } + + $this->seek($s); + + if ( + $this->literal('url(', 4, false) && + $this->match('\s*(\/\/[^\s\)]+)\s*', $m) + ) { + $content = 'url(' . $m[1]; + + if ($this->matchChar(')')) { + $content .= ')'; + $out = [Type::T_KEYWORD, $content]; + + return true; + } + } + + $this->seek($s); + + // not + if ($char === 'n' && $this->literal('not', 3, false)) { + if ( + $this->whitespace() && + $this->value($inner) + ) { + $out = [Type::T_UNARY, 'not', $inner, $this->inParens]; + + return true; + } + + $this->seek($s); + + if ($this->parenValue($inner)) { + $out = [Type::T_UNARY, 'not', $inner, $this->inParens]; + + return true; + } + + $this->seek($s); + } + + // addition + if ($char === '+') { + $this->count++; + + $follow_white = $this->whitespace(); + + if ($this->value($inner)) { + $out = [Type::T_UNARY, '+', $inner, $this->inParens]; + + return true; + } + + if ($follow_white) { + $out = [Type::T_KEYWORD, $char]; + return true; + } + + $this->seek($s); + + return false; + } + + // negation + if ($char === '-') { + if ($this->customProperty($out)) { + return true; + } + + $this->count++; + + $follow_white = $this->whitespace(); + + if ($this->variable($inner) || $this->unit($inner) || $this->parenValue($inner)) { + $out = [Type::T_UNARY, '-', $inner, $this->inParens]; + + return true; + } + + if ( + $this->keyword($inner) && + ! $this->func($inner, $out) + ) { + $out = [Type::T_UNARY, '-', $inner, $this->inParens]; + + return true; + } + + if ($follow_white) { + $out = [Type::T_KEYWORD, $char]; + + return true; + } + + $this->seek($s); + } + + // paren + if ($char === '(' && $this->parenValue($out)) { + return true; + } + + if ($char === '#') { + if ($this->interpolation($out) || $this->color($out)) { + return true; + } + + $this->count++; + + if ($this->keyword($keyword)) { + $out = [Type::T_KEYWORD, '#' . $keyword]; + + return true; + } + + $this->count--; + } + + if ($this->matchChar('&', true)) { + $out = [Type::T_SELF]; + + return true; + } + + if ($char === '$' && $this->variable($out)) { + return true; + } + + if ($char === 'p' && $this->progid($out)) { + return true; + } + + if (($char === '"' || $char === "'") && $this->string($out)) { + return true; + } + + if ($this->unit($out)) { + return true; + } + + // unicode range with wildcards + if ( + $this->literal('U+', 2) && + $this->match('\?+|([0-9A-F]+(\?+|(-[0-9A-F]+))?)', $m, false) + ) { + $unicode = explode('-', $m[0]); + if (strlen(reset($unicode)) <= 6 && strlen(end($unicode)) <= 6) { + $out = [Type::T_KEYWORD, 'U+' . $m[0]]; + + return true; + } + $this->count -= strlen($m[0]) + 2; + } + + if ($this->keyword($keyword, false)) { + if ($this->func($keyword, $out)) { + return true; + } + + $this->whitespace(); + + if ($keyword === 'null') { + $out = [Type::T_NULL]; + } else { + $out = [Type::T_KEYWORD, $keyword]; + } + + return true; + } + + return false; + } + + /** + * Parse parenthesized value + * + * @param array $out + * + * @return boolean + */ + protected function parenValue(&$out) + { + $s = $this->count; + + $inParens = $this->inParens; + + if ($this->matchChar('(')) { + if ($this->matchChar(')')) { + $out = [Type::T_LIST, '', []]; + + return true; + } + + $this->inParens = true; + + if ( + $this->expression($exp) && + $this->matchChar(')') + ) { + $out = $exp; + $this->inParens = $inParens; + + return true; + } + } + + $this->inParens = $inParens; + $this->seek($s); + + return false; + } + + /** + * Parse "progid:" + * + * @param array $out + * + * @return boolean + */ + protected function progid(&$out) + { + $s = $this->count; + + if ( + $this->literal('progid:', 7, false) && + $this->openString('(', $fn) && + $this->matchChar('(') + ) { + $this->openString(')', $args, '('); + + if ($this->matchChar(')')) { + $out = [Type::T_STRING, '', [ + 'progid:', $fn, '(', $args, ')' + ]]; + + return true; + } + } + + $this->seek($s); + + return false; + } + + /** + * Parse function call + * + * @param string $name + * @param array $func + * + * @return boolean + */ + protected function func($name, &$func) + { + $s = $this->count; + + if ($this->matchChar('(')) { + if ($name === 'alpha' && $this->argumentList($args)) { + $func = [Type::T_FUNCTION, $name, [Type::T_STRING, '', $args]]; + + return true; + } + + if ($name !== 'expression' && ! preg_match('/^(-[a-z]+-)?calc$/', $name)) { + $ss = $this->count; + + if ( + $this->argValues($args) && + $this->matchChar(')') + ) { + $func = [Type::T_FUNCTION_CALL, $name, $args]; + + return true; + } + + $this->seek($ss); + } + + if ( + ($this->openString(')', $str, '(') || true) && + $this->matchChar(')') + ) { + $args = []; + + if (! empty($str)) { + $args[] = [null, [Type::T_STRING, '', [$str]]]; + } + + $func = [Type::T_FUNCTION_CALL, $name, $args]; + + return true; + } + } + + $this->seek($s); + + return false; + } + + /** + * Parse function call argument list + * + * @param array $out + * + * @return boolean + */ + protected function argumentList(&$out) + { + $s = $this->count; + $this->matchChar('('); + + $args = []; + + while ($this->keyword($var)) { + if ( + $this->matchChar('=') && + $this->expression($exp) + ) { + $args[] = [Type::T_STRING, '', [$var . '=']]; + $arg = $exp; + } else { + break; + } + + $args[] = $arg; + + if (! $this->matchChar(',')) { + break; + } + + $args[] = [Type::T_STRING, '', [', ']]; + } + + if (! $this->matchChar(')') || ! $args) { + $this->seek($s); + + return false; + } + + $out = $args; + + return true; + } + + /** + * Parse mixin/function definition argument list + * + * @param array $out + * + * @return boolean + */ + protected function argumentDef(&$out) + { + $s = $this->count; + $this->matchChar('('); + + $args = []; + + while ($this->variable($var)) { + $arg = [$var[1], null, false]; + + $ss = $this->count; + + if ( + $this->matchChar(':') && + $this->genericList($defaultVal, 'expression', '', true) + ) { + $arg[1] = $defaultVal; + } else { + $this->seek($ss); + } + + $ss = $this->count; + + if ($this->literal('...', 3)) { + $sss = $this->count; + + if (! $this->matchChar(')')) { + throw $this->parseError('... has to be after the final argument'); + } + + $arg[2] = true; + + $this->seek($sss); + } else { + $this->seek($ss); + } + + $args[] = $arg; + + if (! $this->matchChar(',')) { + break; + } + } + + if (! $this->matchChar(')')) { + $this->seek($s); + + return false; + } + + $out = $args; + + return true; + } + + /** + * Parse map + * + * @param array $out + * + * @return boolean + */ + protected function map(&$out) + { + $s = $this->count; + + if (! $this->matchChar('(')) { + return false; + } + + $keys = []; + $values = []; + + while ( + $this->genericList($key, 'expression', '', true) && + $this->matchChar(':') && + $this->genericList($value, 'expression', '', true) + ) { + $keys[] = $key; + $values[] = $value; + + if (! $this->matchChar(',')) { + break; + } + } + + if (! $keys || ! $this->matchChar(')')) { + $this->seek($s); + + return false; + } + + $out = [Type::T_MAP, $keys, $values]; + + return true; + } + + /** + * Parse color + * + * @param array $out + * + * @return boolean + */ + protected function color(&$out) + { + $s = $this->count; + + if ($this->match('(#([0-9a-f]+)\b)', $m)) { + if (\in_array(\strlen($m[2]), [3,4,6,8])) { + $out = [Type::T_KEYWORD, $m[0]]; + + return true; + } + + $this->seek($s); + + return false; + } + + return false; + } + + /** + * Parse number with unit + * + * @param array $unit + * + * @return boolean + */ + protected function unit(&$unit) + { + $s = $this->count; + + if ($this->match('([0-9]*(\.)?[0-9]+)([%a-zA-Z]+)?', $m, false)) { + if (\strlen($this->buffer) === $this->count || ! ctype_digit($this->buffer[$this->count])) { + $this->whitespace(); + + $unit = new Node\Number($m[1], empty($m[3]) ? '' : $m[3]); + + return true; + } + + $this->seek($s); + } + + return false; + } + + /** + * Parse string + * + * @param array $out + * + * @return boolean + */ + protected function string(&$out, $keepDelimWithInterpolation = false) + { + $s = $this->count; + + if ($this->matchChar('"', false)) { + $delim = '"'; + } elseif ($this->matchChar("'", false)) { + $delim = "'"; + } else { + return false; + } + + $content = []; + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + $hasInterpolation = false; + + while ($this->matchString($m, $delim)) { + if ($m[1] !== '') { + $content[] = $m[1]; + } + + if ($m[2] === '#{') { + $this->count -= \strlen($m[2]); + + if ($this->interpolation($inter, false)) { + $content[] = $inter; + $hasInterpolation = true; + } else { + $this->count += \strlen($m[2]); + $content[] = '#{'; // ignore it + } + } elseif ($m[2] === "\r") { + $content[] = chr(10); + // TODO : warning + # DEPRECATION WARNING on line x, column y of zzz: + # Unescaped multiline strings are deprecated and will be removed in a future version of Sass. + # To include a newline in a string, use "\a" or "\a " as in CSS. + if ($this->matchChar("\n", false)) { + $content[] = ' '; + } + } elseif ($m[2] === '\\') { + if ( + $this->literal("\r\n", 2, false) || + $this->matchChar("\r", false) || + $this->matchChar("\n", false) || + $this->matchChar("\f", false) + ) { + // this is a continuation escaping, to be ignored + } elseif ($this->matchEscapeCharacter($c)) { + $content[] = $c; + } else { + throw $this->parseError('Unterminated escape sequence'); + } + } else { + $this->count -= \strlen($delim); + break; // delim + } + } + + $this->eatWhiteDefault = $oldWhite; + + if ($this->literal($delim, \strlen($delim))) { + if ($hasInterpolation && ! $keepDelimWithInterpolation) { + $delim = '"'; + } + + $out = [Type::T_STRING, $delim, $content]; + + return true; + } + + $this->seek($s); + + return false; + } + + /** + * @param string $out + * @param bool $inKeywords + * @return bool + */ + protected function matchEscapeCharacter(&$out, $inKeywords = false) + { + $s = $this->count; + if ($this->match('[a-f0-9]', $m, false)) { + $hex = $m[0]; + + for ($i = 5; $i--;) { + if ($this->match('[a-f0-9]', $m, false)) { + $hex .= $m[0]; + } else { + break; + } + } + + // CSS allows Unicode escape sequences to be followed by a delimiter space + // (necessary in some cases for shorter sequences to disambiguate their end) + $this->matchChar(' ', false); + + $value = hexdec($hex); + + if (!$inKeywords && ($value == 0 || ($value >= 0xD800 && $value <= 0xDFFF) || $value >= 0x10FFFF)) { + $out = "\xEF\xBF\xBD"; // "\u{FFFD}" but with a syntax supported on PHP 5 + } elseif ($value < 0x20) { + $out = Util::mbChr($value); + } else { + $out = Util::mbChr($value); + } + + return true; + } + + if ($this->match('.', $m, false)) { + if ($inKeywords && in_array($m[0], ["'",'"','@','&',' ','\\',':','/','%'])) { + $this->seek($s); + return false; + } + $out = $m[0]; + + return true; + } + + return false; + } + + /** + * Parse keyword or interpolation + * + * @param array $out + * @param boolean $restricted + * + * @return boolean + */ + protected function mixedKeyword(&$out, $restricted = false) + { + $parts = []; + + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + for (;;) { + if ($restricted ? $this->restrictedKeyword($key) : $this->keyword($key)) { + $parts[] = $key; + continue; + } + + if ($this->interpolation($inter)) { + $parts[] = $inter; + continue; + } + + break; + } + + $this->eatWhiteDefault = $oldWhite; + + if (! $parts) { + return false; + } + + if ($this->eatWhiteDefault) { + $this->whitespace(); + } + + $out = $parts; + + return true; + } + + /** + * Parse an unbounded string stopped by $end + * + * @param string $end + * @param array $out + * @param string $nestOpen + * @param string $nestClose + * @param boolean $rtrim + * @param string $disallow + * + * @return boolean + */ + protected function openString($end, &$out, $nestOpen = null, $nestClose = null, $rtrim = true, $disallow = null) + { + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + if ($nestOpen && ! $nestClose) { + $nestClose = $end; + } + + $patt = ($disallow ? '[^' . $this->pregQuote($disallow) . ']' : '.'); + $patt = '(' . $patt . '*?)([\'"]|#\{|' + . $this->pregQuote($end) . '|' + . (($nestClose && $nestClose !== $end) ? $this->pregQuote($nestClose) . '|' : '') + . static::$commentPattern . ')'; + + $nestingLevel = 0; + + $content = []; + + while ($this->match($patt, $m, false)) { + if (isset($m[1]) && $m[1] !== '') { + $content[] = $m[1]; + + if ($nestOpen) { + $nestingLevel += substr_count($m[1], $nestOpen); + } + } + + $tok = $m[2]; + + $this->count -= \strlen($tok); + + if ($tok === $end && ! $nestingLevel) { + break; + } + + if ($tok === $nestClose) { + $nestingLevel--; + } + + if (($tok === "'" || $tok === '"') && $this->string($str, true)) { + $content[] = $str; + continue; + } + + if ($tok === '#{' && $this->interpolation($inter)) { + $content[] = $inter; + continue; + } + + $content[] = $tok; + $this->count += \strlen($tok); + } + + $this->eatWhiteDefault = $oldWhite; + + if (! $content || $tok !== $end) { + return false; + } + + // trim the end + if ($rtrim && \is_string(end($content))) { + $content[\count($content) - 1] = rtrim(end($content)); + } + + $out = [Type::T_STRING, '', $content]; + + return true; + } + + /** + * Parser interpolation + * + * @param string|array $out + * @param boolean $lookWhite save information about whitespace before and after + * + * @return boolean + */ + protected function interpolation(&$out, $lookWhite = true) + { + $oldWhite = $this->eatWhiteDefault; + $allowVars = $this->allowVars; + $this->allowVars = true; + $this->eatWhiteDefault = true; + + $s = $this->count; + + if ( + $this->literal('#{', 2) && + $this->valueList($value) && + $this->matchChar('}', false) + ) { + if ($value === [Type::T_SELF]) { + $out = $value; + } else { + if ($lookWhite) { + $left = ($s > 0 && preg_match('/\s/', $this->buffer[$s - 1])) ? ' ' : ''; + $right = ( + ! empty($this->buffer[$this->count]) && + preg_match('/\s/', $this->buffer[$this->count]) + ) ? ' ' : ''; + } else { + $left = $right = false; + } + + $out = [Type::T_INTERPOLATE, $value, $left, $right]; + } + + $this->eatWhiteDefault = $oldWhite; + $this->allowVars = $allowVars; + + if ($this->eatWhiteDefault) { + $this->whitespace(); + } + + return true; + } + + $this->seek($s); + + $this->eatWhiteDefault = $oldWhite; + $this->allowVars = $allowVars; + + return false; + } + + /** + * Parse property name (as an array of parts or a string) + * + * @param array $out + * + * @return boolean + */ + protected function propertyName(&$out) + { + $parts = []; + + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + for (;;) { + if ($this->interpolation($inter)) { + $parts[] = $inter; + continue; + } + + if ($this->keyword($text)) { + $parts[] = $text; + continue; + } + + if (! $parts && $this->match('[:.#]', $m, false)) { + // css hacks + $parts[] = $m[0]; + continue; + } + + break; + } + + $this->eatWhiteDefault = $oldWhite; + + if (! $parts) { + return false; + } + + // match comment hack + if (preg_match(static::$whitePattern, $this->buffer, $m, 0, $this->count)) { + if (! empty($m[0])) { + $parts[] = $m[0]; + $this->count += \strlen($m[0]); + } + } + + $this->whitespace(); // get any extra whitespace + + $out = [Type::T_STRING, '', $parts]; + + return true; + } + + /** + * Parse custom property name (as an array of parts or a string) + * + * @param array $out + * + * @return boolean + */ + protected function customProperty(&$out) + { + $s = $this->count; + + if (! $this->literal('--', 2, false)) { + return false; + } + + $parts = ['--']; + + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + for (;;) { + if ($this->interpolation($inter)) { + $parts[] = $inter; + continue; + } + + if ($this->matchChar('&', false)) { + $parts[] = [Type::T_SELF]; + continue; + } + + if ($this->variable($var)) { + $parts[] = $var; + continue; + } + + if ($this->keyword($text)) { + $parts[] = $text; + continue; + } + + break; + } + + $this->eatWhiteDefault = $oldWhite; + + if (\count($parts) == 1) { + $this->seek($s); + + return false; + } + + $this->whitespace(); // get any extra whitespace + + $out = [Type::T_STRING, '', $parts]; + + return true; + } + + /** + * Parse comma separated selector list + * + * @param array $out + * @param string|boolean $subSelector + * + * @return boolean + */ + protected function selectors(&$out, $subSelector = false) + { + $s = $this->count; + $selectors = []; + + while ($this->selector($sel, $subSelector)) { + $selectors[] = $sel; + + if (! $this->matchChar(',', true)) { + break; + } + + while ($this->matchChar(',', true)) { + ; // ignore extra + } + } + + if (! $selectors) { + $this->seek($s); + + return false; + } + + $out = $selectors; + + return true; + } + + /** + * Parse whitespace separated selector list + * + * @param array $out + * @param string|boolean $subSelector + * + * @return boolean + */ + protected function selector(&$out, $subSelector = false) + { + $selector = []; + + $discardComments = $this->discardComments; + $this->discardComments = true; + + for (;;) { + $s = $this->count; + + if ($this->match('[>+~]+', $m, true)) { + if ( + $subSelector && \is_string($subSelector) && strpos($subSelector, 'nth-') === 0 && + $m[0] === '+' && $this->match("(\d+|n\b)", $counter) + ) { + $this->seek($s); + } else { + $selector[] = [$m[0]]; + continue; + } + } + + if ($this->selectorSingle($part, $subSelector)) { + $selector[] = $part; + $this->whitespace(); + continue; + } + + break; + } + + $this->discardComments = $discardComments; + + if (! $selector) { + return false; + } + + $out = $selector; + + return true; + } + + /** + * parsing escaped chars in selectors: + * - escaped single chars are kept escaped in the selector but in a normalized form + * (if not in 0-9a-f range as this would be ambigous) + * - other escaped sequences (multibyte chars or 0-9a-f) are kept in their initial escaped form, + * normalized to lowercase + * + * TODO: this is a fallback solution. Ideally escaped chars in selectors should be encoded as the genuine chars, + * and escaping added when printing in the Compiler, where/if it's mandatory + * - but this require a better formal selector representation instead of the array we have now + * + * @param string $out + * @param bool $keepEscapedNumber + * @return bool + */ + protected function matchEscapeCharacterInSelector(&$out, $keepEscapedNumber = false) + { + $s_escape = $this->count; + if ($this->match('\\\\', $m)) { + $out = '\\' . $m[0]; + return true; + } + + if ($this->matchEscapeCharacter($escapedout, true)) { + if (strlen($escapedout) === 1) { + if (!preg_match(",\w,", $escapedout)) { + $out = '\\' . $escapedout; + return true; + } elseif (! $keepEscapedNumber || ! \is_numeric($escapedout)) { + $out = $escapedout; + return true; + } + } + $escape_sequence = rtrim(substr($this->buffer, $s_escape, $this->count - $s_escape)); + if (strlen($escape_sequence) < 6) { + $escape_sequence .= ' '; + } + $out = '\\' . strtolower($escape_sequence); + return true; + } + if ($this->match('\\S', $m)) { + $out = '\\' . $m[0]; + return true; + } + + + return false; + } + + /** + * Parse the parts that make up a selector + * + * {@internal + * div[yes=no]#something.hello.world:nth-child(-2n+1)%placeholder + * }} + * + * @param array $out + * @param string|boolean $subSelector + * + * @return boolean + */ + protected function selectorSingle(&$out, $subSelector = false) + { + $oldWhite = $this->eatWhiteDefault; + $this->eatWhiteDefault = false; + + $parts = []; + + if ($this->matchChar('*', false)) { + $parts[] = '*'; + } + + for (;;) { + if (! isset($this->buffer[$this->count])) { + break; + } + + $s = $this->count; + $char = $this->buffer[$this->count]; + + // see if we can stop early + if ($char === '{' || $char === ',' || $char === ';' || $char === '}' || $char === '@') { + break; + } + + // parsing a sub selector in () stop with the closing ) + if ($subSelector && $char === ')') { + break; + } + + //self + switch ($char) { + case '&': + $parts[] = Compiler::$selfSelector; + $this->count++; + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + continue 2; + + case '.': + $parts[] = '.'; + $this->count++; + continue 2; + + case '|': + $parts[] = '|'; + $this->count++; + continue 2; + } + + // handling of escaping in selectors : get the escaped char + if ($char === '\\') { + $this->count++; + if ($this->matchEscapeCharacterInSelector($escaped, true)) { + $parts[] = $escaped; + continue; + } + $this->count--; + } + + if ($char === '%') { + $this->count++; + + if ($this->placeholder($placeholder)) { + $parts[] = '%'; + $parts[] = $placeholder; + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + continue; + } + + break; + } + + if ($char === '#') { + if ($this->interpolation($inter)) { + $parts[] = $inter; + ! $this->cssOnly || $this->assertPlainCssValid(false, $s); + continue; + } + + $parts[] = '#'; + $this->count++; + continue; + } + + // a pseudo selector + if ($char === ':') { + if ($this->buffer[$this->count + 1] === ':') { + $this->count += 2; + $part = '::'; + } else { + $this->count++; + $part = ':'; + } + + if ($this->mixedKeyword($nameParts, true)) { + $parts[] = $part; + + foreach ($nameParts as $sub) { + $parts[] = $sub; + } + + $ss = $this->count; + + if ( + $nameParts === ['not'] || + $nameParts === ['is'] || + $nameParts === ['has'] || + $nameParts === ['where'] || + $nameParts === ['slotted'] || + $nameParts === ['nth-child'] || + $nameParts === ['nth-last-child'] || + $nameParts === ['nth-of-type'] || + $nameParts === ['nth-last-of-type'] + ) { + if ( + $this->matchChar('(', true) && + ($this->selectors($subs, reset($nameParts)) || true) && + $this->matchChar(')') + ) { + $parts[] = '('; + + while ($sub = array_shift($subs)) { + while ($ps = array_shift($sub)) { + foreach ($ps as &$p) { + $parts[] = $p; + } + + if (\count($sub) && reset($sub)) { + $parts[] = ' '; + } + } + + if (\count($subs) && reset($subs)) { + $parts[] = ', '; + } + } + + $parts[] = ')'; + } else { + $this->seek($ss); + } + } elseif ( + $this->matchChar('(', true) && + ($this->openString(')', $str, '(') || true) && + $this->matchChar(')') + ) { + $parts[] = '('; + + if (! empty($str)) { + $parts[] = $str; + } + + $parts[] = ')'; + } else { + $this->seek($ss); + } + + continue; + } + } + + $this->seek($s); + + // 2n+1 + if ($subSelector && \is_string($subSelector) && strpos($subSelector, 'nth-') === 0) { + if ($this->match("(\s*(\+\s*|\-\s*)?(\d+|n|\d+n))+", $counter)) { + $parts[] = $counter[0]; + //$parts[] = str_replace(' ', '', $counter[0]); + continue; + } + } + + $this->seek($s); + + // attribute selector + if ( + $char === '[' && + $this->matchChar('[') && + ($this->openString(']', $str, '[') || true) && + $this->matchChar(']') + ) { + $parts[] = '['; + + if (! empty($str)) { + $parts[] = $str; + } + + $parts[] = ']'; + continue; + } + + $this->seek($s); + + // for keyframes + if ($this->unit($unit)) { + $parts[] = $unit; + continue; + } + + if ($this->restrictedKeyword($name, false, true)) { + $parts[] = $name; + continue; + } + + break; + } + + $this->eatWhiteDefault = $oldWhite; + + if (! $parts) { + return false; + } + + $out = $parts; + + return true; + } + + /** + * Parse a variable + * + * @param array $out + * + * @return boolean + */ + protected function variable(&$out) + { + $s = $this->count; + + if ( + $this->matchChar('$', false) && + $this->keyword($name) + ) { + if ($this->allowVars) { + $out = [Type::T_VARIABLE, $name]; + } else { + $out = [Type::T_KEYWORD, '$' . $name]; + } + + return true; + } + + $this->seek($s); + + return false; + } + + /** + * Parse a keyword + * + * @param string $word + * @param boolean $eatWhitespace + * @param boolean $inSelector + * + * @return boolean + */ + protected function keyword(&$word, $eatWhitespace = null, $inSelector = false) + { + $s = $this->count; + $match = $this->match( + $this->utf8 + ? '(([\pL\w\x{00A0}-\x{10FFFF}_\-\*!"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)([\pL\w\x{00A0}-\x{10FFFF}\-_"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)*)' + : '(([\w_\-\*!"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)([\w\-_"\']|\\\\[a-f0-9]{6} ?|\\\\[a-f0-9]{1,5}(?![a-f0-9]) ?|[\\\\].)*)', + $m, + false + ); + + if ($match) { + $word = $m[1]; + + // handling of escaping in keyword : get the escaped char + if (strpos($word, '\\') !== false) { + $send = $this->count; + $escapedWord = []; + $this->seek($s); + $previousEscape = false; + while ($this->count < $send) { + $char = $this->buffer[$this->count]; + $this->count++; + if ( + $this->count < $send + && $char === '\\' + && !$previousEscape + && ( + $inSelector ? + $this->matchEscapeCharacterInSelector($out) + : + $this->matchEscapeCharacter($out, true) + ) + ) { + $escapedWord[] = $out; + } else { + if ($previousEscape) { + $previousEscape = false; + } elseif ($char === '\\') { + $previousEscape = true; + } + $escapedWord[] = $char; + } + } + + $word = implode('', $escapedWord); + } + + if (is_null($eatWhitespace) ? $this->eatWhiteDefault : $eatWhitespace) { + $this->whitespace(); + } + + return true; + } + + return false; + } + + /** + * Parse a keyword that should not start with a number + * + * @param string $word + * @param boolean $eatWhitespace + * @param boolean $inSelector + * + * @return boolean + */ + protected function restrictedKeyword(&$word, $eatWhitespace = null, $inSelector = false) + { + $s = $this->count; + + if ($this->keyword($word, $eatWhitespace, $inSelector) && (\ord($word[0]) > 57 || \ord($word[0]) < 48)) { + return true; + } + + $this->seek($s); + + return false; + } + + /** + * Parse a placeholder + * + * @param string|array $placeholder + * + * @return boolean + */ + protected function placeholder(&$placeholder) + { + $match = $this->match( + $this->utf8 + ? '([\pL\w\-_]+)' + : '([\w\-_]+)', + $m + ); + + if ($match) { + $placeholder = $m[1]; + + return true; + } + + if ($this->interpolation($placeholder)) { + return true; + } + + return false; + } + + /** + * Parse a url + * + * @param array $out + * + * @return boolean + */ + protected function url(&$out) + { + if ($this->literal('url(', 4)) { + $s = $this->count; + + if ( + ($this->string($out) || $this->spaceList($out)) && + $this->matchChar(')') + ) { + $out = [Type::T_STRING, '', ['url(', $out, ')']]; + + return true; + } + + $this->seek($s); + + if ( + $this->openString(')', $out) && + $this->matchChar(')') + ) { + $out = [Type::T_STRING, '', ['url(', $out, ')']]; + + return true; + } + } + + return false; + } + + /** + * Consume an end of statement delimiter + * @param bool $eatWhitespace + * + * @return boolean + */ + protected function end($eatWhitespace = null) + { + if ($this->matchChar(';', $eatWhitespace)) { + return true; + } + + if ($this->count === \strlen($this->buffer) || $this->buffer[$this->count] === '}') { + // if there is end of file or a closing block next then we don't need a ; + return true; + } + + return false; + } + + /** + * Strip assignment flag from the list + * + * @param array $value + * + * @return array + */ + protected function stripAssignmentFlags(&$value) + { + $flags = []; + + for ($token = &$value; $token[0] === Type::T_LIST && ($s = \count($token[2])); $token = &$lastNode) { + $lastNode = &$token[2][$s - 1]; + + while ($lastNode[0] === Type::T_KEYWORD && \in_array($lastNode[1], ['!default', '!global'])) { + array_pop($token[2]); + + $node = end($token[2]); + $token = $this->flattenList($token); + $flags[] = $lastNode[1]; + $lastNode = $node; + } + } + + return $flags; + } + + /** + * Strip optional flag from selector list + * + * @param array $selectors + * + * @return string + */ + protected function stripOptionalFlag(&$selectors) + { + $optional = false; + $selector = end($selectors); + $part = end($selector); + + if ($part === ['!optional']) { + array_pop($selectors[\count($selectors) - 1]); + + $optional = true; + } + + return $optional; + } + + /** + * Turn list of length 1 into value type + * + * @param array $value + * + * @return array + */ + protected function flattenList($value) + { + if ($value[0] === Type::T_LIST && \count($value[2]) === 1) { + return $this->flattenList($value[2][0]); + } + + return $value; + } + + /** + * Quote regular expression + * + * @param string $what + * + * @return string + */ + private function pregQuote($what) + { + return preg_quote($what, '/'); + } + + /** + * Extract line numbers from buffer + * + * @param string $buffer + */ + private function extractLineNumbers($buffer) + { + $this->sourcePositions = [0 => 0]; + $prev = 0; + + while (($pos = strpos($buffer, "\n", $prev)) !== false) { + $this->sourcePositions[] = $pos; + $prev = $pos + 1; + } + + $this->sourcePositions[] = \strlen($buffer); + + if (substr($buffer, -1) !== "\n") { + $this->sourcePositions[] = \strlen($buffer) + 1; + } + } + + /** + * Get source line number and column (given character position in the buffer) + * + * @param integer $pos + * + * @return array + */ + private function getSourcePosition($pos) + { + $low = 0; + $high = \count($this->sourcePositions); + + while ($low < $high) { + $mid = (int) (($high + $low) / 2); + + if ($pos < $this->sourcePositions[$mid]) { + $high = $mid - 1; + continue; + } + + if ($pos >= $this->sourcePositions[$mid + 1]) { + $low = $mid + 1; + continue; + } + + return [$mid + 1, $pos - $this->sourcePositions[$mid]]; + } + + return [$low + 1, $pos - $this->sourcePositions[$low]]; + } + + /** + * Save internal encoding of mbstring + * + * When mbstring.func_overload is used to replace the standard PHP string functions, + * this method configures the internal encoding to a single-byte one so that the + * behavior matches the normal behavior of PHP string functions while using the parser. + * The existing internal encoding is saved and will be restored when calling {@see restoreEncoding}. + * + * If mbstring.func_overload is not used (or does not override string functions), this method is a no-op. + * + * @return void + */ + private function saveEncoding() + { + if (\PHP_VERSION_ID < 80000 && \extension_loaded('mbstring') && (2 & (int) ini_get('mbstring.func_overload')) > 0) { + $this->encoding = mb_internal_encoding(); + + mb_internal_encoding('iso-8859-1'); + } + } + + /** + * Restore internal encoding + * + * @return void + */ + private function restoreEncoding() + { + if (\extension_loaded('mbstring') && $this->encoding) { + mb_internal_encoding($this->encoding); + } + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/Base64.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/Base64.php new file mode 100644 index 0000000..4a5ed8b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/Base64.php @@ -0,0 +1,187 @@ + + * + * @internal + */ +class Base64 +{ + /** + * @var array + */ + private static $encodingMap = [ + 0 => 'A', + 1 => 'B', + 2 => 'C', + 3 => 'D', + 4 => 'E', + 5 => 'F', + 6 => 'G', + 7 => 'H', + 8 => 'I', + 9 => 'J', + 10 => 'K', + 11 => 'L', + 12 => 'M', + 13 => 'N', + 14 => 'O', + 15 => 'P', + 16 => 'Q', + 17 => 'R', + 18 => 'S', + 19 => 'T', + 20 => 'U', + 21 => 'V', + 22 => 'W', + 23 => 'X', + 24 => 'Y', + 25 => 'Z', + 26 => 'a', + 27 => 'b', + 28 => 'c', + 29 => 'd', + 30 => 'e', + 31 => 'f', + 32 => 'g', + 33 => 'h', + 34 => 'i', + 35 => 'j', + 36 => 'k', + 37 => 'l', + 38 => 'm', + 39 => 'n', + 40 => 'o', + 41 => 'p', + 42 => 'q', + 43 => 'r', + 44 => 's', + 45 => 't', + 46 => 'u', + 47 => 'v', + 48 => 'w', + 49 => 'x', + 50 => 'y', + 51 => 'z', + 52 => '0', + 53 => '1', + 54 => '2', + 55 => '3', + 56 => '4', + 57 => '5', + 58 => '6', + 59 => '7', + 60 => '8', + 61 => '9', + 62 => '+', + 63 => '/', + ]; + + /** + * @var array + */ + private static $decodingMap = [ + 'A' => 0, + 'B' => 1, + 'C' => 2, + 'D' => 3, + 'E' => 4, + 'F' => 5, + 'G' => 6, + 'H' => 7, + 'I' => 8, + 'J' => 9, + 'K' => 10, + 'L' => 11, + 'M' => 12, + 'N' => 13, + 'O' => 14, + 'P' => 15, + 'Q' => 16, + 'R' => 17, + 'S' => 18, + 'T' => 19, + 'U' => 20, + 'V' => 21, + 'W' => 22, + 'X' => 23, + 'Y' => 24, + 'Z' => 25, + 'a' => 26, + 'b' => 27, + 'c' => 28, + 'd' => 29, + 'e' => 30, + 'f' => 31, + 'g' => 32, + 'h' => 33, + 'i' => 34, + 'j' => 35, + 'k' => 36, + 'l' => 37, + 'm' => 38, + 'n' => 39, + 'o' => 40, + 'p' => 41, + 'q' => 42, + 'r' => 43, + 's' => 44, + 't' => 45, + 'u' => 46, + 'v' => 47, + 'w' => 48, + 'x' => 49, + 'y' => 50, + 'z' => 51, + 0 => 52, + 1 => 53, + 2 => 54, + 3 => 55, + 4 => 56, + 5 => 57, + 6 => 58, + 7 => 59, + 8 => 60, + 9 => 61, + '+' => 62, + '/' => 63, + ]; + + /** + * Convert to base64 + * + * @param integer $value + * + * @return string + */ + public static function encode($value) + { + return self::$encodingMap[$value]; + } + + /** + * Convert from base64 + * + * @param string $value + * + * @return integer + */ + public static function decode($value) + { + return self::$decodingMap[$value]; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/Base64VLQ.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/Base64VLQ.php new file mode 100644 index 0000000..d47b96a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/Base64VLQ.php @@ -0,0 +1,151 @@ + + * @author Anthon Pang + * + * @internal + */ +class Base64VLQ +{ + // A Base64 VLQ digit can represent 5 bits, so it is base-32. + const VLQ_BASE_SHIFT = 5; + + // A mask of bits for a VLQ digit (11111), 31 decimal. + const VLQ_BASE_MASK = 31; + + // The continuation bit is the 6th bit. + const VLQ_CONTINUATION_BIT = 32; + + /** + * Returns the VLQ encoded value. + * + * @param integer $value + * + * @return string + */ + public static function encode($value) + { + $encoded = ''; + $vlq = self::toVLQSigned($value); + + do { + $digit = $vlq & self::VLQ_BASE_MASK; + + //$vlq >>>= self::VLQ_BASE_SHIFT; // unsigned right shift + $vlq = (($vlq >> 1) & PHP_INT_MAX) >> (self::VLQ_BASE_SHIFT - 1); + + if ($vlq > 0) { + $digit |= self::VLQ_CONTINUATION_BIT; + } + + $encoded .= Base64::encode($digit); + } while ($vlq > 0); + + return $encoded; + } + + /** + * Decodes VLQValue. + * + * @param string $str + * @param integer $index + * + * @return integer + */ + public static function decode($str, &$index) + { + $result = 0; + $shift = 0; + + do { + $c = $str[$index++]; + $digit = Base64::decode($c); + $continuation = ($digit & self::VLQ_CONTINUATION_BIT) != 0; + $digit &= self::VLQ_BASE_MASK; + $result = $result + ($digit << $shift); + $shift = $shift + self::VLQ_BASE_SHIFT; + } while ($continuation); + + return self::fromVLQSigned($result); + } + + /** + * Converts from a two-complement value to a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) + * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) + * + * @param integer $value + * + * @return integer + */ + private static function toVLQSigned($value) + { + if ($value < 0) { + return ((-$value) << 1) + 1; + } + + return ($value << 1) + 0; + } + + /** + * Converts to a two-complement value from a value where the sign bit is + * is placed in the least significant bit. For example, as decimals: + * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 + * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 + * + * @param integer $value + * + * @return integer + */ + private static function fromVLQSigned($value) + { + $negate = ($value & 1) === 1; + + //$value >>>= 1; // unsigned right shift + $value = ($value >> 1) & PHP_INT_MAX; + + if (! $negate) { + return $value; + } + + // We need to OR 0x80000000 here to ensure the 32nd bit (the sign bit) is + // always set for negative numbers. If `value` were 1, (meaning `negate` is + // true and all other bits were zeros), `value` would now be 0. -0 is just + // 0, and doesn't flip the 32nd bit as intended. All positive numbers will + // successfully flip the 32nd bit without issue, so it's a noop for them. + return -$value | 0x80000000; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/SourceMapGenerator.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/SourceMapGenerator.php new file mode 100644 index 0000000..4f14bdc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/SourceMap/SourceMapGenerator.php @@ -0,0 +1,381 @@ + + * @author Nicolas FRANÇOIS + * + * @internal + */ +class SourceMapGenerator +{ + /** + * What version of source map does the generator generate? + */ + const VERSION = 3; + + /** + * Array of default options + * + * @var array + * @phpstan-var array{sourceRoot: string, sourceMapFilename: string|null, sourceMapURL: string|null, sourceMapWriteTo: string|null, outputSourceFiles: bool, sourceMapRootpath: string, sourceMapBasepath: string} + */ + protected $defaultOptions = [ + // an optional source root, useful for relocating source files + // on a server or removing repeated values in the 'sources' entry. + // This value is prepended to the individual entries in the 'source' field. + 'sourceRoot' => '', + + // an optional name of the generated code that this source map is associated with. + 'sourceMapFilename' => null, + + // url of the map + 'sourceMapURL' => null, + + // absolute path to a file to write the map to + 'sourceMapWriteTo' => null, + + // output source contents? + 'outputSourceFiles' => false, + + // base path for filename normalization + 'sourceMapRootpath' => '', + + // base path for filename normalization + 'sourceMapBasepath' => '' + ]; + + /** + * The base64 VLQ encoder + * + * @var \ScssPhp\ScssPhp\SourceMap\Base64VLQ + */ + protected $encoder; + + /** + * Array of mappings + * + * @var array + * @phpstan-var list + */ + protected $mappings = []; + + /** + * Array of contents map + * + * @var array + */ + protected $contentsMap = []; + + /** + * File to content map + * + * @var array + */ + protected $sources = []; + + /** + * @var array + */ + protected $sourceKeys = []; + + /** + * @var array + * @phpstan-var array{sourceRoot: string, sourceMapFilename: string|null, sourceMapURL: string|null, sourceMapWriteTo: string|null, outputSourceFiles: bool, sourceMapRootpath: string, sourceMapBasepath: string} + */ + private $options; + + /** + * @phpstan-param array{sourceRoot?: string, sourceMapFilename?: string|null, sourceMapURL?: string|null, sourceMapWriteTo?: string|null, outputSourceFiles?: bool, sourceMapRootpath?: string, sourceMapBasepath?: string} $options + */ + public function __construct(array $options = []) + { + $this->options = array_merge($this->defaultOptions, $options); + $this->encoder = new Base64VLQ(); + } + + /** + * Adds a mapping + * + * @param integer $generatedLine The line number in generated file + * @param integer $generatedColumn The column number in generated file + * @param integer $originalLine The line number in original file + * @param integer $originalColumn The column number in original file + * @param string $sourceFile The original source file + * + * @return void + */ + public function addMapping($generatedLine, $generatedColumn, $originalLine, $originalColumn, $sourceFile) + { + $this->mappings[] = [ + 'generated_line' => $generatedLine, + 'generated_column' => $generatedColumn, + 'original_line' => $originalLine, + 'original_column' => $originalColumn, + 'source_file' => $sourceFile + ]; + + $this->sources[$sourceFile] = $sourceFile; + } + + /** + * Saves the source map to a file + * + * @param string $content The content to write + * + * @return string + * + * @throws \ScssPhp\ScssPhp\Exception\CompilerException If the file could not be saved + * @deprecated + */ + public function saveMap($content) + { + $file = $this->options['sourceMapWriteTo']; + $dir = \dirname($file); + + // directory does not exist + if (! is_dir($dir)) { + // FIXME: create the dir automatically? + throw new CompilerException( + sprintf('The directory "%s" does not exist. Cannot save the source map.', $dir) + ); + } + + // FIXME: proper saving, with dir write check! + if (file_put_contents($file, $content) === false) { + throw new CompilerException(sprintf('Cannot save the source map to "%s"', $file)); + } + + return $this->options['sourceMapURL']; + } + + /** + * Generates the JSON source map + * + * @param string $prefix A prefix added in the output file, which needs to shift mappings + * + * @return string + * + * @see https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit# + */ + public function generateJson($prefix = '') + { + $sourceMap = []; + $mappings = $this->generateMappings($prefix); + + // File version (always the first entry in the object) and must be a positive integer. + $sourceMap['version'] = self::VERSION; + + // An optional name of the generated code that this source map is associated with. + $file = $this->options['sourceMapFilename']; + + if ($file) { + $sourceMap['file'] = $file; + } + + // An optional source root, useful for relocating source files on a server or removing repeated values in the + // 'sources' entry. This value is prepended to the individual entries in the 'source' field. + $root = $this->options['sourceRoot']; + + if ($root) { + $sourceMap['sourceRoot'] = $root; + } + + // A list of original sources used by the 'mappings' entry. + $sourceMap['sources'] = []; + + foreach ($this->sources as $sourceUri => $sourceFilename) { + $sourceMap['sources'][] = $this->normalizeFilename($sourceFilename); + } + + // A list of symbol names used by the 'mappings' entry. + $sourceMap['names'] = []; + + // A string with the encoded mapping data. + $sourceMap['mappings'] = $mappings; + + if ($this->options['outputSourceFiles']) { + // An optional list of source content, useful when the 'source' can't be hosted. + // The contents are listed in the same order as the sources above. + // 'null' may be used if some original sources should be retrieved by name. + $sourceMap['sourcesContent'] = $this->getSourcesContent(); + } + + // less.js compat fixes + if (\count($sourceMap['sources']) && empty($sourceMap['sourceRoot'])) { + unset($sourceMap['sourceRoot']); + } + + return json_encode($sourceMap, JSON_UNESCAPED_SLASHES); + } + + /** + * Returns the sources contents + * + * @return string[]|null + */ + protected function getSourcesContent() + { + if (empty($this->sources)) { + return null; + } + + $content = []; + + foreach ($this->sources as $sourceFile) { + $content[] = file_get_contents($sourceFile); + } + + return $content; + } + + /** + * Generates the mappings string + * + * @param string $prefix A prefix added in the output file, which needs to shift mappings + * + * @return string + */ + public function generateMappings($prefix = '') + { + if (! \count($this->mappings)) { + return ''; + } + + $prefixLines = substr_count($prefix, "\n"); + $lastPrefixNewLine = strrpos($prefix, "\n"); + $lastPrefixLineStart = false === $lastPrefixNewLine ? 0 : $lastPrefixNewLine + 1; + $prefixColumn = strlen($prefix) - $lastPrefixLineStart; + + $this->sourceKeys = array_flip(array_keys($this->sources)); + + // group mappings by generated line number. + $groupedMap = $groupedMapEncoded = []; + + foreach ($this->mappings as $m) { + $groupedMap[$m['generated_line']][] = $m; + } + + ksort($groupedMap); + + $lastGeneratedLine = $lastOriginalIndex = $lastOriginalLine = $lastOriginalColumn = 0; + + foreach ($groupedMap as $lineNumber => $lineMap) { + if ($lineNumber > 1) { + // The prefix only impacts the column for the first line of the original output + $prefixColumn = 0; + } + $lineNumber += $prefixLines; + + while (++$lastGeneratedLine < $lineNumber) { + $groupedMapEncoded[] = ';'; + } + + $lineMapEncoded = []; + $lastGeneratedColumn = 0; + + foreach ($lineMap as $m) { + $generatedColumn = $m['generated_column'] + $prefixColumn; + + $mapEncoded = $this->encoder->encode($generatedColumn - $lastGeneratedColumn); + $lastGeneratedColumn = $generatedColumn; + + // find the index + if ($m['source_file']) { + $index = $this->findFileIndex($m['source_file']); + + if ($index !== false) { + $mapEncoded .= $this->encoder->encode($index - $lastOriginalIndex); + $lastOriginalIndex = $index; + // lines are stored 0-based in SourceMap spec version 3 + $mapEncoded .= $this->encoder->encode($m['original_line'] - 1 - $lastOriginalLine); + $lastOriginalLine = $m['original_line'] - 1; + $mapEncoded .= $this->encoder->encode($m['original_column'] - $lastOriginalColumn); + $lastOriginalColumn = $m['original_column']; + } + } + + $lineMapEncoded[] = $mapEncoded; + } + + $groupedMapEncoded[] = implode(',', $lineMapEncoded) . ';'; + } + + return rtrim(implode($groupedMapEncoded), ';'); + } + + /** + * Finds the index for the filename + * + * @param string $filename + * + * @return integer|false + */ + protected function findFileIndex($filename) + { + return $this->sourceKeys[$filename]; + } + + /** + * Normalize filename + * + * @param string $filename + * + * @return string + */ + protected function normalizeFilename($filename) + { + $filename = $this->fixWindowsPath($filename); + $rootpath = $this->options['sourceMapRootpath']; + $basePath = $this->options['sourceMapBasepath']; + + // "Trim" the 'sourceMapBasepath' from the output filename. + if (\strlen($basePath) && strpos($filename, $basePath) === 0) { + $filename = substr($filename, \strlen($basePath)); + } + + // Remove extra leading path separators. + if (strpos($filename, '\\') === 0 || strpos($filename, '/') === 0) { + $filename = substr($filename, 1); + } + + return $rootpath . $filename; + } + + /** + * Fix windows paths + * + * @param string $path + * @param boolean $addEndSlash + * + * @return string + */ + public function fixWindowsPath($path, $addEndSlash = false) + { + $slash = ($addEndSlash) ? '/' : ''; + + if (! empty($path)) { + $path = str_replace('\\', '/', $path); + $path = rtrim($path, '/') . $slash; + } + + return $path; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Type.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Type.php new file mode 100644 index 0000000..fb2a1d7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Type.php @@ -0,0 +1,76 @@ + + */ +class Type +{ + const T_ASSIGN = 'assign'; + const T_AT_ROOT = 'at-root'; + const T_BLOCK = 'block'; + /** @deprecated */ + const T_BREAK = 'break'; + const T_CHARSET = 'charset'; + const T_COLOR = 'color'; + const T_COMMENT = 'comment'; + /** @deprecated */ + const T_CONTINUE = 'continue'; + /** @deprecated */ + const T_CONTROL = 'control'; + const T_CUSTOM_PROPERTY = 'custom'; + const T_DEBUG = 'debug'; + const T_DIRECTIVE = 'directive'; + const T_EACH = 'each'; + const T_ELSE = 'else'; + const T_ELSEIF = 'elseif'; + const T_ERROR = 'error'; + const T_EXPRESSION = 'exp'; + const T_EXTEND = 'extend'; + const T_FOR = 'for'; + const T_FUNCTION = 'function'; + const T_FUNCTION_REFERENCE = 'function-reference'; + const T_FUNCTION_CALL = 'fncall'; + const T_HSL = 'hsl'; + const T_HWB = 'hwb'; + const T_IF = 'if'; + const T_IMPORT = 'import'; + const T_INCLUDE = 'include'; + const T_INTERPOLATE = 'interpolate'; + const T_INTERPOLATED = 'interpolated'; + const T_KEYWORD = 'keyword'; + const T_LIST = 'list'; + const T_MAP = 'map'; + const T_MEDIA = 'media'; + const T_MEDIA_EXPRESSION = 'mediaExp'; + const T_MEDIA_TYPE = 'mediaType'; + const T_MEDIA_VALUE = 'mediaValue'; + const T_MIXIN = 'mixin'; + const T_MIXIN_CONTENT = 'mixin_content'; + const T_NESTED_PROPERTY = 'nestedprop'; + const T_NOT = 'not'; + const T_NULL = 'null'; + const T_NUMBER = 'number'; + const T_RETURN = 'return'; + const T_ROOT = 'root'; + const T_SCSSPHP_IMPORT_ONCE = 'scssphp-import-once'; + const T_SELF = 'self'; + const T_STRING = 'string'; + const T_UNARY = 'unary'; + const T_VARIABLE = 'var'; + const T_WARN = 'warn'; + const T_WHILE = 'while'; +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Util.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Util.php new file mode 100644 index 0000000..62cd2a2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Util.php @@ -0,0 +1,184 @@ + + * + * @internal + */ +class Util +{ + /** + * Asserts that `value` falls within `range` (inclusive), leaving + * room for slight floating-point errors. + * + * @param string $name The name of the value. Used in the error message. + * @param Range $range Range of values. + * @param array|Number $value The value to check. + * @param string $unit The unit of the value. Used in error reporting. + * + * @return mixed `value` adjusted to fall within range, if it was outside by a floating-point margin. + * + * @throws \ScssPhp\ScssPhp\Exception\RangeException + */ + public static function checkRange($name, Range $range, $value, $unit = '') + { + $val = $value[1]; + $grace = new Range(-0.00001, 0.00001); + + if (! \is_numeric($val)) { + throw new RangeException("$name {$val} is not a number."); + } + + if ($range->includes($val)) { + return $val; + } + + if ($grace->includes($val - $range->first)) { + return $range->first; + } + + if ($grace->includes($val - $range->last)) { + return $range->last; + } + + throw new RangeException("$name {$val} must be between {$range->first} and {$range->last}$unit"); + } + + /** + * Encode URI component + * + * @param string $string + * + * @return string + */ + public static function encodeURIComponent($string) + { + $revert = ['%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')']; + + return strtr(rawurlencode($string), $revert); + } + + /** + * mb_chr() wrapper + * + * @param integer $code + * + * @return string + */ + public static function mbChr($code) + { + // Use the native implementation if available, but not on PHP 7.2 as mb_chr(0) is buggy there + if (\PHP_VERSION_ID > 70300 && \function_exists('mb_chr')) { + return mb_chr($code, 'UTF-8'); + } + + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6) . \chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3F) . \chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3F) + . \chr(0x80 | $code >> 6 & 0x3F) . \chr(0x80 | $code & 0x3F); + } + + return $s; + } + + /** + * mb_strlen() wrapper + * + * @param string $string + * @return int + */ + public static function mbStrlen($string) + { + // Use the native implementation if available. + if (\function_exists('mb_strlen')) { + return mb_strlen($string, 'UTF-8'); + } + + if (\function_exists('iconv_strlen')) { + return (int) @iconv_strlen($string, 'UTF-8'); + } + + throw new \LogicException('Either mbstring (recommended) or iconv is necessary to use Scssphp.'); + } + + /** + * mb_substr() wrapper + * @param string $string + * @param int $start + * @param null|int $length + * @return string + */ + public static function mbSubstr($string, $start, $length = null) + { + // Use the native implementation if available. + if (\function_exists('mb_substr')) { + return mb_substr($string, $start, $length, 'UTF-8'); + } + + if (\function_exists('iconv_substr')) { + if ($start < 0) { + $start = static::mbStrlen($string) + $start; + if ($start < 0) { + $start = 0; + } + } + + if (null === $length) { + $length = 2147483647; + } elseif ($length < 0) { + $length = static::mbStrlen($string) + $length - $start; + if ($length < 0) { + return ''; + } + } + + return (string)iconv_substr($string, $start, $length, 'UTF-8'); + } + + throw new \LogicException('Either mbstring (recommended) or iconv is necessary to use Scssphp.'); + } + + /** + * mb_strpos wrapper + * @param string $haystack + * @param string $needle + * @param int $offset + * + * @return int|false + */ + public static function mbStrpos($haystack, $needle, $offset = 0) + { + if (\function_exists('mb_strpos')) { + return mb_strpos($haystack, $needle, $offset, 'UTF-8'); + } + + if (\function_exists('iconv_strpos')) { + return iconv_strpos($haystack, $needle, $offset, 'UTF-8'); + } + + throw new \LogicException('Either mbstring (recommended) or iconv is necessary to use Scssphp.'); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Util/Path.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Util/Path.php new file mode 100644 index 0000000..f399e41 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Util/Path.php @@ -0,0 +1,77 @@ +parseValue($source, $value)) { + throw new \InvalidArgumentException(sprintf('Invalid value source "%s".', $source)); + } + + return $value; + } + + /** + * Converts a PHP value to a Sass value + * + * The returned value is guaranteed to be supported by the + * Compiler methods for registering custom variables. No other + * guarantee about it is provided. It should be considered + * opaque values by the caller. + * + * @param mixed $value + * + * @return mixed + */ + public static function fromPhp($value) + { + if ($value instanceof Number) { + return $value; + } + + if (is_array($value) && isset($value[0]) && \in_array($value[0], [Type::T_NULL, Type::T_COLOR, Type::T_KEYWORD, Type::T_LIST, Type::T_MAP, Type::T_STRING])) { + return $value; + } + + if ($value === null) { + return Compiler::$null; + } + + if ($value === true) { + return Compiler::$true; + } + + if ($value === false) { + return Compiler::$false; + } + + if ($value === '') { + return Compiler::$emptyString; + } + + if (\is_int($value) || \is_float($value)) { + return new Number($value, ''); + } + + if (\is_string($value)) { + return [Type::T_STRING, '"', [$value]]; + } + + throw new \InvalidArgumentException(sprintf('Cannot convert the value of type "%s" to a Sass value.', gettype($value))); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Version.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Version.php new file mode 100644 index 0000000..62c8006 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Version.php @@ -0,0 +1,23 @@ + + */ +class Version +{ + const VERSION = '1.8.1'; +} diff --git a/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Warn.php b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Warn.php new file mode 100644 index 0000000..592b44c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Contrib/scssphp/src/Warn.php @@ -0,0 +1,84 @@ +`_. + + +.. toctree:: + :maxdepth: 5 + :titlesonly: + + Migration/6-2-14 + Migration/6-2-11 diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/AdministratorManual/Migration/6-2-11.rst b/public/typo3conf/ext/bootstrap_package/Documentation/AdministratorManual/Migration/6-2-11.rst new file mode 100644 index 0000000..411f5db --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/AdministratorManual/Migration/6-2-11.rst @@ -0,0 +1,330 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: ../../Includes.txt + + +.. _migration_6.2.11: + +============================= +Upgrade from 6.2.10 to 6.2.11 +============================= + +This document will only cover **breaking changes**, that could happen while +overriding the Bootstrap Package. + + + + +Support multilevel tree in subnavigation +======================================== + +Frontend output of the submenu has changed and the 3rd level is now displayed +by default. You will need to adapt this change if you are not using the theme +that comes with the Bootstrap Package. + +Before +------ + +**Markup** + +.. code-block:: html + + + +After +------ + +**Markup** + +.. code-block:: html + + + + + + +Drop version number for jQuery in filename +========================================== + +Previously we appended the version number to the jQuery filename, this has lead +to missing jQuery versions if files were moved outside the bootstrap_package. +We are not removing the version number to prevent jQuery is missing, this makes +it also more easy to maintain in the build process. Check your TypoScript setup +for possible overrides. + +Before +------ + +**TypoScript Setup** + +.. code-block:: typoscript + + page.includeJSFooterLibs { + jquery = {$page.includePath.javascript}Libs/jquery-x.xx.xx.min.js + } + +After +------ + +**TypoScript Setup** + +.. code-block:: typoscript + + page.includeJSFooterLibs { + jquery = {$page.includePath.javascript}Libs/jquery.min.js + } + + + + +Use default Bootstrap markup for navigation toggle +================================================== + +In previous builds Glyphicon icons were used to represent the toggle state of +the main menu for smaller screen sizes. Also the toggle js was always loaded in +within the main.js javascript file from the Bootstrap Package. This has lead to +problems when the icon font was changed or the main javascript file was +externally overriden. + +Instead of adapting the custom markup to your theme the default bootstrap markup +is now in use, so its working now also out of the box also if the custom theme +from the Bootstrap Package is not included. The toggle state is now solved via +a CSS class toggle and a bit of custom css in the Bootstrap Package theme. The +JavaScript toggle functionality has been move into a single file so it can be +easily turned of if you do not need it. + +Before +------ + +**Markup** + +.. code-block:: html + + + +After +------ + +**Markup** + +.. code-block:: html + + + +**TypoScript Setup** + +.. code-block:: typoscript + + page.includeJSFooterlibs { + #### Toggle collapsed CSS class on the navbar toggle button + bootstrap_navbartoggle = {$page.includePath.javascript}Libs/bootstrap.navbartoggle.min.js + } + + + + +Custom Lightbox JavaScript has been moved +========================================= + +In order to make the package more modular we removed the main.js file in favor +of single files for each functionality so it can be added or removed more easily. + +After +------ + +**TypoScript Setup** + +.. code-block:: typoscript + + page.includeJSFooterlibs { + #### Basic lightbox implementation for bootstrap + bootstrap_lightbox = {$page.includePath.javascript}Libs/bootstrap.lightbox.min.js + } + + + + +LESS files have been moved private to public +============================================ + +The resources folder in TYPO3 extensions is protected by default that made it +impossible to make real usage of CSS SourceMaps. The files have been moved to +Resources/Public, please ensure that your update your references to these files. + +Before +------ + +.. code-block:: html + + EXT:bootstrap_package/Resources/Private/Less/ + +After +------ + +.. code-block:: html + + EXT:bootstrap_package/Resources/Public/Less/ + + + + +Corrected calculation of relative paths in build in LESS parser +=============================================================== + +Calculation of relative paths in less should now be resolved correctly. +The wired relative paths you have to set before will no longer be working and +you need to set the constants now relative from the LESS file that is parsed. + +Before +------ + +**TypoScript Constants** + +.. code-block:: typoscript + + plugin.bootstrap_package { + settings.less { + icon-font-path = "../../../../../typo3conf/ext/bootstrap_package/Resources/Public/Fonts/" + } + } + +After +----- + +**TypoScript Constants** + +.. code-block:: typoscript + + plugin.bootstrap_package { + settings.less { + icon-font-path = "../../Fonts/" + } + } + + + + +Template Fallbacks +================== + +We enabled fallbacks for page templates, so you can extend the package without +the need to copy all the templates if you want to change parts of the templates. + +Before +------ + +**TypoScript Setup** + +.. code-block:: typoscript + + page.10 { + file.stdWrap.cObject = CASE + file.stdWrap.cObject { + + key.data = levelfield:-1, backend_layout_next_level, slide + key.override.field = backend_layout + + bootstrap_package__default_clean = TEXT + bootstrap_package__default_clean.value = {$page.fluidtemplate.templateRootPath}DefaultClean.html + bootstrap_package__default_clean.insertData = 1 + + ... + + } + partialRootPath = {$page.fluidtemplate.partialRootPath} + layoutRootPath = {$page.fluidtemplate.layoutRootPath} + } + +After +----- + +**TypoScript Setup** + +.. code-block:: typoscript + + page.10 { + templateName = TEXT + templateName.stdWrap.cObject = CASE + templateName.stdWrap.cObject { + + key.data = levelfield:-1, backend_layout_next_level, slide + key.override.field = backend_layout + + bootstrap_package__default_clean = TEXT + bootstrap_package__default_clean.value = DefaultClean + + ... + + } + templateRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Templates/Page/ + 1 = {$page.fluidtemplate.templateRootPath} + } + partialRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Partials/Page/ + 1 = {$page.fluidtemplate.partialRootPath} + } + layoutRootPaths { + 0 = EXT:bootstrap_package/Resources/Private/Layouts/Page/ + 1 = {$page.fluidtemplate.layoutRootPath} + } + } + + + + +Deprecated fallbacks +==================== + +Fallbacks for deprecated backendlayout keys have been removed, +use the alternatives instead. + +**Removed Templates** + +.. code-block:: bash + + bootstrap_package__default_subnavigation + bootstrap_package__default_subnavigation_2_columns + +**Alternatives Templates** + +.. code-block:: bash + + bootstrap_package__default_subnavigation_right + bootstrap_package__default_subnavigation_right_2_columns + + + + +Support for EXT:THEMES removed +============================== + +Through lack of resources we removed the support for ext:themes. +It is not planned to support ext:themes in the future again. diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/AdministratorManual/Migration/6-2-14.rst b/public/typo3conf/ext/bootstrap_package/Documentation/AdministratorManual/Migration/6-2-14.rst new file mode 100644 index 0000000..8f4e693 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/AdministratorManual/Migration/6-2-14.rst @@ -0,0 +1,94 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: ../../Includes.txt + + +.. _migration_6.2.14: + +============================= +Upgrade from 6.2.13 to 6.2.14 +============================= + +This document will only cover **breaking changes**, that could happen while +overriding the Bootstrap Package. + + + + +Backend Layout Keys +=================== + +Backend Layout configurations via PageTS have native support in TYPO3 +Versions >= 7.4. To make it more easy to upgrade new installations the prefix +has been changed in the Bootstrap Package to match the new default that´s +available in TYPO3 7.4 and newer versions. + +The Prefix for Backend Layouts has been changed from "bootstrap_package" to +"pagets". If you have been referring to these values before you need to adapt +the new prefix for your own layouts in your TypoScript Configuration. + +Please adapt to the new prefix and use the UpdateScript inside the +Bootstrap Package extension from the extension manager. This will update all +pages in the database and change the prefix from "bootstrap_package" to "pagets". + +Note: +The update script checks if an update is needed. +If there is nothing to do the icon for the Update script will not be shown. + +The new Provider in the TYPO3 Core is a port from the Bootstrap Package. +That means that there is no need to do any further changes. The configuration +stays exactly the same. + +Before +------ + +**Markup** + +.. code-block:: typoscript + + page = PAGE + page { + 10 = FLUIDTEMPLATE + 10 { + templateName = TEXT + templateName.stdWrap.cObject = CASE + templateName.stdWrap.cObject { + ... + + bootstrap_package__default_clean = TEXT + bootstrap_package__default_clean.value = DefaultClean + + ... + } + } + } + + + + +After +------ + +**Markup** + +.. code-block:: typoscript + + page = PAGE + page { + 10 = FLUIDTEMPLATE + 10 { + templateName = TEXT + templateName.stdWrap.cObject = CASE + templateName.stdWrap.cObject { + ... + + pagets__default_clean = TEXT + pagets__default_clean.value = DefaultClean + + ... + } + } + } diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/Extension/Index.rst b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/Extension/Index.rst new file mode 100644 index 0000000..179dc84 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/Extension/Index.rst @@ -0,0 +1,20 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: ../../Includes.txt + + +======================= +Extension Configuration +======================= + +Use the extension manager to adjust the Bootstrap Package to your needs. + + +PageTsConfig +============ + +The Bootstrap Package has a lot of PageTsConfig defaults. +In some cases it can be useful to deactivate some of them if you do not need them. diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/ImageRendering/Index.rst b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/ImageRendering/Index.rst new file mode 100644 index 0000000..a0031ef --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/ImageRendering/Index.rst @@ -0,0 +1,291 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: ../../Includes.txt + + +=============== +Image Rendering +=============== + +Bootstrap Package comes with a very flexible responsive image rendering and +supports multiple variants for various device sizes. Each variant defines the +**break point**, **width** and the optional **sizes** for high resolution image +support. + + + +Image Variants +============== + +Image variants are used to represent the breakpoints of the design. These +variants have to be defined according the definitions in the style sheet. +Bootstrap Package defines these variants by default: + +.. code-block:: typoscript + + lib.contentElement.settings.responsiveimages.variants { + default { + breakpoint = 1200 + width = 1100 + } + large { + breakpoint = 992 + width = 920 + } + medium { + breakpoint = 768 + width = 680 + } + small { + breakpoint = 576 + width = 500 + } + extrasmall { + breakpoint = unset + width = 374 + } + } + + +The **breakpoint** defines the minimal device width where the **width** gets +applied. Having a device with a width of 1200 pixels or more uses an image width +of 1100 pixels, devices of 992 up to 1199 pixels width use an image width of +920 pixels and so on. + + +For each of these variants the multiplier of size **1x** is set to 1, see next +section for more about the high-resolution image support: + +* default + + * breakpoint + * width + * sizes + + * 1x + + * multiplier: 1 + + +Example of changing the default configuration for the default variant. + +.. code-block:: typoscript + + lib.contentElement.settings.responsiveimages.variants { + default { + breakpoint = 1200 + width = 1100 + } + + +High Resolution Images +---------------------- + +There is a key called sizes in every variant that should be rendered. This +dataset consists of several entries, each with a default key for a normal +rendering (1x). This key will be added automatically, and it is always available. +It is not possible to store sizes smaller than 1. Each size contains a +multiplier, which is multiplied by the base size. + +Example calculations: + +Base width: 1000px + +* Minimum Device Pixel Ratio = 1 + + * Multiplier = 1 + * Result: 1000px + +* Minimum Device Pixel Ratio = 1.5 + + * Multiplier = 1.25 + * Result: 1250px + +* Minimum Device Pixel Ratio = 2 + + * Multiplier = 1.5 + * Result: 1500px + + +Example configuration to enable high-resolution support for the default variant +for devices with a minimum device pixel ratio from 1.5 and 2. + +.. code-block:: typoscript + + lib.contentElement.settings.responsiveimages.variants { + default { + sizes { + 1\.5x { + multiplier = 1.5 + } + 2x { + multiplier = 2 + } + } + } + } + +The data for image rendering is now extended with a sub-set for high-resolution +variants. If you did not overwrite the default templates, it will just work as +soon as you add the configuration. If you have overwritten the default +templates, it will still work as before, but you need to add the new support for +high-resolution images yourself. + +Please check the new updated templates and adjust your code if you want this +support. + + +Configuration by Variant +------------------------ + +For each **variant** the following configuration options are possible: + +* breakpoint +* width +* aspectRatio +* sizes + + +Configuration by Backend Layout +------------------------------- + +For each **backend layout** the following configuration options are possible +for each defined **column** and **variant**: + +* multiplier +* gutters +* corrections + + +Example configuration for backend layouts. + +.. code-block:: typoscript + + lib.contentElement.settings.responsiveimages.backendlayout { + my_layout { # this is the BE layout + 0 { # this is the column to be modified + multiplier { + default = 0.75 + large = 0.75 + } + gutters { + default = 40 + large = 40 + } + corrections { + default = 25 + large = 25 + } + } + } + } + + +Configuration by Content Element +-------------------------------- + +For each **content element** the following configuration options are possible +for each defined **variant** or **specific property**: + +* multiplier +* gutters +* corrections + + +Example configuration for content elements. + +.. code-block:: typoscript + + lib.contentElement.settings.responsiveimages.contentelements { + my_content_element { # this is the content element + my_custom_property { # this is a content element specific property, depends on the implementation and is optional + multiplier { + default = 0.5 + large = 0.5 + medium = 0.5 + } + gutters { + default = 24 + large = 24 + medium = 24 + } + corrections { + default = 25 + large = 25 + medium = 25 + small = 50 + extrasmall = 50 + } + } + } + } + + +Configuration options explained +------------------------------- + +Options for variants: + ++---------------+-----------+-------------------------------------------------+ +| Property | Data Type | Description | ++===============+===========+=================================================+ +| breakpoint | integer | Defines the minimal width in pixels of the | +| | | device | ++---------------+-----------+-------------------------------------------------+ +| width | integer | Defines the effective width in pixels for | +| | | images for this variant | ++---------------+-----------+-------------------------------------------------+ +| aspectRatio | float | Optional, defines the default aspect ratio | +| | | which will override all previously defined | +| | | ratios on image level | ++---------------+-----------+-------------------------------------------------+ +| sizes | array | Optional, defines the available high resolution | +| | | image multiplier for a minimal device pixel | +| | | ratio per variant | ++---------------+-----------+-------------------------------------------------+ + + +Options for backend layouts and content elements: + ++---------------+-----------+-------------------------------------------------+ +| Property | Data Type | Description | ++===============+===========+=================================================+ +| multiplier | integer | The width is multiplied with this value | ++---------------+-----------+-------------------------------------------------+ +| gutters | integer | This value is added to the width before | +| | | applying the multiplier and substracted | +| | | afterwards | ++---------------+-----------+-------------------------------------------------+ +| corrections | integer | This value is added as last step to the width | +| | | after all other calculations | ++---------------+-----------+-------------------------------------------------+ + + +The options **gutters** and **corrections** are needed if you want to be pixel +perfect. Means if you have a 1 pixel outline for example and want this to be +subtracted from the width you can do this kind of corrections late in the +calculation process. + +* Example `Accordion `__: + Here a correction is added to remove the inner padding of the container. + +* Example `Card Group `__: + The border is substracted here. + + + +Crop Variants +============= + +The Bootstrap Package predefines some cropping variants which can easily be changed +or extended by your sitepackage. + +The following crop variants are defined by default: + +* 16:9, for a fixed ratio +* 4:3, for a fixed ratio +* 1:1, for a fixed ratio +* NaN, for a free ration diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/Index.rst b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/Index.rst new file mode 100644 index 0000000..4bb1c58 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/Index.rst @@ -0,0 +1,20 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: ../Includes.txt + + +============================== +Configuration +============================== + +.. toctree:: + :maxdepth: 5 + :titlesonly: + :glob: + + Extension/Index + ImageRendering/Index + TypoScript/Index \ No newline at end of file diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/TypoScript/Index.rst b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/TypoScript/Index.rst new file mode 100644 index 0000000..651a7d4 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Configuration/TypoScript/Index.rst @@ -0,0 +1,240 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: ../../Includes.txt + + +========== +TypoScript +========== +Bootstrap Package was built to be as adjustable as possible, so nothing is fixed and everything can be overridden with TypoScript constants. +The constants are grouped in basic and advanced settings. Use the **TYPO3 Constant Editor** in the backend to modify the values. + + +Bootstrap Package: Basic Constants +================================== +The basic settings will provide easy to use and understandable options for that are used mainly for styling and appearance. + + +page.logo +--------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| file | string | EXT:bootstrap_package/Resources/Public/Images/BootstrapPackage.png | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| height | integer | 60 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| width | integer | 210 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| alt | string | | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + +**Example:** + +.. code-block:: typoscript + + page { + logo { + file = fileadmin/Theme/Logo.png + height = 50 + width = 150 + alt = + } + } + + +page.meta +--------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| description | string | | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| author | string | | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| keywords | string | | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +page.theme +---------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| navigation.style | options | **default** | inverse | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| navigation.type | options | **0** | top | bottom | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| breadcrumb | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| breadcrumbEnableLevel | integer+ | **2** | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +page.theme.copyright +-------------------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| enable | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| text | string | Built on a Windows 8.1 Surface Pro. Running with TYPO3. | +| | | Made with <3 by Benjamin Kott | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +page.theme.news +--------------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| list.header_position | options | **left** | center | right | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| list.header_layout | options | 1 | **2** | 3 | 4 | 5 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| list.imageorient | options | 0 | 1 | 2 | 8 | 9 | 10 | 17 | 18 | **25** | 26 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| list.imagecols | options | **1** | 2 | 3 | 4 | 5 | 6 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| list.maxW | integer | 1140 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| list.maxWInText | integer+ | | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| pagination.itemsperpage | integer | 5 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +page.theme.language +------------------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| enable | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| languageValue | string | **auto** | 0,1,2 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +Bootstrap Package: Advanced Constants +===================================== +The advanced settings should be used only if you really know what you are doing. + + +page.fluidtemplate +------------------ + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| layoutRootPath | string | EXT:bootstrap_package/Resources/Private/Layouts/Page/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| partialRootPath | string | EXT:bootstrap_package/Resources/Private/Partials/Page/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| templateRootPath | string | EXT:bootstrap_package/Resources/Private/Templates/Page/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +page.includePath +---------------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| css | string | EXT:bootstrap_package/Resources/Public/Css/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| icons | string | EXT:bootstrap_package/Resources/Public/Icons/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| javascript | string | EXT:bootstrap_package/Resources/Public/JavaScript/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +page.meta +--------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| viewport | string | width=device-width, initial-scale=1 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| robots | string | index,follow | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| apple-mobile-web-app-capable | string | no | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| compatible | string | IE=edge,chrome=1 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| google | string | notranslate | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +page.tracking.google +-------------------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| trackingID | string | | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| anonymizeIp | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +config +------ + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| no_cache | boolean | 1 | **0** | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| removeDefaultJS | options | **0** | 1 | external | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| compressJs | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| compressCss | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| concatenateJs | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| concatenateCss | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| admPanel | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| prefixLocalAnchors | options | EMPTY | **all** | cached | output | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| headerComment | string | Based on the TYPO3 Bootstrap Package | +| | | by Benjamin Kott - http://www.bk2k.info | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +plugin.bootstrap_package.settings +--------------------------------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| overrideParserVariables | boolean | **1** | 0 | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| cssSourceMapping | boolean | 1 | **0** | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ + + +plugin.bootstrap_package_contentelements.view +--------------------------------------------- + ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| Property | Data Type | | ++===================================+===============+=======================================================================+ +| layoutRootPath | string | EXT:bootstrap_package/Resources/Private/Layouts/ContentElements/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| partialRootPath | string | EXT:bootstrap_package/Resources/Private/Partials/ContentElements/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ +| templateRootPath | string | EXT:bootstrap_package/Resources/Private/Templates/ContentElements/ | ++-----------------------------------+---------------+-----------------------------------------------------------------------+ diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Desktop.jpg b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Desktop.jpg new file mode 100644 index 0000000..77ddecc Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Desktop.jpg differ diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Mobile.jpg b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Mobile.jpg new file mode 100644 index 0000000..ccb5fe8 Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Mobile.jpg differ diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Tablet.jpg b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Tablet.jpg new file mode 100644 index 0000000..bf2c10b Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/Tablet.jpg differ diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/typo3-frontend.png b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/typo3-frontend.png new file mode 100644 index 0000000..069e043 Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Documentation/Images/Screens/typo3-frontend.png differ diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Includes.txt b/public/typo3conf/ext/bootstrap_package/Documentation/Includes.txt new file mode 100644 index 0000000..8ef89a7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Includes.txt @@ -0,0 +1,21 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. This is 'Includes.txt'. It is included at the very top of each and + every ReST source file in this documentation project (= manual). + + +.. ================================================== +.. DEFINE SOME TEXT ROLES +.. -------------------------------------------------- + +.. role:: typoscript(code) + +.. role:: ts(typoscript) + :class: typoscript + +.. role:: php(code) + +.. highlight:: php diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Index.rst b/public/typo3conf/ext/bootstrap_package/Documentation/Index.rst new file mode 100644 index 0000000..d4da518 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Index.rst @@ -0,0 +1,61 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: Includes.txt + + +.. _start: + +============================================================= +Bootstrap Package +============================================================= + +.. only:: html + + :Classification: + bootstrap_package + + :Version: + |release| + + :Language: + en + + :Description: + Bootstrap Package delivers a full configured frontend theme for TYPO3, based on the Bootstrap CSS Framework. + + :Keywords: + Theme, Bootstrap + + :Copyright: + 2014 + + :Author: + Benjamin Kott + + :Email: + info@bk2k.info + + :License: + This document is published under the Open Content License + available from http://www.opencontent.org/opl.shtml + + :Rendered: + |today| + + The content of this document is related to TYPO3, + a GNU/GPL CMS/Framework available from `www.typo3.org `_. + + + **Table of Contents** + +.. toctree:: + :maxdepth: 5 + :titlesonly: + :glob: + + Introduction/Index + Configuration/Index + AdministratorManual/Index \ No newline at end of file diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Introduction/Index.rst b/public/typo3conf/ext/bootstrap_package/Documentation/Introduction/Index.rst new file mode 100644 index 0000000..0767699 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Introduction/Index.rst @@ -0,0 +1,58 @@ +.. ================================================== +.. FOR YOUR INFORMATION +.. -------------------------------------------------- +.. -*- coding: utf-8 -*- with BOM. + +.. include:: ../Includes.txt + + +============================== +Introduction +============================== + +Bootstrap Package is a theme for TYPO3 CMS based on the `Bootstrap CSS Framework `_ Version 3.3.7 + +Features +============================== + +* Full configured TypoScript Setup provided as Static Template +* Completely adjustable via TypoScript Constants +* TYPO3 CMS rendering is adjusted to the needs of `Bootstrap CSS Framework `_ + + * Layouts for all Content Elements + * Section Frames + +* Bootstrap specific Content Elements + + * Accordion + * External Media + * Carousel + * List Group + * Tab + * Text and Icon + +* Individual Page Layouts +* Built-in Less Parser + + * All Variables are configurable via Constant Editor + * Less support in page.includeCSS property + +* Backend Layouts via PageTsConfig + + +Screenshots +============================== + +.. figure:: ../Images/Screens/Desktop.jpg + :width: 500px + :alt: Desktop + +.. figure:: ../Images/Screens/Tablet.jpg + :width: 400px + :alt: Tablet + +.. figure:: ../Images/Screens/Mobile.jpg + :width: 180px + :alt: Mobile + + diff --git a/public/typo3conf/ext/bootstrap_package/Documentation/Settings.cfg b/public/typo3conf/ext/bootstrap_package/Documentation/Settings.cfg new file mode 100644 index 0000000..2763840 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Documentation/Settings.cfg @@ -0,0 +1,18 @@ +# coding: utf-8 +[general] +project = Bootstrap Package +version = 12.0.10 +release = 12.0.10 +copyright = since 2014 by Benjamin Kott + +[html_theme_options] +github_branch = BP_12-0 +github_repository = benjaminkott/bootstrap_package +project_contact = info@bk2k.info +project_discussions = https://typo3.slack.com/messages/bootstrap-package +project_home = https://www.bootstrap-package.com +project_issues = https://github.com/benjaminkott/bootstrap_package/issues +project_repository = https://github.com/benjaminkott/bootstrap_package + +[extlinks] +issue = https://github.com/benjaminkott/bootstrap_package/issues/%s | Issue # diff --git a/public/typo3conf/ext/bootstrap_package/LICENSE b/public/typo3conf/ext/bootstrap_package/LICENSE new file mode 100644 index 0000000..6788502 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Benjamin Kott, http://www.bk2k.info + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/public/typo3conf/ext/bootstrap_package/README.rst b/public/typo3conf/ext/bootstrap_package/README.rst new file mode 100644 index 0000000..ff7845b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/README.rst @@ -0,0 +1,157 @@ +================================================== +Bootstrap Package +================================================== + +.. image:: Documentation/Images/Screens/typo3-frontend.png?raw=true + :alt: Bootstrap Package + +Bootstrap Package delivers a fully configured frontend +theme for TYPO3, based on the Bootstrap CSS Framework. + +The goal of this package is also to give an advanced example of how modern templating +in TYPO3 CMS can be handled nicely without depending on third party extensions. +Bootstrap Package comes with a fully configurable Frontend via TypoScript. This +includes the TypoScript Constant Editor. + +Minimal Dependencies +==================== + +* TYPO3 CMS 10.4 or 11.5 for Bootstrap Package 12.x +* TYPO3 CMS 9.5 or 10.4 for Bootstrap Package 11.x +* TYPO3 CMS 8.7 or 9.5 for Bootstrap Package 10.x, 9.x and 8.x +* TYPO3 CMS 7.6 for Bootstrap Package 7.x + +Quick Install Guide +=================== + +Disable default content rendering extensions +-------------------------------------------- + +You do not need to have Fluid Styled Content or CSS Styled Content installed, we +have currently marked both extensions as conflicting to avoid misconfiguration. + +If you really know what you are doing, it is safe to use core content rendering +definitions alongside with the Bootstrap Package. But please be aware that we are +adding more content elements that are not supported from those extensions. + +* css_styled_content +* fluid_styled_content + +Make sure you have a root page +------------------------------ + +Create a new page or edit an existing one and set this as *root page*. +You can find this option in the page-edit-mode filed under behavior/miscellaneous. + +Create a new Template on this Page +---------------------------------- + +General +~~~~~~~ + +* Template Title: You can name this as you like: Example "Bootstrap Package" +* Website Title: This will be your website title visible in the frontend + +Options +~~~~~~~ + +* Clear Constants and Setup by checking the boxes +* Clear the predefined TypoScript setup from the textbox if any +* Use this Template as Root-Level Template by checking the box + +Includes +~~~~~~~~ + +Include static (from extensions) + +* Bootstrap Package (required) + +Static Template Files from TYPO3 Extensions + +* Include before all static templates if root flag is set + + +Recommended Apache Modules +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* mod_autoindex +* mod_alias +* mod_deflate +* mod_expires +* mod_filter +* mod_mime +* mod_headers +* mod_setenvif +* mod_rewrite + + +Usage +===== + +Documentation +------------- + +* `Wiki `_ +* `Documentation `_ + +Contributing +------------ + +Feel free to fork this project and create a pull request when you're happy +with your changes. We check the source code according to the our Coding Guidelines. +To reformat the code automatically, you can use ``php-cs-fixer`` as follows: + +.. code-block:: + + composer cgl + +DDEV Local +---------- + +The extension comes with a ready to use DDEV Local configuration. Type +``ddev start`` in the extension root folder to start the Docker container. + +``ddev launch`` will open the browser and head to the testing website. You can +use ``ddev launch typo3`` to get directly to the backend. + +Bug reporting +------------- + +Please open an `issue here at github`__ and describe your problem. + +__ https://github.com/benjaminkott/bootstrap_package/issues + +License +------- + +This project is released under the terms of the `MIT license `_. + +Test the Bootstrap Package +========================== + +If you are interested in the Bootstrap Package you can test it in our +`Introduction `_ Demo Setup. + +Contact & Communication +======================= + +Slack +----- + +You can connect directly with us on `Slack `_, the +preferred instant communication platform of TYPO3 CMS developers. If you already have access to the +TYPO3 Slack platform join the #bootstrap-package channel. If you don't have access yet, you can +register `here `_. + +Twitter +------- + +If you have any questions about this project or just want to talk: +Send a tweet `@benjaminkott `_. + +Code Quality +============ + +.. image:: https://github.com/benjaminkott/bootstrap_package/workflows/CI/badge.svg + :alt: Continuous Integration Status + :target: https://github.com/benjaminkott/bootstrap_package/actions?query=workflow%3ACI diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/.htaccess b/public/typo3conf/ext/bootstrap_package/Resources/Private/.htaccess new file mode 100644 index 0000000..93169e4 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Forms/Contact.form.yaml b/public/typo3conf/ext/bootstrap_package/Resources/Private/Forms/Contact.form.yaml new file mode 100644 index 0000000..1ba19c9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Forms/Contact.form.yaml @@ -0,0 +1,111 @@ +type: Form +identifier: contactform +label: Contact Form +prototypeName: standard + +finishers: + - + identifier: EmailToReceiver + options: + subject: '{subject}' + senderAddress: '{email}' + senderName: '{fullname}' + replyToRecipients: + '{email}': '' + format: html + attachUploads: true + - + identifier: Redirect + options: + pageUid: '' + additionalParameters: '' + +renderables: + - + type: Page + identifier: form + label: '' + renderables: + - + properties: + text: '* Mandatory fields' + type: StaticText + identifier: mandatory + label: 'Your personal data' + - + type: GridRow + identifier: gridrow + label: '' + renderables: + - + type: Fieldset + identifier: fieldset-left + label: '' + properties: + gridColumnClassAutoConfiguration: + viewPorts: + xs: { numbersOfColumnsToUse: '12' } + sm: { numbersOfColumnsToUse: '6' } + md: { numbersOfColumnsToUse: '6' } + lg: { numbersOfColumnsToUse: '6' } + renderables: + - + type: Text + identifier: fullname + label: 'Full name and surname' + properties: + fluidAdditionalAttributes: + placeholder: 'Full name and surname' + required: required + validators: + - { identifier: NotEmpty } + - + type: Text + identifier: company + label: 'Company' + properties: + fluidAdditionalAttributes: + placeholder: 'Company' + - + type: Text + identifier: email + label: 'Email' + properties: + fluidAdditionalAttributes: + placeholder: 'Email' + required: required + validators: + - { identifier: NotEmpty } + - { identifier: EmailAddress } + - + type: Fieldset + identifier: fieldset-right + label: '' + properties: + gridColumnClassAutoConfiguration: + viewPorts: + xs: { numbersOfColumnsToUse: '12' } + sm: { numbersOfColumnsToUse: '6' } + md: { numbersOfColumnsToUse: '6' } + lg: { numbersOfColumnsToUse: '6' } + renderables: + - + type: Text + identifier: subject + label: 'Subject' + properties: + fluidAdditionalAttributes: + placeholder: 'Subject' + required: required + validators: + - { identifier: NotEmpty } + - + type: Textarea + identifier: message + label: 'Message' + properties: + fluidAdditionalAttributes: + placeholder: 'Message' + required: required + validators: + - { identifier: NotEmpty } diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/Backend.xlf b/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/Backend.xlf new file mode 100644 index 0000000..029ae2e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/Backend.xlf @@ -0,0 +1,1048 @@ + + + +
+ + + + Bootstrap Package + + + + Navigation Icon + + + Thumbnail + + + + Default + + + Simple + + + 2 Columns + + + 2 Columns 25/75 + + + 2 Columns 50/50 + + + 2 Columns, Offset Right + + + 3 Columns + + + Subnavigation Right + + + Subnavigation Right and 2 Columns + + + Subnavigation Left + + + Subnavigation Left and 2 Columns + + + Special Startpage + + + Special Feature + + + + Sub Navigation (NOEDIT) + + + + Left + + + Normal + + + Right + + + Border + + + + Middle: Left + + + Middle: Center + + + Middle: Right + + + + Normal 2 + + + + Before Content + + + After Content + + + + Special 1 + + + Special 2 + + + Special 3 + + + Special 4 + + + Special 5 + + + Special 6 + + + Special 7 + + + Special 8 + + + Special 9 + + + Special 10 + + + + Footer: Left + + + Footer: Center + + + Footer: Right + + + + Cards of subpages + + + Insert menu to display subpages as cards + + + Cards + + + Insert menu to display selected pages as cards + + + + Options + + + Columns + + + Alignment + + + Left + + + Center + + + Right + + + + Thumbnails of subpages + + + Insert menu to display subpages as thumbnail + + + Thumbnails + + + Insert menu to display selected pages as thumbnail + + + + Options + + + Columns + + + Alignment + + + Left + + + Center + + + Right + + + + Interactive + + + Media + + + Data + + + Text + + + Social Media + + + + Gallery + + + Display multiple images in a rich gallery. + + + + CSV + + + Render a table from a CSV file. + + + + Media + + + Any number of youtube and vimeo videos in columns and rows with a caption. + + + + Audio + + + Insert Audio files + + + + Panel + + + Insert Panelelement with simple text + + + + Carousel + + + Insert Carouselelement with different contents (header / text with image / pure HTML) + + + + Carousel Small + + + Insert Carouselelement with different contents (header / text with image / pure HTML) + + + + Carousel Fullscreen + + + Insert Carouselelement with different contents (header / text with image / pure HTML) + + + + Text in Columns + + + Insert Text in Columns + + + + Text with Teaser + + + Insert Text with Teaser + + + + Text and Icon + + + Insert Bootstrap Icon with Text + + + + Accordion + + + Insert several Accordionelement(s) with headline and text + + + + Tab + + + Insert several Tabelement(s) with headline and text + + + + Card Group + + + Insert a element with several content cards + + + Options + + + Columns + + + Alignment + + + Left + + + Center + + + Right + + + + Card + + + Card Group + + + Header + + + Subheader + + + Image + + + Text + + + Link + + + Title + + + Icon + + + Icon Set + + + Icon + + + Color + + + + Icon Group + + + Insert a element with several icons + + + Options + + + Columns + + + Automatic + + + Alignment + + + Left + + + Center + + + Right + + + Icon Position + + + Left: Top + + + Left: Center + + + Right: Top + + + Right: Center + + + Above + + + Below + + + + List Group + + + Insert simple Listgroupelement + + + + External Media + + + Insert external media from YouTube or Vimeo + + + + Text & Media + + + + Quote + + + Insert Quotation + + + + Quote Text + + + Quote Link + + + Quote Source + + + + Social Links + + + Insert a element to display configured social media channels + + + + Timeline + + + Insert a element to display a timeline + + + + Carousel Options + + + Interval in ms + + + Transition + + + Slide + + + Fade + + + Wrap + + + Start the Carousel from the beginning once it has arrived at the end. + + + Show Navigation Title + + + Show the navigation title of the records instead of the bubbles. + + + + Carousel Item + + + Carousel + + + Layout + + + Link + + + Header + + + Header Layout + + + Header Class + + + Header Position + + + Default + + + Left + + + Center + + + Right + + + Subheader + + + Subheader Layout + + + Subheader Class + + + Navigation Title + + + Button Text + + + Text + + + Text Color + + + Image + + + Background Color + + + Background Image + + + Background Image Options + + + + Header + + + Text + + + Call to Action + + + Image + + + Text and Image + + + Background Image + + + HTML + + + + Accordion Options + + + Default Element + + + + Accordion Item + + + Accordion + + + Header + + + Text + + + Media + + + Media position + + + Columns + + + Enlarge on Click + + + Orientation + + + Left + + + Top + + + Right + + + Bottom + + + + Tab Options + + + Default Tab + + + + Tab Item + + + Tab + + + Set as default + + + Header + + + Text + + + Media + + + Media position + + + Columns + + + Enlarge on Click + + + Orientation + + + Left + + + Top + + + Right + + + Bottom + + + + Timeline Options + + + Sorting + + + Ascending + + + Descending + + + + Timeline Item + + + Timeline + + + Date + + + Header + + + Text + + + Icon Set + + + Icon + + + Icon File + + + Image + + + + Icon Group Item + + + Icon Group + + + Header + + + Subheader + + + Text + + + Link + + + Icon Set + + + Icon + + + Icon + + + + Panel Class + + + + External Media + + + External Media Source + + + Ratio + + + + Aspect Ratio + + + Items per page + + + + Icon + + + Icon Set + + + Icon File + + + Position + + + Type + + + Size + + + Background + + + Color + + + Background + + + + Frame Layout + + + + Background Color + + + Background Image + + + Background Image Options + + + + Teaser + + + File Folder + + + + Beside Text, Centered Right + + + Beside Text, Centered Left + + + + Parallax + + + Enable Parallax effect + + + Fade + + + Enable Fade effect + + + Filter + + + None + + + Blur + + + Grayscale + + + Sepia + + + + Default + + + None + + + Left + + + Top + + + Right + + + Bottom + + + Default + + + Square + + + Circle + + + Extra Small + + + Small + + + Medium + + + Extra Large + + + Large + + + Awesome + + + Primary + + + Secondary + + + Tertiary + + + Quaternary + + + Success + + + Info + + + Warning + + + Danger + + + Lighter + + + Light + + + Dark + + + Darker + + + + 16:9 + + + 4:3 + + + 1:1 + + + Free + + + + Default + + + Basic + + + Striped rows + + + Bordered table + + + Hover rows + + + Condensed table + + + + Default + + + Display Icons + + + Display Icons and Preview Images + + + + Media elements + + + + Background + + + Icon + + + + Colorpicker + + + + Advanced + + + Settings + + + + Alignment + + + + Read More Label + + + 1 Column + + + 2 Columns 50%/50% + + + 2 Columns 25%/75% + + + 2 Columns 75%/25% + + + 3 Columns + + + 4 Columns + + + Middle + + + Left + + + Right + + + Middle Left + + + Middle Right + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/ExtConfTemplate.xlf b/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/ExtConfTemplate.xlf new file mode 100644 index 0000000..e048354 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/ExtConfTemplate.xlf @@ -0,0 +1,35 @@ + + + +
+ + + + Disable RTE: If this option is set the config for RTE will not load automatically. Include "FILE:EXT:bootstrap_package/Configuration/TsConfig/Page/RTE.tsconfig" in your PageTsConfig to load the config manually. + + + Disable TCEFORM: If this option is set the config for TCEFORM will not load automatically. Include "FILE:EXT:bootstrap_package/Configuration/TsConfig/Page/TCEFORM.tsconfig" in your PageTsConfig to load the config manually. + + + Disable TCEMAIN: If this option is set the config for TCEMAIN will not load automatically. Include "FILE:EXT:bootstrap_package/Configuration/TsConfig/Page/TCEMAIN.tsconfig" in your PageTsConfig to load the config manually. + + + Disable TCA Defaults: If this option is set the config for TCAdefaults will not load automatically. Include "FILE:EXT:bootstrap_package/Configuration/TsConfig/Page/TCADefaults.tsconfig" in your PageTsConfig to load the config manually. + + + Disable BackendLayouts: If this option is set the included backend layouts will not load automatically. Include "FILE:EXT:bootstrap_package/Configuration/TsConfig/Page/Mod/WebLayout/BackendLayouts.tsconfig" in your PageTsConfig to load the config manually. + + + Disable Content Element PageTS Configuration: If this option is set, the included configuration for content elements will not be loaded automatically. Include "FILE:EXT:bootstrap_package/Configuration/TsConfig/Page/ContentElement/All.tsconfig" in your PageTsConfig to load the config manually. + + + + Disable Processing of CSS files: WARNING: If this option is set there no more automatic processing of Scss files in the frontend. You will need to provide CSS files instead or handle the processing of the Scss files yourself. + + + Disable local Google-Font cache: If this option is set, Google Fonts will not be cached on the server. + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/locallang.xlf b/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/locallang.xlf new file mode 100644 index 0000000..245233d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Language/locallang.xlf @@ -0,0 +1,157 @@ + + + +
+ + + + Skip to main content + + + + Skip navigation block + + + + Scroll to top + + + + Toggle navigation + + + + To top + + + + You are here: + + + Breadcrumb + + + + Previous + + + + Next + + + + Read more + + + + The external media source %s is not supported. Please provide a valid YouTube or Vimeo URL. + + + + Browse + + + Select File + + + + Submit + + + Your personal data + + + * Mandatory fields + + + Full name and surname + + + Full name and surname + + + Company + + + Company + + + Email + + + Email + + + Subject + + + Subject + + + Message + + + Message + + + Summary + + + + Cookies used on the website! + + + This website uses cookies to ensure you get the best experience on our website. + + + Got it! + + + Allow cookies + + + Decline + + + Learn more + + + + Google Analytics Status + + + Here you can object to the anonymous collection by Google Analytics on this website for your browser by using an "Opt-Out-Cookie". Please note that if you delete the exclusion cookie or use a different computer or web browser, you will need to re-set the exclusion. + + + Enable Google Analytics (Opt-In) + + + Deactivate Google Analytics (Opt-Out) + + + + Page navigation + + + Next + + + Previous + + + Current page, page %s + + + Go to page %s + + + Go to next page + + + Go to previous page + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Layouts/ContentElements/Default.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Layouts/ContentElements/Default.html new file mode 100644 index 0000000..630ecdf --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Layouts/ContentElements/Default.html @@ -0,0 +1,91 @@ + + + + + {settings.responsiveimages.backendlayout.{backendlayout}} + {backendlayoutConfig.{data.colPos}} + + + + + + + {settings.responsiveimages.container.{context.CType}} + {containerConfig.{data.colPos}} + + + + + + + frame-size-default + frame-{data.frame_class} + frame-type-{data.CType} + frame-layout-{data.frame_layout} + frame-background-{f:if(condition: data.background_color_class, else: 'none', then: data.background_color_class)} + frame-space-before-{f:if(condition: data.space_before_class, else: 'none', then: data.space_before_class)} + frame-space-after-{f:if(condition: data.space_after_class, else: 'none', then: data.space_after_class)} + + + + + {f:if(condition: backgroundImage.0, then: 'frame-has-backgroundimage', else: 'frame-no-backgroundimage')} +
+
+
+ +
+
+ + + + + + + + + + + + + + + + +
+
+
+
+
+ +
+ + + + + + + +
+
+ + + + + + + + + + + + + + +
+
+ +
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Layouts/Page/Default.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Layouts/Page/Default.html new file mode 100644 index 0000000..6882765 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Layouts/Page/Default.html @@ -0,0 +1,32 @@ + + +
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Control/Control.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Control/Control.html new file mode 100644 index 0000000..cd505d2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Control/Control.html @@ -0,0 +1,12 @@ + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Control/Indicator.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Control/Indicator.html new file mode 100644 index 0000000..be759bc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Control/Indicator.html @@ -0,0 +1,16 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/General/BackgroundImage.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/General/BackgroundImage.html new file mode 100644 index 0000000..048465a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/General/BackgroundImage.html @@ -0,0 +1,41 @@ + + + + + carousel-backgroundimage + {backgroundImageClasses} carousel-backgroundimage-parallax + {backgroundImageClasses} carousel-backgroundimage-fade + {backgroundImageClasses} carousel-backgroundimage-{item.data.background_image_options.filter} + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/BackgroundImage.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/BackgroundImage.html new file mode 100644 index 0000000..718845c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/BackgroundImage.html @@ -0,0 +1,3 @@ + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/CallToAction.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/CallToAction.html new file mode 100644 index 0000000..6965335 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/CallToAction.html @@ -0,0 +1,28 @@ + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Header.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Header.html new file mode 100644 index 0000000..5e1fced --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Header.html @@ -0,0 +1,12 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Html.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Html.html new file mode 100644 index 0000000..cf97901 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Html.html @@ -0,0 +1,3 @@ + +{item.data.bodytext->f:format.raw()} + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Image.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Image.html new file mode 100644 index 0000000..1e3417e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Image.html @@ -0,0 +1,11 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Text.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Text.html new file mode 100644 index 0000000..d10208d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/Text.html @@ -0,0 +1,16 @@ + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/TextAndImage.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/TextAndImage.html new file mode 100644 index 0000000..a3c2cf9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Carousel/Item/TextAndImage.html @@ -0,0 +1,21 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container1Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container1Columns.html new file mode 100644 index 0000000..f70edc9 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container1Columns.html @@ -0,0 +1,7 @@ +
+ + {record.renderedContent} + +
+ + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2Columns.html new file mode 100644 index 0000000..7c19a15 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2Columns.html @@ -0,0 +1,11 @@ +
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2ColumnsLeft.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2ColumnsLeft.html new file mode 100644 index 0000000..7c19a15 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2ColumnsLeft.html @@ -0,0 +1,11 @@ +
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2ColumnsRight.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2ColumnsRight.html new file mode 100644 index 0000000..7c19a15 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container2ColumnsRight.html @@ -0,0 +1,11 @@ +
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container3Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container3Columns.html new file mode 100644 index 0000000..b3352fa --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container3Columns.html @@ -0,0 +1,16 @@ +
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container4Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container4Columns.html new file mode 100644 index 0000000..55017b3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Container/Rendering/Container4Columns.html @@ -0,0 +1,21 @@ +
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+
+ + {record.renderedContent} + +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/DropIn/After/All.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/DropIn/After/All.html new file mode 100644 index 0000000..38ef933 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/DropIn/After/All.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered after all other output inside the wrapping container. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/DropIn/Before/All.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/DropIn/Before/All.html new file mode 100644 index 0000000..8413eb5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/DropIn/Before/All.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered before any other output inside the wrapping container. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Footer/All.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Footer/All.html new file mode 100644 index 0000000..60befc3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Footer/All.html @@ -0,0 +1,7 @@ + + +

+ +

+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Frame/General/BackgroundImage.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Frame/General/BackgroundImage.html new file mode 100644 index 0000000..4afd9df --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Frame/General/BackgroundImage.html @@ -0,0 +1,39 @@ + + + + + frame-backgroundimage + {backgroundImageClasses} frame-backgroundimage-parallax + {backgroundImageClasses} frame-backgroundimage-fade + {backgroundImageClasses} frame-backgroundimage-{data.background_image_options.filter} +
+
+ + + {variant.breakpoint as integer} + {variant.width as integer} + + + + {sizeConfig.multiplier as float} + {sizeWidth * width} + {sizeKey as float} + (min-width: {breakpoint}px) + + + {mediaBreakpoint} + + + (-webkit-min-device-pixel-ratio: {sizeDppx}) and {mediaBreakpoint} + {mediaQuery}, (min-resolution: {sizeDppx}dppx) and {mediaBreakpoint} + + {variantStyle} @media {mediaQuery} { #{backgroundImageIdentifier} { background-image: url('{f:uri.image(image: backgroundImageObject, cropVariant: name, maxWidth: sizeWidth)}'); } } + + + + + +
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/All.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/All.html new file mode 100644 index 0000000..5db2c86 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/All.html @@ -0,0 +1,25 @@ + + + +
+ + + +
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/Date.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/Date.html new file mode 100644 index 0000000..03bfd6f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/Date.html @@ -0,0 +1,7 @@ + + +

+ +

+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/Header.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/Header.html new file mode 100644 index 0000000..98bb6b8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/Header.html @@ -0,0 +1,49 @@ + + + + +

+ {header} +

+
+ +

+ {header} +

+
+ +

+ {header} +

+
+ +

+ {header} +

+
+ +
+ {header} +
+
+ +
+ {header} +
+
+ + -- do not show header -- + + + + + + +
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/SubHeader.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/SubHeader.html new file mode 100644 index 0000000..4e0c3a2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Header/SubHeader.html @@ -0,0 +1,40 @@ + + + + +

+ {subheader} +

+
+ +

+ {subheader} +

+
+ +

+ {subheader} +

+
+ +
+ {subheader} +
+
+ +
+ {subheader} +
+
+ + + + + +
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Gallery.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Gallery.html new file mode 100644 index 0000000..bc4faa3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Gallery.html @@ -0,0 +1,17 @@ + + + + {data.imagecols as integer} + {settings.gallery.columns.{imagecols}} + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Audio.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Audio.html new file mode 100644 index 0000000..4aab9fa --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Audio.html @@ -0,0 +1,3 @@ + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Image.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Image.html new file mode 100644 index 0000000..2888960 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Image.html @@ -0,0 +1,55 @@ + + + + {variant.breakpoint as integer} + {variant.width as integer} + + + + {variant.aspectRatio as float} + {width / aspectRatio} + {height as integer} + + {f:if(condition: breakpoint, then: 'media="(min-width: {breakpoint}px)"')} + + + + {sizeConfig.multiplier as float} + {sizeWidth * width} + + + + {sizeConfig.multiplier as float} + {sizeHeight * height} + {f:uri.image(image: file, cropVariant: name, width: '{sizeWidth}c', height: '{sizeHeight}c')} + + + {f:uri.image(image: file, cropVariant: name, maxWidth: sizeWidth)} + + + {srcset}{sizeUrl} {sizeKey}{f:if(condition: iteration.isLast, else: ',')} + + + f:format.raw()} srcset="{srcset}"> + + + + + + {defaultAspectRatio as float} + {defaultWidth / aspectRatio} + {defaultHeight as integer}c + + + + + + + + + + + + {file.properties.alternative} + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Video.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Video.html new file mode 100644 index 0000000..752b2ff --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Rendering/Video.html @@ -0,0 +1,3 @@ + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type.html new file mode 100644 index 0000000..21d94d6 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type.html @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Audio.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Audio.html new file mode 100644 index 0000000..82981dc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Audio.html @@ -0,0 +1,10 @@ + +
+
+ +
+ +
{file.properties.description}
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Image.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Image.html new file mode 100644 index 0000000..080a7fb --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Image.html @@ -0,0 +1,34 @@ + +
+ + + + + + + + + + + + + + + + + + + + +
{file.properties.description}
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Video.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Video.html new file mode 100644 index 0000000..45c9edc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Media/Type/Video.html @@ -0,0 +1,10 @@ + +
+
+ +
+ +
{file.properties.description}
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Menu/SkipNavigation.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Menu/SkipNavigation.html new file mode 100644 index 0000000..1938428 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Menu/SkipNavigation.html @@ -0,0 +1,14 @@ + + + + + + {data.accessibility_bypass_text} + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Table/Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Table/Columns.html new file mode 100644 index 0000000..342c7fd --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/ContentElements/Table/Columns.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {cell} + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Form.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Form.html new file mode 100644 index 0000000..eefd098 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Form.html @@ -0,0 +1,146 @@ + + +
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + + +
+
+ +

+ + + + + + + + + + + + +

+
+ + + +
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+
+ +
+ +
+ + + + + + +
+
+
+
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Rules.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Rules.html new file mode 100644 index 0000000..9ba7bcd --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Rules.html @@ -0,0 +1,11 @@ + + + +
+ + + +
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Searchresult.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Searchresult.html new file mode 100644 index 0000000..8232068 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/IndexedSearch/Searchresult.html @@ -0,0 +1,25 @@ +
+
+

+ + {row.result_number} + + {row.title} + {row.rating} +

+ +

{row.item_description}

+
    +
  • {row.size}
  • +
  • @{row.created}
  • +
  • @{row.modified}
  • +
  • {row.path}
  • +
+
+ + + + + +
+
diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Navigation/MainAfter.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Navigation/MainAfter.html new file mode 100644 index 0000000..9f18cb3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Navigation/MainAfter.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered after the main menu, inside the wrapping container. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Navigation/MainBefore.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Navigation/MainBefore.html new file mode 100644 index 0000000..91bc8d1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Navigation/MainBefore.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered before the main menu, inside the wrapping container. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Page/PageAfter.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Page/PageAfter.html new file mode 100644 index 0000000..f1c91a8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Page/PageAfter.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered after the page template. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Page/PageBefore.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Page/PageBefore.html new file mode 100644 index 0000000..aba291e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Page/PageBefore.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered before the page template. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Structure/FooterAfter.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Structure/FooterAfter.html new file mode 100644 index 0000000..60fbd72 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Structure/FooterAfter.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered after the footer, inside the wrapping container. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Structure/FooterBefore.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Structure/FooterBefore.html new file mode 100644 index 0000000..b051dcd --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/DropIn/Structure/FooterBefore.html @@ -0,0 +1,3 @@ + +DropIn Placeholder. Will be rendered before the footer, inside the wrapping container. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Breadcrumb.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Breadcrumb.html new file mode 100644 index 0000000..d61520a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Breadcrumb.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + {item.title} + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Language.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Language.html new file mode 100644 index 0000000..c7a19f2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Language.html @@ -0,0 +1,20 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Main.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Main.html new file mode 100644 index 0000000..28ed0fe --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Main.html @@ -0,0 +1,83 @@ + + +bp-page-header navbar navbar-mainnavigation navbar-{theme.navigation.style} +{headerClass}{f:if(condition: logo.normal, then:' navbar-has-image')} +{headerClass}{f:if(condition: theme.navigation.type, else:' navbar-top', then:' navbar-{theme.navigation.type} navbar-fixed-{theme.navigation.type}')} + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Meta.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Meta.html new file mode 100644 index 0000000..c7c3213 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Meta.html @@ -0,0 +1,13 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Subnavigation.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Subnavigation.html new file mode 100644 index 0000000..41c870a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Navigation/Subnavigation.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/CookieConsent.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/CookieConsent.html new file mode 100644 index 0000000..8843a07 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/CookieConsent.html @@ -0,0 +1,22 @@ + + +
+ + + + + + + + + + + + + + + + +
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/Copyright.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/Copyright.html new file mode 100644 index 0000000..7553601 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/Copyright.html @@ -0,0 +1,3 @@ + +{theme.copyright.text} + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/FooterContent.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/FooterContent.html new file mode 100644 index 0000000..ab18776 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/FooterContent.html @@ -0,0 +1,17 @@ + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/FooterMeta.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/FooterMeta.html new file mode 100644 index 0000000..d6d042c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/FooterMeta.html @@ -0,0 +1,36 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/ScrollTop.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/ScrollTop.html new file mode 100644 index 0000000..1daed81 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/ScrollTop.html @@ -0,0 +1,5 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/SocialLinks.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/SocialLinks.html new file mode 100644 index 0000000..c61b31b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Partials/Page/Structure/SocialLinks.html @@ -0,0 +1,18 @@ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Source/Ai/BootstrapPackage.ai b/public/typo3conf/ext/bootstrap_package/Resources/Private/Source/Ai/BootstrapPackage.ai new file mode 100644 index 0000000..6150b8b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Source/Ai/BootstrapPackage.ai @@ -0,0 +1,1153 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + BootstrapPackage + + + + + Adobe Illustrator CS5.1 + 2014-02-07T14:25:29+02:00 + 2014-02-07T14:25:29+01:00 + 2014-02-07T14:25:29+01:00 + + + + 256 + 72 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgASAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9Palq2naZB699OsEf7PL qx8FUbk/LKM+px4o8UzQbcWGeQ1EWwvU/wA1Y1JTTLMv4TXBoP8AgF3/AOGzQaj2iA2xx+J/V+12 +HsY/wAZ+TGrzz75ouSf9M9FT+xCqpT6acvxzVZe2NTP+Kvd+Lc+HZuGPS/e9R8srINAsXllknlm hSaSWVi7FpFDndielaDOw0APgRJJJIB3893nNWR4sgBQBr5MZ/NS8uYrGyt43ZIZ3kMwU05cAvEH 2+I5qPaHLIQjEHY3bsex4AykTzFPM85J6FFW2qalakG2u5oSOnpyMv6jl2PUZIfTIj4tc8MJcwCz byX561O41GHTdSb6wk54xT0AdWpUcqbMD9+dB2V2vklkGPJ6r5Hq6fX9nQjAzhtXR6LnUuhS3W/M 3lvQIY5td1Wz0mGZikMl9cRWyuwFSqmVkBNPDFUn/wCVsflZ/wBTlof/AHErT/qpiqIsPzH/AC81 G6W00/zRpF5dOrutvb39tLIVjQyOQiSFqKilm8AK4qqaT5+8iazerYaR5j0vUr5wWS1tL23nlIUV YhI3ZjQddsVTe+v7HT7Oa9v7iK0s7dTJPczuscUaDqzu5CqB4k4qlmk+ePJesmddI1/TdRNrGZrk Wl3BOYox1eT03bivudsVQk/5m/lvblRcea9GhLfZEmoWq1p4VkGKpxpet6Nq8Jn0q/ttQgFKy2s0 cyCvT4oywxVG4qkmq+ePJWkXP1XVfMGm6fc1p6F1eQQvU9uMjqcVTSxv7G/tlurG5iu7Z/sTwOsi N8mUkHFUFrHmryvov/HZ1ix0zYH/AEy5hg2PQ/vGXFV2i+Z/LWuo0miatZ6oifbayuIrgDem5iZq bjFUyxV2KuxVj8/5h+QLe5FrceZtJhuTUCCS+tlkqOvwlwcVTK81/QrLSm1i81G1ttJQKW1GaaOO 2AdgikzMwT4mYKN+uKpTZ/mZ+W97dw2dn5r0e5u7h1it7eHULWSSSRzxVERZCzMxNABiqO1zzf5T 0B4U13WrDSXuAxgW+uobYyBaBiglZOVKitMVdofm/wAp6+8yaFrVhqz24UzrY3UNyYw1QpcRM/Gt DSuKq+reYNB0eNZNX1K106NqlXu544AQOtDIy9MVQmk+dvJmsSiHSNf07UZmqFjtLuCdiR1oI3Y4 q8i1nV7vVdQlvLlyxdj6aE7IlfhVfYZ5xqtTLNMzl/Y9pgwRxxEQgcx252KvaPI96LvyxYtWrQp6 DjwMZ4j/AIWmd92Tl49PHy2+TyXaGPhzS89/mlv5nWJn0BLlR8VpKrMf8h/gP/DFcxO38PFg4v5p +/b9Tf2Tk4ctfzg8pzjHpnYqn3kW3abzVYAdEZpGPgEQnNl2RDi1MPn9jhdoyrDJ7PnevJPNvzu/ Jz/laGk6bp/6X/RH6PuHuPV+r/WefNOHHj6sHH51OKviz83vy2/5V35xfy3+kf0pwt4rj616P1ev qgnjw9SbpTryxV9O/lf/AM4pDyL560zzUfNH6SGnevWy+oeh6nr28kH959ZlpT1eX2T0pirwz8wd Hvfya/PePUNNjKWMF0mqaWvZ7OZiJYPkP3kPjTFXs/8Azlr+ZdnH+XOlaLpNwJP8WCO79VD10+ML Kp2/367JTxAbFUN+VX5ef4Y/5xn836xdx8NV8y6JqF5JyFGW1WzlFsn0qxk/2WKvC/yS/Jp/zQ1X UrEauNIXToEnaU2/1kvzYqFC+pDTp44q35p0Lzf+Rv5mwxWWo87y1SK7tLyENGlzbSEgrJGS3wsy MjKSemKvqL/nIb80rzy9+UNvqmhzNbah5kMEFjOh/eRRTxGaSRGHRhGvEMOhaoxV4V+Sn/ONR/Mb yxc+ZdV1mXToZZ5ILFI4hK8jR05zSM7D4eZK8epodxiqB/KrXfMP5S/nh/ha6uydOl1BdK1aIV9G VJG9OG5Cn7JXmsgPXjUdzir3b81v+cZV/MPzxN5kuPMB02BreG3S1jtfWcmIEFi5ljA69OJxV83a 9pGt/kh+cMEVpqJuG0ySC5juowY/XtJaF45I6tTkvJGWp8cVfoHirsVfO/8AzmP5/wBS0Xyzpflj Tbh7eTXXlk1B4yVc2tvxHpch0WV5N6dQtDsd1Xmv5df84k6r5v8AJVh5ln8wx6W+pIZrWxNq0/7r kQrPJ6sdCwHIAKdqYq9b/N3yvceVP+cU73y7czpcz6Zb2EDzxghXK6jAeQB3HXFXx7psd/pEWlea YN1h1Blg6ik1kIJxUjpy9YU+RxV7F/zk9q585fmjbWOmyc7bTdC+toOuwtZdTkYgdC0HDFUf/wA4 k61+gtN/MXW+If8ARelR3vA1ofq63EtDTffjirBfy58j+Zfzu8/3w1TWjFcei97qGozqZ3CeoqLH FHyTvJRV5BVH3Yq9/wDIP/OJy+TPPWkeaLXzKb2LTZGd7KW09JmDxPHtKszj9uv2MVVLu3a3uprd vtQu0bfNSR/DPM8kOGRiehp7eEuKIPeo5Bm7FXoH5V6qFlu9Ldvt0nhHuPhf8OP3Z03s9qKMsZ94 /T+h0fbGHYTHuZ7qFlFfWM9nN/dzo0be3IUr9HXOkzYhkgYHkQ6TFkMJCQ6PCb20ms7ua0nHGWBy jj3U0zznLiOORieYe0xzE4iQ5FQytmz78qtMLXF3qbj4Y1EER8WajP8AcAPvzpfZ7T3KWQ9Nh+l0 nbGbYQ+L0fOqdA7FXwz/AM5e/wDk45/+YC1/U2KvubFXhn/OWv5eDzF+X48w2kYbU/LRa4YgfE9m 9BOv+wosm/QBvHFXzN+VflvWPzO8/wDl3y9qM8lxp2mwiOZjv6Om2ztK0YI6Bmk4KfFhir7g/NOO OL8qPN8UShI00HUVRFACqos5AAAOgGKvkr/nFn8yPJfkbXdduvNOo/o6C8tYorZ/Rnn5OshYikEc pG3jiqR/n95+sPzL/M6K68uRyXFnFbwaXppKFJLhhI78gjfEOUk5VQd6U2GKvUf+cu7KfSvIPkDR mba0V4ZBsavb20MYPKg8Tir1b/nFqNE/Izy4yihkN8znxP1+da/coxV8yf8AOQJNr/zkfq0kHwPH d6bKpArRzaWz1of8rfFX0z+f35z6n+WNno1xY6bDqJ1SSeORZ3dOHoqhBHHx54q+T7PXR+a35yWO oecr+20u31K6gSf4H9FYo+KpbRij0MgHHk5pUkk9sVfoRirsVfHf/ObUsh87+X4Sf3aaYXVdtme4 cMf+EGKvpj8pI0T8q/JyooUHRNOYgeLWsbE/STirF/8AnKL/AMkV5m/6Mf8AuoW+KvlnRvLh1P8A 5xr13U41Jl0TzFDckjr6U1vHbuPlylQ/Riqr+TGmXeuR+f8AX71zMdG8oahDHIwqQ72RtYRX2gjc YqzL/nD7SINat/P+j3B4walpsNnK1K0ScTxsaHrs2KvOFi/NX8j/ADnNPHFJp16qvb/WWi9Wzu4G YH4WYcXVigbajAjscVfRP5F/85Pyedtdi8r+ZrGCx1i5VzY3tqWWCdo15GJo3Lsj8QSDzIPTbaqq f+f9ONn5muGApHdAXCf7PZv+HBzhe2cHh6g90t/x8XquzcvHhHlsxzNU7B2Ko3R9Tl0zU7e+i3aB wxXpyU7Mv0qaZkaXOcOQTHRpz4hkgYnq90tbmG6tormFucMyh428VYVGeiY5icRIci8bOBiSDzDC PzF8qSXI/TFlGWmjWl3GvVkXo4HivQ+3yzn+2+zjP97Abjn+t3HZesEf3cuXR53Z2dzeXUVrbIZJ 5m4og7n/AD65y+LFLJIRiLJd7kmIRMjyD2/QdIi0jSoLGM8jGKyP/M7bs339PbPQdHphgxCA6fe8 fqc5yzMimGZTQ7FXwz/zl7/5OOf/AJgLX9TYq+5sVYr+bH/krPOX/bD1L/qEkxV8rf8AOFf/AJNP Vf8Athz/APUXaYq+qfzY/wDJWecv+2HqX/UJJir46/5xu/Kfyv8AmLrOs2fmBrlYbC2img+qyLGe TyFTyLK9RTFX1R5F/wCcffyv8l6jHqmlaa0+qQ/3F9eSNO8ZIoSimkat/lBa++KvO/8AnNfSpZ/J GhamickstQaGRx+ytxCxBPsWhA+7FWRf84ja7a6h+T9pp0cqtcaPdXNvPDUckE0rXKEjrRvWND7H wxV86ef7iLzn/wA5L3Caewu4b3WrSxjdN0dbf0rZmBXYrSInl4b4q+8xIhdkDAulOSg7ivSo98Vf DX/OXMWhQ/m636JESTmwt31UQhRS8LyV58f2zD6RPfFX2zoZum0XT2uyTdG2hNwW+0ZPTHOvvyxV G4q+S/8AnN7S5V1fytqoT91Lb3Nq0gHRonSRVJ+Upp9OKvc/yL8x6dqn5P8Ali5juYytlp8Flcnk o9OS1UQFX3+E/B369e+KpR/zk1c29z+QnmSe2lSaB/qJSWNg6sP0jbjZhUHFXnP/ADij5b07zP8A k/5u8v6iXFjqd89vO0RUSKr20Q5IWDqGU7ioO+Ks5k/Jzyr+Wn5R/mFBoM13cfpPRr57mW+eKR/3 NlMEVfSjhFBzY9O+KvL/APnCF0TU/N7uwVFt7MsxNAAHmJJJxV9XXSWFzYyLdLFPYSxkzCUK8LRk VPLlVStPHbFXwN5bj0yL/nJLT4/KzK2kr5njFgYaGP6p9cHL0z04CKvH/JxV9m/mdpBudJj1CNay WTUkp/vuSgP3NTND2/puPEJjnD7i7bsjPwzMD/F97y3OOekdirsVeiflr5lXj+hLp6GpayYnrXdo /wCI+nOo7C1/+Rl/m/qdD2rpP8pH4/reg507o0LBpem29w9zBaxRXEmzyoiqxruakDvlMNPjjIyj ECR602SzTkKJJCKy5rdirsVfN/57f843eePP/n6TzDo19plvZPbQQCO8luEl5RAhjSOCVab7fFir 6QxVJfO+i3Wu+S9f0O0eOO71XTbuyt3lJEayXEDxIXKhmChm3oD8sVeLf849/wDOPfnT8uPOl7rm uXum3Npc6bLZIllLO8gkeeCUEiWCFePGE9/DbFXtPnfRbrXfJev6HaPHHd6rpt3ZW7ykiNZLiB4k LlQzBQzb0B+WKvJP+cdfyJ83flrrGsXuu3en3MWoW8cMK2Mk0jBkcsS3qwwilPAnFXuuKpL5y8o6 L5v8t3vl7WojLYXyBX4ni6MpDJIjb0ZGAI/HbFXy9e/84afmDYXkw8ueZ7I2cwMbvM1zaStC3VXW FJ1b5cqHFXo/5J/84xWPkPWF8x63fpq2uQqVsUhRkt7cuCruCx5SOVNASABvtXcKoD87/wDnHPzf 5486yeZ9A1m0sme2it/q9wZojWKtf3kSybH5YqkP5c/84c3lhr1vq3nbVba9gtZRMNNsfVkWd1bk PVmlWFuNftKE38cVfUOKuxVh35q/ljov5jeVn0LUna2kRxPY30ahngnUEBuJpyUhiGWoqPA0IVfM 83/OE/5gi64w65pL2m/712uUk70/diF18P28Ve5eYfyi1y8/5x/H5a2V5atqqW9rAl5MZI7cm3u4 52J4pK4qkZp8J3xVv/nHj8qfMX5b+WdS0vXLi0ubi8vfrUTWLyyIE9JI6MZY4TWqeGKs8876Lda7 5L1/Q7R447vVdNu7K3eUkRrJcQPEhcqGYKGbegPyxV4v+S//ADj15w8laV5xsdZvtPlPmPT/AKja PZyTyCNykqlpBJDDt+9HSuKvOpv+cMvzOQfVrbX9KexY1dXlu4679fTWB1J2B64q9N/JX/nF218j a9H5l13UY9V1e2VhYW8EZW3gd14tKWf4pHoSF2AHXc0oq92ubeK5t5beZeUUyNHIvirChyGSAnEx PIsoSMSCOYeGa1pc+lancWM32oWorfzId1b6Rnneq05w5DA9HssGYZICQ6oHMdudiq6OR45FkjYp IhDI6mhBG4IIwgkGxzQQCKL0byl5313U7mHTmto55BvNdklaRr1ZlApXttTfOq7N7WzZpDGYgnrL ydDrez8eMGd15M9zpHSOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KsQ/MPy0dRsRqFqlby0U81HV4upHzXqPpzR9taDxYccfqj9o/Y7XszV+HLgl9MvveU5xj 0rsVVLe3nuZ44IEMk0rBY0XqSegycIGREYiyWMpCIs8g9k8o+WYtD04I1GvZqNcyjx7IP8lc7vs3 QDT46/jPP9Tymt1ZzT/ojknubFwnYq7FXlv/ADk7LLF+RvmWSJ2jcfUqOpIIrqFuDuPbFWIeVtN8 l6P+bfk+1/Ku6jm027s79vOMFheyXtqkUcS/VXnrJMiSGcsF3rXFUd5e8naF+afnLz1qfm9Z9Qtd F1d9D0S0W5nhitVs0AlkjWF4/jd25FjXfFWN/wCMvNH/ACpv/DH6Un/Sv+MP8E/pb1D9a9D1udfV 68/R/d8v5ffFWSeYfJ2hflZ5y8i6n5QWfT7XWtXTQ9btGuZ5orpbxCIpJFmeT40deQYU3xVJvzI/ J78tovzi/L2wj0WNbTzJPrMmtxerPS4eG3SaMsfUqvGRyfhpiqI/MbSPJWjef/KvlDzO76T+VUOk ztZWnr3EVlLqXrsTHcSKwYhYiGXm3U06E1VZ/N+UX5R6x5Os7CHTYdR8v2nrXWk8Lu4miUzKObRS rMxZTxH7RHhiryf8q/IflO1/5xq1Lzrb2Ai80XGga9HLqayS8yqtdRgcefAUSJRsvbFVmn+WNF8o eW/yg80eV45LLzN5h1HSrfV/TuJm+u297AWvDLE8jIRy4mtKLX5YqzH/AJyR06bzZceX/Idszc7y LU9YmCV2On2UgteQ7h7iYCntiqc6h5kPmH/nGa91xZKz3Xlmd5pAdxcJask248JUbFXnMHljRPJX lz8oPM/lSOSw8yeYb3RrfV0iuJmF9Bf2oe7MsLuyH4yDULRa/LFXt35wMy/lV5vZSVZdHvSrDYgi B9xirxXSPLWjeTLP8m/MHlZZLHXfM82nQa7Ck8zJe295aI93LLE7un7tm5bKKE+woq3+Yeoyv+c0 /npZWWx8iapoejSvX939Xv1m+vn2KG5RcVeg/nTJNqvmbyF5HeeWLS/Ml/cyatFBI0LT22nwCZoG dCrcHLjlQ4qx/wDPjyR5Y8nfkD5h0/y3Z/ULSS5spzEJZZAJDdwJVTM8hXZRsCBiqd/lr/yEDzje /mhdHno1mZtK8lWxP2IEYpdXrL2e4ccVruFFD2OKsD/MPUZX/Oafz0srLY+RNU0PRpXr+7+r36zf Xz7FDcouKvQPzulvNU13yN5FiupbWx80ahO2rfV5DFJLZ2EQmlh5qQwV+e9MVVfM35Z+SfJn5a+e bjyzp506W50HUVn4z3EqtxtZGB4yySKGr3ArirFPyR8ofkE2l+Ub+0fSn89/U7e4aKPUOd59bEAk mP1YTk8l+IsvDbwxV77irsVeeecfy/maZ9Q0aPkHJaezGxBPVo/b/J+7OX7T7GJJniHvj+r9TvdD 2kK4Mnz/AFsQs/LWvXdx6ENjNzrRi6FFX/WZqAZo8WhzTlwiJ+VO1nq8URZkHp3lLyZa6GnrzET6 i4o0tPhQHqsdfxPfOu7N7LjpxxHeff3e553W6+WY0NofjmyTNs692KuxV2KvLf8AnJ2KWX8jfMsc SNI5+pURQSTTULcnYe2KsP8ALeo+SvMP5weTb38sLaKOx02zvx5tvrCzezt2ilhRbaGUmOJZH9YE gUqOvbZVH6B5y0T8rPOfnrTPN3r6fZ61qr65od4ttNNFdi8QGWONoUf94jrQq1N8VY3/AIP81f8A KmP8T/omf9Mf4t/xv+h+H+lej61OPp/z+j8fHrT7sVZJr/nLRPzT85+RdM8o+vqFnouqprmuXjW0 0MVoLNCYo5GmRP3ju1Aq13xVOvzNB/5Xf+UTfsiTXAT2qbOKgxVkv5g/mH+Wnl5o9J86XEareRet Fa3FpNdRSqGKU+CKVC1duJ39sVYx/wA4+ade2P5c6rJLay2GlXuqajeaBZ3CmN4tNlI9FSjfZBIZ h8698VY7+WiP/wBCc3a8TyOh6/Rabmsl5T78VYz5a8p+WvIMP5WfmVbafGNO1G0t7DzJK/KX0bjU IF9K/XmX9MiSquVp8PwjrirLrzS/N/nD8+fMt75a19PLzeU9NstH+uPYx36ym85XkqokrxqrKwAZ hv26HFUp8qfWNK/In80fJd5N61x5TbWbJJAnph7eaJp4pAlSE9Rnc8QdsVZr+S/5Tfl/pnlbyp5o t9GQeYZtJs7h72aSeZlmuLVGlaNJndIixY/YUU6DFWTfnEQPyn84V/6s99/yYfFWMfk1+V35e6J5 R8s+bYdJSLXZdGtLm41GeSaZ0ea1R5mRZndYq8m+wBQbdMVeWaT5D89+cvye81+Z4PMKWWlea59S 12by6+nRyyTPDMzRL9baQSRhjapxopA6itcVZh5j8wTXuj/lH+aksUtxYaUSdemhjaZ4E1C1W3nm ZVDOUSVDyIHhiqp+fPnfyx5x/IDzFf8Alu8N/Zx3VnbmYRTRAyi6gfiomSMv8LjdajFUz8pi2/LT 81NQ8nEC18o+aYpNY8uL9mK3u4F/021TwBRfUAGwFB3xV5xpPkPz35y/J7zX5ng8wpZaV5rn1LXZ vLr6dHLJM8MzNEv1tpBJGGNqnGikDqK1xVmHmPX577SPyj/NWSCa6sdJ5fp2SCN5nhTULVYJ5mRO TFI5YzUgE4qw15fImoedPzF1PyApl0S78gau9/cxpcrG+pSzF5Km4APMoV2G3h3xVmn5JeePyLGi +UdKtG01POv1O2tmKWLLdfWzCElH1gQj4ieQZue/jir3jFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq/wD/2Q== + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:E7312B4FFB8FE3118266B8F1C5D74CE6 + uuid:73abb17e-1034-4a04-9123-60585208be7a + + uuid:72b1533f-9e90-064f-87a5-4345918e86e3 + xmp.did:FD7F11740720681188C6F0AB0253E170 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:E7312B4FFB8FE3118266B8F1C5D74CE6 + 2014-02-07T14:25:27+01:00 + Adobe Illustrator CS5.1 + / + + + + + + Web + Document + + + 1 + False + False + + 216.000000 + 85.000000 + Pixels + + + + + Share-Regular + Share-Regular + Regular + Open Type + Version 1.000;PS 001.000;hotconv 1.0.38 + False + Share-Regular.otf + + + Share-Bold + Share-Bold + Regular + Open Type + Version 1.000;PS 001.000;hotconv 1.0.38 + False + Share-Bold.otf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grautöne + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarbgruppe + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 9.90 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 14 0 R/TrimBox[0.0 0.0 216.0 85.0]/Type/Page>> endobj 10 0 obj <>stream +H‰T“M‹1 †ïþ:¦‡Qd[þ:n¦a%¤Û ”žzH»…B¶ùÿÐWž�Ý%`ç•dù‘¬ÙŸGÚŸF¡Ãç‘Üarûñ"t½“°ˆ~Xé~}qûG¸ÿÜÝ~ò?…|ˆ{\âÖb�¦�“{uB5Qæ€ýßo÷�^œG{S°Êzƒ_QQ¯…’p.¹RLì5'ºÞœ9nn€##‡°Ç*nÅT(&jK‹¸º¡píêKÜj$�×)o2dŽ Bðj¨\rw«€¶q*Èè•SŒ¥R‹5¿â]ì-ËV *Î2bëÉcd+<®�L%”f9tSkÒ–`3àjÅÕ8“Ä€#·â;JÁ<®ÚÈ1DíÍ2$ ,T–Xz7¯îÙ=½ë­¸b œÙ{4cëmá`�‰+TCïmÖM%Ñø6/0%ÿQi +JkÜB¹hÛô x+œC1�‹B‹¤Z³Ä4ToV óT¯ôǾÐ'÷_€Ó§»þ +endstream endobj 14 0 obj <>stream +8;Wjt_%"16#Qra-/+X+cG_B;!EQP+Vo8+c(KQR@S;PgAh9i>+C@L6:WZ(n25POZXD +hpdl>'@B'%N>\;48G.RqDP)4Z!;7&67f~> +endstream endobj 15 0 obj [/Indexed/DeviceRGB 255 16 0 R] endobj 16 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 7 0 obj <> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 5 0 obj <> endobj 6 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>stream +H‰L‘_LSWÇïm{ï­—^Úq{™:�nÀf6©ÅìO Ð–±–ÚÑÒîJš¹h´0\_JÉIÁ7¢@„€f †nX¶ØKÝ Alj2³·ÍíwàиK}YÎÃIÎùžïç|¿?’P)’$¹wjŒo;’_ë°ˆöB³½µÓe·/ò�–DÏ©PŽš{÷lþ¾™N冑º]P�¶ÝW7{3 %I6ZÚ o@t¶::„ýÍ/ +u§O¨ò´wòn³ûœ­ív›` f‹Ëëj\N¿]l�‚Á"Ч¯@()*:¨»\BÊÅ'ˆvŸ]ôÛmúj�趸^ªª­ xíB‘l×B¤¼ˆ\±— öDA‘ÄË +b—‡È“O‰_É ²”â“&&ô0ø@Ö�ú·yxMÇ +Áº#—JÄ®qÝbëÖÐ:aè›�&oöœ½¦[a"ÞæH›ï=úžÅó‹FÈ»ö×}#:Ö’ ,A@"×ãJTœ-ánù©KÂ.@·„We"ÜÀ�$S ~M‰*‘ŠÃoV&°Hö±»·Cûºcb8yýጠœÖE™>ñx¿S‹K§€·�Pxk.òł޵û7L])š5¿�x0Ã"¥§q ^¢`©4iŠÃ3±Ex…b/%´œâå€<üÃá6·¡¸Ø…6ðŽÞyôh´{ùD˜ƒSM@ãr\Þ„i| +Ÿ»�ÕPå7@ çøíyJ0•¹p,¡„$êâ0ik©å á&šì»}÷«ûøD„ƒŒ¦Ç¸ ì`ªì8 >` ÷û(б'e“ .§LjäïÔ¡�,·¬þO>“``ž¡þ¤qüHÝýú›_þÒ”eV‹o›5ôŒ5b9À³ùϲý”€d³ÝÐÈÁ¾êéü‹ü»ç?½´ª¹?;:7þmðì/1ýíM‘�´˜)oÀyxÇt#(;t·N_ñД¹›«ê­‘~_Éœ›ë¾ª…�÷§ BÇæÊE«î‘pHnZ¿¡âîméÞ}RßPÉ� ÞÔGhl¾ÈðÃG-矪ӥñ�¨wºÂý'À7,ó¾ +endstream endobj 19 0 obj <> endobj 22 0 obj <>stream +H‰$�]L[eÇß·‡ž“vôT¡g ´=çhØÙ@4BÔÈÅsPºÒ6–ÍŽvkgÓ’¶Ô�‘ X1¼€S•v_ñÂŒ-a›šš± ·›ê�f&ÄÅe‹1ÿ·¾5zÐçæIž<ùý?()3Ji…ç goGÿîÞp ªß�·®5ÌI™£Œ¹Ê•]ümWÙWYÌnÒšóÛðšýO/ïT¥áÖøÐH"r2œÒkët8’ÔÛã±”nì`(9 õã#º/ +ë=ÑH:”ЃÃzk ‘ˆG’{ô›ô½Ñ¨þ%©'BÉP" +6<×Þë +é�è1†©! ¤‘> endobj 12 0 obj [/ICCBased 23 0 R] endobj 23 0 obj <>stream +H‰œ–yTSwÇoÉž�•°Ãc [€°�5la‘QIBHØADED„ª•2ÖmtFOE�.®c­Ö}êÒõ0êè8´׎�8G�Ng¦Óïï÷9÷wïïÝß½÷�ó '¥ªµÕ0 �Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^�i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +�V�³)g�B£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±Z�L®Ä„?â_øóyxg)Ë”z¥�ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ß�Þô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ�;ÂA4ˆÉ 䀰ÈA9Ð=¨- t�°lÃ`;»Á~pŒƒ�Á ðGp| ®�[`Lƒ‡`<¯ "A ˆ YA�+äùCb(ЇR¡,¨*�T�2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°Ž�Sàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4z�BgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p�0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"E�ÒI2’�ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷�?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@� æP+¨íÔ!ê~êêmê�æD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒ�Ó¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™�˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…�EŒ…Òb�Å~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X�[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„�Æfm“�Ž;'_9 œr�:œ8Ýq¦:‹�ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%�—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† �ž�kï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»Îå�wW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™�™üšhšÕ›B›¯œœ‰œ÷�d�Òž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª�««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½�¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû +endstream endobj 11 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 15.0 +%%AI8_CreatorVersion: 15.1.0 +%%For: (Benjamin Kott) () +%%Title: (Unbenannt-2) +%%CreationDate: 2/7/2014 2:25 PM +%%Canvassize: 16383 +%%BoundingBox: 17 -69 199 -18 +%%HiResBoundingBox: 17.1084 -68.1177 198.8911 -18.8823 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 11.0 +%AI12_BuildNumber: 39 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -85 216 0 +%AI3_TemplateBox: 400.5 -300.5 400.5 -300.5 +%AI3_TileBox: -298.5601 -328.1602 514.5596 243.1602 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -211.5 155.5 2 2463 1267 18 0 0 48 120 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 -600 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 26 0 obj <>stream +%%BoundingBox: 17 -69 199 -18 +%%HiResBoundingBox: 17.1084 -68.1177 198.8911 -18.8823 +%AI7_Thumbnail: 128 36 8 +%%BeginData: 7274 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FD0BFFC9C9CFFD04FFCF9FC19FC19EC19FC8C9FD6AFFCAC9A0C19E +%9E9FFD05FF9F9E98C19EC198C1989E98C8CAFD65FFCA9FC19EC198C198C9 +%FD05FFC19EC19EC19FC19EC19FC198C1FD63FFA7C1989E98C1989F98C0A7 +%FD05FF9FC1989F98C1989F98C1989F98CFFD06FF7D7D527D527D525252A8 +%52527DFD04FFA85252A8FF7D7D527D7DA8FD06FFA87D527D7DFD04FFA87D +%7D527DA8FD0DFF7D7D527DA8FFA87D527D52A8FFFF527D527DA8FFFFFF7D +%7D527D7DFFFFA0C19EC19EC19FC19EC19EC9FD05FFC89EC19EC19FC19EC1 +%9FC19EC1CAFD06FF27FD08F8A827F8F8A8FFFFFFF8F8F8FF7DFD06F827A8 +%FFFFFFA827FD05F8A8FFFF27FD04F827A8FD0BFF27FD04F852FFFFFD04F8 +%52FF7DFD04F8FFFFA8FD06F8A8A09E98C19EC198C19EC198C1A0FD05FFA0 +%C09EC198C19EC198C19EC198CFFD06FF27FD08F8FF7DF8F852FFFF7DF8F8 +%7DFF7DF8F8F827F8F8F827FFFFA827F8F82727F8F8F8FFFF27F827F8F8F8 +%52FD0AFF52FD05F827FFA827F8F8F827FF7DFD04F8A8FFF8F8F82727F8F8 +%A8C19FC19EC19FC19EC19FC198C1FD05FFCF98C19FC19EC19FC19EC19EC1 +%CFFD09FF27F8F8FD05FFF8F8F8FFFF52F827FFFF52F8F8A8FFA8F8F8F8A8 +%FF7DF8F852FFFF52F8F87DFFA8FFFFFFF8F8F8FD0AFF27F827A8FFA8A8FF +%FFF8F827F8F8FF52F827F8F8FF7DF8F852FD05FF98C1989F98C1989F98C1 +%989F98CFFD04FFCAC198C1989F98C1989F98C19FFD0AFF52F8F8A8FD04FF +%7DF8F87DFFF8F852FFFF7DF8F87DFFFF52F8F87DFF27F8F8A8FFFF7DF8F8 +%52FD05FF52F8F8A8FD08FFA8F8F827FD05FFA8F8F852F8F87D27F852F8F8 +%A87DF8F87DFD05FFC19FC19EC19FC19EC19FC19EC1C9FD05FFA0C19FC19E +%C19FC19EC19EC9FD0AFF27F8F8FD05FFA827F85252F8F8FFFFFF52F8F8A8 +%FFFF7DF8F8A8FF52F827A8FFFFFFF8F827FD05FF27F8F8FD09FFA8F8F87D +%FD06FFF8F85252F852F85252F8F8FF7DF8F87DFD05FF98C19EC198C19EC1 +%98C19EC198C1FD05FFCA98C19EC198C19EC198C1C9FD0AFF52F8F8A8FD05 +%FF52FD04F852FFFFFF7DF8F8A8FFFF52F8F87DFF27F8F8FFFFFFA827F827 +%FFFFA8A852F8F852FD09FF7DF8F852FD05FFA8F8F87D7DF8F8F8527DF8F8 +%A8A8F8F8F82752A8FFFFC298C19FC19EC19FC19EC19FC198CFFD05FFC298 +%C19FC19EC19FC19FFD0BFF27F8F8FD07FFFD04F8A8FFFFFF52F8F8A8FFA8 +%F8F8F8A8FF27F827FD04FFF8F827FFFF27F8F8F827A8FD09FF7DF8F87DFD +%06FFF8F852FFF8F8F8A87DF8F8FFFF52FD05F87DFFA09E98C1989F98C198 +%9F98C1989EA0FD05FFA79E98C1989F98C198C8FD0BFF52F8F8A8FD06FF52 +%F8F827FD04FF7DFD07F827FFFFF8F8F8FFFFFFA8F8F827FFFF27FD04F87D +%FD09FF7DF8F852FD05FFA8F8F852FF27F8F8A87DF8F8A8FFFF52FD05F8FF +%CA98C19FC19EC19FC19EC19FC19EC1CFFD05FF9FC19FC19EC19FC1CAFD0B +%FF27F8F8FD07FF7DF8F87DFD04FF52FD06F852FFFFFF27F827FD04FFF8F8 +%27FD05FF27F8F8FD09FF7DF8F87DFD06FFF8F852FF27F8F8FF7DF8F8FD05 +%FFA827F8F87DCAC198C19EC198C19EC198C19EC198C9FD05FFCF98C19EC1 +%98C0A0FD0CFF52F827A8FD06FF7DF8F852FD04FF7DF8F8527D7DA8FD04FF +%27F8F8A8FFFFA8F8F852FD05FF7DF8F87DFD08FFA8F8F852FD05FFA827F8 +%52FFA8527DFF7DF8F8A8FD05FF7DF8F87DFF9FC19EC19FC19EC19FC19EC1 +%9FC19FFD06FFC998C19FC19FFD0DFF27F8F8FD07FF52F8F87DFD04FF52F8 +%F8A8FD07FF52F8F8A8FFFFA8F8F852FD05FF7DF8F8A8FD08FFA8F8F852FD +%06FFF8F852FD05FF52F8F8A8FD05FFA8F8F852FFC9989F98C1989F98C198 +%9F98C1989EA0FD06FFC998C098CAFD0DFF52F8F8A8FD06FF7DF8F852FD04 +%FF7DF8F87DFD07FF7DF8F852FFFF27F8F87DFFFFA8FFA827F8F8A8FD09FF +%F8F8F8A8FFA87DFFA8F8F852FD05FF7DF8F8A8FFA8FFFFFF27F8F87DFFCF +%C19EC19FC19EC19FC19EC19FC19EC1FD07FFCFC8CFFD0EFF27F8F8FD07FF +%52F8F87DFD04FF52F8F8A8FD08FFF8F8F82727F8F827FFFFFD0427F8F827 +%FD0AFF7DF8F8F827F852FFFFF8F852FD05FF52F8F8FF7DF82727FD04F8A8 +%FFFF9F9E98C19EC198C19EC198C19EC198C9FD17FF27F8F8A8FD06FF52F8 +%F852FD04FF52F8F87DFD08FFA8FD05F827A8FFFF52FD05F8A8FD0BFF52FD +%04F827FFFFF8F852FD05FF52F8F8A87DFD06F87DFFFFFFCF9EC19EC19FC1 +%9EC19FC19EC19FC198CFFD16FF7D7D7DFD07FFA87D52A8FD04FFA87D52FD +%0BFF7D7D7DA8A8FFFFFFA8A87D7D7DFD0EFFA8527D7DA8FFFF7D7D7DFD05 +%FFA85252FFFFA87D7D7DA8A8FD04FFCAC1989F98C1989F98C1989F98C198 +%9E9FFD1FFFA8FD07FFA8FD33FFA8FFFFFFA8FD10FFC9C19EC19FC19EC19F +%C19EC19FC19FC1C2FD70FF9F9F98C19EC198C19EC198C19EC198C19FCACA +%CFFD6CFFC99EC19EC19FC19EC19FC19EC19FC19EC19EC1C9FD6CFFCAC198 +%9F98C1989F98C1989F98C1989F98C0A0FD11FFA8FD05FFA8FD05FFA8FFFF +%FFA8FFA8FFA8FFFFFFA8FFA8FFA8FFA8FFA8FD0BFFA8FD07FFA8FD05FFA8 +%FD05FFA8FD05FFA8FFFFFFA8FD05FFA8FFFFFFA8FFA8FD06FFC9C19EC19F +%C19EC19FC19EC19FC19FC19FFD11FF2727277DFFFF7D27277DFFFF522727 +%7DFF7D27272752FF522752A8522727277D7D272752A8FFFF7DF8FFFFFF52 +%272752FD04FF52272752FFFF7DF8A8FFFFA827277DFF27FF7D27FFFF7DF8 +%A8FFFFFF272727FF7D272727A8FD06FF9F9E98C19EC198C19EC198C19E9F +%98CFFD10FFA8F8A8A8F8FFA827A8A8F8A8A827A8FFF8A8FFFFF8A8FF7DF8 +%FFA8FFFFA8F8FFFF5227FF2752FFFF52F87DFFFF5227FF2752FFFFFF5227 +%FFF87DFF52F87DFFFF2752FFFFA827A8277DFFFF52F87DFFFF2752FFFFFF +%5227FFA8FD08FF9FC19EC19FC19EC19FC19EC19ECAFD12FFF8FFFF27FF7D +%27FFFF527D7D27FFFF5252FFA827A8FF5252FD04FFA827A8FF5252FF7D27 +%FFFF525252FFFF5252FF7D27FFFFFF5252FF5252FF277D52FFFF27A8FFFF +%FF275252FFFFFF277D52FFFF27A8FFFFFF5252FD0AFFC9989F98C1989F98 +%C1989F98C9FD12FFA827522752FF5252FFFF277D5252FFFF2752FFFFF8A8 +%FFA8F8277DFFFFA8F8FFFF5227FF2752FFA827A827FFFF5252FF2752FFFF +%FF5252FFF87DA827A827FFFFF8A8FFFFA8F8F8A8FFFF7D27A827FFFFF8FD +%04FF52F85252FD09FFC998C19FC19EC19FC198C9FD14FFF87D2752FF7D52 +%FFFF52527D52FFFF5252FFA827A8FFFFFF7D277DFFA827A8FF52F8F827FF +%FF5252FF27A8FF52F82752FD04FF52F82752FF7D52FF27FFFF27A8FFFFFF +%F82752FFFF7D52FF27FFFF27FF7DF8A87D27527DFD0AFFC898C19EC198C1 +%98C9FD14FFA827FFFFF8FF7D52FFFF277D7D52FFFF277DFFFFF8FD05FF27 +%52FFFFF8FFFF5252A827FFFF52F827F87DFF5252FD06FF5252FFFFFF27F8 +%27F87DFFF8A8FFFFA8277D27A8FF27F827F87DFFF8A8FF52527D52FD0DFF +%C998C19EC09FCFFD16FFF8FFA827FFA8F8FFA827A8A8F8FFA827A8FFFF27 +%A8FFFFFFA8277DFFA827FFFF5252FF277DFFF8A8FF5252FF2752FD06FF27 +%52FFFFFF27A8FF5252FF5252FFFFFFF8FF5252FF27A8FF5252FF5252FF52 +%7D5252FD0EFFCFA0C8A7FD17FFA827F8277DFFFF7DF82752FFFF7DF82752 +%FFFFFFF8A8FFA8272727FFFFA8F8FFFF5227FF7D27A827FFFF7D27FF5252 +%FD06FF5252FFFFA8F8FFFF7D27FFA827F87DA827FFA827A827FFFF7D27FF +%A827F8277D7DF82727A8FD3FFFA8FD3DFFA8FDFCFFFD85FFFF +%%EndData + +endstream endobj 27 0 obj <>stream +%AI12_CompressedDataxœì½Ù’G’(úN3þîƒÌ¤s»PKn­±k†U£ij1QêÑLßc4’¡ +%‰ú™ûr>cÞúÇ®»‡Ç’ €Ì*PU(fA�ÌÈßÃã³ÿëû—ƒ«ÍëÅ…êG½çÏ>ûl´]Ìv›í_{TÝûzµº½Ùm±êó¾è‰¸áUƒ¯³W|åßÛ›åfýWüM˜_§xÿçÃÅú¿f×Ëuïo›Ýî‹Þç_àO?.w«üøÓúõb=[¯wò ÷Xhf<ÛÁÏò2½”‘Ð=ùW÷¾ÿ†®˜­�ÝÜ,ÿ€ßE¢2…•ÃÍíúj¹~;Üüµiï"É{"Ï{"ßÿuùÃâ¦tM_D™† ³¾i +Wgý,oég™¤fÇ›ùíõb½û~»™/nnF›Õf{ó×ÞèÃlÝûfö~™õþc±Zm~ë W³ù/á=ÓÍz×¾|7Û..†›Õþøó÷ooW³mxý·‹ÅÕâªá]ƒ¯ãWÓåj¾žízÂ|ðµ�¯†·ËÕÕ··×¯|•SµzE]ÿéú ÝÇÏTŸ¾úúª^.v; <—¦í‡¯†á€¡–ÊçÿøྀnY¬ÿ÷¶åíæ=Váݽ‹,îI‘ô"þñÇÅõûL%Á\GQ?î](z ¿Ø‹a@tᅄɈ“&CI˜Ÿ$’½Xè~çIOjE5|“Ÿ¢Å¯ËÅoí}»Y/Bƒíî¥Á �3ÿóO?ܮ۟ÖKvBu¹�Ñ7›«Å +îðMLW3 áÿç+~œmß.v€_›ÕíŽ@æžÓðböa�8#ø!ß½_¬Üü�ºz!aâbX01ü/ad‰ê ™2fô�Á×È=Yøÿ¹}l ›²Iqú¾‡ýn»|»\ÿ&$áΤ¯¾Ú.¯üL§²—™ÿh0ý,xåöÅ}ìv‹µ Ùè›g¢þ7/ñÁ“õÕhs�“qCkr]DZmÞò¯þ ýMܾþìÏŸ©üò¿o7»Å ´¸ZôòäòívöëFŸ]Nn·›žPQpÅëÙÍâò LÖrmj¯^›:XŠË÷7KxüåÕìíÛÅ–ßà÷Ëùr ˜òfµøýòýb»{·¹½™­¯._ÎgÛÍúò-¬j{µx³»ünÈ›¶±Ú£ÏÕw;÷HºÔ~1?½¾…ÚÝåb}5»yw¹¸¦·,ÈÅ%Ï«.hì¦ôPsófqyµ²Ä p"¿ü�«åb #¾é]Þ¼ŸÍ‰¾œßn·‹õü|I._o7°_#IIvi¯¿œoÞà6·Wo@|—k¸=•—ÿå|¶Zov—ï>¼·X_na*n`h‹«ËëÙ»`…Iº|î¼½¹Üý¶¹¹ -7ÛËÝ»íbá¾Íæ·»Ååõ-`¬º¤º«9Ì?µ6_\-W«´+ÒݺžÝÌoWÔ£,Ãÿûv¶…{ðã»Ùê�yWÞe–—Âhj`ž8fs`à;p£à.“ËwárB·_NèfheÜ>q÷}m®úÚ<âëàš¯Ý5“Ý»Ëoé�ÐÌwæ†ïÌ ß7|gúô�»ïúvµ[¾_}¸üîf…8ñ“ÐOææŸ‚›rwý‡ùñÇw›-` ’Þ5 ÚÍåÌzÿ>Û¾oòˆïW³5À•~°OÛí}�„löËnùkïz¶"0¼XWú~`mô _ïœt]S|Ú¡ ‚Ÿ=j¶{2(0ž×ú™)Ìàíúmb4s}“æ_~¸~½Y-o®]ãa�ûܰ§ÖõwkÓåííÍ»Þ�›ÍʵüÍ-²£÷ËõÍbUê5Hcæ¾Gõ wqÝC†@ùÎâ£O@ˆß¿[Îëžò7þýÍrQû°=÷7®9MUÝS_¾_ü±œ­jŸX½í= Áþf¹¾‚[ˆhº‡`³($¿]Ü,vì€T¡Ã7Lƒ|ó1Rû�ž_\¦ô"ï ×á%_mQXï@áþv±Y£@pñ÷åÛ5Èð xFM%*ioxEâyÔOÓ8Í4}Š£(NñSœ«\Ò§<AŽ~�R ú Ó(ÎéS¬sÔÖtï³WC`sÿòüÙ(¥£|4 Gã±Çãd<ÃÇñd"'j¢¡¤“ Êp2 2šŒ¡L§9ÕPâiB…ÞŸ?ƒ÷xšBIøÿkL% þ�ù7ó]Ó'=UÔ®¢tw*àIž‡¯Ÿ=™B™ÐkL¯1ô Ë�^¦§9—ŒF�BI ÄÐqᙢ"¡(Ñ$O©`ƒæo4Òk@%§’QIRXb,ÏŸ�5EERT¢q4šR1�Ìß�Ê �%ƒ9À’P‰Gz3ÿ+(Š€ §P&ñ¹u8¨äP²a +%ôÿšU¼ïâw¸—ZüA­„߯ø Ú@«CúD-Ýÿ´š³†ñPÁK%¼ÔP ¦ð)Lð5AGð5€ÿƒ|�Ñÿé ¦—$ðRA¯_9È‰Ê ¼†ôÊóŒ^IÓKÑKæ¾²)¼&ô!½rz¥Y¯8ә̼ÕáÿPn S=€ŒÒAš§išÁ+IqÙèT¦*iD(9`�á5Hà‘I–$I +/�ÈDÁ+J E@ÇI<‚ Ń8‹ó8�xűŽe¬bGqˆ4ÖC˜²�Ît®S�hüSZèHG€`ˆ#5PZ€Tª y¥•RB 9EätÊXÃ-c©¡()e$…Œì¬æ)A(�÷”Þ“\sAXI‚—ÈE6åbPuÈeP˳  –äk ~ÊÀ/‹z;„Þ ‡ðË.08€BÐÀÔ8Aijçφ$$%I(1.<„# À2�±Í„ ©šžQ„éP€Xå×”à +\‡`;uÐ|*ÇÎÁƒc¼È@XEce\JççÏP0`iü( /@h± #”;…EDD~`I¡ "€c„Ý�& 4þ³³J4 ©RŸ1Ñš è +R¤cXì9ІV.®g\©°"i=Ò +Â4äÕë+ŸÒÊñj¢5kg³ŸÁiZ#XC^1¬ As9¤9Œiž-œ' *0G +0Þâú€fñ\"–Ó,àä€J)A_)É�¨¼SÂnÄks`!Ždr$€(Ä¡+sh– ŽÁ}�©Œ ø�’™y€9H©²!QQT$Q*Gç§ù\VgU¨ È=eß_¥«Ú¥.O÷”Éž2®-ÃŒoT)Ã=e°§äa�ý·lOI÷”¤®@‹ñž¢÷µ§iÂ~r¥Ü%ü°³ +BøM@ÁKÍ¢\E*‘ö"ÍÈ ›‡€ÕˆÛÄr¢ãø§ˆ²Ç°p5dD‹�ò‰:��JÁš�î"ÚHXEHÇbâ)ò(Xg(ŒIx™Â�q±H¢‹Z-‚u™Àê̈ ˆŠŽ`Õ"U�èñ.Äÿ�ŸeÄÛ€€m‘@3� '@$1√¨zBŒ JL(ƈxèù)L¢ÀA FrÏEî‹ìj@üxD¼x:T@`!ïÆ®ÆYBü<#5 ~5Þ…¢ç”J%Ch’â…(3 Pš7"ál’O 1è¡ÆAAWS�I2 ’ø‡² +Šs7«f>…›K3“¹›Å‰›Aåf/£™ÚY£933sàæËÌÖØÍ”4³Ä3dæÇÌÎÔÍŒv³’Û +lfD¸¹HÜ< íð (ýÌAán`n ޼ßÂ{à`=up6PN„G¶ÂÁÕ@5·}þ xш…¾¤íb R˜ÈäÈ!H–c�5§@d ºé6&Ý#cícœn2šÂò =+à(U' Œd0±’ÃA+O�¬ ÖMbà�(Ûç íI3�€f5ÐpP<ÆAÑ®¨ HWOú¦\ŒZ�ãÃxG$ñIê�¼›“ä› HpÐ!ìC å_,ˆ•‚$à)£ Œ™c�ÎØHN¼;e)/¦¢ ÷‘› "®(ÝMHº‘d7 É.#©8¡ÙÕ$ÙÉ‚d‡²Ýˆe»œd»”e#×É‚\7rrÈt@P2PV¢#ɸ(Ï¥�,'Q–%å…‘]gDl'\F´² °s.$X-�‰oâZ”ôɰŠs;C…A’ƒé·ÁEŸ‰™w /H˜':¯€�áûwãùçÓ¢£x'þûè-ŠÒ7üny7òvûM¹¹Vü¿" €ëç7¿YYÁ`Hì>‡u±{·¿éà]±Ü¯éº°eÓF±ØSÛc’C`&";‚.Ô„¼ˆÆˆÐCBó;°&Xh˜Ó]X°ŸÌé.¬ D€Ìé.¬ Èòæt˜5ÙeAžÉ=“C¡,k0¬Â0ËNHÿ%Lj5m2Ê@ÛÀ|ôóg 7c.*hÔ™:ùÛhŸ$ ’ñG£ÔÄ,±$d°Kˆq¦Ä<3b ¦®Ä�aCÓ˜ +[ÇŒ)еc ‚eÁ+c¼Ò\H +dWÊÅØr.Æ$fÃ�163h‘,rlL›².bè¾äbLo$•Nb.€(N)žË>½Çq¸<6•‹:Rt¹@‹Åšø`IŽàÏÐbz dK^W Eÿmp¤ ‹¥,FUÄÔ*-©Áaz(€¥ ªV]°”ÁÐCªê‚¡D'@èZQR ͈™n¤L;r¶†´tŒê€eÊB.)@ŒØ¦Y‘ˆY¬3"žQ)rV+,šeH +F•žE¨RYD½x +­�q÷#³ÚÇÝ¢aý–Íë@Ìc;#¬qbDÆ cô`S‰&ÙD#ÉØ„ŸŒØiDP+�š‰Y¶,òÙ�¡Ó»78y@;Á@²¨ˆ�":¼Aþ—ë|ËöùÅXs‡â>FüÙ~+‹Ã Ì—� [1Š}"Æ’�ž§H›‹Hw³‡"' -!­L‘6‘&6fýËè^ w�V¦­ÆÅÚÖˆ­èFÏŠYÃÎn>bÍ* ´*¯Sc,êT¡FèSemª K‘õ5gû+Z{4ÙÃ…³†[¸±Ä&Îkìàg�ÍÉkìßÊÙ¿'úˆn£À;KlÄÖo³¤rZf ¡¤"ô -Ú‰cêºäi³Þ6ÁÊiàsó^7SŒpbTà}óþ7S/œ^ª~8Á†OöÅ�eýqã’OnÈbTî|sYÉ?—°0f3Ó Eé|u™S§ìµ›�çÎë¿3Þ‹—;ñ‘¸[.’’Ý¢h­l¡�ÂÎD™©jň‚@qX 9$À„Þ`W ÅbÍa1ª"†• +,hñ� wX Ü'<úoGѲàZk�JYùÈyö½j0auÀª¡PüYä¼+ŠûeAß`YÄ/Š÷¡`oWÛ�}ßæÏ‰óN”/ +ñN€'?{ÆV9S E’„†ìŸq �ñÝ?þÔøõÙÇoüý’#l,@Ì€#eà±¥Q‡b5ÿïc ,ža»’ç èÅ ¸§�ÁP.Iti0A:£È#7 Ÿ\X¶€‚ìûh#¶¶ý1‘½)YõQ 7ö|¤ÑRÁA '¾.H×ÚúŽT~@o¶Ü#7@±Ûø¡‘O Ø?�b7ZæŒ÷Z³7;#7ñ á˜,zÞR�œ Åî”-Å)‰ÝÈÁŒÿ…nÉ*¹$‘ÛxÜsöÀÄÈ?1þyöÕ+öÝ?~Æ~ý!ûù‘ËNLG(Ž H·S¦�â>bå_k¬k +ôNq‚‰IHa%°žäµÿãjB|ˆïðmÔx kKâ'\YðYð;¬7²M ó~AÛˆTFpKÙ9 ²<6VK4áo•,h&ì)ÊÙß\ôY ÊCÎÈà�ó‘oèù36è¤dб&kÔ‰ÈSŽÆlØI¯ÐØx…³„QéÈ×›¼B^±›°[N�gÑ8vê�Uð†VÁ#,<EÏx„lAƦ£ä��ùÇ€Œ (&ŒKK>¡!c,«ù +²‰›øå""’B¤ÈtY}*{½­1´'&dàKŽdÎz=$ƒY¶¡Å1[5"ÒUŒñϘÿ¼pÀF‹9Ѝ{�ù�0ðÄšÿŒñ�MløÓlô8Zƒ +>âbÍ=Í9*ó8ÏÃ$ ˜aTß­§ Õõ Ñ È�Á|��6МJ€jö”Ö|Lë|ˆ*2®i³Ša­æ´Zq*àw—6j‹| ¹V“Ž|iL\¹O<©WŠ÷ytËž_Y˜¥B�ýÌUË>¯t­ÛÌ·‹PË>/y¾§¼ïТÿ¶Ïs_õñ�,žU ùBëË>»Û>` §f—ÿöEC�Avì4·�ó¯%ìU³þ´ÈépF‹³z\Æ«ßúÏ€;ÿÙÄitadTÂz�ÕìDÁs6ªz΀ºiÖódY6&amHÖ"£íÙ¸(ÆE±Ögõ>Òü€[í¯àMcÐj�V4š ÆFiŽ�N4ú ð~Ö ­Vè#¤d!Fjlc¤œ†˜¢Ñ\œÌê„#w†.vÇê‹Vc”&’…µÆq4 +Œ»’¶†¥™Qdfld-Ô IsÜeα–1éu¨ÏEM9&� å0€éf1ic’c%M¤ä-€'µ6�»[Ojmw·€ŒXk¸»EäØZ›Àa‹@AÃùáÉŠBUG4�(‹`oQJGÍ MÑ‹b$öí·#˜0\£(`Ÿq¡£ E"LŠ(fàxpšP É9ÌQS�¨,„8š¥<ä0Q  B)¢NåH£ùÙ¥nJæ‚!M8¤–}1$rD– +‹�–~¸ð'……¿Ï0dPÀ €F QPž …LÙT± ú�dà:Ö£… +,ª¬SzMiY+ +?—¤ž†j)*¡ö!ðEã�É̤•3s� ^¹œ8ß‘pê¥`Eßz}´ <LE¯M(“éžoÕïÆ¸Q¾ú°A¤è/ª1~8¯SÕrØÀQ0^ §±+6�ÞHŸaÈ)‘B»Â¦`:!VZd¤± .6$qÊÁÅ#.&F +¤1!âèŒÑ+QX*¬@X‡cZ…R.ÌkDʆ CÃwLSó¢0äÌ©ÀøShwLᦵ«I}1ïšÕü-IÜ& ýY +Žë›™§¤ �Ý:“‚4tÁ0C^óƒ`ͧ$NkZ÷´ö¡EåÂÈ%ª`è[c?!o› * 4&üY“J‚;*y´ÖQ˜Ï9¸<£5Ž¢>…—à +Çõ�ªÀ€‚ps!P2ÔâšBJo ±#2w hý%Œ¬É€„\ÑcDAÉ9™¢b +MV¨ÅÒÆƒ)9ñ/£í1,‡*�(X9sì–6�y`à˜¬e±° �^�«2Â'åBüGlhO8¬_p@ÿ�CùcÄOse(qf÷îaM0EM®Ò…ë›PæÜ±KË,ÃPfK!)<ß±Éýfsk8·�Ë›Ïkƒ•]¨ÊÑ€å Üø�‹>6„DÆ.úØX“' \ô±!d€:Aà¢� ü=Ià¢[|þ¬iàbb\§ TÇêU¯@Û«h±a!,q¡$…Bb´˜rÉJ%/”A¡ Keä 9�Æ…2)•‚E¾¤¿‡G Êú?U(ºPâRI +%õ…„ã¬TòB˜„OÜìXÅW9SNì j!g¡4r¡ã7Z¸•Ǥœ‘9v}´}1æfL>L†6¤Wº +7�ÊÆ|˜¹ðòÉ�#gHœ��¹@sj®Ù¨hÍŠH€a¨��¬‰‘kf”.zÄ 'Ä#�¹Ñ†¡ÉÇ6æÐç ‰DÆôè��Ú¥Û°tkî6†HœÎæH¢2d’yCº¸¤81É&úÄÆŸ�q²ì¼ùH¦Ck´Š +f*Äì36™xÁÄŒh †5 #ÐÐÑ�²)ÇÕÖ›g +[Y*”ÁI™Ûbi·VG¯uñNÜvÊ�Sê­Zo{«ÚƒršßÈm�ÌX½/+øV½/+ø^½q`6(øÏŸñ6Ä:—�ro厔¶MYµ>Pê)†ÑªôV[4ê<(óÎ5”ÒJUD™`Ó–§ É +F£ÊI^H ¢š¨ƒ¤Yˆ€]D47câf>q†3’ršù”¢_•˜1F±KÞÆ +‡]DZð>ÂþÏ1­Qd#L|ŒŒ }ýÔã˜öüÊ«©ú7>RF‡ +´êtûËàH±.]ÀBÿ¹T²£%­+Тÿ–”‹[M'ŒjF~DÚÀÉ¢š‘{U8aT3Ê­@¹H®2á+ +õ¬¬C-awZ3é7Yq_Ü6+ÐóãÊV+/YŽ•TÁf«êv+Ї4„XÖõ¨] uÊ‘Ó> b\ ˆ°á&p†ãŸ,‰�8Ú™‚ÊÜ›eØ�‡íߢi6œL™7Vy&>é—a°mrà¶J†!”JneªMN§Pók‘wzC˜mðzâ N4±›-.ÉòSÂc²íÓ¿,¿×¿Ê‘ùVû"Ý fÚk_^ÿ +50«ƒY-ÌêavÙÀ…³P( Лˆ52é‚Xœ-±áigÄGLVÿ?Á|ìùóüÛFpzéÐlB1TŒ$`¤‚ÜI +� 152 ÂÈFÞH(î5¡¸×L€þB’ɈlSlA÷2Ê1Û�~Æ-¬jÅRËñ‚r�_²t½�ßúrŒ{;>-î“Ê.t«R(|Ê–ÊŸsçÞ)w¿Óíù³»âîwºqÊ�Ö�¸û�nœòc�ÛÍB†CS'.uÈA¨k?œ†SÂÂŒƒ„0&ˆ4 ¶½jìøœ:§zÕ­î몼Qµ²I5t¯;» Æáí©f®ÊTSö ·«xGûQÝ[ðŽ¹”C­Ædi‘LÑЪb¬ {l N–¹ð¼pÛ½ßtŸÕZE¬E$°†@w+ö*ÞÒÒ"B¡¹ó&„Ûóë-"Öb-!Ö +â²@N4›ôm@òwô¢¬Šó€ÆÙÉ(„'§ÙCâƒóŠƒAóȰp‚ðCÓÄ ÛCDBƒF(Ä=äã# ºÀ…¶O¯Št§HCêö çÁs%ØÛU¿[«è+«Û™UÚ§xûíŠþ»Aj±þÞò1æª�7O8žIEï¼Gn¤À²áÞc<¤yy&d‰ YZÒNÀ˜ü° C=2Ú!Ñ êùIòƒäl6 z†¢TÄ�®Hï)3 +N̉"bã@ÉW­(ðÌ„&¦îŠÖá y±'l‚4—üãÒÀÚµb^‰ ˆ5VDës ++hxçÆný˜×C�gÏÐZߟ ¥Uî^´ÞzuàUŒocBœÅù#IºÎ]8¾�¼/Z4ÞÍ1ð'c©NÅ^P:™:ψ±OŽ8x²¬ëÅœÜÁ§ÓÒ6rº]Ç(§§G‚"÷ÏÕ5f¼o™¬Žœ*er`ÿrèŸ +)³ \dýžµ{ÌL]\Œˆö"ÅEJ;$|™55Ò™£—S‹Ž9 šõ¦…¡ž3r�ÏŠôe¯áLœ†cõô� iæPfÒÎ�fØ8âÐFA¼7¦ðäŒ|¢È­§&Ô˜VSL�Ž)é2¨É D‡�4‘”#¡u: Ä|#ŠÆBvΞ4´Št쓆VQ‚ª“†VqÁ C«pÇûiC«ÈÔ0´*°u 8/,eTZ(EÿUÁ·-Æ%ïWÑ3Vþ+šDŠ9“¦h}re]Ñ›7*”²'0ðB‹ƒ’±ìcL ¥èŸ,ú.Éa-zßfÑóy8WÑõX€¶UnÕ$Øò�A:=“P/åx—˜°ÖƼpÔ™ "��÷ÊFŸ \¢B“f/uqhÚñ¨}‘h62eo$E£ÔÄ¢‘h&mp$ +�ÃO5†œO]j)�VLÆÉúpÝØpTEˆH‘iAâ¾±‰OüºàÔÜá¾Ås‹Ïs#—ÒoâppèÂU ¯Ø“m1ÇbˆÅ;ï“�äh šç„Õ=cÖ̉㎣I�ÎaèEv—¹ £~wã”rZ•Òfó>Çït²éÔ(›ö�I?ï{4†Ö”{“ ΰ¯Œ +·ÅÐmí.Ç�SJS +r*)(¨Â¹êLáSE—3É*¡Û"F f£†‰£�‘R¡$v†L-¥—Ù5�Ãû3ûTôBãLCs æÿƵþ“)b¬š5µ9=±Ezǰv€NÙô8vÎÐ1™$M�œÂ­r2W&…}­¼£•uø¼²vÿjqÏjæf-1yd]ОɪHŒ±ð#§šsNPŒµLÖ®Œ]�±ÍÿI銌¶énH’%G“€áÚ°8áŽë×Ä3O™ÜøèvŸõWçÔ…¼ÙlŸ&@KZ9¹Å”eRrðjιs`Mfµ!DnÆ +!D]®Æö ±ŠTV¸ªA¶ãºPGÿKa¶D¡Ðp¢º µÕN­24ÞäÉÖœ3xZÉLÁ¶¬By +çB3%Ÿª“ÍÒl”¦PerJo�z*¨¡z:)í'óêià„`c÷° ¢îSRC5µ^Q…)–eeÕg\t*ë8ÚD©EQzש¨|³ß�*JÂÆHPœW}|ïc{½öD÷î‹íµSWC*ŽG™ ´ÙÐF+‹‘>E€# úá8é½ñ&ýáreòd%îÞ0CÖÐÇ‚ØÌX.Æ^‡ùõ|Tˆ� ±‘!a½‰‹©¦ÌL($ÍÈ\ÄÀÀ%̰¹ñ8YFMÄHÈZ,c1lÅ3ÃRd°½z@¶nÃH !&BѱCÇB V˜DÞRi7Z' Ƹ¦b«A‚ü6Õ˜Œñ‹å¨ó‘»HÙ1¡"c*G€Ôã=˜T1qsßÂu[Å·r|` ¬doGµÑ!áÚ­¬Þ jƒ Mäãj‹ßë""÷ +¹��$ó¾&ݲA–Þ>“î³gQðX+ƒî��ãÏ;`@&´ônçÃ�Ç�È íÀÒ9lH®„ x'¿só‡Žþa­îž¸S…S`œÛf æ-Ì&åOƒqçÁ¸¼Q>kç‹r­}(@à_Îd탬ŒÄ6P#eŽ�[IJ³´3ÇJ†–PØ—(„fn‰cQ^·Û”ÆÖÊä¥*¶Ci¶K%ÌÀSGôSgI3„ôðÀæ5tÌ`ÈìÞfQ²�„%Ûš³¬™OÄBÈÞ6 r‰™oø›µ¥%l×3¾Ä¤ru²«®eR¦gÌ¢J¹œÂèKÇsØ_}Œ¶‡7'ès?ƒ–㨗¥}àlêt.7̽0åð#¼©<§”ñ¤û$“€,Ø2 lÓýyÌ d}ë(ïވ酄U–Hº)Š`�Š>¦æ6^žà°røIhhH¸V`i¦AWîÛÒÝ¡’÷eé{B…9&ùV-³S¢R©åõ7Md”›–søšëä”}®i�ú� ‘dx#Ò7¿$M ±1ü)�Fø Í†ó–‹¾ÌT0ù'lÓÀ6ÊY° ì9ÝE €„PÊa50‰uýL`B@�Þ¹ìK‘†àT_€ }Bì¬kýDý–8ƒ¦aÝW ªŸ²ÛÕÆM¯@‚ͤp“Š™ö� "DTg6�À¬É¼8mºòTˆ«'hì4«>ˆA'\EÜàaf[Iú(xÞ`¥–N'ÉHh$Sl9ÑIéyMë§è·EÈ�Ÿ¬¿ÅV±Ÿh&´—Û³Ç÷œGþÃæfÖﳞD~…†¥;‚Ü›d°gäL/šöflðžøMÈÏyI(%6g¯²¡ïD“ÑÀFy�8E­ à°øÔùÔFÖ§*·÷¥$¼ÇÕš\Æ•`�r¨*V¥�Ô´c©¸—:<®²¼�Ú¦#Ž9¶=u&8qÆùÑllÙ“Vö¦ÕùÑ +ž4 +¬³§ËýiÞ£fOªÊ ~5ëY¶ñpBî�‰3½óÈ +gŠ-žZeÓÖû³«ø+,¥S¬l)ϸª-ó–1`©‚Ùª°'ºk÷#DAjeHâ–( +yÈ»`}.ž±9ý%È4dÌÖ˜r@ÍÐ…ÓL8œf +j¯MÝmƒO$‡Òh6g$ä94É™�!rd÷Ë�éÌìx¼kFÓA¯&xƇ:ù½fC·Ïl»ÌüMÉ�;™„”~J$ÿüù!]æ�Öywìúò9ÚÙbsøM9ºY²‘S’™Â„BÄ. O†¶œÍŸ9ïO3;^0ŒbĦ9Þ/È;§.@\ŸL1Gœ[³©-‰)¼WÆ‹nK^[û‹õÏ sðÆt:™Ž§#:r#§ƒ1ÞÓ…;¹"—÷ðN çØ{þ̹öÊν¢{/tð9_]X ¬jïèÓ…¢ç‚Vv‡Öí å´Ë@ˆ…ãKkv†©—}ðLÍÞP3g07á¦v¨MÅÜ,¦¾U�iË ‘õ>¶ÞE×s«1áú{cÊUns…±úEΰ;u1÷&êÞFÞÛè{�?pqø¹‹Æ·…:ë0uñùa©ûÓû‹;f.V±Ñï ¬b£s3Ó!¹Û;h±1t6×á£w9û0-v:Ó9‰¹s[V1ÒçsÚ—¼„“ÀÕd¿rñ@]¿c¹‚—D'ÜdÌlŽ›EìÔ|0BCƒ�e q´K Où�^�«el>'} cC¬ 0—Y«x<¨ÅéJ)pÿAº<AÅÈ­JôUºµÎûŠ$ÔÑ�^kí :ˈ„fà”yJw�""A%Aa^Åd� +–€öw·”°_Îßý6ÛþñÏÿy½Ø¾�­ßöþ¸íým¶Þ-PÞÞÿ#tD9黟Ê(3fí$UÝ6Ðá DˆŒ~ÍôI�á�>IPsó)¦m¶Þ”~ºÆ‚Îõls=ÛZÏ6Ö³mõlS=n‰ÍÝåy9]“¬¶Ý«9žûøtô-ž¢<ܓï5ªÿ´^Ï®W½·\Õˆã5µ‡ÜÿR{PI) ÛIýaH©r§ +—ûι&Ið9q¤ä.ï0ÑU5±S¥È)·CÄ&U³©ÑÂ�÷tö�cÁÅÄåÓÌèÔ²Òq«‡ãÎÃÈóà ˲`ŸBiPŽ=·ÛŸëÎâI +±à ±|ЪUuÓšP¿I]²07A*H\ó1™>ÅeìRÚt—v»yqBmÚKs2üÀ¥¾4»,ìN‹±OzIŠ pé�ù•KŒ¤Ýþ MÁ ûS¶ÈY“´•÷_�ªèFkzéÓAûôa#—NÌöyÄ^ãð³OŒŸ&t^Pñ÷aéŸDØ\1¡o"&½dðkÐâнù½úœr4zKê”»ÇQßp›9Í[Ôɲؽ\æŽ,Ø/íQ—>ªÝøç޶äc-3—µ°åÏÛ$ÉnùÛã£+Îÿ]—‰Åïn°yXÂ� Êí4«{&Šö´fu1‹BMgí¡ÍkV“s)T³)ó)T2*¸Àõ“eµ£�Á&;Ú‰rÚ…ÁSÔYgõ%4Œ††PÿW4†vx{"ãĺ@ +g3Ú¢‚¢Û€=§1e++ý‹e”qP8 ­ÛŒdK˜S„7¸R]#{Ú¢ƒZ2Ó;X¸Ó¢é^‹‚ðÃ'•ç|8JQô±H”I—û`äÒ”´A¤ÂddšÒnÏæˆvë§´SEÓQ9H Í�(:®&§ÃPï)º=åxʈŽÿÀH>³sB‡Ç¤&‰9íÀÒnzMIÊÇ&)y¸XyŽÃ¬5!„¹qÃãÜ—ã Œè[†A ñ14Ó‡“_ ÅÐî®”0ÏN˜ƒ&8¨ÑætÃ�Xl´e”У5tG ü‹Ù¯}·#Zêw+“[èŽG´ÔïV6Nœ»ÑR¿ 0¤Õ-5ÆCB4` Ú2¢8!i‰LuF�ð{*XúÚßnMŒI ðFñ'RÀ¶ߪm¸]B¾ywg"ú˜Ü¡ðð»µ`Ÿ‹°¥‚6ß›ƒ`$ðS­¨y—›ï-.©¼^^‚úRP�û'ì¿c4KÁ@TÒ'oŸ­¸tðxI?“µHràª{CE«z¨@}ïÛ6~í$ØŠQLƒ&A°›1”“Ýr‚žèbf½;$?(�òW…eìüÆÖglýÅÅ�/ec”K˜A'k„)3&ŽÄ”3Ú'.£}¸ûtì"1 Ù‘Ä”tÅ@åMTåœöÒ‘"KŒ²Â.fÌfow–û|öšw˜—s˜×e²÷šã†¯n#ã}æš¶De´} 7§àÖ”t’—â¤ÃŠ4ˆs¹�:ááÑ>QFîNr)Y'ö1 ýÙqÓÚT,Œ?°ve‡ÂƒÇËYpÃT,6‹g¤bñçY¬*&d±ª#rsœðX±/Ƈð‚¶Ð¤,1Zìpi{ +bqäÈ養Ó$o2×�äÔ>kcè¨S ú°o»¬å#¥äsÙw z]Vؤtн?›Šéšmê£rÒ£dÍ:(2Þ†«Êå<�óÔÉò7Ÿ—ÁDFQ^Nècc Sg»˜R4“¢MŠÇ šì±Ú厓l6df¤ÈRjÊk8K¸iQQ†ƒœòĆ›´ØpE¼!7¼�¶ïJt4‡0™µùDAÊ–�¹°1×t~4d_,È‘ ²ÏŸµO8pØÐ�°/‡l»�sœ§Ô¤y‰ÞÌé`Â'nëp¢Ã‰':œ8ˆG¢·H3îŒÆmù«Œo(’¼7}Ì‹&Ñg“ˆé曎å oŸƒ½¼©T×lß 7•Ú8 ›•½îÀÑI€ûrüÙSNŠgœð¶ÐçÏ\   ”ã¸BgzÔgTÛ‡)OÜYGø81—GÍŸøaqƒR»L¤9ç(U4Ëfå†ë¶¸I¸š¥·”IVwnvk8ÌÙkW²¶W� g°¼%Øn¹´Á¡>“¯v¡Å`БŸM>Å xj £U˜QŸ±1wÇg26Ú³`™Ù¬�ÃJÖF›ñ0r™Ë‹”�fäa›±q/…(Ј¡ËPX¤œM�döÓŠZjáq¢rÊtYo»�¶#·^‡nÓm^Þx -êš-á>þo|øÐàêÖ[мó›o‡&·…×ãøˆˆ îxµ8Àˆ68¡ù05w”Z!;f˜Í3±Ù<=f8~1vù/«˜!él›ér¼‡w(›ÍÒáÆ>²�‡Ôâ�h”$PŽ@)ÂÊ9˱ÉÌÇÌèܤ˜•�‚Ýtþì$ŒˆÅxØ”)Lx~RF*2¢ÓKø +ŽEüH(ú©�9¯ÄÓ\G;¤ØÔžTB3hÎ)ÉhÆü9%–.ûõÊkà=>@‘�sïÊڤܡ‰Ï£ê²†Ú|¡ã`oÕ€W*-xÊûáøä&,¼�NtzQ*­þŽÛ;E�5³h»jqfм{DÁÖÙ¼AŽ»Gl] ¬³qß) +¶þÌžýQ°�]цÐà(àê…ÃLÚe‰�µHL �d•�d—ˆÉ2‘¡ÉMã˜R|:íp¢Ã‰':œh„…M•­�¹Q_Dù½ÜÁÜB]d¸ À�úZå‡ó‘—ÝͱÝc 'ˆGO²zg6Ô—âÑÝ’ò êøQy–'þ¯.¨ò’*o@ñ[PŠËJÐö¶:ÇŸ?›¨˜§¯.uAÁñGj�wý…‡šxç_Áµ\wÂU˜��œ‚ûθ²»9ÇÃñ Ü@µg1!ŽX@ôY3lî ›ŒA>Å…OFðDÄQÚKj“2øì>©�OG0Ú“„! +R0(2\ØÃ/mÊ…”T—bÒ……Kpê¶9�¿¤½«ŠÓû£Hž1³Èù@€gè#ž$gIÙ(ýîX]HHáSR˜q‡É)—uÐ~KÉÌ’.´”3‘äΙ6p½ÿ”pÌ+¿ç…ûõÜÁÜ*ÅOÅßÃRú”¹ì(P¨�¾—©kË»ý»­KIULhÄIà:$øA‹z’ñJ•ÔÆÂ0Ë lË¡� +øåi6æ:Ë2™Ø–CË2¥_¼·m9´8ÁíÔít»”„à ñ‚O¶àòÚp‚‹BŠ‹R’‹ñxó8ri.Љ.ª©.”;Ý:ª¤ºpÉ.øì¦bº‹j‹ÂyYá‰Y•”˜z®|fÖ�S³Jçf'g±U° pÍÛC‹ggNÏrÖ“Wu”Ü¿=6 JRÉ$d‚5'å(&æ¨Mͱ'9Ç8LÎÁ™Ž,f4KÏq0Aùº I:š¦èØ“¤Ĉ±ÿ¹2 +MXUæDž“™Ì‘Ð@ãMæ ‘9£Ìœý­|”C(±Ý½ Îù¥…ÂÌ2Š@¬¡d Rft˜ƒÏÈÚŽIûœÅÒØ� ­ûJ“²>2RR`d(Kî ÇŠj²'×ÊeA°)C°ô ,+•™l#–ƄˮQ ô„ê1$ÔŸ'êBýÌQqöÔP¨HFA�I­9<áà¤Ò‘àGÃÖ†A(Ò´¶f`¤Ã“]K°*'àrP"re#«Ê£�Q1’Â×Ü9¢>çïØ†ì¹ÃÌLh–?KÔËí~ô¥À,aT˜•pV^+ÅÛÑI9L´’Ò{!µ§”¨†f•’K¸ƒ­Ìpypv«ÍmâŒö„M\xQâËh„Õ#�a®ÏRJY¿…%NyÕ�m€Q ¦%=ÀÒûUSf‡•ÇD•…ÐUu€;,=éøè$ßýãkxVqŒ ›4: +«”2” (Ú1S˜§¢=ÀBY³E ò¶k0�]&¨+ ŽòÁZg;­¹ �³6óÉž¡3vgù ¹ap +�ß2ŽŠçþ�ðiGc:ϧxò�À+Ÿ ^Wl»P[:!¨þ¬ ðÔ ƒIüÑ[>.€0ëÄùÇ-Îj×”"ˆÆ4[#Ð䃘lØ’ TòÁIŽ �)­îpµ¬6 M†ah•“–(ˆäžêYKÕÓ–ÄÁ³–†>øŒ|îaðYõ¼%zæƒÏʧ-Ï8&¸6ðÌ…�M*ag9o¦7árÈÅÃÐÑÁ¾ï{âa!üž-Ý—K&µ\2)};.ÙqÉŽKv\²ã’�”K>.Žô¹ö}¸dZË%Ó.’¹‹dî"™»Hæ.’¹‹dî"™»Hæ.’ùÓrivQ«Nt8ÑáģÉO:’¹>;]öÑB%9•$‡ŽÝ9P²Qh  û«†ªÂw›+‹2e•ÃPÀºÀÀÐÐ�Då�ÅúP8› ® +§Ã¶8ŽMΖ¡paþ±j ÜÀ}f£úéC¿ˆúahÅý¨_£P'Ÿ§©êTtšZó$çV*:y£c9Щdî}�О�=Uš¥D¢5Ù¥L)  ¤zc…´‰‰²42i rGy¶�„� ±‡¥hy-EËïLÑBã£WÎꃿ#Êrh³¢éñE œƒA&Ï=ÁßÊ›÷RÁjfJQ¡ƒõt22l1¸*¤“ªðÉÒÃ0¯¥¥hÅL–1e|Œ«tÍ;-…úÓâS´#"ÚAÂvŒ´Uˆ›�ã Ò 6‰ã¬¸#éó:¯V‰ bi¬’È:b9¬MÒW% UBZŸ¾Ï’פ¦8"[% �rÒDJæqn(S?±éh2·GÁ}zå¼O+*Éü÷ÙÍÍb‹d’?Aq@ ³L +¶ˆÃv%å«VäÜŒ)%[ÂÙ&3Ê^mÒ³ k{�Hðɽ<‰36Ï�#pDÞl lg�h-­DBñÏ[Þs¶¼;[«#ŠÞúf­ÃÖ>œºT·#öû‡bK%Oô!õ©¤@ÙnQß(o僥\öbëv™8׋w¾˜Œzš|ÈdæDžd³e‡Ì€Ìn˜òsHžhRë7eƒ¥á€&P5å�MÛC̶�$=çC%Θ$ÙXŽ/±DOÐíd” ŸQ°Ý{)ç¶[O¦¼½ +õüC.k ô)Zœá9&(›é‹«_oê-ò«ÀÐK*Þ5 Ð…ƒ BÆNˆB>D@ŠÓ Îmr[ ³v6‡¶‡2ê5Iû}Ðþï½’dýçÈÆߤ‰0²^$›Üú)Ã]d~Ùˆ=KbÇaRp›æo#ÞÑ6®ýVú-ŽØ8®}ßׂ}/õ�ûècÇBÕú”I«Ñ¤FíŒjGrÒ�g÷0©Õå¬7³º˜'÷äSN›ø'¿óÇÆA œ?0ã’ú4ÔÀ­ü~ ˜¹œMJmâ¤|¬T˜žÚîòiªMä ÇO¹”ÕnïPîH�% –TXâaɉ +vIhQ:¼Ž†5qOåè§r T9ª°“&ˆŠ’¥"J% +KE<“<—÷Ú”wÜTÓ>wß”öà@‹…½8e–ÂÄ©‰þ]wDÍ>ý;tÜûàŸz›¢Í;[ Ï 7_gÄšOS> ¦º{�騄éÊ€|”(¶¥Ú~߬U©}4m⎠ð”Û™ÿ(ZÕǪ#S#8šÖœ‹fäåȾ›¤ü‰ö Ó‰—’ãlMÌ­-:ˆ»�y_²æO1ïPNè“Ý©Lß±|¾uûT+ΚŠ-ah×E{B^Ћ½æ«kv‡ +:J¨´G´Æº0(DpM¨¥C €6IO{ +t¦°o´rxAx|��¤…y‚9«ì!Ýkœ­7Ïl{, 5h±Õ‘{Mµ.–Z<~(@}<ížCèˆáRTmM&ß8OÑz«òHÐîCÄ"Ç$¶ &àÅ0¯m)U}žõ³4Ñaß´fb]›Eœ˜ìºföïK•Ç šãhµk!R¼*¡|ú¾±4íǰ&®�¦A>.@EYBñ¼q.4…ÑFÀ2kÌÉ1Y1íàL1EŠk%–}©Sn ½gKœïhlnlï@Õ¥6užEtA#ϰf6¥Xô�‚„3xß–>ª… +j^}»Y¿]®wËõÛ‹‹ÐrþòüÙ·ïé7e~û~¶Û-¶ë¿ö>ÿav»[¬ûçÿlß,VhÛ*Vô’~ rjOˆ¾JbÙËb@a‘õÒ¼H’`çoÍ�áçæû¿Áçÿ‚Úßzº÷Mïÿ;ê]=ÇúŸÀßKÍ^uÜtïÖ•žW¬´w¿¨i‘êÖuM\·j¢q§ÖfØßqv Ø"ˆ ˆpu!×"ˆfmg¶G^¤@b\xÀÄAÈêý<ÃFtÜφ8é#;3ýV9ô-=øQ%1�– â~©RIX≿ýE]›Tù&üEiÀsèLáiR⺌‹O+TÚ§ÙÛ_Ե韖Ä} ]ô´8‡E¯Ò"üm…JXì ÈbÊmVŸfáSxu.­ë±­´O+€·Ü¦Z>ô4‘9ÐÉq|ª/¤jñ7u3_xVaü¬B?ë8.0„°>KŠ’d€òRÛ(TZ ±·¿¨k³:gÔ†ÒÅ9;ŽÓvÎ +](·éŸfWta­¥Y?ÕQ“yOe_€ÊRìB¹ÍêÓ +kÍ>í8NÛ§–U¹ÍêÓ +ófŸ¶>¶Ò>­0Eå6«iÛ(`dŒ‘…:ÆÈãØô†¹3è}’äªDe$»HR”Ù¾“‚¦åÄ*x7G� Ad×ÙæÝmNd÷wøørµ3לÈî_°Í ‘½2*>§öš*jÎ:šóý¬£9[lNÌ÷³Å�lÚ¡E¥5Ú�Š—šª<£0 ¨DuRïº5UÀ…ÏþRY +«¸9ñ.·yVÑœx7dò«hN¼kIaCaÂNnsâ½_˜h.(Ù+£âsj¯©®áæ,©VrÎE?K´ª¿r?K:În mXÌ·O«½²f ó¨ ¸oaX@§æ °Üæ]Ømm�íØj¯¬Áý@=IK;Š\½!Ÿ-5åŸñÓóg“çFy…“UÇçwÕ@3óÛp{{óεåϨºõ_<�zh‰íýüÛóg·ø!T0ëÕK£\^¤)P™4Ë ¯.Ò05°™ª¥ª8°$©©77ÖT™×ÔêÌw¤Õúå9å­•.Ž�m OínáHåR’ƒl(qD½È^"£ŒT¿$UZ’ñ'KTœ‘2¥tâ“PÐÚe܉‚þy@ŽÞoÏa 2ÇYM°×I?J3s +H êeXÿ¢\ŸõA׌ A;ûê};¯KMe¢¯3™3¸ý-¶¾Ü®å•.í«Úy]¶¦ PkÇU†C¡ñ}�Ù‡z¸Ag`mä½Ï¿èýüïwDxf,`¦„ŸøîðVöáFÔ3òê¾–¹DÀd}•gšë‘Cæ`…újûvƒG$°ü³¸2…\]Ž£\]‡”DZZ®/·¾kÚ¨t¥Ðö>,Û„}@“º�n)D„XšÓë;O2¬ê¾ŽD^žä&GcöçÒ$§°Ü’8KËý…¯})³¸R_mÿØj)õÚ6®”ŽËÀ†ú‘² ¤½�Ù×yÿܤÕôç~ÀÚ Ð:€QˆÖûG]׫ºÖI¬Næõþq¿ XÉýB™ŒéqPì>S c¸Šû±LòÊ +ª¶s¯É¨y~¹_Eò¶oe7è¯ßë=p?²è\}Ti’¨s}oK :Á|Ö<´Üùb'ƒúB'k;_b]¥Ï$¦�hWÒš o=­Ëò›è Þ7“â„•â2 " ‘f·�aÌ~ËR¤0Ž"¹{öÕ‡¢\Ä�²Ì™#iÐB©ØBšJòDõ/Jõ0n\{Qjg_}ÐÎÚÃæ$”ÀƒÏ÷ˆvžËÊh2\i Ä0%�â$èš©ÌàsP9·ãÐÀ KûA͆•Ô‡yBq +ªM¡Y ¶BlåܱÓáðâpB\³8@ o>ΧU�¥=΃8%ºλ{öÕqÞ>*ëç:ÒUl÷K¥ˆí~i±Úµ³¯þOÁvß»"¶‡õ-�$¦±*!pÚÏ"%«Øžõµ²²4ì  ‹ÈW†ØBÈ¡¥k¶ˆÀ܇¶»‡‡âš­Àá#a{vwl¯×ÓÓLõ…ht¡*“ý˜�HnT«Šˆ~ S}¸<½ož RÄ™ ~méY’ [Ÿé˜é™Ì4WbP·­„‡a¥HcOeœ+SŸ -øbè*ÉÑ Žˆˆ*±Be\‰:ÊÜJ·q)®góùíõ›Ý /þ¢÷¼ôKüÏFðs¡“$2NO÷€p1ܺçƒ/™&65C…ú(KÜÄ +‚t ˜v•‰‘cŒ–áÄö“À˜2é&Vqe¬âÄM¬!P©³,˜Ø,µõ‰ˆÝÄꜛå>ÐÔ¦Âô SåÜa©ÜÄJ;`¥ã^->ÎÄ*î +yþ”©•ʰÇ4˜pjc[´Á-ÏŒ+µˆ\e’0ã…WN­ÊYÍMTæ¦Ö{´�XÀF©­Lµ§V3 */ÜÔZ9Èö�¦–ìЇ\! ¦6ɸñÃ$P£rZœ9ºQ„ÃG™\÷Ü{þgL®6OdÂL®dV,qϵ�ܘ+‰¬ÙÉ•©aï@XU8¹¦6Îrm§V¦,ÑäÀÜÔjæZÁ¬ +S…45µ˜fVçä‡Ó¬ZÙ‚hj0«’‡œÅÏjjÇ”)‡YE|œYµÃ&ªü±gÛX1×"qÆ«.iÂL2‰•b™I¦9ó=š«L’ÄTƸ@œ e—¬†)”Vòƒ%›š¤ÐtÁ}ˆ2Í•¹�8‹¹^G PÂË$Wº>@e®mb� »d¡ÃileGK6Òʈ%8œ|rñü\è$öüϘ\ÆØ¸(%ÂÉ•¶ ä&7aÞG2™�\#%'ýT9 †&W°ò/…�Z^3©“_hjc¾ŽÌ?ÁÔJ[¯œœž§¹mÔö§V¤Üƒ4UáÔ*æÊ*Šl ¶q?�¤EŽ>ÊÔJ+7¤Øó?ejSkš^<p&93J¢–vj%Wê,r•IÄ–c’™ýÔêŒÕ­´ŸÜØêvÊ €ñØJ­Ó`rYo€ú8Õnr ™€f Ÿ¤µœe¦Ž¨p0·Âª[2Ñnn-'Ëx->ÎÜÚçæ™‰ ø¸s‹þ?Éd6‰Q1ª,!£y¸g*En±qref”9¸'VN=†úÔP¹R|qG\©e–²rÉ”Åf­…[ø G1cºŽ;’~n¬ýÔõض@Ê•éCž'¾…°‘Ez©¬‚ «† u*Ûl §Ÿ\xD±Œ³S÷£On’3´s•ÇáäJ[œÓM®œU$\e¦XFFü '׊Ã2NÝäj+'±Vnr5Óƒ$Éâpr¥½8Íí¹ e(Ÿ ʬôö–8Žy‘¦ Û'ˆ9óV¢b3LbHîÜ™g”¬ˆŒ˜ŠÍŠÈªPyf[¢Ê•±Ž*kÐî-.Å’I8(Ÿ‰`�Æõ*Smû Ôg‰í0î[1•”_É -×¶²‡ÓO.<‚Çž¸0„�4¹‡¬xw Ì‘ùñåß¿š.WÐÔóg—î3vøòço^|»¹ZÐçâXüôeïó߯Wkøñ:¸]¾¾Ý-nhT’í¬|ÍüÝruµ]˜qËÞå×ë�ÿÿÛ}x¿ ?|ýjðúíâÍj6·[üm¶Þ-¾Yî^Îß! Ö¯õ§õr÷X؆íü:[ÝrCË«þá5hô¤K ƒxÑ_h¤BGŸ5Í»Åòí»ÝáËÃ�Ùëjp²Åà>4ׇ3Òï͇ôû™ ào˫ݻæÃâËÿÒ¬ÿ�� ½^ÝnCf»¸¹]µXœöú‡šö—›Ûí|1X½7kNN×ÍÇ·\?ÜØtãÝì®Æ‹_—Ì�›Ž­xWCìÞ7qh(õÜ+À›ÅW³Û››ål=<Š­ÁÏÌ#Ÿ´«„õê)k‹µà~WÈþ6oÞÜ,vÇ1íŒéb+¢‚ø�¤â;š¾s&+”hQë™oV›í_{·Ü-Zû«#W©<]þPˆxó~1ÿîöÈlu íqIqsd¼Ý¾™Í/ç³V8Y¸ëÁT†æ£$¾]Ͷ£Íúfz|‹‘Vî|°ÑF­‡;ùýýf½¸Ëpý�gª4�† �!öGsýñ€j¿h5¨3±eÄmÆÔÚ˜ñ�‚Î÷›åz÷¢•µì/¯7/ym¿`á地»™ dî-;™ë±Œï\Ä®cý †´y¿ØÎv›æ¦’àŽ¦j£ÍõûÍÍQ�çq�æ²ã/-¨Æ/H4šóÐ_ŽX„ +#Òç ßÿ¢ZŒH�Å|aDâœHù¹0áÕr÷ýlyLy:c.ld¨¯¶³÷ï–ó'Ç‹gÛåîÝõb×bhOn5/��¥ßÁ+pf†óoÛ· „ë9K^­éê§0Iµ3� #ãÕ¸—ãśޗÏÏ < O*,zÂ�`O. ìé�µA¿;�=Œtòú¿óÝps»¾‚n7G&¤B<áÚÝMóÑnjÈ�ÝÝn_ß®ëysߺ¹¹)�Ü£lxOV¹Äóîõìf1Ý.þûæºå-ÝöPC=bÐƹ¾½þn¾›ýºh±�Ã{j„ëÍËÝr7?Bl !.xù�ËU›‘nz`!þdž¤çq«Z­(ÌùXæž¶áªs"uÊé •ÓæÑ¿�rÚ)§�rÚ)§�rÚdo¶3ËWßn–7�zz†êis£íyk§Íù§�vÚé£%0�vÚi§�vz¼g£�ŽïÖ‹õ«#�{wTOÏQ l <£÷¶ë²×wñcŒîj¹šµØýyÆTñ›Íöý»Íjó¶¹ܑŻ‘Ť#‹<¾æ�èÈbG;²ø4Éâd»¹Z.¶�ÀØ ŒgO€Ëaì㉠c'2v"cG;ÂØF"Œ_ÍnÿùÿÝÌß-¶ÿ¾XÎßý�ÿ­Û�sŽd²KOÙ-º?iѥݢãñ5‡D·èºE×hÑýëfõÇõìf±½=–Ó鬂=ã'ìy!ž\¸g«!�IÀgì>ŸxÀg»D±W-TŸÀÙOÕZÒ©ogó¸i�úü ÉHwhBÃ=ŠC¶‹«v™SÏ�ðw‡'ë䳓ô§;hô\\ +Ÿ‚øy—1ž‹ÚyΆ�´8ú±;pôñ�èHò…ˆÔ9¨4çràhkÏÜÙ0ãîÀѳæÅÝ�£gÇ“»CÀ?Oîü<ùn*VÇ— _þ3NäíXòÙ±äs4Óß+ø¬ö�tg�?ÕIú¨�9glyòGî4=×ãŒe�»ùSÎCÜøt޼m;Ð�*t0>¢;UèÄóv=ƒæš§39'ö z—ºO®¦ñØéc dµ×?Ôø¿‚»oŽ–�1w¼ƒpf1í?ý¦Á}ÜTæ“Ø…ù”eµ.{ήº‹§—g梹Êp.‰f¾ûtö© +†ÆóO8s„</Zÿqˆ?>åc›Ûkç"�t‘œgCN•Ö|Së¹-µ;Ñ“sYm¢ßbG['ÿ?¦•÷ó›ÅvºÜ>]ПÂãÎÑ·¿›½n”s2ìÊ^s +Aáï--·…›˜Mo×óΙ +=]<ì§½¨÷iaâW&>JLŸI>†!ÒÏpŸþ�ÛÙúæM‹Óráê¸ëv“s²ø˜1>iyøNBÿ¹(¢�ÙçlÈ …OV«?c¡�£zvGrtfÞ�óŽèýHy¢ëýíŸÿónµnÛ„?þsõôS>W¯ÍàÎä\½¸ùˆÎäX½6'vÇêíS8VOô[øÐfWËÛð±×?:´ˆ38“”jO7”ç);^-W³ÙJÏXÓüf³}ÿn³Ú¼mÎÜ¡ªù”ib‹`‚3¡‰O7ܪ£„%|XJøºùn¦s!m‚ØÏ$â»Å,� ü¨±oIÎ?¬ûɧh]z.Äï ̶aUg"-E-ô�óNhÐ<¸Ëgp8ì¹ËgpÚy;’Ô0œ°–g®<ìa+¯›ì 2·ó‰2j1OÇ~pŽ}$°:ôŽÞÍÖëÅêåbµ˜·2qTï|¨Ñšûzï<Úê�ÌÖÆË›÷«Ù|q½Xï¾™½?gÞö„sõø|<½ÊGQøØxøç–®çusC×ÙpøæC:;fØB;/K×I9ôº¹Žz6Ë©ù�În9µ ~g"[¶8óÏÛ2ýØVé›íbñGssô›å±€òR¼×êáæ¿ùbÝmZˆi›‡ÑlõÛìɪHƒv³m;"dnx0)´ùà^/Þ¶!D|ùã§Eo¶›ë+Œ®~°Ö|º®Zdr0?Ô VËõbÖüðùl5ÿfÓbEpÇC q½Y7'ù³ùüöúöxJ8Äðž‡ävAf‡æã¼ºZî–¿¶¥»ã¡ÆØ\p jûð-�¥ñh‹·=¨’4[/¯Û ä_>VGžN®šùŒ\Êž\äR‹Y:; ô©ÚsºÈ¥óô°ÖïùÓ‹\j1¤s£mXՙت¢î,–š�v±K]ìÒŸ9oÍåÅóŠ]š?½Ø¥6ûlb—ZÌSdzœgw±Kõ£íb—#oû”b—Ä'»4z±K-†tv̰‹]zÜÄrþôb—Z éì–S»Ô÷Ð~fΙèœW¸SÊÇ6=mâY»éùÓ§çÉžg×ep­éÈÍàúýò÷Åêæýr±zÕ2ã1‹žqÔ‹›«Þfnh£}·<Ô»Lš­A¶]\oŽ…Û�ièy¨}¶�Ú-Fv>1Í¢'¾”QOÄðԃחðÞ¿„š tnFÑåújñf¹>zŽCa%¾_Ìvã6ÜòP½y�Aë]Èz²þøCÖŠwŸ|¼úc“Ö^5Î�¡Q¼Õ ÎÍ,þ”3„§�}üüHÈS?ànn� ûîö™8cªÒŽœ 9鎵;"ÒÜ.úK ºñË’�æ¦Ñ_Ž8º #Òhnh>¢#‘0…©³˜£#ƒ/ŒHœ›txެøén™¼“Àq.6†ÓY;«âã³*>Ƀ ùýòív±X ÃâËåújùvóå¯ËÍj±ûr»¸úr³�­�y ;scgnìÌ��¹ñt¸Ú\ÎëlŽ�L~YsçÔì�åõíîHÖäÂ\Ù +5“æƒ[¬à[; VpË›¯ÆKR_àJ|áBÐRË_0e8çró~1&²íöŒœ™õ ÄáOÆT!þt[Åc?šÀ.Ûö&Åê�ç0«ÜéÉïïA¬¾Ëpý��%ª³Du–¨ÎuÐ ƒv'c‰b³¤:KTg‰ê,Q�%ª³Du–¨Ö¬òI[¢VÇM3g–ÓÙ×ƾö’•¶§``{ÚÝ?óá]Æx.VÄ.óÌÙ’9@ºÌ3�Dg’y¦E.�3É<Ó:†ül˜ñj¹û~¶¡ãBEŸ5Í»E« 9wýC îBÄÍ×B˜{@Y®Õ�ZHÜ(p Ý[^µ‰æË;óÍÙy�ùæþÑÃÄ�wæ›ó“ѳ'g¾i1¢Î|óØècg¾éÌ7O`ª;óÍ“ž©Î|sžæ›ÈŽ7ó#Úã9o:õ²5ÈÞlgóÝlõífÙbW„¹½)˜ÜÃd€ó–ÆÉ3Ø™ÜbHç&ðÎ?jäÝÃl÷›§ºz=»YL·‹ÿ¾]¬ç-´±Òm5Ò)ÌÖ·×ßÝùµMZœðž‡âzór·Üµà™7tù�ËU›‘n:SÆò„S–Eýæçí6-åæáÆôôÓ°µ Ão¶›ëÈHW?Ô¸žj¶.YÍ » d5Cì2�ýIÆèæÂé'Ÿ€ìc™Ä~¼Ý¾¾]Á<SêSM‹ÔÆâp&:l—)èÏ^éOÔæü÷Åö·åöõbu»~ûêÈŽûs²<‹è ‡ ¶Úy ¶Й„ ¶A¿.dð‰ûtv …Ä3õèàðž¬$êGŸŠ» ydZç-8µ· ÓO?]ý´ýì4ÔNCýt5Ôæ¬¸ÓP; µÓP; µÓP»¨Ã§¯£6Ï sÞ*jóqv*j§¢v*j§¢v*êÙ«¨Ÿ ¾Ñ«ÉúÊ©ªTcÕ«o7ëï¡:‰ï‚ë‡xkøËógß¾7íhóãËׯ7+T0oßüñÏÿó•Ë›?Ëù»Åº×»èý}³ýíŸÿg Ýó¨7xþ,êýüÛóg·ô/ê}‡ÿ‰^DåçøíßàÓAÝo=õ¾éýãG½+¸õçž?»º'Uï?eý<‘ ~½€—ýJŸuoWà/ðñ…ýh¯/Å ð®çOpyxAx'_ך‡¼0ø×à*ÓË‘ë/\8|�C3eøgÿóŸÖ8AW½·ÛÙÕr¨�|�?÷µŽD¤á£è'R&’ÁcÿÂȤ§™©¹°_.Ò4½4K£~Ǻ70½Á§‡ø¼Áúù³ÿ…0ïÃeY”À“”ÈÓ(5½êG*–9<¶ã;´ÝÏ¢4Óª÷óŒ�#ð0L-„ ¯ðïÂ~§Ï8ÒGöì¯ÁUé€#i~ÂF‚».Ìå4™ÒOfðÔ‹ðÒ îåÈõ.ŸÚ±‹Þ˜ëµA ó‘Ÿ÷cúB/ÿÍ>[÷ì£áýJÿó%RóMkö'{­¹á¢íÜSÜ£¸3#×Ã4w{2Ø®(s~öêó  *Jó$0#‡ mþa³óI^àöðÞÞ巛݋ùf{³óCç@ÿò‡ÅlõÍ ð;^Ûû|4øú+žÓßl¶×æ7~ˆeƒ«ÍëÅ«Á×ù+èõË݇Õ╾½ ÿ ‘)0"Žl‰8Õ•j`樹 ¹Èr¡kÃ%¤åÒ1 ÿ‰]ï&‹/�uªLǹ"&GZg$ ¡€9T—‘–@�„‘b/ì—‹4‹²~’ÃÃÓ<’ýXFq'wñ™ +ÄIc�Ö‹ˆÀU[gâ´FÎd¶_ Öwˆu�@ŒÏ²q\�ˆµN]_ýH‹Ä(N*‘¥Ê Å:EIo¿P ý6ÂE\/¬Ê~ª2UŠpA˜¯Šó~¢ERŠ›>§,xN–=‹UÖP(†û}xAbZjö ú E”›õSÉÔÈÌH7üoöþ#Â2ˆ• mE=#ò¥£ÌHjØ7‘H2d–å^øqÂ¥„G§8ø”ûàÀ‘ <‹€�§M +ý˜BÏ I õ:ÓûîÄ/°ä2”Ç0|Ü;l÷Xä7 +jtÞH6>™h\ìG#×áG'‰Sü'ĉÓÖ�DÜIÄ�DÜIÄm%âø¤1Ö?´…8v=éäáÓËÀ^„1š˜^ ‚ØwiÄã>ÎÍ6>Jä±ê9¹˜(^!s¾&6ïw�Š#”‹±2Iû2Ò(±EyŒ45µÓCÒiFHbaá%W;Ñ”‹"jnÌÀfŽD"¢ƒâ;RÄôʽ�u ŠZK.IÊ4_wyð°Åƒ‘ ¡t 8jîm "«>t¸ß ¬Ç ßIÊç+)‹§.)oów]E'+w²r'+·—•³ÎzÜIËí¤ek>¾pöã k@¾ðï�™¸`A¾(š�/îaC>4Ö†[cˆÍ€`-ÇÁmq?KD¶ÿ¶X÷3@­Òœ4~Ú°ÕÓ>޵¸ ‘uÂá“o׻ΎÚɆ�lØÉ†íeô“ ;Ù°•lˆ‡ˆ€ï‚m¡á'g,�rþæì©B:sªµ¦š+4¿ßÉœêCBuÖÏ2��h«J„Ý.Á¢[5.ö"4L +@¤�øñ3ÅN$ý(G$0—'µ÷åø1OÍmÂ;k¼û,ï…›Ï.Dì>ËÃÍgÁ…Ç%ݽ{ϰP­ŸQ€mqã™Ùþrcí®¼Ÿ¦*/m<3Û¿„•>eíÍ dÅìX•6€ÝõÁæ©ðT«‡ÝyVûG#÷vÛÎ>ÕmgÓÙ¯›írW#âþ/'æí”:E –P"q±&˜z$òž%l³C2±.‰ÄÀ]’ã…É1‹Í–ƒ¸Ÿ úêꈈ °GªP °Å´¼(¥ +dKF¨íg& È„ÄYAÃ,U¨>13¨È‰Gʾ壶*ï+)�aoC:êu”M‚»áx¦î‹\Ú˜¤<}‡»g¤õ¾D +殢fÒÔ5s+Ý=ïPÒ÷u7•¾»4"ªá]иÓâ¸/:©öй ªØð‚ÀœK_3"©CÇ1R"w<9Íunì(�øÁbdW‚ÑY5¸,ÅëíeØò%?cåi±(;¦Æç¦mZúº Äü4‹é±@Òã¾¢‡£À,„"³`Dü�C¦#¸DÉÌ^BjËEZ¨¶™ zíÚPeÈØ)4–¡ùÉ_Lí'X¡±óPzU¨$æ¶¼Ÿ SeÈHr‚G'Ý…ŒiÚ“Ìfô=Èf ;E�hwNÂØMg +ð}²/bb bºL×h¾&Bj ͤ±iF)ª`L7Ï"‰Þ­‡$‰¡ØÐ_áúKBuCñC¢qkQ8G{à ø€]{ðU¦|TƒFgا-ì¥í-ˆuŒãÍz:ÅwÕNœÂ@µÔ2ýØô;úˆôû_—«7‹2õ6¤{üqé7RISMh-'0ûVÁê„å˜åÚPÀˆþŸÓÊôµå[.ÊÍâ*6X†(®pqr…ûno +î± ÛvíS©+¦'AUéêj{¥'–{TÓë7¤QGH*ì;‚H¡ VÒ*%G 'øÐ#,ä®uåë/ÊmRè-.m¸!CfI4‡+.\ ]N42¸Ï6~áZ·�¾ þ\˜a¥¤9¦V¾Å¶6\y|¹ƒ5ƒ`�÷‘ò*«•"%9íGÆ„ L0W@®4(J±1¦�752L(¨ÁÑasTÂè€ø&’ÎLô7�áa š[Â`‘ýH«œ€òº¤J"“‚ùNRa~J²ÔŠ£Èx«4ê2H2`ýidÐÕ£YPÀÛéQG-ÑVi‚!hßʘ%.@k¡èbdufN„»ŒtÔ{$²JékP£">'|è¤@L…LR�ú8�†'ò˜a4i¢Rª"¡€‡v5줙|W‘!›èÀ]®f(N€E(;V ·46��€s ER÷¡+‚:Œ)�òõn ø�¡x#‘ë"ä`ŒÐÁDD"NÈ ¡4jÜD ж—`¦‘8Õ'À«5=Ig +†ø$Ð^P�rʺ‡w!“"†t?U®�ý7 1gD·Øº,Ó©aváS±†¢}@èE¨Œ x@†è[m 0ÇH©yîAú£‰8‘ †Üä Õ9eRÑ*Ž5-?¤1)ùKú:•I‚–�4Ï“@À +€#Zy¦éIˆ²*¢±&i ˜J›Æ"`•¯Èøæ.S‡ÏH@®Cg[,Ø,ÂCe}š¥‹ÂFFBö6‘äæÃ9�Cº:”ÔÒø0zóbXȾ§(Êx¶¸€�ÈåZ�Ū�dŸÅ5HrMU–º* +67â¾úç¸*î‹kÁv¶2$3ÔSˆ#€þÉ9ËÛl_׉âc‹è9ÜVœp ª€hTÍ" éÄ  µƒµ•‘.dµ%[A"7®ÊÈÁ°ÆümÔ.Û.|'ç+?Iq…e°– B‘,_WWìô ¶A½(– { ¤Ì ½]U;B< ®@™™^‚û´éwþ>'é+CˆºKÒRiñ)#²¾Q•Œ ð^U0ÎTÒƒ¨Uè5]bl¿ÏI¡¾¹Kt© ]|ʨ:b Eö1ÂÁUñ à>¡?n æw‡„ã4lURj")=e„·˜ª®Ša[µƒ´à`ûf«T© Uzʨ:b‡‹r¯Ã:Æö(‰üÐ/j`q�}м¹(ô¢Ü…‘a³ex\”G㚶ý¨‰ë¤»¨ ׋2ìG5ãg°n¡b«ìh]Ó(„¯E˜|Í‚kt©]xŽqùQU[eb›uCåG‡à°Ýóפ¥FÒÂsFÕQ{eåÍ„´�~¬µ6îå $Z4} Œ(æý‡ }ÇÆd�‰Ñ× ˆ¹²%ÈÕà¨Tn$5W÷ãE¢k! Í5×AŒ�|8¬Hæl&BWúÃT» +†Y¦ó$¸C@qôÍp…}ÖœC#°N÷�GÃ5#û¬ÆØgÙ +†3uÈ_Ä]öÍ”Æu £ËF£k �l¿ �ÑÝ�!ž*«å uàÑZ`¨Ä`Y +7wU¸¨%H-)Ñ.¶H¡_ÊŒ[“+Èy§R &ru°ŽóL.7TñãŒVè*5ùhz®-Œ³mÖ?ÐV�o—{eëüP¸™òØNç4h¡sgûƒ5a:%<�¶£áãJ¤$5aŧ12$³Js1Wýÿì½Çv#G²úÖsÎü@ XÞÐÂÓ�IÐ{˜‚!,a¤Q/Þ¯¼Í|Ã]ÍN?ö""³ A°Õ-uKTu£ªÒFF†ËˆH“<€4Ñ‘1žcª ¬À vDæ¼ ¨#\d÷ÌTdÑmÆyÁ»bKå¼ÂÃNŸÓŠˆòAò®ìtNÅÇc¿óN‚š�Õ7¢Û€NºbSnþ€ð-M'@=pyGPæE2ɾ¥x~Óô¾D#&ž{â‘¢l +d̙̎ܕΛ"Ù!v‚çñ� …N§)ç�Ý#·C²— :Ê’A ÛÂ3l"FN�öæJÁæsï456ÇoE®‘k6¹fÌ—™ø²nÀ/EÐäéÜRÕY™ñI0™Fe¿CK Ä<¼4Õ¤sVâ7è•E‡$‚Ãtîš`¿-@&ra·á¼p:*RÈ  ô�²ífPW%æ I]9/ŠdØ£á8ïœ9ðVÆæô�pøˆÈù#ÿ�Q� +pcu{SCÛÜéf:ì(aÁü#ù J¢bzɆ‡åä$ ¡Ë„ÉÄò‡� .Ú"ˆQOaGƒ ®÷!žý1³à#вðB·©ˆ�.&Eòge‚ úÉéûªˆÌøÎ\;$LCå× ¡?©¦!#0ŒaÐXñøìcÖM´™SÎEM…Ú3fŒA?¦ªüñˆ­äŸe›d›Š�ïZÅÈoÇCG0<]…`Æ@pÏ2‡gS1˜ë#±<\w4ŽâA„€›NCÇ]²ÄqF‘€N¨5–!ß!ÓÐlÿf�®ðÙdþOøŒŽÇEv:żÁAUÊ­g"8¹Á gŸF¥Ê¬÷Ì“FBù%P~a’O�dp7u0‘ ¶ø‰¾e¨¯KH 4.ß(윗¨¾ÐDæP!‹ì܆(ʘw-¶e*´xR? +¿¯¥%˜¿E3 ÷LS£IЧ (,ú¦-İ7 Ô2l’‚.D$ÆiDÄÉqJ£3S�]L‰Ë­¦Hr+ˆÉ<©*(ø*õ(G0¸H°Çe�;u�$bâAºªó‹¹`*tâÐ6ŒI•'õNäAÅ3EòæB>R示&°ÕЙönbb›øGFÎÕUe¶JŠ_˜1¾ +E—þøõ_³¶?7‘Ñ=D©àI?¹ê™Ü䮢C'S0ßIr>B1€BMDŠF€蜛IÞ +Iˆ¦Hîš;Y‡7t’‹'�LÝÁÈ:‘Œö$Q3³ˆ„æÈ$¤¶Š‹Á¸C$�©Vt¯sgC@Z:ˆE·¢ (‘£k!Ê;(á©£­éI 2dãQZ"õÏp™ØC.–ä[%’˜K+ž #eàÒdœ“Éz!±ª(¹ê*s«‚ß 1ª*0ü“ubp´}0C‘}0{:Çùêtx-ÙÇRª‚ÎE"I­²Èœ0Ù  |"Úi—Â~ÁÓŒ˜x§ˆNVÇL}¼¶K0EIÖ˜æÆÙ!ˆ.ë×|¥ u'ôg®þt« º‹€¼iN¨ˆ�— ve1PÇbg2`/p8tɇÚhÚ3ÔÓÜ�z#ˆQeöÌþ5¨i•)PøBQX-•|¦AJäáŒaN¢A¾|ìèÃÈg^„x + Ÿ·s£,È*²ÁL]Ü΋b6rqè�¼MPùD©‡Ñ/½ˆ¢±\¤b"Et(^Å*²c*DyÜKœb’òC®ûÌlãé,d{š_¯áùËt¡0z#)ö[ÀH%¬Ÿè”E +T�ÙhEÌE�6VŸŠûU…bjK +$¢ö&"m�õaê¦9ÁS<áSLuÆŽã,ÄÏDâ�¡>Y»ÇjâmY@!‰”¨—Âm/³Œ˜ô*CÂC[ƒ¹“ÎvgÆlhÀ¹¾…|òñÕüyI‰ÇsÌ6¹ÎÜóÐI„y¼9ïÐñŒÎêMÛ+NɸìŸüÀän#ô.LÕ§ºûlwÁ5þR·�¼ oÅ39ÁýYdgS‡Å_¹ãæõÇ&2e«ë쬞eý“AsC‹¼Á“¢†!RªÄõ<Õ%Lã`g¤ó¤é#%È c€¼Ù�ÉMÇEŒší&é4U’Ñ‹G™R¶&Eb–Fr~°óø‡;7îš`çëv6èŨ]n’{ïÌò¼�·ÐŸ÷k°‹%áü~ÁȾÃx¶Í¯ ˜ å¾o">Û'Yqü´Íws}UTÑY.7LäIEú½‚ñ)•†w`ˆ�lßýÃß�òÁÑHVdLSd6c£.ì¤ð(”;Ç-£7â<óŽøÁ½£>d1a�à†:²_p}ŒF㲇ë´2:'¶-ß@Áë£ÌÅ~Ð/P¬u‹€ +ÒSзAqcâ|F ƒ«›¤È‰†HÇö;Š0ÙMEãƒÀuéXNqu9…9õ˜Ë´d¢§–“Õc«`n79©þcP&eDCK©H¬MÓ ~òÇß…1 Õà �â%uÔnM•ò÷`.4�’þããð<ãSc� O¼é™0Yèõ¡‚è¬i”ºïúdáÊ�’æ9@¼co0 �¡Ûcg/mÌÉ�Ÿ%ˤ§cžêYU +�6™AgdH‰ñQf¾Y¾\ Ù§ˆ˜dO¤qÑèµÊœý~Ò8Æ\±šoôË�ßÿ[¬ZoÄ3~eÆt�9bŽJ”l¢ßº¥:jì“�ò-ªáö �yµñ§°óÝ®ÆÚvÃø«N�ÌåWœŠJ¬(5$¨nCö êÇ~°?Ú5¡¢Ý&ëÁ;•)ù{YôúáQZ.7é‚¢MÏ–¬`$;s¬‡�Ý–10×�.pƒ1 j©Êpâd¬®“òú^m¼÷õ›ñè£�Ç¿¦sT›Foüõæ…FŽ!Ç”iT"ü¡Jhšeaoè…LO—Tô8�˜,Ùœ»ødR„%$ƒ>¢í†/>³¨Ù/lf?Ú7»î{˦‚†lc²„ŸìFœ¼çÙ…S=Lî­.SqR¯Ôñìñ^ozFv‡ÄÝRqLºÓ¥Mþõ‘Aéö¨¹Sš]Ÿ.¹²g«{w£ÊžrÔ��µa?ÛÐÕè³Ax‡è�Îøž!ý<†ó¬ ‹�ÄWöñ•g¦ì”Êv ÅÝçÌÐskð<� ­˜Æfê{G yæä¼jÈ�Ý‘@Ö¨û˜ñ>Ú𦋝ö�†ÞdÆaõÖ« YñMSvdÎ\n¶ = ø$wò”Bï­aG€&ì$P‚ ƒòîap�î�’Cpv&‹‡5™…Ëݹ:ó7w_`ˆ S2<û]ÔEφÆå¥‰¡«C{š6¥gÏJäwëÙÕÜ]Û³Í :‡¤7ˆB;Yĉ”hƒ…ñÐÆÃÙ‹³ “ga£ rC`Lx6ÂäMà-ò�ÎcA=Àgoò¹kÀÞ: Áü¬ew!8þ9‹ ±äx˜Ët^ç¼`*žþ*¹ƒyà�â§w èytï°·{ÛëAo½kÂZw—€ë²î’ðñ9KâLÁ]{÷ÛëaÁ» NãPN¼±Q MW=ÂZ (…Šì�iúecÑœW*ºÇ™ +ük?Ó퇰ýÕ®¶«Û=8/0pDãoÏ;CdÎäN3ö &ñû£]}´ û91û 3x¾at0¡ê&¿À ´&ò�Ð|€™–Xø ¡B¢¨* +—T@y2¥I‘õ_}ÝŒ A1¢òE°Ø\û�!2ǰÆÓeÚ/ˆtÛöG»º]Û� N�ýÝ~¥™¡kÂ~¦öí§w»vx´‡°§‹ay‹(ö45Ь4Átß©ºÓKud¿`ÃÐí1²�vu»¶Qì1$ òå¯ É†kÂ~f`” ³¯víðhaOcïf“'F‚ìÝ�4½�£#ykªD�Fá1 +/˜T| ØcË165ª7•1¸¹“)¾Éá‡wìM£«d°`Û€ÄI �oø ­3Ã%§(H½¬"Ì2§ÚÎ=ÎE!ÌøŠ¶?’Û }:@3ð*FHÊÉSÌ|§6Pt¦¥Ðéò‡ûŒMŸx¤¢›‘¡k,Æ/ââr†(¤‰ä‰ú¸`ÚxNÈDMÑ�à!c>›†‹§2—]wñrª¶o\å` ˜2fnmò:&@EAÛ“¼Í9%ÇGwß¾®Å9 zK+ÐP¸¥¡áÓF1ÑÈÄåi»�gRjº2ñŸpÇŒ}¿"x<Às®™ù¾æíq)F—bøM1†ak üW†~1Ý0<ô‹ýqoŠù¡,oÒ76½‰<2MqLoxrB2±Ê<–0¡ )£ö nzãOaç»]™®$³æ÷�ѣιéMæ×á�54ÔÏè(ìšèÈÛäWày¦2…³˜,q“¤›²kzÐqêµ½’‰¾ªdŸV™ ê�ùJf& i"õ”¤Ñ+Ë0*Ï`)K¦V—uæÓ1r™ïG{�UïèIMyQÞä5:°mr‘@Æ6yü#fogÙ¦€a^4»‘!ŽÌnž…çf7ºO /ó…WˆÇÙ/˜TÇì�vÍ÷žBŠjd8<ÔHx¨‹ðØœÊqعßqÄäæL‘9+ºÕ‹T9Ö¥Hˆ—¹8oÛ +HOø™|³ìÚd´gªz÷ëÆSn´�¡Æàžw*‰á™}ÐÜæ¬ hšâ±¸ÑùÛñÙ •©êü93ôì‚ϾݨgÙØ›ÄÐ�œ×ÌÚáâ§÷íh£cýŽ tdœ£ó�¸‹Áž޾ÌL„ä”·ã»ÃŸÙu”#ËÅx5¹­„ ÝÆ_þ+C¿8 +ýâ_\†­H ú¢dò˜™ü{¾}Ï»Ûrý|wìæ¶?%¿LÉ‘Ùý ˜BÑ´1(8Ãevï¨ìýEnˌʜÎ"ÝEælŠoe…;• ØI8ò: =Yx(½c×…sâÏ,±÷+A&¦�¼MŒMÃKΈhQ*¥sòIü*NÖ¹û/ϱÍJò_èvNY¥3L'„�®3ÛäÈG§Öµw«»Y?å~QmhÊ*ŸfxèÿúãnÄœ›cÔŒªøT +ö1°Ž.Û"ùBš?õÁ96ö¶ÔþQ‘]@š¯hÎ Ñ ¢/‰Hù™/‰¡„͘SAÖM†©RĤŒb*¦IR¹`‚©LJ9H· 1–Dvg[†®c-0©¡ N—;ðÌŒ9€ÈdŠyŠ–Y]™!X‘m’¼N@ +Ïèf?ðLc¦¨²ka Mÿ–†`Ö—ª–¢õ¨“Û"2‰òhçÀ$?á^(¤cºd“]Š ˜ŒöÑM"‘ �Rû3ØÊ˜SÓò£¯v†¹nJ˜XCT˜á’î &_h…r{ÆpH=ŠL“g«W4Êâ�‹£8‹‚Y#u•Séñáñ†Âº OUxÂàÓ&ž�ð$°…'Á׳c¹@QÌt»„[rByÌtò ¤!±-(½; ›Lò”â)ÃöúØÍ0¨©Ì¹Ÿ¡úÈçáú#­O�g�cO³ ÝÃSyrBOt±¹w8t½­g´xGúè|ÈèäN˜®g/mh®(¶NÒð„‡Ò»šh1ó)‡Ñ‘V`7qÙIÒ(È +½Ž5Òn|¤üV&²`Ѿ M£¬þ˜ÒƒT;™¾@&u…ÝyC¹v(J¥¨óß&c9ÚIœ4Šd cr ƒåíÕ(W­Èòè0Ç:Œ“§kÒ(í� Ù¿oU4XZ†R¸h¥ìñ�Ð$&Г(™§kòÏe#¸c¤Ôc˜vCA+±Éöø(ü¦ØJtæ¦$ÁPÉ +�v}òQ‚®ðÖ¼q +lâù)]©�6ô­R0 B£4�†®2ë6š¾<1%ŒÜ„Eº¦4š˜¿¡LRû䪆¼ý@ùX8+¾¶Ûø¬Ýb|…NîÛ Óâ˜ûödyIpeÁWl7;íA«äëUóË×l—F„¯w]À'!?óéEövtÀÛ¯ÜÌÑ|t �ß‹O°„Á [�BG&lx?i;Àë‰MOÜÜi}tS0ÈŒn‹ °uUê?¾²ŽÉ\ÕÞñÿË¥ÕA±jµ&[—¿ó5á”B·4ºIÌ?ˆÔEtÑÁ Eäbz!ÌQFáéìFlS‘($�Ü¿‹Œe èF­r‰´ÁäP )­0÷Ûà •ªšÊ^†b2-T5‹D•™‹¹·AlD¡¬]¢„wY°»UØ .ï–´L¼uSë¶ÿºÄ¬«”Ì[’è>P ß:»Gø3¥lÂL$èLoÒ5.¾â(5lßå1‚1~0�  œ¿ha)ßìK‹YÞÇ—Œ½ýø¢1±btÙðí×,Q�±¥#ø‹‡ÂÌøòáÛ�/à¨Q[upÁÖ‚-R¯�÷u „‘ã)b†l؆Xr�0r@7L‡¶ÊÜÑÝ—$æ­˜£=x12T7ì¢#ÍNy[f†g"r¨ Žt·ò�©‹‰Ñ¢"aÝîÇò±ŒØö;Qað ÿkRpÆðò›$�ˆD‘S˜HFÀн¿Ì±Â�dBÊæBáïªÈ(F7`Ú¼¢ +(a–=Ì¶Š£Ã\û9AÊ·ªjšóJÁ4k­Ž$ãæbEÊBªóŒ2EVöuÃt×±Hw=‰¦l0G~1^&Ï|Ô\ïE¼rKÀ[ ðÐ^â�A¯ºQèÙ~BI°»c’Œ÷xPFû ÷Åì(Ûe:K×€Ñü.^�Ë*˜�›¥wÒè’Wv¡,s{ÁÜL,û.ÂŒW”ÙŹ˜>—,x} +q*¿³Sßa&4täG/2tKÂ,4”­]ÆT”êB9tž-Ú^û9A©Ðè§ý +ÓÏ`6 +/ÅýŒ7³+�%ÓM$(/ ÷œÆ”ý—ó;D–®A’íÔÁ  j‚h_Wj°;Àvc Kù‰áØ +:)ÜÕ�2k¿i“g�Çw\9úD×ä!aBaI¥"KîÒŒ._b|E3ï_ð ùQ%ó«½2¾Eô "•!¡õPF„‚B¢JwËx·ñOlE<ÏÞ°! +îÀìVD¤+Ì^ÅQÄ,Þþ¨² �˜¥—ÂÊDò+Ê/ʂȼϤ§zʆ½�„½`MÖsÆÂõS%õAé`�Õ‹À«'…h{#M k•%zr‚p)»D|x•ÑØ#B6¾É•4�Û ‹_ÑÓh Ì´ž ]BÿbmÒü`îä\C�ºãC£‰Î '>�ùÿQê|�èèc�®�*_v²¦ò㬅Áº´Ž†ÏmÜYsnŸY_˜. õ4öv@kîé?ßí±Q3ªÁ=4¿Ä»– Lš£:¨¬Ïœ†ü’ÊÊ#+àG‹†DcŠâß >Aá{À~©ð‹Ÿh¦ßOÞÍ–àÝÝ{Þ­G iž†Ü¼;ÚòΈ¼¤÷¯£þáήіY‚yi‘¦5�ôËiì¡«(+"]¡ø˜ƒ|RAY¡òÓ�ÏÒ¨‰®Â(îOÞ¼t ôÎöuÁE» é¾´Ks·ŒµðBc/j¡½Oõ o6É6ò�½uƒ³ñíÊaC(§Ù;zd̬-�•œô΋ŠÞ·ãéR†…©ˆ§‡ðhÝðXëá±Qp*2aÀ£«‘yƒN€Êïõ´¥tá˜#„ ïÌðÐ/þõÇ=éÇüßxÙ«ï»ÕO7²ßò¯ýn69CrK<ÌCbù³CbyÙo(`cISÄv‹±`9¦YÌ„¨¾E#ºdŽRZ�Ò¾AnQ…6FIîû]ÄgîÂ(æ-‰šÒ|q6=DH‘Ö¥ º—9Óâ¸Ì™?ÚÌY·™³—HÑGÖñG¸ñ÷C•°3˜OF< #Ö� ŒXŸÌˆõ1F¬�1b†<£ŒØûÖeÄú(#¶ea‡Û¢ð0#V'0â7ÞM`Ä<ßù(2ºŒ˜!à(#ö¼õ0bOÝðXëá±QxñÈ€GWã]FÌo‰õ’qt�E·a¼¤Ø}£AŸyï(.ŒélV�®Ý ‹ºgêúÈ^ÔmÙ)k)<Ük‚�…:æ?¦kÁ˜lÒäJ0^iŽùt¦*Á²Œ±Hà-±}ÃÊ&¨GäŽIwEc,–�òü“¶4½º‚g=š1ª´÷øWõnð1NØèžEr�(ü‘‘oºµˆ©ÁØúž)ì·ÀŸluè/g­`U©âÀ·‘°Ó¾b:hAÝkÜ3Ä3´°wÌCÓ{׆òaì¡Ó2[¿aث̴¡"ØGm(2»?jr%<#³]9>ÜÓ¨eZO‹I·OMÀŠI":óÈý;ÉéÈ@13žöS ê*>?·['ÝZ«£ ‡ù{’ß½_þý¯ã}3Ø·“ÆþÎ^$ áS¸£/Þôª¾£|+_±º¾l·duƒï}ô±¯‰|£Qƒ=Ô©ÖŠ¼è9ÌrÍ—ý%ßÝAò�ô#kc…a¯A“«¨“«ŒN7Xùbuæ:gè“öÉnaÖÆûUô)í³6ƪˆCcTͶ`Õ«C­Çó­–Õ…2¬ *Yb†ç +³´[â¨3ÞkÃwR¶j�N­Õ³¾Ã®UëYð%Âqðf¾6�MÑ…¦€?˦$DðX’²Pãe-²/¶ÿïÖzý†E53µlê§DŠêOP½ÿo Ø[ý?wFo`‡3/ñ…?U[70mŸnaú€¿²sïc}KøGóá‰:ÞØ`³­ïÙûÈÌEš5*P2ë^üNÝm3Ö?›³(ì�ï/=a#�á�Ý¿çÏ÷ì]w{×áχ{ÿÖ›e¥Ãá1Z‡¿€[úlñ‹•�âk>ûña!®ès‘?1 JC‰ÏÿÜù½Eqfã´÷Íùúe¶·l¾Sjßêk-¤ÌYPçwÓ}³“(ôþý¯µÃVû×=¡¨Æã1׎aà(ù¬Å@�ûÅr¾¯%¸iºÖxS•D5_kùXöšYaÖx™U×.k½HUÔè„Frý|±þ¡Fâù^­èi�áA®ßm×-_¶\îYÀ�ÄiMö�9h´»ë? ®1(Cˆ@à°Ý꺿XÝ^±Z³ +ƒVeÝ—˜„Så²U‡>ÖÎk}Ö D}5²]> +æÔD�ýV¯†n¸Ž7J²Öë4ò¿±G>×Xc| `>g_äûˆšÈ-JkI«ìÛðýû_¾€gAI&7³ Þölàû†�fîÁ šïö'®Y¢Ý* jýÙV|zSøáÏÔ…qœd.zVê«•-•Øb`7îR|8(nj¾ÿ�d}`J¡g�œ�½ þéŒ7,à\ß ‚kÔž ª™¡ä™“ÛÄÔIA�Ô¬âÃ>R“‰›OÓäO÷¸Æ8¾Ià¤O÷W8oÜì$b§Ñð# +^Ž‹ìK¤Ô`“§}’º¯%uÊ'©û$uŸ¤î“ÔýýI�úIê>IÝ'©ûkI�È\Þ EÅ8gŒOð^ Љå‰ùP>iÞ×Ó<í“æ}Ò¼Oš÷IóþA4Oÿ¤yŸ4ï“æ}Ò¼Í3>iÞ'Íû¤yŸ4ïCó(ÙÏ@ó¾ÉHþ±„óõO¢?ïû>Dý»à÷OÆ&qƒ�§ýfð·DÏ¿p†£HþR÷“X2>9Ü'‡ûÑHÈ'‡ûÓ8Ülé«>™Û'só27¼;úg`nŸ|é‡áK Ë“Ài"þ™žú÷Mzüi.úzó“8õ +ÓØÎnÈ +^ñ€¦XÍ®xý’$I,�ަaØšÛíP(]UÍœbnǸç¿ÐàþónÑOqü/;ŠÀAÊ'"*tw:¦v—™o±"ú·:‹ø["ëßu†å˜?IlÈ'Çü{‰ù?ïûäw²ù Ûáf'¼9ì“§ýˆ<퇲:ý$G*ÿXvÄ8](í)†Á‰äeˆx(k"Ýî’­!É*]‘c»M‰š¢ Ú�«Çý-ÌWߌzK2¥mÖ ��³¼Í’¢Ÿq�ß”äáådß™äM¦Vgt—d¢Ýmyù&Ô*U¬[-_¾Ð…†­–—8M_‰%ˆôù½){ö»oN0?Ðćiíwëÿäí�@ì“ÍH�Ló'1Ãÿ³0UñbtàϺ dAWA“}ÌpNÃ@Ó%U1)‡™Ò?sˆýr³ ˦‚—7:Ú³Nž‰Ÿb×7$t?‰õôŸMè¾YHÎ'…û!ÏÁ4R2e¼}“® ÐME`9‚�è~’¼oIò>3ìüØ$ïÇ;ëùçR®IÔj–Û©~2ú$ŽÝEõ—R¨Ÿ$fðK¡>…²¿i{×9‰„2SÔñÂF¼úI™L¦HÊg”ô7£xÝnþ7_µÝ­}�]žoøî:]9rü9‰à§ýg ©�ñÉón¾Õ+·»ÍoÂ#�ÖjV÷#‡N¼úvü +vþä|îZå†Uìߌ¼Í·Jífí …É/*k š‰v§f9Mðc­v?ß·žÎ€¾æyóx— ÿÚ+æÖÞÓ‰Õ-õµ9œçÛåS:_Ll4iUºïPir¸ÚÐt®é­ÂÇÝ©µNÚ5Þ¹îÇ5Û¿àÀú“‡|94d§ú–©µF�€�]:�ýÝ={ffYÀ¤ŠUÎw VËòå ðï¾ê[¾Ã|«oýãφÕ?÷lø;”ɩx�Põ›@ô¤œ/ùÝà#0Õm˜¶Ë=¶{í›_ZýŽMø¶mÔšر�(Œ§b‚A"«aÈKìƒouMÑÉÿHÄ_NP×ßȃoʤ>%¾w$¾O×àÉ&ó-£�/Ÿ(ãåÚxpDÒÕïšÎhpzðåËo¾£|¯þMHð•U+V]N=#ù™èìžö'`Ó'oúÙ6ü +*¿¤ñ{Xcþñ2y65l«ÞA[kµ@ne·¡~šeþŽLú‡ ?€Yf/’õí6Ú¿¾Ç’ÝvÇ—«æKí_#ùZg2 ÛD_¡ón¾Àë¬mÆÐɇC¡Ñú³ò9TŠ�®mj¡¾+ýß:?ŠðƒÏv·¢D¡]±Zåßÿ¯Û¬U|U«ûK»[±ªm& ü„dôGÓ¦ßcýÎ~£ÚÛ›ù�W(×,vó:z\ÛÍ^Î}Ö}#7½ûޛך÷eÀà}dFXG¬Žµ*›¾MéÍ™ÕÈ#º�·‡-“dìjY=&ˆ;t&YƒÙÓÊx SK—ùn-�óï$iu`?õ²ìÓèôÖ.Zµb»d}ðÈ}xE]ÔÉ«×Ô4Õ6nˆ¢¬K*þPÐíwjp•„ÑUâÇ�[…Q€ŒÍ~Œ“¡c×�ýÕ©<üù‡ ªÞö�±¯Ð ¿¦É²Šh%I²ª¨lòIÑýÉ5MÒñmÄÔðˆÿ»`ÝÌ6Þ¿Ÿ +#Ò÷Ó‚?ÇwbÒÉ8¼âï'søö–w!‚!6sø´%Ïà¹$›A& ‰"9¨Éªi`:1)¢K‚1ìO+g²(ý$‰(Ì¿Nùɰd"fˆA-üt`ûŠþyÍ*ÿ¬Úü§Qô¯°YüutäÛZ¿þüÑc9ýVFÖF¾*º®}DÅ�"À ¹lVmw¿¼¹!– ã� E)¹ <Õÿ({c*[ÉN¾ÆÞ¨ŽàXÊwëC×b¯ËÍ¿ž)€žÅÔ$ ˜úlÖcqÔzüy0ö.É¿ÊÛ‚)=xÉ~®Öì4\²ÿæ–#Ó‚)J +³cºF¦+M4 ÝvL]Ñt{–SƒÆæ,ÚØu4ª?4‡Åؾù”j•bÝ> ±G¯T|õtÜn�€Õ*æïãl²“|ÂÅæqRøÀÀw'ù^Ïê6o­ÖC�`pý�7üáßÿ:)N‚:üþÿÙŸg†WžQƒ_ó°—�¦#¦¢Q(†)j’a:XD¥Ïvã¾³vßéI0¡}…cSMº3€ KNñ]«QpÊkŠ®*ºG’òìþþ¿–SRÕ]fÉ DUVù � c…Äoy·¼)+‚A©ÕP4Ÿ $§|¼‘8åÁ4u“2hºæŒÆSü(_)0ïÔ5ÃÔ š©¤ )›$k”ÓJÐ Múª1¢çf°b®d¬Õ-Ñ”}»[²é‹o)ê0Ì5 WÌP%QdðÄPWíÜ ¢‚îhvS¬çî–d@S²æiJ‡žU�¡Ë†ÁÚb–^Pnœa ·ïv·La´-UaŽ” B7í¶`†’þ†“µ…ãáohLð4&kªF8h2ª,a³‰Ìç¦Q¾ d²(ë²Ó˜ŠÑƷTÓE;MÕeZ4 )o ó‡áÿÑ1:�I1™@&;�A�&‹HЦ$Ëo—AÌÐ9ÿiK$èÚ µ¥Jн C0ERó#À‰¡ƒ·ŠÚH¡8IÇ¥¹mé{sØÆ°½è'ZW%Â[-$:Þ˜JЇ�ßÒ§-C¤`8$e0% §Ð£JTþÂڌ›eá-Òà\Í]ØQ¨�$™ºD-ª&ÅrÁä4…EsÁ;7ÆP‹‚NUÝé‚ÞÍtÕm4Ö‚h/¥3]~hÁZ’g¶¢èiKÓD´ ¨*U‡Z:iõ‚×­�Ký qÛBA¢¢,‰4à­rÒÄŒÙÐ’�TÅÀÝ¡ÚM* }q|’¤¹ÐÃñd’LGA‡G±g‹G4êÐÀDf.ÅÓU•‘!SÕÒ +‚` A6‰x˜¸¾îâÚãÒ I…¦ªØÃ"š¯áM/´ª +ÍK �¥äÃùa‹‚½!dÖ´½!h? Áž +tœì2Iµ)PŠKa|Œ¬Ø[BÀ­ +k„t×U•MjL$ÓŽ!tÉ�MÛT~Â`ï.Ý&¹°|NS2ì#–^4‚T\`Ùu™1KM`˜(óüƒ¼)XªÝ-œ£){X n²Q²ªŠ ë%b‚$h&E52¢æ¬CM$z¦—dš²* zÀ¶•tMá ŒìB€Ìâ0[�i!$Ñ%r’`¨loKšB¬ˆÑqAEƒ(Š�4š‰¿ð‡Ë·LBdƒ6‡Šªbh”‹Pšv?02�èð1]¦­�KÂ)‹‚Hä.�ŠÜs˜ãöu·œ¢h²Áf&P® ñÄgeòöˆÃÏl’/ñ3 ÈÏpÍ Ýƒ=ªLtXU$…v²ª8 ö§ˆha“@¾P#Þ¼aLÛYs±RÍ A€(!â0T¡Íb(!§Cú5'–Q$ï²!õP¨m —ÎJ0c�(…&IèB H‚.Ò†ÂHN‚Ý~À›Öp³‹Äª ɳ€ÐÚÈšFÕtMPh e PÃô0.ÙfÓœû 1.â[‚ t\" j‚*2š¨"q§eéhÐÆd^ÕÄ‘D,&¶ï +$@q`Já†"z¥ÀŠÒJêÜzë°X¾‰aËyÀl"(�]ÃþrŒ ÙÄ:U¦eÔô øpE{ó ŒRóf Â2h{Ëq£"¯ÿ_ÁêVò­ŠïËÀvý}Ï´8¥®ÛňuûØj·ðt'|Y«´P™¡›ñ:C3¸" d†vxÁ7ÇvÖîå}h[Í7fhÍ[š58ËúVë×ßÿ×-[¼ »öçÎÓÚƒ¯3VÅæs�Ý.¼ÿýÿZTN*Õ™GFëát°?Mª¦é +i1Ñ¡“¡3�À¾�dô‡Mº‹$DN�¨‚±J¢HG’@›R…%þOx+9ÿÛB Š*’)Õeš$È#ÆD—Uè!Fé:ÙÖèÞªN{åzÝCTUS!R§¨H�Iˆ1T•‘�BjˆÑ³ÿ‡Ø;þ�ÔÎ¥I ɺÁÙ Ém²Á¤] äT?œ+^FØMKDHI/‚¿Ý¦E�s*ѽˆ†�“`Ë ˜œSiCl�1(Ue{’J؈I +„5™¥0VdÆ@tç*š‘vÓ:ã¨$—è‚„–ôRQGåÚG²“°A¸crŠáüocŽ �ü€$þvUV ý<±²Dzì÷ôâú(sÜ.Yo|ÞðþÓl´ @8ßïwk�g˜ëfü'6ó�zñ”+Vk�å` R¶ÇšýÿêÿÖ±øçÀR«÷ôK¾ÛÛð¤ ò–ý%ß8…ñCï�‚xÔÏËñÑô†zPµÚ-k(5ÚźUš LvÑÕb‚…Z«g™$àLÎêÓlf˜¨·ø·DŠ?q:PfE-_hX3íŒYVú/G$ +ÅA¯ßn~G²ðCÌòc¤oý—Ùg‰e?„éßE×{y<F +ûpvLý3öMóôýXãù{må^ùן½ÿۤרÿ>d\1#¨çÛ>7oÎô¹Ju¦-èý!xX3Ð. ¿;ÁßfšÛo?È´D=" +ÆûËöŸÙvê�2+CŒè†ôþbýZ+aìÏ Sã%ŒéÙÎsoΫÐîƒ<•±Êýl·jíLS¯ôÈD+síA·hÅÑGõÇ�)€ÕýãhZý| „­o0óf¾Ä-&3ᜧô0bû¦/ßíÚùnÉWl7xNC( É†ì²­3‰|ë—|/g'g\||aÕN^Hyiô�«ÛëXä³¾Û­•žì0¯t£Ýî^æ[µ^ì&FĆX_c5‘7�4ò-‹Ü;k�Zÿ·¦g|§õôõp[N©¸;ªõû «kùbƒrã÷ÿë Z•‡ñ ²Ø¾(ú›ŸƒŽ/Ý Wb«ë;éZéÑœ§ÜxòJ8ˆKÏbÛƒMtÛ�X×ʳh€IâØ(� Ü2+¡mþLJê…Cðö{1ŽI«œ4úÃ…ØPObgü•®›¢O7Lq Ϋ!2çÆ¥Q˜Ý‘í„ ÔXÔ|aCõ´hsÞ>cÕ9bµ{5œ }–œ&…Ù+‰c[Ôž*Á‘E5ãÍ=â“|wu4U•Õ·ËŠ*Ûu,GŽ>á’½}õV»Xoú¾J·=èØkâzuc«GV¯ê;Ë÷úV·ö…B}gV¯Ý8Ñ�o6_ƒb€î0f‹ìF#œ[§¬®�<³âo0ŠZÉ×s »€s'( CƒÎú˜Ö;Ã~·}ÌÙÚšÚÞÂâ@h‹v±|çÖú¾T©ÖÏ3j`Ëá.DÆwz&ߪ òËwÒî8kä¸éëä;@zµæ ‘÷ÌnlÿÊŽ~'_ÃŒ&e[~×ë´û£ïò�š-Ièö¸K�ZÄž‹íÿßntƒî¶Ø×o; ⬰=¢ÝF»�oœY�A£7„WJFä{„”y>Ÿ·;oŒ“œäýŽ~ ﱚ&É}‡Èì{Pd ++8s°Uz£Ô¹ËµÇ•Åa±-g5öò}ÀhÈêî'{^ŠóVÙL&„äw¨´·Ä9Ú7°ëQD®ÇöOò]þÛ;I¦1ò°m�=©‡‡Šç`Qév«ß;C =´~›Ú<¶ [ƃ6À†Š]U��tÛåZÃjr¼hªY°JcE¢"‚Gè�JéA£aoÁK¨ +ƒ€¯6™‘tMŸ&]ìzˆÀT1$>™ŽO,ë"ŽKš'ÌvòEw9è Ý�íð›i"•#%¬F#õŸ¾+Ü)êÔÓù¢å†ãO+Ž;`¬´ñæ|.kÖ¯°$ÀÙûùVÑ®`ˆ Š2ÃÖíç6í­¬›3TváDe¬‰™úw›`¤g¨M‡VÄ "ÎÄV&ʸ:z§Ï´¸Ž:¶¶o"¨+hí·JÖrV±Ý*}°RºÖí}òÎ`¿ðN ãp×uqF¸3¡yØÕ·1–Öj¾S +c#ûÌЕiú‡—²L#CTØC]Þ-; u¡‚ÃÔEÒ$ñ­ãì¼ãU ¼9îí²žá¾=2r á�áò ~¸PûVY܉öÀYùÍV±¤G]•ÞêópÙóC�ìȵ7d9§ƒÈ¶ï´Þ±åàö/V·ƒ¾îÁš7¨rDü º|ÿ»M¥Ö\ó×ÚK»±´ájàâ¥hlù†½®|0Vsòˆz§Á^½Ö)ÀrՃӇ׵0‘…éÎ8F[±A×ÊG«ÚU¼#ßptŒÌ#oûýÝ+Á¿¤ì�E׳ѾYKÝ1²7ƒjzi7Óùòå‹ß|Núý+Ës~à`š5ÔL*ûÅýºñKÑîé¾?ºøxÓ* ø±x +Í»ñ¨µËF´TÅjôòá5?–—é1õ\Ü?ÀÇ zŒËÆÆ>fYáóÛâ:>é1fœÊø˜ÃÆ7cÆÉK~·ðñºÙ]ŽÄVáaKÍ�í.Ö�eøµzŒÕS‰Zï| i¨j2rîÁ�°H_Ó «ûŠ�øN=o¿ðGþ2Õ¸T-té‘ÍÆ„±ijÓ-�N”¶¾h·Z§š*œ séÍä ‘3;+r|-|;í-¦Sñ àxHÖï’åå½Åäá@~$¨^úÃ÷©¤ú×*µ-¿Ð<9õ‹=ÝòËóý¿<¸ÐüêÒæ�_[�ôëâS×oD�d¿™VöüëþGÿF±ˆËäßZºÒýÛÛYÿÎåVÅm‰!|}%éOÜÍ?ùSKÝúä5êß[ìÜû÷³�yÿaxógò‹Oþã�Pв¤íûO ±š?·¤ø/„ë ÿåàeÎÝ^MùoŸ¶ªØÍýõ…îÏ Gù�9Yy|��ßË éùÌU}kþäþT™?Ù +ÏßÌ—çÌÎÜ|Tøy«’kοH‡/ÐÍ|ë,Q�ï-Å* sÙ�òÂòj¢²zÜ­.‡/ ªÿ¢¹`Þ?½.lvü ‰¤¸¼°'Ç G¡+uálµ·µpYß]¸_»·±´~"Þ-Ek±t³´«].]×[KçK«[K·§»…¥¼PS–*–z·ÔJ^E–áàÕòRï*¼¶Ö®—•ˇÈòÆéÆýrü°­,ïgs¥å“ûí�å«Z ³ü8¨-—µ›Ðr3³ÿ´Ü¯Gw�.ooù‘²yÐLm=°õbô©ôÆuàhd༕[ +Üßç‹�ÒA'hÄ-Ð�ΗãV1¸–�õLf;¸óØ‹w_“½àI¤^ +^$®‚Ïmÿa°¶}ŽÝ_†º²˜| ­D–îæW´‡äëÊΞR_Ù“¬•Ó¥v~å¦m=®€$t¿R¯=Ü­ôÛOw¡`°ò’ŒöShco®J> åÐñj²º:ºî†òs½ÅÐË‘ õçÎtèf5ð4_•ÒûÇ«›áöÝjª—®­f‹½ùÕ›‡yµø,§V›…úUx®u^‡·Ca}= ÇŽ_¯Â‡�r;|©ÞËáçû«£p=rV *·B$¿;ŠhK…F$Zí`7‘ÃËÀUä2³¹É^ìE­ÆÚÜ�¼¹>;+¬¥yu-1Ø{\Ë®÷åµÛ‹ƒÇ5@Guíõä± ±MA¾˜¯ ;j>-ôOæ…ËJòJ(œÊªÐ‚ŽÅÅý@ºÅãàš¸• VÅý¼p$^´uI,ˆ‰¶ØÚ;¹”_k1IÚZIÛíTC:L<ÞH×+‘] ¤;]zÍÌ/ËÁd®%kJðYN¨Ïò‰?�Ì…¨ü’©ÊÜUV€n”µ~"¤lmêKÊÁMhN¹^Yè+ÖÍBOéÉ =5T_髿•>§î&‹êÅZ6¨ÃA}]]ѵ••øŽfˆÏ{Z:¾–ÓÎÏrOZ¡hh¯æÍ’¾r¯hº,¥‘Ãí>^ë—ÛR]/uÛ+z¯„Ìæ({elîíuŒÃD\1n·7Ž�ÚaôÅœÏF%S²OÌøÒeǸùZ¾}Þ +ïÜ$¶¶WJÁ­ã|µ¸õt¹p¸Õ9PåíÕÝÃîöV²ð°}|¸²¿ýt{„(°Ý©u–vÂáD}gû¸û°“ídNvòéÕäN·“7£kÙݵhL——£¹À¢?ZjÖ;1ÿãC=&çïj±T馻ª\•c/Ëùj|y³þ7OÍøaGèÆã»óñN·‚n‘ã9“2Û‰\¿�(v/“ ׃RRÏ÷’ÙH$ùpU�%;ÏG¹ÔÚÒv-7V‚©‹{,U[iÞ¤—¯^zé�µª™>¶êéB¶ßÛõ¯·vÕ°ñ¸»<Ænv‹G»¯¡`wO0{É“n}ﺚÚÞk®4*û«ç‡Ûû±`ðeÿ⮘Ø1w»Á�t|°m͇rçÕ‡ƒê¥µ}ÈÞõ·n/A÷5�xÖú™€Ñ½Él=I~’É-ÇV2ÕË»—£ è¿<Ú®ÅGç5éè%¾á?é•êqLKÝ_©óÇÇÍÍûd6r”ÞÈ&){77X;¦êË'R5?²¿s?8yê?öOýåÁ©‘nÏ�fÍÀ"tsZiÁ³ÀÚ‰p¶#¿èg—ÆÚÎYóøâ ·f-]äv×Î +¹Çl°s�ç;›ç'ë�ìy¥_.\¬/ç/âw‡ë·¹èéE÷|£~©>n‰—GÕí£ËòRêå*Ï)ÐÍU¬R¾¸º5箺åíÔµ¶÷ðr� 6®+õ£âMèyA¿I>\nî$ãÖŸ¯•o׫™�ÛóÕõöm3Ì܉åÞÊÝ¡\y¼+=¶ïƒ[Eÿ}b±v{_èl?ø"KÐÍÃÆñzááâ4—yhŸ7ôG%¯Í?fý·åÇš¾rñ¹¸H=íDý©x] =•ýÁs¢%ÖŸïúÅüÂ~á>¿½¼ÊßFOrùÁþÉiaãìä¤pYº<)tW +gE㸠Ýs=ñ®Ø>ÜÏ—´ÕÊKé´(tKÍË» ¥ªu²u·‰�³²¼÷Z,g¯®åz9*WdIÞ¯dsKO•z¯í¯Ê§­�êÉZó²Ú¨w»5å>¸Q;½X¿«µŽ3(˜¾h'Åý—Ü}¨ùÒ©ìoÕÍ¥F©~™ŒéõÞK'ߨL��›�h5ç®›ÛÍèf®Ù|”ҭ倹ÜJ-‹÷­âš°Õ^Õ#ýöÁž|Õ®¶7;’��ïœäžž;í�ÿºy5ž·Õ׫ýü\×/G¬n4òpÙ}ZÑw{ÁŲùÿn»j­äªñC_’|/˜ÅGT\ã̤²£�è=xkµ]K†¯Ö"à {ø­RmÐôœ<>x¨³ØþÔ³|¯)… +'ÐB“àš³! �×lDeÙiÛÚ%³ŇíEÞS^V|×Θo•ø±ïè‰éÐ1+«…wHúb]V‹8Çj Ÿ†¦NrÓf1^8Ë-L¹!ÖûÀeµ§A× 1Vzv�±ò†«6ÐÞ³p¹!zá+«°vY+Yíµ£v¡Ö˜àBⵡ Ì¢¦‡ñlÌÊÔë7"%æ²A(Þ11a=^Áã84K¥N© Ÿ­ÙÇÕ)ÍÞ< Xp«ˆN*hoÉN§©5ó+Ò°ÊŽES‰(Ó ÷ÛöÙ¼jÈù�¦»ð!éõ�òÌÍoÔì=´ªXø×¶×æýv¹êh¹‰Æ’Õ«UZ^—iš-²À�ü¦¶I%‰ªÎR0ß+ÔúÍ|ç�²¬Pw‚WÊXñb£)¶[˜ˆ�¦ ‹:äT–¢m¼Õ¥‰Å»¥H»‹´ ÿÞ d “Бü &ëpo£©+ŠÃ8ùN¤:kÁ_¦Œ¯SiÖ#V =fÜ]Tƒm/ÏÒÎR –¯�¹0íá`†óI;ËžG>àõê}søh˜¯µÊí÷ÊáÝ0}ÉØÑѧ�ïö¦™JÐåö˜—„ÌPÚ¥!3ö’�ŠQíÍò˜ö°72òJ»#Ÿ¡°wä3ù$~0<ÑAÏŽœ~¦íîr«)5:Ýr»5• +tz‘â˜;Ê�¤âa—sÕçýcEÿÓ‰tǨI“ŠVf"lP�ӵჸ)Ù‘à”6»¥no„ˆ“Ö‹ÊÙÇ|½©4µ±ÛýêÔ3.OÑbó·igÈÑñ™†$Pˆ 6Í5Õ)|ÚKe EŒ˜o– +y $ÝbÕwÞµj9¡ÇZ«FYo§’Bh¦5Á�wœÁÓ¾·Ø»5LÆa‹¥ÈõröCÃáñMä–(¼½Ë€º•¸²9”Ç©l´Ýaï´önÁi<�•ê4Š£ndã…Š­ÞTØB¡~­áº»¾ÉOzNÆß)…ˆ®½Ë™ºý�4nFë†Wgb¡Þ àÌMžLã?…‰û¬â*-ÓIe˪ä=~çoR^[ïjˆEòEW·FÉs5_²º^ˆ‰ÅFH¸>I6":æ~1‘Ò6jÓ„W(Ñî§ )T¢7 T¢4pµâ™b +FZxgs3?hg#T<ßj9ÎÓ(¨Ø»„ø€s‰v¾*p:»{“Mß}`?—õ‰’¦èai]å>øŽú‹|Å«�LRj ꯮ß×°{DÌ.é›ä* U�©ö«qbuË–SòãþÞnˆ 3ºdGh„7­&çãâ€[f´™1sÓdÛ‹ðV1OgïÙ/&­5ì$™~²æc@Ø +ù~&ÿ›Õ�.RÙ5�Ú­v±Úm7AüµÅbÚÇL+ÊL x¼�k­ �ÃÕg :P&ÊyÞîÝ‘ï£ò+´2A½Y9� +Ê”y{ X£cŸ%ÊC’&‘Â7:ºö^ÝÉðž†&£Õ¸/ÝL°Úíæ›ªés®<¾JïT}sÈyÍǜ߫>ÅÃo†ÚozNª(á|Ù¦À …VŸÛÓÑìxÒnÔYëvòNS3 ‚—Þoƒy…{zŸV‘cªKcõ>4j¼ã…,9û%}­\s�©wž{ +ÃÞ›>jÃ�†î'Ì‹rž “i5¸ÝüÜ å´ß¬ç{P¬Ç4Qß®â‰Ð™¾& +–¶µûYf sÈ +ôÎ ÎÞQœ†(O|ÈôfÙ3«‚`Ÿ¥èy·Öô–�FHÞýŽél´í+ë=ÃÑDÎÍb’BàÂc<èý¶3û;�#¹Œug)½‹„ +dÄóê Yhåk�Y€É†S›êŸël ÀWVTfåQ.¯ðp6I}—%žÑò>ÎHq’V¯_cv{u˜ÖÙSzŸýR?6­š3*zѳˆ�{ã÷ØäD¨}Õ�>ÄwÜÙ§/Žtd�¦ͳ8_ÃMΘ½ú7ÏÂ’5«çëˆ|¥JêlU@yA¡�é­–¯`Õš¾\‡¸»-|„¹zO¶LÍ—oô|ÐM8Ù®“Nñ]ZÝ_­0-_‡z–/åmzÕß�¯>ÖN¯óûñ2¥ZËÛ‰&Gï°û&h:¿´A«tóͦïW¨ý%â‹G|û­$=Á¨1Ñh VÆ×üýÿ0Íh‹µ�ÿè*¿ÿ¯Ñ¯�®ÄGI©,µŠu*À†2h¬:(£Ž<éŠÖ7©Ø­uÞljQÖ|§cÍ"°Úz�& ãHä;,&¸öžTõ¦šãÝ$_aáû÷DçåÃ$ämŠÎÂmÒ0& Ó¿¶AΘ~&ðf½³÷ŽÞ¬÷ŒãͪVª>a“O8r– YvAàîx‚Õ&Lé�ºv´ ¾,ûäu:øšÐàL ÀÞ¢'NɶHì·ê>L•:s¬†²“]º m^m-oä¯Wä¥l8íî6«ë•–ÿ í_ ,'jùHoA»ØKióëÑ‹Ýí#eg=s¿|íŠz:%‹¢¢Ì B/ù’¬¬ + Ñ�ÇÈJtsµÓ‹ö¥5è&º‘ñwíRýxeï4ÝT¬\¢¶µ]LF"Ë•±¾2¥èPO¦×õÛÝ~òå!®Ü†WcÍv¦ÛÏõ«¡mm~�N* Wñ—Æòt“, …‰­-èfY¿<½»��'"—o÷ê-·þݬ§¢ë½H3”\]¤»¥2tCðJ?_I–®tt½¿^/Ç«ýDU¿‡ ò¼”,Š™×èæÎòkÝKDc­âr3´u´±¦7ï·jC1ë¢Ód1yлÈéË–~% ¥õZb-‹,m«V¼¡Ÿ4Ùn2‹ÑÄþæüUjÕTÑõ?¹§Íoë‰öchó²t·.æ¨ÝíÖ"Li[[™Çe¹Ó®´Ó‚j;^jaŽ —¥Œ >Ì%×ò›Kiè¶‹Ýhøá‘Z¡"Ð�P˜ÛWè!´�Þä¿6¯R‡¬|b5õÌZ“n¤}Ààk!´½�Z•’;•-ÞÐÕÖæFéåø‘VÓ1´—�«v7P*~à áÁ‚Ø:ÃR–BïT<ùDàÆPE»Õ^бóäK(Y^;|MåóË q­pqjž,^_IJ‰øI²œ«½F_Ö+ÐM\¹9b½ÕJ·©'1tW®cÙtòåê)Q{ÑÖ6ÊÍÅJ:Q^†ÛϺ~Vj»¹×æa,›Y9L'ƒ¥CÖl +ô;‘ÓÐÎeþ•Mi[3òÑ�óþ\ìü ?ŸÜp=�°ãºë·›ÊÁÊ&0–"u[Z¬HÏ›;I!}• 6Ÿ7ÓIÀ‘•ÕP¼m>Ž®×0p½‹k/CŸ�jo@pÂÙxAu�Ù�=ˆ„7›¡ÎÆs:P>ŒÄ„Íó[)¸ð¸ÉF2 mpfZéÀR'˜¨jgõT(I»ø +ûà¦MÄ&—*!¢Faw5—`róÁD¥šêéÅ‹³˜~+]�®ÃÉ^ãr¨ñ¹ÝTxµ`NZ³n& ›ØùQ)ÄfÛLÆ37õI㥢žr»7z6OJ¤]åh}ú'éàIc#�To¥Ðöî3&Ðv§ó*–Ó©¤ªÇµpö’hODÜ»\¥^“kÏ�•øK¿ÔŒ7Z—íØyõzÚ8 9 tR«íc)½Öïbgåê2T{XŠk¡L•“Î Fži0Þv•‘ÄÔåõžMÑ¡‡Ã‡s9­l]#½N”êUìb±Ø.·;;¿k/�ð&Q7—/`7n�ö�°¯:µôæ®ð�úÛ³•¼,À[<¤[ +ƒT`ëõÊå<#_¡}½´rcŒçÐÆ~¯ ô»8¯ÆÅAã.–{>Hð¯fì9º¹—ˆ@‘çK ™¥¸x;xŠåçŠû• +#Mƒ7Íh·¸¾Ä–Ì»Q×n6w²‰–®æç…ƒþ]T8 4SðW).Š¥ûup³e¯ëmx—�z߉•8ÕÀn¼Eó¼æa ’°k¾À¯ yÂ*ñêv¬!ÖZ' åvÎà×K’á…;¼g€XÊÛuÓL޶á¾Sã ^Jòá°1áè¨uÃfJMâ°‚ñ{Ç[£yQ7X}JΠG{Ílrè@{l6w;žêýì&”ºØ�¿îb^hRÿ�Ǩ ÈÍSHo—�íVc.p±›áÕš¼¾]Œ‘•p»‘ü»6¼`¨¼üݶ ª!ˆ°rî#CBìz|oÍf–e¡9°_v“üëÐ#â­Íè17nýï¼\|‡} n&Á‹M—€aCÄ3k,<®„ žYsº@�8Tâ:m dz[لﶇzÅöX¯×Ûl߸K6¼´ |Ø$+À˜´eøÎÄj¸¼¨J}½ðµÁ÷»HCP¿f“ó`š³ún%¶+‰¯BFZ>a4ÚÓØ{PËÚ¿hJ86W ôÊ„+±óËÃV:ºl�ƒP–¼üÃŒµ€{V2é磛õ´%‚lM° +ë†-„@žIÖ£Wó•Díñ)š*Ö_—oóÈjÿämuÇ+‹„®HÝAmmXã¡¡&+áà“ Oöƒ÷.ÓÒÇ„ùèårÀLTg·ÉÃÃ׸wJñ'+vÖJf£¹Çná߲܇» ‘j±~,4ž6ÃÏéöè×µ¹à(ª—�Tqõ|-®­Ja�j)Æ •¤µ’ÚsE. ¦ .�ÝY�vç•,@EØl¤Ûe&¶�5p­@µp{íèì>†C +dyõö�(/3h.$@ýAåeÍÅD ãä˜b=¤!?Ö] ÆhDº{|.ë\lº>ˆ“„ë‚Êmêo§x�¾mk\{÷Éø¶ = ñÓèÝJütñ¡O¢²p°+ê@åUUû·µÃHrÿEÏ»�CÅ�Ç— ÖÚÓ/™óXöâж)ÃQw$oé ¤Ûš¶âìƒÝxC«Ü‘nݸêÁøP­lr·¾hÁ>;ÝDóG~­öw;sÓ m(ÇÃífÞÐa6—9±Ù�åÑT¯¼ŠÅ³�¬½ð›\�=_±^uåã€t[ŸOTïýë0â§'"0áR�xý(ŠÊIYq6Ê:ê �ñº´åw?88/¬—š —ê`H“ÖâéÍÔ}ÄiEO?>¬Ì§S­nOiÑl ¿VÖî ½˜9ˆŸžDO¤àMó˜up³;=Î]¢Jn¸z‘9˜ÛK‚^N„L'ÒØíe­îH×ööéý[w Ý8˜™Žv»Õ eýèj‡zØv6žQLe3±ïi<Û‰ïÅ•A\W/zþ¡u¸{Œ™‡açùò©Å˜¶–Z�vçöÒ+ÁUH×(@«¥°«³tú)è¯â\åèfá±½: -­WC¹pCó…ÐÝC«ÇL{áäAwå™cÚ8ÞøSÛ¬¨³“‡Z›mKZl‰X"ÙlÞÛɲk§œ¾�=#Ám Úb»œ¨õj™Âw T¤^#MÎ` ð´{êfnocYÜM6¨Èºhø�‘ +oNú±Ã±ÄÖrëð¸”,5ÍUs ÎïÉÄÞ ÁÚÂ"ÃÜGTIÖnkÃ’ Ñï;Rñ9 ÏTP€Ò¯Ž:¹a~Ίê›rÊJ=f O ±l í)SÅ�pSæ)�Â+ƒÉ¼y>º¹s±”ÜoÖîâêåu$vºrR‰��‡0ò}wq÷A�×ÅR×+À0³µ–ܿˬ rFE€Voæ& ß8_ZÈ¥Ÿæ—n’eY¼a,¬&Á‰<. ñ¢²XÌ0ç6Ê ¹ê„^`«g½ThE+{ù®Wç)þ½\è÷�®3°Ì¿ÖϤQ)Œ«ç‘ðзe¿°·»ÉÛpX.Ùu�^ÊåõÚòéÈz«±tòfoeÒä†Ê©’¾ñо»ŸVêrE?.ndGŠlX�Á:ÙÝÖ�+µÔjûV2©Š±œš~ØmöW–±Ü‹ClÆpi¾¼å¨ÊÄ›íz7qœ¸ÜA~öÑõß�Hýz+}õˆ�¼)!¾ÂûéüdÂ:D`£jÚVúuo3ÙȨ®€ÌòqÞŸ,çžÛ‰ÚÜ‚ +ø­dc­íýö$D¢µAÜ˶‹ó¨¼&Ʋë©ÃèF¼ãËùØ6ÑnØ …ŽÆô‡Òq²l>¯¥n­þÒHÍ—îò9È�7±v5»‚@FGŠ¢Ç{wø0¬�}ªloiò$,1ë±ÔyL7ÏHž|J–O{ȤÕàãÝ›O'b•t"Z9Û[Ø÷cæZ=6¹Hlå%zy¾ŸOo&ûžá]žŸ‹®_Y•¨Ñé>‘)sB7))¸Bë¸tR�u®Lþnes·qÔ më»{Èo^o7nœÕ’�j¦zhâ?yYŠ^–ϞƷµƒA2rV +S&(�ä�kséV‚Ý8ûö5&áQD¼ üph –kUëñÙ·¥x!²—$÷{½äj!�Ú .,^F޼ƛÙmuiNç€�ÕoI€Ú@ô”E�áÎ×’åó.èƒB¹éÙŠû½‡çÝÅ´ÿ0Ú�ì'ËíndÞšÀG+A<ºN'Ê;²»�lý%Í·LôJ/\¿ÔI­W“»Û‹È¦Æ,·ÅËÛžÓîF:°_ºBô©ÅuÒÚ|DEbruDç˜H^  µ»qÂÒîK,+ÆeÐÆwêÑÍíμwSÚÒü*­y)ôVoµí %SǧH2Ä ÝP)êcZ:ŸÈ¤æÒ™Vª¨¶ ëp$8^Ë1=w”†u¸9‰µcåÀÝô�·Ú€P%TÖ�B2ðÖó%ÿL[vûùÚ¼µ»½Ð‡í|ÞŠ ÒNúPëYHoºj2º×yµ ¯¶QÐÓ6íÞDtüh‹¡­ƒÛ€€ =Äzt�4 ~ ªáÉ„¾2@Òq¶.ov�¹zmG{A!ÞhtžGô|¦yXy!U6—½ò=oRcb�¼…góxØ#ÄÎÚ™~r5ûZ²¨úÀö¿¡n–RÅ9í47�2ÎöF%�×½³ ©ÓåæÒh÷/š+"M� +Ž€~§"´àØÍAcã*Ê.‡†�áiå¶�`?.@×éȤ®¡§÷«èf#ô +裭åÞÞ€¸—_Ç)ó™Lh»wkº„I'Îj+p¼A æx­6¿¾Ée]»Tú©±¦ÁÔQýº’Š»½>¤‡Ó�ƒðeB¼hö6¬õ¥&Ìú,èízûµIâ%Qè�¢5L:1£Ð©x8‘ßÛÓü�ma£<°º£„¸½’\óÔpΘ sÐÊñ*š9Æsét´Èžœ—ÞGc�4c‚j G€CW)›GvÁ•ÖP7„£©â`î‰åôQQA2àO-+®ÔK%íòâáÒÐw{‰ê]iU°¹èæ©ü˜<<ÜœsÎ�G«¡œ–Î/¥¢ ‘ê§!AZ}-Ñ¿­.wbg õjˆ$篣½àõ\òð@ìŸ�w&QWÛ àäV?àõP4±•¬¨ÚÜæêྦm¿®¤@MZyMo¦‹)Zå�)›†7‹@âNîWŽiW±ó ýÜŸY�¾d`òÍ«!3'Búù +xVGèÅ„ÍãŽÇ�JðŠ/ož'WjkÅÍÕ›ÃxÌXÝÇö–j8ÚµŽœôôíâ¢_ +d¬x1–=ÜÃs×Ê BBÓéð +ën#ÕÆü~ɵÔËb:e¶k©ÇëêОðÍ„òÏÚEöî…›LúþÍÆÓÁþF;UÔ‚jü(¬é­ýÓ)ì£fìS�ŽÒË€Õ ·©ð�Q‰+Wr؃µÇÕJì<Ù[Ñ^ó;[ A@ûÚ‡;tZYÁ4‚…õúVò¡v3ïA7§!Rÿ�5ßjC>MT£¥pr¿‘¸éô~>8Œ¸6'·«m†,èšC#j¨£ª©ÂyJuÉäP×·(Lì•ÈÒmSnM2¿�&- ¥aûÌz*ÿü²kíøOÒÏ� 7Å}òÀ_ÜÚ�?=þÿµ}gwê:Ðî÷³ÿ!$„^lÓI(¡H ¤@H`§“Ðî{ß/÷·_Ù–lÈ:kíClÐH#if43�æ uÖ¼LåzÝg0šI]¶Á‚“寱ÄÐþ +¤Ÿ?•Û{äÊZJf‡¡ÚI( v_( öÒõ¢öRh‚¦ºÞ_O¶[»÷d_oáIô­ }úÑÁÑõÛËöRe™¾GÜ¥BäL¦#Jy–«Ñÿ™œ¬¾–ï¿_“#ÃUÍé´þÊ&’"%�â´ `ÁßÑTEã +ÌŽ½ýüOó]…PPrá ÖS¯Mdžjê0Ç—Y‡Ø>å¥ë?”JI>¢'† +ɧt¨xób¡“p¨ø¶ŒÃORâð"W_\¨ŸÐ‹ƒxñzYÆNã³¹w™ÁãJA}+…ò—©7wàýKr‡ +Ÿð*0wè%2pžþEÝ¡UîÊ>éUÝáDbù¾QMº+�‹ÄBZ­š¬~&ŠgO…x9Ï€�ó}‡\vh�ko…æpR™Ï ÀȨIÍT··åþi¬y<¨ÞÕ¯.�ÄÌí• Ÿ©ÜxܳÖ@âͼ;ó]ÂÑ@åœÞeÝá·÷·¿RŽÂ¿§Ç¥vvQÈ4o£õŸ»ÄMmþp'€Áõ¯ëù£ü‹qp•Hðì¤X3‡‡�w²ôžTÈouóùÁâP ·„Xâ +DëÛ"S_ÞHƒŸO¯0öŠˆô™ÖîüQX‚Æ3«P¡áöjC‡'üØ"ÓHdfàIã ü¼_ÕS}˜?ž<\Щ6Òƒd®5ˆR©<§D-haD5õÞnìÓ©ºýó…¸?§S=»R.h ŠD€ðÂ>‰Ð† ¨&ßü#_¿F§š<„¥WúXwëƒÄ^÷÷ �")Ãêåv‰A5µç™ÎyÕþ@¨ÿ;½2P…d0á†ûÐ+¯©TMéšA5Ó�î +×Oˆ*X‘Ï5ý¼ÞÎV4@8`žZ?~ÿ%ÕÄ�iAu„²LõÜç3PM&¿‡¿ªxAcÂÃùãÛôšAµ4J¥ë‘JuP|ºdQmzâþƒ,:)Ã=t?.öÞ&—tª•@aæùîШ†¾rULF^PÁâ]éŒN5Ñï õ¬pJ¥º[M{.¿¥3U¡þøýãŒá¦öö?§'Õ‘Ð?ÝЩ6„#ßÄŸîkTar»Æäå^¸(SíGü&OùLµöðY×Q½;:鈩MT›˜šºE$@8ýknçþnÄ šÚKŽëÕªp|ÌjTqª¾J¸5Ë•>æ§—TªW¾8“j{rTïaƒp5 ìÒ‡ÛnNNïï~*Õßô•IõêíâéY£ +WšŽpC¸iÿÒ©vâûÝzé0O§ú{¼Ë¤ +ÈÜ »KÖpÏ„Ûb»J§zR¨ ��Tª�gŸ-�*œ=á�~r\gP}È�‹¯�êéÇï÷Y6§Q…s3lE¦ÌáÎ÷¯BnÕ~W¨½S©fN#»îÒc¤¨æf€ŒQB­†é¡Lõ90lžÀ]gDT%_ÁßÔ�µ#<sG�jØ@�í~Ì�Ÿ©.~¼y™ê²2ŒÕý0º`ªå¾ØÒ Åð|Ñ-¸!Õ(ZiF ÕŠ(í,Mr±¹›ÂT‹b;bвáßÄ)Öoå˜o3Rðò‰ýöm4ðiL3áHòÞ½0Þ M‹ûíóÙ¿Ã[‚i©½³Ý—ç&ã癦·yØ]à·ÿ|³¬¡ñnè]1[ÿ‰»93ÓºÏÇWSænª¡Ï9óííþsÌÍ~ûPÍåU¦Q¾ð´?H{˜?ÿXžÿ6™o?o¤ò…á­Žiߟõ€õs𽋃$óí±”(ô˜o™—éóU‡õ¯ÛÛz2ßÖŽNž'Ì·ÇRqW´`Ú‘[òrŒŸ'›B-TF�óÞ†®/Eùm%zhÚžÍë§FðˆüB"|©?£U„±ï¾"‹¢§ý/øöW>{ׇI,…Ê?‹SüI/Ó¤¥D+îÈq¶N¡×ðŸ(|Vw‡«—øÏ­văç;,-d‚£Ë²"ç»’/‘¥;8éí´Â^nØão´GàQˆØ±“ÌÔ»½�³»^@ðß¡Jp/öžAµ[›¯ž¢�ì•©*Ç(t"Ä/I5µ�B÷tª‰þ“*Ð)¢ÑN#‡‹ŽBLªP¾°¨ŽIª‰+¢ +È`™Óò1ܱ׻§QEg•jÜÀax6PÇÚøÒQ ôUÍNS+LÎKLªèlÀ  +ŽŒàl00PEÇ(y¸�´á*L^$ØTáÙ€Iž Þ;M?ÜCwÔŠjÇÇ¤Š U¼=eÂÐиÖMí$«ÐGŸäÉTîÆß<߬¾§:)Àøjjo6¨õÎl›L¾É«O–e0ꇣ�ê$Bvm?ù¿!ƒ. —O¡¾šËrÆ{U2ì}¹ kÿ~ýãkùL�üc€¯…ßÀá/q"8ñ£6 +Ù¦çõ£�mÜW�Õ é¸NLAú…Ú¾üOøäG¦€¬c…‚Ö¼oò¿ø[g��åØÛ¤º¯þsIZÓ²�íLýr’i�~:.†dèt÷<ñBÇ*¨0[õï ùWÏCÕE:-'÷÷Ñ?pYÞŽQ´n}f[´nÉ}®|`Ÿ„%_Q ün"âºô¸*·egŠãá?r÷ññ›2BŸÛz„�Œ:Rëisxµk?‡{êƒÚu§5¼´€]Ûµàÿþh«TUkvü²hM –?êÖ¬GRÀvÙ~Dœ¯/mq©£Áë«ñ0[“ûFÖ“çNc=6ës_*ße�9dÜž~!A¤þ(`–Bƒš^ +Å­¥šÖŒÔZs’‡j§u<ôb)Dgß †8LnOs�µ0þGfŸH O\À~º™Bœ¹=‘�:¸þSÔ_¼xs}bÇîFÛ+‡"¨=©†hãRÔš6$arõÊKÀ$Sk€ÌÍ�ó!… XAàÄ×#ø«îGr¹?¼ w½*cªÂ¿âÈãkjŒ!µ§#ÞlÅýöÊ+ˇ\ÐÈDoMtÔš¡)m÷Éa¢ yŽêŽ6 {÷�v{+U +0&tO wÅ0üç>D„8LkˆI­ÍœR,Ó¼Ê?`V5¶yOƒêE¢®µ³ µODÇÀh– º-PKàyÁfI˜,»1“uƘÈæ�ŠÐM˸ag�ñJ¡ÏÌ}G£LšŠÃšÔ¾ lœû¥¥š‚ÎÎIn@¶4×4ªŒR`ÜP¿Åâ×É�¦‹-ú´,³µçÙ¥Ü#[ô Úzô>©Óÿ�KÀn³kkƒc º?Ý·žFþ9lœš"-Ç­]My;¦ì«Öô +f­aâT}ÔZßú�ãd˜&ko#¦ çÛdš^º9æ¯Ág󔞛N·ËÂbËYíNS6©FŠ­KÕÙR¹÷æ¶6½Íú¦oÏeqw{۳ܛyœ§qd×Ì qé¸C˜ƒœ êïzyÏ&w ˜sUSÛúèc“&LûÆ~ª + ŽS ¡'úžÜyÀÕ�Õ)1­N¶ØÃá1DZ6z�õÚ„>ï{G÷ÜÌœ¿¤e I�‹ç(á +ŸZpí×P`¸?€‰è¶²l¨’„±QZv¶èγáéÖÞ&¢@�pï=.÷­55¯(hD�_€=B¯ü6äÙÐo6 ,/ÕÌÇÞÁ� ÞnciU—bíqÑ0È5ÛŽz2bÝÁx‹;ÒwØ¥Êä—³ÍÎ:} /‡ÃÍ®ã—~³Ç=ÙϘ~§£�®,‹Ã¹½/ +,Þ]NgŠ•ÓáØèÈ5vÇÖ‘KhÏïc½}Ï8:Û;rÁà|†Á餧Gåf:œ8r„ c”±3Ç+½¦^ÃIÃLÒ†¤_ކdÔ²VN"¶Zû>†qâþFN"Èï A(0|;�A)¾Mh/è•0XÚʾ-­Œf6X 6þG…Œ½¥Ý6šÙŽÙ‡æ&w±oÝ#^GD¼ØMûhËB>­9R�m£•¼Þ¾É]8Øm¹ÜÛm¨ñ»±ÛFEh9$Ù¸5¯x°‚ôjpQPìî'�vÚš¼rø÷¡J³tÙ 2h>;½d2su(ïò‘I!p\àÏŠ°Þ}ò‚®€E×ð–ëFÝ»bª?-¼ÊÊ­Yzii.Z¶„†­9Ý…¦Ø<(¾Á!¡­–,š9ˆá +v é›ktGNQ l¼q+ú8‡^B;iHïpåV„†ôQµ5] Ñ™ZÕ;ÔÁ>ô†ýò¾ÑŒÑ +ʈÝJx¢‚Ò\Õø�Õ~äP?°5)ê% ¹1œÏËçB7ÀlÎG£ªaù\4èâ:p>k,ŸK¹fS8�ª†å#…›Áù¬±|.º¸)œÏËGú:7‚ó…,±|J°xc8ŸÕ÷ê{;p>k,Í6à|j“T,ŸÉ¸µI€¶à�ûêÌ“1=óž F¢%ÑpôÉä ®ÚçŠù@[uãIzí4ÞªÑ0¦:8Ä÷U½°ÆôÉ�ª1 dmVu‹Ö€^Uõ¾Ÿ”6ù˜Üp°J[Rìó lÍ:Ë‹„"󞕬Ç9Bƒ£‹²oø»[³OFTì–µ£ËªOLð‘e�ßã;5Z~ -QÙƵtž_Â8®én¦{9ÒàlÙã°ëQ°Øv§O¸\ &éÂ7Àlèi†°;˰�vŒ²ƒÝÙb­£²è¬Y¦˜èίv§” %Fæªs´¦OðÍŸgif Ää“_£º]4ß|2fe Mm“ªÉ z히F ½�ð‹G+�ák³ð5~f~ ðÛ.;A×aЫaeŽY€Ñ´¹ÑáÑlÍ1nLáÊ6óÞ¦ðÙ³';ºb¶ÝʲA8f¶>óÞ—Ûcu«DÃŒ²çÐ>óžÛ#;n轞ì9$ö {çv˜Û¡¥ÄÃÖ¶†Y� :´ˆ‡“Ö8>Ó  � ™f \å¦á¶ÇLÓû‹¥r¯Ñ'Q5i؃�Ægæš\Åæm¯îùK†¯ÓºglÃÜÀ§ñÒ— ˆ)=Iþód¹Ï›¼çA%çÖê<øÚä>20fB®Ñ†Ý=.Ê\«.U[ìA½¶³48ô�bèзÛqz#ØgO�³:ç‘«ß­GnO&G¬ì0$»ûYðÜðY˜¹… Bà¯.y�¢6 ú£åÌÄÂ?¹ð…|AlXÖ’©à�Úi-G{_ãÕNûh9ó±¦ä¤µYõÆã’ 3ïÙëÀ¡÷ÆÜ'å|»%9ñ”Xô‰²«­Õš«ŽúÄ6°[޼7º>é½7QÅý óoÅ{s¬yo6HƒV²‡×{ãR¯›b„<¹¨wcï�ì8Þ<9 4à·Jq€‡[Û{C,h0ñ{o Žæ½ÑŒ[~¬`¹÷Æ#8æÙ¢ƒ ZPÙxÖ š/E)ô†tÛ`HÓsÕy éx±Úã]laóÛvî¢/‹Ü…ÏÊgãÈ—óÛeóàá6ÉšWô D²±ïãrc£'C¸ŒÐE;ˆßz ºúC!‚ø9É dAüŒ`VÀlï9m[Þ¯eÜÆ²Õi™xn¾_>s¢ù`„�•ô´EdžuŒ`kÈœ·iàΈÌÓoO¶2Û™§½8R:×Cæ™Nk¬¸ÄÔmøUÞ–Ì Ô%õ’fuò¤^Þüp¥^ÚJ�Åg|SÓ ¢å\Ø&\Ú7æèŽ]°¸b¾åx�îàü´ƒ-ÊL¹V™÷öÒ âüØ4ŽA÷4¦XûfASеof3´ -Õ5Ô»Ùx?"ü“¶eѹÁ~­Ù_ƒc”iÌýØÿu´¦:äùgJãrÛÒUǨ¡5¶‘鈋Ú +.“Ì—°Tk¶ ±‘0¬«ÀX‰ÝæûŽm¯s£x³ _g lvyAœ>„µÞ±Û… Ól”v¢ ûzLÌ„s�ìhwÈkåÉŽvŸ¹} ,âvK هٖ@²°¡ÍA²2nms�,èÎv@²°!¾‹®i0cî Ú(ì«`ç/"ÊÐïÇÞvö£”g–iÊs©,—âf <ÓÜôþ”·ž¯SÏ4Ž#>çÙsSPžìO#pyÊ3¸ìÁ¯ë�òÌþ4¾Ì>ˆ¾b[Œ¦Ûïm•´)çÂéí÷;­µ97ñæ‘Á¦’|NHÇ3lÍæ~>–�é +åµ". •ïsÆ€¬n‚�©1{Ôµâ÷À¼À‡ª+à¡�¢.´� Ké…iåyÀ•ÖÏÞ_7£auo¼ªÕ³žÒ ~]8¯•bK_¥~]L÷Tn½zW›—Žš©ëãJ9úR©”cíhíêWÑOû_úNËþ)="Œ‰~sáj¥÷l\æ"wN.2=ìîàåì„tZT“oÁýC÷ì—è÷¬`w㓪P¿.[‚ýöÏÞOF,ØÝ“ÕF$KP5"Âr¡é¶3Âî½·ŽZ´ÑEÛõ[ÁîÄ(�ªK­SxðÍû¥ööf©Õ vwoUÌîÛì÷s}ͤêíLÞÆ,ª›:…=&“…Úé}ƒA5ÓôLãCÕ ØM-غrÐ'˜3-ú÷˜ßCÉIÚW®&�sü=Y™vRUÙÁõ*#jбV>gŽü^½qBŠ/ ¶À¹÷g;à"ŽdX£Ã“]ÓkÆÛ'9aÑ-»%~+À>ZSÜi×üÀ¾5”ô:À>fw»À>«ÀÊ�}4TGÖ�S`ÍK�ÁV�}æ7�LÛ.°�fò(Yª[öÑP}Z„�èÖfÀ>]ŸdTÝ€ÚØG3[MâÍ�}´94X6ÛöÑP}ª¾Ù 5[;£ð¶ ìãcÚÆÀ>ªoL³µm˜¶°�…qÑ =[Ì1°ÏÜÀ›ÛõŸM�JçÀ>cÕ·ç–�}´` a@m Øg}ÄݰÏ"°²M`Ÿµ¾Ù°�íUß*°�Æ—ZCrkÀ>šyiJinåŒ1œ]J½5GwN±kš1jxºˆª$œè«™Ý¶'ù/{~(&ǦUüÈ>)%ü,|6ëVñ£­RCx•ɪeÈçœU ;‰ÚZœëÀ\°×e†c[vKë“#¼©Ëºäž©\ïš}"sn7e•E™^ª°±è–E�j¦üç%½°)ŠÇ Ñ)îÉþ²s›x]yhߨÖÿÛ¸øŸ ßÑÅéi^»øMؘëÿ­18ýµo. + ŒÓÇ•sa“m¨ÿ·ö|)ž`Mt®áÔâ/þgé„Tëÿ­‰…ÐY6õÿ6.þç²Cáñ…Ÿ~ÛÛ¸£+^ìŠûÖ¢€ãÑÞZúÓoÛ�nÌŒ­Ù .päz¥†‰`Ù>¾ G‹U +}ê›é¼çÂôqgP»Ø×´-3C€sþ;}RßšIj�AÖ Ý1ЧÞXóiÏg„4Á«`­—»Ëp«+`Ô8ÿÞ_¦¦Z�¥e“ƒÎ�jš²ÏOãNµ­ñ$‘Û­´ +„[b†Üë6ľõ·"Ûiö ñ×ÀµH»ÚÆVD­Ðaö.#€Ùi�ZãGû¢¦È\u +Ú÷jjFû^M·x½!lm;uŸaS(‰œ�µMUfLn^3¹išò°i•µ4G‡!(�‘²Í<°³²¶'‹Ïícô7;;7/tMuV\V'„¼8·‰6sI�®óâÞ ææ6nÅ2}ÔACÛ¸Æ7´i…oÜŠn3º —5:K‹íòB(¸ƒÅ�e?ÞðB(l�÷Û©û‡“,,Jÿ9Û�¬| K™ÆÜ�ŽëþQMu²ôß&@Lm3Zƒ/8âƒ4YçÙ ÒxÛ¨ûçÂð¸M÷£]Ý?—Š�âA§¬]÷Oõr±Jé?rÙÖýã¾¾B°6Gû>Ì Æ5 Ží Zã4~÷Óþy˜m‚ö%�˜FèÇZ@Ì6N[‰Fq6´®%½¨¡­LOŒç+ÖiͶ!6>—¤’³†X*XEÐ1úžÔV«PV„Mû1ç·™ N ª…çKEQæúrqêiUVkÜX*u˜6WCSØda©r~.ç�ýé^>ßðlOžÚ_¾ü”z2_çìÙs¤¢%'Ár“ÊיŨS�ÅT!0XŒQŠÅØG£µ?�w[‰²/ECBAÍLá¬Ó缦…�Öß^1Ì>ò:s8!¹p·}ë[µœY6Ï çÅ09·|º îV�‰ùáØö¸[Ð'~8¶•º�ÝEp2:i:AÅ&„Ø»fþºú)VʱãÛêÞäøªZ ]AÑ™ÿy +¥À�s 5ì=ÔÇ’¯°[ÅŠy„ Ÿ³üI‡<-^’TuȼÅÞMÿ\ïå0”¦ËUîû d^€�œ¯žr¢�*fšŠV‚, bjÏ“¾ <²ð€V(Ä߸a¥é�ˆ�½».“ª¯õ}e•¦ 0ròIZaòyR"¨ê1r _Ú«UXŒ@—ñþ‹Uüï�±‚ލ@D™ÃíÃsÕÔÞ~â´ú¤Q…£Ñ1yhAµáI±©6.öîT3ðÒ9ÔÓ ¼´ª°Ø¾aS­Õºu}â ì�_«ŸdTè*˜�é—ã{ñŠ`ý=—Œ÷ž‚¹#Ž&C¹ŸeMSœ`Ôý„ÑUƒ=š2%’úz ÿ²ªù8³3_“-œäRʺq&hÚVËSÁU–Î6,Š‘¸Åì#_t«Â�¯²W-Œ÷§­�¸¥ù�™Y[®ÿxýNUŽÄ-æôéNk€Â•“7+ >k‹êà…ÇÙd‚|Rl«ÖLi`ëe ! àz%(Í}¢ç€‘û†›ñÎrÀ`ŸÈ —¾[i`ÎúÝ:.V¹¹G¦<\ƒèª=‚úHx�æ›&D§ÑU{hq\ïmç¹Ô¶ue?â6 +›õQöniž0Ñ ¶ñ»ØyO¿÷Î)ìÎ"þíâ½»{PÛÄ#­f©"Hâ¦]3ï»sÑpkv§ó}wv$³?MŸŠB ÖŽêÎK<Ð…M}k'éQÝ$lÖ�¡C쟅ñUö»TÏE]€_†§��dšÞ“˜™2>3s¦#ÕÚH1ØÁ¸zì£3@›¹ŽÇ•ê8ÐTªkÈ•utƒ±O„¾7¬|ζ¦º®OF„€ÎNsŠKüôðbKÊ—hWšgq ܰ‡ +q¯Zh“-à 5»BBDS²°±hÍ e6dš-šˆ˜”èL³-)äŒi�Ä£5Š™i6B ½$‘�h�¿á�$òb¨G\^H"/ÑàRu +IT¾l‡Gtý·$‘�WÚ�D^<"é ^’È‹Gtq òmšöxDenÖ„$òâ™õ!‰æ>ÑñˆJÜ÷È<®-+tq©Û¸X¡<šÖ+Ô¹þ®X¡!çö¯ŠZË´­+”c\…mm vŸtæàß+4¦(þQ±B—]}ÏMŠêܰ[)f·äÙ!–)Qo²Ú!ã´àáÙvN +ÚÞjµ�‚‡2’p ·ZY<äÏ�Ú¨à!1ñÛ¸ÕŠUðÐÚ…d>°¯Yðд­oµZ·à¡Å‚–MË\,ô#Ž‚‡Öé&rªÕæ–«Z{ <´žM]î µø³.xh=8bAoVðPZÞѵqÁCë!“a×.x¨Ÿ*cµCZЋ‹7Îл.ãm×ë<4mcþ 'õm¡à¡uµC‹ü4g­½É.Þ˳ì +ZŸ‡Mi×ë<40ܰ×Zi´‚‡Ö­0ÜÎ ²[�:�ÃyÏWðк¼ ·PðÐ:ã"@²<´®v(ŸÖ Ôجà!±)Õ]Æ;SÖ-xÈ6Mdµf“¶ÇYðкڡn{nRðÐ:Å·[(xh]íÐ¥�Ë7+xh+s1Ñ« ²P›qÎÐ7gÁCëV\ˆóÍf­c×ZZ†U†S”MuvÁCÇpìõ +RZá-¿ë¤à¡u+.‹+&Ì ÎJš@²[(x¨xÛèÕ±µ•kVÕ�È4Ë‚‡ÖÆe¥­Wð�ѱgãåÀëmny¡Á–ÞA'­[AÚs­àbe‡¼]”‚‡ëCõ�Õe2›<´®v¨KTv¸u ûÑp�:Ëm§‡±­ ¼¢z 6+xh]í�Æ´µ +®çëÔ3mMàåì¹iÁC!I¯v¸VŠ"­à¡µÅˆçf ­-Fv@ÒaÁC[%½�‚‡ê0©Õuv÷-\”‚‡Ì³ºæUßFÁC¦m£à¡‚T¥€Lˆ•u Zë +jù:-uEL1nõêâÎÊv;ë2of%f¤Ðx#n‡$´'xÌö[çû@”º%¥®4-üSÈÿ’.lÍÉ´ü:>D4Þ±³IJeé©î´ÚYÌçÒâ �q5sìÝŸz„Xï3�¿Q]nÏI¡üSwìåþ7Ÿ¿× _�Ù‹nÐùøÊ³²Ð|==Ú›­Ê)÷ÃhŸžJûÉÌAÓ{r6»LÎ>û÷éd4ñÈdNê½h;:w';�ÄSùò³[_�¤nß®'§ÉÙ�òÏs{HT?v¯/ÛŸ¹¯ÃÞϤèŸÎ†éÙþ¼4M�ºoO‹>OÜßHíÿ»oµ«·½ûÄÏÃ$‡&AMáÁ£{}u㎆%·ô:» Æ}%¡^n—…ú¿—c¡‘ò^ÎçOYÿ|‘¹m-ö©çEòùþ\Å%^‡ò±Èm4ÞÉî*¼�Ø|ñð+ðe÷�,¡9ˆu�׃»Î0{ôrñ W¤Z –Û\=‰ûÁ£Rç˜Æ/Ä0à¥w>�{àí£–Ã}ó�|“ó½›»ë‚g:�Õ½Râuµ÷5v�!¶õX�«ºWáßÄ)Lˆ;™"„¤û¨~}½/x&cðìüÇe¼¸ù×°�ÀàÎ+~OóÒƒ"ŽÆ‰Bj¿²ªÞÕ'ðîTb´òx¼×¬Íï‡\~:¹­”kÒuµZ eÚè«r)Ò½«hèf¦´‹KúÅÐg+ûƒÒAÇ=Gã:úþé,ŽÚ··C¸oj7½&üŒùü+ +¡Äa|ü/$ûst´bK?Ìo.±\Ž%£>å“èG>gÀ“4 ˜LÈžÖ/ø3Fbµv?O*Qå—õX½&�d@»M!T ï¯êþf«%†}oßµ—ÏYVˆÒµ«�b°"TÞG1¼È‡ˆ#O%�^ aS¨D´wRù®[T~ÔR ¶I‚OëMáÍi�ŸO±ÑÙ©ÏBÄ—ƒ(Üžê»ùî7'Àg1ÙlJž +éô-6S�DY†âÅ®ÇóRP›ä®ÏêˆUApFŸ”1‰(ô2€¡g€}çg1ØPpsÐyWD?Š{²ßKðç}LÔFï‚´zÓW•ËYÐÅi5Ik�ŒFq7© ÜQ“�ãÌE6Ó¨—|“ëjkœwËR»ß•y½FJZ�)ð5Ü“×R”PG?d–YyY<ŸEК—Wðs7&¯ùçž >wZðé^”íó@*d[ÒZiÏ£8ú|'Pòü~^¢&#È0öbòÏ?ïåÓ@T»ó ”^§ wçs×^À}3pLJõaà¾-=�ÌöåÑ|~§Ð>�—3ñÌÁdøWyKÕÏÊ_™½ qŒ„¥H‘鋇¤ýƒM4Ÿ¶x/ª~‘—Ìr ˆ ±äŸF¢òi,ißvø%áò#aêNryS +é›ÈîIýéd?kˆ(ºÛ¤¸em_F]¨&Št%”ü˜öå¼?R¢v[žÝ”bË`õ¨™z�é<¡lâ!Rjçšð¸ÜiJ³³[³¬4ÖböA£ÎÖA]±P¶ñù�·¡âj‹¤,Ï õze ÐÿAêýá>±wð�ÖÊpH,D±ÐýÍÅdù)S�H�‹ñBˆ5.µÝ2@›Lo"VÈó˜My¥)vÝÒŸcØu0GCòfâGÁx]hû{Ѹ×lÄÞ÷ñ%Uy Á+ P»b°<®j›G&Š�<†J±÷d©"Ÿ=ìÇ�}GÈ"§%£¡›ü¯Š`D´B£ +Z�žÚ ÖèåÚ¡º›/°mÏ2+l‰z_2mÂ"GÏÜKÿBmàÜÔ@"#ìÑDóè[ïO«óyþ'HZlhÇFN4óQògûqÍÌÆÆÒ~ÙSUxñš(ÇÔœ[Ô†Xï5DmÇËb'ß÷#;%ö^èÖÐŒ½‡s´e•g73åY{?›†âžÃÃ'$(ãśӶ– ‹w7x"ï ɺµêܰæ»[¹ÂØ«¸6úW÷”<Ð ! +‡´zÊK!­Jzé68Â^õP‡]5_æ¡\±€æ!ž>û”Ígi%j–3ªÈ� »°;}ýÝ&ÓzîŸX Û«órÿ^1U�…ûì¹|j8Ñ0Ö&—«>b& H&H¯*à…ç$ 5âQ‰ḂR<¤«ÿ¤0!Ó˜»ói¬¦,h&Š¹Ï©Â‡à¾žÍšÇTe£M‹‰ €Œ™ù¥² Vn�îÄâÞ˳й󥼾Ë�vH+^Ÿl>Fw?º +�`£/9¥32'³}ZŒ„2%ÇŠ”¯’4w�±îÙºþÎé@ Wè!ïÜ&éæb†ѦƒØžÃÙep“¥ ÉU¢¶ÁÉM¨t#Ì� ЂžjmÄï¿Ä ÙÆoE°í„• ‡!tŒ‚m,vÍrH½*(x?�ψ¯m�¿WÿCô+…àr }›®´ÉÇÄ¿ñJë$¢k¶!70( ¯4ß›ã•&L›´!†;¡°õ*Á¢“lÃ4�Az#nŠá×|LYië¶Žéöû6ÁK€ÕF×O„ü�D171ÓÖš‘ÆkÂfïk��õ�¹¿¹Íf¤é)Å4nb¦9H3RgïZ'S?Rq£õÝ,^JöJz^ˆ‰jÍÄ2Ú=$Úx쯡tJZ|~ …l˜aÓ‰_‘ºQ¡èäeÆ‹'ÙPtŠ/‘|ÔnV-õ8KŘ�à�/ÅV‘ü³yV"ÿ¼è¡ƒòIJ很cÁº’:ï�{•¿®¦W¹r\8 eϱìÓUà êsåDìã`õïmþ™Ì“_£Ác(›L‚Oéól`–ê¥ÿõ=¨ê.´ku×´Qü»›;4�ƒ Õôú#§ƒæqÀ£ÙžÓœ¥ ¥ô«xxKÈë)ß™]I…VLõ-DI·0°lªÇ‡?øÊá ÀÆçüF>¨Œð4DD|PNÏdYÊ(2Mû9Aaäù~ÀŽ6_þ*¸‰¹†®p'~ð¡Ê¹ù"»‘>Ò= 4û‹ú#Ò7 ÔõD}ÓóõU}apæÀë}Nƒ:—*T—Ϫ÷;L¾xMŒÕQÙñí) x}½åשˆ]=@ºªþõ‹ú2”@ÞApQ'Ïv—â™/ä&�$�§„ â¯çP + ?%ÜîËݽ(OU¿R�áØ­%R¹1ἿŽb2BÀ“¤¯«ýZ8”„�nûex ^ ¦„K9E´ÓÚƒK`MŠZxFz\ J²®?ˆ£Eƒ—Àu‚ðyW‹iu ÜbÏšT½¨@ qSô-ØñÏ�øIT$Î-ò�ýÀOqõS5·gíà;žÜÉM_ЄީÁŽ;AýD,#x»Ä»Ò�»8ù¢úéQ¼ÙIb4w©u¦EûÇÈÃGBŒÄ½�3“yýíßBáð(âO²©„±ÓïÛF û0¡`ý(íNëp-‹x-k«˜q¹�Ñ,Lò¡SK +ЂŸš6Z¸}Uãu¾27�¿eAdÞK£Ýã +ìhˆ•äÍ ŠŸ(dÒÃ~!¦IyðgzŽÄV ðZN�ŒºJ Æá™~¦¨“R]¼ +ONX„oæJ!}ˆ¯àø}OÍB§¥ãÜÀP°Å(2-Œd�|”§ PAá¿ô¸xþÄS g‚楎o~Ëòiä�Ã'(ip'#bö –Q+P¦À +ÉjX‹1Ö‡ªø=ÿQ$ôÕ¯<£YkåÇÅê]m‹x±»‹Ö‹…³°ó~χ²»‘BÆìV2V Xóvã?¬+4—&ä¦&¦ý$瀂%dбÄ;Å»B®}âEWTeµ^˾æÿ|ÕIɸ'Oœ”$E›‡$E’Ü o€ Uî…™Ö¬ìˇ)#8Œ¬SØäELÖÅœª YÕà +ª‹8mçÊõ†)I@¥s!‡ÅÒ$s‘Å—å¯èkðèüå_§Ún¹¯´¬Â­*zÓhßt'dY +4ë‡ÛiRnïîÊ­Ä6ïaÜS îjëF +¬ÆŸª6“j¢™‡|½�Êâ®…·‡T}9KÊŸ¾º’üiu?P²í¤Z`4DH5é5 ÛHÊ*á®›¼‹ÂKò~¤áW+i¸º” +ôÔXû�Djƒƒñ‡ú"AJ�gb4O·îŠcj†©‘‡Ð†Þ_µTIòÛØ+u±4Œ{î3âHˆÈû¶Q�`•€÷m££Z¬p-Ã5Ö²–R€A²8%©““?aÕÌR ? \!OóA›¨jP]‰ˆ�J=ceæÊÙðhâ,_‰{ßskÈ4«ÙžLSž0öûs€Œm̉d�Ú w¨¼(…‰L"†^¨G‰j�fë2sw[žj¨¶îóPº�®$3-H&œWB(—CN<8oEƒ`”M‰óN§{À+ÁŸ—Ô�¢=ïI8û£x=�"Òp{<Ñ€b·ÏC¤ZëŸE�g€Æ—™øÑðCŽ9%íVÂñó Á4�ùm·ðEB8>2âý|| +;–Ã3t[JvfäƒÈ)&©B7qz”~ûir‘НG +Èdœ k�’8”j‡w‡JRÈøXz:½; e†0ÓBp¾À¶2C˜i!Š—c;™!Ì´¸¶—bH A‰k(�ŽÌ’L™‰ê;ò�„ȼ7ìVñKÕÈ}ˆ™÷Fh_þ&‰R­ú£6”÷"¼’ 훈rZR¬iÙbiª¶yÓ�$$ŒèAáÑÄY0¶Æ^üg%E—ŠÅ…Õ6'�ÖB¯&©Qý'~U¦ýª€%·‚Ñ™Ù×Èkw@ +p6Ò^ ) )xPz7Ø÷Âúñqñ±BÉÈ‘‰ÏHÐÂsdÞA2ëYxŽÌ;h@Ùš{Hü²¯.î‹ÍR6Mn™þeŒ¹]:˜�Aʾ7U¨cÀÐùꃾ̈́¸÷öô\/bŠˆ=¯¼¥Û¿G×GÓ[$(QÂå}p �/=õ ~MžÁY‡ï{飸ÑÜ�Ä&âûó7tǽ'¯qš©¸E;QŸÔ§7·h'ºˆ Ï�¦"§�>UG*¯ãò÷n¾�´î2¸Gg•ëÇzõk÷åèòúÁW{Ž”n5¨ºD]ñšA¬JMÌGiìä'êWšÄ@ã3Mœ2_ º:ÐY—…«*)CCŸ;A& uAß7ª$vò¸ëµíX}åÒ1ÕûÇq²5�Ù$tJCSá—z%RØk9˜fÕ7Øš—=jËHµæ·ƒf sÊ9vØË¡ãƒŒ�ê$‰”³ÑnC‰ô„=uHqcΜš�ix«:S`Šß ÅõCŠ+ACz[‘™zùþ)ÝÎwûš‚‡pùP„ì?)Œð@Þ{¹óù0pðAMêÚ»ÉÀ#Э:7¸ O? ÙúïÈÁöTô1ܽ/‹�7O«ü¢ÿ'*U‹ßÕ�œäŒ°‡s¯äWÄ—V1«äJÃæG¾¥Ìƒí«œÆbBnM½ÙzÀ°üTmBùÈxojú&ýákÔhÍ.ÊÐ:ظ…Fv žø< Ñóyc{õ /X¾ ¾ÂèFÏÄ=Ù¥5Ô/D¤¥C…ÏéBðŒfÝÚx=Ót} É„_Yì`õÑ_äÀì‡Ïiß‹½×ß²x¥ë²„‘9z4•ÿ9÷þ@0P]Móì›gßSнý‹ ûº †sã8ÕýÖ`ù Il zUñå¾ÝAj +¥ ‚_/�9Øhå¡L•Ÿÿ,ïëð®´Ðö¾ª[�hC¼¯ÅËÞ» ê% ÆKëüžàDÙN MÂ…Î&Ð^.•Söþ™wM”þ/ø£1ÙþÔ!œ`Òh}ON@ÇÛBÞx²É´îŒ€ëXöE\X=Qâž`Ý|JÔΨ‰ºØ*ÿ“øAÿ( +®©9@gc~bß@µnß {YmüRECÛ¨-÷²ñÃíSåׂ1ÀÌ]VÀFýˆ¢àø³×Ãþž@ˆN?è�ï�…6ò”(]%v÷>ÑÜÝZkÖ[[ždšà|w ÿüõ¢¸�Tä­]赡­-€ÓÌl1t�¶6��ØÝ/Þ=h/gÎÁ:øœ-¡�,ŽÜdசÁÛÁfïOWÐê–à 0ÓýÕ.sï«ûÁ|€mXÔ¶.N�®=dö¡åXU–ìÉ4v’2EùÊ ëüíAHSáä}�IXVÍ/£åwê´¼6•¥¥­4y¹i¦¼‰òðõñLU·„64�Q­¢®ŒdÜÆSÇ@LFK0Žu ŽËàŒòZÄW¨€]pg–8‘ +°�»%è$J�†@ŒÜ méqéOa#ÔÅFåLÞ ` &È•†ÖHй“áR ÛncxSµy ¨ÜùÒZ¦ ´=»¯|Lü†¯¾N2ÝÕ¦!˜Íj÷q7¤}ENK0+çÛ5T‰Fè_‘-›Ktù8Ò.}ƒ•Žªo’¢zVoàÙÓ´Æeb|pHQuF`Ð+@ò:iõë’Áå”wr·Ô�ŽVbøõµ P²c&‘ ÓŠ’AÃÁ?¸–äO“ <.äÂðÍ Ö ÉæüЀjFä?; ¹�ÝÜ�Qˆ-Aóà +ÍçVOöÃê“BÖ Xi^Ž×üRI'é ±@ä’@®eåY)Dx9¿r£Ñy9€ý×�c??vÑ5Î çóäö“ÈÅÏÌjàMiÀ zí¬Þ”±NV¯KWstÑ›$]bloqêÌù¹Ê9¹»·à +endstream endobj 28 0 obj <>stream +¢y-°LÛj€‹æµ€£Ùr€‹æµ@jm-Ç…�×jok“ô6ÞÜ6œ;¸vz[ˆ3·Í¥«…lj© 9ÔÉ]Î0uÎuhnX˜ºŸÿ&étVÜIgÀ?±ËÕ×d~6}Ÿî„]ÿ¸þ‹µD±;ÿÔç“Éõäÿ.«?/«ïÉt¹“Û‰]UZ­L²:yùOvpÁ­äSš°_°òT�ÄÉ�ô %W®þË6>›{—ùQõŸÐ/n„Úñý^ÏÜá·x•�;ôÝw‡‡ã{wXª_¹ýÍEþÙÇ(-ìjrÔ Óp¯:™—WµÐIçÖ°ÛPªköéº+Ë×nË“ËRlñzkÝAþÍU)¶`¶Ôñ·l«éÄ=ô{%–^wàð4áŽÄ|7ðz ˜HîöT31w8P*ÁÇÇîÐÅî)á)|QtGŽâcwø¤×tg{sÂ*Çe>óÏ i!ü‰yW›ÞB ›ZÎ)FÜ?alú€dÐ;ÎÐúÓî�þq"ù_âþQ�ùcÜ¿î˜ËÛ¤sÜ¿Î$ü;Ü?Šî¢ÓôŸâþQtŽæoqÿ(ºKÁýk—žÿîåæƒO‡Ç0G-¶ø-‚w'ÇÕÕèü ¼ËëYÏåÝ¥R˜y¾;k¦Z†Ôþ«{ÊÂÇûCzp¼ ]ÒäýqŽ ×ûÔà™p#|¼/–™P]\©LxpaT¾Â‡Õý™Ê‡žžá�ý%ñÒ…ß/3aT<3†#r‹�.K(ŠÇ ³Ð óYÿ²Ÿr0$o8 -(Ë6Ð=ö+Y6¬6F»�Ð&�ÐVÍšm¨·.pl-87”6 Ð�m0#~íþ ´´Ó”Õ͹´ýäŒ�ÛƒÍ ¼oÈ64†®wÿ„_ã„Ö ™iܲJ[ßB³zõ¬ ¤?5Üù�Mô½úuù‚`ZÿÑ0AÚW×\%šÞ`¥ åík¥m¸÷ý$'Ö]i¤6Ò bfæ•Fî}æj%Û0„Ü· +7i+ÍŠŽfDk€ÌN p1Ãêêrïë:aPk–m0ö>Ï”ÊgÏ€6#kÞÁCêg37U}cÝ1«N¢\¤Íêš¡ 1C'àh,ûÁ±QݾêÃ…Ü€´èÀ‡!MI¯ÃŒ ¶6­;¡)is? ªÉy'´µ¹¶è ò¬MU/a)`TMAëåÉÑ Œ™WÿD+m™;ÖžÄ=¹J[\LbjÊV¹ëQó;ºøâßF&‘ò¯\�Ú ”wûW®GÍï¨�cþÀõ¨ùѾù+×£æ'„Ž®?s=jíá$˜?r=j~G-üý®GÍïˆOkäzÔüŽÚhþÀõ¨ù]èÿ?r=â[à [{€d¶äûX°€åy„ÌÇ âë#Á¾!ùˆ„_»BMþð¡` ”LHáÛú`ž!œä¸8Ó•Ü�2þ­ #©-=®[±÷Þ2ŠƒŒïáJ ½"£vL»Y_¹âÐÀdø®+û ’ ­4ƒãCW£Ñ8X«!K9ÚxM@¦�Fe÷ž§¤¸gT0.MHÈFWR‚i ‘<€~ê–(kÓ1s�÷Á£«Érõ‹¾’–'¯ïÓÎè'@€‰;ø?üÿMgwD)³#%“à�$|Úyvýç¯=O¦“1°Ó�—w cGóeõýeùþ3Íÿw'‡žõN:ÝVu'·ƒ¿=ß>Øñƒ> Cðuð*€Â�CØÓ¡ë?açþÓû×+9f +û vb0t +C¨ð'èÏÑ÷¤5Oþ¯üàjù3ÿ_õ�´ƒ¿=š.ßG_ï£ÅûôUŽÅÂ/ãÑRÿ ÿ:Ÿ>À³ÿÙ…�“�ûGagì//áKðÿ±ë¿ÔŽ?°K5­à³3ô"šLÅB|È&’b³+𔲠Q‚?¹þK +ÑT:•Ù‰$²ÑL2žÜùFÏQHïDà‡D6³Þ%ÒÙ$z Jñ�D&šÎH’ú7Øê‰xTH'´GñD4•�'v"qðw:E<�âÑd<�‚?Òž‰Q!ÏìÄ“Q)-B’>dÀ¯RQ!“ÉîDÄl4 ã×àWR6* +þR<›ØÿK‹YÐ]IŠf“™1z þJE%1�:'¦£‰àCDJG…x<½ˆB~)�‹`ÔÚƒ,àUBù~–t„Œ¸¾,¦² ™T<š‘À`Aw³i)­=€cW%’ÑúQ2Íd…ÔŽ‰ã×uÀ@Ô5À@ÐýLpND"*�ÙÒž¥D0ɺ�H%ˆ ÀvñG}—¢qð³�$àD²9!E˜‹$˜‚d*¥=€¨Ì©ò ü?“Û +²l¯,ñ|#+ ÑªÏÀü$R «‰DTàè”.›Æ…‡ „¬²bÉÏ�²¼áÁþGÛ=ã™ûç£×Éõ|ôþ÷ÿëbô&;£éôg9ZN~Á«�×ùdv×dgñöó?ð ü‘ú MÎÍÿ õ¯ +endstream endobj 8 0 obj [7 0 R] endobj 29 0 obj <> endobj xref +0 30 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000044598 00000 n +0000000000 00000 f +0000046595 00000 n +0000046880 00000 n +0000046409 00000 n +0000129059 00000 n +0000044649 00000 n +0000045058 00000 n +0000052531 00000 n +0000049847 00000 n +0000049734 00000 n +0000045605 00000 n +0000045847 00000 n +0000045895 00000 n +0000046479 00000 n +0000046510 00000 n +0000048531 00000 n +0000047164 00000 n +0000047460 00000 n +0000048821 00000 n +0000049882 00000 n +0000052605 00000 n +0000052801 00000 n +0000053858 00000 n +0000061337 00000 n +0000126926 00000 n +0000129082 00000 n +trailer +<]>> +startxref +129264 +%%EOF diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Source/Psd/icon-shapes.psd b/public/typo3conf/ext/bootstrap_package/Resources/Private/Source/Psd/icon-shapes.psd new file mode 100644 index 0000000..64306f4 Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Resources/Private/Source/Psd/icon-shapes.psd differ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Blocks/Default.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Blocks/Default.html new file mode 100644 index 0000000..ae6b41b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Blocks/Default.html @@ -0,0 +1,3 @@ + +I am Block! Please see typoscript definition of lib.block for more details. + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Blocks/GoogleAnalyticsStatus.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Blocks/GoogleAnalyticsStatus.html new file mode 100644 index 0000000..5b012d2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Blocks/GoogleAnalyticsStatus.html @@ -0,0 +1,7 @@ + + + {f:translate(key: 'googleanalyticsstatus.title', extensionName: 'bootstrap_package')}:
+ {f:translate(key: 'googleanalyticsstatus.description', extensionName: 'bootstrap_package')}
+ + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Accordion.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Accordion.html new file mode 100644 index 0000000..31e16d8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Accordion.html @@ -0,0 +1,47 @@ + + + + + + + +
+ +
+

+ +

+
+
+
+ +
+ {settings.responsiveimages.contentelements.accordion.{record.data.mediaorient}} + + +
+
+
+ {record.data.bodytext} +
+
+
+
+
+
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Audio.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Audio.html new file mode 100644 index 0000000..f658d34 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Audio.html @@ -0,0 +1,29 @@ + + + + + +
    + + +
  • +

    + + {file.properties.title} + {file.properties.name} + +

    + +

    {file.properties.description}

    +
    +
    + +
    +
  • +
    +
    +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Bullets.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Bullets.html new file mode 100644 index 0000000..de828cc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Bullets.html @@ -0,0 +1,47 @@ + + + + + + + + +
    + +
  1. {bullet}
  2. +
    +
+ +
+ + +
+ + + + +
{termDescription}
+
+ +
{termDescription}
+
+
+
+
+
+ +
+ + +
    + +
  • {bullet}
  • +
    +
+ +
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CardGroup.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CardGroup.html new file mode 100644 index 0000000..b6d55fc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CardGroup.html @@ -0,0 +1,72 @@ + + + + + + {settings.responsiveimages.contentelements.card_group.{data.pi_flexform.columns}} + +
+ + +
+
+ +
+ + + +
+
+
+

+ + {item.data.header} + +

+ +

{item.data.subheader}

+
+ + {item.data.bodytext} + +
+ + + + {item.data.link_title} + + + + + +
+
+
+
+
+ +
+ + + + + {content -> f:format.raw()} + + + {content -> f:format.raw()} + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Carousel.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Carousel.html new file mode 100644 index 0000000..030e3fa --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Carousel.html @@ -0,0 +1,33 @@ + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CarouselFullscreen.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CarouselFullscreen.html new file mode 100644 index 0000000..7f70a91 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CarouselFullscreen.html @@ -0,0 +1,33 @@ + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CarouselSmall.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CarouselSmall.html new file mode 100644 index 0000000..81e4f05 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/CarouselSmall.html @@ -0,0 +1,33 @@ + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Container.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Container.html new file mode 100644 index 0000000..fcf6b20 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Container.html @@ -0,0 +1,11 @@ + + + + + +
+ +
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Csv.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Csv.html new file mode 100644 index 0000000..0924923 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Csv.html @@ -0,0 +1,62 @@ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Div.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Div.html new file mode 100644 index 0000000..2d8dd16 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Div.html @@ -0,0 +1,9 @@ + + + + + +
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/ExternalMedia.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/ExternalMedia.html new file mode 100644 index 0000000..b4d5052 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/ExternalMedia.html @@ -0,0 +1,21 @@ + + + + + + + +
+ {externalMedia} +
+
+ +
+ +
+
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Gallery.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Gallery.html new file mode 100644 index 0000000..08f91a0 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Gallery.html @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Generic.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Generic.html new file mode 100644 index 0000000..919c485 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Generic.html @@ -0,0 +1,12 @@ + + + + + This templates is used to provide nessesary functionality for external processed content and could be used across multiple sources, for example the frontend login content element. + + {content -> f:format.raw()} + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Header.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Header.html new file mode 100644 index 0000000..3db31a8 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Header.html @@ -0,0 +1,3 @@ + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Html.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Html.html new file mode 100644 index 0000000..22fe35a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Html.html @@ -0,0 +1,9 @@ + + + + + + {data.bodytext} + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/IconGroup.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/IconGroup.html new file mode 100644 index 0000000..cc84454 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/IconGroup.html @@ -0,0 +1,47 @@ + + + + + +
+ +
+ +
+ +
+
+
+

+ + {item.data.header} + +

+ +

{item.data.subheader}

+
+ + {item.data.bodytext} + +
+
+
+
+
+ +
+ + + + + + {content -> f:format.raw()} + + + + {content -> f:format.raw()} + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Image.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Image.html new file mode 100644 index 0000000..0f2de53 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Image.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/List.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/List.html new file mode 100644 index 0000000..5daa22f --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/List.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/ListGroup.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/ListGroup.html new file mode 100644 index 0000000..a5b40c2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/ListGroup.html @@ -0,0 +1,14 @@ + + + + + +
    + +
  • {content}
  • +
    +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Mailform.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Mailform.html new file mode 100644 index 0000000..89528e2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Mailform.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Media.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Media.html new file mode 100644 index 0000000..0f2de53 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Media.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuAbstract.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuAbstract.html new file mode 100644 index 0000000..023d05c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuAbstract.html @@ -0,0 +1,20 @@ + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCardDir.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCardDir.html new file mode 100644 index 0000000..29ffe03 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCardDir.html @@ -0,0 +1,63 @@ + + + + + + {settings.responsiveimages.contentelements.menu_card_dir.{data.pi_flexform.columns}} + + +
+ +
+ +
+ +
+ + + +
+
+
+ +
+ +
+
+ +

+ + {page.title} + +

+
+ +

+ {page.data.subtitle} +

+
+ +

{page.data.abstract}

+
+
+ +
+ +
+
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCardList.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCardList.html new file mode 100644 index 0000000..6d67507 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCardList.html @@ -0,0 +1,63 @@ + + + + + + {settings.responsiveimages.contentelements.menu_card_list.{data.pi_flexform.columns}} + + +
+ +
+ +
+ +
+ + + +
+
+
+ +
+ +
+
+ +

+ + {page.title} + +

+
+ +

+ {page.data.subtitle} +

+
+ +

{page.data.abstract}

+
+
+ +
+ +
+
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCategorizedContent.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCategorizedContent.html new file mode 100644 index 0000000..973159e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCategorizedContent.html @@ -0,0 +1,17 @@ + + + + + + +
    + +
  • + {element.data.header} +
  • +
    +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCategorizedPages.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCategorizedPages.html new file mode 100644 index 0000000..af3d6de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuCategorizedPages.html @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuPages.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuPages.html new file mode 100644 index 0000000..af3d6de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuPages.html @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuRecentlyUpdated.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuRecentlyUpdated.html new file mode 100644 index 0000000..af3d6de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuRecentlyUpdated.html @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuRelatedPages.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuRelatedPages.html new file mode 100644 index 0000000..af3d6de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuRelatedPages.html @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSection.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSection.html new file mode 100644 index 0000000..541060b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSection.html @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSectionPages.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSectionPages.html new file mode 100644 index 0000000..b28dbf5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSectionPages.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSitemap.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSitemap.html new file mode 100644 index 0000000..948db1a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSitemap.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSitemapPages.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSitemapPages.html new file mode 100644 index 0000000..948db1a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSitemapPages.html @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSubpages.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSubpages.html new file mode 100644 index 0000000..af3d6de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuSubpages.html @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuThumbnailDir.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuThumbnailDir.html new file mode 100644 index 0000000..0845e15 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuThumbnailDir.html @@ -0,0 +1,35 @@ + + + + + + {settings.responsiveimages.contentelements.menu_thumbnail_dir.{data.pi_flexform.columns}} + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuThumbnailList.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuThumbnailList.html new file mode 100644 index 0000000..87a69de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/MenuThumbnailList.html @@ -0,0 +1,35 @@ + + + + + + {settings.responsiveimages.contentelements.menu_thumbnail_list.{data.pi_flexform.columns}} + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Panel.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Panel.html new file mode 100644 index 0000000..5beb7ff --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Panel.html @@ -0,0 +1,24 @@ + + + + + +
+ + + + +
+ {data.bodytext} +
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Quote.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Quote.html new file mode 100644 index 0000000..91134da --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Quote.html @@ -0,0 +1,14 @@ + + + + + +
+

{data.bodytext}

+ +
{data.quote_source}
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Shortcut.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Shortcut.html new file mode 100644 index 0000000..78f4b8a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Shortcut.html @@ -0,0 +1,9 @@ + + + + + + {shortcuts} + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/SocialLinks.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/SocialLinks.html new file mode 100644 index 0000000..3dba0a3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/SocialLinks.html @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Tab.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Tab.html new file mode 100644 index 0000000..bd110c7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Tab.html @@ -0,0 +1,54 @@ + + + + + + {records.0.data.uid} + + + + {record.data.uid} + + + + + + + + + + + +
+ +
+ +
+ +
+ {settings.responsiveimages.contentelements.tab.{record.data.mediaorient}} + + +
+
+
+ {record.data.bodytext} +
+
+
+ +
+
+ +
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Table.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Table.html new file mode 100644 index 0000000..ef48e4e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Table.html @@ -0,0 +1,63 @@ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{data.table_caption}
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Text.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Text.html new file mode 100644 index 0000000..57bbcf4 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Text.html @@ -0,0 +1,8 @@ + + + + + {data.bodytext} + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Textcolumn.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Textcolumn.html new file mode 100644 index 0000000..0c9b589 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Textcolumn.html @@ -0,0 +1,10 @@ + + + + +
+ {data.bodytext} +
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Texticon.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Texticon.html new file mode 100644 index 0000000..b3f4d78 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Texticon.html @@ -0,0 +1,31 @@ + + + + + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaAbove.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaAbove.html new file mode 100644 index 0000000..ed3e882 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaAbove.html @@ -0,0 +1,17 @@ + + + + + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaBelow.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaBelow.html new file mode 100644 index 0000000..829adc3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaBelow.html @@ -0,0 +1,17 @@ + + + + + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaCenteredLeft.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaCenteredLeft.html new file mode 100644 index 0000000..b8769f6 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaCenteredLeft.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textmedia.centered_left} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaCenteredRight.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaCenteredRight.html new file mode 100644 index 0000000..58dee7d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaCenteredRight.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textmedia.centered_right} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaLeft.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaLeft.html new file mode 100644 index 0000000..543ba89 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaLeft.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textmedia.left} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaRight.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaRight.html new file mode 100644 index 0000000..b0247de --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextmediaRight.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textmedia.right} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicAbove.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicAbove.html new file mode 100644 index 0000000..2bf85a7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicAbove.html @@ -0,0 +1,17 @@ + + + + + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicBelow.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicBelow.html new file mode 100644 index 0000000..d75263b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicBelow.html @@ -0,0 +1,17 @@ + + + + + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicCenteredLeft.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicCenteredLeft.html new file mode 100644 index 0000000..d0442c3 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicCenteredLeft.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textpic.centered_left} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicCenteredRight.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicCenteredRight.html new file mode 100644 index 0000000..a702c52 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicCenteredRight.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textpic.centered_right} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicLeft.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicLeft.html new file mode 100644 index 0000000..d4643f2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicLeft.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textpic.left} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicRight.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicRight.html new file mode 100644 index 0000000..536380c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/TextpicRight.html @@ -0,0 +1,19 @@ + + + + + + {settings.responsiveimages.contentelements.textpic.right} + +
+ +
+ + {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Textteaser.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Textteaser.html new file mode 100644 index 0000000..73580ce --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Textteaser.html @@ -0,0 +1,17 @@ + + + + + +
+
+ + {data.teaser} +
+
+ {data.bodytext} +
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Timeline.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Timeline.html new file mode 100644 index 0000000..23bab6b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Timeline.html @@ -0,0 +1,45 @@ + + + + + + +
+ +
+
+ +
+ {settings.responsiveimages.contentelements.timeline} + + +
+
+
+ + + + + +
+
+ +
+
+

{item.data.header}

+
+ +
+ {item.data.bodytext} +
+
+
+
+
+
+
+ +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Uploads.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Uploads.html new file mode 100644 index 0000000..c15abcf --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ContentElements/Uploads.html @@ -0,0 +1,64 @@ + + + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Felogin/FrontendLogin.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Felogin/FrontendLogin.html new file mode 100644 index 0000000..9692e3b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Felogin/FrontendLogin.html @@ -0,0 +1,159 @@ + + + + Templates for felogin + + + +

Common markers

+

These are substituted in all felogin item displaying templates.

+ +

Markers

+
    +
  • ###ACTION_URI### - URI of the request for the login/logout form
  • +
  • ###EXTRA_HIDDEN### - Hook required (additional hidden field used by kb_md5fepw extension by Kraft Bernhard)
  • +
  • ###ON_SUBMIT### - Hook required (used by kb_md5fepw extension by Kraft Bernhard)
  • +
  • ###PREFIXID### - Same as class name ('tx_felogin_pi1') useful to get a unique classname prefix
  • +
  • ###REDIRECT_URL### - URL of redirection upon login
  • +
  • ###NOREDIRECT### - if set, no redirect will be done
  • +
  • ###STORAGE_PID### - explicit enough I guess (if not : id of the page where user are stored)
  • +
  • ###STATUS_HEADER### - depends of the template
  • +
  • ###STATUS_MESSAGE### - depends of the template
  • +
+ +

Wrap parts

+
    +
  • ###HEADER_VALID### - useful to define what to show/hide
  • +
  • ###MESSAGE_VALID### - useful to define what to show/hide
  • +
  • ###FORGOTP_VALID### - useful to define what to show/hide
  • +
  • ###PERMALOGIN_VALID### - useful to define what to show/hide
  • +
+ +

felogin Language Markers (see pi/locallang.xlf)

+
    +
  • ###EMAIL_LABEL### - corresponding to 'your_email'
  • +
  • ###FORGOT_PASSWORD### - corresponding to 'forgot_password'
  • +
  • ###FORGOT_PASSWORD_BACKTOLOGIN### - corresponding to 'forgot_password_backToLogin'
  • +
  • ###FORGOT_PASSWORD_ENTEREMAIL### - corresponding to 'forgot_password_enterEmail'
  • +
  • ###LOGIN_LABEL### - corresponding to 'login'
  • +
  • ###PASSWORD_LABEL### - corresponding to 'password'
  • +
  • ###SEND_PASSWORD### - corresponding to 'send_password'
  • +
  • ###USERNAME_LABEL### - corresponding to 'username'
  • +
+ + + +###STATUS_HEADER### +###STATUS_MESSAGE### + +
+
+ ###LEGEND### +
+ + +
+
+ + +
+ +
+
+ +
+
+ +
+ +
+
+ + + + + ###EXTRA_HIDDEN### +
+
+
+ +

###FORGOT_PASSWORD###

+ + + + + + +###STATUS_HEADER### +###STATUS_MESSAGE### +
+
+ ###LEGEND### +
+
###USERNAME_LABEL###
+
###USERNAME###
+
+
+ +
+
+ + + +
+
+
+ + + + +###STATUS_HEADER### +###STATUS_MESSAGE### + +
+
+ +
+
+ ###LEGEND### +
+ + +
+
+ +
+
+
+ +

###BACKLINK_LOGIN###

+ + + + +###STATUS_HEADER### +###STATUS_MESSAGE### + +
+
+ ###LEGEND### +
+ + +
+
+ + +
+
+ +
+
+
+ +###BACKLINK_LOGIN### + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Form/Form.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Form/Form.html new file mode 100644 index 0000000..79d67b5 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Form/Form.html @@ -0,0 +1,23 @@ + +
+ + + +
+ +
+
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/IndexedSearch/Search/Form.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/IndexedSearch/Search/Form.html new file mode 100644 index 0000000..fa83861 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/IndexedSearch/Search/Form.html @@ -0,0 +1,3 @@ + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/IndexedSearch/Search/Search.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/IndexedSearch/Search/Search.html new file mode 100644 index 0000000..1a2d781 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/IndexedSearch/Search/Search.html @@ -0,0 +1,75 @@ + + + + + + +

{result.categoryTitle}

+
+ + +

+ + + {searchWord.sword} + + + {searchWord.sword} + + +

+
+ + +

{result.searchedInSectionInfo}

+
+ + +

+ + {result.sectionText} +

+ + + + + + + +
+

+ {row.sectionTitle} + + {row.numResultRows} + +

+
+
+ + + +
+
+ +
+ +
+ +
+
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns.html new file mode 100644 index 0000000..12592b7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns.html @@ -0,0 +1,33 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns2575.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns2575.html new file mode 100644 index 0000000..9359fef --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns2575.html @@ -0,0 +1,33 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns5050.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns5050.html new file mode 100644 index 0000000..12592b7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2Columns5050.html @@ -0,0 +1,33 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2ColumnsOffsetRight.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2ColumnsOffsetRight.html new file mode 100644 index 0000000..12592b7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/2ColumnsOffsetRight.html @@ -0,0 +1,33 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/3Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/3Columns.html new file mode 100644 index 0000000..b5f9154 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/3Columns.html @@ -0,0 +1,36 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/Default.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/Default.html new file mode 100644 index 0000000..a7faf1a --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/Default.html @@ -0,0 +1,24 @@ + + + + + + + + + + + +
+ +
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/None.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/None.html new file mode 100644 index 0000000..512210b --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/None.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/Simple.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/Simple.html new file mode 100644 index 0000000..d4cb495 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/Simple.html @@ -0,0 +1,19 @@ + + + + + + + + + + + +
+ +
+ + + +
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SpecialFeature.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SpecialFeature.html new file mode 100644 index 0000000..5252a12 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SpecialFeature.html @@ -0,0 +1,78 @@ + + + + + + + + + + + +
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SpecialStart.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SpecialStart.html new file mode 100644 index 0000000..4323906 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SpecialStart.html @@ -0,0 +1,39 @@ + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationLeft.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationLeft.html new file mode 100644 index 0000000..be95051 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationLeft.html @@ -0,0 +1,33 @@ + + + + + + + + + + + +
+
+
+ +
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationLeft2Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationLeft2Columns.html new file mode 100644 index 0000000..76e4ca4 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationLeft2Columns.html @@ -0,0 +1,36 @@ + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationRight.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationRight.html new file mode 100644 index 0000000..be95051 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationRight.html @@ -0,0 +1,33 @@ + + + + + + + + + + + +
+
+
+ +
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationRight2Columns.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationRight2Columns.html new file mode 100644 index 0000000..ba4b96c --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Page/SubnavigationRight2Columns.html @@ -0,0 +1,36 @@ + + + + + + + + + + + +
+
+
+ +
+ +
+
+ +
+
+
+
+ + + +
+ + + + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/Csv.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/Csv.html new file mode 100644 index 0000000..526653e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/Csv.html @@ -0,0 +1,15 @@ + + + +
+
    + +
  • + {f:if(condition: file.properties.title, then: file.properties.title, else: file.properties.name)}
    + {file.publicUrl} +
  • +
    +
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/ExternalMedia.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/ExternalMedia.html new file mode 100644 index 0000000..ebfa1c2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/ExternalMedia.html @@ -0,0 +1,19 @@ + +
+ + + +
+
+ {externalMedia} +
+
+
+ +
+ +
+
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/ListGroup.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/ListGroup.html new file mode 100644 index 0000000..285df17 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/ListGroup.html @@ -0,0 +1,12 @@ + +
+ + +
    + +
  • {content}
  • +
    +
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/Quote.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/Quote.html new file mode 100644 index 0000000..ba701da --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/Preview/Quote.html @@ -0,0 +1,11 @@ + +
+
+

{bodytext}

+ +
+ {quote_source} +
+
+
+ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ViewHelpers/Paginate/Index.html b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ViewHelpers/Paginate/Index.html new file mode 100644 index 0000000..36e2990 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Private/Templates/ViewHelpers/Paginate/Index.html @@ -0,0 +1,46 @@ + + + diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/icons/address.png b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/icons/address.png new file mode 100644 index 0000000..c3b0ace Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/icons/address.png differ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/icons/hidpi/address.png b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/icons/hidpi/address.png new file mode 100644 index 0000000..388d240 Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/icons/hidpi/address.png differ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/lang/de.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/lang/de.js new file mode 100644 index 0000000..9c981e2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/lang/de.js @@ -0,0 +1,7 @@ +CKEDITOR.plugins.setLang( + 'bootstrappackage_address', + 'de', + { + toolbar: 'Adresse einfügen' + } +); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/lang/en.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/lang/en.js new file mode 100644 index 0000000..f699513 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/lang/en.js @@ -0,0 +1,7 @@ +CKEDITOR.plugins.setLang( + 'bootstrappackage_address', + 'en', + { + toolbar: 'Insert Address' + } +); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/plugin.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/plugin.js new file mode 100644 index 0000000..98ccdb0 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/plugin.js @@ -0,0 +1,58 @@ +'use strict'; + +(function() { + + CKEDITOR.plugins.add('bootstrappackage_address', { + lang: 'en,de', + requires: 'widget', + icons: 'address', + hidpi: true, + init: function(editor) { + editor.widgets.add('address', { + button: editor.lang.bootstrappackage_address.toolbar, + template: + '
' + + '

Name

' + + '

Street
Zip & City

' + + '

+49 1234 456-7890

' + + '

+49 1234 456-7891

' + + '

john.doe@example.com

' + + '

www.example.com

' + + '
', + editables: { + title: { + selector: '.address-title', + allowedContent: 'br strong em' + }, + address: { + selector: '.address-address', + allowedContent: 'br strong em' + }, + phone: { + selector: '.address-phone', + allowedContent: 'br strong em' + }, + fax: { + selector: '.address-fax', + allowedContent: 'br strong em' + }, + email: { + selector: '.address-email', + allowedContent: 'br strong em a[!href]' + }, + www: { + selector: '.address-www', + allowedContent: 'br strong em a[!href]' + } + }, + allowedContent: + 'address(!address);', + requiredContent: 'address(address)', + upcast: function(element) { + return element.name == 'address' && element.hasClass('address'); + } + }); + } + }); + +})(); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/plugin.min.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/plugin.min.js new file mode 100644 index 0000000..1902bcd --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Address/plugin.min.js @@ -0,0 +1 @@ +"use strict";CKEDITOR.plugins.add("bootstrappackage_address",{lang:"en,de",requires:"widget",icons:"address",hidpi:!0,init:function(e){e.widgets.add("address",{button:e.lang.bootstrappackage_address.toolbar,template:'

Name

Street
Zip & City

+49 1234 456-7890

+49 1234 456-7891

john.doe@example.com

www.example.com

',editables:{title:{selector:".address-title",allowedContent:"br strong em"},address:{selector:".address-address",allowedContent:"br strong em"},phone:{selector:".address-phone",allowedContent:"br strong em"},fax:{selector:".address-fax",allowedContent:"br strong em"},email:{selector:".address-email",allowedContent:"br strong em a[!href]"},www:{selector:".address-www",allowedContent:"br strong em a[!href]"}},allowedContent:"address(!address);",requiredContent:"address(address)",upcast:function(e){return"address"==e.name&&e.hasClass("address")}})}}); \ No newline at end of file diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/icons/box.png b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/icons/box.png new file mode 100644 index 0000000..63810ad Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/icons/box.png differ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/icons/hidpi/box.png b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/icons/hidpi/box.png new file mode 100644 index 0000000..abd01d9 Binary files /dev/null and b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/icons/hidpi/box.png differ diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/lang/de.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/lang/de.js new file mode 100644 index 0000000..50da73e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/lang/de.js @@ -0,0 +1,7 @@ +CKEDITOR.plugins.setLang( + 'bootstrappackage_box', + 'de', + { + toolbar: 'Box' + } +); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/lang/en.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/lang/en.js new file mode 100644 index 0000000..f5713cc --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/lang/en.js @@ -0,0 +1,7 @@ +CKEDITOR.plugins.setLang( + 'bootstrappackage_box', + 'en', + { + toolbar: 'Box' + } +); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/plugin.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/plugin.js new file mode 100644 index 0000000..a9b616d --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/plugin.js @@ -0,0 +1,280 @@ +'use strict'; + +(function() { + + CKEDITOR.plugins.add('bootstrappackage_box', { + lang: 'en,de', + icons: 'box', + hidpi: true, + init: function (editor) { + if (editor.blockless) + return; + + // Add command + editor.addCommand('bootstrappackage_box', { + exec: toggleBox, + refresh: setButtonState, + context: 'div(well)', + allowedContent: 'div(!well)', + requiredContent: 'div(!well)' + }); + + // Add Button + editor.ui.addButton && editor.ui.addButton('Box', { + label: editor.lang.bootstrappackage_box.toolbar, + command: 'bootstrappackage_box', + toolbar: 'blocks' + }); + } + }); + + /** + * Toggle box + * + * @param {Object} editor + */ + function toggleBox(editor) { + var selection = editor.getSelection(), + range = selection && selection.getRanges()[0]; + + if (!range) + return; + + // Save selection and prepare data + var bookmark = selection.createBookmarks(false)[0], + startNode = bookmark.startNode, + endNode = bookmark.endNode || startNode, + iterator = range.createIterator(), + editable = editor.editable(), + block = null, + blocks = []; + + while ((block = iterator.getNextParagraph())) + blocks.push(block); + + // Add or remove the wrap + if (editor.getCommand('bootstrappackage_box').state == CKEDITOR.TRISTATE_OFF) { + addWrap(editor, blocks); + } else { + removeWrap(editor, blocks); + } + + // Restore Selection + if (editable.contains(startNode) && editable.contains(endNode)) { + selection.selectBookmarks([bookmark]); + } + editor.focus(); + } + + /** + * Wrap blocks in new container + * + * @param {Object} editor + * @param {Array} blocks + */ + function wrapBlocks(editor, blocks) { + var wrapper = editor.document.createElement('div'), + block = null; + wrapper.addClass("well"); + wrapper.insertBefore(blocks[0]); + while (blocks.length > 0) { + block = blocks.shift(); + wrapper.append(block); + } + } + + /** + * Find parent element for all selected blocks + * + * @param {Array} blocks + * @return {Object} + */ + function getCommonParent(blocks) { + var parent = blocks[0].getParent(), + block = null; + for (var i = 0; i < blocks.length; i++) { + block = blocks[i]; + parent = parent.getCommonAncestor(block.getParent()); + } + // Filter invalid parents + var denyTags = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; + while (denyTags[parent.getName()]) + parent = parent.getParent(); + return parent; + } + + /** + * Streamlines the selected block elements to match a specific parent + * + * @param {Object} parent + * @param {Array} blocks + * @return {Array} + */ + function unifyBlockParent(parent, blocks) { + var lastBlock = null, + block = null, + unifiedBlocks = []; + while (blocks.length > 0) { + block = blocks.shift(); + while (!block.getParent().equals(parent)) { + block = block.getParent(); + } + if (!block.equals(lastBlock)) { + unifiedBlocks.push(block); + lastBlock = block; + } + } + return unifiedBlocks; + } + + /** + * Remove existing wrapper from blocks + * + * @param {Object} editor + * @param {Array} blocks + * @return {Array} + */ + function removeExistingWrapperFromBlocks(editor, blocks) { + var block = null, + cleanedBlocks = []; + while (blocks.length > 0) { + block = blocks.shift(); + if (block.getName() == 'div' && block.hasClass('well')) { + var fragment = new CKEDITOR.dom.documentFragment(editor.document); + while (block.getFirst()) { + fragment.append(block.getFirst().remove()); + cleanedBlocks.push(fragment.getLast()); + } + fragment.replace(block); + } else { + cleanedBlocks.push(block); + } + } + return cleanedBlocks; + } + + /** + * Add wrap around blocks + * + * @param {Object} editor + * @param {Array} blocks + */ + function addWrap(editor, blocks) { + var commonParent = getCommonParent(blocks), + unifiedBlocks = unifyBlockParent(commonParent, blocks), + cleanedBlocks = removeExistingWrapperFromBlocks(editor, unifiedBlocks); + wrapBlocks(editor, cleanedBlocks); + } + + /** + * Moves all outside the wrap if existing + * + * @param {Array} blocks + * @return {$Array} + */ + function unwrapBlocks(blocks) { + var storage = {}, + processedBlocks = [], + unwrapBlocks = [], + block = null, + parent = null; + // Find blocks that need to be unwrapped + for (var i = 0; i < blocks.length; i++) { + block = blocks[i]; + var parent = null, + child = null; + if (block.getName() == 'div' && block.hasClass('well') && isEmptyBlock(block)) { + processedBlocks.push(block); + } else { + while (block.getParent()) { + if (block.getParent().getName() == 'div' && block.getParent().hasClass('well')) { + parent = block.getParent(); + child = block; + break; + } + block = block.getParent(); + } + if (parent && child && !child.getCustomData('move')) { + unwrapBlocks.push(child); + CKEDITOR.dom.element.setMarker(storage, child, 'move', true); + } + } + } + CKEDITOR.dom.element.clearAllMarkers(storage); + // Unwrap blocks + while (unwrapBlocks.length > 0) { + block = unwrapBlocks.shift(); + parent = block.getParent(); + if (!block.getPrevious()) { + block.remove().insertBefore(parent); + } else if (!block.getNext()) { + block.remove().insertAfter(parent); + } else { + block.breakParent(block.getParent()); + processedBlocks.push(block.getNext()); + } + if (!parent.getCustomData('processed')) { + processedBlocks.push(parent); + CKEDITOR.dom.element.setMarker(storage, parent, 'processed', true); + } + } + CKEDITOR.dom.element.clearAllMarkers(storage); + return processedBlocks; + } + + /** + * Remove wrap around blocks + * + * @param {Object} editor + * @param {Array} blocks + */ + function removeWrap(editor, blocks) { + var processedBlocks = unwrapBlocks(blocks); + removeEmptyBlocks(processedBlocks); + } + + /** + * Set button state + * + * @param {Object} editor + * @param {Object} path + */ + function setButtonState(editor, path) { + var firstBlock = path.block || path.blockLimit; + var element = editor.elementPath(firstBlock).contains( + function(element) { + if (element.is('div') && element.hasClass('well')) return true; + }, 1); + this.setState(element ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF); + }; + + /** + * Check if block is empty + * + * @param {Object} block + * @return {Boolean} + */ + function isEmptyBlock(block) { + for (var i = 0, length = block.getChildCount(), child; i < length && (child = block.getChild(i)); i++) { + if (child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary()) + return false; + } + return true; + } + + /** + * Remove empty blocks + * + * @param {Array} blocks + */ + function removeEmptyBlocks(blocks) { + var block = null; + for (var i = blocks.length - 1; i >= 0; i--) { + block = blocks[i]; + if (isEmptyBlock(block)) { + block.remove(); + } + } + } + +})(); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/plugin.min.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/plugin.min.js new file mode 100644 index 0000000..7de200e --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Box/plugin.min.js @@ -0,0 +1 @@ +"use strict";!function(){function t(e){var t=e.getSelection(),a=t&&t.getRanges()[0];if(a){for(var r,n=t.createBookmarks(!1)[0],o=n.startNode,l=n.endNode||o,s=a.createIterator(),a=e.editable(),i=[];r=s.getNextParagraph();)i.push(r);if(e.getCommand("bootstrappackage_box").state==CKEDITOR.TRISTATE_OFF){var u=e,g=i,d=(g=function(e,t){var a=null,r=null,n=[];for(;0 0) { + block = blocks.shift(); + wrapper.append(block); + } + } + + /** + * Find parent element for all selected blocks + * + * @param {Array} blocks + * @return {Object} + */ + function getCommonParent(blocks) { + var parent = blocks[0].getParent(), + block = null; + for (var i = 0; i < blocks.length; i++) { + block = blocks[i]; + parent = parent.getCommonAncestor(block.getParent()); + } + // Filter invalid parents + var denyTags = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; + while (denyTags[parent.getName()]) + parent = parent.getParent(); + return parent; + } + + /** + * Streamlines the selected block elements to match a specific parent + * + * @param {Object} parent + * @param {Array} blocks + * @return {Array} + */ + function unifyBlockParent(parent, blocks) { + var lastBlock = null, + block = null, + unifiedBlocks = []; + while (blocks.length > 0) { + block = blocks.shift(); + while (!block.getParent().equals(parent)) { + block = block.getParent(); + } + if (!block.equals(lastBlock)) { + unifiedBlocks.push(block); + lastBlock = block; + } + } + return unifiedBlocks; + } + + /** + * Remove existing wrapper from blocks + * + * @param {Object} editor + * @param {Array} blocks + * @return {Array} + */ + function removeExistingWrapperFromBlocks(editor, blocks) { + var block = null, + cleanedBlocks = []; + while (blocks.length > 0) { + block = blocks.shift(); + if (block.getName() == 'div' && block.hasClass('text-column')) { + var fragment = new CKEDITOR.dom.documentFragment(editor.document); + while (block.getFirst()) { + fragment.append(block.getFirst().remove()); + cleanedBlocks.push(fragment.getLast()); + } + fragment.replace(block); + } else { + cleanedBlocks.push(block); + } + } + return cleanedBlocks; + } + + /** + * Add wrap around blocks + * + * @param {Object} editor + * @param {Array} blocks + */ + function addWrap(editor, blocks) { + var commonParent = getCommonParent(blocks), + unifiedBlocks = unifyBlockParent(commonParent, blocks), + cleanedBlocks = removeExistingWrapperFromBlocks(editor, unifiedBlocks); + wrapBlocks(editor, cleanedBlocks); + } + + /** + * Moves all outside the wrap if existing + * + * @param {Array} blocks + * @return {$Array} + */ + function unwrapBlocks(blocks) { + var storage = {}, + processedBlocks = [], + unwrapBlocks = [], + block = null, + parent = null; + // Find blocks that need to be unwrapped + for (var i = 0; i < blocks.length; i++) { + block = blocks[i]; + var parent = null, + child = null; + if (block.getName() == 'div' && block.hasClass('text-column') && isEmptyBlock(block)) { + processedBlocks.push(block); + } else { + while (block.getParent()) { + if (block.getParent().getName() == 'div' && block.getParent().hasClass('text-column')) { + parent = block.getParent(); + child = block; + break; + } + block = block.getParent(); + } + if (parent && child && !child.getCustomData('move')) { + unwrapBlocks.push(child); + CKEDITOR.dom.element.setMarker(storage, child, 'move', true); + } + } + } + CKEDITOR.dom.element.clearAllMarkers(storage); + // Unwrap blocks + while (unwrapBlocks.length > 0) { + block = unwrapBlocks.shift(); + parent = block.getParent(); + if (!block.getPrevious()) { + block.remove().insertBefore(parent); + } else if (!block.getNext()) { + block.remove().insertAfter(parent); + } else { + block.breakParent(block.getParent()); + processedBlocks.push(block.getNext()); + } + if (!parent.getCustomData('processed')) { + processedBlocks.push(parent); + CKEDITOR.dom.element.setMarker(storage, parent, 'processed', true); + } + } + CKEDITOR.dom.element.clearAllMarkers(storage); + return processedBlocks; + } + + /** + * Remove wrap around blocks + * + * @param {Object} editor + * @param {Array} blocks + */ + function removeWrap(editor, blocks) { + var processedBlocks = unwrapBlocks(blocks); + removeEmptyBlocks(processedBlocks); + } + + /** + * Set button state + * + * @param {Object} editor + * @param {Object} path + */ + function setButtonState(editor, path) { + var firstBlock = path.block || path.blockLimit; + var element = editor.elementPath(firstBlock).contains( + function(element) { + if (element.is('div') && element.hasClass('text-column')) return true; + }, 1); + this.setState(element ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF); + }; + + /** + * Check if block is empty + * + * @param {Object} block + * @return {Boolean} + */ + function isEmptyBlock(block) { + for (var i = 0, length = block.getChildCount(), child; i < length && (child = block.getChild(i)); i++) { + if (child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary()) + return false; + } + return true; + } + + /** + * Remove empty blocks + * + * @param {Array} blocks + */ + function removeEmptyBlocks(blocks) { + var block = null; + for (var i = blocks.length - 1; i >= 0; i--) { + block = blocks[i]; + if (isEmptyBlock(block)) { + block.remove(); + } + } + } + +})(); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Columns/plugin.min.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Columns/plugin.min.js new file mode 100644 index 0000000..3081897 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Columns/plugin.min.js @@ -0,0 +1 @@ +"use strict";!function(){function t(e){var t=e.getSelection(),n=t&&t.getRanges()[0];if(n){for(var o,a=t.createBookmarks(!1)[0],r=a.startNode,l=a.endNode||r,s=n.createIterator(),n=e.editable(),u=[];o=s.getNextParagraph();)u.push(o);if(e.getCommand("bootstrappackage_columns").state==CKEDITOR.TRISTATE_OFF){var c=e,i=u,m=(i=function(e,t){var n=null,o=null,a=[];for(;0 0) { + block = blocks.shift(); + wrapper.append(block); + } + } + + /** + * Find parent element for all selected blocks + * + * @param {Array} blocks + * @return {Object} + */ + function getCommonParent(blocks) { + var parent = blocks[0].getParent(), + block = null; + for (var i = 0; i < blocks.length; i++) { + block = blocks[i]; + parent = parent.getCommonAncestor(block.getParent()); + } + // Filter invalid parents + var denyTags = { table: 1, tbody: 1, tr: 1, ol: 1, ul: 1 }; + while (denyTags[parent.getName()]) + parent = parent.getParent(); + return parent; + } + + /** + * Streamlines the selected block elements to match a specific parent + * + * @param {Object} parent + * @param {Array} blocks + * @return {Array} + */ + function unifyBlockParent(parent, blocks) { + var lastBlock = null, + block = null, + unifiedBlocks = []; + while (blocks.length > 0) { + block = blocks.shift(); + while (!block.getParent().equals(parent)) { + block = block.getParent(); + } + if (!block.equals(lastBlock)) { + unifiedBlocks.push(block); + lastBlock = block; + } + } + return unifiedBlocks; + } + + /** + * Remove existing wrapper from blocks + * + * @param {Object} editor + * @param {Array} blocks + * @return {Array} + */ + function removeExistingWrapperFromBlocks(editor, blocks) { + var block = null, + cleanedBlocks = []; + while (blocks.length > 0) { + block = blocks.shift(); + if (block.getName() == 'div' && block.hasClass('text-indent')) { + var fragment = new CKEDITOR.dom.documentFragment(editor.document); + while (block.getFirst()) { + fragment.append(block.getFirst().remove()); + cleanedBlocks.push(fragment.getLast()); + } + fragment.replace(block); + } else { + cleanedBlocks.push(block); + } + } + return cleanedBlocks; + } + + /** + * Add wrap around blocks + * + * @param {Object} editor + * @param {Array} blocks + */ + function addWrap(editor, blocks) { + var commonParent = getCommonParent(blocks), + unifiedBlocks = unifyBlockParent(commonParent, blocks), + cleanedBlocks = removeExistingWrapperFromBlocks(editor, unifiedBlocks); + wrapBlocks(editor, cleanedBlocks); + } + + /** + * Moves all outside the wrap if existing + * + * @param {Array} blocks + * @return {$Array} + */ + function unwrapBlocks(blocks) { + var storage = {}, + processedBlocks = [], + unwrapBlocks = [], + block = null, + parent = null; + // Find blocks that need to be unwrapped + for (var i = 0; i < blocks.length; i++) { + block = blocks[i]; + var parent = null, + child = null; + if (block.getName() == 'div' && block.hasClass('text-indent') && isEmptyBlock(block)) { + processedBlocks.push(block); + } else { + while (block.getParent()) { + if (block.getParent().getName() == 'div' && block.getParent().hasClass('text-indent')) { + parent = block.getParent(); + child = block; + break; + } + block = block.getParent(); + } + if (parent && child && !child.getCustomData('move')) { + unwrapBlocks.push(child); + CKEDITOR.dom.element.setMarker(storage, child, 'move', true); + } + } + } + CKEDITOR.dom.element.clearAllMarkers(storage); + // Unwrap blocks + while (unwrapBlocks.length > 0) { + block = unwrapBlocks.shift(); + parent = block.getParent(); + if (!block.getPrevious()) { + block.remove().insertBefore(parent); + } else if (!block.getNext()) { + block.remove().insertAfter(parent); + } else { + block.breakParent(block.getParent()); + processedBlocks.push(block.getNext()); + } + if (!parent.getCustomData('processed')) { + processedBlocks.push(parent); + CKEDITOR.dom.element.setMarker(storage, parent, 'processed', true); + } + } + CKEDITOR.dom.element.clearAllMarkers(storage); + return processedBlocks; + } + + /** + * Remove wrap around blocks + * + * @param {Object} editor + * @param {Array} blocks + */ + function removeWrap(editor, blocks) { + var processedBlocks = unwrapBlocks(blocks); + removeEmptyBlocks(processedBlocks); + } + + /** + * Set button state + * + * @param {Object} editor + * @param {Object} path + */ + function setButtonState(editor, path) { + var firstBlock = path.block || path.blockLimit; + var element = editor.elementPath(firstBlock).contains( + function(element) { + if (element.is('div') && element.hasClass('text-indent')) return true; + }, 1); + this.setState(element ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF); + }; + + /** + * Check if block is empty + * + * @param {Object} block + * @return {Boolean} + */ + function isEmptyBlock(block) { + for (var i = 0, length = block.getChildCount(), child; i < length && (child = block.getChild(i)); i++) { + if (child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary()) + return false; + } + return true; + } + + /** + * Remove empty blocks + * + * @param {Array} blocks + */ + function removeEmptyBlocks(blocks) { + var block = null; + for (var i = blocks.length - 1; i >= 0; i--) { + block = blocks[i]; + if (isEmptyBlock(block)) { + block.remove(); + } + } + } + +})(); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Indent/plugin.min.js b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Indent/plugin.min.js new file mode 100644 index 0000000..d38b6b1 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/CKEditor/Plugins/Indent/plugin.min.js @@ -0,0 +1 @@ +"use strict";!function(){function t(e){var t=e.getSelection(),n=t&&t.getRanges()[0];if(n){for(var a,r=t.createBookmarks(!1)[0],o=r.startNode,s=r.endNode||o,l=n.createIterator(),n=e.editable(),i=[];a=l.getNextParagraph();)i.push(a);if(e.getCommand("bootstrappackage_indent").state==CKEDITOR.TRISTATE_OFF){var d=e,u=i,g=(u=function(e,t){var n=null,a=null,r=[];for(;0=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};d.jQueryDetection(),o.default.fn.emulateTransitionEnd=function(t){var e=this,n=!1;return o.default(this).one(d.TRANSITION_END,(function(){n=!0})),setTimeout((function(){n||d.triggerTransitionEnd(e)}),t),this},o.default.event.special[d.TRANSITION_END]={bindType:f,delegateType:f,handle:function(t){if(o.default(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var c="bs.alert",h=o.default.fn.alert,g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.default.removeData(this._element,c),this._element=null},e._getRootElement=function(t){var e=d.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=o.default(t).closest(".alert")[0]),n},e._triggerCloseEvent=function(t){var e=o.default.Event("close.bs.alert");return o.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(o.default(t).removeClass("show"),o.default(t).hasClass("fade")){var n=d.getTransitionDurationFromElement(t);o.default(t).one(d.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){o.default(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(c);i||(i=new t(this),n.data(c,i)),"close"===e&&i[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',g._handleDismiss(new g)),o.default.fn.alert=g._jQueryInterface,o.default.fn.alert.Constructor=g,o.default.fn.alert.noConflict=function(){return o.default.fn.alert=h,g._jQueryInterface};var m="bs.button",p=o.default.fn.button,_="active",v='[data-toggle^="button"]',y='input:not([type="hidden"])',b=".btn",E=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=o.default(this._element).closest('[data-toggle="buttons"]')[0];if(n){var i=this._element.querySelector(y);if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains(_))t=!1;else{var a=n.querySelector(".active");a&&o.default(a).removeClass(_)}t&&("checkbox"!==i.type&&"radio"!==i.type||(i.checked=!this._element.classList.contains(_)),this.shouldAvoidTriggerChange||o.default(i).trigger("change")),i.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(_)),t&&o.default(this._element).toggleClass(_))},e.dispose=function(){o.default.removeData(this._element,m),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var i=o.default(this),a=i.data(m);a||(a=new t(this),i.data(m,a)),a.shouldAvoidTriggerChange=n,"toggle"===e&&a[e]()}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.button.data-api",v,(function(t){var e=t.target,n=e;if(o.default(e).hasClass("btn")||(e=o.default(e).closest(b)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var i=e.querySelector(y);if(i&&(i.hasAttribute("disabled")||i.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||E._jQueryInterface.call(o.default(e),"toggle","INPUT"===n.tagName)}})).on("focus.bs.button.data-api blur.bs.button.data-api",v,(function(t){var e=o.default(t.target).closest(b)[0];o.default(e).toggleClass("focus",/^focus(in)?$/.test(t.type))})),o.default(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(N)},e.nextWhenVisible=function(){var t=o.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(D)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(d.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(I);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)o.default(this._element).one(A,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?N:D;this._slide(i,this._items[t])}},e.dispose=function(){o.default(this._element).off(".bs.carousel"),o.default.removeData(this._element,w),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=r({},k,t),d.typeCheckConfig(T,t,O),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&o.default(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&o.default(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&j[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};o.default(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(o.default(this._element).on("pointerdown.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(o.default(this._element).on("touchstart.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("touchmove.bs.carousel",(function(e){return function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),o.default(this._element).on("touchend.bs.carousel",(function(t){return n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===N,i=t===D,o=this._getItemIndex(e),a=this._items.length-1;if((i&&0===o||n&&o===a)&&!this._config.wrap)return e;var s=(o+(t===D?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(I)),a=o.default.Event("slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n});return o.default(this._element).trigger(a),a},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));o.default(e).removeClass(S);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&o.default(n).addClass(S)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(I);if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,i,a,s=this,l=this._element.querySelector(I),r=this._getItemIndex(l),u=e||l&&this._getItemByDirection(t,l),f=this._getItemIndex(u),c=Boolean(this._interval);if(t===N?(n="carousel-item-left",i="carousel-item-next",a="left"):(n="carousel-item-right",i="carousel-item-prev",a="right"),u&&o.default(u).hasClass(S))this._isSliding=!1;else if(!this._triggerSlideEvent(u,a).isDefaultPrevented()&&l&&u){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(u),this._activeElement=u;var h=o.default.Event(A,{relatedTarget:u,direction:a,from:r,to:f});if(o.default(this._element).hasClass("slide")){o.default(u).addClass(i),d.reflow(u),o.default(l).addClass(n),o.default(u).addClass(n);var g=d.getTransitionDurationFromElement(l);o.default(l).one(d.TRANSITION_END,(function(){o.default(u).removeClass(n+" "+i).addClass(S),o.default(l).removeClass("active "+i+" "+n),s._isSliding=!1,setTimeout((function(){return o.default(s._element).trigger(h)}),0)})).emulateTransitionEnd(g)}else o.default(l).removeClass(S),o.default(u).addClass(S),this._isSliding=!1,o.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(w),i=r({},k,o.default(this).data());"object"==typeof e&&(i=r({},i,e));var a="string"==typeof e?e:i.slide;if(n||(n=new t(this,i),o.default(this).data(w,n)),"number"==typeof e)n.to(e);else if("string"==typeof a){if("undefined"==typeof n[a])throw new TypeError('No method named "'+a+'"');n[a]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=d.getSelectorFromElement(this);if(n){var i=o.default(n)[0];if(i&&o.default(i).hasClass("carousel")){var a=r({},o.default(i).data(),o.default(this).data()),s=this.getAttribute("data-slide-to");s&&(a.interval=!1),t._jQueryInterface.call(o.default(i),a),s&&o.default(i).data(w).to(s),e.preventDefault()}}},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return k}}]),t}();o.default(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",P._dataApiClickHandler),o.default(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),e=0,n=t.length;e0&&(this._selector=s,this._triggerArray.push(a))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){o.default(this._element).hasClass(q)?this.hide():this.show()},e.show=function(){var e,n,i=this;if(!(this._isTransitioning||o.default(this._element).hasClass(q)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof i._config.parent?t.getAttribute("data-parent")===i._config.parent:t.classList.contains(F)}))).length&&(e=null),e&&(n=o.default(e).not(this._selector).data(R))&&n._isTransitioning))){var a=o.default.Event("show.bs.collapse");if(o.default(this._element).trigger(a),!a.isDefaultPrevented()){e&&(t._jQueryInterface.call(o.default(e).not(this._selector),"hide"),n||o.default(e).data(R,null));var s=this._getDimension();o.default(this._element).removeClass(F).addClass(Q),this._element.style[s]=0,this._triggerArray.length&&o.default(this._triggerArray).removeClass(B).attr("aria-expanded",!0),this.setTransitioning(!0);var l="scroll"+(s[0].toUpperCase()+s.slice(1)),r=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,(function(){o.default(i._element).removeClass(Q).addClass("collapse show"),i._element.style[s]="",i.setTransitioning(!1),o.default(i._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(r),this._element.style[s]=this._element[l]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&o.default(this._element).hasClass(q)){var e=o.default.Event("hide.bs.collapse");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",d.reflow(this._element),o.default(this._element).addClass(Q).removeClass("collapse show");var i=this._triggerArray.length;if(i>0)for(var a=0;a0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),r({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data(K);if(n||(n=new t(this,"object"==typeof e?e:null),o.default(this).data(K,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=[].slice.call(document.querySelectorAll(it)),i=0,a=n.length;i0&&s--,40===e.which&&sdocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(ht);var i=d.getTransitionDurationFromElement(this._dialog);o.default(this._element).off(d.TRANSITION_END),o.default(this._element).one(d.TRANSITION_END,(function(){t._element.classList.remove(ht),n||o.default(t._element).one(d.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,i)})).emulateTransitionEnd(i),this._element.focus()}},e._showElement=function(t){var e=this,n=o.default(this._element).hasClass(dt),i=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),o.default(this._dialog).hasClass("modal-dialog-scrollable")&&i?i.scrollTop=0:this._element.scrollTop=0,n&&d.reflow(this._element),o.default(this._element).addClass(ct),this._config.focus&&this._enforceFocus();var a=o.default.Event("shown.bs.modal",{relatedTarget:t}),s=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,o.default(e._element).trigger(a)};if(n){var l=d.getTransitionDurationFromElement(this._dialog);o.default(this._dialog).one(d.TRANSITION_END,s).emulateTransitionEnd(l)}else s()},e._enforceFocus=function(){var t=this;o.default(document).off(pt).on(pt,(function(e){document!==e.target&&t._element!==e.target&&0===o.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?o.default(this._element).on(yt,(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||o.default(this._element).off(yt)},e._setResizeEvent=function(){var t=this;this._isShown?o.default(window).on(_t,(function(e){return t.handleUpdate(e)})):o.default(window).off(_t)},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){o.default(document.body).removeClass(ft),t._resetAdjustments(),t._resetScrollbar(),o.default(t._element).trigger(gt)}))},e._removeBackdrop=function(){this._backdrop&&(o.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=o.default(this._element).hasClass(dt)?dt:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",n&&this._backdrop.classList.add(n),o.default(this._backdrop).appendTo(document.body),o.default(this._element).on(vt,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&d.reflow(this._backdrop),o.default(this._backdrop).addClass(ct),!t)return;if(!n)return void t();var i=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){o.default(this._backdrop).removeClass(ct);var a=function(){e._removeBackdrop(),t&&t()};if(o.default(this._element).hasClass(dt)){var s=d.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Ut={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},Mt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Wt=function(){function t(t,e){if("undefined"==typeof a.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=o.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass(Rt))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(e);var n=d.findShadowRoot(this.element),i=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var s=this.getTipElement(),l=d.getUID(this.constructor.NAME);s.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&o.default(s).addClass(Lt);var r="function"==typeof this.config.placement?this.config.placement.call(this,s,this.element):this.config.placement,u=this._getAttachment(r);this.addAttachmentClass(u);var f=this._getContainer();o.default(s).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(s).appendTo(f),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new a.default(this.element,s,this._getPopperConfig(u)),o.default(s).addClass(Rt),o.default(s).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,o.default(t.element).trigger(t.constructor.Event.SHOWN),e===qt&&t._leave(null,t)};if(o.default(this.tip).hasClass(Lt)){var h=d.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(d.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=o.default.Event(this.constructor.Event.HIDE),a=function(){e._hoverState!==xt&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),o.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(o.default(this.element).trigger(i),!i.isDefaultPrevented()){if(o.default(n).removeClass(Rt),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,o.default(this.tip).hasClass(Lt)){var s=d.getTransitionDurationFromElement(n);o.default(n).one(d.TRANSITION_END,a).emulateTransitionEnd(s)}else a();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(o.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),o.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=At(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?o.default(e).parent().is(t)||t.empty().append(e):t.text(o.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:d.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},e._getAttachment=function(t){return Bt[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)o.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n=e===Ft?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i=e===Ft?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;o.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Qt:Ft]=!0),o.default(e.getTipElement()).hasClass(Rt)||e._hoverState===xt?e._hoverState=xt:(clearTimeout(e._timeout),e._hoverState=xt,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===xt&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Qt:Ft]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=qt,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===qt&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=o.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Pt.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d.typeCheckConfig(It,t,this.constructor.DefaultType),t.sanitize&&(t.template=At(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(jt);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(o.default(t).removeClass(Lt),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(kt),a="object"==typeof e&&e;if((i||!/dispose|hide/.test(e))&&(i||(i=new t(this,a),n.data(kt,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return Ht}},{key:"NAME",get:function(){return It}},{key:"DATA_KEY",get:function(){return kt}},{key:"Event",get:function(){return Mt}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Ut}}]),t}();o.default.fn.tooltip=Wt._jQueryInterface,o.default.fn.tooltip.Constructor=Wt,o.default.fn.tooltip.noConflict=function(){return o.default.fn.tooltip=Ot,Wt._jQueryInterface};var Vt="bs.popover",zt=o.default.fn.popover,Kt=new RegExp("(^|\\s)bs-popover\\S+","g"),Xt=r({},Wt.Default,{placement:"right",trigger:"click",content:"",template:''}),Yt=r({},Wt.DefaultType,{content:"(string|element|function)"}),$t={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Jt=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,u(e,n);var a=i.prototype;return a.isWithContent=function(){return this.getTitle()||this._getContent()},a.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-popover-"+t)},a.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},a.setContent=function(){var t=o.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},a._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},a._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(Kt);null!==e&&e.length>0&&t.removeClass(e.join(""))},i._jQueryInterface=function(t){return this.each((function(){var e=o.default(this).data(Vt),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new i(this,n),o.default(this).data(Vt,e)),"string"==typeof t)){if("undefined"==typeof e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},l(i,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"Default",get:function(){return Xt}},{key:"NAME",get:function(){return"popover"}},{key:"DATA_KEY",get:function(){return Vt}},{key:"Event",get:function(){return $t}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Yt}}]),i}(Wt);o.default.fn.popover=Jt._jQueryInterface,o.default.fn.popover.Constructor=Jt,o.default.fn.popover.noConflict=function(){return o.default.fn.popover=zt,Jt._jQueryInterface};var Gt="scrollspy",Zt="bs.scrollspy",te=o.default.fn[Gt],ee="active",ne="position",ie=".nav, .list-group",oe={offset:10,method:"auto",target:""},ae={offset:"number",method:"string",target:"(string|element)"},se=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":ne,n="auto"===this._config.method?e:this._config.method,i=n===ne?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,a=d.getSelectorFromElement(t);if(a&&(e=document.querySelector(a)),e){var s=e.getBoundingClientRect();if(s.width||s.height)return[o.default(e)[n]().top+i,a]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){o.default.removeData(this._element,Zt),o.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},oe,"object"==typeof t&&t?t:{})).target&&d.isElement(t.target)){var e=o.default(t.target).attr("id");e||(e=d.getUID(Gt),o.default(t.target).attr("id",e)),t.target="#"+e}return d.typeCheckConfig(Gt,t,ae),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active",ge=function(){function t(t){this._element=t}var e=t.prototype;return e.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&o.default(this._element).hasClass(ue)||o.default(this._element).hasClass("disabled"))){var e,n,i=o.default(this._element).closest(".nav, .list-group")[0],a=d.getSelectorFromElement(this._element);if(i){var s="UL"===i.nodeName||"OL"===i.nodeName?he:ce;n=(n=o.default.makeArray(o.default(i).find(s)))[n.length-1]}var l=o.default.Event("hide.bs.tab",{relatedTarget:this._element}),r=o.default.Event("show.bs.tab",{relatedTarget:n});if(n&&o.default(n).trigger(l),o.default(this._element).trigger(r),!r.isDefaultPrevented()&&!l.isDefaultPrevented()){a&&(e=document.querySelector(a)),this._activate(this._element,i);var u=function(){var e=o.default.Event("hidden.bs.tab",{relatedTarget:t._element}),i=o.default.Event("shown.bs.tab",{relatedTarget:n});o.default(n).trigger(e),o.default(t._element).trigger(i)};e?this._activate(e,e.parentNode,u):u()}}},e.dispose=function(){o.default.removeData(this._element,le),this._element=null},e._activate=function(t,e,n){var i=this,a=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?o.default(e).children(ce):o.default(e).find(he))[0],s=n&&a&&o.default(a).hasClass(fe),l=function(){return i._transitionComplete(t,a,n)};if(a&&s){var r=d.getTransitionDurationFromElement(a);o.default(a).removeClass(de).one(d.TRANSITION_END,l).emulateTransitionEnd(r)}else l()},e._transitionComplete=function(t,e,n){if(e){o.default(e).removeClass(ue);var i=o.default(e.parentNode).find("> .dropdown-menu .active")[0];i&&o.default(i).removeClass(ue),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}o.default(t).addClass(ue),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),d.reflow(t),t.classList.contains(fe)&&t.classList.add(de);var a=t.parentNode;if(a&&"LI"===a.nodeName&&(a=a.parentNode),a&&o.default(a).hasClass("dropdown-menu")){var s=o.default(t).closest(".dropdown")[0];if(s){var l=[].slice.call(s.querySelectorAll(".dropdown-toggle"));o.default(l).addClass(ue)}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(le);if(i||(i=new t(this),n.data(le,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}}]),t}();o.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),ge._jQueryInterface.call(o.default(this),"show")})),o.default.fn.tab=ge._jQueryInterface,o.default.fn.tab.Constructor=ge,o.default.fn.tab.noConflict=function(){return o.default.fn.tab=re,ge._jQueryInterface};var me="bs.toast",pe=o.default.fn.toast,_e="hide",ve="show",ye="showing",be="click.dismiss.bs.toast",Ee={animation:!0,autohide:!0,delay:500},Te={animation:"boolean",autohide:"boolean",delay:"number"},we=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=o.default.Event("show.bs.toast");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove(ye),t._element.classList.add(ve),o.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove(_e),d.reflow(this._element),this._element.classList.add(ye),this._config.animation){var i=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains(ve)){var t=o.default.Event("hide.bs.toast");o.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains(ve)&&this._element.classList.remove(ve),o.default(this._element).off(be),o.default.removeData(this._element,me),this._element=null,this._config=null},e._getConfig=function(t){return t=r({},Ee,o.default(this._element).data(),"object"==typeof t&&t?t:{}),d.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;o.default(this._element).on(be,'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add(_e),o.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove(ve),this._config.animation){var n=d.getTransitionDurationFromElement(this._element);o.default(this._element).one(d.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data(me);if(i||(i=new t(this,"object"==typeof e&&e),n.data(me,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e](this)}}))},l(t,null,[{key:"VERSION",get:function(){return"4.6.1"}},{key:"DefaultType",get:function(){return Te}},{key:"Default",get:function(){return Ee}}]),t}();o.default.fn.toast=we._jQueryInterface,o.default.fn.toast.Constructor=we,o.default.fn.toast.noConflict=function(){return o.default.fn.toast=pe,we._jQueryInterface},t.Alert=g,t.Button=E,t.Carousel=P,t.Collapse=V,t.Dropdown=lt,t.Modal=Ct,t.Popover=Jt,t.Scrollspy=se,t.Tab=ge,t.Toast=we,t.Tooltip=Wt,t.Util=d,Object.defineProperty(t,"__esModule",{value:!0})})); diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_alert.scss b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_alert.scss new file mode 100644 index 0000000..4aa1fc2 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_alert.scss @@ -0,0 +1,52 @@ +// +// Base styles +// + +.alert { + position: relative; + padding: $alert-padding-y $alert-padding-x; + margin-bottom: $alert-margin-bottom; + border: $alert-border-width solid transparent; + @include border-radius($alert-border-radius); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $close-font-size + $alert-padding-x * 2; + + // Adjust close link position + .close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: $alert-padding-y $alert-padding-x; + color: inherit; + } +} + + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +@each $color, $value in $theme-colors { + .alert-#{$color} { + @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_badge.scss b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_badge.scss new file mode 100644 index 0000000..42c5d08 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_badge.scss @@ -0,0 +1,54 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + display: inline-block; + padding: $badge-padding-y $badge-padding-x; + @include font-size($badge-font-size); + font-weight: $badge-font-weight; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius($badge-border-radius); + @include transition($badge-transition); + + @at-root a#{&} { + @include hover-focus() { + text-decoration: none; + } + } + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} + +// Pill badges +// +// Make them extra rounded with a modifier to replace v3's badges. + +.badge-pill { + padding-right: $badge-pill-padding-x; + padding-left: $badge-pill-padding-x; + @include border-radius($badge-pill-border-radius); +} + +// Colors +// +// Contextual variations (linked badges get darker on :hover). + +@each $color, $value in $theme-colors { + .badge-#{$color} { + @include badge-variant($value); + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_breadcrumb.scss b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_breadcrumb.scss new file mode 100644 index 0000000..9c204c7 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_breadcrumb.scss @@ -0,0 +1,42 @@ +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: $breadcrumb-padding-y $breadcrumb-padding-x; + margin-bottom: $breadcrumb-margin-bottom; + @include font-size($breadcrumb-font-size); + list-style: none; + background-color: $breadcrumb-bg; + @include border-radius($breadcrumb-border-radius); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: $breadcrumb-item-padding; + + &::before { + float: left; // Suppress inline spacings and underlining of the separator + padding-right: $breadcrumb-item-padding; + color: $breadcrumb-divider-color; + content: escape-svg($breadcrumb-divider); + } + } + + // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built + // without `
    `s. The `::before` pseudo-element generates an element + // *within* the .breadcrumb-item and thereby inherits the `text-decoration`. + // + // To trick IE into suppressing the underline, we give the pseudo-element an + // underline and then immediately remove it. + + .breadcrumb-item:hover::before { + text-decoration: underline; + } + // stylelint-disable-next-line no-duplicate-selectors + + .breadcrumb-item:hover::before { + text-decoration: none; + } + + &.active { + color: $breadcrumb-active-color; + } +} diff --git a/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_button-group.scss b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_button-group.scss new file mode 100644 index 0000000..da02d79 --- /dev/null +++ b/public/typo3conf/ext/bootstrap_package/Resources/Public/Contrib/bootstrap4/scss/_button-group.scss @@ -0,0 +1,163 @@ +// stylelint-disable selector-no-qualifying-type + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + flex: 1 1 auto; + + // Bring the hover, focused, and "active" buttons to the front to overlay + // the borders properly + @include hover() { + z-index: 1; + } + &:focus, + &:active, + &.active { + z-index: 1; + } + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + + .input-group { + width: auto; + } +} + +.btn-group { + // Prevent double borders when buttons are next to each other + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-left: -$btn-border-width; + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-right-radius(0); + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) > .btn { + @include border-left-radius(0); + } +} + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// +// Split button dropdowns +// + +.dropdown-toggle-split { + padding-right: $btn-padding-x * .75; + padding-left: $btn-padding-x * .75; + + &::after, + .dropup &::after, + .dropright &::after { + margin-left: 0; + } + + .dropleft &::before { + margin-right: 0; + } +} + +.btn-sm + .dropdown-toggle-split { + padding-right: $btn-padding-x-sm * .75; + padding-left: $btn-padding-x-sm * .75; +} + +.btn-lg + .dropdown-toggle-split { + padding-right: $btn-padding-x-lg * .75; + padding-left: $btn-padding-x-lg * .75; +} + + +// The clickable button for toggling the menu +// Set the same inset shadow as the :active state +.btn-group.show .dropdown-toggle { + @include box-shadow($btn-active-box-shadow); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// +// Vertical button groups +// + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; + + > .btn, + > .btn-group { + width: 100%; + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) { + margin-top: -$btn-border-width; + } + + // Reset rounded corners + > .btn:not(:last-child):not(.dropdown-toggle), + > .btn-group:not(:last-child) > .btn { + @include border-bottom-radius(0); + } + + > .btn:not(:first-child), + > .btn-group:not(:first-child) > .btn { + @include border-top-radius(0); + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +// `display: none;` or `visibility: hidden;` as that also hides the popover. +// Simply visually hiding the inputs via `opacity` would leave them clickable in +// certain cases which is prevented by using `clip` and `pointer-events`. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. + +.btn-group-toggle { + > .btn, + > .btn-group > .btn { + margin-bottom: 0; // Override default `