]> _ Git - fluidbook-toolbox.git/commitdiff
wip #7634 @6:00
authorsoufiane <soufiane@cubedesigners.com>
Tue, 8 Jul 2025 16:59:44 +0000 (18:59 +0200)
committersoufiane <soufiane@cubedesigners.com>
Tue, 8 Jul 2025 16:59:44 +0000 (18:59 +0200)
app/Http/Controllers/Admin/FluidbookPublicationCrudController.php
app/Http/Controllers/Admin/Operations/FluidbookPublication/MarkdownOperation.php [new file with mode: 0644]
app/Models/FluidbookPublication.php
package.json
resources/markdowneditor/js/markdowneditor.js [new file with mode: 0644]
resources/markdowneditor/style/style.sass [new file with mode: 0644]
resources/markdowneditor/webpack.mix.js [new file with mode: 0644]
resources/views/fluidbook_publication/markdown_editor.blade.php [new file with mode: 0644]
resources/views/layouts/markdowneditor.blade.php [new file with mode: 0644]

index fd2f950246fff028e7d110a190e73a1a5af66690..53ccafe7fc0970dc146df1d02dda7513eb4bc5b1 100644 (file)
@@ -15,15 +15,16 @@ class FluidbookPublicationCrudController extends \Cubist\Backpack\Magic\Controll
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\CloneOperation;
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\DeletefbOperation;
        use \App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation;
-       use \App\Http\Controllers\Admin\Operations\ChangeownerOperation;
-       use \App\Http\Controllers\Admin\Operations\ChangestatusOperation;
-       use \App\Http\Controllers\Admin\Operations\InvoiceOperation;
-       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\SettingsExportOperation;
-       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\SocialImageOperation;
-       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation;
-       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\GetPageFromWebsiteOperation;
-       use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\BastideOperation;
-       
+    use \App\Http\Controllers\Admin\Operations\FluidbookPublication\MarkdownOperation;
+    use \App\Http\Controllers\Admin\Operations\ChangeownerOperation;
+    use \App\Http\Controllers\Admin\Operations\ChangestatusOperation;
+    use \App\Http\Controllers\Admin\Operations\InvoiceOperation;
+    use \App\Http\Controllers\Admin\Operations\FluidbookPublication\SettingsExportOperation;
+    use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\SocialImageOperation;
+    use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation;
+    use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\GetPageFromWebsiteOperation;
+    use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\BastideOperation;
+
 
 
     /*
diff --git a/app/Http/Controllers/Admin/Operations/FluidbookPublication/MarkdownOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookPublication/MarkdownOperation.php
new file mode 100644 (file)
index 0000000..3e4e1c0
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Http\Controllers\Admin\Operations\FluidbookPublication;
+
+use App\Models\FluidbookPublication;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Route;
+use Illuminate\Support\Str;
+
+trait MarkdownOperation
+{
+    protected function setupMarkdownRoutes($segment, $routeName, $controller)
+    {
+        Route::match(['get'], $segment . '/{id}/edit/markdown', $controller . '@markdown')->name('fluidbook_markdowneditor');
+    }
+
+    public function markdown($id, Request $request)
+    {
+        if (!FluidbookPublication::hasPermission($id)) {
+            abort(401);
+        }
+
+        $token = Str::random(10);
+
+        return view('fluidbook_publication.markdown_editor', ['version' => 'stable', 'id' => $id, 'fluidbook' => FluidbookPublication::find($id), 'access' => "", 'token' => $token]);
+    }
+}
index 59d53ad647835f9d0062af0802ae7c48d00c9974..df76a196850e01115493cd07fedf18da42d4c626 100644 (file)
@@ -26,6 +26,7 @@ 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\MarkdownOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\PreviewOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\BastideOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation;
@@ -109,6 +110,7 @@ class FluidbookPublication extends ToolboxStatusModel
         ChangestatusOperation::class,
         InvoiceOperation::class,
         SettingsExportOperation::class,
+        MarkdownOperation::class,
         // Services
         SocialImageOperation::class,
         ExportPdfOperation::class,
index 3ac00ed3fc15bc1cb280a1ab3c1241bfd70c7985..8897bbb42d171ca556814c64e5ac5bb98e7e434e 100644 (file)
@@ -13,7 +13,8 @@
         "linkeditor": "cross-env process.env.section=linkeditor-stable mix --production",
         "linkeditor-beta-dev": "cross-env process.env.section=linkeditor mix",
         "linkeditor-beta-watch": "cross-env process.env.section=linkeditor mix watch",
-        "linkeditor-beta": "cross-env process.env.section=linkeditor mix --production"
+        "linkeditor-beta": "cross-env process.env.section=linkeditor mix --production",
+        "markdowneditor-watch": "cross-env process.env.section=markdowneditor mix watch"
     },
     "devDependencies": {
         "axios": "^1.3.5",
diff --git a/resources/markdowneditor/js/markdowneditor.js b/resources/markdowneditor/js/markdowneditor.js
new file mode 100644 (file)
index 0000000..d89096a
--- /dev/null
@@ -0,0 +1,57 @@
+function MarkdownEditor() {
+    this.init()
+}
+
+MarkdownEditor.prototype = {
+    init: function() {
+        this.pagesSource = 'pages';
+        this.rasterizePages = this.splitPages(FLUIDBOOK_DATA.settings.rasterizePages);
+        this.vectorPages = this.splitPages(FLUIDBOOK_DATA.settings.vectorPages);
+        this.noCache = '?t=' + (new Date(FLUIDBOOK_DATA.composition_updated_at)).getTime();
+        this.loadPage(2)
+    },
+
+    loadPage: function(p,side) {
+        const container = document.querySelector("#markdown-preview")
+        var imageFormat = FLUIDBOOK_DATA.settings.imageFormat ?? 'jpg';
+        var c = '<div class="contents">';
+        //if (this.linkeditor.utils.isSpecialPage(p)) {
+            //let data = this.linkeditor.utils.getSpecialPageAssetData(p);
+            //c += '<img draggable="false" width="' + data.dim[0] + '" height="' + data.dim[1] + '" class="images" src="' + data.url + '" />';
+        //} else {
+            if (this.pagesSource === 'pages') {
+                if (this.rasterizePages.indexOf(p) >= 0) {
+                    c += '<img draggable="false" src="raster_' + p + '.' + imageFormat + this.noCache + '" />';
+                } else if (this.vectorPages.indexOf(p) >= 0) {
+                    c += '<img draggable="false" src="vector_' + p + '.svg' + this.noCache + '" />';
+                } else {
+                    c += '<img draggable="false" class="images" src="images_' + p + '.' + imageFormat + this.noCache + '" />';
+                    c += '<img draggable="false" class="texts" src="texts_' + p + '.svg' + this.noCache + '" />';
+                }
+            } else if (this.pagesSource === 'thumbnails') {
+                c += '<img draggable="false" src="thumbspdf_' + p + '.' + imageFormat + this.noCache + '" />';
+            }
+        //}
+        c += '</div>';
+        container.innerHTML = c;
+    },
+
+    splitPages: function (str) {
+        let res = [];
+        if (str === undefined || str === null) {
+            return res;
+        }
+        str = str.toString();
+        if (str == '') {
+            return res;
+        }
+        let pages = str.split(',');
+        for (let p in pages) {
+            res.push(parseInt(pages[p]));
+        }
+        return res;
+    },
+}
+
+
+new MarkdownEditor();
diff --git a/resources/markdowneditor/style/style.sass b/resources/markdowneditor/style/style.sass
new file mode 100644 (file)
index 0000000..8c27bf5
--- /dev/null
@@ -0,0 +1,26 @@
+body
+    padding: 0
+    margin: 0
+.markdown
+    &-editor
+        display: flex
+        height: 100vh
+        overflow: hidden
+    &-container,
+    &-editor-container
+        height: 100% !important
+
+    &-editor-container
+        width: 100%
+    &-container
+        position: relative
+        width: calc(100% / 3)
+        flex-shrink: 0
+        align-items: center
+        justify-content: center
+        img
+            width: 100%
+            position: absolute
+            top: 50%
+            left: 50%
+            transform: translate(-50%,-50%)
diff --git a/resources/markdowneditor/webpack.mix.js b/resources/markdowneditor/webpack.mix.js
new file mode 100644 (file)
index 0000000..9193da1
--- /dev/null
@@ -0,0 +1,3 @@
+const mix = require("laravel-mix");
+mix.setPublicPath('public/packages/markdowneditor').js('resources/markdowneditor/js/markdowneditor.js', 'js')
+    .sass('resources/markdowneditor/style/style.sass', 'css').options({processCssUrls: false}).version();
diff --git a/resources/views/fluidbook_publication/markdown_editor.blade.php b/resources/views/fluidbook_publication/markdown_editor.blade.php
new file mode 100644 (file)
index 0000000..84ab323
--- /dev/null
@@ -0,0 +1,42 @@
+@php
+    $content = "ok";
+    $fbdata=$fluidbook->getPageData()->getRawData();
+    $fbdata['settings']['imageFormat']=$fluidbook->getImageFormat();
+    $fbdata['page_dimensions']=[];
+@endphp
+
+@extends('layouts.markdowneditor')
+
+@section('content')
+    <div class="markdown-editor">
+        <div id="markdown-preview" class="markdown-container">
+            <div id="left"></div>
+            <div id="right"></div>
+        </div>
+        <div id="editor" class="markdown-editor-container"></div>
+    </div>
+@endsection
+
+@push('markdown_styles')
+    <link rel="stylesheet" href="https://uicdn.toast.com/editor/latest/toastui-editor.min.css" />
+    <link rel="stylesheet"
+          href="/packages/markdowneditor/css/style.css?v={{filemtime(public_path('packages/markdowneditor/css/style.css'))}}"/>
+@endpush
+@push('markdown_scripts')
+    <script>
+        var FLUIDBOOK_DATA = @json($fbdata);
+    </script>
+    <script
+        src="/packages/markdowneditor/js/markdowneditor.js?v={{filemtime(public_path('packages/markdowneditor/js/markdowneditor.js'))}}"></script>
+    <script src="https://uicdn.toast.com/editor/latest/toastui-editor-all.min.js"></script>
+    <script>
+        const editor = new toastui.Editor({
+            el: document.querySelector('#editor'),
+            initialEditType: 'markdown',
+            initialValue: '{{ $content }}',
+            previewStyle: 'vertical'
+        });
+
+        editor.getMarkdown();
+    </script>
+@endpush
diff --git a/resources/views/layouts/markdowneditor.blade.php b/resources/views/layouts/markdowneditor.blade.php
new file mode 100644 (file)
index 0000000..951529c
--- /dev/null
@@ -0,0 +1,26 @@
+{{-- __('!! Editeur de liens') --}}
+    <!DOCTYPE html>
+<html lang="{{ app()->getLocale() }}" dir="{{ config('backpack.base.html_direction') }}">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
+    @if (config('backpack.base.meta_robots_content'))
+        <meta name="robots" content="{{ config('backpack.base.meta_robots_content', 'noindex, nofollow') }}">
+    @endif
+    <meta name="csrf-token"
+          content="{{ csrf_token() }}"/> {{-- Encrypted CSRF token for Laravel, in order for Ajax requests to work --}}
+    <title>{{ isset($title) ? $title.' :: '.config('backpack.base.project_name') : config('backpack.base.project_name') }}</title>
+    <link rel="preconnect" href="https://fonts.googleapis.com">
+    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+    <link href="https://fonts.googleapis.com/css2?family=Open+Sans&display=swap" rel="stylesheet">
+    @yield('markdown_styles')
+    @stack('markdown_styles')
+</head>
+<body class="app flex-row align-items-center">
+@yield('header')
+@yield('content')
+@stack('markdown_scripts')
+
+</body>
+</html>