Merge branch 'master' into dist/envole/7/master

This commit is contained in:
Arnaud Fornerot 2020-11-27 09:33:58 +01:00
commit 09b456becc
97 changed files with 2782 additions and 133 deletions

View File

@ -16,7 +16,7 @@
<!-- template -->
<file filelist='nineschool' name='/etc/apache2/sites-available/nineschool' source='nineschool-apache.conf' />
<file filelist='nineschool' name='/var/www/html/nineschool/.env.local' source='nineschool-env.local' rm='True'/>
<file filelist='ninegate' name='/etc/cron.d/nineschool' source='nineschool.cron' rm='True'/>
<file filelist='nineschool' name='/etc/cron.d/nineschool' source='nineschool.cron' rm='True'/>
</container>
</containers>

View File

@ -1,10 +1,16 @@
// JQuery
window.$ = window.jQuery = require('jquery');
// JQueryui
require('jqueryui');
// Bootstrap
require('bootstrap');
require('bootstrap/dist/css/bootstrap.min.css');
// timepicki
const timepicki = require('timepicki/js/timepicki.js');
// Datatables
require('datatables.net-bs4');
require('./datatables.init.js');
@ -13,14 +19,29 @@ require('datatables.net-bs4/css/dataTables.bootstrap4.min.css');
// Fontawesome
require('@fortawesome/fontawesome-free/css/all.css');
// bs-stepper
require('bs-stepper/dist/css/bs-stepper.min.css');
const Stepper = require('bs-stepper/dist/js/bs-stepper.min.js');
global.Stepper = Stepper;
// Masonery
const masonry = require('masonry-layout/dist/masonry.pkgd.min.js');
global.masonry = masonry;
// Slick
require('slick-carousel/slick/slick.css');
const slick = require('slick-carousel/slick/slick.min.js');
global.slick = slick;
// Imageloaded
const imagesLoaded = require('imagesloaded/imagesloaded.js');
global.imagesLoaded = imagesLoaded;
// Moment
const moment = require('moment');
global.moment = moment;
require('moment/locale/fr.js');
// TempusDominus
require('tempusdominus-bootstrap-4');
// Select2
require('select2');
require('select2/dist/js/i18n/fr.js');

View File

@ -5,6 +5,7 @@
"php": "^7.1.3",
"ext-ctype": "*",
"ext-iconv": "*",
"cboden/ratchet": "^0.4.3",
"doctrine/annotations": "^1.8",
"friendsofsymfony/ckeditor-bundle": "^2.2",
"friendsofsymfony/rest-bundle": "^3.0",
@ -14,6 +15,7 @@
"nategood/httpful": "^0.3.2",
"nelmio/api-doc-bundle": "^3.6",
"oneup/uploader-bundle": "^3.0",
"ramsey/uuid": "^4.1",
"sensio/framework-extra-bundle": "^5.1",
"symfony/apache-pack": "^1.0",
"symfony/asset": "5.1.*",

View File

@ -4,8 +4,111 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "dcf29a3826720301ab52c6fe3543f7bd",
"content-hash": "6e17c24e8ecdd92e1fa9b4738c5c94f3",
"packages": [
{
"name": "brick/math",
"version": "0.9.1",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
"reference": "283a40c901101e66de7061bd359252c013dcc43c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/283a40c901101e66de7061bd359252c013dcc43c",
"reference": "283a40c901101e66de7061bd359252c013dcc43c",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": "^7.1|^8.0"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
"phpunit/phpunit": "^7.5.15|^8.5",
"vimeo/psalm": "^3.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Brick\\Math\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Arbitrary-precision arithmetic library",
"keywords": [
"Arbitrary-precision",
"BigInteger",
"BigRational",
"arithmetic",
"bigdecimal",
"bignum",
"brick",
"math"
],
"time": "2020-08-18T23:57:15+00:00"
},
{
"name": "cboden/ratchet",
"version": "v0.4.3",
"source": {
"type": "git",
"url": "https://github.com/ratchetphp/Ratchet.git",
"reference": "466a0ecc83209c75b76645eb823401b5c52e5f21"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ratchetphp/Ratchet/zipball/466a0ecc83209c75b76645eb823401b5c52e5f21",
"reference": "466a0ecc83209c75b76645eb823401b5c52e5f21",
"shasum": ""
},
"require": {
"guzzlehttp/psr7": "^1.0",
"php": ">=5.4.2",
"ratchet/rfc6455": "^0.3",
"react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5",
"symfony/http-foundation": "^2.6|^3.0|^4.0|^5.0",
"symfony/routing": "^2.6|^3.0|^4.0|^5.0"
},
"require-dev": {
"phpunit/phpunit": "~4.8"
},
"type": "library",
"autoload": {
"psr-4": {
"Ratchet\\": "src/Ratchet"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"role": "Developer"
},
{
"name": "Matt Bonneau",
"role": "Developer"
}
],
"description": "PHP WebSocket library",
"homepage": "http://socketo.me",
"keywords": [
"Ratchet",
"WebSockets",
"server",
"sockets",
"websocket"
],
"time": "2020-07-07T15:50:14+00:00"
},
{
"name": "doctrine/annotations",
"version": "1.10.3",
@ -1165,6 +1268,7 @@
"reflection",
"static"
],
"abandoned": "roave/better-reflection",
"time": "2020-03-27T11:06:43+00:00"
},
{
@ -1278,6 +1382,49 @@
],
"time": "2020-06-16T20:11:17+00:00"
},
{
"name": "evenement/evenement",
"version": "v3.0.1",
"source": {
"type": "git",
"url": "https://github.com/igorw/evenement.git",
"reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
"reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
"shasum": ""
},
"require": {
"php": ">=7.0"
},
"require-dev": {
"phpunit/phpunit": "^6.0"
},
"type": "library",
"autoload": {
"psr-0": {
"Evenement": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Igor Wiedler",
"email": "igor@wiedler.ch"
}
],
"description": "Événement is a very simple event dispatching library for PHP",
"keywords": [
"event-dispatcher",
"event-emitter"
],
"time": "2017-07-23T21:35:13+00:00"
},
{
"name": "exsyst/swagger",
"version": "v0.4.1",
@ -1496,6 +1643,77 @@
],
"time": "2020-06-29T11:19:01+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "1.7.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3",
"reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.7-dev"
}
},
"autoload": {
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Schultze",
"homepage": "https://github.com/Tobion"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
"psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
"time": "2020-09-30T07:37:11+00:00"
},
{
"name": "jasig/phpcas",
"version": "1.3.8",
@ -2495,6 +2713,56 @@
],
"time": "2019-01-08T18:20:26+00:00"
},
{
"name": "psr/http-message",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
"require": {
"php": ">=5.3.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": "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"
],
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "psr/link",
"version": "1.0.0",
@ -2591,6 +2859,627 @@
],
"time": "2020-03-23T09:12:05+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.",
"time": "2019-03-08T08:55:37+00:00"
},
{
"name": "ramsey/collection",
"version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/ramsey/collection.git",
"reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ramsey/collection/zipball/24d93aefb2cd786b7edd9f45b554aea20b28b9b1",
"reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8"
},
"require-dev": {
"captainhook/captainhook": "^5.3",
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
"ergebnis/composer-normalize": "^2.6",
"fzaninotto/faker": "^1.5",
"hamcrest/hamcrest-php": "^2",
"jangregor/phpstan-prophecy": "^0.6",
"mockery/mockery": "^1.3",
"phpstan/extension-installer": "^1",
"phpstan/phpstan": "^0.12.32",
"phpstan/phpstan-mockery": "^0.12.5",
"phpstan/phpstan-phpunit": "^0.12.11",
"phpunit/phpunit": "^8.5",
"psy/psysh": "^0.10.4",
"slevomat/coding-standard": "^6.3",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^3.12.2"
},
"type": "library",
"autoload": {
"psr-4": {
"Ramsey\\Collection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ben Ramsey",
"email": "ben@benramsey.com",
"homepage": "https://benramsey.com"
}
],
"description": "A PHP 7.2+ library for representing and manipulating collections.",
"keywords": [
"array",
"collection",
"hash",
"map",
"queue",
"set"
],
"time": "2020-09-10T20:58:17+00:00"
},
{
"name": "ramsey/uuid",
"version": "4.1.1",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
"reference": "cd4032040a750077205918c86049aa0f43d22947"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947",
"reference": "cd4032040a750077205918c86049aa0f43d22947",
"shasum": ""
},
"require": {
"brick/math": "^0.8 || ^0.9",
"ext-json": "*",
"php": "^7.2 || ^8",
"ramsey/collection": "^1.0",
"symfony/polyfill-ctype": "^1.8"
},
"replace": {
"rhumsaa/uuid": "self.version"
},
"require-dev": {
"codeception/aspect-mock": "^3",
"dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0",
"doctrine/annotations": "^1.8",
"goaop/framework": "^2",
"mockery/mockery": "^1.3",
"moontoast/math": "^1.1",
"paragonie/random-lib": "^2",
"php-mock/php-mock-mockery": "^1.3",
"php-mock/php-mock-phpunit": "^2.5",
"php-parallel-lint/php-parallel-lint": "^1.1",
"phpbench/phpbench": "^0.17.1",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^0.12",
"phpstan/phpstan-mockery": "^0.12",
"phpstan/phpstan-phpunit": "^0.12",
"phpunit/phpunit": "^8.5",
"psy/psysh": "^0.10.0",
"slevomat/coding-standard": "^6.0",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "3.9.4"
},
"suggest": {
"ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
"ext-ctype": "Enables faster processing of character classification using ctype functions.",
"ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
"ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
"paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
"ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.x-dev"
}
},
"autoload": {
"psr-4": {
"Ramsey\\Uuid\\": "src/"
},
"files": [
"src/functions.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
"homepage": "https://github.com/ramsey/uuid",
"keywords": [
"guid",
"identifier",
"uuid"
],
"time": "2020-08-18T17:17:46+00:00"
},
{
"name": "ratchet/rfc6455",
"version": "v0.3",
"source": {
"type": "git",
"url": "https://github.com/ratchetphp/RFC6455.git",
"reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ratchetphp/RFC6455/zipball/c8651c7938651c2d55f5d8c2422ac5e57a183341",
"reference": "c8651c7938651c2d55f5d8c2422ac5e57a183341",
"shasum": ""
},
"require": {
"guzzlehttp/psr7": "^1.0",
"php": ">=5.4.2"
},
"require-dev": {
"phpunit/phpunit": "5.7.*",
"react/socket": "^1.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Ratchet\\RFC6455\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"role": "Developer"
},
{
"name": "Matt Bonneau",
"role": "Developer"
}
],
"description": "RFC6455 WebSocket protocol handler",
"homepage": "http://socketo.me",
"keywords": [
"WebSockets",
"rfc6455",
"websocket"
],
"time": "2020-05-15T18:31:24+00:00"
},
{
"name": "react/cache",
"version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/cache.git",
"reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/cache/zipball/44a568925556b0bd8cacc7b49fb0f1cf0d706a0c",
"reference": "44a568925556b0bd8cacc7b49fb0f1cf0d706a0c",
"shasum": ""
},
"require": {
"php": ">=5.3.0",
"react/promise": "^3.0 || ^2.0 || ^1.1"
},
"require-dev": {
"phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35"
},
"type": "library",
"autoload": {
"psr-4": {
"React\\Cache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Async, Promise-based cache interface for ReactPHP",
"keywords": [
"cache",
"caching",
"promise",
"reactphp"
],
"time": "2020-09-18T12:12:35+00:00"
},
{
"name": "react/dns",
"version": "v1.4.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/dns.git",
"reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/dns/zipball/665260757171e2ab17485b44e7ffffa7acb6ca1f",
"reference": "665260757171e2ab17485b44e7ffffa7acb6ca1f",
"shasum": ""
},
"require": {
"php": ">=5.3.0",
"react/cache": "^1.0 || ^0.6 || ^0.5",
"react/event-loop": "^1.0 || ^0.5",
"react/promise": "^3.0 || ^2.7 || ^1.2.1",
"react/promise-timer": "^1.2"
},
"require-dev": {
"clue/block-react": "^1.2",
"phpunit/phpunit": "^9.3 || ^4.8.35"
},
"type": "library",
"autoload": {
"psr-4": {
"React\\Dns\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Async DNS resolver for ReactPHP",
"keywords": [
"async",
"dns",
"dns-resolver",
"reactphp"
],
"time": "2020-09-18T12:12:55+00:00"
},
{
"name": "react/event-loop",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/reactphp/event-loop.git",
"reference": "6d24de090cd59cfc830263cfba965be77b563c13"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13",
"reference": "6d24de090cd59cfc830263cfba965be77b563c13",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
},
"suggest": {
"ext-event": "~1.0 for ExtEventLoop",
"ext-pcntl": "For signal handling support when using the StreamSelectLoop",
"ext-uv": "* for ExtUvLoop"
},
"type": "library",
"autoload": {
"psr-4": {
"React\\EventLoop\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
"keywords": [
"asynchronous",
"event-loop"
],
"time": "2020-01-01T18:39:52+00:00"
},
{
"name": "react/promise",
"version": "v2.8.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise.git",
"reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4",
"reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4",
"shasum": ""
},
"require": {
"php": ">=5.4.0"
},
"require-dev": {
"phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36"
},
"type": "library",
"autoload": {
"psr-4": {
"React\\Promise\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com"
}
],
"description": "A lightweight implementation of CommonJS Promises/A for PHP",
"keywords": [
"promise",
"promises"
],
"time": "2020-05-12T15:16:56+00:00"
},
{
"name": "react/promise-timer",
"version": "v1.6.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/promise-timer.git",
"reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/promise-timer/zipball/daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
"reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
"shasum": ""
},
"require": {
"php": ">=5.3",
"react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
"react/promise": "^3.0 || ^2.7.0 || ^1.2.1"
},
"require-dev": {
"phpunit/phpunit": "^9.0 || ^5.7 || ^4.8.35"
},
"type": "library",
"autoload": {
"psr-4": {
"React\\Promise\\Timer\\": "src/"
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@lueck.tv"
}
],
"description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.",
"homepage": "https://github.com/reactphp/promise-timer",
"keywords": [
"async",
"event-loop",
"promise",
"reactphp",
"timeout",
"timer"
],
"time": "2020-07-10T12:18:06+00:00"
},
{
"name": "react/socket",
"version": "v1.6.0",
"source": {
"type": "git",
"url": "https://github.com/reactphp/socket.git",
"reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/socket/zipball/e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
"reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.0",
"react/dns": "^1.1",
"react/event-loop": "^1.0 || ^0.5",
"react/promise": "^2.6.0 || ^1.2.1",
"react/promise-timer": "^1.4.0",
"react/stream": "^1.1"
},
"require-dev": {
"clue/block-react": "^1.2",
"phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
"react/promise-stream": "^1.2"
},
"type": "library",
"autoload": {
"psr-4": {
"React\\Socket\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "christian@clue.engineering",
"homepage": "https://clue.engineering/"
},
{
"name": "Cees-Jan Kiewiet",
"email": "reactphp@ceesjankiewiet.nl",
"homepage": "https://wyrihaximus.net/"
},
{
"name": "Jan Sorgalla",
"email": "jsorgalla@gmail.com",
"homepage": "https://sorgalla.com/"
},
{
"name": "Chris Boden",
"email": "cboden@gmail.com",
"homepage": "https://cboden.dev/"
}
],
"description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
"keywords": [
"Connection",
"Socket",
"async",
"reactphp",
"stream"
],
"time": "2020-08-28T12:49:05+00:00"
},
{
"name": "react/stream",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/reactphp/stream.git",
"reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/reactphp/stream/zipball/7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
"reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
"shasum": ""
},
"require": {
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"php": ">=5.3.8",
"react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5"
},
"require-dev": {
"clue/stream-filter": "~1.2",
"phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
},
"type": "library",
"autoload": {
"psr-4": {
"React\\Stream\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
"keywords": [
"event-driven",
"io",
"non-blocking",
"pipe",
"reactphp",
"readable",
"stream",
"writable"
],
"time": "2020-05-04T10:17:57+00:00"
},
{
"name": "sensio/framework-extra-bundle",
"version": "v5.5.6",

View File

@ -12,6 +12,8 @@ twig:
appName: '%appName%'
appCron: '%appCron%'
appMasteridentity: '%appMasteridentity%'
wssuse: '%wssuse%'
wssurl: '%wssurl%'
sondeUse: '%sondeUse%'
sondeUrl: '%sondeUrl%'

View File

@ -53,6 +53,20 @@ app_config_logo:
path: /admin/config/logo
defaults: { _controller: App\Controller\ConfigController:logo }
#== Theme ================================================================================================================
app_theme:
path: /admin/theme
defaults: { _controller: App\Controller\ThemeController:list }
app_theme_select:
path: /admin/theme/select/{name}
defaults: { _controller: App\Controller\ThemeController:select, name: "" }
#== Wss ==================================================================================================================
app_wss_sample:
path: /user/wss/sampble
defaults: { _controller: App\Controller\WebsocketController:sample }
#== Sonde ================================================================================================================
app_sonde:
path: /sonde
@ -67,6 +81,10 @@ app_crop02:
path: /user/crop02/{type}/{reportinput}
defaults: { _controller: App\Controller\CropController:crop02 }
app_ckupload:
path: /user/ckupload
defaults: { _controller: App\Controller\CropController:ckupload }
oneup_uploader:
resource: .
type: uploader

View File

@ -47,6 +47,10 @@ parameters:
casLastname: '%env(resolve:CAS_LASTNAME)%'
casFirstname: '%env(resolve:CAS_FIRSTNAME)%'
wssuse: '%env(resolve:WSS_USE)%'
wssport: '%env(resolve:WSS_PORT)%'
wssurl: 'wss://%env(resolve:APP_WEBURL)%/wss%env(resolve:APP_ALIAS)%'
proxyUse: '%env(resolve:PROXY_USE)%'
proxyHost: '%env(resolve:PROXY_HOST)%'
proxyPort: '%env(resolve:PROXY_PORT)%'

View File

@ -0,0 +1,174 @@
@font-face {
font-family: 'Redressed';
src: url('../fonts/Redressed-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Acme-Regular';
src: url('../fonts/Acme-Regular-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Peacesans';
src: url('../fonts/Peacesans-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Roboto-Regular';
src: url('../fonts/Roboto-Regular-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Justanotherhand-Regular';
src: url('../fonts/Justanotherhand-Regular-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Lato-Regular';
src: url('../fonts/Lato-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'ABeeZee-Regular';
src: url('../fonts/ABeeZee-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'AlfaSlabOne-Regular';
src: url('../fonts/AlfaSlabOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Anton-Regular';
src: url('../fonts/Anton-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'FredokaOne-Regular';
src: url('../fonts/FredokaOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Overpass-Black';
src: url('../fonts/Overpass-Black.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Righteous-Regular';
src: url('../fonts/Righteous-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Signika-Regular';
src: url('../fonts/Signika-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Teko-Bold';
src: url('../fonts/Teko-Bold.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'LuckiestGuy-Regular';
src: url('../fonts/LuckiestGuy-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Baloo-Regular';
src: url('../fonts/Baloo-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'CarterOne-Regular';
src: url('../fonts/CarterOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Chewy-Regular';
src: url('../fonts/Chewy-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Courgette-Regular';
src: url('../fonts/Courgette-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'LexendDeca-Regular';
src: url('../fonts/LexendDeca-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'RubikMonoOne-Regular';
src: url('../fonts/RubikMonoOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'SigmarOne-Regular';
src: url('../fonts/SigmarOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Viga-Regular';
src: url('../fonts/Viga-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Grandstander';
src: url('../fonts/Grandstander-Black.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'PassionOne';
src: url('../fonts/PassionOne-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}

View File

@ -0,0 +1,465 @@
h1{
padding: 40px 0px 9px 0px;
border-bottom: 1px solid #eee;
}
.nav a{
background: none;
color: #CFD8DC;
font-size: 14px;
padding: 5px 0px 5px 25px;
display: block;
}
.page-maxed {
max-width:1200px;
margin:auto !important;
}
/* Sidebar Styles */
.contentsidebar {
margin-left:250px;
}
#sidebar {
z-index: 1000;
position: fixed;
left: 0px;
width: 250px;
height: 100%;
overflow-y: auto;
background: #37474F;
}
#sidebar header {
background-color: #263238;
font-size: 20px;
line-height: 52px;
text-align: center;
}
#sidebar header a {
color: #fff;
display: block;
text-decoration: none;
}
#sidebar header a:hover {
color: #fff;
}
#sidebar .nav{
display: block;
margin: 0px 10px;
}
#sidebar .nav a {
padding: 0px 10px 5px 10px;
}
#sidebar .nav .last{
border-bottom: 1px solid #455A64;
padding-bottom:5px;
margin-bottom: 10px;
}
#sidebar .title {
color: #CFD8DC;
font-size: 16px;
padding: 0px 10px 0px 10px;
display: block;
text-transform: uppercase;
margin-left: 0px !important;
font-weight: bold;
}
#sidebar .nav a:hover{
background: none;
color: #ECEFF1;
}
#sidebar .nav a i{
margin-right: 5px;
width: 20px;
text-align: center;
}
#sidebar .nav .select-control {
padding: 0px 10px 5px 10px;
margin-top: -12px;
}
.avatar {
background-color: #343a40;
width: 35px;
height: 35px;
border-radius: 100%;
margin-top: -5px;
}
.avatar.big{
width: 90px;
height: 90px;
margin-bottom: 10px;
}
@media (max-width: 991px) {
.contentsidebar {
margin-left: auto;
}
#sidebar {
position: static;
margin:0px -15px;
width: auto;
}
}
a.btn {
color:#ffffff;
}
.btn-link {
padding:0px;
}
.media-body p {
font-size :12px;
margin-bottom:0px;
}
@media (min-width: 992px) {
#sidebar {
display: block;
}
}
{% if useheader is defined and useheader %}
#main {
padding-top:55px;
}
{% endif %}
th.dt-center, td.dt-center { text-align: center; }
/* heros */
.heroheader {
width:100%;
height:800px;
position:relative;
}
.heroheader div{
width:100%;
height:100%;
background-size: cover;
background-position: center;
color:#fff;
text-align: center;
}
/* Dots */
.slick-dotted.slick-slider
{
margin-bottom: 30px;
}
.slick-dots
{
position: absolute;
bottom: -105px;
display: block;
width: 100%;
padding: 0;
margin: 0;
list-style: none;
text-align: center;
}
.slick-dots li
{
position: relative;
display: inline-block;
width: 20px;
height: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button
{
font-size: 0;
line-height: 0;
display: block;
width: 20px;
height: 20px;
padding: 5px;
cursor: pointer;
color: transparent;
border: 0;
outline: none;
background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus
{
outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before
{
opacity: 1;
}
.slick-dots li button:before
{
font-family: 'slick';
font-size: 6px;
line-height: 20px;
position: absolute;
top: 0;
left: 0;
width: 20px;
height: 20px;
content: '•';
text-align: center;
opacity: .25;
color: black;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before
{
opacity: .75;
color: black;
}
.slick-dotted.slick-slider{margin-bottom:0px;}
.slick-dots {
position: absolute;
top: 135px;
left:46px;
text-align:left;
z-index: 9100;
bottom:unset;
width:auto;
}
.heroheader-dot { color:#fff; }
.herobox {
position:absolute;
float: left;
top: 0;
bottom: 0;
left: -200px;
z-index: 8000;
padding: 0;
text-align: center;
text-shadow: none;
background-color: rgba(0,0,0,0.7);
height: auto;
width: 45%;
box-shadow: 0px -1px 2px rgba(0,0,0,0.5);
margin: 0 auto;
//opacity: 0.9;
transform-origin: 50% 50%;
transform: skew(-20deg);
-webkit-transform: skew(-20deg);
-moz-transform: skew(-20deg);
-o-transform: skew(-20deg);
-ms-transform: skew(-20deg);
border-left: 1px solid #fff;
border-right: 1px solid #fff;
}
.herotitle {
text-align: left;
position:absolute;
//width:100%;
top: 80px;
left:50px;
z-index: 9000;
}
.herotitle h1 {
padding:0px;
border:none;
}
.heromenu {
padding-top: 30px;
font-size: 20px;
}
.herofloatmenu .avatar {
width: 20px;
height: 20px;
margin: 3px 3px 0px 0px;
}
.herofloatmenu a:hover {
text-decoration: none;
}
.heromenu .linkmenu {
font-size:16px;
padding-left: 5px;
}
.heromenu .linkmenu a {
margin-right:5px;
}
.herologo {
position: absolute;
top: 0px;
text-align: center;
width: 100%;
}
.herologo img {max-height:200px;}
@media (max-width: 980px) {
.herobox { display: none; }
.herotitle { width:100%; top: 70px; left:0px; text-align:center; }
.slick-dots { top: 120px; left: 0px; text-align: center; width: 100%; }
.heromenu .facatmenu {display: none;}
.catmenu { display:none }
.linkmenu { display:none }
.herofloatmenu a {
font-size: 40px;
}
.herofloatmenu .avatar {
height: 40px;
width:40px;
margin-top:15px;
}
}
.grid-sizer { width: 10%; margin-bottom: 0%;float:left;}
.grid-item-size { width: 10%; margin-bottom: 0%;float:left;}
.grid-item-size-2 { width: 20%; margin-bottom: 0%;float:left;}
.grid-item-size-3 { width: 30%; margin-bottom: 0%;float:left;}
.grid-item-size-4 { width: 40%; margin-bottom: 0%;float:left;}
.grid-item-size-5 { width: 40%; margin-bottom: 0%;float:left;}
.grid-item-size-6 { width: 60%; margin-bottom: 0%;float:left;}
.grid-item-size-7 { width: 70%; margin-bottom: 0%;float:left;}
.grid-item-size-8 { width: 80%; margin-bottom: 0%;float:left;}
.grid-item-size-9 { width: 90%; margin-bottom: 0%;float:left;}
.grid-item-full { width: 100%; margin-bottom: 0%; font-size:20px;float:left; }
.grid-item-full h1 {margin: 0; border:none; padding: 20px 0px 0px 10px; }
.gutter-sizer { width: 0%;float:left; }
@media (max-width: 980px) {
.grid-sizer { width: 50%; margin-bottom: 0%;}
.grid-item-size { width: 50%; margin-bottom: 0%;}
}
.foliomenu {
position: fixed;
width:100%;
height:60px;
background-color: var(--colorbgbodydark) ;
z-index: 100000;
display:none;
padding-left:10px;
border-bottom: 1px solid var(--colorftbodydark);
}
.foliomenu .logo { float:left; height:40px; margin-top:7px }
.foliomenu .avatar { height: 20px; margin: 3px 3px 0px 0px; width: 20px; }
.foliomenu div { padding: 10px; line-height:35px; float:left;}
.foliomenu a {
color: var(--colorftbodydark);
font-size: 15px;
}
.foliomenu .float-right a:hover {
text-decoration: none;
}
.foliomenu .fa { font-size: 14px; color: var(--colorftbodydark);}
.foliotop {
float:right;
position:fixed;
bottom: 10px;
right:10px;
z-index: 100000;
background-color: var(--colorbgbodydark) ;
padding:10px;
border-radius: 100%;
width:55px;
height:55px;
text-align: center;
line-height: 28px;
border: 1px solid var(--colorbgbodylight);
display:none;
}
.foliotop a {
color: var(--colorftbodydark);
font-size: 25px;
}
@media (max-width: 980px) {
.herofloatmenu {
display:none;
}
.foliomenu {
display: block!important;
}
.foliomenu a {
font-size:30px;
}
.foliomenu .float-right a {
margin-top: -8px;
}
.foliomenu .float-right img {
height:35px;
width:35px;
margin-top:0px;
}
.foliomenu .float-right .fa {
font-size:30px!important;
}
}
.linkurl a {
background-color: var(--colorbgbodylight) ;
color: var(--colorftbodylight)!important;
font-size: 14px;
padding: 5px;
display: inline-block;
margin: 0px 10px 10px 0px;
}
.contactdescription {
max-width:300px;
text-align:justify;
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

View File

@ -0,0 +1,3 @@
name: Nineblue
author: Arnaud Fornerot
version: 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,43 @@
:root{
--colorbgbodydark: #3a539b;
--colorfttitlelight: #3a539b;
/* Vous pouvez forcer l'ensemble de ces variables ou laisser la valeur par défaut
--colorbgbodylight: #;
--colorbgbodydark: #;
--colorfttitlelight: #;
--colorfttitledark: #;
--colorftbodylight: #;
--colorftbodydark: #;
--fontbody: "";
--fonttitle: "";
--fontsizeh1: px;
--fontsizeh2: px;
--fontsizeh3: px;
--fontsizeh4: px;
--colorbgbodylight-darker: #;
--colorfttitlelight-darker: #;
}
*/
}
/* Puis sur classer l'ensemble de la feuille de style */

View File

@ -0,0 +1,3 @@
name: Ninedark
author: Arnaud Fornerot
version: 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,44 @@
:root{
--colorbgbodydark: #2e3131;
--colorfttitlelight: #2e3131;
--colorfttitlelight-darker: #95a5a6;
/* Vous pouvez forcer l'ensemble de ces variables ou laisser la valeur par défaut
--colorbgbodylight: #;
--colorbgbodydark: #;
--colorfttitlelight: #;
--colorfttitledark: #;
--colorftbodylight: #;
--colorftbodydark: #;
--fontbody: "";
--fonttitle: "";
--fontsizeh1: px;
--fontsizeh2: px;
--fontsizeh3: px;
--fontsizeh4: px;
--colorbgbodylight-darker: #;
--colorfttitlelight-darker: #;
}
*/
}
/* Puis sur classer l'ensemble de la feuille de style */

View File

@ -0,0 +1,3 @@
name: Ninegray
author: Arnaud Fornerot
version: 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -0,0 +1,43 @@
:root{
--colorbgbodydark: #6c7a89;
--colorfttitlelight: #6c7a89;
/* Vous pouvez forcer l'ensemble de ces variables ou laisser la valeur par défaut
--colorbgbodylight: #;
--colorbgbodydark: #;
--colorfttitlelight: #;
--colorfttitledark: #;
--colorftbodylight: #;
--colorftbodydark: #;
--fontbody: "";
--fonttitle: "";
--fontsizeh1: px;
--fontsizeh2: px;
--fontsizeh3: px;
--fontsizeh4: px;
--colorbgbodylight-darker: #;
--colorfttitlelight-darker: #;
}
*/
}
/* Puis sur classer l'ensemble de la feuille de style */

View File

@ -0,0 +1,3 @@
name: Ninegreen
author: Arnaud Fornerot
version: 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,43 @@
:root{
--colorbgbodydark: #1e824c;
--colorfttitlelight: #1e824c;
/* Vous pouvez forcer l'ensemble de ces variables ou laisser la valeur par défaut
--colorbgbodylight: #;
--colorbgbodydark: #;
--colorfttitlelight: #;
--colorfttitledark: #;
--colorftbodylight: #;
--colorftbodydark: #;
--fontbody: "";
--fonttitle: "";
--fontsizeh1: px;
--fontsizeh2: px;
--fontsizeh3: px;
--fontsizeh4: px;
--colorbgbodylight-darker: #;
--colorfttitlelight-darker: #;
}
*/
}
/* Puis sur classer l'ensemble de la feuille de style */

View File

@ -0,0 +1,3 @@
name: Nineorange
author: Arnaud Fornerot
version: 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -0,0 +1,43 @@
:root{
--colorbgbodydark: #f15a22;
--colorfttitlelight: #f15a22;
/* Vous pouvez forcer l'ensemble de ces variables ou laisser la valeur par défaut
--colorbgbodylight: #;
--colorbgbodydark: #;
--colorfttitlelight: #;
--colorfttitledark: #;
--colorftbodylight: #;
--colorftbodydark: #;
--fontbody: "";
--fonttitle: "";
--fontsizeh1: px;
--fontsizeh2: px;
--fontsizeh3: px;
--fontsizeh4: px;
--colorbgbodylight-darker: #;
--colorfttitlelight-darker: #;
}
*/
}
/* Puis sur classer l'ensemble de la feuille de style */

View File

@ -0,0 +1,3 @@
name: Ninered
author: Arnaud Fornerot
version: 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,43 @@
:root{
--colorbgbodydark: #96281b;
--colorfttitlelight: #96281b;
/* Vous pouvez forcer l'ensemble de ces variables ou laisser la valeur par défaut
--colorbgbodylight: #;
--colorbgbodydark: #;
--colorfttitlelight: #;
--colorfttitledark: #;
--colorftbodylight: #;
--colorftbodydark: #;
--fontbody: "";
--fonttitle: "";
--fontsizeh1: px;
--fontsizeh2: px;
--fontsizeh3: px;
--fontsizeh4: px;
--colorbgbodylight-darker: #;
--colorfttitlelight-darker: #;
}
*/
}
/* Puis sur classer l'ensemble de la feuille de style */

View File

@ -0,0 +1,3 @@
name: Nineyellow
author: Arnaud Fornerot
version: 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,43 @@
:root{
--colorbgbodydark: #f7ca18;
--colorfttitlelight: #171717;
/* Vous pouvez forcer l'ensemble de ces variables ou laisser la valeur par défaut
--colorbgbodylight: #;
--colorbgbodydark: #;
--colorfttitlelight: #;
--colorfttitledark: #;
--colorftbodylight: #;
--colorftbodydark: #;
--fontbody: "";
--fonttitle: "";
--fontsizeh1: px;
--fontsizeh2: px;
--fontsizeh3: px;
--fontsizeh4: px;
--colorbgbodylight-darker: #;
--colorfttitlelight-darker: #;
}
*/
}
/* Puis sur classer l'ensemble de la feuille de style */

View File

@ -52,6 +52,11 @@ CAS_LASTNAME=lastname
CAS_FIRSTNAME=firstname
# WEBSOCKET
WSS_USE=0
WSS_PORT=5586
# Proxy
PROXY_USE=0
PROXY_HOST=

View File

@ -6,6 +6,9 @@ cd ${DIR}
cd ..
DIR=$(pwd)
# Mise en place du fichier d'environnement model
yes 2>/dev/null | cp $DIR/scripts/.env.model $DIR/.env
# Import des env
. $DIR/.env
. $DIR/.env.local
@ -23,9 +26,6 @@ then
find $DIR/var/log -mindepth 1 -mtime +7 -delete
fi
# Mise en place du fichier d'environnement model
yes 2>/dev/null | cp $DIR/scripts/.env.model $DIR/.env
# Installation des dépendances composer
echo COMPOSER = Install
composer install --quiet
@ -34,6 +34,12 @@ php bin/console app:AppInit --env=prod
php bin/console app:CronInit --env=prod
php bin/console app:Script --env=prod
# Websocket
if [[ "$WSS_USE" == "1" ]]
then
$DIR/scripts/websocket.sh restart
fi
# Permissions
echo PERMISSIONS
./scripts/perm.sh www-data

View File

@ -0,0 +1,37 @@
#!/bin/bash
# Se positionner sur la racine du projet
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
cd ${DIR}
cd ..
DIR=$(pwd)
# Import des env
. $DIR/.env
. $DIR/.env.local
# Déclaration d'un proxy
if [[ "$WSS_USE" == "1" ]]
then
# Server Websocket
if [[ "$1" != "restartifdown" ]]; then
echo WEBSOCKET = STOP
pid="$(pgrep -a -f app:Websocket| grep $APP_ALIAS)"
if [ -n "${pid}" ]; then
IFS=' ' read -r -a array <<< "$pid"
kill -9 ${array[0]};
fi
fi
# Port LISTEN ?
pid="$(pgrep -a -f app:Websocket| grep $APP_ALIAS)"
restart="yes"
if [ "$1" == "restartifdown" ] && [ -n "${pid}" ] ; then
restart="no"
fi
if [ "$restart" == "yes" ] && [ "$1" != "stop" ] ; then
echo WEBSOCKET = START
bin/console app:Websocket --name $APP_ALIAS & disown
fi
fi

View File

@ -9,6 +9,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Console\Input\ArrayInput;
use Ramsey\Uuid\Uuid;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Id\AssignedGenerator;
@ -66,6 +67,7 @@ class AppInitCommand extends Command
"appname", // id
"Titre de votre site", // title
"", // value
"", // defalut
"string", // type,
true, // visible
true, // changeable
@ -80,6 +82,7 @@ class AppInitCommand extends Command
"appsubname", // id
"Sous-titre de votre site", // title
"", // value
"", // defalut
"string", // type,
true, // visible
true, // changeable
@ -94,6 +97,7 @@ class AppInitCommand extends Command
"appdescription", // id
"Description de votre site", // title
"", // value
"", // defalut
"editor", // type,
true, // visible
true, // changeable
@ -102,6 +106,22 @@ class AppInitCommand extends Command
"Description de votre site"
);
$this->insertConfig(
100, // order
"site", // category
"apptheme", // id
"Thème de votre site", // title
"", // value
"", // defalut
"string", // type,
false, // visible
true, // changeable
false, // required
"", // grouped
"Thème de votre site"
);
// colorbgbody = Couleur des fonds de page
$this->insertConfig(
1, // order
@ -109,6 +129,7 @@ class AppInitCommand extends Command
"colorbgbodydark", // id
"Couleur de fond fonçée", // title
"", // value
"#2574a9", // defalut
"color", // type,
true, // visible
true, // changeable
@ -123,6 +144,7 @@ class AppInitCommand extends Command
"colorbgbodylight", // id
"Couleur de fond claire", // title
"", // value
"#ffffff", // defalut
"color", // type,
true, // visible
true, // changeable
@ -138,6 +160,7 @@ class AppInitCommand extends Command
"colorfttitledark", // id
"Couleur des titres sur fond fonçé", // title
"", // value
"#ffffff", // defalut
"color", // type,
true, // visible
true, // changeable
@ -152,6 +175,7 @@ class AppInitCommand extends Command
"colorfttitlelight", // id
"Couleur des titres sur fond claire", // title
"", // value
"#2574a9", // defalut
"color", // type,
true, // visible
true, // changeable
@ -167,6 +191,7 @@ class AppInitCommand extends Command
"colorftbodydark", // id
"Couleur de la police sur fond fonçé", // title
"", // value
"#ffffff", // defalut
"color", // type,
true, // visible
true, // changeable
@ -181,6 +206,7 @@ class AppInitCommand extends Command
"colorftbodylight", // id
"Couleur de la police sur fond claire", // title
"", // value
"#343a40", // defalut
"color", // type,
true, // visible
true, // changeable
@ -196,6 +222,7 @@ class AppInitCommand extends Command
"fonttitle", // id
"Police pour les titres", // title
"", // value
"FredokaOne-Regular", // defalut
"font", // type,
true, // visible
true, // changeable
@ -210,6 +237,7 @@ class AppInitCommand extends Command
"fontbody", // id
"Police principale", // title
"", // value
"Roboto-Regular", // defalut
"font", // type,
true, // visible
true, // changeable
@ -218,6 +246,66 @@ class AppInitCommand extends Command
"Nom de la police principale"
);
$this->insertConfig(
3, // order
"font", // category
"fontsizeh1", // id
"Taille des titres h1", // title
"", // value
"40", // defalut
"integer", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Taille des titres h1 en px"
);
$this->insertConfig(
4, // order
"font", // category
"fontsizeh2", // id
"Taille des titres h2", // title
"", // value
"32", // defalut
"integer", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Taille des titres h2 en px"
);
$this->insertConfig(
5, // order
"font", // category
"fontsizeh3", // id
"Taille des titres h3", // title
"", // value
"28", // defalut
"integer", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Taille des titres h3 en px"
);
$this->insertConfig(
6, // order
"font", // category
"fontsizeh4", // id
"Taille des titres h4", // title
"", // value
"24", // defalut
"integer", // type,
true, // visible
true, // changeable
false, // required
"", // grouped
"Taille des titres h4 en px"
);
// logo =
$this->insertConfig(
1, // order
@ -225,6 +313,7 @@ class AppInitCommand extends Command
"logodark", // id
"Logo sur fond fonçé", // title
"", // value
"", // defalut
"logo", // type,
true, // visible
true, // changeable
@ -239,6 +328,7 @@ class AppInitCommand extends Command
"logolight", // id
"Logo sur fond clair", // title
"", // value
"", // defalut
"logo", // type,
true, // visible
true, // changeable
@ -265,6 +355,8 @@ class AppInitCommand extends Command
if(!$entity) {
$this->writelnred('Création du compte admin par défaut avec password admin - Veuillez modifier votre password admin après connexion');
$entity = new User;
$key = Uuid::uuid4();
$entity->setId(0);
$entity->setUsername("admin");
$entity->setPassword("admin");
@ -273,6 +365,7 @@ class AppInitCommand extends Command
$entity->setEmail($this->appmailnoreply);
$entity->setRoles(["ROLE_ADMIN"]);
$entity->setAvatar("admin.jpg");
$entity->setApiKey($key);
$this->em->persist($entity);
}
@ -281,7 +374,7 @@ class AppInitCommand extends Command
}
protected function insertConfig($order,$category,$id,$title,$value,$type,$visible,$changeable,$required,$grouped,$help) {
protected function insertConfig($order,$category,$id,$title,$value,$default,$type,$visible,$changeable,$required,$grouped,$help) {
$entity=$this->em->getRepository("App:Config")->find($id);
if(!$entity) {
$entity= new Config();
@ -289,6 +382,7 @@ class AppInitCommand extends Command
$entity->setValue($value);
}
$entity->setDefault($default);
$entity->setCategory($category);
$entity->setOrder($order);
$entity->setTitle($title);

View File

@ -3,15 +3,11 @@
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Console\Input\ArrayInput;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Id\AssignedGenerator;
use Ramsey\Uuid\Uuid;
use App\Entity\Script;
@ -49,7 +45,7 @@ class ScriptCommand extends Command
$output->writeln('APP = Scripts');
//$this->callscript("test");
$this->callscript("addapikey");
$output->writeln('');
@ -61,7 +57,7 @@ class ScriptCommand extends Command
private function callscript($name) {
$script=$this->em->getRepository("App:Script")->findOneBy(["name"=>$name]);
if(!$script) {
$this->writelnred("== SCRIPT = ".$name);
//$this->writelnred("== SCRIPT = ".$name);
$this->$name();
$script=new Script();
@ -72,8 +68,14 @@ class ScriptCommand extends Command
}
}
private function test() {
$this->writeln("TEST");
private function addapikey() {
$users=$this->em->getRepository("App:User")->findBy(["apikey"=>null]);
foreach($users as $user) {
$key = Uuid::uuid4();
$user->setApikey($key);
$this->em->persist($user);
$this->em->flush();
}
}

View File

@ -10,6 +10,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Ramsey\Uuid\Uuid;
use App\Entity\Group as Group;
use App\Entity\User as User;
@ -525,9 +526,11 @@ class SynchroUsersCommand extends Command
if(!$simulate) {
if(!$user) {
$user = new User();
$key = Uuid::uuid4();
$user->setUsername($apiuser->username);
$user->setPassword("NOPASSWORD");
$user->setApiKey($key);
}
$user->setLastname($apiuser->lastname);

View File

@ -0,0 +1,53 @@
<?php
namespace App\Command;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use App\Websocket\MessageHandler;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputOption;
class WebsocketServerCommand extends Command
{
private $container;
private $em;
public function __construct(ContainerInterface $container,EntityManagerInterface $em)
{
parent::__construct();
$this->container = $container;
$this->em = $em;
}
protected function configure()
{
$this
->setName('app:Websocket')
->setDescription('Lauch Websocket server')
->setHelp('Lauch Websocket server')
->addOption('name',null,InputOption::VALUE_REQUIRED,'Websocket server name',null)
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$port = $this->container->getParameter('wssport');
$output->writeln("Starting server on port " . $port);
$server = IoServer::factory(
new HttpServer(
new WsServer(
new MessageHandler($this->container,$this->em)
)
),
$port
);
$server->run();
return 0;
}
}

View File

@ -7,9 +7,18 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpFoundation\Response;
class CropController extends AbstractController
{
private $appKernel;
public function __construct(KernelInterface $appKernel)
{
$this->appKernel = $appKernel;
}
// Etape 01 - Téléchargement de l'image
public function crop01($type,$reportinput)
{
@ -70,7 +79,7 @@ class CropController extends AbstractController
// Construction du formulaire
$submited=false;
$form = $this->createFormBuilder()
->add('submit',SubmitType::class,array("label" => "Valider","attr" => array("class" => "btn btn-success","onclick" => "reportThumb()")))
->add('submit',SubmitType::class,array("label" => "Valider","attr" => array("class" => "btn btn-success")))
->add('x',HiddenType::class)
->add('y',HiddenType::class)
->add('w',HiddenType::class)
@ -105,6 +114,32 @@ class CropController extends AbstractController
]);
}
// Upload ckeditor
public function ckupload(Request $request) {
// Fichier temporaire uploadé
$tmpfile = $request->files->get('upload');
$extention = $tmpfile->getClientOriginalExtension();
// Répertoire de Destination
$fs = new Filesystem();
$rootdir = $this->appKernel->getProjectDir()."/public";
$fs->mkdir($rootdir."/uploads/ckeditor");
// Fichier cible
$targetName = uniqid().".".$extention;
$targetFile = $rootdir."/uploads/ckeditor/".$targetName;
$targetUrl = "/".$this->getParameter('appAlias')."/uploads/ckeditor/".$targetName;
$message = "";
move_uploaded_file($tmpfile,$targetFile);
$output["uploaded"]=1;
$output["fileName"]=$targetName;
$output["url"]=$targetUrl;
return new Response(json_encode($output));
}
// Calcul de la hauteur
protected function getHeight($image) {
$size = getimagesize($image);

View File

@ -12,6 +12,7 @@ use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Ramsey\Uuid\Uuid;
class SecurityController extends AbstractController
{
@ -37,9 +38,6 @@ class SecurityController extends AbstractController
}
public function loginMYSQL(Request $request, AuthenticationUtils $authenticationUtils) {
// activer les activités par défaut
$this->get('session')->set('activeactivity',true);
return $this->render('Home/login.html.twig', array(
'last_username' => $authenticationUtils->getLastUsername(),
'error' => $authenticationUtils->getLastAuthenticationError(),
@ -87,11 +85,13 @@ class SecurityController extends AbstractController
if (!$exists) {
$user = new User();
$key = Uuid::uuid4();
$user->setUsername($username);
$user->setLastname($lastname);
$user->setFirstname($firstname);
$user->setEmail($email);
$user->setApiKey($key);
$user->setPassword("CASPWD-".$username);
$user->setSalt("CASPWD-".$username);
@ -120,8 +120,6 @@ class SecurityController extends AbstractController
$this->updateLDAP($user);
}
// activer les activités par défaut
$this->get('session')->set('activeactivity',true);
// Autoconnexion
// Récupérer le token de l'utilisateur

View File

@ -0,0 +1,67 @@
<?
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\FormError;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Yaml\Yaml;
use App\Entity\Config as Entity;
use App\Form\ConfigType as Form;
class ThemeController extends AbstractController
{
private $data = "config";
private $route = "app_config";
private $render = "Config/";
private $entity = "App:Config";
public function list(Request $request)
{
$session=$this->get('session');
$finder = new Finder();
$dir = $this->getParameter('kernel.project_dir')."/public/themes";
$url="/".$this->getParameter('appAlias')."/themes";
$finder->in($dir)->directories()->depth('== 0');
$themes=[];
$themes[""]["dir"]="";
$themes[""]["url"]=$url;
$themes[""]["name"]="Thème par défaut";
foreach ($finder as $file) {
$key=$file->getRelativePathname();
$themes[$key]["dir"]=$key;
$themes[$key]["url"]=$url."/".$key;
$yml=Yaml::parseFile($dir.'/'.$key.'/info.yml');
$themes[$key]["name"]=$yml["name"];
}
$current=$session->get("apptheme");
$currentheme=$themes[$current];
unset($themes[$current]);
return $this->render('Theme/list.html.twig',[
'useheader' => true,
'usesidebar' => true,
'currentheme' => $currentheme,
'themes' => $themes
]);
}
public function select(Request $request,$name)
{
$em = $this->getDoctrine()->getManager();
$config=$em->getRepository("App:Config")->findoneBy(["id"=>"apptheme"]);
$config->setValue($name);
$em->persist($config);
$em->flush();
return $this->redirectToRoute("app_theme");
}
}

View File

@ -5,7 +5,7 @@ namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\FormError;
use Ramsey\Uuid\Uuid;
use App\Entity\User as Entity;
use App\Form\UserType as Form;
@ -37,7 +37,9 @@ class UserController extends AbstractController
// Initialisation de l'enregistrement
$em = $this->getDoctrine()->getManager();
$data = new Entity();
$key = Uuid::uuid4();
$data->setAvatar("noavatar.png");
$data->setApiKey($key);
// Création du formulaire
$form = $this->createForm(Form::class,$data,array("mode"=>"submit","appAuth"=>$this->getParameter("appAuth"),"appMasteridentity"=>$this->getParameter("appMasteridentity")));

View File

@ -0,0 +1,13 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class WebsocketController extends AbstractController
{
public function sample()
{
return $this->render('Websocket/sample.html.twig');
}
}

View File

@ -27,6 +27,11 @@ class Config
*/
protected $value;
/**
* @ORM\Column(name="defaultvalue", type="text")
*/
protected $default;
/**
* @ORM\Column(name="roworder", type="string")
*/
@ -199,4 +204,16 @@ class Config
return $this;
}
public function getDefault(): ?string
{
return $this->default;
}
public function setDefault(string $default): self
{
$this->default = $default;
return $this;
}
}

View File

@ -103,7 +103,8 @@ class UserType extends AbstractType
$builder->add('apikey',
TextType::class, [
"label" =>"Clé Accès",
"required" => false
"required" => true,
"disabled" => true,
]
);

View File

@ -30,35 +30,52 @@
// Valeur par defaut colorbgbodydark = #343a40
if($this->session->get("colorbgbodydark")=="")
$this->session->set("colorbgbodydark", '#343a40');
$this->session->set("colorbgbodydark", $this->em->getRepository("App:Config")->find("colorbgbodydark")->getDefault());
// Valeur par defaut colorbgbodydark = #ffffff
if($this->session->get("colorbgbodylight")=="")
$this->session->set("colorbgbodylight", '#ffffff');
$this->session->set("colorbgbodylight",$this->em->getRepository("App:Config")->find("colorbgbodylight")->getDefault());
// Valeur par defaut colorfttitledark = #ffffff
if($this->session->get("colorfttitledark")=="")
$this->session->set("colorfttitledark", '#ffffff');
$this->session->set("colorfttitledark", $this->em->getRepository("App:Config")->find("colorfttitledark")->getDefault());
// Valeur par defaut colorfttitlelight = #343a40
if($this->session->get("colorfttitlelight")=="")
$this->session->set("colorfttitlelight", '#343a40');
$this->session->set("colorfttitlelight", $this->em->getRepository("App:Config")->find("colorfttitlelight")->getDefault());
// Valeur par defaut colorftbodydark = #ffffff
if($this->session->get("colorftbodydark")=="")
$this->session->set("colorftbodydark", '#ffffff');
$this->session->set("colorftbodydark", $this->em->getRepository("App:Config")->find("colorftbodydark")->getDefault());
// Valeur par defaut colorftbodylight = #343a40
if($this->session->get("colorftbodylight")=="")
$this->session->set("colorftbodylight", '#343a40');
$this->session->set("colorftbodylight", $this->em->getRepository("App:Config")->find("colorftbodylight")->getDefault());
// Valeur par defaut fonttitle = FredokaOne-Regular
if($this->session->get("fonttitle")=="")
$this->session->set("fonttitle", 'FredokaOne-Regular');
$this->session->set("fonttitle", $this->em->getRepository("App:Config")->find("fonttitle")->getDefault());
// Valeur par defaut fontbody = Roboto-Regular
if($this->session->get("fontbody")=="")
$this->session->set("fontbody", 'Roboto-Regular');
$this->session->set("fontbody", $this->em->getRepository("App:Config")->find("fontbody")->getDefault());
// Valeur par defaut fontsizeh1 = 40
if($this->session->get("fontsizeh1")=="")
$this->session->set("fontsizeh1", $this->em->getRepository("App:Config")->find("fontsizeh1")->getDefault());
// Valeur par defaut fontsizeh2 = 32
if($this->session->get("fontsizeh2")=="")
$this->session->set("fontsizeh2", $this->em->getRepository("App:Config")->find("fontsizeh2")->getDefault());
// Valeur par defaut fontsizeh3 = 28
if($this->session->get("fontsizeh3")=="")
$this->session->set("fontsizeh3", $this->em->getRepository("App:Config")->find("fontsizeh3")->getDefault());
// Valeur par defaut fontsizeh4 = 24
if($this->session->get("fontsizeh4")=="")
$this->session->set("fontsizeh4", $this->em->getRepository("App:Config")->find("fontsizeh4")->getDefault());
// Valeur par defaut logo
if($this->session->get("logodark")==""&&$this->session->get("logolight")=="") {
@ -69,5 +86,34 @@
$this->session->set("logodark", $this->session->get("logolight"));
elseif($this->session->get("logolight")=="")
$this->session->set("logolight", $this->session->get("logodark"));
// Calcul couleur
$this->session->set("colorbgbodylight-darker", $this->adjustBrightness($this->session->get("colorbgbodylight"),-10));
$this->session->set("colorbgbodydark-darker", $this->adjustBrightness($this->session->get("colorbgbodydark"),-50));
$this->session->set("colorfttitlelight-darker", $this->adjustBrightness($this->session->get("colorfttitlelight"),-50));
}
private function adjustBrightness($hex, $steps) {
// Steps should be between -255 and 255. Negative = darker, positive = lighter
$steps = max(-255, min(255, $steps));
// Normalize into a six character long hex string
$hex = str_replace('#', '', $hex);
if (strlen($hex) == 3) {
$hex = str_repeat(substr($hex,0,1), 2).str_repeat(substr($hex,1,1), 2).str_repeat(substr($hex,2,1), 2);
}
// Split into three parts: R, G and B
$color_parts = str_split($hex, 2);
$return = '';
foreach ($color_parts as $color) {
$color = hexdec($color); // Convert to decimal
$color = max(0,min(255,$color + $steps)); // Adjust color
$return .= str_pad(dechex($color), 2, '0', STR_PAD_LEFT); // Make two char hex code
}
return '#'.$return;
}
}

View File

@ -0,0 +1,114 @@
<?php
namespace App\Websocket;
use Exception;
use Ratchet\ConnectionInterface;
use Ratchet\MessageComponentInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use SplObjectStorage;
class MessageHandler implements MessageComponentInterface
{
protected $container;
protected $em;
protected $clients;
private $subscriptions;
private $users;
public function __construct(ContainerInterface $container, EntityManagerInterface $em)
{
$this->container = $container;
$this->em = $em;
$this->clients = new SplObjectStorage;
$this->subscriptions = [];
$this->users = [];
$this->keys = [];
}
public function onOpen(ConnectionInterface $conn)
{
$this->clients->attach($conn);
$this->users[$conn->resourceId] = $conn;
}
public function onClose(ConnectionInterface $conn)
{
$data= new \stdClass;
$data->command = "adead";
$this->sendMessage($conn,$data,false);
$this->clients->detach($conn);
unset($this->users[$conn->resourceId]);
unset($this->keys[$conn->resourceId]);
unset($this->subscriptions[$conn->resourceId]);
}
public function onError(ConnectionInterface $conn, Exception $e)
{
$conn->close();
}
public function onMessage(ConnectionInterface $conn, $msg)
{
$data = json_decode($msg);
switch ($data->command) {
case "subscribe":
$this->subscriptions[$conn->resourceId] = $data->channel;
$this->keys[$conn->resourceId] = $data->key;
break;
case "meto":
if (isset($this->subscriptions[$conn->resourceId])) {
$this->sendMessage($conn,$data,false);
}
break;
case "alive":
default:
if (isset($this->subscriptions[$conn->resourceId])) {
$this->sendMessage($conn,$data);
}
break;
}
}
private function sendMessage(ConnectionInterface $conn, $data, $tome=true) {
$target = $this->subscriptions[$conn->resourceId];
foreach ($this->subscriptions as $id=>$channel) {
if ($channel == $target) {
if($tome||(!$tome&&$id!=$conn->resourceId)) {
// From
$key= $this->keys[$conn->resourceId];
$from=$this->em->getRepository("App:User")->findOneBy(["apikey"=>$key]);
// To
$key= $this->keys[$id];
$to=$this->em->getRepository("App:User")->findOneBy(["apikey"=>$key]);
// Send
if($from && $to) {
$data->from= new \stdClass;
$data->from->id = $from->getId();
$data->from->username = $from->getUsername();
$data->from->displayname = $from->getDisplayname();
$data->from->avatar = $this->getAvatar($from->getAvatar());
$data->log="== GET MSG from ".$data->from->username." to ".$to->getUsername()." = ".$data->command;
$this->users[$id]->send(json_encode($data));
}
}
}
}
}
private function getAvatar($avatar) {
if(stripos($avatar,"http")===0)
return $avatar;
else
return "/".$this->container->getParameter("appAlias")."/uploads/avatar/".$avatar;
}
}

View File

@ -1,4 +1,10 @@
{
"brick/math": {
"version": "0.9.1"
},
"cboden/ratchet": {
"version": "v0.4.3"
},
"doctrine/annotations": {
"version": "1.0",
"recipe": {
@ -81,6 +87,9 @@
"egulias/email-validator": {
"version": "2.1.17"
},
"evenement/evenement": {
"version": "v3.0.1"
},
"exsyst/swagger": {
"version": "v0.4.1"
},
@ -108,6 +117,9 @@
"config/packages/fos_rest.yaml"
]
},
"guzzlehttp/psr7": {
"version": "1.7.0"
},
"jasig/phpcas": {
"version": "1.3.8"
},
@ -194,12 +206,48 @@
"psr/event-dispatcher": {
"version": "1.0.0"
},
"psr/http-message": {
"version": "1.0.1"
},
"psr/link": {
"version": "1.0.0"
},
"psr/log": {
"version": "1.1.2"
},
"ralouphie/getallheaders": {
"version": "3.0.3"
},
"ramsey/collection": {
"version": "1.1.1"
},
"ramsey/uuid": {
"version": "4.1.1"
},
"ratchet/rfc6455": {
"version": "v0.3"
},
"react/cache": {
"version": "v1.1.0"
},
"react/dns": {
"version": "v1.4.0"
},
"react/event-loop": {
"version": "v1.1.1"
},
"react/promise": {
"version": "v2.8.0"
},
"react/promise-timer": {
"version": "v1.6.0"
},
"react/socket": {
"version": "v1.6.0"
},
"react/stream": {
"version": "v1.1.1"
},
"sensio/framework-extra-bundle": {
"version": "5.2",
"recipe": {

View File

@ -66,12 +66,12 @@
{% elseif config.type=="hero" %}
<div style="margin:10px auto;">
<img id="config_value_img" src="/{{ appAlias }}/uploads/hero/{{ config.value }}" style="width:100%;margin:auto;display:block;">
<a class="btn btn-info" style="width:100%" onClick="ModalLoad('mymodallarge','Carrousel','{{ path('app_crop01', {"type": "hero", "reportinput": "config_value" }) }}');" title='Ajouter une Bannière'>Modifier</a>
<a class="btn btn-info" style="width:100%" onClick="ModalLoad('mymodallarge','Carrousel','{{ path('app_crop01', {"type": "hero", "reportinput": "#config_value" }) }}');" title='Ajouter une Bannière'>Modifier</a>
</div>
{% elseif config.type=="image" %}
<div style="margin:10px auto;">
<img id="config_value_img" src="/{{ appAlias }}/uploads/hero/{{ config.value }}" style="width:100%;margin:auto;display:block;">
<a class="btn btn-info" style="width:100%" onClick="ModalLoad('mymodallarge','Image','{{ path('app_crop01', {"type": "image", "reportinput": "config_value" }) }}');" title='Ajouter une Image'>Modifier</a>
<a class="btn btn-info" style="width:100%" onClick="ModalLoad('mymodallarge','Image','{{ path('app_crop01', {"type": "image", "reportinput": "#config_value" }) }}');" title='Ajouter une Image'>Modifier</a>
</div>
{% endif %}
{{ form_row(form.help) }}

View File

@ -32,10 +32,10 @@
{% set otherstyle = "" %}
{% if config.id=='colorbgbodydark' %}
{% set bgcolor = val %}
{% set color = app.session.get('colorfttitledark') %}
{% set color = app.session.get('colorftbodydark') %}
{% elseif config.id=='colorbgbodylight' %}
{% set bgcolor = val %}
{% set color = app.session.get('colorfttitlelight') %}
{% set color = app.session.get('colorftbodylight') %}
{% elseif config.id=='colorfttitledark' %}
{% set bgcolor = app.session.get('colorbgbodydark') %}
{% set color = val %}
@ -48,6 +48,9 @@
{% elseif config.id=='colorftbodylight' %}
{% set bgcolor = app.session.get('colorbgbodylight') %}
{% set color = val %}
{% elseif config.id=='fonttitle' %}
{% set color = app.session.get('colorfttitlelight') %}
{% set otherstyle = "font-family: "~val~";" %}
{% elseif config.id=='logodark' %}
{% set bgcolor = app.session.get('colorbgbodydark') %}
{% set otherstyle = "text-align: center;" %}

View File

@ -23,7 +23,7 @@
Dropzone.options.MyDropZone = {
maxFiles: 1,
acceptedMimeTypes: 'image/*',
acceptedMimeTypes: 'image/jpeg,image/png',
//renameFilename: false,
success: function(file, response){
$(location).attr('href',"{{ path('app_crop02', {"type": type, "reportinput": reportinput }) }}?file="+response["file"]);

View File

@ -5,6 +5,7 @@
{% endblock %}
{% block body %}
{% if not submited %}
{{ form_start(form) }}
{{ form_widget(form.submit) }}
<button class="btn btn-secondary" onClick="closeModal();">Annuler</button>
@ -26,6 +27,7 @@
</div>
</div>
{{ form_end(form) }}
{% endif %}
{% endblock %}
@ -73,8 +75,8 @@
{% if reportinput == "refresh" %}
window.parent.location.reload();
{% elseif reportinput != "none" %}
window.parent.$("#{{ reportinput }}").val("thumb_{{ file }}");
window.parent.$("#{{ reportinput }}_img").attr("src","/{{ appAlias }}/uploads/{{ type }}/thumb_{{ file }}");
window.parent.$("{{ reportinput }}").val("thumb_{{ file }}");
window.parent.$("{{ reportinput }}_img").attr("src","/{{ appAlias }}/uploads/{{ type }}/thumb_{{ file }}");
{% endif %}
closeModal();
@ -85,6 +87,9 @@
}
$(document).ready(function() {
{% if submited %}
reportThumb();
{% else %}
window.parent.$(".modal-title").html("ETAPE 2 - Découper votre image");
realheight=$('#largeimg').height();
@ -111,7 +116,6 @@
{% endif %}
$('#largeimg').CropSelectJs('setSelectionAspectRatio',{{nbratio}});
{% endif %}
});
{% endblock %}

View File

@ -83,19 +83,6 @@ les plus importants pour y ajouter le class imposée par Bootstrap 3 #}
</button>
{%- endblock button_widget %}
{# Personnalisation des attributs des boutons #}
{% block button_attributes -%}
{% if type is defined and type == 'submit' -%}
{% set class = 'btn-primary' %}
{% else %}
{% set class = 'btn-default' %}
{%- endif -%}
{% set attr = attr|merge({'class': (attr.class|default('') ~ ' btn ' ~ class)|trim}) %}
{{ parent() }}
{%- endblock button_attributes %}
{# Personnalisation des select #}
{% block choice_widget_collapsed %}
{% set attr = attr|merge({'class': (attr.class|default('') ~ ' form-control')|trim}) %}

View File

@ -1,6 +1,9 @@
{% extends "base.html.twig" %}
{% block body %}
{% if wssuse and app.user %}
{{ render(path("app_wss_sample")) }}
{% endif %}
{% endblock %}

View File

@ -1,4 +1,14 @@
$(document).ready(function() {
$(".pick-a-color").spectrum(
{
type: "text",
showAlpha: false
}
);
$(".pick-a-color").attr("autocomplete","off");
var doit = true;
$("a[data-method]").on('click',function(){
@ -21,3 +31,23 @@ function ModalLoad(idmodal,title,path) {
$("#"+idmodal+" iframe").attr("src",path);
$("#"+idmodal).modal("show");
}
{% if wssuse %}
function subscribe(channeltype,channelkey,userkey) {
console.log("== SUBSCRIBE "+channeltype+"-"+channelkey+" with userkey "+userkey);
conn.send(JSON.stringify({
command: "subscribe",
log: "",
channel: channeltype+"-"+channelkey,
channeltype: channeltype,
channelkey: channelkey,
userkey: userkey
}));
}
function sendMessage(msg) {
json=JSON.stringify(msg);
console.log("== SEND MSG = "+json);
conn.send(json);
}
{% endif %}

View File

@ -2,27 +2,36 @@
<ul class="nav">
{% if is_granted('ROLE_ADMIN') %}
<br>
<li class="title">Administration</li>
<li class="title">Configuration</li>
<li>
<a href="{{path("app_config")}}">
<i class="fa fa-cog"></i>Configurations
<i class="fa fa-cog"></i>Générale
</a>
</li>
<li class="last">
<a href="{{path("app_theme")}}">
<i class="fa fa-paint-brush"></i>Thème
</a>
</li>
<li class="title">Organisation</li>
<li>
<a href="{{path("app_user")}}">
<i class="fa fa-user"></i>Utilisateurs
</a>
</li>
<li>
<li class="last">
<a href="{{path("app_group")}}">
<i class="fa fa-users"></i>Groupes
</a>
</li>
{% if appCron %}
<li class="title">Outils</li>
<li>
<a href="{{path("app_cron")}}">
<i class="fa fa-cogs"></i>Jobs

View File

@ -7,6 +7,14 @@
--colorftbodydark: {{ app.session.get('colorftbodydark')|raw }};
--fontbody: "{{ app.session.get('fontbody')|raw }}";
--fonttitle: "{{ app.session.get('fonttitle')|raw }}";
--fontsizeh1: {{ app.session.get('fontsizeh1')~"px"|raw }};
--fontsizeh2: {{ app.session.get('fontsizeh2')~"px"|raw }};
--fontsizeh3: {{ app.session.get('fontsizeh3')~"px"|raw }};
--fontsizeh4: {{ app.session.get('fontsizeh4')~"px"|raw }};
--colorbgbodylight-darker: {{ app.session.get('colorbgbodylight-darker')|raw }};
--colorbgbodydark-darker: {{ app.session.get('colorbgbodydark-darker')|raw }};
--colorfttitlelight-darker: {{ app.session.get('colorfttitlelight-darker')|raw }};
}
/* COLOR BODY */
@ -16,10 +24,6 @@ body {
color: var(--colorftbodylight);
}
.card {
background-color: var(--colorbgbodylight);
}
body .navbar.bg-dark {
background-color: var(--colorbgbodydark)!important;
}
@ -36,7 +40,11 @@ body #sidebar .nav a {
color: var(--colorfttitledark);
}
body h1, body h2, body h3 {
body #sidebar .nav .last {
border-color: var(--colorfttitledark);
}
body h1, body h2, body h3, body .modal-header h4 {
color: var(--colorfttitlelight);
}
@ -44,23 +52,59 @@ body a, body .btn-link {
color: var(--colorfttitlelight);
}
body a:hover, body .btn-link:hover {
color: var(--colorfttitlelight-darker);
}
body .nav a{
color: var(--colorfttitledark);
}
body .table {
color: var(--colorftbodylight);
}
body .card {
background-color: var(--colorbgbodylight);
}
body .card-header {
background-color: var(--colorbgbodylight-darker);
color: var(--colorfttitlelight);
font-size: 120%;
}
body .card-header .custom-control {
color: var(--colorftbodylight);
font-size: 80%;
}
body .page-item.active .page-link,
body .page-item.active .page-link:hover {
background-color: var(--colorfttitlelight);
border-color: var(--colorfttitlelight);
}
body .btn-primary {
background-color: var(--colorbgbodydark);
border-color: var(--colorbgbodydark);
}
body .btn-primary:hover {
background-color: var(--colorbgbodydark-darker);
border-color: var(--colorbgbodydark-darker);
}
body .modal-title {
}
/* COLOR BODY HOME */
body.monocolor {
background-color: var(--colorbgbodydark);
color: var(--colorftbodydark);
}
body.monocolor .card {
background-color: var(--colorbgbodydark);
}
body.monocolor .navbar.bg-dark {
background-color: var(--colorbgbodydark)!important;
}
@ -77,7 +121,7 @@ body.monocolor #sidebar .nav a {
color: var(--colorfttitledark);
}
body.monocolor h1, body.monocolor h2, body.monocolor h3 {
body.monocolor h1, body.monocolor h2, body.monocolor h3, body.monocolor .modal-header h4 {
color: var(--colorfttitledark);
}
@ -89,20 +133,54 @@ body.monocolor .nav a{
color: var(--colorfttitledark);
}
body.monocolor .card {
background-color: var(--colorbgbodydark);
}
body.monocolor .card-header {
background-color: var(--colorbgbodydark);
color: var(--colorfttitledark);
font-size: 120%;
}
body.monocolor .card-header .custom-control {
color: var(--colorftbodydark);
font-size: 80%;
}
body.monocolor .btn-primary {
background-color: var(--colorbgbodylight);
border-color: var(--colorbgbodylight);
}
body.monocolor .btn-primary:hover {
background-color: var(--colorbgbodylight-darker);
border-color: var(--colorbgbodylight-darker);
}
/* FONT */
body {
font-family: var(--fontbody);
}
h1,h2,h3, .navbar-brand {
h1,h2,h3, .navbar-brand, .card-header, .modal-header h4 {
font-family: var(--fonttitle);
}
h1 { font-size: var(--fontsizeh1); }
h2 { font-size: var(--fontsizeh2); }
h3 { font-size: var(--fontsizeh3); }
h4 { font-size: var(--fontsizeh4); }
.card-header .custom-control {
font-family: var(--fontbody);
}
{% if not useheader is defined or not useheader %}
#main {
padding:0px;
}
{% else %}
#main {
margin-bottom: 100px;
}
{%endif%}

View File

@ -0,0 +1,29 @@
{% extends 'base.html.twig' %}
{% block body %}
<h1>Thèmes</h1>
<h2>Thème en cours</h2>
<div class="text-center" style="width:330px">
<img src="{{currentheme.url}}/look.png" style="width:100%; background-color: {{app.session.get('colorbgbodydark') }}"><br>
{{currentheme.name}}
</div>
<h2 class="mt-5">Thèmes disponibles</h2>
<div>
{% for theme in themes %}
<div class="text-center mb-4" style="width:330px; display: inline-block">
<img src="{{theme.url}}/look.png" style="height:170px; background-color: {{app.session.get('colorbgbodydark') }}"><br>
{{theme.name}}<br>
<a href="{{ path("app_theme_select",{"name":theme.dir}) }}" class="btn btn-primary" role="button">Sélectionner</a>
</div>
{% endfor %}
</div>
{% endblock %}

View File

@ -48,7 +48,7 @@
<img id="user_avatar_img" src="{{ avatar|urlavatar }}" class="avatar big" >
{{ form_widget(form.avatar) }}
{% if appMasteridentity=="LDAP" or appMasteridentity=="SQL" %}
<a class="btn btn-info" style="width:100%; margin-bottom:15px;" onClick="ModalLoad('mymodallarge','Avatar','{{ path('app_crop01', {"type": "avatar", "reportinput": "user_avatar" }) }}');" title='Ajouter un avatar'>Modifier</a>
<bouton class="btn btn-info" style="width:100%; margin-bottom:15px;" onClick="ModalLoad('mymodallarge','Avatar','{{ path('app_crop01', {"type": "avatar", "reportinput": "#user_avatar" }) }}');" title='Ajouter un avatar'>Modifier</bouton>
{% endif %}
</div>

View File

@ -0,0 +1,61 @@
<div id="chat" class="text-center mt-5">
<div class="mb-2">online</div>
<div id="online" style="mt-2"></div>
</div>
{% if wssuse %}
<script>
var conn;
function connect() {
conn = new WebSocket("{{wssurl}}");
conn.onopen = function(e) {
console.log("== CONNECT");
{% set userkey = "" %}
{% if app.user %}
{% set userkey = app.user.apikey %}
{%endif%}
subscribe("home",1,"{{userkey}}");
sendMessage({command: "alive"});
};
conn.onmessage = function(e) {
ret=JSON.parse(e.data);
console.log(ret.log);
switch(ret.command) {
case "alive" :
if(!$('#online'+ret.from.id).length) {
html='<img id="online'+ret.from.id+'" src="'+ret.from.avatar+'" class="avatar ml-2 mr-2" title="'+ret.from.displayname+'">';
$("#online").append(html);
}
if(ret.from.id!={{app.user.id}})
sendMessage({command: "meto"});
break;
case "adead" :
$('#online'+ret.from.id).remove();
break;
case "meto" :
if(!$('#online'+ret.from.id).length) {
html='<img id="online'+ret.from.id+'" src="'+ret.from.avatar+'" class="avatar ml-2 mr-2" title="'+ret.from.displayname+'">';
$("#online").append(html);
}
break;
}
};
conn.onclose = function(e) {
console.log("== DISCONNECT");
$('#online img').remove();
console.log('Socket is closed. Reconnect will be attempted in 1 second.', e.reason);
setTimeout(function() { connect(); }, 1000);
};
}
connect();
</script>
{% endif %}

View File

@ -22,12 +22,28 @@
<style>
{{ include('Include/style.css.twig') }}
</style>
{% if not app.session.get("apptheme") is empty %}
<link href="/{{ appAlias }}/themes/{{ app.session.get("apptheme") }}/style.css" rel="stylesheet" media="screen" />
{% endif %}
<style>
{% block localstyle %}
{% endblock %}
</style>
{{ encore_entry_script_tags('app') }}
{% block encorescripttags %}
{% endblock %}
<script>
{{ include('Include/javascript.js.twig') }}
</script>
{% set class="" %}
{% if usemonocolor is defined and usemonocolor %}
{% set class="monocolor" %}
@ -86,7 +102,7 @@
</nav>
{% endif %}
<main id="main" class="container-fluid">
<main id="main" class="container-fluid {% if maxwidth is defined and maxwidth %} page-maxed {% endif %}">
{% set contentsidebar="" %}
{% if usesidebar is defined and usesidebar %}
{% set contentsidebar="contentsidebar" %}
@ -104,19 +120,20 @@
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Modification Evènement</h5>
<h4 class="modal-title"></h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<iframe id="framemodal" frameborder=0 width="100%" height="600px"></iframe>
<iframe frameborder=0 width="100%" height="600px"></iframe>
</div>
</div>
</div>
</div>
<div id="mymodallarge" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog modal-xl">
<div class="modal-content">
@ -131,33 +148,21 @@
</div>
</div>
{{ encore_entry_script_tags('app') }}
{% block encorescripttags %}
{% endblock %}
{% block localexternalscript %}
{% endblock %}
<script>
{{ include('Include/javascript.js.twig') }}
</script>
<script>
$(".pick-a-color").spectrum(
{
type: "text",
showAlpha: false
}
);
{% block localjavascript %}
{% endblock %}
</script>
{% if not app.session.get("apptheme") is empty %}
<script src="/{{ appAlias }}/themes/{{ app.session.get("apptheme") }}/local.js"></script>
{% endif %}
{% if sondeUse %}
{{ render(path("app_sonde")) }}
{% endif %}

View File

@ -1 +1,2 @@
* * * * * root /var/www/html/nineschool/scripts/cron.sh &>/dev/null
* * * * * root /var/www/html/nineschool/scripts/websocket.sh restartifdown &>/dev/null