mirror of
https://github.com/mickael-kerjean/filestash
synced 2025-12-06 08:22:24 +01:00
fix (plg_editor_onlyoffice): broken plugin after migration
This commit is contained in:
parent
be716e6cf9
commit
f5753e8de7
4 changed files with 197 additions and 99 deletions
|
|
@ -76,7 +76,9 @@ export function createRender($parent) {
|
|||
if (!($parent instanceof window.HTMLElement)) throw new Error(`assert failed: createRender on non HTMLElement`);
|
||||
return ($view) => {
|
||||
if ($view instanceof window.HTMLElement) $parent.replaceChildren($view);
|
||||
else if ($view instanceof window.DocumentFragment) $parent.replaceChildren($view);
|
||||
else throw new Error(`Unknown view type: ${typeof $view}`);
|
||||
return $parent;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,8 @@
|
|||
margin-left: -3px;
|
||||
margin-right: -3px;
|
||||
}
|
||||
[is="component_submenu"] .component_submenu .action.right:hover{
|
||||
[is="component_submenu"] .component_submenu .action.right:hover,
|
||||
[is="component_submenu"] .component_submenu .action.right.hover{
|
||||
background: var(--border);
|
||||
}
|
||||
[is="component_submenu"] .component_submenu .action button:hover {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { onDestroy, createElement, createFragment, nop } from "../../lib/skeleton/index.js";
|
||||
import { createElement, createRender, createFragment, onDestroy, nop } from "../../lib/skeleton/index.js";
|
||||
import rxjs, { effect, applyMutation, onClick, preventDefault } from "../../lib/rx.js";
|
||||
import { animate } from "../../lib/animate.js";
|
||||
import { loadCSS } from "../../helpers/loader.js";
|
||||
|
|
@ -24,81 +24,56 @@ const modalOpt = {
|
|||
export default async function(render) {
|
||||
const $page = createElement(`
|
||||
<div class="component_submenu container">
|
||||
<div class="action left no-select" style="margin-left:2px;"></div>
|
||||
<div class="action right no-select" style="margin-right:2px;"></div>
|
||||
</div>
|
||||
`);
|
||||
render($page);
|
||||
onDestroy(() => clearSelection());
|
||||
|
||||
// feature1: layout base case
|
||||
const $scroll = $page.closest(".scroll-y");
|
||||
componentLeft(createRender(qs($page, ".action.left")), { $scroll });
|
||||
componentRight(createRender(qs($page, ".action.right")));
|
||||
|
||||
effect(rxjs.fromEvent($scroll, "scroll", { passive: true }).pipe(
|
||||
rxjs.map((e) => e.target.scrollTop > 30),
|
||||
rxjs.distinctUntilChanged(),
|
||||
rxjs.startWith(false),
|
||||
rxjs.tap((scrolling) => scrolling
|
||||
? $scroll.classList.add("scrolling")
|
||||
: $scroll.classList.remove("scrolling")),
|
||||
));
|
||||
}
|
||||
|
||||
function componentLeft(render, { $scroll }) {
|
||||
effect(getSelection$().pipe(
|
||||
rxjs.filter((selections) => selections.length === 0),
|
||||
rxjs.map(() => createFragment(`
|
||||
<div class="action left no-select" style="margin-left:2px;">
|
||||
<button data-action="new-file">New File</button>
|
||||
<button data-action="new-folder">New Folder</button>
|
||||
</div>
|
||||
<div class="action right no-select" style="margin-right:2px;">
|
||||
<button data-action="search">
|
||||
<input style="
|
||||
display: none;
|
||||
background: transparent;
|
||||
border: none;
|
||||
border-bottom: 2px solid #e2e2e2;
|
||||
margin-right: 10px;
|
||||
color: var(--color);
|
||||
font-size: 0.8rem;
|
||||
">
|
||||
<img class="component_icon" draggable="false" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj4KICA8cGF0aCBzdHlsZT0iZmlsbDojNjI2NDY5O2ZpbGwtb3BhY2l0eToxIiBkPSJNNTA1IDQ0Mi43TDQwNS4zIDM0M2MtNC41LTQuNS0xMC42LTctMTctN0gzNzJjMjcuNi0zNS4zIDQ0LTc5LjcgNDQtMTI4QzQxNiA5My4xIDMyMi45IDAgMjA4IDBTMCA5My4xIDAgMjA4czkzLjEgMjA4IDIwOCAyMDhjNDguMyAwIDkyLjctMTYuNCAxMjgtNDR2MTYuM2MwIDYuNCAyLjUgMTIuNSA3IDE3bDk5LjcgOTkuN2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMGwyOC4zLTI4LjNjOS40LTkuNCA5LjQtMjQuNi4xLTM0ek0yMDggMzM2Yy03MC43IDAtMTI4LTU3LjItMTI4LTEyOCAwLTcwLjcgNTcuMi0xMjggMTI4LTEyOCA3MC43IDAgMTI4IDU3LjIgMTI4IDEyOCAwIDcwLjctNTcuMiAxMjgtMTI4IDEyOHoiIC8+Cjwvc3ZnPgo=" alt="search" />
|
||||
</button>
|
||||
<button data-action="view">
|
||||
<img class="component_icon" draggable="false" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj4KICA8cGF0aCBzdHlsZT0iZmlsbDojNjI2NDY5O2ZpbGwtb3BhY2l0eToxIiBkPSJtIDEzMy4zMzMsNTYgdiA2NCBjIDAsMTMuMjU1IC0xMC43NDUsMjQgLTI0LDI0IEggMjQgQyAxMC43NDUsMTQ0IDAsMTMzLjI1NSAwLDEyMCBWIDU2IEMgMCw0Mi43NDUgMTAuNzQ1LDMyIDI0LDMyIGggODUuMzMzIGMgMTMuMjU1LDAgMjQsMTAuNzQ1IDI0LDI0IHogbSAzNzkuMzM0LDIzMiB2IC02NCBjIDAsLTEzLjI1NSAtMTAuNzQ1LC0yNCAtMjQsLTI0IEggMjEzLjMzMyBjIC0xMy4yNTUsMCAtMjQsMTAuNzQ1IC0yNCwyNCB2IDY0IGMgMCwxMy4yNTUgMTAuNzQ1LDI0IDI0LDI0IGggMjc1LjMzMyBjIDEzLjI1NiwwIDI0LjAwMSwtMTAuNzQ1IDI0LjAwMSwtMjQgeiBtIDAsLTE2OCBWIDU2IGMgMCwtMTMuMjU1IC0xMC43NDUsLTI0IC0yNCwtMjQgSCAyMTMuMzMzIGMgLTEzLjI1NSwwIC0yNCwxMC43NDUgLTI0LDI0IHYgNjQgYyAwLDEzLjI1NSAxMC43NDUsMjQgMjQsMjQgaCAyNzUuMzMzIGMgMTMuMjU2LDAgMjQuMDAxLC0xMC43NDUgMjQuMDAxLC0yNCB6IE0gMTA5LjMzMywyMDAgSCAyNCBDIDEwLjc0NSwyMDAgMCwyMTAuNzQ1IDAsMjI0IHYgNjQgYyAwLDEzLjI1NSAxMC43NDUsMjQgMjQsMjQgaCA4NS4zMzMgYyAxMy4yNTUsMCAyNCwtMTAuNzQ1IDI0LC0yNCB2IC02NCBjIDAsLTEzLjI1NSAtMTAuNzQ1LC0yNCAtMjQsLTI0IHogTSAwLDM5MiB2IDY0IGMgMCwxMy4yNTUgMTAuNzQ1LDI0IDI0LDI0IGggODUuMzMzIGMgMTMuMjU1LDAgMjQsLTEwLjc0NSAyNCwtMjQgdiAtNjQgYyAwLC0xMy4yNTUgLTEwLjc0NSwtMjQgLTI0LC0yNCBIIDI0IEMgMTAuNzQ1LDM2OCAwLDM3OC43NDUgMCwzOTIgWiBtIDE4OS4zMzMsMCB2IDY0IGMgMCwxMy4yNTUgMTAuNzQ1LDI0IDI0LDI0IGggMjc1LjMzMyBjIDEzLjI1NSwwIDI0LC0xMC43NDUgMjQsLTI0IHYgLTY0IGMgMCwtMTMuMjU1IC0xMC43NDUsLTI0IC0yNCwtMjQgSCAyMTMuMzMzIGMgLTEzLjI1NSwwIC0yNCwxMC43NDUgLTI0LDI0IHoiIC8+Cjwvc3ZnPgo=" alt="list" />
|
||||
</button>
|
||||
<button>
|
||||
<img class="component_icon" draggable="false" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgNTEyIj4KICA8cGF0aCBzdHlsZT0iZmlsbDojNjI2NDY5O2ZpbGwtb3BhY2l0eToxIiBkPSJNNDEgMjg4aDIzOGMyMS40IDAgMzIuMSAyNS45IDE3IDQxTDE3NyA0NDhjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwTDI0IDMyOWMtMTUuMS0xNS4xLTQuNC00MSAxNy00MXptMjU1LTEwNUwxNzcgNjRjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwTDI0IDE4M2MtMTUuMSAxNS4xLTQuNCA0MSAxNyA0MWgyMzhjMjEuNCAwIDMyLjEtMjUuOSAxNy00MXoiIC8+Cjwvc3ZnPgo=" alt="sort" />
|
||||
</button>
|
||||
<!--<div is="component-dropdown"></div>-->
|
||||
</div>
|
||||
`)),
|
||||
applyMutation($page, "replaceChildren"),
|
||||
rxjs.mergeMap(() => rxjs.merge(
|
||||
rxjs.merge(
|
||||
onClick(qs($page, `[data-action="new-file"]`)).pipe(rxjs.mapTo("NEW_FILE")),
|
||||
onClick(qs($page, `[data-action="new-folder"]`)).pipe(rxjs.mapTo("NEW_FOLDER")),
|
||||
).pipe(rxjs.mergeMap((actionName) => {
|
||||
$scroll.scrollTo({top: 0, behavior: "smooth"});
|
||||
setAction(actionName);
|
||||
return rxjs.EMPTY;
|
||||
})),
|
||||
onClick(qs($page, `[data-action="search"]`)).pipe(rxjs.mapTo("SEARCH")),
|
||||
onClick(qs($page, `[data-action="view"]`)).pipe(rxjs.mapTo("VIEW")),
|
||||
rxjs.map(() => render(createFragment(`
|
||||
<button data-action="new-file">New File</button>
|
||||
<button data-action="new-folder">New Folder</button>
|
||||
`))),
|
||||
rxjs.mergeMap(($page) => rxjs.merge(
|
||||
onClick(qs($page, `[data-action="new-file"]`)).pipe(rxjs.mapTo("NEW_FILE")),
|
||||
onClick(qs($page, `[data-action="new-folder"]`)).pipe(rxjs.mapTo("NEW_FOLDER")),
|
||||
)),
|
||||
rxjs.mergeMap((actionName) => {
|
||||
$scroll.scrollTo({top: 0, behavior: "smooth"});
|
||||
setAction(actionName);
|
||||
return rxjs.EMPTY;
|
||||
}),
|
||||
));
|
||||
|
||||
// feature2: update when selection is preset
|
||||
effect(getSelection$().pipe(
|
||||
rxjs.filter((selections) => selections.length > 0),
|
||||
rxjs.tap((selections) => selections.length === 1 && animate($page)),
|
||||
rxjs.map((selections) => createFragment(`
|
||||
<div class="action left no-select">
|
||||
<button data-action="download">Download</button>
|
||||
<button data-action="share">Share</button>
|
||||
<button data-action="embed">Embed</button>
|
||||
<button data-action="tag">Tag</button>
|
||||
<button data-action="rename">Rename</button>
|
||||
<button data-action="delete">Delete</button>
|
||||
</div>
|
||||
<div class="action right no-select">
|
||||
<button data-bind="clear">
|
||||
${selections.length} <component-icon name="close"></component-icon>
|
||||
</button>
|
||||
</div>
|
||||
`)),
|
||||
applyMutation($page, "replaceChildren"),
|
||||
rxjs.mergeMap(() => rxjs.merge(
|
||||
onClick(qs($page, `[data-bind="clear"]`)).pipe(
|
||||
rxjs.tap(() => clearSelection()),
|
||||
rxjs.mergeMap(() => rxjs.EMPTY),
|
||||
),
|
||||
rxjs.filter((selections) => selections.length === 1),
|
||||
rxjs.map(() => render(createFragment(`
|
||||
<button data-action="download">Download</button>
|
||||
<button data-action="share">Share</button>
|
||||
<button data-action="embed">Embed</button>
|
||||
<button data-action="tag">Tag</button>
|
||||
<button data-action="rename">Rename</button>
|
||||
<button data-action="delete">Delete</button>
|
||||
`))),
|
||||
rxjs.mergeMap(($page) => rxjs.merge(
|
||||
onClick(qs($page, `[data-action="download"]`)).pipe(
|
||||
rxjs.mergeMap(() => rxjs.EMPTY),
|
||||
),
|
||||
|
|
@ -120,18 +95,125 @@ export default async function(render) {
|
|||
)),
|
||||
));
|
||||
|
||||
// feature3: effect on scroll
|
||||
const $scroll = $page.closest(".scroll-y");
|
||||
effect(rxjs.fromEvent($scroll, "scroll", { passive: true }).pipe(
|
||||
rxjs.map((e) => e.target.scrollTop > 30),
|
||||
rxjs.distinctUntilChanged(),
|
||||
rxjs.startWith(false),
|
||||
rxjs.tap((scrolling) => scrolling
|
||||
? $scroll.classList.add("scrolling")
|
||||
: $scroll.classList.remove("scrolling")),
|
||||
effect(getSelection$().pipe(
|
||||
rxjs.filter((selections) => selections.length > 1),
|
||||
rxjs.map(() => render(createFragment(`
|
||||
<button data-action="download">Download</button>
|
||||
<button data-action="delete">Delete</button>
|
||||
`))),
|
||||
rxjs.mergeMap(($page) => rxjs.merge(
|
||||
onClick(qs($page, `[data-action="download"]`)).pipe(
|
||||
rxjs.mergeMap(() => rxjs.EMPTY),
|
||||
),
|
||||
onClick(qs($page, `[data-action="delete"]`)).pipe(rxjs.tap(() => {
|
||||
componentDelete(createModal(modalOpt));
|
||||
})),
|
||||
)),
|
||||
));
|
||||
}
|
||||
|
||||
export function init() {
|
||||
return loadCSS(import.meta.url, "./ctrl_submenu.css");
|
||||
function componentRight(render) {
|
||||
const ICONS = {
|
||||
LIST_VIEW: "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj4KICA8cGF0aCBzdHlsZT0iZmlsbDojNjI2NDY5O2ZpbGwtb3BhY2l0eToxIiBkPSJtIDEzMy4zMzMsNTYgdiA2NCBjIDAsMTMuMjU1IC0xMC43NDUsMjQgLTI0LDI0IEggMjQgQyAxMC43NDUsMTQ0IDAsMTMzLjI1NSAwLDEyMCBWIDU2IEMgMCw0Mi43NDUgMTAuNzQ1LDMyIDI0LDMyIGggODUuMzMzIGMgMTMuMjU1LDAgMjQsMTAuNzQ1IDI0LDI0IHogbSAzNzkuMzM0LDIzMiB2IC02NCBjIDAsLTEzLjI1NSAtMTAuNzQ1LC0yNCAtMjQsLTI0IEggMjEzLjMzMyBjIC0xMy4yNTUsMCAtMjQsMTAuNzQ1IC0yNCwyNCB2IDY0IGMgMCwxMy4yNTUgMTAuNzQ1LDI0IDI0LDI0IGggMjc1LjMzMyBjIDEzLjI1NiwwIDI0LjAwMSwtMTAuNzQ1IDI0LjAwMSwtMjQgeiBtIDAsLTE2OCBWIDU2IGMgMCwtMTMuMjU1IC0xMC43NDUsLTI0IC0yNCwtMjQgSCAyMTMuMzMzIGMgLTEzLjI1NSwwIC0yNCwxMC43NDUgLTI0LDI0IHYgNjQgYyAwLDEzLjI1NSAxMC43NDUsMjQgMjQsMjQgaCAyNzUuMzMzIGMgMTMuMjU2LDAgMjQuMDAxLC0xMC43NDUgMjQuMDAxLC0yNCB6IE0gMTA5LjMzMywyMDAgSCAyNCBDIDEwLjc0NSwyMDAgMCwyMTAuNzQ1IDAsMjI0IHYgNjQgYyAwLDEzLjI1NSAxMC43NDUsMjQgMjQsMjQgaCA4NS4zMzMgYyAxMy4yNTUsMCAyNCwtMTAuNzQ1IDI0LC0yNCB2IC02NCBjIDAsLTEzLjI1NSAtMTAuNzQ1LC0yNCAtMjQsLTI0IHogTSAwLDM5MiB2IDY0IGMgMCwxMy4yNTUgMTAuNzQ1LDI0IDI0LDI0IGggODUuMzMzIGMgMTMuMjU1LDAgMjQsLTEwLjc0NSAyNCwtMjQgdiAtNjQgYyAwLC0xMy4yNTUgLTEwLjc0NSwtMjQgLTI0LC0yNCBIIDI0IEMgMTAuNzQ1LDM2OCAwLDM3OC43NDUgMCwzOTIgWiBtIDE4OS4zMzMsMCB2IDY0IGMgMCwxMy4yNTUgMTAuNzQ1LDI0IDI0LDI0IGggMjc1LjMzMyBjIDEzLjI1NSwwIDI0LC0xMC43NDUgMjQsLTI0IHYgLTY0IGMgMCwtMTMuMjU1IC0xMC43NDUsLTI0IC0yNCwtMjQgSCAyMTMuMzMzIGMgLTEzLjI1NSwwIC0yNCwxMC43NDUgLTI0LDI0IHoiIC8+Cjwvc3ZnPgo=",
|
||||
GRID_VIEW: "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDQgNDQiPgogIDxwYXRoIGZpbGw9IiM2MjY0NjkiIGQ9Ik0gMTgsNCBIIDYgQyA0LjksNCA0LDQuOSA0LDYgdiAxMiBjIDAsMS4xIDAuOSwyIDIsMiBoIDEyIGMgMS4xLDAgMiwtMC45IDIsLTIgViA2IEMgMjAsNC45IDE5LjEsNCAxOCw0IFoiIC8+CiAgPHBhdGggZmlsbD0iIzYyNjQ2OSIgZD0iTSAzOCw0IEggMjYgYyAtMS4xLDAgLTIsMC45IC0yLDIgdiAxMiBjIDAsMS4xIDAuOSwyIDIsMiBoIDEyIGMgMS4xLDAgMiwtMC45IDIsLTIgViA2IEMgNDAsNC45IDM5LjEsNCAzOCw0IFoiIC8+CiAgPHBhdGggZmlsbD0iIzYyNjQ2OSIgZD0iTSAxOCwyNCBIIDYgYyAtMS4xLDAgLTIsMC45IC0yLDIgdiAxMiBjIDAsMS4xIDAuOSwyIDIsMiBoIDEyIGMgMS4xLDAgMiwtMC45IDIsLTIgViAyNiBjIDAsLTEuMSAtMC45LC0yIC0yLC0yIHoiIC8+CiAgPHBhdGggZmlsbD0iIzYyNjQ2OSIgZD0iTSAzOCwyNCBIIDI2IGMgLTEuMSwwIC0yLDAuOSAtMiwyIHYgMTIgYyAwLDEuMSAwLjksMiAyLDIgaCAxMiBjIDEuMSwwIDIsLTAuOSAyLC0yIFYgMjYgYyAwLC0xLjEgLTAuOSwtMiAtMiwtMiB6IiAvPgo8L3N2Zz4K",
|
||||
|
||||
CROSS: "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MS45NzYgNTEuOTc2Ij4KICA8cGF0aCBzdHlsZT0iZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eTowLjUzMzMzMjg1O3N0cm9rZS13aWR0aDoxLjQ1NjgxMTE5IiBkPSJtIDQxLjAwNTMxLDQwLjg0NDA2MiBjIC0xLjEzNzc2OCwxLjEzNzc2NSAtMi45ODIwODgsMS4xMzc3NjUgLTQuMTE5ODYxLDAgTCAyNi4wNjg2MjgsMzAuMDI3MjM0IDE0LjczNzU1MSw0MS4zNTgzMSBjIC0xLjEzNzc3MSwxLjEzNzc3MSAtMi45ODIwOTMsMS4xMzc3NzEgLTQuMTE5ODYxLDAgLTEuMTM3NzcyMiwtMS4xMzc3NjggLTEuMTM3NzcyMiwtMi45ODIwODggMCwtNC4xMTk4NjEgTCAyMS45NDg3NjYsMjUuOTA3MzcyIDExLjEzMTkzOCwxNS4wOTA1NTEgYyAtMS4xMzc3NjQ3LC0xLjEzNzc3MSAtMS4xMzc3NjQ3LC0yLjk4MzU1MyAwLC00LjExOTg2MSAxLjEzNzc3NCwtMS4xMzc3NzIxIDIuOTgyMDk4LC0xLjEzNzc3MjEgNC4xMTk4NjUsMCBMIDI2LjA2ODYyOCwyMS43ODc1MTIgMzYuMzY5NzM5LDExLjQ4NjM5OSBjIDEuMTM3NzY4LC0xLjEzNzc2OCAyLjk4MjA5MywtMS4xMzc3NjggNC4xMTk4NjIsMCAxLjEzNzc2NywxLjEzNzc2OSAxLjEzNzc2NywyLjk4MjA5NCAwLDQuMTE5ODYyIEwgMzAuMTg4NDg5LDI1LjkwNzM3MiA0MS4wMDUzMSwzNi43MjQxOTcgYyAxLjEzNzc3MSwxLjEzNzc2NyAxLjEzNzc3MSwyLjk4MjA5MSAwLDQuMTE5ODY1IHoiIC8+Cjwvc3ZnPgo=",
|
||||
MAGNIFYING_GLASS: "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj4KICA8cGF0aCBzdHlsZT0iZmlsbDojNjI2NDY5O2ZpbGwtb3BhY2l0eToxIiBkPSJNNTA1IDQ0Mi43TDQwNS4zIDM0M2MtNC41LTQuNS0xMC42LTctMTctN0gzNzJjMjcuNi0zNS4zIDQ0LTc5LjcgNDQtMTI4QzQxNiA5My4xIDMyMi45IDAgMjA4IDBTMCA5My4xIDAgMjA4czkzLjEgMjA4IDIwOCAyMDhjNDguMyAwIDkyLjctMTYuNCAxMjgtNDR2MTYuM2MwIDYuNCAyLjUgMTIuNSA3IDE3bDk5LjcgOTkuN2M5LjQgOS40IDI0LjYgOS40IDMzLjkgMGwyOC4zLTI4LjNjOS40LTkuNCA5LjQtMjQuNi4xLTM0ek0yMDggMzM2Yy03MC43IDAtMTI4LTU3LjItMTI4LTEyOCAwLTcwLjcgNTcuMi0xMjggMTI4LTEyOCA3MC43IDAgMTI4IDU3LjIgMTI4IDEyOCAwIDcwLjctNTcuMiAxMjgtMTI4IDEyOHoiIC8+Cjwvc3ZnPgo=",
|
||||
|
||||
SORT: "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgNTEyIj4KICA8cGF0aCBzdHlsZT0iZmlsbDojNjI2NDY5O2ZpbGwtb3BhY2l0eToxIiBkPSJNNDEgMjg4aDIzOGMyMS40IDAgMzIuMSAyNS45IDE3IDQxTDE3NyA0NDhjLTkuNCA5LjQtMjQuNiA5LjQtMzMuOSAwTDI0IDMyOWMtMTUuMS0xNS4xLTQuNC00MSAxNy00MXptMjU1LTEwNUwxNzcgNjRjLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwTDI0IDE4M2MtMTUuMSAxNS4xLTQuNCA0MSAxNyA0MWgyMzhjMjEuNCAwIDMyLjEtMjUuOSAxNy00MXoiIC8+Cjwvc3ZnPgo=",
|
||||
};
|
||||
|
||||
effect(getSelection$().pipe(
|
||||
rxjs.filter((selections) => selections.length === 0),
|
||||
rxjs.map(() => render(createFragment(`
|
||||
<input class="hidden" placeholder="search" style="
|
||||
background: transparent;
|
||||
border: none;
|
||||
padding-left: 5px;
|
||||
color: var(--color);
|
||||
font-size: 0.95rem;
|
||||
">
|
||||
<button data-action="search">
|
||||
<img class="component_icon" draggable="false" src="data:image/svg+xml;base64,${ICONS.MAGNIFYING_GLASS}" alt="search" />
|
||||
</button>
|
||||
<button data-action="view">
|
||||
<img class="component_icon" draggable="false" src="data:image/svg+xml;base64,${ICONS.LIST_VIEW}" alt="list" />
|
||||
</button>
|
||||
<button data-action="sort">
|
||||
<img class="component_icon" draggable="false" src="data:image/svg+xml;base64,${ICONS.SORT}" alt="sort" />
|
||||
</button>
|
||||
<div class="component_dropdown view sort" data-target="sort">
|
||||
<div class="dropdown_container">
|
||||
<ul>
|
||||
<li>
|
||||
<div>
|
||||
Sort By Type <span>
|
||||
<span style="float: right;">
|
||||
<img class="component_icon" draggable="false" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MTIgNTEyIj4KICA8cGF0aCBzdHlsZT0iZmlsbDojOTA5MDkwO2ZpbGwtb3BhY2l0eToxIiBkPSJNMTczLjg5OCA0MzkuNDA0bC0xNjYuNC0xNjYuNGMtOS45OTctOS45OTctOS45OTctMjYuMjA2IDAtMzYuMjA0bDM2LjIwMy0zNi4yMDRjOS45OTctOS45OTggMjYuMjA3LTkuOTk4IDM2LjIwNCAwTDE5MiAzMTIuNjkgNDMyLjA5NSA3Mi41OTZjOS45OTctOS45OTcgMjYuMjA3LTkuOTk3IDM2LjIwNCAwbDM2LjIwMyAzNi4yMDRjOS45OTcgOS45OTcgOS45OTcgMjYuMjA2IDAgMzYuMjA0bC0yOTQuNCAyOTQuNDAxYy05Ljk5OCA5Ljk5Ny0yNi4yMDcgOS45OTctMzYuMjA0LS4wMDF6IiAvPgo8L3N2Zz4K" alt="check">
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div>Sort By Date</div>
|
||||
</li>
|
||||
<li>
|
||||
<div>Sort By Name</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
`))),
|
||||
rxjs.mergeMap(($page) => rxjs.merge(
|
||||
onClick(qs($page, `[data-action="search"]`)).pipe(
|
||||
rxjs.mergeMap(async () => {
|
||||
const $input = qs($page, "input");
|
||||
const $searchImg = qs($page, `img[alt="search"]`);
|
||||
if ($input.classList.contains("hidden")) {
|
||||
$page.classList.add("hover");
|
||||
$input.value = "";
|
||||
$input.classList.remove("hidden");
|
||||
$searchImg.setAttribute("src", "data:image/svg+xml;base64," + ICONS.CROSS);
|
||||
await animate($input, {
|
||||
keyframes: [{width: "0px"}, {width: "180px"}],
|
||||
time: 200,
|
||||
});
|
||||
$input.focus();
|
||||
} else {
|
||||
$page.classList.remove("hover");
|
||||
$searchImg.setAttribute("src", "data:image/svg+xml;base64," + ICONS.MAGNIFYING_GLASS);
|
||||
await animate($input, {
|
||||
keyframes: [{width: "180px"}, {width: "0px"}],
|
||||
time: 100,
|
||||
});
|
||||
$input.classList.add("hidden");
|
||||
}
|
||||
}),
|
||||
),
|
||||
onClick(qs($page, `[data-action="sort"]`)).pipe(rxjs.tap(() => {
|
||||
qs($page, `[data-target="sort"]`).classList.toggle("active");
|
||||
})),
|
||||
)),
|
||||
));
|
||||
|
||||
effect(getSelection$().pipe(
|
||||
rxjs.filter((selections) => selections.length >= 1),
|
||||
rxjs.map((selections) => render(createFragment(`
|
||||
<button data-bind="clear">
|
||||
${selections.length} <component-icon name="close"></component-icon>
|
||||
</button>
|
||||
`))),
|
||||
rxjs.mergeMap(($page) => onClick($page, `[data-bind="clear"]`).pipe(
|
||||
rxjs.tap(() => clearSelection()),
|
||||
rxjs.mergeMap(() => rxjs.EMPTY),
|
||||
)),
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
export function init() {
|
||||
return Promise.all([
|
||||
loadCSS(import.meta.url, "../../css/designsystem_dropdown.css"),
|
||||
loadCSS(import.meta.url, "./ctrl_submenu.css"),
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ func init() {
|
|||
f.Name = "enable"
|
||||
f.Type = "enable"
|
||||
f.Target = []string{"onlyoffice_server", "onlyoffice_can_download"}
|
||||
f.Description = "Enable/Disable the office suite to manage word, excel and powerpoint documents. This setting requires a restart to comes into effect"
|
||||
f.Description = "Enable/Disable the office suite to manage word, excel and powerpoint documents."
|
||||
f.Default = false
|
||||
if u := os.Getenv("ONLYOFFICE_URL"); u != "" {
|
||||
f.Default = true
|
||||
|
|
@ -87,37 +87,41 @@ func init() {
|
|||
}
|
||||
|
||||
Hooks.Register.Onload(func() {
|
||||
if plugin_enable() == false {
|
||||
return
|
||||
}
|
||||
Hooks.Register.HttpEndpoint(func(r *mux.Router, app *App) error {
|
||||
oods := r.PathPrefix("/onlyoffice").Subrouter()
|
||||
oods.PathPrefix("/static/").HandlerFunc(StaticHandler).Methods("GET", "POST")
|
||||
oods.HandleFunc("/event", OnlyOfficeEventHandler).Methods("POST")
|
||||
oods.HandleFunc("/content", FetchContentHandler).Methods("GET")
|
||||
plugin_enable()
|
||||
server_url()
|
||||
can_download()
|
||||
})
|
||||
|
||||
r.HandleFunc(
|
||||
COOKIE_PATH+"onlyoffice/iframe",
|
||||
NewMiddlewareChain(
|
||||
IframeContentHandler,
|
||||
[]Middleware{SessionStart, LoggedInOnly},
|
||||
*app,
|
||||
),
|
||||
).Methods("GET")
|
||||
return nil
|
||||
})
|
||||
Hooks.Register.XDGOpen(`
|
||||
Hooks.Register.HttpEndpoint(func(r *mux.Router, app *App) error {
|
||||
oods := r.PathPrefix("/onlyoffice").Subrouter()
|
||||
oods.PathPrefix("/static/").HandlerFunc(StaticHandler).Methods("GET", "POST")
|
||||
oods.HandleFunc("/event", OnlyOfficeEventHandler).Methods("POST")
|
||||
oods.HandleFunc("/content", FetchContentHandler).Methods("GET")
|
||||
|
||||
r.HandleFunc(
|
||||
COOKIE_PATH+"onlyoffice/iframe",
|
||||
NewMiddlewareChain(
|
||||
IframeContentHandler,
|
||||
[]Middleware{SessionStart, LoggedInOnly},
|
||||
*app,
|
||||
),
|
||||
).Methods("GET")
|
||||
return nil
|
||||
})
|
||||
Hooks.Register.XDGOpen(`
|
||||
if(mime === "application/word" || mime === "application/msword" ||
|
||||
mime === "application/vnd.oasis.opendocument.text" || mime === "application/vnd.oasis.opendocument.spreadsheet" ||
|
||||
mime === "application/excel" || mime === "application/vnd.ms-excel" || mime === "application/powerpoint" ||
|
||||
mime === "application/vnd.ms-powerpoint" || mime === "application/vnd.oasis.opendocument.presentation" ) {
|
||||
return ["appframe", {"endpoint": "/api/onlyoffice/iframe"}];
|
||||
}
|
||||
`)
|
||||
})
|
||||
`)
|
||||
}
|
||||
|
||||
func StaticHandler(res http.ResponseWriter, req *http.Request) {
|
||||
if plugin_enable() == false {
|
||||
return
|
||||
}
|
||||
req.URL.Path = strings.TrimPrefix(req.URL.Path, "/onlyoffice/static")
|
||||
u, err := url.Parse(server_url())
|
||||
if err != nil {
|
||||
|
|
@ -166,6 +170,9 @@ func StaticHandler(res http.ResponseWriter, req *http.Request) {
|
|||
}
|
||||
|
||||
func IframeContentHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
|
||||
if plugin_enable() == false {
|
||||
return
|
||||
}
|
||||
if model.CanRead(ctx) == false {
|
||||
SendErrorResult(res, ErrPermissionDenied)
|
||||
return
|
||||
|
|
@ -386,6 +393,9 @@ func IframeContentHandler(ctx *App, res http.ResponseWriter, req *http.Request)
|
|||
}
|
||||
|
||||
func FetchContentHandler(res http.ResponseWriter, req *http.Request) {
|
||||
if plugin_enable() == false {
|
||||
return
|
||||
}
|
||||
var key string
|
||||
if key = req.URL.Query().Get("key"); key == "" {
|
||||
SendErrorResult(res, NewError("unspecified key", http.StatusBadRequest))
|
||||
|
|
@ -439,6 +449,9 @@ type onlyOfficeEventObject struct {
|
|||
}
|
||||
|
||||
func OnlyOfficeEventHandler(res http.ResponseWriter, req *http.Request) {
|
||||
if plugin_enable() == false {
|
||||
return
|
||||
}
|
||||
event := onlyOfficeEventObject{}
|
||||
if err := json.NewDecoder(req.Body).Decode(&event); err != nil {
|
||||
SendErrorResult(res, err)
|
||||
|
|
|
|||
Loading…
Reference in a new issue