45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import fractionalIndex from "fractional-index";
|
|
import naturalSort from "@shared/utils/naturalSort";
|
|
import { Collection } from "@server/models";
|
|
|
|
export default async function collectionIndexing(teamId: string) {
|
|
const collections = await Collection.findAll({
|
|
where: {
|
|
teamId,
|
|
deletedAt: null,
|
|
},
|
|
//no point in maintaining index of deleted collections.
|
|
attributes: ["id", "index", "name"],
|
|
});
|
|
|
|
let sortableCollections: [Collection, string | null][] = collections.map(
|
|
(collection) => {
|
|
return [collection, collection.index];
|
|
}
|
|
);
|
|
|
|
sortableCollections = naturalSort(
|
|
sortableCollections,
|
|
(collection) => collection[0].name
|
|
);
|
|
|
|
//for each collection with null index, use previous collection index to create new index
|
|
let previousCollectionIndex = null;
|
|
|
|
for (const collection of sortableCollections) {
|
|
if (collection[1] === null) {
|
|
const index = fractionalIndex(previousCollectionIndex, collection[1]);
|
|
collection[0].index = index;
|
|
await collection[0].save();
|
|
}
|
|
|
|
previousCollectionIndex = collection[0].index;
|
|
}
|
|
|
|
const indexedCollections = {};
|
|
sortableCollections.forEach((collection) => {
|
|
indexedCollections[collection[0].id] = collection[0].index;
|
|
});
|
|
return indexedCollections;
|
|
}
|