Submit
Path:
~
/
/
usr
/
share
/
grafana
/
public
/
app
/
features
/
plugins
/
admin
/
state
/
File Content:
selectors.ts
import { createSelector } from '@reduxjs/toolkit'; import { PluginError, PluginType, unEscapeStringFromRegex } from '@grafana/data'; import { filterByKeyword } from '../helpers'; import { RequestStatus, PluginCatalogStoreState } from '../types'; import { pluginsAdapter } from './reducer'; export const selectRoot = (state: PluginCatalogStoreState) => state.plugins; export const selectItems = createSelector(selectRoot, ({ items }) => items); export const selectDisplayMode = createSelector(selectRoot, ({ settings }) => settings.displayMode); export const { selectAll, selectById } = pluginsAdapter.getSelectors(selectItems); export type PluginFilters = { // Searches for a string in certain fields (e.g. "name" or "orgName") // (Note: this will be an escaped regex string as it comes from `FilterInput`) keyword?: string; // (Optional, only applied if set) type?: PluginType; // (Optional, only applied if set) isInstalled?: boolean; // (Optional, only applied if set) isEnterprise?: boolean; }; export const selectPlugins = (filters: PluginFilters) => createSelector(selectAll, (plugins) => { const keyword = filters.keyword ? unEscapeStringFromRegex(filters.keyword.toLowerCase()) : ''; const filteredPluginIds = keyword !== '' ? filterByKeyword(plugins, keyword) : null; return plugins.filter((plugin) => { if (keyword && filteredPluginIds == null) { return false; } if (keyword && !filteredPluginIds?.includes(plugin.id)) { return false; } if (filters.type && plugin.type !== filters.type) { return false; } if (filters.isInstalled !== undefined && plugin.isInstalled !== filters.isInstalled) { return false; } if (filters.isEnterprise !== undefined && plugin.isEnterprise !== filters.isEnterprise) { return false; } return true; }); }); export const selectPluginErrors = (filterByPluginType?: PluginType) => createSelector(selectAll, (plugins) => { const pluginErrors: PluginError[] = []; for (const plugin of plugins) { if (plugin.error && (!filterByPluginType || plugin.type === filterByPluginType)) { pluginErrors.push({ pluginId: plugin.id, errorCode: plugin.error, pluginType: plugin.type, }); } } return pluginErrors; }); // The following selectors are used to get information about the outstanding or completed plugins-related network requests. export const selectRequest = (actionType: string) => createSelector(selectRoot, ({ requests = {} }) => requests[actionType]); export const selectIsRequestPending = (actionType: string) => createSelector(selectRequest(actionType), (request) => request?.status === RequestStatus.Pending); export const selectRequestError = (actionType: string) => createSelector(selectRequest(actionType), (request) => request?.status === RequestStatus.Rejected ? request?.error : null ); export const selectIsRequestNotFetched = (actionType: string) => createSelector(selectRequest(actionType), (request) => request === undefined);
Edit
Rename
Chmod
Delete
FILE
FOLDER
INFO
Name
Size
Permission
Action
actions.ts
9228 bytes
0644
hooks.ts
4993 bytes
0644
reducer.ts
4279 bytes
0644
selectors.test.ts
2881 bytes
0644
selectors.ts
3133 bytes
0644
N4ST4R_ID | Naxtarrr