35 lines
1.1 KiB
JavaScript
35 lines
1.1 KiB
JavaScript
export function resolveWorkspaceOrder(definitions, savedOrder) {
|
|
const defaults = Array.from(definitions || []);
|
|
const byId = new Map(defaults.map((definition) => [definition.id, definition]));
|
|
const resolved = [];
|
|
const seen = new Set();
|
|
|
|
if (Array.isArray(savedOrder)) {
|
|
savedOrder.forEach((workspaceId) => {
|
|
if (seen.has(workspaceId) || !byId.has(workspaceId)) return;
|
|
seen.add(workspaceId);
|
|
resolved.push(byId.get(workspaceId));
|
|
});
|
|
}
|
|
|
|
defaults.forEach((definition) => {
|
|
if (seen.has(definition.id)) return;
|
|
seen.add(definition.id);
|
|
resolved.push(definition);
|
|
});
|
|
return resolved;
|
|
}
|
|
|
|
export function moveWorkspaceOrder(workspaceIds, index, offset) {
|
|
if (!Array.isArray(workspaceIds) || !Number.isInteger(index) || !Number.isInteger(offset)) {
|
|
return null;
|
|
}
|
|
const target = index + offset;
|
|
if (index < 0 || index >= workspaceIds.length || target < 0 || target >= workspaceIds.length) {
|
|
return null;
|
|
}
|
|
const moved = [...workspaceIds];
|
|
[moved[index], moved[target]] = [moved[target], moved[index]];
|
|
return moved;
|
|
}
|