1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-06 14:05:28 +00:00
bramw_baserow/web-frontend/modules/builder/mixins/element.js

141 lines
3.8 KiB
JavaScript

import RuntimeFormulaContext from '@baserow/modules/core/runtimeFormulaContext'
import { resolveFormula } from '@baserow/modules/core/formula'
import {
ClickEvent,
SubmitEvent,
AfterLoginEvent,
} from '@baserow/modules/builder/eventTypes'
import { resolveColor } from '@baserow/modules/core/utils/colors'
import { themeToColorVariables } from '@baserow/modules/builder/utils/theme'
export default {
inject: ['workspace', 'builder', 'page', 'mode', 'applicationContext'],
provide() {
return {
applicationContext: {
...this.applicationContext,
element: this.element,
...this.applicationContextAdditions,
},
}
},
props: {
element: {
type: Object,
required: true,
},
applicationContextAdditions: {
type: Object,
required: false,
default: null,
},
},
computed: {
workflowActionsInProgress() {
const workflowActions = this.$store.getters[
'workflowAction/getElementWorkflowActions'
](this.page, this.element.id)
return workflowActions.some((workflowAction) =>
this.$store.getters['workflowAction/getDispatching'](workflowAction)
)
},
elementType() {
return this.$registry.get('element', this.element.type)
},
isEditMode() {
return this.mode === 'editing'
},
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)
},
}
},
colorVariables() {
return themeToColorVariables(this.builder.theme)
},
},
methods: {
resolveFormula(formula, formulaContext = null) {
try {
return resolveFormula(
formula,
this.formulaFunctions,
formulaContext || this.runtimeFormulaContext
)
} catch (e) {
return ''
}
},
async fireEvent(EventType) {
if (this.mode !== 'editing') {
if (this.workflowActionsInProgress) {
return false
}
const workflowActions = this.$store.getters[
'workflowAction/getElementWorkflowActions'
](this.page, this.element.id)
try {
await new EventType({
i18n: this.$i18n,
store: this.$store,
registry: this.$registry,
}).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,
})
}
}
},
fireClickEvent() {
return this.fireEvent(ClickEvent)
},
fireSubmitEvent() {
this.fireEvent(SubmitEvent)
},
fireAfterLoginEvent() {
this.fireEvent(AfterLoginEvent)
},
resolveColor,
},
}