Skip to content
Snippets Groups Projects
Commit 29e31273 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-5981 OZG-6022 Add download button

parent 4a8de064
No related branches found
No related tags found
No related merge requests found
Showing
with 85 additions and 17 deletions
...@@ -26,6 +26,7 @@ import { ToEmbeddedResourcesPipe, createStateResource } from '@alfa-client/tech- ...@@ -26,6 +26,7 @@ import { ToEmbeddedResourcesPipe, createStateResource } from '@alfa-client/tech-
import { getMockComponent } from '@alfa-client/test-utils'; import { getMockComponent } from '@alfa-client/test-utils';
import { SpinnerComponent } from '@alfa-client/ui'; import { SpinnerComponent } from '@alfa-client/ui';
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AttachmentContainerComponent } from '@ods/system';
import { import {
createBinaryFileListResource, createBinaryFileListResource,
createBinaryFileResource, createBinaryFileResource,
...@@ -45,6 +46,7 @@ describe('VerticalBinaryFileListComponent', () => { ...@@ -45,6 +46,7 @@ describe('VerticalBinaryFileListComponent', () => {
declarations: [ declarations: [
VerticalBinaryFileListComponent, VerticalBinaryFileListComponent,
ToEmbeddedResourcesPipe, ToEmbeddedResourcesPipe,
MockComponent(AttachmentContainerComponent),
MockComponent(BinaryFile2ContainerComponent), MockComponent(BinaryFile2ContainerComponent),
MockComponent(SpinnerComponent), MockComponent(SpinnerComponent),
], ],
......
export * from './lib/button-with-spinner/button-with-spinner.component'; 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/file-upload-editor/file-upload-editor.component';
export * from './lib/form/single-file-upload-editor/single-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'; export * from './lib/form/text-editor/text-editor.component';
......
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();
});
});
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>();
}
...@@ -15,6 +15,7 @@ export * from './lib/icons/bescheid-upload-icon/bescheid-upload-icon.component'; ...@@ -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/close-icon/close-icon.component';
export * from './lib/icons/exclamation-icon/exclamation-icon.component'; export * from './lib/icons/exclamation-icon/exclamation-icon.component';
export * from './lib/icons/file-icon/file-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/save-icon/save-icon.component';
export * from './lib/icons/send-icon/send-icon.component'; export * from './lib/icons/send-icon/send-icon.component';
export * from './lib/icons/spinner-icon/spinner-icon.component'; export * from './lib/icons/spinner-icon/spinner-icon.component';
......
import { argsToTemplate, moduleMetadata, type Meta, type StoryObj } from '@storybook/angular'; 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 { AttachmentComponent } from '../attachment/attachment.component';
import { AttachmentContainerComponent } from './attachment-container.component'; import { AttachmentContainerComponent } from './attachment-container.component';
...@@ -15,7 +17,7 @@ const meta: Meta<AttachmentContainerComponent> = { ...@@ -15,7 +17,7 @@ const meta: Meta<AttachmentContainerComponent> = {
}, },
decorators: [ decorators: [
moduleMetadata({ moduleMetadata({
imports: [AttachmentContainerComponent, AttachmentComponent], imports: [AttachmentContainerComponent, AttachmentComponent, DownloadButtonComponent],
}), }),
], ],
excludeStories: /.*Data$/, excludeStories: /.*Data$/,
...@@ -37,7 +39,7 @@ export const Default: Story = { ...@@ -37,7 +39,7 @@ export const Default: Story = {
render: (args) => ({ render: (args) => ({
props: args, props: args,
template: `<ods-attachment-container ${argsToTemplate(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="Attachment" description="200 kB" fileType="pdf"></ods-attachment>
<ods-attachment caption="Second attachment" description="432 kB" fileType="doc"></ods-attachment> <ods-attachment caption="Second attachment" description="432 kB" fileType="doc"></ods-attachment>
</ods-attachment-container>`, </ods-attachment-container>`,
......
...@@ -5,16 +5,18 @@ import { VariantProps, cva } from 'class-variance-authority'; ...@@ -5,16 +5,18 @@ import { VariantProps, cva } from 'class-variance-authority';
import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.component'; import { SpinnerIconComponent } from '../icons/spinner-icon/spinner-icon.component';
export const buttonVariants = cva( 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: { variants: {
variant: { variant: {
primary: 'hover:enabled:bg-primary-hover bg-primary text-white shadow-sm', primary: 'hover:enabled:bg-primary-hover bg-primary text-white shadow-sm',
outline: outline:
'border border-primary bg-background-50 text-primary hover:enabled:bg-background-100', 'border border-primary bg-background-50 text-primary hover:enabled:bg-background-100',
onlyIcon: '',
}, },
size: { 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: { defaultVariants: {
...@@ -40,7 +42,7 @@ type ButtonVariants = VariantProps<typeof buttonVariants>; ...@@ -40,7 +42,7 @@ type ButtonVariants = VariantProps<typeof buttonVariants>;
> >
<ng-content *ngIf="!isLoading" select="[icon]"></ng-content> <ng-content *ngIf="!isLoading" select="[icon]"></ng-content>
<ods-spinner-icon *ngIf="isLoading" size="medium"></ods-spinner-icon> <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>`, </button>`,
}) })
export class ButtonComponent { export class ButtonComponent {
......
import { argsToTemplate, moduleMetadata, type Meta, type StoryObj } from '@storybook/angular'; 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'; import { ButtonComponent } from './button.component';
const meta: Meta<ButtonComponent> = { const meta: Meta<ButtonComponent> = {
...@@ -8,7 +8,7 @@ const meta: Meta<ButtonComponent> = { ...@@ -8,7 +8,7 @@ const meta: Meta<ButtonComponent> = {
component: ButtonComponent, component: ButtonComponent,
decorators: [ decorators: [
moduleMetadata({ moduleMetadata({
imports: [ButtonComponent, FileIconComponent], imports: [ButtonComponent, SaveIconComponent],
}), }),
], ],
excludeStories: /.*Data$/, excludeStories: /.*Data$/,
...@@ -41,7 +41,7 @@ export const WithIcon: Story = { ...@@ -41,7 +41,7 @@ export const WithIcon: Story = {
render: (args) => ({ render: (args) => ({
props: args, props: args,
template: `<ods-button ${argsToTemplate(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>`, </ods-button>`,
}), }),
}; };
...@@ -52,3 +52,16 @@ export const IsLoading: Story = { ...@@ -52,3 +52,16 @@ export const IsLoading: Story = {
isLoading: true, 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>`,
}),
};
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-attachment-icon', selector: 'ods-attachment-icon',
......
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-bescheid-generate-icon', selector: 'ods-bescheid-generate-icon',
......
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-bescheid-upload-icon', selector: 'ods-bescheid-upload-icon',
......
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-close-icon', selector: 'ods-close-icon',
......
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-exclamation-icon', selector: 'ods-exclamation-icon',
......
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-save-icon', selector: 'ods-save-icon',
......
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-send-icon', selector: 'ods-send-icon',
......
import { NgClass } from '@angular/common'; import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-spinner-icon', selector: 'ods-spinner-icon',
......
...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common'; ...@@ -2,7 +2,7 @@ import { NgClass } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
import { IconVariants, iconVariants } from '../IconClasses'; import { IconVariants, iconVariants } from '../iconVariants';
@Component({ @Component({
selector: 'ods-stamp-icon', selector: 'ods-stamp-icon',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment