Merge branch 'bugfix/rc-2.5.0' into bugfix/public-room-media-viewer

# Conflicts:
#	packages/shared/utils/common.ts
This commit is contained in:
Akmal Isomadinov 2024-03-04 17:28:50 +05:00
commit 1e0d6e89ab
60 changed files with 342 additions and 199 deletions

View File

@ -199,6 +199,7 @@
"SuccessfullySaveGreetingSettingsMessage": "Welcome Page settings have been successfully saved",
"SuccessfullySavePortalNameMessage": "Space has been renamed successfully",
"SuccessfullySaveSettingsMessage": "Settings have been successfully updated",
"DNSSettingsHint": "Enter domain name like this:",
"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",

View File

@ -183,6 +183,7 @@
"SuccessfullySaveGreetingSettingsMessage": "Настройки страницы приветствия успешно сохранены",
"SuccessfullySavePortalNameMessage": "Портал успешно переименован",
"SuccessfullySaveSettingsMessage": "Настройки успешно обновлены",
"DNSSettingsHint": "Введите доменное имя следующим образом:",
"TemporaryStorage": "Временное хранилище",
"TemporaryStorageDescription": "Резервная копия будет храниться в разделе 'Резервное копирование', вы сможете скачать её в течение 24 часов с момента создания.",
"ThirdPartyAuthorization": "Сторонние сервисы",

View File

@ -142,5 +142,3 @@ export const LinkType = Object.freeze({
Invite: 0,
External: 1,
});
export const SSO_LABEL = "SSO";

View File

@ -158,14 +158,22 @@ const CreateUserForm = (props) => {
const headerKey = linkData.confirmHeader;
try {
const toBinaryStr = (str) => {
const encoder = new TextEncoder();
const charCodes = encoder.encode(str);
return String.fromCharCode(...charCodes);
};
const loginData = window.btoa(
JSON.stringify({
type: "invitation",
email,
roomName,
firstName: user.firstName,
lastName: user.lastName,
}),
toBinaryStr(
JSON.stringify({
type: "invitation",
email,
roomName,
firstName: user.firstName,
lastName: user.lastName,
}),
),
);
await getUserByEmail(email, headerKey);
@ -176,6 +184,8 @@ const CreateUserForm = (props) => {
`?loginData=${loginData}`,
);
} catch (err) {
console.error(err);
const status = err?.response?.status;
const isNotExistUser = status === 404;
@ -463,7 +473,7 @@ const CreateUserForm = (props) => {
</GreetingContainer>
<FormWrapper>
<RegisterContainer>
<RegisterContainer>
<form className="auth-form-container">
<div className="auth-form-fields">
{!registrationForm && (

View File

@ -10,7 +10,6 @@ import Badges from "@docspace/client/src/pages/Home/Section/AccountsBody/Badges"
import { StyledAccountsItemTitle } from "../../styles/accounts";
import { StyledTitle } from "../../styles/common";
import { SSO_LABEL } from "SRC_DIR/helpers/constants";
import { decode } from "he";
const AccountsItemTitle = ({
@ -31,7 +30,7 @@ const AccountsItemTitle = ({
const getData = () => {
const newOptions = infoPanelSelection.options?.filter(
(option) => option !== "details"
(option) => option !== "details",
);
return getUserContextOptions(t, newOptions || [], infoPanelSelection);
};
@ -82,7 +81,7 @@ const AccountsItemTitle = ({
{isSSO && (
<Badge
className="sso-badge"
label={SSO_LABEL}
label={t("Common:SSO")}
color={"#FFFFFF"}
backgroundColor="#22C386"
fontSize={"9px"}

View File

@ -196,9 +196,6 @@ const User = ({
}
};
const onToggle = (e, isOpen) => {
// setIsScrollLocked(isOpen);
};
const getUserType = (item) => {
if (item.isOwner) return "owner";
if (item.isAdmin) return "admin";
@ -339,7 +336,6 @@ const User = ({
isLoading={isLoading}
isMobileView={isMobileOnly}
directionY="both"
onToggle={onToggle}
displaySelectedOption
/>
) : (

View File

@ -12,8 +12,6 @@ import { commonIconsStyles } from "@docspace/shared/utils";
import SendClockIcon from "PUBLIC_DIR/images/send.clock.react.svg";
import CatalogSpamIcon from "PUBLIC_DIR/images/catalog.spam.react.svg";
import { SSO_LABEL } from "SRC_DIR/helpers/constants";
const StyledBadgesContainer = styled.div`
height: 100%;
@ -96,7 +94,7 @@ const Badges = ({
{isSSO && (
<Badge
className="accounts-badge"
label={SSO_LABEL}
label={t("SSO")}
color={"#FFFFFF"}
backgroundColor="#22C386"
fontSize={"9px"}

View File

@ -17,6 +17,7 @@ import { Avatar } from "@docspace/shared/components/avatar";
const GroupsTableItem = ({
t,
item,
itemIndex,
theme,
hideColumns,
selection,
@ -70,12 +71,14 @@ const GroupsTableItem = ({
setSelection([item]);
};
let value = `folder_${item.id}_false_index_${itemIndex}`;
return (
<Styled.GroupsRowWrapper
className={`group-item ${
(isChecked || isActive) && "table-row-selected"
}`}
value={item.id}
value={value}
>
<Styled.GroupsRow
key={item.id}

View File

@ -33,7 +33,7 @@ import { ROOMS_PROVIDER_TYPE_NAME } from "@docspace/shared/constants";
import { getDefaultRoomName } from "SRC_DIR/helpers/filesUtils";
import { SSO_LABEL, TableVersions } from "SRC_DIR/helpers/constants";
import { TableVersions } from "SRC_DIR/helpers/constants";
import { SortByFieldName } from "SRC_DIR/helpers/enums";
import ViewRowsReactSvgUrl from "PUBLIC_DIR/images/view-rows.react.svg?url";
@ -838,7 +838,7 @@ const SectionFilterContent = ({
if (filter?.accountLoginType?.toString()) {
const label =
AccountLoginType.SSO === filter.accountLoginType.toString()
? SSO_LABEL
? t("Common:SSO")
: AccountLoginType.LDAP === filter.accountLoginType.toString()
? t("PeopleTranslations:LDAPLbl")
: t("PeopleTranslations:StandardLogin");
@ -1401,7 +1401,7 @@ const SectionFilterContent = ({
{
key: AccountLoginType.SSO,
group: "filter-login-type",
label: SSO_LABEL,
label: t("Common:SSO"),
},
//TODO: uncomment after ldap be ready
/*{
@ -2024,8 +2024,6 @@ const SectionFilterContent = ({
infoPanelColumnsSize[idx] === "0px";
!hide && options.push(hideableColumns[columnTitle]);
}
});
}

View File

@ -20,7 +20,7 @@ import { ToggleButton } from "@docspace/shared/components/toggle-button";
import { Text } from "@docspace/shared/components/text";
import { Link } from "@docspace/shared/components/link";
import { DeviceType } from "@docspace/shared/enums";
import { validatePortalName } from "@docspace/shared/utils/common";
import { parseDomain } from "@docspace/shared/utils/common";
const toggleStyle = {
position: "static",
@ -61,7 +61,7 @@ const DNSSettings = (props) => {
isDefaultDNS,
dnsSettingsUrl,
currentDeviceType,
domainValidator,
portalName,
} = props;
const [hasScroll, setHasScroll] = useState(false);
const isLoadedSetting = isLoaded && tReady;
@ -110,19 +110,8 @@ const DNSSettings = (props) => {
setIsLoading(true);
}, [200]);
const isValidPortalName = validatePortalName(
dnsName || "",
domainValidator,
setErrorText,
t,
);
if (isValidPortalName) {
await saveDNSSettings();
toastr.success(t("Settings:SuccessfullySaveSettingsMessage"));
} else {
setIsError(true);
}
await saveDNSSettings();
toastr.success(t("Settings:SuccessfullySaveSettingsMessage"));
} catch (e) {
setIsError(true);
toastr.error(e);
@ -131,6 +120,8 @@ const DNSSettings = (props) => {
clearTimeout(timerId);
timerId = null;
setIsLoading(false);
setIsError(false);
};
const onClickToggle = (e) => {
const checked = e.currentTarget.checked;
@ -138,10 +129,18 @@ const DNSSettings = (props) => {
};
const onChangeTextInput = (e) => {
const { value } = e.target;
isError && setIsError(false);
errorText && setErrorText("");
setDNSName(value);
setErrorText("");
const { value } = e.target;
const dns = portalName ? value.slice(portalName.length + 1) : value;
const isValidDomain = parseDomain(dns || "", setErrorText, t);
if (!isValidDomain) {
setIsError(true);
}
setDNSName(dns);
};
const checkInnerWidth = useCallback(() => {
if (!isMobile()) {
@ -162,6 +161,8 @@ const DNSSettings = (props) => {
}
}, [isMobile, setIsCustomizationView]);
const domainExampleText = " team.ourcompany.com";
const settingsBlock = (
<div className="settings-block">
{standalone ? (
@ -177,13 +178,33 @@ const DNSSettings = (props) => {
<TextInput
{...textInputProps}
isDisabled={isLoading || !enable}
value={dnsName?.trim()}
value={
portalName ? `${portalName}.${dnsName?.trim()}` : dnsName?.trim()
}
onChange={onChangeTextInput}
hasError={isError}
/>
<div style={{ marginTop: "5px" }}>
<Text fontSize="12px" fontWeight="400" color="#F24724">
{errorText}
{errorText &&
errorText.map((err, index) => (
<Text
key={index}
fontSize="12px"
fontWeight="400"
color="#F24724"
>
{err}
</Text>
))}
</div>
<div style={{ marginTop: "3px" }}>
<Text
key="dns-hint"
fontSize="12px"
fontWeight="400"
color="#A3A9AE"
>
{`${t("Settings:DNSSettingsHint")}${domainExampleText}`}
</Text>
</div>
</>
@ -215,7 +236,7 @@ const DNSSettings = (props) => {
size={currentDeviceType === DeviceType.desktop ? "small" : "normal"}
label={t("Common:SaveButton")}
onClick={onSaveSettings}
isDisabled={isLoading || isDefaultDNS}
isDisabled={isLoading || isDefaultDNS || isError}
isLoading={isLoading}
/>
) : (
@ -224,7 +245,7 @@ const DNSSettings = (props) => {
size={currentDeviceType === DeviceType.desktop ? "small" : "normal"}
label={t("Common:SendRequest")}
onClick={onSendRequest}
isDisabled={!isSettingPaid}
isDisabled={!isSettingPaid || isError}
/>
);
@ -278,7 +299,6 @@ export default inject(({ settingsStore, common, currentQuotaStore }) => {
standalone,
dnsSettingsUrl,
currentDeviceType,
domainValidator,
} = settingsStore;
const {
isLoaded,
@ -290,6 +310,7 @@ export default inject(({ settingsStore, common, currentQuotaStore }) => {
setDNSName,
saveDNSSettings,
isDefaultDNS,
portalName,
} = common;
const { isBrandingAndCustomizationAvailable } = currentQuotaStore;
@ -313,6 +334,6 @@ export default inject(({ settingsStore, common, currentQuotaStore }) => {
saveDNSSettings,
dnsSettingsUrl,
currentDeviceType,
domainValidator,
portalName,
};
})(withLoading(withTranslation(["Settings", "Common"])(observer(DNSSettings))));

View File

@ -33,6 +33,8 @@ const PortalRenaming = (props) => {
currentColorScheme,
renamingSettingsUrl,
domainValidator,
setPortalName,
portalName,
} = props;
const navigate = useNavigate();
@ -54,10 +56,8 @@ const PortalRenaming = (props) => {
? tenantAlias
: portalNameDefaultFromSessionStorage;
const [portalName, setPortalName] = useState(portalNameInitially);
const [portalNameDefault, setPortalNameDefault] = useState(
portalNameDefaultInitially
portalNameDefaultInitially,
);
const [isLoadingPortalNameSave, setIsLoadingPortalNameSave] = useState(false);
@ -78,6 +78,7 @@ const PortalRenaming = (props) => {
useEffect(() => {
setDocumentTitle(t("PortalRenaming"));
setPortalName(portalNameInitially);
const page = isMobileView ? "language-and-time-zone" : "general";
if (!isLoaded) initSettings(page).then(() => setIsLoaded(true));
@ -193,14 +194,14 @@ const PortalRenaming = (props) => {
t("PortalNameLength", {
minLength: domainValidator.minLength,
maxLength: domainValidator.maxLength,
})
}),
);
saveToSessionStorage(
"errorValue",
t("PortalNameLength", {
minLength: domainValidator.minLength,
maxLength: domainValidator.maxLength,
})
}),
);
break;
case !validDomain.test(value):
@ -242,7 +243,7 @@ const PortalRenaming = (props) => {
const currentUrl = window.location.href.replace(
window.location.origin,
""
"",
);
const newUrl = "/portal-settings/customization/general";
@ -353,8 +354,14 @@ export default inject(({ settingsStore, setup, common }) => {
domainValidator,
} = settingsStore;
const { setPortalRename } = setup;
const { isLoaded, setIsLoadedPortalRenaming, initSettings, setIsLoaded } =
common;
const {
isLoaded,
setIsLoadedPortalRenaming,
initSettings,
setIsLoaded,
setPortalName,
portalName,
} = common;
return {
theme,
@ -368,7 +375,11 @@ export default inject(({ settingsStore, setup, common }) => {
currentColorScheme,
renamingSettingsUrl,
domainValidator,
portalName,
setPortalName,
};
})(
withLoading(withTranslation(["Settings", "Common"])(observer(PortalRenaming)))
withLoading(
withTranslation(["Settings", "Common"])(observer(PortalRenaming)),
),
);

View File

@ -35,7 +35,6 @@ import { HelpButton } from "@docspace/shared/components/help-button";
import { Tooltip } from "@docspace/shared/components/tooltip";
import withCultureNames from "SRC_DIR/HOCs/withCultureNames";
import { isMobile } from "@docspace/shared/utils";
import { SSO_LABEL } from "SRC_DIR/helpers/constants";
import { useTheme } from "styled-components";
const MainProfile = (props) => {
@ -171,7 +170,7 @@ const MainProfile = (props) => {
<div className="badges-wrapper">
<Badge
className="sso-badge"
label={SSO_LABEL}
label={t("Common:SSO")}
color={"#FFFFFF"}
backgroundColor="#22C386"
fontSize={"9px"}
@ -224,7 +223,7 @@ const MainProfile = (props) => {
{profile.isSSO && (
<Badge
className="sso-badge"
label={SSO_LABEL}
label={t("Common:SSO")}
color={"#FFFFFF"}
backgroundColor="#22C386"
fontSize={"9px"}

View File

@ -13,6 +13,7 @@ class CommonStore {
whiteLabelLogoText = null;
defaultLogoTextWhiteLabel = null;
portalName = null;
dnsSettings = {
defaultObj: {},
customObj: {},
@ -63,14 +64,14 @@ class CommonStore {
requests.push(
this.getWhiteLabelLogoUrls(),
this.getWhiteLabelLogoText(),
this.getIsDefaultWhiteLabel()
this.getIsDefaultWhiteLabel(),
);
break;
}
case "language-and-time-zone":
requests.push(
this.settingsStore.getPortalTimezones(),
this.settingsStore.getPortalCultures()
this.settingsStore.getPortalCultures(),
);
break;
case "dns-settings":
@ -88,7 +89,7 @@ class CommonStore {
{
requests.push(
this.settingsStore.getPortalTimezones(),
this.settingsStore.getPortalCultures()
this.settingsStore.getPortalCultures(),
);
if (standalone) {
@ -100,7 +101,7 @@ class CommonStore {
requests.push(
this.getWhiteLabelLogoUrls(),
this.getWhiteLabelLogoText(),
this.getIsDefaultWhiteLabel()
this.getIsDefaultWhiteLabel(),
);
break;
@ -123,7 +124,7 @@ class CommonStore {
setWhiteLabelSettings = async (data) => {
const response = await api.settings.setWhiteLabelSettings(
data,
isManagement()
isManagement(),
);
return Promise.resolve(response);
};
@ -187,6 +188,10 @@ class CommonStore {
this.dnsSettings.customObj.dnsName = value;
};
setPortalName = (value) => {
this.portalName = value;
};
setDNSSettings = (data) => {
this.dnsSettings = { defaultObj: data, customObj: data };
};

View File

@ -516,6 +516,9 @@ class FilesSettingsStore {
case ".xlsx":
path = "xlsx.svg";
break;
case ".xlsb":
path = "xlsb.svg";
break;
case ".xps":
path = "xps.svg";
break;

View File

@ -269,7 +269,11 @@ class GroupsStore {
if (!row) return;
const [element] = row.getElementsByClassName("group-item");
const groupId = element?.getAttribute("value");
const value = element?.getAttribute("value");
const splitValue = value && value.split("_");
const groupId = splitValue.slice(1, -3).join("_");
if (!groupId) return;
const isNotSelected =
@ -284,7 +288,10 @@ class GroupsStore {
if (!row) return;
const [element] = row.getElementsByClassName("group-item");
const groupId = element?.getAttribute("value");
const value = element?.getAttribute("value");
const splitValue = value && value.split("_");
const groupId = splitValue.slice(1, -3).join("_");
if (!groupId) return;
const isSelected =

View File

@ -16,7 +16,7 @@
"next": "14.0.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-i18next": "^14.0.1",
"react-i18next": "^13.2.1",
"styled-components": "^5.3.9"
},
"devDependencies": {

View File

@ -58,13 +58,24 @@ const Login: React.FC<ILoginProps> = ({
useEffect(() => {
if (search) {
const isInviteInfo = search.indexOf("loginData=");
const firstIndex = search.indexOf("loginData=");
if (isInviteInfo === -1) return;
if (firstIndex === -1) return;
const fromBinaryStr = (encodeString: string) => {
const decodeStr = atob(encodeString);
const decoder = new TextDecoder();
const charCodeArray = Uint8Array.from(
{ length: decodeStr.length },
(element, index) => decodeStr.charCodeAt(index)
);
return decoder.decode(charCodeArray);
};
const encodeString = search.slice(search.indexOf("=") + 1);
const decodeString = atob(encodeString);
const decodeString = fromBinaryStr(encodeString);
const queryParams = JSON.parse(decodeString);
setInvitationLinkData(queryParams);

View File

@ -5,11 +5,10 @@ import { TextInput } from "@docspace/shared/components/text-input";
import { Text } from "@docspace/shared/components/text";
import { ConfigurationWrapper } from "../StyledSpaces";
import { useStore } from "SRC_DIR/store";
import { parseDomain } from "SRC_DIR/utils";
import { isMobile } from "react-device-detect";
import { toastr } from "@docspace/shared/components/toast";
import { TranslationType } from "SRC_DIR/types/spaces";
import { validatePortalName } from "@docspace/shared/utils/common";
import { parseDomain, validatePortalName } from "@docspace/shared/utils/common";
type TConfigurationSection = {
t: TranslationType;

View File

@ -8,8 +8,8 @@ import { useTranslation } from "react-i18next";
import { observer } from "mobx-react";
import { TextInput } from "@docspace/shared/components/text-input";
import { useStore } from "SRC_DIR/store";
import { parseDomain } from "SRC_DIR/utils";
import { toastr } from "@docspace/shared/components/toast";
import { parseDomain } from "@docspace/shared/utils/common";
const StyledModal = styled(ModalDialogContainer)`
.create-docspace-input-block {

View File

@ -1,8 +1,5 @@
import { settingsTree } from "./settingsTree";
import { translations } from "../autoGeneratedTranslations";
import { parseAddress } from "@docspace/shared/utils";
import { ErrorKeys } from "@docspace/shared/enums";
import { TranslationType } from "SRC_DIR/types/spaces";
export const getItemByLink = (path: string) => {
const resultPath = path.split("/")[1];
@ -63,41 +60,3 @@ export function loadLanguagePath(homepage: string, fixedNS = null) {
return path;
};
}
export const parseDomain = (
domain: string,
setError: Function,
t: TranslationType
) => {
let parsedDomain = parseAddress("test@" + domain);
if (parsedDomain?.parseErrors.length > 0) {
const translatedErrors = parsedDomain.parseErrors.map((error) => {
switch (error.errorKey) {
case ErrorKeys.LocalDomain:
return t("Common:LocalDomain");
case ErrorKeys.IncorrectDomain:
case ErrorKeys.IncorrectEmail:
return t("Common:IncorrectDomain");
case ErrorKeys.DomainIpAddress:
return t("Common:DomainIpAddress");
case ErrorKeys.PunycodeDomain:
return t("Common:PunycodeDomain");
case ErrorKeys.PunycodeLocalPart:
return t("Common:PunycodeLocalPart");
case ErrorKeys.IncorrectLocalPart:
return t("Common:IncorrectLocalPart");
case ErrorKeys.SpacesInLocalPart:
return t("Common:SpacesInLocalPart");
case ErrorKeys.MaxLengthExceeded:
return t("Common:MaxLengthExceeded");
default:
throw new Error("Unknown translation key");
}
});
setError(translatedErrors);
}
return parsedDomain.isValid();
};

View File

@ -40,7 +40,7 @@ const StyledArticle = styled.article<{
max-width: ${(props) => (props.showText ? "243px" : "60px")};
height: ${(props) =>
props.correctTabletHeight ? `${props.correctTabletHeight}px` : `100%`};
props.correctTabletHeight ? `${props.correctTabletHeight}px` : `100%`};
}
@media ${mobile} {
@ -63,7 +63,7 @@ const StyledArticle = styled.article<{
.article-body__scrollbar {
height: ${(props) =>
`calc(100% - ${props.$withMainButton ? "190px" : "150px"})`} !important;
`calc(100% - ${props.$withMainButton ? "190px" : "150px"})`} !important;
@media ${tablet} {
height: calc(100% - 184px) !important;
@ -111,14 +111,14 @@ StyledArticle.defaultProps = { theme: Base };
const StyledArticleHeader = styled.div<{ showText?: boolean }>`
height: 24px;
padding: ${({ theme }) =>
getCorrectFourValuesStyle("22px 21px 23px 20px", theme.interfaceDirection)};
getCorrectFourValuesStyle("23px 21px 22px 20px", theme.interfaceDirection)};
margin: 0;
display: flex;
justify-content: flex-start;
align-items: center;
@media ${tablet} {
padding: 18px 8px 19px;
padding: 20px 8px 17px;
margin: 0;
justify-content: ${(props) => (props.showText ? "flex-start" : "center")};
@ -130,7 +130,7 @@ const StyledArticleHeader = styled.div<{ showText?: boolean }>`
@media ${mobile} {
border-bottom: ${(props) => props.theme.catalog.header.borderBottom};
padding: 12px 0 12px;
padding: 12px 0;
}
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
@ -161,16 +161,16 @@ const StyledHeading = styled.div<{ showText?: boolean }>`
@media ${tablet} {
display: ${(props) => (props.showText ? "block" : "none")};
${({ theme }) =>
theme.interfaceDirection === "rtl"
? `margin-right: 9px;`
: `margin-left: 9px;`}
theme.interfaceDirection === "rtl"
? `margin-right: 9px;`
: `margin-left: 9px;`}
}
@media ${mobile} {
${({ theme }) =>
theme.interfaceDirection === "rtl"
? `margin-right: 0;`
: `margin-left: 0;`}
theme.interfaceDirection === "rtl"
? `margin-right: 0;`
: `margin-left: 0;`}
}
`;
@ -270,9 +270,9 @@ const StyledArticleProfile = styled.div`
.option-button {
${({ theme }) =>
theme.interfaceDirection === "rtl"
? `margin-right: auto;`
: `margin-left: auto;`}
theme.interfaceDirection === "rtl"
? `margin-right: auto;`
: `margin-left: auto;`}
height: 32px;
width: 32px;
@ -344,12 +344,12 @@ const StyledArticleApps = styled.div<{
@media ${tablet} {
${(props) =>
props.showText &&
css`
props.showText &&
css`
${({ theme }) =>
theme.interfaceDirection === "rtl"
? `margin-right: 8px;`
: `margin-left: 8px;`}
theme.interfaceDirection === "rtl"
? `margin-right: 8px;`
: `margin-left: 8px;`}
`}
}
@ -398,7 +398,7 @@ const StyledWrapper = styled.div`
svg {
${({ theme }) =>
theme.interfaceDirection === "rtl" && "transform: scaleX(-1);"}
theme.interfaceDirection === "rtl" && "transform: scaleX(-1);"}
}
}
@ -450,20 +450,20 @@ const StyledHideArticleMenuButton = styled.div<{
.article-hide-menu-container {
align-items: center;
${(props) =>
props.theme.interfaceDirection === "rtl"
? css`
props.theme.interfaceDirection === "rtl"
? css`
margin-right: 16px;
`
: css`
: css`
margin-left: 16px;
`}
.article-hide-menu-text {
${(props) =>
props.theme.interfaceDirection === "rtl"
? css`
props.theme.interfaceDirection === "rtl"
? css`
margin-right: 8px;
`
: css`
: css`
margin-left: 8px;
`}
color: ${({ currentColorScheme }) => currentColorScheme?.main?.accent};
@ -487,16 +487,16 @@ const StyledHideArticleMenuButton = styled.div<{
.article-show-menu-icon_svg {
height: 20px;
${(props) =>
props.theme.interfaceDirection === "rtl" &&
css`
props.theme.interfaceDirection === "rtl" &&
css`
transform: scaleX(-1);
`}
}
.article-hide-menu-icon_svg {
${(props) =>
props.theme.interfaceDirection === "rtl" &&
css`
props.theme.interfaceDirection === "rtl" &&
css`
transform: scaleX(-1);
`}
svg {

View File

@ -104,7 +104,10 @@ const FloatingButton = (props: FloatingButtonProps) => {
classNames([className, "not-selectable"]) || "not-selectable"
}
>
<StyledCircle displayProgress={displayProgress} percent={percent}>
<StyledCircle
displayProgress={displayProgress}
percent={percent > 100 ? 0 : percent}
>
<div className="circle__mask circle__full">
<div className="circle__fill" />
</div>

View File

@ -263,29 +263,29 @@ const MainButtonMobile = (props: MainButtonMobileProps) => {
))}
</StyledProgressContainer>
<StyledButtonOptions withoutButton={withoutButton}>
{buttonOptions
? buttonOptions.map((option: ButtonOption) =>
option.isSeparator ? (
<div key={option.key} className="separator-wrapper">
<div className="is-separator" />
</div>
) : (
<StyledDropDownItem
id={option.id}
className={`drop-down-item-button ${
option.isSeparator ? "is-separator" : ""
}`}
key={option.key}
label={option.label}
onClick={option.onClick}
icon={option.icon ? option.icon : ""}
// action={option.action}
/>
),
)
: ""}
</StyledButtonOptions>
{buttonOptions && (
<StyledButtonOptions withoutButton={withoutButton}>
{buttonOptions.map((option: ButtonOption) =>
option.isSeparator ? (
<div key={option.key} className="separator-wrapper">
<div className="is-separator" />
</div>
) : (
<StyledDropDownItem
id={option.id}
className={`drop-down-item-button ${
option.isSeparator ? "is-separator" : ""
}`}
key={option.key}
label={option.label}
onClick={option.onClick}
icon={option.icon ? option.icon : ""}
// action={option.action}
/>
),
)}
</StyledButtonOptions>
)}
</StyledRenderItem>
);
};

View File

@ -1350,7 +1350,9 @@ class TableHeader extends React.Component<
getSubstring(tableInfoPanelContainer[0])
) {
const currentContentWidth =
contentWidth - +getSubstring(tableInfoPanelContainer[0]);
enabledColumnsCount > 0
? contentWidth - +getSubstring(tableInfoPanelContainer[0])
: contentWidth;
let overWidth = 0;
@ -1370,10 +1372,12 @@ class TableHeader extends React.Component<
gridTemplateColumns.push("0px");
} else if (item !== `${settingsSize}px`) {
const percent =
(getSubstring(item) /
(changedWidth -
+getSubstring(tableInfoPanelContainer[0]))) *
100;
enabledColumnsCount === 0
? 100
: (getSubstring(item) /
(changedWidth -
+getSubstring(tableInfoPanelContainer[0]))) *
100;
const newItemWidth = defaultColumnSize
? `${defaultColumnSize}px`

View File

@ -115,8 +115,9 @@ class AxiosClient {
const proto = headers["x-forwarded-proto"]?.split(",").shift();
const host = headers["x-forwarded-host"]?.split(",").shift();
const port = headers["x-forwarded-port"]?.split(",").shift();
const origin = apiOrigin || `${proto}://${host}`;
const origin = apiOrigin || `${proto}://${host}${port ? `:${port}` : ""}`;
const apiBaseURL = combineUrl(origin, proxyURL, apiPrefix);

View File

@ -23,8 +23,14 @@ import BackgroundPatternRedReactSvgUrl from "PUBLIC_DIR/images/background.patter
import BackgroundPatternPurpleReactSvgUrl from "PUBLIC_DIR/images/background.pattern.purple.react.svg?url";
import BackgroundPatternLightBlueReactSvgUrl from "PUBLIC_DIR/images/background.pattern.lightBlue.react.svg?url";
import BackgroundPatternBlackReactSvgUrl from "PUBLIC_DIR/images/background.pattern.black.react.svg?url";
import { FolderType, RoomsType, ShareAccessRights, ThemeKeys } from "../enums";
import { parseAddress } from "@docspace/shared/utils";
import {
FolderType,
RoomsType,
ShareAccessRights,
ThemeKeys,
ErrorKeys,
} from "../enums";
import { LANGUAGE, PUBLIC_MEDIA_VIEW_URL, RTL_LANGUAGES } from "../constants";
import { TI18n } from "../types";
@ -109,6 +115,44 @@ export const getUserTypeLabel = (
}
};
export const parseDomain = (
domain: string,
setError: Function,
t: (key: string) => string,
) => {
const parsedDomain = parseAddress("test@" + domain);
if (parsedDomain?.parseErrors.length > 0) {
const translatedErrors = parsedDomain.parseErrors.map((error) => {
switch (error.errorKey) {
case ErrorKeys.LocalDomain:
return t("Common:LocalDomain");
case ErrorKeys.IncorrectDomain:
case ErrorKeys.IncorrectEmail:
return t("Common:IncorrectDomain");
case ErrorKeys.DomainIpAddress:
return t("Common:DomainIpAddress");
case ErrorKeys.PunycodeDomain:
return t("Common:PunycodeDomain");
case ErrorKeys.PunycodeLocalPart:
return t("Common:PunycodeLocalPart");
case ErrorKeys.IncorrectLocalPart:
return t("Common:IncorrectLocalPart");
case ErrorKeys.SpacesInLocalPart:
return t("Common:SpacesInLocalPart");
case ErrorKeys.MaxLengthExceeded:
return t("Common:MaxLengthExceeded");
default:
return t("Common:IncorrectDomain");
}
});
setError(translatedErrors);
}
return parsedDomain.isValid();
};
export const validatePortalName = (
value: string,
nameValidator: { minLength: number; maxLength: number; regex: RegExp },

View File

@ -75,6 +75,7 @@ const formatIcons = [
".wpt",
".xls",
".xlsm",
".xlsb",
".xlsx",
".xml",
".xps",

View File

@ -0,0 +1,14 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 1H16L21 6V23H3V1Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 15H10.5H21V6L16 1H3V15ZM16 0H2V16H22V6L16 0Z" fill="url(#paint0_linear_1_18033)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 15H10.5H21V6L16 1H3V15ZM16 0H2V16H22V6L16 0Z" fill="#BFC0BF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M3 15C2.44772 15 2 15.4477 2 16V23C2 23.5523 2.44772 24 3 24H21C21.5523 24 22 23.5523 22 23V16C22 15.4477 21.5523 15 21 15H3ZM9 17H8V22H11V21H9V17ZM3 20H4V22H3V20ZM4 19V20H6V22H7V20H6V19H7V17H6V19H4ZM4 19H3V17H4V19ZM15 19H13V18H15V17H13V18H12V19H13V20H15V21H12V22H15V21H16V20H15V19ZM20 17H17V22H20V21H21V20H20V19H21V18H20V17ZM20 18H18V19H20V18ZM20 20H18V21H20V20Z" fill="#6BAA1C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M15 4H4V13H20V8H15V4ZM19 9H15V12H19V9ZM14 9V12H10V9H14ZM9 9V12H5V9H9ZM9 8H5V5H9V8ZM10 8V5H14V8H10Z" fill="#BFBFBF"/>
<path opacity="0.3" d="M14 9V1H15V8H21V9H14Z" fill="black"/>
<defs>
<linearGradient id="paint0_linear_1_18033" x1="10.5" y1="20.3" x2="10.5" y2="2.6126e-07" gradientUnits="userSpaceOnUse">
<stop stop-color="#A8A8A8"/>
<stop offset="1" stop-color="#DADADA"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,7 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4 31H28V9.15393L18.6628 1H4V31ZM19 0H3V32H29V9L19 0Z" fill="#BFBFBE"/>
<path d="M4 1H18.5L28 9.23792V31H4V1Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 5H6V18H26V10H25V13H20V10H19V13H13V10H18V9H13V6H18V5ZM12 10V13H7V10H12ZM12 14H7V17H12V14ZM20 17H25V14H20V17ZM19 17V14H13V17H19ZM12 9H7V6H12V9Z" fill="#BFBFBF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 20C6.44772 20 6 20.4477 6 21V28C6 28.5523 6.44772 29 7 29H25C25.5523 29 26 28.5523 26 28V21C26 20.4477 25.5523 20 25 20H7ZM13 22H12V27H15V26H13V22ZM7 25H8V27H7V25ZM8 24V25H10V27H11V25H10V24H11V22H10V24H8ZM8 24H7V22H8V24ZM19 24H17V23H19V22H17V23H16V24H17V25H19V26H16V27H19V26H20V25H19V24ZM24 22H21V27H24V26H25V25H24V24H25V23H24V22ZM24 23H22V24H24V23ZM24 25H22V26H24V25Z" fill="#6BAA1C"/>
<path opacity="0.3" d="M17 11V1H18V10H28V11H17Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 994 B

View File

@ -0,0 +1,20 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M38.5858 4L54 19.4142V60H10V4H38.5858Z" fill="white"/>
<path d="M30 32H46V30H30V32Z" fill="#BFBFBF"/>
<path d="M24 32H18V30H24V32Z" fill="#BFBFBF"/>
<path d="M18 24H24V22H18V24Z" fill="#BFBFBF"/>
<path d="M18 16H24V14H18V16Z" fill="#BFBFBF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M38 10H14V36H50V20H48V26H28V20H38V18H28V12H38V10ZM48 28H28V34H48V28ZM26 34V28H16V34H26ZM26 26V20H16V26H26ZM16 18H26V12H16V18Z" fill="#BFBFBF"/>
<path d="M38 14H30V16H38V14Z" fill="#BFBFBF"/>
<path d="M30 24H46V22H30V24Z" fill="#BFBFBF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M38 2H8V62H56V20L38 2ZM54 60V21L37 4H10V60H54Z" fill="url(#paint0_linear_4104_4868)"/>
<path opacity="0.25" d="M38 4H36V22H54V20H38V4Z" fill="black"/>
<path d="M14 40C14 38.8954 14.8954 38 16 38H48C49.1046 38 50 38.8954 50 40V54C50 55.1046 49.1046 56 48 56H16C14.8954 56 14 55.1046 14 54V40Z" fill="#6AAA1E"/>
<path d="M18.3162 51L21.0071 46.8911L18.5686 43.126H20.427L22.0061 45.6558L23.553 43.126H25.3953L22.9461 46.9502L25.637 51H23.7195L21.9739 48.2769L20.2229 51H18.3162ZM25.8363 51V43.1904H27.4262V49.6733H31.3793V51H25.8363ZM31.4552 48.438L33.002 48.2876C33.0951 48.8068 33.2831 49.1882 33.566 49.4316C33.8525 49.6751 34.2374 49.7969 34.7208 49.7969C35.2328 49.7969 35.6178 49.6895 35.8756 49.4746C36.137 49.2562 36.2677 49.002 36.2677 48.7119C36.2677 48.5257 36.2122 48.3682 36.1012 48.2393C35.9937 48.1068 35.804 47.9922 35.5318 47.8955C35.3456 47.8311 34.9213 47.7165 34.2589 47.5518C33.4067 47.3405 32.8087 47.0809 32.4649 46.7729C31.9815 46.3397 31.7398 45.8115 31.7398 45.1885C31.7398 44.7874 31.8526 44.4132 32.0782 44.0659C32.3074 43.715 32.635 43.4482 33.0611 43.2656C33.4908 43.083 34.0082 42.9917 34.6134 42.9917C35.6016 42.9917 36.3446 43.2083 36.8424 43.6416C37.3437 44.0749 37.6068 44.6532 37.6319 45.3765L36.0421 45.4463C35.974 45.0417 35.8272 44.7516 35.6016 44.5762C35.3796 44.3971 35.0448 44.3076 34.5972 44.3076C34.1353 44.3076 33.7737 44.4025 33.5123 44.5923C33.344 44.714 33.2598 44.877 33.2598 45.0811C33.2598 45.2673 33.3386 45.4266 33.4962 45.5591C33.6967 45.7274 34.1837 45.9028 34.9571 46.0854C35.7305 46.2681 36.3017 46.4578 36.6705 46.6548C37.0429 46.8481 37.3329 47.1149 37.5406 47.4551C37.7519 47.7917 37.8575 48.2088 37.8575 48.7065C37.8575 49.1577 37.7322 49.5802 37.4815 49.9741C37.2309 50.368 36.8764 50.6616 36.418 50.855C35.9597 51.0448 35.3886 51.1396 34.7047 51.1396C33.7092 51.1396 32.9447 50.9105 32.4112 50.4521C31.8777 49.9902 31.559 49.3188 31.4552 48.438ZM38.5403 43.126H41.6877C42.3108 43.126 42.7745 43.1528 43.0788 43.2065C43.3868 43.2567 43.6607 43.3641 43.9006 43.5288C44.1441 43.6935 44.3464 43.9137 44.5076 44.1895C44.6687 44.4616 44.7493 44.7677 44.7493 45.1079C44.7493 45.4767 44.649 45.8151 44.4485 46.123C44.2515 46.431 43.983 46.6619 43.6428 46.8159C44.1226 46.9556 44.4914 47.1937 44.7493 47.5303C45.0071 47.8669 45.136 48.2625 45.136 48.7173C45.136 49.0754 45.0518 49.4245 44.8835 49.7646C44.7188 50.1012 44.4914 50.3716 44.2014 50.5757C43.9149 50.7762 43.5605 50.8997 43.1379 50.9463C42.873 50.9749 42.2338 50.9928 41.2204 51H38.5403V43.126ZM40.1301 44.4365V46.2573H41.1721C41.7916 46.2573 42.1765 46.2484 42.3269 46.2305C42.599 46.1982 42.8121 46.1051 42.9661 45.9512C43.1236 45.7936 43.2024 45.5877 43.2024 45.3335C43.2024 45.09 43.1343 44.8931 42.9983 44.7427C42.8658 44.5887 42.6671 44.4956 42.4021 44.4634C42.2445 44.4455 41.7916 44.4365 41.0432 44.4365H40.1301ZM40.1301 47.5679V49.6733H41.6018C42.1747 49.6733 42.5382 49.6572 42.6921 49.625C42.9285 49.582 43.12 49.4782 43.2668 49.3135C43.4172 49.1452 43.4924 48.9214 43.4924 48.6421C43.4924 48.4058 43.4351 48.2052 43.3205 48.0405C43.206 47.8758 43.0395 47.7559 42.821 47.6807C42.6062 47.6055 42.1371 47.5679 41.4138 47.5679H40.1301Z" fill="white"/>
<defs>
<linearGradient id="paint0_linear_4104_4868" x1="29" y1="2" x2="29" y2="62" gradientUnits="userSpaceOnUse">
<stop stop-color="#DCDCDC"/>
<stop offset="1" stop-color="#ADADAD"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,20 @@
<svg width="96" height="96" viewBox="0 0 96 96" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1_17710)">
<path d="M10 1H57L86 30V95H10V1Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 95H86V30L57 1H10V95ZM57 0H9V96H87V30L57 0Z" fill="url(#paint0_linear_1_17710)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M57 11H20V50H76V29H57V11ZM73 41V47H58V41H73ZM73 32V38H58V32H73ZM55 14H41V20H55V14ZM55 23H41V29H55V23ZM55 32H41V38H55V32ZM55 41H41V47H55V41ZM23 14H38V20H23V14ZM23 23H38V29H23V23ZM23 32H38V38H23V32ZM23 41H38V47H23V41Z" fill="#BFBFBF"/>
<path opacity="0.3" d="M56 30V1H57V29H86L87 30H56Z" fill="black"/>
<path d="M65.9111 68.4697V71.9458H67.9004C69.083 71.9458 69.8179 71.9287 70.105 71.8945C70.6245 71.833 71.0312 71.6553 71.3252 71.3613C71.626 71.0605 71.7764 70.6675 71.7764 70.1821C71.7764 69.7173 71.6465 69.3413 71.3867 69.0542C71.1338 68.7603 70.7544 68.5825 70.2485 68.521C69.9478 68.4868 69.083 68.4697 67.6543 68.4697H65.9111Z" fill="#6AAA1E"/>
<path d="M65.9111 74.4478V78.4673H68.7207C69.8145 78.4673 70.5083 78.4365 70.8022 78.375C71.2534 78.293 71.6191 78.0947 71.8994 77.7803C72.1865 77.459 72.3301 77.0317 72.3301 76.4985C72.3301 76.0474 72.2207 75.6646 72.002 75.3501C71.7832 75.0356 71.4653 74.8066 71.0483 74.6631C70.6382 74.5195 69.7427 74.4478 68.3618 74.4478H65.9111Z" fill="#6AAA1E"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M20 61C20 59.3431 21.3431 58 23 58H73C74.6569 58 76 59.3431 76 61V86C76 87.6569 74.6569 89 73 89H23C21.3431 89 20 87.6569 20 86V61ZM48.0898 76.1089L51.043 75.8218C51.2207 76.813 51.5796 77.541 52.1196 78.0059C52.6665 78.4707 53.4014 78.7031 54.3242 78.7031C55.3018 78.7031 56.0366 78.498 56.5288 78.0879C57.0278 77.6709 57.2773 77.1855 57.2773 76.6318C57.2773 76.2764 57.1714 75.9756 56.9595 75.7295C56.7544 75.4766 56.3921 75.2578 55.8726 75.0732C55.5171 74.9502 54.707 74.7314 53.4424 74.417C51.8154 74.0137 50.6738 73.5181 50.0176 72.9302C49.0947 72.103 48.6333 71.0947 48.6333 69.9053C48.6333 69.1396 48.8486 68.4253 49.2793 67.7622C49.7168 67.0923 50.3423 66.583 51.1558 66.2344C51.9761 65.8857 52.9639 65.7114 54.1191 65.7114C56.0059 65.7114 57.4243 66.125 58.3745 66.9521C59.3315 67.7793 59.834 68.8833 59.8818 70.2642L56.8467 70.3975C56.7168 69.625 56.4365 69.0713 56.0059 68.7363C55.582 68.3945 54.9429 68.2236 54.0884 68.2236C53.2065 68.2236 52.5161 68.4048 52.0171 68.7671C51.6958 68.9995 51.5352 69.3105 51.5352 69.7002C51.5352 70.0557 51.6855 70.3599 51.9863 70.6128C52.3691 70.9341 53.2988 71.269 54.7754 71.6177C56.252 71.9663 57.3423 72.3286 58.0464 72.7046C58.7573 73.0737 59.311 73.583 59.7075 74.2324C60.1108 74.875 60.3125 75.6714 60.3125 76.6216C60.3125 77.4829 60.0732 78.2896 59.5947 79.0415C59.1162 79.7935 58.4395 80.354 57.5645 80.7231C56.6895 81.0854 55.5991 81.2666 54.2935 81.2666C52.3931 81.2666 50.9336 80.8291 49.915 79.9541C48.8965 79.0723 48.2881 77.7905 48.0898 76.1089ZM62.876 65.9678H68.8848C70.0742 65.9678 70.9595 66.019 71.5405 66.1216C72.1284 66.2173 72.6514 66.4224 73.1094 66.7368C73.5742 67.0513 73.9604 67.4717 74.2681 67.998C74.5757 68.5176 74.7295 69.1021 74.7295 69.7515C74.7295 70.4556 74.5381 71.1016 74.1553 71.6895C73.7793 72.2773 73.2666 72.7183 72.6172 73.0122C73.5332 73.2788 74.2373 73.7334 74.7295 74.376C75.2217 75.0186 75.4678 75.7739 75.4678 76.6421C75.4678 77.3257 75.3071 77.9922 74.9858 78.6416C74.6714 79.2842 74.2373 79.8003 73.6836 80.1899C73.1367 80.5728 72.46 80.8086 71.6533 80.8975C71.1475 80.9521 69.9272 80.9863 67.9927 81H62.876V65.9678ZM36.103 81V66.0908H39.1382V78.4673H46.6851V81H36.103ZM20.4863 81L25.6235 73.1558L20.9683 65.9678H24.5161L27.5308 70.7974L30.4839 65.9678H34.001L29.3252 73.2686L34.4624 81H30.8018L27.4692 75.8013L24.1265 81H20.4863Z" fill="#6AAA1E"/>
</g>
<defs>
<linearGradient id="paint0_linear_1_17710" x1="48" y1="94.25" x2="48" y2="1.21299e-06" gradientUnits="userSpaceOnUse">
<stop stop-color="#A8A8A8"/>
<stop offset="1" stop-color="#DADADA"/>
</linearGradient>
<clipPath id="clip0_1_17710">
<rect width="96" height="96" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "انقر فوق \"أرسل التقرير\" لإنشاء تقرير تلقائي ومساعدتنا في إصلاح الخطأ. لن يتم استخدام أي من بياناتك الشخصية في التقرير.",
"SortBy": "الترتيب حسب",
"SpacesInLocalPart": "الجزء المحلي لا يمكن أن يحتوي على مسافات",
"SSO": "SSO",
"Standard": "القياسي",
"SubmitToFormGallery": "تسليم إلى نموذج المعرض",
"SubmitToGallery": "تسليم إلى المعرض",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Avtomatik olaraq hesabat yaratmaq və xətanı düzəltməyə kömək etmək üçün Hesabatı göndərin seçiminə klikləyin. Hesabatda şəxsi məlumatlarınızdan heç biri istifadə edilməyəcək.",
"SortBy": "Bu qayda ilə sırala",
"SpacesInLocalPart": "Lokal yolda boşluqlar icazə verilmir",
"SSO": "SSO",
"Standard": "Standart",
"SubmitToFormGallery": "Form Qalereyasına göndərin",
"SubmitToGallery": "Qalereyaya göndərin",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Щракнете върху Изпращане на доклад, за да генерирате автоматично такъв и да ни помогнете да коригираме грешката. Никакви ваши лични данни няма да бъдат използвани в доклада.",
"SortBy": "Сортиране по",
"SpacesInLocalPart": "Местната част не може да съдържа интервали",
"SSO": "SSO",
"Standard": "Стандарт",
"SubmitToFormGallery": "Изпрати до Галерия с формуляри",
"SubmitToGallery": "Изпрати до Галерия",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Kliknutím na tlačítko Odeslat hlášení automaticky vygenerujete hlášení a pomůžete nám chybu opravit. V hlášení nebudou použity žádné vaše osobní údaje.",
"SortBy": "Seřadit podle",
"SpacesInLocalPart": "Místní část nemůže obsahovat mezery",
"SSO": "SSO",
"Standard": "Standardní",
"SubmitToFormGallery": "Odeslat do Galerie formulářů",
"SubmitToGallery": "Odeslat do galerie",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Klicken Sie auf Bericht senden, um automatisch einen Bericht zu erstellen und uns bei der Behebung des Fehlers zu helfen. Keine Ihrer persönlichen Daten werden in dem Bericht verwendet.",
"SortBy": "Sortieren nach",
"SpacesInLocalPart": "Lokaler Teil beinhaltet Leerzeichen",
"SSO": "SSO",
"Standard": "Standard",
"SubmitToFormGallery": "An die Formulargalerie senden",
"SubmitToGallery": "Zur Galerie einreichen",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Κάντε κλικ στην επιλογή «Αποστολή αναφοράς» για να δημιουργήσετε αυτόματα μια αναφορά και να μας βοηθήσετε να διορθώσουμε το σφάλμα. Κανένα από τα προσωπικά σας δεδομένα δεν θα χρησιμοποιηθεί στην αναφορά.",
"SortBy": "Ταξινόμηση κατά",
"SpacesInLocalPart": "Το τοπικό τμήμα δεν μπορεί να περιέχει κενά",
"SSO": "SSO",
"Standard": "Τυπικό",
"SubmitToFormGallery": "Υποβολή στη Συλλογή Φορμών",
"SubmitToGallery": "Υποβολή στη Συλλογή",

View File

@ -384,6 +384,7 @@
"SpaceManagement": "Space Management",
"Spaces": "Spaces",
"SpacesInLocalPart": "Local part can't contain spaces",
"SSO": "SSO",
"Standard": "Standard",
"Storage": "Storage",
"StorageAndQuota": "Storage / Quota",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Haga clic en Enviar informe para generar automáticamente un informe y ayudarnos a solucionar el error. En el informe no se utilizará ninguno de sus datos personales.",
"SortBy": "Ordenar por",
"SpacesInLocalPart": "La parte local no puede contener espacios",
"SSO": "SSO",
"Standard": "Estándar",
"SubmitToFormGallery": "Enviar a la Galería de formularios",
"SubmitToGallery": "Enviar a la Galería",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Klikkaa lähettääksesi raportti ja auta meitä korjaamaan vika. Henkilökohtaisia tietojasi ei käytetä raportissa.",
"SortBy": "Lajitteluperuste",
"SpacesInLocalPart": "Paikallinen osa ei voi sisältää välilyöntejä",
"SSO": "SSO",
"Standard": "Vakio",
"SubmitToFormGallery": "Lähetä Lomakegalleriaan",
"SubmitToGallery": "Lähetä Galleriaan",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Cliquez Envoyer le rapport pour générer automatiquement le rapport et nous aider à corriger lerreur. Aucune de vos données personnelles ne sera utilisée dans le rapport.",
"SortBy": "Trier par",
"SpacesInLocalPart": "Le local ne peux pas contenir d'espace",
"SSO": "SSO",
"Standard": "Standard",
"SubmitToFormGallery": "Soumettre à la galerie de formulaires",
"SubmitToGallery": "Soumettre à la galerie",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Սեղմեք Ուղարկել հաշվետվություն՝ ավտոմատ կերպով հաշվետվություն ստեղծելու և սխալը շտկելու համար: Ձեր անձնական տվյալներից ոչ մեկը չի օգտագործվի հաշվետվության մեջ:",
"SortBy": "Դասավորել ըստ",
"SpacesInLocalPart": "Տեղական մասը չի կարող բացատներ պարունակել",
"SSO": "SSO",
"Standard": "Ստանդարտ",
"SubmitToFormGallery": "Ներկայացնել ձևերի պատկերասրահի ",
"SubmitToGallery": "Ներկայացնել պատկերասրահ",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Fai clic su Invia rapporto per generare automaticamente una segnalazione e aiutarci a correggere l'errore. Nessuno dei tuoi dati personali verrà utilizzato nel report.",
"SortBy": "Ordina per",
"SpacesInLocalPart": "La parte locale non può contenere spazi",
"SSO": "SSO",
"Standard": "Standard",
"SubmitToFormGallery": "Invia alla Galleria dei moduli",
"SubmitToGallery": "Invia alla Galleria",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "「レポートを送信する」をクリックすると、自動的にレポートが作成され、エラーの修正に役立てることができます。レポートには、お客様の個人情報は一切使用されません。",
"SortBy": "並べ替え",
"SpacesInLocalPart": "ローカルパートはスペースを含むことができません",
"SSO": "SSO",
"Standard": "標準",
"SubmitToFormGallery": " フォームギャラリーに投稿",
"SubmitToGallery": "ギャラリーに投稿",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "보고서 전송을 클릭하면 해당 오류를 수정하는 데 도움이 되는 보고서가 자동으로 생성됩니다. 사용자의 개인 데이터는 보고서에 포함되지 않습니다.",
"SortBy": "정렬",
"SpacesInLocalPart": "로컬 파트는 공백을 포함할 수 없습니다",
"SSO": "SSO",
"Standard": "기준",
"SubmitToFormGallery": "양식 갤러리에 제출",
"SubmitToGallery": "갤러리에 제출",

View File

@ -296,6 +296,7 @@
"SomethingWentWrongDescription": "ຄລິກສົ່ງລາຍງານເພື່ອສ້າງລາຍງານອັດຕະໂນມັດ ແລະຊ່ວຍພວກເຮົາແກ້ໄຂຂໍ້ຜິດພາດ. ບໍ່ມີຂໍ້ມູນສ່ວນຕົວໃດໆຂອງເຈົ້າຈະຖືກໃຊ້ໃນລາຍງານນີ້.",
"SortBy": "ຈັດຮຽງຕາມ",
"SpacesInLocalPart": "ພື່ນທີ່ທ້ອງຖິ້ນບໍ່ພຽງພໍ",
"SSO": "SSO",
"Standard": "ມາດຕະຖານ",
"SubscriptionExpired": "ການສະໝັກສິດນຳໃຊ້ການຊ່ວຍເຫຼືອ ແລະອັບເດດຂອງທ່ານໝົດອາຍຸແລ້ວ",
"SubscriptionIsExpiring": "ການສະໝັກສິດນຳໃຊ້ຂອງທ່ານໝົດອາຍຸໃນວັນທີ {{date}}",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Noklikšķiniet uz Sūtīt pārskatu, lai automātiski izveidotu pārskatu un palīdzētu mums novērst kļūdu. Neviens no jūsu personas datiem pārskatā netiks izmantots.",
"SortBy": "Šķirot pēc",
"SpacesInLocalPart": "Lokālajā daļā nedrīkst būt atstarpes",
"SSO": "SSO",
"Standard": "Standarta",
"SubmitToFormGallery": "Iesniedziet veidlapu galerijā",
"SubmitToGallery": "Iesniegt galerijā",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Klik op Verzend verslag om automatisch een verslag te genereren en ons te helpen de fout te herstellen. Uw persoonsgegevens worden niet gebruikt in het verslag.",
"SortBy": "Sorteren op",
"SpacesInLocalPart": "Lokaal deel kan geen spaties bevatten",
"SSO": "SSO",
"Standard": "Standaard",
"SubmitToFormGallery": "Indienen bij Formulier Galerij",
"SubmitToGallery": "Indienen bij Galerij",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Kliknij Wyślij raport, aby automatycznie wygenerować raport i pomóc nam naprawić błąd. Twoje dane osobowe nie będą zawarte w raporcie.",
"SortBy": "Sortuj",
"SpacesInLocalPart": "Identyfikator użytkownika nie może zawierać spacji",
"SSO": "SSO",
"Standard": "Standardowy",
"SubmitToFormGallery": "Prześlij do galerii formularzy",
"SubmitToGallery": "Prześlij do galerii",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Clique em Enviar relatório para gerar automaticamente um relatório e nos ajudar a corrigir o erro. Nenhum dos seus dados pessoais será usado no relatório.",
"SortBy": "Ordenar por",
"SpacesInLocalPart": "A parte local não pode conter espaços",
"SSO": "SSO",
"Standard": "Padrão",
"SubmitToFormGallery": "Enviar para Galeria de Formulários",
"SubmitToGallery": "Enviar para Galeria",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Clique em Enviar relatório para gerar automaticamente um relatório e ajudar-nos a corrigir o erro. Nenhum dos seus dados pessoais será utilizado no relatório.",
"SortBy": "Ordenar por",
"SpacesInLocalPart": "A parte local não pode conter espaços",
"SSO": "SSO",
"Standard": "Padrão",
"SubmitToFormGallery": "Enviar para Galeria de Formulários",
"SubmitToGallery": "Enviar para Galeria",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Faceți clic pe Trimitere raport pentru a genera raportul și ne ajuta să remediem eroarea. Nicio parte a datelor cu caracter personal nu va fi inclusă în raportul.",
"SortBy": "Sortare după",
"SpacesInLocalPart": "Partea locală nu trebuie să conțină spații",
"SSO": "SSO",
"Standard": "Standard",
"SubmitToFormGallery": "Trimite la Galeria de Formulare",
"SubmitToGallery": "Trimite la Galerie",

View File

@ -335,6 +335,7 @@
"SpaceManagement": "Управление Пространством",
"Spaces": "Пространства",
"SpacesInLocalPart": "Имя почтового ящика содержит пробелы",
"SSO": "SSO",
"Standard": "Стандарт",
"SubmitToFormGallery": "Отправить в Галерею Форм",
"SubmitToGallery": "Отправить в Галерею",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Kliknutím na tlačidlo Odoslať hlásenie automaticky vygenerujete hlásenie o chybe a pomôžete nám chybu opraviť. V hlásení nebudú zaznamenané žiadne vaše osobné údaje.",
"SortBy": "Zoradiť podľa",
"SpacesInLocalPart": "Miestna časť nemôže obsahovať medzery",
"SSO": "SSO",
"Standard": "Štandard",
"SubmitToFormGallery": "Odoslať do galérie formulárov",
"SubmitToGallery": "Odoslať do galérie",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Kliknite Pošlji poročilo, da samodejno ustvarite poročilo in nam pomagate odpraviti napako. V poročilu ne bodo uporabljeni vaši osebni podatki.",
"SortBy": "Razvrsti po",
"SpacesInLocalPart": "Lokalni del ne sme vsebovati presledkov",
"SSO": "SSO",
"Standard": "Standardno",
"SubmitToFormGallery": "Oddaj v Fgalerijo obrazcev",
"SubmitToGallery": "Oddaj v galerijo",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Otomatik olarak bir rapor oluşturmak ve hatayı düzeltmemize yardımcı olmak için Rapor gönder'e tıklayın. Kişisel verilerinizin hiçbiri raporda kullanılmayacaktır.",
"SortBy": "Şöyle sırala:",
"SpacesInLocalPart": "Yerel kısım boşluk içeremez",
"SSO": "SSO",
"Standard": "Standart",
"SubmitToFormGallery": "Form Galerisine Gönder",
"SubmitToGallery": "Galeriye Gönder",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Натисніть «Надіслати звіт», щоб автоматично створити звіт та допомогти нам усунути помилку. Звіт не міститиме жодних ваших персональних даних.",
"SortBy": "Сортування по",
"SpacesInLocalPart": "Локальна частина не може містити пробіли",
"SSO": "SSO",
"Standard": "Стандартний",
"SubmitToFormGallery": "Надіслати до галереї форм",
"SubmitToGallery": "Надіслати до галереї",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "Nhấp vào Gửi báo cáo để tự động tạo báo cáo và giúp chúng tôi khắc phục lỗi. Sẽ không có dữ liệu cá nhân nào của bạn được sử dụng trong báo cáo.",
"SortBy": "Xếp theo",
"SpacesInLocalPart": "Phần cục bộ không được chứa khoảng trắng",
"SSO": "SSO",
"Standard": "Tiêu chuẩn",
"SubmitToFormGallery": "Gửi đến Bộ Sưu Tập Biểu Mẫu",
"SubmitToGallery": "Gửi đến Bộ Sưu Tập",

View File

@ -331,6 +331,7 @@
"SomethingWentWrongDescription": "单击“发送报告”可自动生成报告,有利于我们修复错误。报告中不会使用您的任何个人数据。",
"SortBy": "排序方式",
"SpacesInLocalPart": "本地部分中不能包含空格",
"SSO": "SSO",
"Standard": "标准",
"SubmitToFormGallery": "提交至表单库",
"SubmitToGallery": "提交至表单库",

View File

@ -3046,7 +3046,7 @@ __metadata:
prettier: "npm:^3.2.4"
react: "npm:^18.2.0"
react-dom: "npm:^18.2.0"
react-i18next: "npm:^14.0.1"
react-i18next: "npm:^13.2.1"
shx: "npm:^0.3.4"
styled-components: "npm:^5.3.9"
typescript: "npm:^5"
@ -24474,24 +24474,6 @@ __metadata:
languageName: node
linkType: hard
"react-i18next@npm:^14.0.1":
version: 14.0.5
resolution: "react-i18next@npm:14.0.5"
dependencies:
"@babel/runtime": "npm:^7.23.9"
html-parse-stringify: "npm:^3.0.1"
peerDependencies:
i18next: ">= 23.2.3"
react: ">= 16.8.0"
peerDependenciesMeta:
react-dom:
optional: true
react-native:
optional: true
checksum: 4c91d4b889ab1ab05d7cda050890f7f41c4a73dadfef4778770a53b0d2f98e9d80f04da5086790706349d8a80cf09eec0c539fc1020a7c6fead562511dd2a2cf
languageName: node
linkType: hard
"react-is@npm:18.1.0":
version: 18.1.0
resolution: "react-is@npm:18.1.0"