From: soufiane Date: Tue, 6 Feb 2024 17:07:21 +0000 (+0100) Subject: wip #6694 @14:00 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=e397f6d50669330c29c0cc0d19dba6cc7702b9db;p=fluidbook-toolbox.git wip #6694 @14:00 --- diff --git a/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php index 67b896ed0..f1fe37c11 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php @@ -14,15 +14,14 @@ use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Route; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; -use App\Events\DetectConnexion; use Illuminate\Support\Facades\Broadcast; use Illuminate\Support\Str; use Illuminate\Http\Request; +use Prologue\Alerts\Facades\Alert; trait LinksOperation { - protected $token; protected $tabOpen = 0; @@ -30,7 +29,7 @@ trait LinksOperation protected function setupLinksRoutes($segment, $routeName, $controller) { Route::match(['get'], $segment . '/{id}/edit/links', $controller . '@links')->name('fluidbook_linkeditor'); - //Route::match(['post'], $segment . '/{id}/edit/links', $controller . '@broadcast')->name('fluidbook_linkeditor_post'); + Route::match(['post'], $segment . '/{id}/edit/links', $controller . '@broadcast')->name('fluidbook_linkeditor_post'); Route::match(['get'], $segment . '/{id}/edit/links/versions', $controller . '@getLinkVersions'); Route::match(['get'], $segment . '/{id}/edit/links/versions/export/{version}', $controller . '@exportLinks'); Route::match(['post'], $segment . '/{id}/edit/links/import/merge', $controller . '@importLinksMerge'); @@ -305,77 +304,78 @@ trait LinksOperation $token = $request->token; $userId = backpack_user()->id; $unload = $request->unload; + $clear = $request->clear; + $key = null; + $notify = $clear ? "notify" : ""; - /*cache()->forget('queue_editor'.$fluidbookId); - /*cache()->forget('connexion'.$fluidbookId);*/ + //cache()->forget('queue_editor'.$fluidbookId); /* Reset * */ - if (!cache()->has('queue_editor' . $fluidbookId)) { - $entries = [["token" => $token, "date" => now()]]; - cache(['queue_editor' . $fluidbookId => $entries]); - } else { - $queueEditor = cache()->get('queue_editor' . $fluidbookId); // on récupère la liste des onglets + $queueEditor = cache()->get('queue_editor' . $fluidbookId); // on récupère la liste des onglets + + if(!empty($queueEditor) || sizeof($queueEditor) > 0) { + $queueEditor = array_filter($queueEditor, function ($n) { + return strtotime($n["date"]) > strtotime(now()) - 5; + }); + } + + if(!empty($queueEditor) || sizeof($queueEditor) > 0) { + if (!is_array($queueEditor[array_key_first($queueEditor)])) { + cache()->forget('queue_editor' . $fluidbookId); + } + $connexion = array_filter($queueEditor, function ($n) use ($token) { return $n["token"] === $token; }); $key = key($connexion); - if ((int)$unload === 1 && $key) { - unset($queueEditor[$key]); // on supprime l'onglet de la liste au chargement ou à sa fermeture - } + if(null === $unload) { + if ($key === null) { + $queueEditor[] = ["token" => $token, "date" => now(),"userid"=>$userId]; + } else { + $queueEditor[$key]["token"] = $token; + $queueEditor[$key]["date"] = now(); + $queueEditor[$key]["userid"] = $userId; + } - if (!$key) { - $queueEditor[] = ["token" => $token, "date" => now()]; + // on supprime les connexions afk + $queueEditor = array_filter($queueEditor, function ($n) { + return strtotime($n["date"]) > strtotime(now()) - 5; + }); } else { - $queueEditor[$key]["token"] = $token; - $queueEditor[$key]["date"] = now(); + unset($queueEditor[$key]); } - - // on supprime les connexions afk - $queueEditor = array_filter($queueEditor, function ($n) { - return strtotime($n["date"]) > strtotime(now()) - 10; - }); - cache(['queue_editor' . $fluidbookId => $queueEditor]); + } else { + $entries = [["token" => $token, "date" => now(), "userid" => $userId]]; + cache(['queue_editor' . $fluidbookId => $entries]); } - $connexionExist = cache()->get('connexion' . $fluidbookId); $queueEditor = cache()->get('queue_editor' . $fluidbookId); // réinitialiser la connexion courante quand on clique sur "déconnecter l'utilisateur" - if ($request->clear) { + if ($clear == 1) { $queueEditorCurrent = $queueEditor[$key]; unset($queueEditor[$key]); $queueEditor = array_merge([$queueEditorCurrent], $queueEditor); cache(['queue_editor' . $fluidbookId => $queueEditor]); - cache(['connexion' . $fluidbookId => ['id' => $userId, 'token' => $token, 'f_id' => $fluidbookId]]); - } - - /*cache()->forget('queue_editor'.$fluidbookId);*/ - /*cache()->forget('connexion'.$fluidbookId);*/ - - if (cache()->has('queue_editor' . $fluidbookId)) { - if (sizeof(cache()->get('queue_editor' . $fluidbookId)) === 1) { - cache(['connexion' . $fluidbookId => ['id' => $userId, 'token' => $token, 'f_id' => $fluidbookId]]); - return json_encode(["queueEditor" => $queueEditor, "status" => "available", $connexionExist]); - } } - if ($connexionExist && $fluidbookId === $connexionExist['f_id']) { - $user = User::withoutGlobalScopes()->find($connexionExist['id']); + if (cache()->has('queue_editor' . $fluidbookId) && !empty($queueEditor)) { + $user = User::withoutGlobalScopes()->find(current($queueEditor)["userid"]); $user = $user->firstname . ' ' . $user->lastname; + if(sizeof($queueEditor) === 1) return json_encode(["queueEditor" => $queueEditor, "status" => "available"]); - if (current($queueEditor)["token"] !== $token) { - return json_encode(["queueEditor" => $queueEditor, "token" => $token, "status" => "unavailable", "infos_connection" => array_merge(["user" => $user], $connexionExist)]); + if (current($queueEditor)["token"] === $token) { + return json_encode(["queueEditor" => $queueEditor, "status" => "available"]); } else { - return json_encode(["queueEditor" => $queueEditor, "status" => "available", $connexionExist]); + if($clear) $notify = "notify"; + return json_encode(["notify"=>$notify,"queueEditor"=>$queueEditor,"status"=>"unavailable","infos_connection"=>array_merge(["user" => $user,'id'=>current($queueEditor)["userid"]])]); } - } else { - cache(['connexion' . $fluidbookId => ['id' => $userId, 'token' => $token, 'f_id' => $fluidbookId]]); - return json_encode(["queueEditor" => $queueEditor, "status" => "available", cache()->get('connexion' . $fluidbookId)]); } + return json_encode(["status" => "available","queueEditor" => $queueEditor]); } protected function fixDriftedLinks($fluidbook_id) diff --git a/resources/linkeditor/js/linkeditor.accessControl.js b/resources/linkeditor/js/linkeditor.accessControl.js new file mode 100644 index 000000000..0a6288550 --- /dev/null +++ b/resources/linkeditor/js/linkeditor.accessControl.js @@ -0,0 +1,79 @@ +function LinkeditorAccessControl(linkeditor) { + this.linkeditor = linkeditor; + this.init(); +} + +LinkeditorAccessControl.prototype = { + init: function () { + this.interval = null + this.token = $("[data-token]").data("token") + const $this = this + + $(document).on("click", "#connectTo", function(e) { + e.preventDefault() + clearTimeout($this.interval) + $this.intervalConnection("1"); + }) + + $(window).on("unload",function(){ + clearTimeout($this.interval) + sessionStorage.setItem('token', token); + localStorage.setItem('unload', '1'); + }) + + this.interval = setTimeout(() => { $this.intervalConnection() }, 10 ) + }, + + intervalConnection: function(clear = null) { + let unload = localStorage.getItem('unload') + let currentToken = sessionStorage.getItem('token') + let userID = $("#userID").data('id') + const $this = this + + $.ajax({ + method: "POST", + url: '/fluidbook-publication/' + FLUIDBOOK_DATA.id + '/edit/links', + data: {id: FLUIDBOOK_DATA.id, token: currentToken ? currentToken : $this.token, unload: unload, clear: clear} + }).done(function (msg) { + let response = JSON.parse(msg) + if (response.status === "unavailable") { + if ($("#popup-overlay").find('.popup').length === 0) { + $("#popup-overlay").addClass("show") + + let popupName = 'unavailable'; + if(response.infos_connection.id === userID) popupName = 'unavailable-twin-connection'; + $this.linkeditor.popup.open(popupName); + + $this.linkeditor.save.saveIfUnsavedChanges("Sauvegarde après avoir été déconnecté par un autre utilisateur", false, function () { + }); + + // Bloquer les raccourcis clavier + $this.linkeditor.disabledKeyFilter() + + $("#username").text(response.infos_connection.user) + $("#id").text(response.infos_connection.id) + } + } else { + if ($("#popup-overlay").find('.popup[data-popup^="unavailable"]').length > 0) { + $("#popup-overlay").removeClass("show") + window.linkeditor.popup.close(); + } + window.key.filter = function (event) { + let tagName = (event.target || event.srcElement).tagName; + if (tagName === 'TEXTAREA' && event.keyCode === 13) { + return false; + } + return true; + }; + } + sessionStorage.removeItem('token'); + localStorage.removeItem('unload'); + + setTimeout(() => { + $this.intervalConnection() + }, 2000) + }); + }, +} + +export default LinkeditorAccessControl; diff --git a/resources/linkeditor/js/linkeditor.js b/resources/linkeditor/js/linkeditor.js index 8d2c2e235..4350fdc1f 100644 --- a/resources/linkeditor/js/linkeditor.js +++ b/resources/linkeditor/js/linkeditor.js @@ -23,6 +23,7 @@ import LinkeditorPopup from './linkeditor.popup'; import LinkeditorLayers from "./linkeditor.layers"; import LinkeditorUndo from './linkeditor.undo'; import LinkeditorClipboard from './linkeditor.clipboard'; +import LinkeditorAccessControl from './linkeditor.accessControl'; window.$ = window.jQuery = require('jquery'); window.key = require('keymaster-reloaded'); @@ -58,6 +59,7 @@ import 'spectrum-colorpicker/spectrum.css'; require('select2'); import 'select2/dist/css/select2.css'; import 'select2-bootstrap-theme/dist/select2-bootstrap.css'; +import * as noty from "noty"; window.MD5 = require("crypto-js/md5"); @@ -115,6 +117,7 @@ LinkEditor.prototype = { this.layers = new LinkeditorLayers(this); this.popup = new LinkeditorPopup(this); this.undo = new LinkeditorUndo(this); + this.accessControl = new LinkeditorAccessControl(this); this.initEvents(); this.initIcons(); @@ -281,6 +284,10 @@ LinkEditor.prototype = { this.changePage(); }, + disabledKeyFilter: function () { + return keyfilter(false,true) + }, + resetKeyModifiers: function () { $("#linkeditor-main").removeClass('selection').removeClass('grab').removeClass('duplicate'); },