R: Refactor global names and LocationChange dialog
This commit is contained in:
parent
b6f1ff3337
commit
8346850cf6
|
@ -5,7 +5,7 @@ import { axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport';
|
||||||
import { DELAYS } from '@/backend/configuration';
|
import { DELAYS } from '@/backend/configuration';
|
||||||
import { LibraryItemID } from '@/features/library/models/library';
|
import { LibraryItemID } from '@/features/library/models/library';
|
||||||
import { UserID } from '@/features/users/models/user';
|
import { UserID } from '@/features/users/models/user';
|
||||||
import { errors, information } from '@/utils/labels';
|
import { errorMsg, infoMsg } from '@/utils/labels';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents CurrentUser information.
|
* Represents CurrentUser information.
|
||||||
|
@ -21,8 +21,8 @@ export interface ICurrentUser {
|
||||||
* Represents login data, used to authenticate users.
|
* Represents login data, used to authenticate users.
|
||||||
*/
|
*/
|
||||||
export const schemaUserLogin = z.object({
|
export const schemaUserLogin = z.object({
|
||||||
username: z.string().nonempty(errors.requiredField),
|
username: z.string().nonempty(errorMsg.requiredField),
|
||||||
password: z.string().nonempty(errors.requiredField)
|
password: z.string().nonempty(errorMsg.requiredField)
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,17 +35,17 @@ export type IUserLoginDTO = z.infer<typeof schemaUserLogin>;
|
||||||
*/
|
*/
|
||||||
export const schemaChangePassword = z
|
export const schemaChangePassword = z
|
||||||
.object({
|
.object({
|
||||||
old_password: z.string().nonempty(errors.requiredField),
|
old_password: z.string().nonempty(errorMsg.requiredField),
|
||||||
new_password: z.string().nonempty(errors.requiredField),
|
new_password: z.string().nonempty(errorMsg.requiredField),
|
||||||
new_password2: z.string().nonempty(errors.requiredField)
|
new_password2: z.string().nonempty(errorMsg.requiredField)
|
||||||
})
|
})
|
||||||
.refine(schema => schema.new_password === schema.new_password2, {
|
.refine(schema => schema.new_password === schema.new_password2, {
|
||||||
path: ['new_password2'],
|
path: ['new_password2'],
|
||||||
message: errors.passwordsMismatch
|
message: errorMsg.passwordsMismatch
|
||||||
})
|
})
|
||||||
.refine(schema => schema.old_password !== schema.new_password, {
|
.refine(schema => schema.old_password !== schema.new_password, {
|
||||||
path: ['new_password'],
|
path: ['new_password'],
|
||||||
message: errors.passwordsSame
|
message: errorMsg.passwordsSame
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,7 +105,7 @@ export const authApi = {
|
||||||
endpoint: '/users/api/change-password',
|
endpoint: '/users/api/change-password',
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
requestPasswordReset: (data: IRequestPasswordDTO) =>
|
requestPasswordReset: (data: IRequestPasswordDTO) =>
|
||||||
|
|
|
@ -6,7 +6,7 @@ import { DELAYS } from '@/backend/configuration';
|
||||||
import { ossApi } from '@/features/oss/backend/api';
|
import { ossApi } from '@/features/oss/backend/api';
|
||||||
import { IRSFormDTO, rsformsApi } from '@/features/rsform/backend/api';
|
import { IRSFormDTO, rsformsApi } from '@/features/rsform/backend/api';
|
||||||
import { UserID } from '@/features/users/models/user';
|
import { UserID } from '@/features/users/models/user';
|
||||||
import { errors, information } from '@/utils/labels';
|
import { errorMsg, infoMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { AccessPolicy, ILibraryItem, IVersionInfo, LibraryItemID, LibraryItemType, VersionID } from '../models/library';
|
import { AccessPolicy, ILibraryItem, IVersionInfo, LibraryItemID, LibraryItemType, VersionID } from '../models/library';
|
||||||
import { validateLocation } from '../models/libraryAPI';
|
import { validateLocation } from '../models/libraryAPI';
|
||||||
|
@ -25,12 +25,12 @@ export interface IRenameLocationDTO {
|
||||||
export const schemaCloneLibraryItem = z.object({
|
export const schemaCloneLibraryItem = z.object({
|
||||||
id: z.number(),
|
id: z.number(),
|
||||||
item_type: z.nativeEnum(LibraryItemType),
|
item_type: z.nativeEnum(LibraryItemType),
|
||||||
title: z.string().nonempty(errors.requiredField),
|
title: z.string().nonempty(errorMsg.requiredField),
|
||||||
alias: z.string().nonempty(errors.requiredField),
|
alias: z.string().nonempty(errorMsg.requiredField),
|
||||||
comment: z.string(),
|
comment: z.string(),
|
||||||
visible: z.boolean(),
|
visible: z.boolean(),
|
||||||
read_only: z.boolean(),
|
read_only: z.boolean(),
|
||||||
location: z.string().refine(data => validateLocation(data), { message: errors.invalidLocation }),
|
location: z.string().refine(data => validateLocation(data), { message: errorMsg.invalidLocation }),
|
||||||
access_policy: z.nativeEnum(AccessPolicy),
|
access_policy: z.nativeEnum(AccessPolicy),
|
||||||
|
|
||||||
items: z.array(z.number()).optional()
|
items: z.array(z.number()).optional()
|
||||||
|
@ -52,7 +52,7 @@ export const schemaCreateLibraryItem = z
|
||||||
comment: z.string(),
|
comment: z.string(),
|
||||||
visible: z.boolean(),
|
visible: z.boolean(),
|
||||||
read_only: z.boolean(),
|
read_only: z.boolean(),
|
||||||
location: z.string().refine(data => validateLocation(data), { message: errors.invalidLocation }),
|
location: z.string().refine(data => validateLocation(data), { message: errorMsg.invalidLocation }),
|
||||||
access_policy: z.nativeEnum(AccessPolicy),
|
access_policy: z.nativeEnum(AccessPolicy),
|
||||||
|
|
||||||
file: z.instanceof(File).optional(),
|
file: z.instanceof(File).optional(),
|
||||||
|
@ -60,11 +60,11 @@ export const schemaCreateLibraryItem = z
|
||||||
})
|
})
|
||||||
.refine(data => !!data.file || !!data.title, {
|
.refine(data => !!data.file || !!data.title, {
|
||||||
path: ['title'],
|
path: ['title'],
|
||||||
message: errors.requiredField
|
message: errorMsg.requiredField
|
||||||
})
|
})
|
||||||
.refine(data => !!data.file || !!data.alias, {
|
.refine(data => !!data.file || !!data.alias, {
|
||||||
path: ['alias'],
|
path: ['alias'],
|
||||||
message: errors.requiredField
|
message: errorMsg.requiredField
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,8 +78,8 @@ export type ICreateLibraryItemDTO = z.infer<typeof schemaCreateLibraryItem>;
|
||||||
export const schemaUpdateLibraryItem = z.object({
|
export const schemaUpdateLibraryItem = z.object({
|
||||||
id: z.number(),
|
id: z.number(),
|
||||||
item_type: z.nativeEnum(LibraryItemType),
|
item_type: z.nativeEnum(LibraryItemType),
|
||||||
title: z.string().nonempty(errors.requiredField),
|
title: z.string().nonempty(errorMsg.requiredField),
|
||||||
alias: z.string().nonempty(errors.requiredField),
|
alias: z.string().nonempty(errorMsg.requiredField),
|
||||||
comment: z.string(),
|
comment: z.string(),
|
||||||
visible: z.boolean(),
|
visible: z.boolean(),
|
||||||
read_only: z.boolean()
|
read_only: z.boolean()
|
||||||
|
@ -117,7 +117,7 @@ export interface IVersionCreatedResponse {
|
||||||
*/
|
*/
|
||||||
export const schemaVersionUpdate = z.object({
|
export const schemaVersionUpdate = z.object({
|
||||||
id: z.number(),
|
id: z.number(),
|
||||||
version: z.string().nonempty(errors.requiredField),
|
version: z.string().nonempty(errorMsg.requiredField),
|
||||||
description: z.string()
|
description: z.string()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ export const libraryApi = {
|
||||||
endpoint: !data.file ? '/api/library' : '/api/rsforms/create-detailed',
|
endpoint: !data.file ? '/api/library' : '/api/rsforms/create-detailed',
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.newLibraryItem
|
successMessage: infoMsg.newLibraryItem
|
||||||
},
|
},
|
||||||
options: !data.file
|
options: !data.file
|
||||||
? undefined
|
? undefined
|
||||||
|
@ -176,7 +176,7 @@ export const libraryApi = {
|
||||||
endpoint: `/api/library/${data.id}`,
|
endpoint: `/api/library/${data.id}`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
setOwner: ({ itemID, owner }: { itemID: LibraryItemID; owner: UserID }) =>
|
setOwner: ({ itemID, owner }: { itemID: LibraryItemID; owner: UserID }) =>
|
||||||
|
@ -184,7 +184,7 @@ export const libraryApi = {
|
||||||
endpoint: `/api/library/${itemID}/set-owner`,
|
endpoint: `/api/library/${itemID}/set-owner`,
|
||||||
request: {
|
request: {
|
||||||
data: { user: owner },
|
data: { user: owner },
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
setLocation: ({ itemID, location }: { itemID: LibraryItemID; location: string }) =>
|
setLocation: ({ itemID, location }: { itemID: LibraryItemID; location: string }) =>
|
||||||
|
@ -192,7 +192,7 @@ export const libraryApi = {
|
||||||
endpoint: `/api/library/${itemID}/set-location`,
|
endpoint: `/api/library/${itemID}/set-location`,
|
||||||
request: {
|
request: {
|
||||||
data: { location: location },
|
data: { location: location },
|
||||||
successMessage: information.moveComplete
|
successMessage: infoMsg.moveComplete
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
setAccessPolicy: ({ itemID, policy }: { itemID: LibraryItemID; policy: AccessPolicy }) =>
|
setAccessPolicy: ({ itemID, policy }: { itemID: LibraryItemID; policy: AccessPolicy }) =>
|
||||||
|
@ -200,7 +200,7 @@ export const libraryApi = {
|
||||||
endpoint: `/api/library/${itemID}/set-access-policy`,
|
endpoint: `/api/library/${itemID}/set-access-policy`,
|
||||||
request: {
|
request: {
|
||||||
data: { access_policy: policy },
|
data: { access_policy: policy },
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
setEditors: ({ itemID, editors }: { itemID: LibraryItemID; editors: UserID[] }) =>
|
setEditors: ({ itemID, editors }: { itemID: LibraryItemID; editors: UserID[] }) =>
|
||||||
|
@ -208,7 +208,7 @@ export const libraryApi = {
|
||||||
endpoint: `/api/library/${itemID}/set-editors`,
|
endpoint: `/api/library/${itemID}/set-editors`,
|
||||||
request: {
|
request: {
|
||||||
data: { users: editors },
|
data: { users: editors },
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -216,7 +216,7 @@ export const libraryApi = {
|
||||||
axiosDelete({
|
axiosDelete({
|
||||||
endpoint: `/api/library/${target}`,
|
endpoint: `/api/library/${target}`,
|
||||||
request: {
|
request: {
|
||||||
successMessage: information.itemDestroyed
|
successMessage: infoMsg.itemDestroyed
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cloneItem: (data: ICloneLibraryItemDTO) =>
|
cloneItem: (data: ICloneLibraryItemDTO) =>
|
||||||
|
@ -224,7 +224,7 @@ export const libraryApi = {
|
||||||
endpoint: `/api/library/${data.id}/clone`,
|
endpoint: `/api/library/${data.id}/clone`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: newSchema => information.cloneComplete(newSchema.alias)
|
successMessage: newSchema => infoMsg.cloneComplete(newSchema.alias)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
renameLocation: (data: IRenameLocationDTO) =>
|
renameLocation: (data: IRenameLocationDTO) =>
|
||||||
|
@ -232,7 +232,7 @@ export const libraryApi = {
|
||||||
endpoint: '/api/library/rename-location',
|
endpoint: '/api/library/rename-location',
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.locationRenamed
|
successMessage: infoMsg.locationRenamed
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -241,14 +241,14 @@ export const libraryApi = {
|
||||||
endpoint: `/api/library/${itemID}/create-version`,
|
endpoint: `/api/library/${itemID}/create-version`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.newVersion(data.version)
|
successMessage: infoMsg.newVersion(data.version)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
versionRestore: ({ versionID }: { versionID: VersionID }) =>
|
versionRestore: ({ versionID }: { versionID: VersionID }) =>
|
||||||
axiosPatch<undefined, IRSFormDTO>({
|
axiosPatch<undefined, IRSFormDTO>({
|
||||||
endpoint: `/api/versions/${versionID}/restore`,
|
endpoint: `/api/versions/${versionID}/restore`,
|
||||||
request: {
|
request: {
|
||||||
successMessage: information.versionRestored
|
successMessage: infoMsg.versionRestored
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
versionUpdate: (data: IVersionUpdateDTO) =>
|
versionUpdate: (data: IVersionUpdateDTO) =>
|
||||||
|
@ -256,14 +256,14 @@ export const libraryApi = {
|
||||||
endpoint: `/api/versions/${data.id}`,
|
endpoint: `/api/versions/${data.id}`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
versionDelete: (data: { itemID: LibraryItemID; versionID: VersionID }) =>
|
versionDelete: (data: { itemID: LibraryItemID; versionID: VersionID }) =>
|
||||||
axiosDelete({
|
axiosDelete({
|
||||||
endpoint: `/api/versions/${data.versionID}`,
|
endpoint: `/api/versions/${data.versionID}`,
|
||||||
request: {
|
request: {
|
||||||
successMessage: information.versionDestroyed
|
successMessage: infoMsg.versionDestroyed
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,19 +1,28 @@
|
||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import { useState } from 'react';
|
import { Controller, useForm } from 'react-hook-form';
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
import { Label, TextArea } from '@/components/Input';
|
import { Label, TextArea } from '@/components/Input';
|
||||||
import { ModalForm } from '@/components/Modal';
|
import { ModalForm } from '@/components/Modal';
|
||||||
import { useAuthSuspense } from '@/features/auth/backend/useAuth';
|
import { useAuthSuspense } from '@/features/auth/backend/useAuth';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { limits } from '@/utils/constants';
|
import { limits } from '@/utils/constants';
|
||||||
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import SelectLocationContext from '../components/SelectLocationContext';
|
import SelectLocationContext from '../components/SelectLocationContext';
|
||||||
import SelectLocationHead from '../components/SelectLocationHead';
|
import SelectLocationHead from '../components/SelectLocationHead';
|
||||||
import { LocationHead } from '../models/library';
|
import { LocationHead } from '../models/library';
|
||||||
import { combineLocation, validateLocation } from '../models/libraryAPI';
|
import { combineLocation, validateLocation } from '../models/libraryAPI';
|
||||||
|
|
||||||
|
const schemaLocation = z.object({
|
||||||
|
location: z.string().refine(data => validateLocation(data), { message: errorMsg.invalidLocation })
|
||||||
|
});
|
||||||
|
|
||||||
|
type ILocationType = z.infer<typeof schemaLocation>;
|
||||||
|
|
||||||
export interface DlgChangeLocationProps {
|
export interface DlgChangeLocationProps {
|
||||||
initial: string;
|
initial: string;
|
||||||
onChangeLocation: (newLocation: string) => void;
|
onChangeLocation: (newLocation: string) => void;
|
||||||
|
@ -22,20 +31,21 @@ export interface DlgChangeLocationProps {
|
||||||
function DlgChangeLocation() {
|
function DlgChangeLocation() {
|
||||||
const { initial, onChangeLocation } = useDialogsStore(state => state.props as DlgChangeLocationProps);
|
const { initial, onChangeLocation } = useDialogsStore(state => state.props as DlgChangeLocationProps);
|
||||||
const { user } = useAuthSuspense();
|
const { user } = useAuthSuspense();
|
||||||
const [head, setHead] = useState<LocationHead>(initial.substring(0, 2) as LocationHead);
|
|
||||||
const [body, setBody] = useState<string>(initial.substring(3));
|
|
||||||
|
|
||||||
const location = combineLocation(head, body);
|
const {
|
||||||
const isValid = initial !== location && validateLocation(location);
|
handleSubmit,
|
||||||
|
control,
|
||||||
|
formState: { errors, isValid, isDirty }
|
||||||
|
} = useForm<ILocationType>({
|
||||||
|
resolver: zodResolver(schemaLocation),
|
||||||
|
defaultValues: {
|
||||||
|
location: initial
|
||||||
|
},
|
||||||
|
mode: 'onChange'
|
||||||
|
});
|
||||||
|
|
||||||
function handleSelectLocation(newValue: string) {
|
function onSubmit(data: ILocationType) {
|
||||||
setHead(newValue.substring(0, 2) as LocationHead);
|
onChangeLocation(data.location);
|
||||||
setBody(newValue.length > 3 ? newValue.substring(3) : '');
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleSubmit() {
|
|
||||||
onChangeLocation(location);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -44,20 +54,45 @@ function DlgChangeLocation() {
|
||||||
header='Изменение расположения'
|
header='Изменение расположения'
|
||||||
submitText='Переместить'
|
submitText='Переместить'
|
||||||
submitInvalidTooltip={`Допустимы буквы, цифры, подчерк, пробел и "!". Сегмент пути не может начинаться и заканчиваться пробелом. Общая длина (с корнем) не должна превышать ${limits.location_len}`}
|
submitInvalidTooltip={`Допустимы буквы, цифры, подчерк, пробел и "!". Сегмент пути не может начинаться и заканчиваться пробелом. Общая длина (с корнем) не должна превышать ${limits.location_len}`}
|
||||||
canSubmit={isValid}
|
canSubmit={isValid && isDirty}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={event => void handleSubmit(onSubmit)(event)}
|
||||||
className={clsx('w-[35rem]', 'pb-3 px-6 flex gap-3 h-[9rem]')}
|
className={clsx('w-[35rem]', 'pb-3 px-6 flex gap-3 h-[9rem]')}
|
||||||
>
|
>
|
||||||
<div className='flex flex-col gap-2 min-w-[7rem] h-min'>
|
<div className='flex flex-col gap-2 min-w-[7rem] h-min'>
|
||||||
<Label className='select-none' text='Корень' />
|
<Label className='select-none' text='Корень' />
|
||||||
|
<Controller
|
||||||
|
control={control}
|
||||||
|
name='location'
|
||||||
|
render={({ field }) => (
|
||||||
<SelectLocationHead
|
<SelectLocationHead
|
||||||
value={head} // prettier: split-lines
|
value={field.value.substring(0, 2) as LocationHead}
|
||||||
onChange={setHead}
|
onChange={newValue => field.onChange(combineLocation(newValue, field.value.substring(3)))}
|
||||||
excluded={!user.is_staff ? [LocationHead.LIBRARY] : []}
|
excluded={!user.is_staff ? [LocationHead.LIBRARY] : []}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<SelectLocationContext value={location} onChange={handleSelectLocation} className='max-h-[9.2rem]' />
|
<Controller
|
||||||
<TextArea id='dlg_cst_body' label='Путь' rows={3} value={body} onChange={event => setBody(event.target.value)} />
|
control={control}
|
||||||
|
name='location'
|
||||||
|
render={({ field }) => (
|
||||||
|
<SelectLocationContext className='max-h-[9.2rem]' value={field.value} onChange={field.onChange} />
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Controller
|
||||||
|
control={control} //
|
||||||
|
name='location'
|
||||||
|
render={({ field }) => (
|
||||||
|
<TextArea
|
||||||
|
id='dlg_location'
|
||||||
|
label='Путь'
|
||||||
|
rows={3}
|
||||||
|
value={field.value.substring(3)}
|
||||||
|
onChange={event => field.onChange(combineLocation(field.value.substring(0, 2), event.target.value))}
|
||||||
|
error={errors.location}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
</ModalForm>
|
</ModalForm>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { MiniButton } from '@/components/Control';
|
||||||
import { IconCSV } from '@/components/Icons';
|
import { IconCSV } from '@/components/Icons';
|
||||||
import { useAppLayoutStore } from '@/stores/appLayout';
|
import { useAppLayoutStore } from '@/stores/appLayout';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { information } from '@/utils/labels';
|
import { infoMsg } from '@/utils/labels';
|
||||||
import { convertToCSV } from '@/utils/utils';
|
import { convertToCSV } from '@/utils/utils';
|
||||||
|
|
||||||
import { useApplyLibraryFilter } from '../../backend/useApplyLibraryFilter';
|
import { useApplyLibraryFilter } from '../../backend/useApplyLibraryFilter';
|
||||||
|
@ -43,7 +43,7 @@ export function LibraryPage() {
|
||||||
|
|
||||||
function handleDownloadCSV() {
|
function handleDownloadCSV() {
|
||||||
if (filtered.length === 0) {
|
if (filtered.length === 0) {
|
||||||
toast.error(information.noDataToExport);
|
toast.error(infoMsg.noDataToExport);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const blob = convertToCSV(filtered);
|
const blob = convertToCSV(filtered);
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { FolderNode } from '@/features/library/models/FolderTree';
|
||||||
import useWindowSize from '@/hooks/useWindowSize';
|
import useWindowSize from '@/hooks/useWindowSize';
|
||||||
import { useFitHeight } from '@/stores/appLayout';
|
import { useFitHeight } from '@/stores/appLayout';
|
||||||
import { PARAMETER, prefixes } from '@/utils/constants';
|
import { PARAMETER, prefixes } from '@/utils/constants';
|
||||||
import { information } from '@/utils/labels';
|
import { infoMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { useLibrary } from '../../backend/useLibrary';
|
import { useLibrary } from '../../backend/useLibrary';
|
||||||
import SelectLocation from '../../components/SelectLocation';
|
import SelectLocation from '../../components/SelectLocation';
|
||||||
|
@ -54,7 +54,7 @@ function ViewSideLocation({ isVisible, onRenameLocation }: ViewSideLocationProps
|
||||||
if (event.ctrlKey || event.metaKey) {
|
if (event.ctrlKey || event.metaKey) {
|
||||||
navigator.clipboard
|
navigator.clipboard
|
||||||
.writeText(target.getPath())
|
.writeText(target.getPath())
|
||||||
.then(() => toast.success(information.pathReady))
|
.then(() => toast.success(infoMsg.pathReady))
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
} else {
|
} else {
|
||||||
setLocation(target.getPath());
|
setLocation(target.getPath());
|
||||||
|
|
|
@ -13,7 +13,7 @@ import {
|
||||||
schemaCstSubstitute
|
schemaCstSubstitute
|
||||||
} from '@/features/oss/models/oss';
|
} from '@/features/oss/models/oss';
|
||||||
import { IConstituentaReference, ITargetCst } from '@/features/rsform/models/rsform';
|
import { IConstituentaReference, ITargetCst } from '@/features/rsform/models/rsform';
|
||||||
import { information } from '@/utils/labels';
|
import { infoMsg } from '@/utils/labels';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents {@link IOperation} data from server.
|
* Represents {@link IOperation} data from server.
|
||||||
|
@ -182,7 +182,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/${itemID}/update-positions`,
|
endpoint: `/api/oss/${itemID}/update-positions`,
|
||||||
request: {
|
request: {
|
||||||
data: { positions: positions },
|
data: { positions: positions },
|
||||||
successMessage: isSilent ? undefined : information.changesSaved
|
successMessage: isSilent ? undefined : infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/${itemID}/create-operation`,
|
endpoint: `/api/oss/${itemID}/create-operation`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: response => information.newOperation(response.new_operation.alias)
|
successMessage: response => infoMsg.newOperation(response.new_operation.alias)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
operationDelete: ({ itemID, data }: { itemID: LibraryItemID; data: IOperationDeleteDTO }) =>
|
operationDelete: ({ itemID, data }: { itemID: LibraryItemID; data: IOperationDeleteDTO }) =>
|
||||||
|
@ -199,7 +199,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/${itemID}/delete-operation`,
|
endpoint: `/api/oss/${itemID}/delete-operation`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.operationDestroyed
|
successMessage: infoMsg.operationDestroyed
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
inputCreate: ({ itemID, data }: { itemID: LibraryItemID; data: ITargetOperation }) =>
|
inputCreate: ({ itemID, data }: { itemID: LibraryItemID; data: ITargetOperation }) =>
|
||||||
|
@ -207,7 +207,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/${itemID}/create-input`,
|
endpoint: `/api/oss/${itemID}/create-input`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.newLibraryItem
|
successMessage: infoMsg.newLibraryItem
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
inputUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: IInputUpdateDTO }) =>
|
inputUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: IInputUpdateDTO }) =>
|
||||||
|
@ -215,7 +215,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/${itemID}/set-input`,
|
endpoint: `/api/oss/${itemID}/set-input`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
operationUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: IOperationUpdateDTO }) =>
|
operationUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: IOperationUpdateDTO }) =>
|
||||||
|
@ -223,7 +223,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/${itemID}/update-operation`,
|
endpoint: `/api/oss/${itemID}/update-operation`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
operationExecute: ({ itemID, data }: { itemID: LibraryItemID; data: ITargetOperation }) =>
|
operationExecute: ({ itemID, data }: { itemID: LibraryItemID; data: ITargetOperation }) =>
|
||||||
|
@ -231,7 +231,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/${itemID}/execute-operation`,
|
endpoint: `/api/oss/${itemID}/execute-operation`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.operationExecuted
|
successMessage: infoMsg.operationExecuted
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -240,7 +240,7 @@ export const ossApi = {
|
||||||
endpoint: `/api/oss/relocate-constituents`,
|
endpoint: `/api/oss/relocate-constituents`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
getPredecessor: (data: ITargetCst) =>
|
getPredecessor: (data: ITargetCst) =>
|
||||||
|
|
|
@ -12,7 +12,7 @@ import {
|
||||||
isSetTypification
|
isSetTypification
|
||||||
} from '@/features/rsform/models/rslangAPI';
|
} from '@/features/rsform/models/rslangAPI';
|
||||||
import { limits, PARAMETER } from '@/utils/constants';
|
import { limits, PARAMETER } from '@/utils/constants';
|
||||||
import { information } from '@/utils/labels';
|
import { infoMsg } from '@/utils/labels';
|
||||||
import { TextMatcher } from '@/utils/utils';
|
import { TextMatcher } from '@/utils/utils';
|
||||||
|
|
||||||
import { Graph } from '../../../models/Graph';
|
import { Graph } from '../../../models/Graph';
|
||||||
|
@ -416,7 +416,7 @@ export class SubstitutionValidator {
|
||||||
if (this.msg.length > 0) {
|
if (this.msg.length > 0) {
|
||||||
this.msg += '\n';
|
this.msg += '\n';
|
||||||
}
|
}
|
||||||
this.msg += information.substitutionsCorrect;
|
this.msg += infoMsg.substitutionsCorrect;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ import { useMainHeight } from '@/stores/appLayout';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { APP_COLORS } from '@/styling/colors';
|
import { APP_COLORS } from '@/styling/colors';
|
||||||
import { PARAMETER } from '@/utils/constants';
|
import { PARAMETER } from '@/utils/constants';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { useInputCreate } from '../../../backend/useInputCreate';
|
import { useInputCreate } from '../../../backend/useInputCreate';
|
||||||
import { useMutatingOss } from '../../../backend/useMutatingOss';
|
import { useMutatingOss } from '../../../backend/useMutatingOss';
|
||||||
|
@ -167,7 +167,7 @@ function OssFlow() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (libraryItems.find(item => item.alias === operation.alias && item.location === controller.schema.location)) {
|
if (libraryItems.find(item => item.alias === operation.alias && item.location === controller.schema.location)) {
|
||||||
toast.error(errors.inputAlreadyExists);
|
toast.error(errorMsg.inputAlreadyExists);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void inputCreate({
|
void inputCreate({
|
||||||
|
@ -205,7 +205,7 @@ function OssFlow() {
|
||||||
function handleSaveImage() {
|
function handleSaveImage() {
|
||||||
const canvas: HTMLElement | null = document.querySelector('.react-flow__viewport');
|
const canvas: HTMLElement | null = document.querySelector('.react-flow__viewport');
|
||||||
if (canvas === null) {
|
if (canvas === null) {
|
||||||
toast.error(errors.imageFailed);
|
toast.error(errorMsg.imageFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,7 +231,7 @@ function OssFlow() {
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
toast.error(errors.imageFailed);
|
toast.error(errorMsg.imageFailed);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { UserRole } from '@/features/users/models/user';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { usePreferencesStore } from '@/stores/preferences';
|
import { usePreferencesStore } from '@/stores/preferences';
|
||||||
import { useRoleStore } from '@/stores/role';
|
import { useRoleStore } from '@/stores/role';
|
||||||
import { prompts } from '@/utils/labels';
|
import { promptText } from '@/utils/labels';
|
||||||
|
|
||||||
import { IOperationPosition } from '../../backend/api';
|
import { IOperationPosition } from '../../backend/api';
|
||||||
import { useOssSuspense } from '../../backend/useOSS';
|
import { useOssSuspense } from '../../backend/useOSS';
|
||||||
|
@ -123,7 +123,7 @@ export const OssEditState = ({ itemID, children }: React.PropsWithChildren<OssEd
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteSchema() {
|
function deleteSchema() {
|
||||||
if (!window.confirm(prompts.deleteOSS)) {
|
if (!window.confirm(promptText.deleteOSS)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void deleteItem(schema.id).then(() => {
|
void deleteItem(schema.id).then(() => {
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {
|
||||||
VersionID
|
VersionID
|
||||||
} from '@/features/library/models/library';
|
} from '@/features/library/models/library';
|
||||||
import { ICstSubstitute, ICstSubstitutions } from '@/features/oss/models/oss';
|
import { ICstSubstitute, ICstSubstitutions } from '@/features/oss/models/oss';
|
||||||
import { information } from '@/utils/labels';
|
import { infoMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ConstituentaID,
|
ConstituentaID,
|
||||||
|
@ -173,7 +173,7 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${data.itemID}/load-trs`,
|
endpoint: `/api/rsforms/${data.itemID}/load-trs`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.uploadSuccess
|
successMessage: infoMsg.uploadSuccess
|
||||||
},
|
},
|
||||||
options: {
|
options: {
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -187,7 +187,7 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${itemID}/create-cst`,
|
endpoint: `/api/rsforms/${itemID}/create-cst`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: response => information.newConstituent(response.new_cst.alias)
|
successMessage: response => infoMsg.newConstituent(response.new_cst.alias)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cstUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: ICstUpdateDTO }) =>
|
cstUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: ICstUpdateDTO }) =>
|
||||||
|
@ -195,7 +195,7 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${itemID}/update-cst`,
|
endpoint: `/api/rsforms/${itemID}/update-cst`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cstDelete: ({ itemID, data }: { itemID: LibraryItemID; data: IConstituentaList }) =>
|
cstDelete: ({ itemID, data }: { itemID: LibraryItemID; data: IConstituentaList }) =>
|
||||||
|
@ -203,7 +203,7 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${itemID}/delete-multiple-cst`,
|
endpoint: `/api/rsforms/${itemID}/delete-multiple-cst`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.constituentsDestroyed(data.items.length)
|
successMessage: infoMsg.constituentsDestroyed(data.items.length)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cstRename: ({ itemID, data }: { itemID: LibraryItemID; data: ICstRenameDTO }) =>
|
cstRename: ({ itemID, data }: { itemID: LibraryItemID; data: ICstRenameDTO }) =>
|
||||||
|
@ -211,7 +211,7 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${itemID}/rename-cst`,
|
endpoint: `/api/rsforms/${itemID}/rename-cst`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cstSubstitute: ({ itemID, data }: { itemID: LibraryItemID; data: ICstSubstitutions }) =>
|
cstSubstitute: ({ itemID, data }: { itemID: LibraryItemID; data: ICstSubstitutions }) =>
|
||||||
|
@ -219,7 +219,7 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${itemID}/substitute`,
|
endpoint: `/api/rsforms/${itemID}/substitute`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.substituteSingle
|
successMessage: infoMsg.substituteSingle
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
cstMove: ({ itemID, data }: { itemID: LibraryItemID; data: ICstMoveDTO }) =>
|
cstMove: ({ itemID, data }: { itemID: LibraryItemID; data: ICstMoveDTO }) =>
|
||||||
|
@ -233,7 +233,7 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${itemID}/produce-structure`,
|
endpoint: `/api/rsforms/${itemID}/produce-structure`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: response => information.addedConstituents(response.cst_list.length)
|
successMessage: response => infoMsg.addedConstituents(response.cst_list.length)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
inlineSynthesis: ({ itemID, data }: { itemID: LibraryItemID; data: IInlineSynthesisDTO }) =>
|
inlineSynthesis: ({ itemID, data }: { itemID: LibraryItemID; data: IInlineSynthesisDTO }) =>
|
||||||
|
@ -241,18 +241,18 @@ export const rsformsApi = {
|
||||||
endpoint: `/api/rsforms/${itemID}/inline-synthesis`,
|
endpoint: `/api/rsforms/${itemID}/inline-synthesis`,
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.inlineSynthesisComplete
|
successMessage: infoMsg.inlineSynthesisComplete
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
restoreOrder: ({ itemID }: { itemID: LibraryItemID }) =>
|
restoreOrder: ({ itemID }: { itemID: LibraryItemID }) =>
|
||||||
axiosPatch<undefined, IRSFormDTO>({
|
axiosPatch<undefined, IRSFormDTO>({
|
||||||
endpoint: `/api/rsforms/${itemID}/restore-order`,
|
endpoint: `/api/rsforms/${itemID}/restore-order`,
|
||||||
request: { successMessage: information.reorderComplete }
|
request: { successMessage: infoMsg.reorderComplete }
|
||||||
}),
|
}),
|
||||||
resetAliases: ({ itemID }: { itemID: LibraryItemID }) =>
|
resetAliases: ({ itemID }: { itemID: LibraryItemID }) =>
|
||||||
axiosPatch<undefined, IRSFormDTO>({
|
axiosPatch<undefined, IRSFormDTO>({
|
||||||
endpoint: `/api/rsforms/${itemID}/reset-aliases`,
|
endpoint: `/api/rsforms/${itemID}/reset-aliases`,
|
||||||
request: { successMessage: information.reindexComplete }
|
request: { successMessage: infoMsg.reindexComplete }
|
||||||
}),
|
}),
|
||||||
|
|
||||||
checkConstituenta: ({ itemID, data }: { itemID: LibraryItemID; data: ICheckConstituentaDTO }) =>
|
checkConstituenta: ({ itemID, data }: { itemID: LibraryItemID; data: ICheckConstituentaDTO }) =>
|
||||||
|
|
|
@ -13,7 +13,7 @@ import SelectLibraryItem from '@/features/library/components/SelectLibraryItem';
|
||||||
import { ILibraryItem } from '@/features/library/models/library';
|
import { ILibraryItem } from '@/features/library/models/library';
|
||||||
import { ICstSubstitute, IMultiSubstitution } from '@/features/oss/models/oss';
|
import { ICstSubstitute, IMultiSubstitution } from '@/features/oss/models/oss';
|
||||||
import { APP_COLORS } from '@/styling/colors';
|
import { APP_COLORS } from '@/styling/colors';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { ConstituentaID, IConstituenta, IRSForm } from '../models/rsform';
|
import { ConstituentaID, IConstituenta, IRSForm } from '../models/rsform';
|
||||||
import BadgeConstituenta from './BadgeConstituenta';
|
import BadgeConstituenta from './BadgeConstituenta';
|
||||||
|
@ -116,12 +116,12 @@ function PickSubstitutions({
|
||||||
toDelete.includes(newSubstitution.substitution) ||
|
toDelete.includes(newSubstitution.substitution) ||
|
||||||
replacements.includes(newSubstitution.original)
|
replacements.includes(newSubstitution.original)
|
||||||
) {
|
) {
|
||||||
toast.error(errors.reuseOriginal);
|
toast.error(errorMsg.reuseOriginal);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (leftArgument === rightArgument) {
|
if (leftArgument === rightArgument) {
|
||||||
if ((deleteRight && rightCst?.is_inherited) || (!deleteRight && leftCst?.is_inherited)) {
|
if ((deleteRight && rightCst?.is_inherited) || (!deleteRight && leftCst?.is_inherited)) {
|
||||||
toast.error(errors.substituteInherited);
|
toast.error(errorMsg.substituteInherited);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { useVersionCreate } from '@/features/library/backend/useVersionCreate';
|
||||||
import { IVersionInfo, LibraryItemID, VersionID } from '@/features/library/models/library';
|
import { IVersionInfo, LibraryItemID, VersionID } from '@/features/library/models/library';
|
||||||
import { nextVersion } from '@/features/library/models/libraryAPI';
|
import { nextVersion } from '@/features/library/models/libraryAPI';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { ConstituentaID } from '../models/rsform';
|
import { ConstituentaID } from '../models/rsform';
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ function DlgCreateVersion() {
|
||||||
header='Создание версии'
|
header='Создание версии'
|
||||||
className={clsx('cc-column', 'w-[30rem]', 'py-2 px-6')}
|
className={clsx('cc-column', 'w-[30rem]', 'py-2 px-6')}
|
||||||
canSubmit={canSubmit}
|
canSubmit={canSubmit}
|
||||||
submitInvalidTooltip={errors.versionTaken}
|
submitInvalidTooltip={errorMsg.versionTaken}
|
||||||
submitText='Создать'
|
submitText='Создать'
|
||||||
onSubmit={event => void handleSubmit(onSubmit)(event)}
|
onSubmit={event => void handleSubmit(onSubmit)(event)}
|
||||||
>
|
>
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { TabLabel, TabList, TabPanel, Tabs } from '@/components/Tabs';
|
||||||
import { HelpTopic } from '@/features/help/models/helpTopic';
|
import { HelpTopic } from '@/features/help/models/helpTopic';
|
||||||
import usePartialUpdate from '@/hooks/usePartialUpdate';
|
import usePartialUpdate from '@/hooks/usePartialUpdate';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { prompts } from '@/utils/labels';
|
import { promptText } from '@/utils/labels';
|
||||||
|
|
||||||
import { ICstCreateDTO } from '../../backend/api';
|
import { ICstCreateDTO } from '../../backend/api';
|
||||||
import { useRSForm } from '../../backend/useRSForm';
|
import { useRSForm } from '../../backend/useRSForm';
|
||||||
|
@ -62,7 +62,7 @@ function DlgCstTemplate() {
|
||||||
|
|
||||||
function handlePrompt(): boolean {
|
function handlePrompt(): boolean {
|
||||||
const definedSomeArgs = substitutes.arguments.some(arg => !!arg.value);
|
const definedSomeArgs = substitutes.arguments.some(arg => !!arg.value);
|
||||||
if (!definedSomeArgs && !window.confirm(prompts.templateUndefined)) {
|
if (!definedSomeArgs && !window.confirm(promptText.templateUndefined)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -15,7 +15,7 @@ import { useVersionDelete } from '@/features/library/backend/useVersionDelete';
|
||||||
import { useVersionUpdate } from '@/features/library/backend/useVersionUpdate';
|
import { useVersionUpdate } from '@/features/library/backend/useVersionUpdate';
|
||||||
import { LibraryItemID, VersionID } from '@/features/library/models/library';
|
import { LibraryItemID, VersionID } from '@/features/library/models/library';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { useRSFormSuspense } from '../../backend/useRSForm';
|
import { useRSFormSuspense } from '../../backend/useRSForm';
|
||||||
import TableVersions from './TableVersions';
|
import TableVersions from './TableVersions';
|
||||||
|
@ -105,7 +105,7 @@ function DlgEditVersions() {
|
||||||
<div className='cc-icons'>
|
<div className='cc-icons'>
|
||||||
<MiniButton
|
<MiniButton
|
||||||
type='submit'
|
type='submit'
|
||||||
title={isValid ? 'Сохранить изменения' : errors.versionTaken}
|
title={isValid ? 'Сохранить изменения' : errorMsg.versionTaken}
|
||||||
disabled={!isDirty || !isValid || isProcessing}
|
disabled={!isDirty || !isValid || isProcessing}
|
||||||
icon={<IconSave size='1.25rem' className='icon-primary' />}
|
icon={<IconSave size='1.25rem' className='icon-primary' />}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { Label, TextArea } from '@/components/Input';
|
||||||
import { ModalForm } from '@/components/Modal';
|
import { ModalForm } from '@/components/Modal';
|
||||||
import { HelpTopic } from '@/features/help/models/helpTopic';
|
import { HelpTopic } from '@/features/help/models/helpTopic';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { prompts } from '@/utils/labels';
|
import { promptText } from '@/utils/labels';
|
||||||
|
|
||||||
import { useGenerateLexeme } from '../../backend/cctext/useGenerateLexeme';
|
import { useGenerateLexeme } from '../../backend/cctext/useGenerateLexeme';
|
||||||
import { useInflectText } from '../../backend/cctext/useInflectText';
|
import { useInflectText } from '../../backend/cctext/useInflectText';
|
||||||
|
@ -93,7 +93,7 @@ function DlgEditWordForms() {
|
||||||
|
|
||||||
function handleGenerateLexeme() {
|
function handleGenerateLexeme() {
|
||||||
if (forms.length > 0) {
|
if (forms.length > 0) {
|
||||||
if (!window.confirm(prompts.generateWordforms)) {
|
if (!window.confirm(promptText.generateWordforms)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import { ReactFlowProvider } from 'reactflow';
|
||||||
import { ModalView } from '@/components/Modal';
|
import { ModalView } from '@/components/Modal';
|
||||||
import { HelpTopic } from '@/features/help/models/helpTopic';
|
import { HelpTopic } from '@/features/help/models/helpTopic';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { ITypeInfo } from '../../models/rslang';
|
import { ITypeInfo } from '../../models/rslang';
|
||||||
import { TMGraph } from '../../models/TMGraph';
|
import { TMGraph } from '../../models/TMGraph';
|
||||||
|
@ -26,7 +26,7 @@ function DlgShowTypeGraph() {
|
||||||
})();
|
})();
|
||||||
|
|
||||||
if (graph.nodes.length === 0) {
|
if (graph.nodes.length === 0) {
|
||||||
toast.error(errors.typeStructureFailed);
|
toast.error(errorMsg.typeStructureFailed);
|
||||||
hideDialog();
|
hideDialog();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { MiniButton } from '@/components/Control';
|
||||||
import { IconEdit } from '@/components/Icons';
|
import { IconEdit } from '@/components/Icons';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { tooltips } from '@/utils/labels';
|
import { tooltipText } from '@/utils/labels';
|
||||||
|
|
||||||
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
||||||
import { IConstituenta } from '../../../models/rsform';
|
import { IConstituenta } from '../../../models/rsform';
|
||||||
|
@ -32,7 +32,7 @@ function EditorControls({ constituenta, disabled, onEditTerm }: EditorControlsPr
|
||||||
<Overlay position='top-1 left-[4.7rem]' className='flex select-none'>
|
<Overlay position='top-1 left-[4.7rem]' className='flex select-none'>
|
||||||
{!disabled || isProcessing ? (
|
{!disabled || isProcessing ? (
|
||||||
<MiniButton
|
<MiniButton
|
||||||
title={isModified ? tooltips.unsaved : `Редактировать словоформы термина`}
|
title={isModified ? tooltipText.unsaved : `Редактировать словоформы термина`}
|
||||||
noHover
|
noHover
|
||||||
onClick={onEditTerm}
|
onClick={onEditTerm}
|
||||||
icon={<IconEdit size='1rem' className='icon-primary' />}
|
icon={<IconEdit size='1rem' className='icon-primary' />}
|
||||||
|
@ -53,7 +53,7 @@ function EditorControls({ constituenta, disabled, onEditTerm }: EditorControlsPr
|
||||||
{!disabled || isProcessing ? (
|
{!disabled || isProcessing ? (
|
||||||
<MiniButton
|
<MiniButton
|
||||||
noHover
|
noHover
|
||||||
title={isModified ? tooltips.unsaved : 'Переименовать конституенту'}
|
title={isModified ? tooltipText.unsaved : 'Переименовать конституенту'}
|
||||||
onClick={handleRenameCst}
|
onClick={handleRenameCst}
|
||||||
icon={<IconEdit size='1rem' className='icon-primary' />}
|
icon={<IconEdit size='1rem' className='icon-primary' />}
|
||||||
disabled={isModified}
|
disabled={isModified}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import { CProps } from '@/components/props';
|
||||||
import { Indicator } from '@/components/View';
|
import { Indicator } from '@/components/View';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { ICstUpdateDTO, schemaCstUpdate } from '../../../backend/api';
|
import { ICstUpdateDTO, schemaCstUpdate } from '../../../backend/api';
|
||||||
import { useCstUpdate } from '../../../backend/useCstUpdate';
|
import { useCstUpdate } from '../../../backend/useCstUpdate';
|
||||||
|
@ -103,7 +103,7 @@ function FormConstituenta({ disabled, id, toggleReset, schema, activeCst, onOpen
|
||||||
|
|
||||||
function handleTypeGraph(event: CProps.EventMouse) {
|
function handleTypeGraph(event: CProps.EventMouse) {
|
||||||
if ((localParse && !localParse.parseResult) || activeCst.parse.status !== ParsingStatus.VERIFIED) {
|
if ((localParse && !localParse.parseResult) || activeCst.parse.status !== ParsingStatus.VERIFIED) {
|
||||||
toast.error(errors.typeStructureFailed);
|
toast.error(errorMsg.typeStructureFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
|
@ -23,7 +23,7 @@ import { useFindPredecessor } from '@/features/oss/backend/useFindPredecessor';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { usePreferencesStore } from '@/stores/preferences';
|
import { usePreferencesStore } from '@/stores/preferences';
|
||||||
import { PARAMETER } from '@/utils/constants';
|
import { PARAMETER } from '@/utils/constants';
|
||||||
import { tooltips } from '@/utils/labels';
|
import { tooltipText } from '@/utils/labels';
|
||||||
import { prepareTooltip } from '@/utils/utils';
|
import { prepareTooltip } from '@/utils/utils';
|
||||||
|
|
||||||
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
||||||
|
@ -106,7 +106,7 @@ function ToolbarConstituenta({
|
||||||
onClick={() => controller.createCst(activeCst?.cst_type, false)}
|
onClick={() => controller.createCst(activeCst?.cst_type, false)}
|
||||||
/>
|
/>
|
||||||
<MiniButton
|
<MiniButton
|
||||||
titleHtml={isModified ? tooltips.unsaved : prepareTooltip('Клонировать конституенту', 'Alt + V')}
|
titleHtml={isModified ? tooltipText.unsaved : prepareTooltip('Клонировать конституенту', 'Alt + V')}
|
||||||
icon={<IconClone size='1.25rem' className='icon-green' />}
|
icon={<IconClone size='1.25rem' className='icon-green' />}
|
||||||
disabled={disabled || isModified}
|
disabled={disabled || isModified}
|
||||||
onClick={controller.cloneCst}
|
onClick={controller.cloneCst}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { HelpTopic } from '@/features/help/models/helpTopic';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { usePreferencesStore } from '@/stores/preferences';
|
import { usePreferencesStore } from '@/stores/preferences';
|
||||||
import { transformAST } from '@/utils/codemirror';
|
import { transformAST } from '@/utils/codemirror';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { ICheckConstituentaDTO } from '../../../backend/api';
|
import { ICheckConstituentaDTO } from '../../../backend/api';
|
||||||
import { useCheckConstituenta } from '../../../backend/useCheckConstituenta';
|
import { useCheckConstituenta } from '../../../backend/useCheckConstituenta';
|
||||||
|
@ -141,7 +141,7 @@ function EditorRSExpression({
|
||||||
} else {
|
} else {
|
||||||
handleCheckExpression(parse => {
|
handleCheckExpression(parse => {
|
||||||
if (!parse.astText) {
|
if (!parse.astText) {
|
||||||
toast.error(errors.astFailed);
|
toast.error(errorMsg.astFailed);
|
||||||
} else {
|
} else {
|
||||||
showAST({ syntaxTree: parse.ast, expression: getDefinitionPrefix(activeCst) + value });
|
showAST({ syntaxTree: parse.ast, expression: getDefinitionPrefix(activeCst) + value });
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { useRoleStore } from '@/stores/role';
|
import { useRoleStore } from '@/stores/role';
|
||||||
import { prefixes } from '@/utils/constants';
|
import { prefixes } from '@/utils/constants';
|
||||||
import { prompts } from '@/utils/labels';
|
import { promptText } from '@/utils/labels';
|
||||||
|
|
||||||
import InfoUsers from './InfoUsers';
|
import InfoUsers from './InfoUsers';
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ function EditorLibraryItem({ controller }: EditorLibraryItemProps) {
|
||||||
if (newValue === controller.schema.owner) {
|
if (newValue === controller.schema.owner) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!window.confirm(prompts.ownerChange)) {
|
if (!window.confirm(promptText.ownerChange)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void setOwner({ itemID: controller.schema.id, owner: newValue });
|
void setOwner({ itemID: controller.schema.id, owner: newValue });
|
||||||
|
|
|
@ -11,7 +11,7 @@ import { UserRole } from '@/features/users/models/user';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { useRoleStore } from '@/stores/role';
|
import { useRoleStore } from '@/stores/role';
|
||||||
import { PARAMETER } from '@/utils/constants';
|
import { PARAMETER } from '@/utils/constants';
|
||||||
import { tooltips } from '@/utils/labels';
|
import { tooltipText } from '@/utils/labels';
|
||||||
import { prepareTooltip } from '@/utils/utils';
|
import { prepareTooltip } from '@/utils/utils';
|
||||||
import { sharePage } from '@/utils/utils';
|
import { sharePage } from '@/utils/utils';
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ function ToolbarRSFormCard({ controller, onSubmit }: ToolbarRSFormCardProps) {
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
<MiniButton
|
<MiniButton
|
||||||
titleHtml={tooltips.shareItem(controller.schema.access_policy)}
|
titleHtml={tooltipText.shareItem(controller.schema.access_policy)}
|
||||||
icon={<IconShare size='1.25rem' className='icon-primary' />}
|
icon={<IconShare size='1.25rem' className='icon-primary' />}
|
||||||
onClick={sharePage}
|
onClick={sharePage}
|
||||||
disabled={controller.schema.access_policy !== AccessPolicy.PUBLIC}
|
disabled={controller.schema.access_policy !== AccessPolicy.PUBLIC}
|
||||||
|
|
|
@ -9,7 +9,7 @@ import { useVersionRestore } from '@/features/library/backend/useVersionRestore'
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { PARAMETER } from '@/utils/constants';
|
import { PARAMETER } from '@/utils/constants';
|
||||||
import { prompts } from '@/utils/labels';
|
import { promptText } from '@/utils/labels';
|
||||||
import { promptUnsaved } from '@/utils/utils';
|
import { promptUnsaved } from '@/utils/utils';
|
||||||
|
|
||||||
import { useRSEdit } from '../RSEditContext';
|
import { useRSEdit } from '../RSEditContext';
|
||||||
|
@ -27,7 +27,7 @@ function ToolbarVersioning({ blockReload }: ToolbarVersioningProps) {
|
||||||
const showEditVersions = useDialogsStore(state => state.showEditVersions);
|
const showEditVersions = useDialogsStore(state => state.showEditVersions);
|
||||||
|
|
||||||
function handleRestoreVersion() {
|
function handleRestoreVersion() {
|
||||||
if (!controller.schema.version || !window.confirm(prompts.restoreArchive)) {
|
if (!controller.schema.version || !window.confirm(promptText.restoreArchive)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void versionRestore({ versionID: controller.schema.version }).then(() => controller.navigateVersion(undefined));
|
void versionRestore({ versionID: controller.schema.version }).then(() => controller.navigateVersion(undefined));
|
||||||
|
|
|
@ -10,7 +10,7 @@ import { type RowSelectionState } from '@/components/DataTable';
|
||||||
import { IconCSV } from '@/components/Icons';
|
import { IconCSV } from '@/components/Icons';
|
||||||
import { SearchBar } from '@/components/shared/SearchBar';
|
import { SearchBar } from '@/components/shared/SearchBar';
|
||||||
import { useFitHeight } from '@/stores/appLayout';
|
import { useFitHeight } from '@/stores/appLayout';
|
||||||
import { information } from '@/utils/labels';
|
import { infoMsg } from '@/utils/labels';
|
||||||
import { convertToCSV } from '@/utils/utils';
|
import { convertToCSV } from '@/utils/utils';
|
||||||
|
|
||||||
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
||||||
|
@ -37,7 +37,7 @@ function EditorRSList() {
|
||||||
|
|
||||||
function handleDownloadCSV() {
|
function handleDownloadCSV() {
|
||||||
if (filtered.length === 0) {
|
if (filtered.length === 0) {
|
||||||
toast.error(information.noDataToExport);
|
toast.error(infoMsg.noDataToExport);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const blob = convertToCSV(filtered);
|
const blob = convertToCSV(filtered);
|
||||||
|
|
|
@ -25,7 +25,7 @@ import { useMainHeight } from '@/stores/appLayout';
|
||||||
import { useDialogsStore } from '@/stores/dialogs';
|
import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { APP_COLORS } from '@/styling/colors';
|
import { APP_COLORS } from '@/styling/colors';
|
||||||
import { PARAMETER } from '@/utils/constants';
|
import { PARAMETER } from '@/utils/constants';
|
||||||
import { errors } from '@/utils/labels';
|
import { errorMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
|
||||||
import { colorBgGraphNode } from '../../../colors';
|
import { colorBgGraphNode } from '../../../colors';
|
||||||
|
@ -188,7 +188,7 @@ function TGFlow() {
|
||||||
function handleSaveImage() {
|
function handleSaveImage() {
|
||||||
const canvas: HTMLElement | null = document.querySelector('.react-flow__viewport');
|
const canvas: HTMLElement | null = document.querySelector('.react-flow__viewport');
|
||||||
if (canvas === null) {
|
if (canvas === null) {
|
||||||
toast.error(errors.imageFailed);
|
toast.error(errorMsg.imageFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,7 +214,7 @@ function TGFlow() {
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
toast.error(errors.imageFailed);
|
toast.error(errorMsg.imageFailed);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ import { useDialogsStore } from '@/stores/dialogs';
|
||||||
import { useModificationStore } from '@/stores/modification';
|
import { useModificationStore } from '@/stores/modification';
|
||||||
import { useRoleStore } from '@/stores/role';
|
import { useRoleStore } from '@/stores/role';
|
||||||
import { EXTEOR_TRS_FILE } from '@/utils/constants';
|
import { EXTEOR_TRS_FILE } from '@/utils/constants';
|
||||||
import { describeAccessMode, labelAccessMode, tooltips } from '@/utils/labels';
|
import { describeAccessMode, labelAccessMode, tooltipText } from '@/utils/labels';
|
||||||
import { generatePageQR, promptUnsaved, sharePage } from '@/utils/utils';
|
import { generatePageQR, promptUnsaved, sharePage } from '@/utils/utils';
|
||||||
|
|
||||||
import { useCstSubstitute } from '../../backend/useCstSubstitute';
|
import { useCstSubstitute } from '../../backend/useCstSubstitute';
|
||||||
|
@ -239,7 +239,7 @@ function MenuRSTabs() {
|
||||||
<Dropdown isOpen={schemaMenu.isOpen}>
|
<Dropdown isOpen={schemaMenu.isOpen}>
|
||||||
<DropdownButton
|
<DropdownButton
|
||||||
text='Поделиться'
|
text='Поделиться'
|
||||||
titleHtml={tooltips.shareItem(controller.schema.access_policy)}
|
titleHtml={tooltipText.shareItem(controller.schema.access_policy)}
|
||||||
icon={<IconShare size='1rem' className='icon-primary' />}
|
icon={<IconShare size='1rem' className='icon-primary' />}
|
||||||
onClick={handleShare}
|
onClick={handleShare}
|
||||||
disabled={controller.schema.access_policy !== AccessPolicy.PUBLIC}
|
disabled={controller.schema.access_policy !== AccessPolicy.PUBLIC}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import { useModificationStore } from '@/stores/modification';
|
||||||
import { usePreferencesStore } from '@/stores/preferences';
|
import { usePreferencesStore } from '@/stores/preferences';
|
||||||
import { useRoleStore } from '@/stores/role';
|
import { useRoleStore } from '@/stores/role';
|
||||||
import { PARAMETER, prefixes } from '@/utils/constants';
|
import { PARAMETER, prefixes } from '@/utils/constants';
|
||||||
import { prompts } from '@/utils/labels';
|
import { promptText } from '@/utils/labels';
|
||||||
import { promptUnsaved } from '@/utils/utils';
|
import { promptUnsaved } from '@/utils/utils';
|
||||||
|
|
||||||
import { ICstCreateDTO } from '../../backend/api';
|
import { ICstCreateDTO } from '../../backend/api';
|
||||||
|
@ -166,7 +166,7 @@ export const RSEditState = ({
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteSchema() {
|
function deleteSchema() {
|
||||||
if (!window.confirm(prompts.deleteLibraryItem)) {
|
if (!window.confirm(promptText.deleteLibraryItem)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const ossID = schema.oss.length > 0 ? schema.oss[0].id : undefined;
|
const ossID = schema.oss.length > 0 ? schema.oss[0].id : undefined;
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { z } from 'zod';
|
||||||
import { axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport';
|
import { axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport';
|
||||||
import { DELAYS } from '@/backend/configuration';
|
import { DELAYS } from '@/backend/configuration';
|
||||||
import { patterns } from '@/utils/constants';
|
import { patterns } from '@/utils/constants';
|
||||||
import { errors, information } from '@/utils/labels';
|
import { errorMsg, infoMsg } from '@/utils/labels';
|
||||||
|
|
||||||
import { IUserInfo, IUserProfile } from '../models/user';
|
import { IUserInfo, IUserProfile } from '../models/user';
|
||||||
|
|
||||||
|
@ -13,15 +13,15 @@ import { IUserInfo, IUserProfile } from '../models/user';
|
||||||
*/
|
*/
|
||||||
export const schemaUserSignup = z
|
export const schemaUserSignup = z
|
||||||
.object({
|
.object({
|
||||||
username: z.string().nonempty(errors.requiredField).regex(RegExp(patterns.login), errors.loginFormat),
|
username: z.string().nonempty(errorMsg.requiredField).regex(RegExp(patterns.login), errorMsg.loginFormat),
|
||||||
email: z.string().email(errors.emailField),
|
email: z.string().email(errorMsg.emailField),
|
||||||
first_name: z.string(),
|
first_name: z.string(),
|
||||||
last_name: z.string(),
|
last_name: z.string(),
|
||||||
|
|
||||||
password: z.string().nonempty(errors.requiredField),
|
password: z.string().nonempty(errorMsg.requiredField),
|
||||||
password2: z.string().nonempty(errors.requiredField)
|
password2: z.string().nonempty(errorMsg.requiredField)
|
||||||
})
|
})
|
||||||
.refine(schema => schema.password === schema.password2, { path: ['password2'], message: errors.passwordsMismatch });
|
.refine(schema => schema.password === schema.password2, { path: ['password2'], message: errorMsg.passwordsMismatch });
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents signup data, used to create new users.
|
* Represents signup data, used to create new users.
|
||||||
|
@ -32,7 +32,7 @@ export type IUserSignupDTO = z.infer<typeof schemaUserSignup>;
|
||||||
* Represents user data, intended to update user profile in persistent storage.
|
* Represents user data, intended to update user profile in persistent storage.
|
||||||
*/
|
*/
|
||||||
export const schemaUpdateProfile = z.object({
|
export const schemaUpdateProfile = z.object({
|
||||||
email: z.string().email(errors.emailField),
|
email: z.string().email(errorMsg.emailField),
|
||||||
first_name: z.string(),
|
first_name: z.string(),
|
||||||
last_name: z.string()
|
last_name: z.string()
|
||||||
});
|
});
|
||||||
|
@ -70,7 +70,7 @@ export const usersApi = {
|
||||||
endpoint: '/users/api/signup',
|
endpoint: '/users/api/signup',
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: createdUser => information.newUser(createdUser.username)
|
successMessage: createdUser => infoMsg.newUser(createdUser.username)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ export const usersApi = {
|
||||||
endpoint: '/users/api/profile',
|
endpoint: '/users/api/profile',
|
||||||
request: {
|
request: {
|
||||||
data: data,
|
data: data,
|
||||||
successMessage: information.changesSaved
|
successMessage: infoMsg.changesSaved
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
|
@ -89,7 +89,7 @@ export function describeLibraryItemType(itemType: LibraryItemType): string {
|
||||||
/**
|
/**
|
||||||
* UI info descriptors.
|
* UI info descriptors.
|
||||||
*/
|
*/
|
||||||
export const information = {
|
export const infoMsg = {
|
||||||
changesSaved: 'Изменения сохранены',
|
changesSaved: 'Изменения сохранены',
|
||||||
|
|
||||||
pathReady: 'Путь скопирован',
|
pathReady: 'Путь скопирован',
|
||||||
|
@ -124,7 +124,7 @@ export const information = {
|
||||||
/**
|
/**
|
||||||
* UI error descriptors.
|
* UI error descriptors.
|
||||||
*/
|
*/
|
||||||
export const errors = {
|
export const errorMsg = {
|
||||||
astFailed: 'Невозможно построить дерево разбора',
|
astFailed: 'Невозможно построить дерево разбора',
|
||||||
typeStructureFailed: 'Структура отсутствует',
|
typeStructureFailed: 'Структура отсутствует',
|
||||||
passwordsMismatch: 'Пароли не совпадают',
|
passwordsMismatch: 'Пароли не совпадают',
|
||||||
|
@ -145,7 +145,7 @@ export const errors = {
|
||||||
/**
|
/**
|
||||||
* UI tooltip descriptors.
|
* UI tooltip descriptors.
|
||||||
*/
|
*/
|
||||||
export const tooltips = {
|
export const tooltipText = {
|
||||||
unsaved: 'Сохраните или отмените изменения',
|
unsaved: 'Сохраните или отмените изменения',
|
||||||
shareItem: (policy?: AccessPolicy) =>
|
shareItem: (policy?: AccessPolicy) =>
|
||||||
policy === AccessPolicy.PUBLIC ? 'Поделиться схемой' : 'Поделиться можно только <br/>открытой схемой'
|
policy === AccessPolicy.PUBLIC ? 'Поделиться схемой' : 'Поделиться можно только <br/>открытой схемой'
|
||||||
|
@ -154,7 +154,7 @@ export const tooltips = {
|
||||||
/**
|
/**
|
||||||
* UI prompt messages.
|
* UI prompt messages.
|
||||||
*/
|
*/
|
||||||
export const prompts = {
|
export const promptText = {
|
||||||
promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?',
|
promptUnsaved: 'Присутствуют несохраненные изменения. Продолжить без их учета?',
|
||||||
deleteLibraryItem: 'Вы уверены, что хотите удалить данную схему?',
|
deleteLibraryItem: 'Вы уверены, что хотите удалить данную схему?',
|
||||||
deleteOSS:
|
deleteOSS:
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
import { AxiosError, AxiosHeaderValue, AxiosResponse, isAxiosError } from 'axios';
|
import { AxiosError, AxiosHeaderValue, AxiosResponse, isAxiosError } from 'axios';
|
||||||
import { toast } from 'react-toastify';
|
import { toast } from 'react-toastify';
|
||||||
|
|
||||||
import { information, prompts } from './labels';
|
import { infoMsg, promptText } from './labels';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if arguments is Node.
|
* Checks if arguments is Node.
|
||||||
|
@ -106,7 +106,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(prompts.promptUnsaved);
|
return window.confirm(promptText.promptUnsaved);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -195,7 +195,7 @@ export function sharePage() {
|
||||||
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(information.linkReady))
|
.then(() => toast.success(infoMsg.linkReady))
|
||||||
.catch(console.error);
|
.catch(console.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user