</component>
<component name="ChangeListManager">
<list default="true" id="5d2ecd5e-a05a-4f96-a195-fa6372618165" name="Default Changelist" comment="wip #5041 @1">
+ <change afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/Operations/Tools/FluidbookAssetsDownloader.php" afterDir="false" />
+ <change afterPath="$PROJECT_DIR$/app/Jobs/Tools/FluidbookAssetsDownloader.php" afterDir="false" />
+ <change afterPath="$PROJECT_DIR$/public/packages/fluidbook/toolbox/css/tools.css" afterDir="false" />
+ <change afterPath="$PROJECT_DIR$/public/packages/fluidbook/toolbox/css/tools.css.map" afterDir="false" />
+ <change afterPath="$PROJECT_DIR$/public/packages/fluidbook/toolbox/css/tools.less" afterDir="false" />
+ <change afterPath="$PROJECT_DIR$/resources/views/tools/form.blade.php" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/app/Services/ScormCloud.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Services/ScormCloud.php" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/resources/elearningmedia/js/app.js" beforeDir="false" afterPath="$PROJECT_DIR$/resources/elearningmedia/js/app.js" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/resources/elearningpackage/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/resources/elearningpackage/index.html" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/resources/elearningpackage/js/app.js" beforeDir="false" afterPath="$PROJECT_DIR$/resources/elearningpackage/js/app.js" afterDir="false" />
+ <change beforePath="$PROJECT_DIR$/app/Http/Controllers/Admin/ToolsController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/ToolsController.php" afterDir="false" />
+ <change beforePath="$PROJECT_DIR$/public/packages/fluidbook/toolbox/css/style.less" beforeDir="false" afterPath="$PROJECT_DIR$/public/packages/fluidbook/toolbox/css/style.less" afterDir="false" />
+ <change beforePath="$PROJECT_DIR$/resources/views/tools/pdf2svg.blade.php" beforeDir="false" afterPath="$PROJECT_DIR$/resources/views/tools/pdf2svg.blade.php" afterDir="false" />
+ <change beforePath="$PROJECT_DIR$/resources/views/tools/sidebar.blade.php" beforeDir="false" afterPath="$PROJECT_DIR$/resources/views/tools/sidebar.blade.php" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option value="Cubist Magic Model" />
<option value="JQuery Plugin" />
<option value="View Helper" />
- <option value="Less File" />
<option value="composer.json" />
<option value="HTML File" />
<option value="JavaScript File" />
+ <option value="Less File" />
</list>
</option>
</component>
<workItem from="1644425348765" duration="2270000" />
<workItem from="1644508187200" duration="10853000" />
<workItem from="1644582031422" duration="8556000" />
- <workItem from="1644828785862" duration="8032000" />
- </task>
- <task id="LOCAL-00197" summary="wait #4877 @0.5">
- <created>1636722382707</created>
- <option name="number" value="00197" />
- <option name="presentableId" value="LOCAL-00197" />
- <option name="project" value="LOCAL" />
- <updated>1636722382707</updated>
+ <workItem from="1644828785862" duration="9853000" />
+ <workItem from="1644851528057" duration="636000" />
+ <workItem from="1644852994411" duration="8772000" />
</task>
<task id="LOCAL-00198" summary="wip #4891 @0.5">
<created>1637226155328</created>
<option name="project" value="LOCAL" />
<updated>1644836183703</updated>
</task>
- <option name="localTasksCounter" value="246" />
+ <task id="LOCAL-00246" summary="wip #5041 @1">
+ <created>1644845541532</created>
+ <option name="number" value="00246" />
+ <option name="presentableId" value="LOCAL-00246" />
+ <option name="project" value="LOCAL" />
+ <updated>1644845541532</updated>
+ </task>
+ <option name="localTasksCounter" value="247" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
--- /dev/null
+<?php
+
+namespace App\Http\Controllers\Admin\Operations\Tools;
+
+use App\Fields\FluidbookID;
+use Cubist\Backpack\Magic\Fields\SelectFromArray;
+use Cubist\Backpack\Magic\Fields\Textarea;
+use Cubist\Backpack\Magic\Form;
+
+trait FluidbookAssetsDownloader
+{
+ public function fluidbookassetsdownloader()
+ {
+ $form = new Form(backpack_url('tools/fluidbookassetsdownloaderDownload'));
+ $form->setSubmitLabel(__('Télécharger'));
+ $form->setSubmitIcon('la-cloud-download-alt');
+ $form->setTitle(__('Téléchargement massif d\'assets dans un fluidbook'));
+ $form->addField(['name' => 'fluidbook',
+ 'label' => __('Fluidbook de destination'),
+ 'type' => FluidbookID::class]);
+ $form->addField('url', Textarea::class, __('Liste des urls à télécharger'), ['hint' => __('Une URL par ligne')]);
+ $form->addField('type', SelectFromArray::class, __('Méthode'), ['allows_null' => false, 'options' => ['download' => __('Télécharger les fichier'), 'unzip' => __('Télécharger et dézipper')], 'hint' => __('Dézipper ne conservera pas l\'arborescence des fichiers dans le zip')]);
+
+
+ return view('tools.form', ['form' => $form]);
+ }
+
+ public function fluidbookassetsdownloaderDownload()
+ {
+ $request = request();
+ \App\Jobs\Tools\FluidbookAssetsDownloader::dispatch($request->input('url'), $request->input('type'), $request->input('fluidbook'));
+ return redirect($request->input('http_referrer'));
+ }
+}
namespace App\Http\Controllers\Admin;
+use App\Http\Controllers\Admin\Operations\Tools\FluidbookAssetsDownloader;
use App\Http\Controllers\Admin\Operations\Tools\PDF2SVGOperation;
use App\Http\Controllers\Controller;
class ToolsController extends Controller
{
use PDF2SVGOperation;
+ use FluidbookAssetsDownloader;
protected function index($tool, $args = '')
{
--- /dev/null
+<?php
+
+namespace App\Jobs\Tools;
+
+use Cubist\Util\Files\Files;
+use Cubist\Util\Text;
+use Cubist\Util\Zip;
+use GuzzleHttp\Client;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+class FluidbookAssetsDownloader implements ShouldQueue
+{
+ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+
+ public function __construct($url, $type, $fluidbook)
+ {
+ if (!$fluidbook) {
+ throw new \Exception('Fluidbook has not be set');
+ }
+ $dest = '/home/extranet/www/fluidbook/books/working/' . $fluidbook . '/';
+ $lines = Text::explodeNewLines($url);
+ foreach ($lines as $line) {
+ $this->_downloadFile($line, $dest);
+ }
+ }
+
+ protected function _downloadFile($url, $dest, $client = null)
+ {
+ $originalURL = $u = trim($url);
+ $hash = hash('sha256', $originalURL);
+
+ $tmp = Files::tempnam();
+ if (null === $client) {
+ $client = new Client(['cookies' => true]);
+ }
+
+ try {
+ $response = $client->get($u, ['sink' => $tmp]);
+ } catch (\Exception $e) {
+ dd($e);
+ }
+ if ($response->hasHeader('Content-Disposition')) {
+ if (preg_match('/filename="(.*)"/', $response->getHeader('Content-Disposition'), $matches)) {
+ $filename = $matches[1];
+ }
+ } else if ($response->hasHeader('Content-Type')) {
+
+ $ct = $response->getHeader('Content-Type')[0];
+ $e = explode(';', $ct);
+ $ct = $e[0];
+
+ if ($ct === 'text/html') {
+ if (preg_match('/https:\/\/bynder[^"]+/', file_get_contents($tmp), $matches)) {
+ unlink($tmp);
+ return $this->_downloadFile(html_entity_decode($matches[0]), $dest, $client);
+ }
+ }
+
+ $filename = $hash;
+ if ($ct !== 'application/octet-stream') {
+ $ext = Files::getExtensionByMimeType($ct);
+ if ($ext) {
+ $filename .= '.' . $ext;
+ }
+ }
+ }
+ if ($type === 'download') {
+ rename($tmp, $dest . $filename);
+ } else if ($type === 'unzip') {
+ Zip::extract($tmp, $dest, true);
+ unlink($tmp);
+ }
+ }
+}
}
}
}
+
+@import "tools";
--- /dev/null
+#tool{
+ padding-top: 30px;
+
+ h2{
+ padding-bottom: 20px;
+ }
+}
--- /dev/null
+@php
+
+@endphp
+
+@extends(backpack_view('blank'))
+
+@section('content')
+ <div id="tool">
+ {!! $form !!}
+ </div>
+@endsection
+
+@push('after_scripts')
+ <script>
+ (function ($) {
+ $(function () {
+
+ })
+ })(jQuery);
+ </script>
+@endpush
@extends(backpack_view('blank'))
@section('content')
- <h2>{{__('Convertir un fichier pdf en svg')}}</h2>
- <form method="post" action="{{backpack_url("tools/convertpdf2svg")}}" enctype="multipart/form-data"
- id="pdf2svg-form">
- @csrf
- <label>{{__('Charger un fichier pdf')}}<br><input type="file" id="pdf2svg-field" name="file"
- accept="application/pdf"></label>
- </form>
+ <div id="tool">
+ <h2>{{__('Convertir un fichier pdf en svg')}}</h2>
+ <form method="post" action="{{backpack_url("tools/convertpdf2svg")}}" enctype="multipart/form-data"
+ id="pdf2svg-form">
+ @csrf
+ <label>{{__('Charger un fichier pdf')}}<br><input type="file" id="pdf2svg-field" name="file"
+ accept="application/pdf"></label>
+ </form>
+ </div>
@endsection
@push('after_scripts')
<li class='nav-item'><a class='nav-link' href='{{ backpack_url('tools/pdf2svg') }}'><i
class='nav-icon la la-images'></i>
<span>{{__('PDF to SVG')}}</span></a></li>
+ <li class='nav-item'><a class='nav-link' href='{{ backpack_url('tools/fluidbookassetsdownloader') }}'><i
+ class='nav-icon las la-cloud-download-alt'></i>
+ <span>{{__('Téléchargement massif d\'assets dans un fluidbook')}}</span></a></li>
{{-- <li class='nav-item'><a class='nav-link' href='{{ backpack_url('tools/securehosting') }}'><i--}}
{{-- class='nav-icon la la-lock'></i>--}}
{{-- <span>{{__('Sécuriser hosting')}}</span></a></li>--}}