sajjad 3 years ago
parent b1634274e5
commit 7a5cf2f6ee

160
package-lock.json generated

@ -1768,63 +1768,6 @@
"integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
"dev": true "dev": true
}, },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"ssri": { "ssri": {
"version": "8.0.1", "version": "8.0.1",
"resolved": "https://registry.nlark.com/ssri/download/ssri-8.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fssri%2Fdownload%2Fssri-8.0.1.tgz", "resolved": "https://registry.nlark.com/ssri/download/ssri-8.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@ -1833,28 +1776,6 @@
"requires": { "requires": {
"minipass": "^3.1.1" "minipass": "^3.1.1"
} }
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.1.tgz",
"integrity": "sha512-V53TJbHmzjBhCG5OYI2JWy/aYDspz4oVHKxS43Iy212GjGIG1T3EsB3+GWXFm/1z5VwjdjLmdZUFYM70y77vtQ==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
} }
} }
}, },
@ -11492,6 +11413,87 @@
} }
} }
}, },
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.2",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.2.tgz",
"integrity": "sha512-Nkq+z9mAsMEK+qkXgK+9Ia7D8w9uu9j4ut0IMT5coMfux3rCgIp1QBB1CYwY0M34A1nRMSONEaWXxAAw6xSl/Q==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.1.tgz",
"integrity": "sha512-g4miPa9uUrZz4iElkaVJgDFwKJGh8aQGM7pUL4ejXl6cu7kSb30seQOVGNMP6sW8j7DW77X68hJZ+GM7UGhXeQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-meta": { "vue-meta": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz", "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz",

@ -0,0 +1,7 @@
export default (data) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(data);
}, 500);
});
}

@ -1,16 +1,15 @@
import axios from "axios"; import axios from "axios";
import url from "@/router/url"; import url from "@/router/url";
import { setData } from "../resources/authResource"; import { setData, getJson } from "../resources/authResource";
export default class AuthRepository { export default class AuthRepository {
async login(data) { async login(data) {
let json = setData(data); let json = setData(data);
let response = await axios.post(url("login"), json); let response = await axios.post(url("login"), json);
if (response.status === 200) { if (response.status === 200) {
return response.data.data; return getJson(response.data.data);
} }
} }
async logout() { async logout() {
let response = await axios.post(url("logout")); let response = await axios.post(url("logout"));
if (response.status === 200) { if (response.status === 200) {
@ -25,7 +24,6 @@ export default class AuthRepository {
return response.data; return response.data;
} }
} }
async resetPassword(data) { async resetPassword(data) {
let json = setData(data); let json = setData(data);
let response = await axios.post(url("resetPassword"), json); let response = await axios.post(url("resetPassword"), json);

@ -1,18 +1,24 @@
import axios from "axios"; import axios from "axios";
import url from "@/router/url"; import url from "@/router/url";
import { getJson, setData } from "../resources/programSerieResource"; import { getArray, getJson, setData } from "../resources/programSerieResource";
export default class ProgramSerieRepository { export default class ProgramSerieRepository {
async show(courseId) { async index(courseId) {
let response = await axios.get(url("showProgram", { course: courseId })); let response = await axios.get(url("indexSeries", { course: courseId }));
if (response.status === 200) { if (response.status === 200) {
return getJson(response.data.data); return getArray(response.data);
} }
} }
// async show(courseId) {
// let response = await axios.get(url("showProgram", { course: courseId }));
// if (response.status === 200) {
// return getJson(response.data.data);
// }
// }
async store(data, courseId) { async store(data, courseId) {
let json = setData(data); let json = setData(data);
let response = await axios.post(url("storeSerie", { course: courseId }), json); let response = await axios.post(url("storeSerie", { course: courseId }), json);
if (response.status === 201 || response.status === 200) { if (response.status === 201 || response.status === 200) {
return getJson(response.data); return getJson(response.data.data);
} }
} }
async delete(data) { async delete(data) {

@ -0,0 +1,5 @@
import { getArray } from '../resources/programSerieWorkoutsResource';
export default class ProgramSerieWorkoutsRepository {
}

@ -0,0 +1,23 @@
import axios from "axios";
import url from "@/router/url"
import { getJson } from "../resources/statisticResource";
export default class StatisticRepository {
async indexStatisticAdmin() {
let response = await axios.get(url("indexStatisticAdmin"));
if (response.status === 200) {
return getJson(response.data.data)
}
}
async indexStatisticTrainer() {
let response = await axios.get(url("indexStatisticTrainer"));
if (response.status === 200) {
return getJson(response.data.data)
}
}
async indexStatisticTrainee() {
let response = await axios.get(url("indexStatisticTrainee"));
if (response.status === 200) {
return getJson(response.data.data)
}
}
}

@ -3,6 +3,13 @@ import url from "@/router/url";
import { getJson, getArray, setQuery, setData } from "../resources/workoutResource.js"; import { getJson, getArray, setQuery, setData } from "../resources/workoutResource.js";
export default class WorkoutToSerieRepository { export default class WorkoutToSerieRepository {
async index(data) { async index(data) {
console.log(data);
let response = await axios.get(url("indexSerieWorkouts", { serie: data.serieId, course: data.courseId }));
if (response.status === 200) {
return getArray(response.data);
}
}
async indexWorkoutToSerie(data) {
let params = setQuery(data); let params = setQuery(data);
let response = await axios.get(url("indexClientWorkout"), { params }); let response = await axios.get(url("indexClientWorkout"), { params });
if (response.status === 200) { if (response.status === 200) {

@ -1,9 +1,13 @@
import { getJson as getJsonUser } from './usersResource'
export const getJson = (data) => ({
token: data.token,
user: data.user ? getJsonUser(data.user) : {}
});
export const setData = (data) => ({ export const setData = (data) => ({
first_name: data.first_name, first_name: data.first_name,
last_name: data.last_name, last_name: data.last_name,
email: data.email, email: data.email,
username: data.username, username: data.username,
password: data.password, password: data.password,
password_confirmation: data.password_confirmation, password_confirmation: data.password_confirmation,
}); });

@ -18,6 +18,10 @@ export const getJson = (data) => ({
repeat: data.repeat, repeat: data.repeat,
name: data.name name: data.name
}); });
export const getArray = ({ data }) => {
data = data.map(serie => getJson(serie));
return { data }
}
export const setData = (data) => { export const setData = (data) => {
let formData = { let formData = {
name: data.name, name: data.name,

@ -0,0 +1,27 @@
export const getJson = (data) => ({
"id": data.id,
"name": data.name,
"local_name": data.local_name,
"description": data.description,
"thumbnail": data.thumbnail,
"title": data.title,
"workout_category": {
"id": data.workout_category.id,
"name": data.workout_category.name,
"local_name": data.workout_category.local_name,
"language_id": data.workout_category.language_id
},
"video": data.video,
"set": data.set,
"per_set": data.per_set,
"trainer_description": data.trainer_description,
"estimate_time": data.estimate_time,
"suggested_time": data.suggested_time,
"suggested_per_set": data.suggested_per_set,
"suggested_set": data.suggested_set
});
export const getArray = ({ data }) => {
data = data.map(serie => getJson(serie));
return { data }
}

@ -0,0 +1,8 @@
export const getJson = (data) => ({
trainees_count: data.trainees_count,
trainers_count: data.trainers_count,
courses_count: data.courses_count,
workouts_count: data.workouts_count,
joined_courses_count: data.joined_courses_count,
total_series_done: data.total_series_done
})

@ -15,6 +15,11 @@ export const getJson = (data) => ({
cell_number: data.cell_number, cell_number: data.cell_number,
is_admin: data.is_admin, is_admin: data.is_admin,
is_trainer: data.is_trainer, is_trainer: data.is_trainer,
role: data.is_admin
? "admin"
: data.is_trainer
? "trainer"
: "trainee",
created_courses_count: data.created_courses_count, created_courses_count: data.created_courses_count,
joined_courses_count: data.joined_courses_count joined_courses_count: data.joined_courses_count
}); });

@ -14,6 +14,8 @@ export const getJson = (data) => ({
thumbnail: data.thumbnail, thumbnail: data.thumbnail,
title: data.title, title: data.title,
video: data.video, video: data.video,
set: data.set,
per_set: data.per_set,
}); });
export const setData = (data, isUpdate = false) => { export const setData = (data, isUpdate = false) => {
let formData = { let formData = {
@ -31,7 +33,7 @@ export const setData = (data, isUpdate = false) => {
tags: data.tags, tags: data.tags,
set: data.set, set: data.set,
per_set: data.per_set, per_set: data.per_set,
estimate_time: data.estimate_time estimate_time: data.estimate_time,
}; };
if (isUpdate) { if (isUpdate) {
formData["_method"] = "put"; formData["_method"] = "put";
@ -39,9 +41,12 @@ export const setData = (data, isUpdate = false) => {
return objectToFormData(formData); return objectToFormData(formData);
}; };
export const getArray = ({ data, meta }) => { export const getArray = ({ data, meta }) => {
const pagination = SetPagination(meta);
data = data.map((workout) => getJson(workout)); data = data.map((workout) => getJson(workout));
return { data, pagination }; if (meta) {
const pagination = SetPagination(meta);
return { data, pagination };
}
return { data }
}; };
export const setQuery = (data) => { export const setQuery = (data) => {

@ -1,7 +1,8 @@
<template> <template>
<div class="h-100"> <div class="h-100">
<main-back height="100%"> <main-back height="100%">
<div class="px-16 pb-10"> <!-- admin role -->
<div class="px-16 pb-10" v-if="role === 'admin'">
<div class="mt-11"> <div class="mt-11">
<div class="d-flex justify-center"><UserName role="admin" /></div> <div class="d-flex justify-center"><UserName role="admin" /></div>
</div> </div>
@ -47,19 +48,169 @@
</v-row> </v-row>
<v-row class="mx-md-16 mx-0"> <v-row class="mx-md-16 mx-0">
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification text="total trainees" quantity="112" ><Notification
text="total trainees"
:quantity="
statistics.trainees_count ? statistics.trainees_count : 0
"
/></v-col> /></v-col>
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification text="total trainers" quantity="15" ><Notification
text="total trainers"
:quantity="
statistics.trainers_count ? statistics.trainers_count : 0
"
/></v-col> /></v-col>
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification text="total programs" quantity="147" ><Notification
text="total programs"
:quantity="
statistics.courses_count ? statistics.courses_count : 0
"
/></v-col> /></v-col>
<v-col cols="12" sm="3" <v-col cols="12" sm="3"
><Notification text="moves defined" quantity="1140" ><Notification
text="moves defined"
:quantity="
statistics.workouts_count ? statistics.workouts_count : 0
"
/></v-col> /></v-col>
</v-row> </v-row>
</div> </div>
<!-- /admin role -->
<!-- trainer role -->
<div class="px-16 pb-10" v-if="role === 'trainer'">
<div class="mt-11">
<div class="d-flex justify-center"><UserName role="trainer" /></div>
</div>
<v-row class="mt-3">
<v-col cols="12">
<div class="">
<div class="text-left description">
here is your dashboard home, feel free navigate from right side
menu or choose from shortcuts we prepared for you.
</div>
</div>
</v-col>
</v-row>
<div class="mb-16 mt-10">
<div class="d-sm-grid d-flex justify-center">
<div class="mr-5 section">
<box text="programs" link="programs" icon="WMi-align-left" />
</div>
<div class="mr-5 section">
<box text="bookmarks" link="bookmarks" icon="WMi-bookmark" />
</div>
<div class="mr-5 section">
<box text="trainees" link="users" icon=" WMi-users" />
</div>
<div class="mr-5 section">
<box text="profile" link="profile" icon="WMi-user" />
</div>
</div>
</div>
<v-divider dark></v-divider>
<v-row class="mt-3">
<v-col cols="12">
<div class="d-flex justify-center pr-16">
<div class="text-left description">
and here is some stats we hope it gives you a great overview of
your status
</div>
</div>
</v-col>
</v-row>
<div class="mx-md-16 mx-0 d-flex justify-center">
<div>
<div class="mr-16">
<Notification
text="total trainees"
:quantity="
statistics.trainees_count ? statistics.trainees_count : 0
"
/>
</div>
</div>
<div>
<div class="ml-16">
<Notification
text="total programs"
:quantity="
statistics.courses_count ? statistics.courses_count : 0
"
/>
</div>
</div>
</div>
</div>
<!-- /trainer role -->
<!-- trainee role -->
<div class="px-16 pb-10" v-if="role === 'trainee'">
<div class="mt-11">
<div class="d-flex justify-center"><UserName role="trainee" /></div>
</div>
<v-row class="mt-3">
<v-col cols="12">
<div class="">
<div class="text-left description">
here is your dashboard home, feel free navigate from right side
menu or choose from shortcuts we prepared for you.
</div>
</div>
</v-col>
</v-row>
<div class="mb-16 mt-10">
<div class="d-sm-grid d-flex justify-center">
<div class="mr-5 section">
<box text="bookmarks" link="bookmarks" icon="WMi-bookmark" />
</div>
<div class="mr-5 section">
<box text="programs" link="trainPrograms" icon="WMi-align-left" />
</div>
<div class="mr-5 section">
<box text="profile" link="profile" icon="WMi-user" />
</div>
</div>
</div>
<v-divider dark></v-divider>
<v-row class="mt-3">
<v-col cols="12">
<div class="d-flex justify-center pr-16">
<div class="text-left description">
and here is some stats we hope it gives you a great overview of
your status
</div>
</div>
</v-col>
</v-row>
<div class="mx-md-16 mx-0 d-flex justify-center">
<div>
<div class="mr-16">
<Notification
text="programs joined"
:quantity="
statistics.joined_courses_count
? statistics.joined_courses_count
: 0
"
/>
</div>
</div>
<div>
<div class="ml-16">
<Notification
text="moves done"
:quantity="
statistics.total_series_done
? statistics.total_series_done
: 0
"
/>
</div>
</div>
</div>
</div>
<!-- /trainee role -->
</main-back> </main-back>
</div> </div>
</template> </template>
@ -67,12 +218,35 @@
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 StatisticRepository from "@/abstraction/repository/statisticRepository.js";
export default { export default {
components: { components: {
UserName, UserName,
Box, Box,
Notification, Notification,
}, },
data: () => ({
role: UserStorage.get() ? UserStorage.get().role : null,
statistics: {},
}),
methods: {
async loadStatistic() {
let repository = new StatisticRepository();
this.statistics =
this.role === "admin"
? await repository.indexStatisticAdmin()
: this.role === "trainer"
? await repository.indexStatisticTrainer()
: this.role === "trainee"
? await repository.indexStatisticTrainee()
: false;
console.log(this.statistics);
},
},
created() {
this.loadStatistic();
},
}; };
</script> </script>
<style scoped> <style scoped>

@ -3,7 +3,7 @@
<main-back height="100%"> <main-back height="100%">
<div class="mt-16"> <div class="mt-16">
<ul class="pl-0 ml-0"> <ul class="pl-0 ml-0">
<template> <template v-if="role === 'admin'">
<MenuItem :active="true" text="Home" link="dashboard" /> <MenuItem :active="true" text="Home" link="dashboard" />
<MenuItem text="my profile" link="profile" /> <MenuItem text="my profile" link="profile" />
<MenuItem text="my bookmarks" link="dashboard" /> <MenuItem text="my bookmarks" link="dashboard" />
@ -12,13 +12,13 @@
<MenuItem text="products" link="products" /> <MenuItem text="products" link="products" />
<MenuItem text="workouts" link="workouts" /> <MenuItem text="workouts" link="workouts" />
</template> </template>
<template> <template v-if="role === 'trainee'">
<MenuItem :active="true" text="Home" link="dashboardTrainee" /> <MenuItem :active="true" text="Home" link="dashboardTrainee" />
<MenuItem text="my profile" link="profile" /> <MenuItem text="my profile" link="profile" />
<MenuItem text="my programs" link="trainPrograms" /> <MenuItem text="my programs" link="trainPrograms" />
<MenuItem text="my bookmarks" link="bookmarks" /> <MenuItem text="my bookmarks" link="bookmarks" />
</template> </template>
<template> <template v-if="role === 'trainer'">
<MenuItem :active="true" text="Home" link="dashboardTrainer" /> <MenuItem :active="true" text="Home" link="dashboardTrainer" />
<MenuItem text="my profile" link="profile" /> <MenuItem text="my profile" link="profile" />
<MenuItem text="my programs" link="trainPrograms" /> <MenuItem text="my programs" link="trainPrograms" />
@ -31,10 +31,14 @@
</div> </div>
</template> </template>
<script> <script>
import MenuItem from "../Global/Section/MenuItem.vue"; import MenuItem from "./MenuItem.vue";
import { UserStorage } from "@/utils/storage";
export default { export default {
components: { components: {
MenuItem, MenuItem,
}, },
data: () => ({
role: UserStorage.get() ? UserStorage.get().role : null,
}),
}; };
</script> </script>

@ -30,7 +30,7 @@
<v-col cols="3"> <v-col cols="3">
<div class="d-flex align-center mt-n4"> <div class="d-flex align-center mt-n4">
<div class="series__per__week--quantity wa__f__m__eb mr-2"> <div class="series__per__week--quantity wa__f__m__eb mr-2">
{{ series.workouts_count }} {{ series.workouts_count ? series.workouts_count : 0 }}
</div> </div>
<div class="series__moves__text">moves added</div> <div class="series__moves__text">moves added</div>
</div> </div>

@ -23,22 +23,18 @@
/> />
</div> </div>
</div> </div>
<v-row <v-row v-for="(series, i) in getProgramSeries" :key="i" class="mt-4">
v-for="(series, i) in getProgramSerie.series"
:key="i"
class="mt-4"
>
<v-col cols="12" <v-col cols="12"
><SeriesItem ><SeriesItem
:seriesNumber="i + 1" :seriesNumber="i + 1"
:series="series" :series="series"
:programId="porgramtId" :programId="programId"
/></v-col> /></v-col>
</v-row> </v-row>
</div> </div>
</main-back> </main-back>
<div class="text-center"> <div class="text-center">
<AddSeriesModal :programId="porgramtId" /> <AddSeriesModal :programId="programId" />
</div> </div>
</div> </div>
</template> </template>
@ -55,16 +51,17 @@ export default {
AddSeriesModal, AddSeriesModal,
}, },
computed: { computed: {
...mapGetters("programSerie", ["getProgramSerie"]), ...mapGetters("programSerie", ["getProgramSeries"]),
porgramtId() { programId() {
return this.$route.params.id; return this.$route.params.id;
}, },
}, },
methods: { methods: {
...mapActions("programSerie", ["loadProgramSerie"]), ...mapActions("programSerie", ["loadProgramSeries"]),
}, },
async created() { async created() {
await this.loadProgramSerie(this.porgramtId); await this.loadProgramSeries(this.programId);
console.log("this.getProgramSeries", this.getProgramSeries);
}, },
}; };
</script> </script>

@ -59,6 +59,7 @@
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";
export default { export default {
components: { components: {
UserName, UserName,
@ -69,8 +70,8 @@ export default {
</script> </script>
<style scoped> <style scoped>
.section { .section {
width: 157px; width: 157px;
height: 157px; height: 157px;
} }
.description { .description {
color: var(--color-gray); color: var(--color-gray);

@ -2,66 +2,71 @@
<div class="user__card"> <div class="user__card">
<v-row> <v-row>
<v-col cols="3"> <v-col cols="3">
<div> <div class="d-flex align-center h-100" style="overflow: hidden">
<div class="user__name wa__f__m__eb"> <div style="line-height: 14px">
{{ user.first_name }} {{ user.last_name }} <div class="user__name wa__f__m__eb">
{{ user.first_name }} {{ user.last_name }}
</div>
<small class="user__email">{{ user.email }}</small>
</div> </div>
<small class="user__email">{{ user.email }}</small>
</div> </div>
</v-col> </v-col>
<v-col cols="3"> <v-col cols="3">
<div class="mt-n1"> <div class="d-flex align-center h-100">
<small>Role:</small> <div class="user__role">
<div class="user__role wa__f__m__eb text-uppercase"> <small>Role:</small>
{{ userRole }} <div class="wa__f__m__eb text-uppercase">
{{ userRole }}
</div>
</div> </div>
</div> </div>
</v-col> </v-col>
<v-col cols="3"> <v-col cols="3">
<div v-if="userRole == 'trainer'" class="d-flex align-center mt-n4"> <div class="d-flex align-center h-100">
<div class="user__program--quantity wa__f__m__eb mr-2"> <div v-if="userRole == 'trainer'" class="d-flex align-center">
{{ user.created_courses_count }} <div class="user__program--quantity wa__f__m__eb mr-2">
{{ user.created_courses_count }}
</div>
<div class="user__program__text">program created</div>
</div> </div>
<div class="user__program__text">program created</div> <div v-else-if="userRole == 'trainee'" class="d-flex align-center">
</div> <div class="user__program--quantity wa__f__m__eb mr-2">
<div {{ user.joined_courses_count }}
v-else-if="userRole == 'trainee'" </div>
class="d-flex align-center mt-n4" <div class="user__program__text">program attended</div>
>
<div class="user__program--quantity wa__f__m__eb mr-2">
{{ user.joined_courses_count }}
</div> </div>
<div class="user__program__text">program attended</div> <template v-else></template>
</div> </div>
<template v-else></template>
</v-col> </v-col>
<v-col cols="3" class="text-right"> <v-col cols="3">
<RectangleButton <div class="d-flex align-center h-100 justify-content-end">
height="35" <RectangleButton
width="48" height="35"
class="ml-1 custom-btn custom-icon" width="48"
icon="WMi-gold-medal" class="ml-1 custom-btn custom-icon"
@click.native="$_openModal('changeRole')" icon="WMi-gold-medal"
size="large" @click.native="$_openModal('changeRole')"
/> size="large"
<!-- <router-link :to="{ name: 'profile' }"> --> />
<RectangleButton <!-- <router-link :to="{ name: 'profile' }"> -->
height="35" <RectangleButton
width="48" height="35"
class="ml-1 custom-btn custom-icon" width="48"
size="large" class="ml-1 custom-btn custom-icon"
icon="WMi-pencil" size="large"
/> icon="WMi-pencil"
<!-- </router-link> --> />
<RectangleButton <!-- </router-link> -->
height="35" <RectangleButton
width="48" height="35"
class="ml-1 custom-btn custom-icon" width="48"
icon=" WMi-trash" class="ml-1 custom-btn custom-icon"
size="large" icon=" WMi-trash"
@click.native="deleteUser(user.id)" size="large"
/> @click.native="deleteUser(user.id)"
<i class="WMi-right-open ml-3"></i> />
<i class="WMi-right-open ml-3"></i>
</div>
</v-col> </v-col>
</v-row> </v-row>
</div> </div>
@ -95,7 +100,9 @@ export default {
height: 64px; height: 64px;
border-top: 1px solid var(--color-bg-black); border-top: 1px solid var(--color-bg-black);
border-bottom: 1px solid var(--color-bg-black); border-bottom: 1px solid var(--color-bg-black);
padding: 12px 0; /* padding: 12px 0; */
display: flex;
align-items: center;
} }
.user__program--quantity { .user__program--quantity {
font-size: 45px; font-size: 45px;
@ -117,11 +124,12 @@ export default {
} }
.user__email { .user__email {
position: relative; position: relative;
top: -0.7rem; /* top: -0.7rem;
font-size: 12px; font-size: 12px; */
} }
.user__role { .user__role {
position: relative; /* position: relative;
top: -0.6rem; top: -0.6rem; */
line-height: 15px;
} }
</style> </style>

@ -91,10 +91,11 @@ export default {
serieId: this.serieId, serieId: this.serieId,
workoutId: workout.id, workoutId: workout.id,
}); });
this.$emit("deleteWorkoutFromSerie", this.serieId);
console.log("this.getWorkoutsToSerie after", this.getWorkoutsToSerie);
}, },
}, },
created() {
console.log(this.seriesWorkout);
},
}; };
</script> </script>
<style scoped> <style scoped>

@ -29,12 +29,11 @@
cols="12" cols="12"
sm="6" sm="6"
class="mb-3" class="mb-3"
v-for="(seriesWorkout, i) in workoutsSeries" v-for="(seriesWorkout, i) in getWorkouts"
:key="i" :key="i"
><workoutsSeriesItem ><WorkoutsSeriesItem
:seriesWorkout="seriesWorkout" :seriesWorkout="seriesWorkout"
:serieId="getCurrentSerieId" :serieId="serieId"
@deleteWorkoutFromSerie="deleteWorkoutFromSerie($event)"
/></v-col> /></v-col>
</v-row> </v-row>
</div> </div>
@ -46,21 +45,18 @@
</template> </template>
<script> <script>
import SectionTitle from "../Global/Section/SectionTitle.vue"; import SectionTitle from "../Global/Section/SectionTitle.vue";
import workoutsSeriesItem from "./Item.vue"; import WorkoutsSeriesItem from "./Item.vue";
import AddWorkoutModal from "./Modals/AddWorkoutModal.vue"; import AddWorkoutModal from "./Modals/AddWorkoutModal.vue";
import { mapGetters, mapActions, mapMutations } from "vuex"; import { mapGetters, mapActions, mapMutations } from "vuex";
export default { export default {
components: { components: {
SectionTitle, SectionTitle,
workoutsSeriesItem, WorkoutsSeriesItem,
AddWorkoutModal, AddWorkoutModal,
}, },
data: () => ({
workoutsSeries: [],
}),
computed: { computed: {
...mapGetters("programSerie", ["getProgramSerie", "getCurrentSerieId"]), ...mapGetters("workoutToSerie", ["getWorkouts"]),
serieId() { serieId() {
return this.$route.params.serieId; return this.$route.params.serieId;
}, },
@ -74,37 +70,15 @@ export default {
}, },
}, },
methods: { methods: {
...mapActions("programSerie", ["loadProgramSerie"]), ...mapActions("workoutToSerie", ["loadProgramSerieWorkouts"]),
...mapMutations("programSerie", ["SET_CURRENT_SERIE_ID"]), ...mapMutations("programSerie", ["SET_CURRENT_SERIE_ID"]),
deleteWorkoutFromSerie(event) {
console.log("event", event);
const index = this.workoutsSeries.findIndex((x) => x.id === event);
this.workoutsSeries.splice(index, 1);
},
}, },
async created() { async created() {
await this.loadProgramSerie(this.programId); await this.loadProgramSerieWorkouts({
courseId: Number(this.programId),
serieId: Number(this.serieId),
});
await this.SET_CURRENT_SERIE_ID(this.serieId); await this.SET_CURRENT_SERIE_ID(this.serieId);
for (
let programSerie = 0;
programSerie < this.getProgramSerie.series.length;
programSerie++
) {
if (
this.getProgramSerie.series[programSerie]["id"] ==
this.getCurrentSerieId
) {
for (
let workout = 0;
workout < this.getProgramSerie.series[programSerie].workouts.length;
workout++
) {
this.workoutsSeries.push(
this.getProgramSerie.series[programSerie].workouts[workout]
);
}
}
}
}, },
}; };
</script> </script>

@ -60,12 +60,12 @@ export default [
name: 'programs' name: 'programs'
}, },
{ {
path: '/program-series/:id', path: '/programs/:id/series',
view: 'ProgramSeries', view: 'ProgramSeries',
name: 'programSeries' name: 'programSeries'
}, },
{ {
path: '/program-series/:programId/workouts-series/:serieId', path: '/programs/:programId/series/:serieId/workouts',
view: 'WorkoutsSeries', view: 'WorkoutsSeries',
name: 'workoutsSeries' name: 'workoutsSeries'
}, },

@ -32,8 +32,11 @@ const urls = {
joinWorkoutToSerie: "trainer/series/:serie/workout/:workout", joinWorkoutToSerie: "trainer/series/:serie/workout/:workout",
destroyWorkoutFromSerie: "trainer/series/:serie/workout/:workout", destroyWorkoutFromSerie: "trainer/series/:serie/workout/:workout",
// serie // serie
indexSeries: "trainer/courses/:course/series",
storeSerie: "trainer/course/:course/series", storeSerie: "trainer/course/:course/series",
destroySerie: "trainer/series/:serie", destroySerie: "trainer/series/:serie",
// programs -> series -> workouts
indexSerieWorkouts: "trainer/courses/:course/series/:serie/workouts",
// product // product
indexProduct: "admin/products", indexProduct: "admin/products",
showProduct: "admin/products/:product", showProduct: "admin/products/:product",
@ -54,6 +57,10 @@ const urls = {
indexWorkoutsBookmarks: "bookmarks/workout", indexWorkoutsBookmarks: "bookmarks/workout",
destroyWorkoutBookmarks: "bookmarks/:workout", destroyWorkoutBookmarks: "bookmarks/:workout",
destroyProgramBookmarks: "bookmarks/:course", destroyProgramBookmarks: "bookmarks/:course",
// statistic
indexStatisticAdmin: "admin-dashboard-statistic",
indexStatisticTrainer: "trainer-dashboard-statistic",
indexStatisticTrainee: "trainee-dashboard-statistic",
// file // file
storeFile: 'media' storeFile: 'media'
}; };

@ -1,17 +1,22 @@
import ProgramSerieRepository from "@/abstraction/repository/programSerieRepository"; import ProgramSerieRepository from "@/abstraction/repository/programSerieRepository";
export default { export default {
async loadProgramSerie({ commit }, courseId) { async loadProgramSeries({ commit }, courseId) {
let repository = new ProgramSerieRepository(); let repository = new ProgramSerieRepository();
const resource = await repository.show(courseId); const resource = await repository.index(courseId);
commit("SET_PROGRAM_SERIE", resource); commit("SET_PROGRAM_SERIES", resource.data);
}, },
// async loadProgramSerie({ commit }, courseId) {
// let repository = new ProgramSerieRepository();
// const resource = await repository.show(courseId);
// commit("SET_PROGRAM_SERIE", resource);
// },
async addSerieToProgram({ commit }, data) { async addSerieToProgram({ commit }, data) {
let repository = new ProgramSerieRepository(); let repository = new ProgramSerieRepository();
const resource = await repository.store(data.data, data.courseId); const resource = await repository.store(data.data, data.courseId);
if (resource) { if (resource) {
commit("ADD_SERIE_TO_PROGRAM", resource.data); commit("ADD_SERIE_TO_PROGRAM", resource);
return resource return resource
} }
}, },
async deleteSerieFromProgram({ commit }, serieId) { async deleteSerieFromProgram({ commit }, serieId) {
let repository = new ProgramSerieRepository(); let repository = new ProgramSerieRepository();

@ -1,4 +1,5 @@
export default { export default {
getProgramSerie: state => state.programSerie, getProgramSeries: state => state.programSeries,
// getProgramSerie: state => state.programSerie,
getCurrentSerieId: state => state.currentSerieId getCurrentSerieId: state => state.currentSerieId
}; };

@ -1,16 +1,27 @@
import Vue from "vue"; import Vue from "vue";
export default { export default {
SET_PROGRAM_SERIE(state, payload) { SET_PROGRAM_SERIES(state, payload) {
Vue.set(state, "programSerie", payload); Vue.set(state, "programSeries", payload);
}, },
// SET_PROGRAM_SERIE(state, payload) {
// Vue.set(state, "programSerie", payload);
// },
SET_CURRENT_SERIE_ID(state, payload) { SET_CURRENT_SERIE_ID(state, payload) {
Vue.set(state, "currentSerieId", payload); Vue.set(state, "currentSerieId", payload);
}, },
ADD_SERIE_TO_PROGRAM(state, payload) { ADD_SERIE_TO_PROGRAM(state, payload) {
state.programSerie.series.push(payload); console.log(payload);
state.programSeries.push(payload);
}, },
// ADD_SERIE_TO_PROGRAM(state, payload) {
// state.programSerie.series.push(payload);
// },
DELETE_SERIE_FROM_PROGRAM(state, payload) { DELETE_SERIE_FROM_PROGRAM(state, payload) {
const index = state.programSerie.series.findIndex((x) => x.id === payload); const index = state.programSeries.findIndex((x) => x.id === payload);
Vue.delete(state.programSerie.series, index) Vue.delete(state.programSeries, index)
} },
// DELETE_SERIE_FROM_PROGRAM(state, payload) {
// const index = state.programSerie.series.findIndex((x) => x.id === payload);
// Vue.delete(state.programSerie.series, index)
// }
}; };

@ -1,4 +1,5 @@
export default { export default {
programSerie: {}, programSeries: [],
currentSerieId: null, // programSerie: {},
currentSerieId: null,
}; };

@ -1,10 +1,16 @@
import WorkoutToSerieRepository from "../../../abstraction/repository/workoutToSerieRepository"; import WorkoutToSerieRepository from "../../../abstraction/repository/workoutToSerieRepository";
export default { export default {
async loadProgramSerieWorkouts({ commit }, data) {
console.log('data', data);
let repository = new WorkoutToSerieRepository();
const resource = await repository.index(data);
commit("SET_PROGRAM_SERIE_WORKOUTS", resource.data);
},
async loadWorkoutsToSerie({ state, commit }) { async loadWorkoutsToSerie({ state, commit }) {
try { try {
let data = { filters: state.filters }; let data = { filters: state.filters };
let repository = new WorkoutToSerieRepository(); let repository = new WorkoutToSerieRepository();
const resource = await repository.index(data); const resource = await repository.indexWorkoutToSerie(data);
commit("SET_WORKOUTS_TO_SERIE", resource.data); commit("SET_WORKOUTS_TO_SERIE", resource.data);
} catch (e) { } catch (e) {
return e; return e;

@ -1,5 +1,5 @@
export default { export default {
getWorkoutsToSerie: state => state.workoutsToSerie, getWorkoutsToSerie: state => state.workoutsToSerie,
getWorkoutToSerie: state => state.workoutToSerie, getWorkoutToSerie: state => state.workoutToSerie,
getWorkouts: state => state.workouts
} }

@ -1,5 +1,8 @@
import Vue from "vue"; import Vue from "vue";
export default { export default {
SET_PROGRAM_SERIE_WORKOUTS(state, payload) {
Vue.set(state, "workouts", payload)
},
SET_WORKOUTS_TO_SERIE(state, payload) { SET_WORKOUTS_TO_SERIE(state, payload) {
Vue.set(state, "workoutsToSerie", payload); Vue.set(state, "workoutsToSerie", payload);
}, },
@ -10,10 +13,10 @@ export default {
Vue.set(state, "filters", payload); Vue.set(state, "filters", payload);
}, },
ADD_WORKOUT_TO_SERIE(state, payload) { ADD_WORKOUT_TO_SERIE(state, payload) {
state.workoutsToSerie.push(payload); state.workouts.push(payload);
}, },
DELETE_WORKOUT_FROM_SERIE(state, workoutId) { DELETE_WORKOUT_FROM_SERIE(state, workoutId) {
const index = state.workoutsToSerie.findIndex((x) => x.id === workoutId); const index = state.workouts.findIndex((x) => x.id === workoutId);
Vue.delete(state.workoutsToSerie, index) Vue.delete(state.workouts, index)
}, },
}; };

@ -1,4 +1,5 @@
export default { export default {
workouts: [],
workoutsToSerie: [], workoutsToSerie: [],
workoutToSerie: {}, workoutToSerie: {},
filters: {} filters: {}

@ -11,6 +11,7 @@ import TimeInput from '../components/Global/Input/TimeInput.vue';
import BasicModal from "../components/Global/Modal/BasicModal"; import BasicModal from "../components/Global/Modal/BasicModal";
import Pagination from "../components/Global/Pagination/Pagination.vue"; import Pagination from "../components/Global/Pagination/Pagination.vue";
import Chip from "../components/Global/Chip/Chip.vue"; import Chip from "../components/Global/Chip/Chip.vue";
import SideBar from '../components/Global/Section/SideBar'
import 'bootstrap'; import 'bootstrap';
import 'bootstrap/dist/css/bootstrap.min.css'; import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.min.js'; import 'bootstrap/dist/js/bootstrap.min.js';
@ -24,4 +25,5 @@ Vue.component('DateInput', DateInput);
Vue.component('TimeInput', TimeInput); Vue.component('TimeInput', TimeInput);
Vue.component('basic-modal', BasicModal); Vue.component('basic-modal', BasicModal);
Vue.component('pagination', Pagination); Vue.component('pagination', Pagination);
Vue.component('Chip', Chip); Vue.component('Chip', Chip);
Vue.component('SideBar', SideBar);

@ -11,7 +11,7 @@
<div> <div>
<v-row> <v-row>
<v-col cols="2"> <v-col cols="2">
<AdminSections /> <SideBar />
</v-col> </v-col>
<v-col cols="10"> <v-col cols="10">
<AdminHome /> <AdminHome />
@ -23,11 +23,11 @@
</template> </template>
<script> <script>
import AdminHome from "../components/Admin/Main"; import AdminHome from "../components/Admin/Main";
import AdminSections from "../components/Admin/Sections"; // import AdminSections from "../components/Admin/Sections";
export default { export default {
components: { components: {
AdminHome, AdminHome,
AdminSections, // AdminSections,
}, },
}; };
</script> </script>
Loading…
Cancel
Save