193 lines
5.2 KiB
Dart
Raw Normal View History

import 'dart:typed_data';
import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/protobuf.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_result/appflowy_result.dart';
2022-03-24 17:09:05 +08:00
/// FieldService provides many field-related interfaces event functions. Check out
/// `rust-lib/flowy-database/event_map.rs` for a list of events and their
/// implementations.
class FieldBackendService {
FieldBackendService({required this.viewId, required this.fieldId});
final String viewId;
2022-05-09 14:59:26 +08:00
final String fieldId;
2022-03-24 17:09:05 +08:00
/// Create a field in a database view. The position will only be applicable
/// in this view; for other views it will be appended to the end
static Future<FlowyResult<FieldPB, FlowyError>> createField({
required String viewId,
FieldType fieldType = FieldType.RichText,
String? fieldName,
Uint8List? typeOptionData,
OrderObjectPositionPB? position,
}) {
final payload = CreateFieldPayloadPB(
viewId: viewId,
fieldType: fieldType,
fieldName: fieldName,
typeOptionData: typeOptionData,
fieldPosition: position,
);
return DatabaseEventCreateField(payload).send();
}
2022-03-24 17:09:05 +08:00
/// Reorder a field within a database view
static Future<FlowyResult<void, FlowyError>> moveField({
required String viewId,
required String fromFieldId,
required String toFieldId,
}) {
final payload = MoveFieldPayloadPB(
viewId: viewId,
fromFieldId: fromFieldId,
toFieldId: toFieldId,
);
2022-04-15 19:56:44 +08:00
return DatabaseEventMoveField(payload).send();
2022-04-15 19:56:44 +08:00
}
/// Delete a field
static Future<FlowyResult<void, FlowyError>> deleteField({
required String viewId,
required String fieldId,
}) {
final payload = DeleteFieldPayloadPB(
viewId: viewId,
fieldId: fieldId,
);
return DatabaseEventDeleteField(payload).send();
}
// Clear all data of all cells in a Field
static Future<FlowyResult<void, FlowyError>> clearField({
required String viewId,
required String fieldId,
}) {
final payload = ClearFieldPayloadPB(
viewId: viewId,
fieldId: fieldId,
);
return DatabaseEventClearField(payload).send();
}
/// Duplicate a field
static Future<FlowyResult<void, FlowyError>> duplicateField({
required String viewId,
required String fieldId,
}) {
final payload = DuplicateFieldPayloadPB(viewId: viewId, fieldId: fieldId);
return DatabaseEventDuplicateField(payload).send();
}
/// Update a field's properties
Future<FlowyResult<void, FlowyError>> updateField({
2022-03-27 09:35:10 +08:00
String? name,
bool? frozen,
}) {
final payload = FieldChangesetPB.create()
..viewId = viewId
2022-03-27 11:14:21 +08:00
..fieldId = fieldId;
2022-03-27 09:35:10 +08:00
if (name != null) {
payload.name = name;
}
if (frozen != null) {
payload.frozen = frozen;
}
return DatabaseEventUpdateField(payload).send();
2022-03-27 09:35:10 +08:00
}
/// Change a field's type
static Future<FlowyResult<void, FlowyError>> updateFieldType({
required String viewId,
required String fieldId,
required FieldType fieldType,
}) {
final payload = UpdateFieldTypePayloadPB()
..viewId = viewId
..fieldId = fieldId
..fieldType = fieldType;
return DatabaseEventUpdateFieldType(payload).send();
}
/// Update a field's type option data
static Future<FlowyResult<void, FlowyError>> updateFieldTypeOption({
required String viewId,
2022-05-10 09:33:34 +08:00
required String fieldId,
required List<int> typeOptionData,
}) {
final payload = TypeOptionChangesetPB.create()
..viewId = viewId
2022-05-10 09:33:34 +08:00
..fieldId = fieldId
..typeOptionData = typeOptionData;
return DatabaseEventUpdateFieldTypeOption(payload).send();
2022-05-10 09:33:34 +08:00
}
/// Returns the primary field of the view.
static Future<FlowyResult<FieldPB, FlowyError>> getPrimaryField({
required String viewId,
}) {
final payload = DatabaseViewIdPB.create()..value = viewId;
return DatabaseEventGetPrimaryField(payload).send();
}
Future<FlowyResult<FieldPB, FlowyError>> createBefore({
FieldType fieldType = FieldType.RichText,
String? fieldName,
Uint8List? typeOptionData,
}) {
return createField(
viewId: viewId,
fieldType: fieldType,
fieldName: fieldName,
typeOptionData: typeOptionData,
position: OrderObjectPositionPB(
position: OrderObjectPositionTypePB.Before,
objectId: fieldId,
),
);
}
Future<FlowyResult<FieldPB, FlowyError>> createAfter({
FieldType fieldType = FieldType.RichText,
String? fieldName,
Uint8List? typeOptionData,
}) {
return createField(
viewId: viewId,
fieldType: fieldType,
fieldName: fieldName,
typeOptionData: typeOptionData,
position: OrderObjectPositionPB(
position: OrderObjectPositionTypePB.After,
objectId: fieldId,
),
);
}
Future<FlowyResult<void, FlowyError>> updateType({
required FieldType fieldType,
}) =>
updateFieldType(
viewId: viewId,
fieldId: fieldId,
fieldType: fieldType,
);
Future<FlowyResult<void, FlowyError>> delete() =>
deleteField(viewId: viewId, fieldId: fieldId);
Future<FlowyResult<void, FlowyError>> duplicate() =>
duplicateField(viewId: viewId, fieldId: fieldId);
2022-03-24 17:09:05 +08:00
}