]> _ Git - fluidbook-toolbox.git/commitdiff
wip #5467 @1.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 20 Sep 2022 09:34:08 +0000 (11:34 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 20 Sep 2022 09:34:08 +0000 (11:34 +0200)
package.json
public/packages/fluidbook/toolbox/css/linkeditor.css.map
public/packages/fluidbook/toolbox/css/linkeditor.less
resources/linkeditor/js/linkeditor.js [new file with mode: 0644]
resources/linkeditor/style/links.sass [new file with mode: 0644]
resources/linkeditor/style/style.sass [new file with mode: 0644]
resources/linkeditor/webpack.mix.js [new file with mode: 0644]
resources/views/fluidbook_publication/link_editor.blade.php
scripts/updatenpm

index c917d86dc3aa438072fcb5fff8f9c446a7f55ee4..f215d00343f2a1940abe7370b28601e7f17f931b 100644 (file)
         "quiz-development": "cross-env process.env.section=quiz NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
         "quiz-watch": "cross-env process.env.section=quiz NODE_OPTIONS=--openssl-legacy-provider NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
         "quiz-prod": "npm run quiz-production",
-        "quiz-production": "cross-env process.env.section=quiz NODE_OPTIONS=--openssl-legacy-provider NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+        "quiz-production": "cross-env process.env.section=quiz NODE_OPTIONS=--openssl-legacy-provider NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+        "linkeditor-dev": "npm run linkeditor-development",
+        "linkeditor-development": "cross-env process.env.section=linkeditor NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+        "linkeditor-watch": "cross-env process.env.section=linkeditor NODE_OPTIONS=--openssl-legacy-provider NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+        "linkeditor-prod": "npm run linkeditor-production",
+        "linkeditor-production": "cross-env process.env.section=linkeditor NODE_OPTIONS=--openssl-legacy-provider NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
     },
     "devDependencies": {
         "axios": "^0.19",
     "dependencies": {
         "command-line-args": "^5.2.1",
         "jquery.scrollto": "^2.1.3",
+        "keymaster": "^1.6.2",
         "lz4js": "^0.2.0",
         "pako": "^2.0.4",
         "pdfjs-dist": "^2.14.305",
         "pipwerks-scorm-api-wrapper": "^0.1.2",
         "plyr": "^3.7.2",
-        "puppeteer": "^17.0.0"
+        "puppeteer": "^17.0.0",
+        "tippy.js": "^6.3.7"
     }
 }
index 1fe9fc5f0d9603845ef951ce4657ce19cef7611a..e8ef77f43c3190f8ea82b68edcc1bba245780c2f 100644 (file)
@@ -1 +1 @@
-{"version":3,"sources":["linkeditor.less"],"names":[],"mappings":"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","file":"linkeditor.css"}
\ No newline at end of file
+{"version":3,"sources":["linkeditor.less"],"names":[],"mappings":"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","file":"linkeditor.css"}
\ No newline at end of file
index ed16bc61e1e7bbfdaa54dcb7deb3cc5518d6c2f1..f21e16873397422dde25439c711fb8a0f915abcd 100644 (file)
@@ -120,6 +120,7 @@ body, #linkeditor, html {
                 margin: 0 8px;
                 font-weight: 600;
 
+                
                 input {
                     vertical-align: top;
                     text-align: right;
diff --git a/resources/linkeditor/js/linkeditor.js b/resources/linkeditor/js/linkeditor.js
new file mode 100644 (file)
index 0000000..33c5153
--- /dev/null
@@ -0,0 +1,775 @@
+window.$ = window.jQuery = require('jquery');
+import tippy from 'tippy.js';
+import 'tippy.js/dist/tippy.css';
+import key from 'keymaster';
+require('jquery.scrollto');
+require('jquery-contextmenu');
+
+var single = ['mobilefirst', 'portrait'].indexOf(FLUIDBOOK_DATA.settings.mobileNavigationType) >= 0;
+var pw = FLUIDBOOK_DATA.settings.width;
+var ph = FLUIDBOOK_DATA.settings.height;
+var fw = pw * (single ? 1 : 2);
+var fh = ph;
+var fs = 1;
+var mx = 0, my = 0;
+var zoom = 1;
+var zoomdragging = false;
+var dividers = [1, 2, 5, 10, 20, 50, 100, 200];
+var fluidbookRect, canvasRect, editorRect;
+var currentPage;
+var movingRuler = null;
+var rasterizePages = splitPages(FLUIDBOOK_DATA.settings.rasterizePages);
+var vectorPages = splitPages(FLUIDBOOK_DATA.settings.vectorPages);
+var unsavedChanges = false;
+var automaticSaveTimeout;
+var runningAutomaticSaveTimeout = false;
+var dimensionProperties = ['left', 'top', 'width', 'height'];
+var rulersMagnetValuesX = [];
+var rulersMagnetValuesY = [];
+var currentSelection = [];
+
+$(function () {
+    init();
+});
+
+
+function init() {
+    $(window).on('hashchange', function () {
+        changePage();
+    });
+    $(window).on('resize', function () {
+        resize();
+    });
+    $(window).on('beforeunload', function () {
+        if (unsavedChanges) {
+            return TRANSLATIONS.warning_unsaved_changes;
+        }
+    })
+    // Disable scroll by spacebar
+    $(window).on('keydown', function (e) {
+        if (e.keyCode == 32) {
+            $("#linkeditor-main").addClass('grab');
+            return false;
+        }
+        moveRuler();
+    });
+    $(window).on('keyup', function (e) {
+        if (e.keyCode == 32) {
+            resetZoomDrag();
+        }
+        moveRuler();
+    });
+
+    $("#linkeditor-canvas").on('scroll', function () {
+        updateRulers();
+    });
+    $("#linkeditor-main").on('mousedown', function (e) {
+        if ($(this).hasClass('grab') && zoom > 1) {
+            zoomdragging = {
+                x: e.pageX,
+                y: e.pageY,
+                scrollX: $("#linkeditor-canvas").scrollLeft(),
+                scrollY: $("#linkeditor-canvas").scrollTop()
+            };
+            $(this).addClass('grabbing');
+        } else {
+            resetZoomDrag();
+        }
+        deselectAllLinks();
+    });
+
+    $(document).on('mousedown', '.link', function (e) {
+        if (!e.ctrlKey) {
+            deselectAllLinks();
+        }
+        selectLink($(this));
+    });
+
+    $("#linkeditor-ruler-x").on('mousedown', function (e) {
+        addRuler('y');
+    });
+
+    $("#linkeditor-ruler-y").on('mousedown', function (e) {
+        addRuler('x');
+    });
+
+    $(document).on('mousedown', ".ruler", function (e) {
+        movingRuler = $(this);
+
+    });
+
+    $(window).on('mousemove', function (e) {
+        if (!$("#linkeditor-main").hasClass('grab') || zoom === 1) {
+            resetZoomDrag();
+        }
+        if (zoomdragging !== false) {
+            moveZoomDrag(e);
+        }
+        updateMousePosition(e);
+    });
+    $(window).on('mouseup', function (e) {
+        if (zoomdragging !== false) {
+            moveZoomDrag(e);
+        }
+        stopMoveRuler();
+        resetZoomDrag();
+    });
+    $("#linkeditor-main").on('wheel', function (e) {
+        var delta = e.originalEvent.deltaY;
+        if (delta == 0) {
+            return true;
+        }
+        e.stopPropagation();
+        e.stopImmediatePropagation();
+        e.preventDefault();
+        if (delta < 0) {
+            if (setZoom(zoom + 0.25)) {
+                moveZoom(e);
+            }
+        } else {
+            setZoom(zoom - 0.25);
+        }
+        return false;
+    });
+
+    if (single) {
+        $("#linkeditor").addClass('single');
+    } else {
+        $("#linkeditor").addClass('double');
+    }
+    $('.linkeditor-page').css({
+        width: pw, height: ph
+    });
+    $("#linkeditor-page-right").css({left: pw})
+    $('#linkeditor-fluidbook').css({
+        width: fw, height: ph
+    });
+    initToolbar();
+    resize();
+    changePage();
+}
+
+function selectLink(l) {
+    if ($(l).find('.corners').length === 0) {
+        $(l).append('<div class="corners"><div class="nw"></div><div class="n"></div><div class="ne"></div><div class="e"></div><div class="se"></div><div class="s"></div><div class="sw"></div><div class="w"></div></div>')
+    }
+    $(l).addClass('selected');
+    currentSelection.push(l);
+}
+
+function deselectAllLinks() {
+    currentSelection = [];
+    $(".link.selected").removeClass('selected');
+}
+
+function initToolbar() {
+    $("#linkeditor-page-field input").on('change', function () {
+        changePage($(this).val());
+        $(this).blur();
+        return false;
+    });
+
+    $("#linkeditor-toolbar [data-icon]").each(function () {
+        $(this).append(getSpriteIcon('linkeditor-' + $(this).data('icon')));
+    });
+
+    $("[data-key]").each(function () {
+        var e = $(this);
+        key($(this).data('key'), function () {
+            $(e).addClass('hover');
+            runAction($(e).data('action'));
+            setTimeout(function () {
+                $(e).removeClass('hover')
+            }, 150);
+            return false;
+        });
+    });
+
+    $('[data-action]').click(function () {
+        runAction($(this).data('action'));
+        return false;
+    });
+
+    $('[data-tooltip]').each(function () {
+        tippy($(this).get(0), {content: $(this).data('tooltip')});
+    });
+}
+
+function runAction(act) {
+    eval(act+'()');
+}
+
+function saveLinks(message) {
+    if (message === undefined) {
+        message = TRANSLATIONS.manual_save_message;
+    }
+    $.ajax({
+        url: '/fluidbook-publication/' + FLUIDBOOK_DATA.id + '/save/links', method: 'post', data: {
+            _method: 'put', 'message': message, rulers: window.RULERS, links: window.LINKS,
+        }, success: function (data) {
+            new Noty({
+                type: "success", text: TRANSLATIONS.success_save,
+            }).show();
+            clearTimeout(automaticSaveTimeout);
+            unsavedChanges = false;
+            runningAutomaticSaveTimeout = false;
+        }, error: function (jqXHR, status, error) {
+            hasChanged();
+            new Noty({
+                type: "error", text: TRANSLATIONS.error_save + ' : ' + error,
+            }).show();
+        },
+    });
+}
+
+function automaticSaveLinks() {
+    saveLinks(TRANSLATIONS.automatic_save_message);
+}
+
+function firstPage() {
+    changePage(1);
+}
+
+function nextPage() {
+    changePage(currentPage + (single ? 1 : 2));
+}
+
+function previousPage() {
+    changePage(currentPage - (single ? 1 : 2));
+}
+
+function lastPage() {
+    changePage(FLUIDBOOK_DATA.settings.pages);
+}
+
+function focusPageField() {
+    var i = $("#linkeditor-page-field input").get(0);
+    i.focus();
+    i.select();
+}
+
+function zoomReset() {
+    setZoom(1);
+    resetZoomDrag();
+}
+
+function generateUID() {
+    var length = 12;
+    var result = '';
+    var characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
+    var charactersLength = characters.length;
+    for (var i = 0; i < length; i++) {
+        result += characters.charAt(Math.floor(Math.random() * charactersLength));
+    }
+    return result;
+}
+
+function addRuler(axis, pos, uid) {
+    if (undefined === uid) {
+        uid = generateUID();
+        RULERS[uid] = {page: currentPage, type: axis, uid: uid};
+        hasChanged();
+    }
+    var ruler = $('<div class="ruler" data-uid="' + uid + '" fb-ref="editor" data-axis="' + axis + '"></div>');
+    if (pos === undefined) {
+        movingRuler = ruler;
+    } else {
+        var dim = axis == 'x' ? 'left' : 'top';
+        $(ruler).attr('fb-' + dim, pos);
+    }
+    $("#linkeditor-editor").append(ruler);
+    moveRuler();
+}
+
+function deleteRuler(ruler) {
+    if (ruler === undefined) {
+        ruler = movingRuler;
+    }
+    var uid = $(ruler).data('uid');
+    delete RULERS[uid];
+    $(ruler).remove();
+    movingRuler = null;
+    hasChanged();
+}
+
+function hasChanged() {
+    unsavedChanges = true;
+    if (runningAutomaticSaveTimeout === false) {
+        runningAutomaticSaveTimeout = true;
+        automaticSaveTimeout = setTimeout(function () {
+            automaticSaveLinks();
+        }, 1000 * 5 * 60);
+    }
+}
+
+function moveRuler() {
+    if (movingRuler === null || movingRuler === undefined) {
+        return;
+    }
+    var magnet = !key.ctrl;
+    var editorMouse = globalToEditor(mx, my);
+    var fbMouse = globalToFluidbook(mx, my, false);
+    var css = {};
+    var attrs = {};
+    var v, fbv;
+    if ($(movingRuler).data('axis') === 'x') {
+        v = editorMouse.x;
+        fbv = attrs['fb-left'] = magnet ? magnetize(fbMouse.x, rulersMagnetValuesX) : fbMouse.x;
+    } else {
+        v = editorMouse.y;
+        fbv = attrs['fb-top'] = magnet ? magnetize(fbMouse.y, rulersMagnetValuesY) : fbMouse.y;
+    }
+    if (v < 16) {
+        $(movingRuler).addClass('pending-delete');
+    } else {
+        $(movingRuler).removeClass('pending-delete');
+    }
+    $(movingRuler).css(css).attr(attrs);
+    RULERS[$(movingRuler).data('uid')].pos = fbv;
+    updateFBElements();
+}
+
+function magnetize(value, values) {
+    var sensibility = 8 / (zoom * fs);
+    var min = 100000;
+    var magnetValue;
+    if (values.length === 0) {
+        return value;
+    }
+
+    for (var i in values) {
+        var v = values[i];
+        var diff = Math.abs(v - value);
+        if (diff < min) {
+            min = diff;
+            magnetValue = v;
+        }
+    }
+
+    if (min > sensibility) {
+        return value;
+    }
+    return magnetValue;
+}
+
+function getLinksOfPage(p) {
+    let pages = [];
+    if (!single) {
+        if (p % 2 === 1) {
+            p--;
+        }
+        pages.push(p);
+        pages.push(p + 1);
+    } else {
+        pages.push(p);
+    }
+    let res = {};
+    $.each(LINKS, function (uid, link) {
+        if (pages.indexOf(parseInt(link.page)) >= 0) {
+            res[uid] = link;
+        }
+    });
+    return res;
+}
+
+function updateFBElements() {
+    $('[fb-ref]').each(function () {
+        var e = $(this);
+        var rect = $(this).attr('fb-ref');
+        var css = {};
+        $.each(dimensionProperties, function (k, dim) {
+            if ($(e).is('[fb-' + dim + ']')) {
+                var v = parseFloat($(e).attr('fb-' + dim));
+                if (dim === 'width' || dim === 'height') {
+                    css[dim] = v * (fs * zoom);
+                } else {
+                    css[dim] = fluidbookTo(v, dim, rect);
+                }
+            }
+        });
+        $(e).css(css);
+    });
+}
+
+function fluidbookTo(dim, name, rect) {
+    switch (rect) {
+        case 'editor':
+            rect = editorRect;
+            break;
+        case 'canvas':
+            rect = canvasRect;
+            break;
+    }
+    return fluidbookToGlobal(dim, name) - rect[name];
+}
+
+function stopMoveRuler() {
+    moveRuler();
+    if ($(movingRuler).hasClass('pending-delete')) {
+        deleteRuler($(movingRuler));
+    }
+    movingRuler = null;
+}
+
+function updateMousePosition(e) {
+    mx = e.pageX;
+    my = e.pageY;
+    updateMousePositionRulers();
+    moveRuler();
+}
+
+function updateMousePositionRulers() {
+    var rulersRect = $("#linkeditor-rulers").get(0).getBoundingClientRect();
+    var rx = mx - rulersRect.x;
+    var ry = my - rulersRect.y;
+    $("#linkeditor-ruler-x .info").css('left', rx);
+    $("#linkeditor-ruler-y .info").css('top', ry);
+
+    var rrect = $("#linkeditor-rulers").get(0).getBoundingClientRect();
+
+    if (mx - rrect.x < 0 || my - rrect.y < 0 || mx - rrect.x > rrect.width || my - rrect.y > rrect.height) {
+        $("#linkeditor-rulers .info").hide();
+        return;
+    }
+
+    var fb = globalToFluidbook(mx, my, true);
+    $("#linkeditor-ruler-y .info span").text(fb.y.toFixed(2));
+    $("#linkeditor-ruler-x .info span").text(fb.x.toFixed(2));
+    $("#linkeditor-rulers .info").css('display', 'inline-block');
+}
+
+function resetZoomDrag() {
+    $("#linkeditor-main").removeClass('grab').removeClass('grabbing');
+    if (zoom === 1) {
+        $("#linkeditor-canvas").scrollTo({left: 0, top: 0});
+    }
+    zoomdragging = false;
+}
+
+function moveZoomDrag(e) {
+    var deltaX = e.pageX - zoomdragging.x;
+    var deltaY = e.pageY - zoomdragging.y;
+    $("#linkeditor-canvas").scrollTo({
+        top: zoomdragging.scrollY - deltaY, left: zoomdragging.scrollX - deltaX
+    });
+    updateRulers();
+}
+
+function moveZoom(e) {
+    var rect = $("#linkeditor-zoom").get(0).getBoundingClientRect();
+    var lx = (e.originalEvent.pageX - rect.x) / rect.width;
+    var ly = (e.originalEvent.pageY - rect.y) / rect.height;
+    $("#linkeditor-canvas").scrollTo({left: pct(lx), top: pct(ly)});
+    updateRulers();
+}
+
+function pct(v) {
+    return (v * 100) + '%';
+}
+
+function setZoom(z) {
+    z = Math.max(1, Math.min(6, z));
+    if (z === zoom) {
+        return false;
+    }
+    zoom = z;
+    $("#linkeditor-canvas").attr('data-z', zoom);
+    $("#linkeditor-zoom").css({transform: 'scale(' + zoom + ')', overflow: 'visible'});
+
+    setTimeout(function () {
+        $("#linkeditor-zoom").css({overflow: 'hidden'});
+        if (zoom === 1) {
+            resetZoomDrag();
+        }
+        updateRulers();
+
+    }, 10);
+
+    return true;
+}
+
+function changePage(page) {
+    if (page === undefined) {
+        var h = window.location.hash;
+        if (h.length === 0) {
+            page = 0;
+        } else {
+            page = window.location.hash.substring(1);
+        }
+    }
+    page = parseInt(page);
+    if (page % 2 === 1 && !single) {
+        page--;
+    }
+    var normPage = Math.max(0, Math.min(page, FLUIDBOOK_DATA.settings.pages));
+    if (normPage === currentPage) {
+        return;
+    }
+    currentPage = normPage;
+
+    window.location.hash = '#' + currentPage;
+    clearLinksAndRulers();
+    loadPage(currentPage, 'left');
+    if (!single) {
+        loadPage(currentPage + 1, 'right');
+    }
+    $("#linkeditor-page-field input").val(currentPage);
+    updateRulersMagnetValues();
+    resize();
+    preloadPages();
+}
+
+function updateRulersMagnetValues() {
+    rulersMagnetValuesX = [0, pw, pw * 2];
+    rulersMagnetValuesY = [0, ph];
+    $.each(getLinksOfPage(currentPage), function (uid, link) {
+        const left = parseFloat(link.left);
+        const top = parseFloat(link.top);
+        const width = parseFloat(link.width);
+        const height = parseFloat(link.height);
+        rulersMagnetValuesX.push(left, left + width);
+        rulersMagnetValuesY.push(top, top + height);
+    });
+}
+
+// Convert global coordinates to fluidbook ones
+function globalToFluidbook(x, y, onePage) {
+    var res = _globalTo(x, y, fluidbookRect, 1 / (fs * zoom));
+    if (onePage) {
+        res.xside = 'left';
+        if (!single && res.x >= pw) {
+            res.xside = 'right';
+            res.x -= pw;
+        }
+    }
+    return res;
+}
+
+function fluidbookToGlobal(dim, name) {
+    return fluidbookRect[name] + (dim * fs * zoom);
+}
+
+function globalToCanvas(x, y) {
+    return _globalTo(x, y, canvasRect, 1);
+}
+
+function globalToEditor(x, y) {
+    return _globalTo(x, y, editorRect, 1);
+}
+
+function _globalTo(x, y, rect, multi) {
+    return {x: multi * (x - rect.x), y: multi * (y - rect.y)};
+}
+
+function loadPage(p, side) {
+    var container = $("#linkeditor-page-" + side);
+    $(container).attr('data-page', p);
+
+    if (p === 0 || p > FLUIDBOOK_DATA.settings.pages) {
+        $(container).html('');
+    } else {
+        _loadPage(p, container);
+    }
+
+    loadLinks(p, side);
+    loadRulers(p, side);
+}
+
+function preloadPages() {
+    let j = 1;
+    for (let i = Math.max(1, currentPage - 4); i <= Math.min(currentPage + 16, FLUIDBOOK_DATA.settings.pages); i++) {
+        if ($('.preload[data-page="' + i + '"]').length >= 1) {
+            continue;
+        }
+        setTimeout(function () {
+            var c = $('<div class="preload" data-page="i"></div>');
+            $("#linkeditor-preload").append(c);
+            _loadPage(i, c);
+        }, j * 500);
+        j++;
+    }
+}
+
+function _loadPage(p, container) {
+    var imageFormat = FLUIDBOOK_DATA.settings.imageFormat;
+    var c = '<div class="contents">';
+    if (rasterizePages.indexOf(p) >= 0) {
+        c += '<img draggable="false" src="raster_' + p + '.' + imageFormat + '" />';
+    } else if (vectorPages.indexOf(p) >= 0) {
+        c += '<img draggable="false" src="vector_' + p + '.svg" />';
+    } else {
+        c += '<img draggable="false" class="images" src="images_' + p + '.' + imageFormat + '" />';
+        c += '<img draggable="false" class="texts" src="texts_' + p + '.svg" />';
+    }
+    c += '</div>';
+    $(container).html(c);
+}
+
+function loadLinks(page, side) {
+    $.each(LINKS, function (uid, link) {
+        if (link.page != page) {
+            return;
+        }
+        if (side === 'right') {
+            link.left = parseInt(link.left) + pw;
+        }
+        addLink(link, side);
+    });
+}
+
+function addLink(link) {
+    if (link.uid === undefined) {
+        link.uid = generateUID();
+        LINKS[link.uid] = link;
+        updateRulersMagnetValues();
+        hasChanged();
+    }
+
+    var attrs = {};
+    $.each(link, function (k, v) {
+        if (dimensionProperties.indexOf(k) >= 0) {
+            attrs['fb-' + k] = v;
+        } else {
+            attrs['data-' + k] = v;
+        }
+    });
+
+    var e = $('<div class="link" fb-ref="editor"></div>');
+    $(e).attr(attrs);
+    $("#linkeditor-links").append(e);
+}
+
+function clearLinksAndRulers() {
+    $('#linkeditor-editor .ruler').remove();
+}
+
+function loadRulers(page, side) {
+    $.each(RULERS, function (uid, ruler) {
+        if (ruler.page != page) {
+            return;
+        }
+        addRuler(ruler.type, ruler.pos, ruler.uid);
+    });
+}
+
+
+function resize() {
+    resizeCanvas();
+    updateRulers();
+}
+
+function updateRulers() {
+    // Update rects
+    fluidbookRect = $("#linkeditor-fluidbook").get(0).getBoundingClientRect();
+
+    $("#linkeditor-ruler-y,#linkeditor-ruler-x").html('');
+    // Measure of visible fluidbook px at current zoom
+
+    var factor = fs / zoom;
+    var visible_w = (canvasRect.width / fs) / zoom;
+    var visible_h = (canvasRect.height / fs) / zoom;
+
+    // Find the best divider to have around 10 main divisions
+    var divider = 0;
+    for (var i in dividers) {
+        divider = dividers[i];
+        var v = visible_h / divider;
+        if (v <= 10) {
+            break;
+        }
+    }
+
+    var divisionSize = divider * fs * zoom;
+    // Draw vertical ruler
+    var margin = 100;
+    var nbDivisions = Math.floor(visible_h / divider);
+    var y0 = 16 + fluidbookRect.y - canvasRect.y;
+
+    var yruler = '<div class="info"><span>1234.12</span></div>';
+    for (var y = -margin; y <= nbDivisions + (margin * 2) + 1; y++) {
+        // Draw subdivision
+        var v = divider * y;
+        var ystart = y0 + (y * divisionSize);
+        if (ystart + divisionSize < 0 || ystart > canvasRect.height) {
+            continue;
+        }
+        yruler += '<div class="division" style="top:' + ystart + 'px;height:' + divisionSize + 'px;"><div class="value">' + Math.abs(v) + '</div>';
+        for (var i = 1; i <= 9; i++) {
+            yruler += '<div class="subdivision ' + (i === 5 ? ' middle' : '') + '" style="top:' + ((i * divisionSize) / 10) + 'px;"></div>';
+        }
+        yruler += '</div>';
+    }
+    $("#linkeditor-ruler-y").html(yruler);
+
+    // Draw horizontal ruler
+    nbDivisions = Math.floor(visible_w / divider);
+    var x0 = 16 + fluidbookRect.x - canvasRect.x;
+    var xruler = '<div class="info"><span></span></div>';
+
+    for (var x = -margin; x <= nbDivisions + (margin * 2) + 1; x++) {
+        // Draw subdivision
+        var v = divider * x;
+        var xstart = x0 + (x * divisionSize);
+        if (xstart + divisionSize < 0 || xstart > canvasRect.width) {
+            continue;
+        }
+        xruler += '<div class="division" style="left:' + xstart + 'px;width:' + divisionSize + 'px;"><div class="value">' + Math.abs(v) + '</div>';
+        for (var i = 1; i <= 9; i++) {
+            var cls = '';
+            if (i === 5) {
+                cls += ' middle';
+            }
+            xruler += '<div class="subdivision ' + cls + '" style="left:' + ((i * divisionSize) / 10) + 'px;"></div>';
+        }
+        xruler += '</div>';
+    }
+    // Draw right page horizontal ruler
+    if (!single) {
+        x0 = x0 + pw * fs * zoom;
+        for (var x = 0; x <= nbDivisions + margin + 1; x++) {
+            // Draw subdivision
+            var v = divider * x;
+            var xstart = x0 + (x * divisionSize);
+            if (xstart + divisionSize < 0 || xstart > canvasRect.width) {
+                continue;
+            }
+            xruler += '<div class="division" style="left:' + xstart + 'px;width:' + divisionSize + 'px;"><div class="value">' + Math.abs(v) + '</div>';
+            for (var i = 1; i <= 9; i++) {
+                var cls = '';
+                if (i === 5) {
+                    cls += ' middle';
+                }
+                xruler += '<div class="subdivision ' + cls + '" style="left:' + ((i * divisionSize) / 10) + 'px;"></div>';
+            }
+            xruler += '</div>';
+        }
+    }
+    $("#linkeditor-ruler-x").html(xruler);
+    updateFBElements()
+    updateMousePositionRulers();
+}
+
+function resizeCanvas() {
+    canvasRect = $("#linkeditor-canvas").get(0).getBoundingClientRect();
+    editorRect = $("#linkeditor-editor").get(0).getBoundingClientRect();
+    var aw = canvasRect.width - 30;
+    var ah = canvasRect.height - 30;
+    fs = Math.min(aw / fw, ah / fh);
+    var left = (canvasRect.width - fw * fs) / 2;
+    var top = (canvasRect.height - fh * fs) / 2;
+    $("#linkeditor-fluidbook").css({left: left, top: top, transform: 'scale(' + fs + ')'});
+}
+
+
+function splitPages(str) {
+    str = str.toString();
+    var res = [];
+    if (str == '') {
+        return res;
+    }
+    var pages = str.split(',');
+    for (var p in pages) {
+        res.push(parseInt(pages[p]));
+    }
+    return res;
+}
diff --git a/resources/linkeditor/style/links.sass b/resources/linkeditor/style/links.sass
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/resources/linkeditor/style/style.sass b/resources/linkeditor/style/style.sass
new file mode 100644 (file)
index 0000000..512a256
--- /dev/null
@@ -0,0 +1,566 @@
+*
+    margin: 0
+    padding: 0
+    box-sizing: border-box
+
+
+$font-size: 16px
+
+body
+    background-color: #ebecee
+    @media (prefers-color-scheme: dark)
+        background-color: #333
+
+
+img, .division, .info
+    user-select: none
+    user-drag: none
+
+
+body, #linkeditor, html
+    height: 100%
+    width: 100%
+    overflow: hidden
+
+
+#linkeditor
+    $sidebar-width: 40px
+    $rulers-size: 16px
+    white-space: nowrap
+    font-size: 0
+    overflow: hidden
+
+    aside, #linkeditor-main
+        display: inline-block
+        height: 100%
+        vertical-align: top
+        text-align: left
+
+
+    aside
+        width: $sidebar-width
+        background-color: #EBECEE
+        @media (prefers-color-scheme: dark)
+            background-color: #333
+
+
+    #linkeditor-main
+        $toolbar-height: 40px
+
+        width: calc(100% - $sidebar-width - $sidebar-width)
+
+        &.grab
+            cursor: grab
+
+
+        &.grabbing
+            cursor: grabbing
+
+
+        #linkeditor-toolbar
+
+            $toolbar-color: #5d5d5d
+            $toolbar-color-dark: #bbb
+            background-color: #dbdddf
+
+            @media (prefers-color-scheme: dark)
+                background-color: #444
+
+            color: $toolbar-color
+            @media (prefers-color-scheme: dark)
+                color: $toolbar-color-dark
+
+            height: $toolbar-height
+            padding: 5px
+
+            nav
+                padding: 2px
+                display: inline-block
+                height: 26px
+                vertical-align: top
+                width: 33%
+
+                &#linkeditor-toolbar-center
+                    text-align: center
+
+
+                &#linkeditor-toolbar-right
+
+
+            div
+                display: inline-block
+                font-size: $font-size
+
+
+            .separator
+                width: 0
+                height: 26px
+                margin: 0 2px
+                border-left: 1px solid $toolbar-color
+
+
+            #linkeditor-page-field
+                padding: 2px 10px
+                background-color: #fff
+                @media (prefers-color-scheme: dark)
+                    background-color: #000
+                    border-color: #333
+
+                border: 1px solid #ccc
+                border-radius: 5px
+                cursor: text
+                font-size: 13px
+                position: relative
+                top: -9px
+                user-select: none
+                margin: 0 8px
+                font-weight: 600
+
+
+                input
+                    vertical-align: top
+                    text-align: right
+                    border: 0
+                    background-color: transparent
+                    width: 20px
+                    color: $toolbar-color
+                    @media (prefers-color-scheme: dark)
+                        color: $toolbar-color-dark
+
+                    font-size: 13px
+                    appearance: textfield
+
+                    &::-webkit-outer-adjust-hue-button, &::-webkit-inner-adjust-hue-button
+                        -webkit-appearance: none
+                        margin: 0
+
+
+                    font-weight: 600
+                    position: relative
+
+
+                    &:hover, &:focus
+                        outline: 0
+                        border: 0
+
+
+            [data-icon]
+                display: inline-block
+                vertical-align: top
+                height: 26px
+                min-width: 26px
+                padding: 3px
+                border-radius: 5px
+                margin: 0 3px
+                text-align: center
+                color: $toolbar-color
+                @media (prefers-color-scheme: dark)
+                    color: $toolbar-color-dark
+
+
+                &:hover, &.hover
+                    background-color: #fff
+                    @media (prefers-color-scheme: dark)
+                        background-color: #000
+
+
+                &.arrow
+                    padding: 1px
+
+                    svg
+                        height: 16px
+
+
+                svg
+                    position: relative
+                    top: 1px
+                    height: 18px
+                    width: auto
+
+
+        #linkeditor-editor
+            position: relative
+            height: calc( 100% - $toolbar-height)
+            width: 100%
+            overflow: hidden
+
+            $ruler-margin: 2px
+
+            #linkeditor-links
+                .link
+                    position: absolute
+                    outline: 1px solid currentColor
+                    cursor: cell
+
+                    &.selected
+                        .corners
+                            visibility: visible
+
+
+                    .corners
+                        visibility: hidden
+                        position: absolute
+                        top: 0
+                        left: 0
+                        width: 100%
+                        height: 100%
+
+                        > div
+                            position: absolute
+                            outline: 1px solid currentColor
+                            background-color: #fff
+                            width: 8px
+                            height: 8px
+
+                            &.nw
+                                cursor: nw-resize
+
+
+                            &.n
+                                cursor: n-resize
+
+
+                            &.ne
+                                cursor: ne-resize
+
+
+                            &.e
+                                cursor: e-resize
+
+
+                            &.se
+                                cursor: se-resize
+
+
+                            &.s
+                                cursor: s-resize
+
+
+                            &.sw
+                                cursor: sw-resize
+
+
+                            &.w
+                                cursor: w-resize
+
+
+                            &.n, &.nw, &.ne
+                                top: -4px
+
+
+                            &.e, &.w
+                                top: calc(50% - 4px)
+
+
+                            &.sw, &.s, &.se
+                                bottom: -4px
+
+
+                            &.nw, &.w, &.sw
+                                left: -4px
+
+
+                            &.ne, &.e, &.se
+                                right: -4px
+
+
+                            &.n, &.s
+                                left: calc(50% - 4px)
+
+
+                position: relative
+                z-index: 500
+
+
+            .ruler
+                position: absolute
+                top: 0
+                left: 0
+                z-index: 600
+                border-width: 0
+                border-color: #0f0
+                border-style: solid
+
+                &:after
+                    position: absolute
+                    content: ""
+                    display: block
+                    height: 100%
+                    width: 100%
+
+
+                &.pending-delete
+                    border-color: #f00 !important
+                    z-index: 1100
+
+
+                &:hover
+                    border-color: #0ff
+
+
+                &[data-axis="x"]
+                    width: 0px
+                    height: calc( 100% - $rulers-size)
+                    border-left-width: 1px
+                    cursor: col-resize
+                    top: $rulers-size
+
+                    &:after
+                        left: $ruler-margin*-1
+                        width: $ruler-margin*2
+
+
+                &[data-axis="y"]
+                    border-bottom-width: 1px
+                    height: 0px
+                    width: calc( 100% - $rulers-size)
+                    left: $rulers-size
+
+                    &:after
+                        top: $ruler-margin*-1
+                        height: $ruler-margin*2
+                        cursor: row-resize
+
+
+            #linkeditor-rulers
+                $rulers-color: #333
+                $rulers-color-dark: #eee
+
+                @media (prefers-color-scheme: dark)
+                    color: $rulers-color-dark
+
+
+                color: $rulers-color
+                position: absolute
+                top: 0px
+                left: 0px
+                width: 100%
+                height: 100%
+
+                #linkeditor-ruler-corner
+                    position: absolute
+                    top: 0px
+                    left: 0px
+                    width: $rulers-size
+                    height: $rulers-size
+                    z-index: 5
+                    background-color: #aaa
+                    @media (prefers-color-scheme: dark)
+                        background-color: #666
+
+
+                .ruler-bar
+                    overflow: hidden
+                    position: absolute
+                    left: 0
+                    top: 0
+                    z-index: 1000
+
+                    .info
+                        position: absolute
+                        top: 0
+                        left: 0
+                        z-index: 3
+                        font-size: 12px
+                        line-height: 8px
+                        display: none
+
+                        span
+                            display: block
+                            position: absolute
+                            top: 0
+                            left: 0
+                            background-color: #fff
+                            color: #000
+                            @media (prefers-color-scheme: dark)
+                                background-color: #000
+                                color: #fff
+
+                            padding: 3px
+
+
+                    .division
+                        pointer-events: none
+                        position: absolute
+                        background: #fff
+                        @media (prefers-color-scheme: dark)
+                            background-color: #000
+
+
+                        .value
+                            position: absolute
+                            font-size: 12px
+
+
+                        .subdivision
+                            position: absolute
+
+
+                #linkeditor-ruler-x
+                    height: $rulers-size
+                    width: 100%
+
+                    .info
+                        height: $rulers-size
+                        border-left: 1px dotted $rulers-color
+                        @media (prefers-color-scheme: dark)
+                            border-color: $rulers-color-dark
+
+
+                    .division, .subdivision
+                        width: 0px
+                        border-left: 1px solid $rulers-color
+                        @media (prefers-color-scheme: dark)
+                            border-color: $rulers-color-dark
+
+
+                    .division
+                        height: $rulers-size
+
+                        .value
+                            bottom: 0px
+                            left: 3px
+
+
+                    .subdivision
+                        bottom: 0
+                        height: 2px
+
+                        &.middle
+                            height: 5px
+
+
+                #linkeditor-ruler-y
+                    width: $rulers-size
+                    height: 100%
+
+                    .info
+                        width: $rulers-size
+                        border-bottom: 1px dotted $rulers-color
+                        @media (prefers-color-scheme: dark)
+                            border-color: $rulers-color-dark
+
+
+                        span
+                            transform-origin: 0 0
+                            transform: rotate(270deg)
+
+
+                    .division, .subdivision
+                        height: 0px
+                        border-bottom: 1px solid $rulers-color
+                        @media (prefers-color-scheme: dark)
+                            border-color: $rulers-color-dark
+
+
+                    .division
+                        width: $rulers-size
+
+                        .value
+                            text-align: center
+                            max-width: $rulers-size
+                            word-wrap: break-word
+                            white-space: normal
+                            line-height: 10px
+                            letter-spacing: 30px
+                            top: 3px
+                            left: 3px
+
+
+                        .subdivision
+                            right: 0
+                            width: 2px
+
+                            &.middle
+                                width: 5px
+
+
+            #linkeditor-zoom
+                width: 100%
+                height: 100%
+                max-width: 100%
+                max-height: 100%
+                min-height: 100%
+                min-width: 100%
+                transform-origin: 0 0
+                overflow: hidden
+
+
+            #linkeditor-canvas
+                background-color: #505050
+                @media (prefers-color-scheme: dark)
+                    background-color: #222
+
+
+                position: relative
+                z-index: 1
+                top: $rulers-size
+                left: $rulers-size
+                height: calc( 100% - $rulers-size)
+                max-height: calc( 100% - $rulers-size)
+                width: calc( 100% - $rulers-size)
+                max-width: calc( 100% - $rulers-size)
+                overflow: auto
+
+                &::-webkit-scrollbar
+                    width: 6px
+                    height: 6px
+
+
+                &::-webkit-scrollbar-track
+                    background: transparent
+
+                    &:hover
+                        background-color: #000
+
+
+                &::-webkit-scrollbar-thumb
+                    background-color: #aaa
+                    border: 1px solid #333
+                    border-radius: 20px
+
+
+                #linkeditor-fluidbook
+                    transform-origin: 0 0
+                    position: absolute
+                    top: 0
+                    left: 0
+
+                    .linkeditor-page
+                        position: absolute
+                        top: 0px
+                        left: 0px
+                        background-color: rgba(255, 255, 255, 0.2)
+                        @media (prefers-color-scheme: dark)
+                            background-color: rgba(0, 0, 0, 0.2)
+
+
+                        .contents
+                            background-color: #fff
+                            position: absolute
+                            top: 0
+                            left: 0
+                            width: 100%
+                            height: 100%
+
+                            img
+                                display: block
+                                position: absolute
+                                top: 0
+                                left: 0
+                                width: 100%
+                                height: auto
+                                z-index: 1
+
+                                &.texts
+                                    z-index: 2
+
+
+                        &#linkeditor-page-right
+                            .simple &
+                                display: none
+
+
+#linkeditor-preload
+    display: none
+
diff --git a/resources/linkeditor/webpack.mix.js b/resources/linkeditor/webpack.mix.js
new file mode 100644 (file)
index 0000000..423b5ef
--- /dev/null
@@ -0,0 +1,4 @@
+const mix = require("laravel-mix");
+
+mix.setPublicPath('public/packages/linkeditor').js('resources/linkeditor/js/linkeditor.js', 'js')
+    .sass('resources/linkeditor/style/style.sass', 'css').options({processCssUrls: false}).version();
index a74e145bf6cf86043f1729c33547b8b7eeb28911..49f809b891213aba8b8d402e0985a2bebd350cab 100644 (file)
         var LINKS =@json($links);
         var RULERS =@json($rulers);
     </script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.11.6/umd/popper.min.js"
-            integrity="sha512-6UofPqm0QupIL0kzS/UIzekR73/luZdC6i/kXDbWnLOJoqwklBK6519iUnShaYceJ0y4FaiPtX/hRnV/X/xlUQ=="
-            crossorigin="anonymous" referrerpolicy="no-referrer"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/tippy.js/6.3.7/tippy.umd.min.js"
-            integrity="sha512-2TtfktSlvvPzopzBA49C+MX6sdc7ykHGbBQUTH8Vk78YpkXVD5r6vrNU+nOmhhl1MyTWdVfxXdZfyFsvBvOllw=="
-            crossorigin="anonymous" referrerpolicy="no-referrer"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-scrollTo/2.1.3/jquery.scrollTo.min.js"
-            integrity="sha512-PsJ1f4lw0Jrga4wbDOvdWs9DFl88C1vlcH2VQYqgljHBmzmqtGivUkzRHWx2ZxFlnysKUcROqLeuOpYh9q4YNg=="
-            crossorigin="anonymous" referrerpolicy="no-referrer"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/keymaster/1.6.1/keymaster.min.js"
-            integrity="sha512-BCAhaaB0/bmrMBa8RVw/Cgqg5OOuQ+kZPWfRL7RlRb/LLfQMSuxDZ48TNxmwk3dFs+R4diG6yVsXKFNELe6trw=="
-            crossorigin="anonymous" referrerpolicy="no-referrer"></script>
     <script
-        src="{{backpack_url("packages/fluidbook/toolbox/js/linkeditor.js").'?v='.filemtime(public_path('packages/fluidbook/toolbox/js/linkeditor.js'))}}"></script>
+        src="/packages/linkeditor/js/linkeditor.js?v={{filemtime(public_path('packages/linkeditor/js/linkeditor.js'))}}"></script>
 @endpush
 @push('after_styles')
     <style>
         @endforeach
     </style>
     <link rel="stylesheet"
-          href="{{backpack_url("packages/fluidbook/toolbox/css/linkeditor.css").'?v='.filemtime(public_path('packages/fluidbook/toolbox/css/linkeditor.css'))}}"/>
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tippy.js/6.3.7/tippy.min.css"
-          integrity="sha512-HbPh+j4V7pXprvQMt2dtmK/zCEsUeZWYXRln4sOwmoyHPQAPqy/k9lIquKUyKNpNbDGAY06UdiDHcEkBc72yCQ=="
-          crossorigin="anonymous" referrerpolicy="no-referrer"/>
+          href="/packages/linkeditor/css/style.css?v={{filemtime(public_path('packages/linkeditor/css/style.css'))}}"/>
 @endpush
index 43fe5479255a3583efdfb7c6af9658c1961f9ee8..ceeb091fc451ac8c5c59c42e9f8d5689170b26d7 100644 (file)
@@ -4,3 +4,4 @@ npm update
 npm run elearningmedia-prod
 npm run elearningpackage-prod
 npm run quiz-prod
+npm run linkeditor-prod