Merge branch 'develop' into feature/invite-accounts
This commit is contained in:
commit
76d19a0a43
@ -82,6 +82,7 @@ services_name_backend+=(ASC.Data.Backup.BackgroundTasks)
|
||||
services_name_backend+=(ASC.ClearEvents)
|
||||
services_name_backend+=(ASC.Migration)
|
||||
services_name_backend+=(ASC.Webhooks.Service)
|
||||
services_name_backend+=(ASC.ApiSystem)
|
||||
|
||||
# Publish backend services
|
||||
for i in ${!services_name_backend[@]}; do
|
||||
|
@ -189,6 +189,15 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.B
|
||||
|
||||
CMD ["ASC.Data.Backup.BackgroundTasks.dll", "ASC.Data.Backup.BackgroundTasks"]
|
||||
|
||||
# ASC.ApiSystem ##
|
||||
FROM dotnetrun AS api_system
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.ApiSystem/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ApiSystem/service/ .
|
||||
|
||||
CMD [" ASC.ApiSystem.dll", " ASC.ApiSystem"]
|
||||
|
||||
## ASC.ClearEvents ##
|
||||
FROM dotnetrun AS clear-events
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.ClearEvents/
|
||||
|
@ -114,6 +114,11 @@ services:
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
|
||||
container_name: ${API_HOST}
|
||||
|
||||
onlyoffice-api-system:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api-system:${DOCKER_TAG}"
|
||||
container_name: ${API_SYSTEM_HOST}
|
||||
|
||||
onlyoffice-studio:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
|
||||
@ -170,6 +175,7 @@ services:
|
||||
- onlyoffice-telegram-service
|
||||
- onlyoffice-urlshortener
|
||||
- onlyoffice-api
|
||||
- onlyoffice-api-system
|
||||
- onlyoffice-studio
|
||||
- onlyoffice-ssoauth
|
||||
- onlyoffice-doceditor
|
||||
@ -188,6 +194,7 @@ services:
|
||||
- SERVICE_TELEGRAM_SERVICE=${SERVICE_TELEGRAM_SERVICE}
|
||||
- SERVICE_URLSHORTENER=${SERVICE_URLSHORTENER}
|
||||
- SERVICE_API=${SERVICE_API}
|
||||
- SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM}
|
||||
- SERVICE_STUDIO=${SERVICE_STUDIO}
|
||||
- SERVICE_SSOAUTH=${SERVICE_SSOAUTH}
|
||||
- SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR}
|
||||
|
@ -92,6 +92,13 @@ services:
|
||||
target: api
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-api-system:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: api_system
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api-system:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-studio:
|
||||
build:
|
||||
context: ./
|
||||
|
@ -6,8 +6,9 @@ import {
|
||||
tablet,
|
||||
smallTablet,
|
||||
desktop,
|
||||
size,
|
||||
} from "@docspace/components/utils/device";
|
||||
import { isMobile } from "react-device-detect";
|
||||
import { isMobile, isMobileOnly } from "react-device-detect";
|
||||
|
||||
const EmptyPageStyles = css`
|
||||
padding: 44px 0px 64px 0px;
|
||||
@ -32,11 +33,10 @@ const EmptyPageStyles = css`
|
||||
@media ${tablet} {
|
||||
padding: 44px 0px 64px 0px;
|
||||
grid-column-gap: 33px;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
@media ${smallTablet} {
|
||||
padding: 20px 0px 64px 11px;
|
||||
padding-right: 44px;
|
||||
}
|
||||
`;
|
||||
|
||||
@ -90,14 +90,26 @@ const EmptyFolderWrapper = styled.div`
|
||||
bottom: 16px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1325px) {
|
||||
${!isMobile &&
|
||||
css`
|
||||
margin-left: 98px;
|
||||
`};
|
||||
}
|
||||
|
||||
${(props) => props.isEmptyPage && `${EmptyPageStyles}`}
|
||||
|
||||
${(props) =>
|
||||
props.isEmptyPage &&
|
||||
isMobileOnly &&
|
||||
css`
|
||||
padding: 20px 42px 64px 11px !important;
|
||||
`}
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
props.sectionWidth <= size.smallTablet &&
|
||||
!isMobileOnly &&
|
||||
css`
|
||||
padding-left: 12px !important;
|
||||
|
||||
.empty-folder_link {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
`}
|
||||
}
|
||||
`;
|
||||
|
||||
@ -113,11 +125,18 @@ const EmptyFoldersContainer = (props) => {
|
||||
imageStyle,
|
||||
buttonStyle,
|
||||
isEmptyPage,
|
||||
sectionWidth,
|
||||
isEmptyFolderContainer,
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<EmptyFolderWrapper isEmptyPage={isEmptyPage}>
|
||||
<EmptyFolderWrapper
|
||||
sectionWidth={sectionWidth}
|
||||
isEmptyPage={isEmptyPage}
|
||||
isEmptyFolderContainer={isEmptyFolderContainer}
|
||||
>
|
||||
<EmptyScreenContainer
|
||||
sectionWidth={sectionWidth}
|
||||
className="empty-folder_container"
|
||||
style={style}
|
||||
imageStyle={imageStyle}
|
||||
@ -129,6 +148,7 @@ const EmptyFoldersContainer = (props) => {
|
||||
descriptionText={descriptionText}
|
||||
buttons={buttons}
|
||||
isEmptyPage={isEmptyPage}
|
||||
isEmptyFolderContainer={isEmptyFolderContainer}
|
||||
/>
|
||||
</EmptyFolderWrapper>
|
||||
);
|
||||
|
@ -14,6 +14,7 @@ const EmptyFolderContainer = ({
|
||||
parentId,
|
||||
linkStyles,
|
||||
isRooms,
|
||||
sectionWidth,
|
||||
}) => {
|
||||
const onBackToParentFolder = () => {
|
||||
setIsLoading(true);
|
||||
@ -83,6 +84,8 @@ const EmptyFolderContainer = ({
|
||||
descriptionText={t("EmptyFolderDecription")}
|
||||
imageSrc="/static/images/empty_screen_alt.svg"
|
||||
buttons={buttons}
|
||||
sectionWidth={sectionWidth}
|
||||
isEmptyFolderContainer={true}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
@ -48,6 +48,7 @@ const RootFolderContainer = (props) => {
|
||||
isEmptyPage,
|
||||
setIsEmptyPage,
|
||||
isVisitor,
|
||||
sectionWidth,
|
||||
} = props;
|
||||
const personalDescription = t("PersonalEmptyContainerDescription");
|
||||
const shareDescription = t("SharedEmptyContainerDescription");
|
||||
@ -342,6 +343,7 @@ const RootFolderContainer = (props) => {
|
||||
<EmptyContainer
|
||||
headerText={headerText}
|
||||
isEmptyPage={isEmptyPage}
|
||||
sectionWidth={sectionWidth}
|
||||
{...emptyFolderProps}
|
||||
/>
|
||||
)}
|
||||
|
@ -20,6 +20,7 @@ const EmptyContainer = ({
|
||||
parentId,
|
||||
theme,
|
||||
setCreateRoomDialogVisible,
|
||||
sectionWidth,
|
||||
}) => {
|
||||
linkStyles.color = theme.filesEmptyContainer.linkColor;
|
||||
|
||||
@ -49,9 +50,14 @@ const EmptyContainer = ({
|
||||
onCreate={onCreate}
|
||||
linkStyles={linkStyles}
|
||||
onCreateRoom={onCreateRoom}
|
||||
sectionWidth={sectionWidth}
|
||||
/>
|
||||
) : (
|
||||
<EmptyFolderContainer onCreate={onCreate} linkStyles={linkStyles} />
|
||||
<EmptyFolderContainer
|
||||
sectionWidth={sectionWidth}
|
||||
onCreate={onCreate}
|
||||
linkStyles={linkStyles}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -224,7 +224,7 @@ class SelectFolderDialog extends React.Component {
|
||||
const buttonIsDisabled =
|
||||
isDisableButton ||
|
||||
(isRecycleBin && currentFolderId === resultingFolderId) ||
|
||||
selectionFiles[0]?.parentId === +resultingFolderId;
|
||||
(selectionFiles && selectionFiles[0])?.parentId === +resultingFolderId;
|
||||
|
||||
const isCurrentFolder = +currentFolderId === +resultingFolderId;
|
||||
|
||||
|
@ -56,6 +56,8 @@ const SectionFilterContent = ({
|
||||
groups,
|
||||
customNames,
|
||||
}) => {
|
||||
const [selectedFilterValues, setSelectedFilterValues] = React.useState(null);
|
||||
|
||||
//TODO: add new options from filter after update backend and fix manager from role
|
||||
const onFilter = (data) => {
|
||||
const status = getStatus(data);
|
||||
@ -79,7 +81,7 @@ const SectionFilterContent = ({
|
||||
newFilter.group = group;
|
||||
|
||||
setIsLoading(true);
|
||||
fetchPeople(newFilter).finally(() => setIsLoading(false));
|
||||
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
|
||||
};
|
||||
|
||||
const onSort = (sortId, sortDirection) => {
|
||||
@ -93,7 +95,7 @@ const SectionFilterContent = ({
|
||||
|
||||
setIsLoading(true);
|
||||
|
||||
fetchPeople(newFilter).finally(() => setIsLoading(false));
|
||||
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
|
||||
};
|
||||
|
||||
const onSearch = (data = "") => {
|
||||
@ -103,7 +105,7 @@ const SectionFilterContent = ({
|
||||
|
||||
setIsLoading(true);
|
||||
|
||||
fetchPeople(newFilter).finally(() => setIsLoading(false));
|
||||
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
|
||||
};
|
||||
|
||||
// TODO: change translation keys
|
||||
@ -232,7 +234,7 @@ const SectionFilterContent = ({
|
||||
}, [filter.sortOrder, filter.sortBy]);
|
||||
|
||||
//TODO: add new options from filter after update backend
|
||||
const getSelectedFilterData = async () => {
|
||||
const getSelectedFilterData = React.useCallback(async () => {
|
||||
const { guestCaption, userCaption, groupCaption } = customNames;
|
||||
const filterValues = [];
|
||||
|
||||
@ -295,8 +297,59 @@ const SectionFilterContent = ({
|
||||
}
|
||||
}
|
||||
|
||||
return filterValues;
|
||||
};
|
||||
const currentFilterValues = [];
|
||||
|
||||
setSelectedFilterValues((value) => {
|
||||
if (!value) {
|
||||
currentFilterValues.push(...filterValues);
|
||||
return filterValues.map((f) => ({ ...f }));
|
||||
}
|
||||
|
||||
const items = value.map((v) => {
|
||||
const item = filterValues.find((f) => f.group === v.group);
|
||||
|
||||
if (item) {
|
||||
if (item.isMultiSelect) {
|
||||
let isEqual = true;
|
||||
|
||||
item.key.forEach((k) => {
|
||||
if (!v.key.includes(k)) {
|
||||
isEqual = false;
|
||||
}
|
||||
});
|
||||
|
||||
if (isEqual) return item;
|
||||
|
||||
return false;
|
||||
} else {
|
||||
if (item.key === v.key) return item;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
const newItems = filterValues.filter(
|
||||
(v) => !items.find((i) => i.group === v.group)
|
||||
);
|
||||
|
||||
items.push(...newItems);
|
||||
|
||||
currentFilterValues.push(...items.filter((i) => i));
|
||||
|
||||
return items.filter((i) => i);
|
||||
});
|
||||
|
||||
return currentFilterValues;
|
||||
}, [
|
||||
filter.employeeStatus,
|
||||
filter.activationStatus,
|
||||
filter.role,
|
||||
filter.group,
|
||||
t,
|
||||
customNames,
|
||||
]);
|
||||
|
||||
//TODO: add new options from filter after update backend
|
||||
const removeSelectedItem = ({ key, group }) => {
|
||||
@ -317,12 +370,12 @@ const SectionFilterContent = ({
|
||||
}
|
||||
|
||||
setIsLoading(true);
|
||||
fetchPeople(newFilter).finally(() => setIsLoading(false));
|
||||
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
|
||||
};
|
||||
|
||||
const clearAll = () => {
|
||||
setIsLoading(true);
|
||||
fetchPeople().finally(() => setIsLoading(false));
|
||||
fetchPeople(null, true).finally(() => setIsLoading(false));
|
||||
};
|
||||
|
||||
return isLoaded && tReady ? (
|
||||
|
@ -244,7 +244,7 @@ const SectionBodyContent = (props) => {
|
||||
{(context) =>
|
||||
isEmptyFilesList || null ? (
|
||||
<>
|
||||
<EmptyContainer />
|
||||
<EmptyContainer sectionWidth={context.sectionWidth} />
|
||||
</>
|
||||
) : viewAs === "tile" ? (
|
||||
<>
|
||||
|
@ -155,6 +155,8 @@ const SectionFilterContent = ({
|
||||
setCurrentRoomsFilter,
|
||||
providers,
|
||||
}) => {
|
||||
const [selectedFilterValues, setSelectedFilterValues] = React.useState(null);
|
||||
|
||||
const onFilter = React.useCallback(
|
||||
(data) => {
|
||||
if (isRooms) {
|
||||
@ -378,30 +380,6 @@ const SectionFilterContent = ({
|
||||
// });
|
||||
// }
|
||||
|
||||
if (roomsFilter.provider) {
|
||||
const provider = +roomsFilter.provider;
|
||||
|
||||
const label = RoomsProviderTypeName[provider];
|
||||
|
||||
filterValues.push({
|
||||
key: provider,
|
||||
label: label,
|
||||
group: FilterGroups.roomFilterProviderType,
|
||||
});
|
||||
}
|
||||
|
||||
if (roomsFilter.type) {
|
||||
const key = +roomsFilter.type;
|
||||
|
||||
const label = getDefaultRoomName(key, t);
|
||||
|
||||
filterValues.push({
|
||||
key: key,
|
||||
label: label,
|
||||
group: FilterGroups.roomFilterType,
|
||||
});
|
||||
}
|
||||
|
||||
if (roomsFilter.subjectId) {
|
||||
const isMe = userId === roomsFilter.subjectId;
|
||||
let label = isMe
|
||||
@ -431,6 +409,18 @@ const SectionFilterContent = ({
|
||||
// });
|
||||
// }
|
||||
|
||||
if (roomsFilter.type) {
|
||||
const key = +roomsFilter.type;
|
||||
|
||||
const label = getDefaultRoomName(key, t);
|
||||
|
||||
filterValues.push({
|
||||
key: key,
|
||||
label: label,
|
||||
group: FilterGroups.roomFilterType,
|
||||
});
|
||||
}
|
||||
|
||||
if (roomsFilter?.tags?.length > 0) {
|
||||
filterValues.push({
|
||||
key: roomsFilter.tags,
|
||||
@ -438,6 +428,18 @@ const SectionFilterContent = ({
|
||||
isMultiSelect: true,
|
||||
});
|
||||
}
|
||||
|
||||
if (roomsFilter.provider) {
|
||||
const provider = +roomsFilter.provider;
|
||||
|
||||
const label = RoomsProviderTypeName[provider];
|
||||
|
||||
filterValues.push({
|
||||
key: provider,
|
||||
label: label,
|
||||
group: FilterGroups.roomFilterProviderType,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (filter.withSubfolders === "false") {
|
||||
filterValues.push({
|
||||
@ -525,7 +527,51 @@ const SectionFilterContent = ({
|
||||
}
|
||||
}
|
||||
|
||||
return filterValues;
|
||||
const currentFilterValues = [];
|
||||
|
||||
setSelectedFilterValues((value) => {
|
||||
if (!value) {
|
||||
currentFilterValues.push(...filterValues);
|
||||
return filterValues.map((f) => ({ ...f }));
|
||||
}
|
||||
|
||||
const items = value.map((v) => {
|
||||
const item = filterValues.find((f) => f.group === v.group);
|
||||
|
||||
if (item) {
|
||||
if (item.isMultiSelect) {
|
||||
let isEqual = true;
|
||||
|
||||
item.key.forEach((k) => {
|
||||
if (!v.key.includes(k)) {
|
||||
isEqual = false;
|
||||
}
|
||||
});
|
||||
|
||||
if (isEqual) return item;
|
||||
|
||||
return false;
|
||||
} else {
|
||||
if (item.key === v.key) return item;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
const newItems = filterValues.filter(
|
||||
(v) => !items.find((i) => i.group === v.group)
|
||||
);
|
||||
|
||||
items.push(...newItems);
|
||||
|
||||
currentFilterValues.push(...items.filter((i) => i));
|
||||
|
||||
return items.filter((i) => i);
|
||||
});
|
||||
|
||||
return currentFilterValues;
|
||||
}, [
|
||||
filter.withSubfolders,
|
||||
filter.authorType,
|
||||
|
@ -36,6 +36,13 @@ const StyledSettingsComponent = styled.div`
|
||||
.dns-setting_helpbutton {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.dns-textarea {
|
||||
textarea {
|
||||
color: ${(props) => props.theme.text.disableColor};
|
||||
}
|
||||
}
|
||||
|
||||
.combo-button-label {
|
||||
max-width: 100%;
|
||||
font-weight: 400;
|
||||
|
@ -16,6 +16,7 @@ import { DNSSettingsTooltip } from "../sub-components/common-tooltips";
|
||||
import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings";
|
||||
import { setDocumentTitle } from "SRC_DIR/helpers/utils";
|
||||
import LoaderCustomization from "../sub-components/loaderCustomization";
|
||||
import Textarea from "@docspace/components/textarea";
|
||||
import withLoading from "SRC_DIR/HOCs/withLoading";
|
||||
import Badge from "@docspace/components/badge";
|
||||
const DNSSettings = (props) => {
|
||||
@ -93,21 +94,20 @@ const DNSSettings = (props) => {
|
||||
|
||||
const settingsBlock = (
|
||||
<div className="settings-block">
|
||||
<div className="settings-block-description settings_unavailable">
|
||||
{t("DNSSettingsMobile")}
|
||||
</div>
|
||||
<div className="settings-block-description">{t("DNSSettingsMobile")}</div>
|
||||
<FieldContainer
|
||||
id="fieldContainerDNSSettings"
|
||||
className="field-container-width settings_unavailable"
|
||||
labelText={`${t("YourCurrentDomain")}`}
|
||||
isVertical={true}
|
||||
>
|
||||
<TextInput
|
||||
tabIndex={8}
|
||||
<Textarea
|
||||
id="textInputContainerDNSSettings"
|
||||
scale={true}
|
||||
className="dns-textarea"
|
||||
heightTextArea={30}
|
||||
tabIndex={8}
|
||||
isDisabled={true}
|
||||
value={location.hostname}
|
||||
isDisabled={!isSettingPaid}
|
||||
/>
|
||||
</FieldContainer>
|
||||
</div>
|
||||
@ -123,9 +123,7 @@ const DNSSettings = (props) => {
|
||||
>
|
||||
{isCustomizationView && !isMobileView && (
|
||||
<div className="category-item-heading">
|
||||
<div className="category-item-title settings_unavailable">
|
||||
{t("DNSSettings")}
|
||||
</div>
|
||||
<div className="category-item-title">{t("DNSSettings")}</div>
|
||||
<HelpButton
|
||||
iconName="static/images/combined.shape.svg"
|
||||
size={12}
|
||||
|
@ -23,7 +23,7 @@ class UsersStore {
|
||||
makeAutoObservable(this);
|
||||
}
|
||||
|
||||
getUsersList = async (filter) => {
|
||||
getUsersList = async (filter, updateFilter = false) => {
|
||||
const filterData = filter ? filter.clone() : Filter.getDefault();
|
||||
|
||||
if (!this.authStore.settingsStore.withPaging) {
|
||||
@ -41,6 +41,10 @@ class UsersStore {
|
||||
const res = await api.people.getUserList(filterData);
|
||||
filterData.total = res.total;
|
||||
|
||||
if (updateFilter) {
|
||||
this.peopleStore.filterStore.setFilterParams(filterData);
|
||||
}
|
||||
|
||||
/* this.peopleStore.filterStore.setFilterParams(filterData);
|
||||
this.peopleStore.selectedGroupStore.setSelectedGroup(
|
||||
filterData.group || "root"
|
||||
|
@ -1,6 +1,14 @@
|
||||
import styled, { css } from "styled-components";
|
||||
import { mobile, tablet, smallTablet, desktop } from "../utils/device";
|
||||
import {
|
||||
mobile,
|
||||
tablet,
|
||||
smallTablet,
|
||||
desktop,
|
||||
size,
|
||||
hugeDesktop,
|
||||
} from "../utils/device";
|
||||
import NoUserSelect from "../utils/commonStyles";
|
||||
import { isMobileOnly } from "react-device-detect";
|
||||
|
||||
const EmptyPageStyles = css`
|
||||
grid-row-gap: 9px;
|
||||
@ -15,31 +23,38 @@ const EmptyPageStyles = css`
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.ec-header {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.ec-buttons {
|
||||
max-width: 285px;
|
||||
}
|
||||
|
||||
.empty-folder_container-links {
|
||||
align-items: start;
|
||||
margin: 16px 0 !important;
|
||||
}
|
||||
|
||||
@media ${smallTablet} {
|
||||
.ec-image {
|
||||
height: 72px;
|
||||
}
|
||||
max-width: 800px;
|
||||
|
||||
@media ${hugeDesktop} {
|
||||
margin: 0 13%;
|
||||
width: 74%;
|
||||
min-width: 480px;
|
||||
}
|
||||
|
||||
@media ${tablet} {
|
||||
max-width: 480px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
${(props) =>
|
||||
props.sectionWidth > size.smallTablet &&
|
||||
css`
|
||||
margin: 0 13% !important;
|
||||
width: 74%;
|
||||
min-width: auto;
|
||||
`}
|
||||
}
|
||||
|
||||
@media ${smallTablet} {
|
||||
.ec-header {
|
||||
padding-top: 22px;
|
||||
}
|
||||
|
||||
.ec-desc {
|
||||
max-width: 282px;
|
||||
}
|
||||
}
|
||||
|
||||
@media ${desktop} {
|
||||
@ -53,14 +68,39 @@ const EmptyPageStyles = css`
|
||||
}
|
||||
`;
|
||||
|
||||
const MobileView = css`
|
||||
grid-template-areas:
|
||||
"img img img"
|
||||
"headerText headerText headerText"
|
||||
${(props) =>
|
||||
props.subheadingText && `"subheadingText subheadingText subheadingText"`}
|
||||
${(props) =>
|
||||
props.descriptionText &&
|
||||
`"descriptionText descriptionText descriptionText"`}
|
||||
"button button button";
|
||||
|
||||
.ec-header {
|
||||
padding-top: 0px;
|
||||
}
|
||||
.ec-header,
|
||||
.ec-subheading,
|
||||
.ec-desc,
|
||||
.ec-image,
|
||||
.ec-buttons {
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
.ec-image {
|
||||
height: 75px;
|
||||
margin-left: 0;
|
||||
}
|
||||
`;
|
||||
|
||||
const EmptyContentBody = styled.div`
|
||||
margin: 0 auto;
|
||||
padding: 64px 0;
|
||||
grid-template-columns: 150px 1fr;
|
||||
|
||||
@media ${tablet} {
|
||||
grid-template-columns: none;
|
||||
}
|
||||
padding: ${(props) => (props.isEmptyFolderContainer ? "37px 0" : "64px 0")};
|
||||
grid-template-columns: 150px 1fr;
|
||||
|
||||
display: grid;
|
||||
grid-template-areas:
|
||||
@ -80,12 +120,9 @@ const EmptyContentBody = styled.div`
|
||||
${NoUserSelect}
|
||||
}
|
||||
|
||||
@media ${tablet} {
|
||||
max-width: 480px;
|
||||
}
|
||||
|
||||
.ec-header {
|
||||
grid-area: headerText;
|
||||
font-size: 16px;
|
||||
padding-top: 16px;
|
||||
@media (max-width: 375px) {
|
||||
margin-top: 5px;
|
||||
@ -106,9 +143,14 @@ const EmptyContentBody = styled.div`
|
||||
grid-area: button;
|
||||
}
|
||||
|
||||
@media ${tablet} {
|
||||
grid-template-columns: none;
|
||||
max-width: 480px;
|
||||
}
|
||||
|
||||
@media (orientation: portrait) {
|
||||
@media (max-width: 768px) {
|
||||
padding-top: 0px;
|
||||
padding-top: ${(props) => !props.isEmptyFolderContainer && "0px"};
|
||||
|
||||
.ec-image {
|
||||
max-height: 100px;
|
||||
@ -116,36 +158,53 @@ const EmptyContentBody = styled.div`
|
||||
}
|
||||
|
||||
@media (max-width: 428px) {
|
||||
grid-template-areas:
|
||||
"img img img"
|
||||
"headerText headerText headerText"
|
||||
${(props) =>
|
||||
props.subheadingText &&
|
||||
`"subheadingText subheadingText subheadingText"`}
|
||||
${(props) =>
|
||||
props.descriptionText &&
|
||||
`"descriptionText descriptionText descriptionText"`}
|
||||
"button button button";
|
||||
|
||||
.ec-header {
|
||||
padding-top: 0px;
|
||||
}
|
||||
.ec-header,
|
||||
.ec-subheading,
|
||||
.ec-desc,
|
||||
.ec-image,
|
||||
.ec-buttons {
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
.ec-image {
|
||||
height: 75px;
|
||||
margin-left: 0;
|
||||
}
|
||||
${MobileView}
|
||||
}
|
||||
}
|
||||
|
||||
${(props) => props.isEmptyPage && `${EmptyPageStyles}`}
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) && `${EmptyPageStyles}`}
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
props.sectionWidth <= size.smallTablet &&
|
||||
!isMobileOnly &&
|
||||
css`
|
||||
${MobileView}
|
||||
|
||||
.ec-desc {
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
.ec-header {
|
||||
padding-top: 22px;
|
||||
}
|
||||
|
||||
.ec-image {
|
||||
height: 100px !important;
|
||||
}
|
||||
`}
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
isMobileOnly &&
|
||||
css`
|
||||
.ec-image {
|
||||
margin-top: ${(props) => props.isEmptyFolderContainer && "0px"};
|
||||
height: ${(props) => props.isEmptyPage && "72px !important"};
|
||||
}
|
||||
`}
|
||||
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
props.sectionWidth <= size.smallTablet &&
|
||||
css`
|
||||
max-width: none !important;
|
||||
width: auto !important;
|
||||
min-width: auto !important;
|
||||
margin: 0 !important;
|
||||
`}
|
||||
`;
|
||||
|
||||
const EmptyContentImage = styled.img.attrs((props) => ({
|
||||
|
@ -17,7 +17,7 @@ const StyledOuter = styled.div`
|
||||
}
|
||||
path {
|
||||
fill: ${(props) =>
|
||||
props.color ? props.color : props.theme.iconButton.color} !important;
|
||||
props.color ? props.color : props.theme.iconButton.color};
|
||||
}
|
||||
}
|
||||
&:hover {
|
||||
|
@ -2734,6 +2734,7 @@ const Base = {
|
||||
textColor: gray,
|
||||
navBackground: "#F8F9F9",
|
||||
headerColor: black,
|
||||
helpButton: "#A3A9AE",
|
||||
|
||||
register: {
|
||||
backgroundColor: grayLight,
|
||||
|
@ -2740,6 +2740,7 @@ const Dark = {
|
||||
textColor: "#858585",
|
||||
navBackground: "#282828",
|
||||
headerColor: white,
|
||||
helpButton: "#D8D8D8",
|
||||
|
||||
register: {
|
||||
backgroundColor: "#292929",
|
||||
|
@ -6,6 +6,7 @@ export const size = {
|
||||
smallTablet: 600,
|
||||
tablet: 1024,
|
||||
desktop: 1025,
|
||||
hugeDesktop: 1439,
|
||||
};
|
||||
|
||||
export const mobile = `(max-width: ${size.mobile}px)`;
|
||||
@ -18,6 +19,8 @@ export const tablet = `(max-width: ${size.tablet}px)`;
|
||||
|
||||
export const desktop = `(min-width: ${size.desktop}px)`;
|
||||
|
||||
export const hugeDesktop = `(max-width: ${size.hugeDesktop}px)`;
|
||||
|
||||
export const isMobile = () => {
|
||||
return window.innerWidth <= size.mobile;
|
||||
};
|
||||
|
@ -174,6 +174,14 @@ export const LoginContainer = styled.div`
|
||||
}
|
||||
}
|
||||
|
||||
.help-button{
|
||||
svg {
|
||||
path {
|
||||
fill: ${(props) => props.theme.login.helpButton};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.checkbox-text{
|
||||
color: ${(props) => props.theme.checkbox.arrowColor};
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ const LoginForm: React.FC<ILoginFormProps> = ({
|
||||
helpButton={
|
||||
!checkIsSSR() && (
|
||||
<HelpButton
|
||||
color="#A3A9AE"
|
||||
className="help-button"
|
||||
helpButtonHeaderContent={t("CookieSettingsTitle")}
|
||||
tooltipContent={
|
||||
<Text fontSize="12px">{t("RememberHelper")}</Text>
|
||||
|
@ -147,7 +147,7 @@ public class WhitelabelController : BaseSettingsController
|
||||
|
||||
|
||||
///<visible>false</visible>
|
||||
[AllowNotPayment]
|
||||
[AllowNotPayment, AllowAnonymous]
|
||||
[HttpGet("whitelabel/logos")]
|
||||
public Dictionary<string, string> GetWhiteLabelLogos([FromQuery] WhiteLabelQueryRequestsDto inDto)
|
||||
{
|
||||
|
@ -46,13 +46,11 @@ public class StudioSmsNotificationSettingsHelper : TfaSettingsHelperBase<StudioS
|
||||
{
|
||||
private readonly CoreBaseSettings _coreBaseSettings;
|
||||
private readonly SetupInfo _setupInfo;
|
||||
private readonly SettingsManager _settingsManager;
|
||||
private readonly SmsProviderManager _smsProviderManager;
|
||||
private readonly TenantManager _tenantManager;
|
||||
|
||||
public StudioSmsNotificationSettingsHelper(
|
||||
IHttpContextAccessor httpContextAccessor,
|
||||
TenantExtra tenantExtra,
|
||||
CoreBaseSettings coreBaseSettings,
|
||||
SetupInfo setupInfo,
|
||||
SettingsManager settingsManager,
|
||||
@ -63,7 +61,6 @@ public class StudioSmsNotificationSettingsHelper : TfaSettingsHelperBase<StudioS
|
||||
{
|
||||
_coreBaseSettings = coreBaseSettings;
|
||||
_setupInfo = setupInfo;
|
||||
_settingsManager = settingsManager;
|
||||
_smsProviderManager = smsProviderManager;
|
||||
_tenantManager = tenantManager;
|
||||
}
|
||||
|
@ -70,28 +70,36 @@ public abstract class TfaSettingsHelperBase<T> where T : TfaSettingsBase<T>, new
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (var mandatory in settings.MandatoryGroups)
|
||||
{
|
||||
if (_userManager.IsUserInGroup(userGuid, mandatory))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (settings.MandatoryGroups != null)
|
||||
{
|
||||
foreach (var mandatory in settings.MandatoryGroups)
|
||||
{
|
||||
if (_userManager.IsUserInGroup(userGuid, mandatory))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var mandatory in settings.MandatoryUsers)
|
||||
{
|
||||
if (mandatory == userGuid)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (settings.MandatoryUsers != null)
|
||||
{
|
||||
foreach (var mandatory in settings.MandatoryUsers)
|
||||
{
|
||||
if (mandatory == userGuid)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var requestIP = MessageSettings.GetIP(_httpContextAccessor.HttpContext.Request);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(requestIP) && settings.TrustedIps.Any(trustedIp => IPSecurity.IPSecurity.MatchIPs(requestIP, trustedIp)))
|
||||
{
|
||||
return false;
|
||||
|
||||
if (settings.TrustedIps != null && settings.TrustedIps.Any())
|
||||
{
|
||||
var requestIP = MessageSettings.GetIP(_httpContextAccessor.HttpContext.Request);
|
||||
if (!string.IsNullOrWhiteSpace(requestIP) && settings.TrustedIps.Any(trustedIp => IPSecurity.IPSecurity.MatchIPs(requestIP, trustedIp)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user