]> _ Git - fluidbook-toolbox.git/commitdiff
wip #6694 @14:00
authorsoufiane <soufiane@cubedesigners.com>
Tue, 6 Feb 2024 17:07:21 +0000 (18:07 +0100)
committersoufiane <soufiane@cubedesigners.com>
Tue, 6 Feb 2024 17:07:21 +0000 (18:07 +0100)
app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php
resources/linkeditor/js/linkeditor.accessControl.js [new file with mode: 0644]
resources/linkeditor/js/linkeditor.js

index 67b896ed00b9a604795c20c860f23056a9d4c050..f1fe37c11d1e9022c219de4a821f808a88bd6af4 100644 (file)
@@ -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 (file)
index 0000000..0a62885
--- /dev/null
@@ -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;
index 8d2c2e235e9e95c542dd3549f2918e1c04bdb0fa..4350fdc1f0f61a65427f04af7ef789f79ecf4e97 100644 (file)
@@ -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');
     },