diff --git a/models/drive/src/index.ts b/models/drive/src/index.ts index 249da898a1..c262462c2e 100644 --- a/models/drive/src/index.ts +++ b/models/drive/src/index.ts @@ -54,7 +54,7 @@ import { TypeTimestamp, UX } from '@hcengineering/model' -import { TAttachedDoc, TDoc, TType, TTypedSpace } from '@hcengineering/model-core' +import { TAttachedDoc, TCard, TType, TTypedSpace } from '@hcengineering/model-core' import presentation from '@hcengineering/model-presentation' import print from '@hcengineering/model-print' import tracker from '@hcengineering/model-tracker' @@ -84,19 +84,19 @@ export class TDefaultDriveTypeData extends TDrive implements RolesAssignment { [key: Ref]: Ref[] } -@Model(drive.class.Resource, core.class.Doc, DOMAIN_DRIVE) +@Model(drive.class.Resource, core.class.Card, DOMAIN_DRIVE) @UX(drive.string.Resource) -export class TResource extends TDoc implements Resource { +export class TResource extends TCard implements Resource { declare space: Ref @Prop(TypeString(), drive.string.Name) @Index(IndexKind.FullText) - name!: string + declare title: string @Prop(TypeRef(drive.class.Resource), drive.string.Parent) @Index(IndexKind.Indexed) @ReadOnly() - parent!: Ref + declare parent: Ref @Prop(TypeRef(drive.class.Resource), drive.string.Path) @ReadOnly() @@ -169,7 +169,7 @@ export class TFileVersion extends TAttachedDoc implements FileVersion { @Prop(TypeString(), drive.string.Name) @Index(IndexKind.FullText) - name!: string + title!: string @Prop(TypeRef(core.class.Blob), drive.string.File) @ReadOnly() diff --git a/models/drive/src/migration.ts b/models/drive/src/migration.ts index 529aafa865..e2762c8b13 100644 --- a/models/drive/src/migration.ts +++ b/models/drive/src/migration.ts @@ -14,7 +14,7 @@ // import core, { type Blob, type Ref, DOMAIN_BLOB, generateId, toIdMap } from '@hcengineering/core' -import type { File, FileVersion } from '@hcengineering/drive' +import type { Drive, File, FileVersion, Resource } from '@hcengineering/drive' import { type MigrateOperation, type MigrationClient, @@ -56,8 +56,8 @@ async function migrateFileVersions (client: MigrationClient): Promise { collection: 'versions', modifiedOn: file.modifiedOn, modifiedBy: file.modifiedBy, - space: file.space, - name: exfile.name, + space: file.space as Ref, + title: exfile.title, file: blob._id, size: blob.size, lastModified: blob.modifiedOn, @@ -86,12 +86,52 @@ async function migrateFileVersions (client: MigrationClient): Promise { } } +async function renameFields (client: MigrationClient): Promise { + const resources = await client.find(DOMAIN_DRIVE, { + _class: { $in: [drive.class.Resource, drive.class.File, drive.class.Folder] }, + name: { $exists: true } + }) + + for (const resource of resources) { + await client.update( + DOMAIN_DRIVE, + { _id: resource._id }, + { + $rename: { + name: 'title' + } + } + ) + } + + const versions = await client.find(DOMAIN_DRIVE, { + _class: drive.class.FileVersion, + name: { $exists: true } + }) + + for (const version of versions) { + await client.update( + DOMAIN_DRIVE, + { _id: version._id }, + { + $rename: { + name: 'title' + } + } + ) + } +} + export const driveOperation: MigrateOperation = { async migrate (client: MigrationClient): Promise { await tryMigrate(client, driveId, [ { state: 'file-versions', func: migrateFileVersions + }, + { + state: 'renameFields', + func: renameFields } ]) }, diff --git a/models/server-drive/src/index.ts b/models/server-drive/src/index.ts index c040399a70..acca4db1c1 100644 --- a/models/server-drive/src/index.ts +++ b/models/server-drive/src/index.ts @@ -43,14 +43,14 @@ export function createModel (builder: Builder): void { builder.mixin(drive.class.File, core.class.Class, serverCore.mixin.SearchPresenter, { searchConfig: { icon: drive.icon.File, - title: 'name' + title: 'title' } }) builder.mixin(drive.class.Folder, core.class.Class, serverCore.mixin.SearchPresenter, { searchConfig: { icon: drive.icon.Folder, - title: 'name' + title: 'title' } }) } diff --git a/packages/core/src/classes.ts b/packages/core/src/classes.ts index a3a92fa609..0ce2d198f6 100644 --- a/packages/core/src/classes.ts +++ b/packages/core/src/classes.ts @@ -76,7 +76,7 @@ export interface Doc extends Obj { export interface Card extends Doc { title: string - description: CollaborativeDoc | null + description?: CollaborativeDoc | null identifier?: string parent?: Ref | null } diff --git a/plugins/drive-resources/src/components/CreateFolder.svelte b/plugins/drive-resources/src/components/CreateFolder.svelte index 2094299cb2..6af93b78c9 100644 --- a/plugins/drive-resources/src/components/CreateFolder.svelte +++ b/plugins/drive-resources/src/components/CreateFolder.svelte @@ -53,7 +53,7 @@ } const data: Omit, 'path'> = { - name: getTitle(name), + title: getTitle(name), parent: _parent ?? drive.ids.Root } diff --git a/plugins/drive-resources/src/components/DriveSpacePresenter.svelte b/plugins/drive-resources/src/components/DriveSpacePresenter.svelte index 9fdde07750..b6acbd7173 100644 --- a/plugins/drive-resources/src/components/DriveSpacePresenter.svelte +++ b/plugins/drive-resources/src/components/DriveSpacePresenter.svelte @@ -39,7 +39,7 @@ let descendants: Map, Folder[]> = new Map, Folder[]>() function getDescendants (obj: Ref): Ref[] { - return (descendants.get(obj) ?? []).sort((a, b) => a.name.localeCompare(b.name)).map((p) => p._id) + return (descendants.get(obj) ?? []).sort((a, b) => a.title.localeCompare(b.title)).map((p) => p._id) } let selected: Ref | undefined @@ -134,7 +134,7 @@ _id={folder._id} folderIcon iconProps={{ fill: 'var(--global-accent-IconColor)' }} - title={folder.name} + title={folder.title} selected isFold empty diff --git a/plugins/drive-resources/src/components/EditFile.svelte b/plugins/drive-resources/src/components/EditFile.svelte index 0427e54b17..3b28a85685 100644 --- a/plugins/drive-resources/src/components/EditFile.svelte +++ b/plugins/drive-resources/src/components/EditFile.svelte @@ -42,7 +42,7 @@ {#if object !== undefined && version !== undefined && blob !== undefined && contentType !== undefined} - + {#if object.versions > 1}
diff --git a/plugins/drive-resources/src/components/EditFolder.svelte b/plugins/drive-resources/src/components/EditFolder.svelte index 7651b27fcd..4e6dd7265f 100644 --- a/plugins/drive-resources/src/components/EditFolder.svelte +++ b/plugins/drive-resources/src/components/EditFolder.svelte @@ -13,14 +13,19 @@ // limitations under the License. --> {#if object} - + {/if} diff --git a/plugins/drive-resources/src/components/FileDropArea.svelte b/plugins/drive-resources/src/components/FileDropArea.svelte index 7518fa8163..12a6578239 100644 --- a/plugins/drive-resources/src/components/FileDropArea.svelte +++ b/plugins/drive-resources/src/components/FileDropArea.svelte @@ -13,7 +13,7 @@ // limitations under the License. --> {#if object} {:else if type === 'link'} -
+
{#if shouldShowAvatar}
{/if} - {value.name} + {value.title}
{:else if type === 'text'} - - {value.name} + + {value.title} {/if} {/if} diff --git a/plugins/drive-resources/src/components/FolderSearchItem.svelte b/plugins/drive-resources/src/components/FolderSearchItem.svelte index 51bad5d29d..bff4f85ac5 100644 --- a/plugins/drive-resources/src/components/FolderSearchItem.svelte +++ b/plugins/drive-resources/src/components/FolderSearchItem.svelte @@ -26,6 +26,6 @@
- {value.name} + {value.title}
diff --git a/plugins/drive-resources/src/components/FolderTreeLevel.svelte b/plugins/drive-resources/src/components/FolderTreeLevel.svelte index 8dd7956fa3..b72f9e2b96 100644 --- a/plugins/drive-resources/src/components/FolderTreeLevel.svelte +++ b/plugins/drive-resources/src/components/FolderTreeLevel.svelte @@ -33,7 +33,7 @@ const dispatch = createEventDispatcher() function getDescendants (obj: Ref): Ref[] { - return (descendants.get(obj) ?? []).sort((a, b) => a.name.localeCompare(b.name)).map((p) => p._id) + return (descendants.get(obj) ?? []).sort((a, b) => a.title.localeCompare(b.title)).map((p) => p._id) } async function getActions (obj: Folder): Promise { @@ -67,7 +67,7 @@ = value.space + let space: Ref = value.space as Ref let parent: Ref = value.parent as Ref async function save (): Promise { diff --git a/plugins/drive-resources/src/components/Thumbnail.svelte b/plugins/drive-resources/src/components/Thumbnail.svelte index ffe1771840..97f00471a7 100644 --- a/plugins/drive-resources/src/components/Thumbnail.svelte +++ b/plugins/drive-resources/src/components/Thumbnail.svelte @@ -44,13 +44,13 @@ {#if isFolder} {:else if previewRef != null && isImage && !isError} - {#await getBlobRef(previewRef, object.name, sizeToWidth(size)) then blobSrc} + {#await getBlobRef(previewRef, object.title, sizeToWidth(size)) then blobSrc} {object.name} { isError = true }} @@ -58,7 +58,7 @@ {/await} {:else}
- {extensionIconLabel(object.name)} + {extensionIconLabel(object.title)}
{/if} diff --git a/plugins/drive-resources/src/index.ts b/plugins/drive-resources/src/index.ts index 8b8f99b472..22343aa278 100644 --- a/plugins/drive-resources/src/index.ts +++ b/plugins/drive-resources/src/index.ts @@ -44,14 +44,14 @@ import { restoreFileVersion, showCreateFolderPopup, showRenameResourcePopup } fr const toFileObjectSearchResult = (e: WithLookup): ObjectSearchResult => ({ doc: e, - title: e.name, + title: e.title, icon: drive.icon.File, component: FileSearchItem }) const toFolderObjectSearchResult = (e: WithLookup): ObjectSearchResult => ({ doc: e, - title: e.name, + title: e.title, icon: drive.icon.Folder, component: FolderSearchItem }) @@ -62,7 +62,7 @@ async function queryFile ( search: string, filter?: { in?: RelatedDocument[], nin?: RelatedDocument[] } ): Promise { - const q: DocumentQuery = { name: { $like: `%${search}%` } } + const q: DocumentQuery = { title: { $like: `%${search}%` } } if (filter?.in !== undefined || filter?.nin !== undefined) { q._id = {} if (filter.in !== undefined) { @@ -81,7 +81,7 @@ async function queryFolder ( search: string, filter?: { in?: RelatedDocument[], nin?: RelatedDocument[] } ): Promise { - const q: DocumentQuery = { name: { $like: `%${search}%` } } + const q: DocumentQuery = { title: { $like: `%${search}%` } } if (filter?.in !== undefined || filter?.nin !== undefined) { q._id = {} if (filter.in !== undefined) { @@ -111,12 +111,12 @@ async function DownloadFile (doc: WithLookup | Array>): P for (const file of files) { const version = file.$lookup?.file if (version != null) { - const href = getFileUrl(version.file, version.name) + const href = getFileUrl(version.file, version.title) const link = document.createElement('a') link.style.display = 'none' link.target = '_blank' link.href = href - link.download = file.name + link.download = file.title link.click() } } diff --git a/plugins/drive-resources/src/utils.ts b/plugins/drive-resources/src/utils.ts index 6ded4002c6..52473b0281 100644 --- a/plugins/drive-resources/src/utils.ts +++ b/plugins/drive-resources/src/utils.ts @@ -13,16 +13,16 @@ // limitations under the License. // -import { type Class, type Doc, type Ref, toIdMap } from '@hcengineering/core' -import { +import { type Class, type Doc, type Ref, type Space, toIdMap } from '@hcengineering/core' +import drive, { type Drive, type FileVersion, type Folder, type Resource, + createFile, createFolder, DriveEvents } from '@hcengineering/drive' -import drive, { createFile } from '@hcengineering/drive' import { type Asset, setPlatformStatus, unknownError } from '@hcengineering/platform' import { getClient } from '@hcengineering/presentation' import { type AnySvelteComponent, showPopup } from '@hcengineering/ui' @@ -38,12 +38,12 @@ import CreateDrive from './components/CreateDrive.svelte' import CreateFolder from './components/CreateFolder.svelte' import RenamePopup from './components/RenamePopup.svelte' +import { Analytics } from '@hcengineering/analytics' import FileTypeAudio from './components/icons/FileTypeAudio.svelte' import FileTypeImage from './components/icons/FileTypeImage.svelte' -import FileTypeVideo from './components/icons/FileTypeVideo.svelte' import FileTypePdf from './components/icons/FileTypePdf.svelte' import FileTypeText from './components/icons/FileTypeText.svelte' -import { Analytics } from '@hcengineering/analytics' +import FileTypeVideo from './components/icons/FileTypeVideo.svelte' async function navigateToDoc (_id: Ref, _class: Ref>): Promise { const client = getClient() @@ -58,7 +58,7 @@ export function formatFileVersion (version: number): string { } export async function showCreateFolderPopup ( - space: Ref | undefined, + space: Ref | undefined, parent: Ref, open = false ): Promise { @@ -82,10 +82,10 @@ export async function showEditDrivePopup (drive: Drive): Promise { } export async function showRenameResourcePopup (resource: Resource): Promise { - showPopup(RenamePopup, { value: resource.name, format: 'text' }, undefined, async (res) => { - if (res != null && res !== resource.name) { + showPopup(RenamePopup, { value: resource.title }, undefined, async (res) => { + if (res != null && res !== resource.title) { const client = getClient() - await client.update(resource, { name: res }) + await client.update(resource, { title: res }) } }) } @@ -159,7 +159,7 @@ export async function resolveParents (object: Resource): Promise { } } - const root = await client.findOne(drive.class.Drive, { _id: object.space }) + const root = await client.findOne(drive.class.Drive, { _id: object.space as Ref }) if (root !== undefined) { parents.push(root) } @@ -203,7 +203,7 @@ async function fileUploadCallback (space: Ref, parent: Ref): Prom const query = parent !== drive.ids.Root ? { space, path: parent } : { space } const folders = await client.findAll(drive.class.Folder, query) - const foldersByName = new Map(folders.map((folder) => [folder.name, folder])) + const foldersByName = new Map(folders.map((folder) => [folder.title, folder])) const findParent = async (path: string | undefined): Promise> => { if (path == null || path.length === 0) { @@ -217,16 +217,16 @@ async function fileUploadCallback (space: Ref, parent: Ref): Prom let current = parent while (segments.length > 1) { - const name = segments.shift() - if (name !== undefined) { - let folder = foldersByName.get(name) + const title = segments.shift() + if (title !== undefined) { + let folder = foldersByName.get(title) if (folder !== undefined) { current = folder._id } else { - current = await createFolder(client, space, { name, parent: current }) + current = await createFolder(client, space, { title, parent: current }) folder = await client.findOne(drive.class.Folder, { _id: current }) if (folder !== undefined) { - foldersByName.set(folder.name, folder) + foldersByName.set(folder.title, folder) } } } @@ -242,7 +242,7 @@ async function fileUploadCallback (space: Ref, parent: Ref): Prom size: file.size, type: file.type, lastModified: file instanceof File ? file.lastModified : Date.now(), - name, + title: name, metadata } diff --git a/plugins/drive/src/types.ts b/plugins/drive/src/types.ts index f087c73ddd..a6731278d4 100644 --- a/plugins/drive/src/types.ts +++ b/plugins/drive/src/types.ts @@ -13,7 +13,7 @@ // limitations under the License. // -import { AttachedDoc, Blob, CollectionSize, Doc, Ref, Type, TypedSpace } from '@hcengineering/core' +import { AttachedDoc, Blob, Card, CollectionSize, Ref, Type, TypedSpace } from '@hcengineering/core' import drive from './plugin' @@ -26,8 +26,8 @@ export function TypeFileVersion (): Type { export interface Drive extends TypedSpace {} /** @public */ -export interface Resource extends Doc { - name: string +export interface Resource extends Card { + title: string parent: Ref path: Ref[] @@ -57,7 +57,7 @@ export interface File extends Resource { /** @public */ export interface FileVersion extends AttachedDoc { - name: string + title: string file: Ref size: number type: string diff --git a/plugins/drive/src/utils.ts b/plugins/drive/src/utils.ts index 7c7c698fd5..02b029d153 100644 --- a/plugins/drive/src/utils.ts +++ b/plugins/drive/src/utils.ts @@ -51,7 +51,7 @@ export async function createFile ( const versionId: Ref = generateId() const fileId = await client.createDoc(drive.class.File, space, { - name: data.name, + title: data.title, parent, path, file: versionId, diff --git a/services/love/src/workspaceClient.ts b/services/love/src/workspaceClient.ts index 07334fd777..9f368418cd 100644 --- a/services/love/src/workspaceClient.ts +++ b/services/love/src/workspaceClient.ts @@ -64,7 +64,7 @@ export class WorkspaceClient { if (blob !== undefined) { const data = { file: uuid as Ref, - name, + title: name, size: blob.size, type: blob.contentType, lastModified: blob.modifiedOn,