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