From 40ed84dea37cdade41a3850a466216fe962d4f1f Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Wed, 24 Mar 2021 19:10:26 +0100 Subject: [PATCH] init murph Signed-off-by: Simon Vieille --- .env | 35 + .env.test | 6 + .gitignore | 27 + Makefile | 27 + assets/css/admin.scss | 440 ++ assets/images/blank.png | Bin 0 -> 163 bytes assets/images/core/logo.svg | 92 + assets/images/logo.png | Bin 0 -> 32206 bytes assets/images/no-image.png | Bin 0 -> 1536 bytes assets/js/addons/checkbox-checker.js | 31 + assets/js/addons/choices.js | 8 + assets/js/addons/datepicker.js | 26 + assets/js/addons/dbclick.js | 7 + assets/js/addons/document-selector.js | 43 + assets/js/addons/editor.js | 23 + assets/js/addons/form-collection.js | 84 + assets/js/addons/form-confirm.js | 15 + assets/js/addons/form.js | 11 + assets/js/addons/modal.js | 31 + assets/js/addons/panel.js | 47 + assets/js/addons/password.js | 82 + assets/js/addons/push-state.js | 44 + assets/js/addons/rest-choices.js | 27 + assets/js/addons/table-fixed.js | 24 + assets/js/addons/table-selectable.js | 122 + assets/js/addons/toast.js | 11 + assets/js/addons/tooltip.js | 5 + assets/js/admin.js | 28 + bin/console | 43 + bin/doctrine-migrate | 7 + bin/phpunit | 13 + composer.json | 110 + config/bundles.php | 22 + config/packages/app.yaml | 9 + config/packages/assets.yaml | 3 + config/packages/cache.yaml | 19 + config/packages/dev/debug.yaml | 4 + config/packages/dev/monolog.yaml | 19 + config/packages/dev/swiftmailer.yaml | 4 + config/packages/dev/web_profiler.yaml | 6 + config/packages/doctrine.yaml | 30 + config/packages/doctrine_migrations.yaml | 5 + config/packages/framework.yaml | 17 + config/packages/mailer.yaml | 3 + config/packages/notifier.yaml | 16 + config/packages/prod/deprecations.yaml | 8 + config/packages/prod/doctrine.yaml | 20 + config/packages/prod/monolog.yaml | 16 + config/packages/prod/routing.yaml | 3 + config/packages/prod/webpack_encore.yaml | 4 + config/packages/routing.yaml | 7 + config/packages/scheb_2fa.yaml | 15 + config/packages/security.yaml | 50 + config/packages/sensio_framework_extra.yaml | 3 + config/packages/stof_doctrine_extensions.yaml | 4 + config/packages/swiftmailer.yaml | 4 + config/packages/test/framework.yaml | 4 + config/packages/test/monolog.yaml | 12 + config/packages/test/swiftmailer.yaml | 2 + config/packages/test/twig.yaml | 2 + config/packages/test/validator.yaml | 3 + config/packages/test/web_profiler.yaml | 6 + config/packages/test/webpack_encore.yaml | 2 + config/packages/translation.yaml | 8 + config/packages/twig.yaml | 6 + config/packages/validator.yaml | 8 + config/packages/webpack_encore.yaml | 30 + config/preload.php | 5 + config/routes.yaml | 15 + config/routes/annotations.yaml | 11 + config/routes/dev/framework.yaml | 3 + config/routes/dev/web_profiler.yaml | 7 + config/routes/scheb_2fa.yaml | 7 + config/services.yaml | 54 + core/Annotation/UrlGenerator.php | 20 + core/Authenticator/LoginFormAuthenticator.php | 96 + core/Bundle/CoreBundle.php | 23 + core/Controller/.gitignore | 0 .../Account/AccountAdminController.php | 150 + core/Controller/Admin/AdminController.php | 31 + core/Controller/Auth/AuthController.php | 155 + .../Dashboard/DashboardAdminController.php | 27 + core/Controller/Site/MenuAdminController.php | 82 + .../Site/NavigationAdminController.php | 116 + core/Controller/Site/NodeAdminController.php | 283 + core/Controller/Site/PageAdminController.php | 109 + core/Controller/Site/PageController.php | 48 + core/Controller/Site/SitemapController.php | 40 + core/Controller/Site/TreeAdminController.php | 66 + core/Controller/User/UserAdminController.php | 138 + core/DependencyInjection/Configuration.php | 52 + core/DependencyInjection/CoreExtension.php | 28 + core/Doctrine/Timestampable.php | 59 + core/Entity/.gitignore | 0 core/Entity/EntityInterface.php | 7 + core/Entity/Site/Menu.php | 146 + core/Entity/Site/Navigation.php | 138 + core/Entity/Site/Node.php | 400 ++ core/Entity/Site/Page/Block.php | 82 + core/Entity/Site/Page/FileBlock.php | 36 + core/Entity/Site/Page/Page.php | 279 + core/Entity/Site/Page/TextBlock.php | 12 + core/Event/Account/PasswordRequestEvent.php | 28 + .../EntityManager/EntityManagerEvent.php | 33 + .../PasswordRequestEventSubscriber.php | 69 + .../EntityManagerEventSubscriber.php | 50 + .../Site/MenuEventSubscriber.php | 92 + .../Site/NavigationEventSubscriber.php | 46 + .../Site/NodeEventSubscriber.php | 148 + .../Site/Page/BlockEventSubscriber.php | 59 + .../Site/Page/PageEventSubscriber.php | 56 + .../Site/SiteEventSubscriber.php | 66 + core/Factory/Site/MenuFactory.php | 25 + core/Factory/Site/NavigationFactory.php | 18 + core/Factory/Site/NodeFactory.php | 29 + core/Factory/Site/Page/PageFactory.php | 21 + core/Factory/UserFactory.php | 36 + core/Form/FileUploadHandler.php | 28 + core/Form/Site/MenuType.php | 51 + core/Form/Site/NavigationType.php | 65 + core/Form/Site/NodeAttributeType.php | 49 + core/Form/Site/NodeMoveType.php | 62 + core/Form/Site/NodeParameterType.php | 63 + core/Form/Site/NodeSitemapParametersType.php | 82 + core/Form/Site/NodeType.php | 204 + core/Form/Site/Page/FileBlockType.php | 32 + core/Form/Site/Page/ImageBlockType.php | 25 + core/Form/Site/Page/PageType.php | 132 + core/Form/Site/Page/TextBlockType.php | 32 + core/Form/Site/Page/TextareaBlockType.php | 21 + core/Form/UserType.php | 78 + core/Manager/EntityManager.php | 98 + core/Notification/MailNotifier.php | 338 + core/Repository/.gitignore | 0 core/Repository/RepositoryQuery.php | 96 + core/Repository/Site/MenuRepository.php | 15 + core/Repository/Site/MenuRepositoryQuery.php | 19 + core/Repository/Site/NavigationRepository.php | 15 + .../Site/NavigationRepositoryQuery.php | 27 + core/Repository/Site/NodeRepository.php | 38 + core/Repository/Site/Page/BlockRepository.php | 15 + .../Site/Page/BlockRepositoryQuery.php | 19 + core/Repository/Site/Page/PageRepository.php | 15 + .../Site/Page/PageRepositoryQuery.php | 29 + core/Resources/translations/messages.fr.yaml | 122 + .../views/account/admin/edit.html.twig | 226 + core/Resources/views/admin/layout.html.twig | 51 + .../views/admin/macros/menu.html.twig | 1 + .../views/admin/module/account.html.twig | 15 + .../views/admin/module/flashes.html.twig | 51 + .../views/admin/module/menu.html.twig | 71 + .../views/admin/module/metas.html.twig | 14 + core/Resources/views/auth/2fa.html.twig | 81 + core/Resources/views/auth/login.html.twig | 95 + .../views/auth/resetting_request.html.twig | 76 + .../views/auth/resetting_update.html.twig | 113 + .../form/bootstrap_4_form_theme.html.twig | 38 + .../mail/account/resetting_request.html.twig | 11 + core/Resources/views/mail/base.html.twig | 48 + core/Resources/views/mail/raw.html.twig | 1 + .../site/navigation_admin/_form.html.twig | 12 + .../site/navigation_admin/edit.html.twig | 57 + .../site/navigation_admin/index.html.twig | 85 + .../views/site/navigation_admin/new.html.twig | 39 + .../site/navigation_admin/show.html.twig | 48 + .../views/site/node_admin/_form.html.twig | 269 + .../views/site/node_admin/edit.html.twig | 22 + .../views/site/node_admin/move.html.twig | 21 + .../views/site/node_admin/new.html.twig | 21 + .../views/site/node_admin/urls.html.twig | 25 + .../views/site/page_admin/_form.html.twig | 51 + .../views/site/page_admin/edit.html.twig | 48 + .../views/site/page_admin/index.html.twig | 69 + .../views/site/sitemap/sitemap.xml.twig | 10 + .../site/tree_admin/navigation.html.twig | 219 + .../views/user/user_admin/_form.html.twig | 12 + .../views/user/user_admin/edit.html.twig | 64 + .../views/user/user_admin/index.html.twig | 71 + .../views/user/user_admin/new.html.twig | 39 + .../views/user/user_admin/show.html.twig | 52 + core/Router/SiteRouteLoader.php | 85 + core/Security/TokenGenerator.php | 13 + core/Site/Node.php | 24 + core/Site/PageConfiguration.php | 51 + core/Site/PageLocator.php | 48 + core/Site/SiteRequest.php | 69 + core/Site/SiteStore.php | 63 + core/Sitemap/SitemapBuilder.php | 129 + core/Slugify/CodeSlugify.php | 32 + core/Slugify/RouteParameterSlugify.php | 32 + core/Slugify/Slugify.php | 31 + core/String/StringBuilder.php | 46 + core/Twig/Extension/StringExtension.php | 32 + migrations/.gitignore | 0 package.json | 32 + phpunit.xml.dist | 40 + public/.htaccess | 66 + public/index.php | 22 + public/vendor/qrcodejs | 1 + public/vendor/tinymce | 1 + src/Bundle/AppBundle.php | 23 + src/Controller/.gitignore | 0 src/DependencyInjection/AppExtension.php | 28 + src/DependencyInjection/Configuration.php | 16 + src/Entity/.gitignore | 0 src/Entity/Page/SimplePage.php | 94 + src/Entity/User.php | 266 + src/Factory/UserFactory.php | 14 + src/Form/UserType.php | 9 + src/Kernel.php | 38 + src/Repository/.gitignore | 0 src/Repository/UserRepository.php | 29 + src/Repository/UserRepositoryQuery.php | 19 + symfony.lock | 644 ++ templates/admin/menu.html.twig | 27 + templates/base.html.twig | 19 + templates/core/dashboard/index.html.twig | 13 + templates/page/simple/page.html.twig | 79 + tests/bootstrap.php | 11 + translations/.gitignore | 0 webpack.config.js | 77 + yarn.lock | 6330 +++++++++++++++++ 222 files changed, 17793 insertions(+) create mode 100644 .env create mode 100644 .env.test create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 assets/css/admin.scss create mode 100644 assets/images/blank.png create mode 100644 assets/images/core/logo.svg create mode 100644 assets/images/logo.png create mode 100644 assets/images/no-image.png create mode 100644 assets/js/addons/checkbox-checker.js create mode 100644 assets/js/addons/choices.js create mode 100644 assets/js/addons/datepicker.js create mode 100644 assets/js/addons/dbclick.js create mode 100644 assets/js/addons/document-selector.js create mode 100644 assets/js/addons/editor.js create mode 100644 assets/js/addons/form-collection.js create mode 100644 assets/js/addons/form-confirm.js create mode 100644 assets/js/addons/form.js create mode 100644 assets/js/addons/modal.js create mode 100644 assets/js/addons/panel.js create mode 100644 assets/js/addons/password.js create mode 100644 assets/js/addons/push-state.js create mode 100644 assets/js/addons/rest-choices.js create mode 100644 assets/js/addons/table-fixed.js create mode 100644 assets/js/addons/table-selectable.js create mode 100644 assets/js/addons/toast.js create mode 100644 assets/js/addons/tooltip.js create mode 100644 assets/js/admin.js create mode 100755 bin/console create mode 100755 bin/doctrine-migrate create mode 100755 bin/phpunit create mode 100644 composer.json create mode 100644 config/bundles.php create mode 100644 config/packages/app.yaml create mode 100644 config/packages/assets.yaml create mode 100644 config/packages/cache.yaml create mode 100644 config/packages/dev/debug.yaml create mode 100644 config/packages/dev/monolog.yaml create mode 100644 config/packages/dev/swiftmailer.yaml create mode 100644 config/packages/dev/web_profiler.yaml create mode 100644 config/packages/doctrine.yaml create mode 100644 config/packages/doctrine_migrations.yaml create mode 100644 config/packages/framework.yaml create mode 100644 config/packages/mailer.yaml create mode 100644 config/packages/notifier.yaml create mode 100644 config/packages/prod/deprecations.yaml create mode 100644 config/packages/prod/doctrine.yaml create mode 100644 config/packages/prod/monolog.yaml create mode 100644 config/packages/prod/routing.yaml create mode 100644 config/packages/prod/webpack_encore.yaml create mode 100644 config/packages/routing.yaml create mode 100644 config/packages/scheb_2fa.yaml create mode 100644 config/packages/security.yaml create mode 100644 config/packages/sensio_framework_extra.yaml create mode 100644 config/packages/stof_doctrine_extensions.yaml create mode 100644 config/packages/swiftmailer.yaml create mode 100644 config/packages/test/framework.yaml create mode 100644 config/packages/test/monolog.yaml create mode 100644 config/packages/test/swiftmailer.yaml create mode 100644 config/packages/test/twig.yaml create mode 100644 config/packages/test/validator.yaml create mode 100644 config/packages/test/web_profiler.yaml create mode 100644 config/packages/test/webpack_encore.yaml create mode 100644 config/packages/translation.yaml create mode 100644 config/packages/twig.yaml create mode 100644 config/packages/validator.yaml create mode 100644 config/packages/webpack_encore.yaml create mode 100644 config/preload.php create mode 100644 config/routes.yaml create mode 100644 config/routes/annotations.yaml create mode 100644 config/routes/dev/framework.yaml create mode 100644 config/routes/dev/web_profiler.yaml create mode 100644 config/routes/scheb_2fa.yaml create mode 100644 config/services.yaml create mode 100644 core/Annotation/UrlGenerator.php create mode 100644 core/Authenticator/LoginFormAuthenticator.php create mode 100644 core/Bundle/CoreBundle.php create mode 100644 core/Controller/.gitignore create mode 100644 core/Controller/Account/AccountAdminController.php create mode 100644 core/Controller/Admin/AdminController.php create mode 100644 core/Controller/Auth/AuthController.php create mode 100644 core/Controller/Dashboard/DashboardAdminController.php create mode 100644 core/Controller/Site/MenuAdminController.php create mode 100644 core/Controller/Site/NavigationAdminController.php create mode 100644 core/Controller/Site/NodeAdminController.php create mode 100644 core/Controller/Site/PageAdminController.php create mode 100644 core/Controller/Site/PageController.php create mode 100644 core/Controller/Site/SitemapController.php create mode 100644 core/Controller/Site/TreeAdminController.php create mode 100644 core/Controller/User/UserAdminController.php create mode 100644 core/DependencyInjection/Configuration.php create mode 100644 core/DependencyInjection/CoreExtension.php create mode 100644 core/Doctrine/Timestampable.php create mode 100644 core/Entity/.gitignore create mode 100644 core/Entity/EntityInterface.php create mode 100644 core/Entity/Site/Menu.php create mode 100644 core/Entity/Site/Navigation.php create mode 100644 core/Entity/Site/Node.php create mode 100644 core/Entity/Site/Page/Block.php create mode 100644 core/Entity/Site/Page/FileBlock.php create mode 100644 core/Entity/Site/Page/Page.php create mode 100644 core/Entity/Site/Page/TextBlock.php create mode 100644 core/Event/Account/PasswordRequestEvent.php create mode 100644 core/Event/EntityManager/EntityManagerEvent.php create mode 100644 core/EventSuscriber/Account/PasswordRequestEventSubscriber.php create mode 100644 core/EventSuscriber/EntityManagerEventSubscriber.php create mode 100644 core/EventSuscriber/Site/MenuEventSubscriber.php create mode 100644 core/EventSuscriber/Site/NavigationEventSubscriber.php create mode 100644 core/EventSuscriber/Site/NodeEventSubscriber.php create mode 100644 core/EventSuscriber/Site/Page/BlockEventSubscriber.php create mode 100644 core/EventSuscriber/Site/Page/PageEventSubscriber.php create mode 100644 core/EventSuscriber/Site/SiteEventSubscriber.php create mode 100644 core/Factory/Site/MenuFactory.php create mode 100644 core/Factory/Site/NavigationFactory.php create mode 100644 core/Factory/Site/NodeFactory.php create mode 100644 core/Factory/Site/Page/PageFactory.php create mode 100644 core/Factory/UserFactory.php create mode 100644 core/Form/FileUploadHandler.php create mode 100644 core/Form/Site/MenuType.php create mode 100644 core/Form/Site/NavigationType.php create mode 100644 core/Form/Site/NodeAttributeType.php create mode 100644 core/Form/Site/NodeMoveType.php create mode 100644 core/Form/Site/NodeParameterType.php create mode 100644 core/Form/Site/NodeSitemapParametersType.php create mode 100644 core/Form/Site/NodeType.php create mode 100644 core/Form/Site/Page/FileBlockType.php create mode 100644 core/Form/Site/Page/ImageBlockType.php create mode 100644 core/Form/Site/Page/PageType.php create mode 100644 core/Form/Site/Page/TextBlockType.php create mode 100644 core/Form/Site/Page/TextareaBlockType.php create mode 100644 core/Form/UserType.php create mode 100644 core/Manager/EntityManager.php create mode 100644 core/Notification/MailNotifier.php create mode 100644 core/Repository/.gitignore create mode 100644 core/Repository/RepositoryQuery.php create mode 100644 core/Repository/Site/MenuRepository.php create mode 100644 core/Repository/Site/MenuRepositoryQuery.php create mode 100644 core/Repository/Site/NavigationRepository.php create mode 100644 core/Repository/Site/NavigationRepositoryQuery.php create mode 100644 core/Repository/Site/NodeRepository.php create mode 100644 core/Repository/Site/Page/BlockRepository.php create mode 100644 core/Repository/Site/Page/BlockRepositoryQuery.php create mode 100644 core/Repository/Site/Page/PageRepository.php create mode 100644 core/Repository/Site/Page/PageRepositoryQuery.php create mode 100644 core/Resources/translations/messages.fr.yaml create mode 100644 core/Resources/views/account/admin/edit.html.twig create mode 100644 core/Resources/views/admin/layout.html.twig create mode 100644 core/Resources/views/admin/macros/menu.html.twig create mode 100644 core/Resources/views/admin/module/account.html.twig create mode 100644 core/Resources/views/admin/module/flashes.html.twig create mode 100644 core/Resources/views/admin/module/menu.html.twig create mode 100644 core/Resources/views/admin/module/metas.html.twig create mode 100644 core/Resources/views/auth/2fa.html.twig create mode 100644 core/Resources/views/auth/login.html.twig create mode 100644 core/Resources/views/auth/resetting_request.html.twig create mode 100644 core/Resources/views/auth/resetting_update.html.twig create mode 100644 core/Resources/views/form/bootstrap_4_form_theme.html.twig create mode 100644 core/Resources/views/mail/account/resetting_request.html.twig create mode 100644 core/Resources/views/mail/base.html.twig create mode 100644 core/Resources/views/mail/raw.html.twig create mode 100644 core/Resources/views/site/navigation_admin/_form.html.twig create mode 100644 core/Resources/views/site/navigation_admin/edit.html.twig create mode 100644 core/Resources/views/site/navigation_admin/index.html.twig create mode 100644 core/Resources/views/site/navigation_admin/new.html.twig create mode 100644 core/Resources/views/site/navigation_admin/show.html.twig create mode 100644 core/Resources/views/site/node_admin/_form.html.twig create mode 100644 core/Resources/views/site/node_admin/edit.html.twig create mode 100644 core/Resources/views/site/node_admin/move.html.twig create mode 100644 core/Resources/views/site/node_admin/new.html.twig create mode 100644 core/Resources/views/site/node_admin/urls.html.twig create mode 100644 core/Resources/views/site/page_admin/_form.html.twig create mode 100644 core/Resources/views/site/page_admin/edit.html.twig create mode 100644 core/Resources/views/site/page_admin/index.html.twig create mode 100644 core/Resources/views/site/sitemap/sitemap.xml.twig create mode 100644 core/Resources/views/site/tree_admin/navigation.html.twig create mode 100644 core/Resources/views/user/user_admin/_form.html.twig create mode 100644 core/Resources/views/user/user_admin/edit.html.twig create mode 100644 core/Resources/views/user/user_admin/index.html.twig create mode 100644 core/Resources/views/user/user_admin/new.html.twig create mode 100644 core/Resources/views/user/user_admin/show.html.twig create mode 100644 core/Router/SiteRouteLoader.php create mode 100644 core/Security/TokenGenerator.php create mode 100644 core/Site/Node.php create mode 100644 core/Site/PageConfiguration.php create mode 100644 core/Site/PageLocator.php create mode 100644 core/Site/SiteRequest.php create mode 100644 core/Site/SiteStore.php create mode 100644 core/Sitemap/SitemapBuilder.php create mode 100644 core/Slugify/CodeSlugify.php create mode 100644 core/Slugify/RouteParameterSlugify.php create mode 100644 core/Slugify/Slugify.php create mode 100644 core/String/StringBuilder.php create mode 100644 core/Twig/Extension/StringExtension.php create mode 100644 migrations/.gitignore create mode 100644 package.json create mode 100644 phpunit.xml.dist create mode 100644 public/.htaccess create mode 100644 public/index.php create mode 120000 public/vendor/qrcodejs create mode 120000 public/vendor/tinymce create mode 100644 src/Bundle/AppBundle.php create mode 100644 src/Controller/.gitignore create mode 100644 src/DependencyInjection/AppExtension.php create mode 100644 src/DependencyInjection/Configuration.php create mode 100644 src/Entity/.gitignore create mode 100644 src/Entity/Page/SimplePage.php create mode 100644 src/Entity/User.php create mode 100644 src/Factory/UserFactory.php create mode 100644 src/Form/UserType.php create mode 100644 src/Kernel.php create mode 100644 src/Repository/.gitignore create mode 100644 src/Repository/UserRepository.php create mode 100644 src/Repository/UserRepositoryQuery.php create mode 100644 symfony.lock create mode 100644 templates/admin/menu.html.twig create mode 100644 templates/base.html.twig create mode 100644 templates/core/dashboard/index.html.twig create mode 100644 templates/page/simple/page.html.twig create mode 100644 tests/bootstrap.php create mode 100644 translations/.gitignore create mode 100644 webpack.config.js create mode 100644 yarn.lock diff --git a/.env b/.env new file mode 100644 index 0000000..b247ad8 --- /dev/null +++ b/.env @@ -0,0 +1,35 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=e6e287f176fe2c69112fc620e1801bf0 +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml +# +# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" +# DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7" +DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8" +###< doctrine/doctrine-bundle ### + +###> symfony/swiftmailer-bundle ### +# For Gmail as a transport, use: "gmail://username:password@localhost" +# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" +# Delivery is disabled by default via "null://localhost" +MAILER_URL=null://localhost +###< symfony/swiftmailer-bundle ### diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..9e7162f --- /dev/null +++ b/.env.test @@ -0,0 +1,6 @@ +# define your env variables for the test env here +KERNEL_CLASS='App\Kernel' +APP_SECRET='$ecretf0rt3st' +SYMFONY_DEPRECATIONS_HELPER=999999 +PANTHER_APP_ENV=panther +PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc07d31 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/src/Command/TestCommand.php +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> symfony/phpunit-bridge ### +.phpunit +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### + +###> symfony/webpack-encore-bundle ### +/node_modules/ +/public/build/ +npm-debug.log +yarn-error.log +###< symfony/webpack-encore-bundle ### + +/public/uploads/ +!/public/uploads/.gitkeep diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ea624af --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +COMPOSER ?= composer +PHP ?= php7.4 +SSH ?= ssh +WEBPACK ?= webpack +YARN ?= yarn + +all: dep asset clean + +.ONESHELL: +dep: + $(COMPOSER) update --ignore-platform-reqs + $(COMPOSER) install --ignore-platform-reqs + $(YARN) + +asset-watch: + $(WEBPACK) -w + +asset: + $(YARN) + $(WEBPACK) + +clean: + rm -fr var/cache/dev/* + rm -fr var/cache/prod/* + +doctrine-migration: + PHP=$(PHP) ./bin/doctrine-migrate diff --git a/assets/css/admin.scss b/assets/css/admin.scss new file mode 100644 index 0000000..61ecf32 --- /dev/null +++ b/assets/css/admin.scss @@ -0,0 +1,440 @@ +$theme-colors: ( + "primary": #1ab5dc, + "primary-light": lighten(#3183aa, 40%), + "dark-blue": #1e2430, +); + +$grid-gutter-width: 0px; +$pagination-color: #343a40; +$pagination-bg: #ffffff; +$pagination-active-color: #ffffff; +$pagination-active-bg: #343a40; + +@import "~choices.js/src/styles/choices.scss"; +@import "~bootstrap/scss/bootstrap.scss"; +@import "~@fortawesome/fontawesome-free/css/all.css"; + +#logo { + width: 30px; +} + +.choices__list--dropdown { + display: none; +} + +.choices__list--dropdown.is-active { + display: block; +} + +.dropdown-toggle-hide-after { + &::after { + display: none; + } +} + +.login { + &-container { + margin-top: 5%; + margin-bottom: 5%; + } + + &-form { + padding: 5%; + } + + &-image { + width: 100%; + max-width: 80%; + } +} + +.sidebar { + position: fixed; + top: 0; + bottom: 0; + left: 0; + z-index: 100; /* Behind the navbar */ + padding: 71px 0 0; /* Height of navbar */ + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); +} + +.sidebar-sticky { + position: relative; + top: 0; + height: calc(100vh - 71px); + padding-top: .5rem; + overflow-x: hidden; + overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ +} + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sidebar-sticky { + position: -webkit-sticky; + position: sticky; + } +} + +.actions-container { + padding-right: 25px; +} + +.thead-light { + a, th { + color: #333333; + } +} + +tr.table-primary-light { + background-color: #ecf5fa; +} + +.td-nowrap { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.bg-dark-blue { + background: #242b3b; + color: #fff; + + .nav-item-label { + color: #fff; + } +} + +.nav-pills { + .nav-item { + margin-right: 3px; + } + + .nav-link:not(.active) { + color: #333; + background: #eee; + } +} + + +.sidebar { + .nav-link { + font-weight: 500; + color: #333; + border-left: 4px solid map-get($theme-colors, 'dark-blue'); + padding-top: 14px; + padding-bottom: 14px; + + .fa { + font-size: 1.2rem; + margin-right: 5px; + min-width: 30px; + color: #fff; + } + + &.active { + font-weight: bold; + border-left: 4px solid map-get($theme-colors, 'primary'); + background: map-get($theme-colors, 'dark-blue'); + } + } + + &-heading { + font-size: .75rem; + text-transform: uppercase; + display: flex; + } + + @media screen and (max-width: 1130px) { + .nav-link { + font-size: 14px; + } + } + + @media screen and (max-width: 770px) { + .nav { + padding-left: 0; + } + + .nav-link { + padding-left: 10px; + } + + .nav-item-label { + display: none; + } + + .sidebar-heading { + display: none; + } + + width: 50px; + } +} + +*[data-selectable-selector] { + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; +} + +*[data-selectable-selector] { + &:hover { + cursor: pointer; + } +} + +.footer { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + z-index: 1000; + height: 35px; + background: #f8f9fa; +} + +.body { + padding-top: 60px; + + .nav { + padding-left: 10px; + } +} + +@media screen and (max-width: 580px) { + .body { + margin-left: 45px; + } + + .sidebar { + width: 50px; + max-width: 100% !important; + + .sidebar-sticky { + width: 50px; + max-width: 100% !important; + } + } +} + +table.table-fixed, .table-fixed > table { + width: 100%; + + tbody { + overflow: auto; + width: 100%; + height: 500px; + } + + thead, tbody, tr, td, th { + display: block; + } + + tbody { + td, th { + float: left; + min-height: 60px; + } + + tr { + clear: left; + } + } + + thead { + tr { + th { + float: left; + + &.sorted { + &::before { + content: '\f0dc'; + font-family: 'FontAwesome'; + color: #aaa; + margin-right: 3px; + } + } + } + } + } +} + +.toast-container { + display: flex; + position: relative; + z-index: 1060; + + .toast-wrapper { + position: fixed; + top: 20px; + right: 20px; + z-index: 1060; + width: 300px; + } +} + +.tab-form { + padding: 15px; +} + +.icon-margin { + margin-right: 4px; +} + +.file-icon { + font-size: 2em; +} + +.d-ib { + display: inline-block; +} + +.list-checkbox { + vertical-align: middle; + margin-right: 10px; + margin-top: -2px; +} + +.password-strenth { + padding: 0 0 5px 0; + margin-top: -4px; + + .col-sm { + height: 8px; + border: 2px solid #fff; + } + + &-info { + font-size: 13px; + height: 22px; + } +} + +.notification-bell:not([disabled]) { + [data-counter]:after { + display: block; + color: #fff; + background: red; + width: 9px; + height: 9px; + position: absolute; + content: ' '; + top: 4px; + right: 10px; + border-radius: 4px; + } +} + +.form-error-icon { + margin-right: 4px; +} + +.custom-file-label::after { + content: "Parcourir"; +} + +#lease_template_html { + height: calc(100vh - 270px); +} + +.panel { + &-toggler { + &:hover { + cursor: pointer; + } + } + + &-content { + display: block; + + &:not(.active) { + display: none; + } + } +} + +*[data-collection-delete-container] { + cursor: pointer; +} + +*[data-collection-add] { + cursor: pointer; +} + +.login-image { + width: 50%; +} + +.tree { + position: relative; + background: white; + color: #212529; + + span { + font-style: italic; + letter-spacing: .4px; + color: #a8a8a8; + } + + .fa-folder-open, .fa-folder { + color: #007bff; + } + + .fa-html5 { + color: #f21f10; + } + + ul { + padding-left: 5px; + list-style: none; + margin: 0; + padding-bottom: 0; + + li { + position: relative; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 15px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + + &:before { + position: absolute; + top: 15px; + left: 0; + width: 10px; + height: 1px; + margin: auto; + content: ''; + background-color: #666; + } + + &:after { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 1px; + height: 100%; + content: ''; + background-color: #666; + } + + &:last-child:after { + height: 15px; + } + } + + a { + cursor: pointer; + + &:hover { + text-decoration: none; + } + } + } +} + +fieldset.form-group { + margin-bottom: 0; +} diff --git a/assets/images/blank.png b/assets/images/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..5e21c8a9d64b6b89586c0cd1e2a0ced98ee35c98 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-mSQK*5Dp-y;YjHK@;M7UB8wRq zIOIW?@rCpD)j&bX64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1SPJY5_^ sG8*3=WMl;LniT%8&+~8qF~Q)#Vn%f*2F8>=Lpu=P)78&qol`;+02@6fmjD0& literal 0 HcmV?d00001 diff --git a/assets/images/core/logo.svg b/assets/images/core/logo.svg new file mode 100644 index 0000000..0fcfb57 --- /dev/null +++ b/assets/images/core/logo.svg @@ -0,0 +1,92 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..53eae46cf3ab3e4650d8ed946265c640af6ebcd2 GIT binary patch literal 32206 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 literal 0 HcmV?d00001 diff --git a/assets/images/no-image.png b/assets/images/no-image.png new file mode 100644 index 0000000000000000000000000000000000000000..7957221866d0ebf40bc0649eb2b32f0eb5fe8c2b GIT binary patch literal 1536 zcmai!dr(qo7{<|}5xgVWz}wGNm{94s7E~M(I7KZED$v+Q&$u-yR1`z zrL}2}ipbE>COc}E4Kgb#-C86x*UN@xtXh_9<)uCCzdO78&b;q$p6{FY`TqKzYpzV!ljoo(%FE;uPW__*{sz3UXqY&;0k*?8L_!_VbR$W$foG?B)!;zi@l3Demgx znuuIO2D`g4#b=>PH6U*4nA}jJZ=HtZ6OX4X7J5t1sIm7LzudAewC1dN7~pk}C}y&E zL`L2@?fT_i?TMecFT9?x0Ze3Meeam*zzszWVAZo33wMv~E4}~WVl~{=cq z+lM4>@8sE6wk26<9DCiS-pOjq3R%XjxZ&ndgqzG%X)KQ~uPohoc;lteYpJ(x-UOG| zoFBY$Bqv95xbgM4{3!$pg+i@&Wg;glJG)u^aHNIRA6>m5Ecbm$ht?dUR`PO(=ki+Y#|fTI<|QS+r_9j$P#vyBmSP`bH;ZctOX^a0Pm2@$if1g&&j zWG=wF%dqCYM+9?}*3yafAKZxW7cqbWlxQ|94FR`;7Xp5xLwk>kLccN|&P;A90oF6r;bR&X}^O+T& zX$wKv4<(Zh!i!PvJP7j+L#&Aw2LG-Y$$xXuq_xgL^<+Zx;5|dJ-S8&%yB{%N^j8GukL+X+zfe$*e%F^b^9OxspkCwns%cLsX#7ItJa3 zeFy(MuY@zR9iIJQhrWA>=i)U{ABe+sULN%8ro?3S?oPouw^vHn__W>!-oXscDV$Lf zsA~xDUJC6Z+v?{S&Wp%+!RR?{SBySfwFYcIdHWtLTq!S-PW<6(=$dklP%Qwtn~!M8 zTmr22*eJ84nsnn74`NZ6$?{jdFs;{@z?`&1=57AekY7!gP;NgQv(9nH)8MQUh^y zBp`n6K#>DCNqJwaBa_wPVW-UbbP8BiNzr4YNO1m}#I=3Vt_n^MGXtvAI;p0rP71t1 z7MZI;xVco|c`(5^0Ou#i)%Hh|6r2rF!H9Dn74WH&3J4%8AqJ1UVFr@sKD*k zlX`mvXIX?Afp|DWLu;XaQ6~h%8gT~VhCD$_PwCY*5;xX(E$mXLhrWtrf}p9HpPDsn z<8FN2{+NpBrY5AT(L45-r~1iW;&gPyxWGZM? ztO+NoETxV6O({M=WUE { + const input = document.createElement('input'); + const value = 'a'; + + input.setAttribute('type', 'date'); + input.setAttribute('value', value); + + return input.value !== value; +} + +module.exports = () => { + if (isDateSupported()) { + return + } + + const inputs = document.querySelectorAll('input[type="date"]') + const size = inputs.length + + for (var i = 0, c = inputs.length; i < c; i++) { + new Datepicker.Datepicker(inputs[i], { + format: 'yyyy-mm-dd' + }) + } +} diff --git a/assets/js/addons/dbclick.js b/assets/js/addons/dbclick.js new file mode 100644 index 0000000..f8a6c28 --- /dev/null +++ b/assets/js/addons/dbclick.js @@ -0,0 +1,7 @@ +const $ = require('jquery'); + +module.exports = function() { + $('*[data-dblclick]').dblclick(function(e) { + document.location.href = $(this).attr('data-dblclick'); + }) +}; diff --git a/assets/js/addons/document-selector.js b/assets/js/addons/document-selector.js new file mode 100644 index 0000000..70cbd91 --- /dev/null +++ b/assets/js/addons/document-selector.js @@ -0,0 +1,43 @@ +const $ = require('jquery'); + +let DocumentSelector = () => { + let forms = $('.document-selector-form'); + let btnSubmit = $('#download-archive-form button'); + + let handler = function() { + forms.each((fi, f) => { + let form = $(f); + let ids = form.find('.document-selector-ids'); + let btn = form.find('.document-selector-button'); + + ids.html(''); + let hasSelection = false; + + $('*[data-documents] *[data-selectable-row] input[data-selectable-checkbox]').each((i, c) => { + let checkbox = $(c); + + if (checkbox.is(':checked')) { + ids.append(checkbox[0].outerHTML); + hasSelection = true; + } + }); + + if (hasSelection && btn.length) { + btn.removeAttr('disabled'); + ids.find('input').prop('checked', true); + } else { + btn.attr('disabled', 'disabled'); + } + }) + } + + $('*[data-documents] *[data-selectable-row]').click(function() { + window.setTimeout(handler, 100) + }); + + $('*[data-documents] *[data-selectable-row]').on('clicked', function() { + window.setTimeout(handler, 100) + }); +} + +module.exports = DocumentSelector; diff --git a/assets/js/addons/editor.js b/assets/js/addons/editor.js new file mode 100644 index 0000000..75c06f0 --- /dev/null +++ b/assets/js/addons/editor.js @@ -0,0 +1,23 @@ +module.exports = function() { + if (typeof tinymce === 'undefined') { + return; + } + + tinymce.init({ + selector: '*[data-tinymce]', + base_url: '/vendor/tinymce/', + cache_suffix: '?v=4.1.6', + language: 'fr_FR', + plugins: 'print preview importcss searchreplace visualblocks visualchars fullscreen template table charmap hr pagebreak nonbreaking toc insertdatetime advlist lists wordcount textpattern noneditable help charmap quickbars', + menubar: 'file edit view insert format tools table tc help', + toolbar: 'undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist checklist | forecolor backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap | fullscreen preview | code', + importcss_append: true, + image_caption: true, + quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable', + noneditable_noneditable_class: "mceNonEditable", + toolbar_drawer: 'sliding', + spellchecker_dialog: true, + tinycomments_mode: 'embedded', + contextmenu: "link image imagetools table configurepermanentpen", + }); +}; diff --git a/assets/js/addons/form-collection.js b/assets/js/addons/form-collection.js new file mode 100644 index 0000000..9e5145c --- /dev/null +++ b/assets/js/addons/form-collection.js @@ -0,0 +1,84 @@ +const $ = require('jquery'); + +const DeleteHandler = (e) => { + e.stopPropagation() + const target = e.target; + let button = $(target); + + if (button.is('[data-collection-delete-container]')) { + button = button.find('*[data-collection-delete]').first() + } + + const id = button.attr('data-collection-delete'); + const collection = button.parents('[data-collection]') + const item = collection.find('*[data-collection-item="' + id + '"]') + + if (confirm('Validez-vous la suppression ?')) { + item.remove(); + collection.trigger('collection.update'); + } +} + +const CollectionInitilizedAndUpdated = (e) => { + const target = $(e.target) + + target.find('*[data-collection-empty]').toggleClass( + 'd-none', + target.find('*[data-collection-item]').length !== 0 + ); + + target.find('*[data-collection-nonempty]').toggleClass( + 'd-none', + target.find('*[data-collection-item]').length === 0 + ); +} + +const FormCollection = () => { + $('*[data-collection]').on( + 'collection.update', + CollectionInitilizedAndUpdated + ); + + $('*[data-collection]').on( + 'collection.init', + CollectionInitilizedAndUpdated + ); + + $('body').on( + 'click', + '*[data-collection-delete], *[data-collection-delete-container]', + DeleteHandler + ); + + $('body').on('click', '*[data-collection-add]', (e) => { + e.stopPropagation() + + const collectionId = $(e.target).attr('data-collection-add') + const collectionContainer = $('*[data-collection="' + collectionId + '"]') + const prototypeContent = $('#' + collectionId).html() + let name = 0 + + collectionContainer.find('*[data-collection-item]').each(function() { + var n = parseInt($(this).attr('data-collection-item')) + + if (n >= name) { + name = n + 1 + } + }) + + collectionContainer.append(prototypeContent) + + const item = collectionContainer.children('*[data-collection-item]:last-child') + const deleteBtn = $('') + + item.find('*[data-collection-delete-container]').first().append(deleteBtn) + item.html(item.html().replace(/__name__/g, name)) + item.attr('data-collection-item', name) + + collectionContainer.trigger('collection.update'); + }); + + $('*[data-collection]').trigger('collection.init'); +} + +module.exports = FormCollection; diff --git a/assets/js/addons/form-confirm.js b/assets/js/addons/form-confirm.js new file mode 100644 index 0000000..4e07e8c --- /dev/null +++ b/assets/js/addons/form-confirm.js @@ -0,0 +1,15 @@ +const $ = require('jquery'); + +module.exports = function() { + $('*[data-form-confirm]').submit(function(e) { + let message = $(this).attr('data-form-confirm'); + + if (!message) { + message = 'Confimez-vous cette action ?'; + } + + if (!confirm(message)) { + e.preventDefault(); + } + }) +}; diff --git a/assets/js/addons/form.js b/assets/js/addons/form.js new file mode 100644 index 0000000..a3e76aa --- /dev/null +++ b/assets/js/addons/form.js @@ -0,0 +1,11 @@ +const $ = require('jquery'); + +module.exports = function() { + $('.custom-file-input').on('change', function(event) { + let inputFile = event.currentTarget; + + $(inputFile).parent() + .find('.custom-file-label') + .html(inputFile.files[0].name); + }); +}; diff --git a/assets/js/addons/modal.js b/assets/js/addons/modal.js new file mode 100644 index 0000000..0e389f2 --- /dev/null +++ b/assets/js/addons/modal.js @@ -0,0 +1,31 @@ +const $ = require('jquery'); + +module.exports = function() { + $('body').on('click', '*[data-modal]', (e) => { + e.preventDefault(); + e.stopPropagation(); + + let container = $('#modal-container'); + + if (!container.length) { + container = $('