Skip to content
This repository was archived by the owner on Sep 16, 2022. It is now read-only.

Commit 2fa81e5

Browse files
alorenzenmatanlurey
authored andcommitted
feature(forms): Support disabled state in directives.
More work towards #1037 PiperOrigin-RevId: 193984475
1 parent c81566c commit 2fa81e5

18 files changed

+179
-10
lines changed

angular_forms/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## 2.0.0-alpha+3
22

3+
### New Features
4+
5+
* Add `ngDisabled` input to all Control directives.
6+
37
### Breaking Changes
48

59
* `NgControlGroup` can no longer be injected directly. It can still be

angular_forms/lib/src/directives/abstract_control_directive.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ abstract class AbstractControlDirective<T extends AbstractControl> {
1212

1313
bool get valid => control?.valid;
1414

15+
bool get disabled => control?.disabled;
16+
17+
bool get enabled => control?.enabled;
18+
1519
Map<String, dynamic> get errors => control?.errors;
1620

1721
bool get pristine => control?.pristine;
@@ -23,4 +27,9 @@ abstract class AbstractControlDirective<T extends AbstractControl> {
2327
bool get untouched => control?.untouched;
2428

2529
List<String> get path => null;
30+
31+
void toggleDisabled(bool isDisabled) {
32+
if (isDisabled && !control.disabled) control.markAsDisabled();
33+
if (!isDisabled && !control.enabled) control.markAsEnabled();
34+
}
2635
}

angular_forms/lib/src/directives/checkbox_value_accessor.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,7 @@ class CheckboxControlValueAccessor extends Object
4242
}
4343

4444
@override
45-
void onDisabledChanged(bool isDisabled) {}
45+
void onDisabledChanged(bool isDisabled) {
46+
_element.disabled = isDisabled;
47+
}
4648
}

angular_forms/lib/src/directives/default_value_accessor.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'dart:html';
22
import 'dart:js_util' as js_util;
33

44
import 'package:angular/angular.dart';
5+
import 'package:angular_forms/src/directives/shared.dart'
6+
show setElementDisabled;
57

68
import 'control_value_accessor.dart';
79

@@ -43,5 +45,7 @@ class DefaultValueAccessor extends Object
4345
}
4446

4547
@override
46-
void onDisabledChanged(bool isDisabled) {}
48+
void onDisabledChanged(bool isDisabled) {
49+
setElementDisabled(_element, isDisabled);
50+
}
4751
}

angular_forms/lib/src/directives/ng_control_group.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:async';
2+
13
import 'package:angular/angular.dart';
24

35
import '../model.dart' show ControlGroup;
@@ -62,6 +64,9 @@ class NgControlGroup extends ControlContainer implements OnInit, OnDestroy {
6264
final ValidatorFn validator;
6365
final ControlContainer _parent;
6466

67+
bool _isDisabled = false;
68+
bool _disabledChanged = false;
69+
6570
NgControlGroup(@SkipSelf() this._parent,
6671
@Optional() @Self() @Inject(NG_VALIDATORS) List validators)
6772
: validator = composeValidators(validators);
@@ -72,9 +77,26 @@ class NgControlGroup extends ControlContainer implements OnInit, OnDestroy {
7277
super.name = value;
7378
}
7479

80+
@Input('ngDisabled')
81+
set disabled(bool isDisabled) {
82+
_isDisabled = isDisabled;
83+
if (control != null) {
84+
_disabledChanged = false;
85+
toggleDisabled(isDisabled);
86+
} else {
87+
_disabledChanged = true;
88+
}
89+
}
90+
7591
@override
7692
void ngOnInit() {
7793
formDirective.addControlGroup(this);
94+
if (_disabledChanged) {
95+
scheduleMicrotask(() {
96+
_disabledChanged = false;
97+
toggleDisabled(_isDisabled);
98+
});
99+
}
78100
}
79101

80102
@override

angular_forms/lib/src/directives/ng_control_name.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ import 'shared.dart' show controlPath;
7474
class NgControlName extends NgControl implements AfterChanges, OnDestroy {
7575
final ControlContainer _parent;
7676
final _update = new StreamController.broadcast();
77+
7778
bool _modelChanged = false;
7879
dynamic _model;
7980
@Input('ngModel')
@@ -86,6 +87,9 @@ class NgControlName extends NgControl implements AfterChanges, OnDestroy {
8687
dynamic viewModel;
8788
var _added = false;
8889

90+
bool _isDisabled = false;
91+
bool _disabledChanged = false;
92+
8993
NgControlName(
9094
@SkipSelf()
9195
this._parent,
@@ -105,6 +109,12 @@ class NgControlName extends NgControl implements AfterChanges, OnDestroy {
105109
super.name = value;
106110
}
107111

112+
@Input('ngDisabled')
113+
set disabled(bool isDisabled) {
114+
_isDisabled = isDisabled;
115+
_disabledChanged = true;
116+
}
117+
108118
@Output('ngModelChange')
109119
Stream get update => _update.stream;
110120

@@ -121,6 +131,12 @@ class NgControlName extends NgControl implements AfterChanges, OnDestroy {
121131
formDirective.updateModel(this, _model);
122132
}
123133
}
134+
if (_disabledChanged) {
135+
scheduleMicrotask(() {
136+
_disabledChanged = false;
137+
toggleDisabled(_isDisabled);
138+
});
139+
}
124140
}
125141

126142
@override

angular_forms/lib/src/directives/ng_form.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ class NgForm extends AbstractForm {
8181
form = new ControlGroup({}, composeValidators(validators));
8282
}
8383

84+
@Input('ngDisabled')
85+
set disabled(bool isDisabled) {
86+
toggleDisabled(isDisabled);
87+
}
88+
8489
Map<String, AbstractControl> get controls => form.controls;
8590

8691
@override

angular_forms/lib/src/directives/ng_model.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ class NgModel extends NgControl
9191
_init(valueAccessors);
9292
}
9393

94+
@Input('ngDisabled')
95+
set disabled(bool isDisabled) {
96+
setState(() {
97+
toggleDisabled(isDisabled);
98+
});
99+
}
100+
94101
// This function prevents constructor inlining for smaller code size since
95102
// NgModel is constructed for majority of form components.
96103
void _init(List<ControlValueAccessor> valueAccessors) {

angular_forms/lib/src/directives/number_value_accessor.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,7 @@ class NumberValueAccessor extends Object
4141
}
4242

4343
@override
44-
void onDisabledChanged(bool isDisabled) {}
44+
void onDisabledChanged(bool isDisabled) {
45+
_element.disabled = isDisabled;
46+
}
4547
}

angular_forms/lib/src/directives/radio_control_value_accessor.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'dart:html';
22
import 'dart:js_util' as js_util;
33

44
import 'package:angular/angular.dart';
5+
import 'package:angular_forms/src/directives/shared.dart'
6+
show setElementDisabled;
57

68
import 'control_value_accessor.dart'
79
show ChangeHandler, ControlValueAccessor, NG_VALUE_ACCESSOR, TouchHandler;
@@ -116,5 +118,7 @@ class RadioControlValueAccessor extends Object
116118
}
117119

118120
@override
119-
void onDisabledChanged(bool isDisabled) {}
121+
void onDisabledChanged(bool isDisabled) {
122+
setElementDisabled(_element, isDisabled);
123+
}
120124
}

0 commit comments

Comments
 (0)