chore: move field width to field settings (#3830)

* refactor: remove unnecessary builder

* feat: add width to field settings

* refactor: field settings logic

* chore: oopsies

* chore: implement UI

* chore: remove GridFieldCellEquatable

* test: rust-lib test fix
This commit is contained in:
Richard Shiue 2023-11-06 14:48:59 +08:00 committed by GitHub
parent 2b684ae7bf
commit 4d82bb5322
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 317 additions and 441 deletions

View File

@ -4,6 +4,7 @@ import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart
import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/field_settings_entities.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'field_info.dart';
import 'field_service.dart'; import 'field_service.dart';
part 'field_action_sheet_bloc.freezed.dart'; part 'field_action_sheet_bloc.freezed.dart';
@ -14,17 +15,18 @@ class FieldActionSheetBloc
final FieldBackendService fieldService; final FieldBackendService fieldService;
final FieldSettingsBackendService fieldSettingsService; final FieldSettingsBackendService fieldSettingsService;
FieldActionSheetBloc({required FieldContext fieldCellContext}) FieldActionSheetBloc({
: fieldId = fieldCellContext.fieldInfo.id, required String viewId,
required FieldInfo fieldInfo,
}) : fieldId = fieldInfo.id,
fieldService = FieldBackendService( fieldService = FieldBackendService(
viewId: fieldCellContext.viewId, viewId: viewId,
fieldId: fieldCellContext.fieldInfo.id, fieldId: fieldInfo.id,
), ),
fieldSettingsService = fieldSettingsService = FieldSettingsBackendService(viewId: viewId),
FieldSettingsBackendService(viewId: fieldCellContext.viewId),
super( super(
FieldActionSheetState.initial( FieldActionSheetState.initial(
TypeOptionPB.create()..field_2 = fieldCellContext.fieldInfo.field, TypeOptionPB.create()..field_2 = fieldInfo.field,
), ),
) { ) {
on<FieldActionSheetEvent>( on<FieldActionSheetEvent>(

View File

@ -1,67 +1,46 @@
import 'dart:math'; import 'dart:math';
import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart'; import 'package:appflowy/plugins/database_view/application/field_settings/field_settings_service.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'dart:async';
import 'field_listener.dart'; import 'field_info.dart';
import 'field_service.dart';
part 'field_cell_bloc.freezed.dart'; part 'field_cell_bloc.freezed.dart';
class FieldCellBloc extends Bloc<FieldCellEvent, FieldCellState> { class FieldCellBloc extends Bloc<FieldCellEvent, FieldCellState> {
final SingleFieldListener _fieldListener; FieldInfo fieldInfo;
final FieldBackendService _fieldBackendSvc; final FieldSettingsBackendService _fieldSettingsService;
FieldCellBloc({ FieldCellBloc({required String viewId, required this.fieldInfo})
required FieldContext fieldContext, : _fieldSettingsService = FieldSettingsBackendService(
}) : _fieldListener = viewId: viewId,
SingleFieldListener(fieldId: fieldContext.fieldInfo.id),
_fieldBackendSvc = FieldBackendService(
viewId: fieldContext.viewId,
fieldId: fieldContext.fieldInfo.id,
), ),
super(FieldCellState.initial(fieldContext)) { super(FieldCellState.initial(fieldInfo)) {
on<FieldCellEvent>( on<FieldCellEvent>(
(event, emit) async { (event, emit) async {
event.when( event.when(
initial: () { onFieldChanged: (newFieldInfo) {
_startListening(); fieldInfo = newFieldInfo;
}, emit(FieldCellState.initial(newFieldInfo));
didReceiveFieldUpdate: (field) {
emit(state.copyWith(field: fieldContext.fieldInfo.field));
}, },
onResizeStart: () { onResizeStart: () {
emit(state.copyWith(resizeStart: state.width)); emit(state.copyWith(isResizing: true, resizeStart: state.width));
}, },
startUpdateWidth: (offset) { startUpdateWidth: (offset) {
final width = max(offset + state.resizeStart, 50).toDouble(); final width = max(offset + state.resizeStart, 50).toDouble();
emit(state.copyWith(width: width)); emit(state.copyWith(width: width));
}, },
endUpdateWidth: () { endUpdateWidth: () {
if (state.width != state.field.width.toDouble()) { if (state.width != fieldInfo.fieldSettings?.width.toDouble()) {
_fieldBackendSvc.updateField(width: state.width); _fieldSettingsService.updateFieldSettings(
} fieldId: fieldInfo.id,
}, width: state.width,
);
},
); );
} }
emit(state.copyWith(isResizing: false, resizeStart: 0));
@override },
Future<void> close() async { );
await _fieldListener.stop();
return super.close();
}
void _startListening() {
_fieldListener.start(
onFieldChanged: (updatedField) {
if (isClosed) {
return;
}
add(FieldCellEvent.didReceiveFieldUpdate(updatedField));
}, },
); );
} }
@ -69,9 +48,8 @@ class FieldCellBloc extends Bloc<FieldCellEvent, FieldCellState> {
@freezed @freezed
class FieldCellEvent with _$FieldCellEvent { class FieldCellEvent with _$FieldCellEvent {
const factory FieldCellEvent.initial() = _InitialCell; const factory FieldCellEvent.onFieldChanged(FieldInfo newFieldInfo) =
const factory FieldCellEvent.didReceiveFieldUpdate(FieldPB field) = _OnFieldChanged;
_DidReceiveFieldUpdate;
const factory FieldCellEvent.onResizeStart() = _OnResizeStart; const factory FieldCellEvent.onResizeStart() = _OnResizeStart;
const factory FieldCellEvent.startUpdateWidth(double offset) = const factory FieldCellEvent.startUpdateWidth(double offset) =
_StartUpdateWidth; _StartUpdateWidth;
@ -81,16 +59,16 @@ class FieldCellEvent with _$FieldCellEvent {
@freezed @freezed
class FieldCellState with _$FieldCellState { class FieldCellState with _$FieldCellState {
const factory FieldCellState({ const factory FieldCellState({
required String viewId, required FieldInfo fieldInfo,
required FieldPB field,
required double width, required double width,
required bool isResizing,
required double resizeStart, required double resizeStart,
}) = _FieldCellState; }) = _FieldCellState;
factory FieldCellState.initial(FieldContext cellContext) => FieldCellState( factory FieldCellState.initial(FieldInfo fieldInfo) => FieldCellState(
viewId: cellContext.viewId, fieldInfo: fieldInfo,
field: cellContext.fieldInfo.field, isResizing: false,
width: cellContext.fieldInfo.field.width.toDouble(), width: fieldInfo.fieldSettings!.width.toDouble(),
resizeStart: 0, resizeStart: 0,
); );
} }

View File

@ -1,12 +1,8 @@
import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/database_entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/database_entities.pb.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart'; import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/field_entities.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'field_service.freezed.dart';
/// FieldService consists of lots of event functions. We define the events in the backend(Rust), /// FieldService consists of lots of event functions. We define the events in the backend(Rust),
/// you can find the corresponding event implementation in event_map.rs of the corresponding crate. /// you can find the corresponding event implementation in event_map.rs of the corresponding crate.
@ -104,11 +100,3 @@ class FieldBackendService {
return DatabaseEventGetPrimaryField(payload).send(); return DatabaseEventGetPrimaryField(payload).send();
} }
} }
@freezed
class FieldContext with _$FieldContext {
const factory FieldContext({
required String viewId,
required FieldInfo fieldInfo,
}) = _FieldCellContext;
}

View File

@ -58,6 +58,7 @@ class FieldSettingsBackendService {
Future<Either<Unit, FlowyError>> updateFieldSettings({ Future<Either<Unit, FlowyError>> updateFieldSettings({
required String fieldId, required String fieldId,
FieldVisibility? fieldVisibility, FieldVisibility? fieldVisibility,
double? width,
}) { }) {
final FieldSettingsChangesetPB payload = FieldSettingsChangesetPB.create() final FieldSettingsChangesetPB payload = FieldSettingsChangesetPB.create()
..viewId = viewId ..viewId = viewId
@ -67,6 +68,10 @@ class FieldSettingsBackendService {
payload.visibility = fieldVisibility; payload.visibility = fieldVisibility;
} }
if (width != null) {
payload.width = width.round();
}
return DatabaseEventUpdateFieldSettings(payload).send(); return DatabaseEventUpdateFieldSettings(payload).send();
} }
} }

View File

@ -6,9 +6,7 @@ import 'package:appflowy/plugins/database_view/application/field/field_info.dart
import 'package:appflowy/plugins/database_view/application/group/group_service.dart'; import 'package:appflowy/plugins/database_view/application/group/group_service.dart';
import 'package:appflowy/plugins/database_view/application/row/row_service.dart'; import 'package:appflowy/plugins/database_view/application/row/row_service.dart';
import 'package:appflowy_board/appflowy_board.dart'; import 'package:appflowy_board/appflowy_board.dart';
import 'package:collection/collection.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:appflowy_backend/log.dart'; import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
@ -400,29 +398,6 @@ class BoardState with _$BoardState {
); );
} }
class GridFieldEquatable extends Equatable {
final UnmodifiableListView<FieldPB> _fields;
const GridFieldEquatable(
UnmodifiableListView<FieldPB> fields,
) : _fields = fields;
@override
List<Object?> get props {
if (_fields.isEmpty) {
return [];
}
return [
_fields.length,
_fields
.map((field) => field.width)
.reduce((value, element) => value + element),
];
}
UnmodifiableListView<FieldPB> get value => UnmodifiableListView(_fields);
}
class GroupItem extends AppFlowyGroupItem { class GroupItem extends AppFlowyGroupItem {
final RowMetaPB row; final RowMetaPB row;
final FieldInfo fieldInfo; final FieldInfo fieldInfo;

View File

@ -4,7 +4,6 @@ import 'package:appflowy/plugins/database_view/application/field/field_controlle
import 'package:appflowy/plugins/database_view/application/setting/property_bloc.dart'; import 'package:appflowy/plugins/database_view/application/setting/property_bloc.dart';
import 'package:appflowy/plugins/database_view/calendar/application/calendar_setting_bloc.dart'; import 'package:appflowy/plugins/database_view/calendar/application/calendar_setting_bloc.dart';
import 'package:appflowy/plugins/database_view/grid/presentation/layout/sizes.dart'; import 'package:appflowy/plugins/database_view/grid/presentation/layout/sizes.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart'; import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart'; import 'package:appflowy/workspace/presentation/widgets/toggle/toggle_style.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
@ -234,9 +233,9 @@ class LayoutDateField extends StatelessWidget {
offset: const Offset(-14, 0), offset: const Offset(-14, 0),
popupBuilder: (context) { popupBuilder: (context) {
return BlocProvider( return BlocProvider(
create: (context) => getIt<DatabasePropertyBloc>( create: (context) => DatabasePropertyBloc(
param1: viewId, viewId: viewId,
param2: fieldController, fieldController: fieldController,
)..add(const DatabasePropertyEvent.initial()), )..add(const DatabasePropertyEvent.initial()),
child: BlocBuilder<DatabasePropertyBloc, DatabasePropertyState>( child: BlocBuilder<DatabasePropertyBloc, DatabasePropertyState>(
builder: (context, state) { builder: (context, state) {

View File

@ -6,13 +6,11 @@ import 'package:appflowy/plugins/database_view/application/row/row_service.dart'
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/filter_info.dart'; import 'package:appflowy/plugins/database_view/grid/presentation/widgets/filter/filter_info.dart';
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/sort/sort_info.dart'; import 'package:appflowy/plugins/database_view/grid/presentation/widgets/sort/sort_info.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-folder2/view.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import '../../application/database_controller.dart'; import '../../application/database_controller.dart';
import 'dart:collection';
part 'grid_bloc.freezed.dart'; part 'grid_bloc.freezed.dart';
@ -54,7 +52,7 @@ class GridBloc extends Bloc<GridEvent, GridState> {
didReceiveFieldUpdate: (fields) { didReceiveFieldUpdate: (fields) {
emit( emit(
state.copyWith( state.copyWith(
fields: GridFieldEquatable(fields), fields: FieldList(fields),
), ),
); );
}, },
@ -175,7 +173,7 @@ class GridState with _$GridState {
const factory GridState({ const factory GridState({
required String viewId, required String viewId,
required Option<DatabasePB> grid, required Option<DatabasePB> grid,
required GridFieldEquatable fields, required FieldList fields,
required List<RowInfo> rowInfos, required List<RowInfo> rowInfos,
required int rowCount, required int rowCount,
required LoadingState loadingState, required LoadingState loadingState,
@ -186,7 +184,7 @@ class GridState with _$GridState {
}) = _GridState; }) = _GridState;
factory GridState.initial(String viewId) => GridState( factory GridState.initial(String viewId) => GridState(
fields: GridFieldEquatable(UnmodifiableListView([])), fields: FieldList([]),
rowInfos: [], rowInfos: [],
rowCount: 0, rowCount: 0,
grid: none(), grid: none(),
@ -199,26 +197,7 @@ class GridState with _$GridState {
); );
} }
class GridFieldEquatable extends Equatable { @freezed
final List<FieldInfo> _fieldInfos; class FieldList with _$FieldList {
const GridFieldEquatable( factory FieldList(List<FieldInfo> fields) = _FieldList;
List<FieldInfo> fieldInfos,
) : _fieldInfos = fieldInfos;
@override
List<Object?> get props {
if (_fieldInfos.isEmpty) {
return [];
}
return [
_fieldInfos.length,
_fieldInfos
.map((fieldInfo) => fieldInfo.field.width)
.reduce((value, element) => value + element),
];
}
UnmodifiableListView<FieldInfo> get value =>
UnmodifiableListView(_fieldInfos);
} }

View File

@ -132,7 +132,7 @@ class GridCellEquatable extends Equatable {
_fieldInfo.id, _fieldInfo.id,
_fieldInfo.fieldType, _fieldInfo.fieldType,
_fieldInfo.field.visibility, _fieldInfo.field.visibility,
_fieldInfo.field.width, _fieldInfo.fieldSettings?.width,
]; ];
} }

View File

@ -172,7 +172,7 @@ class _GridPageContentState extends State<GridPageContent> {
return BlocBuilder<GridBloc, GridState>( return BlocBuilder<GridBloc, GridState>(
buildWhen: (previous, current) => previous.fields != current.fields, buildWhen: (previous, current) => previous.fields != current.fields,
builder: (context, state) { builder: (context, state) {
final contentWidth = GridLayout.headerWidth(state.fields.value); final contentWidth = GridLayout.headerWidth(state.fields.fields);
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

View File

@ -6,7 +6,7 @@ class GridLayout {
if (fields.isEmpty) return 0; if (fields.isEmpty) return 0;
final fieldsWidth = fields final fieldsWidth = fields
.map((fieldInfo) => fieldInfo.field.width.toDouble()) .map((fieldInfo) => fieldInfo.fieldSettings!.width.toDouble())
.reduce((value, element) => value + element); .reduce((value, element) => value + element);
return fieldsWidth + return fieldsWidth +

View File

@ -1,6 +1,6 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/plugins/database_view/application/field/field_cell_bloc.dart'; import 'package:appflowy/plugins/database_view/application/field/field_cell_bloc.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart'; import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra/theme_extension.dart'; import 'package:flowy_infra/theme_extension.dart';
@ -15,31 +15,41 @@ import 'field_cell_action_sheet.dart';
import 'field_type_extension.dart'; import 'field_type_extension.dart';
class GridFieldCell extends StatefulWidget { class GridFieldCell extends StatefulWidget {
final FieldContext cellContext; final String viewId;
final FieldInfo fieldInfo;
const GridFieldCell({ const GridFieldCell({
Key? key, super.key,
required this.cellContext, required this.viewId,
}) : super(key: key); required this.fieldInfo,
});
@override @override
State<GridFieldCell> createState() => _GridFieldCellState(); State<GridFieldCell> createState() => _GridFieldCellState();
} }
class _GridFieldCellState extends State<GridFieldCell> { class _GridFieldCellState extends State<GridFieldCell> {
late final FieldCellBloc _bloc;
late PopoverController popoverController; late PopoverController popoverController;
@override @override
void initState() { void initState() {
popoverController = PopoverController();
super.initState(); super.initState();
popoverController = PopoverController();
_bloc = FieldCellBloc(viewId: widget.viewId, fieldInfo: widget.fieldInfo);
}
@override
didUpdateWidget(covariant oldWidget) {
if (widget.fieldInfo != oldWidget.fieldInfo && !_bloc.isClosed) {
_bloc.add(FieldCellEvent.onFieldChanged(widget.fieldInfo));
}
super.didUpdateWidget(oldWidget);
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider.value(
create: (context) { value: _bloc,
return FieldCellBloc(fieldContext: widget.cellContext);
},
child: BlocBuilder<FieldCellBloc, FieldCellState>( child: BlocBuilder<FieldCellBloc, FieldCellState>(
builder: (context, state) { builder: (context, state) {
final button = AppFlowyPopover( final button = AppFlowyPopover(
@ -50,11 +60,12 @@ class _GridFieldCellState extends State<GridFieldCell> {
controller: popoverController, controller: popoverController,
popupBuilder: (BuildContext context) { popupBuilder: (BuildContext context) {
return GridFieldCellActionSheet( return GridFieldCellActionSheet(
cellContext: widget.cellContext, viewId: widget.viewId,
fieldInfo: widget.fieldInfo,
); );
}, },
child: FieldCellButton( child: FieldCellButton(
field: widget.cellContext.fieldInfo.field, field: widget.fieldInfo.field,
onTap: () => popoverController.show(), onTap: () => popoverController.show(),
), ),
); );
@ -78,6 +89,12 @@ class _GridFieldCellState extends State<GridFieldCell> {
), ),
); );
} }
@override
Future<void> dispose() async {
super.dispose();
await _bloc.close();
}
} }
class _GridHeaderCellContainer extends StatelessWidget { class _GridHeaderCellContainer extends StatelessWidget {

View File

@ -1,8 +1,8 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/plugins/database_view/application/field/field_action_sheet_bloc.dart'; import 'package:appflowy/plugins/database_view/application/field/field_action_sheet_bloc.dart';
import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart'; import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart'; import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart'; import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:appflowy_popover/appflowy_popover.dart';
@ -20,9 +20,13 @@ import '../../layout/sizes.dart';
import 'field_editor.dart'; import 'field_editor.dart';
class GridFieldCellActionSheet extends StatefulWidget { class GridFieldCellActionSheet extends StatefulWidget {
final FieldContext cellContext; final String viewId;
const GridFieldCellActionSheet({required this.cellContext, Key? key}) final FieldInfo fieldInfo;
: super(key: key); const GridFieldCellActionSheet({
required this.viewId,
required this.fieldInfo,
Key? key,
}) : super(key: key);
@override @override
State<StatefulWidget> createState() => _GridFieldCellActionSheetState(); State<StatefulWidget> createState() => _GridFieldCellActionSheetState();
@ -37,31 +41,35 @@ class _GridFieldCellActionSheetState extends State<GridFieldCellActionSheet> {
return SizedBox( return SizedBox(
width: 400, width: 400,
child: FieldEditor( child: FieldEditor(
viewId: widget.cellContext.viewId, viewId: widget.viewId,
fieldInfo: widget.cellContext.fieldInfo, fieldInfo: widget.fieldInfo,
typeOptionLoader: FieldTypeOptionLoader( typeOptionLoader: FieldTypeOptionLoader(
viewId: widget.cellContext.viewId, viewId: widget.viewId,
field: widget.cellContext.fieldInfo.field, field: widget.fieldInfo.field,
), ),
), ),
); );
} }
return BlocProvider( return BlocProvider(
create: (context) => create: (context) => FieldActionSheetBloc(
getIt<FieldActionSheetBloc>(param1: widget.cellContext), viewId: widget.viewId,
fieldInfo: widget.fieldInfo,
),
child: IntrinsicWidth( child: IntrinsicWidth(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
_EditFieldButton( _EditFieldButton(
cellContext: widget.cellContext,
onTap: () { onTap: () {
setState(() => _showFieldEditor = true); setState(() => _showFieldEditor = true);
}, },
), ),
VSpace(GridSize.typeOptionSeparatorHeight), VSpace(GridSize.typeOptionSeparatorHeight),
_FieldOperationList(widget.cellContext), _FieldOperationList(
viewId: widget.viewId,
fieldInfo: widget.fieldInfo,
),
], ],
), ),
), ),
@ -70,10 +78,8 @@ class _GridFieldCellActionSheetState extends State<GridFieldCellActionSheet> {
} }
class _EditFieldButton extends StatelessWidget { class _EditFieldButton extends StatelessWidget {
final FieldContext cellContext;
final void Function()? onTap; final void Function()? onTap;
const _EditFieldButton({required this.cellContext, Key? key, this.onTap}) const _EditFieldButton({Key? key, this.onTap}) : super(key: key);
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -96,8 +102,13 @@ class _EditFieldButton extends StatelessWidget {
} }
class _FieldOperationList extends StatelessWidget { class _FieldOperationList extends StatelessWidget {
final FieldContext fieldContext; final String viewId;
const _FieldOperationList(this.fieldContext, {Key? key}) : super(key: key); final FieldInfo fieldInfo;
const _FieldOperationList({
required this.viewId,
required this.fieldInfo,
Key? key,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -128,7 +139,7 @@ class _FieldOperationList extends StatelessWidget {
bool enable = true; bool enable = true;
// If the field is primary, delete and duplicate are disabled. // If the field is primary, delete and duplicate are disabled.
if (fieldContext.fieldInfo.isPrimary) { if (fieldInfo.isPrimary) {
switch (action) { switch (action) {
case FieldAction.hide: case FieldAction.hide:
break; break;
@ -145,7 +156,8 @@ class _FieldOperationList extends StatelessWidget {
child: SizedBox( child: SizedBox(
height: GridSize.popoverItemHeight, height: GridSize.popoverItemHeight,
child: FieldActionCell( child: FieldActionCell(
fieldInfo: fieldContext, viewId: viewId,
fieldInfo: fieldInfo,
action: action, action: action,
enable: enable, enable: enable,
), ),
@ -155,11 +167,13 @@ class _FieldOperationList extends StatelessWidget {
} }
class FieldActionCell extends StatelessWidget { class FieldActionCell extends StatelessWidget {
final FieldContext fieldInfo; final String viewId;
final FieldInfo fieldInfo;
final FieldAction action; final FieldAction action;
final bool enable; final bool enable;
const FieldActionCell({ const FieldActionCell({
required this.viewId,
required this.fieldInfo, required this.fieldInfo,
required this.action, required this.action,
required this.enable, required this.enable,
@ -177,7 +191,7 @@ class FieldActionCell extends StatelessWidget {
? AFThemeExtension.of(context).textColor ? AFThemeExtension.of(context).textColor
: Theme.of(context).disabledColor, : Theme.of(context).disabledColor,
), ),
onTap: () => action.run(context, fieldInfo), onTap: () => action.run(context, viewId, fieldInfo),
leftIcon: FlowySvg( leftIcon: FlowySvg(
action.icon(), action.icon(),
color: enable color: enable
@ -217,7 +231,7 @@ extension _FieldActionExtension on FieldAction {
} }
} }
void run(BuildContext context, FieldContext fieldContext) { void run(BuildContext context, String viewId, FieldInfo fieldInfo) {
switch (this) { switch (this) {
case FieldAction.hide: case FieldAction.hide:
context context
@ -228,8 +242,8 @@ extension _FieldActionExtension on FieldAction {
PopoverContainer.of(context).close(); PopoverContainer.of(context).close();
FieldBackendService( FieldBackendService(
viewId: fieldContext.viewId, viewId: viewId,
fieldId: fieldContext.fieldInfo.id, fieldId: fieldInfo.id,
).duplicateField(); ).duplicateField();
break; break;
@ -240,8 +254,8 @@ extension _FieldActionExtension on FieldAction {
title: LocaleKeys.grid_field_deleteFieldPromptMessage.tr(), title: LocaleKeys.grid_field_deleteFieldPromptMessage.tr(),
confirm: () { confirm: () {
FieldBackendService( FieldBackendService(
viewId: fieldContext.viewId, viewId: viewId,
fieldId: fieldContext.fieldInfo.field.id, fieldId: fieldInfo.field.id,
).deleteField(); ).deleteField();
}, },
).show(context); ).show(context);

View File

@ -1,10 +1,8 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/database_view/application/field/field_controller.dart'; import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart'; import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
import 'package:appflowy/plugins/database_view/grid/application/grid_header_bloc.dart'; import 'package:appflowy/plugins/database_view/grid/application/grid_header_bloc.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy_backend/log.dart'; import 'package:appflowy_backend/log.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:appflowy_popover/appflowy_popover.dart';
@ -42,9 +40,9 @@ class _GridHeaderSliverAdaptorState extends State<GridHeaderSliverAdaptor> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider(
create: (context) { create: (context) {
return getIt<GridHeaderBloc>( return GridHeaderBloc(
param1: widget.viewId, viewId: widget.viewId,
param2: widget.fieldController, fieldController: widget.fieldController,
)..add(const GridHeaderEvent.initial()); )..add(const GridHeaderEvent.initial());
}, },
child: BlocBuilder<GridHeaderBloc, GridHeaderState>( child: BlocBuilder<GridHeaderBloc, GridHeaderState>(
@ -96,15 +94,10 @@ class _GridHeaderState extends State<_GridHeader> {
builder: (context, state) { builder: (context, state) {
final cells = state.fields final cells = state.fields
.map( .map(
(field) => FieldContext( (fieldInfo) => GridFieldCell(
key: _getKeyById(fieldInfo.id),
viewId: widget.viewId, viewId: widget.viewId,
fieldInfo: field, fieldInfo: fieldInfo,
),
)
.map(
(ctx) => GridFieldCell(
key: _getKeyById(ctx.fieldInfo.id),
cellContext: ctx,
), ),
) )
.toList(); .toList();
@ -136,7 +129,7 @@ class _GridHeaderState extends State<_GridHeader> {
int newIndex, int newIndex,
) { ) {
if (cells.length > oldIndex) { if (cells.length > oldIndex) {
final field = cells[oldIndex].cellContext.fieldInfo.field; final field = cells[oldIndex].fieldInfo.field;
context context
.read<GridHeaderBloc>() .read<GridHeaderBloc>()
.add(GridHeaderEvent.moveField(field, oldIndex, newIndex)); .add(GridHeaderEvent.moveField(field, oldIndex, newIndex));

View File

@ -276,7 +276,7 @@ class RowContent extends StatelessWidget {
final GridCellWidget child = builder.build(cellId); final GridCellWidget child = builder.build(cellId);
return CellContainer( return CellContainer(
width: cellId.fieldInfo.field.width.toDouble(), width: cellId.fieldInfo.fieldSettings?.width.toDouble() ?? 140,
isPrimary: cellId.fieldInfo.field.isPrimary, isPrimary: cellId.fieldInfo.field.isPrimary,
cellContainerNotifier: CellContainerNotifier(child), cellContainerNotifier: CellContainerNotifier(child),
accessoryBuilder: (buildContext) { accessoryBuilder: (buildContext) {

View File

@ -6,7 +6,6 @@ import 'package:appflowy/plugins/database_view/application/field/field_info.dart
import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart'; import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
import 'package:appflowy/plugins/database_view/application/setting/property_bloc.dart'; import 'package:appflowy/plugins/database_view/application/setting/property_bloc.dart';
import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart'; import 'package:appflowy/plugins/database_view/grid/presentation/widgets/header/field_type_extension.dart';
import 'package:appflowy/startup/startup.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
@ -40,9 +39,9 @@ class _DatabasePropertyListState extends State<DatabasePropertyList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider(
create: (context) => getIt<DatabasePropertyBloc>( create: (context) => DatabasePropertyBloc(
param1: widget.viewId, viewId: widget.viewId,
param2: widget.fieldController, fieldController: widget.fieldController,
)..add(const DatabasePropertyEvent.initial()), )..add(const DatabasePropertyEvent.initial()),
child: BlocBuilder<DatabasePropertyBloc, DatabasePropertyState>( child: BlocBuilder<DatabasePropertyBloc, DatabasePropertyState>(
builder: (context, state) { builder: (context, state) {

View File

@ -1,11 +1,6 @@
import 'package:appflowy/core/config/kv.dart'; import 'package:appflowy/core/config/kv.dart';
import 'package:appflowy/core/network_monitor.dart'; import 'package:appflowy/core/network_monitor.dart';
import 'package:appflowy/env/env.dart'; import 'package:appflowy/env/env.dart';
import 'package:appflowy/plugins/database_view/application/field/field_action_sheet_bloc.dart';
import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
import 'package:appflowy/plugins/database_view/application/setting/property_bloc.dart';
import 'package:appflowy/plugins/database_view/grid/application/grid_header_bloc.dart';
import 'package:appflowy/plugins/document/application/prelude.dart'; import 'package:appflowy/plugins/document/application/prelude.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/copy_and_paste/clipboard_service.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/copy_and_paste/clipboard_service.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/openai_client.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/openai_client.dart';
@ -48,7 +43,7 @@ class DependencyResolver {
_resolveHomeDeps(getIt); _resolveHomeDeps(getIt);
_resolveFolderDeps(getIt); _resolveFolderDeps(getIt);
_resolveDocDeps(getIt); _resolveDocDeps(getIt);
_resolveGridDeps(getIt); // _resolveGridDeps(getIt);
_resolveCommonService(getIt, mode); _resolveCommonService(getIt, mode);
} }
} }
@ -218,21 +213,3 @@ void _resolveDocDeps(GetIt getIt) {
(view, _) => DocumentBloc(view: view), (view, _) => DocumentBloc(view: view),
); );
} }
void _resolveGridDeps(GetIt getIt) {
getIt.registerFactoryParam<GridHeaderBloc, String, FieldController>(
(viewId, fieldController) => GridHeaderBloc(
viewId: viewId,
fieldController: fieldController,
),
);
getIt.registerFactoryParam<FieldActionSheetBloc, FieldContext, void>(
(data, _) => FieldActionSheetBloc(fieldCellContext: data),
);
getIt.registerFactoryParam<DatabasePropertyBloc, String, FieldController>(
(viewId, cache) =>
DatabasePropertyBloc(viewId: viewId, fieldController: cache),
);
}

View File

@ -3,7 +3,6 @@ import 'package:appflowy/plugins/database_view/application/cell/cell_controller_
import 'package:appflowy/plugins/database_view/application/field/field_controller.dart'; import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
import 'package:appflowy/plugins/database_view/application/field/field_editor_bloc.dart'; import 'package:appflowy/plugins/database_view/application/field/field_editor_bloc.dart';
import 'package:appflowy/plugins/database_view/application/field/field_info.dart'; import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart'; import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
import 'package:appflowy/plugins/database_view/application/row/row_cache.dart'; import 'package:appflowy/plugins/database_view/application/row/row_cache.dart';
import 'package:appflowy/plugins/database_view/application/row/row_controller.dart'; import 'package:appflowy/plugins/database_view/application/row/row_controller.dart';
@ -141,11 +140,6 @@ class BoardTestContext {
return fieldInfo; return fieldInfo;
} }
FieldContext singleSelectFieldCellContext() {
final fieldInfo = singleSelectFieldContext();
return FieldContext(viewId: gridView.id, fieldInfo: fieldInfo);
}
FieldInfo textFieldContext() { FieldInfo textFieldContext() {
final fieldInfo = fieldContexts final fieldInfo = fieldContexts
.firstWhere((element) => element.fieldType == FieldType.RichText); .firstWhere((element) => element.fieldType == FieldType.RichText);

View File

@ -1,5 +1,4 @@
import 'package:appflowy/plugins/database_view/application/field/field_cell_bloc.dart'; import 'package:appflowy/plugins/database_view/application/field/field_cell_bloc.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
@ -23,11 +22,9 @@ void main() {
blocTest( blocTest(
'update field width', 'update field width',
build: () => FieldCellBloc( build: () => FieldCellBloc(
fieldContext: FieldContext(
fieldInfo: context.fieldContexts[0], fieldInfo: context.fieldContexts[0],
viewId: context.gridView.id, viewId: context.gridView.id,
), ),
)..add(const FieldCellEvent.initial()),
act: (bloc) { act: (bloc) {
width = bloc.state.width; width = bloc.state.width;
bloc.add(const FieldCellEvent.onResizeStart()); bloc.add(const FieldCellEvent.onResizeStart());
@ -42,11 +39,9 @@ void main() {
blocTest( blocTest(
'field width should not be lesser than 50px', 'field width should not be lesser than 50px',
build: () => FieldCellBloc( build: () => FieldCellBloc(
fieldContext: FieldContext(
fieldInfo: context.fieldContexts[0],
viewId: context.gridView.id, viewId: context.gridView.id,
fieldInfo: context.fieldContexts[0],
), ),
)..add(const FieldCellEvent.initial()),
act: (bloc) { act: (bloc) {
bloc.add(const FieldCellEvent.onResizeStart()); bloc.add(const FieldCellEvent.onResizeStart());
bloc.add(const FieldCellEvent.startUpdateWidth(-110)); bloc.add(const FieldCellEvent.startUpdateWidth(-110));

View File

@ -18,7 +18,8 @@ void main() {
setUp(() async { setUp(() async {
context = await gridTest.createTestGrid(); context = await gridTest.createTestGrid();
actionSheetBloc = FieldActionSheetBloc( actionSheetBloc = FieldActionSheetBloc(
fieldCellContext: context.singleSelectFieldCellContext(), viewId: context.gridView.id,
fieldInfo: context.singleSelectFieldContext(),
); );
}); });

View File

@ -3,7 +3,6 @@ import 'package:appflowy/plugins/database_view/application/cell/cell_controller_
import 'package:appflowy/plugins/database_view/application/field/field_controller.dart'; import 'package:appflowy/plugins/database_view/application/field/field_controller.dart';
import 'package:appflowy/plugins/database_view/application/field/field_editor_bloc.dart'; import 'package:appflowy/plugins/database_view/application/field/field_editor_bloc.dart';
import 'package:appflowy/plugins/database_view/application/field/field_info.dart'; import 'package:appflowy/plugins/database_view/application/field/field_info.dart';
import 'package:appflowy/plugins/database_view/application/field/field_service.dart';
import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart'; import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_context.dart';
import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_service.dart'; import 'package:appflowy/plugins/database_view/application/field/type_option/type_option_service.dart';
import 'package:appflowy/plugins/database_view/application/row/row_cache.dart'; import 'package:appflowy/plugins/database_view/application/row/row_cache.dart';
@ -88,11 +87,6 @@ class GridTestContext {
return fieldInfo; return fieldInfo;
} }
FieldContext singleSelectFieldCellContext() {
final fieldInfo = singleSelectFieldContext();
return FieldContext(viewId: gridView.id, fieldInfo: fieldInfo);
}
FieldInfo textFieldContext() { FieldInfo textFieldContext() {
final fieldInfo = fieldContexts final fieldInfo = fieldContexts
.firstWhere((element) => element.fieldType == FieldType.RichText); .firstWhere((element) => element.fieldType == FieldType.RichText);

View File

@ -521,13 +521,6 @@ impl FieldType {
self.clone().into() self.clone().into()
} }
pub fn default_cell_width(&self) -> i32 {
match self {
FieldType::DateTime | FieldType::LastEditedTime | FieldType::CreatedTime => 180,
_ => 150,
}
}
pub fn default_name(&self) -> String { pub fn default_name(&self) -> String {
let s = match self { let s = match self {
FieldType::RichText => "Text", FieldType::RichText => "Text",

View File

@ -15,6 +15,9 @@ pub struct FieldSettingsPB {
#[pb(index = 2)] #[pb(index = 2)]
pub visibility: FieldVisibility, pub visibility: FieldVisibility,
#[pb(index = 3)]
pub width: i32,
} }
impl From<FieldSettings> for FieldSettingsPB { impl From<FieldSettings> for FieldSettingsPB {
@ -22,6 +25,7 @@ impl From<FieldSettings> for FieldSettingsPB {
Self { Self {
field_id: value.field_id, field_id: value.field_id,
visibility: value.visibility, visibility: value.visibility,
width: value.width,
} }
} }
} }
@ -99,6 +103,9 @@ pub struct FieldSettingsChangesetPB {
#[pb(index = 3, one_of)] #[pb(index = 3, one_of)]
pub visibility: Option<FieldVisibility>, pub visibility: Option<FieldVisibility>,
#[pb(index = 4, one_of)]
pub width: Option<i32>,
} }
impl From<FieldSettingsChangesetParams> for FieldSettingsChangesetPB { impl From<FieldSettingsChangesetParams> for FieldSettingsChangesetPB {
@ -107,6 +114,7 @@ impl From<FieldSettingsChangesetParams> for FieldSettingsChangesetPB {
view_id: value.view_id, view_id: value.view_id,
field_id: value.field_id, field_id: value.field_id,
visibility: value.visibility, visibility: value.visibility,
width: value.width,
} }
} }
} }
@ -119,6 +127,7 @@ impl TryFrom<FieldSettingsChangesetPB> for FieldSettingsChangesetParams {
view_id: value.view_id, view_id: value.view_id,
field_id: value.field_id, field_id: value.field_id,
visibility: value.visibility, visibility: value.visibility,
width: value.width,
}) })
} }
} }

View File

@ -892,10 +892,8 @@ pub(crate) async fn get_field_settings_handler(
let (view_id, field_ids) = data.into_inner().try_into()?; let (view_id, field_ids) = data.into_inner().try_into()?;
let database_editor = manager.get_database_with_view_id(&view_id).await?; let database_editor = manager.get_database_with_view_id(&view_id).await?;
let layout_ty = database_editor.get_layout_type(view_id.as_ref()).await;
let field_settings = database_editor let field_settings = database_editor
.get_field_settings(&view_id, layout_ty, field_ids.clone()) .get_field_settings(&view_id, field_ids.clone())
.await? .await?
.into_iter() .into_iter()
.map(FieldSettingsPB::from) .map(FieldSettingsPB::from)
@ -915,10 +913,8 @@ pub(crate) async fn get_all_field_settings_handler(
let view_id = data.into_inner(); let view_id = data.into_inner();
let database_editor = manager.get_database_with_view_id(view_id.as_ref()).await?; let database_editor = manager.get_database_with_view_id(view_id.as_ref()).await?;
let layout_ty = database_editor.get_layout_type(view_id.as_ref()).await;
let field_settings = database_editor let field_settings = database_editor
.get_all_field_settings(view_id.as_ref(), layout_ty) .get_all_field_settings(view_id.as_ref())
.await? .await?
.into_iter() .into_iter()
.map(FieldSettingsPB::from) .map(FieldSettingsPB::from)

View File

@ -1090,57 +1090,27 @@ impl DatabaseEditor {
pub async fn get_field_settings( pub async fn get_field_settings(
&self, &self,
view_id: &str, view_id: &str,
layout_ty: DatabaseLayout,
field_ids: Vec<String>, field_ids: Vec<String>,
) -> FlowyResult<Vec<FieldSettings>> { ) -> FlowyResult<Vec<FieldSettings>> {
let view = self.database_views.get_view_editor(view_id).await?; let view = self.database_views.get_view_editor(view_id).await?;
let default_field_settings = default_field_settings_by_layout_map()
.get(&layout_ty)
.unwrap()
.to_owned();
let found_field_settings = view.v_get_field_settings(&field_ids).await; let field_settings = view
.v_get_field_settings(&field_ids)
let field_settings = field_ids .await
.into_iter() .into_values()
.map(|field_id| {
if let Some(field_settings) = found_field_settings.get(&field_id) {
field_settings.to_owned()
} else {
FieldSettings::try_from_anymap(field_id, default_field_settings.clone()).unwrap()
}
})
.collect(); .collect();
Ok(field_settings) Ok(field_settings)
} }
pub async fn get_all_field_settings( pub async fn get_all_field_settings(&self, view_id: &str) -> FlowyResult<Vec<FieldSettings>> {
&self, let field_ids = self
view_id: &str, .get_fields(view_id, None)
layout_ty: DatabaseLayout, .iter()
) -> FlowyResult<Vec<FieldSettings>> { .map(|field| field.id.clone())
let view = self.database_views.get_view_editor(view_id).await?;
let default_field_settings = default_field_settings_by_layout_map()
.get(&layout_ty)
.unwrap()
.to_owned();
let fields = self.get_fields(view_id, None);
let found_field_settings = view.v_get_all_field_settings().await;
let field_settings = fields
.into_iter()
.map(|field| {
if let Some(field_settings) = found_field_settings.get(&field.id) {
field_settings.to_owned()
} else {
FieldSettings::try_from_anymap(field.id, default_field_settings.clone()).unwrap()
}
})
.collect(); .collect();
Ok(field_settings) self.get_field_settings(view_id, field_ids).await
} }
pub async fn update_field_settings_with_changeset( pub async fn update_field_settings_with_changeset(
@ -1149,7 +1119,12 @@ impl DatabaseEditor {
) -> FlowyResult<()> { ) -> FlowyResult<()> {
let view = self.database_views.get_view_editor(&params.view_id).await?; let view = self.database_views.get_view_editor(&params.view_id).await?;
view view
.v_update_field_settings(&params.view_id, &params.field_id, params.visibility) .v_update_field_settings(
&params.view_id,
&params.field_id,
params.visibility,
params.width,
)
.await?; .await?;
Ok(()) Ok(())
@ -1417,38 +1392,37 @@ impl DatabaseViewOperation for DatabaseViewOperationImpl {
view_id: &str, view_id: &str,
field_ids: &[String], field_ids: &[String],
) -> HashMap<String, FieldSettings> { ) -> HashMap<String, FieldSettings> {
let field_settings_map = self let (layout_type, field_settings_map) = {
.database let database = self.database.lock();
.lock() let layout_type = database.views.get_database_view_layout(view_id);
.get_field_settings(view_id, Some(field_ids)); let field_settings_map = database.get_field_settings(view_id, Some(field_ids));
(layout_type, field_settings_map)
};
field_settings_map let default_field_settings = default_field_settings_by_layout_map()
.into_iter() .get(&layout_type)
.filter_map(|(field_id, field_settings)| { .unwrap()
let field_settings = FieldSettings::try_from_anymap(field_id.clone(), field_settings); .to_owned();
if let Ok(settings) = field_settings {
Some((field_id, settings)) let field_settings = field_ids
.iter()
.map(|field_id| {
if !field_settings_map.contains_key(field_id) {
let field_settings =
FieldSettings::from_anymap(field_id, layout_type, &default_field_settings);
(field_id.clone(), field_settings)
} else { } else {
None let field_settings = FieldSettings::from_anymap(
field_id,
layout_type,
field_settings_map.get(field_id).unwrap(),
);
(field_id.clone(), field_settings)
} }
}) })
.collect() .collect();
}
fn get_all_field_settings(&self, view_id: &str) -> HashMap<String, FieldSettings> { field_settings
let field_settings_map = self.database.lock().get_field_settings(view_id, None);
field_settings_map
.into_iter()
.filter_map(|(field_id, field_settings)| {
let field_settings = FieldSettings::try_from_anymap(field_id.clone(), field_settings);
if let Ok(settings) = field_settings {
Some((field_id, settings))
} else {
None
}
})
.collect()
} }
fn update_field_settings( fn update_field_settings(
@ -1456,25 +1430,29 @@ impl DatabaseViewOperation for DatabaseViewOperationImpl {
view_id: &str, view_id: &str,
field_id: &str, field_id: &str,
visibility: Option<FieldVisibility>, visibility: Option<FieldVisibility>,
width: Option<i32>,
) { ) {
let field_settings_map = self.get_field_settings(view_id, &[field_id.to_string()]); let field_settings_map = self.get_field_settings(view_id, &[field_id.to_string()]);
let new_field_settings = if let Some(field_settings) = field_settings_map.get(field_id) { let new_field_settings = if let Some(field_settings) = field_settings_map.get(field_id) {
let mut field_settings = field_settings.to_owned(); FieldSettings {
field_settings.visibility = visibility.unwrap_or(field_settings.visibility); field_id: field_settings.field_id.clone(),
field_settings visibility: visibility.unwrap_or(field_settings.visibility.clone()),
width: width.unwrap_or(field_settings.width),
}
} else { } else {
let layout_ty = self.get_layout_for_view(view_id); let layout_type = self.get_layout_for_view(view_id);
let mut field_settings = FieldSettings::try_from_anymap( let default_field_settings = default_field_settings_by_layout_map()
field_id.to_string(), .get(&layout_type)
default_field_settings_by_layout_map()
.get(&layout_ty)
.unwrap() .unwrap()
.to_owned(), .to_owned();
) let field_settings =
.unwrap(); FieldSettings::from_anymap(field_id, layout_type, &default_field_settings);
field_settings.visibility = visibility.unwrap_or(field_settings.visibility); FieldSettings {
field_settings field_id: field_settings.field_id.clone(),
visibility: visibility.unwrap_or(field_settings.visibility),
width: width.unwrap_or(field_settings.width),
}
}; };
self.database.lock().update_field_settings( self.database.lock().update_field_settings(

View File

@ -58,7 +58,9 @@ pub(crate) fn database_view_setting_pb_from_view(view: DatabaseView) -> Database
.field_settings .field_settings
.into_inner() .into_inner()
.into_iter() .into_iter()
.flat_map(|(field_id, field_settings)| FieldSettings::try_from_anymap(field_id, field_settings)) .map(|(field_id, field_settings)| {
FieldSettings::from_anymap(&field_id, view.layout, &field_settings)
})
.map(FieldSettingsPB::from) .map(FieldSettingsPB::from)
.collect::<Vec<FieldSettingsPB>>(); .collect::<Vec<FieldSettingsPB>>();

View File

@ -844,19 +844,20 @@ impl DatabaseViewEditor {
self.delegate.get_field_settings(&self.view_id, field_ids) self.delegate.get_field_settings(&self.view_id, field_ids)
} }
pub async fn v_get_all_field_settings(&self) -> HashMap<String, FieldSettings> { // pub async fn v_get_all_field_settings(&self) -> HashMap<String, FieldSettings> {
self.delegate.get_all_field_settings(&self.view_id) // self.delegate.get_all_field_settings(&self.view_id)
} // }
pub async fn v_update_field_settings( pub async fn v_update_field_settings(
&self, &self,
view_id: &str, view_id: &str,
field_id: &str, field_id: &str,
visibility: Option<FieldVisibility>, visibility: Option<FieldVisibility>,
width: Option<i32>,
) -> FlowyResult<()> { ) -> FlowyResult<()> {
self self
.delegate .delegate
.update_field_settings(view_id, field_id, visibility); .update_field_settings(view_id, field_id, visibility, width);
Ok(()) Ok(())
} }

View File

@ -115,12 +115,11 @@ pub trait DatabaseViewOperation: Send + Sync + 'static {
field_ids: &[String], field_ids: &[String],
) -> HashMap<String, FieldSettings>; ) -> HashMap<String, FieldSettings>;
fn get_all_field_settings(&self, view_id: &str) -> HashMap<String, FieldSettings>;
fn update_field_settings( fn update_field_settings(
&self, &self,
view_id: &str, view_id: &str,
field_id: &str, field_id: &str,
visibility: Option<FieldVisibility>, visibility: Option<FieldVisibility>,
width: Option<i32>,
); );
} }

View File

@ -15,7 +15,7 @@ impl FieldBuilder {
field_type.clone().into(), field_type.clone().into(),
false, false,
); );
field.width = field_type.default_cell_width() as i64; field.width = 150;
field field
.type_options .type_options
.insert(field_type.to_string(), type_option_data.into()); .insert(field_type.to_string(), type_option_data.into());

View File

@ -1,32 +1,42 @@
use anyhow::bail;
use collab::core::any_map::AnyMapExtension; use collab::core::any_map::AnyMapExtension;
use collab_database::views::{FieldSettingsMap, FieldSettingsMapBuilder}; use collab_database::views::{DatabaseLayout, FieldSettingsMap, FieldSettingsMapBuilder};
use crate::entities::FieldVisibility; use crate::entities::FieldVisibility;
use crate::services::field_settings::default_field_visibility;
/// Stores the field settings for a single field /// Stores the field settings for a single field
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct FieldSettings { pub struct FieldSettings {
pub field_id: String, pub field_id: String,
pub visibility: FieldVisibility, pub visibility: FieldVisibility,
pub width: i32,
} }
pub const VISIBILITY: &str = "visibility"; pub const VISIBILITY: &str = "visibility";
pub const WIDTH: &str = "width";
pub const DEFAULT_WIDTH: i32 = 150;
impl FieldSettings { impl FieldSettings {
pub fn try_from_anymap( pub fn from_anymap(
field_id: String, field_id: &str,
field_settings: FieldSettingsMap, layout_type: DatabaseLayout,
) -> Result<Self, anyhow::Error> { field_settings: &FieldSettingsMap,
let visibility = match field_settings.get_i64_value(VISIBILITY) { ) -> Self {
Some(visbility) => visbility.into(), let visibility = field_settings
_ => bail!("Invalid field settings data"), .get_i64_value(VISIBILITY)
}; .map(Into::into)
.unwrap_or_else(|| default_field_visibility(layout_type));
let width = field_settings
.get_i64_value(WIDTH)
.map(|value| value as i32)
.unwrap_or(DEFAULT_WIDTH);
Ok(Self { Self {
field_id, field_id: field_id.to_string(),
visibility, visibility,
}) width,
}
} }
} }
@ -34,14 +44,16 @@ impl From<FieldSettings> for FieldSettingsMap {
fn from(field_settings: FieldSettings) -> Self { fn from(field_settings: FieldSettings) -> Self {
FieldSettingsMapBuilder::new() FieldSettingsMapBuilder::new()
.insert_i64_value(VISIBILITY, field_settings.visibility.into()) .insert_i64_value(VISIBILITY, field_settings.visibility.into())
.insert_i64_value(WIDTH, field_settings.width as i64)
.build() .build()
} }
} }
/// Contains the changeset to a field's settings. /// Contains the changeset to a field's settings.
/// A `Some` value for constitutes a change in that particular setting /// A `Some` value constitutes a change in that particular setting
pub struct FieldSettingsChangesetParams { pub struct FieldSettingsChangesetParams {
pub view_id: String, pub view_id: String,
pub field_id: String, pub field_id: String,
pub visibility: Option<FieldVisibility>, pub visibility: Option<FieldVisibility>,
pub width: Option<i32>,
} }

View File

@ -1,7 +1,5 @@
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::Arc;
use collab_database::database::MutexDatabase;
use collab_database::fields::Field; use collab_database::fields::Field;
use collab_database::views::{ use collab_database::views::{
DatabaseLayout, FieldSettingsByFieldIdMap, FieldSettingsMap, FieldSettingsMapBuilder, DatabaseLayout, FieldSettingsByFieldIdMap, FieldSettingsMap, FieldSettingsMapBuilder,
@ -14,7 +12,7 @@ use crate::services::field_settings::{FieldSettings, VISIBILITY};
/// Helper struct to create a new field setting /// Helper struct to create a new field setting
pub struct FieldSettingsBuilder { pub struct FieldSettingsBuilder {
field_settings: FieldSettings, inner: FieldSettings,
} }
impl FieldSettingsBuilder { impl FieldSettingsBuilder {
@ -22,58 +20,50 @@ impl FieldSettingsBuilder {
let field_settings = FieldSettings { let field_settings = FieldSettings {
field_id: field_id.to_string(), field_id: field_id.to_string(),
visibility: FieldVisibility::AlwaysShown, visibility: FieldVisibility::AlwaysShown,
width: 150,
}; };
Self { field_settings } Self {
inner: field_settings,
} }
pub fn field_id(mut self, field_id: &str) -> Self {
self.field_settings.field_id = field_id.to_string();
self
} }
pub fn visibility(mut self, visibility: FieldVisibility) -> Self { pub fn visibility(mut self, visibility: FieldVisibility) -> Self {
self.field_settings.visibility = visibility; self.inner.visibility = visibility;
self
}
pub fn width(mut self, width: i32) -> Self {
self.inner.width = width;
self self
} }
pub fn build(self) -> FieldSettings { pub fn build(self) -> FieldSettings {
self.field_settings self.inner
} }
} }
pub struct DatabaseFieldSettingsMapBuilder { #[inline]
pub fields: Vec<Field>, pub fn default_field_visibility(layout_type: DatabaseLayout) -> FieldVisibility {
pub database_layout: DatabaseLayout, match layout_type {
} DatabaseLayout::Grid => FieldVisibility::AlwaysShown,
DatabaseLayout::Board => FieldVisibility::HideWhenEmpty,
impl DatabaseFieldSettingsMapBuilder { DatabaseLayout::Calendar => FieldVisibility::HideWhenEmpty,
pub fn new(fields: Vec<Field>, database_layout: DatabaseLayout) -> Self {
Self {
fields,
database_layout,
} }
} }
pub fn from_database(database: Arc<MutexDatabase>, database_layout: DatabaseLayout) -> Self { pub fn default_field_settings_for_fields(
let fields = database.lock().get_fields(None); fields: &Vec<Field>,
Self { layout_type: DatabaseLayout,
fields, ) -> FieldSettingsByFieldIdMap {
database_layout, fields
} .iter()
}
pub fn build(self) -> FieldSettingsByFieldIdMap {
self
.fields
.into_iter()
.map(|field| { .map(|field| {
let field_settings = field_settings_for_field(self.database_layout, &field); let field_settings = field_settings_for_field(layout_type, field);
(field.id, field_settings) (field.id.clone(), field_settings)
}) })
.collect::<HashMap<String, FieldSettingsMap>>() .collect::<HashMap<_, _>>()
.into() .into()
} }
}
pub fn field_settings_for_field( pub fn field_settings_for_field(
database_layout: DatabaseLayout, database_layout: DatabaseLayout,
@ -82,11 +72,7 @@ pub fn field_settings_for_field(
let visibility = if field.is_primary { let visibility = if field.is_primary {
FieldVisibility::AlwaysShown FieldVisibility::AlwaysShown
} else { } else {
match database_layout { default_field_visibility(database_layout)
DatabaseLayout::Grid => FieldVisibility::AlwaysShown,
DatabaseLayout::Board => FieldVisibility::HideWhenEmpty,
DatabaseLayout::Calendar => FieldVisibility::HideWhenEmpty,
}
}; };
FieldSettingsBuilder::new(&field.id) FieldSettingsBuilder::new(&field.id)
@ -98,11 +84,7 @@ pub fn field_settings_for_field(
pub fn default_field_settings_by_layout_map() -> HashMap<DatabaseLayout, FieldSettingsMap> { pub fn default_field_settings_by_layout_map() -> HashMap<DatabaseLayout, FieldSettingsMap> {
let mut map = HashMap::new(); let mut map = HashMap::new();
for layout_ty in DatabaseLayout::iter() { for layout_ty in DatabaseLayout::iter() {
let visibility = match layout_ty { let visibility = default_field_visibility(layout_ty);
DatabaseLayout::Grid => FieldVisibility::AlwaysShown,
DatabaseLayout::Board => FieldVisibility::HideWhenEmpty,
DatabaseLayout::Calendar => FieldVisibility::HideWhenEmpty,
};
let field_settings = FieldSettingsMapBuilder::new() let field_settings = FieldSettingsMapBuilder::new()
.insert_i64_value(VISIBILITY, visibility.into()) .insert_i64_value(VISIBILITY, visibility.into())
.build(); .build();

View File

@ -9,7 +9,7 @@ use flowy_error::{FlowyError, FlowyResult};
use crate::entities::FieldType; use crate::entities::FieldType;
use crate::services::field::{default_type_option_data_from_type, CELL_DATA}; use crate::services::field::{default_type_option_data_from_type, CELL_DATA};
use crate::services::field_settings::DatabaseFieldSettingsMapBuilder; use crate::services::field_settings::default_field_settings_for_fields;
use crate::services::share::csv::CSVFormat; use crate::services::share::csv::CSVFormat;
#[derive(Default)] #[derive(Default)]
@ -97,8 +97,7 @@ fn database_from_fields_and_rows(
}) })
.collect::<Vec<Field>>(); .collect::<Vec<Field>>();
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Grid);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Grid).build();
let created_rows = rows let created_rows = rows
.iter() .iter()

View File

@ -7,7 +7,7 @@ use crate::services::cell::{insert_select_option_cell, insert_text_cell};
use crate::services::field::{ use crate::services::field::{
FieldBuilder, SelectOption, SelectOptionColor, SingleSelectTypeOption, FieldBuilder, SelectOption, SelectOptionColor, SingleSelectTypeOption,
}; };
use crate::services::field_settings::DatabaseFieldSettingsMapBuilder; use crate::services::field_settings::default_field_settings_for_fields;
use crate::services::setting::{BoardLayoutSetting, CalendarLayoutSetting}; use crate::services::setting::{BoardLayoutSetting, CalendarLayoutSetting};
pub fn make_default_grid(view_id: &str, name: &str) -> CreateDatabaseParams { pub fn make_default_grid(view_id: &str, name: &str) -> CreateDatabaseParams {
@ -29,8 +29,7 @@ pub fn make_default_grid(view_id: &str, name: &str) -> CreateDatabaseParams {
let fields = vec![text_field, single_select, checkbox_field]; let fields = vec![text_field, single_select, checkbox_field];
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Grid);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Grid).build();
CreateDatabaseParams { CreateDatabaseParams {
database_id: gen_database_id(), database_id: gen_database_id(),
@ -90,8 +89,7 @@ pub fn make_default_board(view_id: &str, name: &str) -> CreateDatabaseParams {
let fields = vec![text_field, single_select]; let fields = vec![text_field, single_select];
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Board);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Board).build();
let mut layout_settings = LayoutSettings::default(); let mut layout_settings = LayoutSettings::default();
layout_settings.insert(DatabaseLayout::Board, BoardLayoutSetting::new().into()); layout_settings.insert(DatabaseLayout::Board, BoardLayoutSetting::new().into());
@ -134,8 +132,7 @@ pub fn make_default_calendar(view_id: &str, name: &str) -> CreateDatabaseParams
let fields = vec![text_field, date_field, multi_select_field]; let fields = vec![text_field, date_field, multi_select_field];
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Calendar);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Calendar).build();
let mut layout_settings = LayoutSettings::default(); let mut layout_settings = LayoutSettings::default();
layout_settings.insert( layout_settings.insert(

View File

@ -1,4 +1,3 @@
use collab_database::views::DatabaseLayout;
use flowy_database2::entities::FieldVisibility; use flowy_database2::entities::FieldVisibility;
use flowy_database2::services::field_settings::FieldSettingsChangesetParams; use flowy_database2::services::field_settings::FieldSettingsChangesetParams;
@ -8,16 +7,17 @@ use crate::database::database_editor::DatabaseEditorTest;
pub enum FieldSettingsScript { pub enum FieldSettingsScript {
AssertFieldSettings { AssertFieldSettings {
field_ids: Vec<String>, field_ids: Vec<String>,
layout_ty: DatabaseLayout,
visibility: FieldVisibility, visibility: FieldVisibility,
width: i32,
}, },
AssertAllFieldSettings { AssertAllFieldSettings {
layout_ty: DatabaseLayout,
visibility: FieldVisibility, visibility: FieldVisibility,
width: i32,
}, },
UpdateFieldSettings { UpdateFieldSettings {
field_id: String, field_id: String,
visibility: Option<FieldVisibility>, visibility: Option<FieldVisibility>,
width: Option<i32>,
}, },
} }
@ -51,41 +51,42 @@ impl FieldSettingsTest {
match script { match script {
FieldSettingsScript::AssertFieldSettings { FieldSettingsScript::AssertFieldSettings {
field_ids, field_ids,
layout_ty,
visibility, visibility,
width,
} => { } => {
let field_settings = self let field_settings = self
.editor .editor
.get_field_settings(&self.view_id, layout_ty, field_ids) .get_field_settings(&self.view_id, field_ids)
.await .await
.unwrap(); .unwrap();
for field_settings in field_settings.into_iter() { for field_settings in field_settings.into_iter() {
assert_eq!(field_settings.visibility, visibility) assert_eq!(field_settings.width, width);
assert_eq!(field_settings.visibility, visibility);
} }
}, },
FieldSettingsScript::AssertAllFieldSettings { FieldSettingsScript::AssertAllFieldSettings { visibility, width } => {
layout_ty,
visibility,
} => {
let field_settings = self let field_settings = self
.editor .editor
.get_all_field_settings(&self.view_id, layout_ty) .get_all_field_settings(&self.view_id)
.await .await
.unwrap(); .unwrap();
for field_settings in field_settings.into_iter() { for field_settings in field_settings.into_iter() {
assert_eq!(field_settings.visibility, visibility) assert_eq!(field_settings.width, width);
assert_eq!(field_settings.visibility, visibility);
} }
}, },
FieldSettingsScript::UpdateFieldSettings { FieldSettingsScript::UpdateFieldSettings {
field_id, field_id,
visibility, visibility,
width,
} => { } => {
let params = FieldSettingsChangesetParams { let params = FieldSettingsChangesetParams {
view_id: self.view_id.clone(), view_id: self.view_id.clone(),
field_id, field_id,
visibility, visibility,
width,
}; };
let _ = self let _ = self
.editor .editor

View File

@ -1,6 +1,6 @@
use collab_database::views::DatabaseLayout;
use flowy_database2::entities::FieldType; use flowy_database2::entities::FieldType;
use flowy_database2::entities::FieldVisibility; use flowy_database2::entities::FieldVisibility;
use flowy_database2::services::field_settings::DEFAULT_WIDTH;
use crate::database::field_settings_test::script::FieldSettingsScript::*; use crate::database::field_settings_test::script::FieldSettingsScript::*;
use crate::database::field_settings_test::script::FieldSettingsTest; use crate::database::field_settings_test::script::FieldSettingsTest;
@ -10,8 +10,8 @@ use crate::database::field_settings_test::script::FieldSettingsTest;
async fn get_default_field_settings() { async fn get_default_field_settings() {
let mut test = FieldSettingsTest::new_grid().await; let mut test = FieldSettingsTest::new_grid().await;
let scripts = vec![AssertAllFieldSettings { let scripts = vec![AssertAllFieldSettings {
layout_ty: DatabaseLayout::Grid,
visibility: FieldVisibility::AlwaysShown, visibility: FieldVisibility::AlwaysShown,
width: DEFAULT_WIDTH,
}]; }];
test.run_scripts(scripts).await; test.run_scripts(scripts).await;
@ -26,13 +26,13 @@ async fn get_default_field_settings() {
let scripts = vec![ let scripts = vec![
AssertFieldSettings { AssertFieldSettings {
field_ids: non_primary_field_ids.clone(), field_ids: non_primary_field_ids.clone(),
layout_ty: DatabaseLayout::Board,
visibility: FieldVisibility::HideWhenEmpty, visibility: FieldVisibility::HideWhenEmpty,
width: DEFAULT_WIDTH,
}, },
AssertFieldSettings { AssertFieldSettings {
field_ids: vec![primary_field_id.clone()], field_ids: vec![primary_field_id.clone()],
layout_ty: DatabaseLayout::Board,
visibility: FieldVisibility::AlwaysShown, visibility: FieldVisibility::AlwaysShown,
width: DEFAULT_WIDTH,
}, },
]; ];
test.run_scripts(scripts).await; test.run_scripts(scripts).await;
@ -48,13 +48,13 @@ async fn get_default_field_settings() {
let scripts = vec![ let scripts = vec![
AssertFieldSettings { AssertFieldSettings {
field_ids: non_primary_field_ids.clone(), field_ids: non_primary_field_ids.clone(),
layout_ty: DatabaseLayout::Calendar,
visibility: FieldVisibility::HideWhenEmpty, visibility: FieldVisibility::HideWhenEmpty,
width: DEFAULT_WIDTH,
}, },
AssertFieldSettings { AssertFieldSettings {
field_ids: vec![primary_field_id.clone()], field_ids: vec![primary_field_id.clone()],
layout_ty: DatabaseLayout::Calendar,
visibility: FieldVisibility::AlwaysShown, visibility: FieldVisibility::AlwaysShown,
width: DEFAULT_WIDTH,
}, },
]; ];
test.run_scripts(scripts).await; test.run_scripts(scripts).await;
@ -75,21 +75,22 @@ async fn update_field_settings_test() {
let scripts = vec![ let scripts = vec![
AssertFieldSettings { AssertFieldSettings {
field_ids: non_primary_field_ids, field_ids: non_primary_field_ids,
layout_ty: DatabaseLayout::Board,
visibility: FieldVisibility::HideWhenEmpty, visibility: FieldVisibility::HideWhenEmpty,
width: DEFAULT_WIDTH,
}, },
AssertFieldSettings { AssertFieldSettings {
field_ids: vec![primary_field_id.clone()], field_ids: vec![primary_field_id.clone()],
layout_ty: DatabaseLayout::Board,
visibility: FieldVisibility::AlwaysShown, visibility: FieldVisibility::AlwaysShown,
width: DEFAULT_WIDTH,
}, },
UpdateFieldSettings { UpdateFieldSettings {
field_id: primary_field_id, field_id: primary_field_id,
visibility: Some(FieldVisibility::HideWhenEmpty), visibility: Some(FieldVisibility::HideWhenEmpty),
width: None,
}, },
AssertAllFieldSettings { AssertAllFieldSettings {
layout_ty: DatabaseLayout::Board,
visibility: FieldVisibility::HideWhenEmpty, visibility: FieldVisibility::HideWhenEmpty,
width: DEFAULT_WIDTH,
}, },
]; ];
test.run_scripts(scripts).await; test.run_scripts(scripts).await;

View File

@ -1,6 +1,6 @@
use collab_database::database::{gen_database_id, gen_database_view_id, gen_row_id, DatabaseData}; use collab_database::database::{gen_database_id, gen_database_view_id, gen_row_id, DatabaseData};
use collab_database::views::{DatabaseLayout, DatabaseView, LayoutSetting, LayoutSettings}; use collab_database::views::{DatabaseLayout, DatabaseView, LayoutSetting, LayoutSettings};
use flowy_database2::services::field_settings::DatabaseFieldSettingsMapBuilder; use flowy_database2::services::field_settings::default_field_settings_for_fields;
use flowy_database2::services::setting::BoardLayoutSetting; use flowy_database2::services::setting::BoardLayoutSetting;
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
@ -131,8 +131,7 @@ pub fn make_test_board() -> DatabaseData {
let board_setting: LayoutSetting = BoardLayoutSetting::new().into(); let board_setting: LayoutSetting = BoardLayoutSetting::new().into();
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Board);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Board).build();
// We have many assumptions base on the number of the rows, so do not change the number of the loop. // We have many assumptions base on the number of the rows, so do not change the number of the loop.
for i in 0..5 { for i in 0..5 {

View File

@ -1,6 +1,6 @@
use collab_database::database::{gen_database_id, gen_database_view_id, gen_row_id, DatabaseData}; use collab_database::database::{gen_database_id, gen_database_view_id, gen_row_id, DatabaseData};
use collab_database::views::{DatabaseLayout, DatabaseView, LayoutSetting, LayoutSettings}; use collab_database::views::{DatabaseLayout, DatabaseView, LayoutSetting, LayoutSettings};
use flowy_database2::services::field_settings::DatabaseFieldSettingsMapBuilder; use flowy_database2::services::field_settings::default_field_settings_for_fields;
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use flowy_database2::entities::FieldType; use flowy_database2::entities::FieldType;
@ -40,8 +40,7 @@ pub fn make_test_calendar() -> DatabaseData {
let calendar_setting: LayoutSetting = CalendarLayoutSetting::new(date_field_id).into(); let calendar_setting: LayoutSetting = CalendarLayoutSetting::new(date_field_id).into();
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Calendar);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Calendar).build();
for i in 0..5 { for i in 0..5 {
let mut row_builder = TestRowBuilder::new(gen_row_id(), &fields); let mut row_builder = TestRowBuilder::new(gen_row_id(), &fields);

View File

@ -1,6 +1,6 @@
use collab_database::database::{gen_database_id, gen_database_view_id, gen_row_id, DatabaseData}; use collab_database::database::{gen_database_id, gen_database_view_id, gen_row_id, DatabaseData};
use collab_database::views::{DatabaseLayout, DatabaseView}; use collab_database::views::{DatabaseLayout, DatabaseView};
use flowy_database2::services::field_settings::DatabaseFieldSettingsMapBuilder; use flowy_database2::services::field_settings::default_field_settings_for_fields;
use strum::IntoEnumIterator; use strum::IntoEnumIterator;
use flowy_database2::entities::FieldType; use flowy_database2::entities::FieldType;
@ -131,8 +131,7 @@ pub fn make_test_grid() -> DatabaseData {
} }
} }
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Grid);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Grid).build();
for i in 0..7 { for i in 0..7 {
let mut row_builder = TestRowBuilder::new(gen_row_id(), &fields); let mut row_builder = TestRowBuilder::new(gen_row_id(), &fields);
@ -297,8 +296,7 @@ pub fn make_no_date_test_grid() -> DatabaseData {
} }
} }
let field_settings = let field_settings = default_field_settings_for_fields(&fields, DatabaseLayout::Grid);
DatabaseFieldSettingsMapBuilder::new(fields.clone(), DatabaseLayout::Grid).build();
for i in 0..3 { for i in 0..3 {
let mut row_builder = TestRowBuilder::new(gen_row_id(), &fields); let mut row_builder = TestRowBuilder::new(gen_row_id(), &fields);