]> _ Git - fluidbook-toolbox.git/commitdiff
wip #4210 @1.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 15 Jun 2022 13:01:38 +0000 (15:01 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 15 Jun 2022 13:01:38 +0000 (15:01 +0200)
app/Console/Commands/ThemePreview.php [new file with mode: 0644]
app/Http/Controllers/Admin/FluidbookThemePreviewController.php [new file with mode: 0644]
app/Jobs/GenerateThemePreview.php
app/Models/FluidbookTheme.php
package.json
resources/js/social_screenshot/social_screenshot.js
resources/views/fields/fluidbook_theme_selector.blade.php
resources/views/fluidbook_theme/preview.blade.php
routes/web.php

diff --git a/app/Console/Commands/ThemePreview.php b/app/Console/Commands/ThemePreview.php
new file mode 100644 (file)
index 0000000..bb23b09
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Jobs\GenerateThemePreview;
+use App\Models\FluidbookTheme;
+use Cubist\Backpack\Console\Commands\CubistCommand;
+use Cubist\Util\ArrayUtil;
+use Illuminate\Database\Query\Builder;
+
+class ThemePreview extends CubistCommand
+{
+    protected $signature = 'fluidbook:theme:preview {id?}';
+    protected $description = 'Generate a theme preview';
+
+    public function handle()
+    {
+        $themeId = $this->argument('id');
+        /** @var Builder $q */
+        $q = FluidbookTheme::where('created_ok', '1');
+        if (null !== $themeId) {
+            $themeIds = ArrayUtil::parseRange($themeId);
+            $q->whereIn('id', $themeIds);
+        }
+        $themes = $q->get();
+        $this->progressBar = $this->output->createProgressBar(count($themes));
+        $this->progressBar->start();
+
+        foreach ($themes as $theme) {
+            dispatch_sync(new GenerateThemePreview($theme));
+            $this->progressBar->advance();
+        }
+    }
+}
diff --git a/app/Http/Controllers/Admin/FluidbookThemePreviewController.php b/app/Http/Controllers/Admin/FluidbookThemePreviewController.php
new file mode 100644 (file)
index 0000000..879ebb0
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Jobs\GenerateThemePreview;
+use App\Models\FluidbookTheme;
+use Cubist\Backpack\Http\Controllers\Base\XSendFileController;
+
+class FluidbookThemePreviewController extends XSendFileController
+{
+    public function preview($id)
+    {
+        /** @var FluidbookTheme $theme */
+        $theme = FluidbookTheme::find($id);
+        if (null === $theme) {
+            return response()->setStatusCode(404);
+        }
+        if (!$theme->canList(backpack_user())) {
+            return response()->setStatusCode(403);
+        }
+        return $this->xSendFile(GenerateThemePreview::getPreviewPath($theme->id));
+    }
+}
index 8f94ef478decc108fb4f1392fcd2c7a7faa052bb..c49c72d726513c1f3ac8a6bc7cc010eed8dbdc9f 100644 (file)
@@ -34,14 +34,18 @@ class GenerateThemePreview extends Base
      */
     public function handle()
     {
+        $path = self::getPreviewPath($this->theme->getIdValue());
+
         $cl = new CommandLine('node');
         $cl->setArg(null, resource_path('js/social_screenshot/social_screenshot.js'));
         $cl->setArg('width', 1024);
         $cl->setArg('height', 768);
-        $cl->setArg('delay', 4);
+        $cl->setArg('delay', 2);
         $cl->setArg('scale', 1);
-        $cl->setArg('dest', self::getPreviewPath($this->theme->getIdValue()));
-        $cl->setArg('url', $this->theme->getPreviewURL(['shortLoading' => 1]));
+        $cl->setArg('dest', $path);
+        $cl->setArg('page', 2);
+        $url = $this->theme->getPreviewURL(['shortLoading' => 1, 'transition' => 1]);
+        $cl->setArg('url', $url);
         $cl->execute();
     }
 
index 054c5fd3d505fe412d2d1a794e7350a083c8f0e3..3e03f58eb020303fc0765e01bae5bef5a0ee1c96 100644 (file)
@@ -646,6 +646,11 @@ class FluidbookTheme extends ToolboxModel
     {
         parent::postSave();
         self::updateWS2Table($this->id);
+        $this->_generateThemePreview();
+    }
+
+    protected function _generateThemePreview($sync = false)
+    {
         dispatch(new GenerateThemePreview($this))->onQueue('theme');
     }
 
@@ -653,7 +658,7 @@ class FluidbookTheme extends ToolboxModel
     {
         parent::postCreate();
         self::updateWS2Table($this->id);
-        dispatch(new GenerateThemePreview($this))->onQueue('theme');
+        $this->_generateThemePreview();
     }
 
     public function postDelete()
@@ -789,7 +794,7 @@ class FluidbookTheme extends ToolboxModel
             $type = 'jpeg';
             $b = base64_encode(file_get_contents($f));
         }
-        return '<img src="data:image/' . $type . ';base64,' . $b . '" width="200" height="140" alt="" />';
+        return '<img src="' . backpack_url('fluidbookthemepreview/' . $this->getIdValue() . '.jpg') . '" width="200" height="140" alt="" />';
     }
 
     public function getNameAndIdAttribute()
index 06750799c77a03e0ac538baabeb448d247a3190c..e4eacad6a9fda181d56153372900fd44b50aac90 100644 (file)
         "laravel-mix": "^5.0.1",
         "lodash": "^4.17.13",
         "resolve-url-loader": "^3.1.0",
-        "sass": "^1.49.7",
+        "sass": "^1.49.9",
         "sass-loader": "^8.0.0",
         "vue-template-compiler": "^2.6.14",
         "webfont": "^11.2.26"
     },
     "dependencies": {
-        "pdfjs-dist": "^2.12.313",
+        "command-line-args": "^5.2.1",
+        "pdfjs-dist": "^2.13.216",
         "pipwerks-scorm-api-wrapper": "^0.1.2",
-        "plyr": "^3.6.12"
+        "plyr": "^3.6.12",
+        "puppeteer": "^14.4.0"
     }
 }
index d9e4184210e3e561e2368dce1d32922f26bb8038..e0f909dd890ff666f12a90a804bee5c3ebef8d6b 100644 (file)
@@ -6,21 +6,23 @@ const optionDefinitions = [
     {name: 'delay', type: Number, defaultOption: 10},
     {name: 'scale', type: Number, defaultOption: 1},
     {name: 'width', type: Number, defaultOption: 1920},
-    {name: 'height', type: Number, defaultOption: 1080}
+    {name: 'height', type: Number, defaultOption: 1080},
+    {name: 'page', type: Number, defaultOption: 2}
 ];
 
 (async () => {
     const options = commandLineArgs(optionDefinitions);
     const browser = await puppeteer.launch({headless: true});
     const page = await browser.newPage();
-    page.on('console', msg => console.log('PAGE LOG:', msg._text));
     await page.setViewport({
         width: options.width / options.scale,
         height: options.height / options.scale,
         deviceScaleFactor: options.scale,
     });
-    await page.goto(options.url);
-    await new Promise(r => setTimeout(r, 1000 * options.delay));
+    await page.goto(options.url, {waitUntil: 'networkidle2'});
+    await new Promise(r => setTimeout(r, 1000 * (options.delay -1)));
+    await page.evaluate(() => fluidbook.setCurrentPage(2));
+    await new Promise(r => setTimeout(r, 1000));
     await page.screenshot({path: options.dest, type: 'jpeg', quality: 95});
     await browser.close();
-})();
\ No newline at end of file
+})();
index 3b30b80c1b8574491f4a32cacce2249898ef605c..6fccd05123cdf2e5c4ede361c1ca1e422f67df59 100644 (file)
@@ -14,7 +14,7 @@
 
                 function resizeThemeSelector() {
                     var ifr = $('.themeSelector iframe');
-                    var ih = ifr.outerWidth() * 0.62;
+                    var ih = ifr.outerWidth() * 0.75;
                     ifr.css('height', ih);
                     $('.themeSelector .preview').css('max-height', (ih / 2) + 10);
                 }
             }
 
             .themeSelector .preview {
-                width: 60%;
+                width: 55%;
                 display: inline-block;
                 overflow: hidden;
             }
 
             .themeSelector .actions {
                 display: inline-block;
-                width: 40%;
+                width: 45%;
                 vertical-align: top;
                 padding: 0 0 0 20px;
+                white-space: normal;
             }
 
             .themeSelector .actions a {
index 8002b95b51703592c721dca84b676a1aea243963..c3c0b50f640657feb651ee26c74c0ec12d790edf 100644 (file)
@@ -47,7 +47,7 @@
     <style type="text/css">
         #themePreview {
             position: relative;
-            padding-bottom: 60%;
+            padding-bottom: 75%;
         }
 
         #themePreview iframe {
index 866071f36688394ac5b76eb2efd133f5e013abf2..1d2ba86780abca753b72fe72fc8e7e1aaa8d61b4 100644 (file)
@@ -8,5 +8,6 @@ Route::group([
     'namespace' => '\App\Http\Controllers\Admin',
 ], function () { // custom admin routes
     Route::any('tools/{tool}/{args?}', 'ToolsController@index')->where(['args' => '.*']);
-    Route::post('toolbox_setting','ToolboxSettingsController@set');
+    Route::post('toolbox_setting', 'ToolboxSettingsController@set');
+    Route::get('fluidbookthemepreview/{id}.jpg', 'FluidbookThemePreviewController@preview');
 });