From 9d99179a4012c077aaa88ee0545b6e86319f51e8 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:37:56 +0300 Subject: [PATCH] F: Improve version selection --- .../library/components/SelectVersion.tsx | 20 ++++++++----------- .../src/features/library/models/library.ts | 3 +++ .../features/rsform/backend/RSFormLoader.ts | 1 + .../frontend/src/features/rsform/labels.ts | 9 ++++++--- .../src/features/rsform/models/rsform.ts | 4 ++-- .../EditorRSFormCard/FormRSForm.tsx | 5 +++-- .../EditorRSFormCard/ToolbarVersioning.tsx | 2 +- .../rsform/pages/RSFormPage/MenuRSTabs.tsx | 2 +- .../rsform/pages/RSFormPage/RSTabs.tsx | 5 ++++- 9 files changed, 29 insertions(+), 22 deletions(-) diff --git a/rsconcept/frontend/src/features/library/components/SelectVersion.tsx b/rsconcept/frontend/src/features/library/components/SelectVersion.tsx index 1b2f08d3..052107df 100644 --- a/rsconcept/frontend/src/features/library/components/SelectVersion.tsx +++ b/rsconcept/frontend/src/features/library/components/SelectVersion.tsx @@ -7,13 +7,14 @@ import { CProps } from '@/components/props'; import { labelVersion } from '../../rsform/labels'; import { IVersionInfo } from '../backend/types'; +import { CurrentVersion } from '../models/library'; interface SelectVersionProps extends CProps.Styling { id?: string; - value: number | undefined; - onChange: (newValue: number | undefined) => void; + value: CurrentVersion; + onChange: (newValue: CurrentVersion) => void; - items?: IVersionInfo[]; + items: IVersionInfo[]; placeholder?: string; noBorder?: boolean; } @@ -21,8 +22,8 @@ interface SelectVersionProps extends CProps.Styling { export function SelectVersion({ id, className, items, value, onChange, ...restProps }: SelectVersionProps) { const options = [ { - value: undefined, - label: labelVersion(undefined) + value: 'latest' as const, + label: labelVersion('latest', items) }, ...(items?.map(version => ({ value: version.id, @@ -30,18 +31,13 @@ export function SelectVersion({ id, className, items, value, onChange, ...restPr })) ?? []) ]; - const valueLabel = (() => { - const version = items?.find(ver => ver.id === value); - return version ? version.version : labelVersion(undefined); - })(); - return ( onChange(data?.value)} + value={{ value: value, label: labelVersion(value, items) }} + onChange={data => onChange(data?.value ?? 'latest')} {...restProps} /> ); diff --git a/rsconcept/frontend/src/features/library/models/library.ts b/rsconcept/frontend/src/features/library/models/library.ts index d205c0f5..0e7052ff 100644 --- a/rsconcept/frontend/src/features/library/models/library.ts +++ b/rsconcept/frontend/src/features/library/models/library.ts @@ -39,3 +39,6 @@ export interface ILibraryFilter { isEditor: boolean | null; filterUser: number | null; } + +/** Represents current version */ +export type CurrentVersion = number | 'latest'; diff --git a/rsconcept/frontend/src/features/rsform/backend/RSFormLoader.ts b/rsconcept/frontend/src/features/rsform/backend/RSFormLoader.ts index 138832d2..41d455b8 100644 --- a/rsconcept/frontend/src/features/rsform/backend/RSFormLoader.ts +++ b/rsconcept/frontend/src/features/rsform/backend/RSFormLoader.ts @@ -25,6 +25,7 @@ export class RSFormLoader { constructor(input: IRSFormDTO) { this.schema = input as unknown as IRSForm; + this.schema.version = input.version ?? 'latest'; } produceRSForm(): IRSForm { diff --git a/rsconcept/frontend/src/features/rsform/labels.ts b/rsconcept/frontend/src/features/rsform/labels.ts index f6fd1d02..236e5df2 100644 --- a/rsconcept/frontend/src/features/rsform/labels.ts +++ b/rsconcept/frontend/src/features/rsform/labels.ts @@ -5,9 +5,12 @@ import { PARAMETER } from '@/utils/constants'; import { prepareTooltip } from '@/utils/utils'; +import { IVersionInfo } from '../library'; +import { CurrentVersion } from '../library/models/library'; + import { CstType, IRSErrorDescription, ParsingStatus, RSErrorType, TokenID } from './backend/types'; import { GramData, Grammeme, ReferenceType } from './models/language'; -import { CstClass, ExpressionStatus, IConstituenta, IRSForm } from './models/rsform'; +import { CstClass, ExpressionStatus, IConstituenta } from './models/rsform'; import { IArgumentInfo, ISyntaxTreeNode } from './models/rslang'; import { CstMatchMode, DependencyMode } from './stores/cstSearch'; import { GraphColoring } from './stores/termGraph'; @@ -61,8 +64,8 @@ export function labelConstituenta(cst: IConstituenta) { /** * Generates label for {@link IVersionInfo} of {@link IRSForm}. */ -export function labelVersion(schema: IRSForm | undefined) { - const version = schema?.versions.find(ver => ver.id === schema?.version); +export function labelVersion(value: CurrentVersion, items: IVersionInfo[]) { + const version = items.find(ver => ver.id === value); return version ? version.version : 'актуальная'; } diff --git a/rsconcept/frontend/src/features/rsform/models/rsform.ts b/rsconcept/frontend/src/features/rsform/models/rsform.ts index bde243c3..7760a240 100644 --- a/rsconcept/frontend/src/features/rsform/models/rsform.ts +++ b/rsconcept/frontend/src/features/rsform/models/rsform.ts @@ -3,7 +3,7 @@ */ import { ILibraryItemData, IVersionInfo } from '@/features/library/backend/types'; -import { ILibraryItemReference } from '@/features/library/models/library'; +import { CurrentVersion, ILibraryItemReference } from '@/features/library/models/library'; import { Graph } from '@/models/Graph'; @@ -139,7 +139,7 @@ export interface IInheritanceInfo { * Represents formal explication for set of concepts. */ export interface IRSForm extends ILibraryItemData { - version?: number; + version: CurrentVersion; versions: IVersionInfo[]; items: IConstituenta[]; diff --git a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/FormRSForm.tsx b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/FormRSForm.tsx index 7dfe6df1..b60a766e 100644 --- a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/FormRSForm.tsx +++ b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/FormRSForm.tsx @@ -9,6 +9,7 @@ import clsx from 'clsx'; import { urls, useConceptNavigation } from '@/app'; import { LibraryItemType, SelectVersion, ToolbarItemAccess, useUpdateItem } from '@/features/library'; import { IUpdateLibraryItemDTO, schemaUpdateLibraryItem } from '@/features/library/backend/types'; +import { CurrentVersion } from '@/features/library/models/library'; import { SubmitButton } from '@/components/Control'; import { IconSave } from '@/components/Icons'; @@ -54,8 +55,8 @@ export function FormRSForm() { setIsModified(isDirty); }, [isDirty, setIsModified]); - function handleSelectVersion(version?: number) { - router.push(urls.schema(schema.id, version)); + function handleSelectVersion(version: CurrentVersion) { + router.push(urls.schema(schema.id, version === 'latest' ? undefined : version)); } function onSubmit(data: IUpdateLibraryItemDTO) { diff --git a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/ToolbarVersioning.tsx b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/ToolbarVersioning.tsx index 4c3487a9..e40595da 100644 --- a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/ToolbarVersioning.tsx +++ b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/EditorRSFormCard/ToolbarVersioning.tsx @@ -27,7 +27,7 @@ export function ToolbarVersioning({ blockReload }: ToolbarVersioningProps) { const showEditVersions = useDialogsStore(state => state.showEditVersions); function handleRestoreVersion() { - if (!schema.version || !window.confirm(promptText.restoreArchive)) { + if (schema.version === 'latest' || !window.confirm(promptText.restoreArchive)) { return; } void versionRestore({ versionID: schema.version }).then(() => navigateVersion()); diff --git a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/MenuRSTabs.tsx b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/MenuRSTabs.tsx index 5228b7a6..ccfefa7a 100644 --- a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/MenuRSTabs.tsx +++ b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/MenuRSTabs.tsx @@ -115,7 +115,7 @@ export function MenuRSTabs() { const fileName = (schema.alias ?? 'Schema') + EXTEOR_TRS_FILE; void download({ itemID: schema.id, - version: schema.version + version: schema.version === 'latest' ? undefined : schema.version }).then((data: Blob) => { try { fileDownload(data, fileName); diff --git a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/RSTabs.tsx b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/RSTabs.tsx index 0f237cde..12185bcc 100644 --- a/rsconcept/frontend/src/features/rsform/pages/RSFormPage/RSTabs.tsx +++ b/rsconcept/frontend/src/features/rsform/pages/RSFormPage/RSTabs.tsx @@ -86,7 +86,10 @@ export function RSTabs({ activeID, activeTab }: RSTabsProps) { > - Версия: ${labelVersion(schema)}`} /> + Версия: ${labelVersion(schema.version, schema.versions)}`} + /> Ошибок: ${schema.stats?.count_errors ?? 0}`}