]> _ Git - fluidbook-toolbox.git/commitdiff
wip #5802 @5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 13 Mar 2023 15:23:54 +0000 (16:23 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 13 Mar 2023 15:23:54 +0000 (16:23 +0100)
app/Console/Commands/WorkshopMigration.php
app/Fields/FluidbookStatus.php [new file with mode: 0644]
app/Http/Controllers/Admin/FileCrudController.php
app/Http/Controllers/Admin/FluidbookPublicationCrudController.php
app/Http/Controllers/Admin/Operations/FluidbookPublication/EditOperation.php
app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php [new file with mode: 0644]
app/Http/Controllers/Admin/UsersCrudController.php
app/Models/FluidbookPublication.php
public/packages/fluidbook/toolbox/js/contextdownload.js
resources/views/columns/fluidbook_status.blade.php [new file with mode: 0644]
resources/views/vendor/backpack/crud/buttons/fluidbook_quote/assign.blade.php

index 13d16d345f6f277060cdb4ea2fd167a9f76d9aa4..6ace5fa13ca26da1d033df264917c6317d580dce 100644 (file)
@@ -229,6 +229,9 @@ class WorkshopMigration extends CubistCommand
                 if ($new == 'visits_counter' && $v == 20) {
                     $v = 0;
                 }
+                if ($new == 'status') {
+                    $v++;
+                }
                 if ($c->getField($new) instanceof Datetime) {
                     $date = new \DateTime();
                     $date->setTimestamp($v);
diff --git a/app/Fields/FluidbookStatus.php b/app/Fields/FluidbookStatus.php
new file mode 100644 (file)
index 0000000..f2398f0
--- /dev/null
@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Fields;
+
+use Cubist\Backpack\CubistBackpackServiceProvider;
+use Cubist\Backpack\Magic\Fields\SelectFromArray;
+
+class FluidbookStatus extends SelectFromArray
+{
+
+    protected $_columnType = 'fluidbook_status';
+    protected $_columnViewNamespace = 'columns';
+
+
+    public function getOptions()
+    {
+        return [0 => __('Brouillon'), 1 => __('Prêt'), 2 => __('Téléchargé'), 3 => __('Facturé')];
+    }
+}
index e7f5e9cf7704ef7c4e1515e839f0a4dffdb10e05..480ee12d2576f661640523b6feba73d579ed46bb 100644 (file)
@@ -4,26 +4,23 @@ namespace App\Http\Controllers\Admin;
 
 class FileCrudController extends \Cubist\Backpack\Magic\Controllers\CubistMagicController
 {
-    use \Cubist\Backpack\Magic\Operations\CreateOperation;
-       use \Cubist\Backpack\Http\Controllers\Operations\CloneEditOperation;
-       use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
-       use \Cubist\Backpack\Http\Controllers\Operations\BulkPublishOperation;
-       use \Backpack\CRUD\app\Http\Controllers\Operations\CloneOperation;
-       use \Backpack\CRUD\app\Http\Controllers\Operations\BulkCloneOperation;
-       use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
+    use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
        use \Backpack\CRUD\app\Http\Controllers\Operations\BulkDeleteOperation;
        use \Cubist\Backpack\Http\Controllers\Operations\ReviseOperation;
+       use \App\Http\Controllers\Admin\Operations\Files\DownloadOperation;
+       use \App\Http\Controllers\Admin\Operations\Files\UploadOperation;
+       use \App\Http\Controllers\Admin\Operations\Files\UserListOperation;
        
 
 
     /*
-       __('file')
-       __('files')
+       __('fichier')
+       __('fichiers')
        */
 
     protected $_modelNamespace = 'App\Models\File';
     protected $_routeURL = 'file';
-    protected $_singular = 'file';
-    protected $_plural = 'files';
+    protected $_singular = 'fichier';
+    protected $_plural = 'fichiers';
     protected $_oneInstance= false;
 }
index 0520381fb05c9739043e830f000e76aeb302c544..d43b9e5b42f8c236365e45e6353193e9ee6252c3 100644 (file)
@@ -8,12 +8,13 @@ class FluidbookPublicationCrudController extends \Cubist\Backpack\Magic\Controll
        use \Cubist\Backpack\Http\Controllers\Operations\ReviseOperation;
        use \Cubist\Backpack\Magic\Operations\CreateOperation;
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\PreviewOperation;
-       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation;
+       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\LinksOperation;
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\CompositionOperation;
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\StatsOperation;
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\DownloadOperation;
-       use \Backpack\CRUD\app\Http\Controllers\Operations\CloneOperation;
+       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\CloneOperation;
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\DeletefbOperation;
+       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation;
        
 
 
index 14fb685168b8f8e0b36b1a7fc707d0e17b08b281..b54acc20ff4a669377b2765928ff53fb542b75af 100644 (file)
 
 namespace App\Http\Controllers\Admin\Operations\FluidbookPublication;
 
-// __('!!Paramètres des fluidbooks')
-
-use App\Fluidbook\Farm;
-use App\Fluidbook\Links;
 use App\Models\FluidbookPublication;
-use Cubist\Backpack\Http\Controllers\Base\XSendFileController;
-use Cubist\Util\Files\Files;
-use Illuminate\Http\UploadedFile;
 use Illuminate\Support\Facades\Route;
-use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+use Prologue\Alerts\Facades\Alert;
 
 trait EditOperation
 {
-
     protected function setupEditRoutes($segment, $routeName, $controller)
     {
-        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(['post'], $segment . '/{id}/edit/links/move', $controller . '@moveLinks');
-        Route::match(['get'], $segment . '/{id}/edit/links/versions/restore/{version}', $controller . '@restoreLinks');
-        Route::match(['get'], $segment . '/{id}/edit/links/fixdriftedlinks', $controller . '@fixDriftedLinks');
-        Route::match(['get'], $segment . '/{id}/edit/links/assets/{file}', $controller . '@getLinkAsset');
-
-        Route::put($segment . '/{id}/save/links', $controller . '@saveLinks');
-        Route::get($segment . '/{id}/edit/{type}_{page}.{format}', $controller . '@getLinkPage')
-            // ->whereIn('type', ['raster', 'images', 'texts', 'vector'])
-            ->whereNumber('page');
-        //->whereIn('format', ['jpg', 'png', 'avif', 'webp', 'svg']);
-    }
-
-    protected function getLinkAsset($fluidbook_id, $file)
-    {
-        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
-            abort(401);
-        }
-        /** @var FluidbookPublication $fb */
-        $fb = FluidbookPublication::find($fluidbook_id);
-        return XSendFileController::sendfileNoCache($fb->asset_path($file));
-    }
-
-    protected function saveLinks($fluidbook_id)
-    {
-        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
-            abort(401);
-        }
-
-        Links::saveLinksInFile($fluidbook_id,
-            backpack_user()->id,
-            request('message'),
-            json_decode(request('links', '[]'), true),
-            json_decode(request('rulers', '[]'), true),
-        );
-        $fb = FluidbookPublication::find($fluidbook_id);
-
-        return response()->json(['assets' => $fb->getLinksAssetsDimensions(), 'versions' => Links::getLinksVersions($fluidbook_id)]);
-    }
-
-    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();
-
-        Links::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;
-        }
-
-        Links::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)) {
-            abort(401);
-        }
-        /** @var FluidbookPublication $fluibdook */
-        $fluibdook = FluidbookPublication::find($fluidbook_id);
-        $f = 'getFile';
-        switch ($type) {
-            case 'thumbspdf':
-                $withGraphics = $withText = true;
-                $f = 'getThumbFile';
-                break;
-            case 'raster':
-            case 'vector':
-                $withText = $withGraphics = true;
-                break;
-            case 'images':
-                $withText = false;
-                $withGraphics = true;
-                break;
-            case 'texts':
-            default:
-                $withText = true;
-                $withGraphics = false;
-                break;
-        }
-        $path = $fluibdook->$f($page, $format, 150, $withText, $withGraphics, 'html');
-        return XSendFileController::sendfile($path);
-    }
-
-    protected function getLinkVersions($fluidbook_id)
-    {
-        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
-            abort(401);
-        }
-        $links = Links::getLinksVersions($fluidbook_id);
-        return response()->json($links);
-    }
-
-    protected function exportLinks($fluidbook_id, $version)
-    {
-        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
-            abort(401);
-        }
-        Links::getLinksAndRulers($fluidbook_id, $links, $rulers, $version);
-        $xlsx = Links::linksToExcel($links, $rulers);
-        $tmpfile = Files::tempnam() . '.xlsx';
-        $writer = new Xlsx($xlsx);
-        $writer->save($tmpfile);
-        return response()->file($tmpfile)->deleteFileAfterSend();
-    }
-
-    protected function restoreLinks($fluidbook_id, $version)
-    {
-        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
-            abort(401);
-        }
-
-        Links::getLinksAndRulers($fluidbook_id, $links, $rulers, $version);
-        Links::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']);
+        Route::match(['get'], $segment . '/{id}/changestatus/{status}', $controller . '@changeStatus');
     }
 
-    protected function importLinks($fluidbook_id)
+    protected function changeStatus($fluidbook_id, $newStatus)
     {
-        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+        if (!can('fluidbook-publication:admin')) {
             abort(401);
         }
-        /** @var UploadedFile $uploadedFile */
-        $uploadedFile = request()->file('file');
-
-        Links::getLinksAndRulersFromExcelFile($uploadedFile->getPathname(), $links, $rulers);
-        Links::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)
-    {
         if (!FluidbookPublication::hasPermission($fluidbook_id)) {
             abort(401);
         }
-
-        /** @var UploadedFile $uploadedFile */
-        $uploadedFile = request()->file('file');
-
-        Links::getLinksAndRulers($fluidbook_id, $merged_links, $merged_rulers);
-        Links::getLinksAndRulersFromExcelFile($uploadedFile->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'] = Links::generateUID();
-                $existing_uids[$link['uid']] = true;
-            }
-            $merged_links[] = $link;
-        }
-
-        $merged_rulers = array_merge($merged_rulers, $rulers);
-
-        Links::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 setupEditDefaults()
-    {
-        $this->crud->addButton('line', 'edit', 'view', 'crud::buttons.fluidbook_publication.edit', 'end');
-        $this->crud->operation(['list', 'show'], function () {
-            $this->crud->removeButton('update');
-        });
-    }
-
-    public function links($id)
-    {
-        if (!FluidbookPublication::hasPermission($id)) {
-            abort(401);
-        }
-        return view('fluidbook_publication.link_editor', ['id' => $id, 'fluidbook' => FluidbookPublication::find($id)]);
-    }
-
-
-    protected function fixDriftedLinks($fluidbook_id)
-    {
-        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
-            abort(401);
+        $fluidbook = FluidbookPublication::find($fluidbook_id);
+        if (!$fluidbook) {
+            abort(404);
         }
-        /** @var FluidbookPublication $book */
-        $book = FluidbookPublication::find($fluidbook_id);
-        $w = $book->getPageWidth();
-        $w2 = $w * 2;
-        Links::getLinksAndRulers($fluidbook_id, $links, $rulers);
-        foreach ($links as $i => $link) {
-            $change = false;
-            while (true) {
-                if ($link['page'] % 2 === 0) {
-                    $diff = $link['left'] - $w2;
-                } else {
-                    $diff = $link['left'] - $w;
-                }
-                if ($diff < 0) {
-                    break;
-                }
-                $change = true;
-                $link['left'] -= $w;
-            }
-            if ($change) {
-                $links[$i] = $link;
-            }
+        if ($fluidbook->status != $newStatus) {
+            $fluidbook->status = $newStatus;
+            $fluidbook->save();
         }
-        Links::saveLinksInFile($fluidbook_id, backpack_user()->id, __("Corriger la dérive des liens"), $links, $rulers, [], []);
+        Alert::add('success', __('Status de la publication modifié'))->flash();
+        return redirect(backpack_url('fluidbook-publication'));
     }
 }
diff --git a/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookPublication/LinksOperation.php
new file mode 100644 (file)
index 0000000..fb44df5
--- /dev/null
@@ -0,0 +1,289 @@
+<?php
+
+namespace App\Http\Controllers\Admin\Operations\FluidbookPublication;
+
+// __('!!Paramètres des fluidbooks')
+
+use App\Fluidbook\Farm;
+use App\Fluidbook\Links;
+use App\Models\FluidbookPublication;
+use Cubist\Backpack\Http\Controllers\Base\XSendFileController;
+use Cubist\Util\Files\Files;
+use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Facades\Route;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+
+trait LinksOperation
+{
+
+    protected function setupLinksRoutes($segment, $routeName, $controller)
+    {
+        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(['post'], $segment . '/{id}/edit/links/move', $controller . '@moveLinks');
+        Route::match(['get'], $segment . '/{id}/edit/links/versions/restore/{version}', $controller . '@restoreLinks');
+        Route::match(['get'], $segment . '/{id}/edit/links/fixdriftedlinks', $controller . '@fixDriftedLinks');
+        Route::match(['get'], $segment . '/{id}/edit/links/assets/{file}', $controller . '@getLinkAsset');
+
+        Route::put($segment . '/{id}/save/links', $controller . '@saveLinks');
+        Route::get($segment . '/{id}/edit/{type}_{page}.{format}', $controller . '@getLinkPage')
+            // ->whereIn('type', ['raster', 'images', 'texts', 'vector'])
+            ->whereNumber('page');
+        //->whereIn('format', ['jpg', 'png', 'avif', 'webp', 'svg']);
+    }
+
+    protected function getLinkAsset($fluidbook_id, $file)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+        /** @var FluidbookPublication $fb */
+        $fb = FluidbookPublication::find($fluidbook_id);
+        return XSendFileController::sendfileNoCache($fb->asset_path($file));
+    }
+
+    protected function saveLinks($fluidbook_id)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+
+        Links::saveLinksInFile($fluidbook_id,
+            backpack_user()->id,
+            request('message'),
+            json_decode(request('links', '[]'), true),
+            json_decode(request('rulers', '[]'), true),
+        );
+        $fb = FluidbookPublication::find($fluidbook_id);
+
+        return response()->json(['assets' => $fb->getLinksAssetsDimensions(), 'versions' => Links::getLinksVersions($fluidbook_id)]);
+    }
+
+    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();
+
+        Links::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;
+        }
+
+        Links::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)) {
+            abort(401);
+        }
+        /** @var FluidbookPublication $fluibdook */
+        $fluibdook = FluidbookPublication::find($fluidbook_id);
+        $f = 'getFile';
+        switch ($type) {
+            case 'thumbspdf':
+                $withGraphics = $withText = true;
+                $f = 'getThumbFile';
+                break;
+            case 'raster':
+            case 'vector':
+                $withText = $withGraphics = true;
+                break;
+            case 'images':
+                $withText = false;
+                $withGraphics = true;
+                break;
+            case 'texts':
+            default:
+                $withText = true;
+                $withGraphics = false;
+                break;
+        }
+        $path = $fluibdook->$f($page, $format, 150, $withText, $withGraphics, 'html');
+        return XSendFileController::sendfile($path);
+    }
+
+    protected function getLinkVersions($fluidbook_id)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+        $links = Links::getLinksVersions($fluidbook_id);
+        return response()->json($links);
+    }
+
+    protected function exportLinks($fluidbook_id, $version)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+        Links::getLinksAndRulers($fluidbook_id, $links, $rulers, $version);
+        $xlsx = Links::linksToExcel($links, $rulers);
+        $tmpfile = Files::tempnam() . '.xlsx';
+        $writer = new Xlsx($xlsx);
+        $writer->save($tmpfile);
+        return response()->file($tmpfile)->deleteFileAfterSend();
+    }
+
+    protected function restoreLinks($fluidbook_id, $version)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+
+        Links::getLinksAndRulers($fluidbook_id, $links, $rulers, $version);
+        Links::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)) {
+            abort(401);
+        }
+        /** @var UploadedFile $uploadedFile */
+        $uploadedFile = request()->file('file');
+
+        Links::getLinksAndRulersFromExcelFile($uploadedFile->getPathname(), $links, $rulers);
+        Links::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)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+
+        /** @var UploadedFile $uploadedFile */
+        $uploadedFile = request()->file('file');
+
+        Links::getLinksAndRulers($fluidbook_id, $merged_links, $merged_rulers);
+        Links::getLinksAndRulersFromExcelFile($uploadedFile->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'] = Links::generateUID();
+                $existing_uids[$link['uid']] = true;
+            }
+            $merged_links[] = $link;
+        }
+
+        $merged_rulers = array_merge($merged_rulers, $rulers);
+
+        Links::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 setupLinksDefaults()
+    {
+        $this->crud->addButton('line', 'edit', 'view', 'crud::buttons.fluidbook_publication.edit', 'end');
+        $this->crud->operation(['list', 'show'], function () {
+            $this->crud->removeButton('update');
+        });
+    }
+
+    public function links($id)
+    {
+        if (!FluidbookPublication::hasPermission($id)) {
+            abort(401);
+        }
+        return view('fluidbook_publication.link_editor', ['id' => $id, 'fluidbook' => FluidbookPublication::find($id)]);
+    }
+
+
+    protected function fixDriftedLinks($fluidbook_id)
+    {
+        if (!FluidbookPublication::hasPermission($fluidbook_id)) {
+            abort(401);
+        }
+        /** @var FluidbookPublication $book */
+        $book = FluidbookPublication::find($fluidbook_id);
+        $w = $book->getPageWidth();
+        $w2 = $w * 2;
+        Links::getLinksAndRulers($fluidbook_id, $links, $rulers);
+        foreach ($links as $i => $link) {
+            $change = false;
+            while (true) {
+                if ($link['page'] % 2 === 0) {
+                    $diff = $link['left'] - $w2;
+                } else {
+                    $diff = $link['left'] - $w;
+                }
+                if ($diff < 0) {
+                    break;
+                }
+                $change = true;
+                $link['left'] -= $w;
+            }
+            if ($change) {
+                $links[$i] = $link;
+            }
+        }
+        Links::saveLinksInFile($fluidbook_id, backpack_user()->id, __("Corriger la dérive des liens"), $links, $rulers, [], []);
+    }
+}
index c32f5f1a10aea0f089ded802399fa1c1b324c58d..49a9adb3c60d2bbbbe81fe63f9d374e33fe57056 100644 (file)
@@ -10,6 +10,7 @@ class UsersCrudController extends \Cubist\Backpack\Magic\Controllers\CubistMagic
        use \Cubist\Backpack\Http\Controllers\Operations\ReviseOperation;
        use \Cubedesigners\UserDatabase\Operations\LoginasOperation;
        use \Cubedesigners\UserDatabase\Operations\CreateFromCompany;
+       use \Cubedesigners\UserDatabase\Operations\FilesOperation;
        
 
 
index a365cc94851808d930d9ffed3c93b87013719c58..7e235082b643a9c1ce915118da0420cae2bbe55c 100644 (file)
@@ -7,6 +7,7 @@ use App\Console\Commands\WorkshopMigration;
 use App\Fields\FluidbookChapters;
 use App\Fields\FluidbookComposition;
 use App\Fields\FluidbookLocale;
+use App\Fields\FluidbookStatus;
 use App\Fields\User;
 use App\Fluidbook\Farm;
 use App\Fluidbook\Links;
@@ -15,6 +16,7 @@ use App\Http\Controllers\Admin\Operations\FluidbookPublication\CompositionOperat
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\DeletefbOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\DownloadOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation;
+use App\Http\Controllers\Admin\Operations\FluidbookPublication\LinksOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\PreviewOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\StatsOperation;
 use App\Jobs\FluidbookImagesPreprocess;
@@ -53,7 +55,7 @@ class FluidbookPublication extends ToolboxSettingsModel
 
     protected static $_docs = [];
 
-    protected $_operations = [CreateOperation::class, PreviewOperation::class, EditOperation::class, CompositionOperation::class, StatsOperation::class, DownloadOperation::class, CloneOperation::class, DeletefbOperation::class];
+    protected $_operations = [CreateOperation::class, PreviewOperation::class, LinksOperation::class, CompositionOperation::class, StatsOperation::class, DownloadOperation::class, CloneOperation::class, DeletefbOperation::class, EditOperation::class];
 
     protected $casts = ['composition' => 'array'];
 
@@ -69,7 +71,6 @@ class FluidbookPublication extends ToolboxSettingsModel
     {
         parent::setFields();
 
-
         $this->addField('hash', Hidden::class);
         $this->addField('cid', Hidden::class);
 
@@ -123,15 +124,12 @@ class FluidbookPublication extends ToolboxSettingsModel
         $this->addOwnerField(['column_attribute' => 'allTreeInfos']);
 
         $this->addField('region', SelectFromArray::class, __('Région d\'hébergement des données'), ['options' => ['UE' => __('Union européenne'), 'US' => 'USA'], 'default' => 'UE', 'allows_null' => false, 'databaseDefault' => 'UE']);
-
-        $this->addField('status', SelectFromArray::class, 'Status', [
-                'options' =>
-                    [-1 => __('Brouillon'), 0 => __('Prêt'), 1 => __('Téléchargé'), 2 => __('Facturé')],
+        $this->addField('status', FluidbookStatus::class, __('Status'), [
                 'column' => true,
                 'filter' => true,
                 'non_default_tracking' => false,
                 'allows_null' => false,
-                'default' => -1,
+                'default' => 0,
                 'searchLogic' => false,
             ]
         );
@@ -156,8 +154,6 @@ class FluidbookPublication extends ToolboxSettingsModel
         $this->setSettingsFields();
 
         $this->addField('section_infos', FormBigSection::class, __('Administration'));
-
-
         $this->addField('visits_counter', Integer::class, 'Compteur de visites', ['read_only' => true, 'default' => 0, 'column' => true, 'column_label' => '<i class="las la-chart-area" title="' . __('Compteur de visites du lien de préview') . '"></i>', 'searchLogic' => false]);
 
         $this->addField(self::CREATED_AT, Datetime::class, __('Crée'), ['column' => true, 'column_type' => 'datetime', 'column_format' => 'YYYY-MM-DD', 'filter' => true, 'read_only' => true, 'searchLogic' => false]);
@@ -536,7 +532,7 @@ class FluidbookPublication extends ToolboxSettingsModel
         if ($this->id < WorkshopMigration::WS3_BOOK_ID) {
             return false;
         }
-        if ($this->status >= 0) {
+        if ($this->status >= 1) {
             return false;
         }
         return true;
@@ -552,7 +548,7 @@ class FluidbookPublication extends ToolboxSettingsModel
         if (backpack_user()) {
             $new->owner = backpack_user()->id;
         }
-        $new->status = -1;
+        $new->status = 0;
         $new->title = __('Copie de :title', ['title' => $new->title]);
         $new->visits_counter = 0;
         return $new;
index f4500d44206ca03546e3060b44132469da873676..e6f05e192b08363749b9a3ee0d4ad579becf2177 100644 (file)
@@ -1,4 +1,5 @@
 $(function () {
+    var sep = '---------';
     $.contextMenu({
         selector: '[data-context-actions]', trigger: 'left', build: function ($trigger, e) {
             var route = $($trigger).data('context-route');
@@ -6,10 +7,11 @@ $(function () {
             var rawActions = $($trigger).data('context-actions');
             var items = {};
             var confirm = $($trigger).data('context-confirm');
+            var disabledOption = $($trigger).data('context-disabled-action');
 
             var actions = {};
             $.each(rawActions, function (key, action) {
-                if (action != '---------') {
+                if (action != sep) {
                     if (typeof action === 'string') {
                         action = {'label': action};
                     }
@@ -20,14 +22,15 @@ $(function () {
                     if (action.target === undefined) {
                         action.target = '_self';
                     }
+                    action.disabled =(key == disabledOption);
                     action.isHtmlName = true;
                 }
                 actions[key] = action;
             });
 
             $.each(actions, function (key, action) {
-                if (action !== '---------') {
-                    items[key] = {name: action.label, isHtmlName: true};
+                if (action !== sep) {
+                    items[key] = {name: action.label, isHtmlName: action.isHtmlName, disabled: action.disabled,};
                 } else {
                     items[key] = action;
                 }
@@ -39,7 +42,6 @@ $(function () {
 
             return {
                 callback: function (key, options) {
-
                     var ok = function () {
                         var target = actions[key].target;
                         var url = actions[key].url;
diff --git a/resources/views/columns/fluidbook_status.blade.php b/resources/views/columns/fluidbook_status.blade.php
new file mode 100644 (file)
index 0000000..c8fb53f
--- /dev/null
@@ -0,0 +1,21 @@
+{{-- select_from_array column --}}
+@php
+    $values = data_get($entry, $column['name']);
+    $v=$column['options'][$values];
+@endphp
+
+@can('fluidbook-publication:admin')
+    <span data-{{$entry->getOption('name')}}-{{$column['name']}}="{{$values}}">
+    <a href="#"
+       data-toggle="tooltip"
+       data-context-disabled-action="{{$values}}"
+       data-context-actions="{{json_encode($column['options'])}}"
+       data-context-route="{{$crud->route}}/$id/changestatus/$action"
+       data-context-id="{{$entry->getKey()}}"
+       title="{{__('Changer le status')}}"
+    >{{$v}}</a>
+</span>
+@endcan
+@cannot('fluidbook-publication:admin')
+    {{$v}}
+@endcannot
index 4322fa23605e575d493040a657868616cfd25767..8d76d7fd475d84d7a760888844ca12346a9def1a 100644 (file)
@@ -1,7 +1,8 @@
 {{-- __('!! Demandes de devis fluidbook') --}}
 @if($entry->status==0)
-    <a class="btn btn-sm btn-link assignto" href="#" data-toggle="tooltip"
-       data-context-actions="{{json_encode(['me'=>__('Je vais traiter la demander'),'94'=>__('Confier à :reseller',['reseller'=>'Kadreo'])])}}"
+    <a class="btn btn-sm btn-link assignto" href="#"
+       data-toggle="tooltip"
+       data-context-actions="{{json_encode(['me'=>__('Je vais traiter la demander')/*,'94'=>__('Confier à :reseller',['reseller'=>'Kadreo'])*/])}}"
        data-context-route="{{$crud->route}}/$id/assign/$action"
        data-context-id="{{$entry->getKey()}}"
        data-context-confirm="{{json_encode(