diff --git a/src/Routes/SidebarRight/CpuBarChartMonitors.jsx b/src/Routes/SidebarRight/CpuBarChartMonitors.jsx index 58afeb2e8..65a4c72a7 100644 --- a/src/Routes/SidebarRight/CpuBarChartMonitors.jsx +++ b/src/Routes/SidebarRight/CpuBarChartMonitors.jsx @@ -2,19 +2,14 @@ import React from 'react'; import styled from 'styled-components'; import BarChartMonitors from './BarChartMonitors.react'; - - const ContainerCPU = styled.div` - height: 100vh; - - + height: 100vh; `; -const CpuBarChartMonitors = ({metric}) => ( - - - - +const CpuBarChartMonitors = ({ metric }) => ( + + + ); export default CpuBarChartMonitors; diff --git a/src/Routes/SidebarRight/MemoryAndStorage/Storage.jsx b/src/Routes/SidebarRight/MemoryAndStorage/Storage.jsx index c203efcb6..169bdcbd7 100644 --- a/src/Routes/SidebarRight/MemoryAndStorage/Storage.jsx +++ b/src/Routes/SidebarRight/MemoryAndStorage/Storage.jsx @@ -72,51 +72,50 @@ const Storage = ({ storage }) => { const data = adaptedData({ free, used, freeH, usedH }); return ( - - - - - - - - - - Total Capacity - {sizeH} - + + + + + + + + + Total Capacity + {sizeH} + - - Free - - {freeH} ({freeP}%) - - + + Free + + {freeH} ({freeP}%) + + - - Used - - {usedH} ({(usedP * 100).toFixed(2)}%) - - - - - + + Used + + {usedH} ({(usedP * 100).toFixed(2)}%) + + + + + ); }; diff --git a/src/Routes/SidebarRight/MemoryAndStorage/index.jsx b/src/Routes/SidebarRight/MemoryAndStorage/index.jsx index 947dceeab..e5be55ce8 100644 --- a/src/Routes/SidebarRight/MemoryAndStorage/index.jsx +++ b/src/Routes/SidebarRight/MemoryAndStorage/index.jsx @@ -11,9 +11,7 @@ const Root = styled.div` height: 100%; `; -const Memory = styled.div` - -`; +const Memory = styled.div``; const MemoryAndStorage = () => { const { data, legend } = useMetric('mem'); @@ -33,7 +31,7 @@ const MemoryAndStorage = () => { image={Empty.PRESENTED_IMAGE_SIMPLE} /> )} - + {storage.size ? ( ) : ( diff --git a/src/Routes/SidebarRight/MemoryAndStorage/styles.js b/src/Routes/SidebarRight/MemoryAndStorage/styles.js index ee624b96f..d71224632 100644 --- a/src/Routes/SidebarRight/MemoryAndStorage/styles.js +++ b/src/Routes/SidebarRight/MemoryAndStorage/styles.js @@ -9,7 +9,6 @@ export const Metrics = styled.div` display: flex; overflow: hidden; align-items: center; - `; export const MetricContainer = styled.div` @@ -27,8 +26,7 @@ export const Header = styled.h2` text-transform: capitalize; margin-bottom: 1em; border-bottom: 1px solid #ddd; - margin-block-start:auto; - + margin-block-start: auto; `; export const MetricHeader = styled.div` diff --git a/src/Routes/Tables/Algorithms/columns.jsx b/src/Routes/Tables/Algorithms/columns.jsx index 897b3e1dd..424966872 100644 --- a/src/Routes/Tables/Algorithms/columns.jsx +++ b/src/Routes/Tables/Algorithms/columns.jsx @@ -14,6 +14,7 @@ import AlgorithmBuildStats from './AlgorithmBuildStats.react'; import LastModified from './LastModified'; const HotWorkers = ({ value }) => {value}; + const Cpu = ({ value }) => value ? ( {value} @@ -81,6 +82,67 @@ const Name = ({ value, data }) => ); +const numericComparator = (a, b) => { + if (!a && !b) return 0; + if (!a) return 1; + if (!b) return -1; + return Number(a) - Number(b); +}; + +/** + * Comparator for memory values with unit parsing (Mi, Gi, Ki, Ti) + * Converts all values to bytes for accurate comparison + * Null/undefined values are sorted to the end + */ +const memoryComparator = (a, b) => { + if (!a && !b) return 0; + if (!a) return 1; + if (!b) return -1; + + const parseMemory = mem => { + if (!mem) return 0; + const str = String(mem).trim(); + const num = parseFloat(str); + + if (str.includes('Gi') || str.includes('G')) { + return num * 1024 * 1024 * 1024; + } else if (str.includes('Mi') || str.includes('M')) { + return num * 1024 * 1024; + } else if (str.includes('Ki') || str.includes('K')) { + return num * 1024; + } else if (str.includes('Ti') || str.includes('T')) { + return num * 1024 * 1024 * 1024 * 1024; + } + return num; + }; + + return parseMemory(a) - parseMemory(b); +}; +/** + * Comparator for build stats sorting + * DESC: Prioritizes failed builds (highest count first) + * ASC: Prioritizes completed builds (highest count first) + */ +const buildStatsComparator = (a, b, isDescending) => { + // Handle null/undefined cases + if (!a && !b) return 0; + if (!a) return 1; + if (!b) return -1; + + const aTotal = a.total || 0; + const bTotal = b.total || 0; + + // Handle no builds cases + if (aTotal === 0 && bTotal === 0) return 0; + if (aTotal === 0) return 1; + if (bTotal === 0) return -1; + + const aCount = isDescending ? a.failed || 0 : a.completed || 0; + const bCount = isDescending ? b.failed || 0 : b.completed || 0; + + return bCount - aCount; +}; + export default [ { headerName: '', @@ -98,7 +160,7 @@ export default [ flex: 2, sortable: true, unSortIcon: true, - comparator: (a, b) => sorter(a, b), + comparator: sorter, cellRenderer: Name, isPinning: true, }, @@ -107,31 +169,43 @@ export default [ field: 'algorithmImage', flex: 3, sortable: true, - comparator: (a, b) => sorter(a, b), + comparator: sorter, cellRenderer: Image, }, { headerName: 'Builds Stats', flex: 0.7, + sortable: true, + unSortIcon: true, field: 'buildStats', + comparator: buildStatsComparator, cellRenderer: ({ value }) => , }, { headerName: 'CPU', - flex: 0.5, + flex: 0.6, field: 'cpu', + sortable: true, + unSortIcon: true, + comparator: numericComparator, cellRenderer: Cpu, }, { headerName: 'GPU', - flex: 0.5, + flex: 0.6, field: 'gpu', + sortable: true, + unSortIcon: true, + comparator: numericComparator, cellRenderer: Gpu, }, { headerName: 'Mem', flex: 0.7, field: 'mem', + sortable: true, + unSortIcon: true, + comparator: memoryComparator, cellRenderer: Memory, }, { @@ -140,7 +214,7 @@ export default [ field: 'minHotWorkers', sortable: true, unSortIcon: true, - comparator: (a, b) => sorter(a, b), + comparator: sorter, cellRenderer: HotWorkers, }, { @@ -149,7 +223,7 @@ export default [ field: 'modified', sortable: true, unSortIcon: true, - comparator: (a, b) => sorter(a, b), + comparator: sorter, cellRenderer: ({ data }) => ( ), diff --git a/src/Routes/Tables/Jobs/JobProgress.jsx b/src/Routes/Tables/Jobs/JobProgress.jsx index 88e8adf56..fa353f575 100644 --- a/src/Routes/Tables/Jobs/JobProgress.jsx +++ b/src/Routes/Tables/Jobs/JobProgress.jsx @@ -40,4 +40,4 @@ JobProgress.propTypes = { /* eslint-enable */ }; -export default JobProgress +export default JobProgress; diff --git a/src/Routes/Tables/Jobs/useJobsFunctionsLimit.js b/src/Routes/Tables/Jobs/useJobsFunctionsLimit.js index 45011a668..576be950c 100644 --- a/src/Routes/Tables/Jobs/useJobsFunctionsLimit.js +++ b/src/Routes/Tables/Jobs/useJobsFunctionsLimit.js @@ -231,7 +231,7 @@ const useJobsFunctionsLimit = () => { useEffect(() => { if (queryAllJobs?.data) { const dsAllJobs = queryAllJobs.data.jobsAggregated.jobs; - setDataSource(dsAllJobs); + setDataSource(dsAllJobs); // Update external ID visibility state const hasExtId = dsAllJobs.some(x => x.externalId != null); @@ -244,17 +244,18 @@ const useJobsFunctionsLimit = () => { } }, [queryAllJobs.data, changeDs]); + const handleBodyScroll = useCallback( + params => { + const lastRow = params.api.getLastDisplayedRowIndex(); + const totalRows = params.api.getDisplayedRowCount(); - -const handleBodyScroll = useCallback((params) => { - const lastRow = params.api.getLastDisplayedRowIndex(); - const totalRows = params.api.getDisplayedRowCount(); - - if (isGetMore && lastRow >= totalRows - 1 && !queryAllJobs.loading) { - setIsGetMore(false); - onFetchMore(); - } -}, [isGetMore, queryAllJobs.loading]); + if (isGetMore && lastRow >= totalRows - 1 && !queryAllJobs.loading) { + setIsGetMore(false); + onFetchMore(); + } + }, + [isGetMore, queryAllJobs.loading] + ); useEffect(() => { if (firstUpdate.current) { @@ -275,10 +276,10 @@ const handleBodyScroll = useCallback((params) => { }, []); useEffect(() => { - if (!firstUpdate.current) { - queryAllJobs.refetch().then(() => setIsGetMore(true)); - } -}, [limitGetJobs]); + if (!firstUpdate.current) { + queryAllJobs.refetch().then(() => setIsGetMore(true)); + } + }, [limitGetJobs]); /** * Memoized column definitions with stable references @@ -317,7 +318,7 @@ const handleBodyScroll = useCallback((params) => { columns: jobColumnsMemo, _dataSource, setLimitGetJobs, - handleBodyScroll + handleBodyScroll, }; }; diff --git a/src/Routes/Tables/Pipelines/pipelineColumns.jsx b/src/Routes/Tables/Pipelines/pipelineColumns.jsx index 220344e4a..be84be536 100644 --- a/src/Routes/Tables/Pipelines/pipelineColumns.jsx +++ b/src/Routes/Tables/Pipelines/pipelineColumns.jsx @@ -8,10 +8,6 @@ import PipelineCron from './PipelineCron.react'; import PipelineStats from './PipelineStats.react'; import LastModified from './../Algorithms/LastModified'; -/* ---------- Cell Renderers ---------- */ - -// params = { value, data, node, ... } - const AuditTrailCell = params => ; const LastModifiedCell = params => ( ; const ActionsCell = params => ; -/* ---------- Sorters ---------- */ +const cronComparator = (a, b) => { + const getEnabledStatus = trigger => { + if (!trigger) return null; + if (!trigger.cron) return null; + + return trigger.cron.enabled ?? false; + }; + + const enabledA = getEnabledStatus(a); + const enabledB = getEnabledStatus(b); -// const sortByName = (a, b) => sorter(a.name, b.name); -// const sortByLastModified = (a, b) => sorter(a.modified, b.modified); + // Handle null cases (no cron job) + if (enabledA === null && enabledB === null) return 0; + if (enabledA === null) return 1; + if (enabledB === null) return -1; + // Sort by enabled status: true (ON) comes before false (OFF) + if (enabledA !== enabledB) { + return enabledB - enabledA; + } + return 0; +}; const pipelineColumnDefs = [ { headerName: '', @@ -53,14 +66,15 @@ const pipelineColumnDefs = [ flex: 3, sortable: true, unSortIcon: true, - // comparator: sortByName, cellRenderer: PipelineNameCell, }, { headerName: 'Cron Job', field: 'triggers', flex: 1.5, - sortable: false, + sortable: true, + unSortIcon: true, + comparator: cronComparator, cellRenderer: CronCell, }, { @@ -76,7 +90,6 @@ const pipelineColumnDefs = [ flex: 1, sortable: true, unSortIcon: true, - // comparator: sortByLastModified, cellRenderer: LastModifiedCell, cellStyle: { textAlign: 'center' }, }, diff --git a/src/Routes/Tables/Workers/WorkersActions.react.jsx b/src/Routes/Tables/Workers/WorkersActions.react.jsx index 6bb6cb1aa..7872eefe8 100644 --- a/src/Routes/Tables/Workers/WorkersActions.react.jsx +++ b/src/Routes/Tables/Workers/WorkersActions.react.jsx @@ -17,7 +17,8 @@ const WorkersActions = ({ algorithm = null, stopAllWorkers = [] }) => { events.emit( 'global_alert_msg', <> -Stopping the worker, It may take a few moments for the algorithms to be deleted. + Stopping the worker, It may take a few moments for the algorithms to be + deleted. , 'success' ); diff --git a/src/Routes/Tables/Workers/columns.jsx b/src/Routes/Tables/Workers/columns.jsx index 71fddc724..4581c45c2 100644 --- a/src/Routes/Tables/Workers/columns.jsx +++ b/src/Routes/Tables/Workers/columns.jsx @@ -54,7 +54,7 @@ const JobId = jobId => { const type = !isValidJobId ? 'warning' : ''; const text = jobId || 'Not Assigned'; - return ; + return ; }; export const workersTableStats = [ diff --git a/src/components/TableVersions/getVersionsColumns.react.jsx b/src/components/TableVersions/getVersionsColumns.react.jsx index 025c9ff36..d81add449 100644 --- a/src/components/TableVersions/getVersionsColumns.react.jsx +++ b/src/components/TableVersions/getVersionsColumns.react.jsx @@ -175,7 +175,9 @@ const getVersionsColumns = ({ shape="circle" icon={} disabled={isCurrentVersion} - onClick={() => deleteConfirmAction(modal, onDelete, record, source)} + onClick={() => + deleteConfirmAction(modal, onDelete, record, source) + } /> diff --git a/src/components/common/HKGrid/HKGrid.jsx b/src/components/common/HKGrid/HKGrid.jsx index d017be039..58487daf6 100644 --- a/src/components/common/HKGrid/HKGrid.jsx +++ b/src/components/common/HKGrid/HKGrid.jsx @@ -1,4 +1,10 @@ -import React, { useRef, useState, useEffect, forwardRef, useImperativeHandle } from 'react'; +import React, { + useRef, + useState, + useEffect, + forwardRef, + useImperativeHandle, +} from 'react'; import PropTypes from 'prop-types'; import { AgGridReact } from 'ag-grid-react'; import { SettingOutlined, LoadingOutlined } from '@ant-design/icons'; @@ -26,7 +32,8 @@ const LoadingOverlay = styled.div` position: absolute; top: 0; left: 0; - background: ${props => props.theme.Styles.HKGrid.LoadingOverlay || 'rgba(255, 255, 255, 0.8)'}; + background: ${props => + props.theme.Styles.HKGrid.LoadingOverlay || 'rgba(255, 255, 255, 0.8)'}; z-index: 10; `; @@ -59,142 +66,168 @@ const StyledGridWrapper = styled.div` .ag-row:hover { background-color: rgba(0,0,0,0.02); } `} - .ag-root-wrapper { width: 100%; height: 100%; } - .ag-header-cell-center .ag-header-cell-label { justify-content: center; } - .ag-cell-value { white-space: nowrap !important; overflow: hidden !important; text-overflow: clip !important; } + .ag-root-wrapper { + width: 100%; + height: 100%; + } + .ag-header-cell-center .ag-header-cell-label { + justify-content: center; + } + .ag-cell-value { + white-space: nowrap !important; + overflow: hidden !important; + text-overflow: clip !important; + } `; -export const HKGrid = forwardRef(({ - rowData, - columnDefs, - enableRowHoverActions = false, - actionClassName, - className, - loading = false, - ...props -}, ref) => { - const gridRef = useRef(null); - const [columnsState, setColumnsState] = useState([]); - const [gridApi, setGridApi] = useState(null); - - const onGridReady = params => { - gridRef.current = params.api; - setGridApi(params.api); - - const currentColumns = params.api.getAllGridColumns()?.map(col => ({ - field: col.getColDef().field, - headerName: col.getColDef().headerName, - visible: col.isVisible(), - isPinning: col.getColDef().isPinning, - })) || []; - - setColumnsState(currentColumns); - }; - - useImperativeHandle(ref, () => ({ - refreshCells: (params = { force: true }) => { - if (gridApi) { - gridApi.refreshCells(params); - } +export const HKGrid = forwardRef( + ( + { + rowData, + columnDefs, + enableRowHoverActions = false, + actionClassName, + className, + loading = false, + ...props }, - getApi: () => gridApi, - })); - - const toggleColumn = field => { - if (!gridApi) return; - const col = gridApi.getColumn(field); - gridApi.setColumnsVisible([field], !col.visible); - setColumnsState(cols => cols.map(c => c.field === field ? { ...c, visible: !c.visible } : c)); - }; - - const resetColumns = () => { - if (!gridApi) return; - gridApi.resetColumnState(); - const resetState = gridApi.getAllGridColumns().map(col => ({ - field: col.getColDef().field, - headerName: col.getColDef().headerName, - visible: col.isVisible(), - isPinning: col.getColDef().isPinning, + ref + ) => { + const gridRef = useRef(null); + const [columnsState, setColumnsState] = useState([]); + const [gridApi, setGridApi] = useState(null); + + const onGridReady = params => { + gridRef.current = params.api; + setGridApi(params.api); + + const currentColumns = + params.api.getAllGridColumns()?.map(col => ({ + field: col.getColDef().field, + headerName: col.getColDef().headerName, + visible: col.isVisible(), + isPinning: col.getColDef().isPinning, + })) || []; + + setColumnsState(currentColumns); + }; + + useImperativeHandle(ref, () => ({ + refreshCells: (params = { force: true }) => { + if (gridApi) { + gridApi.refreshCells(params); + } + }, + getApi: () => gridApi, })); - setColumnsState(resetState); - }; - - const menu = ( - - {columnsState.map( - col => - col.headerName && ( - - e.stopPropagation()} - checked={col.visible} - onChange={() => toggleColumn(col.field)} - disabled={col.isPinning} - style={col.isPinning ? { color: '#aaa' } : {}} - > - {col.headerName} - - - ) - )} - - - - - ); - - const antIcon = ; - - // Force refresh when rowData - useEffect(() => { - if (gridApi) { - gridApi.refreshCells({ force: true }); - } - }, [rowData, gridApi]); - - return ( - <> -
- - Columns - -
- - - {loading && ( - - - - )} -
- + const toggleColumn = field => { + if (!gridApi) return; + const col = gridApi.getColumn(field); + gridApi.setColumnsVisible([field], !col.visible); + setColumnsState(cols => + cols.map(c => (c.field === field ? { ...c, visible: !c.visible } : c)) + ); + }; + + const resetColumns = () => { + if (!gridApi) return; + gridApi.resetColumnState(); + const resetState = gridApi.getAllGridColumns().map(col => ({ + field: col.getColDef().field, + headerName: col.getColDef().headerName, + visible: col.isVisible(), + isPinning: col.getColDef().isPinning, + })); + setColumnsState(resetState); + }; + + const menu = ( + + {columnsState.map( + col => + col.headerName && ( + + e.stopPropagation()} + checked={col.visible} + onChange={() => toggleColumn(col.field)} + disabled={col.isPinning} + style={col.isPinning ? { color: '#aaa' } : {}}> + {col.headerName} + + + ) + )} + + + + + ); + + const antIcon = ; + + // Force refresh when rowData + useEffect(() => { + if (gridApi) { + gridApi.refreshCells({ force: true }); + } + }, [rowData, gridApi]); + + return ( + <> +
+ + + Columns + +
- - - ); -}); + + + {loading && ( + + + + )} + +
+ +
+
+ + ); + } +); HKGrid.propTypes = { rowData: PropTypes.array.isRequired, @@ -205,4 +238,4 @@ HKGrid.propTypes = { loading: PropTypes.bool, }; -export default HKGrid; \ No newline at end of file +export default HKGrid; diff --git a/src/components/common/LogsViewer/index.jsx b/src/components/common/LogsViewer/index.jsx index 39989186c..8b64b9f5b 100644 --- a/src/components/common/LogsViewer/index.jsx +++ b/src/components/common/LogsViewer/index.jsx @@ -177,28 +177,27 @@ const LogsViewer = ({ dataSource, isBuild = false, id, emptyDescription }) => { return () => cancelAnimationFrame(raf); }, [dataSource.length, id]); -const renderRow = useCallback( - ({ index, key, parent, style }) => ( - - {({ registerChild }) => ( -
- {isBuild ? ( - - ) : ( - - )} -
- )} -
- ), - [dataSource, isBuild] -); + const renderRow = useCallback( + ({ index, key, parent, style }) => ( + + {({ registerChild }) => ( +
+ {isBuild ? ( + + ) : ( + + )} +
+ )} +
+ ), + [dataSource, isBuild] + ); const [first] = dataSource; const isValid = isBuild || (first && first.level); @@ -238,4 +237,4 @@ LogsViewer.propTypes = { emptyDescription: PropTypes.string, }; -export default LogsViewer; \ No newline at end of file +export default LogsViewer; diff --git a/src/index.jsx b/src/index.jsx index 6c31ffc88..671e1022e 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -41,7 +41,11 @@ const ConfigProviderApp = () => { if (keycloakEnable && firstKc.current && !KeycloakServices.isLoggedIn()) { firstKc.current = false; - KeycloakServices.initKeycloak(renderApp, renderErrorPreRenderApp, checkIframe); + KeycloakServices.initKeycloak( + renderApp, + renderErrorPreRenderApp, + checkIframe + ); } }, [keycloakEnable, checkIframe]); diff --git a/src/keycloak/keycloakServices.js b/src/keycloak/keycloakServices.js index 17f17c537..d239a5832 100644 --- a/src/keycloak/keycloakServices.js +++ b/src/keycloak/keycloakServices.js @@ -14,7 +14,6 @@ const KeycloakConfig = { const _kc = new Keycloak(KeycloakConfig); const initKeycloak = (appToRender, renderError, checkIframe) => { - _kc .init({ onLoad: 'login-required', diff --git a/src/styles/themes/dark/DarkTheme.js b/src/styles/themes/dark/DarkTheme.js index f38913dd6..b9347c0a3 100644 --- a/src/styles/themes/dark/DarkTheme.js +++ b/src/styles/themes/dark/DarkTheme.js @@ -90,7 +90,7 @@ const DarkTheme = COMMON_COLOR => { backgroundBarNodesColor: '#1c325c', fontNodeColor: '#00000073', }, - HKGrid: { ActionChip: '#303030' ,LoadingOverlay: 'rgba(26, 64, 99, 0.8)'}, + HKGrid: { ActionChip: '#303030', LoadingOverlay: 'rgba(26, 64, 99, 0.8)' }, }; return { diff --git a/src/styles/themes/dark/dark-mode-style.css b/src/styles/themes/dark/dark-mode-style.css index 97458df74..5409a7627 100644 --- a/src/styles/themes/dark/dark-mode-style.css +++ b/src/styles/themes/dark/dark-mode-style.css @@ -191,7 +191,7 @@ input:-internal-autofill-selected { color: #d7d7d7 !important; border-color: #385e8d !important; } -label[class*="sc-"] { +label[class*='sc-'] { color: #d7d7d7 !important; background-color: transparent !important; } @@ -208,7 +208,7 @@ label[class*="sc-"] { padding: 6px 10px !important; } /* Target tooltip container */ -div[style*="z-index: 10"][style*="pointer-events: none"][style*="background: rgb(255, 255, 255)"] { +div[style*='z-index: 10'][style*='pointer-events: none'][style*='background: rgb(255, 255, 255)'] { background: #242c48 !important; /* Match your dropdown color */ color: #ffffff !important; border: 1px solid #586a93 !important; @@ -288,7 +288,7 @@ div[style*="z-index: 10"][style*="pointer-events: none"][style*="background: rgb fill: #40a9ff !important; color: #40a9ff !important; } -.ant-menu-title-content span[class*="sc-"] { +.ant-menu-title-content span[class*='sc-'] { color: #d7d7d7 !important; } .ant-empty-description { @@ -309,7 +309,7 @@ div[style*="z-index: 10"][style*="pointer-events: none"][style*="background: rgb } /* Active tab */ -.ant-tabs-tab-btn[aria-selected="true"] { +.ant-tabs-tab-btn[aria-selected='true'] { color: #f0a25a !important; font-weight: 600 !important; } @@ -345,13 +345,13 @@ svg text { svg line { stroke: #586a93 !important; } -svg text[text-anchor="middle"] { +svg text[text-anchor='middle'] { fill: #2c3c60 !important; font-weight: bold !important; font-size: 14px !important; } -svg text[text-anchor="middle"][dominant-baseline="text-before-edge"], -svg text[text-anchor="middle"][style*="dominant-baseline: central"] { +svg text[text-anchor='middle'][dominant-baseline='text-before-edge'], +svg text[text-anchor='middle'][style*='dominant-baseline: central'] { fill: #40a9ff !important; font-weight: bold !important; font-size: 14px !important; @@ -560,4 +560,4 @@ svg { border-radius: 6px; padding: 8px 12px; } -} \ No newline at end of file +} diff --git a/src/styles/themes/light/LightTheme.js b/src/styles/themes/light/LightTheme.js index e1b955095..047095910 100644 --- a/src/styles/themes/light/LightTheme.js +++ b/src/styles/themes/light/LightTheme.js @@ -81,7 +81,10 @@ const LightTheme = COMMON_COLOR => { backgroundBarNodesColor: '#fbfbfb', fontNodeColor: '#00000073', }, - HKGrid: { ActionChip: '#e7e7e7', LoadingOverlay: 'rgba(255, 255, 255, 0.8)' }, + HKGrid: { + ActionChip: '#e7e7e7', + LoadingOverlay: 'rgba(255, 255, 255, 0.8)', + }, }; return {