R: Refactor feature dependencies
Some checks are pending
Frontend CI / build (22.x) (push) Waiting to run

This commit is contained in:
Ivan 2025-02-26 00:16:41 +03:00
parent 16188d8108
commit 3e52639e48
103 changed files with 408 additions and 348 deletions

View File

@ -1,4 +1,5 @@
import { useAuthSuspense, useLogout } from '@/features/auth';
import { useAuthSuspense } from '@/features/auth';
import { useLogout } from '@/features/auth/backend/useLogout';
import { Dropdown, DropdownButton } from '@/components/Dropdown';
import {

View File

@ -1,125 +0,0 @@
import { LocationHead } from '@/features/library/models/library';
import { ExpressionStatus } from '@/features/rsform/models/rsform';
import { CstMatchMode, DependencyMode } from '@/features/rsform/stores/cstSearch';
import {
IconAlias,
IconBusiness,
IconFilter,
IconFormula,
IconGraphCollapse,
IconGraphExpand,
IconGraphInputs,
IconGraphOutputs,
IconHide,
IconMoveDown,
IconMoveUp,
type IconProps,
IconPublic,
IconSettings,
IconShow,
IconStatusError,
IconStatusIncalculable,
IconStatusOK,
IconStatusUnknown,
IconSubfolders,
IconTemplates,
IconTerm,
IconText,
IconUser
} from './Icons';
export interface DomIconProps<RequestData> extends IconProps {
value: RequestData;
}
/** Icon for visibility. */
export function VisibilityIcon({ value, size = '1.25rem', className }: DomIconProps<boolean>) {
if (value) {
return <IconShow size={size} className={className ?? 'text-ok-600'} />;
} else {
return <IconHide size={size} className={className ?? 'text-warn-600'} />;
}
}
/** Icon for subfolders. */
export function SubfoldersIcon({ value, size = '1.25rem', className }: DomIconProps<boolean>) {
if (value) {
return <IconSubfolders size={size} className={className ?? 'text-ok-600'} />;
} else {
return <IconSubfolders size={size} className={className ?? 'text-sec-600'} />;
}
}
/** Icon for location. */
export function LocationIcon({ value, size = '1.25rem', className }: DomIconProps<string>) {
switch (value.substring(0, 2) as LocationHead) {
case LocationHead.COMMON:
return <IconPublic size={size} className={className ?? 'text-sec-600'} />;
case LocationHead.LIBRARY:
return <IconTemplates size={size} className={className ?? 'text-warn-600'} />;
case LocationHead.PROJECTS:
return <IconBusiness size={size} className={className ?? 'text-sec-600'} />;
case LocationHead.USER:
return <IconUser size={size} className={className ?? 'text-ok-600'} />;
}
}
/** Icon for term graph dependency mode. */
export function DependencyIcon({ value, size = '1.25rem', className }: DomIconProps<DependencyMode>) {
switch (value) {
case DependencyMode.ALL:
return <IconSettings size={size} className={className} />;
case DependencyMode.OUTPUTS:
return <IconGraphOutputs size={size} className={className ?? 'text-sec-600'} />;
case DependencyMode.INPUTS:
return <IconGraphInputs size={size} className={className ?? 'text-sec-600'} />;
case DependencyMode.EXPAND_OUTPUTS:
return <IconGraphExpand size={size} className={className ?? 'text-sec-600'} />;
case DependencyMode.EXPAND_INPUTS:
return <IconGraphCollapse size={size} className={className ?? 'text-sec-600'} />;
}
}
/** Icon for constituenta match mode. */
export function MatchModeIcon({ value, size = '1.25rem', className }: DomIconProps<CstMatchMode>) {
switch (value) {
case CstMatchMode.ALL:
return <IconFilter size={size} className={className} />;
case CstMatchMode.TEXT:
return <IconText size={size} className={className ?? 'text-sec-600'} />;
case CstMatchMode.EXPR:
return <IconFormula size={size} className={className ?? 'text-sec-600'} />;
case CstMatchMode.TERM:
return <IconTerm size={size} className={className ?? 'text-sec-600'} />;
case CstMatchMode.NAME:
return <IconAlias size={size} className={className ?? 'text-sec-600'} />;
}
}
/** Icon for expression status. */
export function StatusIcon({ value, size = '1.25rem', className }: DomIconProps<ExpressionStatus>) {
switch (value) {
case ExpressionStatus.VERIFIED:
case ExpressionStatus.PROPERTY:
return <IconStatusOK size={size} className={className} />;
case ExpressionStatus.UNKNOWN:
return <IconStatusUnknown size={size} className={className} />;
case ExpressionStatus.INCALCULABLE:
return <IconStatusIncalculable size={size} className={className} />;
case ExpressionStatus.INCORRECT:
case ExpressionStatus.UNDEFINED:
return <IconStatusError size={size} className={className} />;
}
}
/** Icon for relocation direction. */
export function RelocateUpIcon({ value, size = '1.25rem', className }: DomIconProps<boolean>) {
if (value) {
return <IconMoveUp size={size} className={className ?? 'text-sec-600'} />;
} else {
return <IconMoveDown size={size} className={className ?? 'text-sec-600'} />;
}
}

View File

@ -155,6 +155,10 @@ export { LuCircleDashed as IconAnimation } from 'react-icons/lu';
export { LuCircle as IconAnimationOff } from 'react-icons/lu';
// ===== Custom elements ======
export interface DomIconProps<RequestData> extends IconProps {
value: RequestData;
}
interface IconSVGProps {
viewBox: string;
size?: string;

View File

@ -2,7 +2,8 @@
import clsx from 'clsx';
import { BadgeHelp, type HelpTopic } from '@/features/help';
import { type HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { useEscapeKey } from '@/hooks/useEscapeKey';
import { useDialogsStore } from '@/stores/dialogs';
@ -130,7 +131,7 @@ export function ModalForm({
{children}
</div>
<div className='z-modalControls my-2 flex gap-12 justify-center text-sm'>
<div className='z-modal-controls my-2 flex gap-12 justify-center text-sm'>
<SubmitButton
autoFocus
text={submitText}

View File

@ -2,7 +2,7 @@
import clsx from 'clsx';
import { BadgeHelp } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { useEscapeKey } from '@/hooks/useEscapeKey';
import { useDialogsStore } from '@/stores/dialogs';
@ -75,7 +75,7 @@ export function ModalView({
{children}
</div>
<div className='z-modalControls my-2 flex gap-12 justify-center text-sm'>
<div className='z-modal-controls my-2 flex gap-12 justify-center text-sm'>
<Button text='Закрыть' className='min-w-[7rem]' onClick={hideDialog} />
</div>
</div>

View File

@ -0,0 +1,2 @@
export { ExpectedAnonymous } from './ExpectedAnonymous';
export { RequireAuth } from './RequireAuth';

View File

@ -1,5 +1,2 @@
export * from './backend/types';
export { useAuthSuspense } from './backend/useAuth';
export { useChangePassword } from './backend/useChangePassword';
export { useLogout } from './backend/useLogout';
export { ExpectedAnonymous } from './components/ExpectedAnonymous';
export { RequireAuth } from './components/RequireAuth';

View File

@ -1,8 +1,8 @@
import clsx from 'clsx';
import { CstClass } from '@/features/rsform';
import { colorBgCstClass } from '@/features/rsform/colors';
import { describeCstClass, labelCstClass } from '@/features/rsform/labels';
import { CstClass } from '@/features/rsform/models/rsform';
import { prefixes } from '@/utils/constants';

View File

@ -1,8 +1,8 @@
import clsx from 'clsx';
import { ExpressionStatus } from '@/features/rsform';
import { colorBgCstStatus } from '@/features/rsform/colors';
import { describeExpressionStatus, labelExpressionStatus } from '@/features/rsform/labels';
import { ExpressionStatus } from '@/features/rsform/models/rsform';
import { prefixes } from '@/utils/constants';

View File

@ -0,0 +1 @@
export { BadgeHelp } from './BadgeHelp';

View File

@ -1,2 +1 @@
export { BadgeHelp } from './components/BadgeHelp';
export { HelpTopic } from './models/helpTopic';

View File

@ -5,7 +5,7 @@ import {
type IVersionCreatedResponse,
schemaRSForm,
schemaVersionCreatedResponse
} from '@/features/rsform/backend/types';
} from '@/features/rsform';
import { axiosDelete, axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport';
import { DELAYS, KEYS } from '@/backend/configuration';

View File

@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type IOperationSchemaDTO } from '@/features/oss/backend/types';
import { type IRSFormDTO } from '@/features/rsform/backend/types';
import { type IOperationSchemaDTO } from '@/features/oss';
import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration';

View File

@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type IOperationSchemaDTO } from '@/features/oss/backend/types';
import { type IRSFormDTO } from '@/features/rsform/backend/types';
import { type IOperationSchemaDTO } from '@/features/oss';
import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration';

View File

@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type IOperationSchemaDTO } from '@/features/oss/backend/types';
import { type IRSFormDTO } from '@/features/rsform/backend/types';
import { type IOperationSchemaDTO } from '@/features/oss';
import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration';

View File

@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type IOperationSchemaDTO } from '@/features/oss/backend/types';
import { type IRSFormDTO } from '@/features/rsform/backend/types';
import { type IOperationSchemaDTO } from '@/features/oss';
import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration';

View File

@ -1,7 +1,7 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type IOperationSchemaDTO } from '@/features/oss/backend/types';
import { type IRSFormDTO } from '@/features/rsform/backend/types';
import { type IOperationSchemaDTO } from '@/features/oss';
import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type IRSFormDTO } from '@/features/rsform/backend/types';
import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type IRSFormDTO } from '@/features/rsform/backend/types';
import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,7 @@
import { LocationIcon } from '@/components/DomainIcons';
import { globalIDs } from '@/utils/constants';
import { IconLocationHead } from './IconLocationHead';
interface BadgeLocationProps {
/** Location to display. */
location: string;
@ -12,7 +13,7 @@ interface BadgeLocationProps {
export function BadgeLocation({ location }: BadgeLocationProps) {
return (
<div className='pl-2' data-tooltip-id={globalIDs.tooltip} data-tooltip-content={location}>
<LocationIcon value={location} size='1.25rem' />
<IconLocationHead value={location} size='1.25rem' />
</div>
);
}

View File

@ -2,7 +2,8 @@ import { Suspense } from 'react';
import { useIntl } from 'react-intl';
import { urls, useConceptNavigation } from '@/app';
import { InfoUsers, SelectUser, useLabelUser, useRoleStore, UserRole } from '@/features/users';
import { useLabelUser, useRoleStore, UserRole } from '@/features/users';
import { InfoUsers, SelectUser } from '@/features/users/components';
import { Overlay, Tooltip } from '@/components/Container';
import { MiniButton } from '@/components/Control';

View File

@ -0,0 +1,15 @@
import { type DomIconProps, IconPrivate, IconProtected, IconPublic } from '@/components/Icons';
import { AccessPolicy } from '../backend/types';
/** Icon for access policy. */
export function IconAccessPolicy({ value, size = '1.25rem', className }: DomIconProps<AccessPolicy>) {
switch (value) {
case AccessPolicy.PRIVATE:
return <IconPrivate size={size} className={className ?? 'text-warn-600'} />;
case AccessPolicy.PROTECTED:
return <IconProtected size={size} className={className ?? 'text-sec-600'} />;
case AccessPolicy.PUBLIC:
return <IconPublic size={size} className={className ?? 'text-ok-600'} />;
}
}

View File

@ -0,0 +1,10 @@
import { type DomIconProps, IconHide, IconShow } from '@/components/Icons';
/** Icon for visibility. */
export function IconItemVisibility({ value, size = '1.25rem', className }: DomIconProps<boolean>) {
if (value) {
return <IconShow size={size} className={className ?? 'text-ok-600'} />;
} else {
return <IconHide size={size} className={className ?? 'text-warn-600'} />;
}
}

View File

@ -0,0 +1,13 @@
import { type DomIconProps, IconOSS, IconRSForm } from '@/components/Icons';
import { LibraryItemType } from '../backend/types';
/** Icon for library item type. */
export function IconLibraryItemType({ value, size = '1.25rem', className }: DomIconProps<LibraryItemType>) {
switch (value) {
case LibraryItemType.RSFORM:
return <IconRSForm size={size} className={className ?? 'text-sec-600'} />;
case LibraryItemType.OSS:
return <IconOSS size={size} className={className ?? 'text-ok-600'} />;
}
}

View File

@ -0,0 +1,17 @@
import { type DomIconProps, IconBusiness, IconPublic, IconTemplates, IconUser } from '@/components/Icons';
import { LocationHead } from '../models/library';
/** Icon for location. */
export function IconLocationHead({ value, size = '1.25rem', className }: DomIconProps<string>) {
switch (value.substring(0, 2) as LocationHead) {
case LocationHead.COMMON:
return <IconPublic size={size} className={className ?? 'text-sec-600'} />;
case LocationHead.LIBRARY:
return <IconTemplates size={size} className={className ?? 'text-warn-600'} />;
case LocationHead.PROJECTS:
return <IconBusiness size={size} className={className ?? 'text-sec-600'} />;
case LocationHead.USER:
return <IconUser size={size} className={className ?? 'text-ok-600'} />;
}
}

View File

@ -0,0 +1,10 @@
import { type DomIconProps, IconSubfolders } from '@/components/Icons';
/** Icon for subfolders. */
export function IconShowSubfolders({ value, size = '1.25rem', className }: DomIconProps<boolean>) {
if (value) {
return <IconSubfolders size={size} className={className ?? 'text-ok-600'} />;
} else {
return <IconSubfolders size={size} className={className ?? 'text-sec-600'} />;
}
}

View File

@ -1,15 +1,15 @@
'use client';
import { MiniButton } from '@/components/Control';
import { type DomIconProps } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { IconPrivate, IconProtected, IconPublic } from '@/components/Icons';
import { type Styling } from '@/components/props';
import { prefixes } from '@/utils/constants';
import { AccessPolicy } from '../backend/types';
import { describeAccessPolicy, labelAccessPolicy } from '../labels';
import { IconAccessPolicy } from './IconAccessPolicy';
interface SelectAccessPolicyProps extends Styling {
value: AccessPolicy;
onChange: (value: AccessPolicy) => void;
@ -34,7 +34,7 @@ export function SelectAccessPolicy({ value, disabled, stretchLeft, onChange, ...
title={`Доступ: ${labelAccessPolicy(value)}`}
hideTitle={menu.isOpen}
className='h-full'
icon={<PolicyIcon value={value} size='1.25rem' />}
icon={<IconAccessPolicy value={value} size='1.25rem' />}
onClick={menu.toggle}
disabled={disabled}
/>
@ -44,7 +44,7 @@ export function SelectAccessPolicy({ value, disabled, stretchLeft, onChange, ...
key={`${prefixes.policy_list}${index}`}
text={labelAccessPolicy(item)}
title={describeAccessPolicy(item)}
icon={<PolicyIcon value={item} size='1rem' />}
icon={<IconAccessPolicy value={item} size='1rem' />}
onClick={() => handleChange(item)}
/>
))}
@ -52,15 +52,3 @@ export function SelectAccessPolicy({ value, disabled, stretchLeft, onChange, ...
</div>
);
}
/** Icon for access policy. */
function PolicyIcon({ value, size = '1.25rem', className }: DomIconProps<AccessPolicy>) {
switch (value) {
case AccessPolicy.PRIVATE:
return <IconPrivate size={size} className={className ?? 'text-warn-600'} />;
case AccessPolicy.PROTECTED:
return <IconProtected size={size} className={className ?? 'text-sec-600'} />;
case AccessPolicy.PUBLIC:
return <IconPublic size={size} className={className ?? 'text-ok-600'} />;
}
}

View File

@ -1,15 +1,15 @@
'use client';
import { SelectorButton } from '@/components/Control';
import { type DomIconProps } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { IconOSS, IconRSForm } from '@/components/Icons';
import { type Styling } from '@/components/props';
import { prefixes } from '@/utils/constants';
import { LibraryItemType } from '../backend/types';
import { describeLibraryItemType, labelLibraryItemType } from '../labels';
import { IconLibraryItemType } from './IconLibraryItemType';
interface SelectItemTypeProps extends Styling {
value: LibraryItemType;
onChange: (value: LibraryItemType) => void;
@ -34,7 +34,7 @@ export function SelectItemType({ value, disabled, stretchLeft, onChange, ...rest
title={describeLibraryItemType(value)}
hideTitle={menu.isOpen}
className='h-full px-2 py-1 rounded-lg'
icon={<ItemTypeIcon value={value} size='1.25rem' />}
icon={<IconLibraryItemType value={value} size='1.25rem' />}
text={labelLibraryItemType(value)}
onClick={menu.toggle}
disabled={disabled}
@ -45,7 +45,7 @@ export function SelectItemType({ value, disabled, stretchLeft, onChange, ...rest
key={`${prefixes.policy_list}${index}`}
text={labelLibraryItemType(item)}
title={describeLibraryItemType(item)}
icon={<ItemTypeIcon value={item} size='1rem' />}
icon={<IconLibraryItemType value={item} size='1rem' />}
onClick={() => handleChange(item)}
/>
))}
@ -53,13 +53,3 @@ export function SelectItemType({ value, disabled, stretchLeft, onChange, ...rest
</div>
);
}
/** Icon for library item type. */
function ItemTypeIcon({ value, size = '1.25rem', className }: DomIconProps<LibraryItemType>) {
switch (value) {
case LibraryItemType.RSFORM:
return <IconRSForm size={size} className={className ?? 'text-sec-600'} />;
case LibraryItemType.OSS:
return <IconOSS size={size} className={className ?? 'text-ok-600'} />;
}
}

View File

@ -3,7 +3,6 @@
import clsx from 'clsx';
import { SelectorButton } from '@/components/Control';
import { LocationIcon } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { type Styling } from '@/components/props';
import { prefixes } from '@/utils/constants';
@ -11,6 +10,8 @@ import { prefixes } from '@/utils/constants';
import { describeLocationHead, labelLocationHead } from '../labels';
import { LocationHead } from '../models/library';
import { IconLocationHead } from './IconLocationHead';
interface SelectLocationHeadProps extends Styling {
value: LocationHead;
onChange: (newValue: LocationHead) => void;
@ -39,7 +40,7 @@ export function SelectLocationHead({
title={describeLocationHead(value)}
hideTitle={menu.isOpen}
className='h-full'
icon={<LocationIcon value={value} size='1rem' />}
icon={<IconLocationHead value={value} size='1rem' />}
text={labelLocationHead(value)}
onClick={menu.toggle}
/>
@ -56,7 +57,7 @@ export function SelectLocationHead({
title={describeLocationHead(head)}
>
<div className='inline-flex items-center gap-3'>
<LocationIcon value={head} size='1rem' />
<IconLocationHead value={head} size='1rem' />
{labelLocationHead(head)}
</div>
</DropdownButton>

View File

@ -1,9 +1,9 @@
import { BadgeHelp, HelpTopic } from '@/features/help';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { useRoleStore, UserRole } from '@/features/users';
import { Overlay } from '@/components/Container';
import { MiniButton } from '@/components/Control';
import { VisibilityIcon } from '@/components/DomainIcons';
import { IconImmutable, IconMutable } from '@/components/Icons';
import { Label } from '@/components/Input';
import { PARAMETER } from '@/utils/constants';
@ -12,6 +12,7 @@ import { type AccessPolicy, type ILibraryItem } from '../backend/types';
import { useMutatingLibrary } from '../backend/useMutatingLibrary';
import { useSetAccessPolicy } from '../backend/useSetAccessPolicy';
import { IconItemVisibility } from './IconItemVisibility';
import { SelectAccessPolicy } from './SelectAccessPolicy';
interface ToolbarItemAccessProps {
@ -52,7 +53,7 @@ export function ToolbarItemAccess({
<MiniButton
title={visible ? 'Библиотека: отображать' : 'Библиотека: скрывать'}
icon={<VisibilityIcon value={visible} />}
icon={<IconItemVisibility value={visible} />}
onClick={toggleVisible}
disabled={role === UserRole.READER || isProcessing}
/>

View File

@ -0,0 +1,7 @@
export { EditorLibraryItem } from './EditorLibraryItem';
export { MenuRole } from './MenuRole';
export { MiniSelectorOSS } from './MiniSelectorOSS';
export { PickSchema } from './PickSchema';
export { SelectLibraryItem } from './SelectLibraryItem';
export { SelectVersion } from './SelectVersion';
export { ToolbarItemAccess } from './ToolbarItemAccess';

View File

@ -8,13 +8,13 @@ import { urls, useConceptNavigation } from '@/app';
import { useAuthSuspense } from '@/features/auth';
import { MiniButton } from '@/components/Control';
import { VisibilityIcon } from '@/components/DomainIcons';
import { Checkbox, Label, TextArea, TextInput } from '@/components/Input';
import { ModalForm } from '@/components/Modal';
import { useDialogsStore } from '@/stores/dialogs';
import { AccessPolicy, type ICloneLibraryItemDTO, type ILibraryItem, schemaCloneLibraryItem } from '../backend/types';
import { useCloneItem } from '../backend/useCloneItem';
import { IconItemVisibility } from '../components/IconItemVisibility';
import { SelectAccessPolicy } from '../components/SelectAccessPolicy';
import { SelectLocationContext } from '../components/SelectLocationContext';
import { SelectLocationHead } from '../components/SelectLocationHead';
@ -105,7 +105,7 @@ export function DlgCloneLibraryItem() {
render={({ field }) => (
<MiniButton
title={field.value ? 'Библиотека: отображать' : 'Библиотека: скрывать'}
icon={<VisibilityIcon value={field.value} />}
icon={<IconItemVisibility value={field.value} />}
onClick={() => field.onChange(!field.value)}
/>
)}

View File

@ -3,7 +3,8 @@
import { useState } from 'react';
import clsx from 'clsx';
import { SelectUser, TableUsers, useUsers } from '@/features/users';
import { useUsers } from '@/features/users';
import { SelectUser, TableUsers } from '@/features/users/components';
import { MiniButton } from '@/components/Control';
import { IconRemove } from '@/components/Icons';

View File

@ -5,7 +5,7 @@ import { useMemo } from 'react';
import { useForm, useWatch } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { useRSFormSuspense } from '@/features/rsform';
import { useRSFormSuspense } from '@/features/rsform/backend/useRSForm';
import { MiniButton } from '@/components/Control';
import { IconReset, IconSave } from '@/components/Icons';

View File

@ -1,17 +1,13 @@
export { AccessPolicy, type ILibraryItem, type IVersionInfo, LibraryItemType } from './backend/types';
export { useDeleteItem } from './backend/useDeleteItem';
export { useLibrary, useLibrarySuspense } from './backend/useLibrary';
export { useMutatingLibrary } from './backend/useMutatingLibrary';
export { useTemplatesSuspense } from './backend/useTemplates';
export { useUpdateItem } from './backend/useUpdateItem';
export { useUpdateTimestamp } from './backend/useUpdateTimestamp';
export { useVersionRestore } from './backend/useVersionRestore';
export { EditorLibraryItem } from './components/EditorLibraryItem';
export { MenuRole } from './components/MenuRole';
export { MiniSelectorOSS } from './components/MiniSelectorOSS';
export { PickSchema } from './components/PickSchema';
export { SelectLibraryItem } from './components/SelectLibraryItem';
export { SelectVersion } from './components/SelectVersion';
export { ToolbarItemAccess } from './components/ToolbarItemAccess';
export { type ILibraryItemReference } from './models/library';
export {
AccessPolicy,
type ILibraryItem,
type ILibraryItemData,
type IUpdateLibraryItemDTO,
type IVersionInfo,
LibraryItemType,
schemaLibraryItem,
schemaUpdateLibraryItem,
schemaVersionInfo
} from './backend/types';
export { BASIC_SCHEMAS, type CurrentVersion, type ILibraryItemReference, LocationHead } from './models/library';
export { useLibrarySearchStore } from './stores/librarySearch';

View File

@ -1,4 +1,4 @@
import { RequireAuth } from '@/features/auth';
import { RequireAuth } from '@/features/auth/components';
import { FormCreateItem } from './FormCreateItem';

View File

@ -10,7 +10,6 @@ import { useAuthSuspense } from '@/features/auth';
import { Overlay } from '@/components/Container';
import { Button, MiniButton, SubmitButton } from '@/components/Control';
import { VisibilityIcon } from '@/components/DomainIcons';
import { IconDownload } from '@/components/Icons';
import { InfoError } from '@/components/InfoError';
import { Label, TextArea, TextInput } from '@/components/Input';
@ -23,6 +22,7 @@ import {
schemaCreateLibraryItem
} from '../../backend/types';
import { useCreateItem } from '../../backend/useCreateItem';
import { IconItemVisibility } from '../../components/IconItemVisibility';
import { SelectAccessPolicy } from '../../components/SelectAccessPolicy';
import { SelectItemType } from '../../components/SelectItemType';
import { SelectLocationContext } from '../../components/SelectLocationContext';
@ -188,7 +188,7 @@ export function FormCreateItem() {
render={({ field }) => (
<MiniButton
title={field.value ? 'Библиотека: отображать' : 'Библиотека: скрывать'}
icon={<VisibilityIcon value={field.value} />}
icon={<IconItemVisibility value={field.value} />}
onClick={() => field.onChange(!field.value)}
/>
)}

View File

@ -2,10 +2,9 @@
import clsx from 'clsx';
import { SelectUser } from '@/features/users';
import { SelectUser } from '@/features/users/components';
import { MiniButton, SelectorButton } from '@/components/Control';
import { LocationIcon, VisibilityIcon } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import {
IconEditor,
@ -20,6 +19,8 @@ import { SearchBar } from '@/components/Input';
import { prefixes } from '@/utils/constants';
import { tripleToggleColor } from '@/utils/utils';
import { IconItemVisibility } from '../../components/IconItemVisibility';
import { IconLocationHead } from '../../components/IconLocationHead';
import { describeLocationHead, labelLocationHead } from '../../labels';
import { LocationHead } from '../../models/library';
import { useHasCustomFilter, useLibrarySearchStore } from '../../stores/librarySearch';
@ -98,7 +99,7 @@ export function ToolbarSearch({ total, filtered }: ToolbarSearchProps) {
<div className='cc-icons'>
<MiniButton
title='Видимость'
icon={<VisibilityIcon value={true} className={tripleToggleColor(isVisible)} />}
icon={<IconItemVisibility value={true} className={tripleToggleColor(isVisible)} />}
onClick={toggleVisible}
/>
@ -156,7 +157,7 @@ export function ToolbarSearch({ total, filtered }: ToolbarSearchProps) {
hideTitle={headMenu.isOpen}
icon={
head ? (
<LocationIcon value={head} size='1.25rem' />
<IconLocationHead value={head} size='1.25rem' />
) : (
<IconFolderSearch size='1.25rem' className='clr-text-controls' />
)
@ -187,7 +188,7 @@ export function ToolbarSearch({ total, filtered }: ToolbarSearchProps) {
title={describeLocationHead(head)}
>
<div className='inline-flex items-center gap-3'>
<LocationIcon value={head} size='1rem' />
<IconLocationHead value={head} size='1rem' />
{labelLocationHead(head)}
</div>
</DropdownButton>

View File

@ -2,10 +2,10 @@ import { toast } from 'react-toastify';
import clsx from 'clsx';
import { useAuthSuspense } from '@/features/auth';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { MiniButton } from '@/components/Control';
import { SubfoldersIcon } from '@/components/DomainIcons';
import { IconFolderEdit, IconFolderTree } from '@/components/Icons';
import { useWindowSize } from '@/hooks/useWindowSize';
import { useFitHeight } from '@/stores/appLayout';
@ -13,6 +13,7 @@ import { PARAMETER, prefixes } from '@/utils/constants';
import { infoMsg } from '@/utils/labels';
import { useLibrary } from '../../backend/useLibrary';
import { IconShowSubfolders } from '../../components/IconShowSubfolders';
import { SelectLocation } from '../../components/SelectLocation';
import { type FolderNode } from '../../models/FolderTree';
import { useLibrarySearchStore } from '../../stores/librarySearch';
@ -90,7 +91,7 @@ export function ViewSideLocation({ isVisible, onRenameLocation }: ViewSideLocati
{!!location ? (
<MiniButton
title={subfolders ? 'Вложенные папки: Вкл' : 'Вложенные папки: Выкл'} // prettier: split-lines
icon={<SubfoldersIcon value={subfolders} />}
icon={<IconShowSubfolders value={subfolders} />}
onClick={toggleSubfolders}
/>
) : null}

View File

@ -2,7 +2,7 @@
* Module: OSS data loading and processing.
*/
import { type ILibraryItem } from '@/features/library/backend/types';
import { type ILibraryItem } from '@/features/library';
import { Graph } from '@/models/Graph';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type ILibraryItem } from '@/features/library/backend/types';
import { type ILibraryItem } from '@/features/library';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -0,0 +1,10 @@
import { type DomIconProps, IconMoveDown, IconMoveUp } from '@/components/Icons';
/** Icon for relocation direction. */
export function IconRelocationUp({ value, size = '1.25rem', className }: DomIconProps<boolean>) {
if (value) {
return <IconMoveUp size={size} className={className ?? 'text-sec-600'} />;
} else {
return <IconMoveDown size={size} className={className ?? 'text-sec-600'} />;
}
}

View File

@ -4,7 +4,9 @@ import { Controller, useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import clsx from 'clsx';
import { type ILibraryItem, LibraryItemType, PickSchema, useLibrary } from '@/features/library';
import { type ILibraryItem, LibraryItemType } from '@/features/library';
import { useLibrary } from '@/features/library/backend/useLibrary';
import { PickSchema } from '@/features/library/components';
import { MiniButton } from '@/components/Control';
import { IconReset } from '@/components/Icons';

View File

@ -2,7 +2,9 @@
import { Controller, useFormContext, useWatch } from 'react-hook-form';
import { type ILibraryItem, LibraryItemType, PickSchema, useLibrary } from '@/features/library';
import { type ILibraryItem, LibraryItemType } from '@/features/library';
import { useLibrary } from '@/features/library/backend/useLibrary';
import { PickSchema } from '@/features/library/components';
import { MiniButton } from '@/components/Control';
import { IconReset } from '@/components/Icons';

View File

@ -2,7 +2,8 @@
import { Controller, useFormContext, useWatch } from 'react-hook-form';
import { PickSubstitutions, useRSForms } from '@/features/rsform';
import { useRSForms } from '@/features/rsform/backend/useRSForms';
import { PickSubstitutions } from '@/features/rsform/components';
import { TextArea } from '@/components/Input';
import { useDialogsStore } from '@/stores/dialogs';

View File

@ -6,11 +6,13 @@ import { zodResolver } from '@hookform/resolvers/zod';
import clsx from 'clsx';
import { HelpTopic } from '@/features/help';
import { type ILibraryItem, SelectLibraryItem, useLibrary } from '@/features/library';
import { PickMultiConstituenta, useRSForm } from '@/features/rsform';
import { type ILibraryItem } from '@/features/library';
import { useLibrary } from '@/features/library/backend/useLibrary';
import { SelectLibraryItem } from '@/features/library/components';
import { useRSForm } from '@/features/rsform/backend/useRSForm';
import { PickMultiConstituenta } from '@/features/rsform/components';
import { MiniButton } from '@/components/Control';
import { RelocateUpIcon } from '@/components/DomainIcons';
import { Loader } from '@/components/Loader';
import { ModalForm } from '@/components/Modal';
import { useDialogsStore } from '@/stores/dialogs';
@ -18,6 +20,7 @@ import { useDialogsStore } from '@/stores/dialogs';
import { type ICstRelocateDTO, type IOperationPosition, schemaCstRelocate } from '../backend/types';
import { useRelocateConstituents } from '../backend/useRelocateConstituents';
import { useUpdatePositions } from '../backend/useUpdatePositions';
import { IconRelocationUp } from '../components/IconRelocationUp';
import { type IOperation, type IOperationSchema } from '../models/oss';
import { getRelocateCandidates } from '../models/ossAPI';
@ -132,7 +135,7 @@ export function DlgRelocateConstituents() {
/>
<MiniButton
title='Направление перемещения'
icon={<RelocateUpIcon value={directionUp} />}
icon={<IconRelocationUp value={directionUp} />}
onClick={toggleDirection}
/>
<SelectLibraryItem

View File

@ -1 +1,2 @@
export { useFindPredecessor } from './backend/useFindPredecessor';
export { type IOperationSchemaDTO } from './backend/types';
export { type IOperation } from './models/oss';

View File

@ -2,10 +2,16 @@
* Module: API for OperationSystem.
*/
import { type ILibraryItem } from '@/features/library/backend/types';
import { CstType, type ICstSubstitute, ParsingStatus } from '@/features/rsform/backend/types';
import { CstClass, type IConstituenta, type IRSForm } from '@/features/rsform/models/rsform';
import { type AliasMapping } from '@/features/rsform/models/rslang';
import { type ILibraryItem } from '@/features/library';
import {
type AliasMapping,
CstClass,
CstType,
type IConstituenta,
type ICstSubstitute,
type IRSForm,
ParsingStatus
} from '@/features/rsform';
import {
applyAliasMapping,
applyTypificationMapping,

View File

@ -2,8 +2,8 @@
import clsx from 'clsx';
import { EditorLibraryItem } from '@/features/library';
import { ToolbarRSFormCard } from '@/features/rsform';
import { EditorLibraryItem } from '@/features/library/components';
import { ToolbarRSFormCard } from '@/features/rsform/components';
import { FlexColumn } from '@/components/Container';
import { useModificationStore } from '@/stores/modification';

View File

@ -6,8 +6,9 @@ import { useForm, useWatch } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import clsx from 'clsx';
import { LibraryItemType, ToolbarItemAccess, useUpdateItem } from '@/features/library';
import { type IUpdateLibraryItemDTO, schemaUpdateLibraryItem } from '@/features/library/backend/types';
import { type IUpdateLibraryItemDTO, LibraryItemType, schemaUpdateLibraryItem } from '@/features/library';
import { useUpdateItem } from '@/features/library/backend/useUpdateItem';
import { ToolbarItemAccess } from '@/features/library/components';
import { SubmitButton } from '@/components/Control';
import { IconSave } from '@/components/Icons';

View File

@ -13,7 +13,7 @@ import {
} from 'reactflow';
import { urls, useConceptNavigation } from '@/app';
import { useLibrary } from '@/features/library';
import { useLibrary } from '@/features/library/backend/useLibrary';
import { Overlay } from '@/components/Container';
import { useMainHeight } from '@/stores/appLayout';

View File

@ -2,7 +2,8 @@
import clsx from 'clsx';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { MiniButton } from '@/components/Control';
import {

View File

@ -1,7 +1,7 @@
'use client';
import { useAuthSuspense } from '@/features/auth';
import { MenuRole } from '@/features/library';
import { MenuRole } from '@/features/library/components';
import { MenuEditOss } from './MenuEditOss';
import { MenuMain } from './MenuMain';

View File

@ -4,7 +4,8 @@ import { createContext, useContext, useEffect, useState } from 'react';
import { urls, useConceptNavigation } from '@/app';
import { useAuthSuspense } from '@/features/auth';
import { useDeleteItem, useLibrarySearchStore } from '@/features/library';
import { useLibrarySearchStore } from '@/features/library';
import { useDeleteItem } from '@/features/library/backend/useDeleteItem';
import { RSTabID } from '@/features/rsform/pages/RSFormPage/RSEditContext';
import { useRoleStore, UserRole } from '@/features/users';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library';
import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { type ILibraryItem } from '@/features/library/backend/types';
import { type ILibraryItem } from '@/features/library';
import { KEYS } from '@/backend/configuration';

View File

@ -0,0 +1,19 @@
import { type DomIconProps, IconAlias, IconFilter, IconFormula, IconTerm, IconText } from '@/components/Icons';
import { CstMatchMode } from '../stores/cstSearch';
/** Icon for constituenta match mode. */
export function IconCstMatchMode({ value, size = '1.25rem', className }: DomIconProps<CstMatchMode>) {
switch (value) {
case CstMatchMode.ALL:
return <IconFilter size={size} className={className} />;
case CstMatchMode.TEXT:
return <IconText size={size} className={className ?? 'text-sec-600'} />;
case CstMatchMode.EXPR:
return <IconFormula size={size} className={className ?? 'text-sec-600'} />;
case CstMatchMode.TERM:
return <IconTerm size={size} className={className ?? 'text-sec-600'} />;
case CstMatchMode.NAME:
return <IconAlias size={size} className={className ?? 'text-sec-600'} />;
}
}

View File

@ -0,0 +1,35 @@
import { type DomIconProps } from '@/components/Icons';
import {
IconCstAxiom,
IconCstBaseSet,
IconCstConstSet,
IconCstFunction,
IconCstPredicate,
IconCstStructured,
IconCstTerm,
IconCstTheorem
} from '@/components/Icons';
import { CstType } from '../backend/types';
/** Icon for constituenta type. */
export function IconCstType({ value, size = '1.25rem', className }: DomIconProps<CstType>) {
switch (value) {
case CstType.BASE:
return <IconCstBaseSet size={size} className={className ?? 'text-ok-600'} />;
case CstType.CONSTANT:
return <IconCstConstSet size={size} className={className ?? 'text-ok-600'} />;
case CstType.STRUCTURED:
return <IconCstStructured size={size} className={className ?? 'text-ok-600'} />;
case CstType.TERM:
return <IconCstTerm size={size} className={className ?? 'text-sec-600'} />;
case CstType.AXIOM:
return <IconCstAxiom size={size} className={className ?? 'text-warn-600'} />;
case CstType.FUNCTION:
return <IconCstFunction size={size} className={className ?? 'text-sec-600'} />;
case CstType.PREDICATE:
return <IconCstPredicate size={size} className={className ?? 'text-warn-600'} />;
case CstType.THEOREM:
return <IconCstTheorem size={size} className={className ?? 'text-warn-600'} />;
}
}

View File

@ -0,0 +1,26 @@
import {
type DomIconProps,
IconGraphCollapse,
IconGraphExpand,
IconGraphInputs,
IconGraphOutputs,
IconSettings
} from '@/components/Icons';
import { DependencyMode } from '../stores/cstSearch';
/** Icon for term graph dependency mode. */
export function IconDependencyMode({ value, size = '1.25rem', className }: DomIconProps<DependencyMode>) {
switch (value) {
case DependencyMode.ALL:
return <IconSettings size={size} className={className} />;
case DependencyMode.OUTPUTS:
return <IconGraphOutputs size={size} className={className ?? 'text-sec-600'} />;
case DependencyMode.INPUTS:
return <IconGraphInputs size={size} className={className ?? 'text-sec-600'} />;
case DependencyMode.EXPAND_OUTPUTS:
return <IconGraphExpand size={size} className={className ?? 'text-sec-600'} />;
case DependencyMode.EXPAND_INPUTS:
return <IconGraphCollapse size={size} className={className ?? 'text-sec-600'} />;
}
}

View File

@ -0,0 +1,26 @@
import {
type DomIconProps,
IconStatusError,
IconStatusIncalculable,
IconStatusOK,
IconStatusUnknown
} from '@/components/Icons';
import { ExpressionStatus } from '../models/rsform';
export function IconExpressionStatus({ value, size = '1.25rem', className }: DomIconProps<ExpressionStatus>) {
switch (value) {
case ExpressionStatus.VERIFIED:
case ExpressionStatus.PROPERTY:
return <IconStatusOK size={size} className={className} />;
case ExpressionStatus.UNKNOWN:
return <IconStatusUnknown size={size} className={className} />;
case ExpressionStatus.INCALCULABLE:
return <IconStatusIncalculable size={size} className={className} />;
case ExpressionStatus.INCORRECT:
case ExpressionStatus.UNDEFINED:
return <IconStatusError size={size} className={className} />;
}
}

View File

@ -4,7 +4,8 @@ import { useState } from 'react';
import { toast } from 'react-toastify';
import clsx from 'clsx';
import { type ILibraryItem, SelectLibraryItem } from '@/features/library';
import { type ILibraryItem } from '@/features/library';
import { SelectLibraryItem } from '@/features/library/components';
import { MiniButton } from '@/components/Control';
import { createColumnHelper, DataTable, type IConditionalStyle } from '@/components/DataTable';

View File

@ -1,9 +1,11 @@
'use client';
import { urls, useConceptNavigation } from '@/app';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { AccessPolicy, LibraryItemType, MiniSelectorOSS, useMutatingLibrary } from '@/features/library';
import { type ILibraryItem } from '@/features/library/backend/types';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { AccessPolicy, type ILibraryItem, LibraryItemType } from '@/features/library';
import { useMutatingLibrary } from '@/features/library/backend/useMutatingLibrary';
import { MiniSelectorOSS } from '@/features/library/components';
import { useRoleStore, UserRole } from '@/features/users';
import { Overlay } from '@/components/Container';

View File

@ -0,0 +1,3 @@
export { PickMultiConstituenta } from './PickMultiConstituenta';
export { PickSubstitutions } from './PickSubstitutions';
export { ToolbarRSFormCard } from './ToolbarRSFormCard';

View File

@ -4,7 +4,8 @@ import { useState } from 'react';
import { Controller, useFormContext, useWatch } from 'react-hook-form';
import clsx from 'clsx';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { TextArea, TextInput } from '@/components/Input';
import { PARAMETER } from '@/utils/constants';

View File

@ -1,6 +1,6 @@
'use client';
import { useTemplatesSuspense } from '@/features/library';
import { useTemplatesSuspense } from '@/features/library/backend/useTemplates';
import { SelectSingle, TextArea } from '@/components/Input';

View File

@ -2,7 +2,9 @@
import { useFormContext, useWatch } from 'react-hook-form';
import { LibraryItemType, PickSchema, useLibrary } from '@/features/library';
import { LibraryItemType } from '@/features/library';
import { useLibrary } from '@/features/library/backend/useLibrary';
import { PickSchema } from '@/features/library/components';
import { TextInput } from '@/components/Input';
import { useDialogsStore } from '@/stores/dialogs';

View File

@ -1,8 +1,12 @@
export { type ICstSubstitute } from './backend/types';
export { CstType } from './backend/types';
export { useRSForm, useRSFormSuspense } from './backend/useRSForm';
export { useRSForms } from './backend/useRSForms';
export { PickMultiConstituenta } from './components/PickMultiConstituenta';
export { PickSubstitutions } from './components/PickSubstitutions';
export { ToolbarRSFormCard } from './components/ToolbarRSFormCard';
export { CstClass, type IConstituenta, type IRSForm } from './models/rsform';
export {
CstType,
type ICstSubstitute,
type IRSFormDTO,
type IVersionCreatedResponse,
ParsingStatus,
schemaCstSubstitute,
schemaRSForm,
schemaVersionCreatedResponse
} from './backend/types';
export { CstClass, ExpressionStatus, type IConstituenta, type IRSForm } from './models/rsform';
export { type AliasMapping } from './models/rslang';

View File

@ -5,7 +5,7 @@
import { PARAMETER } from '@/utils/constants';
import { prepareTooltip } from '@/utils/utils';
import { type IVersionInfo } from '../library';
import { type IVersionInfo } from '../library/backend/types';
import { type CurrentVersion } from '../library/models/library';
import { CstType, type IRSErrorDescription, ParsingStatus, RSErrorType, TokenID } from './backend/types';

View File

@ -2,8 +2,7 @@
* Module: API for formal representation for systems of concepts.
*/
import { type ILibraryItem } from '@/features/library/backend/types';
import { BASIC_SCHEMAS } from '@/features/library/models/library';
import { BASIC_SCHEMAS, type ILibraryItem } from '@/features/library';
import { TextMatcher } from '@/utils/utils';

View File

@ -3,9 +3,10 @@
import clsx from 'clsx';
import { urls, useConceptNavigation } from '@/app';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { MiniSelectorOSS } from '@/features/library';
import { useFindPredecessor } from '@/features/oss';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { MiniSelectorOSS } from '@/features/library/components';
import { useFindPredecessor } from '@/features/oss/backend/useFindPredecessor';
import { Overlay } from '@/components/Container';
import { MiniButton } from '@/components/Control';

View File

@ -4,7 +4,8 @@ import { useEffect, useRef, useState } from 'react';
import { toast } from 'react-toastify';
import { type ReactCodeMirrorRef } from '@uiw/react-codemirror';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { Overlay } from '@/components/Container';
import { useDialogsStore } from '@/stores/dialogs';

View File

@ -2,7 +2,6 @@
import clsx from 'clsx';
import { StatusIcon } from '@/components/DomainIcons';
import { Loader } from '@/components/Loader';
import { APP_COLORS } from '@/styling/colors';
import { globalIDs } from '@/utils/constants';
@ -10,6 +9,7 @@ import { prepareTooltip } from '@/utils/utils';
import { type IExpressionParseDTO, ParsingStatus } from '../../../backend/types';
import { colorStatusBar } from '../../../colors';
import { IconExpressionStatus } from '../../../components/IconExpressionStatus';
import { labelExpressionStatus } from '../../../labels';
import { ExpressionStatus, type IConstituenta } from '../../../models/rsform';
import { inferStatus } from '../../../models/rsformAPI';
@ -59,7 +59,7 @@ export function StatusBar({ isModified, processing, activeCst, parseData, onAnal
) : null}
{!processing ? (
<div className='cc-fade-in flex items-center gap-2'>
<StatusIcon size='1rem' value={status} />
<IconExpressionStatus size='1rem' value={status} />
<span className='pb-[0.125rem] font-controls pr-2'>{labelExpressionStatus(status)}</span>
</div>
) : null}

View File

@ -2,7 +2,7 @@
import clsx from 'clsx';
import { EditorLibraryItem } from '@/features/library';
import { EditorLibraryItem } from '@/features/library/components';
import { FlexColumn } from '@/components/Container';
import { useModificationStore } from '@/stores/modification';

View File

@ -7,9 +7,14 @@ import { zodResolver } from '@hookform/resolvers/zod';
import clsx from 'clsx';
import { urls, useConceptNavigation } from '@/app';
import { LibraryItemType, SelectVersion, ToolbarItemAccess, useUpdateItem } from '@/features/library';
import { type IUpdateLibraryItemDTO, schemaUpdateLibraryItem } from '@/features/library/backend/types';
import { type CurrentVersion } from '@/features/library/models/library';
import {
type CurrentVersion,
type IUpdateLibraryItemDTO,
LibraryItemType,
schemaUpdateLibraryItem
} from '@/features/library';
import { useUpdateItem } from '@/features/library/backend/useUpdateItem';
import { SelectVersion, ToolbarItemAccess } from '@/features/library/components';
import { SubmitButton } from '@/components/Control';
import { IconSave } from '@/components/Icons';

View File

@ -1,7 +1,8 @@
'use client';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { useVersionRestore } from '@/features/library';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { useVersionRestore } from '@/features/library/backend/useVersionRestore';
import { Overlay } from '@/components/Container';
import { MiniButton } from '@/components/Control';

View File

@ -1,21 +1,13 @@
import { BadgeHelp, HelpTopic } from '@/features/help';
import { MiniSelectorOSS } from '@/features/library';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { MiniSelectorOSS } from '@/features/library/components';
import { CstType } from '@/features/rsform';
import { Overlay } from '@/components/Container';
import { MiniButton } from '@/components/Control';
import { type DomIconProps } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import {
IconClone,
IconCstAxiom,
IconCstBaseSet,
IconCstConstSet,
IconCstFunction,
IconCstPredicate,
IconCstStructured,
IconCstTerm,
IconCstTheorem,
IconDestroy,
IconMoveDown,
IconMoveUp,
@ -27,6 +19,7 @@ import { prefixes } from '@/utils/constants';
import { prepareTooltip } from '@/utils/utils';
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
import { IconCstType } from '../../../components/IconCstType';
import { getCstTypeShortcut, labelCstType } from '../../../labels';
import { useRSEdit } from '../RSEditContext';
@ -89,7 +82,7 @@ export function ToolbarRSList() {
<DropdownButton
key={`${prefixes.csttype_list}${typeStr}`}
text={labelCstType(typeStr as CstType)}
icon={<CstTypeIcon value={typeStr as CstType} size='1.25rem' />}
icon={<IconCstType value={typeStr as CstType} size='1.25rem' />}
onClick={() => createCst(typeStr as CstType, true)}
titleHtml={getCstTypeShortcut(typeStr as CstType)}
/>
@ -118,25 +111,3 @@ export function ToolbarRSList() {
</Overlay>
);
}
/** Icon for constituenta type. */
function CstTypeIcon({ value, size = '1.25rem', className }: DomIconProps<CstType>) {
switch (value) {
case CstType.BASE:
return <IconCstBaseSet size={size} className={className ?? 'text-ok-600'} />;
case CstType.CONSTANT:
return <IconCstConstSet size={size} className={className ?? 'text-ok-600'} />;
case CstType.STRUCTURED:
return <IconCstStructured size={size} className={className ?? 'text-ok-600'} />;
case CstType.TERM:
return <IconCstTerm size={size} className={className ?? 'text-sec-600'} />;
case CstType.AXIOM:
return <IconCstAxiom size={size} className={className ?? 'text-warn-600'} />;
case CstType.FUNCTION:
return <IconCstFunction size={size} className={className ?? 'text-sec-600'} />;
case CstType.PREDICATE:
return <IconCstPredicate size={size} className={className ?? 'text-warn-600'} />;
case CstType.THEOREM:
return <IconCstTheorem size={size} className={className ?? 'text-warn-600'} />;
}
}

View File

@ -1,4 +1,5 @@
import { BadgeHelp, HelpTopic } from '@/features/help';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { Overlay } from '@/components/Container';
import { SelectSingle } from '@/components/Input';

View File

@ -1,4 +1,4 @@
import { useLibrary } from '@/features/library';
import { useLibrary } from '@/features/library/backend/useLibrary';
import { Tooltip } from '@/components/Container';
import { IconHelp } from '@/components/Icons';

View File

@ -1,11 +1,10 @@
'use client';
import { useTermGraphStore } from '@/features/rsform/stores/termGraph';
import { MiniButton } from '@/components/Control';
import { IconGraphInputs, IconGraphOutputs, IconReset } from '@/components/Icons';
import { APP_COLORS } from '@/styling/colors';
import { useTermGraphStore } from '../../../stores/termGraph';
import { useRSEdit } from '../RSEditContext';
export function ToolbarFocusedCst() {

View File

@ -1,10 +1,9 @@
import { useReactFlow } from 'reactflow';
import clsx from 'clsx';
import { BadgeHelp, HelpTopic } from '@/features/help';
import { MiniSelectorOSS } from '@/features/library';
import { CstType } from '@/features/rsform/backend/types';
import { useTermGraphStore } from '@/features/rsform/stores/termGraph';
import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components';
import { MiniSelectorOSS } from '@/features/library/components';
import { MiniButton } from '@/components/Control';
import {
@ -21,7 +20,9 @@ import {
import { useDialogsStore } from '@/stores/dialogs';
import { PARAMETER } from '@/utils/constants';
import { CstType } from '../../../backend/types';
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
import { useTermGraphStore } from '../../../stores/termGraph';
import { useRSEdit } from '../RSEditContext';
import { VIEW_PADDING } from './TGFlow';

View File

@ -1,10 +1,10 @@
import { type Edge, type Node } from 'reactflow';
import dagre from '@dagrejs/dagre';
import { type IConstituenta } from '@/features/rsform/models/rsform';
import { PARAMETER } from '@/utils/constants';
import { type IConstituenta } from '../../../../models/rsform';
export function applyLayout(nodes: Node<IConstituenta>[], edges: Edge[], subLabels: boolean) {
const dagreGraph = new dagre.graphlib.Graph().setDefaultEdgeLabel(() => ({}));
dagreGraph.setGraph({

View File

@ -2,8 +2,7 @@ import fileDownload from 'js-file-download';
import { urls, useConceptNavigation } from '@/app';
import { useAuthSuspense } from '@/features/auth';
import { AccessPolicy } from '@/features/library';
import { LocationHead } from '@/features/library/models/library';
import { AccessPolicy, LocationHead } from '@/features/library';
import { useRoleStore, UserRole } from '@/features/users';
import { Divider } from '@/components/Container';

View File

@ -1,7 +1,7 @@
'use client';
import { useAuthSuspense } from '@/features/auth';
import { MenuRole } from '@/features/library';
import { MenuRole } from '@/features/library/components';
import { MenuEditSchema } from './MenuEditSchema';
import { MenuMain } from './MenuMain';

View File

@ -4,7 +4,8 @@ import { createContext, useContext, useEffect, useState } from 'react';
import { urls, useConceptNavigation } from '@/app';
import { useAuthSuspense } from '@/features/auth';
import { useDeleteItem, useLibrarySearchStore } from '@/features/library';
import { useLibrarySearchStore } from '@/features/library';
import { useDeleteItem } from '@/features/library/backend/useDeleteItem';
import { useRoleStore, UserRole } from '@/features/users';
import { useDialogsStore } from '@/stores/dialogs';

View File

@ -1,12 +1,12 @@
'use client';
import { SelectorButton } from '@/components/Control';
import { DependencyIcon } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { type Styling } from '@/components/props';
import { useWindowSize } from '@/hooks/useWindowSize';
import { prefixes } from '@/utils/constants';
import { IconDependencyMode } from '../../../components/IconDependencyMode';
import { describeCstSource, labelCstSource } from '../../../labels';
import { DependencyMode } from '../../../stores/cstSearch';
@ -33,7 +33,7 @@ export function SelectGraphFilter({ value, dense, onChange, ...restProps }: Sele
titleHtml='Настройка фильтрации <br/>по графу термов'
hideTitle={menu.isOpen}
className='h-full pr-2'
icon={<DependencyIcon value={value} size='1rem' />}
icon={<IconDependencyMode value={value} size='1rem' />}
text={!dense && !size.isSmall ? labelCstSource(value) : undefined}
onClick={menu.toggle}
/>
@ -49,7 +49,7 @@ export function SelectGraphFilter({ value, dense, onChange, ...restProps }: Sele
onClick={() => handleChange(source)}
>
<div className='inline-flex items-center gap-1'>
{<DependencyIcon value={source} size='1rem' />}
{<IconDependencyMode value={source} size='1rem' />}
{!dense ? (
<span>
<b>{labelCstSource(source)}:</b> {describeCstSource(source)}

View File

@ -1,12 +1,12 @@
'use client';
import { SelectorButton } from '@/components/Control';
import { MatchModeIcon } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { type Styling } from '@/components/props';
import { useWindowSize } from '@/hooks/useWindowSize';
import { prefixes } from '@/utils/constants';
import { IconCstMatchMode } from '../../../components/IconCstMatchMode';
import { describeCstMatchMode, labelCstMatchMode } from '../../../labels';
import { CstMatchMode } from '../../../stores/cstSearch';
@ -32,7 +32,7 @@ export function SelectMatchMode({ value, dense, onChange, ...restProps }: Select
titleHtml='Настройка фильтрации <br/>по проверяемым атрибутам'
hideTitle={menu.isOpen}
className='h-full pr-2'
icon={<MatchModeIcon value={value} size='1rem' />}
icon={<IconCstMatchMode value={value} size='1rem' />}
text={dense || size.isSmall ? undefined : labelCstMatchMode(value)}
onClick={menu.toggle}
/>
@ -48,7 +48,7 @@ export function SelectMatchMode({ value, dense, onChange, ...restProps }: Select
onClick={() => handleChange(matchMode)}
>
<div className='inline-flex items-center gap-1'>
{<MatchModeIcon value={matchMode} size='1rem' />}
{<IconCstMatchMode value={matchMode} size='1rem' />}
{!dense ? (
<span>
<b>{labelCstMatchMode(matchMode)}:</b> {describeCstMatchMode(matchMode)}

View File

@ -0,0 +1,3 @@
export { InfoUsers } from './InfoUsers';
export { SelectUser } from './SelectUser';
export { TableUsers } from './TableUsers';

View File

@ -1,6 +1,3 @@
export { useLabelUser } from './backend/useLabelUser';
export { useUsers } from './backend/useUsers';
export { InfoUsers } from './components/InfoUsers';
export { SelectUser } from './components/SelectUser';
export { TableUsers } from './components/TableUsers';
export { useRoleStore, UserRole } from './stores/role';

View File

@ -1,4 +1,5 @@
import { ExpectedAnonymous, useAuthSuspense } from '@/features/auth';
import { useAuthSuspense } from '@/features/auth';
import { ExpectedAnonymous } from '@/features/auth/components';
import { FormSignup } from './FormSignup';

Some files were not shown because too many files have changed in this diff Show More