Skip to content

Commit 6b4696e

Browse files
authored
fix: keep primary grid field visible (baserow#5289)
1 parent f16ff4b commit 6b4696e

5 files changed

Lines changed: 84 additions & 15 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "bug",
3+
"message": "Fixed a bug where changing the primary field to a hidden field could keep it hidden in the grid view.",
4+
"issue_origin": "github",
5+
"issue_number": 5288,
6+
"domain": "database",
7+
"bullet_points": [],
8+
"created_at": "2026-04-30"
9+
}

web-frontend/modules/database/components/view/grid/GridView.vue

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -455,11 +455,8 @@ import GridViewFreezeHandle from '@baserow/modules/database/components/view/grid
455455
import GridViewRowDragging from '@baserow/modules/database/components/view/grid/GridViewRowDragging'
456456
import RowEditModal from '@baserow/modules/database/components/row/RowEditModal'
457457
import gridViewHelpers from '@baserow/modules/database/mixins/gridViewHelpers'
458-
import {
459-
filterHiddenFieldsFunction,
460-
filterVisibleFieldsFunction,
461-
sortFieldsByOrderAndIdFunction,
462-
} from '@baserow/modules/database/utils/view'
458+
import { sortFieldsByOrderAndIdFunction } from '@baserow/modules/database/utils/view'
459+
import { filterGridViewVisibleFieldsFunction } from '@baserow/modules/database/components/view/grid/utils'
463460
import viewHelpers from '@baserow/modules/database/mixins/viewHelpers'
464461
import { isElement } from '@baserow/modules/core/utils/dom'
465462
import viewDecoration from '@baserow/modules/database/mixins/viewDecoration'
@@ -548,16 +545,17 @@ export default {
548545
rightVisibleFields() {
549546
const fieldOptions = this.fieldOptions
550547
return this.rightFields
551-
.filter(filterVisibleFieldsFunction(fieldOptions))
548+
.filter(filterGridViewVisibleFieldsFunction(fieldOptions))
552549
.sort(sortFieldsByOrderAndIdFunction(fieldOptions, true))
553550
},
554551
/**
555552
* Returns only the hidden fields in the correct order.
556553
*/
557554
hiddenFields() {
558555
const fieldOptions = this.fieldOptions
556+
const isFieldVisible = filterGridViewVisibleFieldsFunction(fieldOptions)
559557
return this.rightFields
560-
.filter(filterHiddenFieldsFunction(fieldOptions))
558+
.filter((field) => !isFieldVisible(field))
561559
.sort(sortFieldsByOrderAndIdFunction(fieldOptions))
562560
},
563561
viewHasGroupBys() {
@@ -585,7 +583,8 @@ export default {
585583
},
586584
/**
587585
* Returns the fields that should be displayed in the frozen left section.
588-
* Takes the first N *visible* fields in sort order (primary always first).
586+
* Takes the first N fields visible in the grid in sort order. The primary
587+
* field is always included, even if its field options mark it as hidden.
589588
*/
590589
leftFields() {
591590
if (!this.hasFrozenColumns) {
@@ -594,7 +593,7 @@ export default {
594593
const fieldOptions = this.fieldOptions
595594
const sorted = this.fields
596595
.slice()
597-
.filter(filterVisibleFieldsFunction(fieldOptions))
596+
.filter(filterGridViewVisibleFieldsFunction(fieldOptions))
598597
.sort(sortFieldsByOrderAndIdFunction(fieldOptions, true))
599598
return sorted.slice(0, this.frozenColumnCount)
600599
},
@@ -1790,7 +1789,7 @@ export default {
17901789
const fieldOptions = this.fieldOptions
17911790
const sorted = this.fields
17921791
.slice()
1793-
.filter(filterVisibleFieldsFunction(fieldOptions))
1792+
.filter(filterGridViewVisibleFieldsFunction(fieldOptions))
17941793
.sort(sortFieldsByOrderAndIdFunction(fieldOptions, true))
17951794
const frozenWidth = sorted
17961795
.slice(0, this.frozenColumnCount)

web-frontend/modules/database/components/view/grid/GridViewFreezeHandle.vue

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@
3232

3333
<script>
3434
import { notifyIf } from '@baserow/modules/core/utils/error'
35-
import {
36-
filterVisibleFieldsFunction,
37-
sortFieldsByOrderAndIdFunction,
38-
} from '@baserow/modules/database/utils/view'
35+
import { sortFieldsByOrderAndIdFunction } from '@baserow/modules/database/utils/view'
36+
import { filterGridViewVisibleFieldsFunction } from '@baserow/modules/database/components/view/grid/utils'
3937
4038
const MAX_FROZEN_COLUMNS = 4
4139
const HANDLE_PADDING = 20
@@ -104,7 +102,7 @@ export default {
104102
sortedFields() {
105103
return this.fields
106104
.slice()
107-
.filter(filterVisibleFieldsFunction(this.fieldOptions))
105+
.filter(filterGridViewVisibleFieldsFunction(this.fieldOptions))
108106
.sort(sortFieldsByOrderAndIdFunction(this.fieldOptions, true))
109107
},
110108
maxFrozenColumns() {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { filterVisibleFieldsFunction } from '@baserow/modules/database/utils/view'
2+
3+
/**
4+
* In the grid view, the primary field is always rendered even when its field
5+
* options mark it as hidden.
6+
*/
7+
export function filterGridViewVisibleFieldsFunction(fieldOptions) {
8+
const isFieldVisible = filterVisibleFieldsFunction(fieldOptions)
9+
return (field) => field.primary || isFieldVisible(field)
10+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import GridView from '@baserow/modules/database/components/view/grid/GridView'
2+
import GridViewFreezeHandle from '@baserow/modules/database/components/view/grid/GridViewFreezeHandle'
3+
4+
describe('GridView component', () => {
5+
const fields = [
6+
{ id: 1, name: 'Primary', primary: true },
7+
{ id: 2, name: 'Hidden', primary: false },
8+
{ id: 3, name: 'Visible', primary: false },
9+
]
10+
const fieldOptions = {
11+
1: { order: 0, hidden: true },
12+
2: { order: 1, hidden: true },
13+
3: { order: 2, hidden: false },
14+
}
15+
16+
test('leftFields includes the primary field when it is hidden', () => {
17+
const leftFields = GridView.computed.leftFields.call({
18+
fields,
19+
fieldOptions,
20+
frozenColumnCount: 2,
21+
hasFrozenColumns: true,
22+
})
23+
24+
expect(leftFields.map((field) => field.id)).toEqual([1, 3])
25+
})
26+
27+
test('rightVisibleFields includes the primary field when frozen columns are disabled', () => {
28+
const rightVisibleFields = GridView.computed.rightVisibleFields.call({
29+
rightFields: fields,
30+
fieldOptions,
31+
})
32+
33+
expect(rightVisibleFields.map((field) => field.id)).toEqual([1, 3])
34+
})
35+
36+
test('hiddenFields excludes the primary field when it is hidden', () => {
37+
const hiddenFields = GridView.computed.hiddenFields.call({
38+
rightFields: fields,
39+
fieldOptions,
40+
})
41+
42+
expect(hiddenFields.map((field) => field.id)).toEqual([2])
43+
})
44+
45+
test('freeze handle sortedFields includes the primary field when it is hidden', () => {
46+
const sortedFields = GridViewFreezeHandle.computed.sortedFields.call({
47+
fields,
48+
fieldOptions,
49+
})
50+
51+
expect(sortedFields.map((field) => field.id)).toEqual([1, 3])
52+
})
53+
})

0 commit comments

Comments
 (0)