2024-07-21 17:55:53 +02:00
|
|
|
import "./fileBrowser.css";
|
|
|
|
|
|
|
|
|
|
import * as React from "bloatless-react";
|
|
|
|
|
|
2024-07-21 20:21:32 +02:00
|
|
|
import { DangerousActionButton } from "./dangerousActionButton";
|
2024-07-21 17:55:53 +02:00
|
|
|
import { DirectoryItemList } from "./directoryItemList";
|
2024-07-22 02:05:27 +02:00
|
|
|
import { PATH_COMPONENT_SEPARATOR } from "../../Model/Global/storageModel";
|
2024-07-22 19:52:08 +02:00
|
|
|
import StorageViewModel from "../../ViewModel/Global/storageViewModel";
|
2024-07-21 19:44:10 +02:00
|
|
|
import { translations } from "../translations";
|
2024-07-21 17:55:53 +02:00
|
|
|
|
2024-07-21 20:21:32 +02:00
|
|
|
export function FileBrowser(storageViewModel: StorageViewModel) {
|
|
|
|
|
const detailView = React.createProxyState(
|
|
|
|
|
[storageViewModel.selectedPath],
|
|
|
|
|
() => {
|
|
|
|
|
if (storageViewModel.selectedPath.value == PATH_COMPONENT_SEPARATOR)
|
|
|
|
|
return (
|
|
|
|
|
<span class="secondary">{translations.storage.noItemSelected}</span>
|
|
|
|
|
);
|
2024-07-21 17:55:53 +02:00
|
|
|
|
2024-07-21 19:44:10 +02:00
|
|
|
return (
|
2024-07-21 20:21:32 +02:00
|
|
|
<div class="flex-column gap">
|
|
|
|
|
<div class="tile flex-no">
|
|
|
|
|
<div>
|
|
|
|
|
<b>{translations.storage.path}</b>
|
|
|
|
|
<span
|
|
|
|
|
class="break-all"
|
|
|
|
|
subscribe:innerText={storageViewModel.selectedPath}
|
|
|
|
|
></span>
|
|
|
|
|
</div>
|
2024-07-21 19:44:10 +02:00
|
|
|
</div>
|
2024-07-21 20:21:32 +02:00
|
|
|
<div class="tile flex-no">
|
|
|
|
|
<div>
|
|
|
|
|
<b>{translations.storage.content}</b>
|
|
|
|
|
<code
|
|
|
|
|
subscribe:innerText={storageViewModel.selectedFileContent}
|
|
|
|
|
></code>
|
|
|
|
|
</div>
|
2024-07-21 19:44:10 +02:00
|
|
|
</div>
|
2024-07-21 20:21:32 +02:00
|
|
|
|
|
|
|
|
{DangerousActionButton(
|
|
|
|
|
translations.storage.deleteItem,
|
|
|
|
|
"delete_forever",
|
|
|
|
|
storageViewModel.deleteSelectedItem
|
|
|
|
|
)}
|
2024-07-21 19:44:10 +02:00
|
|
|
</div>
|
2024-07-21 20:21:32 +02:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
);
|
2024-07-21 19:44:10 +02:00
|
|
|
|
2024-07-21 18:56:56 +02:00
|
|
|
const view = (
|
2024-07-21 17:55:53 +02:00
|
|
|
<div class="file-browser">
|
|
|
|
|
<div>
|
2024-07-21 20:21:32 +02:00
|
|
|
<div class="scroll-area">{DirectoryItemList(storageViewModel)}</div>
|
2024-07-21 18:56:56 +02:00
|
|
|
<div class="detail-button-wrapper">
|
|
|
|
|
<button class="ghost" on:click={scrollToDetails}>
|
|
|
|
|
<span
|
|
|
|
|
class="ellipsis"
|
2024-07-21 20:21:32 +02:00
|
|
|
subscribe:innerText={storageViewModel.selectedFileName}
|
2024-07-21 18:56:56 +02:00
|
|
|
></span>
|
|
|
|
|
<span class="icon">arrow_forward</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2024-07-21 19:44:10 +02:00
|
|
|
<div class="scroll-area" children:set={detailView}></div>
|
2024-07-21 17:55:53 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
2024-07-21 18:56:56 +02:00
|
|
|
|
|
|
|
|
function scrollToDetails() {
|
|
|
|
|
view.scrollLeft = view.scrollWidth;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return view;
|
2024-07-21 17:55:53 +02:00
|
|
|
}
|