Compare commits

..

No commits in common. "168ff94c420b5ee7e16b6e7379d32af83a512f75" and "21a304701e5546d78e116e13e0162a9152977043" have entirely different histories.

17 changed files with 30 additions and 72 deletions

View File

@ -4,32 +4,29 @@ import { IConstituenta } from '@/models/rsform';
import { isMockCst } from '@/models/rsformAPI';
import { colorFgCstStatus, IColorTheme } from '@/styling/color';
import { CProps } from '../props';
import TooltipConstituenta from './TooltipConstituenta';
interface BadgeConstituentaProps extends CProps.Styling {
interface BadgeConstituentaProps {
prefixID?: string;
value: IConstituenta;
theme: IColorTheme;
}
function BadgeConstituenta({ value, prefixID, className, style, theme }: BadgeConstituentaProps) {
function BadgeConstituenta({ value, prefixID, theme }: BadgeConstituentaProps) {
return (
<div
id={`${prefixID}${value.alias}`}
className={clsx(
'min-w-[3.1rem] max-w-[3.1rem]',
'min-w-[3.1rem] max-w-[3.1rem]', // prettier: split lines
'px-1',
'border rounded-md',
value.is_inherited && 'border-dashed',
'text-center font-medium whitespace-nowrap',
className
'text-center font-medium whitespace-nowrap'
)}
style={{
borderColor: colorFgCstStatus(value.status, theme),
color: colorFgCstStatus(value.status, theme),
backgroundColor: isMockCst(value) ? theme.bgWarning : theme.bgInput,
...style
backgroundColor: isMockCst(value) ? theme.bgWarning : theme.bgInput
}}
>
{value.alias}

View File

@ -91,14 +91,12 @@ function Modal({
{header ? <h1 className='px-12 py-2 select-none'>{header}</h1> : null}
<div
className={clsx(
'overscroll-contain max-h-[calc(100svh-8rem)] max-w-[100svw] xs:max-w-[calc(100svw-2rem)]',
{
'overflow-auto': !overflowVisible,
'overflow-visible': overflowVisible
},
className
)}
className={clsx('overflow-auto overscroll-contain', className)}
style={{
overflow: overflowVisible ? 'visible' : 'auto',
maxHeight: 'calc(100svh - 8rem)',
maxWidth: 'calc(100svw - 2rem)'
}}
>
{children}
</div>

View File

@ -78,7 +78,7 @@ function FormCreateCst({ schema, state, partialUpdate, setValidated }: FormCreat
fitContent
spellCheck
label='Термин'
placeholder='Обозначение для текстовых определений'
placeholder='Обозначение, используемое в текстовых определениях'
className='max-h-[3.6rem]'
value={state.term_raw}
onChange={event => partialUpdate({ term_raw: event.target.value })}

View File

@ -18,11 +18,10 @@ import { SelectorCstType } from '@/utils/selectors';
interface DlgRenameCstProps extends Pick<ModalProps, 'hideWindow'> {
initial: ICstRenameData;
allowChangeType: boolean;
onRename: (data: ICstRenameData) => void;
}
function DlgRenameCst({ hideWindow, initial, allowChangeType, onRename }: DlgRenameCstProps) {
function DlgRenameCst({ hideWindow, initial, onRename }: DlgRenameCstProps) {
const { schema } = useRSForm();
const [validated, setValidated] = useState(false);
const [cstData, updateData] = usePartialUpdate(initial);
@ -53,7 +52,6 @@ function DlgRenameCst({ hideWindow, initial, allowChangeType, onRename }: DlgRen
id='dlg_cst_type'
placeholder='Выберите тип'
className='min-w-[16rem] self-center'
isDisabled={!allowChangeType}
options={SelectorCstType}
value={{
value: cstData.cst_type,

View File

@ -255,20 +255,7 @@ export function isFunctional(type: CstType): boolean {
* Validate new alias against {@link CstType} and {@link IRSForm}.
*/
export function validateNewAlias(alias: string, type: CstType, schema: IRSForm): boolean {
if (alias.length < 2) {
return false;
}
const prefix = getCstTypePrefix(type);
if (!alias.startsWith(prefix)) {
return false;
}
if (schema.cstByAlias.has(alias)) {
return false;
}
if (!/^\d+$/.exec(alias.substring(prefix.length))) {
return false;
}
return true;
return alias.length >= 2 && alias.startsWith(getCstTypePrefix(type)) && !schema.cstByAlias.has(alias);
}
/**

View File

@ -3,7 +3,7 @@ import { HelpTopic } from '@/models/miscellaneous';
function HelpConceptRelations() {
return (
<div className='text-justify'>
<div>
<h1>Связи между конституентами</h1>
<p>
Конституенты связаны между собой через использование одних конституент при определении других. Такую связь в

View File

@ -3,7 +3,7 @@ import { HelpTopic } from '@/models/miscellaneous';
function HelpConceptSynthesis() {
return (
<div className='text-justify'>
<div>
<h1>Синтез концептуальных схем</h1>
<p>
Работа с крупными предметными областями требуют рассмотрения различных точек зрения в рамках одной предметной

View File

@ -3,7 +3,7 @@ import { HelpTopic } from '@/models/miscellaneous';
function HelpConceptSystem() {
return (
<div className='text-justify'>
<div>
<h1>Концептуальная схема Система определений</h1>
<p>
Данный раздел вводит <b>систему определений</b> как предмет концептуализации предметных областей. Под системой

View File

@ -4,7 +4,7 @@ import { external_urls } from '@/utils/constants';
function HelpRules() {
return (
<div className='text-justify'>
<div>
<h1>Правила поведения участников Портала</h1>
<p>

View File

@ -56,11 +56,7 @@ function OssFlow({ isModified, setIsModified }: OssFlowProps) {
const onSelectionChange = useCallback(
({ nodes }: { nodes: Node[] }) => {
const ids = nodes.map(node => Number(node.id));
controller.setSelected(prev => [
...prev.filter(nodeID => ids.includes(nodeID)),
...ids.filter(nodeID => !prev.includes(Number(nodeID)))
]);
controller.setSelected(nodes.map(node => Number(node.id)));
},
[controller]
);

View File

@ -149,7 +149,7 @@ function FormConstituenta({
id='cst_term'
label='Термин'
maxHeight='8rem'
placeholder='Обозначение для текстовых определений'
placeholder='Обозначение, используемое в текстовых определениях'
schema={schema}
onOpenEdit={onOpenEdit}
value={term}
@ -240,7 +240,7 @@ function FormConstituenta({
</AnimateFade>
{!disabled || processing ? (
<div className='mx-auto flex'>
<div className='self-center flex'>
<SubmitButton
key='cst_form_submit'
id='cst_form_submit'

View File

@ -165,7 +165,7 @@ function EditorRSExpression({
toggleControls={() => setShowControls(prev => !prev)}
/>
<Overlay position='top-[-0.5rem]' className='pl-[8.5rem] xs:pl-[2rem] flex justify-center w-full gap-1'>
<Overlay position='top-[-0.5rem] pl-[8rem] sm:pl-[4rem] right-1/2 translate-x-1/2 flex'>
<StatusBar
processing={parser.processing}
isModified={isModified}

View File

@ -92,7 +92,7 @@ function RSEditorControls({ isOpen, disabled, onEdit }: RSEditorControlsProps) {
return (
<motion.div
className={clsx(
'max-w-[28rem] min-w-[28rem] xs:max-w-[38.5rem] xs:min-w-[38.5rem] sm:max-w-[40rem] sm:min-w-[40rem] md:max-w-fit mx-1 sm:mx-0',
'max-w-[38.5rem] sm:max-w-[40rem] sm:min-w-[40rem] md:max-w-fit mx-1 sm:mx-0',
'flex-wrap',
'divide-solid',
'text-xs md:text-sm',
@ -112,7 +112,6 @@ function RSEditorControls({ isOpen, disabled, onEdit }: RSEditorControlsProps) {
title={title}
onInsert={onEdit}
disabled={disabled}
className='hidden xs:inline'
/>
))}
@ -122,7 +121,6 @@ function RSEditorControls({ isOpen, disabled, onEdit }: RSEditorControlsProps) {
{SECONDARY_SECOND_ROW.map(({ text, title }) => (
<RSLocalButton
key={`${prefixes.rsedit_btn}${title}`}
className='hidden xs:inline'
text={text}
title={title}
onInsert={onEdit}
@ -136,7 +134,6 @@ function RSEditorControls({ isOpen, disabled, onEdit }: RSEditorControlsProps) {
{SECONDARY_THIRD_ROW.map(({ text, title }) => (
<RSLocalButton
key={`${prefixes.rsedit_btn}${title}`}
className='hidden xs:inline'
text={text}
title={title}
onInsert={onEdit}

View File

@ -4,22 +4,13 @@ import { CProps } from '@/components/props';
import { TokenID } from '@/models/rslang';
import { globals } from '@/utils/constants';
interface RSLocalButtonProps extends CProps.Titled, CProps.Styling {
interface RSLocalButtonProps extends CProps.Titled {
text: string;
disabled?: boolean;
onInsert: (token: TokenID, key?: string) => void;
}
function RSLocalButton({
text,
title,
titleHtml,
hideTitle,
disabled,
className,
onInsert,
...restProps
}: RSLocalButtonProps) {
function RSLocalButton({ text, title, titleHtml, hideTitle, disabled, onInsert }: RSLocalButtonProps) {
return (
<button
type='button'
@ -34,11 +25,9 @@ function RSLocalButton({
'cursor-pointer disabled:cursor-default',
'rounded-none',
'clr-hover clr-btn-clear',
'font-math',
className
'font-math'
)}
onClick={() => onInsert(TokenID.ID_LOCAL, text)}
{...restProps}
>
{text}
</button>

View File

@ -41,10 +41,12 @@ function StatusBar({ isModified, processing, activeCst, parseData, onAnalyze }:
tabIndex={0}
className={clsx(
'w-[10rem] h-[1.75rem]',
'scale-75 sm:scale-100 mx-[-2.5rem] sm:m-0',
'px-2 flex items-center justify-center gap-2',
'border',
'select-none',
'cursor-pointer',
'translate-x-[-1.5rem]',
'focus-frame',
'duration-500 transition-colors'
)}

View File

@ -689,11 +689,10 @@ export const RSEditState = ({
initial={createInitialData}
/>
) : null}
{activeCst && showRenameCst && renameInitialData ? (
{showRenameCst && renameInitialData ? (
<DlgRenameCst
hideWindow={() => setShowRenameCst(false)}
onRename={handleRenameCst}
allowChangeType={!activeCst.is_inherited}
initial={renameInitialData}
/>
) : null}

View File

@ -69,12 +69,7 @@ function TableSideConstituents({
minSize: 65,
footer: undefined,
cell: props => (
<BadgeConstituenta
className='mr-[-0.5rem]'
theme={colors}
value={props.row.original}
prefixID={prefixes.cst_side_table}
/>
<BadgeConstituenta theme={colors} value={props.row.original} prefixID={prefixes.cst_side_table} />
)
}),
columnHelper.accessor(cst => describeConstituenta(cst), {