diff --git a/package.json b/package.json index d41a488b..9bb188d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "qryn-view", - "version": "0.28.0", + "version": "0.28.1", "description": "Data Explorer UI for qryn", "repository": { "type": "git", diff --git a/packages/main/plugins/Cardinality/Configurator.tsx b/packages/main/plugins/Cardinality/Configurator.tsx index f4e23930..71f41906 100644 --- a/packages/main/plugins/Cardinality/Configurator.tsx +++ b/packages/main/plugins/Cardinality/Configurator.tsx @@ -57,7 +57,7 @@ const Configurator: React.FC = ({ useCardinalityStore(); const handleReset = () => { reset(); - localStorage.setItem("labelValuePairs","") + localStorage.setItem("labelValuePairs", ""); handleCardinalityRequest({ match: "", focusLabel: "", @@ -139,11 +139,17 @@ const Configurator: React.FC = ({ totalSeries.diff === 0 ? "none" : totalSeries.diff > 0 - ? "up" - : "down" + ? "up" + : "down" } text={"diff"} /> +
diff --git a/packages/main/plugins/Cardinality/SeriesRow.tsx b/packages/main/plugins/Cardinality/SeriesRow.tsx index e731760d..e0d415bf 100644 --- a/packages/main/plugins/Cardinality/SeriesRow.tsx +++ b/packages/main/plugins/Cardinality/SeriesRow.tsx @@ -27,6 +27,7 @@ export type SeriesRowProps = { export type QuotaCellProps = { quota: number; + cardinality: number; isQuotaWarning: boolean; }; @@ -52,13 +53,17 @@ export const QuotaSquare = (isWarning: boolean) => css` } `; -export const QuotaCell = ({ quota, isQuotaWarning }: QuotaCellProps) => { +export const QuotaCell = ({ + quota, + cardinality, + isQuotaWarning, +}: QuotaCellProps) => { return (
@@ -71,7 +76,9 @@ export const QuotaCell = ({ quota, isQuotaWarning }: QuotaCellProps) => { />
-

{quota}

+

+ {calcQuotaOverCardinality(cardinality, quota)}% +

); }; @@ -113,7 +120,11 @@ const SeriesRow: React.FC = ({ {hasShare && }
- +
`${val ?? 0 }`, }, + quota: { + text: "Quota", + value : (val: string | number ) => `${val}` + } }; export const Totals: React.FC = ({ theme, diff --git a/packages/main/plugins/Cardinality/api/useCardinalityData.tsx b/packages/main/plugins/Cardinality/api/useCardinalityData.tsx index b425be0d..5082b741 100644 --- a/packages/main/plugins/Cardinality/api/useCardinalityData.tsx +++ b/packages/main/plugins/Cardinality/api/useCardinalityData.tsx @@ -85,6 +85,7 @@ export const useCardinalityData = (historyManager?, setHistoryItem?) => { amount: result.totalSeries, prev: result.totalSeriesPrev, diff: result.totalSeries - result.totalSeriesPrev, + quota: result?.quota || 0 }); setData({ diff --git a/packages/main/plugins/Cardinality/helpers.tsx b/packages/main/plugins/Cardinality/helpers.tsx index 0b1ed8ac..5657a681 100644 --- a/packages/main/plugins/Cardinality/helpers.tsx +++ b/packages/main/plugins/Cardinality/helpers.tsx @@ -342,11 +342,12 @@ export const getSeriesProps = (series: any, focusLabel?: string) => { }; export function calcQuotaOverCardinality(cardinality: number, quota: number) { - return (cardinality / quota) * 100 - 5; + if (quota === 0) return 0; + + return (cardinality * 100) / quota; } export function isQuotaWarning(quotaOverCardinality: number) { - - if(quotaOverCardinality === Infinity) return false + if (quotaOverCardinality === 0) return false; return quotaOverCardinality > 60; } diff --git a/packages/main/plugins/Cardinality/index.tsx b/packages/main/plugins/Cardinality/index.tsx index cadfadd4..7054cfbe 100644 --- a/packages/main/plugins/Cardinality/index.tsx +++ b/packages/main/plugins/Cardinality/index.tsx @@ -5,7 +5,7 @@ import { Cardinality } from "./Cardinality"; export const CardinalViewPlugin: Plugin = { - name: "Cardinal View", + name: "Cardinality View", section: "Query Item", id: nanoid(), Component: Cardinality, diff --git a/packages/main/plugins/Cardinality/store/CardinalityStore.tsx b/packages/main/plugins/Cardinality/store/CardinalityStore.tsx index 4d590bde..642f3fed 100644 --- a/packages/main/plugins/Cardinality/store/CardinalityStore.tsx +++ b/packages/main/plugins/Cardinality/store/CardinalityStore.tsx @@ -6,6 +6,7 @@ type CardinalityTotal = { amount: number; prev: number; diff: number; + quota: number; }; type TimeRange = { @@ -57,7 +58,7 @@ type CardinalityState = { }; const initialData = { - total: { amount: 0, prev: 0, diff: 0 }, + total: { amount: 0, prev: 0, diff: 0, quota: 0 }, date: dayjs().format(DATE_FORMAT), @@ -87,6 +88,7 @@ const useCardinalityStore = create((set) => ({ setIsUpdating: (isUpdating: boolean) => set(() => ({ isUpdating })), setTotal: (t: CardinalityTotal) => set(() => ({ total: t })), + setTimeSeriesSelector: (text: string) => set(() => ({ timeSeriesSelector: text })), setTimeRange: (timeRange: TimeRange) => set(() => ({ timeRange })), diff --git a/packages/main/plugins/PluginManagerFactory.tsx b/packages/main/plugins/PluginManagerFactory.tsx index 733469ba..05c4f1ca 100644 --- a/packages/main/plugins/PluginManagerFactory.tsx +++ b/packages/main/plugins/PluginManagerFactory.tsx @@ -52,7 +52,6 @@ export function LocalPluginsManagement() { if (!plugins[location]) { plugins[location] = []; } - if (!plugins[location]?.some((s: any) => s.name === plugin.name)) { plugins[location].push(plugin); localStorage.setItem("plugins", JSON.stringify(plugins)); @@ -171,10 +170,30 @@ export function PluginManagerFactory(locations: ILocations) { const lp = LocalPluginsManagement(); let localPlugins = lp.getAll(); - // const dispatch: any = store.dispatch + function registerPlugin(plugin: any, totalPlugins: Plugin[]) { + // check for registered plugins vs locally stored + if (totalPlugins?.length > 0) { + for (const existingPlugin of totalPlugins) { + const section = existingPlugin.section; + + if (localPlugins[section]) { + const totalPluginsFound = totalPlugins + .filter((pl) => pl.section === section) + .map(({ name }) => name); + + const filtered = localPlugins[section]?.filter( + (p) => !totalPluginsFound.includes(p.name) + ); + + if (filtered?.length > 0) { + filtered.forEach(({ section, name }) => { + lp.removePlugin(section, name); + }); + } + } + } + } - // add plugin to a specific location - function registerPlugin(plugin: any) { if (!plugins[plugin.section]) { plugins[plugin.section] = []; } @@ -195,7 +214,7 @@ export function PluginManagerFactory(locations: ILocations) { function registerPluginGlobally(plugin: any) { for (let location in locations) { if (location !== "Main") { - registerPlugin(plugin); + registerPlugin(plugin, plugins); } } } @@ -264,7 +283,7 @@ export const PluginManager = PluginManagerFactory(locations); export function initPlugins(plugins: Plugin[]) { plugins.forEach((plugin: any) => { if (plugin.visible) { - PluginManager.registerPlugin(plugin); + PluginManager.registerPlugin(plugin, plugins); } }); } diff --git a/packages/main/views/Main/helpers.ts b/packages/main/views/Main/helpers.ts index 3831bf1c..e61cbbaa 100644 --- a/packages/main/views/Main/helpers.ts +++ b/packages/main/views/Main/helpers.ts @@ -177,7 +177,7 @@ export async function checkLocalAPI( setResponseType(ResponseEnum.GO); LocalPluginsManagement().togglePluginVisibility( "Query Item", - "Cardinal View", + "Cardinality View", true ); @@ -186,12 +186,12 @@ export async function checkLocalAPI( setResponseType(ResponseEnum.NODE); LocalPluginsManagement().togglePluginVisibility( "Query Item", - "Cardinal View", + "Cardinality View", false ); LocalPluginsManagement().togglePlugin( "Query Item", - "Cardinal View", + "Cardinality View", false ) isReady = true;