@red-hat-developer-hub/backstage-plugin-adoption-insights 0.1.0 → 0.2.1

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/api/index.esm.js +1 -1
  3. package/dist/api/index.esm.js.map +1 -1
  4. package/dist/components/ActiveUsers/ActiveUsers.esm.js +108 -90
  5. package/dist/components/ActiveUsers/ActiveUsers.esm.js.map +1 -1
  6. package/dist/components/ActiveUsers/CustomLegend.esm.js +40 -35
  7. package/dist/components/ActiveUsers/CustomLegend.esm.js.map +1 -1
  8. package/dist/components/ActiveUsers/ExportCSVButton.esm.js +27 -25
  9. package/dist/components/ActiveUsers/ExportCSVButton.esm.js.map +1 -1
  10. package/dist/components/AdoptionInsightsPage/AdoptionInsightsPage.esm.js +13 -2
  11. package/dist/components/AdoptionInsightsPage/AdoptionInsightsPage.esm.js.map +1 -1
  12. package/dist/components/CardFooter/TableFooterPagination.esm.js +42 -42
  13. package/dist/components/CardFooter/TableFooterPagination.esm.js.map +1 -1
  14. package/dist/components/CardWrapper/CardWrapper.esm.js +29 -24
  15. package/dist/components/CardWrapper/CardWrapper.esm.js.map +1 -1
  16. package/dist/components/CatalogEntities/CatalogEntities.esm.js +96 -92
  17. package/dist/components/CatalogEntities/CatalogEntities.esm.js.map +1 -1
  18. package/dist/components/CatalogEntities/FilterDropdown.esm.js +22 -17
  19. package/dist/components/CatalogEntities/FilterDropdown.esm.js.map +1 -1
  20. package/dist/components/Common/ChartTooltip.esm.js +91 -0
  21. package/dist/components/Common/ChartTooltip.esm.js.map +1 -0
  22. package/dist/components/Common/CustomCursor.esm.js +2 -2
  23. package/dist/components/Common/CustomCursor.esm.js.map +1 -1
  24. package/dist/components/Common/EmptyChartState.esm.js +2 -2
  25. package/dist/components/Common/EmptyChartState.esm.js.map +1 -1
  26. package/dist/components/Common/PermissionRequiredIcon.esm.js +2 -2
  27. package/dist/components/Common/PermissionRequiredIcon.esm.js.map +1 -1
  28. package/dist/components/Common/PermissionRequiredState.esm.js +29 -23
  29. package/dist/components/Common/PermissionRequiredState.esm.js.map +1 -1
  30. package/dist/components/Header/DateRangeContext.esm.js +7 -6
  31. package/dist/components/Header/DateRangeContext.esm.js.map +1 -1
  32. package/dist/components/Header/DateRangePicker.esm.js +67 -59
  33. package/dist/components/Header/DateRangePicker.esm.js.map +1 -1
  34. package/dist/components/Header/Header.esm.js +117 -106
  35. package/dist/components/Header/Header.esm.js.map +1 -1
  36. package/dist/components/Plugins/Plugins.esm.js +74 -64
  37. package/dist/components/Plugins/Plugins.esm.js.map +1 -1
  38. package/dist/components/Searches/Searches.esm.js +86 -75
  39. package/dist/components/Searches/Searches.esm.js.map +1 -1
  40. package/dist/components/Techdocs/Techdocs.esm.js +85 -81
  41. package/dist/components/Techdocs/Techdocs.esm.js.map +1 -1
  42. package/dist/components/Templates/Templates.esm.js +74 -70
  43. package/dist/components/Templates/Templates.esm.js.map +1 -1
  44. package/dist/components/Users/Info.esm.js +12 -12
  45. package/dist/components/Users/Info.esm.js.map +1 -1
  46. package/dist/components/Users/Tooltip.esm.js +27 -23
  47. package/dist/components/Users/Tooltip.esm.js.map +1 -1
  48. package/dist/components/Users/Users.esm.js +119 -95
  49. package/dist/components/Users/Users.esm.js.map +1 -1
  50. package/dist/hooks/useActiveUsers.esm.js +10 -8
  51. package/dist/hooks/useActiveUsers.esm.js.map +1 -1
  52. package/dist/hooks/useCatalogEntities.esm.js +9 -6
  53. package/dist/hooks/useCatalogEntities.esm.js.map +1 -1
  54. package/dist/hooks/usePlugins.esm.js +9 -6
  55. package/dist/hooks/usePlugins.esm.js.map +1 -1
  56. package/dist/hooks/useSearches.esm.js +11 -7
  57. package/dist/hooks/useSearches.esm.js.map +1 -1
  58. package/dist/hooks/useTechdocs.esm.js +9 -6
  59. package/dist/hooks/useTechdocs.esm.js.map +1 -1
  60. package/dist/hooks/useTemplates.esm.js +9 -6
  61. package/dist/hooks/useTemplates.esm.js.map +1 -1
  62. package/dist/hooks/useUsers.esm.js +10 -7
  63. package/dist/hooks/useUsers.esm.js.map +1 -1
  64. package/dist/index.d.ts +2 -3
  65. package/dist/utils/utils.esm.js +70 -30
  66. package/dist/utils/utils.esm.js.map +1 -1
  67. package/package.json +19 -17
  68. package/dist/components/ActiveUsers/CustomTooltip.esm.js +0 -87
  69. package/dist/components/ActiveUsers/CustomTooltip.esm.js.map +0 -1
  70. package/dist/components/Searches/CustomTooltip.esm.js +0 -66
  71. package/dist/components/Searches/CustomTooltip.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useTechdocs.esm.js","sources":["../../src/hooks/useTechdocs.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { format } from 'date-fns';\n\nimport { adoptionInsightsApiRef } from '../api';\nimport { APIsViewOptions, TechdocsResponse } from '../types';\nimport { useDateRange } from '../components/Header/DateRangeContext';\n\nexport const useTechdocs = ({\n limit = 20,\n}: APIsViewOptions): {\n techdocs: TechdocsResponse;\n error: Error | undefined;\n loading: boolean;\n} => {\n const [loadingData, setLoadingData] = React.useState<boolean>(true);\n const [techdocs, setTechdocs] = React.useState<TechdocsResponse>({\n data: [],\n });\n\n const { startDateRange, endDateRange } = useDateRange();\n\n const api = useApi(adoptionInsightsApiRef);\n\n const getTechdocs = React.useCallback(async () => {\n return await api\n .getTechdocs({\n type: 'top_techdocs',\n start_date: startDateRange\n ? format(startDateRange, 'yyyy-MM-dd')\n : undefined,\n end_date: endDateRange ? format(endDateRange, 'yyyy-MM-dd') : undefined,\n limit,\n })\n .then(response => setTechdocs(response ?? { data: [] }));\n }, [api, limit, startDateRange, endDateRange]);\n\n const { error, loading } = useAsyncRetry(async () => {\n return await getTechdocs();\n }, [getTechdocs]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!loading && mounted) {\n setLoadingData(false);\n }\n return () => {\n mounted = false;\n };\n }, [loading]);\n\n return { techdocs, error, loading: loadingData };\n};\n"],"names":["React"],"mappings":";;;;;;;AAyBO,MAAM,cAAc,CAAC;AAAA,EAC1B,KAAQ,GAAA;AACV,CAIK,KAAA;AACH,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAAA,cAAA,CAAM,SAAkB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAM,QAA2B,CAAA;AAAA,IAC/D,MAAM;AAAC,GACR,CAAA;AAED,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAa,EAAA,GAAI,YAAa,EAAA;AAEtD,EAAM,MAAA,GAAA,GAAM,OAAO,sBAAsB,CAAA;AAEzC,EAAM,MAAA,WAAA,GAAcA,cAAM,CAAA,WAAA,CAAY,YAAY;AAChD,IAAO,OAAA,MAAM,IACV,WAAY,CAAA;AAAA,MACX,IAAM,EAAA,cAAA;AAAA,MACN,UAAY,EAAA,cAAA,GACR,MAAO,CAAA,cAAA,EAAgB,YAAY,CACnC,GAAA,MAAA;AAAA,MACJ,QAAU,EAAA,YAAA,GAAe,MAAO,CAAA,YAAA,EAAc,YAAY,CAAI,GAAA,MAAA;AAAA,MAC9D;AAAA,KACD,CACA,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA,WAAA,CAAY,QAAY,IAAA,EAAE,IAAM,EAAA,EAAG,EAAC,CAAC,CAAA;AAAA,KACxD,CAAC,GAAA,EAAK,KAAO,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA;AAE7C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAQ,EAAA,GAAI,cAAc,YAAY;AACnD,IAAA,OAAO,MAAM,WAAY,EAAA;AAAA,GAC3B,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,cAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA;AAEtB,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,QAAA,EAAU,KAAO,EAAA,OAAA,EAAS,WAAY,EAAA;AACjD;;;;"}
1
+ {"version":3,"file":"useTechdocs.esm.js","sources":["../../src/hooks/useTechdocs.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useCallback, useEffect } from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { format } from 'date-fns';\n\nimport { adoptionInsightsApiRef } from '../api';\nimport { APIsViewOptions, TechdocsResponse } from '../types';\nimport { useDateRange } from '../components/Header/DateRangeContext';\nimport { formatInTimeZone } from 'date-fns-tz';\n\nexport const useTechdocs = ({\n limit = 20,\n}: APIsViewOptions): {\n techdocs: TechdocsResponse;\n error: Error | undefined;\n loading: boolean;\n} => {\n const [loadingData, setLoadingData] = useState<boolean>(true);\n const [techdocs, setTechdocs] = useState<TechdocsResponse>({\n data: [],\n });\n\n const { startDateRange, endDateRange } = useDateRange();\n\n const api = useApi(adoptionInsightsApiRef);\n\n const getTechdocs = useCallback(async () => {\n const timezone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n return await api\n .getTechdocs({\n type: 'top_techdocs',\n start_date: startDateRange\n ? formatInTimeZone(startDateRange, timezone, 'yyyy-MM-dd')\n : undefined,\n end_date: endDateRange ? format(endDateRange, 'yyyy-MM-dd') : undefined,\n timezone: new Intl.DateTimeFormat().resolvedOptions().timeZone,\n limit,\n })\n .then(response => setTechdocs(response ?? { data: [] }));\n }, [api, limit, startDateRange, endDateRange]);\n\n const { error, loading } = useAsyncRetry(async () => {\n return await getTechdocs();\n }, [getTechdocs]);\n\n useEffect(() => {\n let mounted = true;\n if (!loading && mounted) {\n setLoadingData(false);\n }\n return () => {\n mounted = false;\n };\n }, [loading]);\n\n return { techdocs, error, loading: loadingData };\n};\n"],"names":[],"mappings":";;;;;;;;AA0BO,MAAM,cAAc,CAAC;AAAA,EAC1B,KAAQ,GAAA;AACV,CAIK,KAAA;AACH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAkB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAA2B,CAAA;AAAA,IACzD,MAAM;AAAC,GACR,CAAA;AAED,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAa,EAAA,GAAI,YAAa,EAAA;AAEtD,EAAM,MAAA,GAAA,GAAM,OAAO,sBAAsB,CAAA;AAEzC,EAAM,MAAA,WAAA,GAAc,YAAY,YAAY;AAC1C,IAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAE7D,IAAO,OAAA,MAAM,IACV,WAAY,CAAA;AAAA,MACX,IAAM,EAAA,cAAA;AAAA,MACN,YAAY,cACR,GAAA,gBAAA,CAAiB,cAAgB,EAAA,QAAA,EAAU,YAAY,CACvD,GAAA,MAAA;AAAA,MACJ,QAAU,EAAA,YAAA,GAAe,MAAO,CAAA,YAAA,EAAc,YAAY,CAAI,GAAA,MAAA;AAAA,MAC9D,UAAU,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAAA,MACtD;AAAA,KACD,CACA,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA,WAAA,CAAY,QAAY,IAAA,EAAE,IAAM,EAAA,EAAG,EAAC,CAAC,CAAA;AAAA,KACxD,CAAC,GAAA,EAAK,KAAO,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA;AAE7C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAQ,EAAA,GAAI,cAAc,YAAY;AACnD,IAAA,OAAO,MAAM,WAAY,EAAA;AAAA,GAC3B,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA;AAEtB,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,QAAA,EAAU,KAAO,EAAA,OAAA,EAAS,WAAY,EAAA;AACjD;;;;"}
@@ -1,24 +1,27 @@
1
- import React__default from 'react';
1
+ import { useState, useCallback, useEffect } from 'react';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import { useAsyncRetry } from 'react-use';
4
4
  import { format } from 'date-fns';
5
5
  import { adoptionInsightsApiRef } from '../api/index.esm.js';
6
6
  import { useDateRange } from '../components/Header/DateRangeContext.esm.js';
7
+ import { formatInTimeZone } from 'date-fns-tz';
7
8
 
8
9
  const useTemplates = ({
9
10
  limit = 20
10
11
  }) => {
11
- const [loadingData, setLoadingData] = React__default.useState(true);
12
- const [templates, setTemplates] = React__default.useState({
12
+ const [loadingData, setLoadingData] = useState(true);
13
+ const [templates, setTemplates] = useState({
13
14
  data: []
14
15
  });
15
16
  const { startDateRange, endDateRange } = useDateRange();
16
17
  const api = useApi(adoptionInsightsApiRef);
17
- const getTemplates = React__default.useCallback(async () => {
18
+ const getTemplates = useCallback(async () => {
19
+ const timezone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
18
20
  return await api.getTemplates({
19
21
  type: "top_templates",
20
- start_date: startDateRange ? format(startDateRange, "yyyy-MM-dd") : void 0,
22
+ start_date: startDateRange ? formatInTimeZone(startDateRange, timezone, "yyyy-MM-dd") : void 0,
21
23
  end_date: endDateRange ? format(endDateRange, "yyyy-MM-dd") : void 0,
24
+ timezone,
22
25
  limit
23
26
  }).then(
24
27
  (response) => setTemplates(response ?? { data: [] })
@@ -27,7 +30,7 @@ const useTemplates = ({
27
30
  const { error, loading } = useAsyncRetry(async () => {
28
31
  return await getTemplates();
29
32
  }, [getTemplates]);
30
- React__default.useEffect(() => {
33
+ useEffect(() => {
31
34
  let mounted = true;
32
35
  if (!loading && mounted) {
33
36
  setLoadingData(false);
@@ -1 +1 @@
1
- {"version":3,"file":"useTemplates.esm.js","sources":["../../src/hooks/useTemplates.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { format } from 'date-fns';\n\nimport { adoptionInsightsApiRef } from '../api';\nimport { APIsViewOptions, TemplatesResponse } from '../types';\nimport { useDateRange } from '../components/Header/DateRangeContext';\n\nexport const useTemplates = ({\n limit = 20,\n}: APIsViewOptions): {\n templates: TemplatesResponse;\n error: Error | undefined;\n loading: boolean;\n} => {\n const [loadingData, setLoadingData] = React.useState<boolean>(true);\n const [templates, setTemplates] = React.useState<TemplatesResponse>({\n data: [],\n });\n\n const { startDateRange, endDateRange } = useDateRange();\n\n const api = useApi(adoptionInsightsApiRef);\n\n const getTemplates = React.useCallback(async () => {\n return await api\n .getTemplates({\n type: 'top_templates',\n start_date: startDateRange\n ? format(startDateRange, 'yyyy-MM-dd')\n : undefined,\n end_date: endDateRange ? format(endDateRange, 'yyyy-MM-dd') : undefined,\n limit,\n })\n .then((response: TemplatesResponse) =>\n setTemplates(response ?? { data: [] }),\n );\n }, [api, limit, startDateRange, endDateRange]);\n\n const { error, loading } = useAsyncRetry(async () => {\n return await getTemplates();\n }, [getTemplates]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!loading && mounted) {\n setLoadingData(false);\n }\n return () => {\n mounted = false;\n };\n }, [loading]);\n\n return { templates, error, loading: loadingData };\n};\n"],"names":["React"],"mappings":";;;;;;;AAyBO,MAAM,eAAe,CAAC;AAAA,EAC3B,KAAQ,GAAA;AACV,CAIK,KAAA;AACH,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAAA,cAAA,CAAM,SAAkB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAM,QAA4B,CAAA;AAAA,IAClE,MAAM;AAAC,GACR,CAAA;AAED,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAa,EAAA,GAAI,YAAa,EAAA;AAEtD,EAAM,MAAA,GAAA,GAAM,OAAO,sBAAsB,CAAA;AAEzC,EAAM,MAAA,YAAA,GAAeA,cAAM,CAAA,WAAA,CAAY,YAAY;AACjD,IAAO,OAAA,MAAM,IACV,YAAa,CAAA;AAAA,MACZ,IAAM,EAAA,eAAA;AAAA,MACN,UAAY,EAAA,cAAA,GACR,MAAO,CAAA,cAAA,EAAgB,YAAY,CACnC,GAAA,MAAA;AAAA,MACJ,QAAU,EAAA,YAAA,GAAe,MAAO,CAAA,YAAA,EAAc,YAAY,CAAI,GAAA,MAAA;AAAA,MAC9D;AAAA,KACD,CACA,CAAA,IAAA;AAAA,MAAK,CAAC,aACL,YAAa,CAAA,QAAA,IAAY,EAAE,IAAM,EAAA,IAAI;AAAA,KACvC;AAAA,KACD,CAAC,GAAA,EAAK,KAAO,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA;AAE7C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAQ,EAAA,GAAI,cAAc,YAAY;AACnD,IAAA,OAAO,MAAM,YAAa,EAAA;AAAA,GAC5B,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAAA,cAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA;AAEtB,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,SAAA,EAAW,KAAO,EAAA,OAAA,EAAS,WAAY,EAAA;AAClD;;;;"}
1
+ {"version":3,"file":"useTemplates.esm.js","sources":["../../src/hooks/useTemplates.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState, useCallback, useEffect } from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { format } from 'date-fns';\n\nimport { adoptionInsightsApiRef } from '../api';\nimport { APIsViewOptions, TemplatesResponse } from '../types';\nimport { useDateRange } from '../components/Header/DateRangeContext';\nimport { formatInTimeZone } from 'date-fns-tz';\n\nexport const useTemplates = ({\n limit = 20,\n}: APIsViewOptions): {\n templates: TemplatesResponse;\n error: Error | undefined;\n loading: boolean;\n} => {\n const [loadingData, setLoadingData] = useState<boolean>(true);\n const [templates, setTemplates] = useState<TemplatesResponse>({\n data: [],\n });\n\n const { startDateRange, endDateRange } = useDateRange();\n\n const api = useApi(adoptionInsightsApiRef);\n\n const getTemplates = useCallback(async () => {\n const timezone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n return await api\n .getTemplates({\n type: 'top_templates',\n start_date: startDateRange\n ? formatInTimeZone(startDateRange, timezone, 'yyyy-MM-dd')\n : undefined,\n end_date: endDateRange ? format(endDateRange, 'yyyy-MM-dd') : undefined,\n timezone,\n limit,\n })\n .then((response: TemplatesResponse) =>\n setTemplates(response ?? { data: [] }),\n );\n }, [api, limit, startDateRange, endDateRange]);\n\n const { error, loading } = useAsyncRetry(async () => {\n return await getTemplates();\n }, [getTemplates]);\n\n useEffect(() => {\n let mounted = true;\n if (!loading && mounted) {\n setLoadingData(false);\n }\n return () => {\n mounted = false;\n };\n }, [loading]);\n\n return { templates, error, loading: loadingData };\n};\n"],"names":[],"mappings":";;;;;;;;AA0BO,MAAM,eAAe,CAAC;AAAA,EAC3B,KAAQ,GAAA;AACV,CAIK,KAAA;AACH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAkB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAA4B,CAAA;AAAA,IAC5D,MAAM;AAAC,GACR,CAAA;AAED,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAa,EAAA,GAAI,YAAa,EAAA;AAEtD,EAAM,MAAA,GAAA,GAAM,OAAO,sBAAsB,CAAA;AAEzC,EAAM,MAAA,YAAA,GAAe,YAAY,YAAY;AAC3C,IAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAE7D,IAAO,OAAA,MAAM,IACV,YAAa,CAAA;AAAA,MACZ,IAAM,EAAA,eAAA;AAAA,MACN,YAAY,cACR,GAAA,gBAAA,CAAiB,cAAgB,EAAA,QAAA,EAAU,YAAY,CACvD,GAAA,MAAA;AAAA,MACJ,QAAU,EAAA,YAAA,GAAe,MAAO,CAAA,YAAA,EAAc,YAAY,CAAI,GAAA,MAAA;AAAA,MAC9D,QAAA;AAAA,MACA;AAAA,KACD,CACA,CAAA,IAAA;AAAA,MAAK,CAAC,aACL,YAAa,CAAA,QAAA,IAAY,EAAE,IAAM,EAAA,IAAI;AAAA,KACvC;AAAA,KACD,CAAC,GAAA,EAAK,KAAO,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA;AAE7C,EAAA,MAAM,EAAE,KAAA,EAAO,OAAQ,EAAA,GAAI,cAAc,YAAY;AACnD,IAAA,OAAO,MAAM,YAAa,EAAA;AAAA,GAC5B,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA;AAEtB,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,SAAA,EAAW,KAAO,EAAA,OAAA,EAAS,WAAY,EAAA;AAClD;;;;"}
@@ -1,26 +1,29 @@
1
- import React__default from 'react';
1
+ import { useState, useCallback, useEffect } from 'react';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import { useAsyncRetry } from 'react-use';
4
4
  import { format } from 'date-fns';
5
5
  import { adoptionInsightsApiRef } from '../api/index.esm.js';
6
6
  import { useDateRange } from '../components/Header/DateRangeContext.esm.js';
7
+ import { formatInTimeZone } from 'date-fns-tz';
7
8
 
8
9
  const useUsers = () => {
9
- const [loadingData, setLoadingData] = React__default.useState(true);
10
- const [users, setUsers] = React__default.useState({ data: [] });
10
+ const [loadingData, setLoadingData] = useState(true);
11
+ const [users, setUsers] = useState({ data: [] });
11
12
  const { startDateRange, endDateRange } = useDateRange();
12
13
  const api = useApi(adoptionInsightsApiRef);
13
- const getUsers = React__default.useCallback(async () => {
14
+ const getUsers = useCallback(async () => {
15
+ const timezone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
14
16
  return await api.getUsers({
15
17
  type: "total_users",
16
- start_date: startDateRange ? format(startDateRange, "yyyy-MM-dd") : void 0,
17
- end_date: endDateRange ? format(endDateRange, "yyyy-MM-dd") : void 0
18
+ start_date: startDateRange ? formatInTimeZone(startDateRange, timezone, "yyyy-MM-dd") : void 0,
19
+ end_date: endDateRange ? format(endDateRange, "yyyy-MM-dd") : void 0,
20
+ timezone
18
21
  }).then((response) => setUsers(response ?? { data: [] }));
19
22
  }, [api, startDateRange, endDateRange]);
20
23
  const { error, loading } = useAsyncRetry(async () => {
21
24
  return await getUsers();
22
25
  }, [getUsers]);
23
- React__default.useEffect(() => {
26
+ useEffect(() => {
24
27
  let mounted = true;
25
28
  if (!loading && mounted) {
26
29
  setLoadingData(false);
@@ -1 +1 @@
1
- {"version":3,"file":"useUsers.esm.js","sources":["../../src/hooks/useUsers.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { format } from 'date-fns';\n\nimport { UsersResponse } from '../types';\nimport { adoptionInsightsApiRef } from '../api';\nimport { useDateRange } from '../components/Header/DateRangeContext';\n\nexport const useUsers = (): {\n users: UsersResponse;\n error: Error | undefined;\n loading: boolean;\n} => {\n const [loadingData, setLoadingData] = React.useState<boolean>(true);\n const [users, setUsers] = React.useState<UsersResponse>({ data: [] });\n\n const { startDateRange, endDateRange } = useDateRange();\n\n const api = useApi(adoptionInsightsApiRef);\n\n const getUsers = React.useCallback(async () => {\n return await api\n .getUsers({\n type: 'total_users',\n start_date: startDateRange\n ? format(startDateRange, 'yyyy-MM-dd')\n : undefined,\n end_date: endDateRange ? format(endDateRange, 'yyyy-MM-dd') : undefined,\n })\n .then(response => setUsers(response ?? { data: [] }));\n }, [api, startDateRange, endDateRange]);\n\n const { error, loading } = useAsyncRetry(async () => {\n return await getUsers();\n }, [getUsers]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!loading && mounted) {\n setLoadingData(false);\n }\n return () => {\n mounted = false;\n };\n }, [loading]);\n\n return { users, error, loading: loadingData };\n};\n"],"names":["React"],"mappings":";;;;;;;AAyBO,MAAM,WAAW,MAInB;AACH,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAAA,cAAA,CAAM,SAAkB,IAAI,CAAA;AAClE,EAAM,MAAA,CAAC,KAAO,EAAA,QAAQ,CAAI,GAAAA,cAAA,CAAM,SAAwB,EAAE,IAAA,EAAM,EAAC,EAAG,CAAA;AAEpE,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAa,EAAA,GAAI,YAAa,EAAA;AAEtD,EAAM,MAAA,GAAA,GAAM,OAAO,sBAAsB,CAAA;AAEzC,EAAM,MAAA,QAAA,GAAWA,cAAM,CAAA,WAAA,CAAY,YAAY;AAC7C,IAAO,OAAA,MAAM,IACV,QAAS,CAAA;AAAA,MACR,IAAM,EAAA,aAAA;AAAA,MACN,UAAY,EAAA,cAAA,GACR,MAAO,CAAA,cAAA,EAAgB,YAAY,CACnC,GAAA,MAAA;AAAA,MACJ,QAAU,EAAA,YAAA,GAAe,MAAO,CAAA,YAAA,EAAc,YAAY,CAAI,GAAA;AAAA,KAC/D,CACA,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA,QAAA,CAAS,QAAY,IAAA,EAAE,IAAM,EAAA,EAAG,EAAC,CAAC,CAAA;AAAA,GACrD,EAAA,CAAC,GAAK,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA;AAEtC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAQ,EAAA,GAAI,cAAc,YAAY;AACnD,IAAA,OAAO,MAAM,QAAS,EAAA;AAAA,GACxB,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,cAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA;AAEtB,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,KAAA,EAAO,KAAO,EAAA,OAAA,EAAS,WAAY,EAAA;AAC9C;;;;"}
1
+ {"version":3,"file":"useUsers.esm.js","sources":["../../src/hooks/useUsers.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useCallback, useState } from 'react';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useAsyncRetry } from 'react-use';\nimport { format } from 'date-fns';\n\nimport { UsersResponse } from '../types';\nimport { adoptionInsightsApiRef } from '../api';\nimport { useDateRange } from '../components/Header/DateRangeContext';\nimport { formatInTimeZone } from 'date-fns-tz';\n\nexport const useUsers = (): {\n users: UsersResponse;\n error: Error | undefined;\n loading: boolean;\n} => {\n const [loadingData, setLoadingData] = useState<boolean>(true);\n const [users, setUsers] = useState<UsersResponse>({ data: [] });\n\n const { startDateRange, endDateRange } = useDateRange();\n\n const api = useApi(adoptionInsightsApiRef);\n\n const getUsers = useCallback(async () => {\n const timezone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n return await api\n .getUsers({\n type: 'total_users',\n start_date: startDateRange\n ? formatInTimeZone(startDateRange, timezone, 'yyyy-MM-dd')\n : undefined,\n end_date: endDateRange ? format(endDateRange, 'yyyy-MM-dd') : undefined,\n timezone,\n })\n .then(response => setUsers(response ?? { data: [] }));\n }, [api, startDateRange, endDateRange]);\n\n const { error, loading } = useAsyncRetry(async () => {\n return await getUsers();\n }, [getUsers]);\n\n useEffect(() => {\n let mounted = true;\n if (!loading && mounted) {\n setLoadingData(false);\n }\n return () => {\n mounted = false;\n };\n }, [loading]);\n\n return { users, error, loading: loadingData };\n};\n"],"names":[],"mappings":";;;;;;;;AA0BO,MAAM,WAAW,MAInB;AACH,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAkB,IAAI,CAAA;AAC5D,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAI,SAAwB,EAAE,IAAA,EAAM,EAAC,EAAG,CAAA;AAE9D,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAa,EAAA,GAAI,YAAa,EAAA;AAEtD,EAAM,MAAA,GAAA,GAAM,OAAO,sBAAsB,CAAA;AAEzC,EAAM,MAAA,QAAA,GAAW,YAAY,YAAY;AACvC,IAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAE7D,IAAO,OAAA,MAAM,IACV,QAAS,CAAA;AAAA,MACR,IAAM,EAAA,aAAA;AAAA,MACN,YAAY,cACR,GAAA,gBAAA,CAAiB,cAAgB,EAAA,QAAA,EAAU,YAAY,CACvD,GAAA,MAAA;AAAA,MACJ,QAAU,EAAA,YAAA,GAAe,MAAO,CAAA,YAAA,EAAc,YAAY,CAAI,GAAA,MAAA;AAAA,MAC9D;AAAA,KACD,CACA,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA,QAAA,CAAS,QAAY,IAAA,EAAE,IAAM,EAAA,EAAG,EAAC,CAAC,CAAA;AAAA,GACrD,EAAA,CAAC,GAAK,EAAA,cAAA,EAAgB,YAAY,CAAC,CAAA;AAEtC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAQ,EAAA,GAAI,cAAc,YAAY;AACnD,IAAA,OAAO,MAAM,QAAS,EAAA;AAAA,GACxB,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAU,GAAA,IAAA;AACd,IAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA;AAEtB,IAAA,OAAO,MAAM;AACX,MAAU,OAAA,GAAA,KAAA;AAAA,KACZ;AAAA,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,KAAA,EAAO,KAAO,EAAA,OAAA,EAAS,WAAY,EAAA;AAC9C;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- /// <reference types="react" />
2
- import * as react from 'react';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
4
3
  import { IconComponent } from '@backstage/core-plugin-api';
5
4
 
@@ -14,7 +13,7 @@ declare const adoptionInsightsPlugin: _backstage_core_plugin_api.BackstagePlugin
14
13
  * Frontend page for Adoption Insights
15
14
  * @public
16
15
  */
17
- declare const AdoptionInsightsPage: () => react.JSX.Element | null;
16
+ declare const AdoptionInsightsPage: () => react_jsx_runtime.JSX.Element | null;
18
17
  /**
19
18
  * @public
20
19
  */
@@ -1,35 +1,34 @@
1
- import { startOfToday, format, startOfYear, subDays, startOfMonth, startOfWeek, isToday, isYesterday } from 'date-fns';
1
+ import { subDays, isToday, isYesterday, startOfWeek, addDays, getYear, addHours } from 'date-fns';
2
+ import { utcToZonedTime, formatInTimeZone, format } from 'date-fns-tz';
2
3
 
4
+ const formatRange = (start, end, timeZone = "UTC") => ({
5
+ startDate: `${formatInTimeZone(start, timeZone, "yyyy-MM-dd")}T00:00:00`,
6
+ endDate: `${formatInTimeZone(end, timeZone, "yyyy-MM-dd")}T23:59:59.999`
7
+ });
3
8
  const getDateRange = (value) => {
4
9
  const startDate = null;
5
10
  const endDate = null;
6
- const today = startOfToday();
11
+ const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
12
+ const today = utcToZonedTime(/* @__PURE__ */ new Date(), timeZone);
7
13
  switch (value) {
8
14
  case "today":
9
- return {
10
- startDate: format(today, "yyyy-MM-dd"),
11
- endDate: format(today, "yyyy-MM-dd")
12
- };
13
- case "last-week":
14
- return {
15
- startDate: format(startOfWeek(today), "yyyy-MM-dd"),
16
- endDate: format(today, "yyyy-MM-dd")
17
- };
18
- case "last-month":
19
- return {
20
- startDate: format(startOfMonth(today), "yyyy-MM-dd"),
21
- endDate: format(today, "yyyy-MM-dd")
22
- };
23
- case "last-28-days":
24
- return {
25
- startDate: format(subDays(today, 27), "yyyy-MM-dd"),
26
- endDate: format(today, "yyyy-MM-dd")
27
- };
28
- case "last-year":
29
- return {
30
- startDate: format(startOfYear(today), "yyyy-MM-dd"),
31
- endDate: format(today, "yyyy-MM-dd")
32
- };
15
+ return formatRange(today, today, timeZone);
16
+ case "last-week": {
17
+ const startingDate = subDays(today, 6);
18
+ return formatRange(startingDate, today, timeZone);
19
+ }
20
+ case "last-month": {
21
+ const startDay = subDays(today, 29);
22
+ return formatRange(startDay, today, timeZone);
23
+ }
24
+ case "last-28-days": {
25
+ const startDay = subDays(today, 27);
26
+ return formatRange(startDay, today, timeZone);
27
+ }
28
+ case "last-year": {
29
+ const startOfTheYear = subDays(today, 364);
30
+ return formatRange(startOfTheYear, today, timeZone);
31
+ }
33
32
  default:
34
33
  return { startDate, endDate };
35
34
  }
@@ -79,14 +78,18 @@ const getXAxisTickValues = (data, grouping) => {
79
78
  };
80
79
  const getXAxisformat = (date, grouping) => {
81
80
  const dateObj = new Date(date);
81
+ const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
82
+ if (isNaN(dateObj.getTime())) {
83
+ return formatInTimeZone(date, timeZone, "d MMMM yy");
84
+ }
82
85
  if (grouping === "hourly") {
83
- return format(dateObj, "hh:mm a");
86
+ return formatInTimeZone(dateObj, timeZone, "hh:mm a");
84
87
  }
85
88
  if (grouping === "daily" || grouping === "weekly") {
86
- return format(dateObj, "d MMMM yy");
89
+ return formatInTimeZone(dateObj, timeZone, "d MMMM yy");
87
90
  }
88
91
  if (grouping === "monthly") {
89
- return format(dateObj, "MMM yyyy");
92
+ return formatInTimeZone(dateObj, timeZone, "MMM yyyy");
90
93
  }
91
94
  return date;
92
95
  };
@@ -143,6 +146,43 @@ const determineGrouping = (startDate, endDate) => {
143
146
  }
144
147
  return "monthly";
145
148
  };
149
+ const formatHourlyBucket = (date) => {
150
+ const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
151
+ const start = formatInTimeZone(date, timeZone, "h:mm");
152
+ const end = formatInTimeZone(addHours(date, 1), timeZone, "h:mm a");
153
+ const labelDate = formatInTimeZone(date, timeZone, "MMMM d, yyyy");
154
+ return `${labelDate}, ${start}\u2013${end}`;
155
+ };
156
+ const formatDateWithRange = (date, startDateRange, endDateRange) => {
157
+ const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
158
+ const today = utcToZonedTime(/* @__PURE__ */ new Date(), timeZone);
159
+ const end = endDateRange ?? today;
160
+ const start = startDateRange ?? subDays(end, 364);
161
+ const startLabel = formatInTimeZone(start, timeZone, "MMM d, yyyy");
162
+ const endLabel = formatInTimeZone(end, timeZone, "MMM d, yyyy");
163
+ const labelDate = formatInTimeZone(date, timeZone, "MMMM d, yyyy");
164
+ return `${labelDate}
165
+ (filtered by ${startLabel} \u2013 ${endLabel})`;
166
+ };
167
+ const formatWeeklyBucket = (date) => {
168
+ const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;
169
+ const start = startOfWeek(date, { weekStartsOn: 1 });
170
+ const end = addDays(start, 6);
171
+ const sameYear = getYear(start) === getYear(end);
172
+ const startLabel = formatInTimeZone(
173
+ start,
174
+ timeZone,
175
+ sameYear ? "MMM d" : "MMM d, yyyy"
176
+ );
177
+ const endLabel = formatInTimeZone(end, timeZone, "MMM d, yyyy");
178
+ return `${startLabel} \u2013 ${endLabel}`;
179
+ };
180
+ const formatTooltipHeaderLabel = (key) => {
181
+ const words = key.replace(/_/g, " ").toLowerCase().split(" ");
182
+ return words.map(
183
+ (word, index) => index === 0 ? word.charAt(0).toUpperCase() + word.slice(1) : word
184
+ ).join(" ");
185
+ };
146
186
 
147
- export { determineGrouping, generateEventsUrl, getAverage, getDateRange, getLastUsedDay, getTotal, getUniqueCatalogEntityKinds, getXAxisTickValues, getXAxisformat };
187
+ export { determineGrouping, formatDateWithRange, formatHourlyBucket, formatRange, formatTooltipHeaderLabel, formatWeeklyBucket, generateEventsUrl, getAverage, getDateRange, getLastUsedDay, getTotal, getUniqueCatalogEntityKinds, getXAxisTickValues, getXAxisformat };
148
188
  //# sourceMappingURL=utils.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.esm.js","sources":["../../src/utils/utils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n format,\n startOfToday,\n startOfYear,\n isToday,\n isYesterday,\n startOfMonth,\n startOfWeek,\n subDays,\n} from 'date-fns';\nimport { APIsViewOptions } from '../types';\n\nexport const getDateRange = (value: string) => {\n const startDate: Date | null = null;\n const endDate: Date | null = null;\n const today = startOfToday();\n\n switch (value) {\n case 'today':\n return {\n startDate: format(today, 'yyyy-MM-dd'),\n endDate: format(today, 'yyyy-MM-dd'),\n };\n\n case 'last-week':\n return {\n startDate: format(startOfWeek(today), 'yyyy-MM-dd'),\n endDate: format(today, 'yyyy-MM-dd'),\n };\n\n case 'last-month':\n return {\n startDate: format(startOfMonth(today), 'yyyy-MM-dd'),\n endDate: format(today, 'yyyy-MM-dd'),\n };\n\n case 'last-28-days':\n return {\n startDate: format(subDays(today, 27), 'yyyy-MM-dd'),\n endDate: format(today, 'yyyy-MM-dd'),\n };\n\n case 'last-year':\n return {\n startDate: format(startOfYear(today), 'yyyy-MM-dd'),\n endDate: format(today, 'yyyy-MM-dd'),\n };\n\n default:\n return { startDate, endDate };\n }\n};\n\nexport const getXAxisTickValues = (data: any, grouping: string): string[] => {\n if (!data || data.length === 0) return [];\n if (data.length <= 2) return data.map((d: { date: string }) => d.date);\n\n const first = data[0].date;\n const last = data[data.length - 1].date;\n const selectedDates: string[] = [];\n\n const processGrouping = (unitExtractor: (date: string) => number) => {\n const selectedUnits = new Set<number>([\n unitExtractor(first),\n unitExtractor(last),\n ]);\n\n if (data.length <= 4) {\n data.forEach((d: { date: string }) => {\n const unit = unitExtractor(d.date);\n if (!selectedUnits.has(unit)) {\n selectedUnits.add(unit);\n selectedDates.push(d.date);\n }\n });\n } else if (data.length === 6) {\n selectedDates.push(data[2].date);\n selectedDates.push(data[3].date);\n } else if (data.length === 9) {\n selectedDates.push(data[3].date);\n selectedDates.push(data[5].date);\n } else {\n const intervals = [];\n if (data.length !== 5) {\n intervals.push(Math.floor((data.length - 1) / 3));\n }\n intervals.push(Math.floor(((data.length - 1) * 2) / 3));\n intervals.forEach(i => selectedDates.push(data[i].date));\n }\n };\n\n if (grouping === 'hourly') {\n processGrouping(date => new Date(date).getHours());\n } else if (grouping === 'daily' || grouping === 'weekly') {\n processGrouping(date => new Date(date).getDate());\n } else if (grouping === 'monthly') {\n processGrouping(date => new Date(date).getMonth());\n }\n\n return [first, ...selectedDates, last];\n};\n\nexport const getXAxisformat = (date: string, grouping: string) => {\n const dateObj = new Date(date);\n\n if (grouping === 'hourly') {\n return format(dateObj, 'hh:mm a');\n }\n\n if (grouping === 'daily' || grouping === 'weekly') {\n return format(dateObj, 'd MMMM yy');\n }\n\n if (grouping === 'monthly') {\n return format(dateObj, 'MMM yyyy');\n }\n\n return date;\n};\n\nexport const getLastUsedDay = (timestamp: string) => {\n const date = new Date(timestamp);\n\n if (isToday(date)) {\n return 'Today';\n } else if (isYesterday(date)) {\n return 'Yesterday';\n }\n return format(date, 'dd MMM yyyy');\n};\n\nexport const getAverage = <T extends Record<string, any>>(\n data: T[],\n key: keyof T,\n) => {\n if (!data || data.length === 0) return 0;\n\n const totalSum = data.reduce(\n (sum, entry) => sum + Number(entry[key] || 0),\n 0,\n );\n return totalSum / data.length;\n};\n\nexport const getTotal = <T extends Record<string, any>>(\n data: T[],\n key: keyof T,\n) => {\n const totalSum = data?.reduce(\n (sum, entry) => sum + Number(entry[key] || 0),\n 0,\n );\n return totalSum;\n};\n\nexport const getUniqueCatalogEntityKinds = (data: { kind: string }[]) => {\n const allKinds = data.map(\n item => item.kind.charAt(0).toLocaleUpperCase('en-US') + item.kind.slice(1),\n );\n const uniqueKinds = Array.from(new Set([...allKinds]));\n return uniqueKinds;\n};\n\nexport const generateEventsUrl = (\n baseUrl: string,\n options: APIsViewOptions,\n): string => {\n const params = new URLSearchParams();\n\n Object.entries(options).forEach(([key, value]) => {\n if (value && value !== undefined) {\n params.append(key, String(value));\n }\n });\n\n return `${baseUrl}?${params.toString()}`;\n};\n\nexport const determineGrouping = (\n startDate: Date | null,\n endDate: Date | null,\n): string => {\n if (\n startDate &&\n endDate &&\n (isNaN(startDate.getTime()) || isNaN(endDate.getTime()))\n ) {\n throw new Error('Invalid date format');\n }\n\n if (startDate && endDate) {\n const diffInMs = endDate.getTime() - startDate.getTime();\n const daysDiff = Math.ceil(diffInMs / (1000 * 60 * 60 * 24));\n\n if (daysDiff <= 1) return 'hourly';\n if (daysDiff <= 7) return 'daily';\n if (daysDiff <= 30) return 'weekly';\n }\n\n return 'monthly';\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.esm.js","sources":["../../src/utils/utils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n addDays,\n addHours,\n getYear,\n isToday,\n isYesterday,\n startOfWeek,\n subDays,\n} from 'date-fns';\n\nimport { utcToZonedTime, format, formatInTimeZone } from 'date-fns-tz';\n\nimport { APIsViewOptions } from '../types';\n\nexport const formatRange = (\n start: Date,\n end: Date,\n timeZone: string = 'UTC',\n): { startDate: string; endDate: string } => ({\n startDate: `${formatInTimeZone(start, timeZone, 'yyyy-MM-dd')}T00:00:00`,\n endDate: `${formatInTimeZone(end, timeZone, 'yyyy-MM-dd')}T23:59:59.999`,\n});\n\nexport const getDateRange = (value: string) => {\n const startDate: Date | null = null;\n const endDate: Date | null = null;\n\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n const today = utcToZonedTime(new Date(), timeZone);\n\n switch (value) {\n case 'today':\n return formatRange(today, today, timeZone);\n\n case 'last-week': {\n const startingDate = subDays(today, 6);\n return formatRange(startingDate, today, timeZone);\n }\n\n case 'last-month': {\n const startDay = subDays(today, 29);\n return formatRange(startDay, today, timeZone);\n }\n\n case 'last-28-days': {\n const startDay = subDays(today, 27);\n return formatRange(startDay, today, timeZone);\n }\n\n case 'last-year': {\n const startOfTheYear = subDays(today, 364); // 364 days before today\n return formatRange(startOfTheYear, today, timeZone);\n }\n\n default:\n return { startDate, endDate };\n }\n};\n\nexport const getXAxisTickValues = (data: any, grouping: string): string[] => {\n if (!data || data.length === 0) return [];\n if (data.length <= 2) return data.map((d: { date: string }) => d.date);\n\n const first = data[0].date;\n const last = data[data.length - 1].date;\n const selectedDates: string[] = [];\n\n const processGrouping = (unitExtractor: (date: string) => number) => {\n const selectedUnits = new Set<number>([\n unitExtractor(first),\n unitExtractor(last),\n ]);\n\n if (data.length <= 4) {\n data.forEach((d: { date: string }) => {\n const unit = unitExtractor(d.date);\n if (!selectedUnits.has(unit)) {\n selectedUnits.add(unit);\n selectedDates.push(d.date);\n }\n });\n } else if (data.length === 6) {\n selectedDates.push(data[2].date);\n selectedDates.push(data[3].date);\n } else if (data.length === 9) {\n selectedDates.push(data[3].date);\n selectedDates.push(data[5].date);\n } else {\n const intervals = [];\n if (data.length !== 5) {\n intervals.push(Math.floor((data.length - 1) / 3));\n }\n intervals.push(Math.floor(((data.length - 1) * 2) / 3));\n intervals.forEach(i => selectedDates.push(data[i].date));\n }\n };\n\n if (grouping === 'hourly') {\n processGrouping(date => new Date(date).getHours());\n } else if (grouping === 'daily' || grouping === 'weekly') {\n processGrouping(date => new Date(date).getDate());\n } else if (grouping === 'monthly') {\n processGrouping(date => new Date(date).getMonth());\n }\n\n return [first, ...selectedDates, last];\n};\n\nexport const getXAxisformat = (date: string, grouping: string) => {\n const dateObj = new Date(date);\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n if (isNaN(dateObj.getTime())) {\n return formatInTimeZone(date, timeZone, 'd MMMM yy');\n }\n\n if (grouping === 'hourly') {\n return formatInTimeZone(dateObj, timeZone, 'hh:mm a');\n }\n\n if (grouping === 'daily' || grouping === 'weekly') {\n return formatInTimeZone(dateObj, timeZone, 'd MMMM yy');\n }\n\n if (grouping === 'monthly') {\n return formatInTimeZone(dateObj, timeZone, 'MMM yyyy');\n }\n\n return date;\n};\n\nexport const getLastUsedDay = (timestamp: string) => {\n const date = new Date(timestamp);\n\n if (isToday(date)) {\n return 'Today';\n } else if (isYesterday(date)) {\n return 'Yesterday';\n }\n return format(date, 'dd MMM yyyy');\n};\n\nexport const getAverage = <T extends Record<string, any>>(\n data: T[],\n key: keyof T,\n) => {\n if (!data || data.length === 0) return 0;\n\n const totalSum = data.reduce(\n (sum, entry) => sum + Number(entry[key] || 0),\n 0,\n );\n return totalSum / data.length;\n};\n\nexport const getTotal = <T extends Record<string, any>>(\n data: T[],\n key: keyof T,\n) => {\n const totalSum = data?.reduce(\n (sum, entry) => sum + Number(entry[key] || 0),\n 0,\n );\n return totalSum;\n};\n\nexport const getUniqueCatalogEntityKinds = (data: { kind: string }[]) => {\n const allKinds = data.map(\n item => item.kind.charAt(0).toLocaleUpperCase('en-US') + item.kind.slice(1),\n );\n const uniqueKinds = Array.from(new Set([...allKinds]));\n return uniqueKinds;\n};\n\nexport const generateEventsUrl = (\n baseUrl: string,\n options: APIsViewOptions,\n): string => {\n const params = new URLSearchParams();\n\n Object.entries(options).forEach(([key, value]) => {\n if (value && value !== undefined) {\n params.append(key, String(value));\n }\n });\n\n return `${baseUrl}?${params.toString()}`;\n};\n\nexport const determineGrouping = (\n startDate: Date | null,\n endDate: Date | null,\n): string => {\n if (\n startDate &&\n endDate &&\n (isNaN(startDate.getTime()) || isNaN(endDate.getTime()))\n ) {\n throw new Error('Invalid date format');\n }\n\n if (startDate && endDate) {\n const diffInMs = endDate.getTime() - startDate.getTime();\n const daysDiff = Math.ceil(diffInMs / (1000 * 60 * 60 * 24));\n\n if (daysDiff <= 1) return 'hourly';\n if (daysDiff <= 7) return 'daily';\n if (daysDiff <= 30) return 'weekly';\n }\n\n return 'monthly';\n};\n\nexport const formatWithTimeZone = (\n date: Date,\n formatStr: string = 'yyyy-MM-dd',\n) => {\n const timezone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n return formatInTimeZone(date, timezone, formatStr);\n};\n\nexport const formatHourlyBucket = (date: Date): string => {\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const start = formatInTimeZone(date, timeZone, 'h:mm');\n const end = formatInTimeZone(addHours(date, 1), timeZone, 'h:mm a');\n const labelDate = formatInTimeZone(date, timeZone, 'MMMM d, yyyy');\n\n return `${labelDate}, ${start}–${end}`;\n};\n\nexport const formatDateWithRange = (\n date: Date,\n startDateRange?: Date | null,\n endDateRange?: Date | null,\n): string => {\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n const today = utcToZonedTime(new Date(), timeZone);\n const end = endDateRange ?? today;\n const start = startDateRange ?? subDays(end, 364);\n\n const startLabel = formatInTimeZone(start, timeZone, 'MMM d, yyyy');\n const endLabel = formatInTimeZone(end, timeZone, 'MMM d, yyyy');\n const labelDate = formatInTimeZone(date, timeZone, 'MMMM d, yyyy');\n return `${labelDate}\\n (filtered by ${startLabel} – ${endLabel})`;\n};\n\nexport const formatWeeklyBucket = (date: Date): string => {\n const timeZone = new Intl.DateTimeFormat().resolvedOptions().timeZone;\n const start = startOfWeek(date, { weekStartsOn: 1 }); // Monday start\n const end = addDays(start, 6);\n\n const sameYear = getYear(start) === getYear(end);\n\n const startLabel = formatInTimeZone(\n start,\n timeZone,\n sameYear ? 'MMM d' : 'MMM d, yyyy',\n );\n const endLabel = formatInTimeZone(end, timeZone, 'MMM d, yyyy');\n\n return `${startLabel} – ${endLabel}`;\n};\n\nexport const formatTooltipHeaderLabel = (key: string) => {\n const words = key.replace(/_/g, ' ').toLowerCase().split(' ');\n return words\n .map((word, index) =>\n index === 0 ? word.charAt(0).toUpperCase() + word.slice(1) : word,\n )\n .join(' ');\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-adoption-insights",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -34,21 +34,22 @@
34
34
  "postpack": "backstage-cli package postpack"
35
35
  },
36
36
  "dependencies": {
37
- "@backstage/catalog-model": "^1.7.3",
38
- "@backstage/core-components": "^0.16.4",
39
- "@backstage/core-plugin-api": "^1.10.4",
40
- "@backstage/plugin-catalog-react": "^1.15.2",
41
- "@backstage/plugin-permission-react": "^0.4.31",
42
- "@backstage/theme": "^0.6.4",
37
+ "@backstage/catalog-model": "^1.7.4",
38
+ "@backstage/core-components": "^0.17.2",
39
+ "@backstage/core-plugin-api": "^1.10.7",
40
+ "@backstage/plugin-catalog-react": "^1.18.0",
41
+ "@backstage/plugin-permission-react": "^0.4.34",
42
+ "@backstage/theme": "^0.6.6",
43
43
  "@material-ui/core": "^4.12.2",
44
44
  "@material-ui/icons": "^4.9.1",
45
45
  "@material-ui/lab": "4.0.0-alpha.61",
46
- "@mui/icons-material": "5.16.4",
46
+ "@mui/icons-material": "5.17.1",
47
47
  "@mui/lab": "5.0.0-alpha.176",
48
- "@mui/material": "5.16.14",
48
+ "@mui/material": "5.17.1",
49
49
  "@mui/x-date-pickers": "5.0.20",
50
- "@red-hat-developer-hub/backstage-plugin-adoption-insights-common": "^0.2.0",
50
+ "@red-hat-developer-hub/backstage-plugin-adoption-insights-common": "^0.3.0",
51
51
  "date-fns": "2.30.0",
52
+ "date-fns-tz": "1.3.7",
52
53
  "react-use": "^17.2.4",
53
54
  "recharts": "^2.15.1"
54
55
  },
@@ -56,12 +57,13 @@
56
57
  "react": "^16.13.1 || ^17.0.0 || ^18.0.0"
57
58
  },
58
59
  "devDependencies": {
59
- "@backstage/cli": "^0.30.0",
60
+ "@backstage/cli": "^0.32.1",
60
61
  "@backstage/config": "^1.3.2",
61
- "@backstage/core-app-api": "^1.15.5",
62
- "@backstage/dev-utils": "^1.1.7",
63
- "@backstage/test-utils": "^1.7.5",
64
- "@red-hat-developer-hub/backstage-plugin-theme": "^0.6.0",
62
+ "@backstage/core-app-api": "^1.17.0",
63
+ "@backstage/dev-utils": "^1.1.10",
64
+ "@backstage/plugin-catalog": "^1.30.0",
65
+ "@backstage/test-utils": "^1.7.8",
66
+ "@red-hat-developer-hub/backstage-plugin-theme": "^0.9.0",
65
67
  "@testing-library/jest-dom": "^6.0.0",
66
68
  "@testing-library/react": "^14.0.0",
67
69
  "@testing-library/user-event": "^14.0.0",
@@ -74,8 +76,8 @@
74
76
  ],
75
77
  "typesVersions": {
76
78
  "*": {
77
- "index": [
78
- "dist/index.d.ts"
79
+ "package.json": [
80
+ "package.json"
79
81
  ]
80
82
  }
81
83
  },
@@ -1,87 +0,0 @@
1
- import React__default from 'react';
2
- import Paper from '@mui/material/Paper';
3
- import Typography from '@mui/material/Typography';
4
- import { useTheme } from '@mui/material/styles';
5
- import Box from '@mui/material/Box';
6
- import { format } from 'date-fns';
7
-
8
- const CustomTooltip = ({
9
- active,
10
- payload,
11
- label,
12
- grouping
13
- }) => {
14
- const theme = useTheme();
15
- if (active && payload?.length) {
16
- const date = label ? new Date(label) : /* @__PURE__ */ new Date();
17
- return /* @__PURE__ */ React__default.createElement(
18
- Paper,
19
- {
20
- elevation: 1,
21
- sx: {
22
- padding: "12px 16px",
23
- boxShadow: 4,
24
- borderRadius: 2
25
- }
26
- },
27
- /* @__PURE__ */ React__default.createElement(
28
- Typography,
29
- {
30
- sx: {
31
- fontSize: "0.875rem",
32
- fontWeight: 500,
33
- marginBottom: "12px"
34
- }
35
- },
36
- grouping === "hourly" ? format(date, "MMMM dd, yyyy hh:mm a") : format(date, "MMMM, dd yyyy")
37
- ),
38
- /* @__PURE__ */ React__default.createElement(Box, { display: "flex", justifyContent: "space-between", alignItems: "center" }, /* @__PURE__ */ React__default.createElement(Box, { mr: 3 }, /* @__PURE__ */ React__default.createElement(
39
- Typography,
40
- {
41
- sx: {
42
- fontSize: "0.875rem",
43
- fontWeight: 500,
44
- color: theme.palette.text.secondary
45
- }
46
- },
47
- "Returning users"
48
- ), /* @__PURE__ */ React__default.createElement(
49
- Typography,
50
- {
51
- sx: {
52
- fontSize: "2.5rem",
53
- fontWeight: 500,
54
- color: "#009596",
55
- lineHeight: 1.2
56
- }
57
- },
58
- payload[0]?.value
59
- )), /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(
60
- Typography,
61
- {
62
- sx: {
63
- fontSize: "0.875rem",
64
- fontWeight: 500,
65
- color: theme.palette.text.secondary
66
- }
67
- },
68
- "New users"
69
- ), /* @__PURE__ */ React__default.createElement(
70
- Typography,
71
- {
72
- sx: {
73
- fontSize: "2.5rem",
74
- fontWeight: 500,
75
- color: "#009596",
76
- lineHeight: 1.2
77
- }
78
- },
79
- payload[1]?.value
80
- )))
81
- );
82
- }
83
- return null;
84
- };
85
-
86
- export { CustomTooltip as default };
87
- //# sourceMappingURL=CustomTooltip.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CustomTooltip.esm.js","sources":["../../../src/components/ActiveUsers/CustomTooltip.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport { useTheme } from '@mui/material/styles';\nimport Box from '@mui/material/Box';\nimport { format } from 'date-fns';\n\nconst CustomTooltip = ({\n active,\n payload,\n label,\n grouping,\n}: {\n active?: boolean;\n payload?: any[];\n label?: string;\n grouping?: string;\n}) => {\n const theme = useTheme();\n\n if (active && payload?.length) {\n const date = label ? new Date(label) : new Date();\n return (\n <Paper\n elevation={1}\n sx={{\n padding: '12px 16px',\n boxShadow: 4,\n borderRadius: 2,\n }}\n >\n <Typography\n sx={{\n fontSize: '0.875rem',\n fontWeight: 500,\n marginBottom: '12px',\n }}\n >\n {grouping === 'hourly'\n ? format(date, 'MMMM dd, yyyy hh:mm a')\n : format(date, 'MMMM, dd yyyy')}\n </Typography>\n\n <Box display=\"flex\" justifyContent=\"space-between\" alignItems=\"center\">\n <Box mr={3}>\n <Typography\n sx={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n }}\n >\n Returning users\n </Typography>\n <Typography\n sx={{\n fontSize: '2.5rem',\n fontWeight: 500,\n color: '#009596',\n lineHeight: 1.2,\n }}\n >\n {payload[0]?.value}\n </Typography>\n </Box>\n\n <Box>\n <Typography\n sx={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n }}\n >\n New users\n </Typography>\n <Typography\n sx={{\n fontSize: '2.5rem',\n fontWeight: 500,\n color: '#009596',\n lineHeight: 1.2,\n }}\n >\n {payload[1]?.value}\n </Typography>\n </Box>\n </Box>\n </Paper>\n );\n }\n return null;\n};\n\nexport default CustomTooltip;\n"],"names":["React"],"mappings":";;;;;;;AAuBA,MAAM,gBAAgB,CAAC;AAAA,EACrB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAKM,KAAA;AACJ,EAAA,MAAM,QAAQ,QAAS,EAAA;AAEvB,EAAI,IAAA,MAAA,IAAU,SAAS,MAAQ,EAAA;AAC7B,IAAA,MAAM,OAAO,KAAQ,GAAA,IAAI,KAAK,KAAK,CAAA,uBAAQ,IAAK,EAAA;AAChD,IACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,CAAA;AAAA,QACX,EAAI,EAAA;AAAA,UACF,OAAS,EAAA,WAAA;AAAA,UACT,SAAW,EAAA,CAAA;AAAA,UACX,YAAc,EAAA;AAAA;AAChB,OAAA;AAAA,sBAEAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,UAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,YAAc,EAAA;AAAA;AAChB,SAAA;AAAA,QAEC,QAAA,KAAa,WACV,MAAO,CAAA,IAAA,EAAM,uBAAuB,CACpC,GAAA,MAAA,CAAO,MAAM,eAAe;AAAA,OAClC;AAAA,sBAEAA,cAAA,CAAA,aAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAQ,MAAO,EAAA,cAAA,EAAe,eAAgB,EAAA,UAAA,EAAW,QAC5D,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,CACP,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,UAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA;AAC5B,SAAA;AAAA,QACD;AAAA,OAGD,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,QAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,KAAO,EAAA,SAAA;AAAA,YACP,UAAY,EAAA;AAAA;AACd,SAAA;AAAA,QAEC,OAAA,CAAQ,CAAC,CAAG,EAAA;AAAA,OAEjB,CAEA,kBAAAA,cAAA,CAAA,aAAA,CAAC,GACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,UAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA;AAC5B,SAAA;AAAA,QACD;AAAA,OAGD,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,QAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,KAAO,EAAA,SAAA;AAAA,YACP,UAAY,EAAA;AAAA;AACd,SAAA;AAAA,QAEC,OAAA,CAAQ,CAAC,CAAG,EAAA;AAAA,OAEjB,CACF;AAAA,KACF;AAAA;AAGJ,EAAO,OAAA,IAAA;AACT;;;;"}
@@ -1,66 +0,0 @@
1
- import React__default from 'react';
2
- import Paper from '@mui/material/Paper';
3
- import Typography from '@mui/material/Typography';
4
- import Box from '@mui/material/Box';
5
- import { useTheme } from '@mui/material/styles';
6
- import { format } from 'date-fns';
7
-
8
- const CustomTooltip = ({
9
- active,
10
- payload,
11
- label,
12
- grouping
13
- }) => {
14
- const theme = useTheme();
15
- if (active && payload?.length) {
16
- const date = label ? new Date(label) : /* @__PURE__ */ new Date();
17
- return /* @__PURE__ */ React__default.createElement(
18
- Paper,
19
- {
20
- elevation: 1,
21
- sx: {
22
- padding: "12px 16px",
23
- boxShadow: 4,
24
- borderRadius: 2
25
- }
26
- },
27
- /* @__PURE__ */ React__default.createElement(
28
- Typography,
29
- {
30
- sx: {
31
- fontSize: "0.875rem",
32
- fontWeight: 500,
33
- marginBottom: "12px"
34
- }
35
- },
36
- grouping === "hourly" ? format(date, "MMMM dd, yyyy hh:mm a") : format(date, "MMMM, dd yyyy")
37
- ),
38
- /* @__PURE__ */ React__default.createElement(Box, { mr: 3 }, /* @__PURE__ */ React__default.createElement(
39
- Typography,
40
- {
41
- sx: {
42
- fontSize: "0.875rem",
43
- fontWeight: 500,
44
- color: theme.palette.text.secondary
45
- }
46
- },
47
- "Number of searches"
48
- ), /* @__PURE__ */ React__default.createElement(
49
- Typography,
50
- {
51
- sx: {
52
- fontSize: "2.5rem",
53
- fontWeight: 500,
54
- color: "#009596",
55
- lineHeight: 1.2
56
- }
57
- },
58
- payload[0]?.value
59
- ))
60
- );
61
- }
62
- return null;
63
- };
64
-
65
- export { CustomTooltip as default };
66
- //# sourceMappingURL=CustomTooltip.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CustomTooltip.esm.js","sources":["../../../src/components/Searches/CustomTooltip.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\n\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport { useTheme } from '@mui/material/styles';\nimport { format } from 'date-fns';\n\nconst CustomTooltip = ({\n active,\n payload,\n label,\n grouping,\n}: {\n active?: boolean;\n payload?: any[];\n label?: string;\n grouping?: string;\n}) => {\n const theme = useTheme();\n\n if (active && payload?.length) {\n const date = label ? new Date(label) : new Date();\n return (\n <Paper\n elevation={1}\n sx={{\n padding: '12px 16px',\n boxShadow: 4,\n borderRadius: 2,\n }}\n >\n <Typography\n sx={{\n fontSize: '0.875rem',\n fontWeight: 500,\n marginBottom: '12px',\n }}\n >\n {grouping === 'hourly'\n ? format(date, 'MMMM dd, yyyy hh:mm a')\n : format(date, 'MMMM, dd yyyy')}\n </Typography>\n\n <Box mr={3}>\n <Typography\n sx={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n }}\n >\n Number of searches\n </Typography>\n <Typography\n sx={{\n fontSize: '2.5rem',\n fontWeight: 500,\n color: '#009596',\n lineHeight: 1.2,\n }}\n >\n {payload[0]?.value}\n </Typography>\n </Box>\n </Paper>\n );\n }\n return null;\n};\n\nexport default CustomTooltip;\n"],"names":["React"],"mappings":";;;;;;;AAuBA,MAAM,gBAAgB,CAAC;AAAA,EACrB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAKM,KAAA;AACJ,EAAA,MAAM,QAAQ,QAAS,EAAA;AAEvB,EAAI,IAAA,MAAA,IAAU,SAAS,MAAQ,EAAA;AAC7B,IAAA,MAAM,OAAO,KAAQ,GAAA,IAAI,KAAK,KAAK,CAAA,uBAAQ,IAAK,EAAA;AAChD,IACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,CAAA;AAAA,QACX,EAAI,EAAA;AAAA,UACF,OAAS,EAAA,WAAA;AAAA,UACT,SAAW,EAAA,CAAA;AAAA,UACX,YAAc,EAAA;AAAA;AAChB,OAAA;AAAA,sBAEAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,UAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,YAAc,EAAA;AAAA;AAChB,SAAA;AAAA,QAEC,QAAA,KAAa,WACV,MAAO,CAAA,IAAA,EAAM,uBAAuB,CACpC,GAAA,MAAA,CAAO,MAAM,eAAe;AAAA,OAClC;AAAA,sBAEAA,cAAA,CAAA,aAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,CACP,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,UAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA;AAC5B,SAAA;AAAA,QACD;AAAA,OAGD,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,EAAI,EAAA;AAAA,YACF,QAAU,EAAA,QAAA;AAAA,YACV,UAAY,EAAA,GAAA;AAAA,YACZ,KAAO,EAAA,SAAA;AAAA,YACP,UAAY,EAAA;AAAA;AACd,SAAA;AAAA,QAEC,OAAA,CAAQ,CAAC,CAAG,EAAA;AAAA,OAEjB;AAAA,KACF;AAAA;AAGJ,EAAO,OAAA,IAAA;AACT;;;;"}