| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 | import 'package:dartz/dartz.dart';import 'package:flowy_sdk/dispatch/dispatch.dart';import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';import 'package:flowy_sdk/protobuf/flowy-grid/grid_entities.pb.dart';import 'package:flutter/foundation.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),/// you can find the corresponding event implementation in event_map.rs of the corresponding crate.////// You could check out the rust-lib/flowy-grid/event_map.rs for more information.class FieldService {  final String gridId;  final String fieldId;  FieldService({required this.gridId, required this.fieldId});  Future<Either<Unit, FlowyError>> moveField(int fromIndex, int toIndex) {    final payload = MoveFieldPayloadPB.create()      ..gridId = gridId      ..fieldId = fieldId      ..fromIndex = fromIndex      ..toIndex = toIndex;    return GridEventMoveField(payload).send();  }  Future<Either<Unit, FlowyError>> updateField({    String? name,    FieldType? fieldType,    bool? frozen,    bool? visibility,    double? width,    List<int>? typeOptionData,  }) {    var payload = FieldChangesetPayloadPB.create()      ..gridId = gridId      ..fieldId = fieldId;    if (name != null) {      payload.name = name;    }    if (fieldType != null) {      payload.fieldType = fieldType;    }    if (frozen != null) {      payload.frozen = frozen;    }    if (visibility != null) {      payload.visibility = visibility;    }    if (width != null) {      payload.width = width.toInt();    }    if (typeOptionData != null) {      payload.typeOptionData = typeOptionData;    }    return GridEventUpdateField(payload).send();  }  // Create the field if it does not exist. Otherwise, update the field.  static Future<Either<Unit, FlowyError>> insertField({    required String gridId,    required FieldPB field,    List<int>? typeOptionData,    String? startFieldId,  }) {    var payload = InsertFieldPayloadPB.create()      ..gridId = gridId      ..field_2 = field      ..typeOptionData = typeOptionData ?? [];    if (startFieldId != null) {      payload.startFieldId = startFieldId;    }    return GridEventInsertField(payload).send();  }  static Future<Either<Unit, FlowyError>> updateFieldTypeOption({    required String gridId,    required String fieldId,    required List<int> typeOptionData,  }) {    var payload = UpdateFieldTypeOptionPayloadPB.create()      ..gridId = gridId      ..fieldId = fieldId      ..typeOptionData = typeOptionData;    return GridEventUpdateFieldTypeOption(payload).send();  }  Future<Either<Unit, FlowyError>> deleteField() {    final payload = DeleteFieldPayloadPB.create()      ..gridId = gridId      ..fieldId = fieldId;    return GridEventDeleteField(payload).send();  }  Future<Either<Unit, FlowyError>> duplicateField() {    final payload = DuplicateFieldPayloadPB.create()      ..gridId = gridId      ..fieldId = fieldId;    return GridEventDuplicateField(payload).send();  }  Future<Either<FieldTypeOptionDataPB, FlowyError>> getFieldTypeOptionData({    required FieldType fieldType,  }) {    final payload = FieldTypeOptionIdPB.create()      ..gridId = gridId      ..fieldId = fieldId      ..fieldType = fieldType;    return GridEventGetFieldTypeOption(payload).send().then((result) {      return result.fold(        (data) => left(data),        (err) => right(err),      );    });  }}@freezedclass GridFieldCellContext with _$GridFieldCellContext {  const factory GridFieldCellContext({    required String gridId,    required FieldPB field,  }) = _GridFieldCellContext;}
 |