sajjad 3 years ago
parent b1634274e5
commit 7a5cf2f6ee

160
package-lock.json generated

@ -1768,63 +1768,6 @@
"integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
"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": {
"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",
@ -1833,28 +1776,6 @@
"requires": {
"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": {
"version": "2.4.0",
"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 url from "@/router/url";
import { setData } from "../resources/authResource";
import { setData, getJson } from "../resources/authResource";
export default class AuthRepository {
async login(data) {
let json = setData(data);
let response = await axios.post(url("login"), json);
if (response.status === 200) {
return response.data.data;
return getJson(response.data.data);
}
}
async logout() {
let response = await axios.post(url("logout"));
if (response.status === 200) {
@ -25,7 +24,6 @@ export default class AuthRepository {
return response.data;
}
}
async resetPassword(data) {
let json = setData(data);
let response = await axios.post(url("resetPassword"), json);

@ -1,18 +1,24 @@
import axios from "axios";
import url from "@/router/url";
import { getJson, setData } from "../resources/programSerieResource";
import { getArray, getJson, setData } from "../resources/programSerieResource";
export default class ProgramSerieRepository {
async show(courseId) {
let response = await axios.get(url("showProgram", { course: courseId }));
async index(courseId) {
let response = await axios.get(url("indexSeries", { course: courseId }));
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) {
let json = setData(data);
let response = await axios.post(url("storeSerie", { course: courseId }), json);
if (response.status === 201 || response.status === 200) {
return getJson(response.data);
return getJson(response.data.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";
export default class WorkoutToSerieRepository {
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 response = await axios.get(url("indexClientWorkout"), { params });
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) => ({
first_name: data.first_name,
last_name: data.last_name,
email: data.email,
username: data.username,
password: data.password,
password_confirmation: data.password_confirmation,
});
first_name: data.first_name,
last_name: data.last_name,
email: data.email,
username: data.username,
password: data.password,
password_confirmation: data.password_confirmation,
});

@ -18,6 +18,10 @@ export const getJson = (data) => ({
repeat: data.repeat,
name: data.name
});
export const getArray = ({ data }) => {
data = data.map(serie => getJson(serie));
return { data }
}
export const setData = (data) => {
let formData = {
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,
is_admin: data.is_admin,
is_trainer: data.is_trainer,
role: data.is_admin
? "admin"
: data.is_trainer
? "trainer"
: "trainee",
created_courses_count: data.created_courses_count,
joined_courses_count: data.joined_courses_count
});

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

@ -1,7 +1,8 @@
<template>
<div class="h-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="d-flex justify-center"><UserName role="admin" /></div>
</div>
@ -47,19 +48,169 @@
</v-row>
<v-row class="mx-md-16 mx-0">
<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 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 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 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-row>
</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>
</div>
</template>
@ -67,12 +218,35 @@
import Box from "../Global/Section/Box.vue";
import Notification from "../Global/Section/Notification.vue";
import UserName from "../Global/Section/UserName.vue";
import { UserStorage } from "@/utils/storage";
import StatisticRepository from "@/abstraction/repository/statisticRepository.js";
export default {
components: {
UserName,
Box,
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>
<style scoped>

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

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

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

@ -59,6 +59,7 @@
import Box from "../Global/Section/Box.vue";
import Notification from "../Global/Section/Notification.vue";
import UserName from "../Global/Section/UserName.vue";
export default {
components: {
UserName,
@ -69,8 +70,8 @@ export default {
</script>
<style scoped>
.section {
width: 157px;
height: 157px;
width: 157px;
height: 157px;
}
.description {
color: var(--color-gray);

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

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

@ -29,12 +29,11 @@
cols="12"
sm="6"
class="mb-3"
v-for="(seriesWorkout, i) in workoutsSeries"
v-for="(seriesWorkout, i) in getWorkouts"
:key="i"
><workoutsSeriesItem
><WorkoutsSeriesItem
:seriesWorkout="seriesWorkout"
:serieId="getCurrentSerieId"
@deleteWorkoutFromSerie="deleteWorkoutFromSerie($event)"
:serieId="serieId"
/></v-col>
</v-row>
</div>
@ -46,21 +45,18 @@
</template>
<script>
import SectionTitle from "../Global/Section/SectionTitle.vue";
import workoutsSeriesItem from "./Item.vue";
import WorkoutsSeriesItem from "./Item.vue";
import AddWorkoutModal from "./Modals/AddWorkoutModal.vue";
import { mapGetters, mapActions, mapMutations } from "vuex";
export default {
components: {
SectionTitle,
workoutsSeriesItem,
WorkoutsSeriesItem,
AddWorkoutModal,
},
data: () => ({
workoutsSeries: [],
}),
computed: {
...mapGetters("programSerie", ["getProgramSerie", "getCurrentSerieId"]),
...mapGetters("workoutToSerie", ["getWorkouts"]),
serieId() {
return this.$route.params.serieId;
},
@ -74,37 +70,15 @@ export default {
},
},
methods: {
...mapActions("programSerie", ["loadProgramSerie"]),
...mapActions("workoutToSerie", ["loadProgramSerieWorkouts"]),
...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() {
await this.loadProgramSerie(this.programId);
await this.loadProgramSerieWorkouts({
courseId: Number(this.programId),
serieId: Number(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>

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

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

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

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

@ -1,16 +1,27 @@
import Vue from "vue";
export default {
SET_PROGRAM_SERIE(state, payload) {
Vue.set(state, "programSerie", payload);
SET_PROGRAM_SERIES(state, payload) {
Vue.set(state, "programSeries", payload);
},
// SET_PROGRAM_SERIE(state, payload) {
// Vue.set(state, "programSerie", payload);
// },
SET_CURRENT_SERIE_ID(state, payload) {
Vue.set(state, "currentSerieId", 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) {
const index = state.programSerie.series.findIndex((x) => x.id === payload);
Vue.delete(state.programSerie.series, index)
}
const index = state.programSeries.findIndex((x) => x.id === payload);
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 {
programSerie: {},
currentSerieId: null,
programSeries: [],
// programSerie: {},
currentSerieId: null,
};

@ -1,10 +1,16 @@
import WorkoutToSerieRepository from "../../../abstraction/repository/workoutToSerieRepository";
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 }) {
try {
let data = { filters: state.filters };
let repository = new WorkoutToSerieRepository();
const resource = await repository.index(data);
const resource = await repository.indexWorkoutToSerie(data);
commit("SET_WORKOUTS_TO_SERIE", resource.data);
} catch (e) {
return e;

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

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

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

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

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