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