1
0
mirror of https://gitlab.com/bramw/baserow.git synced 2024-11-24 16:36:46 +00:00
bramw_baserow/web-frontend/modules/builder/mixins/element.js
2024-09-19 13:39:45 +00:00

142 lines
4.0 KiB
JavaScript

import RuntimeFormulaContext from '@baserow/modules/core/runtimeFormulaContext'
import { resolveFormula } from '@baserow/modules/core/formula'
import { resolveColor } from '@baserow/modules/core/utils/colors'
import applicationContextMixin from '@baserow/modules/builder/mixins/applicationContext'
import { ThemeConfigBlockType } from '@baserow/modules/builder/themeConfigBlockTypes'
export default {
inject: ['workspace', 'builder', 'page', 'mode'],
mixins: [applicationContextMixin],
props: {
element: {
type: Object,
required: true,
},
},
computed: {
workflowActionsInProgress() {
const workflowActions = this.$store.getters[
'workflowAction/getElementWorkflowActions'
](this.page, this.element.id)
const { recordIndexPath } = this.applicationContext
const dispatchedById = this.elementType.uniqueElementId(
this.element,
recordIndexPath
)
return workflowActions.some((workflowAction) =>
this.$store.getters['workflowAction/getDispatching'](
workflowAction,
dispatchedById
)
)
},
elementType() {
return this.$registry.get('element', this.element.type)
},
isEditMode() {
return this.mode === 'editing'
},
elementIsInError() {
return this.elementType.isInError({
page: this.page,
element: this.element,
builder: this.builder,
})
},
runtimeFormulaContext() {
/**
* This proxy allow the RuntimeFormulaContextClass to act like a regular object.
*/
return new Proxy(
new RuntimeFormulaContext(
this.$registry.getAll('builderDataProvider'),
this.applicationContext
),
{
get(target, prop) {
return target.get(prop)
},
}
)
},
formulaFunctions() {
return {
get: (name) => {
return this.$registry.get('runtimeFormulaFunction', name)
},
}
},
themeConfigBlocks() {
return this.$registry.getOrderedList('themeConfigBlock')
},
colorVariables() {
return ThemeConfigBlockType.getAllColorVariables(
this.themeConfigBlocks,
this.builder.theme
)
},
},
methods: {
resolveFormula(formula, formulaContext = null) {
try {
return resolveFormula(
formula,
this.formulaFunctions,
formulaContext || this.runtimeFormulaContext
)
} catch (e) {
return ''
}
},
async fireEvent(event) {
if (this.mode !== 'editing') {
if (this.workflowActionsInProgress) {
return false
}
const workflowActions = this.$store.getters[
'workflowAction/getElementWorkflowActions'
](this.page, this.element.id).filter(
({ event: eventName }) => eventName === event.name
)
try {
await event.fire({
workflowActions,
resolveFormula: this.resolveFormula,
applicationContext: this.applicationContext,
})
} catch (e) {
let toastTitle = this.$i18n.t(
'dispatchWorkflowActionError.defaultTitle'
)
let toastMessage = this.$i18n.t(
'dispatchWorkflowActionError.defaultMessage'
)
if (e.error !== 'ERROR_WORKFLOW_ACTION_FORM_DATA_INVALID') {
toastTitle = this.$i18n.t(
'dispatchWorkflowActionError.formDataInvalidTitle'
)
toastMessage = this.$i18n.t(
'dispatchWorkflowActionError.formDataInvalidMessage'
)
}
return this.$store.dispatch('toast/error', {
title: toastTitle,
message: toastMessage,
})
}
}
},
getStyleOverride(key, colorVariables = null) {
return ThemeConfigBlockType.getAllStyles(
this.themeConfigBlocks,
this.element.styles?.[key] || {},
colorVariables || this.colorVariables,
this.builder.theme
)
},
resolveColor,
},
}