mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
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:
parent
2b684ae7bf
commit
4d82bb5322
@ -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>(
|
||||||
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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 +
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
@ -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(),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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",
|
||||||
|
@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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(¶ms.view_id).await?;
|
let view = self.database_views.get_view_editor(¶ms.view_id).await?;
|
||||||
view
|
view
|
||||||
.v_update_field_settings(¶ms.view_id, ¶ms.field_id, params.visibility)
|
.v_update_field_settings(
|
||||||
|
¶ms.view_id,
|
||||||
|
¶ms.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(
|
||||||
|
@ -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>>();
|
||||||
|
|
||||||
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
@ -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>,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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()
|
||||||
|
@ -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(
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user