sajjad 3 years ago
parent 87f2c240fd
commit 66c8d2139b

@ -12,7 +12,7 @@
<script> <script>
import BgImage from "./assets/Untitled-1.jpg"; import BgImage from "./assets/Untitled-1.jpg";
import { UserStorage } from "@/utils/storage"; import { UserStorage, TokenStorage } from "@/utils/storage";
import ProfileRepository from "./abstraction/repository/profileRepository"; import ProfileRepository from "./abstraction/repository/profileRepository";
import { getJson } from "./abstraction/resources/userResource"; import { getJson } from "./abstraction/resources/userResource";
export default { export default {
@ -21,11 +21,12 @@ export default {
bgImage: BgImage, bgImage: BgImage,
}), }),
async created() { async created() {
let repository = new ProfileRepository(); if (TokenStorage.hasToken()) {
let resource = await repository.show(); let repository = new ProfileRepository();
console.log("resource", resource); let resource = await repository.show();
let res = getJson(resource); let res = getJson(resource);
UserStorage.save(res); UserStorage.save(res);
}
}, },
}; };
</script> </script>

@ -18,7 +18,6 @@ export default class BookmarkRepository {
} }
} }
async deleteBookmark(bookmarkId) { async deleteBookmark(bookmarkId) {
console.log(bookmarkId);
await axios.delete(url("destroyBookmark", { bookmark: bookmarkId })); await axios.delete(url("destroyBookmark", { bookmark: bookmarkId }));
} }
} }

@ -10,8 +10,8 @@
<v-col cols="12"> <v-col cols="12">
<div class=""> <div class="">
<div class="text-left description"> <div class="text-left description">
here is dashboard home, feel free navigate from right side menu here is dashboard home, feel free navigate from right side menu or choose
or choose from shortcuts we prepared for you. from shortcuts we prepared for you.
</div> </div>
</div> </div>
</v-col> </v-col>
@ -25,13 +25,13 @@
<box text="programs" link="programs" icon="WMi-align-left" /> <box text="programs" link="programs" icon="WMi-align-left" />
</div> </div>
<div class="mr-5 section"> <div class="mr-5 section">
<box text="products" link="dashboard" icon="WMi-brush" /> <box text="products" link="products" icon="WMi-brush" />
</div> </div>
<div class="mr-5 section"> <div class="mr-5 section">
<box text="trainers" link="users" icon=" WMi-account-off" /> <box text="trainers" icon="WMi-account-off" @click.native="trainersList" />
</div> </div>
<div class="mr-5 section"> <div class="mr-5 section">
<box text="trainees" link="users" icon="WMi-users" /> <box text="trainees" icon="WMi-users" @click.native="traineesList" />
</div> </div>
</div> </div>
</div> </div>
@ -40,8 +40,8 @@
<v-col cols="12"> <v-col cols="12">
<div class="d-flex justify-center pr-16"> <div class="d-flex justify-center pr-16">
<div class="text-left description"> <div class="text-left description">
and here is some state we hope it gives you a great overview of and here is some state we hope it gives you a great overview of your
your status status
</div> </div>
</div> </div>
</v-col> </v-col>
@ -50,30 +50,22 @@
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification ><Notification
text="total trainees" text="total trainees"
:quantity=" :quantity="statistics.trainees_count ? statistics.trainees_count : 0"
statistics.trainees_count ? statistics.trainees_count : 0
"
/></v-col> /></v-col>
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification ><Notification
text="total trainers" text="total trainers"
:quantity=" :quantity="statistics.trainers_count ? statistics.trainers_count : 0"
statistics.trainers_count ? statistics.trainers_count : 0
"
/></v-col> /></v-col>
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification ><Notification
text="total programs" text="total programs"
:quantity=" :quantity="statistics.courses_count ? statistics.courses_count : 0"
statistics.courses_count ? statistics.courses_count : 0
"
/></v-col> /></v-col>
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification ><Notification
text="moves defined" text="moves defined"
:quantity=" :quantity="statistics.workouts_count ? statistics.workouts_count : 0"
statistics.workouts_count ? statistics.workouts_count : 0
"
/></v-col> /></v-col>
</v-row> </v-row>
</div> </div>
@ -87,8 +79,8 @@
<v-col cols="12"> <v-col cols="12">
<div class=""> <div class="">
<div class="text-left description"> <div class="text-left description">
here is your dashboard home, feel free navigate from right side here is your dashboard home, feel free navigate from right side menu or
menu or choose from shortcuts we prepared for you. choose from shortcuts we prepared for you.
</div> </div>
</div> </div>
</v-col> </v-col>
@ -114,8 +106,8 @@
<v-col cols="12"> <v-col cols="12">
<div class="d-flex justify-center pr-16"> <div class="d-flex justify-center pr-16">
<div class="text-left description"> <div class="text-left description">
and here is some stats we hope it gives you a great overview of and here is some stats we hope it gives you a great overview of your
your status status
</div> </div>
</div> </div>
</v-col> </v-col>
@ -125,9 +117,7 @@
<div class="mr-16"> <div class="mr-16">
<Notification <Notification
text="total trainees" text="total trainees"
:quantity=" :quantity="statistics.trainees_count ? statistics.trainees_count : 0"
statistics.trainees_count ? statistics.trainees_count : 0
"
/> />
</div> </div>
</div> </div>
@ -135,9 +125,7 @@
<div class="ml-16"> <div class="ml-16">
<Notification <Notification
text="total programs" text="total programs"
:quantity=" :quantity="statistics.courses_count ? statistics.courses_count : 0"
statistics.courses_count ? statistics.courses_count : 0
"
/> />
</div> </div>
</div> </div>
@ -153,8 +141,8 @@
<v-col cols="12"> <v-col cols="12">
<div class=""> <div class="">
<div class="text-left description"> <div class="text-left description">
here is your dashboard home, feel free navigate from right side here is your dashboard home, feel free navigate from right side menu or
menu or choose from shortcuts we prepared for you. choose from shortcuts we prepared for you.
</div> </div>
</div> </div>
</v-col> </v-col>
@ -165,7 +153,7 @@
<box text="bookmarks" link="bookmarks" icon="WMi-bookmark" /> <box text="bookmarks" link="bookmarks" icon="WMi-bookmark" />
</div> </div>
<div class="mr-5 section"> <div class="mr-5 section">
<box text="programs" link="trainPrograms" icon="WMi-align-left" /> <box text="programs" link="trainsPrograms" icon="WMi-align-left" />
</div> </div>
<div class="mr-5 section"> <div class="mr-5 section">
<box text="profile" link="profile" icon="WMi-user" /> <box text="profile" link="profile" icon="WMi-user" />
@ -177,8 +165,8 @@
<v-col cols="12"> <v-col cols="12">
<div class="d-flex justify-center pr-16"> <div class="d-flex justify-center pr-16">
<div class="text-left description"> <div class="text-left description">
and here is some stats we hope it gives you a great overview of and here is some stats we hope it gives you a great overview of your
your status status
</div> </div>
</div> </div>
</v-col> </v-col>
@ -189,9 +177,7 @@
<Notification <Notification
text="programs joined" text="programs joined"
:quantity=" :quantity="
statistics.joined_courses_count statistics.joined_courses_count ? statistics.joined_courses_count : 0
? statistics.joined_courses_count
: 0
" "
/> />
</div> </div>
@ -201,9 +187,7 @@
<Notification <Notification
text="moves done" text="moves done"
:quantity=" :quantity="
statistics.total_series_done statistics.total_series_done ? statistics.total_series_done : 0
? statistics.total_series_done
: 0
" "
/> />
</div> </div>
@ -213,13 +197,14 @@
<!-- /trainee role --> <!-- /trainee role -->
</main-back> </main-back>
</div> </div>
</template> </template>
<script> <script>
import Box from "../Global/Section/Box.vue"; import Box from "../Global/Section/Box.vue";
import Notification from "../Global/Section/Notification.vue"; import Notification from "../Global/Section/Notification.vue";
import UserName from "../Global/Section/UserName.vue"; import UserName from "../Global/Section/UserName.vue";
import { UserStorage } from "@/utils/storage"; import { UserStorage } from "@/utils/storage";
import StatisticRepository from "@/abstraction/repository/statisticRepository.js"; import StatisticRepository from "@/abstraction/repository/statisticRepository.js";
import { mapMutations, mapState } from "vuex";
export default { export default {
components: { components: {
UserName, UserName,
@ -230,7 +215,11 @@ export default {
type: UserStorage.get() ? UserStorage.get().type : null, type: UserStorage.get() ? UserStorage.get().type : null,
statistics: {}, statistics: {},
}), }),
computed: {
...mapState("users", ["filters"]),
},
methods: { methods: {
...mapMutations("users", ["SET_FILTER_USER"]),
async loadStatistic() { async loadStatistic() {
let repository = new StatisticRepository(); let repository = new StatisticRepository();
this.statistics = this.statistics =
@ -242,6 +231,36 @@ export default {
? await repository.indexTrainee() ? await repository.indexTrainee()
: false; : false;
}, },
trainersList() {
// this.SET_FILTER_USER({});
// this.SET_FILTER_USER({
// role_name: {
// type: "in",
// val: "trainer",
// },
// });
this.$router.push({
name: "users",
query: {
role_name: "trainer",
},
});
},
traineesList() {
// this.SET_FILTER_USER({});
// this.SET_FILTER_USER({
// role_name: {
// type: "in",
// val: "trainee",
// },
// });
this.$router.push({
name: "users",
query: {
role_name: "trainee",
},
});
},
}, },
created() { created() {
this.loadStatistic(); this.loadStatistic();
@ -263,4 +282,4 @@ export default {
margin-left: 0; margin-left: 0;
} }
} }
</style> </style>

@ -1,6 +1,6 @@
<template> <template>
<div class="wa__link pa-3"> <div class="wa__link pa-3">
<router-link :to="{ name: link }"> <router-link :tag="link ? 'a' : 'div'" :to="{ name: link }" :disabled="!link">
<div class="dark icon"><i :class="icon"></i></div> <div class="dark icon"><i :class="icon"></i></div>
<div class="mt-1 text__link"> <div class="mt-1 text__link">
{{ text }} {{ text }}
@ -32,4 +32,4 @@ export default {
text-align: center; text-align: center;
font-size: 21px; font-size: 21px;
} }
</style> </style>

@ -110,8 +110,8 @@ export default {
{ {
id: 3, id: 3,
text: "my programs", text: "my programs",
link: "trainPrograms", link: "trainsPrograms",
active: this.$route.name === "trainPrograms", active: this.$route.name === "trainsPrograms",
}, },
{ {
id: 4, id: 4,
@ -142,8 +142,8 @@ export default {
{ {
id: 3, id: 3,
text: "my programs", text: "my programs",
link: "trainPrograms", link: "trainsPrograms",
active: this.$route.name === "trainPrograms", active: this.$route.name === "trainsPrograms",
}, },
{ {
id: 5, id: 5,
@ -155,8 +155,5 @@ export default {
return menuItems; return menuItems;
}, },
}, },
created() {
console.log(this.$route.name);
},
}; };
</script> </script>

@ -85,9 +85,6 @@ export default {
methods: { methods: {
...mapActions("programs", ["verifyProgram", "deleteProgram"]), ...mapActions("programs", ["verifyProgram", "deleteProgram"]),
}, },
created() {
console.log(this.program);
},
}; };
</script> </script>
<style scoped> <style scoped>

@ -19,7 +19,7 @@
height="54" height="54"
size="x-large" size="x-large"
:text-mode="true" :text-mode="true"
text="2" :text="getFilterCount ? getFilterCount : '0'"
@click.native="$_openModal('filters')" @click.native="$_openModal('filters')"
/> />
<router-link :to="{ name: 'addProgram' }" class="text-decoration-none"> <router-link :to="{ name: 'addProgram' }" class="text-decoration-none">
@ -49,7 +49,7 @@
</div> </div>
</main-back> </main-back>
<div class="text-center"> <div class="text-center">
<FiltersModal @filter="load" @filterCount="filterCount($event)" /> <FiltersModal @filter="load" />
</div> </div>
</div> </div>
</template> </template>
@ -58,7 +58,7 @@ 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 { mapGetters, mapActions, mapMutations } from "vuex"; import { mapGetters, mapActions, mapMutations } from "vuex";
import _ from "lodash"; // import _ from "lodash";
export default { export default {
components: { components: {
SectionTitle, SectionTitle,
@ -66,7 +66,7 @@ export default {
FiltersModal, FiltersModal,
}, },
computed: { computed: {
...mapGetters("programs", ["getPrograms", "getPaginationProgram"]), ...mapGetters("programs", ["getPrograms", "getPaginationProgram", "getFilterCount"]),
}, },
methods: { methods: {
...mapActions("programs", ["loadPrograms"]), ...mapActions("programs", ["loadPrograms"]),
@ -80,14 +80,14 @@ export default {
async load() { async load() {
await this.loadPrograms(); await this.loadPrograms();
}, },
filterCount(event) { // filterCount(event) {
const atLeast9Wins = _.flow([ // const filterLength = _.flow([
Object.entries, // Object.entries,
(arr) => arr.filter(([, value]) => value.val !== null), // (arr) => arr.filter(([, value]) => value.val !== null),
Object.fromEntries, // Object.fromEntries,
])(event); // ])(event);
console.log(atLeast9Wins); // console.log(filterLength, Object.keys(filterLength).length);
}, // },
}, },
created() { created() {
this.load(); this.load();

@ -26,7 +26,6 @@
placeholder="course name" placeholder="course name"
label="course name" label="course name"
v-model="filter.title.val" v-model="filter.title.val"
ref="filter"
></v-text-field> ></v-text-field>
</div> </div>
</div> </div>
@ -37,7 +36,6 @@
placeholder="mentor name" placeholder="mentor name"
label="mentor name" label="mentor name"
v-model="filter.first_name.val" v-model="filter.first_name.val"
ref="filter"
></v-text-field> ></v-text-field>
</div> </div>
</div> </div>
@ -51,7 +49,6 @@
item-text="text" item-text="text"
item-value="verified" item-value="verified"
v-model="filter.verified.val" v-model="filter.verified.val"
ref="filter"
></v-autocomplete> ></v-autocomplete>
</div> </div>
</div> </div>
@ -61,7 +58,6 @@
class="no-error-msg" class="no-error-msg"
label="date, after" label="date, after"
v-model="filter.created_at.val1" v-model="filter.created_at.val1"
ref="filter"
/> />
</div> </div>
</div> </div>
@ -71,7 +67,6 @@
class="no-error-msg" class="no-error-msg"
label="date, before" label="date, before"
v-model="filter.created_at.val2" v-model="filter.created_at.val2"
ref="filter"
/> />
</div> </div>
</div> </div>
@ -146,7 +141,6 @@ export default {
...mapMutations("programs", ["SET_FILTER_PROGRAMS"]), ...mapMutations("programs", ["SET_FILTER_PROGRAMS"]),
filterPrograms() { filterPrograms() {
this.SET_FILTER_PROGRAMS(this.filter); this.SET_FILTER_PROGRAMS(this.filter);
console.log("this.$refs.filter.value", this.$refs.filter);
this.$emit("filter"); this.$emit("filter");
this.$emit("filterCount", this.filter); this.$emit("filterCount", this.filter);
this.$_closeModal(); this.$_closeModal();

@ -13,15 +13,20 @@
/> />
</div> </div>
</div> </div>
<v-row class="mt-4"> <template v-if="getPrograms.length">
<v-col <v-row class="mt-4">
class="pr-0 pt-0 pb-1" <v-col
v-for="(trainProgram, i) in getPrograms" class="pr-0 pt-0 pb-1"
:key="i" v-for="(trainProgram, i) in getPrograms"
cols="12" :key="i"
><TrainProgramItem :program="trainProgram" cols="12"
/></v-col> ><TrainProgramItem :program="trainProgram"
</v-row> /></v-col>
</v-row>
</template>
<template v-else>
<div class="text-center mt-10">There are no items to display</div>
</template>
</div> </div>
</main-back> </main-back>
</div> </div>
@ -35,26 +40,6 @@ export default {
SectionTitle, SectionTitle,
TrainProgramItem, TrainProgramItem,
}, },
data: () => ({
trainPrograms: [
{
name: "My gym program",
text: "Forearm and chest",
sets: 3,
workout: 12,
started_in: "25-12-2021",
done: 80,
},
{
name: "basic yoga",
text: "for relaxation",
sets: 1,
workout: 3,
started_in: "25-12-2019",
done: 20,
},
],
}),
computed: { computed: {
...mapGetters("userPrograms", ["getPrograms"]), ...mapGetters("userPrograms", ["getPrograms"]),
}, },
@ -65,4 +50,4 @@ export default {
await this.loadPrograms(); await this.loadPrograms();
}, },
}; };
</script> </script>

@ -89,9 +89,6 @@ export default {
}); });
}, },
}, },
created() {
console.log(this.user);
},
}; };
</script> </script>
<style scoped> <style scoped>

@ -19,33 +19,34 @@
size="x-large" size="x-large"
height="54" height="54"
:text-mode="true" :text-mode="true"
text="2" :text="getFilterCount ? getFilterCount : '0'"
@click.native="$_openModal('filters')" @click.native="$_openModal('filters')"
/> />
</div> </div>
</div> </div>
<v-row v-for="(user, i) in getUsers" :key="i" class="mt-4"> <v-row v-for="(user, i) in getUsers" :key="i" class="mt-4">
<v-col cols="12"><UserItem :user="user" @userId="userId" /></v-col> <v-col cols="12"><UserItem :user="user" @userId="userId" /></v-col>
</v-row> </v-row>
</div> </div>
<div class="text-center mt-40 mb-5"> <div class="text-center mt-40 mb-5">
<pagination <pagination :pagination="getPaginationUser" @pagination="changePagination" />
:pagination="getPaginationUser"
@pagination="changePagination"
/>
</div> </div>
</main-back> </main-back>
<div class="text-center"> <div class="text-center">
<ChangeRoleModal :userId="id" /><FiltersModal @filter="load" /> <ChangeRoleModal :allRoles="getRoles" :userId="id" /><FiltersModal
@filter="load"
:allRoles="getRoles"
/>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import SectionTitle from "../Global/Section/SectionTitle.vue"; import SectionTitle from "../Global/Section/SectionTitle.vue";
import ChangeRoleModal from "./Modals/ChangeRoleModal.vue"; import ChangeRoleModal from "./Modals/ChangeRoleModal.vue";
import FiltersModal from "./Modals/FiltersModal.vue"; import FiltersModal from "./Modals/FiltersModal.vue";
import UserItem from "./Item.vue"; import UserItem from "./Item.vue";
import { mapActions, mapGetters, mapMutations } from "vuex"; import { mapActions, mapGetters, mapMutations, mapState } from "vuex";
import { UserStorage } from "@/utils/storage"; import { UserStorage } from "@/utils/storage";
export default { export default {
@ -60,10 +61,16 @@ export default {
id: null, id: null,
}), }),
computed: { computed: {
...mapGetters("users", ["getUsers", "getPaginationUser"]), ...mapGetters("users", [
"getUsers",
"getPaginationUser",
"getRoles",
"getFilterCount",
]),
...mapState("users", ["filters"]),
}, },
methods: { methods: {
...mapActions("users", ["loadUsers", "loadTrainerTrainee"]), ...mapActions("users", ["loadUsers", "loadTrainerTrainee", "laodRoles"]),
...mapMutations("users", ["SET_PAGINATION"]), ...mapMutations("users", ["SET_PAGINATION"]),
changePagination(page) { changePagination(page) {
if (this.getPaginationUser.page !== page) { if (this.getPaginationUser.page !== page) {
@ -72,16 +79,18 @@ export default {
} }
}, },
async load() { async load() {
this.type === "admin" this.type === "admin" ? await this.loadUsers() : await this.loadTrainerTrainee();
? await this.loadUsers()
: await this.loadTrainerTrainee();
}, },
userId(id) { userId(id) {
this.id = id; this.id = id;
}, },
}, },
created() { async created() {
this.load(); if (!this.$route.query.role_name) {
this.load();
}
await this.laodRoles();
this.getRoles.push({ id: 0, name: "trainee" });
}, },
}; };
</script> </script>

@ -52,38 +52,36 @@
</basic-modal> </basic-modal>
</template> </template>
<script> <script>
import { mapActions, mapGetters } from "vuex"; import { mapActions } from "vuex";
import SectionTitle from "../../Global/Section/SectionTitle.vue"; import SectionTitle from "../../Global/Section/SectionTitle.vue";
import toast from "@/utils/toast"; import toast from "@/utils/toast";
export default { export default {
name: "modal_changeRole", name: "modal_changeRole",
components: { SectionTitle }, components: { SectionTitle },
props: { props: {
allRoles: {
type: Array,
},
userId: {}, userId: {},
}, },
data: () => ({ data: () => ({
allRoles: [],
role_id: null, role_id: null,
currectRoleId: null, currectRoleId: null,
}), }),
computed: { computed: {
...mapGetters("users", ["getRoles"]),
form() { form() {
return { userId: this.userId }; return { userId: this.userId };
}, },
}, },
methods: { methods: {
...mapActions("users", ["laodRoles", "updateRole"]), ...mapActions("users", ["updateRole"]),
openModal({ role }) { openModal({ role }) {
this.currectRoleId = role ? role : 0; this.currectRoleId = role ? role : 0;
this.role_id = role ? role : 0; this.role_id = role ? role : 0;
console.log("this.form", this.form);
}, },
change() { change() {
this.form.roles_id = []; this.form.roles_id = [];
this.form.roles_id.push(this.role_id); this.form.roles_id.push(this.role_id);
console.log(this.form.roles_id);
console.log(this.role_id);
}, },
async changeRole() { async changeRole() {
if (this.form.roles_id) { if (this.form.roles_id) {
@ -103,11 +101,6 @@ export default {
} }
}, },
}, },
async created() {
await this.laodRoles();
this.allRoles = this.getRoles;
this.allRoles.push({ id: 0, name: "trainee" });
},
}; };
</script> </script>
<style scoped> <style scoped>

@ -29,7 +29,7 @@
></v-text-field> ></v-text-field>
</div> </div>
</div> </div>
<div class="my-6"> <div class="my-6" v-if="type === 'admin'">
<div> <div>
<v-autocomplete <v-autocomplete
class="no-error-msg pt-0" class="no-error-msg pt-0"
@ -88,8 +88,9 @@
</template> </template>
<script> <script>
import SectionTitle from "../../Global/Section/SectionTitle.vue"; import SectionTitle from "../../Global/Section/SectionTitle.vue";
import { mapActions, mapGetters, mapMutations } from "vuex"; import { mapMutations } from "vuex";
import { cloneDeep } from "lodash"; import { cloneDeep } from "lodash";
import { UserStorage } from "@/utils/storage";
const defaultFilter = { const defaultFilter = {
first_name: { first_name: {
type: "like", type: "like",
@ -110,14 +111,14 @@ export default {
components: { SectionTitle }, components: { SectionTitle },
data: () => ({ data: () => ({
filter: cloneDeep(defaultFilter), filter: cloneDeep(defaultFilter),
allRoles: null, type: UserStorage.get() ? UserStorage.get().type : null,
}), }),
computed: { props: {
...mapGetters("users", ["getRoles"]), allRoles: {},
}, },
methods: { methods: {
...mapMutations("users", ["SET_FILTER_USER"]), ...mapMutations("users", ["SET_FILTER_USER"]),
...mapActions("users", ["laodRoles"]), // ...mapActions("users", ["laodRoles"]),
filterUser() { filterUser() {
this.SET_FILTER_USER(this.filter); this.SET_FILTER_USER(this.filter);
this.$emit("filter"); this.$emit("filter");
@ -130,10 +131,11 @@ export default {
this.$_closeModal(); this.$_closeModal();
}, },
}, },
async created() { created() {
await this.laodRoles(); if (this.$route.query.role_name) {
this.allRoles = this.getRoles; this.filter.role_name.val = this.$route.query.role_name;
this.allRoles.push({ id: 0, name: "trainee" }); this.filterUser();
}
}, },
}; };
</script> </script>

@ -18,12 +18,10 @@
icon-right="WMi-filter" icon-right="WMi-filter"
class="custom-btn filter-btn mr-2" class="custom-btn filter-btn mr-2"
height="54" height="54"
text="2" :text="getFilterCount ? getFilterCount : '0'"
@click.native="$_openModal('filters')" @click.native="$_openModal('filters')"
/> />
<router-link <router-link class="text-decoration-none" :to="{ name: 'addWorkout' }"
class="text-decoration-none"
:to="{ name: 'addWorkout' }"
><RectangleButton ><RectangleButton
size="xx-large" size="xx-large"
icon="WMi-plus" icon="WMi-plus"
@ -32,23 +30,25 @@
/></router-link> /></router-link>
</div> </div>
</div> </div>
<v-row class="mt-10"> <template v-if="getWorkouts.length">
<v-col <v-row class="mt-10">
cols="12" <v-col
md="6" cols="12"
class="mb-3" md="6"
v-for="workout in getWorkouts" class="mb-3"
:key="workout.id" v-for="workout in getWorkouts"
><WorkoutItem :workout="workout" :key="workout.id"
/></v-col> ><WorkoutItem :workout="workout"
</v-row> /></v-col>
</v-row>
</template>
</div> </div>
<div class="text-center mt-40 mb-5"> <div class="text-center mt-40 mb-5" v-if="getWorkouts.length">
<pagination <pagination :pagination="getPaginationWorkout" @pagination="changePagination" />
:pagination="getPaginationWorkout"
@pagination="changePagination"
/>
</div> </div>
<template v-if="!getWorkouts.length">
<div class="text-center">There are no items to display</div>
</template>
</main-back> </main-back>
<div class="text-center"><FiltersModal @filter="load" /></div> <div class="text-center"><FiltersModal @filter="load" /></div>
</div> </div>
@ -65,7 +65,7 @@ export default {
FiltersModal, FiltersModal,
}, },
computed: { computed: {
...mapGetters("workouts", ["getWorkouts", "getPaginationWorkout"]), ...mapGetters("workouts", ["getWorkouts", "getPaginationWorkout", "getFilterCount"]),
}, },
methods: { methods: {
...mapActions("workouts", ["loadWorkouts"]), ...mapActions("workouts", ["loadWorkouts"]),
@ -84,4 +84,4 @@ export default {
this.load(); this.load();
}, },
}; };
</script> </script>

@ -93,9 +93,6 @@ export default {
}); });
}, },
}, },
created() {
console.log(this.seriesWorkout);
}
}; };
</script> </script>
<style scoped> <style scoped>

@ -63,15 +63,17 @@ function beforeLoad() {
setTitle(to); setTitle(to);
const auth = to.meta && to.meta.auth ? to.meta.auth : false; const auth = to.meta && to.meta.auth ? to.meta.auth : false;
const roles = to.meta && to.meta.roles ? to.meta.roles : false; const roles = to.meta && to.meta.roles ? to.meta.roles : false;
const onlyWhenLoggedOut = to.matched.some((record) => record.meta.onlyWhenLoggedOut);
const loggedIn = TokenStorage.hasToken(); const loggedIn = TokenStorage.hasToken();
console.log(auth, loggedIn);
if (auth && !loggedIn) { if (auth && !loggedIn) {
router.push({ name: 'login', query: { redirect: to.fullPath } }); router.push({ name: 'login', query: { redirect: to.fullPath } });
} }
if (loggedIn && onlyWhenLoggedOut) {
return next('/');
}
if (loggedIn && roles && Array.isArray(roles)) { if (loggedIn && roles && Array.isArray(roles)) {
const ownType = UserStorage.get() ? UserStorage.get().role : ''; const ownType = UserStorage.get() ? UserStorage.get().type : '';
if (!roles.includes(ownType)) { if (!roles.includes(ownType)) {
router.push({ name: 'dashboard' }); router.push({ name: 'dashboard' });
} }

@ -3,16 +3,25 @@ export default [
path: '/register', path: '/register',
view: 'Register', view: 'Register',
name: 'register', name: 'register',
meta: {
onlyWhenLoggedOut: true
}
}, },
{ {
path: '/login', path: '/login',
view: 'Login', view: 'Login',
name: 'login', name: 'login',
meta: {
onlyWhenLoggedOut: true
}
}, },
{ {
path: '/reset-password', path: '/reset-password',
view: 'PasswordReset', view: 'PasswordReset',
name: 'passwordReset' name: 'passwordReset',
meta: {
onlyWhenLoggedOut: true
}
}, },
{ {
path: '/', path: '/',
@ -23,76 +32,91 @@ export default [
{ {
path: '/users', path: '/users',
view: 'Users', view: 'Users',
name: 'users' name: 'users',
meta: { auth: true, roles: ["admin", "trainer"] }
}, },
{ {
path: '/profile', path: '/profile',
view: 'Profile', view: 'Profile',
name: 'profile' name: 'profile',
meta: { auth: true }
}, },
{ {
path: '/workouts', path: '/workouts',
view: 'Workouts', view: 'Workouts',
name: 'workouts' name: 'workouts',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/add-program', path: '/add-program',
view: 'AddProgram', view: 'AddProgram',
name: 'addProgram' name: 'addProgram',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/edit-program/:id?', path: '/edit-program/:id?',
view: 'AddProgram', view: 'AddProgram',
name: 'editProgram' name: 'editProgram',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/add-workout', path: '/add-workout',
view: 'AddWorkout', view: 'AddWorkout',
name: 'addWorkout' name: 'addWorkout',
meta: { auth: true }
}, },
{ {
path: '/edit-workout/:id?', path: '/edit-workout/:id?',
view: 'AddWorkout', view: 'AddWorkout',
name: 'editWorkout' name: 'editWorkout',
meta: { auth: true }
}, },
{ {
path: '/programs', path: '/programs',
view: 'Programs', view: 'Programs',
name: 'programs' name: 'programs',
meta: { auth: true }
}, },
{ {
path: '/programs/:id/series', path: '/programs/:id/series',
view: 'ProgramSeries', view: 'ProgramSeries',
name: 'programSeries' name: 'programSeries',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/programs/:programId/series/:seriesId/workouts', path: '/programs/:programId/series/:seriesId/workouts',
view: 'WorkoutsSeries', view: 'WorkoutsSeries',
name: 'workoutsSeries' name: 'workoutsSeries',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/trains-programs', path: '/trains-programs',
view: 'TrainsPrograms', view: 'TrainsPrograms',
name: 'trainPrograms' name: 'trainsPrograms',
}, },
{ {
path: '/products', path: '/products',
view: 'Products', view: 'Products',
name: 'products' name: 'products',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/add-product', path: '/add-product',
view: 'AddProduct', view: 'AddProduct',
name: 'addProduct' name: 'addProduct',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/edit-product/:id?', path: '/edit-product/:id?',
view: 'AddProduct', view: 'AddProduct',
name: 'editProduct' name: 'editProduct',
meta: { auth: true, roles: ["admin"] }
}, },
{ {
path: '/bookmarks', path: '/bookmarks',
view: 'Bookmarks', view: 'Bookmarks',
name: 'bookmarks' name: 'bookmarks',
meta: { auth: true }
}, },
] ]

@ -1,10 +1,13 @@
import ProgramRepository from "@/abstraction/repository/programRepository"; import ProgramRepository from "@/abstraction/repository/programRepository";
import { setQuery } from "@/abstraction/resources/programResource";
export default { export default {
async loadPrograms({ state, commit }) { async loadPrograms({ state, commit }) {
try { try {
let data = { pagination: state.pagination, filters: state.filters }; let data = { pagination: state.pagination, filters: state.filters };
let repository = new ProgramRepository(); let repository = new ProgramRepository();
const resource = await repository.index(data); const resource = await repository.index(data);
let filterCount = setQuery({ filters: state.filters })
commit("SET_FILTER_COUNT", Object.keys(filterCount).length);
commit("SET_PROGRAMS", resource.data); commit("SET_PROGRAMS", resource.data);
commit("SET_PAGINATION", resource.pagination); commit("SET_PAGINATION", resource.pagination);
} }

@ -1,5 +1,6 @@
export default { export default {
getPrograms: state => state.programs, getPrograms: state => state.programs,
getProgram: state => state.program, getProgram: state => state.program,
getPaginationProgram: state => state.pagination getPaginationProgram: state => state.pagination,
getFilterCount: state => state.filterCount
}; };

@ -1,5 +1,6 @@
import Vue from "vue"; import Vue from "vue";
export default { export default {
// SETS
SET_PROGRAMS(state, payload) { SET_PROGRAMS(state, payload) {
Vue.set(state, "programs", payload); Vue.set(state, "programs", payload);
}, },
@ -9,25 +10,32 @@ export default {
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);
console.log('state.pagination', state.pagination);
}, },
SET_FILTER_PROGRAMS(state, payload) { SET_FILTER_PROGRAMS(state, payload) {
Vue.set(state, "filters", payload); Vue.set(state, "filters", payload);
state.pagination.page = 1 state.pagination.page = 1
}, },
SET_FILTER_COUNT(state, payload) {
console.log(payload);
Vue.set(state, "filterCount", payload);
},
// ADD
ADD_PROGRAM(state, payload) { ADD_PROGRAM(state, payload) {
state.programs.push(payload); state.programs.push(payload);
}, },
// UPDATE
UPDATE_PROGRAM(state, payload) { UPDATE_PROGRAM(state, payload) {
const index = state.programs.findIndex((x) => x.id === payload.id); const index = state.programs.findIndex((x) => x.id === payload.id);
Vue.set(state.programs, index, payload); Vue.set(state.programs, index, payload);
}, },
// DELETE
DELETE_PROGRAM(state, payload) { DELETE_PROGRAM(state, payload) {
const index = state.programs.findIndex((x) => x.id === payload); const index = state.programs.findIndex((x) => x.id === payload);
Vue.delete(state.programs, index); Vue.delete(state.programs, index);
Vue.set(state.pagination, 'itemsLength', state.pagination.itemsLength - 1); Vue.set(state.pagination, 'itemsLength', state.pagination.itemsLength - 1);
Vue.set(state.pagination, 'pageStop', state.pagination.pageStop - 1); Vue.set(state.pagination, 'pageStop', state.pagination.pageStop - 1);
}, },
// OTHER
VERIFY_PROGRAM(state, payload) { VERIFY_PROGRAM(state, payload) {
const index = state.programs.find(x => x.id === payload); const index = state.programs.find(x => x.id === payload);
index.verified = !index.verified; index.verified = !index.verified;

@ -4,5 +4,6 @@ export default {
pagination: { pagination: {
itemsPerPage: 12 itemsPerPage: 12
}, },
filters: {} filters: {},
filterCount: null
}; };

@ -1,10 +1,13 @@
import UserRepository from "@/abstraction/repository/userRepository"; import UserRepository from "@/abstraction/repository/userRepository";
import RoleRepository from "@/abstraction/repository/roleRepository"; import RoleRepository from "@/abstraction/repository/roleRepository";
import { setQuery } from "@/abstraction/resources/userResource";
export default { export default {
async loadUsers({ state, commit }) { async loadUsers({ state, commit }) {
let data = { pagination: state.pagination, filters: state.filters } let data = { pagination: state.pagination, filters: state.filters }
let repository = new UserRepository(); let repository = new UserRepository();
const resource = await repository.indexUsers(data); const resource = await repository.indexUsers(data);
let filterCount = setQuery({ filters: state.filters })
commit("SET_FILTER_COUNT", Object.keys(filterCount).length);
commit("SET_USERS", resource.data); commit("SET_USERS", resource.data);
commit("SET_PAGINATION", resource.pagination); commit("SET_PAGINATION", resource.pagination);
}, },
@ -23,7 +26,6 @@ export default {
async updateRole({ commit }, data) { async updateRole({ commit }, data) {
let repository = new RoleRepository(); let repository = new RoleRepository();
const resource = await repository.update(data); const resource = await repository.update(data);
console.log(resource);
commit("UPDATE_USER", resource); commit("UPDATE_USER", resource);
}, },
async deleteUser({ commit }, userId) { async deleteUser({ commit }, userId) {

@ -1,5 +1,6 @@
export default { export default {
getUsers: state => state.users, getUsers: state => state.users,
getRoles: state => state.roles, getRoles: state => state.roles,
getPaginationUser: state => state.pagination getPaginationUser: state => state.pagination,
getFilterCount: state => state.filterCount
}; };

@ -1,5 +1,6 @@
import Vue from "vue"; import Vue from "vue";
export default { export default {
// SET
SET_USERS(state, payload) { SET_USERS(state, payload) {
Vue.set(state, "users", payload); Vue.set(state, "users", payload);
}, },
@ -14,11 +15,15 @@ export default {
SET_ROLES(state, payload) { SET_ROLES(state, payload) {
Vue.set(state, "roles", payload); Vue.set(state, "roles", payload);
}, },
SET_FILTER_COUNT(state, payload) {
Vue.set(state, "filterCount", payload);
},
// UPDATE
UPDATE_USER(state, payload) { UPDATE_USER(state, payload) {
console.log(payload);
const index = state.users.findIndex((x) => x.id === payload.id); const index = state.users.findIndex((x) => x.id === payload.id);
Vue.set(state.users, index, payload); Vue.set(state.users, index, payload);
}, },
// DELETE
DELETE_USER(state, userId) { DELETE_USER(state, userId) {
const index = state.users.findIndex((x) => x.id === userId); const index = state.users.findIndex((x) => x.id === userId);
Vue.delete(state.users, index); Vue.delete(state.users, index);

@ -4,5 +4,6 @@ export default {
pagination: { pagination: {
itemsPerPage: 12 itemsPerPage: 12
}, },
filters: {} filters: {},
filterCount: null
}; };

@ -1,10 +1,13 @@
import WorkoutRepository from "@/abstraction/repository/workoutRepository"; import WorkoutRepository from "@/abstraction/repository/workoutRepository";
import { setQuery } from "@/abstraction/resources/workoutResource";
export default { export default {
async loadWorkouts({ state, commit }) { async loadWorkouts({ state, commit }) {
try { try {
let data = { pagination: state.pagination, filters: state.filters }; let data = { pagination: state.pagination, filters: state.filters };
let repository = new WorkoutRepository(); let repository = new WorkoutRepository();
const resource = await repository.index(data); const resource = await repository.index(data);
let filterCount = setQuery({ filters: state.filters })
commit("SET_FILTER_COUNT", Object.keys(filterCount).length);
commit("SET_WORKOUTS", resource.data); commit("SET_WORKOUTS", resource.data);
commit("SET_PAGINATION", resource.pagination); commit("SET_PAGINATION", resource.pagination);
} catch (e) { } catch (e) {

@ -1,5 +1,6 @@
export default { export default {
getWorkouts: state => state.workouts, getWorkouts: state => state.workouts,
getWorkout: state => state.workout, getWorkout: state => state.workout,
getPaginationWorkout: state => state.pagination getPaginationWorkout: state => state.pagination,
getFilterCount: state => state.filterCount
} }

@ -1,5 +1,6 @@
import Vue from "vue"; import Vue from "vue";
export default { export default {
// SET
SET_WORKOUTS(state, payload) { SET_WORKOUTS(state, payload) {
Vue.set(state, "workouts", payload); Vue.set(state, "workouts", payload);
}, },
@ -14,13 +15,19 @@ export default {
Vue.set(state, "filters", payload); Vue.set(state, "filters", payload);
state.pagination.page = 1 state.pagination.page = 1
}, },
SET_FILTER_COUNT(state, payload) {
Vue.set(state, "filterCount", payload);
},
// ADD
ADD_WORKOUT(state, payload) { ADD_WORKOUT(state, payload) {
state.workouts.push(payload); state.workouts.push(payload);
}, },
// UPDATE
UPDATE_WORKOUT(state, payload) { UPDATE_WORKOUT(state, payload) {
const index = state.workouts.findIndex((x) => x.id === payload.id); const index = state.workouts.findIndex((x) => x.id === payload.id);
Vue.set(state.workouts, index, payload); Vue.set(state.workouts, index, payload);
}, },
// DELETE
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);
Vue.delete(state.workouts, index); Vue.delete(state.workouts, index);

@ -4,5 +4,6 @@ export default {
pagination: { pagination: {
itemsPerPage: 12 itemsPerPage: 12
}, },
filters: {} filters: {},
filterCount: null
}; };

@ -13,7 +13,7 @@
<div class="auth__subtitle text-uppercase mb-2"> <div class="auth__subtitle text-uppercase mb-2">
please provide us your login details please provide us your login details
</div> </div>
<form> <v-form @submit.prevent="doLogin">
<v-row> <v-row>
<v-col cols="12"> <v-col cols="12">
<v-text-field <v-text-field
@ -47,7 +47,7 @@
height="25" height="25"
:text-mode="true" :text-mode="true"
text="sign in" text="sign in"
@click.native="doLogin" type="submit"
/> />
</div> </div>
</v-col> </v-col>
@ -78,7 +78,7 @@
</div> </div>
</v-col> </v-col>
</v-row> </v-row>
</form> </v-form>
</v-col> </v-col>
</template> </template>
</auth-basic> </auth-basic>
@ -111,4 +111,4 @@ export default {
}, },
}, },
}; };
</script> </script>

@ -13,7 +13,7 @@
<div class="auth__subtitle text-uppercase mb-2"> <div class="auth__subtitle text-uppercase mb-2">
please provide us this information please provide us this information
</div> </div>
<form> <v-form @submit.prevent="doRegister">
<v-row> <v-row>
<v-col cols="12"> <v-col cols="12">
<v-text-field <v-text-field
@ -51,6 +51,9 @@
placeholder="password" placeholder="password"
label="password" label="password"
class="no-error-msg" class="no-error-msg"
:type="showPassword ? 'text' : 'password'"
@click:append="showPassword = !showPassword"
:append-icon="showPassword ? 'WMi-eye-off' : 'WMi-eye'"
dark dark
v-model="form.password" v-model="form.password"
></v-text-field> ></v-text-field>
@ -62,6 +65,9 @@
placeholder="your password again" placeholder="your password again"
label="your password again" label="your password again"
class="no-error-msg" class="no-error-msg"
:type="showPassword ? 'text' : 'password'"
@click:append="showPassword = !showPassword"
:append-icon="showPassword ? 'WMi-eye-off' : 'WMi-eye'"
dark dark
v-model="form.password_confirmation" v-model="form.password_confirmation"
></v-text-field> ></v-text-field>
@ -75,7 +81,7 @@
height="25" height="25"
:text-mode="true" :text-mode="true"
text="do sign up" text="do sign up"
@click.native="doRegister(form)" type="submit"
/> />
</div> </div>
</v-col> </v-col>
@ -105,7 +111,7 @@
</div> </div>
</v-col> </v-col>
</v-row> </v-row>
</form> </v-form>
</v-col> </v-col>
</template> </template>
</auth-basic> </auth-basic>
@ -125,6 +131,7 @@ export default {
AuthBasic, AuthBasic,
}, },
data: () => ({ data: () => ({
showPassword: false,
form: {}, form: {},
}), }),
methods: { methods: {
@ -137,4 +144,4 @@ export default {
}, },
}, },
}; };
</script> </script>

@ -22,10 +22,17 @@
</v-container> </v-container>
</template> </template>
<script> <script>
import { mapState } from 'vuex';
import UsersHome from "../components/Users/Main"; import UsersHome from "../components/Users/Main";
export default { export default {
components: { components: {
UsersHome, UsersHome,
}, },
computed: {
...mapState('users', ['filters']),
},
created() {
console.log(this.filters);
}
}; };
</script> </script>
Loading…
Cancel
Save