mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Refactoring: pull similar messages together
This commit is contained in:
parent
c786b54132
commit
8c38297de7
|
@ -3,6 +3,7 @@
|
||||||
import { createContext, useContext, useState } from 'react';
|
import { createContext, useContext, useState } from 'react';
|
||||||
|
|
||||||
import { UserLevel } from '@/models/user';
|
import { UserLevel } from '@/models/user';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
interface IAccessModeContext {
|
interface IAccessModeContext {
|
||||||
accessLevel: UserLevel;
|
accessLevel: UserLevel;
|
||||||
|
@ -13,7 +14,7 @@ const AccessContext = createContext<IAccessModeContext | null>(null);
|
||||||
export const useAccessMode = () => {
|
export const useAccessMode = () => {
|
||||||
const context = useContext(AccessContext);
|
const context = useContext(AccessContext);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error('useAccessMode has to be used within <AccessModeState.Provider>');
|
throw new Error(contextOutsideScope('useAccessMode', 'AccessModeState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -25,6 +25,7 @@ import {
|
||||||
IUserSignupData,
|
IUserSignupData,
|
||||||
IUserUpdatePassword
|
IUserUpdatePassword
|
||||||
} from '@/models/user';
|
} from '@/models/user';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
import { useUsers } from './UsersContext';
|
import { useUsers } from './UsersContext';
|
||||||
|
|
||||||
|
@ -46,7 +47,7 @@ const AuthContext = createContext<IAuthContext | null>(null);
|
||||||
export const useAuth = () => {
|
export const useAuth = () => {
|
||||||
const context = useContext(AuthContext);
|
const context = useContext(AuthContext);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error('useAuth has to be used within <AuthState.Provider>');
|
throw new Error(contextOutsideScope('useAuth', 'AuthState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,6 +20,7 @@ import { matchLibraryItem, matchLibraryItemLocation } from '@/models/libraryAPI'
|
||||||
import { ILibraryFilter } from '@/models/miscellaneous';
|
import { ILibraryFilter } from '@/models/miscellaneous';
|
||||||
import { IRSForm, IRSFormCloneData, IRSFormData } from '@/models/rsform';
|
import { IRSForm, IRSFormCloneData, IRSFormData } from '@/models/rsform';
|
||||||
import { RSFormLoader } from '@/models/RSFormLoader';
|
import { RSFormLoader } from '@/models/RSFormLoader';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
import { useAuth } from './AuthContext';
|
import { useAuth } from './AuthContext';
|
||||||
import { useConceptOptions } from './OptionsContext';
|
import { useConceptOptions } from './OptionsContext';
|
||||||
|
@ -46,7 +47,7 @@ const LibraryContext = createContext<ILibraryContext | null>(null);
|
||||||
export const useLibrary = (): ILibraryContext => {
|
export const useLibrary = (): ILibraryContext => {
|
||||||
const context = useContext(LibraryContext);
|
const context = useContext(LibraryContext);
|
||||||
if (context === null) {
|
if (context === null) {
|
||||||
throw new Error('useLibrary has to be used within <LibraryState.Provider>');
|
throw new Error(contextOutsideScope('useLibrary', 'LibraryState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'rea
|
||||||
import { useLocation, useNavigate } from 'react-router-dom';
|
import { useLocation, useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
import { globals } from '@/utils/constants';
|
import { globals } from '@/utils/constants';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
interface INavigationContext {
|
interface INavigationContext {
|
||||||
push: (path: string, newTab?: boolean) => void;
|
push: (path: string, newTab?: boolean) => void;
|
||||||
|
@ -21,7 +22,7 @@ const NavigationContext = createContext<INavigationContext | null>(null);
|
||||||
export const useConceptNavigation = () => {
|
export const useConceptNavigation = () => {
|
||||||
const context = useContext(NavigationContext);
|
const context = useContext(NavigationContext);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error('useConceptNavigation has to be used within <NavigationState.Provider>');
|
throw new Error(contextOutsideScope('useConceptNavigation', 'NavigationState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { FontStyle } from '@/models/miscellaneous';
|
||||||
import { animationDuration } from '@/styling/animations';
|
import { animationDuration } from '@/styling/animations';
|
||||||
import { darkT, IColorTheme, lightT } from '@/styling/color';
|
import { darkT, IColorTheme, lightT } from '@/styling/color';
|
||||||
import { globals, storage } from '@/utils/constants';
|
import { globals, storage } from '@/utils/constants';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
interface IOptionsContext {
|
interface IOptionsContext {
|
||||||
viewportHeight: string;
|
viewportHeight: string;
|
||||||
|
@ -45,7 +46,7 @@ const OptionsContext = createContext<IOptionsContext | null>(null);
|
||||||
export const useConceptOptions = () => {
|
export const useConceptOptions = () => {
|
||||||
const context = useContext(OptionsContext);
|
const context = useContext(OptionsContext);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error('useConceptTheme has to be used within <ThemeState.Provider>');
|
throw new Error(contextOutsideScope('useConceptTheme', 'ThemeState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,6 +18,7 @@ import { AccessPolicy, ILibraryItem } from '@/models/library';
|
||||||
import { ILibraryUpdateData } from '@/models/library';
|
import { ILibraryUpdateData } from '@/models/library';
|
||||||
import { IOperationSchema } from '@/models/oss';
|
import { IOperationSchema } from '@/models/oss';
|
||||||
import { UserID } from '@/models/user';
|
import { UserID } from '@/models/user';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
import { useAuth } from './AuthContext';
|
import { useAuth } from './AuthContext';
|
||||||
import { useLibrary } from './LibraryContext';
|
import { useLibrary } from './LibraryContext';
|
||||||
|
@ -48,7 +49,7 @@ const OssContext = createContext<IOssContext | null>(null);
|
||||||
export const useOSS = () => {
|
export const useOSS = () => {
|
||||||
const context = useContext(OssContext);
|
const context = useContext(OssContext);
|
||||||
if (context === null) {
|
if (context === null) {
|
||||||
throw new Error('useOSS has to be used within <OssState.Provider>');
|
throw new Error(contextOutsideScope('useOSS', 'OssState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -48,6 +48,7 @@ import {
|
||||||
ITargetCst
|
ITargetCst
|
||||||
} from '@/models/rsform';
|
} from '@/models/rsform';
|
||||||
import { UserID } from '@/models/user';
|
import { UserID } from '@/models/user';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
import { useAuth } from './AuthContext';
|
import { useAuth } from './AuthContext';
|
||||||
import { useLibrary } from './LibraryContext';
|
import { useLibrary } from './LibraryContext';
|
||||||
|
@ -99,7 +100,7 @@ const RSFormContext = createContext<IRSFormContext | null>(null);
|
||||||
export const useRSForm = () => {
|
export const useRSForm = () => {
|
||||||
const context = useContext(RSFormContext);
|
const context = useContext(RSFormContext);
|
||||||
if (context === null) {
|
if (context === null) {
|
||||||
throw new Error('useRSForm has to be used within <RSFormState.Provider>');
|
throw new Error(contextOutsideScope('useRSForm', 'RSFormState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'rea
|
||||||
import { DataCallback, getProfile, patchProfile } from '@/app/backendAPI';
|
import { DataCallback, getProfile, patchProfile } from '@/app/backendAPI';
|
||||||
import { ErrorData } from '@/components/info/InfoError';
|
import { ErrorData } from '@/components/info/InfoError';
|
||||||
import { IUserProfile, IUserUpdateData } from '@/models/user';
|
import { IUserProfile, IUserUpdateData } from '@/models/user';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
import { useUsers } from './UsersContext';
|
import { useUsers } from './UsersContext';
|
||||||
|
|
||||||
|
@ -23,7 +24,7 @@ const ProfileContext = createContext<IUserProfileContext | null>(null);
|
||||||
export const useUserProfile = () => {
|
export const useUserProfile = () => {
|
||||||
const context = useContext(ProfileContext);
|
const context = useContext(ProfileContext);
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error('useUserProfile has to be used within <UserProfileState.Provider>');
|
throw new Error(contextOutsideScope('useUserProfile', 'UserProfileState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'rea
|
||||||
|
|
||||||
import { getActiveUsers } from '@/app/backendAPI';
|
import { getActiveUsers } from '@/app/backendAPI';
|
||||||
import { IUserInfo } from '@/models/user';
|
import { IUserInfo } from '@/models/user';
|
||||||
|
import { contextOutsideScope } from '@/utils/labels';
|
||||||
|
|
||||||
interface IUsersContext {
|
interface IUsersContext {
|
||||||
users: IUserInfo[];
|
users: IUserInfo[];
|
||||||
|
@ -15,7 +16,7 @@ const UsersContext = createContext<IUsersContext | null>(null);
|
||||||
export const useUsers = (): IUsersContext => {
|
export const useUsers = (): IUsersContext => {
|
||||||
const context = useContext(UsersContext);
|
const context = useContext(UsersContext);
|
||||||
if (context === null) {
|
if (context === null) {
|
||||||
throw new Error('useUsers has to be used within <UsersState.Provider>');
|
throw new Error(contextOutsideScope('useUsers', 'UsersState'));
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,6 +20,7 @@ import { useConceptNavigation } from '@/context/NavigationContext';
|
||||||
import { AccessPolicy, ILibraryItem, LocationHead } from '@/models/library';
|
import { AccessPolicy, ILibraryItem, LocationHead } from '@/models/library';
|
||||||
import { cloneTitle, combineLocation, validateLocation } from '@/models/libraryAPI';
|
import { cloneTitle, combineLocation, validateLocation } from '@/models/libraryAPI';
|
||||||
import { ConstituentaID, IRSFormCloneData } from '@/models/rsform';
|
import { ConstituentaID, IRSFormCloneData } from '@/models/rsform';
|
||||||
|
import { information } from '@/utils/labels';
|
||||||
|
|
||||||
interface DlgCloneLibraryItemProps extends Pick<ModalProps, 'hideWindow'> {
|
interface DlgCloneLibraryItemProps extends Pick<ModalProps, 'hideWindow'> {
|
||||||
base: ILibraryItem;
|
base: ILibraryItem;
|
||||||
|
@ -62,7 +63,7 @@ function DlgCloneLibraryItem({ hideWindow, base, initialLocation, selected, tota
|
||||||
data.items = selected;
|
data.items = selected;
|
||||||
}
|
}
|
||||||
cloneItem(base.id, data, newSchema => {
|
cloneItem(base.id, data, newSchema => {
|
||||||
toast.success(`Копия создана: ${newSchema.alias}`);
|
toast.success(information.cloneComplete(newSchema.alias));
|
||||||
router.push(urls.schema(newSchema.id));
|
router.push(urls.schema(newSchema.id));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import { Grammeme, ITextRequest, IWordForm, IWordFormPlain } from '@/models/lang
|
||||||
import { parseGrammemes, wordFormEquals } from '@/models/languageAPI';
|
import { parseGrammemes, wordFormEquals } from '@/models/languageAPI';
|
||||||
import { HelpTopic } from '@/models/miscellaneous';
|
import { HelpTopic } from '@/models/miscellaneous';
|
||||||
import { IConstituenta, TermForm } from '@/models/rsform';
|
import { IConstituenta, TermForm } from '@/models/rsform';
|
||||||
|
import { prompts } from '@/utils/labels';
|
||||||
import { IGrammemeOption, SelectorGrammemes, SelectorGrammemesList } from '@/utils/selectors';
|
import { IGrammemeOption, SelectorGrammemes, SelectorGrammemesList } from '@/utils/selectors';
|
||||||
|
|
||||||
import WordFormsTable from './WordFormsTable';
|
import WordFormsTable from './WordFormsTable';
|
||||||
|
@ -92,7 +93,7 @@ function DlgEditWordForms({ hideWindow, target, onSave }: DlgEditWordFormsProps)
|
||||||
|
|
||||||
function handleGenerateLexeme() {
|
function handleGenerateLexeme() {
|
||||||
if (forms.length > 0) {
|
if (forms.length > 0) {
|
||||||
if (!window.confirm('Данное действие приведет к перезаписи словоформ при совпадении граммем. Продолжить?')) {
|
if (!window.confirm(prompts.generateWordforms)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import { AccessPolicy, LibraryItemType, LocationHead } from '@/models/library';
|
||||||
import { ILibraryCreateData } from '@/models/library';
|
import { ILibraryCreateData } from '@/models/library';
|
||||||
import { combineLocation, validateLocation } from '@/models/libraryAPI';
|
import { combineLocation, validateLocation } from '@/models/libraryAPI';
|
||||||
import { EXTEOR_TRS_FILE, limits, patterns } from '@/utils/constants';
|
import { EXTEOR_TRS_FILE, limits, patterns } from '@/utils/constants';
|
||||||
|
import { information } from '@/utils/labels';
|
||||||
|
|
||||||
function FormCreateItem() {
|
function FormCreateItem() {
|
||||||
const router = useConceptNavigation();
|
const router = useConceptNavigation();
|
||||||
|
@ -78,7 +79,7 @@ function FormCreateItem() {
|
||||||
fileName: file?.name
|
fileName: file?.name
|
||||||
};
|
};
|
||||||
createItem(data, newItem => {
|
createItem(data, newItem => {
|
||||||
toast.success('Схема успешно создана');
|
toast.success(information.newLibraryItem);
|
||||||
if (itemType == LibraryItemType.RSFORM) {
|
if (itemType == LibraryItemType.RSFORM) {
|
||||||
router.push(urls.schema(newItem.id));
|
router.push(urls.schema(newItem.id));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import { useOSS } from '@/context/OssContext';
|
||||||
import { ILibraryUpdateData, LibraryItemType } from '@/models/library';
|
import { ILibraryUpdateData, LibraryItemType } from '@/models/library';
|
||||||
import AccessToolbar from '@/pages/RSFormPage/EditorRSFormCard/AccessToolbar';
|
import AccessToolbar from '@/pages/RSFormPage/EditorRSFormCard/AccessToolbar';
|
||||||
import { limits, patterns } from '@/utils/constants';
|
import { limits, patterns } from '@/utils/constants';
|
||||||
|
import { information } from '@/utils/labels';
|
||||||
|
|
||||||
import { useOssEdit } from '../OssEditContext';
|
import { useOssEdit } from '../OssEditContext';
|
||||||
|
|
||||||
|
@ -81,7 +82,7 @@ function FormOSS({ id, isModified, setIsModified }: FormOSSProps) {
|
||||||
visible: visible,
|
visible: visible,
|
||||||
read_only: readOnly
|
read_only: readOnly
|
||||||
};
|
};
|
||||||
update(data, () => toast.success('Изменения сохранены'));
|
update(data, () => toast.success(information.changesSaved));
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -13,6 +13,7 @@ import DlgEditEditors from '@/dialogs/DlgEditEditors';
|
||||||
import { AccessPolicy } from '@/models/library';
|
import { AccessPolicy } from '@/models/library';
|
||||||
import { IOperationSchema } from '@/models/oss';
|
import { IOperationSchema } from '@/models/oss';
|
||||||
import { UserID, UserLevel } from '@/models/user';
|
import { UserID, UserLevel } from '@/models/user';
|
||||||
|
import { information } from '@/utils/labels';
|
||||||
|
|
||||||
interface IOssEditContext {
|
interface IOssEditContext {
|
||||||
schema?: IOperationSchema;
|
schema?: IOperationSchema;
|
||||||
|
@ -84,7 +85,7 @@ export const OssEditState = ({ children }: OssEditStateProps) => {
|
||||||
if (!model.schema) {
|
if (!model.schema) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
model.setLocation(newLocation, () => toast.success('Схема перемещена'));
|
model.setLocation(newLocation, () => toast.success(information.moveComplete));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
@ -102,35 +103,35 @@ export const OssEditState = ({ children }: OssEditStateProps) => {
|
||||||
const url = currentRef.includes('?') ? currentRef + '&share' : currentRef + '?share';
|
const url = currentRef.includes('?') ? currentRef + '&share' : currentRef + '?share';
|
||||||
navigator.clipboard
|
navigator.clipboard
|
||||||
.writeText(url)
|
.writeText(url)
|
||||||
.then(() => toast.success(`Ссылка скопирована: ${url}`))
|
.then(() => toast.success(information.linkReady))
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const toggleSubscribe = useCallback(() => {
|
const toggleSubscribe = useCallback(() => {
|
||||||
if (model.isSubscribed) {
|
if (model.isSubscribed) {
|
||||||
model.unsubscribe(() => toast.success('Отслеживание отключено'));
|
model.unsubscribe(() => toast.success(information.unsubscribed));
|
||||||
} else {
|
} else {
|
||||||
model.subscribe(() => toast.success('Отслеживание включено'));
|
model.subscribe(() => toast.success(information.subscribed));
|
||||||
}
|
}
|
||||||
}, [model]);
|
}, [model]);
|
||||||
|
|
||||||
const setOwner = useCallback(
|
const setOwner = useCallback(
|
||||||
(newOwner: UserID) => {
|
(newOwner: UserID) => {
|
||||||
model.setOwner(newOwner, () => toast.success('Владелец обновлен'));
|
model.setOwner(newOwner, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
|
||||||
const setAccessPolicy = useCallback(
|
const setAccessPolicy = useCallback(
|
||||||
(newPolicy: AccessPolicy) => {
|
(newPolicy: AccessPolicy) => {
|
||||||
model.setAccessPolicy(newPolicy, () => toast.success('Политика доступа изменена'));
|
model.setAccessPolicy(newPolicy, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
|
||||||
const setEditors = useCallback(
|
const setEditors = useCallback(
|
||||||
(newEditors: UserID[]) => {
|
(newEditors: UserID[]) => {
|
||||||
model.setEditors(newEditors, () => toast.success('Редакторы обновлены'));
|
model.setEditors(newEditors, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
|
|
@ -17,6 +17,7 @@ import { useBlockNavigation, useConceptNavigation } from '@/context/NavigationCo
|
||||||
import { useConceptOptions } from '@/context/OptionsContext';
|
import { useConceptOptions } from '@/context/OptionsContext';
|
||||||
import { useOSS } from '@/context/OssContext';
|
import { useOSS } from '@/context/OssContext';
|
||||||
import useQueryStrings from '@/hooks/useQueryStrings';
|
import useQueryStrings from '@/hooks/useQueryStrings';
|
||||||
|
import { information, prompts } from '@/utils/labels';
|
||||||
|
|
||||||
import EditorRSForm from './EditorOssCard';
|
import EditorRSForm from './EditorOssCard';
|
||||||
import EditorTermGraph from './EditorOssGraph';
|
import EditorTermGraph from './EditorOssGraph';
|
||||||
|
@ -84,11 +85,11 @@ function OssTabs() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const onDestroySchema = useCallback(() => {
|
const onDestroySchema = useCallback(() => {
|
||||||
if (!schema || !window.confirm('Вы уверены, что хотите удалить данную схему?')) {
|
if (!schema || !window.confirm(prompts.deleteLibraryItem)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
destroyItem(schema.id, () => {
|
destroyItem(schema.id, () => {
|
||||||
toast.success('Схема удалена');
|
toast.success(information.itemDestroyed);
|
||||||
router.push(urls.library);
|
router.push(urls.library);
|
||||||
});
|
});
|
||||||
}, [schema, destroyItem, router]);
|
}, [schema, destroyItem, router]);
|
||||||
|
|
|
@ -13,7 +13,7 @@ import BadgeHelp from '@/components/info/BadgeHelp';
|
||||||
import MiniButton from '@/components/ui/MiniButton';
|
import MiniButton from '@/components/ui/MiniButton';
|
||||||
import Overlay from '@/components/ui/Overlay';
|
import Overlay from '@/components/ui/Overlay';
|
||||||
import { HelpTopic } from '@/models/miscellaneous';
|
import { HelpTopic } from '@/models/miscellaneous';
|
||||||
import { messages, prepareTooltip } from '@/utils/labels';
|
import { prepareTooltip, tooltips } from '@/utils/labels';
|
||||||
|
|
||||||
interface ConstituentaToolbarProps {
|
interface ConstituentaToolbarProps {
|
||||||
disabled: boolean;
|
disabled: boolean;
|
||||||
|
@ -66,7 +66,7 @@ function ConstituentaToolbar({
|
||||||
onClick={onCreate}
|
onClick={onCreate}
|
||||||
/>
|
/>
|
||||||
<MiniButton
|
<MiniButton
|
||||||
titleHtml={modified ? messages.unsaved : prepareTooltip('Клонировать конституенту', 'Alt + V')}
|
titleHtml={modified ? tooltips.unsaved : prepareTooltip('Клонировать конституенту', 'Alt + V')}
|
||||||
icon={<IconClone size='1.25rem' className='icon-green' />}
|
icon={<IconClone size='1.25rem' className='icon-green' />}
|
||||||
disabled={disabled || modified}
|
disabled={disabled || modified}
|
||||||
onClick={onClone}
|
onClick={onClone}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { IconEdit } from '@/components/Icons';
|
||||||
import MiniButton from '@/components/ui/MiniButton';
|
import MiniButton from '@/components/ui/MiniButton';
|
||||||
import Overlay from '@/components/ui/Overlay';
|
import Overlay from '@/components/ui/Overlay';
|
||||||
import { IConstituenta } from '@/models/rsform';
|
import { IConstituenta } from '@/models/rsform';
|
||||||
import { messages } from '@/utils/labels';
|
import { tooltips } from '@/utils/labels';
|
||||||
|
|
||||||
interface ControlsOverlayProps {
|
interface ControlsOverlayProps {
|
||||||
constituenta?: IConstituenta;
|
constituenta?: IConstituenta;
|
||||||
|
@ -21,7 +21,7 @@ function ControlsOverlay({ constituenta, disabled, modified, processing, onRenam
|
||||||
<Overlay position='top-1 left-[4.7rem]' className='flex select-none'>
|
<Overlay position='top-1 left-[4.7rem]' className='flex select-none'>
|
||||||
{!disabled || processing ? (
|
{!disabled || processing ? (
|
||||||
<MiniButton
|
<MiniButton
|
||||||
title={modified ? messages.unsaved : `Редактировать словоформы термина`}
|
title={modified ? tooltips.unsaved : `Редактировать словоформы термина`}
|
||||||
noHover
|
noHover
|
||||||
onClick={onEditTerm}
|
onClick={onEditTerm}
|
||||||
icon={<IconEdit size='1rem' className='icon-primary' />}
|
icon={<IconEdit size='1rem' className='icon-primary' />}
|
||||||
|
@ -42,7 +42,7 @@ function ControlsOverlay({ constituenta, disabled, modified, processing, onRenam
|
||||||
{!disabled || processing ? (
|
{!disabled || processing ? (
|
||||||
<MiniButton
|
<MiniButton
|
||||||
noHover
|
noHover
|
||||||
title={modified ? messages.unsaved : 'Переименовать конституенту'}
|
title={modified ? tooltips.unsaved : 'Переименовать конституенту'}
|
||||||
onClick={onRename}
|
onClick={onRename}
|
||||||
icon={<IconEdit size='1rem' className='icon-primary' />}
|
icon={<IconEdit size='1rem' className='icon-primary' />}
|
||||||
disabled={modified}
|
disabled={modified}
|
||||||
|
|
|
@ -13,7 +13,7 @@ import AnimateFade from '@/components/wrap/AnimateFade';
|
||||||
import { useRSForm } from '@/context/RSFormContext';
|
import { useRSForm } from '@/context/RSFormContext';
|
||||||
import { CstType, IConstituenta, ICstUpdateData } from '@/models/rsform';
|
import { CstType, IConstituenta, ICstUpdateData } from '@/models/rsform';
|
||||||
import { isBaseSet, isBasicConcept, isFunctional } from '@/models/rsformAPI';
|
import { isBaseSet, isBasicConcept, isFunctional } from '@/models/rsformAPI';
|
||||||
import { labelCstTypification } from '@/utils/labels';
|
import { information, labelCstTypification } from '@/utils/labels';
|
||||||
|
|
||||||
import EditorRSExpression from '../EditorRSExpression';
|
import EditorRSExpression from '../EditorRSExpression';
|
||||||
import ControlsOverlay from './ControlsOverlay';
|
import ControlsOverlay from './ControlsOverlay';
|
||||||
|
@ -119,7 +119,7 @@ function FormConstituenta({
|
||||||
definition_raw: textDefinition,
|
definition_raw: textDefinition,
|
||||||
convention: convention
|
convention: convention
|
||||||
};
|
};
|
||||||
cstUpdate(data, () => toast.success('Изменения сохранены'));
|
cstUpdate(data, () => toast.success(information.changesSaved));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -19,7 +19,7 @@ import { getDefinitionPrefix } from '@/models/rsformAPI';
|
||||||
import { IExpressionParse, IRSErrorDescription, SyntaxTree } from '@/models/rslang';
|
import { IExpressionParse, IRSErrorDescription, SyntaxTree } from '@/models/rslang';
|
||||||
import { TokenID } from '@/models/rslang';
|
import { TokenID } from '@/models/rslang';
|
||||||
import { storage } from '@/utils/constants';
|
import { storage } from '@/utils/constants';
|
||||||
import { labelTypification } from '@/utils/labels';
|
import { errors, labelTypification } from '@/utils/labels';
|
||||||
|
|
||||||
import ExpressionToolbar from './ExpressionToolbar';
|
import ExpressionToolbar from './ExpressionToolbar';
|
||||||
import ParsingResult from './ParsingResult';
|
import ParsingResult from './ParsingResult';
|
||||||
|
@ -131,7 +131,7 @@ function EditorRSExpression({
|
||||||
function handleShowAST() {
|
function handleShowAST() {
|
||||||
handleCheckExpression(parse => {
|
handleCheckExpression(parse => {
|
||||||
if (!parse.astText) {
|
if (!parse.astText) {
|
||||||
toast.error('Невозможно построить дерево разбора');
|
toast.error(errors.astFailed);
|
||||||
} else {
|
} else {
|
||||||
setSyntaxTree(parse.ast);
|
setSyntaxTree(parse.ast);
|
||||||
setExpression(getDefinitionPrefix(activeCst!) + value);
|
setExpression(getDefinitionPrefix(activeCst!) + value);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import TextInput from '@/components/ui/TextInput';
|
||||||
import { useRSForm } from '@/context/RSFormContext';
|
import { useRSForm } from '@/context/RSFormContext';
|
||||||
import { ILibraryUpdateData, LibraryItemType } from '@/models/library';
|
import { ILibraryUpdateData, LibraryItemType } from '@/models/library';
|
||||||
import { limits, patterns } from '@/utils/constants';
|
import { limits, patterns } from '@/utils/constants';
|
||||||
|
import { information } from '@/utils/labels';
|
||||||
|
|
||||||
import { useRSEdit } from '../RSEditContext';
|
import { useRSEdit } from '../RSEditContext';
|
||||||
import AccessToolbar from './AccessToolbar';
|
import AccessToolbar from './AccessToolbar';
|
||||||
|
@ -84,7 +85,7 @@ function FormRSForm({ id, isModified, setIsModified }: FormRSFormProps) {
|
||||||
visible: visible,
|
visible: visible,
|
||||||
read_only: readOnly
|
read_only: readOnly
|
||||||
};
|
};
|
||||||
update(data, () => toast.success('Изменения сохранены'));
|
update(data, () => toast.success(information.changesSaved));
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -43,6 +43,7 @@ import {
|
||||||
import { generateAlias } from '@/models/rsformAPI';
|
import { generateAlias } from '@/models/rsformAPI';
|
||||||
import { UserID, UserLevel } from '@/models/user';
|
import { UserID, UserLevel } from '@/models/user';
|
||||||
import { EXTEOR_TRS_FILE } from '@/utils/constants';
|
import { EXTEOR_TRS_FILE } from '@/utils/constants';
|
||||||
|
import { information, prompts } from '@/utils/labels';
|
||||||
import { promptUnsaved } from '@/utils/utils';
|
import { promptUnsaved } from '@/utils/utils';
|
||||||
|
|
||||||
interface IRSEditContext {
|
interface IRSEditContext {
|
||||||
|
@ -189,14 +190,11 @@ export const RSEditState = ({
|
||||||
}, [isModified]);
|
}, [isModified]);
|
||||||
|
|
||||||
const restoreVersion = useCallback(() => {
|
const restoreVersion = useCallback(() => {
|
||||||
if (
|
if (!model.versionID || !window.confirm(prompts.restoreArchive)) {
|
||||||
!model.versionID ||
|
|
||||||
!window.confirm('При восстановлении архивной версии актуальная схему будет заменена. Продолжить?')
|
|
||||||
) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
model.versionRestore(model.versionID, () => {
|
model.versionRestore(model.versionID, () => {
|
||||||
toast.success('Загрузка версии завершена');
|
toast.success(information.versionRestored);
|
||||||
viewVersion(undefined);
|
viewVersion(undefined);
|
||||||
});
|
});
|
||||||
}, [model, viewVersion]);
|
}, [model, viewVersion]);
|
||||||
|
@ -223,7 +221,7 @@ export const RSEditState = ({
|
||||||
}
|
}
|
||||||
data.alias = data.alias || generateAlias(data.cst_type, model.schema);
|
data.alias = data.alias || generateAlias(data.cst_type, model.schema);
|
||||||
model.cstCreate(data, newCst => {
|
model.cstCreate(data, newCst => {
|
||||||
toast.success(`Конституента добавлена: ${newCst.alias}`);
|
toast.success(information.newConstituent(newCst.alias));
|
||||||
setSelected([newCst.id]);
|
setSelected([newCst.id]);
|
||||||
if (onCreateCst) onCreateCst(newCst);
|
if (onCreateCst) onCreateCst(newCst);
|
||||||
});
|
});
|
||||||
|
@ -233,14 +231,15 @@ export const RSEditState = ({
|
||||||
|
|
||||||
const handleRenameCst = useCallback(
|
const handleRenameCst = useCallback(
|
||||||
(data: ICstRenameData) => {
|
(data: ICstRenameData) => {
|
||||||
model.cstRename(data, () => toast.success(`Переименование: ${renameInitialData!.alias} -> ${data.alias}`));
|
const oldAlias = renameInitialData!.alias;
|
||||||
|
model.cstRename(data, () => toast.success(information.renameComplete(oldAlias, data.alias)));
|
||||||
},
|
},
|
||||||
[model, renameInitialData]
|
[model, renameInitialData]
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleSubstituteCst = useCallback(
|
const handleSubstituteCst = useCallback(
|
||||||
(data: ICstSubstituteData) => {
|
(data: ICstSubstituteData) => {
|
||||||
model.cstSubstitute(data, () => toast.success('Отождествление завершено'));
|
model.cstSubstitute(data, () => toast.success(information.substituteSingle));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
@ -259,7 +258,7 @@ export const RSEditState = ({
|
||||||
const nextActive = isEmpty ? undefined : getNextActiveOnDelete(activeCst?.id, model.schema.items, deleted);
|
const nextActive = isEmpty ? undefined : getNextActiveOnDelete(activeCst?.id, model.schema.items, deleted);
|
||||||
|
|
||||||
model.cstDelete(data, () => {
|
model.cstDelete(data, () => {
|
||||||
toast.success(`Конституенты удалены: ${deletedNames}`);
|
toast.success(information.constituentsDestroyed(deletedNames));
|
||||||
setSelected(nextActive ? [nextActive] : []);
|
setSelected(nextActive ? [nextActive] : []);
|
||||||
if (onDeleteCst) onDeleteCst(nextActive);
|
if (onDeleteCst) onDeleteCst(nextActive);
|
||||||
});
|
});
|
||||||
|
@ -276,7 +275,7 @@ export const RSEditState = ({
|
||||||
id: activeCst.id,
|
id: activeCst.id,
|
||||||
term_forms: forms
|
term_forms: forms
|
||||||
};
|
};
|
||||||
model.cstUpdate(data, () => toast.success('Изменения сохранены'));
|
model.cstUpdate(data, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model, activeCst]
|
[model, activeCst]
|
||||||
);
|
);
|
||||||
|
@ -287,7 +286,7 @@ export const RSEditState = ({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
model.versionCreate(data, newVersion => {
|
model.versionCreate(data, newVersion => {
|
||||||
toast.success('Версия создана');
|
toast.success(information.newVersion(data.version));
|
||||||
viewVersion(newVersion);
|
viewVersion(newVersion);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -300,7 +299,7 @@ export const RSEditState = ({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
model.versionDelete(versionID, () => {
|
model.versionDelete(versionID, () => {
|
||||||
toast.success('Версия удалена');
|
toast.success(information.versionDestroyed);
|
||||||
if (String(versionID) === model.versionID) {
|
if (String(versionID) === model.versionID) {
|
||||||
viewVersion(undefined);
|
viewVersion(undefined);
|
||||||
}
|
}
|
||||||
|
@ -314,7 +313,7 @@ export const RSEditState = ({
|
||||||
if (!model.schema) {
|
if (!model.schema) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
model.versionUpdate(versionID, data, () => toast.success('Версия обновлена'));
|
model.versionUpdate(versionID, data, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
@ -324,7 +323,7 @@ export const RSEditState = ({
|
||||||
if (!model.schema) {
|
if (!model.schema) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
model.setLocation(newLocation, () => toast.success('Схема перемещена'));
|
model.setLocation(newLocation, () => toast.success(information.moveComplete));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
@ -337,7 +336,7 @@ export const RSEditState = ({
|
||||||
const oldCount = model.schema.items.length;
|
const oldCount = model.schema.items.length;
|
||||||
model.inlineSynthesis(data, newSchema => {
|
model.inlineSynthesis(data, newSchema => {
|
||||||
setSelected([]);
|
setSelected([]);
|
||||||
toast.success(`Конституенты добавлены: ${newSchema['items'].length - oldCount}`);
|
toast.success(information.addedConstituents(newSchema['items'].length - oldCount));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[model, setSelected]
|
[model, setSelected]
|
||||||
|
@ -463,8 +462,8 @@ export const RSEditState = ({
|
||||||
setShowEditTerm(true);
|
setShowEditTerm(true);
|
||||||
}, [isModified, activeCst]);
|
}, [isModified, activeCst]);
|
||||||
|
|
||||||
const reindex = useCallback(() => model.resetAliases(() => toast.success('Имена конституент обновлены')), [model]);
|
const reindex = useCallback(() => model.resetAliases(() => toast.success(information.reindexComplete)), [model]);
|
||||||
const reorder = useCallback(() => model.restoreOrder(() => toast.success('Конституенты упорядочены')), [model]);
|
const reorder = useCallback(() => model.restoreOrder(() => toast.success(information.reorderComplete)), [model]);
|
||||||
|
|
||||||
const canProduceStructure = useMemo(() => {
|
const canProduceStructure = useMemo(() => {
|
||||||
return (
|
return (
|
||||||
|
@ -486,7 +485,7 @@ export const RSEditState = ({
|
||||||
target: activeCst.id
|
target: activeCst.id
|
||||||
};
|
};
|
||||||
model.produceStructure(data, cstList => {
|
model.produceStructure(data, cstList => {
|
||||||
toast.success(`Добавлены конституенты: ${cstList.length}`);
|
toast.success(information.addedConstituents(cstList.length));
|
||||||
if (cstList.length !== 0) {
|
if (cstList.length !== 0) {
|
||||||
setSelected(cstList);
|
setSelected(cstList);
|
||||||
}
|
}
|
||||||
|
@ -535,35 +534,35 @@ export const RSEditState = ({
|
||||||
const url = currentRef.includes('?') ? currentRef + '&share' : currentRef + '?share';
|
const url = currentRef.includes('?') ? currentRef + '&share' : currentRef + '?share';
|
||||||
navigator.clipboard
|
navigator.clipboard
|
||||||
.writeText(url)
|
.writeText(url)
|
||||||
.then(() => toast.success(`Ссылка скопирована: ${url}`))
|
.then(() => toast.success(information.linkReady))
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const toggleSubscribe = useCallback(() => {
|
const toggleSubscribe = useCallback(() => {
|
||||||
if (model.isSubscribed) {
|
if (model.isSubscribed) {
|
||||||
model.unsubscribe(() => toast.success('Отслеживание отключено'));
|
model.unsubscribe(() => toast.success(information.unsubscribed));
|
||||||
} else {
|
} else {
|
||||||
model.subscribe(() => toast.success('Отслеживание включено'));
|
model.subscribe(() => toast.success(information.subscribed));
|
||||||
}
|
}
|
||||||
}, [model]);
|
}, [model]);
|
||||||
|
|
||||||
const setOwner = useCallback(
|
const setOwner = useCallback(
|
||||||
(newOwner: UserID) => {
|
(newOwner: UserID) => {
|
||||||
model.setOwner(newOwner, () => toast.success('Владелец обновлен'));
|
model.setOwner(newOwner, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
|
||||||
const setAccessPolicy = useCallback(
|
const setAccessPolicy = useCallback(
|
||||||
(newPolicy: AccessPolicy) => {
|
(newPolicy: AccessPolicy) => {
|
||||||
model.setAccessPolicy(newPolicy, () => toast.success('Политика доступа изменена'));
|
model.setAccessPolicy(newPolicy, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
|
||||||
const setEditors = useCallback(
|
const setEditors = useCallback(
|
||||||
(newEditors: UserID[]) => {
|
(newEditors: UserID[]) => {
|
||||||
model.setEditors(newEditors, () => toast.success('Редакторы обновлены'));
|
model.setEditors(newEditors, () => toast.success(information.changesSaved));
|
||||||
},
|
},
|
||||||
[model]
|
[model]
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,7 +20,7 @@ import { useRSForm } from '@/context/RSFormContext';
|
||||||
import useQueryStrings from '@/hooks/useQueryStrings';
|
import useQueryStrings from '@/hooks/useQueryStrings';
|
||||||
import { ConstituentaID, IConstituenta, IConstituentaMeta } from '@/models/rsform';
|
import { ConstituentaID, IConstituenta, IConstituentaMeta } from '@/models/rsform';
|
||||||
import { PARAMETER, prefixes } from '@/utils/constants';
|
import { PARAMETER, prefixes } from '@/utils/constants';
|
||||||
import { labelVersion } from '@/utils/labels';
|
import { information, labelVersion, prompts } from '@/utils/labels';
|
||||||
|
|
||||||
import EditorConstituenta from './EditorConstituenta';
|
import EditorConstituenta from './EditorConstituenta';
|
||||||
import EditorRSForm from './EditorRSFormCard';
|
import EditorRSForm from './EditorRSFormCard';
|
||||||
|
@ -173,11 +173,11 @@ function RSTabs() {
|
||||||
);
|
);
|
||||||
|
|
||||||
const onDestroySchema = useCallback(() => {
|
const onDestroySchema = useCallback(() => {
|
||||||
if (!schema || !window.confirm('Вы уверены, что хотите удалить данную схему?')) {
|
if (!schema || !window.confirm(prompts.deleteLibraryItem)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
destroyItem(schema.id, () => {
|
destroyItem(schema.id, () => {
|
||||||
toast.success('Схема удалена');
|
toast.success(information.itemDestroyed);
|
||||||
router.push(urls.library);
|
router.push(urls.library);
|
||||||
});
|
});
|
||||||
}, [schema, destroyItem, router]);
|
}, [schema, destroyItem, router]);
|
||||||
|
|
|
@ -13,6 +13,7 @@ import TextInput from '@/components/ui/TextInput';
|
||||||
import { useAuth } from '@/context/AuthContext';
|
import { useAuth } from '@/context/AuthContext';
|
||||||
import { useConceptNavigation } from '@/context/NavigationContext';
|
import { useConceptNavigation } from '@/context/NavigationContext';
|
||||||
import { IUserUpdatePassword } from '@/models/user';
|
import { IUserUpdatePassword } from '@/models/user';
|
||||||
|
import { errors, information } from '@/utils/labels';
|
||||||
|
|
||||||
function EditorPassword() {
|
function EditorPassword() {
|
||||||
const router = useConceptNavigation();
|
const router = useConceptNavigation();
|
||||||
|
@ -37,7 +38,7 @@ function EditorPassword() {
|
||||||
function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
|
function handleSubmit(event: React.FormEvent<HTMLFormElement>) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
if (newPassword !== newPasswordRepeat) {
|
if (newPassword !== newPasswordRepeat) {
|
||||||
toast.error('Пароли не совпадают');
|
toast.error(errors.passwordsMismatch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const data: IUserUpdatePassword = {
|
const data: IUserUpdatePassword = {
|
||||||
|
@ -45,7 +46,7 @@ function EditorPassword() {
|
||||||
new_password: newPassword
|
new_password: newPassword
|
||||||
};
|
};
|
||||||
updatePassword(data, () => {
|
updatePassword(data, () => {
|
||||||
toast.success('Изменения сохранены');
|
toast.success(information.changesSaved);
|
||||||
router.push(urls.login);
|
router.push(urls.login);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import TextInput from '@/components/ui/TextInput';
|
||||||
import { useBlockNavigation } from '@/context/NavigationContext';
|
import { useBlockNavigation } from '@/context/NavigationContext';
|
||||||
import { useUserProfile } from '@/context/UserProfileContext';
|
import { useUserProfile } from '@/context/UserProfileContext';
|
||||||
import { IUserUpdateData } from '@/models/user';
|
import { IUserUpdateData } from '@/models/user';
|
||||||
|
import { information } from '@/utils/labels';
|
||||||
|
|
||||||
function EditorProfile() {
|
function EditorProfile() {
|
||||||
const { updateUser, user, errorProcessing, processing } = useUserProfile();
|
const { updateUser, user, errorProcessing, processing } = useUserProfile();
|
||||||
|
@ -45,7 +46,7 @@ function EditorProfile() {
|
||||||
first_name: first_name,
|
first_name: first_name,
|
||||||
last_name: last_name
|
last_name: last_name
|
||||||
};
|
};
|
||||||
updateUser(data, () => toast.success('Изменения сохранены'));
|
updateUser(data, () => toast.success(information.changesSaved));
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -852,9 +852,59 @@ export function describeLibraryItemType(itemType: LibraryItemType): string {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UI shared messages.
|
* UI info descriptors.
|
||||||
*/
|
*/
|
||||||
export const messages = {
|
export const information = {
|
||||||
unsaved: 'Сохраните или отмените изменения',
|
changesSaved: 'Изменения сохранены',
|
||||||
promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?'
|
|
||||||
|
subscribed: 'Отслеживание отключено',
|
||||||
|
unsubscribed: 'Отслеживание выключено',
|
||||||
|
|
||||||
|
substituteSingle: 'Отождествление завершено',
|
||||||
|
reorderComplete: 'Упорядочение завершено',
|
||||||
|
reindexComplete: 'Имена конституент обновлены',
|
||||||
|
moveComplete: 'Перемещение завершено',
|
||||||
|
linkReady: 'Ссылка скопирована',
|
||||||
|
versionRestored: 'Загрузка версии завершена',
|
||||||
|
cloneComplete: (alias: string) => `Копия создана: ${alias}`,
|
||||||
|
|
||||||
|
addedConstituents: (count: number) => `Добавлены конституенты: ${count}`,
|
||||||
|
newLibraryItem: 'Схема успешно создана',
|
||||||
|
newConstituent: (alias: string) => `Конституента добавлена: ${alias}`,
|
||||||
|
newVersion: (version: string) => `Версия создана: ${version}`,
|
||||||
|
renameComplete: (oldAlias: string, newAlias: string) => `Переименование: ${oldAlias} -> ${newAlias}`,
|
||||||
|
|
||||||
|
versionDestroyed: 'Версия удалена',
|
||||||
|
itemDestroyed: 'Схема удалена',
|
||||||
|
constituentsDestroyed: (aliases: string) => `Конституенты удалены: ${aliases}`
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UI error descriptors.
|
||||||
|
*/
|
||||||
|
export const errors = {
|
||||||
|
astFailed: 'Невозможно построить дерево разбора',
|
||||||
|
passwordsMismatch: 'Пароли не совпадают'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UI tooltip descriptors.
|
||||||
|
*/
|
||||||
|
export const tooltips = {
|
||||||
|
unsaved: 'Сохраните или отмените изменения'
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UI prompt messages.
|
||||||
|
*/
|
||||||
|
export const prompts = {
|
||||||
|
promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?',
|
||||||
|
deleteLibraryItem: 'Вы уверены, что хотите удалить данную схему?',
|
||||||
|
generateWordforms: 'Данное действие приведет к перезаписи словоформ при совпадении граммем. Продолжить?',
|
||||||
|
restoreArchive: 'При восстановлении архивной версии актуальная схему будет заменена. Продолжить?'
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============== INTERNAL LABELS FOR DEVELOPERS TEXT ================
|
||||||
|
export function contextOutsideScope(contextName: string, contextState: string): string {
|
||||||
|
return `${contextName} has to be used within <${contextState}.Provider>`;
|
||||||
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
import { AxiosHeaderValue, AxiosResponse } from 'axios';
|
import { AxiosHeaderValue, AxiosResponse } from 'axios';
|
||||||
|
|
||||||
import { messages } from './labels';
|
import { prompts } from './labels';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if arguments is Node.
|
* Checks if arguments is Node.
|
||||||
|
@ -102,7 +102,7 @@ export function convertBase64ToBlob(base64String: string): Uint8Array {
|
||||||
* Prompt user of confirming discarding changes before continue.
|
* Prompt user of confirming discarding changes before continue.
|
||||||
*/
|
*/
|
||||||
export function promptUnsaved(): boolean {
|
export function promptUnsaved(): boolean {
|
||||||
return window.confirm(messages.promptUnsaved);
|
return window.confirm(prompts.promptUnsaved);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user