diff --git a/packages/services/src/Domain/Item/ItemManagerInterface.ts b/packages/services/src/Domain/Item/ItemManagerInterface.ts index 224c09be2..a1d90a304 100644 --- a/packages/services/src/Domain/Item/ItemManagerInterface.ts +++ b/packages/services/src/Domain/Item/ItemManagerInterface.ts @@ -87,7 +87,6 @@ export interface ItemManagerInterface extends AbstractService { removeItemsFromMemory(items: AnyItemInterface[]): void getDirtyItems(): (DecryptedItemInterface | DeletedItemInterface)[] getTagLongTitle(tag: SNTag): string - getSortedTagsForItem(item: DecryptedItemInterface): SNTag[] itemsReferencingItem( itemToLookupUuidFor: { uuid: string }, contentType?: string, @@ -130,6 +129,9 @@ export interface ItemManagerInterface extends AbstractService { getDisplayableNotesAndFiles(): (SNNote | FileItem)[] setPrimaryItemDisplayOptions(options: NotesAndFilesDisplayControllerOptions): void getTagPrefixTitle(tag: SNTag): string | undefined - getNoteLinkedFiles(note: SNNote): FileItem[] + getItemLinkedFiles(item: DecryptedItemInterface): FileItem[] + getItemLinkedNotes(item: DecryptedItemInterface): SNNote[] + getSortedTagsForItem(item: DecryptedItemInterface): SNTag[] + getUnsortedTagsForItem(item: DecryptedItemInterface): SNTag[] conflictsOf(uuid: string): AnyItemInterface[] } diff --git a/packages/services/src/Domain/Vault/VaultService.ts b/packages/services/src/Domain/Vault/VaultService.ts index d807aa2bd..7c27eb859 100644 --- a/packages/services/src/Domain/Vault/VaultService.ts +++ b/packages/services/src/Domain/Vault/VaultService.ts @@ -5,13 +5,13 @@ import { isClientDisplayableError } from '@standardnotes/responses' import { DecryptedItemInterface, EmojiString, - FileItem, IconType, KeySystemIdentifier, KeySystemRootKeyStorageMode, SharedVaultListingInterface, VaultListingInterface, VaultListingMutator, + isFile, isNote, } from '@standardnotes/models' import { VaultServiceInterface } from './VaultServiceInterface' @@ -151,22 +151,27 @@ export class VaultService throw new Error('Attempting to add item to locked vault') } - let linkedFiles: FileItem[] = [] - if (isNote(item)) { - linkedFiles = this.items.getNoteLinkedFiles(item) + if (isNote(item) || isFile(item)) { + const linkedFiles = this.items.getItemLinkedFiles(item) + const linkedNotes = this.items.getItemLinkedNotes(item) + const linkedTags = this.items.getUnsortedTagsForItem(item) - if (linkedFiles.length > 0) { - const confirmed = await this.alerts.confirmV2({ - title: 'Linked files will be moved to vault', - text: `This note has ${linkedFiles.length} linked files. They will also be moved to the vault. Do you want to continue?`, - }) - if (!confirmed) { - return undefined - } + const areAnyLinkedItemsInOtherVaults = [...linkedFiles, ...linkedNotes, ...linkedTags].some((linkedItem) => { + return linkedItem.key_system_identifier !== vault.systemIdentifier + }) + + if (areAnyLinkedItemsInOtherVaults) { + this.alerts + .alertV2({ + title: 'Cannot move item to vault', + text: 'This item is linked to other items that are not in the same vault. Please move those items to this vault first.', + }) + .catch(console.error) + return undefined } } - await this._moveItemsToVault.execute({ vault, items: [item, ...linkedFiles] }) + await this._moveItemsToVault.execute({ vault, items: [item] }) return this.items.findSureItem(item.uuid) } diff --git a/packages/snjs/lib/Services/Items/ItemManager.ts b/packages/snjs/lib/Services/Items/ItemManager.ts index a500f4f47..e1c2c5f56 100644 --- a/packages/snjs/lib/Services/Items/ItemManager.ts +++ b/packages/snjs/lib/Services/Items/ItemManager.ts @@ -740,6 +740,12 @@ export class ItemManager extends Services.AbstractService implements Services.It ) } + public getUnsortedTagsForItem(item: Models.DecryptedItemInterface): Models.SNTag[] { + return this.itemsReferencingItem(item).filter((ref) => { + return ref?.content_type === ContentType.TYPES.Tag + }) as Models.SNTag[] + } + public isSmartViewTitle(title: string): boolean { return title.startsWith(Models.SMART_TAG_DSL_PREFIX) } @@ -860,8 +866,14 @@ export class ItemManager extends Services.AbstractService implements Services.It return this.findItems(this.collection.uuidsOfItemsWithConflicts()).filter(Models.isNote).length } - getNoteLinkedFiles(note: Models.SNNote): Models.FileItem[] { - return this.itemsReferencingItem(note).filter(Models.isFile) + getItemLinkedFiles(item: Models.DecryptedItemInterface): Models.FileItem[] { + return item.content_type === ContentType.TYPES.File + ? this.referencesForItem(item).filter(Models.isFile) + : this.itemsReferencingItem(item).filter(Models.isFile) + } + + getItemLinkedNotes(item: Models.DecryptedItemInterface): Models.SNNote[] { + return this.referencesForItem(item).filter(Models.isNote) } /**