Skip to content

Commit

Permalink
fix(angular): apply validation classes properly
Browse files Browse the repository at this point in the history
* fix(angular): add validation classes to ion-item

* fix(inputs): focus handling

fixes #17171
fixes #16052
fixes #15572
fixes #16452
fixes #17063
  • Loading branch information
manucorporat authored Jan 19, 2019
1 parent 7832be3 commit 2b4d7b7
Show file tree
Hide file tree
Showing 14 changed files with 241 additions and 74 deletions.
47 changes: 32 additions & 15 deletions angular/src/directives/control-value-accessors/value-accessor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,26 +43,43 @@ export class ValueAccessor implements ControlValueAccessor {

export function setIonicClasses(element: ElementRef) {
requestAnimationFrame(() => {
const classList = (element.nativeElement as HTMLElement).classList;
const input = element.nativeElement as HTMLElement;
const classes = getClasses(input);
setClasses(input, classes);

classList.remove(
'ion-valid',
'ion-invalid',
'ion-touched',
'ion-untouched',
'ion-dirty',
'ion-pristine'
);

for (let i = 0; i < classList.length; i++) {
const item = classList.item(i);
if (item !== null && startsWith(item, 'ng-')) {
classList.add(`ion-${item.substr(3)}`);
}
const item = input.closest('ion-item');
if (item) {
setClasses(item, classes);
}
});
}

function getClasses(element: HTMLElement) {
const classList = element.classList;
const classes = [];
for (let i = 0; i < classList.length; i++) {
const item = classList.item(i);
if (item !== null && startsWith(item, 'ng-')) {
classes.push(`ion-${item.substr(3)}`);
}
}
return classes;
}

function setClasses(element: HTMLElement, classes: string[]) {
const classList = element.classList;

classList.remove(
'ion-valid',
'ion-invalid',
'ion-touched',
'ion-untouched',
'ion-dirty',
'ion-pristine'
);
classList.add(...classes);
}

function startsWith(input: string, search: string): boolean {
return input.substr(0, search.length) === search;
}
2 changes: 2 additions & 0 deletions angular/test/test-app/src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ import { NestedOutletPage2Component } from './nested-outlet-page2/nested-outlet-
import { ViewChildComponent } from './view-child/view-child.component';
import { ProvidersComponent } from './providers/providers.component';
import { SlidesComponent } from './slides/slides.component';
import { FormComponent } from './form/form.component';

const routes: Routes = [
{ path: '', component: HomePageComponent },
{ path: 'inputs', component: InputsComponent },
{ path: 'form', component: FormComponent },
{ path: 'modals', component: ModalComponent },
{ path: 'view-child', component: ViewChildComponent },
{ path: 'providers', component: ProvidersComponent },
Expand Down
6 changes: 5 additions & 1 deletion angular/test/test-app/src/app/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
Expand All @@ -25,6 +26,7 @@ import { NavComponent } from './nav/nav.component';
import { ViewChildComponent } from './view-child/view-child.component';
import { ProvidersComponent } from './providers/providers.component';
import { SlidesComponent } from './slides/slides.component';
import { FormComponent } from './form/form.component';

@NgModule({
declarations: [
Expand All @@ -48,12 +50,14 @@ import { SlidesComponent } from './slides/slides.component';
NavComponent,
ViewChildComponent,
ProvidersComponent,
SlidesComponent
SlidesComponent,
FormComponent
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
ReactiveFormsModule,
IonicModule.forRoot(),
],
entryComponents: [
Expand Down
76 changes: 76 additions & 0 deletions angular/test/test-app/src/app/form/form.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<ion-header>
<ion-toolbar>
<ion-title>
Forms test
</ion-title>
</ion-toolbar>
</ion-header>

<ion-content>
<form [formGroup]="profileForm">
<ion-list>

<ion-item>
<ion-label>DateTime</ion-label>
<ion-datetime formControlName="datetime" min="1994-03-14" max="2017-12-09" display-format="MM/DD/YYYY"></ion-datetime>
</ion-item>

<ion-item>
<ion-label>Select</ion-label>
<ion-select formControlName="select">
<ion-select-option value="">No Game Console</ion-select-option>
<ion-select-option value="nes">NES</ion-select-option>
<ion-select-option value="n64" selected>Nintendo64</ion-select-option>
<ion-select-option value="ps">PlayStation</ion-select-option>
<ion-select-option value="genesis">Sega Genesis</ion-select-option>
<ion-select-option value="saturn">Sega Saturn</ion-select-option>
<ion-select-option value="snes">SNES</ion-select-option>
</ion-select>
</ion-item>

<ion-item>
<ion-label>Toggle</ion-label>
<ion-toggle formControlName="toggle" slot="end"></ion-toggle>
</ion-item>

<ion-item>
<ion-label>Input (required)</ion-label>
<ion-input formControlName="input"></ion-input>
</ion-item>

<ion-item>
<ion-label>Input</ion-label>
<ion-input formControlName="input2"></ion-input>
</ion-item>

<ion-item>
<ion-label>Checkbox</ion-label>
<ion-checkbox formControlName="checkbox" slot="start"></ion-checkbox>
</ion-item>

<ion-item>
<ion-label>Range</ion-label>
<ion-range formControlName="range"></ion-range>
</ion-item>

</ion-list>
<p>
Form Status: <span id="status">{{ profileForm.status }}</span>
</p>
<p>
Form Status: <span id="data">{{ profileForm.value | json }}</span>
</p>
<ion-button type="submit" [disabled]="!profileForm.valid">Submit</ion-button>

</form>
<ion-list>
<ion-item>
<ion-label>Outside form</ion-label>
<ion-toggle [formControl]="outsideToggle"></ion-toggle>
<ion-note slot="end">{{outsideToggle.value}}</ion-note>
</ion-item>
</ion-list>
<p>
<ion-button (click)="setValues()" id="set-button">Set values</ion-button>
</p>
</ion-content>
37 changes: 37 additions & 0 deletions angular/test/test-app/src/app/form/form.component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms';

@Component({
selector: 'app-form',
templateUrl: './form.component.html',
})
export class FormComponent {

profileForm: FormGroup;
outsideToggle = new FormControl(true);

constructor(fb: FormBuilder) {
this.profileForm = fb.group({
datetime: ['2010-08-20', Validators.required],
select: [undefined, Validators.required],
toggle: [false],
input: ['', Validators.required],
input2: ['Default Value'],
checkbox: [false],
range: [20, Validators.min(10)],
}, {updateOn: 'blur'});
}

setValues() {
this.profileForm.patchValue({
datetime: '2010-08-20',
setValue: 'nes',
toggle: true,
input: 'Some value',
input2: 'Another values',
checkbox: true,
range: 50
});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
Inputs test
</ion-label>
</ion-item>
<ion-item routerLink="/form">
<ion-label>
Form test
</ion-label>
</ion-item>
<ion-item routerLink="/modals">
<ion-label>
Modals test
Expand Down
9 changes: 9 additions & 0 deletions core/src/components/checkbox/checkbox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { createColorClasses, hostContext } from '../../utils/theme';
export class Checkbox implements ComponentInterface {

private inputId = `ion-cb-${checkboxIds++}`;
private buttonEl?: HTMLElement;

@Element() el!: HTMLElement;

Expand Down Expand Up @@ -98,9 +99,16 @@ export class Checkbox implements ComponentInterface {

@Listen('click')
onClick() {
this.setFocus();
this.checked = !this.checked;
}

private setFocus() {
if (this.buttonEl) {
this.buttonEl.focus();
}
}

private onFocus = () => {
this.ionFocus.emit();
}
Expand Down Expand Up @@ -146,6 +154,7 @@ export class Checkbox implements ComponentInterface {
onFocus={this.onFocus}
onBlur={this.onBlur}
disabled={this.disabled}
ref={el => this.buttonEl = el}
>
</button>
];
Expand Down
1 change: 1 addition & 0 deletions core/src/components/datetime/datetime.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ export class Datetime implements ComponentInterface {

@Listen('click')
onClick() {
this.setFocus();
this.open();
}

Expand Down
4 changes: 2 additions & 2 deletions core/src/components/input/input.md.vars.scss
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
$input-md-font-size: inherit !default;

/// @prop - Margin top of the input
$input-md-padding-top: $item-md-padding-top !default;
$input-md-padding-top: 10px !default;

/// @prop - Margin end of the input
$input-md-padding-end: 0 !default;

/// @prop - Margin bottom of the input
$input-md-padding-bottom: $item-md-padding-bottom !default;
$input-md-padding-bottom: 10px !default;

/// @prop - Margin start of the input
$input-md-padding-start: ($item-md-padding-start / 2) !default;
Expand Down
12 changes: 8 additions & 4 deletions core/src/components/item/item.scss
Original file line number Diff line number Diff line change
Expand Up @@ -284,16 +284,21 @@ button, a {
// Item Input Focused
// --------------------------------------------------

:host(.item-interactive.item-has-focus) {
--highlight-background: var(--highlight-color-focused);

:host(.item-interactive.item-has-focus),
:host(.item-interactive.ion-touched.ion-invalid) {
// If the item has a full border and highlight is enabled, show the full item highlight
--full-highlight-height: #{calc(var(--highlight-height) * var(--show-full-highlight))};

// If the item has an inset border and highlight is enabled, show the inset item highlight
--inset-highlight-height: #{calc(var(--highlight-height) * var(--show-inset-highlight))};
}

// Item Input Focus
// --------------------------------------------------

:host(.item-interactive.item-has-focus) {
--highlight-background: var(--highlight-color-focused);
}

// Item Input Valid
// --------------------------------------------------
Expand All @@ -302,7 +307,6 @@ button, a {
--highlight-background: var(--highlight-color-valid);
}


// Item Input Invalid
// --------------------------------------------------

Expand Down
Loading

0 comments on commit 2b4d7b7

Please sign in to comment.