From c0d7493c3f0c1af7b5294e045f5688f914d930b5 Mon Sep 17 00:00:00 2001 From: Ray Chan Date: Sat, 29 Oct 2022 02:47:09 +0800 Subject: [PATCH] Fix truncation of compact wakatime progress bar when langs_count is set (#2228) * refactor: use default value for languages * fix: truncated compact progress bar * test: add test for truncated compact progress bar with langs_count set --- src/cards/wakatime-card.js | 18 +- .../renderWakatimeCard.test.js.snap | 164 +++++++++++++++++- tests/renderWakatimeCard.test.js | 9 + 3 files changed, 180 insertions(+), 11 deletions(-) diff --git a/src/cards/wakatime-card.js b/src/cards/wakatime-card.js index 8b042fd..e7af1df 100644 --- a/src/cards/wakatime-card.js +++ b/src/cards/wakatime-card.js @@ -159,7 +159,7 @@ const recalculatePercentages = (languages) => { * @returns {string} WakaTime card SVG. */ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { - let { languages } = stats; + let { languages = [] } = stats; const { hide_title = false, hide_border = false, @@ -174,20 +174,24 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { custom_title, locale, layout, - langs_count = languages ? languages.length : 0, + langs_count = languages.length, border_radius, border_color, } = options; const shouldHideLangs = Array.isArray(hide) && hide.length > 0; - if (shouldHideLangs && languages !== undefined) { + if (shouldHideLangs) { const languagesToHide = new Set(hide.map((lang) => lowercaseTrim(lang))); languages = languages.filter( (lang) => !languagesToHide.has(lowercaseTrim(lang.name)), ); - recalculatePercentages(languages); } + // Since the percentages are sorted in descending order, we can just + // slice from the beginning without sorting. + languages = languages.slice(0, langs_count); + recalculatePercentages(languages); + const i18n = new I18n({ locale, translations: wakatimeCardLocales, @@ -209,10 +213,8 @@ const renderWakatimeCard = (stats = {}, options = { hide: [] }) => { }); const filteredLanguages = languages - ? languages - .filter((language) => language.hours || language.minutes) - .slice(0, langsCount) - : []; + .filter((language) => language.hours || language.minutes) + .slice(0, langsCount); // Calculate the card height depending on how many items there are // but if rank circle is visible clamp the minimum height to `150` diff --git a/tests/__snapshots__/renderWakatimeCard.test.js.snap b/tests/__snapshots__/renderWakatimeCard.test.js.snap index dd9ffd3..416ead9 100644 --- a/tests/__snapshots__/renderWakatimeCard.test.js.snap +++ b/tests/__snapshots__/renderWakatimeCard.test.js.snap @@ -122,7 +122,7 @@ exports[`Test Render Wakatime Card should render correctly with compact layout 1 data-testid="lang-progress" x="0" y="0" - width="6.6495" + width="415.61699999999996" height="8" fill="#858585" /> @@ -130,9 +130,167 @@ exports[`Test Render Wakatime Card should render correctly with compact layout 1 + + + + + + Other - 19 mins + + + + + + + TypeScript - 1 min + + + + + + + + + " +`; + +exports[`Test Render Wakatime Card should render correctly with compact layout when langs_count is set 1`] = ` +" + + + + + + + + + + + + + Wakatime Stats + + + + + + + + + + + + + + + diff --git a/tests/renderWakatimeCard.test.js b/tests/renderWakatimeCard.test.js index 098e9f7..67969be 100644 --- a/tests/renderWakatimeCard.test.js +++ b/tests/renderWakatimeCard.test.js @@ -16,6 +16,15 @@ describe("Test Render Wakatime Card", () => { expect(card).toMatchSnapshot(); }); + it("should render correctly with compact layout when langs_count is set", () => { + const card = renderWakatimeCard(wakaTimeData.data, { + layout: "compact", + langs_count: 2, + }); + + expect(card).toMatchSnapshot(); + }); + it("should hide languages when hide is passed", () => { document.body.innerHTML = renderWakatimeCard(wakaTimeData.data, { hide: ["YAML", "Other"],