Web:Files:VirtualRooms: update filter

This commit is contained in:
TimofeyBoyko 2022-07-08 12:10:17 +03:00
parent f46add9687
commit 723716dbc8

View File

@ -1,139 +1,188 @@
import React from "react"; import React from "react";
import { inject, observer } from "mobx-react";
import { isMobile } from "react-device-detect";
import { withRouter } from "react-router";
import { withTranslation } from "react-i18next";
import find from "lodash/find"; import find from "lodash/find";
import result from "lodash/result"; import result from "lodash/result";
import { withTranslation } from "react-i18next";
import { withRouter } from "react-router"; import { getUser } from "@appserver/common/api/people";
import { FilterType, RoomsType } from "@appserver/common/constants"; import { RoomsType } from "@appserver/common/constants";
import Loaders from "@appserver/common/components/Loaders"; import Loaders from "@appserver/common/components/Loaders";
import FilterInput from "@appserver/common/components/FilterInput"; import FilterInput from "@appserver/common/components/FilterInput";
import { withLayoutSize } from "@appserver/common/utils"; import { withLayoutSize } from "@appserver/common/utils";
import { isMobileOnly, isMobile } from "react-device-detect";
import { inject, observer } from "mobx-react"; import withLoader from "../../../../HOCs/withLoader";
import { getUser } from "@appserver/common/api/people";
const getTypes = (filterValues) => { const getTypes = (filterValues) => {
const types = result( const filterTypes = filterValues.find(
find(filterValues, (value) => { (value) => value.group === "filter-types"
return value.group === "filter-types"; )?.key;
}),
"key"
);
return types ? +types : null; const types =
typeof filterTypes === "number"
? [filterTypes]
: filterTypes?.length > 0
? filterTypes.map((type) => +type)
: null;
return types;
}; };
const getAuthorType = (filterValues) => { const getOwner = (filterValues) => {
const authorType = result( const filterOwner = result(
find(filterValues, (value) => { find(filterValues, (value) => {
return value.group === "filter-author"; return value.group === "filter-owner";
}), }),
"key" "key"
); );
return authorType ? authorType : null; return filterOwner ? filterOwner : null;
}; };
const getSearchParams = (filterValues) => { const getTags = (filterValues) => {
const searchParams = result( const filterTags = filterValues.find((value) => value.group === "filter-tags")
find(filterValues, (value) => { ?.key;
return value.group === "filter-folders";
}),
"key"
);
return searchParams || "true"; const tags = filterTags?.length > 0 ? filterTags : null;
return tags;
}; };
const SectionFilterContent = ({ const SectionFilterContent = ({
t, t,
user,
filter,
personal,
isRecentFolder,
isFavoritesFolder,
sectionWidth, sectionWidth,
userId,
infoPanelVisible,
filter,
sortRooms,
filterRooms,
searchRooms,
fetchTags,
viewAs, viewAs,
createThumbnails,
setViewAs, setViewAs,
setIsLoading, setIsLoading,
selectedFolderId,
fetchRooms,
infoPanelVisible,
}) => { }) => {
const [loading, setLoading] = React.useState(false); const onFilter = React.useCallback(
(data) => {
const types = getTypes(data) || null;
const filterColumnCount = const owner = getOwner(data) || null;
window.innerWidth < 500
? { filterColumnCount: 3 }
: { filterColumnCount: personal ? 2 : 3 };
const onFilter = (data) => { const subjectId = owner === "me" || owner === "other" ? userId : owner;
const types = getTypes(data) || null;
const authorType = !!getAuthorType(data)
? getAuthorType(data).includes("user_")
? getAuthorType(data)
: `user_${getAuthorType(data)}`
: null;
const withSubfolders = getSearchParams(data);
const newFilter = filter.clone(); const tags = getTags(data) || null;
newFilter.page = 0;
newFilter.types = types ? [types] : null;
newFilter.authorType = authorType;
newFilter.withSubfolders = withSubfolders;
setIsLoading(true); setIsLoading(true);
fetchRooms(newFilter.searchArea, newFilter).finally(() => filterRooms(types, subjectId, tags).finally(() => {
setIsLoading(false) setIsLoading(false);
); });
}; },
[filterRooms, setIsLoading]
);
const onSearch = (data = "") => { const onSearch = React.useCallback(
const newFilter = filter.clone(); (data = "") => {
newFilter.page = 0; setIsLoading(true);
newFilter.filterValue = data;
setIsLoading(true); searchRooms(data).finally(() => {
setIsLoading(false);
});
},
[searchRooms, setIsLoading]
);
fetchRooms(newFilter.searchArea, newFilter).finally(() => const onSort = React.useCallback(
setIsLoading(false) (sortId, sortDirection) => {
); const sortBy = sortId;
}; const sortOrder = sortDirection === "desc" ? "descending" : "ascending";
const onSort = (sortId, sortDirection) => { setIsLoading(true);
const sortBy = sortId;
const sortOrder = sortDirection === "desc" ? "descending" : "ascending";
const newFilter = filter.clone(); sortRooms(sortBy, sortOrder).finally(() => {
newFilter.page = 0; setIsLoading(false);
newFilter.sortBy = sortBy; });
newFilter.sortOrder = sortOrder; },
[sortRooms, setIsLoading]
);
setIsLoading(true); const onChangeViewAs = React.useCallback(
(view) => {
fetchRooms(newFilter.searchArea, newFilter).finally(() => if (view === "row") {
setIsLoading(false) if (
); (sectionWidth < 1025 && !infoPanelVisible) ||
}; (sectionWidth < 625 && infoPanelVisible) ||
isMobile
const onChangeViewAs = (view) => { ) {
if (view === "row") { setViewAs("row");
if ( } else {
(sectionWidth < 1025 && !infoPanelVisible) || setViewAs("table");
(sectionWidth < 625 && infoPanelVisible) || }
isMobile
) {
setViewAs("row");
} else { } else {
setViewAs("table"); setViewAs(view);
} }
} else { },
setViewAs(view); [sectionWidth, infoPanelVisible, setViewAs]
} );
};
const getFilterData = () => { const getSelectedInputValue = React.useCallback(() => {
return filter.filterValue;
}, [filter.filterValue]);
const getSelectedSortData = React.useCallback(() => {
return {
sortDirection: filter.sortOrder === "ascending" ? "asc" : "desc",
sortId: filter.sortBy,
};
}, [filter.sortOrder, filter.sortBy]);
const getSelectedFilterData = React.useCallback(async () => {
const filterValues = [];
if (filter.types) {
const key =
typeof filter.types === "object" ? filter.types[0] : filter.types; //Remove it if filter types will be multi select
filterValues.push({
key: key,
group: "filter-types",
});
}
// TODO: add logic to other key
if (filter.subjectId) {
const isMe = userId === filter.subjectId;
let label = null;
if (!isMe) {
const user = await getUser(filter.subjectId);
label = user.displayName;
}
filterValues.push({
key: isMe ? "me" : filter.subjectId,
group: "filter-owner",
label: label,
});
}
if (filter.tags) {
filterValues.push({
key: filter.tags,
group: "filter-tags",
});
}
return filterValues;
}, [filter.types, filter.subjectId, filter.tags, userId]);
const getFilterData = React.useCallback(async () => {
const ownerOptions = [ const ownerOptions = [
{ {
key: "filter-owner", key: "filter-owner",
@ -167,29 +216,34 @@ const SectionFilterContent = ({
isHeader: true, isHeader: true,
}, },
{ {
key: RoomsType.CustomRoom.toString(), key: RoomsType.CustomRoom,
group: "filter-types", group: "filter-types",
label: "Custom room", label: "Custom room",
isMultiSelect: false,
}, },
{ {
key: RoomsType.FillingFormsRoom.toString(), key: RoomsType.FillingFormsRoom,
group: "filter-types", group: "filter-types",
label: "Filling form", label: "Filling form",
isMultiSelect: false,
}, },
{ {
key: RoomsType.EditingRoom.toString(), key: RoomsType.EditingRoom,
group: "filter-types", group: "filter-types",
label: "Editing", label: "Editing",
isMultiSelect: false,
}, },
{ {
key: RoomsType.ReviewRoom.toString(), key: RoomsType.ReviewRoom,
group: "filter-types", group: "filter-types",
label: "Review", label: "Review",
isMultiSelect: false,
}, },
{ {
key: RoomsType.ReadOnlyRoom.toString(), key: RoomsType.ReadOnlyRoom,
group: "filter-types", group: "filter-types",
label: "View-only", label: "View-only",
isMultiSelect: false,
}, },
]; ];
@ -199,6 +253,15 @@ const SectionFilterContent = ({
filterOptions.push(...typeOptions); filterOptions.push(...typeOptions);
const tags = await fetchTags();
const tagsOptions = tags.map((tag) => ({
key: tag,
group: "filter-tags",
label: tag,
isMultiSelect: true,
}));
filterOptions.push({ filterOptions.push({
key: "filter-tags", key: "filter-tags",
group: "filter-tags", group: "filter-tags",
@ -207,38 +270,12 @@ const SectionFilterContent = ({
isLast: true, isLast: true,
}); });
filterOptions.push(...tagsOptions);
return filterOptions; return filterOptions;
}; }, [fetchTags]);
const getSelectedFilterData = async () => { const getViewSettingsData = React.useCallback(() => {
const selectedFilterData = {
filterValues: [],
sortDirection: filter.sortOrder === "ascending" ? "asc" : "desc",
sortId: filter.sortBy,
};
selectedFilterData.inputValue = filter.filterValue;
if (filter.types) {
selectedFilterData.filterValues.push({
key: `${filter.types}`,
group: "filter-types",
});
}
if (filter.authorType) {
const user = await getUser(filter.authorType.replace("user_", ""));
selectedFilterData.filterValues.push({
key: `${filter.authorType}`,
group: "filter-owner",
label: user.displayName,
});
}
return selectedFilterData;
};
const getViewSettingsData = () => {
const viewSettings = [ const viewSettings = [
{ {
value: "row", value: "row",
@ -253,9 +290,10 @@ const SectionFilterContent = ({
]; ];
return viewSettings; return viewSettings;
}; }, []);
const getSortData = () => { // TODO: Remove comments after backend fix
const getSortData = React.useCallback(() => {
const commonOptions = [ const commonOptions = [
{ key: "AZ", label: "Name", default: true }, { key: "AZ", label: "Name", default: true },
// { key: "Type", label: t("Common:Type"), default: true }, // { key: "Type", label: t("Common:Type"), default: true },
@ -265,30 +303,27 @@ const SectionFilterContent = ({
]; ];
return commonOptions; return commonOptions;
}; }, []);
return ( return (
<FilterInput <FilterInput
t={t} t={t}
sectionWidth={sectionWidth}
getFilterData={getFilterData}
getSortData={getSortData}
getViewSettingsData={getViewSettingsData}
getSelectedFilterData={getSelectedFilterData}
onFilter={onFilter} onFilter={onFilter}
onSearch={onSearch} getFilterData={getFilterData}
getSelectedFilterData={getSelectedFilterData}
onSort={onSort} onSort={onSort}
onChangeViewAs={onChangeViewAs} getSortData={getSortData}
getSelectedSortData={getSelectedSortData}
viewAs={viewAs} viewAs={viewAs}
placeholder={t("Common:Search")}
{...filterColumnCount}
contextMenuHeader={t("Filter")}
headerLabel={t("Translations:AddAuthor")}
viewSelectorVisible={true} viewSelectorVisible={true}
isFavoritesFolder={isFavoritesFolder} onChangeViewAs={onChangeViewAs}
isRecentFolder={isRecentFolder} getViewSettingsData={getViewSettingsData}
isRoomFolder={true} onSearch={onSearch}
isLoading={loading} getSelectedInputValue={getSelectedInputValue}
filterHeader={t("Filter")}
placeholder={t("Common:Search")}
view={t("Common:View")}
selectorLabel={t("Translations:AddAuthor")}
/> />
); );
}; };
@ -296,25 +331,21 @@ const SectionFilterContent = ({
export default inject(({ auth, filesStore, roomsStore }) => { export default inject(({ auth, filesStore, roomsStore }) => {
const { setIsLoading, setViewAs, viewAs } = filesStore; const { setIsLoading, setViewAs, viewAs } = filesStore;
const { fetchRooms, filter, rooms } = roomsStore; const { fetchTags, filter, sortRooms, filterRooms, searchRooms } = roomsStore;
const { user } = auth.userStore; const { user } = auth.userStore;
const { search, filterType, authorType } = filter; const { isVisible: infoPanelVisible } = auth.infoPanelStore;
// const isFiltered =
// (!!files.length ||
// !!folders.length ||
// search ||
// filterType ||
// authorType) &&
// !(treeFoldersStore.isPrivacyFolder && isMobile);
return { return {
user, userId: user.id,
infoPanelVisible,
fetchRooms, fetchTags,
filter, filter,
sortRooms,
filterRooms,
searchRooms,
viewAs, viewAs,
setViewAs, setViewAs,
@ -324,7 +355,7 @@ export default inject(({ auth, filesStore, roomsStore }) => {
withRouter( withRouter(
withLayoutSize( withLayoutSize(
withTranslation(["Home", "Common", "Translations"])( withTranslation(["Home", "Common", "Translations"])(
observer(SectionFilterContent) withLoader(observer(SectionFilterContent))(<Loaders.Filter />)
) )
) )
) )