enhance: file upload and filter

This commit is contained in:
zerosoul
2022-04-02 16:26:13 +08:00
parent c4953a0838
commit ca4ca6cd3d
12 changed files with 130 additions and 40 deletions
+7 -8
View File
@@ -20,17 +20,16 @@ const Styled = styled.div`
display: flex;
flex-direction: column;
gap: 16px;
.type {
.date {
position: relative;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
gap: 16px;
color: #616161;
.icon {
width: 15px;
height: auto;
}
font-weight: 600;
font-size: 14px;
line-height: 20px;
.check {
position: absolute;
right: 0;
@@ -70,7 +69,7 @@ export default function Date({ select = "", updateFilter }) {
return (
<Styled>
<ul className="list">
<li className="type" onClick={handleClick.bind(null, undefined)}>
<li className="date" onClick={handleClick.bind(null, undefined)}>
Any Time
{!select && <CheckSign className="check" />}
</li>
@@ -78,7 +77,7 @@ export default function Date({ select = "", updateFilter }) {
return (
<li
key={title}
className="type"
className="date"
onClick={handleClick.bind(null, _key)}
>
{title}
-4
View File
@@ -81,7 +81,6 @@ export default function Filter({ filter, updateFilter }) {
onClickOutside={toggleFilterVisible.bind(null, { from: false })}
visible={fromVisible}
placement="bottom-start"
trigger="click"
content={
<FilterFrom select={filter.from} updateFilter={handleUpdateFilter} />
}
@@ -106,7 +105,6 @@ export default function Filter({ filter, updateFilter }) {
onClickOutside={toggleFilterVisible.bind(null, { channel: false })}
visible={channelVisible}
placement="bottom-start"
trigger="click"
content={
<FilterChannel
select={filter.channel}
@@ -129,7 +127,6 @@ export default function Filter({ filter, updateFilter }) {
onClickOutside={toggleFilterVisible.bind(null, { type: false })}
visible={typeVisible}
placement="bottom-start"
trigger="click"
content={
<FilterType select={filter.type} updateFilter={handleUpdateFilter} />
}
@@ -147,7 +144,6 @@ export default function Filter({ filter, updateFilter }) {
onClickOutside={toggleFilterVisible.bind(null, { date: false })}
visible={dateVisible}
placement="bottom-start"
trigger="click"
content={
<FilterDate select={filter.date} updateFilter={handleUpdateFilter} />
}
+51 -5
View File
@@ -1,4 +1,4 @@
import { useState, useEffect, useRef } from "react";
import { useState, useEffect, useRef, memo } from "react";
import Styled from "./styled";
import { useSelector } from "react-redux";
import Masonry from "masonry-layout";
@@ -8,14 +8,49 @@ import View from "./View";
import Search from "./Search";
import Filter from "./Filter";
import FileBox from "../../common/component/FileBox";
const checkFilter = (data, filter, channelMessage) => {
console.log("filter data", data);
let selected = true;
const {
mid,
file_type,
created_at,
from_uid,
properties: { name },
} = data;
const {
name: nameFilter,
type: typeFilter,
date: timeFilter,
from: fromFilter,
channel: channelFilter,
} = filter;
if (fromFilter && fromFilter != from_uid) {
selected = false;
}
if (
channelFilter &&
channelMessage[channelFilter].findIndex((id) => id == mid) == -1
) {
selected = false;
}
if (nameFilter) {
let str = ["", ...nameFilter.toLowerCase(), ""].join(".*");
let reg = new RegExp(str);
if (!reg.test(name)) {
selected = false;
}
}
return selected;
};
let msnry = null;
export default function ResourceManagement() {
function ResourceManagement({ fileMessages }) {
const listContainerRef = useRef(null);
const [filter, setFilter] = useState({});
const { fileMessages, message, view } = useSelector((store) => {
const { message, view, channelMessage } = useSelector((store) => {
return {
message: store.message,
fileMessages: store.fileMessage,
channelMessage: store.channelMessage,
view: store.ui.fileListView,
};
});
@@ -25,6 +60,11 @@ export default function ResourceManagement() {
return { ...prev, ...data };
});
};
const handleUpdateSearch = (val) => {
setFilter((prev) => {
return { ...prev, name: val };
});
};
useEffect(() => {
if (view == Views.grid && listContainerRef) {
msnry = new Masonry(listContainerRef.current, {
@@ -47,7 +87,7 @@ export default function ResourceManagement() {
console.log("files", fileMessages);
return (
<Styled>
<Search />
<Search value={filter.name} updateSearchValue={handleUpdateSearch} />
<div className="divider"></div>
<div className="opts">
<Filter filter={filter} updateFilter={updateFilter} />
@@ -57,6 +97,8 @@ export default function ResourceManagement() {
{fileMessages.map((id) => {
const data = message[id];
if (!data) return null;
const isSelected = checkFilter(data, filter, channelMessage);
if (!isSelected) return null;
const {
mid,
content,
@@ -82,3 +124,7 @@ export default function ResourceManagement() {
</Styled>
);
}
const equals = (a, b) => a.length === b.length && a.every((v, i) => v == b[i]);
export default memo(ResourceManagement, (prevs, nexts) => {
return equals(prevs.fileMessages, nexts.fileMessages);
});