chore: enable vaults if dev mode or if user has role (#2483)

This commit is contained in:
Aman Harwara
2023-09-08 00:15:21 +05:30
committed by GitHub
parent 6724e1d79c
commit ec69e8041f
27 changed files with 64 additions and 43 deletions

View File

@@ -36,7 +36,7 @@
}, },
"dependencies": { "dependencies": {
"@standardnotes/common": "^1.50.0", "@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"@standardnotes/models": "workspace:*", "@standardnotes/models": "workspace:*",
"@standardnotes/responses": "workspace:*", "@standardnotes/responses": "workspace:*",
"@standardnotes/utils": "workspace:*", "@standardnotes/utils": "workspace:*",

View File

@@ -35,7 +35,7 @@
}, },
"dependencies": { "dependencies": {
"@electron/remote": "^2.0.9", "@electron/remote": "^2.0.9",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"@standardnotes/electron-clear-data": "1.1.1", "@standardnotes/electron-clear-data": "1.1.1",
"@standardnotes/web": "workspace:*", "@standardnotes/web": "workspace:*",
"axios": "^1.1.3", "axios": "^1.1.3",

View File

@@ -29,7 +29,7 @@
}, },
"dependencies": { "dependencies": {
"@standardnotes/common": "^1.50.0", "@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"@standardnotes/models": "workspace:*", "@standardnotes/models": "workspace:*",
"@standardnotes/responses": "workspace:*", "@standardnotes/responses": "workspace:*",
"@standardnotes/sncrypto-common": "workspace:*", "@standardnotes/sncrypto-common": "workspace:*",

View File

@@ -26,7 +26,7 @@
}, },
"dependencies": { "dependencies": {
"@standardnotes/common": "^1.50.0", "@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"reflect-metadata": "^0.1.13" "reflect-metadata": "^0.1.13"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -41,6 +41,8 @@ export class NativeFeatureIdentifier extends ValueObject<NativeFeatureIdentifier
Clipper: 'org.standardnotes.clipper', Clipper: 'org.standardnotes.clipper',
SharedVaults: 'org.standardnotes.shared-vaults',
DeprecatedMarkdownVisualEditor: 'org.standardnotes.markdown-visual-editor', DeprecatedMarkdownVisualEditor: 'org.standardnotes.markdown-visual-editor',
DeprecatedBoldEditor: 'org.standardnotes.bold-editor', DeprecatedBoldEditor: 'org.standardnotes.bold-editor',
DeprecatedMarkdownBasicEditor: 'org.standardnotes.simple-markdown-editor', DeprecatedMarkdownBasicEditor: 'org.standardnotes.simple-markdown-editor',

View File

@@ -65,5 +65,11 @@ export function serverFeatures(): ServerFeatureDescription[] {
permission_name: PermissionName.ListedCustomDomain, permission_name: PermissionName.ListedCustomDomain,
availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser], availableInRoles: [RoleName.NAMES.PlusUser, RoleName.NAMES.ProUser],
}, },
{
name: 'Shared Vaults',
identifier: NativeFeatureIdentifier.TYPES.SharedVaults,
permission_name: PermissionName.SharedVaults,
availableInRoles: [RoleName.NAMES.VaultsUser],
},
] ]
} }

View File

@@ -38,4 +38,5 @@ export enum PermissionName {
SubscriptionSharing = 'server:subscription-sharing', SubscriptionSharing = 'server:subscription-sharing',
SuperEditor = 'editor:super-editor', SuperEditor = 'editor:super-editor',
Clipper = 'app:clipper', Clipper = 'app:clipper',
SharedVaults = 'server:shared-vaults',
} }

View File

@@ -20,7 +20,7 @@
}, },
"dependencies": { "dependencies": {
"@standardnotes/common": "^1.50.0", "@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"@standardnotes/features": "workspace:*", "@standardnotes/features": "workspace:*",
"@standardnotes/responses": "workspace:*", "@standardnotes/responses": "workspace:*",
"@standardnotes/sncrypto-common": "workspace:^", "@standardnotes/sncrypto-common": "workspace:^",

View File

@@ -18,7 +18,7 @@
"dependencies": { "dependencies": {
"@standardnotes/api": "workspace:^", "@standardnotes/api": "workspace:^",
"@standardnotes/common": "^1.50.0", "@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"@standardnotes/encryption": "workspace:^", "@standardnotes/encryption": "workspace:^",
"@standardnotes/features": "workspace:^", "@standardnotes/features": "workspace:^",
"@standardnotes/files": "workspace:^", "@standardnotes/files": "workspace:^",

View File

@@ -37,7 +37,7 @@
"@babel/preset-env": "*", "@babel/preset-env": "*",
"@standardnotes/api": "workspace:*", "@standardnotes/api": "workspace:*",
"@standardnotes/common": "^1.50.0", "@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"@standardnotes/domain-events": "^2.122.0", "@standardnotes/domain-events": "^2.122.0",
"@standardnotes/encryption": "workspace:*", "@standardnotes/encryption": "workspace:*",
"@standardnotes/features": "workspace:*", "@standardnotes/features": "workspace:*",

View File

@@ -16,7 +16,7 @@
}, },
"dependencies": { "dependencies": {
"@standardnotes/common": "^1.50.0", "@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0", "@standardnotes/domain-core": "^1.28.0",
"@standardnotes/features": "workspace:^", "@standardnotes/features": "workspace:^",
"@standardnotes/filepicker": "workspace:^", "@standardnotes/filepicker": "workspace:^",
"@standardnotes/models": "workspace:^", "@standardnotes/models": "workspace:^",

View File

@@ -262,6 +262,7 @@ export class WebDependencies extends DependencyContainer {
this.get<FilesController>(Web_TYPES.FilesController), this.get<FilesController>(Web_TYPES.FilesController),
this.get<SubscriptionController>(Web_TYPES.SubscriptionController), this.get<SubscriptionController>(Web_TYPES.SubscriptionController),
this.get<NavigationController>(Web_TYPES.NavigationController), this.get<NavigationController>(Web_TYPES.NavigationController),
this.get<FeaturesController>(Web_TYPES.FeaturesController),
this.get<ItemGroupController>(Web_TYPES.ItemGroupController), this.get<ItemGroupController>(Web_TYPES.ItemGroupController),
this.get<VaultDisplayService>(Web_TYPES.VaultDisplayService), this.get<VaultDisplayService>(Web_TYPES.VaultDisplayService),
application.preferences, application.preferences,

View File

@@ -3,7 +3,6 @@ import { useApplication } from '../ApplicationProvider'
import Icon from '../Icon/Icon' import Icon from '../Icon/Icon'
import { DecryptedItemInterface, classNames } from '@standardnotes/snjs' import { DecryptedItemInterface, classNames } from '@standardnotes/snjs'
import VaultNameBadge from '../Vaults/VaultNameBadge' import VaultNameBadge from '../Vaults/VaultNameBadge'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
type Props = { type Props = {
item: DecryptedItemInterface item: DecryptedItemInterface
@@ -13,7 +12,7 @@ type Props = {
const ListItemVaultInfo: FunctionComponent<Props> = ({ item, className }) => { const ListItemVaultInfo: FunctionComponent<Props> = ({ item, className }) => {
const application = useApplication() const application = useApplication()
if (!featureTrunkVaultsEnabled()) { if (!application.featuresController.isEntitledToVaults()) {
return null return null
} }

View File

@@ -14,7 +14,6 @@ import AddTagOption from '../NotesOptions/AddTagOption'
import { MenuItemIconSize } from '@/Constants/TailwindClassNames' import { MenuItemIconSize } from '@/Constants/TailwindClassNames'
import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption' import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption'
import { iconClass } from '../NotesOptions/ClassNames' import { iconClass } from '../NotesOptions/ClassNames'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
import { useApplication } from '../ApplicationProvider' import { useApplication } from '../ApplicationProvider'
type Props = { type Props = {
@@ -87,7 +86,9 @@ const FileMenuOptions: FunctionComponent<Props> = ({
) : null} ) : null}
</> </>
)} )}
{featureTrunkVaultsEnabled() && <AddToVaultMenuOption iconClassName={iconClass} items={selectedFiles} />} {application.featuresController.isEntitledToVaults() && (
<AddToVaultMenuOption iconClassName={iconClass} items={selectedFiles} />
)}
<AddTagOption <AddTagOption
navigationController={application.navigationController} navigationController={application.navigationController}
linkingController={application.linkingController} linkingController={application.linkingController}

View File

@@ -5,7 +5,6 @@ import Popover from '../Popover/Popover'
import StyledTooltip from '../StyledTooltip/StyledTooltip' import StyledTooltip from '../StyledTooltip/StyledTooltip'
import VaultSelectionMenu from '../VaultSelectionMenu/VaultSelectionMenu' import VaultSelectionMenu from '../VaultSelectionMenu/VaultSelectionMenu'
import { useApplication } from '../ApplicationProvider' import { useApplication } from '../ApplicationProvider'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
import RoundIconButton from '../Button/RoundIconButton' import RoundIconButton from '../Button/RoundIconButton'
const VaultSelectionButton = ({ isMobileNavigation = false }: { isMobileNavigation?: boolean }) => { const VaultSelectionButton = ({ isMobileNavigation = false }: { isMobileNavigation?: boolean }) => {
@@ -16,7 +15,7 @@ const VaultSelectionButton = ({ isMobileNavigation = false }: { isMobileNavigati
const [isOpen, setIsOpen] = useState(false) const [isOpen, setIsOpen] = useState(false)
const toggleMenu = () => setIsOpen(!isOpen) const toggleMenu = () => setIsOpen(!isOpen)
if (!featureTrunkVaultsEnabled()) { if (!application.featuresController.isEntitledToVaults()) {
return null return null
} }

View File

@@ -2,7 +2,6 @@ import { FunctionComponent } from 'react'
import Icon from '../Icon/Icon' import Icon from '../Icon/Icon'
import { useApplication } from '../ApplicationProvider' import { useApplication } from '../ApplicationProvider'
import { DecryptedItemInterface } from '@standardnotes/snjs' import { DecryptedItemInterface } from '@standardnotes/snjs'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
import VaultNameBadge from '../Vaults/VaultNameBadge' import VaultNameBadge from '../Vaults/VaultNameBadge'
type Props = { type Props = {
@@ -12,7 +11,7 @@ type Props = {
const CollaborationInfoHUD: FunctionComponent<Props> = ({ item }) => { const CollaborationInfoHUD: FunctionComponent<Props> = ({ item }) => {
const application = useApplication() const application = useApplication()
if (!featureTrunkVaultsEnabled()) { if (!application.featuresController.isEntitledToVaults()) {
return null return null
} }
@@ -32,7 +31,7 @@ const CollaborationInfoHUD: FunctionComponent<Props> = ({ item }) => {
<VaultNameBadge vault={vault} /> <VaultNameBadge vault={vault} />
{lastEditedBy && ( {lastEditedBy && (
<div title="Last edited by" className="flex rounded bg-info px-1.5 py-1 text-info-contrast select-none"> <div title="Last edited by" className="flex select-none rounded bg-info px-1.5 py-1 text-info-contrast">
<Icon ariaLabel="Shared by" type="pencil" className="mr-1 text-info-contrast" size="medium" /> <Icon ariaLabel="Shared by" type="pencil" className="mr-1 text-info-contrast" size="medium" />
<span className="mr-auto overflow-hidden text-ellipsis text-xs">{lastEditedBy?.name}</span> <span className="mr-auto overflow-hidden text-ellipsis text-xs">{lastEditedBy?.name}</span>
</div> </div>

View File

@@ -41,7 +41,6 @@ import SuperExportModal from './SuperExportModal'
import { useApplication } from '../ApplicationProvider' import { useApplication } from '../ApplicationProvider'
import { MutuallyExclusiveMediaQueryBreakpoints } from '@/Hooks/useMediaQuery' import { MutuallyExclusiveMediaQueryBreakpoints } from '@/Hooks/useMediaQuery'
import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption' import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
import Menu from '../Menu/Menu' import Menu from '../Menu/Menu'
import Popover from '../Popover/Popover' import Popover from '../Popover/Popover'
@@ -267,7 +266,9 @@ const NotesOptions = ({ notes, closeMenu }: NotesOptionsProps) => {
)} )}
<HorizontalSeparator classes="my-2" /> <HorizontalSeparator classes="my-2" />
{featureTrunkVaultsEnabled() && <AddToVaultMenuOption iconClassName={iconClass} items={notes} />} {application.featuresController.isEntitledToVaults() && (
<AddToVaultMenuOption iconClassName={iconClass} items={notes} />
)}
{application.navigationController.tagsCount > 0 && ( {application.navigationController.tagsCount > 0 && (
<AddTagOption <AddTagOption

View File

@@ -6,7 +6,6 @@ import Spinner from '../Spinner/Spinner'
import { PasswordStep } from './PasswordStep' import { PasswordStep } from './PasswordStep'
import { FinishStep } from './FinishStep' import { FinishStep } from './FinishStep'
import { PreprocessingStep } from './PreprocessingStep' import { PreprocessingStep } from './PreprocessingStep'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
interface Props { interface Props {
application: WebApplication application: WebApplication
@@ -50,7 +49,7 @@ class PasswordWizard extends AbstractComponent<Props, State> {
continueTitle: DEFAULT_CONTINUE_TITLE, continueTitle: DEFAULT_CONTINUE_TITLE,
} }
if (featureTrunkVaultsEnabled()) { if (props.application.featuresController.isEntitledToVaults()) {
this.state = { this.state = {
...baseState, ...baseState,
lockContinue: true, lockContinue: true,

View File

@@ -4,7 +4,7 @@ import { PackageProvider } from '../Panes/General/Advanced/Packages/Provider/Pac
import { securityPrefsHasBubble } from '../Panes/Security/securityPrefsHasBubble' import { securityPrefsHasBubble } from '../Panes/Security/securityPrefsHasBubble'
import { PreferencePaneId, StatusServiceEvent } from '@standardnotes/services' import { PreferencePaneId, StatusServiceEvent } from '@standardnotes/services'
import { isDesktopApplication } from '@/Utils' import { isDesktopApplication } from '@/Utils'
import { featureTrunkHomeServerEnabled, featureTrunkVaultsEnabled } from '@/FeatureTrunk' import { featureTrunkHomeServerEnabled } from '@/FeatureTrunk'
import { PreferencesMenuItem } from './PreferencesMenuItem' import { PreferencesMenuItem } from './PreferencesMenuItem'
import { SelectableMenuItem } from './SelectableMenuItem' import { SelectableMenuItem } from './SelectableMenuItem'
import { PREFERENCES_MENU_ITEMS, READY_PREFERENCES_MENU_ITEMS } from './MenuItems' import { PREFERENCES_MENU_ITEMS, READY_PREFERENCES_MENU_ITEMS } from './MenuItems'
@@ -26,7 +26,7 @@ export class PreferencesSessionController {
? PREFERENCES_MENU_ITEMS.slice() ? PREFERENCES_MENU_ITEMS.slice()
: READY_PREFERENCES_MENU_ITEMS.slice() : READY_PREFERENCES_MENU_ITEMS.slice()
if (featureTrunkVaultsEnabled()) { if (application.featuresController.isEntitledToVaults()) {
menuItems.push({ id: 'vaults', label: 'Vaults', icon: 'safe-square', order: 5 }) menuItems.push({ id: 'vaults', label: 'Vaults', icon: 'safe-square', order: 5 })
} }

View File

@@ -14,7 +14,6 @@ import { PaneLayout } from '@/Controllers/PaneController/PaneLayout'
import { usePaneSwipeGesture } from '../Panes/usePaneGesture' import { usePaneSwipeGesture } from '../Panes/usePaneGesture'
import { mergeRefs } from '@/Hooks/mergeRefs' import { mergeRefs } from '@/Hooks/mergeRefs'
import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding' import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
import QuickSettingsButton from '../Footer/QuickSettingsButton' import QuickSettingsButton from '../Footer/QuickSettingsButton'
import VaultSelectionButton from '../Footer/VaultSelectionButton' import VaultSelectionButton from '../Footer/VaultSelectionButton'
@@ -131,7 +130,7 @@ const Navigation = forwardRef<HTMLDivElement, Props>(({ application, className,
icon="tune" icon="tune"
/> />
<QuickSettingsButton application={application} isMobileNavigation /> <QuickSettingsButton application={application} isMobileNavigation />
{featureTrunkVaultsEnabled() && <VaultSelectionButton isMobileNavigation />} {application.featuresController.isEntitledToVaults() && <VaultSelectionButton isMobileNavigation />}
</div> </div>
{children} {children}
</div> </div>

View File

@@ -12,7 +12,6 @@ import { PremiumFeatureIconClass, PremiumFeatureIconName } from '../Icon/Premium
import Popover from '../Popover/Popover' import Popover from '../Popover/Popover'
import IconPicker from '../Icon/IconPicker' import IconPicker from '../Icon/IconPicker'
import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption' import AddToVaultMenuOption from '../Vaults/AddToVaultMenuOption'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
import { useApplication } from '../ApplicationProvider' import { useApplication } from '../ApplicationProvider'
type ContextMenuProps = { type ContextMenuProps = {
@@ -82,7 +81,7 @@ const TagContextMenu = ({ navigationController, isEntitledToFolders, selectedTag
iconGridClassName="max-h-30" iconGridClassName="max-h-30"
/> />
<HorizontalSeparator classes="my-2" /> <HorizontalSeparator classes="my-2" />
{featureTrunkVaultsEnabled() && ( {application.featuresController.isEntitledToVaults() && (
<AddToVaultMenuOption iconClassName="mr-2 text-neutral" items={[selectedTag]} /> <AddToVaultMenuOption iconClassName="mr-2 text-neutral" items={[selectedTag]} />
)} )}
<MenuItem className={'justify-between py-1.5'} onClick={onClickStar}> <MenuItem className={'justify-between py-1.5'} onClick={onClickStar}>

View File

@@ -7,7 +7,6 @@ import { classNames, DecryptedItemInterface, VaultListingInterface } from '@stan
import { useApplication } from '../ApplicationProvider' import { useApplication } from '../ApplicationProvider'
import MenuItem from '../Menu/MenuItem' import MenuItem from '../Menu/MenuItem'
import Menu from '../Menu/Menu' import Menu from '../Menu/Menu'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
const VaultMenu = observer(({ items }: { items: DecryptedItemInterface[] }) => { const VaultMenu = observer(({ items }: { items: DecryptedItemInterface[] }) => {
const application = useApplication() const application = useApplication()
@@ -107,6 +106,7 @@ const VaultMenu = observer(({ items }: { items: DecryptedItemInterface[] }) => {
}) })
const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string; items: DecryptedItemInterface[] }) => { const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string; items: DecryptedItemInterface[] }) => {
const application = useApplication()
const buttonRef = useRef<HTMLButtonElement>(null) const buttonRef = useRef<HTMLButtonElement>(null)
const [isSubMenuOpen, setIsSubMenuOpen] = useState(false) const [isSubMenuOpen, setIsSubMenuOpen] = useState(false)
@@ -115,7 +115,7 @@ const AddToVaultMenuOption = ({ iconClassName, items }: { iconClassName: string;
setIsSubMenuOpen((isOpen) => !isOpen) setIsSubMenuOpen((isOpen) => !isOpen)
}, []) }, [])
if (!featureTrunkVaultsEnabled()) { if (!application.featuresController.isEntitledToVaults()) {
return null return null
} }

View File

@@ -12,6 +12,7 @@ import {
import { action, makeObservable, observable, runInAction, when } from 'mobx' import { action, makeObservable, observable, runInAction, when } from 'mobx'
import { AbstractViewController } from './Abstract/AbstractViewController' import { AbstractViewController } from './Abstract/AbstractViewController'
import { CrossControllerEvent } from './CrossControllerEvent' import { CrossControllerEvent } from './CrossControllerEvent'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
export class FeaturesController extends AbstractViewController implements InternalEventHandlerInterface { export class FeaturesController extends AbstractViewController implements InternalEventHandlerInterface {
hasFolders: boolean hasFolders: boolean
@@ -128,4 +129,13 @@ export class FeaturesController extends AbstractViewController implements Intern
return status === FeatureStatus.Entitled return status === FeatureStatus.Entitled
} }
isEntitledToVaults(): boolean {
const status = this.features.getFeatureStatus(
NativeFeatureIdentifier.create(NativeFeatureIdentifier.TYPES.SharedVaults).getValue(),
)
const isEntitledToFeature = status === FeatureStatus.Entitled
return featureTrunkVaultsEnabled() || isEntitledToFeature
}
} }

View File

@@ -22,6 +22,7 @@ import { LinkingController } from './LinkingController'
import { NavigationController } from './Navigation/NavigationController' import { NavigationController } from './Navigation/NavigationController'
import { SubscriptionController } from './Subscription/SubscriptionController' import { SubscriptionController } from './Subscription/SubscriptionController'
import { getLinkingSearchResults } from '@/Utils/Items/Search/getSearchResults' import { getLinkingSearchResults } from '@/Utils/Items/Search/getSearchResults'
import { FeaturesController } from './FeaturesController'
const createNote = (name: string, options?: Partial<SNNote>) => { const createNote = (name: string, options?: Partial<SNNote>) => {
return { return {
@@ -63,11 +64,13 @@ describe('LinkingController', () => {
itemListController: {} as jest.Mocked<ItemListController>, itemListController: {} as jest.Mocked<ItemListController>,
filesController: {} as jest.Mocked<FilesController>, filesController: {} as jest.Mocked<FilesController>,
subscriptionController: {} as jest.Mocked<SubscriptionController>, subscriptionController: {} as jest.Mocked<SubscriptionController>,
featuresController: {} as jest.Mocked<FeaturesController>,
} as unknown as jest.Mocked<WebApplication> } as unknown as jest.Mocked<WebApplication>
application.getPreference = jest.fn() application.getPreference = jest.fn()
application.addSingleEventObserver = jest.fn() application.addSingleEventObserver = jest.fn()
application.sync.sync = jest.fn() application.sync.sync = jest.fn()
application.featuresController.isEntitledToVaults = jest.fn().mockReturnValue(true)
Object.defineProperty(application, 'items', { value: {} as jest.Mocked<ItemManagerInterface> }) Object.defineProperty(application, 'items', { value: {} as jest.Mocked<ItemManagerInterface> })
@@ -81,6 +84,7 @@ describe('LinkingController', () => {
application.filesController, application.filesController,
application.subscriptionController, application.subscriptionController,
application.navigationController, application.navigationController,
application.featuresController,
application.itemControllerGroup, application.itemControllerGroup,
application.vaultDisplayService, application.vaultDisplayService,
application.preferences, application.preferences,

View File

@@ -32,9 +32,9 @@ import { FilesController } from './FilesController'
import { ItemListController } from './ItemList/ItemListController' import { ItemListController } from './ItemList/ItemListController'
import { NavigationController } from './Navigation/NavigationController' import { NavigationController } from './Navigation/NavigationController'
import { SubscriptionController } from './Subscription/SubscriptionController' import { SubscriptionController } from './Subscription/SubscriptionController'
import { featureTrunkVaultsEnabled } from '@/FeatureTrunk'
import { ItemGroupController } from '@/Components/NoteView/Controller/ItemGroupController' import { ItemGroupController } from '@/Components/NoteView/Controller/ItemGroupController'
import { VaultDisplayServiceInterface } from '@standardnotes/ui-services' import { VaultDisplayServiceInterface } from '@standardnotes/ui-services'
import { FeaturesController } from './FeaturesController'
export class LinkingController extends AbstractViewController implements InternalEventHandlerInterface { export class LinkingController extends AbstractViewController implements InternalEventHandlerInterface {
shouldLinkToParentFolders: boolean shouldLinkToParentFolders: boolean
@@ -45,6 +45,7 @@ export class LinkingController extends AbstractViewController implements Interna
private filesController: FilesController, private filesController: FilesController,
private subscriptionController: SubscriptionController, private subscriptionController: SubscriptionController,
private navigationController: NavigationController, private navigationController: NavigationController,
private featuresController: FeaturesController,
private itemControllerGroup: ItemGroupController, private itemControllerGroup: ItemGroupController,
private vaultDisplayService: VaultDisplayServiceInterface, private vaultDisplayService: VaultDisplayServiceInterface,
private preferences: PreferenceServiceInterface, private preferences: PreferenceServiceInterface,
@@ -207,7 +208,7 @@ export class LinkingController extends AbstractViewController implements Interna
const linkNoteAndFile = async (note: SNNote, file: FileItem) => { const linkNoteAndFile = async (note: SNNote, file: FileItem) => {
const updatedFile = await this.mutator.associateFileWithNote(file, note) const updatedFile = await this.mutator.associateFileWithNote(file, note)
if (featureTrunkVaultsEnabled()) { if (this.featuresController.isEntitledToVaults()) {
if (updatedFile) { if (updatedFile) {
const noteVault = this.vaults.getItemVault(note) const noteVault = this.vaults.getItemVault(note)
const fileVault = this.vaults.getItemVault(updatedFile) const fileVault = this.vaults.getItemVault(updatedFile)

View File

@@ -4138,7 +4138,7 @@ __metadata:
resolution: "@standardnotes/api@workspace:packages/api" resolution: "@standardnotes/api@workspace:packages/api"
dependencies: dependencies:
"@standardnotes/common": ^1.50.0 "@standardnotes/common": ^1.50.0
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@standardnotes/models": "workspace:*" "@standardnotes/models": "workspace:*"
"@standardnotes/responses": "workspace:*" "@standardnotes/responses": "workspace:*"
"@standardnotes/utils": "workspace:*" "@standardnotes/utils": "workspace:*"
@@ -4288,7 +4288,7 @@ __metadata:
"@babel/core": "*" "@babel/core": "*"
"@babel/preset-env": "*" "@babel/preset-env": "*"
"@electron/remote": ^2.0.9 "@electron/remote": ^2.0.9
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@standardnotes/electron-clear-data": 1.1.1 "@standardnotes/electron-clear-data": 1.1.1
"@standardnotes/web": "workspace:*" "@standardnotes/web": "workspace:*"
"@types/fs-extra": ^11.0.1 "@types/fs-extra": ^11.0.1
@@ -4340,12 +4340,12 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@standardnotes/domain-core@npm:^1.25.0": "@standardnotes/domain-core@npm:^1.28.0":
version: 1.25.0 version: 1.28.0
resolution: "@standardnotes/domain-core@npm:1.25.0" resolution: "@standardnotes/domain-core@npm:1.28.0"
dependencies: dependencies:
uuid: ^9.0.0 uuid: ^9.0.0
checksum: f99196f6209a05a50e84371d3a59cf870937a5589f4ba4caab0f2eb17c2cfa733142b18ca8788016c81ca609d1f5a0461e51bcf159a67d631e249a04a5568244 checksum: 9ee58eea35ed5d988513c5a24f751b9c3a2be2a324c30684db54ecbd16f0c8e19a80b8e464bde46e86905590085923c7e1abbe1b792a4ef0a19c1171e8f3b6c2
languageName: node languageName: node
linkType: hard linkType: hard
@@ -4392,7 +4392,7 @@ __metadata:
dependencies: dependencies:
"@standardnotes/common": ^1.50.0 "@standardnotes/common": ^1.50.0
"@standardnotes/config": 2.4.3 "@standardnotes/config": 2.4.3
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@standardnotes/models": "workspace:*" "@standardnotes/models": "workspace:*"
"@standardnotes/responses": "workspace:*" "@standardnotes/responses": "workspace:*"
"@standardnotes/sncrypto-common": "workspace:*" "@standardnotes/sncrypto-common": "workspace:*"
@@ -4427,7 +4427,7 @@ __metadata:
resolution: "@standardnotes/features@workspace:packages/features" resolution: "@standardnotes/features@workspace:packages/features"
dependencies: dependencies:
"@standardnotes/common": ^1.50.0 "@standardnotes/common": ^1.50.0
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@types/jest": ^29.2.3 "@types/jest": ^29.2.3
"@typescript-eslint/eslint-plugin": "*" "@typescript-eslint/eslint-plugin": "*"
eslint: "*" eslint: "*"
@@ -4633,7 +4633,7 @@ __metadata:
resolution: "@standardnotes/models@workspace:packages/models" resolution: "@standardnotes/models@workspace:packages/models"
dependencies: dependencies:
"@standardnotes/common": ^1.50.0 "@standardnotes/common": ^1.50.0
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@standardnotes/features": "workspace:*" "@standardnotes/features": "workspace:*"
"@standardnotes/responses": "workspace:*" "@standardnotes/responses": "workspace:*"
"@standardnotes/sncrypto-common": "workspace:^" "@standardnotes/sncrypto-common": "workspace:^"
@@ -4729,7 +4729,7 @@ __metadata:
dependencies: dependencies:
"@standardnotes/api": "workspace:^" "@standardnotes/api": "workspace:^"
"@standardnotes/common": ^1.50.0 "@standardnotes/common": ^1.50.0
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@standardnotes/encryption": "workspace:^" "@standardnotes/encryption": "workspace:^"
"@standardnotes/features": "workspace:^" "@standardnotes/features": "workspace:^"
"@standardnotes/files": "workspace:^" "@standardnotes/files": "workspace:^"
@@ -4828,7 +4828,7 @@ __metadata:
"@babel/preset-env": "*" "@babel/preset-env": "*"
"@standardnotes/api": "workspace:*" "@standardnotes/api": "workspace:*"
"@standardnotes/common": ^1.50.0 "@standardnotes/common": ^1.50.0
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@standardnotes/domain-events": ^2.122.0 "@standardnotes/domain-events": ^2.122.0
"@standardnotes/encryption": "workspace:*" "@standardnotes/encryption": "workspace:*"
"@standardnotes/features": "workspace:*" "@standardnotes/features": "workspace:*"
@@ -4953,7 +4953,7 @@ __metadata:
resolution: "@standardnotes/ui-services@workspace:packages/ui-services" resolution: "@standardnotes/ui-services@workspace:packages/ui-services"
dependencies: dependencies:
"@standardnotes/common": ^1.50.0 "@standardnotes/common": ^1.50.0
"@standardnotes/domain-core": ^1.25.0 "@standardnotes/domain-core": ^1.28.0
"@standardnotes/features": "workspace:^" "@standardnotes/features": "workspace:^"
"@standardnotes/filepicker": "workspace:^" "@standardnotes/filepicker": "workspace:^"
"@standardnotes/models": "workspace:^" "@standardnotes/models": "workspace:^"