]> BookStack Code Mirror - bookstack/commitdiff
Merge pull request #4252 from BookStackApp/cli_update_2
authorDan Brown <redacted>
Mon, 22 May 2023 19:45:32 +0000 (20:45 +0100)
committerGitHub <redacted>
Mon, 22 May 2023 19:45:32 +0000 (20:45 +0100)
Updated System CLI

resources/js/code/setups.js
resources/js/components/dropzone.js
resources/js/services/dom.js
resources/views/attachments/manager-list.blade.php
resources/views/attachments/manager.blade.php
resources/views/pages/parts/image-manager.blade.php

index 52b9cc199a5b8870eb80e30e11d408441c7e57bc..270d58274347d27a18475a3f97c56c43719e573e 100644 (file)
@@ -6,7 +6,7 @@ import {bracketMatching} from '@codemirror/language';
 import {
     defaultKeymap, history, historyKeymap, indentWithTab,
 } from '@codemirror/commands';
-import {EditorState} from '@codemirror/state';
+import {Compartment, EditorState} from '@codemirror/state';
 import {getTheme} from './themes';
 
 /**
@@ -17,12 +17,37 @@ function common(parentEl) {
     return [
         getTheme(parentEl),
         lineNumbers(),
-        highlightActiveLineGutter(),
         drawSelection(),
         dropCursor(),
         bracketMatching(),
         rectangularSelection(),
-        highlightActiveLine(),
+    ];
+}
+
+/**
+ * @returns {({extension: Extension}|readonly Extension[])[]}
+ */
+function getDynamicActiveLineHighlighter() {
+    const highlightingCompartment = new Compartment();
+    const domEvents = {
+        focus(event, view) {
+            view.dispatch({
+                effects: highlightingCompartment.reconfigure([
+                    highlightActiveLineGutter(),
+                    highlightActiveLine(),
+                ]),
+            });
+        },
+        blur(event, view) {
+            view.dispatch({
+                effects: highlightingCompartment.reconfigure([]),
+            });
+        },
+    };
+
+    return [
+        highlightingCompartment.of([]),
+        EditorView.domEventHandlers(domEvents),
     ];
 }
 
@@ -33,6 +58,7 @@ function common(parentEl) {
 export function viewerExtensions(parentEl) {
     return [
         ...common(parentEl),
+        getDynamicActiveLineHighlighter(),
         keymap.of([
             ...defaultKeymap,
         ]),
@@ -47,6 +73,8 @@ export function viewerExtensions(parentEl) {
 export function editorExtensions(parentEl) {
     return [
         ...common(parentEl),
+        highlightActiveLineGutter(),
+        highlightActiveLine(),
         history(),
         keymap.of([
             ...defaultKeymap,
index 1fdf824ae72a38e520aaf170c465e114e96d7960..2b8b35081188f8754a744b5fd412a86076224670 100644 (file)
@@ -21,6 +21,7 @@ export class Dropzone extends Component {
         this.uploadLimitMessage = this.$opts.uploadLimitMessage;
         this.zoneText = this.$opts.zoneText;
         this.fileAcceptTypes = this.$opts.fileAccept;
+        this.allowMultiple = this.$opts.allowMultiple === 'true';
 
         this.setupListeners();
     }
@@ -83,7 +84,12 @@ export class Dropzone extends Component {
     }
 
     manualSelectHandler() {
-        const input = elem('input', {type: 'file', style: 'left: -400px; visibility: hidden; position: fixed;', accept: this.fileAcceptTypes});
+        const input = elem('input', {
+            type: 'file',
+            style: 'left: -400px; visibility: hidden; position: fixed;',
+            accept: this.fileAcceptTypes,
+            multiple: this.allowMultiple ? '' : null,
+        });
         this.container.append(input);
         input.click();
         input.addEventListener('change', () => {
index 78685574850643946fa8b305e479d3f3bc69b9df..d764a2ebe511f19cfeb0f49da1edaf91b833315d 100644 (file)
@@ -10,7 +10,11 @@ export function elem(tagName, attrs = {}, children = []) {
     const el = document.createElement(tagName);
 
     for (const [key, val] of Object.entries(attrs)) {
-        el.setAttribute(key, val);
+        if (val === null) {
+            el.removeAttribute(key);
+        } else {
+            el.setAttribute(key, val);
+        }
     }
 
     for (const child of children) {
index f1dfe2b821a62cc4929f6a9793f967b0487b94d5..342b46dcad72609732bf51966f899d66e1c81bce 100644 (file)
@@ -1,4 +1,5 @@
-<div component="sortable-list" option:sortable-list:handle-selector=".handle">
+<div component="sortable-list"
+     option:sortable-list:handle-selector=".handle, a">
     @foreach($attachments as $attachment)
         <div component="ajax-delete-row"
              option:ajax-delete-row:url="{{ url('/attachments/' . $attachment->id) }}"
index 4526172d4db63b2d62ca7a362bfa4ea131d4b2aa..6cbfd1aae091eb0491f84266b660b0ccb237931d 100644 (file)
@@ -14,6 +14,7 @@
          option:dropzone:upload-limit-message="{{ trans('errors.server_upload_limit') }}"
          option:dropzone:zone-text="{{ trans('entities.attachments_dropzone') }}"
          option:dropzone:file-accept="*"
+         option:dropzone:allow-multiple="true"
          class="px-l files">
 
         <div refs="attachments@list-container dropzone@drop-target" class="relative">
index 0594c67e807d9ecf903da2009bd8b804c0e1440a..da64d681c5283df580367b6ecb38643ec6cfa9ca 100644 (file)
@@ -6,6 +6,7 @@
      option:dropzone:upload-limit-message="{{ trans('errors.server_upload_limit') }}"
      option:dropzone:zone-text="{{ trans('components.image_dropzone_drop') }}"
      option:dropzone:file-accept="image/*"
+     option:dropzone:allow-multiple="true"
      option:image-manager:uploaded-to="{{ $uploaded_to ?? 0 }}"
      class="image-manager">