]> _ Git - fluidbook-toolbox.git/commitdiff
wip #7063 @3
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 4 Sep 2024 17:02:44 +0000 (19:02 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 4 Sep 2024 17:02:44 +0000 (19:02 +0200)
16 files changed:
app/Fluidbook/Packager/Download.php
app/Http/Controllers/Admin/Operations/FluidbookPublication/CompositionOperation.php
app/Http/Controllers/Admin/Operations/Tools/FluidbookEasyCreation.php [new file with mode: 0644]
app/Http/Controllers/Admin/ToolsController.php
app/Jobs/FluidbookEasyCreation.php [new file with mode: 0644]
app/Jobs/Tools/Base.php
app/Jobs/Tools/FluidbookAssetsDownloader.php
app/Models/Base/ToolboxModel.php
app/Models/FluidbookDocument.php
app/Models/FluidbookExternalInstallServer.php
app/Models/FluidbookPublication.php
app/Models/Traits/Owner.php [new file with mode: 0644]
app/Models/Traits/Permissions.php [new file with mode: 0644]
composer.json
composer.lock
resources/views/tools/sidebar.blade.php

index 53fca26a0b396abb15add9b582b09abadc4dc86d..914ea654986c34d357458da632c6e484fb5608a1 100644 (file)
@@ -91,7 +91,7 @@ class Download extends DownloadBase
     {
         App::setLocale($this->user->preferredLocale());
         $res = [];
-        try {
+  //      try {
             $url = $this->_compileandpackage();
             $translateVariables = ['title' => $this->_title(), 'nb' => $this->_id()];
 
@@ -151,13 +151,13 @@ class Download extends DownloadBase
                 $subject = __($this->_loadbalancerSubject, $translateVariables);
                 $text = __($this->_loadbalancerText, $translateVariables);
             }
-        } catch (\Exception $e) {
-            $subject = __('Erreur lors de la compilation du :type :nb', ['nb' => $this->_id(), 'type' => $this->type]);
-            $text = __('Détails de l\'erreur :message', ['message' => $e->getMessage() . ' at line ' . $e->getLine() . ' of ' . $e->getFile()]);
-            $actions = [];
-            $showTextIfNotEmail = true;
-            Log::error($e);
-        }
+//        } catch (\Exception $e) {
+//            $subject = __('Erreur lors de la compilation du :type :nb', ['nb' => $this->_id(), 'type' => $this->type]);
+//            $text = __('Détails de l\'erreur :message', ['message' => $e->getMessage() . ' at line ' . $e->getLine() . ' of ' . $e->getFile()]);
+//            $actions = [];
+//            $showTextIfNotEmail = true;
+//            Log::error($e);
+//        }
 
         if ($notify) {
             $this->sendNotification($subject, $text, $actions, $showTextIfNotEmail);
index 6f3de05e29433ce5e1765a810e9455b169d8c9b2..a47bcb52bfaf58f4c3609a787bf846e90eabcc67 100644 (file)
@@ -97,26 +97,13 @@ trait CompositionOperation
 
     protected function upload()
     {
-        $uploadID = Str::random();
-
         $file = request()->file('file');
         if (null === $file) {
             abort(500);
         }
 
-        $fluidbook_id = request('fluidbook_id');
-        $fluidbook = FluidbookPublication::withoutGlobalScopes()->find($fluidbook_id);
-
-        $document = new FluidbookDocument();
-        $document->region = $fluidbook->region;
-        $document->file = $file->getClientOriginalName();
-        $document->file_data = ["fileName" => $file->getClientOriginalName(), "fileSize" => $file->getSize(), "modificationDate" => $file->getMTime(), "creationDate" => $file->getCTime()];
-        $document->owner = backpack_user()->id;
-        $document->save();
-        move_uploaded_file($file->getPathname(), Files::mkdir($document->path()) . 'original.pdf');
-        FluidbookDocumentUpload::updateProgression($uploadID, $document->id, __('Mise en file d\'attente du traitement du document'), 1.2);
-        FluidbookDocumentUpload::dispatch($uploadID, $document, backpack_user(), $fluidbook->id);
-        return response()->json(['uploadID' => $uploadID, 'document' => $document->id]);
+        $res = FluidbookDocument::uploadToFluidbook($file, request('fluidbook_id'), backpack_user());
+        return response()->json($res);
     }
 
     protected function docInfos($doc_id)
diff --git a/app/Http/Controllers/Admin/Operations/Tools/FluidbookEasyCreation.php b/app/Http/Controllers/Admin/Operations/Tools/FluidbookEasyCreation.php
new file mode 100644 (file)
index 0000000..a725cc8
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+
+namespace App\Http\Controllers\Admin\Operations\Tools;
+
+// __('!! Outils')
+use App\Fields\FluidbookID;
+use App\Models\FluidbookExternalInstallServer;
+use Cubist\Backpack\Magic\Fields\ExternalPath;
+use Cubist\Backpack\Magic\Fields\StandardFile;
+use Cubist\Backpack\Magic\Fields\Text;
+use Cubist\Backpack\Magic\Form;
+use Cubist\Util\Files\Files;
+use Prologue\Alerts\Facades\Alert;
+
+trait FluidbookEasyCreation
+{
+    public function fluidbookeasycreation()
+    {
+        $form = new Form(backpack_url('tools/dofluidbookeasycreation'));
+        $form->setEnctype('multipart/form-data');
+        $form->setTitle(__('Créer une publication'));
+        $form->setSubmitLabel(__('Créer la publication'));
+        $form->setSubmitIcon('las la-magic');
+        $form->addField('file', StandardFile::class, __('Charger le fichier PDF'), ['accept' => '.pdf']);
+        $form->addField('base', FluidbookID::class, __('Configuration basée sur le fluidbook'));
+        $form->addField('title', Text::class, __('Titre'));
+        $form->addField('export', ExternalPath::class, __('Installation'), ['default' => '__FIRST__', 'servers_model' => FluidbookExternalInstallServer::class]);
+
+        return view('tools.form', ['form' => $form]);
+    }
+
+    public function dofluidbookeasycreation()
+    {
+        \App\Jobs\FluidbookEasyCreation::dispatch(request('base'), Files::move_uploaded_file(request()->file('file')), request('title'), request('export'), backpack_user(), true);
+        Alert::add('success', __('La production du fluidbook a été placée en file d\'attente. Vous recevrez une notification lorsqu\'elle sera terminée.'))->flash();
+        return back();
+    }
+}
index 51909465b8bb537d649fae8f376818609b519900..c29646755c77dbc63cfe6e4193c970aec115c642 100644 (file)
@@ -11,6 +11,7 @@ use App\Http\Controllers\Admin\Operations\Tools\FluidbookAssetsDownloader;
 use App\Http\Controllers\Admin\Operations\Tools\FluidbookBranchCreate;
 use App\Http\Controllers\Admin\Operations\Tools\FluidbookBranchRemove;
 use App\Http\Controllers\Admin\Operations\Tools\FluidbookCopyLinks;
+use App\Http\Controllers\Admin\Operations\Tools\FluidbookEasyCreation;
 use App\Http\Controllers\Admin\Operations\Tools\FluidbookReferencesURL;
 use App\Http\Controllers\Admin\Operations\Tools\FluidbookReplicate;
 use App\Http\Controllers\Admin\Operations\Tools\GitReposCreate;
@@ -50,6 +51,7 @@ class ToolsController extends Controller
     use StaticSiteUploader;
     use PDFLayers;
     use Webfonts;
+    use FluidbookEasyCreation;
 
     protected function index($tool, $args = '')
     {
diff --git a/app/Jobs/FluidbookEasyCreation.php b/app/Jobs/FluidbookEasyCreation.php
new file mode 100644 (file)
index 0000000..a78cdcf
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Fluidbook\Packager\Download;
+use App\Models\FluidbookDocument;
+use App\Models\FluidbookPublication;
+
+class FluidbookEasyCreation extends \App\Jobs\Tools\Base
+{
+    /**
+     * @var string
+     */
+    protected $file;
+
+
+    /**
+     * @var int
+     */
+    protected $base;
+
+    /**
+     * @var string
+     */
+    protected $title;
+
+    /**
+     * @var array
+     */
+    protected $export;
+
+    /**
+     * @var bool
+     */
+    protected $notify = false;
+
+
+    public function __construct($base, $file, $title, $export, $user = null, $notify = false)
+    {
+
+        parent::__construct();
+        $this->file = $file;
+        $this->base = $base;
+        $this->title = $title;
+        $this->export = $export;
+        $this->user = $user ?? backpack_user();
+        $this->notify = $notify;
+    }
+
+    public function handle()
+    {
+        /** @var FluidbookPublication $base */
+        $base = FluidbookPublication::withoutGlobalScopes()->find($this->base);
+        $fluidbook = $base->replicateSettings();
+        $fluidbook->setOwner($base->owner);
+        $fluidbook->title = $this->title;
+        $install = false;
+        if ($this->export['server']) {
+            $install = true;
+            $fluidbook->install_online = $this->export;
+        }
+        $fluidbook->saveQuietly();
+        $res = FluidbookDocument::uploadToFluidbook(new \SplFileInfo($this->file), $fluidbook->id, $this->user, false);
+
+        /** @var FluidbookDocument $document */
+        $document = FluidbookDocument::withoutGlobalScopes()->find($res['document']);
+        $composition = [];
+        for ($i = 1; $i <= $document->pages; $i++) {
+            $composition[$i] = [$document->id, $i];
+        }
+
+        $fluidbook->setAttribute('composition', $composition);
+        $fluidbook->setStatus($install ? 2 : 1);
+        $fluidbook->save();
+
+        $download = new Download($fluidbook, 'online', $install ? 'install' : 'download', $this->user);
+        $download->package($this->notify);
+    }
+}
index b43e5f52132c9703734dd10fb4f6c866681af090..75e68787bc559d113583b15eb1f4f177c1b9d107 100644 (file)
@@ -103,7 +103,7 @@ class Base extends \App\Jobs\Base
     /**
      * @param User $user
      */
-    public function setUser(User $user): void
+    public function setUser(User|null $user): void
     {
         parent::setUser($user);
         $this->mail->setUser($user);
@@ -153,7 +153,7 @@ class Base extends \App\Jobs\Base
      * @param \Exception $exception
      * @return void
      */
-    public function failed(\Exception $exception)
+    public function failed(\Exception|\Throwable $exception)
     {
         $this->logger->critical($exception);
         $this->endJob();
index f6b47d97b99ddde78ef650a1287fae327ebe85c3..bd4e78dcc0b2859cf9174e39540a9fa3038b1aaa 100644 (file)
@@ -15,7 +15,7 @@ class FluidbookAssetsDownloader extends Base
     protected $type;
     protected $dest;
 
-    protected $timeout = 7200;
+    public $timeout = 7200;
 
     public function __construct($url, $type, $fluidbook, $folder, $user)
     {
index 819077ac090c289771b3f19d44487921547e9c0d..b93add7b96c09b050cb0a333fbfc9ab099f92845 100644 (file)
@@ -2,88 +2,18 @@
 
 namespace App\Models\Base;
 
-use App\Fields\Owner;
-use App\Models\FluidbookPublication;
+use App\Models\Traits\Owner;
+use App\Models\Traits\Permissions;
 use Cubist\Backpack\Magic\Fields\HiddenDatetime;
 use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
-use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Support\Facades\Auth;
 
 class ToolboxModel extends CubistMagicAbstractModel
 {
     use SoftDeletes;
-
-    protected static $_ownerAttribute = 'owner';
-
-    public static function addOwnerClause(Builder $builder)
-    {
-        if (null === backpack_user() || null === Auth::id()) {
-            return;
-        }
-        if (Auth::user()->hasPermissionTo(static::$_permissionBase . ':admin')) {
-            return;
-        }
-        if (null === static::$_ownerAttribute) {
-            return;
-        }
-        $builder->whereIn(static::$_ownerAttribute, backpack_user()->getManagedUsers());
-    }
-
-    /**
-     * @param $id
-     * @param $permission
-     * @param $user
-     * @return bool
-     */
-    public static function hasPermission($id, $permission = 'write', $user = null)
-    {
-        if (null === $user) {
-            $user = Auth::user();
-        }
-        if (null === $user) {
-            return false;
-        }
-
-        if ($user->hasPermissionTo(static::$_permissionBase . ':admin')) {
-            return true;
-        }
-        if (!$user->hasPermissionTo(static::$_permissionBase . ':' . $permission)) {
-            return false;
-        }
-        if ($id instanceof FluidbookPublication) {
-            return true;
-        }
-        $entry = static::find($id);
-        if (null === $entry) {
-            return false;
-        }
-        return true;
-    }
-
-    public function addOwnerField($options = [])
-    {
-        if (can(static::$_permissionBase . ':admin')) {
-            $columnAttribute = 'allTreeInfos';
-        } else {
-            $columnAttribute = 'basicTreeInfos';
-        }
-
-        $fieldSettings = [
-            'name' => static::$_ownerAttribute,
-            'label' => __('Propriétaire'),
-            'type' => Owner::class,
-            'column' => true,
-            'can' => static::$_permissionBase . ':set-owner',
-            'column_attribute' => $columnAttribute,
-            'column_escape' => false,
-            'attribute' => 'companyWithName',
-            'default' => Auth::id(),
-            'non_default_tracking' => true,
-        ];
-
-        $this->addField(array_merge($fieldSettings, $options));
-    }
+    protected static $_ownerAttribute='owner';
+    use Owner;
+    use Permissions;
 
     public function addColumnDateFields($tab = null, $type = HiddenDatetime::class)
     {
@@ -115,49 +45,6 @@ class ToolboxModel extends CubistMagicAbstractModel
         );
     }
 
-    public function allowsDelete()
-    {
-        if (!can('fluidbook-publication:admin')) {
-            return false;
-        }
-        return true;
-    }
-
-    public function allowsUpdate()
-    {
-        if (!can(static::$_permissionBase . ':write')) {
-            return false;
-        }
-        return true;
-    }
-
-    public function allowsEdit()
-    {
-        return $this->allowsUpdate();
-    }
-
-    public function allowsClone()
-    {
-        return $this->allowsCreate();
-    }
-
-    public function allowsPreview()
-    {
-        if (can(static::$_permissionBase . ':write')) {
-            return true;
-        }
-        if (!can(static::$_permissionBase . ':read')) {
-            return false;
-        }
-        return true;
-    }
-
-    public function setOwner($owner)
-    {
-        $this->{static::$_ownerAttribute} = $owner;
-    }
-
-
     public function getPreviewURL($attrs = [])
     {
         $routeName = $this->getOption('name') . '_preview';
index a45a6d66b2361c76e14ca8f344d84d8557836e6e..a5e1e795cb3d03047696a8a3ad0acdc56d51e7f3 100644 (file)
@@ -17,6 +17,8 @@ use Cubist\Util\CommandLine\Rsync;
 use Cubist\Util\Files\Files;
 use Cubist\Util\Gzip;
 use Cubist\Util\Math;
+use Cubist\Util\Str;
+use Illuminate\Http\UploadedFile;
 use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\Log;
 
@@ -607,4 +609,24 @@ class FluidbookDocument extends ToolboxModel
         $this->echoStatus($uploadID);
     }
 
+    public static function uploadToFluidbook(\SplFileInfo $file, $fluidbookID, $owner, $async = true)
+    {
+        $uploadID = Str::random();
+
+        $fluidbook = FluidbookPublication::withoutGlobalScopes()->find($fluidbookID);
+
+        $document = new FluidbookDocument();
+        $document->region = $fluidbook->region;
+        $document->file = $file->getFilename();
+        $document->file_data = ["fileName" => $file->getFilename(), "fileSize" => $file->getSize(), "modificationDate" => $file->getMTime(), "creationDate" => $file->getCTime()];
+        $document->owner = $owner->id;
+        $document->save();
+
+        rename($file->getPathname(), Files::mkdir($document->path()) . 'original.pdf');
+        FluidbookDocumentUpload::updateProgression($uploadID, $document->id, __('Mise en file d\'attente du traitement du document'), 1.2);
+        $dispatch = $async ? 'dispatch' : 'dispatchSync';
+        FluidbookDocumentUpload::$dispatch($uploadID, $document, backpack_user(), $fluidbook->id);
+        return ['uploadID' => $uploadID, 'document' => $document->id];
+    }
+
 }
index 87d3704dde4cdd3bfe783f8257f42f62364d6428..66b1cd6ac6e6b807d6ef3d099599e65de0c66596 100644 (file)
@@ -2,8 +2,11 @@
 
 namespace App\Models;
 
+use App\Http\Controllers\Admin\Operations\ChangeownerOperation;
 use App\Http\Controllers\Admin\Operations\ServerOperation;
 use App\Jobs\HostingUpdate;
+use App\Models\Traits\Owner;
+use App\Models\Traits\Permissions;
 use Cubist\Backpack\Magic\Fields\Checkbox;
 use Cubist\Backpack\Magic\Fields\Table;
 use Cubist\Backpack\Magic\Fields\Textarea;
@@ -28,7 +31,7 @@ class FluidbookExternalInstallServer extends ExternalServer
 
     protected static $_permissionBase = 'fluidbook-external-install-server';
 
-    protected $_operations = [ServerOperation::class];
+    protected $_operations = [ServerOperation::class, ChangeownerOperation::class];
 
     protected static $hostingBasePaths = [
         'hosting' => '/mnt/hosting/',
@@ -44,6 +47,11 @@ class FluidbookExternalInstallServer extends ExternalServer
 
     private static $id;
 
+    protected static $_ownerAttribute = 'owner';
+
+    use Owner;
+    use Permissions;
+
     protected static function _getOneServer($server)
     {
         return array_merge(parent::_getOneServer($server), ['allows_root' => $server->allows_root]);
@@ -55,6 +63,7 @@ class FluidbookExternalInstallServer extends ExternalServer
         $nothostingProtocols = array_diff(array_keys($this->getProtocols()), $hostingProtocols);
 
         parent::setFields();
+        $this->addOwnerField(['column' => true]);
         $this->getField('base_url')->setAttribute('when', ['protocol' => $nothostingProtocols]);
         $this->addField('subdomains', Textarea::class, __('Sous-domaines'), ['when' => ['protocol' => $hostingProtocols]]);
         $this->addField('php', Checkbox::class, __('Activer le support de PHP'), ['default' => false, 'when' => ['protocol' => $hostingProtocols]]);
index e4595cf702b0b654b05e500bdee4bebd5e69f670..a918e2d221ff824faa78a5b6d2004fbdb05a5bc5 100644 (file)
@@ -806,7 +806,9 @@ class FluidbookPublication extends ToolboxStatusModel
         $new->visits_counter = 0;
         $new->hash = '';
         $new->cid = '';
-        $new->owner = backpack_user()->id;
+        if (backpack_user() !== null) {
+            $new->owner = backpack_user()->id;
+        }
         $new->extranet_task = null;
         $new->version = 3;
         return $new;
diff --git a/app/Models/Traits/Owner.php b/app/Models/Traits/Owner.php
new file mode 100644 (file)
index 0000000..5ec18be
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Models\Traits;
+
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Support\Facades\Auth;
+
+trait Owner
+{
+    public static function addOwnerClause(Builder $builder)
+    {
+        if (null === backpack_user() || null === Auth::id()) {
+            return;
+        }
+        if (Auth::user()->hasPermissionTo(static::$_permissionBase . ':admin')) {
+            return;
+        }
+        if (null === static::$_ownerAttribute) {
+            return;
+        }
+        $builder->whereIn(static::$_ownerAttribute, backpack_user()->getManagedUsers());
+    }
+
+
+    public function setOwner($owner)
+    {
+        $this->{static::$_ownerAttribute} = $owner;
+    }
+
+    public function addOwnerField($options = [])
+    {
+        if (can(static::$_permissionBase . ':admin')) {
+            $columnAttribute = 'allTreeInfos';
+        } else {
+            $columnAttribute = 'basicTreeInfos';
+        }
+
+        $fieldSettings = [
+            'name' => static::$_ownerAttribute,
+            'label' => __('Propriétaire'),
+            'type' => \App\Fields\Owner::class,
+            'column' => true,
+            'can' => static::$_permissionBase . ':set-owner',
+            'column_attribute' => $columnAttribute,
+            'column_escape' => false,
+            'attribute' => 'companyWithName',
+            'default' => Auth::id(),
+            'non_default_tracking' => true,
+        ];
+
+        $this->addField(array_merge($fieldSettings, $options));
+    }
+
+}
diff --git a/app/Models/Traits/Permissions.php b/app/Models/Traits/Permissions.php
new file mode 100644 (file)
index 0000000..2c5ac36
--- /dev/null
@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Models\Traits;
+
+use App\Models\FluidbookPublication;
+use Illuminate\Support\Facades\Auth;
+
+trait Permissions
+{
+
+    public function allowsDelete()
+    {
+        if (!can(static::$_permissionBase . ':admin')) {
+            return false;
+        }
+        return true;
+    }
+
+    public function allowsUpdate()
+    {
+        if (!can(static::$_permissionBase . ':write')) {
+            return false;
+        }
+        return true;
+    }
+
+    public function allowsEdit()
+    {
+        return $this->allowsUpdate();
+    }
+
+    public function allowsClone()
+    {
+        return $this->allowsCreate();
+    }
+
+    public function allowsPreview()
+    {
+        if (can(static::$_permissionBase . ':write')) {
+            return true;
+        }
+        if (!can(static::$_permissionBase . ':read')) {
+            return false;
+        }
+        return true;
+    }
+
+
+    /**
+     * @param $id
+     * @param $permission
+     * @param $user
+     * @return bool
+     */
+    public static function hasPermission($id, $permission = 'write', $user = null)
+    {
+        if (null === $user) {
+            $user = Auth::user();
+        }
+        if (null === $user) {
+            return false;
+        }
+
+        if ($user->hasPermissionTo(static::$_permissionBase . ':admin')) {
+            return true;
+        }
+        if (!$user->hasPermissionTo(static::$_permissionBase . ':' . $permission)) {
+            return false;
+        }
+        if ($id instanceof FluidbookPublication) {
+            return true;
+        }
+        $entry = static::find($id);
+        if (null === $entry) {
+            return false;
+        }
+        return true;
+    }
+
+}
index 8c5e85f3122e55a4bc0d1aafb702e76e1d21da1d..2043f36d33cadc6e4116bdf988025afb064ec07b 100644 (file)
@@ -59,7 +59,9 @@
         "nyholm/psr7": "^1.8",
         "php-ffmpeg/php-ffmpeg": "^v1.2.0",
         "php-http/curl-client": "^2.3",
+        "php-http/discovery": "^1.19",
         "php-http/message": "^1.16",
+        "php-http/message-factory": "^1.1",
         "pnz/mattermost-client": "dev-master",
         "rickselby/laravel-gate-cache": "^3.8",
         "rodneyrehm/plist": "^2.0",
index abf137f928e904aee642dea0e7b9d8b3ddca0cfe..a6ed522578d87fb26371d1a6c6e999f132aab26e 100644 (file)
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "cc2b0b718123cc1c7b0000fd115eaad7",
+    "content-hash": "0c1e26ecb97c25849f9c57b4177b0344",
     "packages": [
         {
             "name": "archtechx/enums",
             },
             "time": "2024-03-07T13:22:09+00:00"
         },
+        {
+            "name": "php-http/message-factory",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/message-factory.git",
+                "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+                "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "Factory interfaces for PSR-7 HTTP Message",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "stream",
+                "uri"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/message-factory/issues",
+                "source": "https://github.com/php-http/message-factory/tree/1.1.0"
+            },
+            "abandoned": "psr/http-factory",
+            "time": "2023-04-14T14:16:17+00:00"
+        },
         {
             "name": "php-http/multipart-stream-builder",
             "version": "1.4.0",
         "ext-zlib": "*"
     },
     "platform-dev": [],
-    "plugin-api-version": "2.1.0"
+    "plugin-api-version": "2.6.0"
 }
index fc14d9b22cb771319c02e7d2784cd79b3a26d114..1999616288a99d3983ec409c1548cc050da837b8 100644 (file)
     <li class='nav-item fluidbook'><a class='nav-link' href='{{ backpack_url('tools/fluidbookcopylinks') }}'><i
                 class='nav-icon las la-link'></i>
             <span>{{__('Copier les liens ou assets d\'un fluidbook')}}</span></a></li>
-    <li class='nav-item fluidbook'><a class='nav-link' href='{{ backpack_url('tools/fluidbookreplicate') }}'><i
-                class='nav-icon las la-clone'></i>
-            <span>{{__('Dupliquer un fluidbook')}}</span></a></li>
+    @can('fluidbook-publication:write')
+        <li class='nav-item fluidbook'><a class='nav-link' href='{{ backpack_url('tools/fluidbookreplicate') }}'><i
+                    class='nav-icon las la-clone'></i>
+                <span>{{__('Dupliquer un fluidbook')}}</span></a></li>
+        <li class='nav-item fluidbook'><a class='nav-link' href='{{ backpack_url('tools/fluidbookeasycreation') }}'><i
+                    class='nav-icon las la-magic'></i>
+                <span>{{__('Création simplifiée d\'un fluidbook')}}</span></a></li>
+    @endcan
     <li class='nav-item fluidbook'><a class='nav-link' href='{{ backpack_url('tools/fluidbookbranchcreate') }}'><i
                 class='nav-icon la la-git'></i>
             <span>{{__('Créer une branche du player fluidbook')}}</span></a></li>