Merge branch 'develop' into release/rc-v1.2.0

This commit is contained in:
Alexey Safronov 2022-12-01 17:57:55 +03:00
commit c84faa2bc0
27 changed files with 344 additions and 173 deletions

View File

@ -57,6 +57,7 @@
"RoleUserDescription": "Users can only access the rooms they are invited to by admins. They can't create own rooms, folders or files.",
"RoleViewer": "Viewer",
"RoleViewerDescription": "File viewing",
"SearchByOwner": "Search by Owners",
"Spreadsheets": "Spreadsheets",
"SubNewForm": "Blank",
"SubNewFormFile": "From text file",

View File

@ -20,6 +20,8 @@ const StyledDropDown = styled(DropDown)`
box-shadow: 0px 12px 40px rgba(4, 15, 27, 0.12);
border-radius: 3px;
overflow: hidden;
${(props) => !props.hasItems && "visibility: hidden"};
/* visibility: hidden */
width: 446px;
max-width: 446px;

View File

@ -40,7 +40,8 @@ const TagDropdown = ({
e.preventDefault();
};
const onClickOutside = () => {
const onClickOutside = (e) => {
if (e.target.id === "shared_tags-input") return;
document.getElementById("shared_tags-input").blur();
};
@ -108,18 +109,18 @@ const TagDropdown = ({
className="dropdown-content-wrapper"
onMouseDown={preventDefault}
>
{!!dropdownItems.length && (
<StyledDropDown
className="dropdown-content"
open={open}
forwardedRef={dropdownRef}
clickOutsideAction={onClickOutside}
maxHeight={dropdownMaxHeight}
showDisabledItems={false}
hasItems={!!dropdownItems.length}
clickOutsideAction={onClickOutside}
withBackdrop={false}
>
{dropdownItems}
</StyledDropDown>
)}
</StyledDropDownWrapper>
);
};

View File

@ -11,6 +11,8 @@ const StyledTagList = styled.div`
width: 100%;
.set_room_params-tag_input-tag {
background: ${(props) =>
props.theme.createEditRoomDialog.tagInput.tagBackground};
padding: 6px 8px;
border-radius: 3px;
margin: 0;
@ -31,7 +33,19 @@ const TagList = ({ defaultTagLabel, tagHandler, isDisabled }) => {
return (
<StyledTagList className="set_room_params-tag_input-tag_list">
{tags.length ? (
{tags.map((tag) => (
<Tag
key={tag.id}
className="set_room_params-tag_input-tag"
tag="script"
label={tag.name}
isNewTag
onDelete={() => {
onDeleteAction(tag.id);
}}
/>
))}
{/* {tags.length ? (
tags.map((tag) => (
<Tag
key={tag.id}
@ -51,7 +65,7 @@ const TagList = ({ defaultTagLabel, tagHandler, isDisabled }) => {
label={defaultTagLabel}
isDefault
/>
)}
)} */}
</StyledTagList>
);
};

View File

@ -22,6 +22,8 @@ const StyledTagInput = styled.div`
max-width: 100%;
position: relative;
}
${({ hasTags }) => !hasTags && "margin-bottom: -8px"}
`;
const TagInput = ({
@ -48,7 +50,10 @@ const TagInput = ({
};
return (
<StyledTagInput className="set_room_params-input set_room_params-tag_input">
<StyledTagInput
className="set_room_params-input set_room_params-tag_input"
hasTags={!!tagHandler.tags.length}
>
<InputParam
id="shared_tags-input"
title={`${t("Common:Tags")}:`}

View File

@ -109,9 +109,11 @@ const StyledComboBox = styled(ComboBox)`
text-decoration: none;
}
display: flex;
align-items: center;
justify-content: center;
.combo-buttons_arrow-icon {
margin-top: 6px;
margin-right: 8px;
margin-left: 2px;
}
@ -119,6 +121,7 @@ const StyledComboBox = styled(ComboBox)`
.combo-button {
border-radius: 3px;
height: auto;
}
`;

View File

@ -58,7 +58,7 @@ export const CategoryType = Object.freeze({
export const TableVersions = Object.freeze({
Files: "2",
Rooms: "1",
Accounts: "2",
Accounts: "3",
});
export const BINDING_POST = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST";

View File

@ -18,6 +18,7 @@ export const FilterGroups = Object.freeze({
filterContent: "filter-withContent",
roomFilterProviderType: "filter-provider-type",
roomFilterType: "filter-type",
roomFilterSubject: "filter-subject",
roomFilterOwner: "filter-owner",
roomFilterTags: "filter-tags",
roomFilterFolders: "filter-withSubfolders",

View File

@ -4,7 +4,7 @@ import { withTranslation } from "react-i18next";
import TableHeader from "@docspace/components/table-container/TableHeader";
const TABLE_VERSION = "2";
const TABLE_VERSION = "3";
const TABLE_COLUMNS = `peopleTableColumns_ver-${TABLE_VERSION}`;
class PeopleTableHeader extends React.Component {
@ -33,13 +33,13 @@ class PeopleTableHeader extends React.Component {
resizable: true,
onChange: this.onColumnChange,
},
{
key: "Room",
title: t("Common:Room"),
enable: true,
resizable: true,
onChange: this.onColumnChange,
},
// {
// key: "Room",
// title: t("Common:Room"),
// enable: true,
// resizable: true,
// onChange: this.onColumnChange,
// },
{
key: "Mail",
title: t("Common:Email"),

View File

@ -333,7 +333,7 @@ const PeopleTableRow = (props) => {
<TableCell className={"table-cell_type"}>{typeCell}</TableCell>
<TableCell className="table-cell_room">
{/* <TableCell className="table-cell_room">
{!rooms?.length ? (
<Text
type="page"
@ -372,7 +372,8 @@ const PeopleTableRow = (props) => {
modernView
/>
)}
</TableCell>
</TableCell> */}
<TableCell>
<Link
type="page"

View File

@ -11,6 +11,7 @@ import Loaders from "@docspace/common/components/Loaders";
import { withLayoutSize } from "@docspace/common/utils";
import withPeopleLoader from "SRC_DIR/HOCs/withPeopleLoader";
import { EmployeeType, PaymentsType } from "@docspace/common/constants";
const getStatus = (filterValues) => {
const employeeStatus = result(
@ -34,6 +35,17 @@ const getRole = (filterValues) => {
return employeeStatus || null;
};
const getPayments = (filterValues) => {
const employeeStatus = result(
find(filterValues, (value) => {
return value.group === "filter-account";
}),
"key"
);
return employeeStatus || null;
};
const getGroup = (filterValues) => {
const groupId = result(
find(filterValues, (value) => {
@ -64,6 +76,7 @@ const SectionFilterContent = ({
const role = getRole(data);
const group = getGroup(data);
const payments = getPayments(data);
const newFilter = filter.clone();
@ -81,6 +94,8 @@ const SectionFilterContent = ({
newFilter.group = group;
newFilter.payments = payments;
setIsLoading(true);
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
};
@ -147,43 +162,42 @@ const SectionFilterContent = ({
group: "filter-type",
label: t("Common:Type"),
isHeader: true,
isLast: true,
},
{
id: "filter_type-docspace-admin",
key: "admin",
key: EmployeeType.Admin,
group: "filter-type",
label: t("Common:DocSpaceAdmin"),
},
{
id: "filter_type-room-admin",
key: "manager",
key: EmployeeType.User,
group: "filter-type",
label: t("Common:RoomAdmin"),
},
{
id: "filter_type-user",
key: "user",
key: EmployeeType.Guest,
group: "filter-type",
label: userCaption,
},
];
const roleItems = [
{
key: "filter-role",
group: "filter-role",
label: "Role in room",
isHeader: true,
},
{ key: "1", group: "filter-role", label: "Room manager" },
{ key: "2", group: "filter-role", label: "Co-worker" },
{ key: "3", group: "filter-role", label: "Editor" },
{ key: "4", group: "filter-role", label: "Form filler" },
{ key: "5", group: "filter-role", label: "Reviewer" },
{ key: "6", group: "filter-role", label: "Commentator" },
{ key: "7", group: "filter-role", label: "Viewer" },
];
// const roleItems = [
// {
// key: "filter-role",
// group: "filter-role",
// label: "Role in room",
// isHeader: true,
// },
// { key: "1", group: "filter-role", label: "Room manager" },
// { key: "2", group: "filter-role", label: "Co-worker" },
// { key: "3", group: "filter-role", label: "Editor" },
// { key: "4", group: "filter-role", label: "Form filler" },
// { key: "5", group: "filter-role", label: "Reviewer" },
// { key: "6", group: "filter-role", label: "Commentator" },
// { key: "7", group: "filter-role", label: "Viewer" },
// ];
const accountItems = [
{
@ -191,33 +205,34 @@ const SectionFilterContent = ({
group: "filter-account",
label: "Account",
isHeader: true,
isLast: true,
},
{ key: "paid", group: "filter-account", label: "Paid" },
{ key: "free", group: "filter-account", label: "Free" },
{ key: PaymentsType.Paid, group: "filter-account", label: "Paid" },
{ key: PaymentsType.Free, group: "filter-account", label: "Free" },
];
const roomItems = [
{
key: "filter-status",
group: "filter-status",
label: t("UserStatus"),
isHeader: true,
},
{
key: "1",
group: "filter-status",
label: t("Common:Active"),
isSelector: true,
selectorType: "room",
},
];
// const roomItems = [
// {
// key: "filter-status",
// group: "filter-status",
// label: t("UserStatus"),
// isHeader: true,
// },
// {
// key: "1",
// group: "filter-status",
// label: t("Common:Active"),
// isSelector: true,
// selectorType: "room",
// },
// ];
const filterOptions = [];
filterOptions.push(...statusItems);
filterOptions.push(...typeItems);
// filterOptions.push(...roleItems);
// filterOptions.push(...accountItems);
filterOptions.push(...accountItems);
// filterOptions.push(...roomItems);
return filterOptions;
@ -237,6 +252,12 @@ const SectionFilterContent = ({
label: t("Common:ByLastNameSorting"),
default: true,
},
{
id: "sory-by_type",
key: "type",
label: t("Common:Type"),
default: true,
},
];
}, [t]);
@ -253,7 +274,7 @@ const SectionFilterContent = ({
//TODO: add new options from filter after update backend
const getSelectedFilterData = React.useCallback(async () => {
const { guestCaption, userCaption, groupCaption } = customNames;
const { userCaption } = customNames;
const filterValues = [];
if (filter.employeeStatus || filter.activationStatus) {
@ -282,14 +303,14 @@ const SectionFilterContent = ({
if (filter.role) {
let label = null;
switch (filter.role) {
case "admin":
switch (+filter.role) {
case EmployeeType.Admin:
label = t("Common:DocSpaceAdmin");
break;
case "manager":
case EmployeeType.User:
label = t("Common:RoomAdmin");
break;
case "user":
case EmployeeType.Guest:
label = userCaption;
break;
default:
@ -297,12 +318,21 @@ const SectionFilterContent = ({
}
filterValues.push({
key: filter.role,
key: +filter.role,
label: label,
group: "filter-type",
});
}
if (filter?.payments?.toString()) {
filterValues.push({
key: filter.payments.toString(),
label:
PaymentsType.Paid === filter.payments.toString() ? "Paid" : "Free",
group: "filter-account",
});
}
if (filter.group) {
const group = groups.find((group) => group.id === filter.group);
@ -364,6 +394,7 @@ const SectionFilterContent = ({
filter.employeeStatus,
filter.activationStatus,
filter.role,
filter.payments,
filter.group,
t,
customNames,
@ -387,6 +418,10 @@ const SectionFilterContent = ({
newFilter.group = null;
}
if (group === "filter-account") {
newFilter.payments = null;
}
setIsLoading(true);
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
};

View File

@ -17,6 +17,7 @@ import {
RoomsType,
RoomsProviderType,
RoomsProviderTypeName,
FilterSubject,
} from "@docspace/common/constants";
import Loaders from "@docspace/common/components/Loaders";
import FilterInput from "@docspace/common/components/FilterInput";
@ -34,7 +35,18 @@ const getFilterType = (filterValues) => {
"key"
);
return filterType ? +filterType : null;
return filterType?.toString() ? +filterType : null;
};
const getSubjectFilter = (filterValues) => {
const subjectFilter = result(
find(filterValues, (value) => {
return value.group === FilterGroups.roomFilterOwner;
}),
"key"
);
return subjectFilter?.toString() ? subjectFilter?.toString() : null;
};
const getAuthorType = (filterValues) => {
@ -79,10 +91,10 @@ const getProviderType = (filterValues) => {
return type;
};
const getOwner = (filterValues) => {
const getSubjectId = (filterValues) => {
const filterOwner = result(
find(filterValues, (value) => {
return value.group === FilterGroups.roomFilterOwner;
return value.group === FilterGroups.roomFilterSubject;
}),
"key"
);
@ -162,14 +174,9 @@ const SectionFilterContent = ({
if (isRooms) {
const type = getType(data) || null;
const owner = getOwner(data) || null;
const subjectId = getSubjectId(data) || null;
const subjectId =
owner === FilterKeys.other || owner === FilterKeys.me
? userId
: owner;
const withoutMe = owner === FilterKeys.other;
const subjectFilter = getSubjectFilter(data) || null;
const providerType = getProviderType(data) || null;
const tags = getTags(data) || null;
@ -186,7 +193,18 @@ const SectionFilterContent = ({
newFilter.page = 0;
newFilter.provider = providerType ? providerType : null;
newFilter.type = type ? type : null;
newFilter.subjectId = subjectId ? subjectId : null;
newFilter.subjectFilter = null;
newFilter.subjectId = null;
if (subjectId) {
newFilter.subjectId = subjectId;
newFilter.subjectFilter = subjectFilter?.toString()
? subjectFilter.toString()
: FilterSubject.Member;
}
if (tags) {
if (tags.includes(t("NoTag"))) {
newFilter.tags = null;
@ -200,7 +218,6 @@ const SectionFilterContent = ({
newFilter.withoutTags = false;
}
newFilter.excludeSubject = withoutMe;
// newFilter.withSubfolders = withSubfolders;
// newFilter.searchInContent = withContent;
@ -381,28 +398,30 @@ const SectionFilterContent = ({
// }
if (roomsFilter.subjectId) {
const isMe = userId === roomsFilter.subjectId;
let label = isMe
? roomsFilter.excludeSubject
? t("Common:OtherLabel")
: t("Common:MeLabel")
: null;
if (!isMe) {
const user = await getUser(roomsFilter.subjectId);
label = user.displayName;
let label = user.displayName;
const subject = {
key: roomsFilter.subjectId,
group: FilterGroups.roomFilterSubject,
label: label,
};
if (roomsFilter.subjectFilter?.toString()) {
if (roomsFilter.subjectFilter.toString() === FilterSubject.Owner) {
subject.selectedLabel = t("Common:Owner") + ": " + label;
}
filterValues.push(subject);
filterValues.push({
key: isMe
? roomsFilter.excludeSubject
? FilterKeys.other
: FilterKeys.me
: roomsFilter.subjectId,
key: roomsFilter?.subjectFilter?.toString(),
group: FilterGroups.roomFilterOwner,
label: label,
});
} else {
filterValues.push(subject);
}
}
// if (roomsFilter.withoutTags) {
@ -585,6 +604,7 @@ const SectionFilterContent = ({
roomsFilter.provider,
roomsFilter.type,
roomsFilter.subjectId,
roomsFilter.subjectFilter,
roomsFilter.tags,
roomsFilter.tags?.length,
roomsFilter.excludeSubject,
@ -736,35 +756,39 @@ const SectionFilterContent = ({
...media,
];
const ownerOptions = [
const subjectOptions = [
{
key: FilterGroups.roomFilterOwner,
group: FilterGroups.roomFilterOwner,
label: t("Common:Owner"),
key: FilterGroups.roomFilterSubject,
group: FilterGroups.roomFilterSubject,
label: t("Common:Member"),
isHeader: true,
withMultiItems: true,
},
{
id: "filter_author-me",
key: FilterKeys.me,
group: FilterGroups.roomFilterOwner,
label: t("Common:MeLabel"),
},
{
id: "filter_author-other",
key: FilterKeys.other,
group: FilterGroups.roomFilterOwner,
label: t("Common:OtherLabel"),
withoutSeparator: true,
},
{
id: "filter_author-user",
key: FilterKeys.user,
group: FilterGroups.roomFilterOwner,
label: t("Translations:AddOwner"),
group: FilterGroups.roomFilterSubject,
label: t("Translations:ChooseFromList"),
isSelector: true,
},
];
const ownerOptions = [
{
key: FilterGroups.roomFilterOwner,
group: FilterGroups.roomFilterOwner,
isHeader: true,
withoutHeader: true,
},
{
id: "filter_author-user",
key: FilterSubject.Owner,
group: FilterGroups.roomFilterOwner,
label: t("Translations:SearchByOwner"),
isCheckbox: true,
},
];
// const foldersOptions = [
// {
// key: FilterGroups.roomFilterFolders,
@ -806,6 +830,7 @@ const SectionFilterContent = ({
// filterOptions.push(...foldersOptions);
// filterOptions.push(...contentOptions);
filterOptions.push(...subjectOptions);
filterOptions.push(...ownerOptions);
filterOptions.push(...typeOptions);
@ -1179,9 +1204,10 @@ const SectionFilterContent = ({
newFilter.type = null;
}
if (group === FilterGroups.roomFilterOwner) {
if (group === FilterGroups.roomFilterSubject) {
newFilter.subjectId = null;
newFilter.excludeSubject = false;
newFilter.filterSubject = null;
}
if (group === FilterGroups.roomFilterTags) {

View File

@ -8,8 +8,15 @@ import toastr from "@docspace/components/toast/toastr";
import history from "@docspace/common/history";
import { combineUrl } from "@docspace/common/utils";
import { AppServerConfig, EmployeeStatus } from "@docspace/common/constants";
import {
AppServerConfig,
EmployeeStatus,
FilterSubject,
} from "@docspace/common/constants";
import { resendUserInvites } from "@docspace/common/api/people";
import { getCategoryUrl } from "SRC_DIR/helpers/utils";
import { CategoryType } from "SRC_DIR/helpers/constants";
import RoomsFilter from "@docspace/common/api/rooms/filter";
const { proxyURL } = AppServerConfig;
@ -78,7 +85,13 @@ class AccountsContextOptionsStore {
label: t("Translations:OwnerChange"),
onClick: () => this.toggleChangeOwnerDialog(item),
};
case "room-list":
return {
key: option,
icon: "images/folder.react.svg",
label: "Room list",
onClick: () => this.openUserRoomList(item),
};
case "enable":
return {
id: "option_enable",
@ -275,6 +288,21 @@ class AccountsContextOptionsStore {
return contextOptionsProps;
};
openUserRoomList = (user) => {
const filter = RoomsFilter.getDefault();
filter.subjectId = user.id;
filter.subjectFilter = FilterSubject.Member;
const filterParamsStr = filter.toUrlParams();
const url = getCategoryUrl(CategoryType.Shared);
window.open(
combineUrl(PROXY_HOMEPAGE_URL, `${url}?${filterParamsStr}`),
"_blank"
);
};
onProfileClick = () => {
history.push(PROFILE_SELF_URL);
};

View File

@ -214,6 +214,10 @@ class UsersStore {
options.push("details");
}
if (isAdmin || isOwner) {
options.push("room-list");
}
if (isMySelf) {
options.push("separator-1");
@ -272,6 +276,10 @@ class UsersStore {
options.push("details");
}
if (isAdmin || isOwner) {
options.push("room-list");
}
if (
isOwner ||
(isAdmin && (userRole === "manager" || userRole === "user"))
@ -290,6 +298,10 @@ class UsersStore {
} else {
options.push("details");
}
if (isAdmin || isOwner) {
options.push("room-list");
}
}
break;

View File

@ -1,4 +1,3 @@
import { EmployeeStatus } from "../../constants";
import { getObjectByLocation, toUrlParams } from "../../utils";
const DEFAULT_PAGE = 0;
@ -11,16 +10,18 @@ const DEFAULT_ACTIVATION_STATUS = null;
const DEFAULT_ROLE = null;
const DEFAULT_SEARCH = "";
const DEFAULT_GROUP = null;
const DEFAULT_PAYMENTS = null;
const EMPLOYEE_STATUS = "employeestatus";
const ACTIVATION_STATUS = "activationstatus";
const ROLE = "role";
const ROLE = "employeeType";
const GROUP = "group";
const SEARCH = "search";
const SORT_BY = "sortby";
const SORT_ORDER = "sortorder";
const PAGE = "page";
const PAGE_COUNT = "pagecount";
const PAYMENTS = "payments";
class Filter {
static getDefault(total = DEFAULT_TOTAL) {
@ -52,6 +53,7 @@ class Filter {
const pageCount =
(urlFilter[PAGE_COUNT] && +urlFilter[PAGE_COUNT]) ||
defaultFilter.pageCount;
const payments = urlFilter[PAYMENTS] || defaultFilter.payments;
const newFilter = new Filter(
page,
@ -63,7 +65,8 @@ class Filter {
activationStatus,
role,
search,
group
group,
payments
);
return newFilter;
@ -79,7 +82,8 @@ class Filter {
activationStatus = DEFAULT_ACTIVATION_STATUS,
role = DEFAULT_ROLE,
search = DEFAULT_SEARCH,
group = DEFAULT_GROUP
group = DEFAULT_GROUP,
payments = DEFAULT_PAYMENTS
) {
this.page = page;
this.pageCount = pageCount;
@ -91,6 +95,7 @@ class Filter {
this.search = search;
this.total = total;
this.group = group;
this.payments = payments;
}
getStartIndex = () => {
@ -115,6 +120,7 @@ class Filter {
role,
search,
group,
payments,
} = this;
let dtoFilter = {
@ -123,27 +129,14 @@ class Filter {
sortby: sortBy,
sortorder: sortOrder,
employeestatus: employeeStatus,
employeetype: role,
activationstatus: activationStatus,
filtervalue: (search ?? "").trim(),
groupId: group,
fields: fields,
payments,
};
switch (role) {
case "admin":
dtoFilter.isadministrator = true;
break;
case "manager":
dtoFilter.employeeType = 1;
dtoFilter.isadministrator = "false";
break;
case "user":
dtoFilter.employeeType = 2;
break;
default:
break;
}
const str = toUrlParams(dtoFilter, true);
return str;
};
@ -159,6 +152,7 @@ class Filter {
search,
group,
page,
payments,
} = this;
const dtoFilter = {};
@ -190,6 +184,7 @@ class Filter {
dtoFilter[PAGE] = page + 1;
dtoFilter[SORT_BY] = sortBy;
dtoFilter[SORT_ORDER] = sortOrder;
dtoFilter[PAYMENTS] = payments;
const str = toUrlParams(dtoFilter, true);
@ -215,7 +210,8 @@ class Filter {
this.activationStatus,
this.role,
this.search,
this.group
this.group,
this.payments
);
}
@ -231,7 +227,8 @@ class Filter {
null,
null,
"",
idGroup
idGroup,
null
);
} else {
this.clone(true);
@ -248,7 +245,8 @@ class Filter {
this.sortBy === filter.sortBy &&
this.sortOrder === filter.sortOrder &&
this.page === filter.page &&
this.pageCount === filter.pageCount;
this.pageCount === filter.pageCount &&
this.payments === filter.payments;
return equals;
}

View File

@ -43,6 +43,9 @@ const DEFAULT_EXCLUDE_SUBJECT = false;
const WITHOUT_TAGS = "withoutTags";
const DEFAULT_WITHOUT_TAGS = false;
const SUBJECT_FILTER = "subjectFilter";
const DEFAULT_SUBJECT_FILTER = null;
class RoomsFilter {
static getDefault(total = DEFAULT_TOTAL) {
return new RoomsFilter(DEFAULT_PAGE, DEFAULT_PAGE_COUNT, total);
@ -77,6 +80,11 @@ class RoomsFilter {
(urlFilter[SUBJECT_ID] && urlFilter[SUBJECT_ID]) ||
defaultFilter.subjectId;
const subjectFilter =
(urlFilter[SUBJECT_FILTER]?.toString() &&
urlFilter[SUBJECT_FILTER]?.toString()) ||
defaultFilter.subjectFilter?.toString();
//TODO: remove it if search with subfolders and in content will be available
// const searchInContent = urlFilter[SEARCH_IN_CONTENT]
// ? urlFilter[SEARCH_IN_CONTENT] === "true"
@ -120,7 +128,8 @@ class RoomsFilter {
sortBy,
sortOrder,
excludeSubject,
withoutTags
withoutTags,
subjectFilter
);
return newFilter;
@ -141,7 +150,8 @@ class RoomsFilter {
sortBy = DEFAULT_SORT_BY,
sortOrder = DEFAULT_SORT_ORDER,
excludeSubject = DEFAULT_EXCLUDE_SUBJECT,
withoutTags = DEFAULT_WITHOUT_TAGS
withoutTags = DEFAULT_WITHOUT_TAGS,
subjectFilter = DEFAULT_SUBJECT_FILTER
) {
this.page = page;
this.pageCount = pageCount;
@ -158,6 +168,7 @@ class RoomsFilter {
this.sortOrder = sortOrder;
this.excludeSubject = excludeSubject;
this.withoutTags = withoutTags;
this.subjectFilter = subjectFilter;
}
getStartIndex = () => {
@ -188,6 +199,7 @@ class RoomsFilter {
sortOrder,
excludeSubject,
withoutTags,
subjectFilter,
} = this;
const dtoFilter = {
@ -206,6 +218,7 @@ class RoomsFilter {
sortOrder: sortOrder,
excludeSubject: excludeSubject,
withoutTags: withoutTags,
subjectFilter: subjectFilter,
};
const str = toUrlParams(dtoFilter, true);
@ -228,6 +241,7 @@ class RoomsFilter {
sortOrder,
excludeSubject,
withoutTags,
subjectFilter,
} = this;
const dtoFilter = {};
@ -272,6 +286,10 @@ class RoomsFilter {
dtoFilter[WITHOUT_TAGS] = withoutTags;
}
if (subjectFilter?.toString()) {
dtoFilter[SUBJECT_FILTER] = subjectFilter.toString();
}
dtoFilter[PAGE] = page + 1;
dtoFilter[SORT_BY] = sortBy;
dtoFilter[SORT_ORDER] = sortOrder;
@ -301,7 +319,8 @@ class RoomsFilter {
this.sortBy,
this.sortOrder,
this.excludeSubject,
this.withoutTags
this.withoutTags,
this.subjectFilter
);
}
@ -328,7 +347,8 @@ class RoomsFilter {
this.sortBy === filter.sortBy &&
this.sortOrder === filter.sortOrder &&
this.excludeSubject === filter.excludeSubject &&
this.withoutTags === filter.withoutTags;
this.withoutTags === filter.withoutTags &&
this.subjectFilter === filter.subjectFilter;
return equals;
}

View File

@ -177,7 +177,7 @@ const FilterInput = React.memo(
<SelectedItem
key={`${item.key}_${item.group}`}
propKey={item.key}
label={item.label}
label={item.selectedLabel ? item.selectedLabel : item.label}
group={item.group}
removeSelectedItem={removeSelectedItemAction}
/>

View File

@ -33,6 +33,8 @@ const StyledSelectedItem = styled.div`
StyledSelectedItem.defaultProps = { theme: Base };
const SelectedItem = ({ propKey, label, group, removeSelectedItem }) => {
if (!label) return <></>;
const onRemove = () => {
removeSelectedItem(propKey, label, group);
};

View File

@ -54,20 +54,6 @@ const FilterBlockLoader = ({
borderRadius={"3"}
className={"loader-item"}
/>
<div className="row-loader">
<RectangleLoader
width={"49"}
height={"28"}
borderRadius={"16"}
className={"loader-item"}
/>
<RectangleLoader
width={"76"}
height={"28"}
borderRadius={"16"}
className={"loader-item"}
/>
</div>
<div className="row-loader">
<RectangleLoader
width={"32"}
@ -82,6 +68,20 @@ const FilterBlockLoader = ({
className={"loader-item"}
/>
</div>
<div className="row-loader">
<RectangleLoader
width={"16"}
height={"16"}
borderRadius={"3"}
className={"loader-item"}
/>
<RectangleLoader
width={"137"}
height={"20"}
borderRadius={"3"}
className={"loader-item"}
/>
</div>
</StyledBlock>
)}

View File

@ -22,7 +22,7 @@ const StyledInfoPanelWrapper = styled.div.attrs(({ id }) => ({
width: auto;
background: ${(props) => props.theme.infoPanel.blurColor};
backdrop-filter: blur(3px);
z-index: 300;
@media ${tablet} {
z-index: 309;
position: fixed;

View File

@ -33,6 +33,22 @@ export const EmployeeType = Object.freeze({
DocSpaceAdmin: "admin",
Owner: "Owner",
});
/**
* Enum for user payments type.
* @readonly
*/
export const PaymentsType = Object.freeze({
Paid: "0",
Free: "1",
});
/**
* Enum for filter subject.
* @readonly
*/
export const FilterSubject = Object.freeze({
Owner: "0",
Member: "1",
});
/**
* Enum for filter type.
* @readonly

View File

@ -45,7 +45,6 @@ const StyledTableContainer = styled.div`
.table-container_header {
z-index: 200;
padding: 0 20px;
padding-right: 0;
border-bottom: 1px solid;
border-image-slice: 1;
@ -86,10 +85,6 @@ const StyledTableContainer = styled.div`
width: 22px;
}
}
.table-container_header-settings {
border-bottom: ${(props) => props.theme.tableContainer.tableCell.border};
margin-bottom: -1px;
}
${({ useReactWindow }) => useReactWindow && reactWindowContainerStyles}
`;

View File

@ -95,6 +95,7 @@ const Tag = ({
isDefault={isDefault}
isLast={isLast}
tagMaxWidth={tagMaxWidth}
isClickable={!!onClick}
>
<Text className={"tag-text"} font-size={"13px"} noSelect>
...
@ -143,6 +144,7 @@ const Tag = ({
className={`tag${className ? ` ${className}` : ""}`}
style={style}
isLast={isLast}
isClickable={!!onClick}
>
{icon ? (
<ReactSVG className="third-party-tag" src={icon} />

View File

@ -46,10 +46,10 @@ const StyledTag = styled.div`
}
${(props) =>
props.isClickable &&
!props.isDisabled &&
css`
cursor: pointer;
&:hover {
background: ${(props) => props.theme.tag.hoverBackground};
}

View File

@ -2390,6 +2390,10 @@ const Base = {
descriptionColor: "#555f65",
},
tagInput: {
tagBackground: "#ECEEF1",
},
dropdown: {
background: "#ffffff",
borderColor: "#d0d5da",

View File

@ -2390,6 +2390,10 @@ const Dark = {
descriptionColor: "#a3a9ae",
},
tagInput: {
tagBackground: "#292929",
},
dropdown: {
background: "#333333",
borderColor: "#474747",

View File

@ -120,6 +120,7 @@
"MaxLengthExceeded": "The maximum length of a user name or other local part is 64 characters.",
"MeLabel": "Me",
"Megabyte": "MB",
"Member": "Member",
"Name": "Name",
"NewVersionAvailable": "A new version of the website available",
"Next": "Next",