1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-10 15:47:32 +00:00

Merge branch '1208-introduce-a-keyboard-shortcut-to-create-a-new-row-grid-view' into 'develop'

Resolve "Introduce a keyboard shortcut to create a new row grid view"

Closes , , and 

See merge request 
This commit is contained in:
Nigel Gott 2023-01-04 11:38:00 +00:00
commit e9d0dbbd09
9 changed files with 70 additions and 16 deletions

View file

@ -12,6 +12,10 @@ For example:
### New Features
* Add various help icons to explain RBAC in the UI [#1318](https://gitlab.com/bramw/baserow/-/issues/1318)
* Pressing shift + enter in a selected cell of the grid view creates a new row. [#1208](https://gitlab.com/bramw/baserow/-/issues/1208)
* Pressing enter on a selected cell should select the cell below. [#1329](https://gitlab.com/bramw/baserow/-/issues/1329)
* Select the primary field in the grid view after creating a new row. [#1217](https://gitlab.com/bramw/baserow/-/issues/1217)
### Bug Fixes
* Fixed encoding issue where you couldn't import xml files with non-ascii characters [#1360](https://gitlab.com/bramw/baserow/-/issues/1360)

View file

@ -38,6 +38,7 @@
@cell-mouseover="multiSelectHold"
@cell-mouseup-left="multiSelectStop"
@add-row="addRow()"
@add-row-after="addRowAfter($event)"
@update="updateValue"
@paste="multiplePasteFromCell"
@edit="editValue"
@ -93,6 +94,7 @@
@row-hover="setRowHover($event.row, $event.value)"
@row-context="showRowContext($event.event, $event.row)"
@add-row="addRow()"
@add-row-after="addRowAfter($event)"
@update="updateValue"
@paste="multiplePasteFromCell"
@edit="editValue"
@ -152,7 +154,7 @@
)
"
>
<a @click=";[addRow(selectedRow), $refs.rowContext.hide()]">
<a @click="addRowAboveSelectedRow($event, selectedRow)">
<i class="context__menu-icon fas fa-fw fa-arrow-up"></i>
{{ $t('gridView.insertRowAbove') }}
</a>
@ -167,7 +169,7 @@
)
"
>
<a @click=";[addRowAfter(selectedRow), $refs.rowContext.hide()]">
<a @click="addRowBelowSelectedRow($event, selectedRow)">
<i class="context__menu-icon fas fa-fw fa-arrow-down"></i>
{{ $t('gridView.insertRowBelow') }}
</a>
@ -182,11 +184,7 @@
)
"
>
<a
@click="
;[addRowAfter(selectedRow, selectedRow), $refs.rowContext.hide()]
"
>
<a @click="duplicateSelectedRow($event, selectedRow)">
<i class="context__menu-icon fas fa-fw fa-clone"></i>
{{ $t('gridView.duplicateRow') }}
</a>
@ -446,6 +444,21 @@ export default {
)
},
methods: {
duplicateSelectedRow(event, selectedRow) {
event.preventFieldCellUnselect = true
this.addRowAfter(selectedRow, selectedRow)
this.$refs.rowContext.hide()
},
addRowAboveSelectedRow(event, selectedRow) {
event.preventFieldCellUnselect = true
this.addRow(selectedRow)
this.$refs.rowContext.hide()
},
addRowBelowSelectedRow(event, selectedRow) {
event.preventFieldCellUnselect = true
this.addRowAfter(selectedRow)
this.$refs.rowContext.hide()
},
/**
* When a field is deleted we need to check if that field was related to any
* filters or sortings. If that is the case then the view needs to be refreshed so
@ -601,6 +614,7 @@ export default {
fields: this.fields,
values,
before,
selectPrimaryCell: true,
}
)
} catch (error) {
@ -810,6 +824,7 @@ export default {
getScrollTop = () =>
this.$store.getters[this.storePrefix + 'view/grid/getScrollTop']
}
this.$store.dispatch(
this.storePrefix + 'view/grid/removeRowSelectedBy',
{

View file

@ -6,7 +6,7 @@
<div
:key="
'row-field-cell-' +
props.row.id.toString() +
props.row._.persistentId +
'-' +
props.field.id.toString()
"
@ -68,6 +68,7 @@
@selectNext="$options.methods.selectNext(listeners, props, 'next')"
@selectAbove="$options.methods.selectNext(listeners, props, 'above')"
@selectBelow="$options.methods.selectNext(listeners, props, 'below')"
@add-row-after="$options.methods.addRowAfter(listeners, props)"
@add-keep-alive="parent.addKeepAlive(props.field.id)"
@remove-keep-alive="parent.removeKeepAlive(props.field.id)"
/>
@ -202,6 +203,14 @@ export default {
})
}
},
/**
* Emits an event that creates a row directly after this row.
*/
addRowAfter(listeners, props) {
if (listeners['add-row-after']) {
listeners['add-row-after'](props.row)
}
},
},
}
</script>

View file

@ -84,7 +84,7 @@
-->
<GridViewCell
v-for="field in fieldsToRender"
:key="'row-field-' + row.id.toString() + '-' + field.id.toString()"
:key="'row-field-' + row._.persistentId + '-' + field.id.toString()"
:group-id="groupId"
:field="field"
:row="row"
@ -107,6 +107,7 @@
@cell-mousedown-left="$emit('cell-mousedown-left', { row, field })"
@cell-mouseover="$emit('cell-mouseover', { row, field })"
@cell-mouseup-left="$emit('cell-mouseup-left', { row, field })"
@add-row-after="$emit('add-row-after', $event)"
></GridViewCell>
</div>
</RecursiveWrapper>

View file

@ -6,7 +6,7 @@
:class="{ hover: addHover }"
@mouseover="setHover(true)"
@mouseleave="setHover(false)"
@click="$emit('add-row')"
@click="addRow"
>
<i v-if="includeRowDetails" class="fas fa-plus"></i>
</a>
@ -57,6 +57,10 @@ export default {
setHover(value) {
this.$store.dispatch(this.storePrefix + 'view/grid/setAddRowHover', value)
},
addRow(event) {
event.preventFieldCellUnselect = true
this.$emit('add-row')
},
},
}
</script>

View file

@ -7,7 +7,7 @@
>
<GridViewRow
v-for="(row, index) in rows"
:key="`row-${row.id}`"
:key="`row-${row._.persistentId}`"
:view="view"
:group-id="groupId"
:row="row"

View file

@ -129,9 +129,12 @@ export default {
} else if (key === 'Tab') {
event.preventDefault()
this.$emit(shiftKey ? 'selectPrevious' : 'selectNext')
} else if (key === 'Enter' && shiftKey) {
} else if (key === 'Enter' && shiftKey && !this.readOnly) {
event.preventDefault()
event.preventFieldCellUnselect = true
this.$emit('add-row-after')
this.$emit('selectBelow')
return
}
}

View file

@ -80,8 +80,10 @@ export default {
this.isValid() &&
this.canSaveByPressingEnter(event)
) {
// While editing we want to save the changes.
// While editing we want to save the changes and select the cell below
// to improve the spreadsheet like experience.
this.save()
this.$emit('selectBelow')
} else if (!this.editing) {
// If only selected we will start the editing mode.
this.edit(null, event)

View file

@ -21,6 +21,7 @@ import { prepareRowForRequest } from '@baserow/modules/database/utils/row'
export function populateRow(row, metadata = {}) {
row._ = {
metadata,
persistentId: uuid(),
loading: false,
hover: false,
selectedBy: [],
@ -1307,7 +1308,14 @@ export const actions = {
*/
async createNewRow(
{ commit, getters, dispatch },
{ view, table, fields, values = {}, before = null }
{
view,
table,
fields,
values = {},
before = null,
selectPrimaryCell = false,
}
) {
// Fill values with empty values of field if they are not provided
fields.forEach((field) => {
@ -1350,6 +1358,14 @@ export const actions = {
commit('INSERT_NEW_ROW_IN_BUFFER_AT_INDEX', { row, index })
dispatch('visibleByScrollTop')
const primaryField = fields.find((f) => f.primary)
if (selectPrimaryCell && primaryField) {
await dispatch('setSelectedCell', {
rowId: row.id,
fieldId: primaryField.id,
})
}
try {
const { data } = await RowService(this.$client).create(
table.id,
@ -1362,8 +1378,8 @@ export const actions = {
order: data.order,
values: data,
})
dispatch('onRowChange', { view, row, fields })
dispatch('fetchAllFieldAggregationData', {
await dispatch('onRowChange', { view, row, fields })
await dispatch('fetchAllFieldAggregationData', {
view,
})
} catch (error) {