Improve help UI + minor fixes

This commit is contained in:
IRBorisov 2024-05-16 14:01:06 +03:00
parent 0487324514
commit 62e30d474b
24 changed files with 212 additions and 136 deletions

View File

@ -101,7 +101,7 @@ class RSForm:
cst.save() cst.save()
def get_max_index(self, cst_type: CstType) -> int: def get_max_index(self, cst_type: CstType) -> int:
''' Get maximum alias index for specific CstType ''' ''' Get maximum alias index for specific CstType. '''
result: int = 0 result: int = 0
items = Constituenta.objects \ items = Constituenta.objects \
.filter(schema=self.item, cst_type=cst_type) \ .filter(schema=self.item, cst_type=cst_type) \

View File

@ -40,6 +40,7 @@ def inline_synthesis(request: Request):
index = next(i for (i, cst) in enumerate(items) if cst == replacement) index = next(i for (i, cst) in enumerate(items) if cst == replacement)
replacement = new_items[index] replacement = new_items[index]
schema.substitute(original, replacement, substitution['transfer_term']) schema.substitute(original, replacement, substitution['transfer_term'])
schema.restore_order() schema.restore_order()
return Response( return Response(
status=c.HTTP_200_OK, status=c.HTTP_200_OK,

View File

@ -9,7 +9,7 @@
"version": "1.0.0", "version": "1.0.0",
"dependencies": { "dependencies": {
"@lezer/lr": "^1.4.0", "@lezer/lr": "^1.4.0",
"@tanstack/react-table": "^8.17.0", "@tanstack/react-table": "^8.17.3",
"@uiw/codemirror-themes": "^4.22.0", "@uiw/codemirror-themes": "^4.22.0",
"@uiw/react-codemirror": "^4.22.0", "@uiw/react-codemirror": "^4.22.0",
"axios": "^1.6.8", "axios": "^1.6.8",
@ -34,7 +34,7 @@
"devDependencies": { "devDependencies": {
"@lezer/generator": "^1.7.0", "@lezer/generator": "^1.7.0",
"@types/jest": "^29.5.12", "@types/jest": "^29.5.12",
"@types/node": "^20.12.11", "@types/node": "^20.12.12",
"@types/react": "^18.3.2", "@types/react": "^18.3.2",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/eslint-plugin": "^6.21.0",
@ -646,9 +646,9 @@
} }
}, },
"node_modules/@codemirror/lint": { "node_modules/@codemirror/lint": {
"version": "6.7.0", "version": "6.7.1",
"resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.7.0.tgz", "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.7.1.tgz",
"integrity": "sha512-LTLOL2nT41ADNSCCCCw8Q/UmdAFzB23OUYSjsHTdsVaH0XEo+orhuqbDNWzrzodm14w6FOxqxpmy4LF8Lixqjw==", "integrity": "sha512-rELba6QJD20/bNXWP/cKTGLrwVEcpa2ViwULCV03ONcY1Je85++7sczVRUlnE4TJMjatx3IJTz6HX4NXi+moXw==",
"dependencies": { "dependencies": {
"@codemirror/state": "^6.0.0", "@codemirror/state": "^6.0.0",
"@codemirror/view": "^6.0.0", "@codemirror/view": "^6.0.0",
@ -1306,9 +1306,9 @@
} }
}, },
"node_modules/@floating-ui/core": { "node_modules/@floating-ui/core": {
"version": "1.6.1", "version": "1.6.2",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz",
"integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==",
"dependencies": { "dependencies": {
"@floating-ui/utils": "^0.2.0" "@floating-ui/utils": "^0.2.0"
} }
@ -2655,11 +2655,11 @@
} }
}, },
"node_modules/@tanstack/react-table": { "node_modules/@tanstack/react-table": {
"version": "8.17.0", "version": "8.17.3",
"resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.17.0.tgz", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.17.3.tgz",
"integrity": "sha512-LSJxTDzlKGs8EN7/UHB1l3yLR9HUIxoHFkTbTjHaUUGL4kgYZFYhsQsdDJSIykG86qpIA/6gSWmtwNfy5Iprhw==", "integrity": "sha512-5gwg5SvPD3lNAXPuJJz1fOCEZYk9/GeBFH3w/hCgnfyszOIzwkwgp5I7Q4MJtn0WECp84b5STQUDdmvGi8m3nA==",
"dependencies": { "dependencies": {
"@tanstack/table-core": "8.16.0" "@tanstack/table-core": "8.17.3"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=12"
@ -2674,9 +2674,9 @@
} }
}, },
"node_modules/@tanstack/table-core": { "node_modules/@tanstack/table-core": {
"version": "8.16.0", "version": "8.17.3",
"resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.16.0.tgz", "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.17.3.tgz",
"integrity": "sha512-dCG8vQGk4js5v88/k83tTedWOwjGnIyONrKpHpfmSJB8jwFHl8GSu1sBBxbtACVAPtAQgwNxl0rw1d3RqRM1Tg==", "integrity": "sha512-mPBodDGVL+fl6d90wUREepHa/7lhsghg2A3vFpakEhrhtbIlgNAZiMr7ccTgak5qbHqF14Fwy+W1yFWQt+WmYQ==",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
@ -2732,9 +2732,9 @@
} }
}, },
"node_modules/@types/draco3d": { "node_modules/@types/draco3d": {
"version": "1.4.9", "version": "1.4.10",
"resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.9.tgz", "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz",
"integrity": "sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA==" "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw=="
}, },
"node_modules/@types/graceful-fs": { "node_modules/@types/graceful-fs": {
"version": "4.1.9", "version": "4.1.9",
@ -2795,9 +2795,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.12.11", "version": "20.12.12",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz",
"integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
@ -3771,9 +3771,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001617", "version": "1.0.30001618",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz",
"integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -4500,9 +4500,9 @@
"dev": true "dev": true
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.763", "version": "1.4.769",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.769.tgz",
"integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==" "integrity": "sha512-bZu7p623NEA2rHTc9K1vykl57ektSPQYFFqQir8BOYf6EKOB+yIsbFB9Kpm7Cgt6tsLr9sRkqfqSZUw7LP1XxQ=="
}, },
"node_modules/ellipsize": { "node_modules/ellipsize": {
"version": "0.5.1", "version": "0.5.1",
@ -8292,9 +8292,9 @@
} }
}, },
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
}, },
"node_modules/picomatch": { "node_modules/picomatch": {
"version": "2.3.1", "version": "2.3.1",
@ -10001,9 +10001,9 @@
"dev": true "dev": true
}, },
"node_modules/update-browserslist-db": { "node_modules/update-browserslist-db": {
"version": "1.0.15", "version": "1.0.16",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
"integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -10020,7 +10020,7 @@
], ],
"dependencies": { "dependencies": {
"escalade": "^3.1.2", "escalade": "^3.1.2",
"picocolors": "^1.0.0" "picocolors": "^1.0.1"
}, },
"bin": { "bin": {
"update-browserslist-db": "cli.js" "update-browserslist-db": "cli.js"

View File

@ -13,7 +13,7 @@
}, },
"dependencies": { "dependencies": {
"@lezer/lr": "^1.4.0", "@lezer/lr": "^1.4.0",
"@tanstack/react-table": "^8.17.0", "@tanstack/react-table": "^8.17.3",
"@uiw/codemirror-themes": "^4.22.0", "@uiw/codemirror-themes": "^4.22.0",
"@uiw/react-codemirror": "^4.22.0", "@uiw/react-codemirror": "^4.22.0",
"axios": "^1.6.8", "axios": "^1.6.8",
@ -38,7 +38,7 @@
"devDependencies": { "devDependencies": {
"@lezer/generator": "^1.7.0", "@lezer/generator": "^1.7.0",
"@types/jest": "^29.5.12", "@types/jest": "^29.5.12",
"@types/node": "^20.12.11", "@types/node": "^20.12.12",
"@types/react": "^18.3.2", "@types/react": "^18.3.2",
"@types/react-dom": "^18.3.0", "@types/react-dom": "^18.3.0",
"@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/eslint-plugin": "^6.21.0",

View File

@ -9,7 +9,7 @@ function Logo() {
return ( return (
<img <img
alt='Логотип КонцептПортал' alt=''
className={clsx('max-h-[1.6rem] w-fit')} className={clsx('max-h-[1.6rem] w-fit')}
src={size.isSmall ? '/logo_sign.svg' : !darkMode ? '/logo_full.svg' : '/logo_full_dark.svg'} src={size.isSmall ? '/logo_sign.svg' : !darkMode ? '/logo_full.svg' : '/logo_full_dark.svg'}
/> />

View File

@ -15,7 +15,6 @@ import HelpMain from '../man/HelpMain';
import HelpPrivacy from '../man/HelpPrivacy'; import HelpPrivacy from '../man/HelpPrivacy';
import HelpRSFormItems from '../man/HelpRSFormItems'; import HelpRSFormItems from '../man/HelpRSFormItems';
import HelpRSFormMeta from '../man/HelpRSFormMeta'; import HelpRSFormMeta from '../man/HelpRSFormMeta';
import HelpRSFormUI from '../man/HelpRSFormUI';
import HelpRSLang from '../man/HelpRSLang'; import HelpRSLang from '../man/HelpRSLang';
import HelpRSLangCorrect from '../man/HelpRSLangCorrect'; import HelpRSLangCorrect from '../man/HelpRSLangCorrect';
import HelpRSLangInterpret from '../man/HelpRSLangInterpret'; import HelpRSLangInterpret from '../man/HelpRSLangInterpret';
@ -35,10 +34,9 @@ function InfoTopic({ topic }: InfoTopicProps) {
if (topic === HelpTopic.INTERFACE) return <HelpInterface />; if (topic === HelpTopic.INTERFACE) return <HelpInterface />;
if (topic === HelpTopic.UI_LIBRARY) return <HelpLibrary />; if (topic === HelpTopic.UI_LIBRARY) return <HelpLibrary />;
if (topic === HelpTopic.UI_RSFORM) return <HelpRSFormUI />; if (topic === HelpTopic.UI_RS_CARD) return <HelpRSFormMeta />;
if (topic === HelpTopic.UI_RSFORM_CARD) return <HelpRSFormMeta />; if (topic === HelpTopic.UI_RS_LIST) return <HelpRSFormItems />;
if (topic === HelpTopic.UI_RSFORM_LIST) return <HelpRSFormItems />; if (topic === HelpTopic.UI_RS_EDITOR) return <HelpCstEditor />;
if (topic === HelpTopic.UI_RSFORM_EDITOR) return <HelpCstEditor />;
if (topic === HelpTopic.UI_GRAPH_TERM) return <HelpTermGraph />; if (topic === HelpTopic.UI_GRAPH_TERM) return <HelpTermGraph />;
if (topic === HelpTopic.UI_CST_STATUS) return <HelpCstStatus />; if (topic === HelpTopic.UI_CST_STATUS) return <HelpCstStatus />;
if (topic === HelpTopic.UI_CST_CLASS) return <HelpCstClass />; if (topic === HelpTopic.UI_CST_CLASS) return <HelpCstClass />;

View File

@ -1,9 +1,15 @@
import { HelpTopic } from '@/models/miscellaneous';
import Subtopics from './Subtopics';
function HelpConceptSystem() { function HelpConceptSystem() {
// prettier-ignore // prettier-ignore
return ( return (
<div> <div>
<h1>Концептуализация</h1> <h1>Концептуализация</h1>
<p>TBD</p> <p>TBD</p>
<Subtopics headTopic={HelpTopic.CONCEPTUAL} />
</div>); </div>);
} }

View File

@ -1,7 +1,6 @@
import { urls } from '@/app/urls';
import { HelpTopic } from '@/models/miscellaneous'; import { HelpTopic } from '@/models/miscellaneous';
import TextURL from '../ui/TextURL'; import LinkTopic from '../ui/LinkTopic';
function HelpCstAttributes() { function HelpCstAttributes() {
// prettier-ignore // prettier-ignore
@ -9,7 +8,7 @@ function HelpCstAttributes() {
<div className='dense'> <div className='dense'>
<h1>Атрибуты конституенты</h1> <h1>Атрибуты конституенты</h1>
<p><b>Термин</b> может быть присвоен любой конституенте. Он используется в других Терминах и в Текстовых определениях</p> <p><b>Термин</b> может быть присвоен любой конституенте. Он используется в других Терминах и в Текстовых определениях</p>
<p><b>Формальное определение</b> строится с помощью формального аппарата <TextURL text='родоструктурной экспликации' href={urls.help_topic(HelpTopic.RSLANG)}/></p> <p><b>Формальное определение</b> строится с помощью формального аппарата <LinkTopic text='родоструктурной экспликации' topic={HelpTopic.RSLANG}/></p>
<p><b>Типизация</b> вычисляется автоматически на основе Формального определения и отражает структуру элементов множества, задаваемого этим определением</p> <p><b>Типизация</b> вычисляется автоматически на основе Формального определения и отражает структуру элементов множества, задаваемого этим определением</p>
<p><b>Текстовое определение</b> предоставляется для конституент, имеющих Формальное определение или Область определения. Это текстовая интерпретация формального определения и строится из связующих слов, терминов теории множеств и отсылок на термины ранее введенных конституент</p> <p><b>Текстовое определение</b> предоставляется для конституент, имеющих Формальное определение или Область определения. Это текстовая интерпретация формального определения и строится из связующих слов, терминов теории множеств и отсылок на термины ранее введенных конституент</p>
<p><b>Конвенция</b> это соглашение о соотнесении неопределенного понятия с сущностями в предметной области</p> <p><b>Конвенция</b> это соглашение о соотнесении неопределенного понятия с сущностями в предметной области</p>

View File

@ -1,9 +1,21 @@
import { HelpTopic } from '@/models/miscellaneous';
import Subtopics from './Subtopics';
function HelpInterface() { function HelpInterface() {
// prettier-ignore // prettier-ignore
return ( return (
<div> <div>
<h1>Пользовательский интерфейс</h1> <h1>Пользовательский интерфейс</h1>
<p>TBD</p>
<p>Общие принципы построения интерфейса</p>
<h2>Навигация и настройки</h2>
<li>Навигационную панель можно скрыть с помощью кнопки в правом верхнем углу</li>
<li>В меню пользователя доступен ряд настроек и управление активным профилем</li>
<br/>
<Subtopics headTopic={HelpTopic.INTERFACE} />
</div>); </div>);
} }

View File

@ -1,31 +1,44 @@
import { urls } from '@/app/urls'; import { urls } from '@/app/urls';
import TextURL from '@/components/ui/TextURL'; import TextURL from '@/components/ui/TextURL';
import { HelpTopic } from '@/models/miscellaneous'; import { HelpTopic } from '@/models/miscellaneous';
import { external_urls } from '@/utils/constants'; import { external_urls, prefixes } from '@/utils/constants';
import LinkTopic from '../ui/LinkTopic';
import TopicItem from './TopicItem';
function HelpMain() { function HelpMain() {
// prettier-ignore // prettier-ignore
return ( return (
<div> <div>
<h1>Портал</h1> <h1>Портал</h1>
<p>Портал позволяет анализировать предметные области, формально записывать системы определений и синтезировать их с помощью математического <TextURL text='аппарата родов структур' href={urls.help_topic(HelpTopic.RSLANG)}/></p> <p>Портал позволяет анализировать предметные области, формально записывать системы определений и синтезировать их с помощью математического аппарата <LinkTopic text='Родов структур' topic={HelpTopic.RSLANG}/></p>
<p>Такие системы называются <b>Концептуальными схемами</b> и состоят из отдельных <TextURL text='Конституент' href={urls.help_topic(HelpTopic.CC_CONSTITUENTA)}/>, обладающих уникальными обозначениями и формальными определениями</p> <p>Такие системы называются <b>Концептуальными схемами</b> и состоят из отдельных <LinkTopic text='Конституент' topic={HelpTopic.CC_CONSTITUENTA}/>, обладающих уникальными обозначениями и формальными определениями</p>
<br/> <br/>
<h2>Основные разделы</h2> <h2>Разделы Портала</h2>
<li><TextURL text='Библиотека' href={urls.library} /> библиотека концептуальных схем</li> <li><TextURL text='Библиотека' href={urls.library} /> библиотека концептуальных схем</li>
<li><TextURL text='Справка' href={urls.manuals} /> справочные материалы</li> <li><TextURL text='Справка' href={urls.manuals} /> справочные материалы</li>
<li><TextURL text='Профиль' href={urls.profile} /> данные пользователя и смена пароля</li> <li><TextURL text='Профиль' href={urls.profile} /> данные пользователя и смена пароля</li>
<br/> <br/>
<h2>Навигация и настройки</h2> <h2>Разделы Справки</h2>
<li>Навигационную панель можно скрыть с помощью кнопки в правом верхнем углу</li> {[
<li>В меню пользователя доступен ряд настроек и управление активным профилем</li> HelpTopic.INTERFACE,
HelpTopic.CONCEPTUAL,
HelpTopic.RSLANG,
HelpTopic.TERM_CONTROL,
HelpTopic.VERSIONS,
HelpTopic.EXTEOR,
HelpTopic.API,
HelpTopic.PRIVACY
].map(topic =>
<TopicItem key={`${prefixes.topic_item}${topic}`} topic={topic} />
)}
<br/> <br/>
<h2>Лицензирование и раскрытие информации</h2> <h2>Лицензирование и раскрытие информации</h2>
<li>Пользователи Портала сохраняют авторские права на создаваемый ими контент</li> <li>Пользователи Портала сохраняют авторские права на создаваемый ими контент</li>
<li>Политика обработки данных доступна по <TextURL text='ссылке' href={urls.help_topic(HelpTopic.PRIVACY)} /></li> <li>Политика обработки данных доступна по <LinkTopic text='ссылке' topic={HelpTopic.PRIVACY}/></li>
<li>Портал является проектом с открытым исходным кодом, доступным на <TextURL text='Github' href={external_urls.git_repo}/></li> <li>Портал является проектом с открытым исходным кодом, доступным на <TextURL text='Github' href={external_urls.git_repo}/></li>
<li>Данный сайт использует доменное имя и серверные мощности <TextURL text='Центра Концепт' href={external_urls.concept}/></li> <li>Данный сайт использует доменное имя и серверные мощности <TextURL text='Центра Концепт' href={external_urls.concept}/></li>
<br/> <br/>

View File

@ -1,17 +1,16 @@
import { urls } from '@/app/urls';
import InfoCstStatus from '@/components/info/InfoCstStatus'; import InfoCstStatus from '@/components/info/InfoCstStatus';
import Divider from '@/components/ui/Divider'; import Divider from '@/components/ui/Divider';
import { HelpTopic } from '@/models/miscellaneous'; import { HelpTopic } from '@/models/miscellaneous';
import { IconAlias, IconMoveDown, IconMoveUp } from '../Icons'; import { IconAlias, IconMoveDown, IconMoveUp } from '../Icons';
import TextURL from '../ui/TextURL'; import LinkTopic from '../ui/LinkTopic';
function HelpRSFormItems() { function HelpRSFormItems() {
// prettier-ignore // prettier-ignore
return ( return (
<div className='dense'> <div className='dense'>
<h1>Список конституент</h1> <h1>Список конституент</h1>
<p><IconAlias className='inline-icon'/>Конституенты обладают уникальным <TextURL text='Именем' href={urls.help_topic(HelpTopic.CC_CONSTITUENTA)}/></p> <p><IconAlias className='inline-icon'/>Конституенты обладают уникальным <LinkTopic text='Именем' topic={HelpTopic.CC_CONSTITUENTA}/></p>
<p><IconMoveUp className='inline-icon'/><IconMoveDown className='inline-icon'/> Список поддерживает выделение и перемещение </p> <p><IconMoveUp className='inline-icon'/><IconMoveDown className='inline-icon'/> Список поддерживает выделение и перемещение </p>
<h2>Управление списком</h2> <h2>Управление списком</h2>

View File

@ -1,8 +1,7 @@
import { urls } from '@/app/urls';
import { HelpTopic } from '@/models/miscellaneous'; import { HelpTopic } from '@/models/miscellaneous';
import { IconClone, IconDownload, IconFollow, IconImmutable, IconOwner, IconPublic, IconSave } from '../Icons'; import { IconClone, IconDownload, IconFollow, IconImmutable, IconOwner, IconPublic, IconSave } from '../Icons';
import TextURL from '../ui/TextURL'; import LinkTopic from '../ui/LinkTopic';
function HelpRSFormMeta() { function HelpRSFormMeta() {
// prettier-ignore // prettier-ignore
@ -11,7 +10,7 @@ function HelpRSFormMeta() {
<h1>Карточка схемы</h1> <h1>Карточка схемы</h1>
<p>Карточка схемы содержит общую информацию и статистику схемы</p> <p>Карточка схемы содержит общую информацию и статистику схемы</p>
<p>Карточка схемы позволяет управлять атрибутами схемы и ее <TextURL text='версиями' href={urls.help_topic(HelpTopic.VERSIONS)}/></p> <p>Карточка схемы позволяет управлять атрибутами схемы и ее <LinkTopic text='версиями' topic={HelpTopic.VERSIONS}/></p>
<h2>Управление</h2> <h2>Управление</h2>
<li><IconSave className='inline-icon'/> сохранить изменения: Ctrl + S</li> <li><IconSave className='inline-icon'/> сохранить изменения: Ctrl + S</li>

View File

@ -1,10 +0,0 @@
function HelpRSFormUI() {
// prettier-ignore
return (
<div>
<h1>Интерфейс Концептуальной схемы</h1>
<p>TBD</p>
</div>);
}
export default HelpRSFormUI;

View File

@ -2,8 +2,11 @@ import { useMemo } from 'react';
import EmbedYoutube from '@/components/ui/EmbedYoutube'; import EmbedYoutube from '@/components/ui/EmbedYoutube';
import useWindowSize from '@/hooks/useWindowSize'; import useWindowSize from '@/hooks/useWindowSize';
import { HelpTopic } from '@/models/miscellaneous';
import { external_urls, youtube } from '@/utils/constants'; import { external_urls, youtube } from '@/utils/constants';
import Subtopics from './Subtopics';
function HelpRSLang() { function HelpRSLang() {
const windowSize = useWindowSize(); const windowSize = useWindowSize();
@ -20,7 +23,6 @@ function HelpRSLang() {
<div className='dense'> <div className='dense'>
<h1>Родоструктурная экспликация концептуальных схем</h1> <h1>Родоструктурная экспликация концептуальных схем</h1>
<p>Формальная запись (<i>экспликация</i>) концептуальных схем осуществляется с помощью языка родов структур.</p> <p>Формальная запись (<i>экспликация</i>) концептуальных схем осуществляется с помощью языка родов структур.</p>
<p>Данный математический аппарат основан на аксиоматической теории множеств Цермелло-Френкеля и аппарате родов структур Н.Бурбаки.</p>
<br /> <br />
<p>Для ознакомления с основами родов структур можно использовать следующие материалы:</p> <p>Для ознакомления с основами родов структур можно использовать следующие материалы:</p>
<p>1. <a className='underline' href={external_urls.intro_video}>Видео: Краткое введение в мат. аппарат</a></p> <p>1. <a className='underline' href={external_urls.intro_video}>Видео: Краткое введение в мат. аппарат</a></p>
@ -33,6 +35,9 @@ function HelpRSLang() {
pxHeight={videoHeight} pxHeight={videoHeight}
/> />
</div> </div>
<div className='dense'>
<Subtopics headTopic={HelpTopic.RSLANG} />
</div>
</div>); </div>);
} }

View File

@ -0,0 +1,23 @@
import { HelpTopic, topicParent } from '@/models/miscellaneous';
import { prefixes } from '@/utils/constants';
import TopicItem from './TopicItem';
interface SubtopicsProps {
headTopic: HelpTopic;
}
function Subtopics({ headTopic }: SubtopicsProps) {
return (
<>
<h2>Содержание раздела</h2>
{Object.values(HelpTopic)
.filter(topic => topic !== headTopic && topicParent.get(topic) === headTopic)
.map(topic => (
<TopicItem key={`${prefixes.topic_item}${topic}`} topic={topic} />
))}
</>
);
}
export default Subtopics;

View File

@ -0,0 +1,18 @@
import { HelpTopic } from '@/models/miscellaneous';
import { describeHelpTopic, labelHelpTopic } from '@/utils/labels';
import LinkTopic from '../ui/LinkTopic';
interface TopicItemProps {
topic: HelpTopic;
}
function TopicItem({ topic }: TopicItemProps) {
return (
<li>
<LinkTopic text={labelHelpTopic(topic)} topic={topic} /> {describeHelpTopic(topic)}
</li>
);
}
export default TopicItem;

View File

@ -0,0 +1,15 @@
import { urls } from '@/app/urls';
import { HelpTopic } from '@/models/miscellaneous';
import TextURL from './TextURL';
interface TextURLProps {
text: string;
topic: HelpTopic;
}
function LinkTopic({ text, topic }: TextURLProps) {
return <TextURL text={text} href={urls.help_topic(topic)} />;
}
export default LinkTopic;

View File

@ -46,10 +46,9 @@ export enum HelpTopic {
INTERFACE = 'user-interface', INTERFACE = 'user-interface',
UI_LIBRARY = 'ui-library', UI_LIBRARY = 'ui-library',
UI_RSFORM = 'ui-rsform', UI_RS_CARD = 'ui-rsform-card',
UI_RSFORM_CARD = 'ui-rsform-card', UI_RS_LIST = 'ui-rsform-list',
UI_RSFORM_LIST = 'ui-rsform-list', UI_RS_EDITOR = 'ui-rsform-editor',
UI_RSFORM_EDITOR = 'ui-rsform-editor',
UI_GRAPH_TERM = 'ui-rsform-graph', UI_GRAPH_TERM = 'ui-rsform-graph',
UI_CST_STATUS = 'ui-rsform-cst-status', UI_CST_STATUS = 'ui-rsform-cst-status',
UI_CST_CLASS = 'ui-rsform-cst-class', UI_CST_CLASS = 'ui-rsform-cst-class',
@ -81,13 +80,12 @@ export const topicParent: Map<HelpTopic, HelpTopic> = new Map([
[HelpTopic.INTERFACE, HelpTopic.INTERFACE], [HelpTopic.INTERFACE, HelpTopic.INTERFACE],
[HelpTopic.UI_LIBRARY, HelpTopic.INTERFACE], [HelpTopic.UI_LIBRARY, HelpTopic.INTERFACE],
[HelpTopic.UI_RSFORM, HelpTopic.INTERFACE], [HelpTopic.UI_RS_CARD, HelpTopic.INTERFACE],
[HelpTopic.UI_RSFORM_CARD, HelpTopic.UI_RSFORM], [HelpTopic.UI_RS_LIST, HelpTopic.INTERFACE],
[HelpTopic.UI_RSFORM_LIST, HelpTopic.UI_RSFORM], [HelpTopic.UI_RS_EDITOR, HelpTopic.INTERFACE],
[HelpTopic.UI_RSFORM_EDITOR, HelpTopic.UI_RSFORM], [HelpTopic.UI_GRAPH_TERM, HelpTopic.INTERFACE],
[HelpTopic.UI_GRAPH_TERM, HelpTopic.UI_RSFORM], [HelpTopic.UI_CST_STATUS, HelpTopic.INTERFACE],
[HelpTopic.UI_CST_STATUS, HelpTopic.UI_RSFORM], [HelpTopic.UI_CST_CLASS, HelpTopic.INTERFACE],
[HelpTopic.UI_CST_CLASS, HelpTopic.UI_RSFORM],
[HelpTopic.CONCEPTUAL, HelpTopic.CONCEPTUAL], [HelpTopic.CONCEPTUAL, HelpTopic.CONCEPTUAL],
[HelpTopic.CC_SYSTEM, HelpTopic.CONCEPTUAL], [HelpTopic.CC_SYSTEM, HelpTopic.CONCEPTUAL],
@ -111,7 +109,7 @@ export const topicParent: Map<HelpTopic, HelpTopic> = new Map([
/** /**
* Topics that can be folded. * Topics that can be folded.
*/ */
export const foldableTopics = [HelpTopic.INTERFACE, HelpTopic.UI_RSFORM, HelpTopic.RSLANG, HelpTopic.CONCEPTUAL]; export const foldableTopics = [HelpTopic.INTERFACE, HelpTopic.RSLANG, HelpTopic.CONCEPTUAL];
/** /**
* Represents {@link IConstituenta} matching mode. * Represents {@link IConstituenta} matching mode.

View File

@ -10,7 +10,7 @@ import MiniButton from '@/components/ui/MiniButton';
import Overlay from '@/components/ui/Overlay'; import Overlay from '@/components/ui/Overlay';
import { foldableTopics, HelpTopic, topicParent } from '@/models/miscellaneous'; import { foldableTopics, HelpTopic, topicParent } from '@/models/miscellaneous';
import { animateSideAppear } from '@/styling/animations'; import { animateSideAppear } from '@/styling/animations';
import { prefixes } from '@/utils/constants'; import { globals, prefixes } from '@/utils/constants';
import { describeHelpTopic, labelHelpTopic } from '@/utils/labels'; import { describeHelpTopic, labelHelpTopic } from '@/utils/labels';
interface TopicsTreeProps { interface TopicsTreeProps {
@ -49,7 +49,8 @@ function TopicsTree({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: To
'cursor-pointer', 'cursor-pointer',
activeTopic === topic && 'clr-selected' activeTopic === topic && 'clr-selected'
)} )}
title={describeHelpTopic(topic)} data-tooltip-id={globals.tooltip}
data-tooltip-content={describeHelpTopic(topic)}
onClick={() => onChangeTopic(topic)} onClick={() => onChangeTopic(topic)}
initial={{ ...animateSideAppear.initial }} initial={{ ...animateSideAppear.initial }}
animate={{ ...animateSideAppear.animate }} animate={{ ...animateSideAppear.animate }}
@ -66,7 +67,7 @@ function TopicsTree({ activeTopic, topicFolded, onChangeTopic, onFoldTopic }: To
/> />
</Overlay> </Overlay>
) : null} ) : null}
{labelHelpTopic(topic)} {topicParent.get(topic) === topic ? labelHelpTopic(topic) : `- ${labelHelpTopic(topic).toLowerCase()}`}
</motion.div> </motion.div>
); );
})} })}

View File

@ -74,7 +74,7 @@ function ConstituentaToolbar({
disabled={disabled || modified} disabled={disabled || modified}
onClick={onMoveDown} onClick={onMoveDown}
/> />
<BadgeHelp topic={HelpTopic.UI_RSFORM_EDITOR} offset={4} /> <BadgeHelp topic={HelpTopic.UI_RS_EDITOR} offset={4} />
</Overlay> </Overlay>
); );
} }

View File

@ -81,7 +81,7 @@ function RSFormToolbar({ modified, anonymous, subscribed, claimable, onSubmit, o
onClick={onDestroy} onClick={onDestroy}
/> />
) : null} ) : null}
<BadgeHelp topic={HelpTopic.UI_RSFORM_CARD} offset={4} className='max-w-[32rem]' /> <BadgeHelp topic={HelpTopic.UI_RS_CARD} offset={4} className='max-w-[32rem]' />
</Overlay> </Overlay>
); );
} }

View File

@ -68,7 +68,7 @@ function RSListToolbar() {
disabled={controller.isProcessing || controller.nothingSelected} disabled={controller.isProcessing || controller.nothingSelected}
onClick={controller.deleteCst} onClick={controller.deleteCst}
/> />
<BadgeHelp topic={HelpTopic.UI_RSFORM_LIST} offset={5} /> <BadgeHelp topic={HelpTopic.UI_RS_LIST} offset={5} />
</Overlay> </Overlay>
); );
} }

View File

@ -137,6 +137,7 @@ export const prefixes = {
csttype_list: 'csttype_', csttype_list: 'csttype_',
library_filters_list: 'library_filters_list_', library_filters_list: 'library_filters_list_',
topic_list: 'topic_list_', topic_list: 'topic_list_',
topic_item: 'topic_item_',
library_list: 'library_list_', library_list: 'library_list_',
wordform_list: 'wordform_list_', wordform_list: 'wordform_list_',
rsedit_btn: 'rsedit_btn_', rsedit_btn: 'rsedit_btn_',

View File

@ -361,26 +361,25 @@ export function labelHelpTopic(topic: HelpTopic): string {
case HelpTopic.MAIN: return 'Портал'; case HelpTopic.MAIN: return 'Портал';
case HelpTopic.INTERFACE: return 'Интерфейс'; case HelpTopic.INTERFACE: return 'Интерфейс';
case HelpTopic.UI_LIBRARY: return '- библиотека'; case HelpTopic.UI_LIBRARY: return 'Библиотека';
case HelpTopic.UI_RSFORM: return '- концептуальная схема'; case HelpTopic.UI_RS_CARD: return 'Карточка схемы';
case HelpTopic.UI_RSFORM_CARD: return '= карточка схемы'; case HelpTopic.UI_RS_LIST: return 'Список конституент';
case HelpTopic.UI_RSFORM_LIST: return '= список конституент'; case HelpTopic.UI_RS_EDITOR: return 'Редактор конституенты';
case HelpTopic.UI_RSFORM_EDITOR: return '= редактор конституенты'; case HelpTopic.UI_GRAPH_TERM: return 'Граф термов';
case HelpTopic.UI_GRAPH_TERM: return '= граф термов'; case HelpTopic.UI_CST_STATUS: return 'Статус конституенты';
case HelpTopic.UI_CST_STATUS: return '= статус конституенты'; case HelpTopic.UI_CST_CLASS: return 'Класс конституенты';
case HelpTopic.UI_CST_CLASS: return '= класс конституенты';
case HelpTopic.CONCEPTUAL: return 'Концептуализация'; case HelpTopic.CONCEPTUAL: return 'Концептуализация';
case HelpTopic.CC_SYSTEM: return '- система определений'; case HelpTopic.CC_SYSTEM: return 'Система определений';
case HelpTopic.CC_CONSTITUENTA: return '- конституента'; case HelpTopic.CC_CONSTITUENTA: return 'Конституента';
case HelpTopic.CC_RELATIONS: return '- связи понятий'; case HelpTopic.CC_RELATIONS: return 'Связи понятий';
case HelpTopic.RSLANG: return 'Экспликация'; case HelpTopic.RSLANG: return 'Экспликация';
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_TEMPLATES: return 'Шаблоны выражений';
case HelpTopic.RSL_OPERATIONS: return '- операции'; case HelpTopic.RSL_OPERATIONS: return 'Операции';
case HelpTopic.TERM_CONTROL: return 'Терминологизация'; case HelpTopic.TERM_CONTROL: return 'Терминологизация';
case HelpTopic.VERSIONS: return 'Версионирование'; case HelpTopic.VERSIONS: return 'Версионирование';
@ -396,35 +395,34 @@ export function labelHelpTopic(topic: HelpTopic): string {
export function describeHelpTopic(topic: HelpTopic): string { export function describeHelpTopic(topic: HelpTopic): string {
// prettier-ignore // prettier-ignore
switch (topic) { switch (topic) {
case HelpTopic.MAIN: return 'Общая справка по порталу'; case HelpTopic.MAIN: return 'общая справка по порталу';
case HelpTopic.INTERFACE: return 'Описание интерфейса пользователя'; case HelpTopic.INTERFACE: return 'описание интерфейса пользователя';
case HelpTopic.UI_LIBRARY: return 'Интерфейс Библиотеки схем'; case HelpTopic.UI_LIBRARY: return 'интерфейс Библиотеки схем';
case HelpTopic.UI_RSFORM: return 'Просмотр и редактирование концептуальной схемы'; case HelpTopic.UI_RS_CARD: return 'интерфейс Карточки схемы';
case HelpTopic.UI_RSFORM_CARD: return 'Интерфейс Карточки схемы'; case HelpTopic.UI_RS_LIST: return 'интерфейс Списка конституент';
case HelpTopic.UI_RSFORM_LIST: return 'Интерфейс Списка конституент'; case HelpTopic.UI_RS_EDITOR: return 'интерфейс редактирования конституенты';
case HelpTopic.UI_RSFORM_EDITOR: return 'Интерфейс редактирования конституенты'; case HelpTopic.UI_GRAPH_TERM: return 'интерфейс графа термов';
case HelpTopic.UI_GRAPH_TERM: return 'Интерфейс графа термов'; case HelpTopic.UI_CST_STATUS: return 'нотация отображения статуса конституенты';
case HelpTopic.UI_CST_STATUS: return 'Нотация отображения статуса конституенты'; case HelpTopic.UI_CST_CLASS: return 'нотация отображения класса конституенты';
case HelpTopic.UI_CST_CLASS: return 'Нотация отображения класса конституенты';
case HelpTopic.CONCEPTUAL: return 'Основы концептуализации и концептуального мышления'; case HelpTopic.CONCEPTUAL: return 'основы концептуализации и концептуального мышления';
case HelpTopic.CC_SYSTEM: return 'Концептуальная схема как система понятий'; case HelpTopic.CC_SYSTEM: return 'концептуальная схема как система понятий';
case HelpTopic.CC_CONSTITUENTA: return 'Понятия конституенты и ее атрибутов'; case HelpTopic.CC_CONSTITUENTA: return 'понятия конституенты и ее атрибутов';
case HelpTopic.CC_RELATIONS: return 'Отношения между конституентами'; case HelpTopic.CC_RELATIONS: return 'отношения между конституентами';
case HelpTopic.RSLANG: return 'Справка по языку родов структур и экспликации'; case HelpTopic.RSLANG: return 'справка по языку родов структур и экспликации';
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_TEMPLATES: return 'работа с шаблонными выражениями';
case HelpTopic.RSL_OPERATIONS: return 'Операции над концептуальными схемами'; case HelpTopic.RSL_OPERATIONS: return 'операции над концептуальными схемами';
case HelpTopic.TERM_CONTROL: return 'Справка по контролю терминов и текстовым отсылкам'; case HelpTopic.TERM_CONTROL: return 'справка по контролю терминов и текстовым отсылкам';
case HelpTopic.VERSIONS: return 'Справка по управлению версиями схем'; case HelpTopic.VERSIONS: return 'справка по управлению версиями схем';
case HelpTopic.EXTEOR: return 'Справка по программе для экспликации "Экстеор" для Windows'; case HelpTopic.EXTEOR: return 'справка по программе для экспликации "Экстеор" для Windows';
case HelpTopic.API: return 'Интерфейс для разработчиков'; case HelpTopic.API: return 'интерфейс для разработчиков';
case HelpTopic.PRIVACY: return 'Политика обработки персональных данных'; case HelpTopic.PRIVACY: return 'политика обработки персональных данных';
} }
} }