Merge pull request #7 from KevinMidboe/WIP

Did lots of changes directly in vm, these are the changes
This commit is contained in:
2020-03-20 19:23:36 +01:00
committed by GitHub
22 changed files with 1566 additions and 1008 deletions

View File

@@ -40,10 +40,10 @@
"chalk": "^2.0.1", "chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1", "copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.0", "css-loader": "^0.28.0",
"extract-text-webpack-plugin": "^3.0.0", "extract-text-webpack-plugin": "3.0.2",
"file-loader": "^1.1.4", "file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1", "friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1", "html-webpack-plugin": "3.2.0",
"node-notifier": "^5.1.2", "node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0", "optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0", "ora": "^1.2.0",
@@ -62,10 +62,10 @@
"vue-style-loader": "^3.1.2", "vue-style-loader": "^3.1.2",
"vue-template-compiler": "^2.5.2", "vue-template-compiler": "^2.5.2",
"vue2-collapse": "^1.0.15", "vue2-collapse": "^1.0.15",
"webpack": "^3.6.0", "webpack": "4.30.0",
"webpack-bundle-analyzer": "^2.9.0", "webpack-bundle-analyzer": "^2.9.0",
"webpack-cli": "^3.0.8", "webpack-cli": "^3.0.8",
"webpack-dev-server": "^2.9.1", "webpack-dev-server": "3.3.1",
"webpack-merge": "^4.1.0" "webpack-merge": "^4.1.0"
}, },
"engines": { "engines": {

View File

@@ -0,0 +1,135 @@
<template>
<div>
<!-- <button @click="toggleView">Toggle view</button> -->
<div class="gallery-container" :class="mobileFriendly ? 'mobile' : 'large'">
<gallery-image v-for="(image, key) in gallery" :image="image" :key="key" :index="key" :thumbnail="thumbnail" @click="imageSelected"></gallery-image>
</div>
<div class="gallery--load-more">
<button class="button" @click="viewAll">View all</button>
</div>
</div>
</template>
<script>
import GalleryImage from '@/components/GalleryImage'
import GalleryText from '@/components/GalleryText'
import { mapGetters } from 'vuex'
import store from '@/store'
import { imagesByAdventureId } from '@/utils/leifsbackend-api'
export default {
name: 'Gallery-Item',
components: { GalleryImage, GalleryText },
props: {
id: {
type: Number
}
},
data() {
return {
selected: undefined,
wide: false,
gallery: [],
ASSET_URL: 'https://leifsopplevelser.no/assets',
thumbnail: true,
mobileFriendly: false,
}
},
created() {
this.adventureImages = imagesByAdventureId(this.id)
.then(adventureImages => {
adventureImages.forEach(image => {
let [filename, filextension] = image.filename.split('.')
console.log('filename:', filename)
console.log('filextension:', filextension)
const url = `${this.ASSET_URL}/${filename}_lg.${filextension}`
this.gallery.push({
type: 'image',
url
})
})
})
// this.setPopoverAlbum(this.gallery)
// const that = this;
// window.addEventListener('resize', function() {
// that.setMobileFriendly()
// });
},
methods: {
viewAll() {
},
setMobileFriendly() {
const monitor = document.getElementsByClassName('gallery-container');
const image = document.getElementsByClassName('gallery-image')
if (monitor === undefined || image === undefined)
return
console.log('monitor and image', monitor[0].offsetWidth, image[0].offsetWidth)
this.mobileFriendly = monitor[0].offsetWidth < image[0].offsetWidth * 1.5;
},
toggleView() {
this.wide = !this.wide;
this.thumbnail = !this.thumbnail;
},
// setPopoverAlbum: (album) => store.dispatch('setPopoverAlbum', album),
imageSelected(selectedImage) {
const selectedImageIndex = this.gallery.findIndex(image => selectedImage === image);
console.log('this is the selected image index', selectedImageIndex)
store.dispatch('setPopoverAlbum', this.gallery);
store.dispatch('setPopoverAlbumIndex', selectedImageIndex)
store.dispatch('showPopover');
// store.dispatch('incrementPopoverImage', this.selectedIndexInGallery())
},
selectedIndexInGallery() {
const gallery = this.gallery;
const selected = this.selected;
for(var i = 0; i < gallery.length; i += 1) {
if(gallery[i] === selected) {
return i;
}
}
return -1;
},
}
}
</script>
<style lang="scss" scoped>
@import '../scss/buttons.scss';
.gallery-container {
display: flex;
flex-direction: row;
// justify-content: space-evenly;
align-items: center;
justify-content: center;
flex-wrap: wrap;
padding: 1rem 0.5rem;
&.mobile {
// background-color: NavajoWhite;
}
}
.gallery--load-more {
display: flex;
justify-content: center;
}
</style>

View File

@@ -15,9 +15,9 @@
<div class="calendar"> <div class="calendar">
<div v-for="dayName in days" class="calendar--dayName">{{ dayName }}</div> <h3 v-for="dayName in days" class="calendar--dayName">{{ dayName }}</h3>
<div v-for="(day, index) in cal"> <div v-for="(day, index) in cal">
<day-element :key="index" :day="day" @click="clickedDay(day)"></day-element> <day-element :key="index" :day="day"></day-element>
</div> </div>
</div> </div>
@@ -64,10 +64,10 @@ export default {
this.initCalendar() this.initCalendar()
}, },
methods: { methods: {
clickedDay(day) { clickedDay(event=day.events) {
console.log('clicked', day) console.log('clicked', event)
if (day.events.length) { if (event) {
this.$router.push({ name: 'EditEvent', query: { id: day.events[0].id } }) this.$router.push({ name: 'EditEvent', query: { id: event.id } })
} else { } else {
this.$router.push({name: 'EditEvent', params: { formData: { this.$router.push({name: 'EditEvent', params: { formData: {
title: undefined, title: undefined,
@@ -172,6 +172,10 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.container {
max-width: 90vw;
}
.header--inline { .header--inline {
display: flex; display: flex;

View File

@@ -6,6 +6,8 @@
<!-- {{ formData }} --> <!-- {{ formData }} -->
<event-form v-if="notWaitingForFormdata || formData" :formData="formData"></event-form> <event-form v-if="notWaitingForFormdata || formData" :formData="formData"></event-form>
<AdventureGallery :id="parseInt($route.query.id)"></AdventureGallery>
</div> </div>
<!-- <div class="image-grid"> <!-- <div class="image-grid">
@@ -53,6 +55,7 @@ import axios from 'axios'
import VueGridLayout from 'vue-grid-layout'; import VueGridLayout from 'vue-grid-layout';
import ClickOutside from 'vue-click-outside' import ClickOutside from 'vue-click-outside'
import EventForm from './EventForm' import EventForm from './EventForm'
import AdventureGallery from '@/components/AdventureGallery'
import { adventureById, createAdventure } from '@/utils/leifsbackend-api' import { adventureById, createAdventure } from '@/utils/leifsbackend-api'
@@ -60,7 +63,8 @@ export default {
components: { components: {
GridLayout: VueGridLayout.GridLayout, GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem, GridItem: VueGridLayout.GridItem,
EventForm: EventForm EventForm: EventForm,
AdventureGallery
}, },
computed: { computed: {
rowHeight: function() { rowHeight: function() {
@@ -274,7 +278,6 @@ export default {
// background-color: green; // background-color: green;
display: block; display: block;
width: 70vw;
margin: 4rem auto; margin: 4rem auto;
@media screen and (max-width: 650px) { @media screen and (max-width: 650px) {

View File

@@ -12,14 +12,14 @@
<div class="field first-name"> <div class="field first-name">
<label class="caption"> <label class="caption">
<input v-model="dateStart" type="date" spellcheck="false" maxlength="30" :tabindex="2"> <input v-model="dateStart" type="date" spellcheck="false" maxlength="30" :tabindex="2">
fra dato fra dato (dd-mm-yyyy)
</label> </label>
</div> </div>
<div class="field last-name"> <div class="field last-name">
<label class="caption"> <label class="caption">
<input v-model="dateEnd" type="date" spellcheck="false" maxlength="30" :tabindex="3"> <input v-model="dateEnd" type="date" spellcheck="false" maxlength="30" :tabindex="3">
til dato til dato (dd-mm-yyyy)
</label> </label>
</div> </div>
</fieldset> </fieldset>

View File

@@ -8,7 +8,29 @@
</router-link> </router-link>
</div> </div>
<div class="gallery">
<div>
<h1>{{ title }}</h1>
<div class="eventDescription">
<p>{{ eventDuration }}</p>
<div v-if="locationName">
<span>{{ locationName }}</span>
<div style="margin: 1rem 0">
<a @click="showMap = !showMap"> {{ showMap ? 'Lukk kart' : 'Vis kart' }}</a>
</div>
<transition name="slide" class="transition">
<map-view v-if="showMap" :locationName="locationName"></map-view>
</transition>
<AdventureGallery :id="eventData.id"></AdventureGallery>
</div>
</div>
</div>
<!-- <div class="gallery">
<div class="gallery--header"> <div class="gallery--header">
<h1>{{ eventData.title || title }}</h1> <h1>{{ eventData.title || title }}</h1>
<div class="gallery--info"> <div class="gallery--info">
@@ -26,16 +48,13 @@
</div> </div>
</div> </div>
<!-- <map-view :cords="cords"></map-view> -->
<!-- <calendar></calendar> -->
<gallery :short="false" :id="eventData.id"></gallery> <gallery :short="false" :id="eventData.id"></gallery>
</div> </div> -->
</div> </div>
</template> </template>
<script> <script>
import Gallery from '@/components/Gallery' import AdventureGallery from '@/components/AdventureGallery'
import MapView from '@/components/MapView' import MapView from '@/components/MapView'
import moment from 'moment' import moment from 'moment'
@@ -43,7 +62,7 @@ import { locationByName } from '@/utils/leifsbackend-api'
export default { export default {
components: { components: {
Gallery, MapView AdventureGallery, MapView
}, },
props: { props: {
eventData: { eventData: {
@@ -52,57 +71,51 @@ export default {
} }
}, },
computed: { computed: {
eventDate: function() { eventDuration: function() {
return { let start = moment(this.startDate).format('DD.MM.YYYY');
from: this.startDate || '28.09.18', let end = moment(this.endDate).format('DD.MM.YYYY');
until: this.endDate || '12.10.19'
} return `${ start } - ${ end }`
} }
}, },
data() { data() {
return { return {
showMap: false, showMap: false,
mapboxData: undefined, mapboxData: undefined,
id: undefined,
title: 'Topptur til gaustadtoppen', title: undefined,
eventLocation: 'Oslo, Gardermoen, Norge', locationName: undefined,
startDate: undefined, startDate: undefined,
endDate: undefined, endDate: undefined,
subtext: 'On November 1, 2018, we embarked on our tour with Triathalon. Thank you so much to everyone who came to see us, for buying our merch, for saying hello after the shows, to the amazing hard-working people at the venues, and of course to our team + Live Nation, Ones to Watch, for booking us on our favorite tour this year. And thank you to Claud, Girl Ultra and Kevin Krauter for playing these shows with us. \n\n Here are some of our favorite moments captured by one of our favorite people, Meghan Cummings (@meghancummings). ', subtext: undefined
// mapboxData: {"id":"address.3598204582760676","type":"Feature","place_type":["address"],"relevance":1,"properties":{"accuracy":"point"},"text":"Rosendalsveien","place_name":"Rosendalsveien50b,1166Oslo,Norway","center":[10.799471,59.853973],"geometry":{"type":"Point","coordinates":[10.799471,59.853973]},"address":"50b","context":[{"id":"postcode.9489910510813950","text":"1166"},{"id":"place.17289044417596980","short_code":"NO-03","wikidata":"Q585","text":"Oslo"},{"id":"country.16020050790143780","short_code":"no","wikidata":"Q20","text":"Norway"}]}
} }
}, },
created() { created() {
const id = this.$route.params.id; const id = this.$route.params.id;
console.log('id found', id) console.log('id found', id);
if (id) { if (id) {
adventureById(id) adventureById(id)
.then(data => this.eventData = data) .then(this.setEventData(data))
} else {
this.setEventData(this.eventData)
} }
}, },
methods: { methods: {
dateToDayMonthYear(date) { setEventData(event) {
return moment(date).format('DD.MM.YYYY') console.log('evnent', event)
this.id = event.id;
this.title = event.title;
this.locationName = event.locationName;
this.startDate = event.dateStart;
this.endDate = event.dateEnd;
this.subtext = event.subtext;
}, },
toggleMap() {
if (this.showMap) {
this.showMap = false
return
}
locationByName(this.eventData.locationName)
.then(data => {
this.mapboxData = data.mapboxData;
this.showMap = true;
})
.catch((err) => console.log('error fetching locations by name from server. Error:', err))
}
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '../scss/buttons.scss';
.slide-enter-active, .slide-leave-active { .slide-enter-active, .slide-leave-active {
transition: margin-bottom .1s ease-out; transition: margin-bottom .1s ease-out;
@@ -141,15 +154,7 @@ margin-bottom: 0px;
margin-top: 0.8rem; margin-top: 0.8rem;
} }
a {
font-family: 'Ambroise std demi';
font-style: normal;
color: #3b70a2;
&:visited {
color: #3b70a2;
}
}
} }
&--subtext { &--subtext {
@@ -167,34 +172,5 @@ margin-bottom: 0px;
margin-right: 1rem; margin-right: 1rem;
} }
.button {
-webkit-appearance: none;
-webkit-backface-visibility: none;
border: 2.5px solid #c91119;
border-radius: 3px;
// color: rgb(255, 255, 255);
background-color: white;
color: #c91119;
cursor: pointer;
font-size: 14px;
font-weight: 600;
height: 42px;
letter-spacing: 1px;
line-height: 14px;
margin-left: -10px;
padding: 0 1rem;
text-transform: uppercase;
transition-delay: 0s;
transition-duration: 0.1s;
transition-property: opacity;
transition-timing-function: linear;
vertical-align: baseline;
white-space: pre;
writing-mode: horizontal-tb;
&:hover, &:active, &:focus {
color: white;
background-color: #c91119;
}
}
</style> </style>

View File

@@ -1,7 +1,7 @@
<template> <template>
<footer class="footer"> <footer class="footer">
<div class="start"><a href="mailto:kevin.midboe@gmail.com?Subject=Ref Leifsopplevelser:%20">Kontakt</a></div> <div class="start"><a href="mailto:kevin.midboe@gmail.com?Subject=Ref Leifsopplevelser:%20">Kontakt</a></div>
<div class="middle">2</div> <div class="middle"><a href="https://github.com/search?q=user%3AKevinMidboe+leifs+in%3Aname&type=Repositories">github</a></div>
<div class="end">© Kevin Midboe, 2019</div> <div class="end">© Kevin Midboe, 2019</div>
</footer> </footer>
</template> </template>

View File

@@ -1,108 +0,0 @@
<template>
<div>
<button @click="toggleView">Toggle view</button>
<div class="gallery-container">
<div v-for="(item, key) in gallery">
<gallery-image v-if="item.type === 'image'" :image="item" :index="key" :wide="wide" @click="imageSelected"></gallery-image>
<gallery-text v-if="item.type === 'text'" :text="item"></gallery-text>
</div>
</div>
</div>
</template>
<script>
import GalleryImage from '@/components/GalleryImage'
import GalleryText from '@/components/GalleryText'
import { mapGetters } from 'vuex'
import store from '@/store'
import { imagesByAdventureId } from '@/utils/leifsbackend-api'
export default {
name: 'Gallery-Item',
components: { GalleryImage, GalleryText },
props: {
short: {
default: false,
type: Boolean
},
id: {
type: Number
}
},
data() {
return {
selected: undefined,
wide: false,
gallery: [],
ASSET_URL: 'https://leifsopplevelser.no/assets'
}
},
created() {
this.setPopoverAlbum(this.gallery)
},
watch: {
gallery: function (val) {
this.setPopoverAlbum(val)
}
},
created() {
imagesByAdventureId(this.id)
.then(images => {
console.log('events', images)
images.forEach(image => {
let [filename, filextension] = image.filename.split('.')
console.log('filename:', filename)
console.log('filextension:', filextension)
const url = `${this.ASSET_URL}/${filename}_lg.${filextension}`
this.gallery.push({
type: 'image',
url
})
})
})
},
methods: {
toggleView() {
this.wide = !this.wide;
},
setPopoverAlbum: (album) => store.dispatch('setPopoverAlbum', album),
imageSelected(image) {
console.log('selected image', image)
this.selected = image;
// store.dispatch('incrementPopoverImage', this.selectedIndexInGallery())
},
selectedIndexInGallery() {
const gallery = this.gallery;
const selected = this.selected;
for(var i = 0; i < gallery.length; i += 1) {
if(gallery[i] === selected) {
return i;
}
}
return -1;
},
}
}
</script>
<style lang="scss" scoped>
.gallery-container {
display: flex;
width: 100%;
flex-direction: row;
// justify-content: space-evenly;
flex-wrap: wrap;
padding: 1rem 0;
}
</style>

View File

@@ -1,7 +1,8 @@
<template> <template>
<div v-bind:class="{ isWide: wide }"> <div v-bind:class="{ isWide: wide }">
<transition name="fade"> <transition name="fade">
<img :src="image.url" @click="popover(image)" v-on:load="onLoaded" v-show="loaded"/> {{ image }}
<img :src="dynamicImageUrl" @click="popover(image)" v-on:load="onLoaded" v-show="loaded" class="gallery-image" />
</transition> </transition>
<p>{{ image.name }}</p> <p>{{ image.name }}</p>
</div> </div>
@@ -19,10 +20,24 @@ export default {
index: { index: {
type: Number, type: Number,
}, },
thumbnail: {
type: Boolean,
required: false,
default: false
},
wide: { wide: {
type: Boolean type: Boolean
} }
}, },
computed: {
dynamicImageUrl: function() {
console.log('thumbnail', this.thumbnail)
if (this.thumbnail) {
return this.image.url.replace('_lg.', '_thumb.');
}
return this.image.url.replace('_lg.', '_sm.');
}
},
data() { data() {
return { return {
loaded: false loaded: false
@@ -35,8 +50,8 @@ export default {
onLoaded() { this.loaded = true }, onLoaded() { this.loaded = true },
popover(image) { popover(image) {
this.setPopoverAlbumIndex(this.index) // this.setPopoverAlbumIndex(this.index)
this.showPopover() // this.showPopover()
this.$emit('click', image) this.$emit('click', image)
} }
} }
@@ -53,17 +68,10 @@ export default {
} }
img { img {
max-height: 300px; max-width: 90vw;
max-width: 300px; // width: 350px;
width: 300px;
cursor: pointer; cursor: pointer;
margin: 0.6rem; padding: 0.2rem;
@media screen and (max-width: 600px) {
background-color: red;
height: unset;
width: 100%;
}
} }
.isWide img { .isWide img {

View File

@@ -1,6 +1,7 @@
<template> <template>
<header> <header>
<div class="navigate-back">Tilbake</div> <!-- <div class="navigate-back">Tilbake</div> -->
<h1><slot></slot></h1>
</header> </header>
</template> </template>
@@ -24,10 +25,41 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import url('https://fonts.googleapis.com/css?family=Alegreya+Sans+SC:700|Roboto+Slab:700|Source+Sans+Pro:600');
header { header {
width: 100%; height: 490px;
height: 3.5rem; @media screen and (max-width: 600px) {
background-color: NavajoWhite; height: 350px;
}
background-color: #f5af52;
display: flex;
align-items: center;
justify-content: flex-end;
background-image: url('https://eu.blackdiamondequipment.com/on/demandware.static/-/Library-Sites-SharedLibrary/default/dwf668bbc0/images/heroes/S19_Wind-Shells_HP-Hero.jpg');
background-position: center;
h1 {
font-family: 'Roboto Slab', sans-serif;
// font-family: 'Source Sans Pro', sans-serif;
// font-family: 'Alegreya Sans SC', sans-serif;
color: white;
background-color: rgba(0,0,0,0.4);
text-transform: capitalize;
margin-right: 15%;
font-size: 3.5rem;
@media screen and (max-width: 600px) {
margin: 10px;
padding: 1rem;
font-size: 2.8rem;
text-align: center;
}
padding: 1.5rem;
border: 4px solid white;
}
} }
.navigate-back { .navigate-back {

View File

@@ -4,15 +4,24 @@
<!-- <h1>{{ title }}</h1> <!-- <h1>{{ title }}</h1>
<h2>Han har ikke hatt nok etter 60 år!</h2> <h2>Han har ikke hatt nok etter 60 år!</h2>
{{ date }} --> {{ date }} -->
<!-- <Header></Header> --> <Header>Leifs opplevelser 2019</Header>
<!-- <Navigation></Navigation> -->
<div class="header">
<!-- <div style="height: 2px; background-color: #cb0b0b; width:100%;"></div> -->
<!-- <div class="header">
<h1>{{ title }}</h1> <h1>{{ title }}</h1>
</div> </div> -->
<calendar :long="false"></calendar> <calendar :long="false"></calendar>
<div class="add-adventure" @click="$router.push({path: '/edit'})">
<h1 class="add-adventure__text">Legg til en ny opplevelse +</h1>
</div>
<div class="container" v-for="event in events"> <div style="margin: 2rem;" v-for="event in events">
<!-- <div class="container" v-for="event in events"> -->
<event-page :eventData="event"></event-page> <event-page :eventData="event"></event-page>
</div> </div>
@@ -22,6 +31,7 @@
<script> <script>
import Header from '@/components/Header' import Header from '@/components/Header'
import Navigation from '@/components/Navigation'
import EventPage from '@/components/EventPage' import EventPage from '@/components/EventPage'
import Calendar from '@/components/Calendar' import Calendar from '@/components/Calendar'
import Footer from '@/components/Footer' import Footer from '@/components/Footer'
@@ -29,7 +39,7 @@ import Footer from '@/components/Footer'
import { adventureList } from '@/utils/leifsbackend-api' import { adventureList } from '@/utils/leifsbackend-api'
export default { export default {
components: { Header, EventPage, Calendar, Footer }, components: { Header, Navigation, EventPage, Calendar, Footer },
data() { data() {
return { return {
title: 'leifs opplevelser', title: 'leifs opplevelser',
@@ -58,13 +68,40 @@ export default {
} }
</script> </script>
<style language="scss" scoped>
<style lang="scss" scoped>
.header { .header {
margin: 0 auto; /*margin: 0 auto;*/
max-width: 1200px; /*max-width: 1200px;*/
padding: 2.5rem 0rem 2rem 3.5rem; margin: 2rem 2rem;
// width: 100%;
/*padding: 2.5rem 0rem 2rem 3.5rem;*/
/*margin-bottom: 5rem;*/ /*margin-bottom: 5rem;*/
h1 {
text-align: center;
font-size: 3rem;
}
}
.add-adventure {
width: 85vw;
border: 2px solid #cb0b0b;
border-radius: 6px;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&__text {
text-align: center;
margin: 1.2rem 1rem;
@media screen and (max-width: 400px) {
font-size: 1.6rem;
}
}
} }
h2 { h2 {

View File

@@ -1,23 +1,24 @@
<template> <template>
<div class="map"> <div class="map" v-if="mapboxData">
{{ mapboxData.center }} {{ mapboxData.center }}
<mapbox <mapbox
:access-token="accessToken" :access-token="accessToken"
:map-options="options" :map-options="options"
@map-init="mapInitialized" @map-init="mapInitialized"
@map-load="mapLoaded"></mapbox> @map-load="setLocationMarker"></mapbox>
</div> </div>
</template> </template>
<script> <script>
import mapboxgl from 'mapbox-gl'; import mapboxgl from 'mapbox-gl';
import Mapbox from 'mapbox-gl-vue'; import Mapbox from 'mapbox-gl-vue';
import { locationByName } from '@/utils/leifsbackend-api'
export default { export default {
components: { Mapbox }, components: { Mapbox },
props: { props: {
mapboxData: { locationName: {
type: Object, type: String,
required: true required: true
} }
}, },
@@ -25,23 +26,34 @@ export default {
return { return {
marker: undefined, marker: undefined,
map: undefined, map: undefined,
mapboxData: undefined,
options: undefined,
accessToken: "pk.eyJ1Ijoia2V2aW5taWRib2UiLCJhIjoiY2pydWhlamQyMHJ2NTRhdGN1em5ndXVyMyJ9.Ejdo_3iuuGOD662Bh6es4w", accessToken: undefined
options: { }
},
async created() {
console.log('created')
const response = await locationByName(this.locationName);
const mapData = response.mapboxData;
this.setupMap(mapData)
this.mapboxData = mapData;
},
methods: {
setupMap(mapData) {
console.log('mapData', mapData)
const mapCenter = mapData.center;
this.options = {
style: 'mapbox://styles/kevinmidboe/cjrvwyoft1tij1ftb94f75lqs', style: 'mapbox://styles/kevinmidboe/cjrvwyoft1tij1ftb94f75lqs',
sprite: 'mapbox://styles/kevinmidboe/cjrvwyoft1tij1ftb94f75lqs', sprite: 'mapbox://styles/kevinmidboe/cjrvwyoft1tij1ftb94f75lqs',
center: this.mapboxData.center,
zoom: 10, zoom: 10,
center: mapCenter,
minZoom: 0, minZoom: 0,
maxZoom: 18 maxZoom: 18
} }
}
},
methods: {
mapInitialized(map) { this.map = map },
mapLoaded() {
this.setLocationMarker()
}, },
mapInitialized(map) { this.map = map },
setLocationMarker() { setLocationMarker() {
if(this.marker != undefined) this.marker.remove(); if(this.marker != undefined) this.marker.remove();

View File

@@ -0,0 +1,43 @@
<template>
<div class="navigation">
<div>home</div>
<div>fag</div>
<div>about</div>
<div>contact</div>
</div>
</template>
<script>
export default {
}
</script>
<style lang="scss" scoped>
.navigation {
height: 45px;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
background-color: white;
border-bottom: 1px solid #d71514;
> div {
margin: 0 1rem;
height: 100%;
padding: 0 3rem;
display: flex;
align-items: center;
font-size: 1.2rem;
font-weight: bold;
color: #d71514;
&:hover {
color: white;
background-color: #d71514;
}
}
}
</style>

View File

@@ -2,12 +2,17 @@
<div class="popover"> <div class="popover">
<div class="popover-content" @click="hidePopover" v-touch:swipe.left="backwards" v-touch:swipe.right="forwards"> <div class="popover-content" @click="hidePopover" v-touch:swipe.left="backwards" v-touch:swipe.right="forwards">
<div class="image-container"> <div class="image-container">
<img :src="album[index].url.replace('thumb', 'lg')" /> <picture>
<source :srcset="album[index].url"
media="(min-width: 1200px)">
<source :srcset="album[index].url.replace('_lg.', '_md.')"
media="(min-width: 650px)">
<img :src="album[index].url.replace('_lg.', '_sm.')" />
</picture>
<div class="other-elements"> <!-- <div class="other-elements">
<p>There is something here</p> <p>There is something here</p>
</div> </div> -->
</div> </div>
</div> </div>
@@ -36,7 +41,7 @@ export default {
} }
}, },
destroyed() { destroyed() {
window.removeEventListener('keyup') window.removeEventListener('keyup', this.arrowNavigation)
document.ontouchmove = function (e) { document.ontouchmove = function (e) {
return true; return true;
}; };
@@ -166,7 +171,7 @@ export default {
.nav-arrow.left::before, .nav-arrow.left::after { .nav-arrow.left::before, .nav-arrow.left::after {
left: 0; left: 0;
border-left: solid 1.5px rgba(255,255,255,.9); border-left: solid 2.5px rgba(255,255,255,.9);
} }
.nav-arrow.left::before { .nav-arrow.left::before {
@@ -182,7 +187,7 @@ export default {
} }
.nav-arrow.right::before, .nav-arrow.right::after { .nav-arrow.right::before, .nav-arrow.right::after {
border-right: solid 1.5px rgba(255,255,255,.9); border-right: solid 2.5px rgba(255,255,255,.9);
right: 0; right: 0;
} }

View File

@@ -1,15 +1,15 @@
<template> <template>
<div class="calendar--day" @click="$emit('click')"> <div class="calendar--day" @click="clickedEvent(null)" v-bind:class="{ empty: day.events.length === 0 }">
<div <div
class="calendar--date" class="calendar--date"
v-bind:style="{ color: color }" v-bind:style="{ color: color }"
v-bind:class="{'currentDay': day.currentDay}"> v-bind:class="{'currentDay': day.currentDay}">
{{ day.date }} {{ day.date }}
</div> </div>
<div v-if="day.events.length" v-for="event in day.events" class="calendar--event"> <div v-if="day.events.length > 0" v-for="(event, index) in day.events" class="calendar--event">
{{ event.title }} <span class="calendar--event-title" v-bind:style="{ backgroundColor: eventColors[index] }" @click="clickedEvent(event.id)">{{ event.title }}</span>
</div> </div>
</div> </div>
</template> </template>
@@ -37,13 +37,32 @@ export default {
'current': 'black', 'current': 'black',
'after': 'dimgray', 'after': 'dimgray',
'event': '#cb0b0b' 'event': '#cb0b0b'
} },
eventColors: ['orange', 'green', 'blue' ],
eventClicked: false
} }
}, },
created() { created() {
this.setColor() this.setColor()
}, },
methods: { methods: {
clickedEvent(id) {
if (this.eventClicked) return
if (id) {
this.eventClicked = true;
this.$router.push({ name: 'EditEvent', query: { id } })
} else {
this.$router.push({ name: 'EditEvent', params: { formData: {
title: undefined,
dateStart: this.day.m,
dateEnd: undefined,
locationName: undefined,
subtext: undefined
} } })
}
},
setColor() { setColor() {
if (this.day.events.length) { if (this.day.events.length) {
this.color = this.states['event'] this.color = this.states['event']
@@ -58,50 +77,64 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.calendar { .calendar {
&--day { .empty {
border: 0.5px solid rgba(0,0,0,.2); @media screen and (max-width: 400px) {
min-height: 2rem; display: none;
@media screen and (min-width: 400px) {
min-height: 4rem;
}
@media screen and (min-width: 1100px) {
min-height: 5.6rem;
}
&:hover {
cursor: pointer;
} }
} }
&--date { &--day {
display: inline-block; border: 0.5px solid rgba(0,0,0,.2);
min-height: 6rem;
min-width: 6rem;
}
text-align: right; &--date {
width: 100%;
float: right; float: right;
text-align: right;
margin-top: .6rem; margin-top: .6rem;
margin-right: .6rem; margin-right: .6rem;
margin-bottom: .6rem;
font-weight: 600; font-weight: 600;
font-size: 0.95rem; font-size: 0.95rem;
@media screen and (max-width: 400px) {
width: unset;
float: left;
margin-left: 0.5rem;
}
} }
& .currentDay { & .currentDay {
background-color: #cb0b0b; background-color: #cb0b0b;
border-radius: 50%; border-radius: 50%;
height: 21px; height: 21px;
width: 24px; width: 21px;
margin-top: 0.35rem; margin-top: 0.35rem;
padding-top: 0.35rem; padding-top: 0.32rem;
margin-right: 0.3rem; margin-right: 0.32rem;
padding-right: 0.2rem; padding-right: 0.35rem;
color: ghostwhite !important; color: ghostwhite !important;
} }
&--event { &--event {
margin: 0.5rem; margin: 0.3rem 0;
font-size: 0.8rem;
width: 100%; &:hover {
cursor: pointer;
}
&-title {
margin: 0 0.5rem;
padding: 0.15rem 0.3rem;
font-size: 0.95rem;
text-transform: capitalize;
background-color: #d71514;
color: white;
display: flex;
border-radius: 2px;
}
@media screen and (max-width: 400px) { @media screen and (max-width: 400px) {
font-size: unset; font-size: unset;

View File

@@ -3,7 +3,7 @@
<h1>Summary</h1> <h1>Summary</h1>
<div v-for="event in events" class="list-item"> <div v-for="event in events" class="list-item">
<router-link :to="{ name: 'EventPage', query: { id: event.id }}"> <router-link :to="{ name: 'EditEvent', query: { id: event.id }}">
<h2>{{event.title}}</h2> <h2>{{event.title}}</h2>
<p>{{ dateToDayMonthYear(event.dateStart) }} - {{ dateToDayMonthYear(event.dateEnd) }}</p> <p>{{ dateToDayMonthYear(event.dateStart) }} - {{ dateToDayMonthYear(event.dateEnd) }}</p>

30
src/scss/buttons.scss Normal file
View File

@@ -0,0 +1,30 @@
.button {
-webkit-appearance: none;
-webkit-backface-visibility: none;
border: 2.5px solid #c91119;
border-radius: 3px;
// color: rgb(255, 255, 255);
background-color: white;
color: #c91119;
cursor: pointer;
font-size: 14px;
font-weight: 600;
height: 42px;
letter-spacing: 1px;
line-height: 14px;
margin-left: -10px;
padding: 0 1rem;
text-transform: uppercase;
transition-delay: 0s;
transition-duration: 0.1s;
transition-property: opacity;
transition-timing-function: linear;
vertical-align: baseline;
white-space: pre;
writing-mode: horizontal-tb;
&:hover, &:active, &:focus {
color: white;
background-color: #c91119;
}
}

View File

@@ -16,6 +16,13 @@ html, body {
a { a {
cursor: pointer; cursor: pointer;
font-family: 'Ambroise std demi';
font-style: normal;
color: #3b70a2;
&:visited {
color: #3b70a2;
}
} }
#app { #app {

0
src/scss/variables.scss Normal file
View File

View File

@@ -6,7 +6,8 @@ Vue.use(Vuex)
const state = { const state = {
popover: false, popover: false,
popoverAlbum: [], popoverAlbum: [],
popoverAlbumIndex: 0, popoverAlbumLength: 0,
popoverAlbumIndex: 0
} }
const mutations = { const mutations = {
@@ -20,18 +21,20 @@ const mutations = {
setPopoverAlbum (state, album) { setPopoverAlbum (state, album) {
state.popoverAlbum = album; state.popoverAlbum = album;
state.popoverAlbumLength = album.length - 1;
}, },
setPopoverAlbumIndex (state, index) { setPopoverAlbumIndex (state, index) {
state.popoverAlbumIndex = index; state.popoverAlbumIndex = index;
console.log('new index', index);
}, },
incrementPopoverImage (state) { incrementPopoverImage (state) {
let index = state.popoverAlbumIndex; let index = state.popoverAlbumIndex;
index++
console.log('Setting popover index:', index)
if (index > state.popoverAlbum.length - 1) { if (index < state.popoverAlbumLength) {
index++;
} else {
index = 0; index = 0;
} }
@@ -40,11 +43,11 @@ const mutations = {
decrementPopoverImage (state) { decrementPopoverImage (state) {
let index = state.popoverAlbumIndex; let index = state.popoverAlbumIndex;
index--
console.log('Setting popover index:', index)
if (index < 0) { if (index > 0) {
index = state.popoverAlbum.length - 1; index--;
} else {
index = state.popoverAlbumLength;
} }
state.popoverAlbumIndex = index; state.popoverAlbumIndex = index;
@@ -55,8 +58,8 @@ const mutations = {
const actions = { const actions = {
showPopover: ({ commit }) => commit('showPopover'), showPopover: ({ commit }) => commit('showPopover'),
hidePopover: ({ commit }) => commit('hidePopover'), hidePopover: ({ commit }) => commit('hidePopover'),
setPopoverAlbum: ({ commit }, payload) => commit('setPopoverAlbum', payload), setPopoverAlbum: ({ commit }, images) => commit('setPopoverAlbum', images),
setPopoverAlbumIndex: ({ commit }, payload) => commit('setPopoverAlbumIndex', payload), setPopoverAlbumIndex: ({ commit }, index) => commit('setPopoverAlbumIndex', index),
incrementPopoverImage: ({ commit }) => commit('incrementPopoverImage'), incrementPopoverImage: ({ commit }) => commit('incrementPopoverImage'),
decrementPopoverImage: ({ commit }) => commit('decrementPopoverImage'), decrementPopoverImage: ({ commit }) => commit('decrementPopoverImage'),

View File

@@ -1,9 +1,10 @@
import axios from 'axios' import axios from 'axios'
const BASE_URL = 'http://localhost:5000/api/' // const BASE_URL = 'http://localhost:5000/api/'
const BASE_URL = 'https://api.leifsopplevelser.no/api/'
function adventureList() { function adventureList(sort='desc') {
const url = BASE_URL + 'adventure'; const url = BASE_URL + `adventure?sort=${sort}`;
return fetch(url) return fetch(url)
.then(resp => resp.json()) .then(resp => resp.json())

1779
yarn.lock

File diff suppressed because it is too large Load Diff