sajjad_talkhabi 3 years ago
parent f812140ff1
commit b001b7a7d9

@ -1,10 +1,22 @@
import axios from "axios"; import axios from "axios";
import url from "@/router/url"; import url from "@/router/url";
import { setData } from "../resources/workoutResource.js"; import { setData, getJson, getArray } from "../resources/workoutResource.js";
export default class WorkoutRepository { export default class WorkoutRepository {
async index() {
let response = await axios.get(url("indexWorkout"));
if (response.status === 200) {
return getArray(response.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('response', response); console.log('kldsbhakjbg', response.data);
if (response.status === 201) {
return getJson(response.data);
}
}
async delete(workoutId) {
await axios.delete(url("destroyWorkout", { workout: workoutId }));
} }
} }

@ -1,9 +1,25 @@
import { objectToFormData } from "@/utils/objectToFormData"; import { objectToFormData } from "@/utils/objectToFormData";
export const getJson = (data) => ({
id: data.id,
local_name: data.local_name,
name: data.name,
description: data.description,
suggestion_default: {
suggested_per_ste: data.suggestion_default.suggested_per_set,
suggested_set: data.suggestion_default.suggested_set,
suggested_time: data.suggestion_default.suggested_time,
},
tags: data.tags,
thumbnail: data.thumbnail,
title: data.title,
video: data.video,
});
export const setData = (data, isUpdate = false) => { export const setData = (data, isUpdate = false) => {
let formData = { let formData = {
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,
title: data.title,
description: data.description, description: data.description,
video: data.video, video: data.video,
suggested_per_set: data.suggested_per_set, suggested_per_set: data.suggested_per_set,
@ -17,3 +33,8 @@ export const setData = (data, isUpdate = false) => {
} }
return objectToFormData(formData); return objectToFormData(formData);
}; };
export const getArray = ({ data }) => {
data = data.map((workout) => getJson(workout));
return { data };
};

@ -31,6 +31,7 @@
item-value="id" item-value="id"
label="workout category" label="workout category"
:items="getSportCategories" :items="getSportCategories"
v-model="form.sport_category_id"
@change="changeSportCategories" @change="changeSportCategories"
></v-autocomplete> ></v-autocomplete>
</v-col> </v-col>
@ -122,18 +123,22 @@
</v-row> </v-row>
<v-row> <v-row>
<v-col cols="12"> <v-col cols="12">
<v-autocomplete <v-combobox
dark
class="pt-0 multiple"
item-value="id"
item-text="name"
attach
chips
label="model types"
placeholder="model types"
v-model="form.tags" v-model="form.tags"
:search-input.sync="search"
hide-selected
label="Add some tags"
multiple multiple
></v-autocomplete> persistent-hint
small-chips
dark
>
<template #selection="{ item }">
<v-chip label small color="white" text-color="black">{{
item
}}</v-chip>
</template>
</v-combobox>
</v-col> </v-col>
</v-row> </v-row>
</v-col> </v-col>
@ -169,6 +174,7 @@ export default {
ImageCropper, ImageCropper,
}, },
data: () => ({ data: () => ({
search: null,
form: { form: {
get() { get() {
return this.value; return this.value;
@ -182,16 +188,21 @@ export default {
...mapGetters("sportCategories", ["getSportCategories"]), ...mapGetters("sportCategories", ["getSportCategories"]),
...mapGetters("workoutCategories", ["getWorkoutCategories"]), ...mapGetters("workoutCategories", ["getWorkoutCategories"]),
}, },
watch: {
"form.name"(val) {
this.form.local_name = val;
},
},
methods: { methods: {
...mapActions("workouts", ["addWorkout"]), ...mapActions("workouts", ["addWorkout"]),
...mapActions("workoutCategories", ["loadWorkoutCategories"]), ...mapActions("workoutCategories", ["loadWorkoutCategories"]),
...mapActions("sportCategories", ["loadSportCategories"]), ...mapActions("sportCategories", ["loadSportCategories"]),
async add() { async add() {
console.log(this.form);
this.addWorkout(this.form); this.addWorkout(this.form);
}, },
changeSportCategories() { changeSportCategories() {
console.log("change"); this.loadWorkoutCategories(this.form.sport_category_id);
this.loadWorkoutCategories();
}, },
}, },
created() { created() {
@ -221,3 +232,8 @@ export default {
font-size: 40px; font-size: 40px;
} }
</style> </style>
<style>
.v-autocomplete .v-input__control .v-input__slot .v-select__slot label {
top: 7px !important;
}
</style>

@ -11,12 +11,32 @@
</div> </div>
<div class="wa__modal__form"> <div class="wa__modal__form">
<div> <div>
<RectangleButton
text="select your file"
icon="WMi-camera"
class="w-100"
height="30"
bg-color="white"
color="black"
v-if="hiddenInput"
@click.native="$refs.fileInput.$refs.input.click()"
/>
<v-file-input <v-file-input
accept="image/png, image/jpeg, image/bmp" accept="image/png, image/jpeg, image/bmp"
placeholder="Pick an Image" placeholder="Pick an Image"
prepend-icon="mdi-camera" prepend-icon="mdi-camera"
:label="label" :label="label"
@change="changeImage" @change="changeImage"
ref="fileInput"
:style="[
hiddenInput
? {
visibility: 'hidden',
height: '0',
padding: '0',
}
: '',
]"
:dark="dark" :dark="dark"
></v-file-input> ></v-file-input>
</div> </div>
@ -50,6 +70,9 @@ export default {
dark: { dark: {
default: true, default: true,
}, },
hiddenInput: {
default: true,
},
}, },
computed: { computed: {
form: { form: {

@ -4,14 +4,14 @@
<v-col cols="4" class="pr-0"> <v-col cols="4" class="pr-0">
<div <div
class="workout__img" class="workout__img"
:style="{ backgroundImage: `url(${workout.src})` }" :style="{ backgroundImage: `url(${workout.thumbnail})` }"
></div ></div
></v-col> ></v-col>
<v-col cols="8"> <v-col cols="8">
<div class="details__card"> <div class="details__card">
<div> <div>
<div class="workout__title wa__f__m__eb text-uppercase"> <div class="workout__title wa__f__m__eb text-uppercase">
{{ workout.title }} {{ workout.name }}
</div> </div>
<div class="workout__description">{{ workout.description }}</div> <div class="workout__description">{{ workout.description }}</div>
</div> </div>
@ -24,15 +24,26 @@
text-color="black" text-color="black"
class="mr-1 text-uppercase" class="mr-1 text-uppercase"
x-small x-small
v-for="(item, i) in workout.items" v-for="(item, i) in workout.tags"
:key="i" :key="i"
> >
{{ item.text }} {{ item.name }}
</v-chip> </v-chip>
</div> </div>
<div> <div>
<RectangleButton size="large" height="26" icon="WMi-trash" class="custom-btn custom-icon ml-1" /> <RectangleButton
<RectangleButton size="large" height="26" icon="WMi-pencil" class="custom-btn custom-icon ml-1" /> size="large"
height="26"
icon="WMi-trash"
class="custom-btn custom-icon ml-1"
@click.native="deleteWorkout(workout.id)"
/>
<RectangleButton
size="large"
height="26"
icon="WMi-pencil"
class="custom-btn custom-icon ml-1"
/>
</div> </div>
</div> </div>
</div> </div>
@ -42,12 +53,16 @@
</div> </div>
</template> </template>
<script> <script>
import { mapActions } from "vuex";
export default { export default {
props: { props: {
workout: { workout: {
type: Object, type: Object,
}, },
}, },
methods: {
...mapActions("workouts", ["deleteWorkout"]),
},
}; };
</script> </script>
<style scoped> <style scoped>
@ -75,5 +90,4 @@ export default {
height: 100%; height: 100%;
justify-content: space-between; justify-content: space-between;
} }
</style> </style>

@ -37,7 +37,7 @@
cols="12" cols="12"
md="6" md="6"
class="mb-3" class="mb-3"
v-for="workout in workouts" v-for="workout in getWorkouts"
:key="workout.id" :key="workout.id"
><WorkoutItem :workout="workout" ><WorkoutItem :workout="workout"
/></v-col> /></v-col>
@ -49,71 +49,23 @@
</template> </template>
<script> <script>
import WorkoutItem from "./Item"; import WorkoutItem from "./Item";
import FirstImage from "../../assets/28-284379_photo-wallpaper-man-workout-gym-working-gym-workout.jpg";
import SecondImage from "../../assets/a-bodybuilder-exhibits-his-muscular-physique-1024-768-0.jpg";
import ThirdImage from "../../assets/5595849.jpg";
import SectionTitle from "../Global/Section/SectionTitle.vue"; import SectionTitle from "../Global/Section/SectionTitle.vue";
import FiltersModal from "./Modals/FiltersModal.vue"; import FiltersModal from "./Modals/FiltersModal.vue";
import { mapGetters, mapActions } from "vuex";
export default { export default {
components: { components: {
WorkoutItem, WorkoutItem,
SectionTitle, SectionTitle,
FiltersModal, FiltersModal,
}, },
data: () => ({ computed: {
workouts: [ ...mapGetters("workouts", ["getWorkouts"]),
{ },
id: 1, methods: {
src: FirstImage, ...mapActions("workouts", ["loadWorkouts"]),
title: "CHEST press", },
description: created() {
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum", this.loadWorkouts();
items: [ },
{
id: 1,
text: "GYM",
},
{
id: 2,
text: "forearm",
},
],
},
{
id: 2,
src: SecondImage,
title: "CHEST press - dumbell",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum",
items: [
{
id: 1,
text: "GYM",
},
{
id: 2,
text: "forearm",
},
],
},
{
id: 3,
src: ThirdImage,
title: "CHEST press",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum",
items: [
{
id: 1,
text: "GYM",
},
{
id: 2,
text: "forearm",
},
],
},
],
}),
}; };
</script> </script>

@ -5,10 +5,12 @@ const urls = {
register: "auth/register", register: "auth/register",
resetPassword: "auth/forget-password", resetPassword: "auth/forget-password",
logout: "auth/logout", logout: "auth/logout",
indexProgram: 'courses', indexProgram: "courses",
indexSportCategories: 'admin/sport-categories', indexSportCategories: "admin/sport-categories",
indexWorkoutCategories: 'admin/workout-categories', indexWorkoutCategories: "admin/workout-categories",
storeWorkout: "admin/workouts" storeWorkout: "admin/workouts",
indexWorkout: "admin/workouts",
destroyWorkout: "admin/workouts/:workout",
}; };
export default urlGenerator(urls); export default urlGenerator(urls);

@ -1,9 +1,8 @@
import WorkoutCategoriesRepository from "@/abstraction/repository/workoutCategoriesRepository"; import WorkoutCategoriesRepository from "@/abstraction/repository/workoutCategoriesRepository";
export default { export default {
async loadWorkoutCategories({ commit }) { async loadWorkoutCategories({ commit }, id) {
let data = { sorts: 'fasdfas' }
let repository = new WorkoutCategoriesRepository(); let repository = new WorkoutCategoriesRepository();
const resource = await repository.index(data); const resource = await repository.index({filters:{sport_category_id: id}});
commit("SET_WORKOUT_CATEGORIES", resource.data); commit("SET_WORKOUT_CATEGORIES", resource.data);
} }
}; };

@ -1,9 +1,19 @@
import workoutRepository from "@/abstraction/repository/workoutRepository"; import workoutRepository from "@/abstraction/repository/workoutRepository";
export default { export default {
async loadWorkouts({ commit }) {
let repository = new workoutRepository();
const resource = await repository.index();
commit("SET_WORKOUT", resource.data);
// commit("SET_PAGINATION", resource.pagination);
},
async addWorkout({ commit }, data) { async addWorkout({ commit }, data) {
console.log('data', data);
let repository = new workoutRepository(); let repository = new workoutRepository();
const resource = await repository.store(data); const resource = await repository.store(data);
commit("SET_WORKOUTS", resource.data); commit("ADD_WORKOUT", resource.data);
},
async deleteWorkout({ commit }, workoutId) {
let repository = new workoutRepository();
await repository.delete(workoutId);
commit('DELETE_WORKOUT', workoutId);
} }
}; };

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

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