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 { Dropdown, DropdownButton } from '@/components/Dropdown';
import { 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'; export { LuCircle as IconAnimationOff } from 'react-icons/lu';
// ===== Custom elements ====== // ===== Custom elements ======
export interface DomIconProps<RequestData> extends IconProps {
value: RequestData;
}
interface IconSVGProps { interface IconSVGProps {
viewBox: string; viewBox: string;
size?: string; size?: string;

View File

@ -2,7 +2,8 @@
import clsx from 'clsx'; 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 { useEscapeKey } from '@/hooks/useEscapeKey';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
@ -130,7 +131,7 @@ export function ModalForm({
{children} {children}
</div> </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 <SubmitButton
autoFocus autoFocus
text={submitText} text={submitText}

View File

@ -2,7 +2,7 @@
import clsx from 'clsx'; import clsx from 'clsx';
import { BadgeHelp } from '@/features/help'; import { BadgeHelp } from '@/features/help/components';
import { useEscapeKey } from '@/hooks/useEscapeKey'; import { useEscapeKey } from '@/hooks/useEscapeKey';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
@ -75,7 +75,7 @@ export function ModalView({
{children} {children}
</div> </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} /> <Button text='Закрыть' className='min-w-[7rem]' onClick={hideDialog} />
</div> </div>
</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 { 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 clsx from 'clsx';
import { CstClass } from '@/features/rsform';
import { colorBgCstClass } from '@/features/rsform/colors'; import { colorBgCstClass } from '@/features/rsform/colors';
import { describeCstClass, labelCstClass } from '@/features/rsform/labels'; import { describeCstClass, labelCstClass } from '@/features/rsform/labels';
import { CstClass } from '@/features/rsform/models/rsform';
import { prefixes } from '@/utils/constants'; import { prefixes } from '@/utils/constants';

View File

@ -1,8 +1,8 @@
import clsx from 'clsx'; import clsx from 'clsx';
import { ExpressionStatus } from '@/features/rsform';
import { colorBgCstStatus } from '@/features/rsform/colors'; import { colorBgCstStatus } from '@/features/rsform/colors';
import { describeExpressionStatus, labelExpressionStatus } from '@/features/rsform/labels'; import { describeExpressionStatus, labelExpressionStatus } from '@/features/rsform/labels';
import { ExpressionStatus } from '@/features/rsform/models/rsform';
import { prefixes } from '@/utils/constants'; 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'; export { HelpTopic } from './models/helpTopic';

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; 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'; import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; 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'; import { KEYS } from '@/backend/configuration';

View File

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

View File

@ -2,7 +2,8 @@ import { Suspense } from 'react';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import { urls, useConceptNavigation } from '@/app'; 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 { Overlay, Tooltip } from '@/components/Container';
import { MiniButton } from '@/components/Control'; 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'; 'use client';
import { MiniButton } from '@/components/Control'; import { MiniButton } from '@/components/Control';
import { type DomIconProps } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown'; import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { IconPrivate, IconProtected, IconPublic } from '@/components/Icons';
import { type Styling } from '@/components/props'; import { type Styling } from '@/components/props';
import { prefixes } from '@/utils/constants'; import { prefixes } from '@/utils/constants';
import { AccessPolicy } from '../backend/types'; import { AccessPolicy } from '../backend/types';
import { describeAccessPolicy, labelAccessPolicy } from '../labels'; import { describeAccessPolicy, labelAccessPolicy } from '../labels';
import { IconAccessPolicy } from './IconAccessPolicy';
interface SelectAccessPolicyProps extends Styling { interface SelectAccessPolicyProps extends Styling {
value: AccessPolicy; value: AccessPolicy;
onChange: (value: AccessPolicy) => void; onChange: (value: AccessPolicy) => void;
@ -34,7 +34,7 @@ export function SelectAccessPolicy({ value, disabled, stretchLeft, onChange, ...
title={`Доступ: ${labelAccessPolicy(value)}`} title={`Доступ: ${labelAccessPolicy(value)}`}
hideTitle={menu.isOpen} hideTitle={menu.isOpen}
className='h-full' className='h-full'
icon={<PolicyIcon value={value} size='1.25rem' />} icon={<IconAccessPolicy value={value} size='1.25rem' />}
onClick={menu.toggle} onClick={menu.toggle}
disabled={disabled} disabled={disabled}
/> />
@ -44,7 +44,7 @@ export function SelectAccessPolicy({ value, disabled, stretchLeft, onChange, ...
key={`${prefixes.policy_list}${index}`} key={`${prefixes.policy_list}${index}`}
text={labelAccessPolicy(item)} text={labelAccessPolicy(item)}
title={describeAccessPolicy(item)} title={describeAccessPolicy(item)}
icon={<PolicyIcon value={item} size='1rem' />} icon={<IconAccessPolicy value={item} size='1rem' />}
onClick={() => handleChange(item)} onClick={() => handleChange(item)}
/> />
))} ))}
@ -52,15 +52,3 @@ export function SelectAccessPolicy({ value, disabled, stretchLeft, onChange, ...
</div> </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'; 'use client';
import { SelectorButton } from '@/components/Control'; import { SelectorButton } from '@/components/Control';
import { type DomIconProps } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown'; import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { IconOSS, IconRSForm } from '@/components/Icons';
import { type Styling } from '@/components/props'; import { type Styling } from '@/components/props';
import { prefixes } from '@/utils/constants'; import { prefixes } from '@/utils/constants';
import { LibraryItemType } from '../backend/types'; import { LibraryItemType } from '../backend/types';
import { describeLibraryItemType, labelLibraryItemType } from '../labels'; import { describeLibraryItemType, labelLibraryItemType } from '../labels';
import { IconLibraryItemType } from './IconLibraryItemType';
interface SelectItemTypeProps extends Styling { interface SelectItemTypeProps extends Styling {
value: LibraryItemType; value: LibraryItemType;
onChange: (value: LibraryItemType) => void; onChange: (value: LibraryItemType) => void;
@ -34,7 +34,7 @@ export function SelectItemType({ value, disabled, stretchLeft, onChange, ...rest
title={describeLibraryItemType(value)} title={describeLibraryItemType(value)}
hideTitle={menu.isOpen} hideTitle={menu.isOpen}
className='h-full px-2 py-1 rounded-lg' 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)} text={labelLibraryItemType(value)}
onClick={menu.toggle} onClick={menu.toggle}
disabled={disabled} disabled={disabled}
@ -45,7 +45,7 @@ export function SelectItemType({ value, disabled, stretchLeft, onChange, ...rest
key={`${prefixes.policy_list}${index}`} key={`${prefixes.policy_list}${index}`}
text={labelLibraryItemType(item)} text={labelLibraryItemType(item)}
title={describeLibraryItemType(item)} title={describeLibraryItemType(item)}
icon={<ItemTypeIcon value={item} size='1rem' />} icon={<IconLibraryItemType value={item} size='1rem' />}
onClick={() => handleChange(item)} onClick={() => handleChange(item)}
/> />
))} ))}
@ -53,13 +53,3 @@ export function SelectItemType({ value, disabled, stretchLeft, onChange, ...rest
</div> </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 clsx from 'clsx';
import { SelectorButton } from '@/components/Control'; import { SelectorButton } from '@/components/Control';
import { LocationIcon } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown'; import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { type Styling } from '@/components/props'; import { type Styling } from '@/components/props';
import { prefixes } from '@/utils/constants'; import { prefixes } from '@/utils/constants';
@ -11,6 +10,8 @@ import { prefixes } from '@/utils/constants';
import { describeLocationHead, labelLocationHead } from '../labels'; import { describeLocationHead, labelLocationHead } from '../labels';
import { LocationHead } from '../models/library'; import { LocationHead } from '../models/library';
import { IconLocationHead } from './IconLocationHead';
interface SelectLocationHeadProps extends Styling { interface SelectLocationHeadProps extends Styling {
value: LocationHead; value: LocationHead;
onChange: (newValue: LocationHead) => void; onChange: (newValue: LocationHead) => void;
@ -39,7 +40,7 @@ export function SelectLocationHead({
title={describeLocationHead(value)} title={describeLocationHead(value)}
hideTitle={menu.isOpen} hideTitle={menu.isOpen}
className='h-full' className='h-full'
icon={<LocationIcon value={value} size='1rem' />} icon={<IconLocationHead value={value} size='1rem' />}
text={labelLocationHead(value)} text={labelLocationHead(value)}
onClick={menu.toggle} onClick={menu.toggle}
/> />
@ -56,7 +57,7 @@ export function SelectLocationHead({
title={describeLocationHead(head)} title={describeLocationHead(head)}
> >
<div className='inline-flex items-center gap-3'> <div className='inline-flex items-center gap-3'>
<LocationIcon value={head} size='1rem' /> <IconLocationHead value={head} size='1rem' />
{labelLocationHead(head)} {labelLocationHead(head)}
</div> </div>
</DropdownButton> </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 { useRoleStore, UserRole } from '@/features/users';
import { Overlay } from '@/components/Container'; import { Overlay } from '@/components/Container';
import { MiniButton } from '@/components/Control'; import { MiniButton } from '@/components/Control';
import { VisibilityIcon } from '@/components/DomainIcons';
import { IconImmutable, IconMutable } from '@/components/Icons'; import { IconImmutable, IconMutable } from '@/components/Icons';
import { Label } from '@/components/Input'; import { Label } from '@/components/Input';
import { PARAMETER } from '@/utils/constants'; import { PARAMETER } from '@/utils/constants';
@ -12,6 +12,7 @@ import { type AccessPolicy, type ILibraryItem } from '../backend/types';
import { useMutatingLibrary } from '../backend/useMutatingLibrary'; import { useMutatingLibrary } from '../backend/useMutatingLibrary';
import { useSetAccessPolicy } from '../backend/useSetAccessPolicy'; import { useSetAccessPolicy } from '../backend/useSetAccessPolicy';
import { IconItemVisibility } from './IconItemVisibility';
import { SelectAccessPolicy } from './SelectAccessPolicy'; import { SelectAccessPolicy } from './SelectAccessPolicy';
interface ToolbarItemAccessProps { interface ToolbarItemAccessProps {
@ -52,7 +53,7 @@ export function ToolbarItemAccess({
<MiniButton <MiniButton
title={visible ? 'Библиотека: отображать' : 'Библиотека: скрывать'} title={visible ? 'Библиотека: отображать' : 'Библиотека: скрывать'}
icon={<VisibilityIcon value={visible} />} icon={<IconItemVisibility value={visible} />}
onClick={toggleVisible} onClick={toggleVisible}
disabled={role === UserRole.READER || isProcessing} 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 { useAuthSuspense } from '@/features/auth';
import { MiniButton } from '@/components/Control'; import { MiniButton } from '@/components/Control';
import { VisibilityIcon } from '@/components/DomainIcons';
import { Checkbox, Label, TextArea, TextInput } from '@/components/Input'; import { Checkbox, Label, TextArea, TextInput } from '@/components/Input';
import { ModalForm } from '@/components/Modal'; import { ModalForm } from '@/components/Modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { AccessPolicy, type ICloneLibraryItemDTO, type ILibraryItem, schemaCloneLibraryItem } from '../backend/types'; import { AccessPolicy, type ICloneLibraryItemDTO, type ILibraryItem, schemaCloneLibraryItem } from '../backend/types';
import { useCloneItem } from '../backend/useCloneItem'; import { useCloneItem } from '../backend/useCloneItem';
import { IconItemVisibility } from '../components/IconItemVisibility';
import { SelectAccessPolicy } from '../components/SelectAccessPolicy'; import { SelectAccessPolicy } from '../components/SelectAccessPolicy';
import { SelectLocationContext } from '../components/SelectLocationContext'; import { SelectLocationContext } from '../components/SelectLocationContext';
import { SelectLocationHead } from '../components/SelectLocationHead'; import { SelectLocationHead } from '../components/SelectLocationHead';
@ -105,7 +105,7 @@ export function DlgCloneLibraryItem() {
render={({ field }) => ( render={({ field }) => (
<MiniButton <MiniButton
title={field.value ? 'Библиотека: отображать' : 'Библиотека: скрывать'} title={field.value ? 'Библиотека: отображать' : 'Библиотека: скрывать'}
icon={<VisibilityIcon value={field.value} />} icon={<IconItemVisibility value={field.value} />}
onClick={() => field.onChange(!field.value)} onClick={() => field.onChange(!field.value)}
/> />
)} )}

View File

@ -3,7 +3,8 @@
import { useState } from 'react'; import { useState } from 'react';
import clsx from 'clsx'; 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 { MiniButton } from '@/components/Control';
import { IconRemove } from '@/components/Icons'; import { IconRemove } from '@/components/Icons';

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
* Module: OSS data loading and processing. * 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'; import { Graph } from '@/models/Graph';

View File

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

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; 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'; import { KEYS } from '@/backend/configuration';

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useUpdateTimestamp } from '@/features/library'; import { useUpdateTimestamp } from '@/features/library/backend/useUpdateTimestamp';
import { KEYS } from '@/backend/configuration'; 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 { zodResolver } from '@hookform/resolvers/zod';
import clsx from 'clsx'; 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 { MiniButton } from '@/components/Control';
import { IconReset } from '@/components/Icons'; import { IconReset } from '@/components/Icons';

View File

@ -2,7 +2,9 @@
import { Controller, useFormContext, useWatch } from 'react-hook-form'; 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 { MiniButton } from '@/components/Control';
import { IconReset } from '@/components/Icons'; import { IconReset } from '@/components/Icons';

View File

@ -2,7 +2,8 @@
import { Controller, useFormContext, useWatch } from 'react-hook-form'; 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 { TextArea } from '@/components/Input';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';

View File

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

View File

@ -2,8 +2,8 @@
import clsx from 'clsx'; import clsx from 'clsx';
import { EditorLibraryItem } from '@/features/library'; import { EditorLibraryItem } from '@/features/library/components';
import { ToolbarRSFormCard } from '@/features/rsform'; import { ToolbarRSFormCard } from '@/features/rsform/components';
import { FlexColumn } from '@/components/Container'; import { FlexColumn } from '@/components/Container';
import { useModificationStore } from '@/stores/modification'; 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 { zodResolver } from '@hookform/resolvers/zod';
import clsx from 'clsx'; import clsx from 'clsx';
import { LibraryItemType, ToolbarItemAccess, useUpdateItem } from '@/features/library'; import { type IUpdateLibraryItemDTO, LibraryItemType, schemaUpdateLibraryItem } from '@/features/library';
import { type IUpdateLibraryItemDTO, schemaUpdateLibraryItem } from '@/features/library/backend/types'; import { useUpdateItem } from '@/features/library/backend/useUpdateItem';
import { ToolbarItemAccess } from '@/features/library/components';
import { SubmitButton } from '@/components/Control'; import { SubmitButton } from '@/components/Control';
import { IconSave } from '@/components/Icons'; import { IconSave } from '@/components/Icons';

View File

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

View File

@ -2,7 +2,8 @@
import clsx from 'clsx'; 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 { MiniButton } from '@/components/Control';
import { import {

View File

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

View File

@ -4,7 +4,8 @@ import { createContext, useContext, useEffect, useState } from 'react';
import { urls, useConceptNavigation } from '@/app'; import { urls, useConceptNavigation } from '@/app';
import { useAuthSuspense } from '@/features/auth'; 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 { RSTabID } from '@/features/rsform/pages/RSFormPage/RSEditContext';
import { useRoleStore, UserRole } from '@/features/users'; import { useRoleStore, UserRole } from '@/features/users';

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
import { useMutation, useQueryClient } from '@tanstack/react-query'; 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'; 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 { toast } from 'react-toastify';
import clsx from 'clsx'; 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 { MiniButton } from '@/components/Control';
import { createColumnHelper, DataTable, type IConditionalStyle } from '@/components/DataTable'; import { createColumnHelper, DataTable, type IConditionalStyle } from '@/components/DataTable';

View File

@ -1,9 +1,11 @@
'use client'; 'use client';
import { urls, useConceptNavigation } from '@/app'; import { urls, useConceptNavigation } from '@/app';
import { BadgeHelp, HelpTopic } from '@/features/help'; import { HelpTopic } from '@/features/help';
import { AccessPolicy, LibraryItemType, MiniSelectorOSS, useMutatingLibrary } from '@/features/library'; import { BadgeHelp } from '@/features/help/components';
import { type ILibraryItem } from '@/features/library/backend/types'; 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 { useRoleStore, UserRole } from '@/features/users';
import { Overlay } from '@/components/Container'; 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 { Controller, useFormContext, useWatch } from 'react-hook-form';
import clsx from 'clsx'; 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 { TextArea, TextInput } from '@/components/Input';
import { PARAMETER } from '@/utils/constants'; import { PARAMETER } from '@/utils/constants';

View File

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

View File

@ -2,7 +2,9 @@
import { useFormContext, useWatch } from 'react-hook-form'; 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 { TextInput } from '@/components/Input';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';

View File

@ -1,8 +1,12 @@
export { type ICstSubstitute } from './backend/types'; export {
export { CstType } from './backend/types'; CstType,
export { useRSForm, useRSFormSuspense } from './backend/useRSForm'; type ICstSubstitute,
export { useRSForms } from './backend/useRSForms'; type IRSFormDTO,
export { PickMultiConstituenta } from './components/PickMultiConstituenta'; type IVersionCreatedResponse,
export { PickSubstitutions } from './components/PickSubstitutions'; ParsingStatus,
export { ToolbarRSFormCard } from './components/ToolbarRSFormCard'; schemaCstSubstitute,
export { CstClass, type IConstituenta, type IRSForm } from './models/rsform'; 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 { PARAMETER } from '@/utils/constants';
import { prepareTooltip } from '@/utils/utils'; 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 { type CurrentVersion } from '../library/models/library';
import { CstType, type IRSErrorDescription, ParsingStatus, RSErrorType, TokenID } from './backend/types'; 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. * Module: API for formal representation for systems of concepts.
*/ */
import { type ILibraryItem } from '@/features/library/backend/types'; import { BASIC_SCHEMAS, type ILibraryItem } from '@/features/library';
import { BASIC_SCHEMAS } from '@/features/library/models/library';
import { TextMatcher } from '@/utils/utils'; import { TextMatcher } from '@/utils/utils';

View File

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

View File

@ -4,7 +4,8 @@ import { useEffect, useRef, useState } from 'react';
import { toast } from 'react-toastify'; import { toast } from 'react-toastify';
import { type ReactCodeMirrorRef } from '@uiw/react-codemirror'; 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 { Overlay } from '@/components/Container';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';

View File

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

View File

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

View File

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

View File

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

View File

@ -1,21 +1,13 @@
import { BadgeHelp, HelpTopic } from '@/features/help'; import { HelpTopic } from '@/features/help';
import { MiniSelectorOSS } from '@/features/library'; import { BadgeHelp } from '@/features/help/components';
import { MiniSelectorOSS } from '@/features/library/components';
import { CstType } from '@/features/rsform'; import { CstType } from '@/features/rsform';
import { Overlay } from '@/components/Container'; import { Overlay } from '@/components/Container';
import { MiniButton } from '@/components/Control'; import { MiniButton } from '@/components/Control';
import { type DomIconProps } from '@/components/DomainIcons';
import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown'; import { Dropdown, DropdownButton, useDropdown } from '@/components/Dropdown';
import { import {
IconClone, IconClone,
IconCstAxiom,
IconCstBaseSet,
IconCstConstSet,
IconCstFunction,
IconCstPredicate,
IconCstStructured,
IconCstTerm,
IconCstTheorem,
IconDestroy, IconDestroy,
IconMoveDown, IconMoveDown,
IconMoveUp, IconMoveUp,
@ -27,6 +19,7 @@ import { prefixes } from '@/utils/constants';
import { prepareTooltip } from '@/utils/utils'; import { prepareTooltip } from '@/utils/utils';
import { useMutatingRSForm } from '../../../backend/useMutatingRSForm'; import { useMutatingRSForm } from '../../../backend/useMutatingRSForm';
import { IconCstType } from '../../../components/IconCstType';
import { getCstTypeShortcut, labelCstType } from '../../../labels'; import { getCstTypeShortcut, labelCstType } from '../../../labels';
import { useRSEdit } from '../RSEditContext'; import { useRSEdit } from '../RSEditContext';
@ -89,7 +82,7 @@ export function ToolbarRSList() {
<DropdownButton <DropdownButton
key={`${prefixes.csttype_list}${typeStr}`} key={`${prefixes.csttype_list}${typeStr}`}
text={labelCstType(typeStr as CstType)} 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)} onClick={() => createCst(typeStr as CstType, true)}
titleHtml={getCstTypeShortcut(typeStr as CstType)} titleHtml={getCstTypeShortcut(typeStr as CstType)}
/> />
@ -118,25 +111,3 @@ export function ToolbarRSList() {
</Overlay> </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 { Overlay } from '@/components/Container';
import { SelectSingle } from '@/components/Input'; 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 { Tooltip } from '@/components/Container';
import { IconHelp } from '@/components/Icons'; import { IconHelp } from '@/components/Icons';

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,7 +4,8 @@ import { createContext, useContext, useEffect, useState } from 'react';
import { urls, useConceptNavigation } from '@/app'; import { urls, useConceptNavigation } from '@/app';
import { useAuthSuspense } from '@/features/auth'; 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 { useRoleStore, UserRole } from '@/features/users';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';

View File

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

View File

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

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