Skip to content

Commit

Permalink
feat: Change FormBuilder to avoid changing fields keys (#11)
Browse files Browse the repository at this point in the history
* Change FormBuilder to avoid changing field keys

Changed FormBuilder to set form field keys exactly as form field names without recase them.

* Fix unit tests

* Comment allGuardParameters because is unused
  • Loading branch information
ferrarafer committed Jun 7, 2023
1 parent 5b34ec0 commit f3a54fb
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 99 deletions.
45 changes: 26 additions & 19 deletions lib/src/generators/forms/form_builder.dart
Expand Up @@ -58,7 +58,8 @@ class FormBuilder with StringBufferUtils {
for (var field in fields) {
final caseName = ReCase(field.name);
writeLine(
"const String ${_getFormKeyName(caseName)} = '${caseName.camelCase}';");
"const String ${_getFormKeyName(caseName)} = '${field.name}';",
);
}
newLine();

Expand Down Expand Up @@ -129,7 +130,8 @@ class FormBuilder with StringBufferUtils {
? ",initialValue: '${field.initialValue!}'"
: '';
writeLine(
'TextEditingController get ${_getControllerName(field)} => _getFormTextEditingController(${_getFormKeyName(caseName)}$initialValue);');
'TextEditingController get ${_getControllerName(field)} => _getFormTextEditingController(${_getFormKeyName(caseName)}$initialValue);',
);
}
return this;
}
Expand All @@ -139,7 +141,8 @@ class FormBuilder with StringBufferUtils {
for (final field in fields.onlyTextFieldConfigs) {
final caseName = ReCase(field.name);
writeLine(
'FocusNode get ${_getFocusNodeName(field)} => _getFormFocusNode(${_getFormKeyName(caseName)});');
'FocusNode get ${_getFocusNodeName(field)} => _getFormFocusNode(${_getFormKeyName(caseName)});',
);
}
return this;
}
Expand Down Expand Up @@ -282,18 +285,19 @@ class FormBuilder with StringBufferUtils {

FormBuilder addValidationDataUpdateFunctionTorTextControllers() {
if (fields.onlyTextFieldConfigs.isEmpty) return this;
writeLine('''
writeLine(
'''
/// Updates the fieldsValidationMessages on the FormViewModel
void updateValidationData(FormViewModel model) => model.setValidationMessages({
''');
void updateValidationData(FormViewModel model) => model.setValidationMessages({''',
);

for (final field in fields.onlyTextFieldConfigs) {
final caseName = ReCase(field.name);
writeLine('''
${_getFormKeyName(caseName)}: getValidationMessage(${_getFormKeyName(caseName)}),
''');
writeLine(
''' ${_getFormKeyName(caseName)}: getValidationMessage(${_getFormKeyName(caseName)}),''',
);
}
writeLine('''});''');
writeLine(''' });''');
return this;
}

Expand Down Expand Up @@ -472,24 +476,25 @@ class FormBuilder with StringBufferUtils {
}

final caseName = ReCase(field.name);
writeLine("${caseName.camelCase}Value = ''; ");
writeLine("${caseName.camelCase}Value = '';");
}
writeLine('}');

// Write out the validateForm method
if (fields.onlyTextFieldConfigs.isNotEmpty) {
newLine();
writeLine('''
writeLine(
'''
/// Validates text input fields on the Form
void validateForm() {
this.setValidationMessages({
''');
this.setValidationMessages({''',
);

for (final field in fields.onlyTextFieldConfigs) {
final caseName = ReCase(field.name);
writeLine('''
${_getFormKeyName(caseName)}: getValidationMessage(${_getFormKeyName(caseName)}),
''');
writeLine(
'''${_getFormKeyName(caseName)}: getValidationMessage(${_getFormKeyName(caseName)}),''',
);
}
writeLine('''});''');
writeLine('}');
Expand Down Expand Up @@ -522,7 +527,9 @@ class FormBuilder with StringBufferUtils {
: 'DateTime';
}

String _getFocusNodeName(FieldConfig field) => '${field.name}FocusNode';
String _getControllerName(FieldConfig field) => '${field.name}Controller';
String _getFocusNodeName(FieldConfig field) =>
'${field.name.camelCase}FocusNode';
String _getControllerName(FieldConfig field) =>
'${field.name.camelCase}Controller';
String _getFormKeyName(ReCase caseName) => '${caseName.pascalCase}ValueKey';
}
Expand Up @@ -32,7 +32,8 @@ class StackedLocatorContentGenerator
newLine();

writeLine(
'Future<void> $locatorSetupName ({String? environment , EnvironmentFilter? environmentFilter, ${hasRouterService ? 'StackedRouterWeb? stackedRouter,' : ''}}) async {');
'Future<void> $locatorSetupName ({String? environment , EnvironmentFilter? environmentFilter,${hasRouterService ? ' StackedRouterWeb? stackedRouter,' : ''}}) async {',
);

newLine();
writeLine('// Register environments');
Expand Down
Expand Up @@ -80,14 +80,13 @@ class RouterClassBuilderHelper {
..name = '_pagesMap'
..modifier = FieldModifier.final$
..assignment = literalMap(
_pages(routes),
const Reference(
'Type',
),
const Reference(
'StackedRouteFactory',
'package:stacked/stacked.dart',
)).code,
_pages(routes),
const Reference('Type'),
const Reference(
'StackedRouteFactory',
'package:stacked/stacked.dart',
),
).code,
);

Map<Reference, Method> _pages(List<RouteConfig> routes) {
Expand All @@ -110,9 +109,7 @@ class RouterClassBuilderHelper {

return Method(
(b) => b
..requiredParameters.add(Parameter(
(b) => b..name = 'data',
))
..requiredParameters.add(Parameter((b) => b..name = 'data'))
..body = Block.of([
if (notQueryNorPathParameters.isNotEmpty) ...[
_prepareArgs(argsType),
Expand Down
12 changes: 6 additions & 6 deletions lib/src/generators/router_2/code_builder/library_builder.dart
Expand Up @@ -85,12 +85,12 @@ String generateLibrary(
(acc, a) => acc..addAll(a.guards),
);

final allGuardParameters = allGuards
.map(
(guard) =>
'${toLowerCamelCase(guard.name)}: ${refer(guard.name).accept(emitter)}',
)
.toList();
// final allGuardParameters = allGuards
// .map(
// (guard) =>
// '${toLowerCamelCase(guard.name)}: ${refer(guard.name).accept(emitter)}',
// )
// .toList();

/// Generate the extensions code that's required for declarativly supply
/// arguments to a class navigation call
Expand Down
69 changes: 45 additions & 24 deletions test/form/constant_test_helper.dart
Expand Up @@ -39,8 +39,8 @@ const kExample1DisposeTextControllers = '''
/// Calls dispose on all the generated controllers and focus nodes
void disposeForm() {
// The dispose function for a TextEditingController sets all listeners to null
// The dispose function for a TextEditingController sets all listeners to null
for (var controller in _TestViewTextEditingControllers.values) {
controller.dispose();
}
Expand Down Expand Up @@ -75,8 +75,9 @@ NameValueKey: nameController.text,
EmailValueKey: emailController.text,
}),
);
if (_autoTextFieldValidation || forceValidate) {
_updateValidationData(model);}}
updateValidationData(model);}}
''';
const kExample1ViewModelExtensionForGetters = '''
Expand Down Expand Up @@ -161,6 +162,20 @@ setNameValidationMessage(String? validationMessage) => this.fieldsValidationMess
setEmailValidationMessage(String? validationMessage) => this.fieldsValidationMessages[EmailValueKey] = validationMessage;
setDateValidationMessage(String? validationMessage) => this.fieldsValidationMessages[DateValueKey] = validationMessage;
setDropDownValidationMessage(String? validationMessage) => this.fieldsValidationMessages[DropDownValueKey] = validationMessage;
/// Clears text input fields on the Form
void clearForm() {
nameValue = '';
emailValue = '';
}
/// Validates text input fields on the Form
void validateForm() {
this.setValidationMessages({
NameValueKey: getValidationMessage(NameValueKey),
EmailValueKey: getValidationMessage(EmailValueKey),
});
}
}
''';
const kExample1AddRegisterationCustomTextEditingController = '''
Expand All @@ -186,28 +201,36 @@ const kExample1AddRegisterationForFocusNodes = '''
''';

const kExample1AddRegisterationextEditingController = '''
TextEditingController _getFormTextEditingController(String key,
{String? initialValue}) {
if (_TestViewTextEditingControllers.containsKey(key)) {
return _TestViewTextEditingControllers[key]!;
}
TextEditingController _getFormTextEditingController(
String key, {
String? initialValue,
}) {
if (_TestViewTextEditingControllers.containsKey(key)) {
return _TestViewTextEditingControllers[key]!;
}
_TestViewTextEditingControllers[key] =
TextEditingController(text: initialValue);
return _TestViewTextEditingControllers[key]!; }
''';

const kExample1AddValidationMessageForTextEditingController = '''
/// Returns the validation message for the given key
String? _getValidationMessage(String key) {
/// Returns the validation message for the given key
String? getValidationMessage(String key) {
final validatorForKey = _TestViewTextValidations[key];
if (validatorForKey == null) return null;
String? validationMessageForKey =
validatorForKey(_TestViewTextEditingControllers[key]!.text);
String? validationMessageForKey = validatorForKey(
_TestViewTextEditingControllers[key]!.text,
);
return validationMessageForKey;
}
}
''';
const kExample1AddHeaderComment = '''
Expand Down Expand Up @@ -235,7 +258,7 @@ emailController.addListener(() => _updateFormData(model));
/// with the latest textController values
@Deprecated(
'Use syncFormWithViewModel instead.'
'This feature was deprecated after 3.1.0.'
'This feature was deprecated after 3.1.0.',
)
void listenToFormUpdated(FormViewModel model) {
Expand All @@ -245,19 +268,17 @@ emailController.addListener(() => _updateFormData(model));
''';
const kExample1AddValidationDataUpdateFunctionTorTextControllers = '''
/// Updates the fieldsValidationMessages on the FormViewModel
void _updateValidationData(FormViewModel model) => model.setValidationMessages(
{
NameValueKey: _getValidationMessage(NameValueKey),
EmailValueKey: _getValidationMessage(EmailValueKey),
}
);
/// Updates the fieldsValidationMessages on the FormViewModel
void updateValidationData(FormViewModel model) => model.setValidationMessages({
NameValueKey: getValidationMessage(NameValueKey),
EmailValueKey: getValidationMessage(EmailValueKey),
});
''';

const kExample1AddMixinSignature = '''
mixin \$TestView on StatelessWidget {
mixin \$TestView {
''';

const kExample1AddValidationFunctionsFromAnnotation = '''
final Map<String, String? Function(String?)?> _TestViewTextValidations = {
Expand Down
40 changes: 27 additions & 13 deletions test/form/form_builder_test.dart
Expand Up @@ -90,8 +90,10 @@ void main() {
),
);
builder.addTextEditingControllersForTextFields();
expect(builder.serializeStringBuffer,
ksTextEditingControllerGettersForTextFields);
expect(
builder.serializeStringBuffer,
ksTextEditingControllerGettersForTextFields,
);
});
});
group('addTextEditingControllersForTextFields -', () {
Expand Down Expand Up @@ -172,7 +174,9 @@ void main() {
builder.addDisposeForTextControllers();

expect(
builder.serializeStringBuffer, kExample1DisposeTextControllers);
builder.serializeStringBuffer,
kExample1DisposeTextControllers,
);
});
});
group('addDropdownItemsMap -', () {
Expand Down Expand Up @@ -210,8 +214,10 @@ void main() {
test('When called, Should add extension Methods on FormViewModel', () {
builder.addFormViewModelExtensionForMethods();

expect(builder.serializeStringBuffer,
kExample1ViewModelExtensionForMethods);
expect(
builder.serializeStringBuffer,
kExample1ViewModelExtensionForMethods,
);
});
});
group('addGetCustomTextEditingController -', () {
Expand Down Expand Up @@ -239,8 +245,10 @@ void main() {
() {
builder.addGetTextEditinController();

expect(builder.serializeStringBuffer,
kExample1AddRegisterationextEditingController);
expect(
builder.serializeStringBuffer,
kExample1AddRegisterationextEditingController,
);
});
});
group('addGetValidationMessageForTextController -', () {
Expand All @@ -249,8 +257,10 @@ void main() {
() {
builder.addGetValidationMessageForTextController();

expect(builder.serializeStringBuffer,
kExample1AddValidationMessageForTextEditingController);
expect(
builder.serializeStringBuffer,
kExample1AddValidationMessageForTextEditingController,
);
});
});
group('addHeaderComment -', () {
Expand Down Expand Up @@ -278,8 +288,10 @@ void main() {
test('When called, Should add listeners for TextFields', () {
builder.addListenerRegistrationsForTextFields();

expect(builder.serializeStringBuffer,
kExample1AddListenerRegistrationsForTextFields);
expect(
builder.serializeStringBuffer,
kExample1AddListenerRegistrationsForTextFields,
);
});
});
group('addValidationDataUpdateFunctionTorTextControllers -', () {
Expand All @@ -288,8 +300,10 @@ void main() {
() {
builder.addValidationDataUpdateFunctionTorTextControllers();

expect(builder.serializeStringBuffer,
kExample1AddValidationDataUpdateFunctionTorTextControllers);
expect(
builder.serializeStringBuffer,
kExample1AddValidationDataUpdateFunctionTorTextControllers,
);
});
});
group('addMixinSignature -', () {
Expand Down

0 comments on commit f3a54fb

Please sign in to comment.