From b4d8ff74b2f05b37ff8c2437a10dc7a96c768366 Mon Sep 17 00:00:00 2001
From: Ivan <8611739+IRBorisov@users.noreply.github.com>
Date: Fri, 23 Aug 2024 21:29:07 +0300
Subject: [PATCH] F: Improve stats UI for OSS and RSForm
---
TODO.txt | 32 ++-
rsconcept/frontend/src/components/Icons.tsx | 10 +
rsconcept/frontend/src/models/OssLoader.ts | 3 +-
rsconcept/frontend/src/models/oss.ts | 1 +
.../src/pages/ManualsPage/items/HelpMain.tsx | 5 +-
.../pages/ManualsPage/items/HelpThesaurus.tsx | 125 ++++++---
.../ManualsPage/items/cc/HelpConceptOSS.tsx | 31 ++-
.../OssPage/EditorOssCard/EditorOssCard.tsx | 7 +-
.../pages/OssPage/EditorOssCard/OssStats.tsx | 60 +++--
.../EditorRSFormCard/EditorRSFormCard.tsx | 2 +-
.../EditorRSFormCard/RSFormStats.tsx | 239 +++++++++---------
11 files changed, 329 insertions(+), 186 deletions(-)
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() {
необходимых для формирования выражений аксиом. Остальные конституенты относят к Телу концептуальной схемы.
+
+ По отношению к операциям ОСС выделены:
+ -
+
+ {'\u2009'}свободная КС – это КС не прикрепленная ни к одной операции в ОСС;
+
+ -
+
+ {'\u2009'}собственная КС данной ОСС – это КС, прикрепленная к операции в ОСС, чьи владелец и расположение
+ совпадают с соответствующими атрибутами ОСС.
+
+ -
+
+ {'\u2009'}внешняя КС данной ОСС – это КС, прикрепленная к операции в ОСС, чьи владелец или расположение не
+ совпадают с соответствующими атрибутами ОСС;
+
+
+
Конституента
Конституента – это выделенная часть КС, являющаяся отдельным понятием, схемой построения понятия, либо
@@ -77,35 +107,45 @@ function HelpThesaurus() {
По назначению выделены типы конституент:
-
- базисное множество (X#) представляет неопределяемое понятие, представленное структурой множества, чьи элементы
- различимы и не сравнимы с элементами других базисных множеств;
+
+ {'\u2009'}базисное множество (X#) представляет неопределяемое понятие, представленное структурой множества,
+ чьи элементы различимы и не сравнимы с элементами других базисных множеств;
-
- константное множество (C#) представляет неопределяемое понятие, моделируемое термом теории множеств, который
- поддерживает ряд формальных операций над его элементами;
+
+ {'\u2009'}константное множество (C#) представляет неопределяемое понятие, моделируемое термом теории множеств,
+ который поддерживает ряд формальных операций над его элементами;
-
- родовая структура (S#) представляет неопределяемое понятие, имеющее определенную структуру, построенную на
- базисных множествах и константных множеств. Содержание родовой структуры формируется{' '}
+
+ {'\u2009'}родовая структура (S#) представляет неопределяемое понятие, имеющее определенную структуру,
+ построенную на базисных множествах и константных множеств. Содержание родовой структуры формируется{' '}
, аксиомами и конвенцией;
- - терм (D#) представляет выводимое понятие через формальное определение;
-
- аксиома (A#) представляет утверждение, ограничивающее неопределяемые понятия и выводимые термы. Интерпретация
- аксиомы должна быть истинна и является критерием корректности интерпретации КС в целом;
+
+ {'\u2009'}аксиома (A#) представляет утверждение, ограничивающее неопределяемые понятия и выводимые термы.
+ Интерпретация аксиомы должна быть истинна и является критерием корректности интерпретации КС в целом;
-
- теорема (T#) представляет ценное для предметной утверждение, значение которого может быть как истинным так и
- ложным;
+
+ {'\u2009'}терм (D#) представляет выводимое понятие через формальное определение;
-
- терм-функция (F#) представляет выводимое понятие (возможно параметризованное), имеющее характер
+
+ {'\u2009'}терм-функция (F#) представляет выводимое понятие (возможно параметризованное), имеющее характер
функционального отношения между набором аргументов и результатом;
-
- предикат-функция (P#) представляет выводимое понятие (возможно параметризованное), имеющее характер
+
+ {'\u2009'}предикат-функция (P#) представляет выводимое понятие (возможно параметризованное), имеющее характер
логического выражения, проверяющее заданные аргументы на соответствие некоторому условию;
+ -
+
+ {'\u2009'}теорема (T#) представляет ценное для предметной утверждение, значение которого может быть как
+ истинным так и ложным;
+
@@ -114,19 +154,20 @@ function HelpThesaurus() {
По графу термов выделены:
- потребители данной конституенты – конституенты, определения которых используют данную конституенту
+ {'\u2009'}потребители данной конституенты – конституенты, определения которых используют данную конституенту
- поставщики данной конституенты – конституенты, имена которых используются в определении данной конституенты
+ {'\u2009'}поставщики данной конституенты – конституенты, имена которых используются в определении данной
+ конституенты
- зависимые от данной конституенты – потребители данной конституенты напрямую или по цепочке
+ {'\u2009'}зависимые от данной конституенты – потребители данной конституенты напрямую или по цепочке
- влияющие на данную конституенту – поставщики данной конституенты напрямую или по цепочке
+ {'\u2009'}влияющие на данную конституенту – поставщики данной конституенты напрямую или по цепочке
@@ -150,22 +191,25 @@ function HelpThesaurus() {
Для характеристики корректности определения введены статусы конституент:
-
- не проверено – требуется проверка формального
- определения (промежуточный статус);
+
+ {'\u2009'}не проверено – требуется проверка формального определения (промежуточный статус);
-
- корректно – формальное определение корректно;
+
+ {'\u2009'}корректно – формальное определение корректно;
-
- ошибочно – ошибка в формальном определении;
+
+ {'\u2009'}ошибочно – ошибка в формальном определении;
-
- неразмерное – формальное определение задает
- невычислимое множество, для которого возможно вычислить предикат проверки принадлежности;
+
+ {'\u2009'}неразмерное – формальное определение задает невычислимое множество, для которого возможно вычислить
+ предикат проверки принадлежности;
-
- невычислимо – формальное определение невозможно
- интерпретировать напрямую;
+
+ {'\u2009'}невычислимо – формальное определение невозможно интерпретировать напрямую;
@@ -186,22 +230,24 @@ function HelpThesaurus() {
Для описания наследования конституент в рамках ОСС введены:
-
- наследованная конституента – конституента, перенесенная из
- другой КС в рамках операции синтеза;
+
+ {'\u2009'}наследованная конституента – конституента, перенесенная из другой КС в рамках операции синтеза;
-
- собственная конституента – конституента, не являющаяся
- наследником других конституент;
+
+ {'\u2009'}собственная конституента – конституента, не являющаяся наследником других конституент;
-
- исходная конституента для данной конституенты –
- собственная конституента, прямым или опосредованным наследником которой является данная конституента.
+
+ {'\u2009'}исходная конституента для данной конституенты – собственная конституента, прямым или опосредованным
+ наследником которой является данная конституента.
Операционная схема синтеза
- {' '}
+
+ {'\u2009'}
(ОСС) – система концептуальных схем,
связанных операциями синтеза.
@@ -216,12 +262,21 @@ function HelpThesaurus() {
По способу получения КС выделены:
-
- загрузка КС из библиотеки;
+
+ {'\u2009'}загрузка КС из библиотеки;
-
- синтез концептуальных схем.ыф
+
+ {'\u2009'}синтез концептуальных схем.ыф
+
+
+
+
+
+ {'\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='Конвенции'
+ />
);
}