mirror of
https://gitlab.com/bramw/baserow.git
synced 2025-04-23 12:50:16 +00:00
271 lines
9.6 KiB
Vue
271 lines
9.6 KiB
Vue
<template>
|
||
<div>
|
||
<!--
|
||
This is a temporary page that just holds the static html code. It can later be used
|
||
to copy parts out off when building the real thing. When we don't need it anymore,
|
||
we should delete it. Note that when this page component is deleted, we must also
|
||
delete `builder/components/TemporaryPreview.vue`.
|
||
-->
|
||
<header class="layout__col-2-1 header header--space-between">
|
||
<ul class="header__filter">
|
||
<li class="header__filter-item">
|
||
<div>
|
||
<a class="header__filter-link"
|
||
><i class="header__filter-icon iconoir-selection"></i>
|
||
<span class="header__filter-name">Elements</span></a
|
||
>
|
||
</div>
|
||
</li>
|
||
<li class="header__filter-item">
|
||
<div>
|
||
<a class="header__filter-link"
|
||
><i class="header__filter-icon iconoir-table"></i>
|
||
<span class="header__filter-name">Data</span></a
|
||
>
|
||
</div>
|
||
</li>
|
||
<li class="header__filter-item">
|
||
<div>
|
||
<a class="header__filter-link"
|
||
><i class="header__filter-icon iconoir-sigma-function"></i>
|
||
<span class="header__filter-name">Variables</span></a
|
||
>
|
||
</div>
|
||
</li>
|
||
<li class="header__filter-item">
|
||
<div>
|
||
<a class="header__filter-link"
|
||
><i class="header__filter-icon iconoir-settings"></i>
|
||
<span class="header__filter-name">Page settings</span></a
|
||
>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
<ul class="header__filter">
|
||
<li class="header__filter-item header__filter-item--no-margin-left">
|
||
<div>
|
||
<a
|
||
class="header__filter-link"
|
||
:class="{ 'active active--primary': device === 'desktop' }"
|
||
@click="setDevice('desktop')"
|
||
><i class="header__filter-icon iconoir-laptop"></i
|
||
></a>
|
||
</div>
|
||
</li>
|
||
<li class="header__filter-item">
|
||
<div>
|
||
<a
|
||
class="header__filter-link"
|
||
:class="{ 'active active--primary': device == 'tablet' }"
|
||
@click="setDevice('tablet')"
|
||
><i class="header__filter-icon baserow-icon-tablet"></i
|
||
></a>
|
||
</div>
|
||
</li>
|
||
<li class="header__filter-item">
|
||
<div>
|
||
<a
|
||
class="header__filter-link"
|
||
:class="{ 'active active--primary': device == 'smartphone' }"
|
||
@click="setDevice('smartphone')"
|
||
><i class="header__filter-icon iconoir-smartphone-device"></i
|
||
></a>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
<ul class="header__filter">
|
||
<li class="header__filter-item">
|
||
<div>
|
||
<a class="header__filter-link">
|
||
<span class="header__filter-name">Preview</span></a
|
||
>
|
||
</div>
|
||
</li>
|
||
<li class="header__filter-item header__filter-item--right">
|
||
<div>
|
||
<a class="header__filter-link"
|
||
><i class="header__filter-icon iconoir-upload"></i>
|
||
<span class="header__filter-name">Publish</span></a
|
||
>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</header>
|
||
<div class="layout__col-2-2 content">
|
||
<div class="page-builder">
|
||
<div class="page-builder__preview-wrapper">
|
||
<div
|
||
ref="preview"
|
||
class="page-builder__preview"
|
||
:class="{
|
||
'page-builder__preview--tablet': device == 'tablet',
|
||
'page-builder__preview--smartphone': device == 'smartphone',
|
||
}"
|
||
>
|
||
<div ref="previewScaled" class="page-builder__preview-scaled">
|
||
<TemporaryPreview>
|
||
<div
|
||
v-for="(i, index) in new Array(3)"
|
||
:key="index"
|
||
class="page-builder__preview-element"
|
||
:class="{
|
||
'page-builder__preview-element--active':
|
||
selectedElementIndex === index,
|
||
}"
|
||
@click="selectedElementIndex = index"
|
||
>
|
||
<a
|
||
v-if="selectedElementIndex + 1 !== index"
|
||
href="#"
|
||
class="page-builder__preview-add page-builder__preview-element-add page-builder__preview-element-add-first"
|
||
>
|
||
<i class="iconoir-plus"></i>
|
||
</a>
|
||
<a
|
||
v-if="selectedElementIndex - 1 !== index"
|
||
href="#"
|
||
class="page-builder__preview-add page-builder__preview-element-add page-builder__preview-element-add-last"
|
||
>
|
||
<i class="iconoir-plus"></i>
|
||
</a>
|
||
<div
|
||
class="page-builder__preview-menu page-builder__preview-element-menu"
|
||
>
|
||
<a href="#" class="page-builder__preview-menu-item">
|
||
<i class="iconoir-copy"></i>
|
||
<div class="page-builder__preview-menu-item-description">
|
||
Copy
|
||
</div>
|
||
</a>
|
||
<a href="#" class="page-builder__preview-menu-item">
|
||
<i class="iconoir-nav-arrow-up"></i>
|
||
<div class="page-builder__preview-menu-item-description">
|
||
Move up
|
||
</div>
|
||
</a>
|
||
<a href="#" class="page-builder__preview-menu-item">
|
||
<i class="iconoir-nav-arrow-down"></i>
|
||
<div class="page-builder__preview-menu-item-description">
|
||
Move down
|
||
</div>
|
||
</a>
|
||
<a href="#" class="page-builder__preview-menu-item">
|
||
<i class="iconoir-bin"></i>
|
||
<div class="page-builder__preview-menu-item-description">
|
||
Delete
|
||
</div>
|
||
</a>
|
||
</div>
|
||
<p style="font-size: 20px; line-height: 180%; margin: 0">
|
||
1Are your projects, ideas or business processes unorganized
|
||
or unclear? With Baserow you decide how you want to
|
||
structure everything. Whether you’re managing customers,
|
||
products or airplanes. If you know how a spreadsheet works,
|
||
you know how Baserow works.
|
||
</p>
|
||
</div>
|
||
</TemporaryPreview>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="page-builder__sidebar">
|
||
<ul class="page-builder__sidebar-tabs">
|
||
<li class="page-builder__sidebar-tab">
|
||
<a href="#" class="page-builder__sidebar-tab-link">General</a>
|
||
</li>
|
||
<li class="page-builder__sidebar-tab">
|
||
<a href="#" class="page-builder__sidebar-tab-link">Style</a>
|
||
</li>
|
||
<li class="page-builder__sidebar-tab">
|
||
<a
|
||
href="#"
|
||
class="page-builder__sidebar-tab-link page-builder__sidebar-tab-link--active"
|
||
>Visibility</a
|
||
>
|
||
</li>
|
||
<li class="page-builder__sidebar-tab">
|
||
<a href="#" class="page-builder__sidebar-tab-link">Events</a>
|
||
</li>
|
||
</ul>
|
||
<div class="page-builder__sidebar-content">
|
||
content
|
||
<br />
|
||
content
|
||
<br />
|
||
content
|
||
<br />
|
||
content
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import ResizeObserver from 'resize-observer-polyfill'
|
||
|
||
import TemporaryPreview from '@baserow/modules/builder/components/TemporaryPreview'
|
||
|
||
export default {
|
||
name: 'Page',
|
||
components: { TemporaryPreview },
|
||
layout: 'app',
|
||
data() {
|
||
return {
|
||
device: 'desktop', // desktop, tablet or smartphone
|
||
selectedElementIndex: 1,
|
||
}
|
||
},
|
||
mounted() {
|
||
this.resizeObserver = new ResizeObserver(() => {
|
||
this.resized()
|
||
})
|
||
this.resizeObserver.observe(this.$el)
|
||
this.$nextTick(() => {
|
||
this.resized()
|
||
})
|
||
},
|
||
beforeDestroy() {
|
||
this.resizeObserver.unobserve(this.$el)
|
||
},
|
||
methods: {
|
||
setDevice(value) {
|
||
this.device = value
|
||
this.$nextTick(() => {
|
||
this.resized()
|
||
})
|
||
},
|
||
resized() {
|
||
// The widths are the minimum width the preview must have. If the preview dom
|
||
// element becomes smaller than the target, it will be scaled down so that the
|
||
// actual width remains the same, and it will preview the correct device.
|
||
const minimumWidths = {
|
||
desktop: 1100,
|
||
tablet: 768,
|
||
smartphone: 420,
|
||
}
|
||
const preview = this.$refs.preview
|
||
const previewScaled = this.$refs.previewScaled
|
||
|
||
const currentWidth = preview.clientWidth
|
||
const currentHeight = preview.clientHeight
|
||
const targetWidth = minimumWidths[this.device]
|
||
let scale = 1
|
||
let horizontal = 0
|
||
let vertical = 0
|
||
|
||
if (currentWidth < targetWidth) {
|
||
scale = Math.round((currentWidth / targetWidth) * 100) / 100
|
||
horizontal = (currentWidth - currentWidth * scale) / 2 / scale
|
||
vertical = (currentHeight - currentHeight * scale) / 2 / scale
|
||
}
|
||
|
||
previewScaled.style.transform = `scale(${scale})`
|
||
previewScaled.style.transformOrigin = `0 0`
|
||
previewScaled.style.width = `${horizontal * 2 + currentWidth}px`
|
||
previewScaled.style.height = `${vertical * 2 + currentHeight}px`
|
||
},
|
||
},
|
||
}
|
||
</script>
|