2022-02-21 09:25:47 -06:00
|
|
|
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
2022-04-22 08:33:13 -05:00
|
|
|
|
2022-01-28 04:06:52 -06:00
|
|
|
import { NavModelItem } from '@grafana/data';
|
2022-07-05 08:06:07 -05:00
|
|
|
import { config } from '@grafana/runtime';
|
2022-01-28 04:06:52 -06:00
|
|
|
|
2023-04-14 03:43:11 -05:00
|
|
|
import { getNavSubTitle, getNavTitle } from '../components/AppChrome/MegaMenu/navBarItem-translations';
|
2023-02-08 07:15:37 -06:00
|
|
|
|
2022-05-23 10:45:46 -05:00
|
|
|
export const initialState: NavModelItem[] = config.bootData?.navTree ?? [];
|
2022-01-28 04:06:52 -06:00
|
|
|
|
2023-02-08 07:15:37 -06:00
|
|
|
function translateNav(navTree: NavModelItem[]): NavModelItem[] {
|
|
|
|
return navTree.map((navItem) => {
|
|
|
|
const children = navItem.children && translateNav(navItem.children);
|
|
|
|
|
|
|
|
return {
|
|
|
|
...navItem,
|
|
|
|
children: children,
|
|
|
|
text: getNavTitle(navItem.id) ?? navItem.text,
|
|
|
|
subTitle: getNavSubTitle(navItem.id) ?? navItem.subTitle,
|
|
|
|
emptyMessage: getNavTitle(navItem.emptyMessageId),
|
|
|
|
};
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2022-12-09 06:54:00 -06:00
|
|
|
// this matches the prefix set in the backend navtree
|
|
|
|
export const ID_PREFIX = 'starred/';
|
|
|
|
|
2022-01-28 04:06:52 -06:00
|
|
|
const navTreeSlice = createSlice({
|
|
|
|
name: 'navBarTree',
|
2023-02-08 07:15:37 -06:00
|
|
|
initialState: () => translateNav(config.bootData?.navTree ?? []),
|
2022-02-21 09:25:47 -06:00
|
|
|
reducers: {
|
2022-05-23 10:45:46 -05:00
|
|
|
setStarred: (state, action: PayloadAction<{ id: string; title: string; url: string; isStarred: boolean }>) => {
|
|
|
|
const starredItems = state.find((navItem) => navItem.id === 'starred');
|
|
|
|
const { id, title, url, isStarred } = action.payload;
|
2022-06-27 09:41:00 -05:00
|
|
|
if (starredItems) {
|
|
|
|
if (isStarred) {
|
|
|
|
if (!starredItems.children) {
|
|
|
|
starredItems.children = [];
|
|
|
|
}
|
|
|
|
const newStarredItem: NavModelItem = {
|
2022-12-09 06:54:00 -06:00
|
|
|
id: ID_PREFIX + id,
|
2022-06-27 09:41:00 -05:00
|
|
|
text: title,
|
|
|
|
url,
|
|
|
|
};
|
|
|
|
starredItems.children.push(newStarredItem);
|
|
|
|
starredItems.children.sort((a, b) => a.text.localeCompare(b.text));
|
|
|
|
} else {
|
2022-12-09 06:54:00 -06:00
|
|
|
const index = starredItems.children?.findIndex((item) => item.id === ID_PREFIX + id) ?? -1;
|
2022-06-27 09:41:00 -05:00
|
|
|
if (index > -1) {
|
|
|
|
starredItems?.children?.splice(index, 1);
|
|
|
|
}
|
2022-05-23 10:45:46 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
updateDashboardName: (state, action: PayloadAction<{ id: string; title: string; url: string }>) => {
|
|
|
|
const { id, title, url } = action.payload;
|
|
|
|
const starredItems = state.find((navItem) => navItem.id === 'starred');
|
2022-06-27 09:41:00 -05:00
|
|
|
if (starredItems) {
|
|
|
|
const navItem = starredItems.children?.find((navItem) => navItem.id === id);
|
|
|
|
if (navItem) {
|
|
|
|
navItem.text = title;
|
|
|
|
navItem.url = url;
|
|
|
|
starredItems.children?.sort((a, b) => a.text.localeCompare(b.text));
|
|
|
|
}
|
2022-05-23 10:45:46 -05:00
|
|
|
}
|
2022-02-21 09:25:47 -06:00
|
|
|
},
|
2023-03-02 02:50:01 -06:00
|
|
|
removePluginFromNavTree: (state, action: PayloadAction<{ pluginID: string }>) => {
|
|
|
|
const navID = 'plugin-page-' + action.payload.pluginID;
|
|
|
|
const pluginItemIndex = state.findIndex((navItem) => navItem.id === navID);
|
|
|
|
if (pluginItemIndex > -1) {
|
|
|
|
state.splice(pluginItemIndex, 1);
|
|
|
|
}
|
|
|
|
},
|
2022-02-21 09:25:47 -06:00
|
|
|
},
|
2022-01-28 04:06:52 -06:00
|
|
|
});
|
|
|
|
|
2023-03-02 02:50:01 -06:00
|
|
|
export const { setStarred, removePluginFromNavTree, updateDashboardName } = navTreeSlice.actions;
|
2022-01-28 04:06:52 -06:00
|
|
|
export const navTreeReducer = navTreeSlice.reducer;
|