Skip to content

Commit

Permalink
feat(button/config): module configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
matheusdavidson committed May 22, 2022
1 parent eb5eaef commit 479fca8
Show file tree
Hide file tree
Showing 4 changed files with 231 additions and 93 deletions.
83 changes: 83 additions & 0 deletions projects/ng-tw/src/modules/button/button-config.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
export interface TwButtonConfig {
global: string;
font: {
weight: string;
};
disabled: {
basic: {
class: string;
ignore: string;
};
raised: {
class: string;
ignore: string;
};
stroked: {
class: string;
ignore: string;
};
flat: {
class: string;
ignore: string;
};
};
layout: {
basic: {
basic: string;
primary: string;
secondary: string;
danger: string;
tailwind: string;
ignore: string;
};
raised: {
basic: string;
primary: string;
secondary: string;
danger: string;
tailwind: string;
global: string;
ignore: string;
};
stroked: {
basic: string;
primary: string;
secondary: string;
danger: string;
tailwind: string;
global: string;
ignore: string;
};
flat: {
basic: string;
primary: string;
secondary: string;
danger: string;
tailwind: string;
global: string;
ignore: string;
};
};
sizes: {
xs: {
class: string;
ignore: string;
};
sm: {
class: string;
ignore: string;
};
md: {
class: string;
ignore: string;
};
lg: {
class: string;
ignore: string;
};
xl: {
class: string;
ignore: string;
};
};
}
108 changes: 108 additions & 0 deletions projects/ng-tw/src/modules/button/button-config.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
import { isEmpty, merge } from 'lodash';
import { TwButtonConfig } from './button-config.interface';

/**
* This is not a real service, but it looks like it from the outside.
* It's just an InjectionTToken used to import the config object, provided from the outside
*/
export const TwButtonSetup = new InjectionToken<TwButtonConfig>('TwButtonConfig');

@Injectable({
providedIn: 'root',
})
export class TwButtonConfigService {
public config: TwButtonConfig = {
global: 'focus:outline-none border border-transparent rounded',
font: {
weight: 'font-medium',
},
disabled: {
basic: {
class: 'disabled:bg-transparent disabled:text-gray-200',
ignore: '',
},
raised: {
class: 'disabled:bg-gray-200 disabled:text-gray-300',
ignore: '',
},
stroked: {
class: 'disabled:border disabled:border-gray-200 disabled:text-gray-200',
ignore: 'hover:bg-gray-100 hover:bg-primary-50 hover:bg-secondary-100 hover:bg-danger-100',
},
flat: {
class: 'disabled:bg-gray-200 disabled:text-gray-300',
ignore: '',
},
},
layout: {
basic: {
basic: 'hover:bg-gray-100',
primary: 'hover:bg-primary-50 text-primary',
secondary: 'hover:bg-secondary-50 text-secondary',
danger: 'hover:bg-danger-50 text-danger',
tailwind: 'hover:bg-{color}-50 text-{color}-600',
ignore: '',
},
raised: {
basic: 'bg-white',
primary: 'text-white bg-primary',
secondary: 'text-white bg-secondary',
danger: 'text-white bg-danger',
tailwind: 'text-white bg-{color}-600',
global: 'shadow-sm hover:active:shadow-lg',
ignore: '',
},
stroked: {
basic: 'hover:bg-gray-100',
primary: 'text-primary hover:bg-primary-50',
secondary: 'text-secondary hover:bg-secondary-100',
danger: 'text-danger hover:bg-danger-100',
tailwind: 'text-{color}-600 hover:bg-{color}-200',
global: 'bg-transparent border border-gray-200',
ignore: '',
},
flat: {
basic: 'bg-white',
primary: 'text-white bg-primary focus:ring-primary-500',
secondary: 'text-white bg-secondary focus:ring-secondary-500',
danger: 'text-white bg-danger focus:ring-danger-500',
tailwind: 'text-white bg-{color}-600 focus:ring-{color}-600',
global: 'focus:ring-2 focus:ring-offset-2',
ignore: '',
},
},
sizes: {
xs: {
class: 'px-2.5 py-1.5 text-xs',
ignore: '',
},
sm: {
class: 'px-3 py-1.5 text-sm',
ignore: '',
},
md: {
class: 'px-4 py-2 text-sm',
ignore: '',
},
lg: {
class: 'px-4 py-2 text-base',
ignore: '',
},
xl: {
class: 'px-6 py-3 text-base',
ignore: '',
},
},
};

constructor(@Optional() @Inject(TwButtonSetup) public options: TwButtonConfig) {
//
// Validate
if (isEmpty(options)) return;

//
// Merge options
this.config = merge(this.config, options);
}
}
93 changes: 5 additions & 88 deletions projects/ng-tw/src/modules/button/button.component.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
import { difference } from 'lodash';
import { TwButtonConfig } from './button-config.interface';
import { TwButtonConfigService } from './button-config.service';

type ColorType = 'basic' | 'primary' | 'secondary' | 'danger';

Expand Down Expand Up @@ -68,91 +70,9 @@ export class ButtonComponent implements OnInit, OnChanges {
@Input() public size: 'xs' | 'sm' | 'md' | 'lg' | 'xl' = 'md';
@Input() public ignore: string = '';

private _config: any = {
global: 'focus:outline-none border border-transparent rounded',
font: {
weight: 'font-medium',
},
disabled: {
basic: {
class: 'disabled:bg-transparent disabled:text-gray-200',
ignore: '',
},
raised: {
class: 'disabled:bg-gray-200 disabled:text-gray-300',
ignore: '',
},
stroked: {
class: 'disabled:border disabled:border-gray-200 disabled:text-gray-200',
ignore: 'hover:bg-gray-100 hover:bg-primary-50 hover:bg-secondary-100 hover:bg-danger-100',
},
flat: {
class: 'disabled:bg-gray-200 disabled:text-gray-300',
ignore: '',
},
},
layout: {
basic: {
basic: 'hover:bg-gray-100',
primary: 'hover:bg-primary-50 text-primary',
secondary: 'hover:bg-secondary-50 text-secondary',
danger: 'hover:bg-danger-50 text-danger',
tailwind: 'hover:bg-{color}-50 text-{color}-600',
ignore: '',
},
raised: {
basic: 'bg-white',
primary: 'text-white bg-primary',
secondary: 'text-white bg-secondary',
danger: 'text-white bg-danger',
tailwind: 'text-white bg-{color}-600',
global: 'shadow-sm hover:active:shadow-lg',
ignore: '',
},
stroked: {
basic: 'hover:bg-gray-100',
primary: 'text-primary hover:bg-primary-50',
secondary: 'text-secondary hover:bg-secondary-100',
danger: 'text-danger hover:bg-danger-100',
tailwind: 'text-{color}-600 hover:bg-{color}-200',
global: 'bg-transparent border border-gray-200',
ignore: '',
},
flat: {
basic: 'bg-white',
primary: 'text-white bg-primary focus:ring-primary-500',
secondary: 'text-white bg-secondary focus:ring-secondary-500',
danger: 'text-white bg-danger focus:ring-danger-500',
tailwind: 'text-white bg-{color}-600 focus:ring-{color}-600',
global: 'focus:ring-2 focus:ring-offset-2',
ignore: '',
},
},
sizes: {
xs: {
class: 'px-2.5 py-1.5 text-xs',
ignore: '',
},
sm: {
class: 'px-3 py-1.5 text-sm',
ignore: '',
},
md: {
class: 'px-4 py-2 text-sm',
ignore: '',
},
lg: {
class: 'px-4 py-2 text-base',
ignore: '',
},
xl: {
class: 'px-6 py-3 text-base',
ignore: '',
},
},
};

constructor(private readonly elementRef: ElementRef) {
private _config: TwButtonConfig = this.buttonConfig.config;

constructor(private readonly elementRef: ElementRef, private readonly buttonConfig: TwButtonConfigService) {
//
// Get config according to inputs
const classes: string[] = this.setup();
Expand Down Expand Up @@ -230,10 +150,7 @@ export class ButtonComponent implements OnInit, OnChanges {
//
// Get layout classes according and split values
const layoutClasses: string[] = this._config.layout[this.layout][this.color].split(' ');
const layoutGlobalClasses: string[] = this._config.layout[this.layout]?.global?.split(' ');
const layoutIgnoreClasses: string[] = this._config.layout[this.layout].ignore.split(' ');
// add global classes
if (layoutGlobalClasses) layoutClasses.push(...layoutGlobalClasses);
// filter ignored classes and remove empty strings
const classes = difference(layoutClasses, layoutIgnoreClasses);

Expand Down
40 changes: 35 additions & 5 deletions projects/ng-tw/src/modules/button/button.module.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,40 @@
import { NgModule } from '@angular/core';
import { ModuleWithProviders, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent } from './button.component';
import { TwButtonConfigService, TwButtonSetup } from './button-config.service';
import { TwButtonConfig } from './button-config.interface';

@NgModule({
declarations: [ButtonComponent],
imports: [CommonModule],
exports: [ButtonComponent],
declarations: [ButtonComponent],
imports: [CommonModule],
exports: [ButtonComponent],
})
export class TwButtonModule {}
export class TwButtonModule {
static forRoot(options?: Partial<TwButtonConfig>): ModuleWithProviders<TwButtonModule> {
return {
ngModule: TwButtonModule,
providers: [
TwButtonConfigService,
{
provide: TwButtonSetup,
useValue: options,
},
],
};
}
}
@NgModule()
export class TwButtonConfigModule {
static forRoot(options?: Partial<TwButtonConfig>): ModuleWithProviders<TwButtonConfigModule> {
return {
ngModule: TwButtonModule,
providers: [
TwButtonConfigService,
{
provide: TwButtonSetup,
useValue: options,
},
],
};
}
}

0 comments on commit 479fca8

Please sign in to comment.