catalog editor: add validation and exit dialog

This commit is contained in:
Seth Ladygo
2019-05-17 02:16:58 -07:00
parent c9e0ed6d4f
commit d1aca308ba
3 changed files with 154 additions and 40 deletions

View File

@ -1,61 +1,84 @@
<template> <template>
<v-stepper v-model="step"> <v-form ref="form" v-model="valid">
<v-stepper v-model="step">
<Loading text="Loading" :show="loadingCatalog"/> <Loading text="Loading" :show="loadingCatalog"/>
<v-stepper-header ma-0 pa-0> <v-stepper-header ma-0 pa-0>
<v-stepper-step :complete="step > 1" step="1">Catalog info</v-stepper-step> <v-stepper-step :complete="step > 1" step="1">Catalog info</v-stepper-step>
<v-divider></v-divider> <v-divider></v-divider>
<v-stepper-step :complete="step > 2" step="2">Contents</v-stepper-step> <v-stepper-step :complete="step > 2" step="2">Contents</v-stepper-step>
<v-divider></v-divider> <!-- <v-divider></v-divider>
<v-stepper-step step="3">Pagination</v-stepper-step> <v-stepper-step step="3">Pagination</v-stepper-step> -->
</v-stepper-header> </v-stepper-header>
<v-stepper-items> <v-stepper-items>
<v-stepper-content step="1"> <v-stepper-content step="1">
<!-- <CatalogInfo/> --> <CatalogInfo/>
<CatalogContents/> <v-spacer></v-spacer>
<v-btn flat>Cancel</v-btn> <v-btn flat @click="popExit()">Cancel</v-btn>
<v-btn @click="step = 1" disabled>Back</v-btn> <v-tooltip top>
<v-btn @click="step = 2" color="primary" class="black--text">Next</v-btn> <template v-slot:activator="{ on }">
</v-stepper-content> <v-btn
v-on="on"
:disabled="!valid"
@click="step = 2"
color="primary"
class="black--text">Next</v-btn>
</template>
<span>{{ nextTooltipText }}</span>
</v-tooltip>
</v-stepper-content>
<v-stepper-content step="2"> <v-stepper-content step="2">
<CatalogContents/> <CatalogContents/>
<v-btn flat>Cancel</v-btn> <v-spacer></v-spacer>
<v-btn @click="step = 1">Back</v-btn> <v-btn flat @click="popExit()">Cancel</v-btn>
<v-btn @click="step = 3" color="primary" class="black--text">Next</v-btn> <v-btn @click="step = 1">Back</v-btn>
</v-stepper-content> <!-- <v-btn @click="step = 3" color="primary" class="black--text">Next</v-btn> -->
<v-btn
:disabled="!valid"
:loading="savingCatalog"
@click.stop="saveCatalog()"
color="primary"
class="black--text">Done</v-btn>
</v-stepper-content>
<v-stepper-content step="3"> <!-- <v-stepper-content step="3">
<v-card <CatalogPagination/>
class="mb-5" <v-btn flat>Cancel</v-btn>
color="grey lighten-1" <v-btn @click="step = 2">Back</v-btn>
height="200px" <v-btn color="primary" class="black--text">Save</v-btn>
></v-card> </v-stepper-content> -->
</v-stepper-items>
<v-btn flat>Cancel</v-btn> </v-stepper>
<v-btn @click="step = 2">Back</v-btn>
<v-btn color="primary" class="black--text">Save</v-btn>
</v-stepper-content>
</v-stepper-items>
</v-stepper> <ExitEditorDialog v-model="showExitEditorPopup"/>
</v-form>
</template> </template>
<script> <script>
import Loading from './Loading' import Loading from './Loading'
import CatalogInfo from './CatalogInfo' import CatalogInfo from './CatalogInfo'
import CatalogContents from './CatalogContents' import CatalogContents from './CatalogContents'
/* import CatalogPagination from './CatalogPagination' */
import ExitEditorDialog from './ExitEditorDialog'
export default { export default {
components: { components: {
Loading, Loading,
CatalogInfo, CatalogInfo,
CatalogContents CatalogContents,
/* CatalogPagination, */
ExitEditorDialog,
}, },
data: () => ({ data: () => ({
step: 1, step: 1,
valid: false, // is the whole editor in a valid state?
nextTooltipText: 'asd',
showExitEditorPopup: false,
}), }),
computed: { computed: {
loadingCatalog() { loadingCatalog() {
@ -66,6 +89,9 @@ export default {
}, },
}, },
methods: { methods: {
popExit: function(id) {
this.showExitEditorPopup = true
},
saveCatalog() { saveCatalog() {
this.$store.dispatch('saveCatalog') this.$store.dispatch('saveCatalog')
}, },

View File

@ -20,13 +20,25 @@
label="Region"></v-select> label="Region"></v-select>
</v-flex> </v-flex>
<v-flex d-flex grow> <v-flex d-flex grow>
<v-text-field v-model="name" label="Catalog name" required></v-text-field> <v-text-field
v-model="name"
label="Catalog name"
:rules="[rules.required]"
></v-text-field>
</v-flex>
<v-flex d-flex shrink>
<v-text-field
v-model="email"
:rules="[rules.emailRules]"
label="Email"
></v-text-field>
</v-flex> </v-flex>
</v-layout> </v-layout>
<v-layout row> <v-layout row>
<!-- TODO only if admin! --> <!-- TODO only if admin! -->
<v-flex d-flex shrink> <v-flex d-flex shrink v-if="isAdmin">
<v-checkbox v-model="master" label="Region master"></v-checkbox> <v-checkbox v-model="master" label="Region master"></v-checkbox>
</v-flex> </v-flex>
<v-flex d-flex shrink> <v-flex d-flex shrink>
@ -40,8 +52,6 @@
</v-flex> </v-flex>
</v-layout> </v-layout>
<!-- TODO: email selects -->
</v-layout> </v-layout>
</v-container> </v-container>
</template> </template>
@ -49,11 +59,30 @@
<script> <script>
var seasons = JSON.parse(document.getElementById('seasons').textContent) var seasons = JSON.parse(document.getElementById('seasons').textContent)
var regions = JSON.parse(document.getElementById('regions').textContent) var regions = JSON.parse(document.getElementById('regions').textContent)
var lazyUser = JSON.parse(document.getElementById('lazyUser').textContent)
export default { export default {
data: () => ({ data: () => ({
seasons: seasons, seasons: seasons,
regions: regions, regions: regions,
isAdmin: true, // TODO
rules: {
required: value => {
return !!value || 'Required'
},
emailRules: value => {
if (!lazyUser) {
// signed-up user doesn't need email
return true
}
if (!value) {
return 'Required'
} else {
const pattern = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
return pattern.test(value) || 'Invalid email'
}
},
},
}), }),
computed: { computed: {
name: { name: {
@ -65,6 +94,15 @@ export default {
} }
}, },
email: {
get() {
return this.$store.getters.catalogProperty('email')
},
set(email) {
this.$store.dispatch('setCatalogProperty', { key: 'email', value: email })
}
},
season: { season: {
get() { get() {
return this.$store.getters.catalogProperty('season') return this.$store.getters.catalogProperty('season')

View File

@ -0,0 +1,50 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="show" persistent max-width="280">
<v-card>
<v-card class="subheading font-weight-bold ma-0 pa-0 white--text" color="keen_dark_grey">
<v-card-title class="ma-0 pa-2 pl-3">
Quit Editor
<v-spacer></v-spacer>
<v-icon color="white" @click="show = false">clear</v-icon>
</v-card-title>
</v-card>
<v-card-text>
Abandon changes and return to the catalog list?
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn flat @click="show = false">Back to editing</v-btn>
<v-btn flat href="/catalogs">Quit</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
// https://stackoverflow.com/questions/48035310/open-a-vuetify-dialog-from-a-component-template-in-vuejs
export default {
data: () => ({
}),
props: {
value: Boolean,
},
computed: {
show: {
get() {
return this.value
},
set(value) {
this.$emit('input', value)
}
},
},
}
</script>
<style>
</style>