andoncloud-metrics-pie-chart-widget 1.2.7 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/thumbnail.svg +28 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/thumbnail-CkKtIgEU.js +6 -0
- package/dist/thumbnail-CkKtIgEU.js.map +1 -0
- package/package.json +14 -14
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180" fill="none">
|
|
2
|
+
<!-- Donut chart (r=55, circumference=345.6) -->
|
|
3
|
+
<!-- Slice 1: 42% = 145.1 -->
|
|
4
|
+
<circle cx="210" cy="90" r="55" fill="none" stroke="#1976d2" stroke-width="18" stroke-dasharray="145.1 200.5" stroke-dashoffset="0" transform="rotate(-90 210 90)"/>
|
|
5
|
+
<!-- Slice 2: 25% = 86.4 -->
|
|
6
|
+
<circle cx="210" cy="90" r="55" fill="none" stroke="#90caf9" stroke-width="18" stroke-dasharray="86.4 259.2" stroke-dashoffset="-145.1" transform="rotate(-90 210 90)"/>
|
|
7
|
+
<!-- Slice 3: 19% = 65.7 -->
|
|
8
|
+
<circle cx="210" cy="90" r="55" fill="none" stroke="#11BD4C" stroke-width="18" stroke-dasharray="65.7 279.9" stroke-dashoffset="-231.5" transform="rotate(-90 210 90)"/>
|
|
9
|
+
<!-- Slice 4: 14% = 48.4 -->
|
|
10
|
+
<circle cx="210" cy="90" r="55" fill="none" stroke="#47484A" stroke-width="18" stroke-dasharray="48.4 297.2" stroke-dashoffset="-297.2" transform="rotate(-90 210 90)"/>
|
|
11
|
+
|
|
12
|
+
<!-- Legend -->
|
|
13
|
+
<rect x="12" y="46" width="10" height="10" rx="2" fill="#1976d2"/>
|
|
14
|
+
<rect x="28" y="49" width="56" height="4" rx="1" fill="#A7ADB6"/>
|
|
15
|
+
<text x="100" y="55" font-size="11" font-weight="600" font-family="Inter, system-ui" fill="#A7ADB6">42%</text>
|
|
16
|
+
|
|
17
|
+
<rect x="12" y="68" width="10" height="10" rx="2" fill="#90caf9"/>
|
|
18
|
+
<rect x="28" y="71" width="48" height="4" rx="1" fill="#A7ADB6"/>
|
|
19
|
+
<text x="100" y="77" font-size="11" font-weight="600" font-family="Inter, system-ui" fill="#A7ADB6">25%</text>
|
|
20
|
+
|
|
21
|
+
<rect x="12" y="90" width="10" height="10" rx="2" fill="#11BD4C"/>
|
|
22
|
+
<rect x="28" y="93" width="52" height="4" rx="1" fill="#A7ADB6"/>
|
|
23
|
+
<text x="100" y="99" font-size="11" font-weight="600" font-family="Inter, system-ui" fill="#A7ADB6">19%</text>
|
|
24
|
+
|
|
25
|
+
<rect x="12" y="112" width="10" height="10" rx="2" fill="#47484A"/>
|
|
26
|
+
<rect x="28" y="115" width="42" height="4" rx="1" fill="#A7ADB6"/>
|
|
27
|
+
<text x="100" y="121" font-size="11" font-weight="600" font-family="Inter, system-ui" fill="#A7ADB6">14%</text>
|
|
28
|
+
</svg>
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t as thumbnail_default } from "./thumbnail-CkKtIgEU.js";
|
|
1
2
|
import { BaseWidgetData, BaseWidgetSettings, FilterValues, ListMetricValues_MetricValue, ListMetrics_Metric, ListWorkplaces_Workplace, WidgetProps } from "andoncloud-dashboard-toolkit";
|
|
2
3
|
//#region src/types.d.ts
|
|
3
4
|
interface WidgetViewData {
|
|
@@ -23,12 +24,11 @@ declare const getDisplayName: (lang: string) => string;
|
|
|
23
24
|
declare const getTitle: (data: WidgetData | undefined, settings: WidgetSettings | undefined, _filters: FilterValues | undefined, lang: string) => string;
|
|
24
25
|
//#endregion
|
|
25
26
|
//#region src/version.d.ts
|
|
26
|
-
declare const LIBRARY_VERSION = "1.
|
|
27
|
+
declare const LIBRARY_VERSION = "1.3.0";
|
|
27
28
|
//#endregion
|
|
28
29
|
//#region src/index.d.ts
|
|
29
|
-
declare const thumbnail: string | undefined;
|
|
30
30
|
declare const requiredFeatures: string[];
|
|
31
31
|
declare const extraPermissions: string[];
|
|
32
32
|
//#endregion
|
|
33
|
-
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
|
|
33
|
+
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
|
|
34
34
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { t as thumbnail_default } from "./thumbnail-CkKtIgEU.js";
|
|
1
2
|
import { registerTranslations } from "andoncloud-sdk";
|
|
2
3
|
import { useCallback, useEffect, useState } from "react";
|
|
3
4
|
import { MetricUnitEnum, SortableSelect, useGqlClients } from "andoncloud-dashboard-toolkit";
|
|
@@ -9,7 +10,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
9
10
|
import { ResponsivePie } from "@nivo/pie";
|
|
10
11
|
import { BasicTooltip } from "@nivo/tooltip";
|
|
11
12
|
import dayjs from "dayjs";
|
|
12
|
-
import duration from "dayjs/plugin/duration";
|
|
13
|
+
import duration from "dayjs/plugin/duration.js";
|
|
13
14
|
import * as yup from "yup";
|
|
14
15
|
import i18n from "i18next";
|
|
15
16
|
//#endregion
|
|
@@ -51,7 +52,7 @@ const resources = {
|
|
|
51
52
|
};
|
|
52
53
|
//#endregion
|
|
53
54
|
//#region src/version.ts
|
|
54
|
-
const LIBRARY_VERSION = "1.
|
|
55
|
+
const LIBRARY_VERSION = "1.3.0";
|
|
55
56
|
//#endregion
|
|
56
57
|
//#region src/components/SettingsFormContent/index.tsx
|
|
57
58
|
const SettingsFormContent = ({ data, formProps }) => {
|
|
@@ -315,10 +316,9 @@ const getTitle = (data, settings, _filters, lang) => {
|
|
|
315
316
|
//#endregion
|
|
316
317
|
//#region src/index.tsx
|
|
317
318
|
registerTranslations(resources);
|
|
318
|
-
const thumbnail = void 0;
|
|
319
319
|
const requiredFeatures = ["feature.metrics-pie-chart-widget"];
|
|
320
320
|
const extraPermissions = [];
|
|
321
321
|
//#endregion
|
|
322
|
-
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail, LIBRARY_VERSION as version };
|
|
322
|
+
export { Widget, extraPermissions, getDisplayName, getTitle, requiredFeatures, thumbnail_default as thumbnail, LIBRARY_VERSION as version };
|
|
323
323
|
|
|
324
324
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["en","pl","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/components/SettingsFormContent/index.tsx","../src/components/MetricsPieChart/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.2.7';\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport { FormControl, InputLabel, MenuItem, Select, Tab, TextField } from '@mui/material';\nimport { SortableSelect } from 'andoncloud-dashboard-toolkit';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\n\nimport { WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ data, formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('workplace');\n\n // -- Translation --\n const { t } = useTranslation();\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('metricsPieChartWidget.workplace')} value=\"workplace\" />\n <Tab label={t('metricsPieChartWidget.metrics')} value=\"metrics\" />\n <Tab label={t('metricsPieChartWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"workplace\">\n <FormControl fullWidth>\n <InputLabel id=\"workplace-select-label\">{t('metricsPieChartWidget.chooseWorkplace')}</InputLabel>\n <Select\n name=\"workplaceId\"\n labelId=\"workplace-select-label\"\n value={formProps.values.workplaceId || ''}\n onChange={formProps.handleChange}\n fullWidth\n >\n {data.workplaces?.map((workplace) => (\n <MenuItem key={workplace.id} value={workplace.id}>\n {workplace.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </TabPanel>\n\n <TabPanel value=\"metrics\">\n <SortableSelect\n placeholder={`${t('metricsPieChartWidget.selectAndArrangeTheOrder')}...`}\n options={data.metrics?.map(({ id, name }) => ({ label: name, value: id }))}\n selected={formProps.values.metricIds}\n onChange={(selected) => formProps.setFieldValue('metricIds', [...selected])}\n />\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('metricsPieChartWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { ComputedDatum, ResponsivePie } from '@nivo/pie';\nimport { BasicTooltip } from '@nivo/tooltip';\nimport { ListMetrics_Metric, ListMetricValues_MetricValue, MetricUnitEnum } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\n\ndayjs.extend(duration);\n\ninterface MetricsPieChartProps {\n metrics?: ListMetrics_Metric[];\n metricsValues?: ListMetricValues_MetricValue[];\n}\n\nconst MetricsPieChart: React.FC<MetricsPieChartProps> = ({ metrics, metricsValues }) => {\n const getMetricLabel = (metricId: string) => {\n return metrics?.find((metric) => metric.id === metricId)?.name || '';\n };\n const formatFloat = (value: number) => value.toFixed(1).replace('.', ',');\n const formatValue = (value: string, unit?: string | null) => {\n if (value && unit) {\n switch (unit) {\n case MetricUnitEnum.Duration:\n return dayjs.duration(parseFloat(value), 'seconds').format('m[m] s[s]');\n case MetricUnitEnum.Round:\n return formatFloat(parseFloat(value));\n case MetricUnitEnum.Percent:\n return `${formatFloat(parseFloat(value) * 100)}%`;\n default:\n return value.toString();\n }\n }\n return '';\n };\n const getArcLabelText = (datum: ComputedDatum<unknown>) => {\n const metricData = datum.data as Partial<ListMetricValues_MetricValue>;\n\n return formatValue(metricData.textValue || '', metricData.unit);\n };\n\n const MetricTooltip = <RawDatum,>({ datum }: { datum: ComputedDatum<RawDatum> }) => {\n const metricData = datum.data as Partial<ListMetricValues_MetricValue>;\n\n return (\n <BasicTooltip\n id={datum.id}\n value={formatValue(metricData.textValue || '', metricData.unit)}\n enableChip={true}\n color={datum.color}\n />\n );\n };\n\n return (\n <ResponsivePie\n theme={{\n legends: {\n text: { fill: '#FFFFFF' },\n },\n }}\n data={(metricsValues || []).map(({ metricId, textValue, unit }) => ({\n id: getMetricLabel(metricId),\n label: getMetricLabel(metricId),\n value: textValue,\n textValue,\n unit,\n }))}\n innerRadius={0.5}\n margin={{ top: 20, right: 0, bottom: 20, left: 220 }}\n enableArcLinkLabels={false}\n arcLabel={getArcLabelText}\n tooltip={MetricTooltip}\n defs={[\n {\n id: 'lines',\n type: 'patternLines',\n background: 'inherit',\n color: 'rgba(0, 0, 0, 0.01)',\n rotation: -45,\n lineWidth: 5,\n spacing: 10,\n },\n ]}\n fill={[{ match: '*', id: 'lines' }]}\n legends={[\n {\n anchor: 'left',\n direction: 'column',\n translateX: -180,\n itemWidth: 200,\n itemHeight: 20,\n symbolShape: 'circle',\n },\n ]}\n />\n );\n};\n\nexport default MetricsPieChart;\n","import { WidgetViewProps } from '@/types';\n\nimport MetricsPieChart from '../MetricsPieChart';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data }) => {\n return <MetricsPieChart metrics={data?.metrics} metricsValues={data?.metricsValues} />;\n};\n\nexport default WidgetView;\n","import { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('metricsPieChartWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n workplaceId: '',\n metricIds: [],\n },\n validationSchema: yup.object({\n workplaceId: yup.string().required(),\n metricIds: yup.array().of(yup.string().required()),\n }),\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useGqlClients, WidgetProps } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({\n url,\n wsUrl,\n lang,\n data,\n settings,\n ...widgetProps\n}) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n const [widgetSettings, setWidgetSettings] = useState<WidgetSettings | undefined>(settings);\n\n useEffect(() => {\n if (graphqlSdk) {\n if (!data) {\n graphqlSdk\n .listWorkplaces()\n .then(({ workplaces }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n workplaces,\n }));\n })\n .catch(() => {});\n\n graphqlSdk\n .listMetrics()\n .then(({ metrics }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n metrics,\n }));\n })\n .catch(() => {});\n }\n if (widgetSettings) {\n const { workplaceId, metricIds } = widgetSettings;\n\n const fetchMetricValues = async () => {\n if (workplaceId && metricIds) {\n graphqlSdk\n .listMetricValues({ workplaceIds: [workplaceId], metricIds })\n .then(({ metricValues }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n metricsValues: metricValues.filter(\n (metricValue) =>\n metricValue.workplaceId === workplaceId && metricIds.includes(metricValue.metricId),\n ),\n }));\n })\n .catch(() => {});\n }\n };\n fetchMetricValues();\n\n const intervalId = setInterval(() => {\n fetchMetricValues();\n }, 10_000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n }\n return () => {};\n }, [data, graphqlSdk, widgetSettings]);\n\n const handleSettingsChange = useCallback(\n (settings: WidgetSettings) => {\n setWidgetSettings({ ...settings });\n },\n [setWidgetSettings],\n );\n\n return (\n <BaseWidget\n {...widgetProps}\n lang={lang}\n locales={locales}\n data={widgetData}\n settings={settings}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n onSettingsChange={handleSettingsChange}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n version={LIBRARY_VERSION}\n data-testid=\"metrics-pie-chart-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'metricsPieChartWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n if (!settings?.workplaceId || !data?.workplaces?.length) return name;\n\n const workplace = data.workplaces.find((w) => w.id === settings.workplaceId);\n if (!workplace) return name;\n\n const metricCount = settings.metricIds?.length ?? 0;\n if (metricCount === 0) return `${name} — ${workplace.name}`;\n\n const maxLen = 30;\n const wpName = workplace.name.length > maxLen ? `${workplace.name.slice(0, maxLen)}…` : workplace.name;\n\n return `${name} — ${wpName}, ${t('titleMetrics', lang, { count: metricCount })}`;\n};\n","import { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport const thumbnail: string | undefined = undefined;\n\nexport const requiredFeatures: string[] = ['feature.metrics-pie-chart-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["en","pl","locales","locales"],"sources":["../src/locales/en/translation.json","../src/locales/pl/translation.json","../src/locales/index.ts","../src/version.ts","../src/components/SettingsFormContent/index.tsx","../src/components/MetricsPieChart/index.tsx","../src/components/WidgetView/index.tsx","../src/components/Widget/utils.ts","../src/components/Widget/index.tsx","../src/core/title.ts","../src/index.tsx"],"sourcesContent":["","","import en from './en/translation.json';\nimport pl from './pl/translation.json';\n\nconst resources = {\n en: {\n translation: en,\n },\n pl: {\n translation: pl,\n },\n};\n\nexport default resources;\n","export const LIBRARY_VERSION = '1.3.0';\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { TabContext, TabList, TabPanel } from '@mui/lab';\nimport { FormControl, InputLabel, MenuItem, Select, Tab, TextField } from '@mui/material';\nimport { SortableSelect } from 'andoncloud-dashboard-toolkit';\nimport { SettingsFormContentProps } from 'andoncloud-widget-base';\n\nimport { WidgetData, WidgetSettings } from '@/types';\n\nconst SettingsFormContent: React.FC<SettingsFormContentProps<WidgetData, WidgetSettings>> = ({ data, formProps }) => {\n // -- Local state --\n const [selectedTab, setSelectedTab] = useState('workplace');\n\n // -- Translation --\n const { t } = useTranslation();\n\n return (\n <TabContext value={selectedTab}>\n <TabList onChange={(_, value) => setSelectedTab(value)} centered>\n <Tab label={t('metricsPieChartWidget.workplace')} value=\"workplace\" />\n <Tab label={t('metricsPieChartWidget.metrics')} value=\"metrics\" />\n <Tab label={t('metricsPieChartWidget.advanced')} value=\"advanced\" />\n </TabList>\n\n <TabPanel value=\"workplace\">\n <FormControl fullWidth>\n <InputLabel id=\"workplace-select-label\">{t('metricsPieChartWidget.chooseWorkplace')}</InputLabel>\n <Select\n name=\"workplaceId\"\n labelId=\"workplace-select-label\"\n value={formProps.values.workplaceId || ''}\n onChange={formProps.handleChange}\n fullWidth\n >\n {data.workplaces?.map((workplace) => (\n <MenuItem key={workplace.id} value={workplace.id}>\n {workplace.name}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </TabPanel>\n\n <TabPanel value=\"metrics\">\n <SortableSelect\n placeholder={`${t('metricsPieChartWidget.selectAndArrangeTheOrder')}...`}\n options={data.metrics?.map(({ id, name }) => ({ label: name, value: id }))}\n selected={formProps.values.metricIds}\n onChange={(selected) => formProps.setFieldValue('metricIds', [...selected])}\n />\n </TabPanel>\n\n <TabPanel value=\"advanced\">\n <TextField\n name=\"customTitle\"\n label={t('metricsPieChartWidget.customTitle')}\n value={formProps.values.customTitle}\n onChange={formProps.handleChange}\n fullWidth\n />\n </TabPanel>\n </TabContext>\n );\n};\n\nexport default SettingsFormContent;\n","import { ComputedDatum, ResponsivePie } from '@nivo/pie';\nimport { BasicTooltip } from '@nivo/tooltip';\nimport { ListMetrics_Metric, ListMetricValues_MetricValue, MetricUnitEnum } from 'andoncloud-dashboard-toolkit';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\n\ndayjs.extend(duration);\n\ninterface MetricsPieChartProps {\n metrics?: ListMetrics_Metric[];\n metricsValues?: ListMetricValues_MetricValue[];\n}\n\nconst MetricsPieChart: React.FC<MetricsPieChartProps> = ({ metrics, metricsValues }) => {\n const getMetricLabel = (metricId: string) => {\n return metrics?.find((metric) => metric.id === metricId)?.name || '';\n };\n const formatFloat = (value: number) => value.toFixed(1).replace('.', ',');\n const formatValue = (value: string, unit?: string | null) => {\n if (value && unit) {\n switch (unit) {\n case MetricUnitEnum.Duration:\n return dayjs.duration(parseFloat(value), 'seconds').format('m[m] s[s]');\n case MetricUnitEnum.Round:\n return formatFloat(parseFloat(value));\n case MetricUnitEnum.Percent:\n return `${formatFloat(parseFloat(value) * 100)}%`;\n default:\n return value.toString();\n }\n }\n return '';\n };\n const getArcLabelText = (datum: ComputedDatum<unknown>) => {\n const metricData = datum.data as Partial<ListMetricValues_MetricValue>;\n\n return formatValue(metricData.textValue || '', metricData.unit);\n };\n\n const MetricTooltip = <RawDatum,>({ datum }: { datum: ComputedDatum<RawDatum> }) => {\n const metricData = datum.data as Partial<ListMetricValues_MetricValue>;\n\n return (\n <BasicTooltip\n id={datum.id}\n value={formatValue(metricData.textValue || '', metricData.unit)}\n enableChip={true}\n color={datum.color}\n />\n );\n };\n\n return (\n <ResponsivePie\n theme={{\n legends: {\n text: { fill: '#FFFFFF' },\n },\n }}\n data={(metricsValues || []).map(({ metricId, textValue, unit }) => ({\n id: getMetricLabel(metricId),\n label: getMetricLabel(metricId),\n value: textValue,\n textValue,\n unit,\n }))}\n innerRadius={0.5}\n margin={{ top: 20, right: 0, bottom: 20, left: 220 }}\n enableArcLinkLabels={false}\n arcLabel={getArcLabelText}\n tooltip={MetricTooltip}\n defs={[\n {\n id: 'lines',\n type: 'patternLines',\n background: 'inherit',\n color: 'rgba(0, 0, 0, 0.01)',\n rotation: -45,\n lineWidth: 5,\n spacing: 10,\n },\n ]}\n fill={[{ match: '*', id: 'lines' }]}\n legends={[\n {\n anchor: 'left',\n direction: 'column',\n translateX: -180,\n itemWidth: 200,\n itemHeight: 20,\n symbolShape: 'circle',\n },\n ]}\n />\n );\n};\n\nexport default MetricsPieChart;\n","import { WidgetViewProps } from '@/types';\n\nimport MetricsPieChart from '../MetricsPieChart';\n\nconst WidgetView: React.FC<WidgetViewProps> = ({ data }) => {\n return <MetricsPieChart metrics={data?.metrics} metricsValues={data?.metricsValues} />;\n};\n\nexport default WidgetView;\n","import { TFunction } from 'i18next';\nimport * as yup from 'yup';\n\nexport const getSettingsFormProps = (t: TFunction) => {\n yup.setLocale({\n mixed: {\n required: t('metricsPieChartWidget.thisFieldIsRequired'),\n },\n });\n return {\n initialValues: {\n customTitle: '',\n workplaceId: '',\n metricIds: [],\n },\n validationSchema: yup.object({\n workplaceId: yup.string().required(),\n metricIds: yup.array().of(yup.string().required()),\n }),\n };\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useGqlClients, WidgetProps } from 'andoncloud-dashboard-toolkit';\nimport { BaseWidget } from 'andoncloud-widget-base';\n\nimport locales from '@/locales';\nimport { WidgetData, WidgetSettings } from '@/types';\nimport { LIBRARY_VERSION } from '@/version';\n\nimport SettingsFormContent from '../SettingsFormContent';\nimport WidgetView from '../WidgetView';\n\nimport { getSettingsFormProps } from './utils';\n\nconst Widget: React.FC<WidgetProps<WidgetData, WidgetSettings>> = ({\n url,\n wsUrl,\n lang,\n data,\n settings,\n ...widgetProps\n}) => {\n const { graphqlSdk, gqlWsClient } = useGqlClients({ url, wsUrl, lang });\n const [widgetData, setWidgetData] = useState<WidgetData | undefined>(data);\n const [widgetSettings, setWidgetSettings] = useState<WidgetSettings | undefined>(settings);\n\n useEffect(() => {\n if (graphqlSdk) {\n if (!data) {\n graphqlSdk\n .listWorkplaces()\n .then(({ workplaces }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n workplaces,\n }));\n })\n .catch(() => {});\n\n graphqlSdk\n .listMetrics()\n .then(({ metrics }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n metrics,\n }));\n })\n .catch(() => {});\n }\n if (widgetSettings) {\n const { workplaceId, metricIds } = widgetSettings;\n\n const fetchMetricValues = async () => {\n if (workplaceId && metricIds) {\n graphqlSdk\n .listMetricValues({ workplaceIds: [workplaceId], metricIds })\n .then(({ metricValues }) => {\n return setWidgetData((current: WidgetData) => ({\n ...(current || {}),\n metricsValues: metricValues.filter(\n (metricValue) =>\n metricValue.workplaceId === workplaceId && metricIds.includes(metricValue.metricId),\n ),\n }));\n })\n .catch(() => {});\n }\n };\n fetchMetricValues();\n\n const intervalId = setInterval(() => {\n fetchMetricValues();\n }, 10_000);\n\n return () => {\n clearInterval(intervalId);\n };\n }\n }\n return () => {};\n }, [data, graphqlSdk, widgetSettings]);\n\n const handleSettingsChange = useCallback(\n (settings: WidgetSettings) => {\n setWidgetSettings({ ...settings });\n },\n [setWidgetSettings],\n );\n\n return (\n <BaseWidget\n {...widgetProps}\n lang={lang}\n locales={locales}\n data={widgetData}\n settings={settings}\n gqlClients={{ graphqlSdk, gqlWsClient }}\n onSettingsChange={handleSettingsChange}\n WidgetView={WidgetView}\n getSettingsFormProps={getSettingsFormProps}\n SettingsFormContent={SettingsFormContent}\n version={LIBRARY_VERSION}\n data-testid=\"metrics-pie-chart-widget\"\n />\n );\n};\n\nexport default Widget;\n","import type { FilterValues } from 'andoncloud-dashboard-toolkit';\nimport i18n from 'i18next';\n\nimport type { WidgetData, WidgetSettings } from '../types';\n\nconst ns = 'metricsPieChartWidget';\n\nconst t = (key: string, lng: string, options?: Record<string, unknown>) => i18n.t(`${ns}.${key}`, { lng, ...options });\n\nexport const getDisplayName = (lang: string) => t('displayName', lang);\n\nexport const getTitle = (\n data: WidgetData | undefined,\n settings: WidgetSettings | undefined,\n _filters: FilterValues | undefined,\n lang: string,\n): string => {\n const name = getDisplayName(lang);\n\n if (!settings?.workplaceId || !data?.workplaces?.length) return name;\n\n const workplace = data.workplaces.find((w) => w.id === settings.workplaceId);\n if (!workplace) return name;\n\n const metricCount = settings.metricIds?.length ?? 0;\n if (metricCount === 0) return `${name} — ${workplace.name}`;\n\n const maxLen = 30;\n const wpName = workplace.name.length > maxLen ? `${workplace.name.slice(0, maxLen)}…` : workplace.name;\n\n return `${name} — ${wpName}, ${t('titleMetrics', lang, { count: metricCount })}`;\n};\n","import { registerTranslations } from 'andoncloud-sdk';\n\nimport locales from './locales';\n\nregisterTranslations(locales);\n\nexport { default as Widget } from './components/Widget';\nexport { getDisplayName, getTitle } from './core/title';\n\nexport { default as thumbnail } from './assets/thumbnail.svg';\n\nexport const requiredFeatures: string[] = ['feature.metrics-pie-chart-widget'];\nexport const extraPermissions: string[] = [];\n\nexport { LIBRARY_VERSION as version } from './version';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/assets/thumbnail.svg
|
|
2
|
+
var thumbnail_default = "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 180\" fill=\"none\">%0A <!-- Donut chart (r=55, circumference=345.6) -->%0A <!-- Slice 1: 42% = 145.1 -->%0A <circle cx=\"210\" cy=\"90\" r=\"55\" fill=\"none\" stroke=\"%231976d2\" stroke-width=\"18\" stroke-dasharray=\"145.1 200.5\" stroke-dashoffset=\"0\" transform=\"rotate(-90 210 90)\"/>%0A <!-- Slice 2: 25% = 86.4 -->%0A <circle cx=\"210\" cy=\"90\" r=\"55\" fill=\"none\" stroke=\"%2390caf9\" stroke-width=\"18\" stroke-dasharray=\"86.4 259.2\" stroke-dashoffset=\"-145.1\" transform=\"rotate(-90 210 90)\"/>%0A <!-- Slice 3: 19% = 65.7 -->%0A <circle cx=\"210\" cy=\"90\" r=\"55\" fill=\"none\" stroke=\"%2311BD4C\" stroke-width=\"18\" stroke-dasharray=\"65.7 279.9\" stroke-dashoffset=\"-231.5\" transform=\"rotate(-90 210 90)\"/>%0A <!-- Slice 4: 14% = 48.4 -->%0A <circle cx=\"210\" cy=\"90\" r=\"55\" fill=\"none\" stroke=\"%2347484A\" stroke-width=\"18\" stroke-dasharray=\"48.4 297.2\" stroke-dashoffset=\"-297.2\" transform=\"rotate(-90 210 90)\"/>%0A%0A <!-- Legend -->%0A <rect x=\"12\" y=\"46\" width=\"10\" height=\"10\" rx=\"2\" fill=\"%231976d2\"/>%0A <rect x=\"28\" y=\"49\" width=\"56\" height=\"4\" rx=\"1\" fill=\"%23A7ADB6\"/>%0A <text x=\"100\" y=\"55\" font-size=\"11\" font-weight=\"600\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">42%</text>%0A%0A <rect x=\"12\" y=\"68\" width=\"10\" height=\"10\" rx=\"2\" fill=\"%2390caf9\"/>%0A <rect x=\"28\" y=\"71\" width=\"48\" height=\"4\" rx=\"1\" fill=\"%23A7ADB6\"/>%0A <text x=\"100\" y=\"77\" font-size=\"11\" font-weight=\"600\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">25%</text>%0A%0A <rect x=\"12\" y=\"90\" width=\"10\" height=\"10\" rx=\"2\" fill=\"%2311BD4C\"/>%0A <rect x=\"28\" y=\"93\" width=\"52\" height=\"4\" rx=\"1\" fill=\"%23A7ADB6\"/>%0A <text x=\"100\" y=\"99\" font-size=\"11\" font-weight=\"600\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">19%</text>%0A%0A <rect x=\"12\" y=\"112\" width=\"10\" height=\"10\" rx=\"2\" fill=\"%2347484A\"/>%0A <rect x=\"28\" y=\"115\" width=\"42\" height=\"4\" rx=\"1\" fill=\"%23A7ADB6\"/>%0A <text x=\"100\" y=\"121\" font-size=\"11\" font-weight=\"600\" font-family=\"Inter, system-ui\" fill=\"%23A7ADB6\">14%</text>%0A</svg>%0A";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { thumbnail_default as t };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=thumbnail-CkKtIgEU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thumbnail-CkKtIgEU.js","names":[],"sources":["../src/assets/thumbnail.svg"],"sourcesContent":["\"data:image/svg+xml,<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 320 180\\\" fill=\\\"none\\\">%0A <!-- Donut chart (r=55, circumference=345.6) -->%0A <!-- Slice 1: 42% = 145.1 -->%0A <circle cx=\\\"210\\\" cy=\\\"90\\\" r=\\\"55\\\" fill=\\\"none\\\" stroke=\\\"%231976d2\\\" stroke-width=\\\"18\\\" stroke-dasharray=\\\"145.1 200.5\\\" stroke-dashoffset=\\\"0\\\" transform=\\\"rotate(-90 210 90)\\\"/>%0A <!-- Slice 2: 25% = 86.4 -->%0A <circle cx=\\\"210\\\" cy=\\\"90\\\" r=\\\"55\\\" fill=\\\"none\\\" stroke=\\\"%2390caf9\\\" stroke-width=\\\"18\\\" stroke-dasharray=\\\"86.4 259.2\\\" stroke-dashoffset=\\\"-145.1\\\" transform=\\\"rotate(-90 210 90)\\\"/>%0A <!-- Slice 3: 19% = 65.7 -->%0A <circle cx=\\\"210\\\" cy=\\\"90\\\" r=\\\"55\\\" fill=\\\"none\\\" stroke=\\\"%2311BD4C\\\" stroke-width=\\\"18\\\" stroke-dasharray=\\\"65.7 279.9\\\" stroke-dashoffset=\\\"-231.5\\\" transform=\\\"rotate(-90 210 90)\\\"/>%0A <!-- Slice 4: 14% = 48.4 -->%0A <circle cx=\\\"210\\\" cy=\\\"90\\\" r=\\\"55\\\" fill=\\\"none\\\" stroke=\\\"%2347484A\\\" stroke-width=\\\"18\\\" stroke-dasharray=\\\"48.4 297.2\\\" stroke-dashoffset=\\\"-297.2\\\" transform=\\\"rotate(-90 210 90)\\\"/>%0A%0A <!-- Legend -->%0A <rect x=\\\"12\\\" y=\\\"46\\\" width=\\\"10\\\" height=\\\"10\\\" rx=\\\"2\\\" fill=\\\"%231976d2\\\"/>%0A <rect x=\\\"28\\\" y=\\\"49\\\" width=\\\"56\\\" height=\\\"4\\\" rx=\\\"1\\\" fill=\\\"%23A7ADB6\\\"/>%0A <text x=\\\"100\\\" y=\\\"55\\\" font-size=\\\"11\\\" font-weight=\\\"600\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">42%</text>%0A%0A <rect x=\\\"12\\\" y=\\\"68\\\" width=\\\"10\\\" height=\\\"10\\\" rx=\\\"2\\\" fill=\\\"%2390caf9\\\"/>%0A <rect x=\\\"28\\\" y=\\\"71\\\" width=\\\"48\\\" height=\\\"4\\\" rx=\\\"1\\\" fill=\\\"%23A7ADB6\\\"/>%0A <text x=\\\"100\\\" y=\\\"77\\\" font-size=\\\"11\\\" font-weight=\\\"600\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">25%</text>%0A%0A <rect x=\\\"12\\\" y=\\\"90\\\" width=\\\"10\\\" height=\\\"10\\\" rx=\\\"2\\\" fill=\\\"%2311BD4C\\\"/>%0A <rect x=\\\"28\\\" y=\\\"93\\\" width=\\\"52\\\" height=\\\"4\\\" rx=\\\"1\\\" fill=\\\"%23A7ADB6\\\"/>%0A <text x=\\\"100\\\" y=\\\"99\\\" font-size=\\\"11\\\" font-weight=\\\"600\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">19%</text>%0A%0A <rect x=\\\"12\\\" y=\\\"112\\\" width=\\\"10\\\" height=\\\"10\\\" rx=\\\"2\\\" fill=\\\"%2347484A\\\"/>%0A <rect x=\\\"28\\\" y=\\\"115\\\" width=\\\"42\\\" height=\\\"4\\\" rx=\\\"1\\\" fill=\\\"%23A7ADB6\\\"/>%0A <text x=\\\"100\\\" y=\\\"121\\\" font-size=\\\"11\\\" font-weight=\\\"600\\\" font-family=\\\"Inter, system-ui\\\" fill=\\\"%23A7ADB6\\\">14%</text>%0A</svg>%0A\""],"mappings":";wBAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "andoncloud-metrics-pie-chart-widget",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Made with create-andoncloud-widget",
|
|
5
5
|
"author": "Adrian Olszewski",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"start": "run-p build:watch start:preview",
|
|
19
19
|
"start:preview": "cd preview && npm run start",
|
|
20
20
|
"test": "cypress run --component",
|
|
21
|
-
"update": "ncu --reject graphql-request -u && npm install --ignore-scripts && cd preview && ncu -u && npm install",
|
|
21
|
+
"update": "ncu --reject graphql-request,typescript,@mui/material,@mui/icons-material,@mui/lab,@mui/x-date-pickers -u && npm install --ignore-scripts && cd preview && ncu -u && npm install --ignore-scripts",
|
|
22
22
|
"version:bump": "npm version --no-git-tag-version patch"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
@@ -45,25 +45,25 @@
|
|
|
45
45
|
"@types/react": "^19.2.14",
|
|
46
46
|
"actioncable": "^5.2.8-1",
|
|
47
47
|
"ajv": "^8.18.0",
|
|
48
|
-
"andoncloud-dashboard-toolkit": "^1.5.
|
|
48
|
+
"andoncloud-dashboard-toolkit": "^1.5.79",
|
|
49
49
|
"andoncloud-library-scripts": "^2.0.0",
|
|
50
|
-
"andoncloud-sdk": "^1.7.
|
|
51
|
-
"andoncloud-widget-base": "^1.2.
|
|
52
|
-
"cypress": "^15.
|
|
50
|
+
"andoncloud-sdk": "^1.7.30",
|
|
51
|
+
"andoncloud-widget-base": "^1.2.30",
|
|
52
|
+
"cypress": "^15.13.1",
|
|
53
53
|
"eslint-config-andoncloud": "^1.1.0",
|
|
54
54
|
"graphql-request": "^6.1.0",
|
|
55
|
-
"i18next": "^
|
|
55
|
+
"i18next": "^26.0.5",
|
|
56
56
|
"mobx": "^6.15.0",
|
|
57
57
|
"mobx-react-lite": "^4.1.1",
|
|
58
|
-
"npm-check-updates": "^
|
|
58
|
+
"npm-check-updates": "^21.0.1",
|
|
59
59
|
"npm-run-all": "^4.1.5",
|
|
60
|
-
"postcss": "^8.5.
|
|
61
|
-
"react": "^19.2.
|
|
62
|
-
"react-dom": "^19.2.
|
|
63
|
-
"react-i18next": "^
|
|
64
|
-
"react-router-dom": "^7.
|
|
60
|
+
"postcss": "^8.5.10",
|
|
61
|
+
"react": "^19.2.5",
|
|
62
|
+
"react-dom": "^19.2.5",
|
|
63
|
+
"react-i18next": "^17.0.3",
|
|
64
|
+
"react-router-dom": "^7.14.1",
|
|
65
65
|
"react-scripts": "^5.0.1",
|
|
66
|
-
"tsdown": "^0.21.
|
|
66
|
+
"tsdown": "^0.21.8",
|
|
67
67
|
"typescript": "~5.9.3",
|
|
68
68
|
"webpack-dev-server": "^5.2.3"
|
|
69
69
|
},
|