diff --git a/dev/doc-import-tool/src/import.ts b/dev/doc-import-tool/src/import.ts index 2e2a1aa2b06..4d3f753cd0e 100644 --- a/dev/doc-import-tool/src/import.ts +++ b/dev/doc-import-tool/src/import.ts @@ -86,6 +86,7 @@ async function createDocument ( seqNumber: 0, major: 1, minor: 0, + patch: 0, commentSequence: 0, template: templateId, state: DocumentState.Draft, @@ -170,6 +171,7 @@ async function createTemplateIfNotExist ( category, major: 0, minor: 1, + patch: 0, commentSequence: 0, state: DocumentState.Draft, author: owner, diff --git a/models/controlled-documents/src/migration.ts b/models/controlled-documents/src/migration.ts index d9be18a1579..7466ee95af0 100644 --- a/models/controlled-documents/src/migration.ts +++ b/models/controlled-documents/src/migration.ts @@ -151,6 +151,7 @@ async function createProductChangeControlTemplate (tx: TxOperations): Promise ) } +async function migratePatchVersion (client: MigrationClient): Promise { + await client.update( + DOMAIN_DOCUMENTS, + { + _class: documents.class.ControlledDocument, + patch: { $exists: false } + }, + { + patch: 0 + } + ) +} + export const documentsOperation: MigrateOperation = { async migrate (client: MigrationClient, mode): Promise { await tryMigrate(mode, client, documentsId, [ @@ -568,6 +582,10 @@ export const documentsOperation: MigrateOperation = { { state: 'migrateExternalApprovers', func: migrateExternalApprovers + }, + { + state: 'migratePatchVersion', + func: migratePatchVersion } ]) }, diff --git a/models/controlled-documents/src/types.ts b/models/controlled-documents/src/types.ts index 1974b9a6ee7..3d3cec12e3b 100644 --- a/models/controlled-documents/src/types.ts +++ b/models/controlled-documents/src/types.ts @@ -250,6 +250,9 @@ export class TDocument extends TDoc implements Document { @Prop(TypeNumber(), documents.string.Minor) minor!: number + @Prop(TypeNumber(), documents.string.Patch) + patch!: number + @Prop(TypeRef(documents.class.DocumentCategory), documents.string.Category) category?: Ref diff --git a/models/products/src/index.ts b/models/products/src/index.ts index 46c7bb19fdf..b18e2bc94b2 100644 --- a/models/products/src/index.ts +++ b/models/products/src/index.ts @@ -115,6 +115,10 @@ export class TProductVersion extends TProject implements ProductVersion { @ReadOnly() minor!: number + @Prop(TypeNumber(), products.string.Patch) + @ReadOnly() + patch!: number + @Prop(TypeString(), products.string.Codename) codename?: string diff --git a/models/products/src/migration.ts b/models/products/src/migration.ts index d887359231e..6fda6290770 100644 --- a/models/products/src/migration.ts +++ b/models/products/src/migration.ts @@ -13,9 +13,36 @@ // limitations under the License. // -import { type MigrateOperation, type MigrationClient, type MigrationUpgradeClient } from '@hcengineering/model' +import { + type MigrateOperation, + type MigrationClient, + type MigrationUpgradeClient, + tryMigrate +} from '@hcengineering/model' +import { DOMAIN_DOCUMENTS } from '@hcengineering/model-controlled-documents' +import products, { productsId } from '@hcengineering/products' + +async function migratePatchVersion (client: MigrationClient): Promise { + await client.update( + DOMAIN_DOCUMENTS, + { + _class: products.class.ProductVersion, + patch: { $exists: false } + }, + { + patch: 0 + } + ) +} export const productsOperation: MigrateOperation = { - async migrate (client: MigrationClient): Promise {}, + async migrate (client: MigrationClient, mode): Promise { + await tryMigrate(mode, client, productsId, [ + { + state: 'migratePatchVersion', + func: migratePatchVersion + } + ]) + }, async upgrade (state: Map>, client: () => Promise): Promise {} } diff --git a/packages/importer/src/huly/huly.ts b/packages/importer/src/huly/huly.ts index 9a272711e6c..b14fa488ce4 100644 --- a/packages/importer/src/huly/huly.ts +++ b/packages/importer/src/huly/huly.ts @@ -692,6 +692,7 @@ export class HulyFormatImporter { code: codeMatch?.[1], major: 0, minor: 1, + patch: 0, state: DocumentState.Draft, category, author, @@ -735,6 +736,7 @@ export class HulyFormatImporter { code: codeMatch?.[1], major: 0, minor: 1, + patch: 0, state: DocumentState.Draft, category, author, diff --git a/packages/importer/src/importer/builder.ts b/packages/importer/src/importer/builder.ts index d53ec7bf016..8633a6b8d6f 100644 --- a/packages/importer/src/importer/builder.ts +++ b/packages/importer/src/importer/builder.ts @@ -740,6 +740,7 @@ export class ImportWorkspaceBuilder { // Validate numbers are positive if (!this.validatePossitiveNumber(doc.major)) errors.push('invalid value for field "major"') if (!this.validatePossitiveNumber(doc.minor)) errors.push('invalid value for field "minor"') + if (!this.validatePossitiveNumber(doc.patch)) errors.push('invalid value for field "patch"') // Validate arrays errors.push(...this.validateArray(doc.reviewers, 'string', 'reviewers')) @@ -822,6 +823,7 @@ export class ImportWorkspaceBuilder { // Validate numbers are positive if (!this.validatePossitiveNumber(template.major)) errors.push('invalid value for field "major"') if (!this.validatePossitiveNumber(template.minor)) errors.push('invalid value for field "minor"') + if (!this.validatePossitiveNumber(template.patch)) errors.push('invalid value for field "patch"') // Validate arrays errors.push(...this.validateArray(template.reviewers, 'string', 'reviewers')) diff --git a/packages/importer/src/importer/importer.ts b/packages/importer/src/importer/importer.ts index 73bdd7bb3b0..9843fb00af9 100644 --- a/packages/importer/src/importer/importer.ts +++ b/packages/importer/src/importer/importer.ts @@ -197,6 +197,7 @@ export interface ImportControlledDocumentTemplate extends ImportDoc { code?: string major: number minor: number + patch: number state: DocumentState category: Ref author?: Ref @@ -220,6 +221,7 @@ export interface ImportControlledDocument extends ImportDoc { code?: string major: number minor: number + patch: number state: DocumentState category?: Ref reviewers?: Ref[] @@ -994,6 +996,7 @@ export class WorkspaceImporter { title: template.title, major: template.major, minor: template.minor, + patch: template.patch, state: template.state, author: template.author, owner: template.owner, @@ -1115,6 +1118,7 @@ export class WorkspaceImporter { title: document.title, major: document.major, minor: document.minor, + patch: document.patch, state: document.state, author: document.author, owner: document.owner, diff --git a/plugins/controlled-documents-assets/lang/cs.json b/plugins/controlled-documents-assets/lang/cs.json index 8b05536cd9e..b7e2234aaa2 100644 --- a/plugins/controlled-documents-assets/lang/cs.json +++ b/plugins/controlled-documents-assets/lang/cs.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "Začněte psát...", "Version": "Verze", "TemplateVersion": "Verze šablony", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Vyhledat dokument...", "CreateEnVersion": "Vytvořit verzi pro revizi", "Approvers": "Schvalovatelé", diff --git a/plugins/controlled-documents-assets/lang/de.json b/plugins/controlled-documents-assets/lang/de.json index f3f17d047a3..a5ab215cbd5 100644 --- a/plugins/controlled-documents-assets/lang/de.json +++ b/plugins/controlled-documents-assets/lang/de.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "Tippen Sie, um mit der Bearbeitung zu beginnen...", "Version": "Version", "TemplateVersion": "Vorlagenversion", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Dokument suchen...", "CreateEnVersion": "Version zur Überprüfung erstellen", "Approvers": "Genehmiger", diff --git a/plugins/controlled-documents-assets/lang/en.json b/plugins/controlled-documents-assets/lang/en.json index dd9f4ff9fbb..7d95226b67f 100644 --- a/plugins/controlled-documents-assets/lang/en.json +++ b/plugins/controlled-documents-assets/lang/en.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "type to start editing...", "Version": "Version", "TemplateVersion": "Template version", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Search document...", "CreateEnVersion": "Create version for review", "Approvers": "Approvers", diff --git a/plugins/controlled-documents-assets/lang/fr.json b/plugins/controlled-documents-assets/lang/fr.json index 652e566a1ee..326f13775ae 100644 --- a/plugins/controlled-documents-assets/lang/fr.json +++ b/plugins/controlled-documents-assets/lang/fr.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "tapez pour commencer à éditer...", "Version": "Version", "TemplateVersion": "Version du modèle", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Rechercher un document...", "CreateEnVersion": "Créer une version pour révision", "Approvers": "Approuveurs", diff --git a/plugins/controlled-documents-assets/lang/it.json b/plugins/controlled-documents-assets/lang/it.json index a1eb5cdd65d..b28d4b47c9a 100644 --- a/plugins/controlled-documents-assets/lang/it.json +++ b/plugins/controlled-documents-assets/lang/it.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "digita per iniziare a modificare...", "Version": "Versione", "TemplateVersion": "Versione del modello", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Cerca documento...", "CreateEnVersion": "Crea versione per revisione", "Approvers": "Approvatori", diff --git a/plugins/controlled-documents-assets/lang/ja.json b/plugins/controlled-documents-assets/lang/ja.json index 68b54bcce76..60ba83c15c6 100644 --- a/plugins/controlled-documents-assets/lang/ja.json +++ b/plugins/controlled-documents-assets/lang/ja.json @@ -37,7 +37,7 @@ "EditorPlaceholder": "入力して編集を開始...", "Version": "バージョン", "TemplateVersion": "テンプレートバージョン", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "ドキュメントを検索...", "CreateEnVersion": "レビュー用バージョンを作成", "Approvers": "承認者", diff --git a/plugins/controlled-documents-assets/lang/pt.json b/plugins/controlled-documents-assets/lang/pt.json index e9229faa9e6..c5b2f72fd56 100644 --- a/plugins/controlled-documents-assets/lang/pt.json +++ b/plugins/controlled-documents-assets/lang/pt.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "Digite para começar a editar...", "Version": "Versão", "TemplateVersion": "Versão do modelo", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Buscar documento...", "CreateEnVersion": "Criar versão para revisão", "Approvers": "Aprovadores", diff --git a/plugins/controlled-documents-assets/lang/ru.json b/plugins/controlled-documents-assets/lang/ru.json index 17bb1293ccd..3957f47d1ad 100644 --- a/plugins/controlled-documents-assets/lang/ru.json +++ b/plugins/controlled-documents-assets/lang/ru.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "введите для начала...", "Version": "Версия", "TemplateVersion": "Версия шаблона", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Найти документ...", "CreateEnVersion": "Создать версию для оценки", "Approvers": "Утверждающие", diff --git a/plugins/controlled-documents-assets/lang/tr.json b/plugins/controlled-documents-assets/lang/tr.json index 08eaab7955f..f830e2821c0 100644 --- a/plugins/controlled-documents-assets/lang/tr.json +++ b/plugins/controlled-documents-assets/lang/tr.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "düzenlemeye başlamak için yazın...", "Version": "Sürüm", "TemplateVersion": "Şablon sürümü", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "Doküman ara...", "CreateEnVersion": "İnceleme için sürüm oluştur", "Approvers": "Onaylayanlar", diff --git a/plugins/controlled-documents-assets/lang/zh.json b/plugins/controlled-documents-assets/lang/zh.json index 511ffe0cc1f..9554c6214d9 100644 --- a/plugins/controlled-documents-assets/lang/zh.json +++ b/plugins/controlled-documents-assets/lang/zh.json @@ -38,7 +38,7 @@ "EditorPlaceholder": "开始编辑...", "Version": "版本", "TemplateVersion": "模板版本", - "VersionValue": "v{major}.{minor}", + "VersionValue": "v{major}.{minor}.{patch}", "SearchDocument": "搜索文档...", "CreateEnVersion": "创建审核版本", "Approvers": "批准人", diff --git a/plugins/controlled-documents-resources/src/components/CreateDocument.svelte b/plugins/controlled-documents-resources/src/components/CreateDocument.svelte index 99aed0f4dc5..e9df72a13d6 100644 --- a/plugins/controlled-documents-resources/src/components/CreateDocument.svelte +++ b/plugins/controlled-documents-resources/src/components/CreateDocument.svelte @@ -56,6 +56,7 @@ labels: 0, major: 1, minor: 0, + patch: 0, commentSequence: 0, author: currentUser, owner: currentUser, diff --git a/plugins/controlled-documents-resources/src/components/EditDocPanel.svelte b/plugins/controlled-documents-resources/src/components/EditDocPanel.svelte index 8d692546e4e..9c12e132f1f 100644 --- a/plugins/controlled-documents-resources/src/components/EditDocPanel.svelte +++ b/plugins/controlled-documents-resources/src/components/EditDocPanel.svelte @@ -242,7 +242,7 @@ } const latest = $documentLatestVersion - const version = { major: latest.major, minor: latest.minor + 1 } + const version = { major: latest.major, minor: latest.minor + 1, patch: 0 } const project = await getLatestProjectId($controlledDocument.space) if (project === undefined) { diff --git a/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte b/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte index 7e5eda32424..3750e13b161 100644 --- a/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte +++ b/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte @@ -106,6 +106,7 @@ labels: 0, major: 1, minor: 0, + patch: 0, seqNumber: 0, commentSequence: 0, category: '' as Ref, diff --git a/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte b/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte index 69e13bde400..2f4930b2d1c 100644 --- a/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte +++ b/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte @@ -101,6 +101,7 @@ labels: 0, major: 1, minor: 0, + patch: 0, commentSequence: 0, seqNumber: 0, category: undefined, diff --git a/plugins/controlled-documents-resources/src/components/document/DocumentDiffViewer.svelte b/plugins/controlled-documents-resources/src/components/document/DocumentDiffViewer.svelte index cb1586a28d5..ab58e989ec6 100644 --- a/plugins/controlled-documents-resources/src/components/document/DocumentDiffViewer.svelte +++ b/plugins/controlled-documents-resources/src/components/document/DocumentDiffViewer.svelte @@ -72,7 +72,7 @@ } if (isDocument(document)) { - return `v${document.major}.${document.minor} | ${translatedStates ? translatedStates[state] : ''}` + return `v${document.major}.${document.minor}.${document.patch} | ${translatedStates ? translatedStates[state] : ''}` } else { return `${document.name} | ${translatedStates ? translatedStates[state] : ''}` } diff --git a/plugins/controlled-documents-resources/src/components/document/DocumentHistory.svelte b/plugins/controlled-documents-resources/src/components/document/DocumentHistory.svelte index df566182612..eced09ed8a8 100644 --- a/plugins/controlled-documents-resources/src/components/document/DocumentHistory.svelte +++ b/plugins/controlled-documents-resources/src/components/document/DocumentHistory.svelte @@ -51,7 +51,10 @@ return ( doc.major < $controlledDocument.major || - (doc.major === $controlledDocument.major && doc.minor <= $controlledDocument.minor) + (doc.major === $controlledDocument.major && doc.minor < $controlledDocument.minor) || + (doc.major === $controlledDocument.major && + doc.minor === $controlledDocument.minor && + doc.patch <= $controlledDocument.patch) ) }) .sort(documentCompareFn) diff --git a/plugins/controlled-documents-resources/src/components/document/EditDocRelease.svelte b/plugins/controlled-documents-resources/src/components/document/EditDocRelease.svelte index fabe6acc65e..60d5bf81f40 100644 --- a/plugins/controlled-documents-resources/src/components/document/EditDocRelease.svelte +++ b/plugins/controlled-documents-resources/src/components/document/EditDocRelease.svelte @@ -52,6 +52,7 @@ } from '../../stores/editors/document/editor' enum Severity { + Patch = 'patch', Minor = 'minor', Major = 'major' } @@ -154,7 +155,10 @@ allVersionsDesc: ControlledDocument[] ): ControlledDocument | undefined { return allVersionsDesc.find( - (d) => (d.major === document.major && d.minor < document.minor) || d.major < document.major + (d) => + (d.major === document.major && d.minor === document.minor && d.patch < document.patch) || + (d.major === document.major && d.minor < document.minor) || + d.major < document.major ) } @@ -166,13 +170,17 @@ const prevDocument = getPreviousDocument(document, allVersionsDesc) if (prevDocument == null) { - return document.major > 0 ? Severity.Major : Severity.Minor + return document.major > 0 ? Severity.Major : document.minor > 0 ? Severity.Minor : Severity.Patch } else { - return prevDocument.major < document.major ? Severity.Major : Severity.Minor + return prevDocument.major < document.major + ? Severity.Major + : prevDocument.minor < document.minor + ? Severity.Minor + : Severity.Patch } } - function getVersionForSeverity (severity: Severity): { major: number, minor: number } | undefined { + function getVersionForSeverity (severity: Severity): { major: number, minor: number, patch: number } | undefined { if ($controlledDocument == null) { return } @@ -182,12 +190,20 @@ if (severity === Severity.Major) { return { major: (prevDocument?.major ?? 0) + 1, - minor: 0 + minor: 0, + patch: 0 + } + } else if (severity === Severity.Minor) { + return { + major: prevDocument?.major ?? 0, + minor: (prevDocument?.minor ?? 0) + 1, + patch: 0 } } else { return { major: prevDocument?.major ?? 0, - minor: (prevDocument?.minor ?? 0) + 1 + minor: prevDocument?.minor ?? 0, + patch: (prevDocument?.patch ?? 0) + 1 } } } @@ -218,6 +234,18 @@