Skip to content

Commit a31d07b

Browse files
obulatdhruvkb
andauthored
Fix the sources table crash (#4725)
* Fix the sources table crash Signed-off-by: Olga Bulat <obulat@gmail.com> * Update frontend/test/playwright/e2e/sources.spec.ts Co-authored-by: Dhruv Bhanushali <hi@dhruvkb.dev> * Update the unit tests Signed-off-by: Olga Bulat <obulat@gmail.com> * Update source sorting Signed-off-by: Olga Bulat <obulat@gmail.com> * Add a space between sentences Signed-off-by: Olga Bulat <obulat@gmail.com> * Snapshots Signed-off-by: Olga Bulat <obulat@gmail.com> --------- Signed-off-by: Olga Bulat <obulat@gmail.com> Co-authored-by: Dhruv Bhanushali <hi@dhruvkb.dev>
1 parent 056dc7e commit a31d07b

21 files changed

+43
-23
lines changed

frontend/src/components/VSourcesTable.vue

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
</tr>
4141
</thead>
4242
<tbody>
43-
<tr v-for="provider in sortedProviders" :key="provider.display_name">
43+
<tr v-for="provider in providers" :key="provider.display_name">
4444
<td>
4545
<VLink :href="providerViewUrl(provider)">{{
4646
provider.display_name
@@ -60,7 +60,7 @@
6060

6161
<section role="region" class="mobile-source-table md:hidden">
6262
<article
63-
v-for="provider in sortedProviders"
63+
v-for="provider in providers"
6464
:key="provider.display_name"
6565
:title="provider.display_name"
6666
>
@@ -87,7 +87,7 @@
8787
</template>
8888

8989
<script lang="ts">
90-
import { computed, defineComponent, type PropType, reactive } from "vue"
90+
import { defineComponent, type PropType, reactive, ref } from "vue"
9191
9292
import { useProviderStore } from "~/stores/provider"
9393
import { useGetLocaleFormattedNumber } from "~/composables/use-get-locale-formatted-number"
@@ -113,19 +113,32 @@ export default defineComponent({
113113
},
114114
},
115115
setup(props) {
116+
const providerStore = useProviderStore()
117+
const searchStore = useSearchStore()
118+
116119
const sorting = reactive({
117120
direction: "asc",
118121
field: "display_name" as keyof Omit<MediaProvider, "logo_url">,
119122
})
120123
124+
// The providers in store are sorted by `source_name`, here we sort them by `display_name`.
125+
const providers = ref<MediaProvider[]>(
126+
providerStore.providers[props.media].sort(compareProviders)
127+
)
128+
121129
function sortTable(field: keyof Omit<MediaProvider, "logo_url">) {
122-
let direction = "asc"
130+
let direction = field === "media_count" ? "desc" : "asc"
123131
if (field === sorting.field) {
124132
direction = sorting.direction === "asc" ? "desc" : "asc"
125133
}
126134
127135
sorting.direction = direction
128136
sorting.field = field
137+
138+
const sortedProviders = providers.value.sort(compareProviders)
139+
140+
providers.value =
141+
direction === "asc" ? sortedProviders : sortedProviders.reverse()
129142
}
130143
131144
function cleanSourceUrlForPresentation(url: string) {
@@ -138,7 +151,6 @@ export default defineComponent({
138151
}
139152
140153
const getLocaleFormattedNumber = useGetLocaleFormattedNumber()
141-
const providerStore = useProviderStore()
142154
143155
function compareProviders(prov1: MediaProvider, prov2: MediaProvider) {
144156
let field1 = prov1[sorting.field]
@@ -161,13 +173,6 @@ export default defineComponent({
161173
return 0
162174
}
163175
164-
const sortedProviders = computed<MediaProvider[]>(() => {
165-
const providers = providerStore.providers[props.media]
166-
providers.sort(compareProviders)
167-
return sorting.direction === "asc" ? providers : providers.reverse()
168-
})
169-
170-
const searchStore = useSearchStore()
171176
const providerViewUrl = (provider: MediaProvider) => {
172177
return searchStore.getCollectionPath({
173178
type: props.media,
@@ -179,7 +184,7 @@ export default defineComponent({
179184
}
180185
return {
181186
getLocaleFormattedNumber,
182-
sortedProviders,
187+
providers,
183188
sorting,
184189
sortTable,
185190
cleanSourceUrlForPresentation,

frontend/src/pages/sources.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ useHead({ title: `${t("sources.title")} | Openverse` })
4444
<VLink href="https://www.si.edu/">Smithsonian Institute</VLink>
4545
</template>
4646
</i18n-t>
47+
{{ " " }}
4748
<i18n-t
4849
scope="global"
4950
keypath="sources.ccContent.provider.b"

frontend/test/playwright/e2e/sources.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,17 @@ test("sources table has links to source pages", async ({ page }) => {
1616

1717
await expect(getH1(page, "Flickr")).toBeVisible()
1818
})
19+
20+
// Tests the fix for https://github.com/WordPress/openverse/issues/4724
21+
test("sources table can be sorted multiple times", async ({ page }) => {
22+
await preparePageForTests(page, "xl")
23+
await page.goto("/sources")
24+
25+
const totalItems = page.getByRole("cell", { name: /total items/i }).first()
26+
await totalItems.click()
27+
await totalItems.click()
28+
await totalItems.click()
29+
30+
const firstRow = page.getByRole("row", { name: "Flickr" })
31+
await expect(firstRow).toBeVisible()
32+
})

frontend/test/playwright/visual-regression/pages/pages.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ for (const contentPage of contentPages) {
3939
{
4040
fullPage: true,
4141
},
42-
{ maxDiffPixelRatio: 0.01 }
42+
{ maxDiffPixelRatio: 0.005 }
4343
)
4444
})
4545
})

frontend/test/unit/specs/components/v-sources-table.spec.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ describe("VSourcesTable", () => {
2626
providerStore.$patch({
2727
providers: {
2828
image: [
29+
{
30+
source_name: "Provider_A",
31+
display_name: "Provider A",
32+
source_url: "https://zzz.com",
33+
media_count: 3333,
34+
},
2935
{
3036
source_name: "Provider_B",
3137
display_name: "Provider B",
@@ -38,12 +44,6 @@ describe("VSourcesTable", () => {
3844
source_url: "www.xxx.com",
3945
media_count: 2222,
4046
},
41-
{
42-
source_name: "Provider_A",
43-
display_name: "Provider A",
44-
source_url: "https://zzz.com",
45-
media_count: 3333,
46-
},
4747
],
4848
},
4949
})
@@ -55,7 +55,7 @@ describe("VSourcesTable", () => {
5555
}
5656
})
5757

58-
it('should be sorted by display_name ("Source") by default', async () => {
58+
it('should use the provider store default sorting by display_name ("Source") by default', async () => {
5959
await render(VSourcesTable, options)
6060

6161
const table = getTableData(screen.getAllByRole("row"))
@@ -90,9 +90,9 @@ describe("VSourcesTable", () => {
9090
await userEvent.click(domainCell)
9191
const table = getTableData(screen.getAllByRole("row"))
9292
const expectedTable = [
93-
["Provider B", "yyy.com", "1,111"],
94-
["Provider C", "xxx.com", "2,222"],
9593
["Provider A", "zzz.com", "3,333"],
94+
["Provider C", "xxx.com", "2,222"],
95+
["Provider B", "yyy.com", "1,111"],
9696
]
9797
expect(table).toEqual(expectedTable)
9898
})

0 commit comments

Comments
 (0)