1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-03-14 20:52:51 +00:00
bramw_baserow/web-frontend/modules/core/components/Modal.vue

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

202 lines
4.7 KiB
Vue
Raw Permalink Normal View History

<template>
<div
2024-12-10 14:27:16 +00:00
v-if="open || keepContent"
v-show="(keepContent && open) || !keepContent"
ref="modalWrapper"
class="modal__wrapper"
@click="outside($event)"
>
2021-04-08 14:30:26 +00:00
<div
class="modal__box"
:class="{
'modal__box--full-height': fullHeight,
'modal__box--full-max-height': !fullHeight && contentScrollable,
2021-04-08 14:30:26 +00:00
'modal__box--with-sidebar': sidebar,
'modal__box--full-screen': fullScreen,
'modal__box--wide': wide,
'modal__box--small': small,
'modal__box--tiny': tiny,
'modal__box--right': right,
2021-04-08 14:30:26 +00:00
}"
>
2020-06-05 12:02:21 +00:00
<template v-if="sidebar">
<div
v-if="leftSidebar"
class="modal__box-sidebar modal__box-sidebar--left"
:class="{ 'modal__box-sidebar--scrollable': leftSidebarScrollable }"
>
2020-06-05 12:02:21 +00:00
<slot name="sidebar"></slot>
</div>
<div
class="modal__box-content"
:class="{
'modal__box-content--scrollable': contentScrollable,
'modal__box-content-no-padding': !contentPadding,
}"
>
2020-06-05 12:02:21 +00:00
<slot name="content"></slot>
<div class="modal__actions">
<a
v-if="closeButton && canClose"
2024-11-14 12:30:42 +00:00
role="button"
:title="$t('action.close')"
class="modal__close"
@click="hide()"
>
<i class="iconoir-cancel"></i>
</a>
2023-07-24 14:20:51 +00:00
<a
v-if="collapsibleRightSidebar"
2024-07-31 13:41:49 +00:00
class="modal__collapse"
@click="collapseSidebar"
>
<i
:class="{
'iconoir-fast-arrow-right': !sidebarCollapsed,
'iconoir-fast-arrow-left': sidebarCollapsed,
}"
></i>
</a>
<slot name="actions"></slot>
</div>
</div>
2023-07-24 14:20:51 +00:00
<div
v-if="rightSidebar"
class="modal__box-sidebar modal__box-sidebar--right"
2023-07-24 14:20:51 +00:00
:class="{
'modal__box-sidebar--scrollable': rightSidebarScrollable,
'modal__box-sidebar--collapsed': sidebarCollapsed,
}"
>
2023-07-24 14:20:51 +00:00
<slot v-if="!sidebarCollapsed" name="sidebar"></slot>
2020-06-05 12:02:21 +00:00
</div>
</template>
<template v-if="!sidebar">
<slot></slot>
<slot name="content"></slot>
<div class="modal__actions">
<a
v-if="closeButton && canClose"
class="modal__close"
@click="hide()"
>
<i class="iconoir-cancel"></i>
</a>
<slot name="actions"></slot>
</div>
2020-06-05 12:02:21 +00:00
</template>
</div>
</div>
</template>
<script>
2020-11-30 18:52:39 +00:00
import baseModal from '@baserow/modules/core/mixins/baseModal'
export default {
name: 'Modal',
2020-11-30 18:52:39 +00:00
mixins: [baseModal],
2020-06-05 12:02:21 +00:00
props: {
leftSidebar: {
type: Boolean,
default: false,
required: false,
},
rightSidebar: {
2020-06-05 12:02:21 +00:00
type: Boolean,
default: false,
required: false,
},
2021-04-08 14:30:26 +00:00
fullScreen: {
type: Boolean,
default: false,
required: false,
},
wide: {
type: Boolean,
default: false,
required: false,
},
small: {
type: Boolean,
default: false,
required: false,
},
tiny: {
type: Boolean,
default: false,
required: false,
},
2021-04-08 14:30:26 +00:00
closeButton: {
type: Boolean,
default: true,
required: false,
},
fullHeight: {
type: Boolean,
default: false,
required: false,
},
leftSidebarScrollable: {
type: Boolean,
default: false,
required: false,
},
contentScrollable: {
type: Boolean,
default: false,
required: false,
},
contentPadding: {
type: Boolean,
default: true,
required: false,
},
rightSidebarScrollable: {
type: Boolean,
default: false,
required: false,
},
canClose: {
type: Boolean,
default: true,
required: false,
},
2023-07-24 14:20:51 +00:00
collapsibleRightSidebar: {
type: Boolean,
default: false,
required: false,
},
right: {
type: Boolean,
default: false,
required: false,
},
2024-12-10 14:27:16 +00:00
// This flag allow to keep the modal content in case you want it to be available.
// Useful if you have a form inside the modal that is a sub part of the current
// form.
keepContent: {
type: Boolean,
default: false,
required: false,
},
2023-07-24 14:20:51 +00:00
},
data() {
return {
sidebarCollapsed: false,
}
},
computed: {
sidebar() {
return this.leftSidebar || this.rightSidebar
},
2020-06-05 12:02:21 +00:00
},
2023-07-24 14:20:51 +00:00
methods: {
collapseSidebar() {
this.sidebarCollapsed = !this.sidebarCollapsed
},
},
}
</script>