1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-17 00:33:44 +00:00

[CL-717][PM-27966] Update to Angular 20 and Storybook 9 (#17638)

This commit is contained in:
Vicki League
2025-12-01 14:15:58 -05:00
committed by GitHub
parent 79d518fcf7
commit 10424e227b
101 changed files with 2926 additions and 3531 deletions

View File

@@ -1,5 +1,4 @@
import { DOCUMENT } from "@angular/common";
import { Injectable, Inject, NgZone, OnDestroy } from "@angular/core";
import { Injectable, Inject, NgZone, OnDestroy, DOCUMENT } from "@angular/core";
@Injectable({ providedIn: "root" })
export class AriaDisabledClickCaptureService implements OnDestroy {

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Controls } from "@storybook/addon-docs";
import { Meta, Story, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./anon-layout-wrapper.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Controls } from "@storybook/addon-docs";
import { Meta, Story, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./anon-layout.stories";

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Component Library/Async Actions/In Forms/Documentation" />

View File

@@ -1,8 +1,8 @@
import { Component } from "@angular/core";
import { FormsModule, ReactiveFormsModule, Validators, FormBuilder } from "@angular/forms";
import { action } from "@storybook/addon-actions";
import { Meta, moduleMetadata, StoryObj } from "@storybook/angular";
import { delay, of } from "rxjs";
import { action } from "storybook/actions";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Component Library/Async Actions/Overview" />

View File

@@ -1,4 +1,4 @@
import { Meta, Story } from "@storybook/addon-docs";
import { Meta, Story } from "@storybook/addon-docs/blocks";
import * as stories from "./standalone.stories.ts";
<Meta of={stories} />

View File

@@ -1,7 +1,7 @@
import { Component } from "@angular/core";
import { action } from "@storybook/addon-actions";
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { delay, of } from "rxjs";
import { action } from "storybook/actions";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";

View File

@@ -1,4 +1,4 @@
import { Description, Meta, Canvas, Primary, Controls, Title } from "@storybook/addon-docs";
import { Meta, Description, Canvas, Primary, Controls, Title } from "@storybook/addon-docs/blocks";
import * as stories from "./avatar.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./badge.stories";

View File

@@ -1,4 +1,4 @@
import { Canvas, Controls, Description, Meta, Primary, Title } from "@storybook/addon-docs";
import { Canvas, Controls, Description, Meta, Primary, Title } from "@storybook/addon-docs/blocks";
import * as stories from "./banner.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./breadcrumbs.stories";

View File

@@ -6,7 +6,7 @@ import {
Controls,
Title,
Description,
} from "@storybook/addon-docs";
} from "@storybook/addon-docs/blocks";
import * as stories from "./button.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./callout.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs";
import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./base-card.stories";

View File

@@ -1,4 +1,12 @@
import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import {
Meta,
Canvas,
Source,
Primary,
Controls,
Title,
Description,
} from "@storybook/addon-docs/blocks";
import * as stories from "./checkbox.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs";
import { Meta, Primary, Controls, Canvas, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./chip-select.stories";

View File

@@ -1,6 +1,6 @@
import { FormsModule } from "@angular/forms";
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { getAllByRole, userEvent } from "@storybook/test";
import { getAllByRole, userEvent } from "storybook/test";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./color-password.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Primary, Title, Description } from "@storybook/addon-docs";
import { Meta, Primary, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./container.stories";

View File

@@ -1,9 +1,9 @@
import { DIALOG_DATA, DialogRef } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
import { Component, inject } from "@angular/core";
import { NoopAnimationsModule, provideAnimations } from "@angular/platform-browser/animations";
import { RouterTestingModule } from "@angular/router/testing";
import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular";
import { getAllByRole, userEvent } from "@storybook/test";
import { getAllByRole, userEvent } from "storybook/test";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
@@ -36,7 +36,7 @@ interface Animal {
imports: [ButtonModule, LayoutComponent],
})
class StoryDialogComponent {
constructor(public dialogService: DialogService) {}
dialogService = inject(DialogService);
openDialog() {
this.dialogService.open(StoryDialogContentComponent, {
@@ -85,10 +85,8 @@ class StoryDialogComponent {
imports: [DialogModule, ButtonModule],
})
class StoryDialogContentComponent {
constructor(
public dialogRef: DialogRef,
@Inject(DIALOG_DATA) private data: Animal,
) {}
dialogRef = inject(DialogRef);
private data = inject<Animal>(DIALOG_DATA);
get animal() {
return this.data?.animal;
@@ -118,10 +116,8 @@ class StoryDialogContentComponent {
imports: [DialogModule, ButtonModule],
})
class NonDismissableContentComponent {
constructor(
public dialogRef: DialogRef,
@Inject(DIALOG_DATA) private data: Animal,
) {}
dialogRef = inject(DialogRef);
private data = inject<Animal>(DIALOG_DATA);
get animal() {
return this.data?.animal;

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./dialog.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Source } from "@storybook/addon-docs";
import { Meta, Canvas, Source } from "@storybook/addon-docs/blocks";
import * as stories from "./dialog.service.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./simple-dialog.stories";

View File

@@ -1,8 +1,8 @@
import { DialogRef, DIALOG_DATA } from "@angular/cdk/dialog";
import { Component, Inject } from "@angular/core";
import { Component, inject } from "@angular/core";
import { provideAnimations } from "@angular/platform-browser/animations";
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { getAllByRole, userEvent } from "@storybook/test";
import { getAllByRole, userEvent } from "storybook/test";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
@@ -30,7 +30,7 @@ interface Animal {
imports: [ButtonModule],
})
class StoryDialogComponent {
constructor(public dialogService: DialogService) {}
dialogService = inject(DialogService);
openSimpleDialog() {
this.dialogService.open(SimpleDialogContentComponent, {
@@ -84,10 +84,8 @@ class StoryDialogComponent {
imports: [ButtonModule, DialogModule],
})
class SimpleDialogContentComponent {
constructor(
public dialogRef: DialogRef,
@Inject(DIALOG_DATA) private data: Animal,
) {}
dialogRef = inject(DialogRef);
private data = inject<Animal>(DIALOG_DATA);
get animal() {
return this.data?.animal;
@@ -115,10 +113,8 @@ class SimpleDialogContentComponent {
imports: [ButtonModule, DialogModule],
})
class NonDismissableWithPrimaryButtonContentComponent {
constructor(
public dialogRef: DialogRef,
@Inject(DIALOG_DATA) private data: Animal,
) {}
dialogRef = inject(DialogRef);
private data = inject<Animal>(DIALOG_DATA);
get animal() {
return this.data?.animal;
@@ -141,10 +137,8 @@ class NonDismissableWithPrimaryButtonContentComponent {
imports: [ButtonModule, DialogModule],
})
class NonDismissableWithNoButtonsContentComponent {
constructor(
public dialogRef: DialogRef,
@Inject(DIALOG_DATA) private data: Animal,
) {}
dialogRef = inject(DialogRef);
private data = inject<Animal>(DIALOG_DATA);
get animal() {
return this.data?.animal;

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./disclosure.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./drawer.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./form-field.stories";

View File

@@ -6,8 +6,8 @@ import {
FormGroup,
} from "@angular/forms";
import { NgSelectModule } from "@ng-select/ng-select";
import { action } from "@storybook/addon-actions";
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { action } from "storybook/actions";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,6 +1,6 @@
import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { userEvent, getByText } from "@storybook/test";
import { userEvent, getByText } from "storybook/test";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Source } from "@storybook/addon-docs";
import { Meta, Canvas, Source } from "@storybook/addon-docs/blocks";
import * as formStories from "./form.stories";
import * as fieldStories from "../form-field/form-field.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./icon-button.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Controls } from "@storybook/addon-docs";
import { Meta, Story, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./icon.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./autofocus.stories";

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Component Library/Form/Input Directive" />

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./item.stories";

View File

@@ -1,6 +1,6 @@
import { RouterTestingModule } from "@angular/router/testing";
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { userEvent } from "@storybook/test";
import { userEvent } from "storybook/test";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Story, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./link.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./menu.stories";

View File

@@ -108,11 +108,11 @@ export class MultiSelectComponent implements OnInit, BitFormFieldControl, Contro
/** Needs to be arrow function to retain `this` scope. */
keyDown = (event: KeyboardEvent) => {
const select = this.select();
if (!select.isOpen && event.key === "Enter" && !hasModifierKey(event)) {
if (!select.isOpen() && event.key === "Enter" && !hasModifierKey(event)) {
return false;
}
if (select.isOpen && event.key === "Escape" && !hasModifierKey(event)) {
if (select.isOpen() && event.key === "Escape" && !hasModifierKey(event)) {
this.selectedItems = [];
select.close();
event.stopPropagation();
@@ -198,7 +198,9 @@ export class MultiSelectComponent implements OnInit, BitFormFieldControl, Contro
}
set ariaDescribedBy(value: string | undefined) {
this._ariaDescribedBy = value;
this.select()?.searchInput.nativeElement.setAttribute("aria-describedby", value ?? "");
this.select()
?.searchInput()
.nativeElement.setAttribute("aria-describedby", value ?? "");
}
private _ariaDescribedBy?: string;

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./popover.stories";

View File

@@ -1,5 +1,5 @@
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { getByRole, userEvent } from "@storybook/test";
import { getByRole, userEvent } from "storybook/test";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls, Title, Description } from "@storybook/addon-docs/blocks";
import * as stories from "./progress.stories";

View File

@@ -1,4 +1,12 @@
import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import {
Meta,
Canvas,
Source,
Primary,
Controls,
Title,
Description,
} from "@storybook/addon-docs/blocks";
import * as stories from "./search.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Primary, Controls, Canvas } from "@storybook/addon-docs";
import { Meta, Primary, Controls, Canvas } from "@storybook/addon-docs/blocks";
import * as stories from "./section.stories";

View File

@@ -158,7 +158,9 @@ export class SelectComponent<T> implements BitFormFieldControl, ControlValueAcce
}
set ariaDescribedBy(value: string | undefined) {
this._ariaDescribedBy = value;
this.select()?.searchInput.nativeElement.setAttribute("aria-describedby", value ?? "");
this.select()
?.searchInput()
.nativeElement.setAttribute("aria-describedby", value ?? "");
}
private _ariaDescribedBy?: string;
@@ -218,7 +220,7 @@ export class SelectComponent<T> implements BitFormFieldControl, ControlValueAcce
* Needs to be arrow function to retain `this` scope.
*/
protected onKeyDown = (event: KeyboardEvent) => {
if (this.select().isOpen && event.key === "Escape" && !hasModifierKey(event)) {
if (this.select().isOpen() && event.key === "Escape" && !hasModifierKey(event)) {
event.stopPropagation();
}

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Source, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./select.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Source } from "@storybook/addon-docs";
import { Meta, Canvas, Source } from "@storybook/addon-docs/blocks";
import * as skeletonStories from "./skeleton.stories";
import * as skeletonTextStories from "./skeleton-text.stories";

View File

@@ -1,4 +1,12 @@
import { Meta, Story, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import {
Meta,
Story,
Source,
Primary,
Controls,
Title,
Description,
} from "@storybook/addon-docs/blocks";
import * as stories from "./stepper.stories";

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Documentation/Colors" />

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Canvas } from "@storybook/addon-docs";
import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks";
import * as itemStories from "../item/item.stories";
import * as popupLayoutStories from "../../../../apps/browser/src/platform/popup/layout/popup-layout.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas } from "@storybook/addon-docs";
import { Meta, Canvas } from "@storybook/addon-docs/blocks";
import * as stories from "./icons.stories";

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Documentation/Introduction" />

View File

@@ -1,4 +1,4 @@
import { Meta, Story } from "@storybook/addon-docs";
import { Meta, Story } from "@storybook/addon-docs/blocks";
import * as stories from "./kitchen-sink.stories";

View File

@@ -9,7 +9,7 @@ import {
fireEvent,
getByText,
getAllByLabelText,
} from "@storybook/test";
} from "storybook/test";
import { PasswordManagerLogo } from "@bitwarden/assets/svg";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Documentation/Migration" />

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Documentation/Responsive Design" />

View File

@@ -1,4 +1,4 @@
import { Meta } from "@storybook/addon-docs";
import { Meta } from "@storybook/addon-docs/blocks";
<Meta title="Documentation/Virtual Scrolling" />

View File

@@ -1,4 +1,12 @@
import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import {
Meta,
Canvas,
Source,
Primary,
Controls,
Title,
Description,
} from "@storybook/addon-docs/blocks";
import * as stories from "./switch.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Source, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Story, Source, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./table.stories";

View File

@@ -1,4 +1,4 @@
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs";
import { Meta, Canvas, Primary, Controls } from "@storybook/addon-docs/blocks";
import * as stories from "./tabs.stories";
import * as dialogStories from "../dialog/dialog/dialog.stories";

View File

@@ -1,4 +1,12 @@
import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import {
Meta,
Canvas,
Source,
Primary,
Controls,
Title,
Description,
} from "@storybook/addon-docs/blocks";
import * as stories from "./toast.stories";

View File

@@ -1,8 +1,8 @@
import { CommonModule } from "@angular/common";
import { Component, Input } from "@angular/core";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
import { action } from "@storybook/addon-actions";
import { Meta, StoryObj, applicationConfig, moduleMetadata } from "@storybook/angular";
import { action } from "storybook/actions";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Primary, Controls, Canvas } from "@storybook/addon-docs";
import { Meta, Story, Primary, Controls, Canvas } from "@storybook/addon-docs/blocks";
import * as stories from "./toggle-group.stories";

View File

@@ -1,4 +1,12 @@
import { Meta, Canvas, Source, Primary, Controls, Title, Description } from "@storybook/addon-docs";
import {
Meta,
Canvas,
Source,
Primary,
Controls,
Title,
Description,
} from "@storybook/addon-docs/blocks";
import * as stories from "./tooltip.stories";

View File

@@ -1,6 +1,6 @@
import { signal } from "@angular/core";
import { Meta, StoryObj, moduleMetadata } from "@storybook/angular";
import { getByRole, userEvent } from "@storybook/test";
import { getByRole, userEvent } from "storybook/test";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";

View File

@@ -1,4 +1,4 @@
import { Meta, Story, Canvas } from "@storybook/addon-docs";
import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks";
import * as stories from "./typography.stories";