Skip to content

Commit 5bc3e14

Browse files
sashaqredyggg
authored andcommitted
fix(autocomplete): update input element disabled state (#2555)
(cherry picked from commit 23e59ba)
1 parent 676b7b0 commit 5bc3e14

File tree

8 files changed

+102
-1
lines changed

8 files changed

+102
-1
lines changed

src/app/playground-components.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ export const PLAYGROUND_COMPONENTS: ComponentLink[] = [
151151
component: 'AutocompleteActiveFirstComponent',
152152
name: 'Autocomplete Active First',
153153
},
154+
{
155+
path: 'autocomplete-disabled.component',
156+
link: '/autocomplete/autocomplete-disabled.component',
157+
component: 'AutocompleteDisabledComponent',
158+
name: 'Autocomplete Disabled',
159+
},
154160
],
155161
},
156162
{

src/framework/theme/components/autocomplete/autocomplete.component.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,4 +314,14 @@ describe('Component: NbAutocompleteComponent', () => {
314314
expect(autocompleteDirective.isClosed).toBe(true);
315315
});
316316

317+
it('should update disabled state', () => {
318+
autocompleteDirective.setDisabledState(true);
319+
fixture.detectChanges();
320+
expect(input.disabled).toBe(true);
321+
322+
autocompleteDirective.setDisabledState(false);
323+
fixture.detectChanges();
324+
expect(input.disabled).toBe(false);
325+
});
326+
317327
});

src/framework/theme/components/autocomplete/autocomplete.directive.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import {
1515
HostListener,
1616
Input,
1717
OnDestroy,
18+
Optional,
1819
QueryList,
20+
Renderer2,
1921
} from '@angular/core';
2022
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
2123
import { NbOverlayRef, NbScrollStrategy } from '../cdk/overlay/mapping';
@@ -189,6 +191,8 @@ export class NbAutocompleteDirective<T> implements OnDestroy, AfterViewInit, Con
189191
protected triggerStrategyBuilder: NbTriggerStrategyBuilderService,
190192
protected positionBuilder: NbPositionBuilderService,
191193
protected activeDescendantKeyManagerFactory: NbActiveDescendantKeyManagerFactoryService<NbOptionComponent<T>>,
194+
// @breaking-change @7.0.0 Make renderer required.
195+
@Optional() protected renderer?: Renderer2,
192196
) {}
193197

194198
ngAfterViewInit() {
@@ -260,6 +264,15 @@ export class NbAutocompleteDirective<T> implements OnDestroy, AfterViewInit, Con
260264
this._onTouched = fn;
261265
}
262266

267+
setDisabledState(disabled: boolean): void {
268+
// @breaking-change @7.0.0 Keep only `this.renderer.setProperty` without `if/else`.
269+
if (this.renderer) {
270+
this.renderer.setProperty(this.hostRef.nativeElement, 'disabled', disabled);
271+
} else if (this.hostRef.nativeElement) {
272+
this.hostRef.nativeElement.disabled = disabled;
273+
}
274+
}
275+
263276
protected subscribeOnOptionClick() {
264277
/**
265278
* If the user changes provided options list in the runtime we have to handle this
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<nb-card size="small">
2+
<nb-card-body class="example-items-col">
3+
4+
<button (click)="toggleDisabled()" nbButton>Toggle disabled</button>
5+
6+
<label>
7+
<span class="label">Disabled via <i>disabled</i> attribute</span>
8+
<input [nbAutocomplete]="auto"
9+
[disabled]="disabled"
10+
nbInput
11+
type="text"
12+
placeholder="Plain input" />
13+
</label>
14+
15+
<label>
16+
<span class="label">Disabled via <i>formControl</i></span>
17+
<input [nbAutocomplete]="auto"
18+
[formControl]="inputFormControl"
19+
nbInput
20+
type="text"
21+
placeholder="Form control" />
22+
</label>
23+
24+
<nb-autocomplete #auto>
25+
<nb-option *ngFor="let option of options" [value]="option">
26+
{{ option }}
27+
</nb-option>
28+
</nb-autocomplete>
29+
30+
</nb-card-body>
31+
</nb-card>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.label {
2+
display: block;
3+
margin-bottom: 0.5rem;
4+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* @license
3+
* Copyright Akveo. All Rights Reserved.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*/
6+
7+
import { ChangeDetectionStrategy, Component } from '@angular/core';
8+
import { FormControl } from '@angular/forms';
9+
10+
@Component({
11+
templateUrl: './autocomplete-disabled.component.html',
12+
styleUrls: ['./autocomplete-disabled.component.scss'],
13+
changeDetection: ChangeDetectionStrategy.OnPush,
14+
})
15+
export class AutocompleteDisabledComponent {
16+
options = ['Option 1', 'Option 2', 'Option 3'];
17+
disabled = true;
18+
inputFormControl = new FormControl();
19+
20+
toggleDisabled() {
21+
this.disabled = !this.disabled;
22+
if (this.disabled) {
23+
this.inputFormControl.disable();
24+
} else {
25+
this.inputFormControl.enable();
26+
}
27+
}
28+
}

src/playground/with-layout/autocomplete/autocomplete-routing.module.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { AutocompleteFormComponent } from './autocomplete-form.component';
1111
import { AutocompleteGroupComponent } from './autocomplete-group.component';
1212
import { AutocompleteCustomDisplayComponent } from './autocomplete-custom-display.component';
1313
import { AutocompleteActiveFirstComponent } from './autocomplete-active-first.component';
14+
import { AutocompleteDisabledComponent } from './autocomplete-disabled.component';
1415

1516
const routes: Route[] = [
1617
{
@@ -33,6 +34,10 @@ const routes: Route[] = [
3334
path: 'autocomplete-active-first.component',
3435
component: AutocompleteActiveFirstComponent,
3536
},
37+
{
38+
path: 'autocomplete-disabled.component',
39+
component: AutocompleteDisabledComponent,
40+
},
3641
];
3742

3843
@NgModule({

src/playground/with-layout/autocomplete/autocomplete.module.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
*/
66

77
import { NgModule } from '@angular/core';
8-
import { NbAutocompleteModule, NbCardModule, NbInputModule } from '@nebular/theme';
8+
import { NbAutocompleteModule, NbButtonModule, NbCardModule, NbInputModule } from '@nebular/theme';
99
import { AutocompleteShowcaseComponent } from './autocomplete-showcase.component';
1010
import { AutocompleteRoutingModule } from './autocomplete-routing.module';
1111
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
1212
import { AutocompleteFormComponent } from './autocomplete-form.component';
1313
import { AutocompleteGroupComponent } from './autocomplete-group.component';
1414
import { AutocompleteCustomDisplayComponent } from './autocomplete-custom-display.component';
1515
import { AutocompleteActiveFirstComponent } from './autocomplete-active-first.component';
16+
import { AutocompleteDisabledComponent } from './autocomplete-disabled.component';
1617
import { CommonModule } from '@angular/common';
1718

1819
@NgModule({
@@ -22,13 +23,15 @@ import { CommonModule } from '@angular/common';
2223
AutocompleteGroupComponent,
2324
AutocompleteCustomDisplayComponent,
2425
AutocompleteActiveFirstComponent,
26+
AutocompleteDisabledComponent,
2527
],
2628
exports: [
2729
AutocompleteShowcaseComponent,
2830
AutocompleteFormComponent,
2931
AutocompleteGroupComponent,
3032
AutocompleteCustomDisplayComponent,
3133
AutocompleteActiveFirstComponent,
34+
AutocompleteDisabledComponent,
3235
],
3336
imports: [
3437
CommonModule,
@@ -38,6 +41,7 @@ import { CommonModule } from '@angular/common';
3841
NbInputModule,
3942
AutocompleteRoutingModule,
4043
NbCardModule,
44+
NbButtonModule,
4145
],
4246
})
4347
export class AutocompleteModule {}

0 commit comments

Comments
 (0)