Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Admin/Resources/Assets/Css/style.css

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions Admin/Resources/Views/template.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use CMW\Manager\Views\View;
use CMW\Utils\Website;

include_once ('Includes/head.inc.php');

Expand All @@ -20,5 +21,11 @@
View::loadInclude($includes, 'afterScript');
?>

<script>
//Variables global utilisable dans les script JS (admin only)
const BASE_URL = "<?= Website::getUrl() ?>";
const WEBSITE_NAME = "<?= Website::getWebsiteName() ?>";
</script>

</body>
</html>
10 changes: 5 additions & 5 deletions Admin/Tailwind/tailwindInput.css
Original file line number Diff line number Diff line change
Expand Up @@ -880,23 +880,23 @@ kbd {
}

.modal-container {
@apply hidden overflow-y-auto overflow-x-hidden fixed top-[8%] right-0 left-0 z-[600000] justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-[80vh];
@apply hidden overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-[600000] justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] ;
}

.modal-sm {
@apply overflow-hidden relative w-full max-w-md max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third;
@apply overflow-hidden relative w-full max-w-md max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third;
}

.modal {
@apply relative w-full max-w-2xl max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third;
@apply relative w-full max-w-2xl max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third;
}

.modal-lg {
@apply overflow-hidden relative w-full max-w-4xl max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third;
@apply overflow-hidden relative w-full max-w-4xl max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third;
}

.modal-xl {
@apply overflow-hidden relative w-full max-w-7xl max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third;
@apply overflow-hidden relative w-full max-w-7xl max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third;
}

.modal-header {
Expand Down
14 changes: 14 additions & 0 deletions App/Package/Core/Controllers/EditorController.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,18 @@ private function tinyMceUploadImage(): void
echo json_encode(['error' => $e->getMessage()]);
}
}

#[Link('/upload/noConvert/image', Link::POST, [], '/editor', secure: false)]
private function tinyMceUploadNoConvertImage(): void
{
try {
$file = $_FILES['file'];
$uploadedFileName = ImagesManager::upload($file, 'Editor');
$fileUrl = '/Public/Uploads/Editor/' . $uploadedFileName;
echo json_encode(['location' => $fileUrl]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['error' => $e->getMessage()]);
}
}
}
2 changes: 1 addition & 1 deletion App/Package/Core/Controllers/MailController.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ private function mailConfiguration(): void
View::createAdminView('Core', 'Mail/mailConfig')
->addStyle('Admin/Resources/Vendors/Izitoast/iziToast.min.css')
->addScriptBefore('Admin/Resources/Vendors/Tinymce/tinymce.min.js',
'Admin/Resources/Vendors/Tinymce/Config/full.js')
'App/Package/Core/Views/Mail/Resources/tinyMCEConfig.js')
->addScriptAfter('App/Package/Core/Views/Mail/Resources/sendMail.js',
'Admin/Resources/Vendors/Izitoast/iziToast.min.js')
->addVariableList(['config' => $config])
Expand Down
97 changes: 97 additions & 0 deletions App/Package/Core/Views/Mail/Resources/tinyMCEConfig.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
document.addEventListener("DOMContentLoaded", function () {
let theme = localStorage.getItem("color-theme");
if (theme === "dark") {
theme = "theme-dark";
} else {
theme = "theme-light";
}

const images_upload_handler = (blobInfo) => new Promise((success, failure) => {
const xhr = new XMLHttpRequest();
const formData = new FormData();

//No convert images
xhr.open('POST', '/editor/upload/noConvert/image');
const imgElement = tinymce.activeEditor.selection.getNode();

xhr.onload = function() {
if (xhr.status === 200) {
let json = JSON.parse(xhr.responseText);

if (json && typeof json.location === 'string') {
success(json.location);
} else {
failure('Réponse JSON invalide');
tinymce.activeEditor.dom.remove(imgElement);
}
} else {
failure('Erreur lors de l\'upload : ' + xhr.status);
tinymce.activeEditor.dom.remove(imgElement);
}
};

xhr.onerror = function() {
failure('Erreur réseau ou problème d\'accès au serveur');
tinymce.activeEditor.dom.remove(imgElement);
};

formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
});

function initTinyMCE(skin) {
tinymce.init({
selector: `.tinymce`,
skin: skin,
content_css: skin,
promotion: false,
toolbar_sticky: true,
toolbar_mode: 'sliding',
plugins: ['emoticons', 'image', 'autoresize', 'wordcount', 'advlist', 'lists', 'charmap', 'codesample', 'code', 'directionality', 'fullscreen', 'link', 'insertdatetime', 'media', 'pagebreak', 'nonbreaking', 'preview', 'quickbars', 'searchreplace', 'table', 'visualblocks', 'visualchars'],
toolbar:
'undo redo | ' +
'formatpainter casechange blocks fontsizeselect | ' +
'alignleft aligncenter alignright alignjustify | ' +
'bold italic strikethrough | ' +
'forecolor backcolor removeformat |' +
'bullist numlist outdent indent | ' +
'table | ' +
'visualchars visualblocks ltr rtl | ' +
'searchreplace nonbreaking pagebreak|' +
'link media image insertdatetime |' +
'emoticons charmap |' +
'wordcount codesample code |' +
'preview fullscreen help',
menubar: false,
images_file_types: 'jpg,svg,webp',
file_picker_types: 'file image media',
statusbar: false,
//Use full URL
relative_urls: false,
remove_script_host: false,
document_base_url: BASE_URL, //Global constant
images_upload_handler:images_upload_handler,
setup: function(editor) {
editor.on('init', function() {
const textarea = editor.getElement();
const minHeight = textarea.getAttribute('data-tiny-height') || 350;
editor.editorContainer.style.minHeight = `${minHeight}px`;
});
}
});
}

initTinyMCE(theme);

// Theme toggle logic
document.getElementById('theme-toggle').addEventListener('click', function () {
let newTheme = localStorage.getItem("color-theme");
if (newTheme === "dark") {
newTheme = "theme-dark";
} else {
newTheme = "theme-light";
}
tinymce.remove('.tinymce');
initTinyMCE(newTheme);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
<?php

namespace CMW\Controller\Users\Admin\Settings;

use CMW\Controller\Users\UsersController;
use CMW\Manager\Filter\FilterManager;
use CMW\Manager\Flash\Alert;
use CMW\Manager\Flash\Flash;
use CMW\Manager\Lang\LangManager;
use CMW\Manager\Package\AbstractController;
use CMW\Manager\Router\Link;
use CMW\Manager\Views\View;
use CMW\Model\Users\UsersSettingsModel;
use CMW\Utils\Redirect;
use JetBrains\PhpStorm\NoReturn;
use function filter_input;
use const FILTER_SANITIZE_NUMBER_INT;
use const INPUT_POST;

/**
* Class: @UsersAdminSettingsBlacklistController
* @package Users
* @link https://craftmywebsite.fr/docs/fr/technical/creer-un-package/controllers
*/
class UsersAdminSettingsBlacklistController extends AbstractController
{
#[Link('/settings/blacklist/pseudo', Link::GET, [], '/cmw-admin/users')]
private function settings(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings');

$blacklistedPseudo = UsersSettingsModel::getInstance()->getBlacklistedPseudos();

View::createAdminView('Users', 'Settings/blacklist')
->addStyle('Admin/Resources/Assets/Css/simple-datatables.css')
->addScriptAfter('Admin/Resources/Vendors/Simple-datatables/simple-datatables.js',
'Admin/Resources/Vendors/Simple-datatables/config-datatables.js')
->addVariableList(['pseudos' => $blacklistedPseudo])
->view();
}

#[NoReturn]
#[Link('/settings/blacklist/pseudo', Link::POST, [], '/cmw-admin/users')]
private function pseudoBlacklistPost(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.add');

if (empty($_POST['pseudo'])) {
Redirect::redirectPreviousRoute();
}

$pseudo = FilterManager::filterInputStringPost('pseudo');

if (UsersSettingsModel::getInstance()->addBlacklistedPseudo($pseudo)) {
Flash::send(
Alert::SUCCESS,
LangManager::translate('core.toaster.success'),
LangManager::translate('users.settings.blacklisted.pseudo.toasters.add.success', ['pseudo' => $pseudo]),
);
} else {
Flash::send(
Alert::ERROR,
LangManager::translate('core.toaster.error'),
LangManager::translate('users.settings.blacklisted.pseudo.toasters.add.error', ['pseudo' => $pseudo]),
);
}

Redirect::redirectPreviousRoute();
}

#[NoReturn]
#[Link('/settings/blacklist/pseudo/edit/:id', Link::POST, ['id' => '[0-9]+'], '/cmw-admin/users')]
private function editPseudoBlacklistPost(int $id): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.edit');

if (empty($_POST['pseudo'])) {
Redirect::redirectPreviousRoute();
}

$pseudo = filter_input(INPUT_POST, 'pseudo');

if (UsersSettingsModel::getInstance()->editBlacklistedPseudo($id, $pseudo)) {
Flash::send(
Alert::SUCCESS,
LangManager::translate('core.toaster.success'),
LangManager::translate('users.settings.blacklisted.pseudo.toasters.edit.success', ['pseudo' => $pseudo])
);
} else {
Flash::send(
Alert::ERROR,
LangManager::translate('core.toaster.error'),
LangManager::translate('users.settings.blacklisted.pseudo.toasters.edit.error', ['pseudo' => $pseudo])
);
}

Redirect::redirectPreviousRoute();
}

#[NoReturn]
#[Link('/settings/blacklist/pseudo/delete/:id', Link::GET, ['id' => '[0-9]+'], '/cmw-admin/users')]
private function deletePseudoBlacklisted(int $id): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.delete');

if (UsersSettingsModel::getInstance()->removeBlacklistedPseudo($id)) {
Flash::send(
Alert::SUCCESS,
LangManager::translate('core.toaster.success'),
LangManager::translate('users.settings.blacklisted.pseudo.toasters.delete.success'),
);
} else {
Flash::send(
Alert::ERROR,
LangManager::translate('core.toaster.error'),
LangManager::translate('users.settings.blacklisted.pseudo.toasters.delete.error'),
);
}

Redirect::redirectPreviousRoute();
}

#[NoReturn]
#[Link('/settings/blacklist/pseudo/delete/bulk', Link::POST, [], '/cmw-admin/users', secure: false)]
private function adminDeleteSelectedPost(): void
{
UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.delete');

$selectedIds = $_POST['selectedIds'];

if (empty($selectedIds)) {
Flash::send(Alert::ERROR, 'Blacklist', 'Aucun pseudo sélectionné');
Redirect::redirectPreviousRoute();
}

$i = 0;
foreach ($selectedIds as $selectedId) {
$selectedId = FilterManager::filterData($selectedId, 11, FILTER_SANITIZE_NUMBER_INT);
UsersSettingsModel::getInstance()->removeBlacklistedPseudo($selectedId);
$i++;
}
Flash::send(Alert::SUCCESS, 'Blacklist', "$i pseudos supprimé !");

Redirect::redirectPreviousRoute();
}
}
Loading