Merge branch 'develop' into feature/new-docspace-translations

This commit is contained in:
Alexey Safronov 2022-10-27 11:56:46 +03:00
commit 0e868c01ae
37 changed files with 609 additions and 116 deletions

View File

@ -84,8 +84,10 @@ else
fi
# add onlyoffice repo
echo "deb http://download.onlyoffice.com/repo/debian squeeze main" | tee /etc/apt/sources.list.d/onlyoffice.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5
echo "deb [signed-by=/usr/share/keyrings/onlyoffice.gpg] http://download.onlyoffice.com/repo/debian squeeze main" | tee /etc/apt/sources.list.d/onlyoffice.list
mkdir -p -m 700 $HOME/.gnupg
gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/onlyoffice.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys CB2DE8E5
chmod 644 /usr/share/keyrings/onlyoffice.gpg
echo "deb http://static.teamlab.info.s3.amazonaws.com/repo/4testing/debian stable main" | sudo tee /etc/apt/sources.list.d/onlyoffice4testing.list
declare -x LANG="en_US.UTF-8"

View File

@ -38,8 +38,9 @@ locale-gen en_US.UTF-8
# add elasticsearch repo
ELASTIC_VERSION="7.13.1"
ELASTIC_DIST=$(echo $ELASTIC_VERSION | awk '{ print int($1) }')
curl https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb https://artifacts.elastic.co/packages/${ELASTIC_DIST}.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-${ELASTIC_DIST}.x.list
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/elastic-${ELASTIC_DIST}.x.gpg --import
echo "deb [signed-by=/usr/share/keyrings/elastic-${ELASTIC_DIST}.x.gpg] https://artifacts.elastic.co/packages/${ELASTIC_DIST}.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-${ELASTIC_DIST}.x.list
chmod 644 /usr/share/keyrings/elastic-${ELASTIC_DIST}.x.gpg
# add nodejs repo
curl -sL https://deb.nodesource.com/setup_16.x | bash -
@ -84,15 +85,15 @@ fi
# add redis repo
if [ "$DIST" = "ubuntu" ]; then
add-apt-repository -y ppa:chris-lea/redis-server
if [ "$DISTRIB_CODENAME" = "jammy" ]; then sed -i 's/jammy/focal/g' /etc/apt/sources.list.d/*redis-server*.list; fi; #Fix missing repository for jammy
curl -fsSL https://packages.redis.io/gpg | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/redis.gpg --import
echo "deb [signed-by=/usr/share/keyrings/redis.gpg] https://packages.redis.io/deb $DISTRIB_CODENAME main" | tee /etc/apt/sources.list.d/redis.list
chmod 644 /usr/share/keyrings/redis.gpg
fi
#add nginx repo
curl http://nginx.org/keys/nginx_signing.key -O
apt-key add nginx_signing.key
echo "deb [arch=$ARCH] http://nginx.org/packages/$DIST $DISTRIB_CODENAME nginx" | tee /etc/apt/sources.list.d/nginx.list
rm nginx_signing.key
curl -s http://nginx.org/keys/nginx_signing.key | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/nginx.gpg --import
echo "deb [signed-by=/usr/share/keyrings/nginx.gpg] http://nginx.org/packages/$DIST/ $DISTRIB_CODENAME nginx" | tee /etc/apt/sources.list.d/nginx.list
chmod 644 /usr/share/keyrings/nginx.gpg
# setup msttcorefonts
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
{
"AccessRightsAccessToProduct": "Access to {{product}} module is given to",
"AccessRightsAllUsers": "All {{users}}",
@ -237,3 +238,243 @@
"YouHaveUnsavedChanges": "You have unsaved changes",
"YourCurrentDomain": "Your current domain"
}
=======
{
"AccessRightsAccessToProduct": "Access to {{product}} module is given to",
"AccessRightsAllUsers": "All {{users}}",
"AccessRightsChangeOwnerConfirmText": "Changes will be applied after the confirmation via email.",
"AccessRightsOwnerOpportunities": "Do the same as module administrators|Appoint module administrators|Set modules access rights|Manage portal configuration|Manage user accounts|Change portal owner|Backup portal data|Deactivate or delete portal",
"AccessRightsProductUsersCan": "{{category}} users can",
"AccessRightsSubTitle": "This section allows you to transfer portal owner rights and manage administrator access rights.",
"AccessRightsUsersFromList": "{{users}} from the list",
"AccessSettings": "Access settings",
"AddAdmins": "Add admins",
"AddAllowedIP": "Add allowed IP address",
"AdditionalResources": "Additional resources",
"AdditionalResourcesDescription": "Choose whether you want to display links to additional resources in DocSpace menu.",
"AddName": "Add Name",
"AddTrustedDomain": "Add trusted domain",
"AdminInModules": "Admin in modules",
"AdministratorsAddedSuccessfully": "Administrators added successfully",
"AdministratorsRemovedSuccessfully": "Administrators removed successfully",
"Admins": "Admins",
"AdminsMessage": "Administrator Message Settings",
"AdminsMessageDescription": "Administrator Message Settings is a way to contact the portal administrator.",
"AdminsMessageHelper": "Enable this option to display the contact form on the Sign In page so that people could send the message to the portal administrator in case they have troubles accessing the portal.",
"AllDomains": "Any domains",
"AmazonBucketTip": "Enter the unique name of the Amazon S3 bucket where you want to store your backups",
"AmazonCSE": "Client-Side Encryption",
"AmazonForcePathStyleTip": "When true, requests will always use path style addressing",
"AmazonHTTPTip": "If this property is set to true, the client attempts to use HTTP protocol, if the target endpoint supports it. By default, this property is set to false",
"AmazonRegionTip": "Enter the AWS region where your Amazon bucket resides",
"AmazonSSE": "Server-Side Encryption",
"AmazonSSETip": "The Server-side encryption algorithm used when storing this object in S3",
"AmazonServiceTip": "This is an optional property; change it only if you want to try a different service endpoint",
"Appearance": "Appearance",
"AuditDownloadText": "You can download the report for the data available during the selected storage period to view the detailed statistics. Please note, that the logging is currently enabled for the Documents, Projects, CRM and People modules, as well as for portal settings.",
"AuditSubheader": "The subsection allows you to browse through the list of the latest changes (creation, modification, deletion etc.) made by users to the entities (rooms, opportunities, files etc.) on your portal.",
"AuditTrailNav": "Audit Trail",
"AutoBackup": "Automatic backup",
"AutoBackupDescription": "Use this option for automatic backup of the portal data.",
"AutoBackupHelp": "The <strong>Automatic backup</strong> option is used to automate the portal data backup process to be able to restore it later to a local server.",
"AutoBackupHelpNote": "Choose the data storage, automatic backup period and maximal number of saved copies.<br/><strong>Note:</strong> before you can save the backup data to a third-party account (DropBox, Box.com, OneDrive or Google Drive), you will need to connect this account to {{organizationName}} Common folder.",
"AutoSavePeriod": "Autosave period",
"AutoSavePeriodHelp": "The time shown below corresponds to the time zone set in the portal.",
"Backup": "Backup",
"BackupCreatedError": "An error has been encountered. Please contact your administrator.",
"BackupCreatedSuccess": "The backup copy has been successfully created.",
"BackupList": "Backup List",
"BackupListWarningText": "If you delete any items from the list, their corresponding files will also be deleted. This action cannot be undone. To delete all the files use the link:",
"Branding": "Branding",
"BrandingSectionDescription": "Specify your company information, add links to external resources, and email addresses displayed within the online office interface.",
"BrandingSubtitle": "Use this option to provide on-brand experience to your users. These settings will be effective for all of your portals.",
"BrowserNoCanvasSupport": "Your browser does not support the HTML5 canvas tag.",
"BreakpointWarningText": "This section is only available in desktop version",
"BreakpointWarningTextPrompt": "Please use the desktop site to access <1>{{content}}</1>",
"ByApp": "By authenticator app",
"BySms": "By sms",
"ChangeLogoButton": "Change Logo",
"ChangeOwner": "Change portal owner",
"Characters": "{{length}} characters",
"ChooseOwner": "Choose owner",
"ClearBackupList": "Delete all backups",
"CompanyInfoSettings": "Company info settings",
"CompanyNameForCanvasLogo": "Company name",
"CompanyInfoSettingsDescription": "This information will be displayed in the <1>{{link}}</1> window.",
"ConfirmEmailSended": "Confirmation e-mail has been sent to {{ownerName}}",
"PortalDeletionEmailSended": "A link to confirm the operation has been sent to {{ownerEmail}} (the email address of the portal owner).",
"CustomDomains": "Custom domains",
"CustomTitles": "Custom titles",
"CustomTitlesFrom": "From",
"CustomTitlesSettingsDescription": "Welcome Page Settings is a way to change the default portal title to be displayed on the Welcome Page of your portal. The same name is also used for the From field of your portal email notifications.",
"CustomTitlesSettingsTooltip": "<0>{{ welcomeText }}</0> is a way to change the default portal title to be displayed on the <2>{{ text }}</2> of your portal. The same name is also used for the <4>{{ from }}</4> field of your portal email notifications.",
"CustomTitlesSettingsTooltipDescription": "Enter the name you like in the <1>{{ header }}</1> field.",
"CustomTitlesText": "Welcome Page",
"CustomTitlesWelcome": "Welcome Page Settings",
"Customization": "Customization",
"CustomizationDescription": "This subsection allows you to change the look and feel of your portal. You can use your own company logo, name and text to match your organization brand.",
"DataBackup": "Data backup",
"Deactivate": "Deactivate",
"DeactivateOrDeletePortal": "Deactivate or delete portal.",
"DeleteDataHeader": "Portal deactivation/deletion",
"DeleteDocSpace": "Delete DocSpace",
"DeleteDocSpaceInfo": "Before you delete the portal, please make sure that automatic billing is turned off. You may check the status of automatic billing in <1>on your Stripe customer portal.</1>",
"Disabled": "Disabled",
"DNSSettings": "DNS Settings",
"DNSSettingsDescription": "DNS Settings is a way to set an alternative URL for your portal.",
"DNSSettingsMobile": "Send your request to our support team, and our specialists will help you with the settings.",
"DNSSettingsTooltip": "DNS Settings allow you to set an alternative URL address for your {{ organizationName }} portal. Send your request to our support team, and our specialists will help you with the settings.<2>{{learnMore}}</2>",
"DocSpaceMenu": "DocSpace menu",
"DocumentsAdministratorsCan": "Documents administrators can link Dropbox, Box, and other accounts to Common Documents and set up access rights in this section",
"DownloadCopy": "Download the copy",
"DownloadReportBtn": "Download and open report",
"Employees": "users",
"EmptyBackupList": "No backups have been created yet. Create one or more backups for them to appear in this list.",
"EnableAutomaticBackup": "Enable automatic backup.",
"EnableAutomaticBackupDescription": "Use this option to back up the portal data.",
"EnterName": "Enter name",
"EnterTitle": "Enter title",
"EveryDay": "Every day",
"EveryMonth": "Every month",
"EveryWeek": "Every week",
"ForbiddenPageDescription": "To make changes to this section, go to the desktop version.",
"ForbiddenPageHeader": "Section unavailable.",
"ForcePathStyle": "Force Path Style",
"FullAccessTooltip": "Have the same access rights as the portal owner, except the right to:",
"Group": "Group",
"GroupLead": "Group Lead",
"Groups": "Groups",
"Guests": "Guests",
"ImageSizeError": "Image size exceed the allowed parameters",
"IPSecurity": "IP Security",
"IPSecurityDescription": "IP Security is used to restrict login to the portal from all IP addresses except certain addresses.",
"IPSecurityHelper": "You can set the allowed IP addresses using either exact IP addresses in the IPv4 format (#.#.#.#, where # is a numeric value from 0 to 255) or IP range (in the #.#.#.#-#.#.#.# format).",
"IPSecurityWarningHelper": "First you need to specify your current IP or the IP range your current IP address belongs to, otherwise your portal access will be blocked right after you save the settings. The portal owner will have the portal access from any IP address.",
"Job/Title": "Job/Title",
"LanguageAndTimeZoneSettingsDescription": "Language and Time Zone Settings is a way to change the language of the whole portal for all portal users and to configure the time zone so that all the events of the portal will be shown with the correct date and time.",
"LanguageTimeSettingsTooltip": "<0>{{text}}</0> is a way to change the language of the whole portal for all portal users and to configure the time zone so that all the events of the {{ organizationName }} portal will be shown with the correct date and time.",
"LanguageTimeSettingsTooltipDescription": "To make the parameters you set take effect click the <1>{{save}}</1> button at the bottom of the section.<3>{{learnMore}}</3>",
"Lifetime": "Lifetime (min)",
"LocalFile": "Local file",
"LoginDownloadText": "You can download the report for the data available during the selected storage period to view the detailed statistics.",
"LoginHistoryTitle": "Login History",
"LoginLatestText": "Only the latest activity is shown on this page. The data itself is stored during the period specified in the field below (max 180 days).",
"LoginSubheaderTitle": "This subsection is used to monitor the latest user login activity including successful logins and failed attempts with an indication of reasons.",
"LogoAbout": "Logo for the About page",
"LogoCompact": "Logo for the compact left menu",
"LogoDocsEditor": "Logo for the editors header",
"LogoDocsEditorEmbedded": "Logo for the editors header - embedded mode",
"LogoFavicon": "Favicon",
"LogoLightSmall": "Logo for the portal header",
"LogoLogin": "Logo for the Login page",
"LogoSettings": "Portal Logo Settings",
"LogoUploadRecommendation": "We recommended that you use images in <1>PNG</1> format with transparent background",
"ManagementCategoryDataManagement": "Data Management",
"ManagementCategoryIntegration": "Integration",
"ManagementCategorySecurity": "Security",
"ManualBackup": "Manual backup",
"ManualBackupDescription": "Use this option if you want to get all data contained on the portal as a file.",
"ManualBackupHelp": "<strong>Data Backup</strong> option is used to back up the portal data to be able to restore it later to your local server.",
"ManualBackupHelpNote": "Select the storage for the data (do not forget to enter your third-party storage details to be able to access it).<br/><strong>Note:</strong> you need to connect your third-party account (DropBox, Box.com, OneDrive or Google Drive) to {{organizationName}} Common folder before you will be able to save your backup there.",
"MaxCopies": "{{copiesCount}} - maximum number of backup copies",
"Migration": "Migration",
"NoAdmins": "No admins here yet",
"NoAdminsDescription": "You can add new administrator manually",
"NotFoundDescription": "Change filter settings or add people to the section.",
"PasswordMinLenght": "Minimal password length",
"Path": "Path",
"Payments": "Plans & payments",
"PeopleAdministratorsCan": "People module admins can create profiles and groups, import people, and invite users.",
"PleaseNote": "Please note",
"PleaseNoteDescription": "<0>{{pleaseNote}}</0>: your old portal address will become available to new users once you click the <2>{{save}}</2> button.",
"PortalAccess": "Portal access",
"PortalAccessSubTitle": "This section allows you to provide users with safe and convenient ways to access the portal.",
"PortalAdmins": "Portal admins",
"PortalAdminsDescription": "Have the same access rights as the portal owner, except the right to: change portal owner; deactivate or delete portal.",
"PortalNameEmpty": "Account name is empty",
"PortalNameIncorrect": "Incorrect account name",
"PortalNameLength": "The account name must be between 6 and 50 characters long",
"PortalDeactivation": "Deactivate DocSpace",
"PortalDeactivationDescription": "Use this option to deactivate your portal temporarily.",
"PortalDeactivationHelper": "If you wish to deactivate the portal, your portal and all information associated with it will be blocked so that no one has access to it for a particular period. To do that click the Deactivate button. A link to confirm the operation will be sent to the email address of the portal owner.\n In case you want to come back to the portal and resume using it you will need to use the second link provided in the confirmation email. So, please, keep this email in a safe place.",
"PortalDeletion": "Portal Deletion",
"PortalDeletionDescription": "Use this option to delete your portal permanently.",
"PortalDeletionHelper": "If you do not think you will use the portal and would like to delete your portal permanently submit your request using the Delete button. Please, keep in mind that you will not be able to reactivate your portal or recover any information associated with it.",
"PortalOwner": "Portal Owner",
"PortalRenaming": "Portal Renaming",
"PortalRenamingDescription": "Here you can change your portal address.",
"PortalRenamingLabelText": "New portal name",
"PortalRenamingMobile": "Enter the part that will appear next to the onlyoffice.com/onlyoffice.eu portal address. Please note: your old portal address will become available to new users once you click the Save button.",
"PortalRenamingSettingsTooltip": "<0>{{text}}</0> Enter the part that will appear next to the onlyoffice.com/onlyoffice.eu portal address.",
"ProductUserOpportunities": "View profiles and groups",
"RecoveryFileNotSelected": "Recovery error. Recovery file not selected",
"RegistrationDate": "Registration date",
"RestoreBackup": "Restore",
"RestoreBackupDescription": "Use this option to restore your portal from the previously saved backup file.",
"RestoreBackupHelp": "<strong>Data Restore</strong> option is used to restore your previously saved portal data (from a local server or SaaS portal).",
"RestoreBackupHelpNote": "Select the storage where the data is saved, enter necessary details and check the <strong>Send notification to portal users</strong> to alert your portal users about the backup/restore operations.",
"RestoreBackupResetInfoWarningText": "All current passwords will be reset. Portal users will get an email with the access restoration link.",
"RestoreBackupWarningText": "The portal will become unavailable during the restore process. After the restore is complete all the changes made after the date of the selected restore point will be lost.",
"RestoreDefaultButton": "Restore to default",
"RoomsModule": "Backup room",
"RoomsModuleDescription": "You may create a new room specifically for the backup, choose one of the existing rooms, or save the copy in their {{roomName}} room.",
"SelectFileInGZFormat": "Select the file in .GZ format",
"SendNotificationAboutRestoring": "Send notification about portal restoring to users",
"ServerSideEncryptionMethod": "Server Side Encryption Method",
"ServiceUrl": "Service Url",
"SingleSignOn": "Single Sign-On",
"SessionLifetime": "Session Lifetime",
"SessionLifetimeDescription": "Session Lifetime allows to set time (in minutes) before the portal users will need to enter the portal credentials again in order to access the portal.",
"SessionLifetimeHelper": "After save all the users will be logged out from portal.",
"SetDefaultTitle": "Set default title",
"SettingPasswordStrength": "Setting password strength",
"SettingPasswordStrengthDescription": "Password Strength Settings is a way to determine the effectiveness of a password in resisting guessing and brute-force attacks.",
"SettingPasswordStrengthHelper": "Use the Minimum Password Length bar to determine how long the password should be. Check the appropriate boxes below to determine the character set that must be used in the password.",
"ShowFeedbackAndSupport": "Show Feedback & Support link",
"ShowSampleDocuments": "Show sample documents in new rooms",
"ShowVideoGuides": "Show link to Video Guides",
"ShowHelpCenter": "Show link to Help Center",
"StoragePeriod": "Storage period",
"StudioTimeLanguageSettings": "Language and Time Zone Settings",
"SuccessfullySaveGreetingSettingsMessage": "Welcome Page settings have been successfully saved",
"SuccessfullySavePortalNameMessage": "Portal has been renamed successfully",
"SuccessfullySaveSettingsMessage": "Settings have been successfully updated",
"TeamTemplate": "Team template",
"TeamTemplateSettingsDescription": "Team Template is a customizable way to name the organization (or group), its members and their activities. Drop down the Template list to choose one of the available presets or enter the names yourselves selecting the custom option from the list.",
"Template": "Template",
"TemporaryStorage": "Temporary storage",
"TemporaryStorageDescription": "Backup is stored in the 'Backup' section, you will be able to download it within 24 hours after creating.",
"ThirdPartyAuthorization": "Third-party Authorization",
"ThirdPartyBodyDescription": "Detailed instructions in our <2>Help Center</2>.",
"ThirdPartyBottomDescription": "Need help? Contact our <2>Support Team.</2>",
"ThirdPartyHowItWorks": "How It Works?",
"ThirdPartyPropsActivated": "Updated successfully",
"ThirdPartyPropsDeactivated": "Deactivated successfully",
"ThirdPartyResource": "Third-party resource",
"ThirdPartyResourceDescription": "Backup can be saved to your third-party account (Dropbox, Box.com, OneDrive or Google Drive). You need to connect your third-party account (Dropbox, Box.com, OneDrive or Google Drive) before you will be able to save your backup there.",
"ThirdPartyStorage": "Third-party storage",
"ThirdPartyStorageDescription": "Backup can be saved to a third-party storage. Before, you need to connect the corresponding service in the 'Integration' section. Otherwise, the following settings will be inactive.",
"ThirdPartyTitle": "Third-party services",
"ThirdPartyTitleDescription": "With Authorization keys, you can connect third-party services to your portal. Sign in easily with Facebook, Twitter, or LinkedIn; add Dropbox, OneDrive, etc. to work with files stored there from the Documents module.",
"TimeZone": "Time zone",
"TrustedMail": "Trusted mail domain settings",
"TrustedMailDescription": "Trusted Mail Domain Settings is a way to specify the mail servers used for user self-registration.",
"TrustedMailHelper": "You can either check the Custom domains option and enter the trusted mail server in the field below so that a person who has an account at it will be able to register him(her)self by clicking the Join link on the Sign In page or disable this option.",
"TwoFactorAuth": "Two-factor authentication",
"TwoFactorAuthDescription": "Two-factor authentication provides a more secure way to log in. After entering the credentials, the user will have to enter a code from an SMS or the authentication app.",
"TwoFactorAuthHelper": "Note: SMS messages can be sent if you have a positive balance only. You can always check your current balance in your SMS provider account. Do not forget to replenish your balance in good time.",
"UseAsLogoButton": "Use as logo",
"UseDigits": "Use digits",
"UseHttp": "Use Http",
"UseSpecialChar": "Use special characters",
"UseUpperCase": "Use capital letters",
"UserAgreement": "I confirm and want to proceed",
"Users": "Users",
"WhiteLabel": "White label",
"WhiteLabelSubtitle": "Enter your company name, upload the logo, and customize the styling to match your branding.",
"WhiteLabelHelper": "Use PNG images with a transparent background",
"WhiteLabelTooltip": "The sizes are shown for the Retina displays. For the displays with standard resolutions the logo width and height will be resized accordingly upon upload.",
"YouHaveUnsavedChanges": "You have unsaved changes",
"YourCurrentDomain": "Your current domain"
}
>>>>>>> develop

View File

@ -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>
);

View File

@ -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}
/>
);
};

View File

@ -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}
/>
)}

View File

@ -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}
/>
);
};

View File

@ -70,9 +70,14 @@ const Dialog = ({
onCancel && onCancel(e);
}, []);
const onCloseAction = useCallback((e) => {
onClose && onClose(e);
}, []);
const onCloseAction = useCallback(
(e) => {
if (!isDisabled) {
onClose && onClose(e);
}
},
[isDisabled]
);
return (
<ModalDialog
@ -110,6 +115,7 @@ const Dialog = ({
size="normal"
scale
primary
isLoading={isDisabled}
isDisabled={isDisabled}
onClick={onSaveAction}
/>

View File

@ -121,6 +121,15 @@ class ChangeEmailDialogComponent extends React.Component {
}
};
onClose = () => {
const { onClose } = this.props;
const { isRequestRunning } = this.state;
if (!isRequestRunning) {
onClose();
}
};
render() {
console.log("ChangeEmailDialog render");
const { t, tReady, visible, onClose, isTabletView } = this.props;
@ -130,7 +139,7 @@ class ChangeEmailDialogComponent extends React.Component {
<ModalDialogContainer
isLoading={!tReady}
visible={visible}
onClose={onClose}
onClose={this.onClose}
displayType="modal"
>
<ModalDialog.Header>{t("EmailChangeTitle")}</ModalDialog.Header>
@ -175,7 +184,7 @@ class ChangeEmailDialogComponent extends React.Component {
size="normal"
scale
onClick={onClose}
isLoading={isRequestRunning}
isDisabled={isRequestRunning}
/>
</ModalDialog.Footer>
</ModalDialogContainer>

View File

@ -28,6 +28,12 @@ const ChangeNameDialog = (props) => {
const [lastName, setLastName] = useState(profile.lastName);
const [isSaving, setIsSaving] = useState(false);
const onCloseAction = () => {
if (!isSaving) {
onClose();
}
};
const onSaveClick = async () => {
const newProfile = profile;
newProfile.firstName = firstName;
@ -51,7 +57,7 @@ const ChangeNameDialog = (props) => {
<ModalDialogContainer
isLoading={!ready}
visible={visible}
onClose={onClose}
onClose={onCloseAction}
displayType="modal"
>
<ModalDialog.Header>
@ -69,6 +75,7 @@ const ChangeNameDialog = (props) => {
value={firstName}
onChange={(e) => setFirstName(e.target.value)}
placeholder={t("ProfileAction:FirstName")}
isDisabled={isSaving}
/>
</FieldContainer>
@ -82,6 +89,7 @@ const ChangeNameDialog = (props) => {
value={lastName}
onChange={(e) => setLastName(e.target.value)}
placeholder={t("Common:LastName")}
isDisabled={isSaving}
/>
</FieldContainer>
</ModalDialog.Body>

View File

@ -46,6 +46,15 @@ class ChangePasswordDialogComponent extends React.Component {
removeEventListener("keydown", this.keyPress, false);
}
onClose = () => {
const { onClose } = this.props;
const { isRequestRunning } = this.state;
if (!isRequestRunning) {
onClose();
}
};
render() {
// console.log("ChangePasswordDialog render");
const { t, tReady, visible, email, onClose, theme } = this.props;
@ -55,7 +64,7 @@ class ChangePasswordDialogComponent extends React.Component {
<ModalDialog
isLoading={!tReady}
visible={visible}
onClose={onClose}
onClose={this.onClose}
displayType="modal"
>
<ModalDialog.Header>{t("PasswordChangeTitle")}</ModalDialog.Header>
@ -96,7 +105,7 @@ class ChangePasswordDialogComponent extends React.Component {
size="normal"
scale
onClick={onClose}
isLoading={isRequestRunning}
isDisabled={isRequestRunning}
/>
</ModalDialog.Footer>
</ModalDialog>

View File

@ -49,6 +49,7 @@ const ChangePortalOwnerDialog = ({
};
const onTogglePeopleSelector = () => {
if (isLoading) return;
setSelectedUser(null);
setSelectorVisible((val) => !val);
};
@ -71,10 +72,12 @@ const ChangePortalOwnerDialog = ({
};
const onCloseAction = () => {
if (isLoading) return;
onClose && onClose();
};
const onClearSelectedItem = () => {
if (isLoading) return;
setSelectedUser(null);
};
@ -209,6 +212,7 @@ const ChangePortalOwnerDialog = ({
size="normal"
scale
onClick={onCloseAction}
isDisabled={isLoading}
/>
</div>
</StyledFooterWrapper>

View File

@ -43,6 +43,14 @@ const CreateRoomDialog = ({
const [isScrollLocked, setIsScrollLocked] = useState(false);
const [isOauthWindowOpen, setIsOauthWindowOpen] = useState(false);
const isMountRef = React.useRef(true);
React.useEffect(() => {
return () => {
isMountRef.current = false;
};
});
const startRoomParams = {
type: undefined,
title: "",
@ -80,14 +88,19 @@ const CreateRoomDialog = ({
const onCreateRoom = async () => {
await onCreate({ ...roomParams });
setRoomParams(startRoomParams);
if (isMountRef.current) {
setRoomParams(startRoomParams);
}
};
const goBack = () => {
if (isLoading) return;
setRoomParams({ ...startRoomParams });
};
const onCloseAndDisconnectThirdparty = async () => {
if (isLoading) return;
if (!!roomParams.storageLocation.thirdpartyAccount) {
setIsLoading(true);
await deleteThirdParty(
@ -128,6 +141,7 @@ const CreateRoomDialog = ({
setRoomParams={setRoomParams}
setRoomType={setRoomType}
setIsScrollLocked={setIsScrollLocked}
isDisabled={isLoading}
/>
)}
</ModalDialog.Body>
@ -148,6 +162,7 @@ const CreateRoomDialog = ({
label={t("Common:CancelButton")}
size="normal"
scale
isDisabled={isLoading}
onClick={onCloseAndDisconnectThirdparty}
/>
</ModalDialog.Footer>

View File

@ -44,12 +44,18 @@ const EditRoomDialog = ({
});
}, [fetchedImage]);
const onCloseAction = () => {
if (isLoading) return;
onClose && onClose();
};
return (
<ModalDialog
displayType="aside"
withBodyScroll
visible={visible}
onClose={onClose}
onClose={onCloseAction}
isScrollLocked={isScrollLocked}
withFooterBorder
>
@ -66,6 +72,7 @@ const EditRoomDialog = ({
setRoomType={setRoomType}
setIsScrollLocked={setIsScrollLocked}
isEdit
isDisabled={isLoading}
/>
</ModalDialog.Body>
@ -85,6 +92,7 @@ const EditRoomDialog = ({
size="normal"
scale
onClick={onClose}
isDisabled={isLoading}
/>
</ModalDialog.Footer>
</ModalDialog>

View File

@ -58,9 +58,11 @@ const StyledDropzone = styled.div`
StyledDropzone.defaultProps = { theme: Base };
const Dropzone = ({ t, setUploadedFile }) => {
const Dropzone = ({ t, setUploadedFile, isDisabled }) => {
const { acceptedFiles, getRootProps, getInputProps } = useDropzone({
maxFiles: 1,
noClick: isDisabled,
noKeyboard: isDisabled,
// maxSize: 1000000,
accept: ["image/png", "image/jpeg"],
});

View File

@ -106,23 +106,37 @@ const IconCropper = ({
uploadedFile,
setUploadedFile,
setPreviewIcon,
isDisabled,
}) => {
let editorRef = null;
const setEditorRef = (editor) => (editorRef = editor);
const handlePositionChange = (position) =>
const handlePositionChange = (position) => {
if (isDisabled) return;
onChangeIcon({ ...icon, x: position.x, y: position.y });
};
const handleSliderChange = (e, newZoom = null) => {
if (isDisabled) return;
const handleSliderChange = (e, newZoom = null) =>
onChangeIcon({ ...icon, zoom: newZoom ? newZoom : +e.target.value });
};
const handleZoomInClick = () => {
if (isDisabled) return;
const handleZoomInClick = () =>
handleSliderChange({}, icon.zoom <= 4.5 ? icon.zoom + 0.5 : 5);
};
const handleZoomOutClick = () => {
if (isDisabled) return;
const handleZoomOutClick = () =>
handleSliderChange({}, icon.zoom >= 1.5 ? icon.zoom - 0.5 : 1);
const handleDeleteImage = () => setUploadedFile(null);
};
const handleDeleteImage = () => {
if (isDisabled) return;
setUploadedFile(null);
};
const handleImageChange = throttle(() => {
if (editorRef) {
@ -181,6 +195,7 @@ const IconCropper = ({
iconName={"/static/images/zoom-minus.react.svg"}
isFill={true}
isClickable={false}
isDisabled={isDisabled}
/>
<Slider
className="icon_cropper-zoom-container-slider"
@ -189,6 +204,7 @@ const IconCropper = ({
onChange={handleSliderChange}
step={0.01}
value={icon.zoom}
isDisabled={isDisabled}
/>
<IconButton
className="icon_cropper-zoom-container-button"
@ -197,6 +213,7 @@ const IconCropper = ({
iconName={"/static/images/zoom-plus.react.svg"}
isFill={true}
isClickable={false}
isDisabled={isDisabled}
/>
</div>
</StyledIconCropper>

View File

@ -24,6 +24,7 @@ const IconEditor = ({
currentRoomTypeData,
icon,
onChangeIcon,
isDisabled,
}) => {
const [previewIcon, setPreviewIcon] = useState(null);
@ -41,6 +42,7 @@ const IconEditor = ({
uploadedFile={icon.uploadedFile}
setUploadedFile={setUploadedFile}
setPreviewIcon={setPreviewIcon}
isDisabled={isDisabled}
/>
<PreviewTile
@ -49,10 +51,15 @@ const IconEditor = ({
previewIcon={previewIcon}
tags={tags.map((tag) => tag.name)}
defaultTagLabel={t(currentRoomTypeData.defaultTag)}
isDisabled={isDisabled}
/>
</div>
)}
<Dropzone t={t} setUploadedFile={setUploadedFile} />
<Dropzone
t={t}
setUploadedFile={setUploadedFile}
isDisabled={isDisabled}
/>
</StyledIconEditor>
);
};

View File

@ -23,6 +23,7 @@ const InputParam = ({
onChange,
onFocus,
onBlur,
isDisabled,
}) => {
return (
<StyledInputParam>
@ -42,6 +43,7 @@ const InputParam = ({
scale
placeholder={placeholder}
tabIndex={2}
isDisabled={isDisabled}
/>
</StyledInputParam>
);

View File

@ -22,6 +22,7 @@ const PermanentSettings = ({
isThirdparty,
storageLocation,
isPrivate,
isDisabled,
}) => {
const createThirdpartyPath = () => {
const path = storageLocation.parentId.split("|");

View File

@ -17,10 +17,12 @@ const RoomTypeDropdown = ({
currentRoom,
setRoomType,
setIsScrollLocked,
isDisabled,
}) => {
const [isOpen, setIsOpen] = useState(false);
const toggleDropdown = () => {
if (isDisabled) return;
if (isOpen) {
setIsScrollLocked(false);
setIsOpen(false);
@ -31,6 +33,7 @@ const RoomTypeDropdown = ({
};
const chooseRoomType = (roomType) => {
if (isDisabled) return;
setRoomType(roomType);
toggleDropdown();
};

View File

@ -31,6 +31,7 @@ const SetRoomParams = ({
tagHandler,
setIsScrollLocked,
isEdit,
isDisabled,
}) => {
const onChangeName = (e) =>
setRoomParams({ ...roomParams, title: e.target.value });
@ -57,6 +58,7 @@ const SetRoomParams = ({
currentRoom={currentRoomTypeData}
setRoomType={setRoomType}
setIsScrollLocked={setIsScrollLocked}
isDisabled={isDisabled}
/>
)}
@ -67,6 +69,7 @@ const SetRoomParams = ({
isThirdparty={roomParams.isThirdparty}
storageLocation={roomParams.storageLocation}
isPrivate={roomParams.isPrivate}
isDisabled={isDisabled}
/>
)}
@ -76,6 +79,7 @@ const SetRoomParams = ({
placeholder={t("NamePlaceholder")}
value={roomParams.title}
onChange={onChangeName}
isDisabled={isDisabled}
/>
<TagInput
@ -83,6 +87,7 @@ const SetRoomParams = ({
tagHandler={tagHandler}
currentRoomTypeData={currentRoomTypeData}
setIsScrollLocked={setIsScrollLocked}
isDisabled={isDisabled}
/>
{/* {!isEdit && (
@ -101,6 +106,7 @@ const SetRoomParams = ({
onChangeStorageLocation={onChangeStorageLocation}
setIsScrollLocked={setIsScrollLocked}
setIsOauthWindowOpen={setIsOauthWindowOpen}
isDisabled={isDisabled}
/>
)}
@ -111,6 +117,7 @@ const SetRoomParams = ({
currentRoomTypeData={currentRoomTypeData}
icon={roomParams.icon}
onChangeIcon={onChangeIcon}
isDisabled={isDisabled}
/>
</StyledSetRoomParams>
);

View File

@ -12,6 +12,7 @@ const TagDropdown = ({
tagInputValue,
setTagInputValue,
createTagLabel,
isDisabled,
}) => {
const dropdownRef = useRef(null);

View File

@ -21,9 +21,14 @@ const StyledTagList = styled.div`
}
`;
const TagList = ({ defaultTagLabel, tagHandler }) => {
const TagList = ({ defaultTagLabel, tagHandler, isDisabled }) => {
const { tags } = tagHandler;
const onDeleteAction = (id) => {
if (isDisabled) return;
tagHandler.deleteTag(id);
};
return (
<StyledTagList className="set_room_params-tag_input-tag_list">
{tags.length ? (
@ -35,7 +40,7 @@ const TagList = ({ defaultTagLabel, tagHandler }) => {
label={tag.name}
isNewTag
onDelete={() => {
tagHandler.deleteTag(tag.id);
onDeleteAction(tag.id);
}}
/>
))

View File

@ -29,6 +29,7 @@ const TagInput = ({
tagHandler,
currentRoomTypeData,
setIsScrollLocked,
isDisabled,
}) => {
const [tagInput, setTagInput] = useState("");
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
@ -36,6 +37,7 @@ const TagInput = ({
const onTagInputChange = (e) => setTagInput(e.target.value);
const openDropdown = () => {
if (isDisabled) return;
setIsScrollLocked(true);
setIsDropdownOpen(true);
};
@ -55,6 +57,7 @@ const TagInput = ({
onChange={onTagInputChange}
onFocus={openDropdown}
onBlur={closeDropdown}
isDisabled={isDisabled}
/>
<TagDropdown
@ -68,6 +71,7 @@ const TagInput = ({
<TagList
tagHandler={tagHandler}
defaultTagLabel={t(currentRoomTypeData.defaultTag)}
isDisabled={isDisabled}
/>
</StyledTagInput>
);

View File

@ -98,11 +98,15 @@ const FolderInput = ({
roomTitle,
thirdpartyAccount,
onChangeStorageFolderId,
isDisabled,
}) => {
const [treeNode, setTreeNode] = useState(null);
const [isDialogOpen, setIsDialogOpen] = useState(false);
const onOpen = () => setIsDialogOpen(true);
const onOpen = () => {
if (isDisabled) return;
setIsDialogOpen(true);
};
const onClose = () => setIsDialogOpen(false);
const [path, setPath] = useState("");

View File

@ -116,6 +116,8 @@ const ThirdPartyComboBox = ({
setIsScrollLocked,
setIsOauthWindowOpen,
isDisabled,
}) => {
const dropdownRef = useRef(null);
@ -130,6 +132,7 @@ const ThirdPartyComboBox = ({
const [dropdownDirection, setDropdownDirection] = useState("bottom");
const toggleIsOpen = () => {
if (isDisabled) return;
if (isOpen) setIsScrollLocked(false);
else {
setIsScrollLocked(true);
@ -233,7 +236,9 @@ const ThirdPartyComboBox = ({
<Button
isDisabled={
!storageLocation?.provider || !!storageLocation?.thirdpartyAccount
!storageLocation?.provider ||
!!storageLocation?.thirdpartyAccount ||
isDisabled
}
className="set_room_params-thirdparty-connect"
size="small"

View File

@ -36,8 +36,11 @@ const ThirdPartyStorage = ({
openConnectWindow,
setConnectItem,
getOAuthToken,
isDisabled,
}) => {
const onChangeIsThirdparty = () => {
if (isDisabled) return;
if (connectItems.length) {
onChangeStorageLocation({
...storageLocation,
@ -110,6 +113,7 @@ const ThirdPartyStorage = ({
getOAuthToken={getOAuthToken}
setIsScrollLocked={setIsScrollLocked}
setIsOauthWindowOpen={setIsOauthWindowOpen}
isDisabled={isDisabled}
/>
)}
@ -119,6 +123,7 @@ const ThirdPartyStorage = ({
roomTitle={roomTitle}
thirdpartyAccount={storageLocation.thirdpartyAccount}
onChangeStorageFolderId={onChangeStorageFolderId}
isDisabled={isDisabled}
/>
)}

View File

@ -13,6 +13,7 @@ import withContent from "../../../../../HOCs/withContent";
import withBadges from "../../../../../HOCs/withBadges";
import { Base } from "@docspace/components/themes";
import { RoomsTypeTranslations } from "@docspace/common/constants";
import { desktop } from "@docspace/components/utils/device";
const SimpleFilesRowContent = styled(RowContent)`
.row-main-container-wrapper {
@ -20,6 +21,10 @@ const SimpleFilesRowContent = styled(RowContent)`
max-width: min-content;
min-width: inherit;
margin-right: 0px;
@media ${desktop} {
margin-top: 0px;
}
}
.row_update-text {

View File

@ -244,7 +244,7 @@ const SectionBodyContent = (props) => {
{(context) =>
isEmptyFilesList || null ? (
<>
<EmptyContainer />
<EmptyContainer sectionWidth={context.sectionWidth} />
</>
) : viewAs === "tile" ? (
<>

View File

@ -60,7 +60,10 @@ const StyledContainer = styled.div`
.header-container {
min-height: 33px;
height: 60px;
@media ${tablet} {
height: 60px;
}
}
`;

View File

@ -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;

View File

@ -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}

View File

@ -43,7 +43,9 @@ export const LanguageTimeSettingsTooltip = ({
learnMore={learnMore}
save={save}
>
To make the parameters you set take effect click the
<div className="bold display-inline font-size"> {{ save }}</div>
button at the bottom of the section.
<Link
color={theme.client.settings.common.linkColorHelp}
className="display-block font-size"
@ -75,8 +77,11 @@ export const CustomTitlesTooltip = ({ t }) => {
from={from}
>
<div className="bold display-inline font-size">{{ welcomeText }}</div>
is a way to change the default portal title to be displayed on the
<div className="bold display-inline font-size"> {{ text }}</div>
of your portal. The same name is also used for the
<div className="bold display-inline font-size"> {{ from }}</div>
field of your portal email notifications.
</Trans>
</div>
<div className="font-size">
@ -85,14 +90,21 @@ export const CustomTitlesTooltip = ({ t }) => {
i18nKey="CustomTitlesSettingsTooltipDescription"
header={header}
>
Enter the name you like in the
<div className="bold display-inline font-size">{{ header }}</div>
field.
</Trans>
</div>
</StyledTooltip>
);
};
export const DNSSettingsTooltip = ({ t, theme, helpLink }) => {
export const DNSSettingsTooltip = ({
t,
theme,
helpLink,
organizationName,
}) => {
const text = t("Settings:DNSSettingsTooltip");
const learnMore = t("Common:LearnMore");
@ -105,6 +117,9 @@ export const DNSSettingsTooltip = ({ t, theme, helpLink }) => {
text={text}
learnMore={learnMore}
>
DNS Settings allow you to set an alternative URL address for your
{{ organizationName }} portal. Send your request to our support team,
and our specialists will help you with the settings.
<div className="display-inline font-size"> {{ text }}</div>
<Link
color={theme.client.settings.common.linkColorHelp}
@ -135,6 +150,8 @@ export const PortalRenamingTooltip = ({ t }) => {
text={text}
>
<div className="display-inline font-size"> {{ text }}</div>
Enter the part that will appear next to the
onlyoffice.com/onlyoffice.eu portal address.
</Trans>
</div>
<div className="font-size">
@ -145,7 +162,10 @@ export const PortalRenamingTooltip = ({ t }) => {
save={save}
>
<div className="bold display-inline font-size"> {{ pleaseNote }}</div>
: your old portal address will become available to new users once you
click the
<div className="bold display-inline font-size"> {{ save }}</div>
button.
</Trans>
</div>
</StyledTooltip>

View File

@ -645,6 +645,10 @@ class FilesActionStore {
try {
await this.deleteItemOperation(isFile, itemId, translations, isRoom);
const id = Array.isArray(itemId) ? itemId : [itemId];
clearActiveOperations(isFile && id, !isFile && id);
} catch (err) {
clearActiveOperations(isFile && [itemId], !isFile && [itemId]);
setSecondaryProgressBarData({

View File

@ -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) => ({

View File

@ -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;
};

View File

@ -24,9 +24,6 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using ASC.Geolocation;
using ASC.MessagingSystem;
namespace ASC.Web.Api;
[Scope]
@ -128,7 +125,7 @@ public class ConnectionsController : ControllerBase
}
[HttpPut("activeconnections/logoutallchangepassword")]
public async Task<string> LogOutAllActiveConnectionsChangePassword()
public async Task<object> LogOutAllActiveConnectionsChangePassword()
{
try
{
@ -166,7 +163,7 @@ public class ConnectionsController : ControllerBase
}
[HttpPut("activeconnections/logoutallexceptthis")]
public async Task<string> LogOutAllExceptThisConnection()
public async Task<object> LogOutAllExceptThisConnection()
{
try
{