Add stop names in favourite save dialog
This commit is contained in:
parent
6df7bdbea0
commit
253b206a39
@ -35,6 +35,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/mapbox-gl-leaflet": "^0.0.1",
|
||||
"@types/uuid": "^3.4.6",
|
||||
"@types/workbox-window": "^4.3.3",
|
||||
"babel-minify-webpack-plugin": "^0.3.1",
|
||||
"clean-webpack-plugin": "^3.0.0",
|
||||
|
@ -1,14 +1,21 @@
|
||||
<form class="favourite-add-form" @submit="save">
|
||||
<label for="favourite_add_name">Nazwa</label>
|
||||
<div class="input-group">
|
||||
<input class="form-control form-control-sm" placeholder="np. Z pracy"
|
||||
:class="{ 'is-invalid': errors.name.length > 0 }" id="favourite_add_name"
|
||||
v-model="name" v-autofocus/>
|
||||
<button class="btn btn-sm btn-dark" type="submit">
|
||||
<fa :icon="['fal', 'check']"></fa>
|
||||
</button>
|
||||
<div v-if="errors.name.length > 0" class="invalid-feedback">
|
||||
<p v-for="error in errors.name">{{ error }}</p>
|
||||
<div class="form-group">
|
||||
<label for="favourite_add_name">Nazwa</label>
|
||||
<div class="input-group">
|
||||
<input class="form-control form-control-sm" placeholder="np. Z pracy"
|
||||
:class="{ 'is-invalid': errors.name.length > 0 }" id="favourite_add_name"
|
||||
v-model="name" v-autofocus/>
|
||||
<button class="btn btn-sm btn-dark" type="submit">
|
||||
<fa :icon="['fal', 'check']"></fa>
|
||||
</button>
|
||||
<div v-if="errors.name.length > 0" class="invalid-feedback">
|
||||
<p v-for="error in errors.name">{{ error }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="favourite__stops">
|
||||
<li class="favourite__stop" v-for="stop in stops" :key="stop.id">
|
||||
<stop :stop="stop"/>
|
||||
</li>
|
||||
</ul>
|
||||
</form>
|
||||
|
@ -1,5 +1,32 @@
|
||||
@include media-breakpoint-up('sm') {
|
||||
.favourite-add-form {
|
||||
width: 250px;
|
||||
width: 300px;
|
||||
}
|
||||
}
|
||||
|
||||
.favourite__stops {
|
||||
display: block;
|
||||
white-space: nowrap;
|
||||
padding-left: 0;
|
||||
font-size: $small-font-size;
|
||||
overflow-x: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.favourite__stop {
|
||||
display: inline-flex;
|
||||
|
||||
&::after {
|
||||
content: ", ";
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
&:last-child::after {
|
||||
content: none;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
@ -5,3 +5,7 @@ label {
|
||||
margin-top: -0.2rem;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.form-group:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
@ -7,10 +7,7 @@
|
||||
.stop__name {
|
||||
flex: 1 0;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.stop__variant {
|
||||
margin: 0 .5rem;
|
||||
margin-right: .5em;
|
||||
}
|
||||
|
||||
.stop__actions {
|
||||
|
@ -1,33 +1,46 @@
|
||||
import Vue from 'vue'
|
||||
import { Component } from 'vue-property-decorator'
|
||||
import { namespace } from "vuex-class";
|
||||
import { Component, Prop } from 'vue-property-decorator'
|
||||
import { namespace, State } from "vuex-class";
|
||||
import { Favourite } from "../store/favourites";
|
||||
import { SavedState } from "../store/root";
|
||||
import { Stop } from "../model";
|
||||
import * as uuid from "uuid";
|
||||
import { Favourites } from "../store";
|
||||
|
||||
const { State, Mutation } = namespace('favourites');
|
||||
|
||||
@Component({ template: require('../../components/favourites.html' )})
|
||||
export class FavouritesComponent extends Vue {
|
||||
@State favourites: Favourite[];
|
||||
@Mutation remove: (fav: Favourite) => void;
|
||||
@Favourites.State favourites: Favourite[];
|
||||
@Favourites.Mutation remove: (fav: Favourite) => void;
|
||||
|
||||
choose(favourite: Favourite) {
|
||||
this.$store.dispatch('load', favourite.state);
|
||||
}
|
||||
}
|
||||
|
||||
function createFavouriteEntry(name: string, stops: Stop[]): Favourite {
|
||||
return {
|
||||
id: uuid.v4(),
|
||||
name,
|
||||
stops,
|
||||
state: {
|
||||
version: 1,
|
||||
stops: stops.map(stop => stop.id),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@Component({ template: require('../../components/favourites/save.html' )})
|
||||
export class FavouritesAdderComponent extends Vue {
|
||||
@State stops: Stop[];
|
||||
|
||||
private name = "";
|
||||
private errors = { name: [] };
|
||||
|
||||
@Mutation add: (fav: Favourite) => void;
|
||||
@Favourites.Mutation add: (favourite: Favourite) => void;
|
||||
|
||||
async save() {
|
||||
const state = await this.$store.dispatch('save') as SavedState;
|
||||
const name = this.name;
|
||||
|
||||
const favourite: Favourite = { name, state };
|
||||
const favourite: Favourite = createFavouriteEntry(this.name, this.stops);
|
||||
|
||||
if (this.validate(favourite)) {
|
||||
this.add(favourite);
|
||||
|
@ -1,9 +1,12 @@
|
||||
import { RootState, SavedState } from "./root";
|
||||
import { Module, Plugin, Store } from "vuex";
|
||||
import * as utils from "../utils";
|
||||
import { Stop } from "../model";
|
||||
|
||||
export interface Favourite {
|
||||
id: string;
|
||||
name: string;
|
||||
stops: Stop[];
|
||||
state: SavedState;
|
||||
}
|
||||
|
||||
@ -34,4 +37,4 @@ export const localStorageSaver = (path: string, key: string): Plugin<any> => (st
|
||||
})
|
||||
};
|
||||
|
||||
export default favourites;
|
||||
export default favourites;
|
||||
|
@ -6,6 +6,7 @@ import favourites, { FavouritesState, localStorageSaver } from './favourites'
|
||||
|
||||
import { state, mutations, actions, RootState } from "./root";
|
||||
import VuexPersistence from "vuex-persist";
|
||||
import { namespace } from "vuex-class";
|
||||
|
||||
export type State = {
|
||||
messages: MessagesState;
|
||||
@ -34,3 +35,5 @@ const store = new Vuex.Store({
|
||||
});
|
||||
|
||||
export default store;
|
||||
|
||||
export const Favourites = namespace('favourites');
|
||||
|
@ -308,6 +308,13 @@
|
||||
dependencies:
|
||||
source-map "^0.6.1"
|
||||
|
||||
"@types/uuid@^3.4.6":
|
||||
version "3.4.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.6.tgz#d2c4c48eb85a757bf2927f75f939942d521e3016"
|
||||
integrity sha512-cCdlC/1kGEZdEglzOieLDYBxHsvEOIg7kp/2FYyVR9Pxakq+Qf/inL3RKQ+PA8gOlI/NnL+fXmQH12nwcGzsHw==
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/webpack-sources@*":
|
||||
version "0.1.5"
|
||||
resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92"
|
||||
|
Loading…
Reference in New Issue
Block a user