@red-hat-developer-hub/backstage-plugin-adoption-insights 0.2.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 (46) hide show
  1. package/CHANGELOG.md +13 -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 +8 -7
  5. package/dist/components/ActiveUsers/ActiveUsers.esm.js.map +1 -1
  6. package/dist/components/ActiveUsers/ExportCSVButton.esm.js +1 -0
  7. package/dist/components/ActiveUsers/ExportCSVButton.esm.js.map +1 -1
  8. package/dist/components/CatalogEntities/CatalogEntities.esm.js +1 -1
  9. package/dist/components/CatalogEntities/CatalogEntities.esm.js.map +1 -1
  10. package/dist/components/Common/ChartTooltip.esm.js +91 -0
  11. package/dist/components/Common/ChartTooltip.esm.js.map +1 -0
  12. package/dist/components/Header/Header.esm.js +1 -0
  13. package/dist/components/Header/Header.esm.js.map +1 -1
  14. package/dist/components/Plugins/Plugins.esm.js +1 -1
  15. package/dist/components/Plugins/Plugins.esm.js.map +1 -1
  16. package/dist/components/Searches/Searches.esm.js +7 -7
  17. package/dist/components/Searches/Searches.esm.js.map +1 -1
  18. package/dist/components/Techdocs/Techdocs.esm.js +1 -1
  19. package/dist/components/Techdocs/Techdocs.esm.js.map +1 -1
  20. package/dist/components/Templates/Templates.esm.js +1 -1
  21. package/dist/components/Templates/Templates.esm.js.map +1 -1
  22. package/dist/components/Users/Tooltip.esm.js +1 -1
  23. package/dist/components/Users/Tooltip.esm.js.map +1 -1
  24. package/dist/components/Users/Users.esm.js +2 -2
  25. package/dist/components/Users/Users.esm.js.map +1 -1
  26. package/dist/hooks/useActiveUsers.esm.js +5 -3
  27. package/dist/hooks/useActiveUsers.esm.js.map +1 -1
  28. package/dist/hooks/useCatalogEntities.esm.js +4 -1
  29. package/dist/hooks/useCatalogEntities.esm.js.map +1 -1
  30. package/dist/hooks/usePlugins.esm.js +4 -1
  31. package/dist/hooks/usePlugins.esm.js.map +1 -1
  32. package/dist/hooks/useSearches.esm.js +6 -2
  33. package/dist/hooks/useSearches.esm.js.map +1 -1
  34. package/dist/hooks/useTechdocs.esm.js +4 -1
  35. package/dist/hooks/useTechdocs.esm.js.map +1 -1
  36. package/dist/hooks/useTemplates.esm.js +4 -1
  37. package/dist/hooks/useTemplates.esm.js.map +1 -1
  38. package/dist/hooks/useUsers.esm.js +5 -2
  39. package/dist/hooks/useUsers.esm.js.map +1 -1
  40. package/dist/utils/utils.esm.js +70 -30
  41. package/dist/utils/utils.esm.js.map +1 -1
  42. package/package.json +3 -2
  43. package/dist/components/ActiveUsers/CustomTooltip.esm.js +0 -98
  44. package/dist/components/ActiveUsers/CustomTooltip.esm.js.map +0 -1
  45. package/dist/components/Searches/CustomTooltip.esm.js +0 -71
  46. package/dist/components/Searches/CustomTooltip.esm.js.map +0 -1
@@ -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 { 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';\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 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 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":";;;;;;;AAyBO,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,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,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;;;;"}
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;;;;"}
@@ -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":";;;AA6BO,MAAM,WAAc,GAAA,CACzB,KACA,EAAA,GAAA,EACA,WAAmB,KACyB,MAAA;AAAA,EAC5C,WAAW,CAAG,EAAA,gBAAA,CAAiB,KAAO,EAAA,QAAA,EAAU,YAAY,CAAC,CAAA,SAAA,CAAA;AAAA,EAC7D,SAAS,CAAG,EAAA,gBAAA,CAAiB,GAAK,EAAA,QAAA,EAAU,YAAY,CAAC,CAAA,aAAA;AAC3D,CAAA;AAEa,MAAA,YAAA,GAAe,CAAC,KAAkB,KAAA;AAC7C,EAAA,MAAM,SAAyB,GAAA,IAAA;AAC/B,EAAA,MAAM,OAAuB,GAAA,IAAA;AAE7B,EAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAC7D,EAAA,MAAM,KAAQ,GAAA,cAAA,iBAAmB,IAAA,IAAA,IAAQ,QAAQ,CAAA;AAEjD,EAAA,QAAQ,KAAO;AAAA,IACb,KAAK,OAAA;AACH,MAAO,OAAA,WAAA,CAAY,KAAO,EAAA,KAAA,EAAO,QAAQ,CAAA;AAAA,IAE3C,KAAK,WAAa,EAAA;AAChB,MAAM,MAAA,YAAA,GAAe,OAAQ,CAAA,KAAA,EAAO,CAAC,CAAA;AACrC,MAAO,OAAA,WAAA,CAAY,YAAc,EAAA,KAAA,EAAO,QAAQ,CAAA;AAAA;AAClD,IAEA,KAAK,YAAc,EAAA;AACjB,MAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAA;AAClC,MAAO,OAAA,WAAA,CAAY,QAAU,EAAA,KAAA,EAAO,QAAQ,CAAA;AAAA;AAC9C,IAEA,KAAK,cAAgB,EAAA;AACnB,MAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAA;AAClC,MAAO,OAAA,WAAA,CAAY,QAAU,EAAA,KAAA,EAAO,QAAQ,CAAA;AAAA;AAC9C,IAEA,KAAK,WAAa,EAAA;AAChB,MAAM,MAAA,cAAA,GAAiB,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAA;AACzC,MAAO,OAAA,WAAA,CAAY,cAAgB,EAAA,KAAA,EAAO,QAAQ,CAAA;AAAA;AACpD,IAEA;AACE,MAAO,OAAA,EAAE,WAAW,OAAQ,EAAA;AAAA;AAElC;AAEa,MAAA,kBAAA,GAAqB,CAAC,IAAA,EAAW,QAA+B,KAAA;AAC3E,EAAA,IAAI,CAAC,IAAQ,IAAA,IAAA,CAAK,MAAW,KAAA,CAAA,SAAU,EAAC;AACxC,EAAI,IAAA,IAAA,CAAK,UAAU,CAAG,EAAA,OAAO,KAAK,GAAI,CAAA,CAAC,CAAwB,KAAA,CAAA,CAAE,IAAI,CAAA;AAErE,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,CAAC,CAAE,CAAA,IAAA;AACtB,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAE,CAAA,IAAA;AACnC,EAAA,MAAM,gBAA0B,EAAC;AAEjC,EAAM,MAAA,eAAA,GAAkB,CAAC,aAA4C,KAAA;AACnE,IAAM,MAAA,aAAA,uBAAoB,GAAY,CAAA;AAAA,MACpC,cAAc,KAAK,CAAA;AAAA,MACnB,cAAc,IAAI;AAAA,KACnB,CAAA;AAED,IAAI,IAAA,IAAA,CAAK,UAAU,CAAG,EAAA;AACpB,MAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,CAAwB,KAAA;AACpC,QAAM,MAAA,IAAA,GAAO,aAAc,CAAA,CAAA,CAAE,IAAI,CAAA;AACjC,QAAA,IAAI,CAAC,aAAA,CAAc,GAAI,CAAA,IAAI,CAAG,EAAA;AAC5B,UAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AACtB,UAAc,aAAA,CAAA,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA;AAC3B,OACD,CAAA;AAAA,KACH,MAAA,IAAW,IAAK,CAAA,MAAA,KAAW,CAAG,EAAA;AAC5B,MAAA,aAAA,CAAc,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAA;AAC/B,MAAA,aAAA,CAAc,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAA;AAAA,KACjC,MAAA,IAAW,IAAK,CAAA,MAAA,KAAW,CAAG,EAAA;AAC5B,MAAA,aAAA,CAAc,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAA;AAC/B,MAAA,aAAA,CAAc,IAAK,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,CAAA;AAAA,KAC1B,MAAA;AACL,MAAA,MAAM,YAAY,EAAC;AACnB,MAAI,IAAA,IAAA,CAAK,WAAW,CAAG,EAAA;AACrB,QAAA,SAAA,CAAU,KAAK,IAAK,CAAA,KAAA,CAAA,CAAO,KAAK,MAAS,GAAA,CAAA,IAAK,CAAC,CAAC,CAAA;AAAA;AAElD,MAAU,SAAA,CAAA,IAAA,CAAK,KAAK,KAAQ,CAAA,CAAA,IAAA,CAAK,SAAS,CAAK,IAAA,CAAA,GAAK,CAAC,CAAC,CAAA;AACtD,MAAU,SAAA,CAAA,OAAA,CAAQ,OAAK,aAAc,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA;AACzD,GACF;AAEA,EAAA,IAAI,aAAa,QAAU,EAAA;AACzB,IAAA,eAAA,CAAgB,UAAQ,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAU,CAAA;AAAA,GACxC,MAAA,IAAA,QAAA,KAAa,OAAW,IAAA,QAAA,KAAa,QAAU,EAAA;AACxD,IAAA,eAAA,CAAgB,UAAQ,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,CAAA;AAAA,GAClD,MAAA,IAAW,aAAa,SAAW,EAAA;AACjC,IAAA,eAAA,CAAgB,UAAQ,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAU,CAAA;AAAA;AAGnD,EAAA,OAAO,CAAC,KAAA,EAAO,GAAG,aAAA,EAAe,IAAI,CAAA;AACvC;AAEa,MAAA,cAAA,GAAiB,CAAC,IAAA,EAAc,QAAqB,KAAA;AAChE,EAAM,MAAA,OAAA,GAAU,IAAI,IAAA,CAAK,IAAI,CAAA;AAC7B,EAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAE7D,EAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,OAAQ,EAAC,CAAG,EAAA;AAC5B,IAAO,OAAA,gBAAA,CAAiB,IAAM,EAAA,QAAA,EAAU,WAAW,CAAA;AAAA;AAGrD,EAAA,IAAI,aAAa,QAAU,EAAA;AACzB,IAAO,OAAA,gBAAA,CAAiB,OAAS,EAAA,QAAA,EAAU,SAAS,CAAA;AAAA;AAGtD,EAAI,IAAA,QAAA,KAAa,OAAW,IAAA,QAAA,KAAa,QAAU,EAAA;AACjD,IAAO,OAAA,gBAAA,CAAiB,OAAS,EAAA,QAAA,EAAU,WAAW,CAAA;AAAA;AAGxD,EAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,IAAO,OAAA,gBAAA,CAAiB,OAAS,EAAA,QAAA,EAAU,UAAU,CAAA;AAAA;AAGvD,EAAO,OAAA,IAAA;AACT;AAEa,MAAA,cAAA,GAAiB,CAAC,SAAsB,KAAA;AACnD,EAAM,MAAA,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAE/B,EAAI,IAAA,OAAA,CAAQ,IAAI,CAAG,EAAA;AACjB,IAAO,OAAA,OAAA;AAAA,GACT,MAAA,IAAW,WAAY,CAAA,IAAI,CAAG,EAAA;AAC5B,IAAO,OAAA,WAAA;AAAA;AAET,EAAO,OAAA,MAAA,CAAO,MAAM,aAAa,CAAA;AACnC;AAEa,MAAA,UAAA,GAAa,CACxB,IAAA,EACA,GACG,KAAA;AACH,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAK,CAAA,MAAA,KAAW,GAAU,OAAA,CAAA;AAEvC,EAAA,MAAM,WAAW,IAAK,CAAA,MAAA;AAAA,IACpB,CAAC,KAAK,KAAU,KAAA,GAAA,GAAM,OAAO,KAAM,CAAA,GAAG,KAAK,CAAC,CAAA;AAAA,IAC5C;AAAA,GACF;AACA,EAAA,OAAO,WAAW,IAAK,CAAA,MAAA;AACzB;AAEa,MAAA,QAAA,GAAW,CACtB,IAAA,EACA,GACG,KAAA;AACH,EAAA,MAAM,WAAW,IAAM,EAAA,MAAA;AAAA,IACrB,CAAC,KAAK,KAAU,KAAA,GAAA,GAAM,OAAO,KAAM,CAAA,GAAG,KAAK,CAAC,CAAA;AAAA,IAC5C;AAAA,GACF;AACA,EAAO,OAAA,QAAA;AACT;AAEa,MAAA,2BAAA,GAA8B,CAAC,IAA6B,KAAA;AACvE,EAAA,MAAM,WAAW,IAAK,CAAA,GAAA;AAAA,IACpB,CAAQ,IAAA,KAAA,IAAA,CAAK,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,iBAAkB,CAAA,OAAO,CAAI,GAAA,IAAA,CAAK,IAAK,CAAA,KAAA,CAAM,CAAC;AAAA,GAC5E;AACA,EAAM,MAAA,WAAA,GAAc,MAAM,IAAK,iBAAA,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;AACrD,EAAO,OAAA,WAAA;AACT;AAEa,MAAA,iBAAA,GAAoB,CAC/B,OAAA,EACA,OACW,KAAA;AACX,EAAM,MAAA,MAAA,GAAS,IAAI,eAAgB,EAAA;AAEnC,EAAO,MAAA,CAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AAChD,IAAI,IAAA,KAAA,IAAS,UAAU,MAAW,EAAA;AAChC,MAAA,MAAA,CAAO,MAAO,CAAA,GAAA,EAAK,MAAO,CAAA,KAAK,CAAC,CAAA;AAAA;AAClC,GACD,CAAA;AAED,EAAA,OAAO,CAAG,EAAA,OAAO,CAAI,CAAA,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA;AACxC;AAEa,MAAA,iBAAA,GAAoB,CAC/B,SAAA,EACA,OACW,KAAA;AACX,EACE,IAAA,SAAA,IACA,OACC,KAAA,KAAA,CAAM,SAAU,CAAA,OAAA,EAAS,CAAA,IAAK,KAAM,CAAA,OAAA,CAAQ,OAAQ,EAAC,CACtD,CAAA,EAAA;AACA,IAAM,MAAA,IAAI,MAAM,qBAAqB,CAAA;AAAA;AAGvC,EAAA,IAAI,aAAa,OAAS,EAAA;AACxB,IAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,OAAQ,EAAA,GAAI,UAAU,OAAQ,EAAA;AACvD,IAAA,MAAM,WAAW,IAAK,CAAA,IAAA,CAAK,YAAY,GAAO,GAAA,EAAA,GAAK,KAAK,EAAG,CAAA,CAAA;AAE3D,IAAI,IAAA,QAAA,IAAY,GAAU,OAAA,QAAA;AAC1B,IAAI,IAAA,QAAA,IAAY,GAAU,OAAA,OAAA;AAC1B,IAAI,IAAA,QAAA,IAAY,IAAW,OAAA,QAAA;AAAA;AAG7B,EAAO,OAAA,SAAA;AACT;AAUa,MAAA,kBAAA,GAAqB,CAAC,IAAuB,KAAA;AACxD,EAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAE7D,EAAA,MAAM,KAAQ,GAAA,gBAAA,CAAiB,IAAM,EAAA,QAAA,EAAU,MAAM,CAAA;AACrD,EAAA,MAAM,MAAM,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,UAAU,QAAQ,CAAA;AAClE,EAAA,MAAM,SAAY,GAAA,gBAAA,CAAiB,IAAM,EAAA,QAAA,EAAU,cAAc,CAAA;AAEjE,EAAA,OAAO,CAAG,EAAA,SAAS,CAAK,EAAA,EAAA,KAAK,SAAI,GAAG,CAAA,CAAA;AACtC;AAEO,MAAM,mBAAsB,GAAA,CACjC,IACA,EAAA,cAAA,EACA,YACW,KAAA;AACX,EAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAC7D,EAAA,MAAM,KAAQ,GAAA,cAAA,iBAAmB,IAAA,IAAA,IAAQ,QAAQ,CAAA;AACjD,EAAA,MAAM,MAAM,YAAgB,IAAA,KAAA;AAC5B,EAAA,MAAM,KAAQ,GAAA,cAAA,IAAkB,OAAQ,CAAA,GAAA,EAAK,GAAG,CAAA;AAEhD,EAAA,MAAM,UAAa,GAAA,gBAAA,CAAiB,KAAO,EAAA,QAAA,EAAU,aAAa,CAAA;AAClE,EAAA,MAAM,QAAW,GAAA,gBAAA,CAAiB,GAAK,EAAA,QAAA,EAAU,aAAa,CAAA;AAC9D,EAAA,MAAM,SAAY,GAAA,gBAAA,CAAiB,IAAM,EAAA,QAAA,EAAU,cAAc,CAAA;AACjE,EAAA,OAAO,GAAG,SAAS;AAAA,eAAoB,EAAA,UAAU,WAAM,QAAQ,CAAA,CAAA,CAAA;AACjE;AAEa,MAAA,kBAAA,GAAqB,CAAC,IAAuB,KAAA;AACxD,EAAA,MAAM,WAAW,IAAI,IAAA,CAAK,cAAe,EAAA,CAAE,iBAAkB,CAAA,QAAA;AAC7D,EAAA,MAAM,QAAQ,WAAY,CAAA,IAAA,EAAM,EAAE,YAAA,EAAc,GAAG,CAAA;AACnD,EAAM,MAAA,GAAA,GAAM,OAAQ,CAAA,KAAA,EAAO,CAAC,CAAA;AAE5B,EAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,KAAK,CAAA,KAAM,QAAQ,GAAG,CAAA;AAE/C,EAAA,MAAM,UAAa,GAAA,gBAAA;AAAA,IACjB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,OAAU,GAAA;AAAA,GACvB;AACA,EAAA,MAAM,QAAW,GAAA,gBAAA,CAAiB,GAAK,EAAA,QAAA,EAAU,aAAa,CAAA;AAE9D,EAAO,OAAA,CAAA,EAAG,UAAU,CAAA,QAAA,EAAM,QAAQ,CAAA,CAAA;AACpC;AAEa,MAAA,wBAAA,GAA2B,CAAC,GAAgB,KAAA;AACvD,EAAM,MAAA,KAAA,GAAQ,IAAI,OAAQ,CAAA,IAAA,EAAM,GAAG,CAAE,CAAA,WAAA,EAAc,CAAA,KAAA,CAAM,GAAG,CAAA;AAC5D,EAAA,OAAO,KACJ,CAAA,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,KACV,KAAA,KAAA,KAAU,IAAI,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,WAAY,EAAA,GAAI,IAAK,CAAA,KAAA,CAAM,CAAC,CAAI,GAAA;AAAA,GAC/D,CACC,KAAK,GAAG,CAAA;AACb;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-adoption-insights",
3
- "version": "0.2.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",
@@ -49,6 +49,7 @@
49
49
  "@mui/x-date-pickers": "5.0.20",
50
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
  },
@@ -62,7 +63,7 @@
62
63
  "@backstage/dev-utils": "^1.1.10",
63
64
  "@backstage/plugin-catalog": "^1.30.0",
64
65
  "@backstage/test-utils": "^1.7.8",
65
- "@red-hat-developer-hub/backstage-plugin-theme": "^0.8.0",
66
+ "@red-hat-developer-hub/backstage-plugin-theme": "^0.9.0",
66
67
  "@testing-library/jest-dom": "^6.0.0",
67
68
  "@testing-library/react": "^14.0.0",
68
69
  "@testing-library/user-event": "^14.0.0",
@@ -1,98 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
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__ */ jsxs(
18
- Paper,
19
- {
20
- elevation: 1,
21
- sx: {
22
- padding: "12px 16px",
23
- boxShadow: 4,
24
- borderRadius: 2
25
- },
26
- children: [
27
- /* @__PURE__ */ jsx(
28
- Typography,
29
- {
30
- sx: {
31
- fontSize: "0.875rem",
32
- fontWeight: 500,
33
- marginBottom: "12px"
34
- },
35
- children: grouping === "hourly" ? format(date, "MMMM dd, yyyy hh:mm a") : format(date, "MMMM, dd yyyy")
36
- }
37
- ),
38
- /* @__PURE__ */ jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "center", children: [
39
- /* @__PURE__ */ jsxs(Box, { mr: 3, children: [
40
- /* @__PURE__ */ jsx(
41
- Typography,
42
- {
43
- sx: {
44
- fontSize: "0.875rem",
45
- fontWeight: 500,
46
- color: theme.palette.text.secondary
47
- },
48
- children: "Returning users"
49
- }
50
- ),
51
- /* @__PURE__ */ jsx(
52
- Typography,
53
- {
54
- sx: {
55
- fontSize: "2.5rem",
56
- fontWeight: 500,
57
- color: "#009596",
58
- lineHeight: 1.2
59
- },
60
- children: payload[0]?.value
61
- }
62
- )
63
- ] }),
64
- /* @__PURE__ */ jsxs(Box, { children: [
65
- /* @__PURE__ */ jsx(
66
- Typography,
67
- {
68
- sx: {
69
- fontSize: "0.875rem",
70
- fontWeight: 500,
71
- color: theme.palette.text.secondary
72
- },
73
- children: "New users"
74
- }
75
- ),
76
- /* @__PURE__ */ jsx(
77
- Typography,
78
- {
79
- sx: {
80
- fontSize: "2.5rem",
81
- fontWeight: 500,
82
- color: "#009596",
83
- lineHeight: 1.2
84
- },
85
- children: payload[1]?.value
86
- }
87
- )
88
- ] })
89
- ] })
90
- ]
91
- }
92
- );
93
- }
94
- return null;
95
- };
96
-
97
- export { CustomTooltip as default };
98
- //# 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 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":[],"mappings":";;;;;;;AAqBA,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,uBAAA,IAAA;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,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,EAAI,EAAA;AAAA,gBACF,QAAU,EAAA,UAAA;AAAA,gBACV,UAAY,EAAA,GAAA;AAAA,gBACZ,YAAc,EAAA;AAAA,eAChB;AAAA,cAEC,QAAA,EAAA,QAAA,KAAa,WACV,MAAO,CAAA,IAAA,EAAM,uBAAuB,CACpC,GAAA,MAAA,CAAO,MAAM,eAAe;AAAA;AAAA,WAClC;AAAA,+BAEC,GAAI,EAAA,EAAA,OAAA,EAAQ,QAAO,cAAe,EAAA,eAAA,EAAgB,YAAW,QAC5D,EAAA,QAAA,EAAA;AAAA,4BAAC,IAAA,CAAA,GAAA,EAAA,EAAI,IAAI,CACP,EAAA,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,EAAI,EAAA;AAAA,oBACF,QAAU,EAAA,UAAA;AAAA,oBACV,UAAY,EAAA,GAAA;AAAA,oBACZ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,mBAC5B;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,8BACA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,EAAI,EAAA;AAAA,oBACF,QAAU,EAAA,QAAA;AAAA,oBACV,UAAY,EAAA,GAAA;AAAA,oBACZ,KAAO,EAAA,SAAA;AAAA,oBACP,UAAY,EAAA;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AAAA;AAAA;AACf,aACF,EAAA,CAAA;AAAA,iCAEC,GACC,EAAA,EAAA,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,EAAI,EAAA;AAAA,oBACF,QAAU,EAAA,UAAA;AAAA,oBACV,UAAY,EAAA,GAAA;AAAA,oBACZ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,mBAC5B;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,8BACA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,EAAI,EAAA;AAAA,oBACF,QAAU,EAAA,QAAA;AAAA,oBACV,UAAY,EAAA,GAAA;AAAA,oBACZ,KAAO,EAAA,SAAA;AAAA,oBACP,UAAY,EAAA;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AAAA;AAAA;AACf,aACF,EAAA;AAAA,WACF,EAAA;AAAA;AAAA;AAAA,KACF;AAAA;AAGJ,EAAO,OAAA,IAAA;AACT;;;;"}
@@ -1,71 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
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__ */ jsxs(
18
- Paper,
19
- {
20
- elevation: 1,
21
- sx: {
22
- padding: "12px 16px",
23
- boxShadow: 4,
24
- borderRadius: 2
25
- },
26
- children: [
27
- /* @__PURE__ */ jsx(
28
- Typography,
29
- {
30
- sx: {
31
- fontSize: "0.875rem",
32
- fontWeight: 500,
33
- marginBottom: "12px"
34
- },
35
- children: grouping === "hourly" ? format(date, "MMMM dd, yyyy hh:mm a") : format(date, "MMMM, dd yyyy")
36
- }
37
- ),
38
- /* @__PURE__ */ jsxs(Box, { mr: 3, children: [
39
- /* @__PURE__ */ jsx(
40
- Typography,
41
- {
42
- sx: {
43
- fontSize: "0.875rem",
44
- fontWeight: 500,
45
- color: theme.palette.text.secondary
46
- },
47
- children: "Number of searches"
48
- }
49
- ),
50
- /* @__PURE__ */ jsx(
51
- Typography,
52
- {
53
- sx: {
54
- fontSize: "2.5rem",
55
- fontWeight: 500,
56
- color: "#009596",
57
- lineHeight: 1.2
58
- },
59
- children: payload[0]?.value
60
- }
61
- )
62
- ] })
63
- ]
64
- }
65
- );
66
- }
67
- return null;
68
- };
69
-
70
- export { CustomTooltip as default };
71
- //# 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 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":[],"mappings":";;;;;;;AAqBA,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,uBAAA,IAAA;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,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,EAAI,EAAA;AAAA,gBACF,QAAU,EAAA,UAAA;AAAA,gBACV,UAAY,EAAA,GAAA;AAAA,gBACZ,YAAc,EAAA;AAAA,eAChB;AAAA,cAEC,QAAA,EAAA,QAAA,KAAa,WACV,MAAO,CAAA,IAAA,EAAM,uBAAuB,CACpC,GAAA,MAAA,CAAO,MAAM,eAAe;AAAA;AAAA,WAClC;AAAA,0BAEA,IAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,CACP,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,EAAI,EAAA;AAAA,kBACF,QAAU,EAAA,UAAA;AAAA,kBACV,UAAY,EAAA,GAAA;AAAA,kBACZ,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA,iBAC5B;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACA,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,EAAI,EAAA;AAAA,kBACF,QAAU,EAAA,QAAA;AAAA,kBACV,UAAY,EAAA,GAAA;AAAA,kBACZ,KAAO,EAAA,SAAA;AAAA,kBACP,UAAY,EAAA;AAAA,iBACd;AAAA,gBAEC,QAAA,EAAA,OAAA,CAAQ,CAAC,CAAG,EAAA;AAAA;AAAA;AACf,WACF,EAAA;AAAA;AAAA;AAAA,KACF;AAAA;AAGJ,EAAO,OAAA,IAAA;AACT;;;;"}