|
@@ -1,20 +1,18 @@
|
|
|
import 'dart:typed_data';
|
|
|
|
|
|
+import 'package:app_flowy/workspace/application/grid/field/type_option/multi_select_type_option.dart';
|
|
|
import 'package:app_flowy/workspace/application/grid/field/type_option/type_option_service.dart';
|
|
|
+import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/type_option/checkbox.dart';
|
|
|
import 'package:dartz/dartz.dart' show Either;
|
|
|
import 'package:flowy_infra/image.dart';
|
|
|
import 'package:flowy_infra/theme.dart';
|
|
|
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
|
|
import 'package:flowy_infra_ui/style_widget/button.dart';
|
|
|
import 'package:flowy_infra_ui/style_widget/text.dart';
|
|
|
-import 'package:flowy_sdk/log.dart';
|
|
|
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
|
|
import 'package:flowy_sdk/protobuf/flowy-grid-data-model/grid.pb.dart';
|
|
|
-import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pbserver.dart';
|
|
|
-import 'package:flowy_sdk/protobuf/flowy-grid/text_type_option.pb.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
-import 'package:app_flowy/startup/startup.dart';
|
|
|
import 'package:app_flowy/workspace/application/grid/prelude.dart';
|
|
|
import 'package:app_flowy/workspace/presentation/plugins/grid/src/layout/sizes.dart';
|
|
|
import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header/field_type_list.dart';
|
|
@@ -22,23 +20,21 @@ import 'package:app_flowy/workspace/presentation/plugins/grid/src/widgets/header
|
|
|
import 'field_type_extension.dart';
|
|
|
import 'type_option/multi_select.dart';
|
|
|
import 'type_option/number.dart';
|
|
|
+import 'type_option/rich_text.dart';
|
|
|
import 'type_option/single_select.dart';
|
|
|
+import 'type_option/url.dart';
|
|
|
|
|
|
typedef UpdateFieldCallback = void Function(Field, Uint8List);
|
|
|
-typedef SwitchToFieldCallback = Future<Either<EditFieldContext, FlowyError>> Function(
|
|
|
+typedef SwitchToFieldCallback = Future<Either<FieldTypeOptionData, FlowyError>> Function(
|
|
|
String fieldId,
|
|
|
FieldType fieldType,
|
|
|
);
|
|
|
|
|
|
class FieldEditorPannel extends StatefulWidget {
|
|
|
- final EditFieldContext editFieldContext;
|
|
|
- final UpdateFieldCallback onUpdated;
|
|
|
- final SwitchToFieldCallback onSwitchToField;
|
|
|
+ final GridFieldContext fieldContext;
|
|
|
|
|
|
const FieldEditorPannel({
|
|
|
- required this.editFieldContext,
|
|
|
- required this.onUpdated,
|
|
|
- required this.onSwitchToField,
|
|
|
+ required this.fieldContext,
|
|
|
Key? key,
|
|
|
}) : super(key: key);
|
|
|
|
|
@@ -52,13 +48,10 @@ class _FieldEditorPannelState extends State<FieldEditorPannel> {
|
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
|
return BlocProvider(
|
|
|
- create: (context) => getIt<FieldEditorPannelBloc>(param1: widget.editFieldContext),
|
|
|
- child: BlocConsumer<FieldEditorPannelBloc, FieldEditorPannelState>(
|
|
|
- listener: (context, state) {
|
|
|
- widget.onUpdated(state.field, state.typeOptionData);
|
|
|
- },
|
|
|
+ create: (context) => FieldEditorPannelBloc(widget.fieldContext)..add(const FieldEditorPannelEvent.initial()),
|
|
|
+ child: BlocBuilder<FieldEditorPannelBloc, FieldEditorPannelState>(
|
|
|
builder: (context, state) {
|
|
|
- List<Widget> children = [_switchFieldTypeButton(context, state.field)];
|
|
|
+ List<Widget> children = [_switchFieldTypeButton(context, widget.fieldContext.field)];
|
|
|
final typeOptionWidget = _typeOptionWidget(context: context, state: state);
|
|
|
|
|
|
if (typeOptionWidget != null) {
|
|
@@ -84,19 +77,7 @@ class _FieldEditorPannelState extends State<FieldEditorPannel> {
|
|
|
hoverColor: theme.hover,
|
|
|
onTap: () {
|
|
|
final list = FieldTypeList(onSelectField: (newFieldType) {
|
|
|
- widget.onSwitchToField(field.id, newFieldType).then((result) {
|
|
|
- result.fold(
|
|
|
- (editFieldContext) {
|
|
|
- context.read<FieldEditorPannelBloc>().add(
|
|
|
- FieldEditorPannelEvent.toFieldType(
|
|
|
- editFieldContext.gridField,
|
|
|
- editFieldContext.typeOptionData,
|
|
|
- ),
|
|
|
- );
|
|
|
- },
|
|
|
- (err) => Log.error(err),
|
|
|
- );
|
|
|
- });
|
|
|
+ widget.fieldContext.switchToField(newFieldType);
|
|
|
});
|
|
|
_showOverlay(context, list);
|
|
|
},
|
|
@@ -115,18 +96,9 @@ class _FieldEditorPannelState extends State<FieldEditorPannel> {
|
|
|
hideOverlay: _hideOverlay,
|
|
|
);
|
|
|
|
|
|
- final dataDelegate = TypeOptionDataDelegate(didUpdateTypeOptionData: (data) {
|
|
|
- context.read<FieldEditorPannelBloc>().add(FieldEditorPannelEvent.didUpdateTypeOptionData(data));
|
|
|
- });
|
|
|
-
|
|
|
final builder = _makeTypeOptionBuild(
|
|
|
- typeOptionContext: TypeOptionContext(
|
|
|
- gridId: state.gridId,
|
|
|
- field: state.field,
|
|
|
- data: state.typeOptionData,
|
|
|
- ),
|
|
|
+ typeOptionContext: _makeTypeOptionContext(widget.fieldContext),
|
|
|
overlayDelegate: overlayDelegate,
|
|
|
- dataDelegate: dataDelegate,
|
|
|
);
|
|
|
|
|
|
return builder.customWidget;
|
|
@@ -166,25 +138,86 @@ abstract class TypeOptionBuilder {
|
|
|
TypeOptionBuilder _makeTypeOptionBuild({
|
|
|
required TypeOptionContext typeOptionContext,
|
|
|
required TypeOptionOverlayDelegate overlayDelegate,
|
|
|
- required TypeOptionDataDelegate dataDelegate,
|
|
|
}) {
|
|
|
switch (typeOptionContext.field.fieldType) {
|
|
|
case FieldType.Checkbox:
|
|
|
- return CheckboxTypeOptionBuilder(typeOptionContext.data);
|
|
|
+ return CheckboxTypeOptionBuilder(
|
|
|
+ typeOptionContext as CheckboxTypeOptionContext,
|
|
|
+ );
|
|
|
case FieldType.DateTime:
|
|
|
- return DateTypeOptionBuilder(typeOptionContext.data, overlayDelegate, dataDelegate);
|
|
|
+ return DateTypeOptionBuilder(
|
|
|
+ typeOptionContext as DateTypeOptionContext,
|
|
|
+ overlayDelegate,
|
|
|
+ );
|
|
|
case FieldType.SingleSelect:
|
|
|
- return SingleSelectTypeOptionBuilder(typeOptionContext, overlayDelegate, dataDelegate);
|
|
|
+ return SingleSelectTypeOptionBuilder(
|
|
|
+ typeOptionContext as SingleSelectTypeOptionContext,
|
|
|
+ overlayDelegate,
|
|
|
+ );
|
|
|
case FieldType.MultiSelect:
|
|
|
- return MultiSelectTypeOptionBuilder(typeOptionContext, overlayDelegate, dataDelegate);
|
|
|
+ return MultiSelectTypeOptionBuilder(
|
|
|
+ typeOptionContext as MultiSelectTypeOptionContext,
|
|
|
+ overlayDelegate,
|
|
|
+ );
|
|
|
case FieldType.Number:
|
|
|
- return NumberTypeOptionBuilder(typeOptionContext.data, overlayDelegate, dataDelegate);
|
|
|
+ return NumberTypeOptionBuilder(
|
|
|
+ typeOptionContext as NumberTypeOptionContext,
|
|
|
+ overlayDelegate,
|
|
|
+ );
|
|
|
case FieldType.RichText:
|
|
|
- return RichTextTypeOptionBuilder(typeOptionContext.data);
|
|
|
+ return RichTextTypeOptionBuilder(
|
|
|
+ typeOptionContext as RichTextTypeOptionContext,
|
|
|
+ );
|
|
|
+
|
|
|
+ case FieldType.URL:
|
|
|
+ return URLTypeOptionBuilder(
|
|
|
+ typeOptionContext as URLTypeOptionContext,
|
|
|
+ );
|
|
|
+ }
|
|
|
+ throw UnimplementedError;
|
|
|
+}
|
|
|
|
|
|
- default:
|
|
|
- throw UnimplementedError;
|
|
|
+TypeOptionContext _makeTypeOptionContext(GridFieldContext fieldContext) {
|
|
|
+ switch (fieldContext.field.fieldType) {
|
|
|
+ case FieldType.Checkbox:
|
|
|
+ return CheckboxTypeOptionContext(
|
|
|
+ fieldContext: fieldContext,
|
|
|
+ dataBuilder: CheckboxTypeOptionDataBuilder(),
|
|
|
+ );
|
|
|
+ case FieldType.DateTime:
|
|
|
+ return DateTypeOptionContext(
|
|
|
+ fieldContext: fieldContext,
|
|
|
+ dataBuilder: DateTypeOptionDataBuilder(),
|
|
|
+ );
|
|
|
+ case FieldType.MultiSelect:
|
|
|
+ return MultiSelectTypeOptionContext(
|
|
|
+ fieldContext: fieldContext,
|
|
|
+ dataBuilder: MultiSelectTypeOptionDataBuilder(),
|
|
|
+ );
|
|
|
+ case FieldType.Number:
|
|
|
+ return NumberTypeOptionContext(
|
|
|
+ fieldContext: fieldContext,
|
|
|
+ dataBuilder: NumberTypeOptionDataBuilder(),
|
|
|
+ );
|
|
|
+ case FieldType.RichText:
|
|
|
+ return RichTextTypeOptionContext(
|
|
|
+ fieldContext: fieldContext,
|
|
|
+ dataBuilder: RichTextTypeOptionDataBuilder(),
|
|
|
+ );
|
|
|
+ case FieldType.SingleSelect:
|
|
|
+ return SingleSelectTypeOptionContext(
|
|
|
+ fieldContext: fieldContext,
|
|
|
+ dataBuilder: SingleSelectTypeOptionDataBuilder(),
|
|
|
+ );
|
|
|
+
|
|
|
+ case FieldType.URL:
|
|
|
+ return URLTypeOptionContext(
|
|
|
+ fieldContext: fieldContext,
|
|
|
+ dataBuilder: URLTypeOptionDataBuilder(),
|
|
|
+ );
|
|
|
}
|
|
|
+
|
|
|
+ throw UnimplementedError();
|
|
|
}
|
|
|
|
|
|
abstract class TypeOptionWidget extends StatelessWidget {
|
|
@@ -208,29 +241,3 @@ class TypeOptionOverlayDelegate {
|
|
|
required this.hideOverlay,
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
-class TypeOptionDataDelegate {
|
|
|
- TypeOptionDataCallback didUpdateTypeOptionData;
|
|
|
-
|
|
|
- TypeOptionDataDelegate({
|
|
|
- required this.didUpdateTypeOptionData,
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-class RichTextTypeOptionBuilder extends TypeOptionBuilder {
|
|
|
- RichTextTypeOption typeOption;
|
|
|
-
|
|
|
- RichTextTypeOptionBuilder(TypeOptionData typeOptionData) : typeOption = RichTextTypeOption.fromBuffer(typeOptionData);
|
|
|
-
|
|
|
- @override
|
|
|
- Widget? get customWidget => null;
|
|
|
-}
|
|
|
-
|
|
|
-class CheckboxTypeOptionBuilder extends TypeOptionBuilder {
|
|
|
- CheckboxTypeOption typeOption;
|
|
|
-
|
|
|
- CheckboxTypeOptionBuilder(TypeOptionData typeOptionData) : typeOption = CheckboxTypeOption.fromBuffer(typeOptionData);
|
|
|
-
|
|
|
- @override
|
|
|
- Widget? get customWidget => null;
|
|
|
-}
|