1
0
mirror of https://gitlab.com/bramw/baserow.git synced 2024-11-24 16:36:46 +00:00
bramw_baserow/web-frontend/modules/database/store/rowModalNavigation.js
2023-10-19 06:38:36 +00:00

114 lines
3.0 KiB
JavaScript

import RowService from '@baserow/modules/database/services/row'
import { notifyIf } from '@baserow/modules/core/utils/error'
import { getDefaultSearchModeFromEnv } from '@baserow/modules/database/utils/search'
/**
* This store exists to deal with the row edit modal navigation.
* It handles the state of the navigation which can be in a loading
* state or in a ready state. It also handles the state of the row
* which can either be taken from the buffer or fetched if outside
* of the buffer.
*/
export const state = () => ({
loading: false,
/**
* The row refers to the row that the view is
* trying to display. It has a slightly different
* purpose to the rows stored in the `rowModal` store
* since those rows are accessed by the row edit modal
* directly while this row is accessed by the view and
* given to the row edit modal via `show()`.
*
* The row can be outside of the buffer and could therefore
* also not be part of the `rows` in the `rowModal` store.
*/
row: null,
failedToFetchTableRowId: null,
})
export const mutations = {
CLEAR_ROW(state) {
state.row = null
},
SET_LOADING(state, value) {
state.loading = value
},
SET_ROW(state, row) {
state.row = row
},
SET_FAILED_TO_FETCH_TABLE_ROW_ID(state, tableAndRowId) {
state.row = null
state.failedToFetchTableRowId = tableAndRowId
},
}
export const actions = {
clearRow({ commit }) {
commit('SET_FAILED_TO_FETCH_TABLE_ROW_ID', null)
commit('CLEAR_ROW')
},
setRow({ commit }, row) {
commit('SET_FAILED_TO_FETCH_TABLE_ROW_ID', null)
commit('SET_ROW', row)
},
async fetchRow({ commit }, { tableId, rowId }) {
try {
const { data: row } = await RowService(this.$client).get(tableId, rowId)
commit('SET_ROW', row)
return row
} catch (error) {
commit('SET_FAILED_TO_FETCH_TABLE_ROW_ID', { tableId, rowId })
notifyIf(error, 'row')
}
},
async fetchAdjacentRow(
{ commit, dispatch, state },
{ tableId, viewId, previous, activeSearchTerm }
) {
commit('SET_LOADING', true)
try {
const { data: row, status } = await RowService(this.$client).getAdjacent({
previous,
tableId,
viewId,
rowId: state.row.id,
search: activeSearchTerm,
searchMode: getDefaultSearchModeFromEnv(this.$config),
})
if (row) {
commit('SET_ROW', row)
}
commit('SET_LOADING', false)
return { row, status }
} catch (error) {
commit('SET_LOADING', false)
const status = error.response?.status ?? null
// This is the backend not responding at all
if (status === null) {
notifyIf(error, 'row')
}
return { row: null, status }
}
},
}
export const getters = {
getLoading(state) {
return state.loading
},
getRow(state) {
return state.row
},
getFailedToFetchTableRowId(state) {
return state.failedToFetchTableRowId
},
}
export default {
namespaced: true,
state,
getters,
actions,
mutations,
}