mirror of
https://github.com/grafana/grafana.git
synced 2025-02-11 08:05:43 -06:00
* navtree.go: update Data sources title and subtitle * DataSourceList: move add button to header * DataSourcesList: add buttons to items The action buttons are added inside `<Card.Tags>` so that they end up at the right end of the card, as it was designed. The "Build a Dashboard" button's functionality is not defined yet. * DataSourcesListHeader: add sort picker * fix css * tests: look for the updated "Add new data source" text * tests: use an async test method to verify component updates are wrapped in an act() * update e2e selector for add data source button * fix DataSourceList{,Page} tests * add comment for en dash character * simplify sorting * add link to Build a Dashboard button * fix test * test build a dashboard and explore buttons * test sorting data source elements * DataSourceAddButton: hide button when user has no permission * PageActionBar: remove unneeded '?' * DataSourcesList: hide explore button if user has no permission * DataSourcesListPage.test: make setup prop explicit * DataSourcesList: use theme.spacing * datasources: assure explore url includes appSubUrl * fix tests and add test case for missing permissions Co-authored-by: Levente Balogh <balogh.levente.hu@gmail.com>
57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
import { DataSourceJsonData, DataSourceSettings, urlUtil, locationUtil } from '@grafana/data';
|
|
|
|
interface ItemWithName {
|
|
name: string;
|
|
}
|
|
|
|
export function nameExits(dataSources: ItemWithName[], name: string) {
|
|
return (
|
|
dataSources.filter((dataSource) => {
|
|
return dataSource.name.toLowerCase() === name.toLowerCase();
|
|
}).length > 0
|
|
);
|
|
}
|
|
|
|
export function findNewName(dataSources: ItemWithName[], name: string) {
|
|
// Need to loop through current data sources to make sure
|
|
// the name doesn't exist
|
|
while (nameExits(dataSources, name)) {
|
|
// If there's a duplicate name that doesn't end with '-x'
|
|
// we can add -1 to the name and be done.
|
|
if (!nameHasSuffix(name)) {
|
|
name = `${name}-1`;
|
|
} else {
|
|
// if there's a duplicate name that ends with '-x'
|
|
// we can try to increment the last digit until the name is unique
|
|
|
|
// remove the 'x' part and replace it with the new number
|
|
name = `${getNewName(name)}${incrementLastDigit(getLastDigit(name))}`;
|
|
}
|
|
}
|
|
|
|
return name;
|
|
}
|
|
|
|
function nameHasSuffix(name: string) {
|
|
return name.endsWith('-', name.length - 1);
|
|
}
|
|
|
|
function getLastDigit(name: string) {
|
|
return parseInt(name.slice(-1), 10);
|
|
}
|
|
|
|
function incrementLastDigit(digit: number) {
|
|
return isNaN(digit) ? 1 : digit + 1;
|
|
}
|
|
|
|
function getNewName(name: string) {
|
|
return name.slice(0, name.length - 1);
|
|
}
|
|
|
|
export const constructDataSourceExploreUrl = (dataSource: DataSourceSettings<DataSourceJsonData, {}>) => {
|
|
const exploreState = JSON.stringify({ datasource: dataSource.name, context: 'explore' });
|
|
const exploreUrl = urlUtil.renderUrl(locationUtil.assureBaseUrl('/explore'), { left: exploreState });
|
|
|
|
return exploreUrl;
|
|
};
|