feat: support checklist

This commit is contained in:
nathan
2022-11-29 14:17:43 +08:00
parent aa85970b0f
commit b4671c1d99
37 changed files with 431 additions and 28 deletions

View File

@ -10,11 +10,3 @@ class BoardGroupService {
groupField = field;
}
}
abstract class CanBeGroupField {
String get groupContent;
}
// class SingleSelectGroup extends CanBeGroupField {
// final SingleSelectTypeOptionContext typeOptionContext;
// }

View File

@ -358,6 +358,8 @@ Widget? _buildHeaderIcon(GroupData customData) {
break;
case FieldType.URL:
break;
case FieldType.CheckList:
break;
}
if (widget != null) {

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class BoardChecklistCell extends StatelessWidget {
const BoardChecklistCell({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container();
}
}

View File

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'board_cell.dart';
import 'board_checkbox_cell.dart';
import 'board_checklist_cell.dart';
import 'board_date_cell.dart';
import 'board_number_cell.dart';
import 'board_select_option_cell.dart';
@ -58,6 +59,10 @@ class BoardCellBuilder {
editableNotifier: cellNotifier,
key: key,
);
case FieldType.CheckList:
return BoardChecklistCell(
key: key,
);
case FieldType.Number:
return BoardNumberCell(
groupId: groupId,

View File

@ -81,6 +81,7 @@ class GridCellControllerBuilder {
);
case FieldType.MultiSelect:
case FieldType.SingleSelect:
case FieldType.CheckList:
final cellDataLoader = GridCellDataLoader(
cellId: _cellId,
parser: SelectOptionCellDataParser(),

View File

@ -506,22 +506,12 @@ class FieldInfo {
bool get canGroup {
switch (_field.fieldType) {
case FieldType.Checkbox:
return true;
case FieldType.DateTime:
return false;
case FieldType.MultiSelect:
return true;
case FieldType.Number:
return false;
case FieldType.RichText:
return false;
case FieldType.SingleSelect:
return true;
case FieldType.URL:
default:
return false;
}
return false;
}
bool get canCreateFilter {

View File

@ -1,6 +1,7 @@
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/checklist_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
import 'package:dartz/dartz.dart';
@ -95,6 +96,17 @@ class MultiSelectTypeOptionWidgetDataParser
}
}
// Multi-select
typedef ChecklistTypeOptionContext = TypeOptionContext<ChecklistTypeOptionPB>;
class ChecklistTypeOptionWidgetDataParser
extends TypeOptionDataParser<ChecklistTypeOptionPB> {
@override
ChecklistTypeOptionPB fromBuffer(List<int> buffer) {
return ChecklistTypeOptionPB.fromBuffer(buffer);
}
}
class TypeOptionContext<T extends GeneratedMessage> {
T? _typeOptionObject;
final TypeOptionDataParser<T> dataParser;

View File

@ -2,6 +2,7 @@ import 'package:app_flowy/plugins/grid/application/field/field_controller.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pbserver.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_filter.pbenum.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/checklist_filter.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/date_filter.pbenum.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/number_filter.pb.dart';
@ -104,6 +105,11 @@ class GridCreateFilterBloc
condition: SelectOptionCondition.OptionIs,
fieldType: FieldType.MultiSelect,
);
case FieldType.CheckList:
return _ffiService.insertChecklistFilter(
fieldId: fieldId,
condition: ChecklistFilterCondition.IsIncomplete,
);
case FieldType.Number:
return _ffiService.insertNumberFilter(
fieldId: fieldId,

View File

@ -3,6 +3,7 @@ import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/log.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_filter.pbserver.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/checklist_filter.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/date_filter.pbserver.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/grid_entities.pb.dart';
@ -145,6 +146,24 @@ class FilterFFIService {
);
}
Future<Either<Unit, FlowyError>> insertChecklistFilter({
required String fieldId,
required ChecklistFilterCondition condition,
String? filterId,
List<String> optionIds = const [],
}) {
final filter = ChecklistFilterPB()
..condition = condition
..optionIds.addAll(optionIds);
return insertFilter(
fieldId: fieldId,
filterId: filterId,
fieldType: FieldType.CheckList,
data: filter.writeToBuffer(),
);
}
Future<Either<Unit, FlowyError>> insertFilter({
required String fieldId,
String? filterId,

View File

@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'cell_accessory.dart';
import 'cell_shortcuts.dart';
import 'checkbox_cell.dart';
import 'checklist_cell.dart';
import 'date_cell/date_cell.dart';
import 'number_cell.dart';
import 'select_option_cell/select_option_cell.dart';
@ -55,6 +56,10 @@ class GridCellBuilder {
style: style,
key: key,
);
case FieldType.CheckList:
return GridChecklistCell(
key: key,
);
case FieldType.Number:
return GridNumberCell(
cellControllerBuilder: cellControllerBuilder,

View File

@ -0,0 +1,17 @@
import 'package:flutter/material.dart';
import 'cell_builder.dart';
class GridChecklistCell extends GridCellWidget {
GridChecklistCell({Key? key}) : super(key: key);
@override
ChecklistCellState createState() => ChecklistCellState();
}
class ChecklistCellState extends State<GridChecklistCell> {
@override
Widget build(BuildContext context) {
return Container();
}
}

View File

@ -0,0 +1,14 @@
import 'package:app_flowy/plugins/grid/presentation/widgets/filter/filter_info.dart';
import 'package:flutter/material.dart';
import 'choicechip.dart';
class ChecklistFilterChoicechip extends StatelessWidget {
final FilterInfo filterInfo;
const ChecklistFilterChoicechip({required this.filterInfo, Key? key})
: super(key: key);
@override
Widget build(BuildContext context) {
return ChoiceChipButton(filterInfo: filterInfo);
}
}

View File

@ -2,6 +2,7 @@ import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pbenum.dart';
import 'package:flutter/material.dart';
import 'choicechip/checkbox.dart';
import 'choicechip/checklist.dart';
import 'choicechip/date.dart';
import 'choicechip/number.dart';
import 'choicechip/select_option/select_option.dart';
@ -35,6 +36,8 @@ Widget buildFilterChoicechip(FilterInfo filterInfo) {
return SelectOptionFilterChoicechip(filterInfo: filterInfo);
case FieldType.URL:
return URLFilterChoicechip(filterInfo: filterInfo);
case FieldType.CheckList:
return ChecklistFilterChoicechip(filterInfo: filterInfo);
default:
return const SizedBox();
}

View File

@ -19,6 +19,8 @@ extension FieldTypeListExtension on FieldType {
return "grid/field/single_select";
case FieldType.URL:
return "grid/field/url";
case FieldType.CheckList:
return "grid/field/checklist";
}
throw UnimplementedError;
}
@ -39,6 +41,8 @@ extension FieldTypeListExtension on FieldType {
return LocaleKeys.grid_field_singleSelectFieldName.tr();
case FieldType.URL:
return LocaleKeys.grid_field_urlFieldName.tr();
case FieldType.CheckList:
return LocaleKeys.grid_field_checklistFieldName.tr();
}
throw UnimplementedError;
}

View File

@ -8,6 +8,7 @@ import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/date_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/multi_select_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/number_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/protobuf.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/single_select_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/text_type_option.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-grid/url_type_option.pb.dart';
@ -15,6 +16,7 @@ import 'package:protobuf/protobuf.dart' hide FieldInfo;
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
import 'package:flutter/material.dart';
import 'checkbox.dart';
import 'checklist.dart';
import 'date.dart';
import 'multi_select.dart';
import 'number.dart';
@ -124,6 +126,15 @@ TypeOptionWidgetBuilder makeTypeOptionWidgetBuilder({
dataController: dataController,
),
);
case FieldType.CheckList:
return ChecklistTypeOptionWidgetBuilder(
makeTypeOptionContextWithDataController<ChecklistTypeOptionPB>(
gridId: gridId,
fieldType: fieldType,
dataController: dataController,
),
);
}
throw UnimplementedError;
}
@ -206,6 +217,11 @@ TypeOptionContext<T>
dataController: dataController,
dataParser: MultiSelectTypeOptionWidgetDataParser(),
) as TypeOptionContext<T>;
case FieldType.CheckList:
return ChecklistTypeOptionContext(
dataController: dataController,
dataParser: ChecklistTypeOptionWidgetDataParser(),
) as TypeOptionContext<T>;
case FieldType.Number:
return NumberTypeOptionContext(
dataController: dataController,

View File

@ -0,0 +1,11 @@
import 'package:app_flowy/plugins/grid/application/field/type_option/type_option_context.dart';
import 'package:flutter/material.dart';
import 'builder.dart';
class ChecklistTypeOptionWidgetBuilder extends TypeOptionWidgetBuilder {
ChecklistTypeOptionWidgetBuilder(
ChecklistTypeOptionContext typeOptionContext);
@override
Widget? build(BuildContext context) => null;
}

View File

@ -331,6 +331,10 @@ GridCellStyle? _customCellStyle(FieldType fieldType) {
return SelectOptionCellStyle(
placeholder: LocaleKeys.grid_row_textPlaceholder.tr(),
);
case FieldType.CheckList:
return SelectOptionCellStyle(
placeholder: LocaleKeys.grid_row_textPlaceholder.tr(),
);
case FieldType.Number:
return null;
case FieldType.RichText: