Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
19b0d18
add feature flag with temporary name
jengstrom-bw Jun 17, 2026
8cd4837
update copy for collection dialog based on feature flag
jengstrom-bw Jun 17, 2026
0dec2a5
update copy and startIcon for domain rules based on feature flag
jengstrom-bw Jun 17, 2026
794609e
update copy, icon and button type for new send dropdown based on feat…
jengstrom-bw Jun 17, 2026
cfd975b
update copy for vault component based on feature flag
jengstrom-bw Jun 17, 2026
6eb6394
update copy for SM project dialog based on feature flag
jengstrom-bw Jun 17, 2026
a63413e
update copy for SM secret-dialog based on feature flag
jengstrom-bw Jun 17, 2026
63dd623
update copy and startIcon for SM service accounts list based on featu…
jengstrom-bw Jun 17, 2026
dfe2572
update copy for SM new-menu based on feature flag
jengstrom-bw Jun 17, 2026
61d6596
update copy and startIcon for SM projects list based on feature flag
jengstrom-bw Jun 17, 2026
083bd42
update copy and startIcon for SM secrets list based on feature flag
jengstrom-bw Jun 17, 2026
a4fd1fd
update copy for new send dropdown V1 and V2 based on feature flag
jengstrom-bw Jun 17, 2026
ba6cb32
update copy for add edit dialog based on feature flag
jengstrom-bw Jun 17, 2026
db6725d
update copy for new cipher menu based on feature flag
jengstrom-bw Jun 17, 2026
f856029
update copy for vault item dialog based on feature flag
jengstrom-bw Jun 17, 2026
172b022
update copy for AC groups and group add edit based on feature flag
jengstrom-bw Jun 17, 2026
e2cbcbb
update copy and icon for domain verification based on feature flag
jengstrom-bw Jun 17, 2026
e0d4dc5
fix tests
jengstrom-bw Jun 17, 2026
3a264d0
update feature flag name
jengstrom-bw Jun 18, 2026
be5f61c
add i18n keys used by lib components in browser and desktop
jengstrom-bw Jun 18, 2026
3b932d2
update feature flag variable name
jengstrom-bw Jun 18, 2026
29a5b06
Merge branch 'main' into vault/pm-32402/update-copy-from-new-to-creat…
jengstrom-bw Jun 18, 2026
b78057f
update individual vault empty button to be secondary and no plus icon
jengstrom-bw Jun 18, 2026
d3770e1
update AC empty vault add button v1/v2
jengstrom-bw Jun 18, 2026
5eea120
update SM add machine account modal copy
jengstrom-bw Jun 18, 2026
bd8d4d5
update new domain modal copy
jengstrom-bw Jun 18, 2026
209608b
fix tests
jengstrom-bw Jun 18, 2026
1421259
Merge branch 'main' into vault/pm-32402/update-copy-from-new-to-creat…
jengstrom-bw Jun 22, 2026
6cf6a34
Merge branch 'main' into vault/pm-32402/update-copy-from-new-to-creat…
jengstrom-bw Jun 22, 2026
72450bd
Merge branch 'main' into vault/pm-32402/update-copy-from-new-to-creat…
jengstrom-bw Jun 23, 2026
fe8f0af
fix new send dropdown when hideIcon and feature flag are false, show …
jengstrom-bw Jun 23, 2026
320cc7e
add initial value to btnTextAddCreateFeatureFlag signal
jengstrom-bw Jun 23, 2026
5452027
revert changes to new send dropdown in libs, out of scope for web
jengstrom-bw Jun 23, 2026
0ab9c8d
fixes missed lib change reversion
jengstrom-bw Jun 23, 2026
2a6e094
Merge branch 'main' into vault/pm-32402/update-copy-from-new-to-creat…
jengstrom-bw Jun 24, 2026
e1e582e
fix issue from merge conflict
jengstrom-bw Jun 24, 2026
9b7acf2
update add-edit header copy
jengstrom-bw Jun 23, 2026
219193e
update vault new button copy to add
jengstrom-bw Jun 23, 2026
11ae23d
update view header copy to sentence case
jengstrom-bw Jun 23, 2026
a438747
update copy for new send dropdown lib
jengstrom-bw Jun 25, 2026
30fea39
update send buttonType
jengstrom-bw Jun 25, 2026
e268d63
update buttonType and icon for empty vault list
jengstrom-bw Jun 25, 2026
0617475
add optional icon and buttonType
jengstrom-bw Jun 25, 2026
7c26892
change copy for secondary buttons
jengstrom-bw Jun 25, 2026
235f3ff
fix tests
jengstrom-bw Jun 25, 2026
414f616
Merge branch 'main' into vault/pm-32384/update-copy-new-to-create-add…
jengstrom-bw Jun 29, 2026
e26aefe
Merge branch 'vault/pm-32384/update-copy-new-to-create-add-browser' i…
jengstrom-bw Jun 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,12 @@ describe("AddEditComponent", () => {
providers: [
provideNoopAnimations(),
{ provide: PlatformUtilsService, useValue: mock<PlatformUtilsService>() },
{ provide: ConfigService, useValue: mock<ConfigService>() },
{
provide: ConfigService,
useValue: mock<ConfigService>({
getFeatureFlag$: jest.fn().mockReturnValue(of(false)),
}),
},
{ provide: PopupRouterCacheService, useValue: { back, setHistory } },
{ provide: PopupCloseWarningService, useValue: { disable } },
{ provide: Router, useValue: { navigate } },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component, OnInit, OnDestroy, viewChild } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { takeUntilDestroyed, toSignal } from "@angular/core/rxjs-interop";
import { FormsModule } from "@angular/forms";
import { ActivatedRoute, Params, Router } from "@angular/router";
import { firstValueFrom, map, Observable, switchMap } from "rxjs";
Expand Down Expand Up @@ -192,6 +192,11 @@ export type AddEditQueryParams = Partial<Record<keyof QueryParams, string>>;
],
})
export class AddEditComponent implements OnInit, OnDestroy {
protected readonly btnTextAddCreateFeatureFlag = toSignal(
this.configService.getFeatureFlag$(FeatureFlag.PM32380_BtnTextAddCreate),
{ initialValue: false },
);

readonly cipherFormComponent = viewChild(CipherFormComponent);

headerText: string;
Expand Down Expand Up @@ -513,18 +518,54 @@ export class AddEditComponent implements OnInit, OnDestroy {
setHeader(mode: CipherFormMode, type: CipherType) {
const isEditMode = mode === "edit" || mode === "partial-edit";
const translation = {
[CipherType.Login]: isEditMode ? "editItemHeaderLogin" : "newItemHeaderLogin",
[CipherType.Card]: isEditMode ? "editItemHeaderCard" : "newItemHeaderCard",
[CipherType.Identity]: isEditMode ? "editItemHeaderIdentity" : "newItemHeaderIdentity",
[CipherType.SecureNote]: isEditMode ? "editItemHeaderNote" : "newItemHeaderNote",
[CipherType.SshKey]: isEditMode ? "editItemHeaderSshKey" : "newItemHeaderSshKey",
[CipherType.Login]: isEditMode
? this.btnTextAddCreateFeatureFlag()
? "editItemHeaderLoginSentenceCase"
: "editItemHeaderLogin"
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderLogin"
: "newItemHeaderLogin",
[CipherType.Card]: isEditMode
? this.btnTextAddCreateFeatureFlag()
? "editItemHeaderCardSentenceCase"
: "editItemHeaderCard"
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderCard"
: "newItemHeaderCard",
[CipherType.Identity]: isEditMode
? this.btnTextAddCreateFeatureFlag()
? "editItemHeaderIdentitySentenceCase"
: "editItemHeaderIdentity"
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderIdentity"
: "newItemHeaderIdentity",
[CipherType.SecureNote]: isEditMode
? this.btnTextAddCreateFeatureFlag()
? "editItemHeaderNoteSentenceCase"
: "editItemHeaderNote"
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderNote"
: "newItemHeaderNote",
[CipherType.SshKey]: isEditMode
? "editItemHeaderSshKey"
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderSshKey"
: "newItemHeaderSshKey",
[CipherType.BankAccount]: isEditMode
? "editItemHeaderBankAccount"
: "newItemHeaderBankAccount",
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderBankAccount"
: "newItemHeaderBankAccount",
[CipherType.DriversLicense]: isEditMode
? "editItemHeaderLicense"
: "newItemHeaderDriversLicense",
[CipherType.Passport]: isEditMode ? "editItemHeaderPassport" : "newItemHeaderPassport",
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderDriversLicense"
: "newItemHeaderDriversLicense",
[CipherType.Passport]: isEditMode
? "editItemHeaderPassport"
: this.btnTextAddCreateFeatureFlag()
? "addItemHeaderPassport"
: "newItemHeaderPassport",
};
return this.i18nService.t(translation[type]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
(click)="navigateToNewItemPage()"
startIcon="bwi-plus"
>
{{ "new" | i18n }}
{{ (btnTextAddCreateFeatureFlag() ? "add" : "new") | i18n }}
</button>
} @else {
<button
Expand All @@ -16,7 +16,7 @@
buttonType="primary"
type="button"
>
{{ "new" | i18n }}
{{ (btnTextAddCreateFeatureFlag() ? "add" : "new") | i18n }}
</button>
<bit-menu #itemOptions>
@for (menuItem of cipherMenuItems$ | async; track menuItem.type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ export class NewItemDropdownComponent implements OnInit {
{ initialValue: false },
);

protected readonly btnTextAddCreateFeatureFlag = toSignal(
this.configService.getFeatureFlag$(FeatureFlag.PM32380_BtnTextAddCreate),
{ initialValue: false },
);

constructor(
private dialogService: DialogService,
private restrictedItemTypeService: RestrictedItemTypesService,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// FIXME: Update this file to be type safe and remove this and next line
// @ts-strict-ignore
import { CommonModule } from "@angular/common";
import { Component } from "@angular/core";
import { Component, inject } from "@angular/core";
import { takeUntilDestroyed, toSignal } from "@angular/core/rxjs-interop";
import { FormsModule } from "@angular/forms";
import { ActivatedRoute, Router } from "@angular/router";
Expand All @@ -23,6 +23,8 @@ import {
} from "@bitwarden/common/autofill/constants";
import { DomainSettingsService } from "@bitwarden/common/autofill/services/domain-settings.service";
import { EventCollectionService, EventType } from "@bitwarden/common/dirt/event-logs";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { UserId } from "@bitwarden/common/types/guid";
Expand Down Expand Up @@ -111,6 +113,12 @@ type LoadAction =
],
})
export class ViewComponent {
private readonly configService = inject(ConfigService);
protected readonly btnTextAddCreateFeatureFlag = toSignal(
this.configService.getFeatureFlag$(FeatureFlag.PM32380_BtnTextAddCreate),
{ initialValue: false },
);

private activeUserId: UserId;

headerText: string;
Expand Down Expand Up @@ -216,10 +224,18 @@ export class ViewComponent {

setHeader(type: CipherType) {
const translation = {
[CipherType.Login]: "viewItemHeaderLogin",
[CipherType.Card]: "viewItemHeaderCard",
[CipherType.Identity]: "viewItemHeaderIdentity",
[CipherType.SecureNote]: "viewItemHeaderNote",
[CipherType.Login]: this.btnTextAddCreateFeatureFlag()
? "viewItemHeaderLoginSentenceCase"
: "viewItemHeaderLogin",
[CipherType.Card]: this.btnTextAddCreateFeatureFlag()
? "viewItemHeaderCardSentenceCase"
: "viewItemHeaderCard",
[CipherType.Identity]: this.btnTextAddCreateFeatureFlag()
? "viewItemHeaderIdentitySentenceCase"
: "viewItemHeaderIdentity",
[CipherType.SecureNote]: this.btnTextAddCreateFeatureFlag()
? "viewItemHeaderNoteSentenceCase"
: "viewItemHeaderNote",
[CipherType.SshKey]: "viewItemHeaderSshKey",
[CipherType.BankAccount]: "viewItemHeaderBankAccount",
[CipherType.DriversLicense]: "viewItemHeaderLicense",
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/app/tools/send/send.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<tools-new-send-dropdown-v2
slot="empty-button"
[hideIcon]="true"
buttonType="primary"
[buttonType]="btnTextAddCreateFeatureFlag() ? 'secondary' : 'primary'"
(addSend)="addSend($event)"
/>
</tools-send-list>
Expand Down
8 changes: 8 additions & 0 deletions apps/desktop/src/app/tools/send/send.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { Component, DestroyRef, inject } from "@angular/core";
import { toSignal } from "@angular/core/rxjs-interop";
import { combineLatest, lastValueFrom, map } from "rxjs";

import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
Expand Down Expand Up @@ -64,6 +66,12 @@ export class SendComponent {
private logService = inject(LogService);
private sendFormService = inject(SendFormService);
private destroyRef = inject(DestroyRef);
private readonly configService = inject(ConfigService);

protected readonly btnTextAddCreateFeatureFlag = toSignal(
this.configService.getFeatureFlag$(FeatureFlag.PM32380_BtnTextAddCreate),
{ initialValue: false },
);

private activeDrawerRef?: DialogRef<SendItemDialogResult>;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@
[canCreateCipher]="true"
[canCreateFolder]="true"
[canCreateSshKey]="true"
buttonType="secondary"
[icon]="undefined"
(cipherAdded)="addCipher($event)"
(folderAdded)="addFolder()"
(onAddItemDialog)="onAddItemDialog.emit()"
Expand Down
10 changes: 9 additions & 1 deletion apps/desktop/src/vault/app/vault-v3/vault-list.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import { ScrollingModule } from "@angular/cdk/scrolling";
import { AsyncPipe } from "@angular/common";
import { Component, input, output, effect, inject, computed } from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { takeUntilDestroyed, toSignal } from "@angular/core/rxjs-interop";
import { Observable, of, switchMap } from "rxjs";

import { BitSvg } from "@bitwarden/assets/svg";
import { CollectionView } from "@bitwarden/common/admin-console/models/collections";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service";
import { CipherType } from "@bitwarden/common/vault/enums";
import { CipherAuthorizationService } from "@bitwarden/common/vault/services/cipher-authorization.service";
Expand Down Expand Up @@ -92,6 +94,12 @@ export class VaultListComponent<C extends CipherViewLike> {
protected cipherAuthorizationService = inject(CipherAuthorizationService);
protected restrictedItemTypesService = inject(RestrictedItemTypesService);
private premiumUpgradePromptService = inject(PremiumUpgradePromptService);
private readonly configService = inject(ConfigService);

protected readonly btnTextAddCreateFeatureFlag = toSignal(
this.configService.getFeatureFlag$(FeatureFlag.PM32380_BtnTextAddCreate),
{ initialValue: false },
);

protected dataSource = new TableDataSource<VaultItem<C>>();
private restrictedTypes: RestrictedCipherType[] = [];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,16 @@
type="button"
[startIcon]="!hideIcon() ? 'bwi-plus' : undefined"
>
{{ (hideIcon() ? "createSend" : "new") | i18n }}
{{
(hideIcon()
? btnTextAddCreateFeatureFlag()
? "createSendV2"
: "createSend"
: btnTextAddCreateFeatureFlag()
? "create"
: "new"
) | i18n
}}
</button>
<bit-menu #itemOptions>
<button bitMenuItem type="button" (click)="onTextSendClick()">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { BehaviorSubject, of } from "rxjs";

import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { SendType } from "@bitwarden/common/tools/send/types/send-type";
import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service";
Expand All @@ -16,11 +17,14 @@ describe("NewSendDropdownV2Component", () => {
let billingService: MockProxy<BillingAccountProfileStateService>;
let accountService: MockProxy<AccountService>;
let premiumUpgradeService: MockProxy<PremiumUpgradePromptService>;
let configService: MockProxy<ConfigService>;

beforeEach(async () => {
billingService = mock<BillingAccountProfileStateService>();
accountService = mock<AccountService>();
premiumUpgradeService = mock<PremiumUpgradePromptService>();
configService = mock<ConfigService>();
configService.getFeatureFlag$.mockReturnValue(of(false));

// Default: user has premium
accountService.activeAccount$ = of({ id: "user-123" } as any);
Expand All @@ -36,6 +40,7 @@ describe("NewSendDropdownV2Component", () => {
{ provide: AccountService, useValue: accountService },
{ provide: PremiumUpgradePromptService, useValue: premiumUpgradeService },
{ provide: I18nService, useValue: i18nService },
{ provide: ConfigService, useValue: configService },
],
}).compileComponents();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import { PremiumBadgeComponent } from "@bitwarden/angular/billing/components/pre
import { JslibModule } from "@bitwarden/angular/jslib.module";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { SendType } from "@bitwarden/common/tools/send/types/send-type";
import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service";
import { ButtonModule, ButtonType, MenuModule } from "@bitwarden/components";
Expand All @@ -30,6 +32,12 @@ export class NewSendDropdownV2Component {
private readonly billingAccountProfileStateService = inject(BillingAccountProfileStateService);
private readonly accountService = inject(AccountService);
private readonly premiumUpgradePromptService = inject(PremiumUpgradePromptService);
private readonly configService = inject(ConfigService);

protected readonly btnTextAddCreateFeatureFlag = toSignal(
this.configService.getFeatureFlag$(FeatureFlag.PM32380_BtnTextAddCreate),
{ initialValue: false },
);

protected readonly hasNoPremium = toSignal(
this.accountService.activeAccount$.pipe(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,16 @@
type="button"
[startIcon]="!hideIcon ? 'bwi-plus' : undefined"
>
{{ (hideIcon ? "createSend" : "new") | i18n }}
{{
(hideIcon
? btnTextAddCreateFeatureFlag()
? "createSendV2"
: "createSend"
: btnTextAddCreateFeatureFlag()
? "create"
: "new"
) | i18n
}}
</button>
<bit-menu #itemOptions>
<a bitMenuItem [routerLink]="buildRouterLink()" [queryParams]="buildQueryParams(sendType.Text)">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import { CommonModule } from "@angular/common";
import { Component, Input, OnInit } from "@angular/core";
import { Component, inject, Input, OnInit } from "@angular/core";
import { toSignal } from "@angular/core/rxjs-interop";
import { Router, RouterLink } from "@angular/router";
import { firstValueFrom } from "rxjs";

import { PremiumBadgeComponent } from "@bitwarden/angular/billing/components/premium-badge";
import { JslibModule } from "@bitwarden/angular/jslib.module";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { SendType } from "@bitwarden/common/tools/send/types/send-type";
import { PremiumUpgradePromptService } from "@bitwarden/common/vault/abstractions/premium-upgrade-prompt.service";
import { ButtonModule, ButtonType, MenuModule } from "@bitwarden/components";
Expand All @@ -30,6 +33,13 @@ export class NewSendDropdownComponent implements OnInit {

hasNoPremium = false;

private readonly configService = inject(ConfigService);

protected readonly btnTextAddCreateFeatureFlag = toSignal(
this.configService.getFeatureFlag$(FeatureFlag.PM32380_BtnTextAddCreate),
{ initialValue: false },
);

constructor(
private billingAccountProfileStateService: BillingAccountProfileStateService,
private accountService: AccountService,
Expand Down
Loading
Loading