From 29e31273ed7db1420846bb3b89fb581e131daf21 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Mon, 1 Jul 2024 15:44:24 +0200 Subject: [PATCH] OZG-5981 OZG-6022 Add download button --- ...ertical-binary-file-list.component.spec.ts | 2 ++ .../libs/design-component/src/index.ts | 1 + .../download-button.component.spec.ts | 21 +++++++++++++++ .../download-button.component.ts | 26 +++++++++++++++++++ alfa-client/libs/design-system/src/index.ts | 1 + .../attachment-container.stories.ts | 6 +++-- .../src/lib/button/button.component.ts | 8 +++--- .../src/lib/button/button.stories.ts | 19 +++++++++++--- .../attachment-icon.component.ts | 2 +- .../bescheid-generate-icon.component.ts | 2 +- .../bescheid-upload-icon.component.ts | 2 +- .../icons/close-icon/close-icon.component.ts | 2 +- .../exclamation-icon.component.ts | 2 +- .../icons/{IconClasses.ts => iconVariants.ts} | 0 .../icons/save-icon/save-icon.component.ts | 2 +- .../icons/send-icon/send-icon.component.ts | 2 +- .../spinner-icon/spinner-icon.component.ts | 2 +- .../icons/stamp-icon/stamp-icon.component.ts | 2 +- 18 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 alfa-client/libs/design-component/src/lib/download-button/download-button.component.spec.ts create mode 100644 alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts rename alfa-client/libs/design-system/src/lib/icons/{IconClasses.ts => iconVariants.ts} (100%) diff --git a/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts b/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts index 3e09f912b4..0b5f5ce751 100644 --- a/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts +++ b/alfa-client/libs/binary-file/src/lib/vertical-binary-file-list/vertical-binary-file-list.component.spec.ts @@ -26,6 +26,7 @@ import { ToEmbeddedResourcesPipe, createStateResource } from '@alfa-client/tech- import { getMockComponent } from '@alfa-client/test-utils'; import { SpinnerComponent } from '@alfa-client/ui'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { AttachmentContainerComponent } from '@ods/system'; import { createBinaryFileListResource, createBinaryFileResource, @@ -45,6 +46,7 @@ describe('VerticalBinaryFileListComponent', () => { declarations: [ VerticalBinaryFileListComponent, ToEmbeddedResourcesPipe, + MockComponent(AttachmentContainerComponent), MockComponent(BinaryFile2ContainerComponent), MockComponent(SpinnerComponent), ], diff --git a/alfa-client/libs/design-component/src/index.ts b/alfa-client/libs/design-component/src/index.ts index 8670320bc6..d2253a1c2d 100644 --- a/alfa-client/libs/design-component/src/index.ts +++ b/alfa-client/libs/design-component/src/index.ts @@ -1,4 +1,5 @@ export * from './lib/button-with-spinner/button-with-spinner.component'; +export * from './lib/download-button/download-button.component'; export * from './lib/form/file-upload-editor/file-upload-editor.component'; export * from './lib/form/single-file-upload-editor/single-file-upload-editor.component'; export * from './lib/form/text-editor/text-editor.component'; diff --git a/alfa-client/libs/design-component/src/lib/download-button/download-button.component.spec.ts b/alfa-client/libs/design-component/src/lib/download-button/download-button.component.spec.ts new file mode 100644 index 0000000000..0d3a394fa7 --- /dev/null +++ b/alfa-client/libs/design-component/src/lib/download-button/download-button.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { DownloadButtonComponent } from './download-button.component'; + +describe('DownloadButtonComponent', () => { + let component: DownloadButtonComponent; + let fixture: ComponentFixture<DownloadButtonComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DownloadButtonComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(DownloadButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts b/alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts new file mode 100644 index 0000000000..8c700d497a --- /dev/null +++ b/alfa-client/libs/design-component/src/lib/download-button/download-button.component.ts @@ -0,0 +1,26 @@ +import { CommonModule } from '@angular/common'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ButtonComponent, SaveIconComponent, iconVariants } from '@ods/system'; +import { VariantProps } from 'class-variance-authority'; + +type IconVariants = VariantProps<typeof iconVariants>; + +@Component({ + selector: 'ods-download-button', + standalone: true, + imports: [CommonModule, ButtonComponent, SaveIconComponent], + template: `<ods-button + size="fit" + variant="onlyIcon" + [dataTestId]="dataTestId" + (click)="clickEmitter.emit()" + > + <ods-save-icon icon [size]="size" class="fill-text"></ods-save-icon> + </ods-button>`, +}) +export class DownloadButtonComponent { + @Input() dataTestId: string = ''; + @Input() size: IconVariants['size'] = 'small'; + + @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>(); +} diff --git a/alfa-client/libs/design-system/src/index.ts b/alfa-client/libs/design-system/src/index.ts index 9f7b60a883..662fc90c2e 100644 --- a/alfa-client/libs/design-system/src/index.ts +++ b/alfa-client/libs/design-system/src/index.ts @@ -15,6 +15,7 @@ export * from './lib/icons/bescheid-upload-icon/bescheid-upload-icon.component'; export * from './lib/icons/close-icon/close-icon.component'; export * from './lib/icons/exclamation-icon/exclamation-icon.component'; export * from './lib/icons/file-icon/file-icon.component'; +export * from './lib/icons/iconVariants'; export * from './lib/icons/save-icon/save-icon.component'; export * from './lib/icons/send-icon/send-icon.component'; export * from './lib/icons/spinner-icon/spinner-icon.component'; diff --git a/alfa-client/libs/design-system/src/lib/attachment-container/attachment-container.stories.ts b/alfa-client/libs/design-system/src/lib/attachment-container/attachment-container.stories.ts index 2f2aa85fe6..f1b9e39b08 100644 --- a/alfa-client/libs/design-system/src/lib/attachment-container/attachment-container.stories.ts +++ b/alfa-client/libs/design-system/src/lib/attachment-container/attachment-container.stories.ts @@ -1,5 +1,7 @@ import { argsToTemplate, moduleMetadata, type Meta, type StoryObj } from '@storybook/angular'; +import { DownloadButtonComponent } from '../../../../design-component/src/lib/download-button/download-button.component'; + import { AttachmentComponent } from '../attachment/attachment.component'; import { AttachmentContainerComponent } from './attachment-container.component'; @@ -15,7 +17,7 @@ const meta: Meta<AttachmentContainerComponent> = { }, decorators: [ moduleMetadata({ - imports: [AttachmentContainerComponent, AttachmentComponent], + imports: [AttachmentContainerComponent, AttachmentComponent, DownloadButtonComponent], }), ], excludeStories: /.*Data$/, @@ -37,7 +39,7 @@ export const Default: Story = { render: (args) => ({ props: args, template: `<ods-attachment-container ${argsToTemplate(args)}> - <p action-buttons>button</p> + <ods-download-button action-buttons /> <ods-attachment caption="Attachment" description="200 kB" fileType="pdf"></ods-attachment> <ods-attachment caption="Second attachment" description="432 kB" fileType="doc"></ods-attachment> </ods-attachment-container>`, diff --git a/alfa-client/libs/design-system/src/lib/button/button.component.ts b/alfa-client/libs/design-system/src/lib/button/button.component.ts index 19d22368fd..6b9e52eeff 100644 --- a/alfa-client/libs/design-system/src/lib/button/button.component.ts +++ b/alfa-client/libs/design-system/src/lib/button/button.component.ts @@ -5,16 +5,18 @@ import { VariantProps, cva } from 'class-variance-authority'; import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.component'; export const buttonVariants = cva( - 'flex cursor-pointer items-center gap-4 rounded-md font-medium disabled:cursor-wait text-sm min-w-32 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ozgblue-800', + 'flex cursor-pointer items-center gap-4 rounded-md font-medium disabled:cursor-wait text-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ozgblue-800', { variants: { variant: { primary: 'hover:enabled:bg-primary-hover bg-primary text-white shadow-sm', outline: 'border border-primary bg-background-50 text-primary hover:enabled:bg-background-100', + onlyIcon: '', }, size: { - medium: 'h-9 py-2 px-4', + medium: 'h-9 py-2 px-4 min-w-32', + fit: 'w-fit h-fit p-0', }, }, defaultVariants: { @@ -40,7 +42,7 @@ type ButtonVariants = VariantProps<typeof buttonVariants>; > <ng-content *ngIf="!isLoading" select="[icon]"></ng-content> <ods-spinner-icon *ngIf="isLoading" size="medium"></ods-spinner-icon> - <div class="flex-grow">{{ text }}</div> + <div *ngIf="text" class="flex-grow">{{ text }}</div> </button>`, }) export class ButtonComponent { diff --git a/alfa-client/libs/design-system/src/lib/button/button.stories.ts b/alfa-client/libs/design-system/src/lib/button/button.stories.ts index 5db5e2e20a..9ee8af807d 100644 --- a/alfa-client/libs/design-system/src/lib/button/button.stories.ts +++ b/alfa-client/libs/design-system/src/lib/button/button.stories.ts @@ -1,6 +1,6 @@ import { argsToTemplate, moduleMetadata, type Meta, type StoryObj } from '@storybook/angular'; -import { FileIconComponent } from '../icons/file-icon/file-icon.component'; +import { SaveIconComponent } from '../icons/save-icon/save-icon.component'; import { ButtonComponent } from './button.component'; const meta: Meta<ButtonComponent> = { @@ -8,7 +8,7 @@ const meta: Meta<ButtonComponent> = { component: ButtonComponent, decorators: [ moduleMetadata({ - imports: [ButtonComponent, FileIconComponent], + imports: [ButtonComponent, SaveIconComponent], }), ], excludeStories: /.*Data$/, @@ -41,7 +41,7 @@ export const WithIcon: Story = { render: (args) => ({ props: args, template: `<ods-button ${argsToTemplate(args)}> - <ods-file-icon icon fileType='pdf' size='small'></ods-file-icon> + <ods-save-icon icon size='small'></ods-save-icon> </ods-button>`, }), }; @@ -52,3 +52,16 @@ export const IsLoading: Story = { isLoading: true, }, }; + +export const OnlyIcon: Story = { + args: { + variant: 'onlyIcon', + size: 'fit', + }, + render: (args) => ({ + props: args, + template: `<ods-button ${argsToTemplate(args)}> + <ods-save-icon icon size='medium'></ods-save-icon> + </ods-button>`, + }), +}; diff --git a/alfa-client/libs/design-system/src/lib/icons/attachment-icon/attachment-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/attachment-icon/attachment-icon.component.ts index dea522781c..30a34056ce 100644 --- a/alfa-client/libs/design-system/src/lib/icons/attachment-icon/attachment-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/attachment-icon/attachment-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-attachment-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/bescheid-generate-icon/bescheid-generate-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/bescheid-generate-icon/bescheid-generate-icon.component.ts index 3a7f86c815..d9b829b226 100644 --- a/alfa-client/libs/design-system/src/lib/icons/bescheid-generate-icon/bescheid-generate-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/bescheid-generate-icon/bescheid-generate-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-bescheid-generate-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/bescheid-upload-icon/bescheid-upload-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/bescheid-upload-icon/bescheid-upload-icon.component.ts index 3947b891b5..cc265fdbb0 100644 --- a/alfa-client/libs/design-system/src/lib/icons/bescheid-upload-icon/bescheid-upload-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/bescheid-upload-icon/bescheid-upload-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-bescheid-upload-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/close-icon/close-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/close-icon/close-icon.component.ts index 81c6ce8e91..5de688d73e 100644 --- a/alfa-client/libs/design-system/src/lib/icons/close-icon/close-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/close-icon/close-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-close-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/exclamation-icon/exclamation-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/exclamation-icon/exclamation-icon.component.ts index 9dda95ea08..c425c77aaa 100644 --- a/alfa-client/libs/design-system/src/lib/icons/exclamation-icon/exclamation-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/exclamation-icon/exclamation-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-exclamation-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/IconClasses.ts b/alfa-client/libs/design-system/src/lib/icons/iconVariants.ts similarity index 100% rename from alfa-client/libs/design-system/src/lib/icons/IconClasses.ts rename to alfa-client/libs/design-system/src/lib/icons/iconVariants.ts diff --git a/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts index 405d1199cd..b2d22480f7 100644 --- a/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/save-icon/save-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-save-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts index 60205dd294..6a34bb7ebb 100644 --- a/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/send-icon/send-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-send-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/spinner-icon/spinner-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/spinner-icon/spinner-icon.component.ts index 05aaf8d9aa..321829613a 100644 --- a/alfa-client/libs/design-system/src/lib/icons/spinner-icon/spinner-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/spinner-icon/spinner-icon.component.ts @@ -1,7 +1,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-spinner-icon', diff --git a/alfa-client/libs/design-system/src/lib/icons/stamp-icon/stamp-icon.component.ts b/alfa-client/libs/design-system/src/lib/icons/stamp-icon/stamp-icon.component.ts index 7b71c7b5d4..26bb89c266 100644 --- a/alfa-client/libs/design-system/src/lib/icons/stamp-icon/stamp-icon.component.ts +++ b/alfa-client/libs/design-system/src/lib/icons/stamp-icon/stamp-icon.component.ts @@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; import { Component, Input } from '@angular/core'; import { twMerge } from 'tailwind-merge'; -import { IconVariants, iconVariants } from '../IconClasses'; +import { IconVariants, iconVariants } from '../iconVariants'; @Component({ selector: 'ods-stamp-icon', -- GitLab