mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: Add group by field tests
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user