]> _ Git - fluidbook-toolbox.git/commitdiff
wip #5638 @1.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Sat, 10 Dec 2022 09:07:57 +0000 (10:07 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Sat, 10 Dec 2022 09:07:57 +0000 (10:07 +0100)
app/Http/Controllers/Admin/Operations/FluidbookPublication/EditOperation.php
app/Models/FluidbookPublication.php
resources/linkeditor/js/linkeditor.links.js
resources/linkeditor/js/linkeditor.save.js
resources/linkeditor/js/linkeditor.toolbar.js
resources/linkeditor/style/inc/_form.sass
resources/linkeditor/style/inc/_popup.sass
resources/views/fluidbook_publication/link_editor.blade.php

index 5b71fe68f12adc44d56f4aaadf366886dbed82aa..3d3f2df30c4623d135eb1b207a223291bae3e25b 100644 (file)
@@ -21,6 +21,7 @@ trait EditOperation
         Route::match(['get'], $segment . '/{id}/edit/links/versions/export/{version}', $controller . '@exportLinks');
         Route::match(['post'], $segment . '/{id}/edit/links/import/merge', $controller . '@importLinksMerge');
         Route::match(['post'], $segment . '/{id}/edit/links/import/replace', $controller . '@importLinks');
+        Route::match(['post'], $segment . '/{id}/edit/links/move', $controller . '@moveLinks');
         Route::match(['get'], $segment . '/{id}/edit/links/versions/restore/{version}', $controller . '@restoreLinks');
         Route::put($segment . '/{id}/save/links', $controller . '@saveLinks');
         Route::get($segment . '/{id}/edit/{type}_{page}.{format}', $controller . '@getLinkPage')
@@ -44,6 +45,76 @@ trait EditOperation
         );
     }
 
+    protected function moveLinks($fluidbook_id)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+
+        $offset = request('number');
+        $from = request('start');
+        $internal = request('offset_internal_links', '0');
+
+        /** @var FluidbookPublication $fb */
+        $fb = FluidbookPublication::find($fluidbook_id);
+        if ($internal) {
+            $numerotation = explode(',', $fb->page_numbers);
+        }
+        $width = $fb->getPageWidth();
+        $isOnePage = $fb->isOnePage();
+
+        FluidbookLinks::getLinksAndRulers($fluidbook_id, $links, $rulers);
+
+        $rlinks = array();
+        foreach ($links as $k => $link) {
+            if (!$isOnePage && $link['page'] % 2 == 0 && $link['left'] > $width) {
+                $link['page']++;
+                $link['left'] -= $width;
+            }
+
+            if ($link['page'] >= $from) {
+                $link['page'] += $offset;
+            }
+            if ($internal && $link['type'] == 5) {
+                if ($link['numerotation'] == 'physical') {
+                    if ($link['to'] >= $from) {
+                        $link['to'] += $offset;
+                    }
+                } else {
+                    $ph = array_search($link['to'], $numerotation) + 1;
+                    if ($ph >= $from) {
+                        $ph += $offset;
+                        $vi = $numerotation[($ph - 1)];
+                        $link['to'] = $vi;
+                    }
+                }
+            }
+            $rlinks[$k] = $link;
+        }
+
+        $rrulers = array();
+        foreach ($rulers as $k => $ruler) {
+            if (!$isOnePage && $ruler['type'] == 'x' && $ruler['page'] % 2 == 0 && $ruler['pos'] > $width) {
+                $ruler['page']++;
+                $ruler['pos'] -= $width;
+            }
+
+            if ($ruler['page'] > $from) {
+                $ruler['page'] += $offset;
+            }
+
+            if (!$isOnePage && $ruler['page'] % 2 == 1 && $ruler['type'] == 'x') {
+                $ruler['page']--;
+                $ruler['pos'] += $width;
+            }
+
+            $rrulers[$k] = $ruler;
+        }
+
+        FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, __('Décalage de :nb pages à partir de la page :page', ['nb' => $offset, 'page' => $from]), $rlinks, $rrulers);
+        return response()->json(['success' => 'ok']);
+    }
+
     protected function getLinkPage($fluidbook_id, $type, $page, $format = 'jpg')
     {
         if (!FluidbookPublication::hasPermission($fluidbook_id)) {
@@ -100,9 +171,9 @@ trait EditOperation
 
         FluidbookLinks::getLinksAndRulers($fluidbook_id, $links, $rulers, $version);
         FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, __('Restaurer la sauvegarde des liens :date', ['date' => date('Y-m-d H:i:s', $version)]), $links, $rulers, [], []);
+        return response()->json(['success' => 'ok']);
     }
 
-
     protected function importLinks($fluidbook_id)
     {
         if (!FluidbookPublication::hasPermission($fluidbook_id)) {
@@ -113,6 +184,7 @@ trait EditOperation
 
         FluidbookLinks::getLinksAndRulersFromExcelFile($uploadedFile->getPathname(), $links, $rulers);
         FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, __("Remplacer les liens à partir du fichier :file", ['file' => $uploadedFile->getClientOriginalName()]), $links, $rulers, [], []);
+        return response()->json(['success' => 'ok']);
     }
 
     protected function importLinksMerge($fluidbook_id)
@@ -142,26 +214,9 @@ trait EditOperation
         $merged_rulers = array_merge($merged_rulers, $rulers);
 
         FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, __("Ajouter les liens à partir du fichier :file", ['file' => $uploadedFile->getClientOriginalName()]) . ' ', $merged_links, $merged_rulers, [], []);
+        return response()->json(['success' => 'ok']);
     }
 
-//    protected function getThumb($doc_id, $doc_page)
-//    {
-//
-//        /** @var FluidbookDocument $doc */
-//        $doc = FluidbookDocument::find($doc_id);
-//        $path = $doc->getFile($doc_page, 'jpg', 'thumb', true, true, '');
-//        if (filesize($path) === 0) {
-//            for ($i = 1; $i <= 8; $i++) {
-//                clearstatcache();
-//                if (filesize($path) > 0) {
-//                    break;
-//                }
-//                sleep($i);
-//            }
-//        }
-//        return XSendFileController::sendfile($path);
-//    }
-
     protected function setupEditDefaults()
     {
         $this->crud->addButton('line', 'edit', 'view', 'crud::buttons.fluidbook_publication.edit', 'end');
index 9cba16bce234a7ace61c41ebd1abc0cd3fcc65ec..26f777d14514ba5157b388fc2b49eec2eab49603 100644 (file)
@@ -271,6 +271,11 @@ class FluidbookPublication extends ToolboxSettingsModel
 
     }
 
+    public function isOnePage()
+    {
+        return in_array($this->mobileNavigationType, ['mobilefirst', 'portrait']);
+    }
+
     /**
      * @return int
      */
index 862f239f709be1a7540b6508c3a7914882e1b961..aa7a81100c56462cfe1d390d54b8504a319d8bee 100644 (file)
@@ -276,6 +276,7 @@ LinkeditorLinks.prototype = {
             });
         });
         this.linkeditor.updateFBElements(false);
+        this.linkeditor.save.hasChanged();
     },
 
     updateLinkData: function (id, data) {
@@ -342,6 +343,7 @@ LinkeditorLinks.prototype = {
             });
         });
         this.linkeditor.updateFBElements(false);
+        this.linkeditor.save.hasChanged();
     },
 
     selectLink: function (l) {
index 4989fd017a92d58619b7d1fba893d9747aecec60..7de9c39ec090d16b3bd3b734f5dea4b1d6f42c60 100644 (file)
@@ -32,11 +32,8 @@ LinkeditorSave.prototype = {
 
     saveIfUnsavedChanges: function (message, notify, callback) {
         if (this.unsavedChanges) {
-            console.log('unsaved changes', this.unsavedChanges);
             this.save(message, false, function () {
-                console.log('saved');
                 setTimeout(function () {
-                    console.log('callback ok');
                     callback();
                 }, 1000);
             });
index 3c80f79c8c59efbc52b19adf7c8e115549c8152f..3a5ba9466ed37741ae96a05098fd3ccc3ca68ac8 100644 (file)
@@ -29,19 +29,14 @@ LinkeditorToolbar.prototype = {
             return false;
         });
 
+        $(document).on('submit', 'form.reloadAfterSuccess', function () {
+            $this.submitFormAndReload(this);
+            return false;
+        });
+
         $(document).on('change', '.importExcel input', function () {
-            var e = $(this);
-            var callback = function () {
-                var form = $(e).closest('form');
-                var f = $(form).ajaxSubmit({dataType: 'json'});
-                var xhr = f.data('jqxhr');
-                xhr.done(function (data) {
-                    setTimeout(function () {
-                        window.location.reload();
-                    }, 1000);
-                });
-            }
-            $this.linkeditor.save.saveIfUnsavedChanges(TRANSLATIONS.before_restore_message, false, callback);
+            $this.submitFormAndReload($(this).closest('form'));
+            return false;
         });
 
         $(document).on('click', '#linkeditor-export-latest', function () {
@@ -57,5 +52,26 @@ LinkeditorToolbar.prototype = {
 
         this.linkeditor.initTooltips();
     },
+
+    submitFormAndReload: function (form) {
+        var callback = function () {
+            $(form).ajaxSubmit(
+                {
+                    dataType: 'json',
+                    success: function (data) {
+                        setTimeout(function () {
+                            window.location.reload();
+                        }, 1000);
+                    }
+                }
+            );
+        }
+
+        if ($(form).is('[data-save-before-submit]')) {
+            this.linkeditor.save.saveIfUnsavedChanges($(form).attr('data-save-before-submit'), false, callback)
+        } else {
+            callback();
+        }
+    },
 };
 module.exports = LinkeditorToolbar;
index 8cf3d333468873519087b03dfdf7fe5b5321953f..b21013dfaad768f22c4c7f68eda8816e20cb0461 100644 (file)
@@ -25,6 +25,9 @@ textarea, input[type="text"], input[type="number"], input[type="email"], input[t
         border: 1px solid var(--field-border)
         box-shadow: 0 0 8px rgba(0, 0, 0, 0.3)
 
+input[type="checkbox"]
+    margin-right: 8px
+
 input[type=number]
     &, &:hover
         appearance: textfield
index bad22c460aea1348af179e29377e5c707a0230cb..118eeac49ccad74837908a0e63674bd1e4287669 100644 (file)
@@ -48,6 +48,7 @@
 
             p.button
                 text-align: right
+                margin: 20px 0 0 0
 
 
             @include dark-theme
index 4cbe7215c4af2d708e3bf15ce6aebf9f8ba6058a..f79a9c1c158f7cab7159ad4b6893d1e60768ae14 100644 (file)
@@ -12,7 +12,6 @@
         'manual_save_message'=>__('Sauvegarde manuelle'),
         'automatic_save_message'=>__('Sauvegarde automatique'),
         'warning_unsaved_changes'=>__('Des données n\'ont pas été sauvegardées'),
-        'before_import_save_message'=>__("Sauvegarde avant l'import d'un fichier excel"),
         'before_export_save_message'=>__("Sauvegarde avant export"),
         'before_restore_message'=>__("Sauvegarde avant la restauration des liens"),
         'restore_version_tooltip'=>__('Restaurer cette version'),
         <div class="popup" data-popup="moveLinks" style="max-width: 300px">
             <h2>{{__('Déplacer les liens')}}</h2>
             <a nohref="" class="close" data-icon="close"></a>
-            <form action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/move" method="post">
+            <form action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/move" data-save-before-submit="{{__("Sauvegarde avant le déplacement de liens")}}" class="reloadAfterSuccess" method="post">
+                @csrf
                 <p>{!! __('Déplacer les liens de :nb pages :br à partir de la page :page',
                     ['br'=>'</p><p>','nb'=>'<input type="number" name="number">','page'=>'<input type="text" name="start">'])!!}</p>
                 <p><label>
-                        <input type="checkbox"
-                               name="offset_internal_links"> {{__('Appliquer le décalage aux numéros de pages des liens internets')}}
+                        <input type="checkbox" checked
+                               name="offset_internal_links"
+                               value="1"> {{__('Appliquer le décalage aux numéros de pages des liens internes')}}
                     </label></p>
                 <p class="button">
                     <button type="submit">{{__('Déplacer les liens')}}</button>
                     <div class="separator"></div>
                     <div data-icon="import-links"
                          data-tooltip="{{__('Importer les liens (Remplacer)')}}">
-                        <form class="importExcel"
+                        <form class="importExcel" data-save-before-submit="{{__("Sauvegarde avant l'import d'un fichier excel")}}"
                               action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/import/replace" method="post"
                               enctype="multipart/form-data">
                             <input type="file"
                     </div>
                     <div data-icon="merge-links"
                          data-tooltip="{{__('Importer les liens (Ajouter)')}}">
-                        <form class="importExcel"
+                        <form class="importExcel" data-save-before-submit="{{__("Sauvegarde avant l'import d'un fichier excel")}}"
                               action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/import/merge" method="post"
                               enctype="multipart/form-data">
                             <input type="file"