reorder method
Reorders the model
to have the newOrdinal
value for ordinal
This will automatically change the ordinal value for the other T
in
map. This will also automatically update repository
Implementation
Future<Iterable<T>> reorder(
T model,
int newOrdinal, {
String? databaseName,
}) async {
final list = defaultOrderedKeyList;
final checkedOrdinal = min(newOrdinal, list.length);
final initialOrdinal = list.indexOf(model.id!);
if (checkedOrdinal == initialOrdinal) {
return [];
}
final updatedModels = <T>{};
for (var i = 0; i < list.length; i++) {
final pastOldIndex = i >= initialOrdinal;
final pastNewIndex = i >= checkedOrdinal;
if (!pastOldIndex && !pastNewIndex) {
continue;
}
if (pastNewIndex && pastOldIndex) {
break;
}
final updatedModel = map[list[i]]!;
updatedModels.add(updatedModel);
if (pastNewIndex) {
updatedModel.ordinal = list.length - i - 2;
}
if (pastOldIndex) {
updatedModel.ordinal = list.length - i;
}
}
updatedModels.add(model);
model.ordinal = list.length -
checkedOrdinal -
(checkedOrdinal > initialOrdinal ? 0 : 1);
return Future.wait(
updatedModels.map((e) => updateModel(e, databaseName: databaseName)),
);
}