mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Update help topics
This commit is contained in:
parent
62e30d474b
commit
31bbf0ab84
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -124,10 +124,13 @@
|
||||||
"viewsets",
|
"viewsets",
|
||||||
"wordform",
|
"wordform",
|
||||||
"Wordforms",
|
"Wordforms",
|
||||||
|
"Биективная",
|
||||||
|
"биективной",
|
||||||
"Булеан",
|
"Булеан",
|
||||||
"Бурбаки",
|
"Бурбаки",
|
||||||
"Версионирование",
|
"Версионирование",
|
||||||
"Десинглетон",
|
"Десинглетон",
|
||||||
|
"интерпретируемости",
|
||||||
"интерпретируемость",
|
"интерпретируемость",
|
||||||
"компаратив",
|
"компаратив",
|
||||||
"конституент",
|
"конституент",
|
||||||
|
|
|
@ -7,7 +7,10 @@ function HelpConceptSystem() {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1>Концептуализация</h1>
|
<h1>Концептуализация</h1>
|
||||||
<p>TBD</p>
|
<p>Сложные предметные области требуют применения специальных подходов к их пониманию и описанию. <b>Системный подход</b> заключается в установлении границы системы, выделении отдельных подсистем и установления связей между ними. Подсистемы описываются раздельно. Далее их описания синтезируются с учетом установленных связей. Таким образом формируется описания системы в целом через описания ее частей</p>
|
||||||
|
<p><b>Концептуализация</b> заключается в дедуктивном построении концептуальных схем (систем определений), описывающих содержательные отношения в рамках каждой подсистемы. Концептуальные схемы могут быть синтезированы для получения общей системы определений в выбранной предметной области.</p>
|
||||||
|
<p>Концептуализация применяется в условиях поставленной задачи в рамках предметной области. Решаемая прикладная проблема позволяет определить границы концептуализации и разумно распределить ресурсы.</p>
|
||||||
|
<p>в ходе многократной концептуализации и решения с помощью построенных концептуальных схем прикладных задач формируется навык <b>Концептуального мышления</b>. Это особый способ мышления, при котором строго контролируются используемые определения и предположения, в которых происходит описание предметного содержания.</p>
|
||||||
|
|
||||||
<Subtopics headTopic={HelpTopic.CONCEPTUAL} />
|
<Subtopics headTopic={HelpTopic.CONCEPTUAL} />
|
||||||
</div>);
|
</div>);
|
||||||
|
|
|
@ -1,10 +1,38 @@
|
||||||
|
import { HelpTopic } from '@/models/miscellaneous';
|
||||||
|
|
||||||
|
import LinkTopic from '../ui/LinkTopic';
|
||||||
|
|
||||||
function HelpRSLangCorrect() {
|
function HelpRSLangCorrect() {
|
||||||
// prettier-ignore
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className='text-justify'>
|
||||||
<h1>Переносимость и корректность</h1>
|
<h1>Переносимость и корректность</h1>
|
||||||
<p>TBD</p>
|
<p>
|
||||||
</div>);
|
<b>Биективная переносимость выражений</b> заключается в независимости значений определений от биективной замены
|
||||||
|
интерпретаций неопределяемых понятий. Она основана на принципиальной не сравнимости элементов базисных множеств.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Проверка выражений, содержащих глобальные идентификаторы проводится в заданном глобальном контексте (известны
|
||||||
|
типизации и биективная переносимость, информация об аргументах функций). Все неизвестные идентификаторы
|
||||||
|
считаются некорректными.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Правила проверки теоретико-множественных выражений выводятся из условия биективной переносимости предиката
|
||||||
|
принадлежности – элемент должен соответствовать множеству, для которого проверяется принадлежность. Необходимым
|
||||||
|
условием биективной переносимости является выполнение{' '}
|
||||||
|
<LinkTopic text='соотношения типизации' topic={HelpTopic.RSL_TYPES} /> для всех локальных и глобальных
|
||||||
|
идентификаторов.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Логическая корректность (непротиворечивость) выражений в общем случае не может быть автоматически проверена.
|
||||||
|
Однако наличие примера интерпретации на объектах предметной области является основанием утверждения о
|
||||||
|
непротиворечивости накладываемых аксиом.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Редактор выражений на Портале оснащен инструментами проверки выражений и вычисления их типизации. Найденные
|
||||||
|
ошибки диагностируются и выводится соответствующее сообщение об ошибке.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default HelpRSLangCorrect;
|
export default HelpRSLangCorrect;
|
||||||
|
|
|
@ -1,10 +1,42 @@
|
||||||
|
import { HelpTopic } from '@/models/miscellaneous';
|
||||||
|
|
||||||
|
import LinkTopic from '../ui/LinkTopic';
|
||||||
|
|
||||||
function HelpRSLangInterpret() {
|
function HelpRSLangInterpret() {
|
||||||
// prettier-ignore
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className='text-justify'>
|
||||||
<h1>Интерпретируемость</h1>
|
<h1>Интерпретируемость</h1>
|
||||||
<p>TBD</p>
|
<p>
|
||||||
</div>);
|
Практическое применение концептуальным схем основано на <b>интерпретации</b> - соотнесении предметного
|
||||||
|
содержания и схемных терминов и определений. Для этого в соответствии с{' '}
|
||||||
|
<LinkTopic text='конвенциями' topic={HelpTopic.CC_CONSTITUENTA} /> вводятся списки объектов предметной области,
|
||||||
|
соответствующих неопределяемым понятиям. При этом обеспечивается корректность отношений{' '}
|
||||||
|
<LinkTopic text='типизации' topic={HelpTopic.RSL_TYPES} /> для родовых структур.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Интерпретация производных понятий может быть задана внешними методами либо автоматически вычислена с помощью
|
||||||
|
формальных определений. При этом не всякое выражение, содержащее перебор элементов множеств, может быть
|
||||||
|
вычислено за приемлемое время. Например, интерпретация утверждения {'"∀α∈Z α>0"'} приводит к перебору
|
||||||
|
бесконечного множества целых чисел.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>Интерпретируемыми</b> будем считать выражения, которые можно вычислить за полиномиальное время относительно
|
||||||
|
мощностей интерпретаций глобальных идентификаторов, используемых в этом выражении. По аналогии с{' '}
|
||||||
|
<LinkTopic text='биективной переносимостью' topic={HelpTopic.RSL_CORRECT} /> условия интерпретируемости могут
|
||||||
|
быть выведены из утверждения {'выражения "Z, ℬ(α)" не интерпретируемы'}.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Также вводится категория выражений, задающих множества, которым можно принадлежность за полиномиальное время, но
|
||||||
|
нельзя вычислить полный список элемент. Например, {'"Z, D{ξ∈ℬ(X1×X1) | Pr1(ξ)=Pr2(ξ)}"'}. Конституенты, чьи
|
||||||
|
выражения удовлетворяет этому свойству, называются <b>Неразмерными</b>. Их можно использовать в интерпретируемых
|
||||||
|
выражениях только в конструкциях, не требующих перебора их элементах.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Конституенты, чьи выражения не позволяют проверить принадлежность за полиномиальное время, называются{' '}
|
||||||
|
<b>Невычислимыми</b>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default HelpRSLangInterpret;
|
export default HelpRSLangInterpret;
|
||||||
|
|
|
@ -1,10 +1,23 @@
|
||||||
|
import { HelpTopic } from '@/models/miscellaneous';
|
||||||
|
|
||||||
|
import { IconTemplates } from '../Icons';
|
||||||
|
import LinkTopic from '../ui/LinkTopic';
|
||||||
|
|
||||||
function HelpRSLangOperations() {
|
function HelpRSLangOperations() {
|
||||||
// prettier-ignore
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1>Операции над концептуальными схемами</h1>
|
<h1>Операции над концептуальными схемами</h1>
|
||||||
<p>TBD</p>
|
<p>В данном разделе поясняются различные операции над концептуальными схемами</p>
|
||||||
</div>);
|
|
||||||
|
<h2>
|
||||||
|
<IconTemplates size='1.25rem' className='inline-icon' /> Генерация из шаблона
|
||||||
|
</h2>
|
||||||
|
<p>
|
||||||
|
Данная операция позволяет вставить конституенту из{' '}
|
||||||
|
<LinkTopic text='шаблона выражения' topic={HelpTopic.RSL_TEMPLATES} />.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default HelpRSLangOperations;
|
export default HelpRSLangOperations;
|
||||||
|
|
|
@ -1,10 +1,45 @@
|
||||||
function HelpRSLangTypes() {
|
function HelpRSLangTypes() {
|
||||||
// prettier-ignore
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<h1>Система типов</h1>
|
<h1>Типизация</h1>
|
||||||
<p>TBD</p>
|
<p>
|
||||||
</div>);
|
Родоструктурное выражение <b>ξ</b> обладает типизацией (структурой), если выполнено ξ∈H,
|
||||||
|
<br />
|
||||||
|
где <b>H</b> – корректное выражение <b>ступени</b>, задаваемой следующими правилами:
|
||||||
|
<li>
|
||||||
|
Xi, Ci – ступень, называемая <b>элемент</b>;
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Z – ступень, называемая <b>целое число</b>;
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
(H1×...×Hn) – ступень, называемая <b>кортеж арности n</b>;
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
ℬ(H) – ступень, называемая <b>множеством</b>.
|
||||||
|
</li>
|
||||||
|
</p>
|
||||||
|
<p>Пустое множество ∅ имеет типизацию ℬ(R0) – множество с произвольной структурой элемента</p>
|
||||||
|
<p>
|
||||||
|
Для обобщения понятия типизация на логические и параметризованные выражения вводится ряд дополнительных
|
||||||
|
обозначений
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Логические выражения (аксиомы, теоремы), принимающие значения ИСТИНА или ЛОЖЬ относятся к типизации <b>Logic</b>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Параметризованные выражения (терм-функции, предикат-функции) относятся к типизации <br />
|
||||||
|
Hr 🠔 [H1, H2, ... Hi],
|
||||||
|
<br />
|
||||||
|
где Hr – типизация результата, H1, ... Hi – типизации аргументов
|
||||||
|
</p>
|
||||||
|
<p></p>
|
||||||
|
<p>
|
||||||
|
Шаблонные параметризованные выражения могут содержать обозначения R1, ... Ri, соответствующие произвольным
|
||||||
|
ступеням, определяемым исходя из типизации аргументов по месту использования выражения.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default HelpRSLangTypes;
|
export default HelpRSLangTypes;
|
||||||
|
|
|
@ -62,8 +62,8 @@ export enum HelpTopic {
|
||||||
RSL_TYPES = 'rslang-types',
|
RSL_TYPES = 'rslang-types',
|
||||||
RSL_CORRECT = 'rslang-correctness',
|
RSL_CORRECT = 'rslang-correctness',
|
||||||
RSL_INTERPRET = 'rslang-interpretation',
|
RSL_INTERPRET = 'rslang-interpretation',
|
||||||
RSL_TEMPLATES = 'rslang-templates',
|
|
||||||
RSL_OPERATIONS = 'rslang-operations',
|
RSL_OPERATIONS = 'rslang-operations',
|
||||||
|
RSL_TEMPLATES = 'rslang-templates',
|
||||||
|
|
||||||
TERM_CONTROL = 'terminology-control',
|
TERM_CONTROL = 'terminology-control',
|
||||||
VERSIONS = 'versions',
|
VERSIONS = 'versions',
|
||||||
|
@ -96,8 +96,8 @@ export const topicParent: Map<HelpTopic, HelpTopic> = new Map([
|
||||||
[HelpTopic.RSL_TYPES, HelpTopic.RSLANG],
|
[HelpTopic.RSL_TYPES, HelpTopic.RSLANG],
|
||||||
[HelpTopic.RSL_CORRECT, HelpTopic.RSLANG],
|
[HelpTopic.RSL_CORRECT, HelpTopic.RSLANG],
|
||||||
[HelpTopic.RSL_INTERPRET, HelpTopic.RSLANG],
|
[HelpTopic.RSL_INTERPRET, HelpTopic.RSLANG],
|
||||||
[HelpTopic.RSL_TEMPLATES, HelpTopic.RSLANG],
|
|
||||||
[HelpTopic.RSL_OPERATIONS, HelpTopic.RSLANG],
|
[HelpTopic.RSL_OPERATIONS, HelpTopic.RSLANG],
|
||||||
|
[HelpTopic.RSL_TEMPLATES, HelpTopic.RSLANG],
|
||||||
|
|
||||||
[HelpTopic.TERM_CONTROL, HelpTopic.TERM_CONTROL],
|
[HelpTopic.TERM_CONTROL, HelpTopic.TERM_CONTROL],
|
||||||
[HelpTopic.VERSIONS, HelpTopic.VERSIONS],
|
[HelpTopic.VERSIONS, HelpTopic.VERSIONS],
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useCallback, useState } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
import { urls } from '@/app/urls';
|
import { urls } from '@/app/urls';
|
||||||
import { useConceptNavigation } from '@/context/NavigationContext';
|
import { useConceptNavigation } from '@/context/NavigationContext';
|
||||||
import { useConceptOptions } from '@/context/OptionsContext';
|
import { useConceptOptions } from '@/context/OptionsContext';
|
||||||
import useQueryStrings from '@/hooks/useQueryStrings';
|
import useQueryStrings from '@/hooks/useQueryStrings';
|
||||||
import { HelpTopic, topicParent } from '@/models/miscellaneous';
|
import { HelpTopic } from '@/models/miscellaneous';
|
||||||
|
|
||||||
import TopicsList from './TopicsList';
|
import TopicsList from './TopicsList';
|
||||||
import ViewTopic from './ViewTopic';
|
import ViewTopic from './ViewTopic';
|
||||||
|
@ -15,45 +15,8 @@ function ManualsPage() {
|
||||||
const router = useConceptNavigation();
|
const router = useConceptNavigation();
|
||||||
const query = useQueryStrings();
|
const query = useQueryStrings();
|
||||||
const activeTopic = (query.get('topic') || HelpTopic.MAIN) as HelpTopic;
|
const activeTopic = (query.get('topic') || HelpTopic.MAIN) as HelpTopic;
|
||||||
const [topicFolded, setFolded] = useState<Map<HelpTopic, boolean>>(
|
|
||||||
new Map(
|
|
||||||
Object.values(HelpTopic).map(value => {
|
|
||||||
const topic = value as HelpTopic;
|
|
||||||
return [
|
|
||||||
topic,
|
|
||||||
topicParent.get(activeTopic) !== topic && topicParent.get(topicParent.get(activeTopic)!) !== topic
|
|
||||||
];
|
|
||||||
})
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
const { mainHeight } = useConceptOptions();
|
const { mainHeight } = useConceptOptions();
|
||||||
const onFoldTopic = useCallback(
|
|
||||||
(target: HelpTopic, showChildren: boolean) => {
|
|
||||||
if (topicFolded.get(target) === !showChildren) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setFolded(
|
|
||||||
new Map(
|
|
||||||
Object.values(HelpTopic).map(value => {
|
|
||||||
const topic = value as HelpTopic;
|
|
||||||
if (topic === target) {
|
|
||||||
return [topic, !showChildren];
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
!showChildren &&
|
|
||||||
(topicParent.get(topic) === target || topicParent.get(topicParent.get(topic)!) === target)
|
|
||||||
) {
|
|
||||||
return [topic, true];
|
|
||||||
}
|
|
||||||
const oldValue = topicFolded.get(topic)!;
|
|
||||||
return [topic, oldValue];
|
|
||||||
})
|
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
|
||||||
[topicFolded]
|
|
||||||
);
|
|
||||||
|
|
||||||
const onSelectTopic = useCallback(
|
const onSelectTopic = useCallback(
|
||||||
(newTopic: HelpTopic) => {
|
(newTopic: HelpTopic) => {
|
||||||
|
@ -64,12 +27,7 @@ function ManualsPage() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex w-full gap-2' style={{ minHeight: mainHeight }}>
|
<div className='flex w-full gap-2' style={{ minHeight: mainHeight }}>
|
||||||
<TopicsList
|
<TopicsList activeTopic={activeTopic} onChangeTopic={topic => onSelectTopic(topic)} />
|
||||||
activeTopic={activeTopic}
|
|
||||||
onChangeTopic={topic => onSelectTopic(topic)}
|
|
||||||
topicFolded={topicFolded}
|
|
||||||
onFoldTopic={onFoldTopic}
|
|
||||||
/>
|
|
||||||
<ViewTopic topic={activeTopic} />
|
<ViewTopic topic={activeTopic} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -15,12 +15,10 @@ import TopicsTree from './TopicsTree';
|
||||||
|
|
||||||
interface TopicsDropdownProps {
|
interface TopicsDropdownProps {
|
||||||
activeTopic: HelpTopic;
|
activeTopic: HelpTopic;
|
||||||
topicFolded: Map<HelpTopic, boolean>;
|
|
||||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function TopicsDropdown({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsDropdownProps) {
|
function TopicsDropdown({ activeTopic, onChangeTopic }: TopicsDropdownProps) {
|
||||||
const menu = useDropdown();
|
const menu = useDropdown();
|
||||||
const { noNavigation, calculateHeight } = useConceptOptions();
|
const { noNavigation, calculateHeight } = useConceptOptions();
|
||||||
|
|
||||||
|
@ -67,12 +65,7 @@ function TopicsDropdown({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }
|
||||||
animate={menu.isOpen ? 'open' : 'closed'}
|
animate={menu.isOpen ? 'open' : 'closed'}
|
||||||
variants={animateSlideLeft}
|
variants={animateSlideLeft}
|
||||||
>
|
>
|
||||||
<TopicsTree
|
<TopicsTree activeTopic={activeTopic} onChangeTopic={selectTheme} />
|
||||||
activeTopic={activeTopic}
|
|
||||||
onChangeTopic={selectTheme}
|
|
||||||
topicFolded={topicFolded}
|
|
||||||
onFoldTopic={onFoldTopic}
|
|
||||||
/>
|
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -8,32 +8,16 @@ import TopicsStatic from './TopicsStatic';
|
||||||
|
|
||||||
interface TopicsListProps {
|
interface TopicsListProps {
|
||||||
activeTopic: HelpTopic;
|
activeTopic: HelpTopic;
|
||||||
topicFolded: Map<HelpTopic, boolean>;
|
|
||||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function TopicsList({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsListProps) {
|
function TopicsList({ activeTopic, onChangeTopic }: TopicsListProps) {
|
||||||
const size = useWindowSize();
|
const size = useWindowSize();
|
||||||
|
|
||||||
if (!size.isSmall) {
|
if (!size.isSmall) {
|
||||||
return (
|
return <TopicsStatic activeTopic={activeTopic} onChangeTopic={onChangeTopic} />;
|
||||||
<TopicsStatic
|
|
||||||
activeTopic={activeTopic}
|
|
||||||
onChangeTopic={onChangeTopic}
|
|
||||||
topicFolded={topicFolded}
|
|
||||||
onFoldTopic={onFoldTopic}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
return (
|
return <TopicsDropdown activeTopic={activeTopic} onChangeTopic={onChangeTopic} />;
|
||||||
<TopicsDropdown
|
|
||||||
activeTopic={activeTopic}
|
|
||||||
onChangeTopic={onChangeTopic}
|
|
||||||
topicFolded={topicFolded}
|
|
||||||
onFoldTopic={onFoldTopic}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,10 @@ import TopicsTree from './TopicsTree';
|
||||||
|
|
||||||
interface TopicsStaticProps {
|
interface TopicsStaticProps {
|
||||||
activeTopic: HelpTopic;
|
activeTopic: HelpTopic;
|
||||||
topicFolded: Map<HelpTopic, boolean>;
|
|
||||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function TopicsStatic({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsStaticProps) {
|
function TopicsStatic({ activeTopic, onChangeTopic }: TopicsStaticProps) {
|
||||||
const { calculateHeight } = useConceptOptions();
|
const { calculateHeight } = useConceptOptions();
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
@ -27,12 +25,7 @@ function TopicsStatic({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }:
|
||||||
)}
|
)}
|
||||||
style={{ maxHeight: calculateHeight('2.25rem + 2px') }}
|
style={{ maxHeight: calculateHeight('2.25rem + 2px') }}
|
||||||
>
|
>
|
||||||
<TopicsTree
|
<TopicsTree activeTopic={activeTopic} onChangeTopic={onChangeTopic} />
|
||||||
activeTopic={activeTopic}
|
|
||||||
onChangeTopic={onChangeTopic}
|
|
||||||
topicFolded={topicFolded}
|
|
||||||
onFoldTopic={onFoldTopic}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import { AnimatePresence, motion } from 'framer-motion';
|
import { AnimatePresence, motion } from 'framer-motion';
|
||||||
import { useCallback } from 'react';
|
import { useCallback, useLayoutEffect, useState } from 'react';
|
||||||
|
|
||||||
import { IconDropArrow, IconPageRight } from '@/components/Icons';
|
import { IconDropArrow, IconPageRight } from '@/components/Icons';
|
||||||
import { CProps } from '@/components/props';
|
import { CProps } from '@/components/props';
|
||||||
|
@ -15,12 +15,60 @@ import { describeHelpTopic, labelHelpTopic } from '@/utils/labels';
|
||||||
|
|
||||||
interface TopicsTreeProps {
|
interface TopicsTreeProps {
|
||||||
activeTopic: HelpTopic;
|
activeTopic: HelpTopic;
|
||||||
topicFolded: Map<HelpTopic, boolean>;
|
|
||||||
onChangeTopic: (newTopic: HelpTopic) => void;
|
onChangeTopic: (newTopic: HelpTopic) => void;
|
||||||
onFoldTopic: (target: HelpTopic, showChildren: boolean) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function TopicsTree({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: TopicsTreeProps) {
|
function TopicsTree({ activeTopic, onChangeTopic }: TopicsTreeProps) {
|
||||||
|
const [topicFolded, setFolded] = useState<Map<HelpTopic, boolean>>(
|
||||||
|
new Map(
|
||||||
|
Object.values(HelpTopic).map(value => {
|
||||||
|
const topic = value as HelpTopic;
|
||||||
|
return [topic, true];
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
useLayoutEffect(() => {
|
||||||
|
setFolded(
|
||||||
|
new Map(
|
||||||
|
Object.values(HelpTopic).map(value => {
|
||||||
|
const topic = value as HelpTopic;
|
||||||
|
return [
|
||||||
|
topic,
|
||||||
|
topicParent.get(activeTopic) !== topic && topicParent.get(topicParent.get(activeTopic)!) !== topic
|
||||||
|
];
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}, [activeTopic]);
|
||||||
|
|
||||||
|
const onFoldTopic = useCallback(
|
||||||
|
(target: HelpTopic, showChildren: boolean) => {
|
||||||
|
if (topicFolded.get(target) === !showChildren) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setFolded(
|
||||||
|
new Map(
|
||||||
|
Object.values(HelpTopic).map(value => {
|
||||||
|
const topic = value as HelpTopic;
|
||||||
|
if (topic === target) {
|
||||||
|
return [topic, !showChildren];
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!showChildren &&
|
||||||
|
(topicParent.get(topic) === target || topicParent.get(topicParent.get(topic)!) === target)
|
||||||
|
) {
|
||||||
|
return [topic, true];
|
||||||
|
}
|
||||||
|
const oldValue = topicFolded.get(topic)!;
|
||||||
|
return [topic, oldValue];
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
[topicFolded]
|
||||||
|
);
|
||||||
|
|
||||||
const handleClickFold = useCallback(
|
const handleClickFold = useCallback(
|
||||||
(event: CProps.EventMouse, topic: HelpTopic, showChildren: boolean) => {
|
(event: CProps.EventMouse, topic: HelpTopic, showChildren: boolean) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
@ -29,6 +77,7 @@ function TopicsTree({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: To
|
||||||
},
|
},
|
||||||
[onFoldTopic]
|
[onFoldTopic]
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AnimatePresence initial={false}>
|
<AnimatePresence initial={false}>
|
||||||
{Object.values(HelpTopic).map((topic, index) => {
|
{Object.values(HelpTopic).map((topic, index) => {
|
||||||
|
|
|
@ -378,8 +378,8 @@ export function labelHelpTopic(topic: HelpTopic): string {
|
||||||
case HelpTopic.RSL_TYPES: return 'Типизация';
|
case HelpTopic.RSL_TYPES: return 'Типизация';
|
||||||
case HelpTopic.RSL_CORRECT: return 'Переносимость';
|
case HelpTopic.RSL_CORRECT: return 'Переносимость';
|
||||||
case HelpTopic.RSL_INTERPRET: return 'Интерпретируемость';
|
case HelpTopic.RSL_INTERPRET: return 'Интерпретируемость';
|
||||||
case HelpTopic.RSL_TEMPLATES: return 'Шаблоны выражений';
|
|
||||||
case HelpTopic.RSL_OPERATIONS: return 'Операции';
|
case HelpTopic.RSL_OPERATIONS: return 'Операции';
|
||||||
|
case HelpTopic.RSL_TEMPLATES: return 'Шаблоны выражений';
|
||||||
|
|
||||||
case HelpTopic.TERM_CONTROL: return 'Терминологизация';
|
case HelpTopic.TERM_CONTROL: return 'Терминологизация';
|
||||||
case HelpTopic.VERSIONS: return 'Версионирование';
|
case HelpTopic.VERSIONS: return 'Версионирование';
|
||||||
|
@ -415,8 +415,8 @@ export function describeHelpTopic(topic: HelpTopic): string {
|
||||||
case HelpTopic.RSL_TYPES: return 'система типов в родоструктурной экспликации';
|
case HelpTopic.RSL_TYPES: return 'система типов в родоструктурной экспликации';
|
||||||
case HelpTopic.RSL_CORRECT: return 'корректность и переносимость определений';
|
case HelpTopic.RSL_CORRECT: return 'корректность и переносимость определений';
|
||||||
case HelpTopic.RSL_INTERPRET: return 'интерпретация формальных определений';
|
case HelpTopic.RSL_INTERPRET: return 'интерпретация формальных определений';
|
||||||
case HelpTopic.RSL_TEMPLATES: return 'работа с шаблонными выражениями';
|
|
||||||
case HelpTopic.RSL_OPERATIONS: return 'операции над концептуальными схемами';
|
case HelpTopic.RSL_OPERATIONS: return 'операции над концептуальными схемами';
|
||||||
|
case HelpTopic.RSL_TEMPLATES: return 'работа с шаблонными выражениями';
|
||||||
|
|
||||||
case HelpTopic.TERM_CONTROL: return 'справка по контролю терминов и текстовым отсылкам';
|
case HelpTopic.TERM_CONTROL: return 'справка по контролю терминов и текстовым отсылкам';
|
||||||
case HelpTopic.VERSIONS: return 'справка по управлению версиями схем';
|
case HelpTopic.VERSIONS: return 'справка по управлению версиями схем';
|
||||||
|
|
Loading…
Reference in New Issue
Block a user