mirror of
https://github.com/mickael-kerjean/filestash.git
synced 2025-11-02 20:23:32 +08:00
feature (plg_application_docx): another docx reader
This commit is contained in:
15
server/plugin/plg_application_docxjs/Makefile
Normal file
15
server/plugin/plg_application_docxjs/Makefile
Normal file
@ -0,0 +1,15 @@
|
||||
all:
|
||||
make setup
|
||||
make build
|
||||
make install
|
||||
|
||||
setup:
|
||||
[ -d lib/vendor ] || mkdir -p lib/vendor
|
||||
curl -L https://raw.githubusercontent.com/VolodymyrBaydalka/docxjs/refs/heads/master/dist/docx-preview.js > lib/vendor/docx-preview.js
|
||||
curl -L https://unpkg.com/jszip/dist/jszip.min.js > lib/vendor/jszip.min.js
|
||||
|
||||
build:
|
||||
zip -r application_docx.zip .
|
||||
|
||||
install:
|
||||
mv application_docx.zip ../../../dist/data/state/plugins/
|
||||
16
server/plugin/plg_application_docxjs/loader_docx.css
Normal file
16
server/plugin/plg_application_docxjs/loader_docx.css
Normal file
@ -0,0 +1,16 @@
|
||||
.component_docx {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.component_docx .docx-wrapper {
|
||||
background: #f5f5f5;
|
||||
}
|
||||
.component_docx .docx-wrapper > section.docx {
|
||||
box-shadow: 0 0 3px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.component_filedownloader {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
55
server/plugin/plg_application_docxjs/loader_docx.js
Normal file
55
server/plugin/plg_application_docxjs/loader_docx.js
Normal file
@ -0,0 +1,55 @@
|
||||
import { createElement } from "../../lib/skeleton/index.js";
|
||||
import rxjs, { effect } from "../../lib/rx.js";
|
||||
import ajax from "../../lib/ajax.js";
|
||||
import { loadJS, loadCSS } from "../../helpers/loader.js";
|
||||
import ctrlError from "../../pages/ctrl_error.js";
|
||||
import { transition } from "../../pages/viewerpage/common.js";
|
||||
import ctrlDownloader, { init as initDownloader } from "../../pages/viewerpage/application_downloader.js";
|
||||
import { createLoader } from "../../components/loader.js";
|
||||
|
||||
await init();
|
||||
|
||||
/*
|
||||
* This viewer application is for rendering a docx onto an HTML document. To get a smooth UI, the whole
|
||||
* flow is broken down to these steps:
|
||||
* 1) show a loading spinner => `... = createLoader($page);`
|
||||
* 2) fetch the docx file => effect(ajax({ xxxx })).pipe(
|
||||
* 3) remove the spinner => cancelLoader,
|
||||
* 4) render + transition => ... renderDocx ...
|
||||
* 5) fallback on error => ... catchError ... ctrlDownloader(...)
|
||||
*
|
||||
* note: you don't have to use rxjs if you don't like it, the same code could be written with plain
|
||||
* promises instead. We just happen to be rxjs fanboys who enjoy the automatic resource cleanup it
|
||||
* enforces. In this example, if the user navigates away before the docx is loaded, the ajax call
|
||||
* is cancelled automatically. Additionally, we prefer thinking in terms of streams rather than
|
||||
* the classical state management approach used by most frameworks.
|
||||
*/
|
||||
export default async function(render, { getDownloadUrl, getFilename, $menubar, acl$ }) {
|
||||
const $page = createElement(`
|
||||
<div class="component_docx"></div>
|
||||
`);
|
||||
render($page);
|
||||
|
||||
const cancelLoader = createLoader($page);
|
||||
effect(ajax({ url: getDownloadUrl(), responseType: "arraybuffer" }).pipe(
|
||||
cancelLoader,
|
||||
rxjs.mergeMap(async ({ response }) => renderDocx(response, $page)),
|
||||
rxjs.catchError(() => ctrlDownloader(render, { acl$, getFilename, getDownloadUrl, hasMenubar: false })),
|
||||
));
|
||||
}
|
||||
|
||||
async function renderDocx(response, $page) {
|
||||
$page.classList.add("hidden");
|
||||
await window.docx.renderAsync(response, $page)
|
||||
$page.classList.remove("hidden");
|
||||
$page.parentElement.classList.add("scroll-y");
|
||||
transition($page);
|
||||
}
|
||||
|
||||
function init() {
|
||||
return Promise.all([
|
||||
loadCSS(import.meta.url, "./loader_docx.css"),
|
||||
initDownloader(),
|
||||
loadJS(import.meta.url, "./lib/vendor/jszip.min.js").then(() => loadJS(import.meta.url, "./lib/vendor/docx-preview.js")),
|
||||
]);
|
||||
}
|
||||
12
server/plugin/plg_application_docxjs/manifest.json
Normal file
12
server/plugin/plg_application_docxjs/manifest.json
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"author": "Filestash Pty Ltd",
|
||||
"version": "v0.0",
|
||||
"modules": [
|
||||
{
|
||||
"type": "xdg-open",
|
||||
"mime": "application/word",
|
||||
"entrypoint": "loader_docx.js",
|
||||
"application": "skeleton"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user