sajjad 3 years ago
parent d90be45455
commit 095e1ae40b

@ -1,6 +1,6 @@
import axios from "axios"; import axios from "axios";
import url from "@/router/url"; import url from "@/router/url";
import { getArray, setQuery } from "../resources/userResource"; import { getArray, setQuery, getJson } from "../resources/userResource";
import { getArray as getArrayTrainee } from "../resources/traineeResource"; import { getArray as getArrayTrainee } from "../resources/traineeResource";
export default class UserRepository { export default class UserRepository {
@ -18,6 +18,12 @@ export default class UserRepository {
return getArrayTrainee(response.data) return getArrayTrainee(response.data)
} }
} }
async show(userId) {
let response = await axios.get(url("showUser", { user: userId }));
if (response.status === 200) {
return getJson(response.data.data);
}
}
async delete(userId) { async delete(userId) {
await axios.delete(url("destroyUser", { user: userId })); await axios.delete(url("destroyUser", { user: userId }));
} }

@ -1,5 +1,6 @@
export const getJsonTrainer = (data) => ({ export const getJsonTrainer = (data) => ({
id: data.id, id: data.id,
name: data.name,
first_name: data.first_name, first_name: data.first_name,
last_name: data.last_name, last_name: data.last_name,
birthday: data.birthday, birthday: data.birthday,
@ -12,6 +13,4 @@ export const getJsonTrainer = (data) => ({
address: data.address, address: data.address,
email: data.email, email: data.email,
cell_number: data.cell_number, cell_number: data.cell_number,
is_admin: data.is_admin,
is_trainer: data.is_trainer,
}); });

@ -4,7 +4,7 @@
depressed depressed
:height="height" :height="height"
:width="width" :width="width"
:class="`color-${color} ${bgColor}`" :class="`color-${color} bg-${bgColor}`"
:type="type" :type="type"
:x-small="xs" :x-small="xs"
:small="sm" :small="sm"
@ -85,7 +85,7 @@ export default {
.v-btn.color-#{ "" + $color} { .v-btn.color-#{ "" + $color} {
color: $value !important; color: $value !important;
} }
.v-btn.#{"" + $color} { .v-btn.bg-#{"" + $color} {
background-color: $value !important; background-color: $value !important;
} }
} }

@ -2,15 +2,20 @@
<div class="info__box pl-2"> <div class="info__box pl-2">
<div class="info__title text-uppercase">{{ title }}</div> <div class="info__title text-uppercase">{{ title }}</div>
<div class="info__sub__title"> <div class="info__sub__title">
<!-- if --> <!-- If the sub title is text -->
<template v-if="subTitle"> <template v-if="subTitle">
<component :is="tag" :class="['white--text', { 'ml-n1': tag === 'pre' }]"> <component
{{ subTitle }} :is="tag"
:class="['white--text sub__text', { 'ml-n1': tag === 'pre' }]"
>
<slot name="sub-title" :text="subTitle">{{ subTitle }}</slot>
</component> </component>
</template> </template>
<!-- If the sub title is link -->
<template v-if="link"> <template v-if="link">
<a :href="link" v-text="link" class="white--text link"></a> <a :href="link" v-text="link" class="white--text link"></a>
</template> </template>
<!-- If the subtitle is an array and needs a loop-->
<div> <div>
<slot <slot
name="items" name="items"

@ -53,7 +53,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="title__box"> <div class="title__box" @click="openDetailModal">
<div class="d-flex align-center mt-1"> <div class="d-flex align-center mt-1">
<div class="program__title"> <div class="program__title">
{{ program.title }} {{ program.title }}
@ -92,7 +92,7 @@
</div> </div>
</template> </template>
<script> <script>
import { mapActions } from "vuex"; import { mapActions, mapGetters } from "vuex";
import toast from "@/utils/toast"; import toast from "@/utils/toast";
import { UserStorage } from "@/utils/storage"; import { UserStorage } from "@/utils/storage";
@ -105,13 +105,20 @@ export default {
type: Object, type: Object,
}, },
}, },
computed: {
...mapGetters("programs", ["getProgram"]),
},
methods: { methods: {
...mapActions("programs", ["verifyProgram", "deleteProgram"]), ...mapActions("programs", ["verifyProgram", "deleteProgram", "loadProgram"]),
removeProgram(id) { removeProgram(id) {
toast.question("Are sure delete program?", "Delete program", () => { toast.question("Are sure delete program?", "Delete program", () => {
this.deleteProgram(id); this.deleteProgram(id);
}); });
}, },
async openDetailModal() {
await this.loadProgram(this.program.id);
this.$_openModal("program_detail", { data: this.getProgram });
},
}, },
}; };
</script> </script>

@ -57,13 +57,17 @@
</main-back> </main-back>
<div class="text-center"> <div class="text-center">
<FiltersModal @filter="load" v-if="isModal('modal_filters')" /> <FiltersModal @filter="load" v-if="isModal('modal_filters')" />
<ProgramDetailModal @filter="load" v-if="isModal('modal_program_detail')" />
<UserDetailModal v-if="isModal('modal_user_detail')" />
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import FiltersModal from "./Modals/FiltersModal.vue";
import SectionTitle from "../Global/Section/SectionTitle.vue"; import SectionTitle from "../Global/Section/SectionTitle.vue";
import ProgramItem from "./Item.vue"; import ProgramItem from "./Item.vue";
import FiltersModal from "./Modals/FiltersModal.vue";
import ProgramDetailModal from "./Modals/Detail.vue";
import UserDetailModal from "@/components/Users/Modals/Detail.vue";
import { mapGetters, mapActions, mapMutations } from "vuex"; import { mapGetters, mapActions, mapMutations } from "vuex";
import { UserStorage } from "@/utils/storage"; import { UserStorage } from "@/utils/storage";
export default { export default {
@ -71,6 +75,8 @@ export default {
SectionTitle, SectionTitle,
ProgramItem, ProgramItem,
FiltersModal, FiltersModal,
ProgramDetailModal,
UserDetailModal,
}, },
data: () => ({ data: () => ({
role: UserStorage.getRole() ? UserStorage.getRole() : null, role: UserStorage.getRole() ? UserStorage.getRole() : null,

@ -0,0 +1,112 @@
<template>
<basic-modal width="900" transition="slide-x-transition" @open="openModal">
<template #header>
<div class="close__modal">
<v-icon class="WMi-cancel-linear" @click="$_closeModal()"></v-icon>
</div>
</template>
<template #default>
<div>
<SectionTitle
title="program details"
subTitle="The details you need"
:is-modal="true"
/>
</div>
<div class="mt-4 mb-10">
<v-row>
<v-col cols="4">
<img
class="program__img w-100"
:src="
program.thumbnail
? program.thumbnail
: 'https://via.placeholder.com/1280x720'
"
alt="program image"
/>
</v-col>
<v-col cols="8">
<v-row>
<v-col cols="12">
<Info title="NAME" :sub-title="program.title" />
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<Info title="trainer" :sub-title="program.trainer.name">
<template #sub-title="{ text }">
<div class="d-flex align-center">
<div class="sub__text--slot">{{ text }}</div>
<div>
<RectangleButton
size="large"
height="16"
class="btn-more ml-3 px-4 py-2 rounded"
text="know more"
color="white"
@click="openUserDetailModal"
/>
</div>
</div>
</template>
</Info>
</v-col>
</v-row>
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<Info title="description" :sub-title="program.description" />
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<Info title="tags" :items="program.tags" />
</v-col>
</v-row>
</div>
</template>
<template #footer>
<v-spacer></v-spacer>
<RectangleButton
height="29"
class="btn__modal--confirm custom-btn wa__f__m__eb"
text="close"
@click="$_closeModal()"
/>
</template>
</basic-modal>
</template>
<script>
import { mapGetters, mapActions } from "vuex";
export default {
name: "modal_program_detail",
data: () => ({
program: {},
}),
computed: {
...mapGetters("users", ["getUser"]),
},
methods: {
...mapActions("users", ["loadUser"]),
openModal({ data }) {
this.program = { ...data };
},
async openUserDetailModal() {
await this.loadUser(this.program.trainer.id);
this.$_openModal("user_detail", { data: this.getUser });
},
},
};
</script>
<style lang="scss" scoped>
.program__img {
border-radius: 5px;
}
.btn-more {
font-family: "Montserrat-extralight";
font-size: 10px;
border: 1px solid var(--color-white);
}
</style>

@ -0,0 +1,95 @@
<template>
<basic-modal width="900" transition="slide-x-transition" @open="openModal">
<template #header>
<div class="close__modal">
<v-icon class="WMi-cancel-linear" @click="$_closeModal()"></v-icon>
</div>
</template>
<template #default>
<div>
<SectionTitle
title="user details"
subTitle="The details you need"
:is-modal="true"
/>
</div>
<div class="mt-4 mb-10">
<v-row>
<v-col cols="4">
<img
class="user__img w-100"
:src="user.profile ? user.profile : 'https://via.placeholder.com/1'"
alt="user image"
/>
</v-col>
<v-col cols="8">
<v-row>
<v-col cols="6">
<Info title="NAME" :sub-title="user.first_name" />
</v-col>
<v-col cols="6">
<Info title="LAST NAME" :sub-title="user.last_name" />
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<Info title="EMAIL ADDRESS" :sub-title="user.email" />
</v-col>
</v-row>
<v-row>
<v-col cols="4">
<Info title="role" :sub-title="user.role" />
</v-col>
<v-col cols="4">
<Info title="joined date" :sub-title="user.joined" />
</v-col>
<v-col cols="4">
<Info title="BIRTHDAY" :sub-title="user.birthday" />
</v-col>
</v-row>
</v-col>
</v-row>
<v-row>
<v-col cols="3">
<Info title="country" :sub-title="user.country" />
</v-col>
<v-col cols="9">
<Info title="address" :sub-title="user.address" />
</v-col>
</v-row>
</div>
</template>
<template #footer>
<v-spacer></v-spacer>
<RectangleButton
height="29"
class="btn__modal--confirm custom-btn wa__f__m__eb"
text="close"
@click="$_closeModal()"
/>
</template>
</basic-modal>
</template>
<script>
export default {
name: "modal_user_detail",
data: () => ({
user: {},
}),
methods: {
openModal({ data }) {
this.user = { ...data };
},
},
};
</script>
<style lang="scss" scoped>
.user__img {
border-radius: 5px;
}
.btn-more {
font-family: "Montserrat-extralight";
font-size: 10px;
border: 1px solid var(--color-white);
}
</style>

@ -1,5 +1,5 @@
<template> <template>
<div class="border-bottom" @click="$_openModal('workout_detail', { data: workout })"> <div class="border-bottom" @click="openDetailModal">
<v-row> <v-row>
<v-col cols="4" class="pr-0"> <v-col cols="4" class="pr-0">
<!-- <div <!-- <div
@ -83,7 +83,7 @@
</div> </div>
</template> </template>
<script> <script>
import { mapActions } from "vuex"; import { mapActions, mapGetters } from "vuex";
import toast from "@/utils/toast"; import toast from "@/utils/toast";
export default { export default {
props: { props: {
@ -91,13 +91,20 @@ export default {
type: Object, type: Object,
}, },
}, },
computed: {
...mapGetters("workouts", ["getWorkout"]),
},
methods: { methods: {
...mapActions("workouts", ["deleteWorkout"]), ...mapActions("workouts", ["deleteWorkout", "loadWorkout"]),
removeWorkout(id) { removeWorkout(id) {
toast.question("Are sure delete workout?", "Delete workout", () => { toast.question("Are sure delete workout?", "Delete workout", () => {
this.deleteWorkout(id); this.deleteWorkout(id);
}); });
}, },
async openDetailModal() {
await this.loadWorkout(this.workout.id);
this.$_openModal("workout_detail", { data: this.getWorkout });
},
}, },
}; };
</script> </script>

@ -29,10 +29,13 @@
<v-col cols="8"> <v-col cols="8">
<v-row> <v-row>
<v-col cols="6"> <v-col cols="6">
<Info title="category" :sub-title="workout.workout_category.name" /> <Info
title="category"
:sub-title="workout.workout_category.sport_category.name"
/>
</v-col> </v-col>
<v-col cols="6"> <v-col cols="6">
<Info title="subcategory" sub-title="['fs', 'fdfdas', 'fsdf']" /> <Info title="sub category" :sub-title="workout.workout_category.name" />
</v-col> </v-col>
</v-row> </v-row>
<v-row> <v-row>
@ -83,7 +86,7 @@
<RectangleButton <RectangleButton
height="29" height="29"
class="btn__modal--confirm custom-btn wa__f__m__eb" class="btn__modal--confirm custom-btn wa__f__m__eb"
text="change" text="close"
@click="$_closeModal()" @click="$_closeModal()"
/> />
</template> </template>

@ -52,6 +52,7 @@ const urls = {
indexProductCategories: "admin/product-categories", indexProductCategories: "admin/product-categories",
// users // users
indexUsers: "admin/users", indexUsers: "admin/users",
showUser: "admin/users/:user",
destroyUser: "admin/users/:user", destroyUser: "admin/users/:user",
indexTrainerTrainee: "trainer/trainees", indexTrainerTrainee: "trainer/trainees",
indexRoles: "admin/roles", indexRoles: "admin/roles",

@ -33,6 +33,11 @@ export default {
} }
}, },
async loadUser({ commit }, userId) {
let repository = new UserRepository();
let resource = await repository.show(userId)
commit("SET_USER", resource);
},
async laodRoles({ commit }) { async laodRoles({ commit }) {
let repository = new RoleRepository(); let repository = new RoleRepository();
const resource = await repository.index(); const resource = await repository.index();

@ -1,5 +1,6 @@
export default { export default {
getUsers: state => state.users, getUsers: state => state.users,
getUser: state => state.user,
getRoles: state => state.roles, getRoles: state => state.roles,
getPaginationUser: state => state.pagination, getPaginationUser: state => state.pagination,
getFilters: state => state.filters, getFilters: state => state.filters,

@ -4,6 +4,9 @@ export default {
SET_USERS(state, payload) { SET_USERS(state, payload) {
Vue.set(state, "users", payload); Vue.set(state, "users", payload);
}, },
SET_USER(state, payload) {
Vue.set(state, "user", payload);
},
SET_PAGINATION(state, pagination) { SET_PAGINATION(state, pagination) {
pagination = { ...state.pagination, ...pagination }; pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination); Vue.set(state, "pagination", pagination);

@ -1,5 +1,6 @@
export default { export default {
users: [], users: [],
user: {},
roles: [], roles: [],
pagination: { pagination: {
itemsPerPage: 12 itemsPerPage: 12

@ -3,21 +3,31 @@
src: url("./font/montserrat/Montserrat-Regular.ttf") format("truetype"); src: url("./font/montserrat/Montserrat-Regular.ttf") format("truetype");
/* Safari, Android, iOS */ /* Safari, Android, iOS */
} }
@font-face { @font-face {
font-family: "Montserrat-light"; font-family: "Montserrat-light";
src: url("./font/montserrat/Montserrat-Light.ttf") format("truetype"); src: url("./font/montserrat/Montserrat-Light.ttf") format("truetype");
/* Safari, Android, iOS */ /* Safari, Android, iOS */
} }
@font-face {
font-family: "Montserrat-extralight";
src: url("./font/montserrat/Montserrat-ExtraLight.ttf") format("truetype");
/* Safari, Android, iOS */
}
@font-face { @font-face {
font-family: "Montserrat-extrabold"; font-family: "Montserrat-extrabold";
src: url("./font/montserrat/Montserrat-ExtraBold.ttf") format("truetype"); src: url("./font/montserrat/Montserrat-ExtraBold.ttf") format("truetype");
/* Safari, Android, iOS */ /* Safari, Android, iOS */
} }
@font-face { @font-face {
font-family: "Montserrat-medium"; font-family: "Montserrat-medium";
src: url("./font/montserrat/Montserrat-Medium.ttf") format("truetype"); src: url("./font/montserrat/Montserrat-Medium.ttf") format("truetype");
/* Safari, Android, iOS */ /* Safari, Android, iOS */
} }
@font-face { @font-face {
font-family: "Team-america"; font-family: "Team-america";
src: url("./font/teamAmerica/TeamAmerica-oLVd.otf") format("truetype"); src: url("./font/teamAmerica/TeamAmerica-oLVd.otf") format("truetype");

Loading…
Cancel
Save