1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-09 21:20:27 +00:00

added 'edit folder' button and functionality to folders

This commit is contained in:
Leslie Xiong
2025-12-11 12:09:32 -05:00
parent 6e74bf8511
commit 3792e17ec0
4 changed files with 65 additions and 5 deletions

View File

@@ -7,6 +7,18 @@
[appA11yTitle]="displayName()"
(click)="applyFilter($event)"
>
@if (folder()?.node.id) {
<button
type="button"
slot="end"
class="edit-button"
[bitIconButton]="'bwi-pencil'"
[buttonType]="'nav-contrast'"
size="small"
label="'editFolder' | i18n"
(click)="editFolder(folder().node)"
></button>
}
@for (childFolder of folder().children; track childFolder.node.id) {
<app-folder-filter [folder]="childFolder" [activeFilter]="activeFilter()" />
}
@@ -19,5 +31,18 @@
[variant]="'tree'"
[appA11yTitle]="displayName()"
(click)="applyFilter($event)"
/>
>
@if (folder()?.node.id) {
<button
type="button"
slot="end"
class="edit-button"
[bitIconButton]="'bwi-pencil'"
[buttonType]="'nav-contrast'"
size="small"
label="'editFolder' | i18n"
(click)="editFolder(folder().node)"
></button>
}
</bit-nav-item>
}

View File

@@ -1,6 +1,7 @@
import { Component, input, computed } from "@angular/core";
import { Component, input, computed, output } from "@angular/core";
import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node";
import { IconButtonModule } from "@bitwarden/components";
import { VaultFilter, FolderFilter } from "@bitwarden/vault";
import { VAULT_FILTER_IMPORTS } from "../shared-filter-imports";
@@ -11,11 +12,12 @@ import { VAULT_FILTER_IMPORTS } from "../shared-filter-imports";
selector: "app-folder-filter",
templateUrl: "folder-filter.component.html",
standalone: true,
imports: [...VAULT_FILTER_IMPORTS],
imports: [...VAULT_FILTER_IMPORTS, IconButtonModule],
})
export class FolderFilterComponent {
protected readonly folder = input<TreeNode<FolderFilter>>();
protected readonly activeFilter = input<VaultFilter>();
protected onEditFolder = output<FolderFilter>();
protected readonly displayName = computed<string>(() => {
return this.folder().node.name;
@@ -36,4 +38,8 @@ export class FolderFilterComponent {
filter.selectedFolderNode = this.folder();
}
}
protected editFolder(folder: FolderFilter) {
this.onEditFolder.emit(folder);
}
}

View File

@@ -22,7 +22,11 @@
@if (!hideFolders()) {
<bit-nav-group [icon]="'bwi-folder'" [text]="'folders' | i18n" [variant]="'tree'">
@for (folder of (folders$ | async)?.children ?? []; track folder.node.id) {
<app-folder-filter [activeFilter]="activeFilter" [folder]="folder" />
<app-folder-filter
[activeFilter]="activeFilter"
[folder]="folder"
(onEditFolder)="editFolder($event)"
/>
}
</bit-nav-group>
}

View File

@@ -8,8 +8,9 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv
import { getUserId } from "@bitwarden/common/auth/services/account.service";
import { UserId } from "@bitwarden/common/types/guid";
import { CipherArchiveService } from "@bitwarden/common/vault/abstractions/cipher-archive.service";
import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction";
import { TreeNode } from "@bitwarden/common/vault/models/domain/tree-node";
import { NavigationModule } from "@bitwarden/components";
import { NavigationModule, DialogService } from "@bitwarden/components";
import { I18nPipe } from "@bitwarden/ui-common";
import {
OrganizationFilter,
@@ -19,6 +20,7 @@ import {
VaultFilter,
VaultFilterServiceAbstraction as VaultFilterService,
RoutedVaultFilterBridgeService,
AddEditFolderDialogComponent,
} from "@bitwarden/vault";
import { FolderFilterComponent } from "./filters/folder-filter.component";
@@ -47,7 +49,9 @@ export class VaultFilterComponent implements OnInit {
private vaultFilterService: VaultFilterService = inject(VaultFilterService);
private accountService: AccountService = inject(AccountService);
private cipherArchiveService: CipherArchiveService = inject(CipherArchiveService);
private folderService: FolderService = inject(FolderService);
private policyService: PolicyService = inject(PolicyService);
private dialogService: DialogService = inject(DialogService);
private componentIsDestroyed$ = new Subject<boolean>();
protected activeFilter: VaultFilter;
@@ -106,4 +110,25 @@ export class VaultFilterComponent implements OnInit {
this.isLoaded = true;
}
protected async editFolder(folder: FolderFilter) {
if (!this.activeUserId) {
return;
}
const folderView = await firstValueFrom(
this.folderService.getDecrypted$(folder.id, this.activeUserId),
);
if (!folderView) {
return;
}
AddEditFolderDialogComponent.open(this.dialogService, {
editFolderConfig: {
folder: {
...folderView,
},
},
});
}
}