<%_ const baseName = context.baseName; const entityInstance = context.entityInstance; const entityFileName = context.entityFileName; const entityClassPlural = context.entityClassPlural; const entityClass = context.entityClass; const entityClassPluralLowered = context.entityClassPluralLowered; const fields = context.fields; const relationships = context.relationships; const primaryKeyType = context.primaryKeyType; const enableTranslation = context.enableTranslation; _%> import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:flutter/foundation.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/widgets.dart'; import 'package:formz/formz.dart'; import 'package:time_machine/time_machine.dart'; import 'package:<%= baseName %>/entities/<%= entityFileName %>/<%= entityFileName %>_model.dart'; import 'package:<%= baseName %>/entities/<%= entityFileName %>/<%= entityFileName %>_repository.dart'; import 'package:<%= baseName %>/entities/<%= entityFileName %>/bloc/<%= entityFileName %>_form_model.dart'; <%_ if(enableTranslation) { _%> import 'package:<%= baseName %>/generated/l10n.dart'; <%_ } _%> import 'package:<%= baseName %>/shared/repository/http_utils.dart'; import 'package:intl/intl.dart'; part '<%= entityFileName %>_events.dart'; part '<%= entityFileName %>_state.dart'; class <%= entityClass %>Bloc extends Bloc<<%= entityClass %>Event, <%= entityClass %>State> { final <%= entityClass %>Repository _<%= entityInstance %>Repository; <%_ fields.forEach(field => { _%> <%_ if(!field.fieldIsEnum && field.fieldType !== 'bool') { _%> final <%= field.fieldName %>Controller = TextEditingController(); <%_ } _%> <%_ }); _%> <%= entityClass %>Bloc({required <%= entityClass %>Repository <%= entityInstance %>Repository}) : _<%= entityInstance %>Repository = <%= entityInstance %>Repository, super(<%= entityClass %>State()); @override void onTransition(Transition<<%= entityClass %>Event, <%= entityClass %>State> transition) { super.onTransition(transition); } @override Stream<<%= entityClass %>State> mapEventToState(<%= entityClass %>Event event) async* { if (event is Init<%= entityClass %>List) { yield* onInitList(event); <%_ relationships.forEach(relationship => { %> } else if (event is Init<%= entityClass %>ListBy<%- relationship.otherEntityNameCapitalized %>) { yield* onInit<%= entityClass %>ListBy<%- relationship.otherEntityNameCapitalized %>(event); <%_ }); _%> } else if (event is <%= entityClass %>FormSubmitted) { yield* onSubmit(); } else if (event is Load<%= entityClass %>ByIdForEdit) { yield* onLoad<%= entityClass %>IdForEdit(event); } else if (event is Delete<%= entityClass %>ById) { yield* onDelete<%= entityClass %>Id(event); } else if (event is Load<%= entityClass %>ByIdForView) { yield* onLoad<%= entityClass %>IdForView(event); } <%_ fields.forEach(field => { _%> else if (event is <%= field.fieldNameCapitalized %>Changed){ yield* on<%= field.fieldNameCapitalized %>Change(event); }<%_ }); _%> } Stream<<%= entityClass %>State> onInitList(Init<%= entityClass %>List event) async* { yield this.state.copyWith(<%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.loading); List<<%= entityClass %>> <%= entityClassPluralLowered %> = await _<%= entityInstance %>Repository.getAll<%= entityClassPlural %>(); yield this.state.copyWith(<%= entityClassPluralLowered %>: <%= entityClassPluralLowered %>, <%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.done); } <%_ relationships.forEach(relationship => { %> Stream<<%= entityClass %>State> onInit<%= entityClass %>ListBy<%- relationship.otherEntityNameCapitalized %>(Init<%= entityClass %>ListBy<%- relationship.otherEntityNameCapitalized %> event) async* { yield this.state.copyWith(<%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.loading); List<<%= entityClass %>> <%= entityClassPluralLowered %> = await _<%= entityInstance %>Repository.getAll<%= entityClass %>ListBy<%- relationship.otherEntityNameCapitalized %>(event.<%- relationship.otherEntityName %>Id); yield this.state.copyWith(<%= entityClassPluralLowered %>: <%= entityClassPluralLowered %>, <%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.done); } <%_ }); _%> Stream<<%= entityClass %>State> onSubmit() async* { if (this.state.isValid) { yield this.state.copyWith(formStatus: FormzSubmissionStatus.inProgress); try { <%= entityClass %>? result; if(this.state.editMode) { <%= entityClass %> new<%= entityClass %> = <%= entityClass %>(state.loaded<%= entityClass %>.id, <%_ fields.forEach(field => { _%> this.state.<%= field.fieldName %>.value, <%_ }); _%> <%_ relationships.forEach(relationship => { _%> null, <%_ }); _%> ); result = await _<%= entityInstance %>Repository.update(new<%= entityClass %>); } else { <%= entityClass %> new<%= entityClass %> = <%= entityClass %>(null, <%_ fields.forEach(field => { _%> this.state.<%= field.fieldName %>.value, <%_ }); _%> <%_ relationships.forEach(relationship => { _%> null, <%_ }); _%> ); result = await _<%= entityInstance %>Repository.create(new<%= entityClass %>); } if (result == null) { yield this.state.copyWith(formStatus: FormzSubmissionStatus.failure, generalNotificationKey: HttpUtils.badRequestServerKey); } else { yield this.state.copyWith(formStatus: FormzSubmissionStatus.success, generalNotificationKey: HttpUtils.successResult); } } catch (e) { yield this.state.copyWith(formStatus: FormzSubmissionStatus.failure, generalNotificationKey: HttpUtils.errorServerKey); } } } Stream<<%= entityClass %>State> onLoad<%= entityClass %>IdForEdit(Load<%= entityClass %>ByIdForEdit? event) async* { yield this.state.copyWith(<%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.loading); <%= entityClass %> loaded<%= entityClass %> = await _<%= entityInstance %>Repository.get<%= entityClass %>(event?.id); <%_ fields.forEach(field => { _%> final <%= field.fieldName %> = <%= field.fieldNameCapitalized %>Input.dirty((loaded<%= entityClass %>.<%= field.fieldName %> != null ? loaded<%= entityClass %>.<%= field.fieldName %>: <%- field.defaultValue %>)!); <%_ }); _%> yield this.state.copyWith(loaded<%= entityClass %>: loaded<%= entityClass %>, editMode: true, <%_ fields.forEach(field => { _%> <%= field.fieldName %>: <%= field.fieldName %>, <%_ }); _%> <%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.done); <%_ fields.forEach(field => { _%> <%_ if(field.fieldType === 'DateTime' || field.fieldType === 'ZonedDateTime' || field.fieldType === 'Instant') { _%> <%= field.fieldName %>Controller.text = DateFormat.yMMMMd(<%_ if(enableTranslation) { _%>S.current.locale<%_ } else { _%>'en'<%_ } _%>).format(loaded<%= entityClass %>.<%= field.fieldName %>!.toDateTimeLocal()); <%_ } else if(field.fieldType === 'int' || field.fieldType === 'Double' || field.fieldType === 'double') { _%> <%= field.fieldName %>Controller.text = loaded<%= entityClass %>.<%= field.fieldName %>!.toString(); <%_ } else if (!field.fieldIsEnum && field.fieldType !== 'bool') { _%> <%= field.fieldName %>Controller.text = loaded<%= entityClass %>.<%= field.fieldName %>!; <%_ } _%> <%_ }); _%> } Stream<<%= entityClass %>State> onDelete<%= entityClass %>Id(Delete<%= entityClass %>ById event) async* { try { await _<%= entityInstance %>Repository.delete(event.id!); this.add(Init<%= entityClass %>List()); yield this.state.copyWith(deleteStatus: <%= entityClass %>DeleteStatus.ok); } catch (e) { yield this.state.copyWith(deleteStatus: <%= entityClass %>DeleteStatus.ko, generalNotificationKey: HttpUtils.errorServerKey); } yield this.state.copyWith(deleteStatus: <%= entityClass %>DeleteStatus.none); } Stream<<%= entityClass %>State> onLoad<%= entityClass %>IdForView(Load<%= entityClass %>ByIdForView event) async* { yield this.state.copyWith(<%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.loading); try { <%= entityClass %> loaded<%= entityClass %> = await _<%= entityInstance %>Repository.get<%= entityClass %>(event.id); yield this.state.copyWith(loaded<%= entityClass %>: loaded<%= entityClass %>, <%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.done); } catch(e) { yield this.state.copyWith(loaded<%= entityClass %>: null, <%= entityInstance %>StatusUI: <%= entityClass %>StatusUI.error); } } <%_ fields.forEach(field => { _%> Stream<<%= entityClass %>State> on<%= field.fieldNameCapitalized %>Change(<%= field.fieldNameCapitalized %>Changed event) async* { final <%= field.fieldName %> = <%= field.fieldNameCapitalized %>Input.dirty(event.<%= field.fieldName %>); yield this.state.copyWith( <%= field.fieldName %>: <%= field.fieldName %>, ); } <%_ }); _%> @override Future close() { <%_ fields.forEach(field => { _%> <%_ if(!field.fieldIsEnum && field.fieldType !== 'bool') { _%> <%= field.fieldName %>Controller.dispose(); <%_ } _%> <%_ }); _%> return super.close(); } }