This is an automated email from the ASF dual-hosted git repository. asoare pushed a commit to branch alexandrusoare/fix/time-shift-color-matching in repository https://gitbox.apache.org/repos/asf/superset.git
commit c42fedc15363cea8ce93b3a93f47d7f2e31663f9 Author: alexandrusoare <[email protected]> AuthorDate: Fri Mar 6 16:33:51 2026 +0200 fix(timeshiftcolor): fix timeshiftcolor to match the original color for echarts --- .../src/operators/utils/timeOffset.ts | 6 +- .../test/operators/utils/timeOffset.test.ts | 70 +++++++++++++++++++++- 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/timeOffset.ts b/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/timeOffset.ts index 852b4eb1ab8..08b00947ab7 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/timeOffset.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/src/operators/utils/timeOffset.ts @@ -28,7 +28,9 @@ export const getTimeOffset = ( // offset is represented as <offset>, group by list series.name.includes(`${timeOffset},`) || // offset is represented as <metric>__<offset> - series.name.includes(`__${timeOffset}`), + series.name.includes(`__${timeOffset}`) || + // offset is represented as <metric>, <offset> + series.name.includes(`, ${timeOffset}`), ); export const hasTimeOffset = ( @@ -49,6 +51,8 @@ export const getOriginalSeries = ( result = result.replace(`${compare},`, ''); // offset is represented as <metric>__<offset> result = result.replace(`__${compare}`, ''); + // offset is represented as <metric>, <offset> + result = result.replace(`, ${compare}`, ''); }); return result.trim(); }; diff --git a/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/timeOffset.test.ts b/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/timeOffset.test.ts index bee8c5bbbd2..75abf91c334 100644 --- a/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/timeOffset.test.ts +++ b/superset-frontend/packages/superset-ui-chart-controls/test/operators/utils/timeOffset.test.ts @@ -16,15 +16,79 @@ * specific language governing permissions and limitations * under the License. */ -import { getOriginalSeries } from '@superset-ui/chart-controls'; +import { + getOriginalSeries, + getTimeOffset, + hasTimeOffset, +} from '@superset-ui/chart-controls'; -test('returns the series name when time compare is empty', () => { +test('getOriginalSeries returns the series name when time compare is empty', () => { const seriesName = 'sum'; expect(getOriginalSeries(seriesName, [])).toEqual(seriesName); }); -test('returns the original series name', () => { +test('getOriginalSeries returns the original series name with __ pattern', () => { const seriesName = 'sum__1_month_ago'; const timeCompare = ['1_month_ago']; expect(getOriginalSeries(seriesName, timeCompare)).toEqual('sum'); }); + +test('getOriginalSeries returns the original series name with <offset>, pattern', () => { + const seriesName = '1 year ago, groupby_value'; + const timeCompare = ['1 year ago']; + expect(getOriginalSeries(seriesName, timeCompare)).toEqual('groupby_value'); +}); + +test('getOriginalSeries returns the original series name with , <offset> pattern', () => { + const seriesName = 'AVG(price_each), 1 year ago'; + const timeCompare = ['1 year ago']; + expect(getOriginalSeries(seriesName, timeCompare)).toEqual('AVG(price_each)'); +}); + +test('getOriginalSeries handles multiple time compares', () => { + const seriesName = 'count, 1 year ago'; + const timeCompare = ['1 month ago', '1 year ago']; + expect(getOriginalSeries(seriesName, timeCompare)).toEqual('count'); +}); + +test('getTimeOffset returns undefined when no time offset pattern matches', () => { + const series = { name: 'count' }; + const timeCompare = ['1 year ago']; + expect(getTimeOffset(series, timeCompare)).toBeUndefined(); +}); + +test('getTimeOffset detects __ pattern', () => { + const series = { name: 'count__1 year ago' }; + const timeCompare = ['1 year ago']; + expect(getTimeOffset(series, timeCompare)).toEqual('1 year ago'); +}); + +test('getTimeOffset detects <offset>, pattern', () => { + const series = { name: '1 year ago, groupby_value' }; + const timeCompare = ['1 year ago']; + expect(getTimeOffset(series, timeCompare)).toEqual('1 year ago'); +}); + +test('getTimeOffset detects , <offset> pattern', () => { + const series = { name: 'AVG(price_each), 1 year ago' }; + const timeCompare = ['1 year ago']; + expect(getTimeOffset(series, timeCompare)).toEqual('1 year ago'); +}); + +test('hasTimeOffset returns false for original series', () => { + const series = { name: 'count' }; + const timeCompare = ['1 year ago']; + expect(hasTimeOffset(series, timeCompare)).toBe(false); +}); + +test('hasTimeOffset returns true for derived series with , <offset> pattern', () => { + const series = { name: 'AVG(price_each), 1 year ago' }; + const timeCompare = ['1 year ago']; + expect(hasTimeOffset(series, timeCompare)).toBe(true); +}); + +test('hasTimeOffset returns false when series name is not a string', () => { + const series = { name: 123 }; + const timeCompare = ['1 year ago']; + expect(hasTimeOffset(series, timeCompare)).toBe(false); +});
