diff --git a/TODO.txt b/TODO.txt index 16140382..5aa5fecc 100644 --- a/TODO.txt +++ b/TODO.txt @@ -2,33 +2,39 @@ For more specific TODOs see comments in code [Functionality - PROGRESS] -- Design first user experience -- Private projects. Consider cooperative editing - +- OSS change propagation: Advanced features [Functionality - PENDING] -- Search functionality for manuals -- User notifications on edit - consider spam prevention and change aggregation -- Static analyzer for RSForm as a whole: check term duplication and empty conventions -- Content based search in Library -- User profile: Settings + settings persistency - - Landing page -- Home page (user specific) +- Design first user experience +- Demo sandbox for anonymous users +- User profile: Settings + settings persistency +- Custom LibraryItem lists +- Custom user filters and sharing filters + +- Static analyzer for RSForm as a whole: check term duplication and empty conventions +- OSS clone and versioning + +- Focus on codemirror editor when label is clicked (need React 19 ref for clean code solution) - Draggable rows in constituents table +- replace reagraph with react-flow in TermGraph and FormulaGraph +- Search functionality for Help Manuals - Export PDF (Items list, Graph) - ARIA (accessibility considerations) - for now machine reading not supported - Internationalization - at least english version. Consider react.intl -- Focus on codemirror editor when label is clicked (need React 19 ref for clean code solution) - - Sitemap for better SEO and crawler optimization +[Functionality - CANCELED] +- User notifications on edit - consider spam prevention and change aggregation +- Content based search in Library +- Home page (user specific) +- Private projects. Consider cooperative editing [Tech] - duplicate syntax parsing and type info calculations to client. Consider moving backend to Nodejs or embedding c++ lib -- add debounce to some search fields +- add debounce to some search fields. Consider pagination and dynamic loading - DataTable: fixed percentage columns, especially for SubstituteTable. Rework column sizing mechanics - move autopep8 and isort settings from vscode settings to pyproject.toml - Test UI for #enable-force-dark Chrome setting diff --git a/rsconcept/frontend/src/components/Icons.tsx b/rsconcept/frontend/src/components/Icons.tsx index acd398fd..4bc49e4d 100644 --- a/rsconcept/frontend/src/components/Icons.tsx +++ b/rsconcept/frontend/src/components/Icons.tsx @@ -69,6 +69,16 @@ export { IoLibrary as IconLibrary2 } from 'react-icons/io5'; export { BiDiamond as IconTemplates } from 'react-icons/bi'; export { TbHexagons as IconOSS } from 'react-icons/tb'; export { TbHexagon as IconRSForm } from 'react-icons/tb'; +export { TbAssembly as IconRSFormOwned } from 'react-icons/tb'; +export { TbBallFootball as IconRSFormImported } from 'react-icons/tb'; +export { TbHexagonLetterX as IconCstBaseSet } from 'react-icons/tb'; +export { TbHexagonLetterC as IconCstConstSet } from 'react-icons/tb'; +export { TbHexagonLetterS as IconCstStructured } from 'react-icons/tb'; +export { TbHexagonLetterA as IconCstAxiom } from 'react-icons/tb'; +export { TbHexagonLetterD as IconCstTerm } from 'react-icons/tb'; +export { TbHexagonLetterF as IconCstFunction } from 'react-icons/tb'; +export { TbHexagonLetterP as IconCstPredicate } from 'react-icons/tb'; +export { TbHexagonLetterT as IconCstTheorem } from 'react-icons/tb'; export { LuNewspaper as IconDefinition } from 'react-icons/lu'; export { LuDna as IconTerminology } from 'react-icons/lu'; export { FaRegHandshake as IconConvention } from 'react-icons/fa6'; diff --git a/rsconcept/frontend/src/models/OssLoader.ts b/rsconcept/frontend/src/models/OssLoader.ts index b865dadf..ed16daf2 100644 --- a/rsconcept/frontend/src/models/OssLoader.ts +++ b/rsconcept/frontend/src/models/OssLoader.ts @@ -90,7 +90,8 @@ export class OssLoader { count_operations: items.length, count_inputs: items.filter(item => item.operation_type === OperationType.INPUT).length, count_synthesis: items.filter(item => item.operation_type === OperationType.SYNTHESIS).length, - count_schemas: this.schemaIDs.length + count_schemas: this.schemaIDs.length, + count_owned: items.filter(item => !!item.result && item.is_owned).length }; } } diff --git a/rsconcept/frontend/src/models/oss.ts b/rsconcept/frontend/src/models/oss.ts index 5d8e9ded..6410d2f5 100644 --- a/rsconcept/frontend/src/models/oss.ts +++ b/rsconcept/frontend/src/models/oss.ts @@ -154,6 +154,7 @@ export interface IOperationSchemaStats { count_inputs: number; count_synthesis: number; count_schemas: number; + count_owned: number; } /** diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx index c6adbd34..65605c72 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpMain.tsx @@ -37,13 +37,14 @@ function HelpMain() {

Разделы Справки

{[ - HelpTopic.INFO, + HelpTopic.THESAURUS, HelpTopic.INTERFACE, HelpTopic.CONCEPTUAL, HelpTopic.RSLANG, HelpTopic.TERM_CONTROL, HelpTopic.ACCESS, HelpTopic.VERSIONS, + HelpTopic.INFO, HelpTopic.EXTEOR ].map(topic => ( @@ -72,7 +73,7 @@ function HelpMain() { версию браузера в случае возникновения визуальных ошибок или проблем с производительностью.

- Ваши пожелания по доработке, найденные ошибки и иные предложения можно направлять по email:{' '} + Ваши пожелания по доработке, найденные ошибки и иные предложения можно направлять на email:{' '}

diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx index 1e5b293e..85098060 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpThesaurus.tsx @@ -1,5 +1,14 @@ import { IconChild, + IconConsolidation, + IconCstAxiom, + IconCstBaseSet, + IconCstConstSet, + IconCstFunction, + IconCstPredicate, + IconCstStructured, + IconCstTerm, + IconCstTheorem, IconDownload, IconGraphCollapse, IconGraphExpand, @@ -8,6 +17,8 @@ import { IconOSS, IconPredecessor, IconRSForm, + IconRSFormImported, + IconRSFormOwned, IconStatusError, IconStatusIncalculable, IconStatusOK, @@ -31,7 +42,8 @@ function HelpThesaurus() {

Концептуальная схема

- {' '} + + {'\u2009'} (система определений, КС) – совокупность отдельных понятий и утверждений, а также связей между ними, задаваемых определениями.

@@ -53,6 +65,24 @@ function HelpThesaurus() { необходимых для формирования выражений аксиом. Остальные конституенты относят к Телу концептуальной схемы.

+ +

Конституента

Конституента – это выделенная часть КС, являющаяся отдельным понятием, схемой построения понятия, либо @@ -77,35 +107,45 @@ function HelpThesaurus() {


@@ -114,19 +154,20 @@ function HelpThesaurus() { По графу термов выделены:
  • - потребители данной конституенты – конституенты, определения которых используют данную конституенту + {'\u2009'}потребители данной конституенты – конституенты, определения которых используют данную конституенту
  • - поставщики данной конституенты – конституенты, имена которых используются в определении данной конституенты + {'\u2009'}поставщики данной конституенты – конституенты, имена которых используются в определении данной + конституенты
  • - зависимые от данной конституенты – потребители данной конституенты напрямую или по цепочке + {'\u2009'}зависимые от данной конституенты – потребители данной конституенты напрямую или по цепочке
  • - влияющие на данную конституенту – поставщики данной конституенты напрямую или по цепочке + {'\u2009'}влияющие на данную конституенту – поставщики данной конституенты напрямую или по цепочке
  • @@ -150,22 +191,25 @@ function HelpThesaurus() { @@ -186,22 +230,24 @@ function HelpThesaurus() {

    Операционная схема синтеза

    - {' '} + + {'\u2009'} (ОСС) – система концептуальных схем, связанных операциями синтеза.

    @@ -216,12 +262,21 @@ function HelpThesaurus() { + +
    + +

    + + {'\u2009'}Ромбовидный синтез – операция, где используются КС, имеющие общих предков. +

    ); } diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/cc/HelpConceptOSS.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/cc/HelpConceptOSS.tsx index bbfee9aa..3bfc2343 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/cc/HelpConceptOSS.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/cc/HelpConceptOSS.tsx @@ -1,4 +1,12 @@ -import { IconConsolidation, IconExecute, IconOSS } from '@/components/Icons'; +import { + IconConsolidation, + IconDownload, + IconExecute, + IconOSS, + IconRSFormImported, + IconRSFormOwned, + IconSynthesis +} from '@/components/Icons'; import LinkTopic from '@/components/ui/LinkTopic'; import { HelpTopic } from '@/models/miscellaneous'; @@ -16,9 +24,24 @@ function HelpConceptOSS() { и отображается в форме .

    - Базовыми операциями ОСС являются загрузка и синтез. Схема может быть загружена из другой локации ( - внешняя КС) или создана в ОСС (собственная КС). Загрузка схем, полученных синтезом в других ОСС не - допускается. Также запрещена повторная загрузка той же КС в рамках одной ОСС. + Базовыми операциями ОСС являются загрузка и{' '} + синтез. Схема может быть загружена из другой локации{' '} + + ( + внешняя КС) + {' '} + или создана в ОСС{' '} + + ( + собственная КС) + + . Загрузка схем, полученных синтезом в других ОСС не допускается. Также запрещена повторная загрузка той же КС в + рамках одной ОСС. +

    +

    + При изменении расположения или владельца ОСС соответствующие атрибуты изменяются у собственных КС. Также при + удалении ОСС удаляются и все собственные КС. При удалении операции, собственная КС отвязывается от ОСС и + становится свободной КС.

    Операция синтеза в рамках ОСС задаются набором операций-аргументов и таблицей отождествлений понятий из diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssCard/EditorOssCard.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssCard/EditorOssCard.tsx index 060cab52..bd43b2c6 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssCard/EditorOssCard.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssCard/EditorOssCard.tsx @@ -47,13 +47,16 @@ function EditorOssCard({ isModified, onDestroy, setIsModified }: EditorOssCardPr onDestroy={onDestroy} controller={controller} /> - + - + {schema ? : null} ); diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssCard/OssStats.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssCard/OssStats.tsx index 1df6d4a0..053feaa0 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssCard/OssStats.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssCard/OssStats.tsx @@ -1,26 +1,56 @@ -import Divider from '@/components/ui/Divider'; -import ValueLabeled from '@/components/ui/ValueLabeled'; +import clsx from 'clsx'; + +import { IconDownload, IconRSForm, IconRSFormImported, IconRSFormOwned, IconSynthesis } from '@/components/Icons'; +import ValueStats from '@/components/ui/ValueStats'; import { IOperationSchemaStats } from '@/models/oss'; interface OssStatsProps { - stats?: IOperationSchemaStats; + stats: IOperationSchemaStats; } function OssStats({ stats }: OssStatsProps) { - if (!stats) { - return null; - } return ( -

    - +
    +
    + Всего + {stats.count_operations} +
    + } + value={stats.count_inputs} + title='Загрузка' + /> + } + value={stats.count_synthesis} + title='Синтез' + /> - - - - - - - + } + value={stats.count_schemas} + title='Прикрепленные схемы' + /> + } + value={stats.count_owned} + title='Собственные' + /> + } + value={stats.count_schemas - stats.count_owned} + title='Внешние' + />
    ); } diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorRSFormCard.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorRSFormCard.tsx index f9645f62..585fe6d2 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorRSFormCard.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorRSFormCard.tsx @@ -49,7 +49,7 @@ function EditorRSFormCard({ isModified, onDestroy, setIsModified }: EditorRSForm /> diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/RSFormStats.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/RSFormStats.tsx index 7bd30cca..df48b449 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/RSFormStats.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/RSFormStats.tsx @@ -1,6 +1,16 @@ +import clsx from 'clsx'; + import { IconChild, IconConvention, + IconCstAxiom, + IconCstBaseSet, + IconCstConstSet, + IconCstFunction, + IconCstPredicate, + IconCstStructured, + IconCstTerm, + IconCstTheorem, IconDefinition, IconPredecessor, IconStatusError, @@ -19,120 +29,123 @@ interface RSFormStatsProps { function RSFormStats({ stats, isArchive }: RSFormStatsProps) { return ( -
    -
    -
    - Всего - {stats.count_all} -
    - } - value={stats.count_all - stats.count_inherited} - title='Собственные' - /> - } - value={stats.count_inherited} - titleHtml={isArchive ? 'Архивные схемы не хранят
    информацию о наследовании' : 'Наследованные'} - /> - - } - value={stats.count_all - stats.count_errors - stats.count_property - stats.count_incalculable} - title='Корректные' - /> - } - value={stats.count_errors} - title='Неразмерные' - /> - } - value={stats.count_incalculable} - title='Невычислимые' - /> - } - value={stats.count_errors} - title='Некорректные' - /> - - X} - value={stats.count_base} - title='Базисные множества' - /> - C} - value={stats.count_constant} - title='Константные множества' - /> - S} - value={stats.count_structured} - title='Родовые структуры' - /> - A} - value={stats.count_axiom} - title='Аксиомы' - /> - - D} - value={stats.count_term} - title='Термы' - /> - F} - value={stats.count_function} - title='Терм-функции' - /> - P} - value={stats.count_predicate} - title='Предикат-функции' - /> - T} - value={stats.count_theorem} - title='Теоремы' - /> - - } - value={stats.count_text_term} - title='Термины' - /> - } - value={stats.count_definition} - title='Определения' - /> - } - value={stats.count_convention} - title='Конвенции' - /> +
    +
    + Всего + {stats.count_all}
    + } + value={stats.count_all - stats.count_inherited} + title='Собственные' + /> + } + value={stats.count_inherited} + titleHtml={isArchive ? 'Архивные схемы не хранят
    информацию о наследовании' : 'Наследованные'} + /> + + } + value={stats.count_all - stats.count_errors - stats.count_property - stats.count_incalculable} + title='Корректные' + /> + } + value={stats.count_errors} + title='Неразмерные' + /> + } + value={stats.count_incalculable} + title='Невычислимые' + /> + } + value={stats.count_errors} + title='Некорректные' + /> + + } + value={stats.count_base} + title='Базисные множества' + /> + } + value={stats.count_constant} + title='Константные множества' + /> + } + value={stats.count_structured} + title='Родовые структуры' + /> + } + value={stats.count_axiom} + title='Аксиомы' + /> + + } + value={stats.count_term} + title='Термы' + /> + } + value={stats.count_function} + title='Терм-функции' + /> + } + value={stats.count_predicate} + title='Предикат-функции' + /> + } + value={stats.count_theorem} + title='Теоремы' + /> + + } + value={stats.count_text_term} + title='Термины' + /> + } + value={stats.count_definition} + title='Определения' + /> + } + value={stats.count_convention} + title='Конвенции' + />
    ); }