Services are now sorted by the 'weight' field.

* Default for discovered services is 0
* Default weight for configured services is their index within their
  group scaled by 100, i.e. (index + 1) * 100
* Should be backwards compatible with current loose ordering
pull/873/head
James Wynn 2 years ago
parent 5ecb9466ae
commit 8d016629d3

@ -13,6 +13,17 @@ import {
} from "utils/config/service-helpers"; } from "utils/config/service-helpers";
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers"; import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
/**
* Compares services by weight then by name.
*/
function compareServices(service1, service2) {
const comp = service1.weight - service2.weight;
if (comp !== 0) {
return comp;
}
return service1.name.localeCompare(service2.name);
}
export async function bookmarksResponse() { export async function bookmarksResponse() {
checkAndCopyConfig("bookmarks.yaml"); checkAndCopyConfig("bookmarks.yaml");
@ -112,7 +123,8 @@ export async function servicesResponse() {
...discoveredDockerGroup.services, ...discoveredDockerGroup.services,
...discoveredKubernetesGroup.services, ...discoveredKubernetesGroup.services,
...configuredGroup.services ...configuredGroup.services
].filter((service) => service), ].filter((service) => service)
.sort(compareServices),
}; };
if (definedLayouts) { if (definedLayouts) {

@ -33,6 +33,15 @@ export async function servicesFromConfig() {
})), })),
})); }));
// add default weight to services based on their position in the configuration
servicesArray.forEach((group, groupIndex) => {
group.services.forEach((service, serviceIndex) => {
if(!service.weight) {
servicesArray[groupIndex].services[serviceIndex].weight = (serviceIndex + 1) * 100;
}
});
});
return servicesArray; return servicesArray;
} }
@ -152,6 +161,7 @@ export async function servicesFromKubernetes() {
href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress), href: ingress.metadata.annotations[`${ANNOTATION_BASE}/href`] || getUrlFromIngress(ingress),
name: ingress.metadata.annotations[`${ANNOTATION_BASE}/name`] || ingress.metadata.name, name: ingress.metadata.annotations[`${ANNOTATION_BASE}/name`] || ingress.metadata.name,
group: ingress.metadata.annotations[`${ANNOTATION_BASE}/group`] || "Kubernetes", group: ingress.metadata.annotations[`${ANNOTATION_BASE}/group`] || "Kubernetes",
weight: ingress.metadata.annotations[`${ANNOTATION_BASE}/weight`] || '0',
icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '', icon: ingress.metadata.annotations[`${ANNOTATION_BASE}/icon`] || '',
description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '', description: ingress.metadata.annotations[`${ANNOTATION_BASE}/description`] || '',
}; };
@ -201,6 +211,17 @@ export function cleanServiceGroups(groups) {
name: serviceGroup.name, name: serviceGroup.name,
services: serviceGroup.services.map((service) => { services: serviceGroup.services.map((service) => {
const cleanedService = { ...service }; const cleanedService = { ...service };
if (typeof service.weight === 'string') {
const weight = parseInt(service.weight, 10);
if (Number.isNaN(weight)) {
cleanedService.weight = 0;
} else {
cleanedService.weight = weight;
}
}
if (typeof cleanedService.weight !== "number") {
cleanedService.weight = 0;
}
if (cleanedService.widget) { if (cleanedService.widget) {
// whitelisted set of keys to pass to the frontend // whitelisted set of keys to pass to the frontend

Loading…
Cancel
Save