From 96b9b5f7fd471c5ce3d1b3152652d426fde2b5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20PAILHAREY?= <rpailharey@grandlyon.com> Date: Tue, 14 Nov 2023 16:00:57 +0000 Subject: [PATCH] chore(ui): mobile button --- src/app/shared/components/index.ts | 2 + .../v3/button/button.component.scss | 6 +++ .../components/v3/button/button.component.ts | 2 +- .../button/icon-button/IconButton.stories.ts | 53 +++++++++++++++++++ .../icon-button/icon-button.component.html | 3 ++ .../icon-button/icon-button.component.ts | 31 +++++++++++ 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/app/shared/components/v3/button/icon-button/IconButton.stories.ts create mode 100644 src/app/shared/components/v3/button/icon-button/icon-button.component.html create mode 100644 src/app/shared/components/v3/button/icon-button/icon-button.component.ts diff --git a/src/app/shared/components/index.ts b/src/app/shared/components/index.ts index 04859a36d..fc1c59438 100644 --- a/src/app/shared/components/index.ts +++ b/src/app/shared/components/index.ts @@ -21,6 +21,7 @@ import { SvgIconComponent } from './svg-icon/svg-icon.component'; import { TextInputModalComponent } from './text-input-modal/text-input-modal.component'; import { TrainingTypePickerComponent } from './training-type-picker/training-type-picker.component'; import { ButtonV3Component } from './v3/button/button.component'; +import { IconButtonV3Component } from './v3/button/icon-button/icon-button.component'; import { CheckboxV3Component } from './v3/checkbox/checkbox.component'; import { InputV3Component } from './v3/input/input.component'; import { LabelCheckboxV3Component } from './v3/label-checkbox/label-checkbox.component'; @@ -67,6 +68,7 @@ export const SharedComponents = [ CheckboxV3Component, CustomModalComponent, HourPickerComponent, + IconButtonV3Component, InformationStepComponent, InputV3Component, LabelCheckboxV3Component, diff --git a/src/app/shared/components/v3/button/button.component.scss b/src/app/shared/components/v3/button/button.component.scss index 12a8f80d3..0e3721e3e 100644 --- a/src/app/shared/components/v3/button/button.component.scss +++ b/src/app/shared/components/v3/button/button.component.scss @@ -40,6 +40,12 @@ button { } // VARIANT + &.icon-only { + height: 32px; + width: 32px; + padding-inline: 12px; + } + &.primary { background-color: $red; color: $white; diff --git a/src/app/shared/components/v3/button/button.component.ts b/src/app/shared/components/v3/button/button.component.ts index 8aa6f10d8..643e2ecd7 100644 --- a/src/app/shared/components/v3/button/button.component.ts +++ b/src/app/shared/components/v3/button/button.component.ts @@ -32,7 +32,7 @@ export class ButtonV3Component { @Input() iconFolder: string = 'ico'; /** Icon name */ - @Input() iconName: string; + @Input() iconName?: string; /** Click handler */ @Output() action = new EventEmitter<Event>(); diff --git a/src/app/shared/components/v3/button/icon-button/IconButton.stories.ts b/src/app/shared/components/v3/button/icon-button/IconButton.stories.ts new file mode 100644 index 000000000..e84392a86 --- /dev/null +++ b/src/app/shared/components/v3/button/icon-button/IconButton.stories.ts @@ -0,0 +1,53 @@ +import { CommonModule } from '@angular/common'; +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { SvgIconComponent } from '../../../svg-icon/svg-icon.component'; +import { ButtonTypeV3 } from '../button.type'; +import { IconButtonV3Component } from './icon-button.component'; + +// More on how to set up stories at: https://storybook.js.org/docs/angular/writing-stories/introduction +const meta: Meta<IconButtonV3Component> = { + title: 'Components/IconButton', + component: IconButtonV3Component, + tags: ['autodocs'], + decorators: [ + moduleMetadata({ + declarations: [SvgIconComponent], + imports: [CommonModule], + }), + ], + argTypes: {}, +}; + +export default meta; +type Story = StoryObj<IconButtonV3Component>; + +export const Primary: Story = { + args: { + variant: ButtonTypeV3.PrimaryBlack, + disabled: false, + iconFolder: 'form', + iconName: 'chevronRight', + }, +}; + +export const Secondary: Story = { + args: { + ...Primary.args, + variant: ButtonTypeV3.Secondary, + }, +}; + +export const Tertiary: Story = { + args: { + ...Primary.args, + variant: ButtonTypeV3.Tertiary, + }, +}; + +export const PrimaryDisabled: Story = { + args: { + ...Primary.args, + disabled: true, + }, +}; diff --git a/src/app/shared/components/v3/button/icon-button/icon-button.component.html b/src/app/shared/components/v3/button/icon-button/icon-button.component.html new file mode 100644 index 000000000..eeed31fa7 --- /dev/null +++ b/src/app/shared/components/v3/button/icon-button/icon-button.component.html @@ -0,0 +1,3 @@ +<button [type]="type" [ngClass]="classes" [disabled]="disabled" (click)="action.emit($event)"> + <app-svg-icon [type]="iconFolder" [icon]="iconName" [iconColor]="'currentColor'" [iconClass]="'icon-20'" /> +</button> diff --git a/src/app/shared/components/v3/button/icon-button/icon-button.component.ts b/src/app/shared/components/v3/button/icon-button/icon-button.component.ts new file mode 100644 index 000000000..36db43ed0 --- /dev/null +++ b/src/app/shared/components/v3/button/icon-button/icon-button.component.ts @@ -0,0 +1,31 @@ +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { ButtonTypeV3 } from '../button.type'; + +@Component({ + selector: 'app-v3-icon-button', + templateUrl: './icon-button.component.html', + styleUrls: ['../button.component.scss'], +}) +export class IconButtonV3Component { + /** HTML type of the button */ + @Input() type: 'submit' | 'button' | 'reset' = 'button'; + + /** What variant should the button be ? */ + @Input() variant?: ButtonTypeV3 = ButtonTypeV3.Primary; + + /** Should the button be disabled ? */ + @Input() disabled?: boolean = false; + + /** Folder of the icon ex: assets/ico */ + @Input() iconFolder: string = 'ico'; + + /** Icon name */ + @Input() iconName: string; + + /** Click handler */ + @Output() action = new EventEmitter<Event>(); + + public get classes(): string[] { + return ['icon-only', this.variant]; + } +} -- GitLab