mirror of
https://github.com/codex-storage/codex-marketplace-ui.git
synced 2025-02-23 05:08:33 +00:00
Add archive filter
This commit is contained in:
parent
6729e64be7
commit
a0c8bd7d1d
@ -6,24 +6,16 @@ import { Check } from "lucide-react";
|
||||
type Props = {
|
||||
files: CodexDataContent[];
|
||||
onFilterToggle: (filter: string) => void;
|
||||
selected: string[];
|
||||
};
|
||||
|
||||
const archiveMimetypes = [
|
||||
"application/zip",
|
||||
"application/x-rar-compressed",
|
||||
"application/x-tar",
|
||||
"application/gzip",
|
||||
"application/x-7z-compressed",
|
||||
"application/gzip", // for .tar.gz
|
||||
"application/x-bzip2",
|
||||
"application/x-xz",
|
||||
];
|
||||
|
||||
export function FilterFilters({ files, onFilterToggle }: Props) {
|
||||
export function FilterFilters({ selected, files, onFilterToggle }: Props) {
|
||||
const filters = Array.from(
|
||||
new Set(
|
||||
files.map((file) =>
|
||||
archiveMimetypes.includes(file.manifest.mimetype)
|
||||
files
|
||||
.filter((f) => f.manifest.mimetype !== "")
|
||||
.map((file) =>
|
||||
Files.isArchive(file.manifest.mimetype)
|
||||
? "archive"
|
||||
: Files.type(file.manifest.mimetype)
|
||||
)
|
||||
@ -35,7 +27,7 @@ export function FilterFilters({ files, onFilterToggle }: Props) {
|
||||
key={type}
|
||||
className={classnames(
|
||||
["files-filter"],
|
||||
["files-filter--active", filters.includes(type)]
|
||||
["files-filter--active", !!filters.find((f) => selected.includes(f))]
|
||||
)}
|
||||
onClick={() => onFilterToggle(type)}>
|
||||
<span>{type}</span> <Check size={"1rem"}></Check>
|
||||
|
@ -13,6 +13,12 @@
|
||||
}
|
||||
|
||||
.files-fileMeta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.files-fileMeta-cid {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ export function Files() {
|
||||
const [error, setError] = useState("");
|
||||
const [details, setDetails] = useState<CodexDataContent | null>(null);
|
||||
const [sortFn, setSortFn] = useState<SortFn | null>(null);
|
||||
const [filters, setFilters] = useState<string[]>([]);
|
||||
const [selectedFilters, setSelectedFilters] = useState<string[]>([]);
|
||||
|
||||
useEffect(() => {
|
||||
WebStorage.folders.list().then((items) => setFolders(items));
|
||||
@ -191,9 +191,9 @@ export function Files() {
|
||||
};
|
||||
|
||||
const onToggleFilter = (filter: string) =>
|
||||
filters.includes(filter)
|
||||
? setFilters(filters.filter((f) => f !== filter))
|
||||
: setFilters([...filters, filter]);
|
||||
selectedFilters.includes(filter)
|
||||
? setSelectedFilters(selectedFilters.filter((f) => f !== filter))
|
||||
: setSelectedFilters([...selectedFilters, filter]);
|
||||
|
||||
tabs.unshift({
|
||||
label: "All files",
|
||||
@ -214,7 +214,10 @@ export function Files() {
|
||||
|
||||
const filtered = items.filter(
|
||||
(item) =>
|
||||
filters.length === 0 || filters.includes(F.type(item.manifest.mimetype))
|
||||
selectedFilters.length === 0 ||
|
||||
selectedFilters.includes(F.type(item.manifest.mimetype)) ||
|
||||
(selectedFilters.includes("archive") &&
|
||||
F.isArchive(item.manifest.mimetype))
|
||||
);
|
||||
|
||||
const sorted = sortFn ? [...filtered].sort(sortFn) : filtered;
|
||||
@ -264,11 +267,15 @@ export function Files() {
|
||||
<Tabs onTabChange={onTabChange} tabIndex={index} tabs={tabs}></Tabs>
|
||||
|
||||
<div className="files-filters">
|
||||
<FilterFilters files={files} onFilterToggle={onToggleFilter} />
|
||||
<FilterFilters
|
||||
files={files}
|
||||
onFilterToggle={onToggleFilter}
|
||||
selected={selectedFilters}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="files-fileBody">
|
||||
<Table headers={headers} rows={rows} defaultSortIndex={3} />
|
||||
<Table headers={headers} rows={rows} defaultSortIndex={2} />
|
||||
</div>
|
||||
|
||||
<FileDetails onClose={onClose} details={details} />
|
||||
|
@ -1,3 +1,14 @@
|
||||
const archiveMimetypes = [
|
||||
"application/zip",
|
||||
"application/x-rar-compressed",
|
||||
"application/x-tar",
|
||||
"application/gzip",
|
||||
"application/x-7z-compressed",
|
||||
"application/gzip", // for .tar.gz
|
||||
"application/x-bzip2",
|
||||
"application/x-xz",
|
||||
];
|
||||
|
||||
export const Files = {
|
||||
isImage(type: string) {
|
||||
return type.startsWith("image");
|
||||
@ -5,6 +16,9 @@ export const Files = {
|
||||
type(mimetype: string) {
|
||||
const [type] = mimetype.split("/")
|
||||
return type
|
||||
},
|
||||
isArchive(mimetype: string) {
|
||||
return archiveMimetypes.includes(mimetype)
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user