@red-hat-developer-hub/plugin-cost-management 2.0.3-rc.4 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +1 -1
- package/app-config.dynamic.yaml +2 -2
- package/dist/Router.esm.js.map +1 -1
- package/dist/apis.esm.js.map +1 -1
- package/dist/components/BasePage.esm.js.map +1 -1
- package/dist/components/InfoCardTitle.esm.js.map +1 -1
- package/dist/components/PageLayout.esm.js.map +1 -1
- package/dist/components/filtersStyles.esm.js.map +1 -1
- package/dist/components/icon/AnalyticsIcon.esm.js.map +1 -1
- package/dist/components/icon/AnalyticsIconFilled.esm.js.map +1 -1
- package/dist/components/icon/AnalyticsIconOutlined.esm.js.map +1 -1
- package/dist/components/icon/CostManagementIcon.esm.js.map +1 -1
- package/dist/components/icon/CostManagementIconFilled.esm.js.map +1 -1
- package/dist/components/icon/CostManagementIconOutlined.esm.js.map +1 -1
- package/dist/constants/currencies.esm.js.map +1 -1
- package/dist/hooks/usePatternFlyTheme.esm.js.map +1 -1
- package/dist/hooks/useThemeBackgroundColor.esm.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/pages/openshift/OpenShiftPage.esm.js.map +1 -1
- package/dist/pages/openshift/components/AutocompleteComponent.esm.js.map +1 -1
- package/dist/pages/openshift/components/DownloadIconButton.esm.js.map +1 -1
- package/dist/pages/openshift/components/Filters.esm.js.map +1 -1
- package/dist/pages/openshift/components/PageHeader.esm.js.map +1 -1
- package/dist/pages/openshift/components/SelectComponent.esm.js.map +1 -1
- package/dist/pages/openshift/components/TableToolbar.esm.js.map +1 -1
- package/dist/pages/optimizations/OptimizationsPage.esm.js.map +1 -1
- package/dist/pages/optimizations/components/ComboBox.esm.js +8 -12
- package/dist/pages/optimizations/components/ComboBox.esm.js.map +1 -1
- package/dist/pages/optimizations/components/Filters.esm.js.map +1 -1
- package/dist/pages/optimizations/components/TableToolbar.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/OptimizationsBreakdownPage.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/OptimizationEngineTab.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/CodeInfoCard.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/ContainerInfoCard.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/ChartInfoCard.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/IntlBreakdownChart.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/OptimizationsBreakdownChart.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/i18n/intl.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/i18n/messages.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/utils/chart-data-format.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/utils/chart-datum.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/utils/chart-utils.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/utils/format.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/models/ChartEnums.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/models/YamlCodeData.esm.js.map +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js.map +1 -1
- package/dist/utils/dates.esm.js.map +1 -1
- package/package.json +19 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenShiftPage.esm.js","sources":["../../../src/pages/openshift/OpenShiftPage.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 */\n\nimport React, { useMemo, useState, useCallback, useRef } from 'react';\nimport type { ExportFormat } from '@red-hat-developer-hub/plugin-cost-management-common/clients';\nimport {\n Table,\n TableColumn,\n InfoCard,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\nimport { BasePage } from '../../components/BasePage';\nimport { PageLayout } from '../../components/PageLayout';\nimport { Filters } from './components/Filters';\nimport { Divider, useTheme } from '@material-ui/core';\nimport { PageHeader } from './components/PageHeader';\nimport { TableToolbar } from './components/TableToolbar';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { costManagementSlimApiRef } from '../../apis';\nimport useAsync from 'react-use/lib/useAsync';\nimport { CURRENCY_SYMBOLS } from '../../constants/currencies';\nimport { DownloadIconButton } from './components/DownloadIconButton';\n\nconst formatCurrency = (value: number, currencyCode: string): string => {\n const symbol = CURRENCY_SYMBOLS[currencyCode] || currencyCode;\n return `${symbol}${value.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`;\n};\n\ninterface ProjectCost {\n id: string;\n projectName: string;\n clusterId?: string;\n cost: number;\n costPercentage: number;\n monthOverMonthChange: number;\n monthOverMonthValue: number;\n includesOverhead: boolean;\n previousPeriodCost: number;\n infrastructureCost: number;\n infrastructureCostPercentage: number;\n supplementaryCost: number;\n supplementaryCostPercentage: number;\n}\n\n/**\n * Generates date range text based on time range selection\n * @param timeRange - 'month-to-date' or 'previous-month'\n * @returns Formatted string like \"December 1-3\" or \"November 1-30\"\n */\nfunction getDateRangeText(timeRange: string): string {\n const now = new Date();\n const currentMonth = now.getMonth();\n const currentYear = now.getFullYear();\n const currentDay = now.getDate();\n\n if (timeRange === 'month-to-date') {\n // Current month: MONTH 1-<CURRENT_DAY>\n const monthName = now.toLocaleString('en-US', { month: 'long' });\n return `${monthName} 1-${currentDay}`;\n }\n // Previous month: PREVIOUS_MONTH 1-<LAST_DAY>\n const prevMonth = currentMonth === 0 ? 11 : currentMonth - 1;\n const prevYear = currentMonth === 0 ? currentYear - 1 : currentYear;\n const prevMonthDate = new Date(prevYear, prevMonth + 1, 0); // Last day of previous month\n const lastDay = prevMonthDate.getDate();\n const monthName = prevMonthDate.toLocaleString('en-US', { month: 'long' });\n return `${monthName} 1-${lastDay}`;\n}\n\n/**\n * Configuration for building query parameters\n */\ninterface QueryParamsConfig {\n groupBy: string;\n selectedTag: string;\n overheadDistribution: string;\n timeRange: string;\n currency: string;\n showPlatformSum: boolean;\n filterBy: string;\n filterValue: string;\n filterOperation: string;\n selectedTagKey: string;\n selectedTagValue: string;\n sortField: string | null;\n sortDirection: 'asc' | 'desc';\n}\n\n/**\n * Options for building query parameters\n */\ninterface BuildQueryParamsOptions {\n /** Pagination limit - omit for download (uses 0) */\n limit?: number;\n /** Pagination offset - omit for download */\n offset?: number;\n /** Specific item name to filter by (for row-level download) */\n specificItemName?: string;\n}\n\n/**\n * Builds query parameters for cost management API requests\n * Shared between data fetching and download functionality\n */\nfunction buildCostManagementQueryParams(\n config: QueryParamsConfig,\n options: BuildQueryParamsOptions = {},\n): Record<string, string | number> {\n const {\n groupBy,\n selectedTag,\n overheadDistribution,\n timeRange,\n currency,\n showPlatformSum,\n filterBy,\n filterValue,\n filterOperation,\n selectedTagKey,\n selectedTagValue,\n sortField,\n sortDirection,\n } = config;\n\n const { limit, offset, specificItemName } = options;\n\n // Build group by parameter\n const groupByParam =\n groupBy === 'tag' ? `group_by[tag:${selectedTag}]` : `group_by[${groupBy}]`;\n\n // Determine delta parameter\n const deltaParam =\n groupBy === 'project' && overheadDistribution === 'distribute'\n ? 'distributed_cost'\n : 'cost';\n\n const timeScopeValue = timeRange === 'month-to-date' ? -1 : -2;\n\n const queryParams: Record<string, string | number> = {\n currency,\n delta: deltaParam,\n 'filter[resolution]': 'monthly',\n 'filter[time_scope_units]': 'month',\n 'filter[time_scope_value]': timeScopeValue,\n };\n\n // Add pagination if provided\n if (limit !== undefined) {\n queryParams['filter[limit]'] = limit;\n }\n if (offset !== undefined) {\n queryParams['filter[offset]'] = offset;\n }\n\n // Add category parameter when showPlatformSum is enabled\n if (showPlatformSum) {\n queryParams.category = 'Platform';\n }\n\n queryParams[groupByParam] = '*';\n\n // Handle filtering\n if (specificItemName) {\n // Filter for specific item (row-level download)\n queryParams[`filter[${groupBy}]`] = specificItemName;\n } else if (filterBy === 'tag' && selectedTagKey && selectedTagValue) {\n // Tag filtering\n if (filterOperation === 'exact') {\n queryParams[`filter[exact:tag:${selectedTagKey}]`] = selectedTagValue;\n } else if (filterOperation === 'excludes') {\n queryParams[`exclude[tag:${selectedTagKey}]`] = selectedTagValue;\n } else {\n queryParams[`filter[tag:${selectedTagKey}]`] = selectedTagValue;\n }\n } else if (filterValue) {\n // Regular filtering\n if (filterOperation === 'exact') {\n queryParams[`filter[exact:${filterBy}]`] = filterValue;\n } else if (filterOperation === 'excludes') {\n queryParams[`exclude[${filterBy}]`] = filterValue;\n } else {\n queryParams[`filter[${filterBy}]`] = filterValue;\n }\n }\n\n // Add sorting\n let apiSortField: string;\n if (sortField) {\n if (sortField === 'cost') {\n apiSortField = deltaParam;\n } else if (sortField === 'projectName') {\n apiSortField = groupBy;\n } else {\n apiSortField = deltaParam;\n }\n queryParams[`order_by[${apiSortField}]`] = sortDirection;\n } else {\n queryParams[`order_by[${deltaParam}]`] = 'desc';\n }\n\n return queryParams;\n}\n\n/** @public */\nexport function OpenShiftPage() {\n const api = useApi(costManagementSlimApiRef);\n const [groupBy, setGroupBy] = useState('project');\n const [overheadDistribution, setOverheadDistribution] =\n useState('distribute');\n const [timeRange, setTimeRange] = useState('month-to-date');\n const [currency, setCurrency] = useState('USD');\n const [filterBy, setFilterBy] = useState('project');\n const [filterOperation, setFilterOperation] = useState('includes');\n const [filterValue, setFilterValue] = useState('');\n const [showPlatformSum, setShowPlatformSum] = useState(false);\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n const [currentPage, setCurrentPage] = useState(0);\n const [pageSize, setPageSize] = useState(5);\n const [sortField, setSortField] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc');\n const [tags, setTags] = useState<string[]>([]);\n const [selectedTag, setSelectedTag] = useState<string>('');\n const [selectedTagKey, setSelectedTagKey] = useState<string>('');\n const [selectedTagValue, setSelectedTagValue] = useState<string>('');\n const [showMonthOverMonthChange, setShowMonthOverMonthChange] =\n useState(true);\n const [showInfrastructureCost, setShowInfrastructureCost] = useState(false);\n const [showSupplementaryCost, setShowSupplementaryCost] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const theme = useTheme();\n const isDarkMode = (theme.palette as any).mode === 'dark';\n\n // Ref to store display data for use in download handlers\n const displayDataRef = useRef<typeof displayData | null>(null);\n\n // Fetch tags on first load\n useAsync(async () => {\n try {\n const timeScopeValue = timeRange === 'month-to-date' ? -1 : -2;\n const response = await api.getOpenShiftTags(timeScopeValue);\n const tagsData = await response.json();\n setTags(tagsData.data || []);\n } catch {\n // Silently fail if tags can't be loaded\n setTags([]);\n }\n }, [api, timeRange]);\n\n // Build config object for query params builder (memoized to prevent unnecessary re-renders)\n const queryParamsConfig: QueryParamsConfig = useMemo(\n () => ({\n groupBy,\n selectedTag,\n overheadDistribution,\n timeRange,\n currency,\n showPlatformSum,\n filterBy,\n filterValue,\n filterOperation,\n selectedTagKey,\n selectedTagValue,\n sortField,\n sortDirection,\n }),\n [\n groupBy,\n selectedTag,\n overheadDistribution,\n timeRange,\n currency,\n showPlatformSum,\n filterBy,\n filterValue,\n filterOperation,\n selectedTagKey,\n selectedTagValue,\n sortField,\n sortDirection,\n ],\n );\n\n const {\n value: costData,\n loading,\n error,\n } = useAsync(async () => {\n // Don't make API call if groupBy is 'tag' but no tag is selected\n if (groupBy === 'tag' && !selectedTag) {\n return null;\n }\n\n const offset = currentPage * pageSize;\n const queryParams = buildCostManagementQueryParams(queryParamsConfig, {\n limit: pageSize,\n offset,\n });\n\n const response = await api.getCostManagementReport({\n query: queryParams,\n });\n return response.json();\n }, [\n currency,\n overheadDistribution,\n timeRange,\n groupBy,\n filterBy,\n filterValue,\n filterOperation,\n showPlatformSum,\n api,\n currentPage,\n pageSize,\n sortField,\n sortDirection,\n selectedTag,\n selectedTagKey,\n selectedTagValue,\n ]);\n\n const displayData = useMemo(() => {\n // If costData is null, return empty structure to keep table visible during loading\n if (!costData) {\n const today = new Date();\n const month =\n timeRange === 'previous-month'\n ? new Date(\n today.getFullYear(),\n today.getMonth() - 1,\n 1,\n ).toLocaleString('en-US', { month: 'long' })\n : today.toLocaleString('en-US', { month: 'long' });\n const endDate =\n timeRange === 'previous-month'\n ? new Date(today.getFullYear(), today.getMonth(), 0)\n .getDate()\n .toString()\n : today.getDate().toString();\n\n return {\n totalCost: 0,\n month,\n endDate,\n currencyCode: currency,\n projects: [],\n };\n }\n\n const arrayKey = `${groupBy}s` as keyof (typeof costData.data)[0];\n const groupedArray = costData.data?.[0]?.[arrayKey] as\n | Array<{ [key: string]: unknown; values: unknown[] }>\n | undefined;\n\n const projects =\n groupedArray?.map((item, index) => {\n const value =\n (item.values?.[0] as {\n cost?: {\n distributed?: { value?: number };\n total?: { value?: number };\n network_unattributed_distributed?: { value?: number };\n worker_unallocated_distributed?: { value?: number };\n platform_distributed?: { value?: number };\n storage_unattributed_distributed?: { value?: number };\n };\n infrastructure?: {\n total?: { value?: number };\n };\n supplementary?: {\n total?: { value?: number };\n };\n delta_percent?: number;\n delta_value?: number;\n }) || {};\n\n // For clusters, prefer values[0].clusters[0] (human-readable) over item.cluster (UUID)\n let itemName: string;\n let clusterId: string | undefined;\n if (groupBy === 'cluster') {\n const valueItem = item.values?.[0] as\n | { clusters?: string[]; cluster?: string }\n | undefined;\n const clustersArray = valueItem?.clusters;\n itemName =\n clustersArray && clustersArray.length > 0\n ? clustersArray[0]\n : (item.cluster as string) || 'Unknown';\n // Store the cluster UUID for display\n clusterId = (item.cluster as string) || undefined;\n } else {\n const nameField = groupBy as keyof typeof item;\n itemName = (item[nameField] as string) || 'Unknown';\n }\n\n const costField =\n groupBy === 'project' && overheadDistribution === 'distribute'\n ? 'distributed'\n : 'total';\n const costValue =\n value?.cost?.[costField as keyof typeof value.cost]?.value || 0;\n\n const deltaPercent = value?.delta_percent || 0;\n const deltaValue = value?.delta_value || 0;\n\n const infrastructureValue = value?.infrastructure?.total?.value || 0;\n const supplementaryValue = value?.supplementary?.total?.value || 0;\n\n return {\n id: `${index}`,\n projectName: itemName,\n clusterId,\n cost: costValue,\n costPercentage: 0,\n monthOverMonthChange: deltaPercent,\n monthOverMonthValue: Math.abs(deltaValue),\n includesOverhead:\n value?.cost?.network_unattributed_distributed?.value !== 0 ||\n value?.cost?.worker_unallocated_distributed?.value !== 0 ||\n value?.cost?.platform_distributed?.value !== 0 ||\n value?.cost?.storage_unattributed_distributed?.value !== 0,\n previousPeriodCost: costValue + Math.abs(deltaValue),\n infrastructureCost: infrastructureValue,\n infrastructureCostPercentage: 0,\n supplementaryCost: supplementaryValue,\n supplementaryCostPercentage: 0,\n };\n }) || [];\n\n const totalCost = costData.meta?.total?.cost?.total?.value || 0;\n const totalInfrastructureCost =\n costData.meta?.total?.infrastructure?.total?.value || 0;\n const totalSupplementaryCost =\n costData.meta?.total?.supplementary?.total?.value || 0;\n\n const currencyCode = costData.meta?.currency || currency;\n\n const projectsWithPercentage = projects.map(p => ({\n ...p,\n costPercentage: totalCost > 0 ? (p.cost / totalCost) * 100 : 0,\n infrastructureCostPercentage:\n totalInfrastructureCost > 0\n ? (p.infrastructureCost / totalInfrastructureCost) * 100\n : 0,\n supplementaryCostPercentage:\n totalSupplementaryCost > 0\n ? (p.supplementaryCost / totalSupplementaryCost) * 100\n : 0,\n }));\n\n let month: string;\n let endDate: string;\n\n if (timeRange === 'previous-month') {\n const today = new Date();\n const previousMonth = new Date(\n today.getFullYear(),\n today.getMonth() - 1,\n 1,\n );\n month = previousMonth.toLocaleString('en-US', { month: 'long' });\n const lastDayOfPreviousMonth = new Date(\n today.getFullYear(),\n today.getMonth(),\n 0,\n ).getDate();\n endDate = lastDayOfPreviousMonth.toString();\n } else {\n const today = new Date();\n month = today.toLocaleString('en-US', { month: 'long' });\n endDate = today.getDate().toString();\n }\n\n return {\n totalCost,\n month,\n endDate,\n currencyCode,\n projects: projectsWithPercentage,\n };\n }, [costData, currency, groupBy, overheadDistribution, timeRange]);\n\n // Update ref when displayData changes\n displayDataRef.current = displayData;\n\n /**\n * Builds query parameters for download request\n * @param specificItemName - Optional: specific item name to filter by (for row-level download)\n */\n const buildDownloadQueryParams = useCallback(\n (specificItemName?: string): Record<string, string | number> => {\n return buildCostManagementQueryParams(queryParamsConfig, {\n specificItemName,\n });\n },\n [queryParamsConfig],\n );\n\n /**\n * Handles download for header buttons (all data based on current filters)\n */\n const handleHeaderDownload = useCallback(\n async (format: ExportFormat) => {\n if (isDownloading) return;\n\n setIsDownloading(true);\n try {\n const queryParams = buildDownloadQueryParams();\n await api.downloadCostManagementReport({\n query: queryParams,\n format,\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`Failed to download ${format}:`, err);\n } finally {\n setIsDownloading(false);\n }\n },\n [api, buildDownloadQueryParams, isDownloading],\n );\n\n /**\n * Handles download for row-level buttons (specific item)\n */\n const handleRowDownload = useCallback(\n async (itemName: string, format: ExportFormat) => {\n if (isDownloading) return;\n\n setIsDownloading(true);\n try {\n const queryParams = buildDownloadQueryParams(itemName);\n await api.downloadCostManagementReport({\n query: queryParams,\n format,\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`Failed to download ${format} for ${itemName}:`, err);\n } finally {\n setIsDownloading(false);\n }\n },\n [api, buildDownloadQueryParams, isDownloading],\n );\n\n const handleRowSelect = useCallback(\n (rowId: string, isSelected: boolean) => {\n const newSelectedRows = new Set(selectedRows);\n if (isSelected) {\n newSelectedRows.add(rowId);\n } else {\n newSelectedRows.delete(rowId);\n }\n setSelectedRows(newSelectedRows);\n },\n [selectedRows],\n );\n\n const handleSelectAll = useCallback(\n (isSelected: boolean) => {\n if (isSelected && displayData) {\n setSelectedRows(\n new Set(displayData.projects.map(project => project.id)),\n );\n } else {\n setSelectedRows(new Set());\n }\n },\n [displayData],\n );\n\n const handlePageChange = useCallback((page: number, newPageSize: number) => {\n setCurrentPage(page);\n setPageSize(newPageSize);\n }, []);\n\n const handleRowsPerPageChange = useCallback((newPageSize: number) => {\n setPageSize(newPageSize);\n setCurrentPage(0);\n }, []);\n\n const totalCount = costData?.meta?.count || 0;\n\n const isAllSelected =\n displayData !== null &&\n selectedRows.size === displayData.projects.length &&\n displayData.projects.length > 0;\n const isIndeterminate =\n displayData !== null &&\n selectedRows.size > 0 &&\n selectedRows.size < displayData.projects.length;\n\n const columns = useMemo<TableColumn<ProjectCost>[]>(() => {\n const getChangeColor = (change: number) => {\n if (change < 0) return '#d32f2f';\n if (isDarkMode) return '#4BB543';\n return '#2e7d32';\n };\n\n const cols: TableColumn<ProjectCost>[] = [\n {\n title: (\n <div style={{ marginLeft: 0, paddingLeft: 0 }}>\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={input => {\n if (input) input.indeterminate = isIndeterminate;\n }}\n onChange={e => {\n e.stopPropagation();\n handleSelectAll(e.target.checked);\n }}\n style={{\n width: '18px',\n height: '18px',\n cursor: 'pointer',\n margin: 0,\n padding: 0,\n }}\n />\n </div>\n ),\n field: 'checkbox',\n sorting: false,\n width: '40px',\n cellStyle: {\n paddingLeft: '4px',\n paddingRight: '4px',\n },\n headerStyle: {\n paddingLeft: '4px',\n paddingRight: '4px',\n },\n render: data => (\n <div style={{ paddingRight: '4px' }}>\n <input\n type=\"checkbox\"\n checked={selectedRows.has(data.id)}\n onChange={e => handleRowSelect(data.id, e.target.checked)}\n style={{\n width: '18px',\n height: '18px',\n cursor: 'pointer',\n margin: 0,\n padding: 0,\n }}\n />\n </div>\n ),\n },\n {\n title: (\n <Typography variant=\"body2\" style={{ fontWeight: 'bold' }}>\n {groupBy.charAt(0).toLocaleUpperCase('en-US') + groupBy.slice(1)}{' '}\n name\n </Typography>\n ),\n field: 'projectName',\n cellStyle: { minWidth: 350 },\n headerStyle: { minWidth: 350 },\n render: data => (\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n }}\n >\n <Typography variant=\"body2\">{data.projectName}</Typography>\n {groupBy === 'project' && data.includesOverhead && (\n <Typography\n variant=\"caption\"\n style={{\n padding: '2px 6px',\n backgroundColor: '#F5F5F5',\n border: '1px solid #D2D2D2',\n borderRadius: '16px',\n color: 'black',\n whiteSpace: 'nowrap',\n }}\n >\n Includes overhead\n </Typography>\n )}\n </div>\n {groupBy === 'cluster' && data.clusterId && (\n <Typography\n variant=\"caption\"\n style={{ color: '#666', display: 'block', marginTop: 10 }}\n >\n {data.clusterId}\n </Typography>\n )}\n </div>\n ),\n },\n ];\n\n if (showMonthOverMonthChange) {\n cols.push({\n title: 'Month over month change',\n field: 'monthOverMonthChange',\n sorting: false,\n render: data => (\n <div>\n <div\n style={{\n color: getChangeColor(data.monthOverMonthChange),\n }}\n >\n {Math.abs(data.monthOverMonthChange).toFixed(2)}%\n {data.monthOverMonthChange > 0 ? ' ▲' : ' ▼'}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {formatCurrency(\n data.monthOverMonthValue,\n displayData?.currencyCode || '',\n )}{' '}\n for {getDateRangeText(timeRange)}\n </div>\n </div>\n ),\n });\n }\n\n cols.push({\n title: 'Cost',\n field: 'cost',\n render: data => (\n <div>\n <div>\n {formatCurrency(data.cost, displayData?.currencyCode || '')}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {data.costPercentage.toFixed(2)}% of cost\n </div>\n </div>\n ),\n });\n\n if (showInfrastructureCost) {\n cols.push({\n title: 'Infrastructure cost',\n field: 'infrastructureCost',\n render: data => (\n <div>\n <div>\n {formatCurrency(\n data.infrastructureCost,\n displayData?.currencyCode || '',\n )}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {data.infrastructureCostPercentage.toFixed(2)}% of cost\n </div>\n </div>\n ),\n });\n }\n\n if (showSupplementaryCost) {\n cols.push({\n title: 'Supplementary cost',\n field: 'supplementaryCost',\n render: data => (\n <div>\n <div>\n {formatCurrency(\n data.supplementaryCost,\n displayData?.currencyCode || '',\n )}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {data.supplementaryCostPercentage.toFixed(2)}% of cost\n </div>\n </div>\n ),\n });\n }\n\n cols.push({\n title: 'Actions',\n field: 'actions',\n sorting: false,\n render: data => (\n <div style={{ display: 'flex', gap: '8px' }}>\n <DownloadIconButton\n label=\"CSV\"\n variant={isDarkMode ? 'white' : 'black'}\n onClick={() => handleRowDownload(data.projectName, 'csv')}\n disabled={isDownloading}\n />\n <DownloadIconButton\n label=\"JSON\"\n variant={isDarkMode ? 'white' : 'black'}\n onClick={() => handleRowDownload(data.projectName, 'json')}\n disabled={isDownloading}\n />\n </div>\n ),\n });\n\n return cols;\n }, [\n handleRowSelect,\n handleRowDownload,\n isAllSelected,\n isIndeterminate,\n isDownloading,\n selectedRows,\n handleSelectAll,\n displayData?.currencyCode,\n groupBy,\n showMonthOverMonthChange,\n showInfrastructureCost,\n showSupplementaryCost,\n timeRange,\n isDarkMode,\n ]);\n\n const handleOrderChange = useCallback(\n (orderBy: number, orderDirection: 'asc' | 'desc') => {\n // If orderBy is -1, it means \"no sorting\" - ignore it to prevent removing sorting\n if (orderBy === -1) {\n return;\n }\n\n const column = columns[orderBy];\n if (\n column?.field &&\n column.field !== 'actions' &&\n column.sorting !== false\n ) {\n const newField = column.field as string;\n setSortField(newField);\n setSortDirection(orderDirection);\n\n setCurrentPage(0);\n }\n },\n [columns],\n );\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n return (\n <BasePage pageTitle=\"\" withContentPadding>\n <PageHeader\n totalCost={displayData.totalCost}\n month={displayData.month}\n endDate={displayData.endDate}\n currencyCode={displayData.currencyCode}\n customStyle={{ marginTop: '-24px' }}\n />\n\n <Divider\n style={{\n marginBottom: 24,\n marginLeft: '-24px',\n marginRight: '-24px',\n width: 'calc(100% + 48px)',\n }}\n />\n\n <PageLayout>\n <PageLayout.Filters>\n <Filters\n groupBy={groupBy}\n overheadDistribution={overheadDistribution}\n timeRange={timeRange}\n currency={currency}\n filterBy={filterBy}\n filterOperation={filterOperation}\n filterValue={filterValue}\n tags={tags}\n onGroupByChange={value => {\n setGroupBy(value);\n setCurrentPage(0);\n if (value !== 'tag') {\n setSelectedTag('');\n }\n // Reset showPlatformSum when groupBy changes away from 'project'\n if (value !== 'project') {\n setShowPlatformSum(false);\n }\n // Sync filterBy with groupBy and reset filter value\n setFilterBy(value);\n setFilterValue('');\n // Reset tag-related filter fields\n setSelectedTagKey('');\n setSelectedTagValue('');\n }}\n selectedTag={selectedTag}\n onSelectedTagChange={value => {\n setSelectedTag(value);\n setCurrentPage(0);\n }}\n onOverheadDistributionChange={value => {\n setOverheadDistribution(value);\n setCurrentPage(0);\n }}\n onTimeRangeChange={value => {\n setTimeRange(value);\n setCurrentPage(0);\n }}\n onCurrencyChange={value => {\n setCurrency(value);\n setCurrentPage(0);\n }}\n onFilterByChange={value => {\n setFilterBy(value);\n setCurrentPage(0);\n // Clear tag-related selections when filterBy changes away from 'tag'\n if (value !== 'tag') {\n setSelectedTagKey('');\n setSelectedTagValue('');\n }\n }}\n onFilterOperationChange={value => {\n setFilterOperation(value);\n setCurrentPage(0);\n }}\n onFilterValueChange={value => {\n setFilterValue(value);\n setCurrentPage(0);\n }}\n selectedTagKey={selectedTagKey}\n selectedTagValue={selectedTagValue}\n onSelectedTagKeyChange={value => {\n setSelectedTagKey(value);\n setSelectedTagValue('');\n setCurrentPage(0);\n }}\n onSelectedTagValueChange={value => {\n setSelectedTagValue(value);\n setCurrentPage(0);\n }}\n />\n </PageLayout.Filters>\n <PageLayout.Table>\n <div style={{ flex: 1 }}>\n <InfoCard>\n <Table<ProjectCost>\n data={displayData?.projects || []}\n isLoading={loading}\n components={{\n Toolbar: () => (\n <TableToolbar\n showPlatformSum={showPlatformSum}\n setShowPlatformSum={setShowPlatformSum}\n projectsCount={displayData?.projects?.length || 0}\n groupBy={groupBy}\n showMonthOverMonthChange={showMonthOverMonthChange}\n setShowMonthOverMonthChange={setShowMonthOverMonthChange}\n showInfrastructureCost={showInfrastructureCost}\n setShowInfrastructureCost={setShowInfrastructureCost}\n showSupplementaryCost={showSupplementaryCost}\n setShowSupplementaryCost={setShowSupplementaryCost}\n onDownloadCsv={() => handleHeaderDownload('csv')}\n onDownloadJson={() => handleHeaderDownload('json')}\n isDownloading={isDownloading}\n />\n ),\n }}\n columns={columns}\n options={{\n paging: true,\n pageSize: pageSize,\n pageSizeOptions: [5, 10, 25, 50],\n search: false,\n sorting: true,\n padding: 'dense',\n thirdSortClick: false,\n }}\n totalCount={totalCount}\n page={currentPage}\n onPageChange={handlePageChange}\n onRowsPerPageChange={handleRowsPerPageChange}\n onOrderChange={handleOrderChange}\n style={{ outline: 'none' }}\n localization={{\n pagination: {\n labelRowsPerPage: 'rows',\n },\n }}\n />\n </InfoCard>\n </div>\n </PageLayout.Table>\n </PageLayout>\n </BasePage>\n );\n}\nOpenShiftPage.displayName = 'OpenShiftPage';\n"],"names":["monthName","month","endDate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OpenShiftPage.esm.js","sources":["../../../src/pages/openshift/OpenShiftPage.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 */\n\nimport React, { useMemo, useState, useCallback, useRef } from 'react';\nimport type { ExportFormat } from '@red-hat-developer-hub/plugin-cost-management-common/clients';\nimport {\n Table,\n TableColumn,\n InfoCard,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\nimport { BasePage } from '../../components/BasePage';\nimport { PageLayout } from '../../components/PageLayout';\nimport { Filters } from './components/Filters';\nimport { Divider, useTheme } from '@material-ui/core';\nimport { PageHeader } from './components/PageHeader';\nimport { TableToolbar } from './components/TableToolbar';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { costManagementSlimApiRef } from '../../apis';\nimport useAsync from 'react-use/lib/useAsync';\nimport { CURRENCY_SYMBOLS } from '../../constants/currencies';\nimport { DownloadIconButton } from './components/DownloadIconButton';\n\nconst formatCurrency = (value: number, currencyCode: string): string => {\n const symbol = CURRENCY_SYMBOLS[currencyCode] || currencyCode;\n return `${symbol}${value.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`;\n};\n\ninterface ProjectCost {\n id: string;\n projectName: string;\n clusterId?: string;\n cost: number;\n costPercentage: number;\n monthOverMonthChange: number;\n monthOverMonthValue: number;\n includesOverhead: boolean;\n previousPeriodCost: number;\n infrastructureCost: number;\n infrastructureCostPercentage: number;\n supplementaryCost: number;\n supplementaryCostPercentage: number;\n}\n\n/**\n * Generates date range text based on time range selection\n * @param timeRange - 'month-to-date' or 'previous-month'\n * @returns Formatted string like \"December 1-3\" or \"November 1-30\"\n */\nfunction getDateRangeText(timeRange: string): string {\n const now = new Date();\n const currentMonth = now.getMonth();\n const currentYear = now.getFullYear();\n const currentDay = now.getDate();\n\n if (timeRange === 'month-to-date') {\n // Current month: MONTH 1-<CURRENT_DAY>\n const monthName = now.toLocaleString('en-US', { month: 'long' });\n return `${monthName} 1-${currentDay}`;\n }\n // Previous month: PREVIOUS_MONTH 1-<LAST_DAY>\n const prevMonth = currentMonth === 0 ? 11 : currentMonth - 1;\n const prevYear = currentMonth === 0 ? currentYear - 1 : currentYear;\n const prevMonthDate = new Date(prevYear, prevMonth + 1, 0); // Last day of previous month\n const lastDay = prevMonthDate.getDate();\n const monthName = prevMonthDate.toLocaleString('en-US', { month: 'long' });\n return `${monthName} 1-${lastDay}`;\n}\n\n/**\n * Configuration for building query parameters\n */\ninterface QueryParamsConfig {\n groupBy: string;\n selectedTag: string;\n overheadDistribution: string;\n timeRange: string;\n currency: string;\n showPlatformSum: boolean;\n filterBy: string;\n filterValue: string;\n filterOperation: string;\n selectedTagKey: string;\n selectedTagValue: string;\n sortField: string | null;\n sortDirection: 'asc' | 'desc';\n}\n\n/**\n * Options for building query parameters\n */\ninterface BuildQueryParamsOptions {\n /** Pagination limit - omit for download (uses 0) */\n limit?: number;\n /** Pagination offset - omit for download */\n offset?: number;\n /** Specific item name to filter by (for row-level download) */\n specificItemName?: string;\n}\n\n/**\n * Builds query parameters for cost management API requests\n * Shared between data fetching and download functionality\n */\nfunction buildCostManagementQueryParams(\n config: QueryParamsConfig,\n options: BuildQueryParamsOptions = {},\n): Record<string, string | number> {\n const {\n groupBy,\n selectedTag,\n overheadDistribution,\n timeRange,\n currency,\n showPlatformSum,\n filterBy,\n filterValue,\n filterOperation,\n selectedTagKey,\n selectedTagValue,\n sortField,\n sortDirection,\n } = config;\n\n const { limit, offset, specificItemName } = options;\n\n // Build group by parameter\n const groupByParam =\n groupBy === 'tag' ? `group_by[tag:${selectedTag}]` : `group_by[${groupBy}]`;\n\n // Determine delta parameter\n const deltaParam =\n groupBy === 'project' && overheadDistribution === 'distribute'\n ? 'distributed_cost'\n : 'cost';\n\n const timeScopeValue = timeRange === 'month-to-date' ? -1 : -2;\n\n const queryParams: Record<string, string | number> = {\n currency,\n delta: deltaParam,\n 'filter[resolution]': 'monthly',\n 'filter[time_scope_units]': 'month',\n 'filter[time_scope_value]': timeScopeValue,\n };\n\n // Add pagination if provided\n if (limit !== undefined) {\n queryParams['filter[limit]'] = limit;\n }\n if (offset !== undefined) {\n queryParams['filter[offset]'] = offset;\n }\n\n // Add category parameter when showPlatformSum is enabled\n if (showPlatformSum) {\n queryParams.category = 'Platform';\n }\n\n queryParams[groupByParam] = '*';\n\n // Handle filtering\n if (specificItemName) {\n // Filter for specific item (row-level download)\n queryParams[`filter[${groupBy}]`] = specificItemName;\n } else if (filterBy === 'tag' && selectedTagKey && selectedTagValue) {\n // Tag filtering\n if (filterOperation === 'exact') {\n queryParams[`filter[exact:tag:${selectedTagKey}]`] = selectedTagValue;\n } else if (filterOperation === 'excludes') {\n queryParams[`exclude[tag:${selectedTagKey}]`] = selectedTagValue;\n } else {\n queryParams[`filter[tag:${selectedTagKey}]`] = selectedTagValue;\n }\n } else if (filterValue) {\n // Regular filtering\n if (filterOperation === 'exact') {\n queryParams[`filter[exact:${filterBy}]`] = filterValue;\n } else if (filterOperation === 'excludes') {\n queryParams[`exclude[${filterBy}]`] = filterValue;\n } else {\n queryParams[`filter[${filterBy}]`] = filterValue;\n }\n }\n\n // Add sorting\n let apiSortField: string;\n if (sortField) {\n if (sortField === 'cost') {\n apiSortField = deltaParam;\n } else if (sortField === 'projectName') {\n apiSortField = groupBy;\n } else {\n apiSortField = deltaParam;\n }\n queryParams[`order_by[${apiSortField}]`] = sortDirection;\n } else {\n queryParams[`order_by[${deltaParam}]`] = 'desc';\n }\n\n return queryParams;\n}\n\n/** @public */\nexport function OpenShiftPage() {\n const api = useApi(costManagementSlimApiRef);\n const [groupBy, setGroupBy] = useState('project');\n const [overheadDistribution, setOverheadDistribution] =\n useState('distribute');\n const [timeRange, setTimeRange] = useState('month-to-date');\n const [currency, setCurrency] = useState('USD');\n const [filterBy, setFilterBy] = useState('project');\n const [filterOperation, setFilterOperation] = useState('includes');\n const [filterValue, setFilterValue] = useState('');\n const [showPlatformSum, setShowPlatformSum] = useState(false);\n const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n const [currentPage, setCurrentPage] = useState(0);\n const [pageSize, setPageSize] = useState(5);\n const [sortField, setSortField] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc');\n const [tags, setTags] = useState<string[]>([]);\n const [selectedTag, setSelectedTag] = useState<string>('');\n const [selectedTagKey, setSelectedTagKey] = useState<string>('');\n const [selectedTagValue, setSelectedTagValue] = useState<string>('');\n const [showMonthOverMonthChange, setShowMonthOverMonthChange] =\n useState(true);\n const [showInfrastructureCost, setShowInfrastructureCost] = useState(false);\n const [showSupplementaryCost, setShowSupplementaryCost] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const theme = useTheme();\n const isDarkMode = (theme.palette as any).mode === 'dark';\n\n // Ref to store display data for use in download handlers\n const displayDataRef = useRef<typeof displayData | null>(null);\n\n // Fetch tags on first load\n useAsync(async () => {\n try {\n const timeScopeValue = timeRange === 'month-to-date' ? -1 : -2;\n const response = await api.getOpenShiftTags(timeScopeValue);\n const tagsData = await response.json();\n setTags(tagsData.data || []);\n } catch {\n // Silently fail if tags can't be loaded\n setTags([]);\n }\n }, [api, timeRange]);\n\n // Build config object for query params builder (memoized to prevent unnecessary re-renders)\n const queryParamsConfig: QueryParamsConfig = useMemo(\n () => ({\n groupBy,\n selectedTag,\n overheadDistribution,\n timeRange,\n currency,\n showPlatformSum,\n filterBy,\n filterValue,\n filterOperation,\n selectedTagKey,\n selectedTagValue,\n sortField,\n sortDirection,\n }),\n [\n groupBy,\n selectedTag,\n overheadDistribution,\n timeRange,\n currency,\n showPlatformSum,\n filterBy,\n filterValue,\n filterOperation,\n selectedTagKey,\n selectedTagValue,\n sortField,\n sortDirection,\n ],\n );\n\n const {\n value: costData,\n loading,\n error,\n } = useAsync(async () => {\n // Don't make API call if groupBy is 'tag' but no tag is selected\n if (groupBy === 'tag' && !selectedTag) {\n return null;\n }\n\n const offset = currentPage * pageSize;\n const queryParams = buildCostManagementQueryParams(queryParamsConfig, {\n limit: pageSize,\n offset,\n });\n\n const response = await api.getCostManagementReport({\n query: queryParams,\n });\n return response.json();\n }, [\n currency,\n overheadDistribution,\n timeRange,\n groupBy,\n filterBy,\n filterValue,\n filterOperation,\n showPlatformSum,\n api,\n currentPage,\n pageSize,\n sortField,\n sortDirection,\n selectedTag,\n selectedTagKey,\n selectedTagValue,\n ]);\n\n const displayData = useMemo(() => {\n // If costData is null, return empty structure to keep table visible during loading\n if (!costData) {\n const today = new Date();\n const month =\n timeRange === 'previous-month'\n ? new Date(\n today.getFullYear(),\n today.getMonth() - 1,\n 1,\n ).toLocaleString('en-US', { month: 'long' })\n : today.toLocaleString('en-US', { month: 'long' });\n const endDate =\n timeRange === 'previous-month'\n ? new Date(today.getFullYear(), today.getMonth(), 0)\n .getDate()\n .toString()\n : today.getDate().toString();\n\n return {\n totalCost: 0,\n month,\n endDate,\n currencyCode: currency,\n projects: [],\n };\n }\n\n const arrayKey = `${groupBy}s` as keyof (typeof costData.data)[0];\n const groupedArray = costData.data?.[0]?.[arrayKey] as\n | Array<{ [key: string]: unknown; values: unknown[] }>\n | undefined;\n\n const projects =\n groupedArray?.map((item, index) => {\n const value =\n (item.values?.[0] as {\n cost?: {\n distributed?: { value?: number };\n total?: { value?: number };\n network_unattributed_distributed?: { value?: number };\n worker_unallocated_distributed?: { value?: number };\n platform_distributed?: { value?: number };\n storage_unattributed_distributed?: { value?: number };\n };\n infrastructure?: {\n total?: { value?: number };\n };\n supplementary?: {\n total?: { value?: number };\n };\n delta_percent?: number;\n delta_value?: number;\n }) || {};\n\n // For clusters, prefer values[0].clusters[0] (human-readable) over item.cluster (UUID)\n let itemName: string;\n let clusterId: string | undefined;\n if (groupBy === 'cluster') {\n const valueItem = item.values?.[0] as\n | { clusters?: string[]; cluster?: string }\n | undefined;\n const clustersArray = valueItem?.clusters;\n itemName =\n clustersArray && clustersArray.length > 0\n ? clustersArray[0]\n : (item.cluster as string) || 'Unknown';\n // Store the cluster UUID for display\n clusterId = (item.cluster as string) || undefined;\n } else {\n const nameField = groupBy as keyof typeof item;\n itemName = (item[nameField] as string) || 'Unknown';\n }\n\n const costField =\n groupBy === 'project' && overheadDistribution === 'distribute'\n ? 'distributed'\n : 'total';\n const costValue =\n value?.cost?.[costField as keyof typeof value.cost]?.value || 0;\n\n const deltaPercent = value?.delta_percent || 0;\n const deltaValue = value?.delta_value || 0;\n\n const infrastructureValue = value?.infrastructure?.total?.value || 0;\n const supplementaryValue = value?.supplementary?.total?.value || 0;\n\n return {\n id: `${index}`,\n projectName: itemName,\n clusterId,\n cost: costValue,\n costPercentage: 0,\n monthOverMonthChange: deltaPercent,\n monthOverMonthValue: Math.abs(deltaValue),\n includesOverhead:\n value?.cost?.network_unattributed_distributed?.value !== 0 ||\n value?.cost?.worker_unallocated_distributed?.value !== 0 ||\n value?.cost?.platform_distributed?.value !== 0 ||\n value?.cost?.storage_unattributed_distributed?.value !== 0,\n previousPeriodCost: costValue + Math.abs(deltaValue),\n infrastructureCost: infrastructureValue,\n infrastructureCostPercentage: 0,\n supplementaryCost: supplementaryValue,\n supplementaryCostPercentage: 0,\n };\n }) || [];\n\n const totalCost = costData.meta?.total?.cost?.total?.value || 0;\n const totalInfrastructureCost =\n costData.meta?.total?.infrastructure?.total?.value || 0;\n const totalSupplementaryCost =\n costData.meta?.total?.supplementary?.total?.value || 0;\n\n const currencyCode = costData.meta?.currency || currency;\n\n const projectsWithPercentage = projects.map(p => ({\n ...p,\n costPercentage: totalCost > 0 ? (p.cost / totalCost) * 100 : 0,\n infrastructureCostPercentage:\n totalInfrastructureCost > 0\n ? (p.infrastructureCost / totalInfrastructureCost) * 100\n : 0,\n supplementaryCostPercentage:\n totalSupplementaryCost > 0\n ? (p.supplementaryCost / totalSupplementaryCost) * 100\n : 0,\n }));\n\n let month: string;\n let endDate: string;\n\n if (timeRange === 'previous-month') {\n const today = new Date();\n const previousMonth = new Date(\n today.getFullYear(),\n today.getMonth() - 1,\n 1,\n );\n month = previousMonth.toLocaleString('en-US', { month: 'long' });\n const lastDayOfPreviousMonth = new Date(\n today.getFullYear(),\n today.getMonth(),\n 0,\n ).getDate();\n endDate = lastDayOfPreviousMonth.toString();\n } else {\n const today = new Date();\n month = today.toLocaleString('en-US', { month: 'long' });\n endDate = today.getDate().toString();\n }\n\n return {\n totalCost,\n month,\n endDate,\n currencyCode,\n projects: projectsWithPercentage,\n };\n }, [costData, currency, groupBy, overheadDistribution, timeRange]);\n\n // Update ref when displayData changes\n displayDataRef.current = displayData;\n\n /**\n * Builds query parameters for download request\n * @param specificItemName - Optional: specific item name to filter by (for row-level download)\n */\n const buildDownloadQueryParams = useCallback(\n (specificItemName?: string): Record<string, string | number> => {\n return buildCostManagementQueryParams(queryParamsConfig, {\n specificItemName,\n });\n },\n [queryParamsConfig],\n );\n\n /**\n * Handles download for header buttons (all data based on current filters)\n */\n const handleHeaderDownload = useCallback(\n async (format: ExportFormat) => {\n if (isDownloading) return;\n\n setIsDownloading(true);\n try {\n const queryParams = buildDownloadQueryParams();\n await api.downloadCostManagementReport({\n query: queryParams,\n format,\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`Failed to download ${format}:`, err);\n } finally {\n setIsDownloading(false);\n }\n },\n [api, buildDownloadQueryParams, isDownloading],\n );\n\n /**\n * Handles download for row-level buttons (specific item)\n */\n const handleRowDownload = useCallback(\n async (itemName: string, format: ExportFormat) => {\n if (isDownloading) return;\n\n setIsDownloading(true);\n try {\n const queryParams = buildDownloadQueryParams(itemName);\n await api.downloadCostManagementReport({\n query: queryParams,\n format,\n });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`Failed to download ${format} for ${itemName}:`, err);\n } finally {\n setIsDownloading(false);\n }\n },\n [api, buildDownloadQueryParams, isDownloading],\n );\n\n const handleRowSelect = useCallback(\n (rowId: string, isSelected: boolean) => {\n const newSelectedRows = new Set(selectedRows);\n if (isSelected) {\n newSelectedRows.add(rowId);\n } else {\n newSelectedRows.delete(rowId);\n }\n setSelectedRows(newSelectedRows);\n },\n [selectedRows],\n );\n\n const handleSelectAll = useCallback(\n (isSelected: boolean) => {\n if (isSelected && displayData) {\n setSelectedRows(\n new Set(displayData.projects.map(project => project.id)),\n );\n } else {\n setSelectedRows(new Set());\n }\n },\n [displayData],\n );\n\n const handlePageChange = useCallback((page: number, newPageSize: number) => {\n setCurrentPage(page);\n setPageSize(newPageSize);\n }, []);\n\n const handleRowsPerPageChange = useCallback((newPageSize: number) => {\n setPageSize(newPageSize);\n setCurrentPage(0);\n }, []);\n\n const totalCount = costData?.meta?.count || 0;\n\n const isAllSelected =\n displayData !== null &&\n selectedRows.size === displayData.projects.length &&\n displayData.projects.length > 0;\n const isIndeterminate =\n displayData !== null &&\n selectedRows.size > 0 &&\n selectedRows.size < displayData.projects.length;\n\n const columns = useMemo<TableColumn<ProjectCost>[]>(() => {\n const getChangeColor = (change: number) => {\n if (change < 0) return '#d32f2f';\n if (isDarkMode) return '#4BB543';\n return '#2e7d32';\n };\n\n const cols: TableColumn<ProjectCost>[] = [\n {\n title: (\n <div style={{ marginLeft: 0, paddingLeft: 0 }}>\n <input\n type=\"checkbox\"\n checked={isAllSelected}\n ref={input => {\n if (input) input.indeterminate = isIndeterminate;\n }}\n onChange={e => {\n e.stopPropagation();\n handleSelectAll(e.target.checked);\n }}\n style={{\n width: '18px',\n height: '18px',\n cursor: 'pointer',\n margin: 0,\n padding: 0,\n }}\n />\n </div>\n ),\n field: 'checkbox',\n sorting: false,\n width: '40px',\n cellStyle: {\n paddingLeft: '4px',\n paddingRight: '4px',\n },\n headerStyle: {\n paddingLeft: '4px',\n paddingRight: '4px',\n },\n render: data => (\n <div style={{ paddingRight: '4px' }}>\n <input\n type=\"checkbox\"\n checked={selectedRows.has(data.id)}\n onChange={e => handleRowSelect(data.id, e.target.checked)}\n style={{\n width: '18px',\n height: '18px',\n cursor: 'pointer',\n margin: 0,\n padding: 0,\n }}\n />\n </div>\n ),\n },\n {\n title: (\n <Typography variant=\"body2\" style={{ fontWeight: 'bold' }}>\n {groupBy.charAt(0).toLocaleUpperCase('en-US') + groupBy.slice(1)}{' '}\n name\n </Typography>\n ),\n field: 'projectName',\n cellStyle: { minWidth: 350 },\n headerStyle: { minWidth: 350 },\n render: data => (\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '8px',\n }}\n >\n <Typography variant=\"body2\">{data.projectName}</Typography>\n {groupBy === 'project' && data.includesOverhead && (\n <Typography\n variant=\"caption\"\n style={{\n padding: '2px 6px',\n backgroundColor: '#F5F5F5',\n border: '1px solid #D2D2D2',\n borderRadius: '16px',\n color: 'black',\n whiteSpace: 'nowrap',\n }}\n >\n Includes overhead\n </Typography>\n )}\n </div>\n {groupBy === 'cluster' && data.clusterId && (\n <Typography\n variant=\"caption\"\n style={{ color: '#666', display: 'block', marginTop: 10 }}\n >\n {data.clusterId}\n </Typography>\n )}\n </div>\n ),\n },\n ];\n\n if (showMonthOverMonthChange) {\n cols.push({\n title: 'Month over month change',\n field: 'monthOverMonthChange',\n sorting: false,\n render: data => (\n <div>\n <div\n style={{\n color: getChangeColor(data.monthOverMonthChange),\n }}\n >\n {Math.abs(data.monthOverMonthChange).toFixed(2)}%\n {data.monthOverMonthChange > 0 ? ' ▲' : ' ▼'}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {formatCurrency(\n data.monthOverMonthValue,\n displayData?.currencyCode || '',\n )}{' '}\n for {getDateRangeText(timeRange)}\n </div>\n </div>\n ),\n });\n }\n\n cols.push({\n title: 'Cost',\n field: 'cost',\n render: data => (\n <div>\n <div>\n {formatCurrency(data.cost, displayData?.currencyCode || '')}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {data.costPercentage.toFixed(2)}% of cost\n </div>\n </div>\n ),\n });\n\n if (showInfrastructureCost) {\n cols.push({\n title: 'Infrastructure cost',\n field: 'infrastructureCost',\n render: data => (\n <div>\n <div>\n {formatCurrency(\n data.infrastructureCost,\n displayData?.currencyCode || '',\n )}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {data.infrastructureCostPercentage.toFixed(2)}% of cost\n </div>\n </div>\n ),\n });\n }\n\n if (showSupplementaryCost) {\n cols.push({\n title: 'Supplementary cost',\n field: 'supplementaryCost',\n render: data => (\n <div>\n <div>\n {formatCurrency(\n data.supplementaryCost,\n displayData?.currencyCode || '',\n )}\n </div>\n <div style={{ fontSize: '0.75rem', color: '#666' }}>\n {data.supplementaryCostPercentage.toFixed(2)}% of cost\n </div>\n </div>\n ),\n });\n }\n\n cols.push({\n title: 'Actions',\n field: 'actions',\n sorting: false,\n render: data => (\n <div style={{ display: 'flex', gap: '8px' }}>\n <DownloadIconButton\n label=\"CSV\"\n variant={isDarkMode ? 'white' : 'black'}\n onClick={() => handleRowDownload(data.projectName, 'csv')}\n disabled={isDownloading}\n />\n <DownloadIconButton\n label=\"JSON\"\n variant={isDarkMode ? 'white' : 'black'}\n onClick={() => handleRowDownload(data.projectName, 'json')}\n disabled={isDownloading}\n />\n </div>\n ),\n });\n\n return cols;\n }, [\n handleRowSelect,\n handleRowDownload,\n isAllSelected,\n isIndeterminate,\n isDownloading,\n selectedRows,\n handleSelectAll,\n displayData?.currencyCode,\n groupBy,\n showMonthOverMonthChange,\n showInfrastructureCost,\n showSupplementaryCost,\n timeRange,\n isDarkMode,\n ]);\n\n const handleOrderChange = useCallback(\n (orderBy: number, orderDirection: 'asc' | 'desc') => {\n // If orderBy is -1, it means \"no sorting\" - ignore it to prevent removing sorting\n if (orderBy === -1) {\n return;\n }\n\n const column = columns[orderBy];\n if (\n column?.field &&\n column.field !== 'actions' &&\n column.sorting !== false\n ) {\n const newField = column.field as string;\n setSortField(newField);\n setSortDirection(orderDirection);\n\n setCurrentPage(0);\n }\n },\n [columns],\n );\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n return (\n <BasePage pageTitle=\"\" withContentPadding>\n <PageHeader\n totalCost={displayData.totalCost}\n month={displayData.month}\n endDate={displayData.endDate}\n currencyCode={displayData.currencyCode}\n customStyle={{ marginTop: '-24px' }}\n />\n\n <Divider\n style={{\n marginBottom: 24,\n marginLeft: '-24px',\n marginRight: '-24px',\n width: 'calc(100% + 48px)',\n }}\n />\n\n <PageLayout>\n <PageLayout.Filters>\n <Filters\n groupBy={groupBy}\n overheadDistribution={overheadDistribution}\n timeRange={timeRange}\n currency={currency}\n filterBy={filterBy}\n filterOperation={filterOperation}\n filterValue={filterValue}\n tags={tags}\n onGroupByChange={value => {\n setGroupBy(value);\n setCurrentPage(0);\n if (value !== 'tag') {\n setSelectedTag('');\n }\n // Reset showPlatformSum when groupBy changes away from 'project'\n if (value !== 'project') {\n setShowPlatformSum(false);\n }\n // Sync filterBy with groupBy and reset filter value\n setFilterBy(value);\n setFilterValue('');\n // Reset tag-related filter fields\n setSelectedTagKey('');\n setSelectedTagValue('');\n }}\n selectedTag={selectedTag}\n onSelectedTagChange={value => {\n setSelectedTag(value);\n setCurrentPage(0);\n }}\n onOverheadDistributionChange={value => {\n setOverheadDistribution(value);\n setCurrentPage(0);\n }}\n onTimeRangeChange={value => {\n setTimeRange(value);\n setCurrentPage(0);\n }}\n onCurrencyChange={value => {\n setCurrency(value);\n setCurrentPage(0);\n }}\n onFilterByChange={value => {\n setFilterBy(value);\n setCurrentPage(0);\n // Clear tag-related selections when filterBy changes away from 'tag'\n if (value !== 'tag') {\n setSelectedTagKey('');\n setSelectedTagValue('');\n }\n }}\n onFilterOperationChange={value => {\n setFilterOperation(value);\n setCurrentPage(0);\n }}\n onFilterValueChange={value => {\n setFilterValue(value);\n setCurrentPage(0);\n }}\n selectedTagKey={selectedTagKey}\n selectedTagValue={selectedTagValue}\n onSelectedTagKeyChange={value => {\n setSelectedTagKey(value);\n setSelectedTagValue('');\n setCurrentPage(0);\n }}\n onSelectedTagValueChange={value => {\n setSelectedTagValue(value);\n setCurrentPage(0);\n }}\n />\n </PageLayout.Filters>\n <PageLayout.Table>\n <div style={{ flex: 1 }}>\n <InfoCard>\n <Table<ProjectCost>\n data={displayData?.projects || []}\n isLoading={loading}\n components={{\n Toolbar: () => (\n <TableToolbar\n showPlatformSum={showPlatformSum}\n setShowPlatformSum={setShowPlatformSum}\n projectsCount={displayData?.projects?.length || 0}\n groupBy={groupBy}\n showMonthOverMonthChange={showMonthOverMonthChange}\n setShowMonthOverMonthChange={setShowMonthOverMonthChange}\n showInfrastructureCost={showInfrastructureCost}\n setShowInfrastructureCost={setShowInfrastructureCost}\n showSupplementaryCost={showSupplementaryCost}\n setShowSupplementaryCost={setShowSupplementaryCost}\n onDownloadCsv={() => handleHeaderDownload('csv')}\n onDownloadJson={() => handleHeaderDownload('json')}\n isDownloading={isDownloading}\n />\n ),\n }}\n columns={columns}\n options={{\n paging: true,\n pageSize: pageSize,\n pageSizeOptions: [5, 10, 25, 50],\n search: false,\n sorting: true,\n padding: 'dense',\n thirdSortClick: false,\n }}\n totalCount={totalCount}\n page={currentPage}\n onPageChange={handlePageChange}\n onRowsPerPageChange={handleRowsPerPageChange}\n onOrderChange={handleOrderChange}\n style={{ outline: 'none' }}\n localization={{\n pagination: {\n labelRowsPerPage: 'rows',\n },\n }}\n />\n </InfoCard>\n </div>\n </PageLayout.Table>\n </PageLayout>\n </BasePage>\n );\n}\nOpenShiftPage.displayName = 'OpenShiftPage';\n"],"names":["monthName","month","endDate"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutocompleteComponent.esm.js","sources":["../../../../src/pages/openshift/components/AutocompleteComponent.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 */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Box from '@material-ui/core/Box';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n Autocomplete,\n AutocompleteChangeDetails,\n AutocompleteChangeReason,\n} from '@material-ui/lab';\nimport { useThemeBackgroundColor } from '../../../hooks/useThemeBackgroundColor';\n\nconst useAutocompleteStyles = makeStyles(\n {\n root: {},\n label: {},\n input: { backgroundColor: 'transparent' },\n fullWidth: { width: '100%' },\n },\n { name: 'AutocompleteComponent' },\n);\n\ntype BaseProps = {\n label: string;\n options: string[];\n placeholder?: string;\n className?: string;\n};\n\ntype SingleProps = BaseProps & {\n multiple?: false;\n value?: string;\n onChange?: (\n event: React.ChangeEvent<{}>,\n value: string | null,\n reason: AutocompleteChangeReason,\n details?: AutocompleteChangeDetails<string> | undefined,\n ) => void;\n onInputChange?: (\n event: React.ChangeEvent<{}>,\n value: string,\n reason: string,\n ) => void;\n loading?: boolean;\n};\n\ntype MultipleProps = BaseProps & {\n multiple: true;\n value?: string[];\n onChange?: (\n event: React.ChangeEvent<{}>,\n value: string[],\n reason: AutocompleteChangeReason,\n details?: AutocompleteChangeDetails<string> | undefined,\n ) => void;\n};\n\ntype AutocompleteComponentProps = SingleProps | MultipleProps;\n\n/** @public */\nexport function AutocompleteComponent(props: AutocompleteComponentProps) {\n const classes = useAutocompleteStyles();\n const { label, options, placeholder, className } = props;\n const { backgroundColor } = useThemeBackgroundColor();\n\n return (\n <Box className={className ?? classes.root} pb={1} pt={1}>\n <Typography\n className={classes.label}\n variant=\"button\"\n component=\"label\"\n style={{ textTransform: 'none' }}\n >\n {label}\n </Typography>\n <Autocomplete\n options={options}\n multiple={Boolean((props as MultipleProps).multiple)}\n value={\n (props as any).value ??\n (Boolean((props as MultipleProps).multiple) ? [] : null)\n }\n onChange={(event, value, reason, details) => {\n if (props.onChange) {\n // Cast is safe because the callback shape matches the multiple flag\n (props.onChange as any)(event, value, reason, details);\n }\n }}\n onInputChange={(event, value, reason) => {\n if ((props as SingleProps).onInputChange) {\n (props as SingleProps).onInputChange!(event, value, reason);\n }\n }}\n loading={(props as SingleProps).loading ?? false}\n popupIcon={<ExpandMoreIcon data-testid=\"expand-icon\" />}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n placeholder={placeholder}\n style={{ backgroundColor }}\n />\n )}\n size=\"medium\"\n />\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AA6BA,MAAM,
|
|
1
|
+
{"version":3,"file":"AutocompleteComponent.esm.js","sources":["../../../../src/pages/openshift/components/AutocompleteComponent.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 */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Box from '@material-ui/core/Box';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport {\n Autocomplete,\n AutocompleteChangeDetails,\n AutocompleteChangeReason,\n} from '@material-ui/lab';\nimport { useThemeBackgroundColor } from '../../../hooks/useThemeBackgroundColor';\n\nconst useAutocompleteStyles = makeStyles(\n {\n root: {},\n label: {},\n input: { backgroundColor: 'transparent' },\n fullWidth: { width: '100%' },\n },\n { name: 'AutocompleteComponent' },\n);\n\ntype BaseProps = {\n label: string;\n options: string[];\n placeholder?: string;\n className?: string;\n};\n\ntype SingleProps = BaseProps & {\n multiple?: false;\n value?: string;\n onChange?: (\n event: React.ChangeEvent<{}>,\n value: string | null,\n reason: AutocompleteChangeReason,\n details?: AutocompleteChangeDetails<string> | undefined,\n ) => void;\n onInputChange?: (\n event: React.ChangeEvent<{}>,\n value: string,\n reason: string,\n ) => void;\n loading?: boolean;\n};\n\ntype MultipleProps = BaseProps & {\n multiple: true;\n value?: string[];\n onChange?: (\n event: React.ChangeEvent<{}>,\n value: string[],\n reason: AutocompleteChangeReason,\n details?: AutocompleteChangeDetails<string> | undefined,\n ) => void;\n};\n\ntype AutocompleteComponentProps = SingleProps | MultipleProps;\n\n/** @public */\nexport function AutocompleteComponent(props: AutocompleteComponentProps) {\n const classes = useAutocompleteStyles();\n const { label, options, placeholder, className } = props;\n const { backgroundColor } = useThemeBackgroundColor();\n\n return (\n <Box className={className ?? classes.root} pb={1} pt={1}>\n <Typography\n className={classes.label}\n variant=\"button\"\n component=\"label\"\n style={{ textTransform: 'none' }}\n >\n {label}\n </Typography>\n <Autocomplete\n options={options}\n multiple={Boolean((props as MultipleProps).multiple)}\n value={\n (props as any).value ??\n (Boolean((props as MultipleProps).multiple) ? [] : null)\n }\n onChange={(event, value, reason, details) => {\n if (props.onChange) {\n // Cast is safe because the callback shape matches the multiple flag\n (props.onChange as any)(event, value, reason, details);\n }\n }}\n onInputChange={(event, value, reason) => {\n if ((props as SingleProps).onInputChange) {\n (props as SingleProps).onInputChange!(event, value, reason);\n }\n }}\n loading={(props as SingleProps).loading ?? false}\n popupIcon={<ExpandMoreIcon data-testid=\"expand-icon\" />}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"outlined\"\n placeholder={placeholder}\n style={{ backgroundColor }}\n />\n )}\n size=\"medium\"\n />\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AA6BA,MAAM,qBAAA,GAAwB,UAAA;AAAA,EAC5B;AAAA,IACE,MAAM,EAAC;AAAA,IACP,OAAO,EAAC;AAAA,IACR,KAAA,EAAO,EAAE,eAAA,EAAiB,aAAA,EAAc;AAAA,IACxC,SAAA,EAAW,EAAE,KAAA,EAAO,MAAA;AAAO,GAC7B;AAAA,EACA,EAAE,MAAM,uBAAA;AACV,CAAA;AAwCO,SAAS,sBAAsB,KAAA,EAAmC;AACvE,EAAA,MAAM,UAAU,qBAAA,EAAsB;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,WAAU,GAAI,KAAA;AACnD,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,uBAAA,EAAwB;AAEpD,EAAA,uBACE,KAAA,CAAA,aAAA,CAAC,OAAI,SAAA,EAAW,SAAA,IAAa,QAAQ,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAA,kBACpD,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,WAAW,OAAA,CAAQ,KAAA;AAAA,MACnB,OAAA,EAAQ,QAAA;AAAA,MACR,SAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA;AAAO,KAAA;AAAA,IAE9B;AAAA,GACH,kBACA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAA,EAAU,OAAA,CAAS,KAAA,CAAwB,QAAQ,CAAA;AAAA,MACnD,KAAA,EACG,MAAc,KAAA,KACd,OAAA,CAAS,MAAwB,QAAQ,CAAA,GAAI,EAAC,GAAI,IAAA,CAAA;AAAA,MAErD,QAAA,EAAU,CAAC,KAAA,EAAO,KAAA,EAAO,QAAQ,OAAA,KAAY;AAC3C,QAAA,IAAI,MAAM,QAAA,EAAU;AAElB,UAAC,KAAA,CAAM,QAAA,CAAiB,KAAA,EAAO,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,QACvD;AAAA,MACF,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,KAAA,EAAO,KAAA,EAAO,MAAA,KAAW;AACvC,QAAA,IAAK,MAAsB,aAAA,EAAe;AACxC,UAAC,KAAA,CAAsB,aAAA,CAAe,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,QAC5D;AAAA,MACF,CAAA;AAAA,MACA,OAAA,EAAU,MAAsB,OAAA,IAAW,KAAA;AAAA,MAC3C,SAAA,kBAAW,KAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAe,aAAA,EAAY,aAAA,EAAc,CAAA;AAAA,MACrD,aAAa,CAAA,MAAA,qBACX,KAAA,CAAA,aAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACJ,OAAA,EAAQ,UAAA;AAAA,UACR,WAAA;AAAA,UACA,KAAA,EAAO,EAAE,eAAA;AAAgB;AAAA,OAC3B;AAAA,MAEF,IAAA,EAAK;AAAA;AAAA,GAET,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadIconButton.esm.js","sources":["../../../../src/pages/openshift/components/DownloadIconButton.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 */\n\nimport Typography from '@material-ui/core/Typography';\nimport React from 'react';\n\ntype DownloadIconButtonProps = {\n label: string;\n variant: 'gray' | 'black' | 'white';\n onClick?: () => void;\n disabled?: boolean;\n};\n\nconst getColor = (variant: 'gray' | 'black' | 'white', disabled?: boolean) => {\n if (disabled) return '#999999';\n if (variant === 'gray') return '#C7C7C7';\n if (variant === 'black') return '#000000';\n if (variant === 'white') return '#FFFFFF';\n return '#C7C7C7';\n};\n\nexport function DownloadIconButton(props: Readonly<DownloadIconButtonProps>) {\n const { label, variant, onClick, disabled } = props;\n const color = getColor(variant, disabled);\n\n return (\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={disabled ? undefined : onClick}\n onKeyDown={\n disabled\n ? undefined\n : e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n }\n style={{\n border: `2px solid ${color}`,\n borderRadius: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: disabled ? 'not-allowed' : 'pointer',\n paddingTop: 2,\n opacity: disabled ? 0.6 : 1,\n }}\n >\n <Typography\n variant=\"body2\"\n style={{ color, fontSize: 9, fontWeight: 'bold' }}\n >\n {label}\n </Typography>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AA0BA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAqC,
|
|
1
|
+
{"version":3,"file":"DownloadIconButton.esm.js","sources":["../../../../src/pages/openshift/components/DownloadIconButton.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 */\n\nimport Typography from '@material-ui/core/Typography';\nimport React from 'react';\n\ntype DownloadIconButtonProps = {\n label: string;\n variant: 'gray' | 'black' | 'white';\n onClick?: () => void;\n disabled?: boolean;\n};\n\nconst getColor = (variant: 'gray' | 'black' | 'white', disabled?: boolean) => {\n if (disabled) return '#999999';\n if (variant === 'gray') return '#C7C7C7';\n if (variant === 'black') return '#000000';\n if (variant === 'white') return '#FFFFFF';\n return '#C7C7C7';\n};\n\nexport function DownloadIconButton(props: Readonly<DownloadIconButtonProps>) {\n const { label, variant, onClick, disabled } = props;\n const color = getColor(variant, disabled);\n\n return (\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={disabled ? undefined : onClick}\n onKeyDown={\n disabled\n ? undefined\n : e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.();\n }\n }\n }\n style={{\n border: `2px solid ${color}`,\n borderRadius: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: disabled ? 'not-allowed' : 'pointer',\n paddingTop: 2,\n opacity: disabled ? 0.6 : 1,\n }}\n >\n <Typography\n variant=\"body2\"\n style={{ color, fontSize: 9, fontWeight: 'bold' }}\n >\n {label}\n </Typography>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AA0BA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAqC,QAAA,KAAuB;AAC5E,EAAA,IAAI,UAAU,OAAO,SAAA;AACrB,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,SAAA;AAC/B,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,SAAA;AAChC,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,SAAA;AAChC,EAAA,OAAO,SAAA;AACT,CAAA;AAEO,SAAS,mBAAmB,KAAA,EAA0C;AAC3E,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,UAAS,GAAI,KAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAA;AAExC,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,WAAW,EAAA,GAAK,CAAA;AAAA,MAC1B,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,SAAA,EACE,QAAA,GACI,MAAA,GACA,CAAA,CAAA,KAAK;AACH,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,OAAA,IAAU;AAAA,QACZ;AAAA,MACF,CAAA;AAAA,MAEN,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,aAAa,KAAK,CAAA,CAAA;AAAA,QAC1B,YAAA,EAAc,CAAA;AAAA,QACd,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,MAAA,EAAQ,WAAW,aAAA,GAAgB,SAAA;AAAA,QACnC,UAAA,EAAY,CAAA;AAAA,QACZ,OAAA,EAAS,WAAW,GAAA,GAAM;AAAA;AAC5B,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA,EAAG,YAAY,MAAA;AAAO,OAAA;AAAA,MAE/C;AAAA;AACH,GACF;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.esm.js","sources":["../../../../src/pages/openshift/components/Filters.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 */\n\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useBaseFiltersStyles } from '../../../components/filtersStyles';\nimport { SelectComponent } from './SelectComponent';\nimport { AutocompleteComponent } from './AutocompleteComponent';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { costManagementSlimApiRef } from '../../../apis';\nimport useAsync from 'react-use/lib/useAsync';\nimport debounce from 'lodash/debounce';\nimport { useThemeBackgroundColor } from '../../../hooks/useThemeBackgroundColor';\n\nconst useFiltersStyles = makeStyles(\n theme => ({\n filters: {\n '& > *': {\n marginTop: theme.spacing(0),\n },\n },\n filterSection: {\n marginBottom: theme.spacing(0),\n },\n divider: {\n margin: theme.spacing(2, 0),\n },\n }),\n { name: 'OpenShiftFilters' },\n);\n\n/** @public */\nexport type FiltersProps = {\n groupBy: string;\n overheadDistribution: string;\n timeRange: string;\n currency: string;\n filterBy: string;\n filterOperation: string;\n filterValue: string;\n tags?: string[];\n selectedTag?: string;\n selectedTagKey?: string;\n selectedTagValue?: string;\n onGroupByChange: (value: string) => void;\n onOverheadDistributionChange: (value: string) => void;\n onTimeRangeChange: (value: string) => void;\n onCurrencyChange: (value: string) => void;\n onFilterByChange: (value: string) => void;\n onFilterOperationChange: (value: string) => void;\n onFilterValueChange: (value: string) => void;\n onSelectedTagChange: (value: string) => void;\n onSelectedTagKeyChange: (value: string) => void;\n onSelectedTagValueChange: (value: string) => void;\n};\n\nexport type CurrencyOption = {\n label: string;\n value: string;\n};\n\n/** @public */\nexport function Filters(props: FiltersProps) {\n const {\n groupBy,\n overheadDistribution,\n timeRange,\n currency,\n filterBy,\n filterOperation,\n filterValue,\n tags = [],\n selectedTag = '',\n selectedTagKey = '',\n selectedTagValue = '',\n onGroupByChange,\n onOverheadDistributionChange,\n onTimeRangeChange,\n onCurrencyChange,\n onFilterByChange,\n onFilterOperationChange,\n onFilterValueChange,\n onSelectedTagChange,\n onSelectedTagKeyChange,\n onSelectedTagValueChange,\n } = props;\n const baseClasses = useBaseFiltersStyles();\n const classes = useFiltersStyles();\n const api = useApi(costManagementSlimApiRef);\n\n const { filterTableBackgroundColor } = useThemeBackgroundColor();\n // State for search input and debounced search\n const [searchInput, setSearchInput] = useState<string>('');\n const [debouncedSearch, setDebouncedSearch] = useState<string>('');\n\n // Debounce function to update debouncedSearch after 500ms\n const debouncedSetSearch = useMemo(\n () =>\n debounce((value: string) => {\n setDebouncedSearch(value);\n }, 500),\n [],\n );\n\n // Update debounced search when searchInput changes\n useEffect(() => {\n debouncedSetSearch(searchInput);\n return () => {\n debouncedSetSearch.cancel();\n };\n }, [searchInput, debouncedSetSearch]);\n\n // Reset search when filterBy changes\n useEffect(() => {\n setSearchInput('');\n setDebouncedSearch('');\n }, [filterBy]);\n\n // Fetch resource options based on filterBy and debouncedSearch\n const { value: resourceOptions, loading: isLoadingOptions } =\n useAsync(async () => {\n // For tags, filter the tags array based on search input (for tag key selection)\n if (filterBy === 'tag') {\n if (!debouncedSearch.trim()) {\n return tags;\n }\n const searchLower = debouncedSearch.toLocaleLowerCase('en-US');\n return tags.filter(tag =>\n tag.toLocaleLowerCase('en-US').includes(searchLower),\n );\n }\n\n // Don't fetch if there's no search term\n if (!debouncedSearch.trim()) {\n return [];\n }\n\n try {\n let response;\n switch (filterBy) {\n case 'project':\n response = await api.searchOpenShiftProjects(debouncedSearch);\n break;\n case 'cluster':\n response = await api.searchOpenShiftClusters(debouncedSearch);\n break;\n case 'node':\n response = await api.searchOpenShiftNodes(debouncedSearch);\n break;\n default:\n return [];\n }\n const data = await response.json();\n // Extract the 'value' property from each object in the data array\n return (data.data || []).map((item: { value: string }) => item.value);\n } catch {\n // Silently return empty array on error\n return [];\n }\n }, [filterBy, debouncedSearch, api, tags]);\n\n // Fetch tag values when a tag key is selected for filtering\n const { value: tagValuesData, loading: isLoadingTagValues } =\n useAsync(async () => {\n if (filterBy === 'tag' && selectedTagKey) {\n try {\n const timeScopeValue = timeRange === 'month-to-date' ? -1 : -2;\n const response = await api.getOpenShiftTagValues(\n selectedTagKey,\n timeScopeValue,\n );\n const data = await response.json();\n // Extract all unique values from all items in the data array\n const allValues = new Set<string>();\n for (const item of data.data || []) {\n if (item.values) {\n for (const value of item.values) {\n allValues.add(value);\n }\n }\n }\n return Array.from(allValues).sort((a, b) =>\n a.localeCompare(b, 'en-US'),\n );\n } catch {\n return [];\n }\n }\n return [];\n }, [filterBy, selectedTagKey, timeRange, api]);\n\n // Generate filter value options based on API results\n // Always include the current filterValue if it's set, so it doesn't disappear\n const getFilterValueOptions = useMemo((): string[] => {\n const options = resourceOptions || [];\n // If filterValue is set and not already in options, add it\n if (filterValue && !options.includes(filterValue)) {\n return [filterValue, ...options];\n }\n return options;\n }, [resourceOptions, filterValue]);\n\n // Handle input change in autocomplete\n const handleInputChange = useCallback(\n (_event: React.ChangeEvent<{}>, value: string, reason: string) => {\n // Only update search input when user is typing (not when clearing or resetting)\n if (reason === 'input') {\n setSearchInput(value);\n }\n },\n [],\n );\n\n const currencyOptions: CurrencyOption[] = [\n { label: 'AUD (A$) - Australian Dollar', value: 'AUD' },\n { label: 'BRL (R$) - Brazilian Real', value: 'BRL' },\n { label: 'CAD (CA$) - Canadian Dollar', value: 'CAD' },\n { label: 'CHF (CHF) - Swiss Franc', value: 'CHF' },\n { label: 'CNY (CN¥) - Chinese Yuan', value: 'CNY' },\n { label: 'CZK (Kč) - Czech Koruna', value: 'CZK' },\n { label: 'DKK (DKK) - Danish Krone', value: 'DKK' },\n { label: 'EUR (€) - Euro', value: 'EUR' },\n { label: 'GBP (£) - British Pound', value: 'GBP' },\n { label: 'HKD (HK$) - Hong Kong Dollar', value: 'HKD' },\n { label: 'INR (₹) - Indian Rupee', value: 'INR' },\n { label: 'JPY (¥) - Japanese Yen', value: 'JPY' },\n { label: 'NGN (₦) - Nigerian Naira', value: 'NGN' },\n { label: 'NOK (NOK) - Norwegian Krone', value: 'NOK' },\n { label: 'NZD (NZ$) - New Zealand Dollar', value: 'NZD' },\n { label: 'SEK (SEK) - Swedish Krona', value: 'SEK' },\n { label: 'SGD (SGD) - Singapore Dollar', value: 'SGD' },\n { label: 'USD ($) - United States Dollar', value: 'USD' },\n { label: 'ZAR (ZAR) - South African Rand', value: 'ZAR' },\n ];\n\n return (\n <Box className={baseClasses.root}>\n <Box className={`${baseClasses.filters} ${classes.filters}`}>\n {/* Group by */}\n <div className={classes.filterSection}>\n <Box p={1} pt={0}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Group by\"\n options={['project', 'cluster', 'node', 'tag']}\n value={groupBy}\n placeholder=\"Group by\"\n onChange={(event): void =>\n onGroupByChange(event.target.value as string)\n }\n />\n {groupBy === 'tag' && (\n <Box p={0} pt={0}>\n <AutocompleteComponent\n label=\"Choose key\"\n options={tags}\n value={selectedTag}\n placeholder=\"Choose key\"\n loading={false}\n onChange={(_event, value): void => {\n onSelectedTagChange((value as string) ?? '');\n }}\n />\n </Box>\n )}\n </Box>\n </div>\n\n {/* Overhead cost */}\n <div className={classes.filterSection}>\n <Box p={1}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Overhead cost\"\n options={[\n 'Distribute through cost models',\n \"Don't distribute overhead costs\",\n ]}\n value={\n overheadDistribution === 'distribute'\n ? 'Distribute through cost models'\n : \"Don't distribute overhead costs\"\n }\n placeholder=\"Overhead cost\"\n onChange={(event): void => {\n const value = event.target.value as string;\n const mappedValue =\n value === 'Distribute through cost models'\n ? 'distribute'\n : 'dont_distribute';\n onOverheadDistributionChange(mappedValue);\n }}\n />\n </Box>\n </div>\n\n {/* Time */}\n <div className={classes.filterSection}>\n <Box p={1}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Time\"\n options={['Month to date', 'Previous month']}\n value={\n timeRange === 'month-to-date'\n ? 'Month to date'\n : 'Previous month'\n }\n placeholder=\"Time\"\n onChange={(event): void => {\n const value = event.target.value as string;\n const mappedValue =\n value === 'Month to date'\n ? 'month-to-date'\n : 'previous-month';\n onTimeRangeChange(mappedValue);\n }}\n />\n </Box>\n </div>\n\n <Box marginX={2}>\n <Divider className={classes.divider} />\n </Box>\n\n {/* Filter table by */}\n <div className={classes.filterSection}>\n <div\n style={{\n backgroundColor: filterTableBackgroundColor,\n padding: 16,\n borderRadius: 8,\n }}\n >\n <div style={{ fontWeight: 'bold', marginBottom: '8px' }}>\n Filter table by\n </div>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"\"\n options={['project', 'cluster', 'node', 'tag']}\n value={filterBy}\n placeholder=\"\"\n onChange={(event): void => {\n const newFilterBy = event.target.value as string;\n onFilterByChange(newFilterBy);\n onFilterValueChange('');\n // Clear tag-related selections when filterBy changes away from 'tag'\n if (newFilterBy !== 'tag') {\n onSelectedTagKeyChange('');\n onSelectedTagValueChange('');\n }\n }}\n />\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"\"\n options={['includes', 'excludes', 'exact']}\n value={filterOperation}\n placeholder=\"\"\n onChange={(event): void => {\n onFilterOperationChange(event.target.value as string);\n }}\n />\n\n {filterBy === 'tag' ? (\n <>\n <AutocompleteComponent\n label=\"\"\n options={getFilterValueOptions}\n value={selectedTagKey}\n placeholder=\"Select tag key\"\n loading={false}\n onInputChange={handleInputChange}\n onChange={(_event, value): void => {\n const tagKey = (value as string) ?? '';\n onSelectedTagKeyChange(tagKey);\n // Clear tag value when tag key changes\n onSelectedTagValueChange('');\n // Clear search input when a value is selected\n setSearchInput('');\n setDebouncedSearch('');\n }}\n />\n {selectedTagKey && (\n <Box style={{ marginTop: '-8px' }}>\n <AutocompleteComponent\n label=\"\"\n options={tagValuesData || []}\n value={selectedTagValue}\n placeholder=\"Select tag value\"\n loading={isLoadingTagValues}\n onChange={(_event, value): void => {\n onSelectedTagValueChange((value as string) ?? '');\n }}\n />\n </Box>\n )}\n </>\n ) : (\n <AutocompleteComponent\n label=\"\"\n options={getFilterValueOptions}\n value={filterValue}\n placeholder={`Filter by ${filterBy || 'project'}`}\n loading={isLoadingOptions}\n onInputChange={handleInputChange}\n onChange={(_event, value): void => {\n onFilterValueChange((value as string) ?? '');\n // Clear search input when a value is selected\n setSearchInput('');\n setDebouncedSearch('');\n }}\n />\n )}\n </div>\n </div>\n\n <Box marginX={2}>\n <Divider className={classes.divider} />\n </Box>\n\n {/* Currency */}\n <div className={classes.filterSection}>\n <Box p={2}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Currency\"\n options={currencyOptions.map(\n (value: CurrencyOption) => value.label,\n )}\n value={\n currencyOptions.find(\n (item: CurrencyOption) => item.value === currency,\n )?.label ?? ''\n }\n placeholder=\"Select currency\"\n onChange={(event): void => {\n const selectedLabel = event.target.value as string;\n const selectedCurrency =\n currencyOptions.find(\n (item: CurrencyOption) => item.label === selectedLabel,\n )?.value ?? '';\n onCurrencyChange(selectedCurrency);\n }}\n />\n </Box>\n </div>\n </Box>\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Filters.esm.js","sources":["../../../../src/pages/openshift/components/Filters.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 */\n\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useBaseFiltersStyles } from '../../../components/filtersStyles';\nimport { SelectComponent } from './SelectComponent';\nimport { AutocompleteComponent } from './AutocompleteComponent';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { costManagementSlimApiRef } from '../../../apis';\nimport useAsync from 'react-use/lib/useAsync';\nimport debounce from 'lodash/debounce';\nimport { useThemeBackgroundColor } from '../../../hooks/useThemeBackgroundColor';\n\nconst useFiltersStyles = makeStyles(\n theme => ({\n filters: {\n '& > *': {\n marginTop: theme.spacing(0),\n },\n },\n filterSection: {\n marginBottom: theme.spacing(0),\n },\n divider: {\n margin: theme.spacing(2, 0),\n },\n }),\n { name: 'OpenShiftFilters' },\n);\n\n/** @public */\nexport type FiltersProps = {\n groupBy: string;\n overheadDistribution: string;\n timeRange: string;\n currency: string;\n filterBy: string;\n filterOperation: string;\n filterValue: string;\n tags?: string[];\n selectedTag?: string;\n selectedTagKey?: string;\n selectedTagValue?: string;\n onGroupByChange: (value: string) => void;\n onOverheadDistributionChange: (value: string) => void;\n onTimeRangeChange: (value: string) => void;\n onCurrencyChange: (value: string) => void;\n onFilterByChange: (value: string) => void;\n onFilterOperationChange: (value: string) => void;\n onFilterValueChange: (value: string) => void;\n onSelectedTagChange: (value: string) => void;\n onSelectedTagKeyChange: (value: string) => void;\n onSelectedTagValueChange: (value: string) => void;\n};\n\nexport type CurrencyOption = {\n label: string;\n value: string;\n};\n\n/** @public */\nexport function Filters(props: FiltersProps) {\n const {\n groupBy,\n overheadDistribution,\n timeRange,\n currency,\n filterBy,\n filterOperation,\n filterValue,\n tags = [],\n selectedTag = '',\n selectedTagKey = '',\n selectedTagValue = '',\n onGroupByChange,\n onOverheadDistributionChange,\n onTimeRangeChange,\n onCurrencyChange,\n onFilterByChange,\n onFilterOperationChange,\n onFilterValueChange,\n onSelectedTagChange,\n onSelectedTagKeyChange,\n onSelectedTagValueChange,\n } = props;\n const baseClasses = useBaseFiltersStyles();\n const classes = useFiltersStyles();\n const api = useApi(costManagementSlimApiRef);\n\n const { filterTableBackgroundColor } = useThemeBackgroundColor();\n // State for search input and debounced search\n const [searchInput, setSearchInput] = useState<string>('');\n const [debouncedSearch, setDebouncedSearch] = useState<string>('');\n\n // Debounce function to update debouncedSearch after 500ms\n const debouncedSetSearch = useMemo(\n () =>\n debounce((value: string) => {\n setDebouncedSearch(value);\n }, 500),\n [],\n );\n\n // Update debounced search when searchInput changes\n useEffect(() => {\n debouncedSetSearch(searchInput);\n return () => {\n debouncedSetSearch.cancel();\n };\n }, [searchInput, debouncedSetSearch]);\n\n // Reset search when filterBy changes\n useEffect(() => {\n setSearchInput('');\n setDebouncedSearch('');\n }, [filterBy]);\n\n // Fetch resource options based on filterBy and debouncedSearch\n const { value: resourceOptions, loading: isLoadingOptions } =\n useAsync(async () => {\n // For tags, filter the tags array based on search input (for tag key selection)\n if (filterBy === 'tag') {\n if (!debouncedSearch.trim()) {\n return tags;\n }\n const searchLower = debouncedSearch.toLocaleLowerCase('en-US');\n return tags.filter(tag =>\n tag.toLocaleLowerCase('en-US').includes(searchLower),\n );\n }\n\n // Don't fetch if there's no search term\n if (!debouncedSearch.trim()) {\n return [];\n }\n\n try {\n let response;\n switch (filterBy) {\n case 'project':\n response = await api.searchOpenShiftProjects(debouncedSearch);\n break;\n case 'cluster':\n response = await api.searchOpenShiftClusters(debouncedSearch);\n break;\n case 'node':\n response = await api.searchOpenShiftNodes(debouncedSearch);\n break;\n default:\n return [];\n }\n const data = await response.json();\n // Extract the 'value' property from each object in the data array\n return (data.data || []).map((item: { value: string }) => item.value);\n } catch {\n // Silently return empty array on error\n return [];\n }\n }, [filterBy, debouncedSearch, api, tags]);\n\n // Fetch tag values when a tag key is selected for filtering\n const { value: tagValuesData, loading: isLoadingTagValues } =\n useAsync(async () => {\n if (filterBy === 'tag' && selectedTagKey) {\n try {\n const timeScopeValue = timeRange === 'month-to-date' ? -1 : -2;\n const response = await api.getOpenShiftTagValues(\n selectedTagKey,\n timeScopeValue,\n );\n const data = await response.json();\n // Extract all unique values from all items in the data array\n const allValues = new Set<string>();\n for (const item of data.data || []) {\n if (item.values) {\n for (const value of item.values) {\n allValues.add(value);\n }\n }\n }\n return Array.from(allValues).sort((a, b) =>\n a.localeCompare(b, 'en-US'),\n );\n } catch {\n return [];\n }\n }\n return [];\n }, [filterBy, selectedTagKey, timeRange, api]);\n\n // Generate filter value options based on API results\n // Always include the current filterValue if it's set, so it doesn't disappear\n const getFilterValueOptions = useMemo((): string[] => {\n const options = resourceOptions || [];\n // If filterValue is set and not already in options, add it\n if (filterValue && !options.includes(filterValue)) {\n return [filterValue, ...options];\n }\n return options;\n }, [resourceOptions, filterValue]);\n\n // Handle input change in autocomplete\n const handleInputChange = useCallback(\n (_event: React.ChangeEvent<{}>, value: string, reason: string) => {\n // Only update search input when user is typing (not when clearing or resetting)\n if (reason === 'input') {\n setSearchInput(value);\n }\n },\n [],\n );\n\n const currencyOptions: CurrencyOption[] = [\n { label: 'AUD (A$) - Australian Dollar', value: 'AUD' },\n { label: 'BRL (R$) - Brazilian Real', value: 'BRL' },\n { label: 'CAD (CA$) - Canadian Dollar', value: 'CAD' },\n { label: 'CHF (CHF) - Swiss Franc', value: 'CHF' },\n { label: 'CNY (CN¥) - Chinese Yuan', value: 'CNY' },\n { label: 'CZK (Kč) - Czech Koruna', value: 'CZK' },\n { label: 'DKK (DKK) - Danish Krone', value: 'DKK' },\n { label: 'EUR (€) - Euro', value: 'EUR' },\n { label: 'GBP (£) - British Pound', value: 'GBP' },\n { label: 'HKD (HK$) - Hong Kong Dollar', value: 'HKD' },\n { label: 'INR (₹) - Indian Rupee', value: 'INR' },\n { label: 'JPY (¥) - Japanese Yen', value: 'JPY' },\n { label: 'NGN (₦) - Nigerian Naira', value: 'NGN' },\n { label: 'NOK (NOK) - Norwegian Krone', value: 'NOK' },\n { label: 'NZD (NZ$) - New Zealand Dollar', value: 'NZD' },\n { label: 'SEK (SEK) - Swedish Krona', value: 'SEK' },\n { label: 'SGD (SGD) - Singapore Dollar', value: 'SGD' },\n { label: 'USD ($) - United States Dollar', value: 'USD' },\n { label: 'ZAR (ZAR) - South African Rand', value: 'ZAR' },\n ];\n\n return (\n <Box className={baseClasses.root}>\n <Box className={`${baseClasses.filters} ${classes.filters}`}>\n {/* Group by */}\n <div className={classes.filterSection}>\n <Box p={1} pt={0}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Group by\"\n options={['project', 'cluster', 'node', 'tag']}\n value={groupBy}\n placeholder=\"Group by\"\n onChange={(event): void =>\n onGroupByChange(event.target.value as string)\n }\n />\n {groupBy === 'tag' && (\n <Box p={0} pt={0}>\n <AutocompleteComponent\n label=\"Choose key\"\n options={tags}\n value={selectedTag}\n placeholder=\"Choose key\"\n loading={false}\n onChange={(_event, value): void => {\n onSelectedTagChange((value as string) ?? '');\n }}\n />\n </Box>\n )}\n </Box>\n </div>\n\n {/* Overhead cost */}\n <div className={classes.filterSection}>\n <Box p={1}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Overhead cost\"\n options={[\n 'Distribute through cost models',\n \"Don't distribute overhead costs\",\n ]}\n value={\n overheadDistribution === 'distribute'\n ? 'Distribute through cost models'\n : \"Don't distribute overhead costs\"\n }\n placeholder=\"Overhead cost\"\n onChange={(event): void => {\n const value = event.target.value as string;\n const mappedValue =\n value === 'Distribute through cost models'\n ? 'distribute'\n : 'dont_distribute';\n onOverheadDistributionChange(mappedValue);\n }}\n />\n </Box>\n </div>\n\n {/* Time */}\n <div className={classes.filterSection}>\n <Box p={1}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Time\"\n options={['Month to date', 'Previous month']}\n value={\n timeRange === 'month-to-date'\n ? 'Month to date'\n : 'Previous month'\n }\n placeholder=\"Time\"\n onChange={(event): void => {\n const value = event.target.value as string;\n const mappedValue =\n value === 'Month to date'\n ? 'month-to-date'\n : 'previous-month';\n onTimeRangeChange(mappedValue);\n }}\n />\n </Box>\n </div>\n\n <Box marginX={2}>\n <Divider className={classes.divider} />\n </Box>\n\n {/* Filter table by */}\n <div className={classes.filterSection}>\n <div\n style={{\n backgroundColor: filterTableBackgroundColor,\n padding: 16,\n borderRadius: 8,\n }}\n >\n <div style={{ fontWeight: 'bold', marginBottom: '8px' }}>\n Filter table by\n </div>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"\"\n options={['project', 'cluster', 'node', 'tag']}\n value={filterBy}\n placeholder=\"\"\n onChange={(event): void => {\n const newFilterBy = event.target.value as string;\n onFilterByChange(newFilterBy);\n onFilterValueChange('');\n // Clear tag-related selections when filterBy changes away from 'tag'\n if (newFilterBy !== 'tag') {\n onSelectedTagKeyChange('');\n onSelectedTagValueChange('');\n }\n }}\n />\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"\"\n options={['includes', 'excludes', 'exact']}\n value={filterOperation}\n placeholder=\"\"\n onChange={(event): void => {\n onFilterOperationChange(event.target.value as string);\n }}\n />\n\n {filterBy === 'tag' ? (\n <>\n <AutocompleteComponent\n label=\"\"\n options={getFilterValueOptions}\n value={selectedTagKey}\n placeholder=\"Select tag key\"\n loading={false}\n onInputChange={handleInputChange}\n onChange={(_event, value): void => {\n const tagKey = (value as string) ?? '';\n onSelectedTagKeyChange(tagKey);\n // Clear tag value when tag key changes\n onSelectedTagValueChange('');\n // Clear search input when a value is selected\n setSearchInput('');\n setDebouncedSearch('');\n }}\n />\n {selectedTagKey && (\n <Box style={{ marginTop: '-8px' }}>\n <AutocompleteComponent\n label=\"\"\n options={tagValuesData || []}\n value={selectedTagValue}\n placeholder=\"Select tag value\"\n loading={isLoadingTagValues}\n onChange={(_event, value): void => {\n onSelectedTagValueChange((value as string) ?? '');\n }}\n />\n </Box>\n )}\n </>\n ) : (\n <AutocompleteComponent\n label=\"\"\n options={getFilterValueOptions}\n value={filterValue}\n placeholder={`Filter by ${filterBy || 'project'}`}\n loading={isLoadingOptions}\n onInputChange={handleInputChange}\n onChange={(_event, value): void => {\n onFilterValueChange((value as string) ?? '');\n // Clear search input when a value is selected\n setSearchInput('');\n setDebouncedSearch('');\n }}\n />\n )}\n </div>\n </div>\n\n <Box marginX={2}>\n <Divider className={classes.divider} />\n </Box>\n\n {/* Currency */}\n <div className={classes.filterSection}>\n <Box p={2}>\n <SelectComponent\n freeSolo\n selectOnFocus\n clearOnBlur\n handleHomeEndKeys\n filterSelectedOptions\n label=\"Currency\"\n options={currencyOptions.map(\n (value: CurrencyOption) => value.label,\n )}\n value={\n currencyOptions.find(\n (item: CurrencyOption) => item.value === currency,\n )?.label ?? ''\n }\n placeholder=\"Select currency\"\n onChange={(event): void => {\n const selectedLabel = event.target.value as string;\n const selectedCurrency =\n currencyOptions.find(\n (item: CurrencyOption) => item.label === selectedLabel,\n )?.value ?? '';\n onCurrencyChange(selectedCurrency);\n }}\n />\n </Box>\n </div>\n </Box>\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader.esm.js","sources":["../../../../src/pages/openshift/components/PageHeader.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 */\n\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport { CURRENCY_SYMBOLS } from '../../../constants/currencies';\n\nconst formatCurrency = (value: number, currencyCode: string): string => {\n const symbol = CURRENCY_SYMBOLS[currencyCode] || currencyCode;\n return `${symbol}${value.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`;\n};\n\ntype PageHeaderProps = {\n totalCost: number;\n month: string;\n endDate: string;\n currencyCode: string;\n customStyle?: React.CSSProperties;\n};\n\n/** @public */\nexport function PageHeader(props: PageHeaderProps) {\n const { totalCost, month, endDate, currencyCode, customStyle = {} } = props;\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '24px',\n ...customStyle,\n }}\n >\n <Typography variant=\"h1\" style={{ fontWeight: 'bold', margin: 0 }}>\n OpenShift\n </Typography>\n <div style={{ textAlign: 'right' }}>\n <Typography variant=\"h3\" style={{ fontWeight: 'bold', margin: 0 }}>\n {formatCurrency(totalCost, currencyCode)}\n </Typography>\n <Typography variant=\"body1\" style={{ color: '#666', marginTop: '4px' }}>\n {`${month} 1-${endDate}`}\n </Typography>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAoBA,MAAM,cAAA,GAAiB,CAAC,KAAA,EAAe,
|
|
1
|
+
{"version":3,"file":"PageHeader.esm.js","sources":["../../../../src/pages/openshift/components/PageHeader.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 */\n\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport { CURRENCY_SYMBOLS } from '../../../constants/currencies';\n\nconst formatCurrency = (value: number, currencyCode: string): string => {\n const symbol = CURRENCY_SYMBOLS[currencyCode] || currencyCode;\n return `${symbol}${value.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`;\n};\n\ntype PageHeaderProps = {\n totalCost: number;\n month: string;\n endDate: string;\n currencyCode: string;\n customStyle?: React.CSSProperties;\n};\n\n/** @public */\nexport function PageHeader(props: PageHeaderProps) {\n const { totalCost, month, endDate, currencyCode, customStyle = {} } = props;\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '24px',\n ...customStyle,\n }}\n >\n <Typography variant=\"h1\" style={{ fontWeight: 'bold', margin: 0 }}>\n OpenShift\n </Typography>\n <div style={{ textAlign: 'right' }}>\n <Typography variant=\"h3\" style={{ fontWeight: 'bold', margin: 0 }}>\n {formatCurrency(totalCost, currencyCode)}\n </Typography>\n <Typography variant=\"body1\" style={{ color: '#666', marginTop: '4px' }}>\n {`${month} 1-${endDate}`}\n </Typography>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAoBA,MAAM,cAAA,GAAiB,CAAC,KAAA,EAAe,YAAA,KAAiC;AACtE,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,YAAY,CAAA,IAAK,YAAA;AACjD,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,KAAA,CAAM,eAAe,OAAA,EAAS;AAAA,IAC/C,qBAAA,EAAuB,CAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GACxB,CAAC,CAAA,CAAA;AACJ,CAAA;AAWO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,cAAc,WAAA,GAAc,IAAG,GAAI,KAAA;AACtE,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,cAAA,EAAgB,eAAA;AAAA,QAChB,UAAA,EAAY,QAAA;AAAA,QACZ,YAAA,EAAc,MAAA;AAAA,QACd,GAAG;AAAA;AACL,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAE,EAAA,EAAG,WAEnE,CAAA;AAAA,wCACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,SAAQ,EAAA,kBAC/B,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,MAAK,KAAA,EAAO,EAAE,YAAY,MAAA,EAAQ,MAAA,EAAQ,GAAE,EAAA,EAC7D,cAAA,CAAe,SAAA,EAAW,YAAY,CACzC,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,OAAM,EAAA,EAClE,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,OAAO,EACxB,CACF;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectComponent.esm.js","sources":["../../../../src/pages/openshift/components/SelectComponent.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 */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { useThemeBackgroundColor } from '../../../hooks/useThemeBackgroundColor';\n\nconst useSelectStyles = makeStyles(\n {\n root: { paddingTop: 0, paddingBottom: 0 },\n label: { textTransform: 'none', fontWeight: 'bold' },\n formControl: {\n width: '100%',\n marginTop: 5,\n backgroundColor: 'transparent',\n },\n },\n {\n name: 'Select',\n },\n);\n\ntype SelectProps = {\n label: string;\n options: string[];\n value?: string;\n onChange?: (event: React.ChangeEvent<{ value: unknown }>) => void;\n multiple?: boolean;\n freeSolo?: boolean;\n selectOnFocus?: boolean;\n clearOnBlur?: boolean;\n handleHomeEndKeys?: boolean;\n filterSelectedOptions?: boolean;\n placeholder?: string;\n};\n\n/** @public */\nexport function SelectComponent(props: SelectProps) {\n const classes = useSelectStyles();\n const { backgroundColor } = useThemeBackgroundColor();\n const {\n label,\n options,\n value,\n onChange,\n multiple = false,\n placeholder,\n } = props;\n\n return (\n <Box className={classes.root} pb={1} pt={1}>\n <Typography className={classes.label} variant=\"button\" component=\"label\">\n {label}\n </Typography>\n <FormControl\n className={classes.formControl}\n variant=\"outlined\"\n hiddenLabel\n style={{ backgroundColor }}\n >\n <Select\n displayEmpty\n value={value || ''}\n onChange={onChange}\n multiple={multiple}\n IconComponent={ExpandMoreIcon}\n renderValue={(selected): React.ReactNode => {\n if (\n !selected ||\n (Array.isArray(selected) && selected.length === 0)\n ) {\n return (\n <Typography style={{ color: '#999' }}>\n {placeholder || 'Select an option'}\n </Typography>\n );\n }\n if (Array.isArray(selected)) {\n return selected.join(', ');\n }\n return selected as React.ReactNode;\n }}\n >\n {options.map(option => (\n <MenuItem key={option} value={option}>\n {option}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AA0BA,MAAM,
|
|
1
|
+
{"version":3,"file":"SelectComponent.esm.js","sources":["../../../../src/pages/openshift/components/SelectComponent.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 */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport FormControl from '@material-ui/core/FormControl';\nimport Select from '@material-ui/core/Select';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { useThemeBackgroundColor } from '../../../hooks/useThemeBackgroundColor';\n\nconst useSelectStyles = makeStyles(\n {\n root: { paddingTop: 0, paddingBottom: 0 },\n label: { textTransform: 'none', fontWeight: 'bold' },\n formControl: {\n width: '100%',\n marginTop: 5,\n backgroundColor: 'transparent',\n },\n },\n {\n name: 'Select',\n },\n);\n\ntype SelectProps = {\n label: string;\n options: string[];\n value?: string;\n onChange?: (event: React.ChangeEvent<{ value: unknown }>) => void;\n multiple?: boolean;\n freeSolo?: boolean;\n selectOnFocus?: boolean;\n clearOnBlur?: boolean;\n handleHomeEndKeys?: boolean;\n filterSelectedOptions?: boolean;\n placeholder?: string;\n};\n\n/** @public */\nexport function SelectComponent(props: SelectProps) {\n const classes = useSelectStyles();\n const { backgroundColor } = useThemeBackgroundColor();\n const {\n label,\n options,\n value,\n onChange,\n multiple = false,\n placeholder,\n } = props;\n\n return (\n <Box className={classes.root} pb={1} pt={1}>\n <Typography className={classes.label} variant=\"button\" component=\"label\">\n {label}\n </Typography>\n <FormControl\n className={classes.formControl}\n variant=\"outlined\"\n hiddenLabel\n style={{ backgroundColor }}\n >\n <Select\n displayEmpty\n value={value || ''}\n onChange={onChange}\n multiple={multiple}\n IconComponent={ExpandMoreIcon}\n renderValue={(selected): React.ReactNode => {\n if (\n !selected ||\n (Array.isArray(selected) && selected.length === 0)\n ) {\n return (\n <Typography style={{ color: '#999' }}>\n {placeholder || 'Select an option'}\n </Typography>\n );\n }\n if (Array.isArray(selected)) {\n return selected.join(', ');\n }\n return selected as React.ReactNode;\n }}\n >\n {options.map(option => (\n <MenuItem key={option} value={option}>\n {option}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AA0BA,MAAM,eAAA,GAAkB,UAAA;AAAA,EACtB;AAAA,IACE,IAAA,EAAM,EAAE,UAAA,EAAY,CAAA,EAAG,eAAe,CAAA,EAAE;AAAA,IACxC,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAQ,YAAY,MAAA,EAAO;AAAA,IACnD,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,CAAA;AAAA,MACX,eAAA,EAAiB;AAAA;AACnB,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM;AAAA;AAEV,CAAA;AAiBO,SAAS,gBAAgB,KAAA,EAAoB;AAClD,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,uBAAA,EAAwB;AACpD,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,2CACG,GAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,IAAA,EAAM,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAA,sCACtC,UAAA,EAAA,EAAW,SAAA,EAAW,QAAQ,KAAA,EAAO,OAAA,EAAQ,UAAS,SAAA,EAAU,OAAA,EAAA,EAC9D,KACH,CAAA,kBACA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,WAAW,OAAA,CAAQ,WAAA;AAAA,MACnB,OAAA,EAAQ,UAAA;AAAA,MACR,WAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO,EAAE,eAAA;AAAgB,KAAA;AAAA,oBAEzB,KAAA,CAAA,aAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAY,IAAA;AAAA,QACZ,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA,EAAe,cAAA;AAAA,QACf,WAAA,EAAa,CAAC,QAAA,KAA8B;AAC1C,UAAA,IACE,CAAC,YACA,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,WAAW,CAAA,EAChD;AACA,YAAA,uBACE,KAAA,CAAA,aAAA,CAAC,cAAW,KAAA,EAAO,EAAE,OAAO,MAAA,EAAO,EAAA,EAChC,eAAe,kBAClB,CAAA;AAAA,UAEJ;AACA,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,YAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,UAC3B;AACA,UAAA,OAAO,QAAA;AAAA,QACT;AAAA,OAAA;AAAA,MAEC,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,qBACX,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,KAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAA,EAC3B,MACH,CACD;AAAA;AACH,GAEJ,CAAA;AAEJ;;;;"}
|