1
0
mirror of https://gitlab.com/bramw/baserow.git synced 2024-11-22 07:42:36 +00:00
bramw_baserow/web-frontend/modules/builder/components/page/PageElement.vue
2024-10-30 13:15:00 +00:00

199 lines
6.0 KiB
Vue

<template>
<div
v-if="elementMode === 'editing' || isVisible"
class="element__wrapper"
:class="{
'element__wrapper--full-bleed':
element.style_width === WIDTH_TYPES.FULL.value,
'element__wrapper--full-width':
element.style_width === WIDTH_TYPES.FULL_WIDTH.value,
'element__wrapper--medium-width':
element.style_width === WIDTH_TYPES.MEDIUM.value,
'element__wrapper--small-width':
element.style_width === WIDTH_TYPES.SMALL.value,
}"
:style="elementStyles"
>
<div class="element__inner-wrapper">
<component
:is="component"
:element="element"
:children="children"
:application-context-additions="{
element,
}"
class="element"
/>
</div>
</div>
</template>
<script>
import { resolveColor } from '@baserow/modules/core/utils/colors'
import { themeToColorVariables } from '@baserow/modules/builder/utils/theme'
import {
BACKGROUND_TYPES,
WIDTH_TYPES,
BACKGROUND_MODES,
} from '@baserow/modules/builder/enums'
import applicationContextMixin from '@baserow/modules/builder/mixins/applicationContext'
import {
VISIBILITY_NOT_LOGGED,
VISIBILITY_LOGGED_IN,
ROLE_TYPE_ALLOW_EXCEPT,
ROLE_TYPE_DISALLOW_EXCEPT,
} from '@baserow/modules/builder/constants'
import { mapGetters } from 'vuex'
export default {
name: 'PageElement',
mixins: [applicationContextMixin],
inject: ['builder', 'page', 'mode'],
provide() {
return { mode: this.elementMode }
},
props: {
element: {
type: Object,
required: true,
},
forceMode: {
type: String,
required: false,
default: null,
},
},
computed: {
BACKGROUND_TYPES: () => BACKGROUND_TYPES,
WIDTH_TYPES: () => WIDTH_TYPES,
colorVariables() {
return themeToColorVariables(this.builder.theme)
},
elementMode() {
return this.forceMode !== null ? this.forceMode : this.mode
},
component() {
const elementType = this.$registry.get('element', this.element.type)
const componentName =
this.elementMode === 'editing' ? 'editComponent' : 'component'
return elementType[componentName]
},
children() {
return this.$store.getters['element/getChildren'](this.page, this.element)
},
...mapGetters({
loggedUser: 'userSourceUser/getUser',
}),
isVisible() {
const elementType = this.$registry.get('element', this.element.type)
const isInError = elementType.isInError({
page: this.page,
element: this.element,
builder: this.builder,
})
if (this.mode !== 'editing' && isInError) {
return false
}
const isAuthenticated = this.$store.getters[
'userSourceUser/isAuthenticated'
](this.builder)
const user = this.loggedUser(this.builder)
const roles = this.element.roles
const roleType = this.element.role_type
const visibility = this.element.visibility
if (visibility === VISIBILITY_LOGGED_IN) {
if (!isAuthenticated) {
return false
}
if (roleType === ROLE_TYPE_ALLOW_EXCEPT) {
return !roles.includes(user.role)
} else if (roleType === ROLE_TYPE_DISALLOW_EXCEPT) {
return roles.includes(user.role)
} else {
return true
}
} else if (visibility === VISIBILITY_NOT_LOGGED) {
return !isAuthenticated
} else {
return true
}
},
elementStyles() {
const styles = {
'--element-background-color':
this.element.style_background === BACKGROUND_TYPES.COLOR
? this.resolveColor(
this.element.style_background_color,
this.colorVariables
)
: 'none',
'--element-background-image':
this.element.style_background_file !== null
? `url(${this.element.style_background_file.url})`
: 'none',
'--element-border-top': this.border(
this.element.style_border_top_size,
this.element.style_border_top_color
),
'--element-margin-top': `${this.element.style_margin_top || 0}px`,
'--element-padding-top': `${this.element.style_padding_top || 0}px`,
'--element-border-bottom': this.border(
this.element.style_border_bottom_size,
this.element.style_border_bottom_color
),
'--element-margin-bottom': `${this.element.style_margin_bottom || 0}px`,
'--element-padding-bottom': `${
this.element.style_padding_bottom || 0
}px`,
'--element-border-left': this.border(
this.element.style_border_left_size,
this.element.style_border_left_color
),
'--element-margin-left': `${this.element.style_margin_left || 0}px`,
'--element-padding-left': `${this.element.style_padding_left || 0}px`,
'--element-border-right': this.border(
this.element.style_border_right_size,
this.element.style_border_right_color
),
'--element-margin-right': `${this.element.style_margin_right || 0}px`,
'--element-padding-right': `${this.element.style_padding_right || 0}px`,
}
if (this.element.style_background_file !== null) {
if (this.element.style_background_mode === BACKGROUND_MODES.FILL) {
styles['--element-background-size'] = 'cover'
styles['--element-background-repeat'] = 'no-repeat'
}
if (this.element.style_background_mode === BACKGROUND_MODES.TILE) {
styles['--element-background-size'] = 'auto'
styles['--element-background-repeat'] = 'repeat'
}
if (this.element.style_background_mode === BACKGROUND_MODES.FIT) {
styles['--element-background-size'] = 'contain'
styles['--element-background-repeat'] = 'no-repeat'
}
}
return styles
},
},
methods: {
resolveColor,
border(size, color) {
if (!size) {
return 'none'
}
return `solid ${size}px ${this.resolveColor(color, this.colorVariables)}`
},
},
}
</script>