chore: Add group by field tests

This commit is contained in:
Nathan.fooo
2022-10-27 14:11:15 +08:00
committed by GitHub
parent 3bbf91ab2b
commit 309bbbd8e7
6 changed files with 275 additions and 105 deletions

View File

@ -57,6 +57,9 @@ class FieldEditorBloc extends Bloc<FieldEditorEvent, FieldEditorState> {
},
);
},
switchToField: (FieldType fieldType) async {
await dataController.switchToField(fieldType);
},
);
},
);
@ -73,6 +76,8 @@ class FieldEditorEvent with _$FieldEditorEvent {
const factory FieldEditorEvent.initial() = _InitialField;
const factory FieldEditorEvent.updateName(String name) = _UpdateName;
const factory FieldEditorEvent.deleteField() = _DeleteField;
const factory FieldEditorEvent.switchToField(FieldType fieldType) =
_SwitchToField;
const factory FieldEditorEvent.didReceiveFieldChanged(FieldPB field) =
_DidReceiveFieldChanged;
}

View File

@ -25,6 +25,9 @@ class FieldTypeOptionEditBloc
didReceiveFieldUpdated: (field) {
emit(state.copyWith(field: field));
},
switchToField: (FieldType fieldType) async {
await _dataController.switchToField(fieldType);
},
);
},
);
@ -42,6 +45,8 @@ class FieldTypeOptionEditBloc
@freezed
class FieldTypeOptionEditEvent with _$FieldTypeOptionEditEvent {
const factory FieldTypeOptionEditEvent.initial() = _Initial;
const factory FieldTypeOptionEditEvent.switchToField(FieldType fieldType) =
_SwitchToField;
const factory FieldTypeOptionEditEvent.didReceiveFieldUpdated(FieldPB field) =
_DidReceiveFieldUpdated;
}
@ -53,8 +58,9 @@ class FieldTypeOptionEditState with _$FieldTypeOptionEditState {
}) = _FieldTypeOptionEditState;
factory FieldTypeOptionEditState.initial(
TypeOptionDataController fieldContext) =>
TypeOptionDataController typeOptionDataController,
) =>
FieldTypeOptionEditState(
field: fieldContext.field,
field: typeOptionDataController.field,
);
}

View File

@ -25,31 +25,35 @@ typedef SwitchToFieldCallback
);
class FieldTypeOptionEditor extends StatelessWidget {
final TypeOptionDataController dataController;
final TypeOptionDataController _dataController;
final PopoverMutex popoverMutex;
const FieldTypeOptionEditor({
required this.dataController,
required TypeOptionDataController dataController,
required this.popoverMutex,
Key? key,
}) : super(key: key);
}) : _dataController = dataController,
super(key: key);
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => FieldTypeOptionEditBloc(dataController)
..add(const FieldTypeOptionEditEvent.initial()),
create: (context) {
final bloc = FieldTypeOptionEditBloc(_dataController);
bloc.add(const FieldTypeOptionEditEvent.initial());
return bloc;
},
child: BlocBuilder<FieldTypeOptionEditBloc, FieldTypeOptionEditState>(
builder: (context, state) {
List<Widget> children = [
_switchFieldTypeButton(context, dataController.field)
];
final typeOptionWidget =
_typeOptionWidget(context: context, state: state);
final typeOptionWidget = _typeOptionWidget(
context: context,
state: state,
);
if (typeOptionWidget != null) {
children.add(typeOptionWidget);
}
List<Widget> children = [
_SwitchFieldButton(popoverMutex: popoverMutex),
if (typeOptionWidget != null) typeOptionWidget
];
return ListView(
shrinkWrap: true,
@ -60,45 +64,68 @@ class FieldTypeOptionEditor extends StatelessWidget {
);
}
Widget _switchFieldTypeButton(BuildContext context, FieldPB field) {
final theme = context.watch<AppTheme>();
return SizedBox(
height: GridSize.typeOptionItemHeight,
child: AppFlowyPopover(
constraints: BoxConstraints.loose(const Size(460, 540)),
asBarrier: true,
triggerActions: PopoverTriggerFlags.click | PopoverTriggerFlags.hover,
mutex: popoverMutex,
offset: const Offset(20, 0),
popupBuilder: (context) {
return FieldTypeList(onSelectField: (newFieldType) {
dataController.switchToField(newFieldType);
});
},
child: FlowyButton(
text: FlowyText.medium(field.fieldType.title(), fontSize: 12),
margin: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
hoverColor: theme.hover,
leftIcon:
svgWidget(field.fieldType.iconName(), color: theme.iconColor),
rightIcon: svgWidget("grid/more", color: theme.iconColor),
),
),
);
}
Widget? _typeOptionWidget({
required BuildContext context,
required FieldTypeOptionEditState state,
}) {
return makeTypeOptionWidget(
context: context,
dataController: dataController,
dataController: _dataController,
popoverMutex: popoverMutex,
);
}
}
class _SwitchFieldButton extends StatelessWidget {
final PopoverMutex popoverMutex;
const _SwitchFieldButton({
required this.popoverMutex,
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final widget = AppFlowyPopover(
constraints: BoxConstraints.loose(const Size(460, 540)),
asBarrier: true,
triggerActions: PopoverTriggerFlags.click | PopoverTriggerFlags.hover,
mutex: popoverMutex,
offset: const Offset(20, 0),
popupBuilder: (popOverContext) {
return FieldTypeList(onSelectField: (newFieldType) {
context
.read<FieldTypeOptionEditBloc>()
.add(FieldTypeOptionEditEvent.switchToField(newFieldType));
});
},
child: _buildMoreButton(context),
);
return SizedBox(
height: GridSize.typeOptionItemHeight,
child: widget,
);
}
Widget _buildMoreButton(BuildContext context) {
final theme = context.read<AppTheme>();
final bloc = context.read<FieldTypeOptionEditBloc>();
return FlowyButton(
text: FlowyText.medium(
bloc.state.field.fieldType.title(),
fontSize: 12,
),
margin: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
hoverColor: theme.hover,
leftIcon: svgWidget(
bloc.state.field.fieldType.iconName(),
color: theme.iconColor,
),
rightIcon: svgWidget("grid/more", color: theme.iconColor),
);
}
}
abstract class TypeOptionWidget extends StatelessWidget {
const TypeOptionWidget({Key? key}) : super(key: key);
}