]> _ Git - fluidbook-toolbox.git/commitdiff
wip #5634 @2
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 8 Dec 2022 17:11:50 +0000 (18:11 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 8 Dec 2022 17:11:50 +0000 (18:11 +0100)
app/Http/Controllers/Admin/Operations/FluidbookPublication/EditOperation.php
app/Util/FluidbookLinks.php
resources/linkeditor/js/linkeditor.save.js
resources/linkeditor/js/linkeditor.toolbar.js
resources/linkeditor/js/linkeditor.versions.js
resources/linkeditor/style/inc/_toolbar.sass
resources/views/fluidbook_publication/link_editor.blade.php

index 609de163447db2e996c64da8346d66088d84d032..a03aa2508184ba460d43728ca9098f4409d6cd24 100644 (file)
@@ -18,6 +18,8 @@ trait EditOperation
         Route::match(['get'], $segment . '/{id}/edit/links', $controller . '@links');
         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');
+        Route::match(['post'], $segment . '/{id}/edit/links/import/replace', $controller . '@importLinks');
         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')
@@ -100,6 +102,42 @@ trait EditOperation
         FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, $comments, $links, $rulers, [], []);
     }
 
+
+    protected function importLinks($fluidbook_id)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+        FluidbookLinks::getLinksAndRulersFromExcelFile(request()->file('file')->getPathname(), $links, $rulers);
+        FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, 'Replace links from excel', $links, $rulers, [], []);
+    }
+
+    protected function importLinksMerge($fluidbook_id)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+
+        FluidbookLinks::getLinksAndRulers($fluidbook_id, $merged_links, $merged_rulers);
+        FluidbookLinks::getLinksAndRulersFromExcelFile(request()->file('file')->getPathname(), $links, $rulers);
+        $existing_uids = [];
+        foreach ($merged_links as $merged_link) {
+            $existing_uids[$merged_link['uid']] = true;
+        }
+
+        foreach ($links as $link) {
+            if (isset($existing_uids[$link['uid']])) {
+                $link['uid'] = FluidbookLinks::generateUID();
+                $existing_uids[$link['uid']] = true;
+            }
+            $merged_links[] = $link;
+        }
+
+        $merged_rulers = array_merge($merged_rulers, $rulers);
+
+        FluidbookLinks::saveLinksInFile($fluidbook_id, backpack_user()->id, 'Merge existing links with excel', $merged_links, $merged_rulers, [], []);
+    }
+
 //    protected function getThumb($doc_id, $doc_page)
 //    {
 //
index 01ad6a19afed40212ed5ce214e56d7e7e6f3c1c0..430f992233d55fb15b9e8f54b124f90cad1a6afe 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace App\Util;
 
+use App\Models\FluidbookPublication;
 use App\Models\User;
 use Cubist\Util\ArrayUtil;
 use Cubist\Util\Crypt;
@@ -536,4 +537,21 @@ class FluidbookLinks
 
         self::saveLinksInFile($book_id, $core->user->utilisateur_id, 'Links imported from PDF', $links, []);
     }
+
+    public static function getLinksAndRulersFromExcelFile($path, &$links, &$rulers)
+    {
+        $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
+        $xls = $reader->load($path);
+        FluidbookLinks::getLinksFromExcel($xls, $links, $rulers);
+    }
+
+    public static function generateUID()
+    {
+        $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
+        $randstring = '';
+        for ($i = 0; $i < 12; $i++) {
+            $randstring = $characters[rand(0, 35)];
+        }
+        return $randstring;
+    }
 }
index 0f0353b99d12d3359a21babe597462f8edc3e6ba..07e7d3b8e0048320ede1534d5c5d4c66711aed3b 100644 (file)
@@ -30,6 +30,18 @@ LinkeditorSave.prototype = {
         }
     },
 
+    saveIfUnsavedChanges: function (message, notify, callback) {
+        if (this.unsavedChanges) {
+            this.save(message, false, function () {
+                setTimeout(function () {
+                    callback();
+                }, 1000);
+            });
+        } else {
+            callback();
+        }
+    },
+
     save: function (message, notify, callback) {
         if (notify === undefined) {
             notify = true;
index b85291a51c12c1201f68c54023400f4084bc8006..38deaf1972dfc4a5f4d109f52634bb9000216f96 100644 (file)
@@ -29,6 +29,22 @@ LinkeditorToolbar.prototype = {
             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 () {
+                        console.log('reload');
+                        window.location.reload();
+                    }, 1000);
+                });
+            }
+            $this.linkeditor.save.saveIfUnsavedChanges('Sauvegarde before excel import', false, callback);
+        });
+
         this.linkeditor.initTooltips();
     },
 };
index 9804e060da1898a4940cf806753a9ea46d74a7d0..1050ddc23dcfc995479ab822860e2a2e60e6c3cd 100644 (file)
@@ -52,16 +52,7 @@ LinkeditorVersions.prototype = {
         }
 
         //Restore links from 2022-12-07 13:37:15
-        if (this.linkeditor.save.unsavedChanges) {
-            console.log('save save save');
-            this.linkeditor.save.save('Save before restoring links', false, function () {
-                setTimeout(function () {
-                    callback();
-                }, 1000);
-            });
-        } else {
-            callback();
-        }
+        this.linkeditor.save.saveIfUnsavedChanges('Save before restoring links',false,callback);
     },
 
     _restoreVersion(timestamp) {
index c0a389937bc1ef797e1af6dcfe657d7bc9a2671f..e99453e9e13d621048eb29222eb49eb6218f295c 100644 (file)
         margin: 0 2px
         border-left: 1px solid $toolbar-color
 
+    div[data-icon]
+        position: relative
+        cursor: pointer
+
+        form.importExcel
+            input
+                position: absolute
+                opacity: 0
+                width: 100%
+                height: 100%
+                z-index: 1
+                cursor: pointer
+                top: 0
+                left: 0
+
     #linkeditor-page-field
         padding: 2px 10px
         background-color: #fff
index 7fc382f3345e6e8df2dc9b0f0f36ff6cfc6c0b47..0e62a435e41e15321390dfef12306b029d28ed97 100644 (file)
                     <a href="#" data-action="zoom.reset" data-icon="zoom-reset"
                        data-tooltip="{{__('RĂ©initialiser le zoom')}} (Esc)" data-key="esc, ctrl+0, ctrl+numpad0"></a>
                     <div class="separator"></div>
-                    <a href="#" data-action="importExcel" data-icon="import-links"
-                       data-tooltip="{{__('Importer les liens (Remplacer)')}}"></a>
-                    <a href="#" data-action="mergeExcel" data-icon="merge-links"
-                       data-tooltip="{{__('Importer les liens (Ajouter)')}}"></a>
+                    <div data-icon="import-links"
+                       data-tooltip="{{__('Importer les liens (Remplacer)')}}">
+                        <form class="importExcel"
+                              action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/import/replace" method="post"
+                              enctype="multipart/form-data">
+                            <input type="file"
+                                   accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+                                   name="file"/>
+                        </form>
+                    </div>
+                    <div data-icon="merge-links"
+                       data-tooltip="{{__('Importer les liens (Ajouter)')}}">
+                        <form class="importExcel"
+                              action="/fluidbook-publication/{{$fbdata['id']}}/edit/links/import/merge" method="post"
+                              enctype="multipart/form-data">
+                            <input type="file"
+                                   accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+                                   name="file"/>
+                        </form>
+                    </div>
                     <a download="links_{{$fbdata['id']}}.xlsx"
                        href="/fluidbook-publication/{{$fbdata['id']}}/edit/links/versions/export/latest"
                        data-icon="export-links" data-tooltip="Exporter les liens"></a>