--- /dev/null
+<?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();
+ }
+ }
+}
--- /dev/null
+<?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));
+ }
+}
*/
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();
}
{
parent::postSave();
self::updateWS2Table($this->id);
+ $this->_generateThemePreview();
+ }
+
+ protected function _generateThemePreview($sync = false)
+ {
dispatch(new GenerateThemePreview($this))->onQueue('theme');
}
{
parent::postCreate();
self::updateWS2Table($this->id);
- dispatch(new GenerateThemePreview($this))->onQueue('theme');
+ $this->_generateThemePreview();
}
public function postDelete()
$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()
"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"
}
}
{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
+})();
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 {
<style type="text/css">
#themePreview {
position: relative;
- padding-bottom: 60%;
+ padding-bottom: 75%;
}
#themePreview iframe {
'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');
});