sajjad_talkhabi 3 years ago
parent b001b7a7d9
commit 6407154954

@ -1,38 +1,16 @@
// import axios from "axios"; import axios from "axios";
// import url from "@/router/url"; import url from "@/router/url";
// import { getJson, setData } from "../resources/FileResource"; import { getJson, setData } from "../resources/FileResource";
// export default class FileRepository { export default class FileRepository {
// async store(data) { async store(data) {
// console.log('data', data); console.log('data', data);
// const formData = setData(data); const formData = setData(data);
// let response = await axios.post(url("storeFile"), formData); console.log(formData);
// if (response.status === 200) { let response = await axios.post(url("storeFile"), formData);
// return getJson(response.data.data); if (response.status === 200) {
// } return getJson(response.data.data);
// } }
}
// async destroy(fileId) { }
// let response = await axios.delete(url("destroyFile", {file: fileId}));
// if (response.status === 200) {
// return true;
// }
// }
// async verifyImage(fileId) {
// await axios.post(url("verifyImage",{file:fileId}) );
// }
// async unverifyImage(fileId) {
// await axios.post(url("unverifyImage", {file: fileId}));
// }
// async pdfVerify(imageId) {
// await axios.post(url("pdfVerify",{media:imageId}) );
// }
// async pdfUnVerify(imageId) {
// await axios.post(url("pdfUnVerify",{media:imageId}) );
// }
// }

@ -2,6 +2,8 @@ import axios from "axios";
import url from "@/router/url"; import url from "@/router/url";
import { import {
getArray, getArray,
getJson,
setData
} from "../resources/programResource"; } from "../resources/programResource";
export default class ProgramRepository { export default class ProgramRepository {
async index() { async index() {
@ -12,4 +14,11 @@ export default class ProgramRepository {
return getArray(response.data); return getArray(response.data);
} }
} }
async store(data) {
let json = setData(data);
let response = await axios.post(url("storeProgram"), json);
if (response.status === 201) {
return getJson(response.data);
}
}
} }

@ -1,6 +1,6 @@
import axios from "axios"; import axios from "axios";
import url from "@/router/url"; import url from "@/router/url";
import { getArray } from "../resources/sportCategoriesResource"; import { getArray, getJson } from "../resources/sportCategoriesResource";
export default class SportCategoriesRepository { export default class SportCategoriesRepository {
async index() { async index() {
let response = await axios.get(url("indexSportCategories")); let response = await axios.get(url("indexSportCategories"));
@ -8,4 +8,10 @@ export default class SportCategoriesRepository {
return getArray(response.data); return getArray(response.data);
} }
} }
async show(sportCategoryId) {
let response = await axios.get(url("showSportCategory", { sportCategory: sportCategoryId }));
if (response.status === 200) {
return getJson(response.data.data);
}
}
} }

@ -4,7 +4,6 @@ import { getArray, setQuery } from "../resources/workoutCategoriesResources";
export default class WorkoutCategoriesRepository { export default class WorkoutCategoriesRepository {
async index(data) { async index(data) {
let params = setQuery(data); let params = setQuery(data);
console.log(params);
let response = await axios.get(url("indexWorkoutCategories"), { params }); let response = await axios.get(url("indexWorkoutCategories"), { params });
if (response.status === 200) { if (response.status === 200) {
return getArray(response.data); return getArray(response.data);

@ -8,14 +8,29 @@ export default class WorkoutRepository {
return getArray(response.data); return getArray(response.data);
} }
} }
async show(workoutId) {
let response = await axios.get(url("showWorkout", { workout: workoutId }));
if (response.status === 200) {
return getJson(response.data.data);
}
}
async store(data) { async store(data) {
let json = setData(data); let json = setData(data);
let response = await axios.post(url("storeWorkout"), json); let response = await axios.post(url("storeWorkout"), json);
console.log('kldsbhakjbg', response.data);
if (response.status === 201) { if (response.status === 201) {
return getJson(response.data); return getJson(response.data);
} }
} }
async update(workoutId, data) {
let json = setData(data, true);
let response = await axios.post(
url("updateWorkout", { workout: workoutId }),
json
);
if (response.status === 200) {
return response.data.data;
}
}
async delete(workoutId) { async delete(workoutId) {
await axios.delete(url("destroyWorkout", { workout: workoutId })); await axios.delete(url("destroyWorkout", { workout: workoutId }));
} }

@ -1,16 +1,14 @@
// import { objectToFormData } from "@/utils/objectToFormData"; import { objectToFormData } from "@/utils/objectToFormData";
// export const getJson = (data) => ({ export const getJson = (data) => ({
// id: data.id, id: data.id,
// thumbnail: data.thumbnail, url: data.url,
// image: data.image, });
// mime_type: data.mime_type,
// file_name: data.file_name,
// size: data.size,
// });
// export const setData = (data) => ( export const setData = (data) => (
// objectToFormData({ objectToFormData({
// file: data.file, media: data.media.file,
// crop: data.crop, crop: data.crop,
// })); batch_id: data.batch_id,
collection: data.collection,
}));

@ -1,19 +1,33 @@
import { SetPagination } from "@/utils/setQueriesObject"; import { SetPagination } from "@/utils/setQueriesObject";
import { getJsonTrainer } from './trainerProgramResource'; import { getJsonTrainer } from './trainerProgramResource';
import { getJsonSportCategory } from './sportCategoryPorgramResource'; import { getJsonSportCategory } from './sportCategoryPorgramResource';
import { objectToFormData } from "@/utils/objectToFormData";
export const getJson = (data) => ({ export const getJson = (data) => ({
id: data.id, id: data.id,
trainer: data.trainer ? getJsonTrainer(data.trainer) : {}, trainer: data.trainer ? getJsonTrainer(data.trainer) : {},
sport_category: data.trainer ? getJsonSportCategory(data.trainer) : {}, sport_category: data.trainer ? getJsonSportCategory(data.trainer) : {},
sport_category_id: data.sport_category_id, sport_category_id: data.sport_category_id,
thumbnail: data.thumbnail,
verified: data.verified,
status: data.status, status: data.status,
title: data.title, title: data.title,
description: data.description, description: data.description,
created_at: data.created_at, series_count: data.series_count,
updated_at: data.updated_at, workouts_count: data.workouts_count,
series_count: data.series_count
}); });
export const setData = (data, isUpdate = false) => {
let formData = {
sport_category_id: data.sport_category_id,
title: data.title,
description: data.description,
tags: data.tags,
batch_id: data.batch_id
};
if (isUpdate) {
formData["_method"] = "put";
}
return objectToFormData(formData);
};
export const getArray = ({ data, meta }) => { export const getArray = ({ data, meta }) => {
const pagination = SetPagination(meta); const pagination = SetPagination(meta);
data = data.map((program) => getJson(program)); data = data.map((program) => getJson(program));

@ -3,12 +3,12 @@ export const getJson = (data) => ({
id: data.id, id: data.id,
local_name: data.local_name, local_name: data.local_name,
name: data.name, name: data.name,
workout_category_id: data.workout_category.id,
sport_category_id: data.workout_category.sport_category ? data.workout_category.sport_category.id : null,
description: data.description, description: data.description,
suggestion_default: { suggested_per_set: data.suggested_per_set,
suggested_per_ste: data.suggestion_default.suggested_per_set, suggested_set: data.suggested_set,
suggested_set: data.suggestion_default.suggested_set, suggested_time: data.suggested_time,
suggested_time: data.suggestion_default.suggested_time,
},
tags: data.tags, tags: data.tags,
thumbnail: data.thumbnail, thumbnail: data.thumbnail,
title: data.title, title: data.title,
@ -16,6 +16,7 @@ export const getJson = (data) => ({
}); });
export const setData = (data, isUpdate = false) => { export const setData = (data, isUpdate = false) => {
let formData = { let formData = {
id: data.id,
workout_category_id: data.workout_category_id, workout_category_id: data.workout_category_id,
name: data.name, name: data.name,
local_name: data.local_name, local_name: data.local_name,
@ -25,7 +26,7 @@ export const setData = (data, isUpdate = false) => {
suggested_per_set: data.suggested_per_set, suggested_per_set: data.suggested_per_set,
suggested_set: data.suggested_set, suggested_set: data.suggested_set,
suggested_time: data.suggested_time, suggested_time: data.suggested_time,
thumbnail: data.thumbnail, batch_id: data.batch_id,
tags: data.tags, tags: data.tags,
}; };
if (isUpdate) { if (isUpdate) {
@ -34,7 +35,7 @@ export const setData = (data, isUpdate = false) => {
return objectToFormData(formData); return objectToFormData(formData);
}; };
export const getArray = ({ data }) => { export const getArray = ({ data }) => {
data = data.map((workout) => getJson(workout)); data = data.map((workout) => getJson(workout));
return { data }; return { data };
}; };

@ -14,28 +14,31 @@
<v-row class="mt-4"> <v-row class="mt-4">
<v-col cols="3"> <v-col cols="3">
<div class="h-100"> <div class="h-100">
<div class="add__workout dark w-100 h-100"> <div class="add__program dark w-100 h-100">
<div class="add__workout__picture d-flex align-center"> <ImageCropper
<i class="WMi-picture add__workout__picture--icon"></i> label="manager image"
<div class="add__workout__picture--text"> :url.sync="form.thumbnail"
select a cover image v-model="fileForm.media"
</div> />
</div>
</div> </div>
</div> </div>
</v-col> </v-col>
<v-col cols="9"> <v-col cols="9">
<v-row> <v-row>
<v-col cols="4" <v-col cols="4"
><v-text-field ><v-autocomplete
placeholder="product name"
label="product name"
class="no-error-msg pt-0 mt-0"
dark dark
></v-text-field> class="mt-0 pt-0"
item-text="name"
item-value="id"
label="program category"
:items="getSportCategories"
v-model="form.sport_category_id"
></v-autocomplete>
</v-col> </v-col>
<v-col cols="8" <v-col cols="8"
><v-text-field ><v-text-field
v-model="form.title"
placeholder="a short quote" placeholder="a short quote"
label="a short quote" label="a short quote"
class="no-error-msg pt-0 mt-0" class="no-error-msg pt-0 mt-0"
@ -46,6 +49,7 @@
<v-row> <v-row>
<v-col cols="12"> <v-col cols="12">
<v-textarea <v-textarea
v-model="form.description"
rows="5" rows="5"
label="description" label="description"
placeholder="description" placeholder="description"
@ -60,25 +64,32 @@
<v-col cols="12"> <v-col cols="12">
<v-row> <v-row>
<v-col cols="12"> <v-col cols="12">
<v-autocomplete <v-combobox
class="pt-0 multiple" v-model="form.tags"
:items="items" clearable
item-value="id"
item-text="name"
attach
:append-icon="null" :append-icon="null"
chips hide-selected
label="product tags - useful for better search" class="multiple"
placeholder="product tags - useful for better search" label="program tags - useful for better search"
placeholder="program tags - useful for better search"
multiple multiple
persistent-hint
small-chips
dark dark
> >
<template #selection="{ item }"> <template #selection="{ item, select }">
<v-chip label small color="white" text-color="black">{{ <v-chip
item.name label
}}</v-chip> small
color="white"
text-color="black"
close
@click="select"
@click:close="removeTags(item)"
>{{ item }}</v-chip
>
</template> </template>
</v-autocomplete> </v-combobox>
</v-col> </v-col>
</v-row> </v-row>
</v-col> </v-col>
@ -86,16 +97,19 @@
<div class="mt-2"> <div class="mt-2">
<v-divider dark class="mb-2"></v-divider> <v-divider dark class="mb-2"></v-divider>
<div class="d-flex justify-space-between"> <div class="d-flex justify-space-between">
<router-link :to="{ name: 'programs' }">
<RectangleButton
text="IVE CHANGED MY MIND"
icon="WMi-cancel"
class="px-0"
height="19"
/>
</router-link>
<RectangleButton <RectangleButton
text="IVE CHANGED MY MIND" text="add the program"
icon="WMi-cancel"
class="px-0"
height="19"
/>
<RectangleButton
text="add the product"
class="custom-btn add-btn" class="custom-btn add-btn"
height="25" height="25"
@click.native="submit"
/> />
</div> </div>
</div> </div>
@ -105,26 +119,55 @@
</template> </template>
<script> <script>
import SectionTitle from "../Global/Section/SectionTitle.vue"; import SectionTitle from "../Global/Section/SectionTitle.vue";
import ImageCropper from "../Global/Input/ImageCropper.vue";
import FileRepository from "../../abstraction/repository/FileRepository";
import { mapGetters, mapActions } from "vuex";
import { makeid } from "@/utils/math";
const RANDOM_TOKEN = makeid(50);
export default { export default {
components: { components: {
SectionTitle, SectionTitle,
ImageCropper,
}, },
data: () => ({ data: () => ({
items: [ form: {
{ batch_id: RANDOM_TOKEN,
id: 1, },
name: "fkskad", fileForm: {
}, batch_id: RANDOM_TOKEN,
{ collection: "thumbnail",
id: 2, },
name: "dasf",
},
],
}), }),
computed: {
...mapGetters("sportCategories", ["getSportCategories"]),
},
methods: {
...mapActions("sportCategories", ["loadSportCategories"]),
...mapActions("programs", ["addProgram"]),
async submit() {
try {
if (this.fileForm.media) {
let repository = new FileRepository();
await repository.store(this.fileForm);
}
this.addProgram(this.form);
} catch (e) {
return e;
}
},
removeTags(item) {
this.form.tags.splice(this.form.tags.indexOf(item), 1);
this.form.tags = [...this.form.tags];
},
},
created() {
this.loadSportCategories();
},
}; };
</script> </script>
<style scoped> <style scoped>
.add__workout, .add__program,
.upload { .upload {
border: 1px dotted var(--color-gray) !important; border: 1px dotted var(--color-gray) !important;
position: relative; position: relative;
@ -133,18 +176,19 @@ export default {
padding-right: 100px !important; padding-right: 100px !important;
padding-left: 100px !important; padding-left: 100px !important;
} }
.add__workout__picture { .add__program__picture {
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
width: 90%;
} }
.add__workout__picture--text { .add__program__picture--text {
width: max-content; width: max-content;
line-height: 18px; line-height: 18px;
text-transform: uppercase; text-transform: uppercase;
} }
.add__workout__picture--icon { .add__program__picture--icon {
font-size: 40px; font-size: 40px;
margin-right: 20px; margin-right: 20px;
} }

@ -7,7 +7,7 @@
backText="workouts" backText="workouts"
link="workouts" link="workouts"
icon="WMi-left-open" icon="WMi-left-open"
title="add a workout" :title="(workoutId ? 'edit' : 'add') + ' a workout'"
subTitle="let us know you better, it comes handy." subTitle="let us know you better, it comes handy."
/> />
</div> </div>
@ -16,8 +16,9 @@
<div class="pb-14 h-100"> <div class="pb-14 h-100">
<div class="add__workout dark w-100 h-100"> <div class="add__workout dark w-100 h-100">
<ImageCropper <ImageCropper
:url.sync="form.thumbnail"
label="manager image" label="manager image"
:url.sync="form.thumbnail"
v-model="fileForm.media"
/> />
</div> </div>
</div> </div>
@ -90,7 +91,7 @@
placeholder="suggested course time?" placeholder="suggested course time?"
label="suggested course time?" label="suggested course time?"
class="no-error-msg pt-0 mt-0" class="no-error-msg pt-0 mt-0"
v-model="form.suggested_time" v-model="form.suggested_set"
></v-text-field ></v-text-field
></v-col> ></v-col>
<v-col cols="2" <v-col cols="2"
@ -99,18 +100,16 @@
placeholder="suggested times each course?" placeholder="suggested times each course?"
label="suggested times each course?" label="suggested times each course?"
class="no-error-msg pt-0 mt-0" class="no-error-msg pt-0 mt-0"
v-model="form.suggested_set" v-model="form.suggested_per_set"
></v-text-field ></v-text-field
></v-col> ></v-col>
<v-col cols="2" <v-col cols="2">
><v-text-field <TimeInput
dark v-model="form.suggested_time"
class="no-error-msg pt-0 mt-0"
placeholder="suggested ESTIMATED TIME" placeholder="suggested ESTIMATED TIME"
label="suggested ESTIMATED TIME" label="suggested ESTIMATED TIME"
class="no-error-msg pt-0 mt-0" /></v-col>
v-model="form.suggested_per_set"
></v-text-field
></v-col>
<v-col cols="6" <v-col cols="6"
><v-text-field ><v-text-field
dark dark
@ -125,18 +124,28 @@
<v-col cols="12"> <v-col cols="12">
<v-combobox <v-combobox
v-model="form.tags" v-model="form.tags"
:search-input.sync="search" clearable
:append-icon="null"
hide-selected hide-selected
class="multiple"
label="Add some tags" label="Add some tags"
placeholder="Add some tags"
multiple multiple
persistent-hint persistent-hint
small-chips small-chips
dark dark
> >
<template #selection="{ item }"> <template #selection="{ item, select }">
<v-chip label small color="white" text-color="black">{{ <v-chip
item label
}}</v-chip> small
color="white"
text-color="black"
close
@click="select"
@click:close="removeTags(item)"
>{{ item }}</v-chip
>
</template> </template>
</v-combobox> </v-combobox>
</v-col> </v-col>
@ -146,15 +155,17 @@
<div class="mt-2"> <div class="mt-2">
<v-divider dark class="mb-2"></v-divider> <v-divider dark class="mb-2"></v-divider>
<div class="d-flex justify-space-between"> <div class="d-flex justify-space-between">
<router-link :to="{ name: 'workouts' }">
<RectangleButton
text="IVE CHANGED MY MIND"
icon="WMi-cancel"
class="px-0"
height="19"
/>
</router-link>
<RectangleButton <RectangleButton
text="IVE CHANGED MY MIND" :text="(workoutId ? 'update' : 'add') + ' the workout'"
icon="WMi-cancel" @click.native="submit"
class="px-0"
height="19"
/>
<RectangleButton
text="add the workout"
@click.native="add"
class="custom-btn add-btn" class="custom-btn add-btn"
height="25" height="25"
/> />
@ -167,46 +178,80 @@
<script> <script>
import SectionTitle from "../Global/Section/SectionTitle.vue"; import SectionTitle from "../Global/Section/SectionTitle.vue";
import ImageCropper from "../Global/Input/ImageCropper.vue"; import ImageCropper from "../Global/Input/ImageCropper.vue";
import FileRepository from "../../abstraction/repository/FileRepository";
import { mapActions, mapGetters } from "vuex"; import { mapActions, mapGetters } from "vuex";
import { makeid } from "@/utils/math";
const RANDOM_TOKEN = makeid(50);
export default { export default {
components: { components: {
SectionTitle, SectionTitle,
ImageCropper, ImageCropper,
}, },
data: () => ({ data: () => ({
search: null,
form: { form: {
get() { batch_id: RANDOM_TOKEN,
return this.value; },
}, fileForm: {
set(value) { batch_id: RANDOM_TOKEN,
this.$emit("input", value); collection: "thumbnail",
},
}, },
}), }),
computed: { computed: {
...mapGetters("sportCategories", ["getSportCategories"]), ...mapGetters("sportCategories", ["getSportCategories"]),
...mapGetters("workoutCategories", ["getWorkoutCategories"]), ...mapGetters("workoutCategories", ["getWorkoutCategories"]),
...mapGetters("workouts", ["getWorkout"]),
workoutId() {
return this.$route.params.id;
},
}, },
watch: { watch: {
"form.name"(val) { "form.name"(val) {
this.form.local_name = val; this.form.local_name = val;
}, },
$route(to) {
this.workoutId = to.params.workoutId;
},
}, },
methods: { methods: {
...mapActions("workouts", ["addWorkout"]), ...mapActions("workouts", ["addWorkout", "loadWorkout", "updateWorkout"]),
...mapActions("workoutCategories", ["loadWorkoutCategories"]), ...mapActions("workoutCategories", ["loadWorkoutCategories"]),
...mapActions("sportCategories", ["loadSportCategories"]), ...mapActions("sportCategories", ["loadSportCategories"]),
async add() { async submit() {
console.log(this.form); try {
this.addWorkout(this.form); if (this.fileForm.media) {
let repository = new FileRepository();
await repository.store(this.fileForm);
}
if (this.workoutId) {
this.updateWorkout(this.form);
} else {
this.addWorkout(this.form);
}
} catch (e) {
return e;
}
},
async load() {
await this.loadWorkout(this.workoutId);
this.form = this.getWorkout;
this.loadWorkoutCategories(this.form.sport_category_id);
}, },
changeSportCategories() { changeSportCategories() {
this.loadWorkoutCategories(this.form.sport_category_id); this.loadWorkoutCategories(this.form.sport_category_id);
}, },
removeTags(item) {
this.form.tags.splice(this.form.tags.indexOf(item), 1);
this.form.tags = [...this.form.tags];
},
}, },
created() { created() {
this.loadSportCategories(); this.loadSportCategories();
if (this.workoutId) {
this.load();
} else {
console.log("mo");
}
}, },
}; };
</script> </script>
@ -232,8 +277,4 @@ export default {
font-size: 40px; font-size: 40px;
} }
</style> </style>
<style> <style>
.v-autocomplete .v-input__control .v-input__slot .v-select__slot label {
top: 7px !important;
}
</style>

@ -0,0 +1,64 @@
<template>
<div>
<v-menu
v-model="menu"
:close-on-content-click="false"
:nudge-right="40"
transition="scale-transition"
offset-y
min-width="auto"
>
<template v-slot:activator="{ on, attrs }">
<v-text-field
class="pt-0"
v-model="time"
:label="label"
:placeholder="placeholder || label"
prepend-inner-icon="mdi-calendar"
readonly
:color="color"
v-bind="attrs"
v-on="on"
dark
/>
</template>
<v-time-picker
:dark="dark"
use-seconds
:color="color"
v-model="time"
:type="type"
@input="menu = false"
/>
</v-menu>
</div>
</template>
<script>
export default {
props: {
label: {},
placeholder: {},
color: {},
value: {},
type: {
default: "time",
},
dark: {
default: true,
},
},
data: () => ({
menu: false,
}),
computed: {
time: {
get() {
return this.value;
},
set(value) {
this.$emit("input", value);
},
},
},
};
</script>

@ -3,7 +3,7 @@
<div class="wa__program__images"> <div class="wa__program__images">
<div <div
class="wa__program__image" class="wa__program__image"
:style="{ backgroundImage: `url(${program.src})` }" :style="{ backgroundImage: `url(${program.thumbnail})` }"
></div> ></div>
<div class="wa__program__image__button"> <div class="wa__program__image__button">
<div class="wa__program__image__button--icon"> <div class="wa__program__image__button--icon">
@ -55,7 +55,7 @@
class="mr-1 text-uppercase" class="mr-1 text-uppercase"
x-small x-small
> >
{{ program.workout }} workout {{ program.workouts_count }} workout
</v-chip> </v-chip>
</div> </div>
</div> </div>
@ -67,6 +67,9 @@ export default {
type: Object, type: Object,
}, },
}, },
created() {
console.log(this.program);
},
}; };
</script> </script>
<style scoped> <style scoped>

@ -27,10 +27,10 @@
v-for="(item, i) in workout.tags" v-for="(item, i) in workout.tags"
:key="i" :key="i"
> >
{{ item.name }} {{ item }}
</v-chip> </v-chip>
</div> </div>
<div> <div class="d-flex">
<RectangleButton <RectangleButton
size="large" size="large"
height="26" height="26"
@ -38,12 +38,19 @@
class="custom-btn custom-icon ml-1" class="custom-btn custom-icon ml-1"
@click.native="deleteWorkout(workout.id)" @click.native="deleteWorkout(workout.id)"
/> />
<RectangleButton <router-link
size="large" :to="{
height="26" name: 'addWorkout',
icon="WMi-pencil" params: { id: workout.id },
class="custom-btn custom-icon ml-1" }"
/> >
<RectangleButton
size="large"
height="26"
icon="WMi-pencil"
class="custom-btn custom-icon ml-1"
/>
</router-link>
</div> </div>
</div> </div>
</div> </div>

@ -50,7 +50,7 @@ export default [
name: 'addProgram' name: 'addProgram'
}, },
{ {
path: '/add-workout', path: '/add-workout/:id?',
view: 'AddWorkout', view: 'AddWorkout',
name: 'addWorkout' name: 'addWorkout'
}, },

@ -1,16 +1,27 @@
import { urlGenerator } from "@/utils/urlGenerator"; import { urlGenerator } from "@/utils/urlGenerator";
const urls = { const urls = {
// authentication
login: "auth/login", login: "auth/login",
register: "auth/register", register: "auth/register",
resetPassword: "auth/forget-password", resetPassword: "auth/forget-password",
logout: "auth/logout", logout: "auth/logout",
// programs
indexProgram: "courses", indexProgram: "courses",
storeProgram: 'trainer/courses',
// sport categories
indexSportCategories: "admin/sport-categories", indexSportCategories: "admin/sport-categories",
showSportCategory: "admin/sport-categories/:sportCategory",
// workout categories
indexWorkoutCategories: "admin/workout-categories", indexWorkoutCategories: "admin/workout-categories",
storeWorkout: "admin/workouts", // workouts
indexWorkout: "admin/workouts", indexWorkout: "admin/workouts",
showWorkout: "admin/workouts/:workout",
storeWorkout: "admin/workouts",
updateWorkout: "admin/workouts/:workout",
destroyWorkout: "admin/workouts/:workout", destroyWorkout: "admin/workouts/:workout",
// file
storeFile: 'media'
}; };
export default urlGenerator(urls); export default urlGenerator(urls);

@ -2,7 +2,6 @@ export default {
isModal: (state) => (...names) => { isModal: (state) => (...names) => {
for (const name of names) { for (const name of names) {
if (state.modals.findIndex(x => x.name == name) != -1) { if (state.modals.findIndex(x => x.name == name) != -1) {
console.log(state.modals.findIndex(x => x.name == name) != -1);
return true; return true;
} }
} }

@ -5,5 +5,10 @@ export default {
const resource = await repository.index(); const resource = await repository.index();
commit("SET_PROGRAMS", resource.data); commit("SET_PROGRAMS", resource.data);
commit("SET_PAGINATION", resource.pagination); commit("SET_PAGINATION", resource.pagination);
} },
async addProgram({ commit }, data) {
let repository = new ProgramRepository();
const resource = await repository.store(data);
commit("ADD_PROGRAM", resource.data);
},
}; };

@ -7,5 +7,7 @@ export default {
pagination = { ...state.pagination, ...pagination }; pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination); Vue.set(state, "pagination", pagination);
}, },
ADD_PROGRAM(state, data) {
state.programs.push(data);
},
}; };

@ -4,5 +4,10 @@ export default {
let repository = new SportCategoriesRepository(); let repository = new SportCategoriesRepository();
const resource = await repository.index(); const resource = await repository.index();
commit("SET_SPORT_CATEGORIES", resource.data); commit("SET_SPORT_CATEGORIES", resource.data);
} },
async loadSportCategory({ commit }, sportCategoryId) {
let repository = new SportCategoriesRepository();
const resource = await repository.show(sportCategoryId);
commit("SET_SPORT_CATEGORY", resource);
},
}; };

@ -1,3 +1,4 @@
export default { export default {
getSportCategories: state => state.sportCategories, getSportCategories: state => state.sportCategories,
getSportCategory: state => state.sportCategory,
} }

@ -3,4 +3,7 @@ export default {
SET_SPORT_CATEGORIES(state, data) { SET_SPORT_CATEGORIES(state, data) {
Vue.set(state, "sportCategories", data); Vue.set(state, "sportCategories", data);
}, },
SET_SPORT_CATEGORY(state, data) {
Vue.set(state, "sportCategory", data);
},
}; };

@ -1,3 +1,4 @@
export default { export default {
sportCategories: [] sportCategories: [],
sportCategory: []
}; };

@ -1,18 +1,28 @@
import workoutRepository from "@/abstraction/repository/workoutRepository"; import WorkoutRepository from "@/abstraction/repository/workoutRepository";
export default { export default {
async loadWorkouts({ commit }) { async loadWorkouts({ commit }) {
let repository = new workoutRepository(); let repository = new WorkoutRepository();
const resource = await repository.index(); const resource = await repository.index();
commit("SET_WORKOUT", resource.data); commit("SET_WORKOUTS", resource.data);
// commit("SET_PAGINATION", resource.pagination); // commit("SET_PAGINATION", resource.pagination);
}, },
async loadWorkout({ commit }, workoutId) {
let repository = new WorkoutRepository();
const resource = await repository.show(workoutId);
commit("SET_WORKOUT", resource);
},
async addWorkout({ commit }, data) { async addWorkout({ commit }, data) {
let repository = new workoutRepository(); let repository = new WorkoutRepository();
const resource = await repository.store(data); const resource = await repository.store(data);
commit("ADD_WORKOUT", resource.data); commit("ADD_WORKOUT", resource.data);
}, },
async updateWorkout({ commit }, data) {
let repository = new WorkoutRepository();
const resource = await repository.update(data.id, data);
commit("UPDATE_WORKOUT", resource);
},
async deleteWorkout({ commit }, workoutId) { async deleteWorkout({ commit }, workoutId) {
let repository = new workoutRepository(); let repository = new WorkoutRepository();
await repository.delete(workoutId); await repository.delete(workoutId);
commit('DELETE_WORKOUT', workoutId); commit('DELETE_WORKOUT', workoutId);
} }

@ -1,3 +1,4 @@
export default { export default {
getWorkouts: state => state.workouts getWorkouts: state => state.workouts,
getWorkout: state => state.workout,
} }

@ -1,11 +1,18 @@
import Vue from "vue"; import Vue from "vue";
export default { export default {
SET_WORKOUT(state, data) { SET_WORKOUTS(state, data) {
Vue.set(state, "workouts", data); Vue.set(state, "workouts", data);
}, },
SET_WORKOUT(state, data) {
Vue.set(state, "workout", data);
},
ADD_WORKOUT(state, data) { ADD_WORKOUT(state, data) {
state.workouts.push(data); state.workouts.push(data);
}, },
UPDATE_WORKOUT(state, data) {
const index = state.workouts.findIndex((x) => x.id === data.id);
Vue.set(state.workouts, index, data);
},
DELETE_WORKOUT(state, workoutId) { DELETE_WORKOUT(state, workoutId) {
const index = state.workouts.findIndex((x) => x.id === workoutId); const index = state.workouts.findIndex((x) => x.id === workoutId);
state.workouts.splice(index, 1); state.workouts.splice(index, 1);

@ -1,3 +1,4 @@
export default { export default {
workouts: [] workouts: [],
workout: {}
}; };

@ -17,7 +17,9 @@
ul { ul {
list-style-type: none; list-style-type: none;
} }
a {
text-decoration: none !important;
}
.wa__link a { .wa__link a {
text-decoration: none; text-decoration: none;
display: block; display: block;
@ -172,7 +174,7 @@ textarea {
} }
.v-text-field.no-error-msg.textarae .v-input__slot { .v-text-field.no-error-msg.textarae .v-input__slot {
margin-bottom: 0px !important; margin-bottom: 0px !important;
} }
.v-textarea.no-error-msg .v-input__slot { .v-textarea.no-error-msg .v-input__slot {

@ -8,6 +8,7 @@ import AuthFooter from '../components/Global/Footer/AuthFooter.vue';
import RectangleButton from '../components/Global/Button/RectangleButton.vue'; import RectangleButton from '../components/Global/Button/RectangleButton.vue';
import MainBack from '../components/Global/Section/MainBackground.vue'; import MainBack from '../components/Global/Section/MainBackground.vue';
import DateInput from '../components/Global/Input/DateInput.vue'; import DateInput from '../components/Global/Input/DateInput.vue';
import TimeInput from '../components/Global/Input/TimeInput.vue';
import BasicModal from "../components/Global/Modal/BasicModal"; import BasicModal from "../components/Global/Modal/BasicModal";
import 'bootstrap'; import 'bootstrap';
import 'bootstrap/dist/css/bootstrap.min.css'; import 'bootstrap/dist/css/bootstrap.min.css';
@ -19,4 +20,5 @@ Vue.component('auth-footer', AuthFooter);
Vue.component('RectangleButton', RectangleButton); Vue.component('RectangleButton', RectangleButton);
Vue.component('main-back', MainBack); Vue.component('main-back', MainBack);
Vue.component('DateInput', DateInput); Vue.component('DateInput', DateInput);
Vue.component('TimeInput', TimeInput);
Vue.component('basic-modal', BasicModal); Vue.component('basic-modal', BasicModal);

@ -132,7 +132,6 @@ export default {
async doRegister() { async doRegister() {
let response = await this.register(this.form); let response = await this.register(this.form);
if (response) { if (response) {
console.log("response", response);
this.$router.push("/"); this.$router.push("/");
} }
}, },

Loading…
Cancel
Save