sajjad 3 years ago
parent b76325016b
commit 6fe72d9add

210
package-lock.json generated

@ -1166,6 +1166,21 @@
"integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=",
"dev": true
},
"@riophae/vue-treeselect": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@riophae/vue-treeselect/-/vue-treeselect-0.4.0.tgz",
"integrity": "sha512-J4atYmBqXQmiPFK/0B5sXKjtnGc21mBJEiyKIDZwk0Q9XuynVFX6IJ4EpaLmUgL5Tve7HAS7wkiGGSti6Uaxcg==",
"requires": {
"@babel/runtime": "^7.3.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"easings-css": "^1.0.0",
"fuzzysearch": "^1.0.3",
"is-promise": "^2.1.0",
"lodash": "^4.0.0",
"material-colors": "^1.2.6",
"watch-size": "^2.0.0"
}
},
"@soda/friendly-errors-webpack-plugin": {
"version": "1.8.0",
"resolved": "https://registry.nlark.com/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz",
@ -1753,6 +1768,63 @@
"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",
@ -1761,6 +1833,28 @@
"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"
}
}
}
},
@ -2375,6 +2469,11 @@
"resolve": "^1.12.0"
}
},
"babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"babel-loader": {
"version": "8.2.2",
"resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.2.2.tgz?cache=0&sync_timestamp=1606424688085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-loader%2Fdownload%2Fbabel-loader-8.2.2.tgz",
@ -4552,6 +4651,11 @@
"stream-shift": "^1.0.0"
}
},
"easings-css": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/easings-css/-/easings-css-1.0.0.tgz",
"integrity": "sha512-7Uq7NdazNfVtr0RNmPAys8it0zKCuaqxJStYKEl72D3j4gbvXhhaM7iWNbqhA4C94ygCye6VuyhzBRQC4szeBg=="
},
"easy-bem": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/easy-bem/-/easy-bem-1.1.1.tgz",
@ -5583,6 +5687,11 @@
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
"fuzzysearch": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fuzzysearch/-/fuzzysearch-1.0.3.tgz",
"integrity": "sha1-3/yA9tawQiPyImqnndGUIxCW0Ag="
},
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz?cache=0&sync_timestamp=1603829621482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgensync%2Fdownload%2Fgensync-1.0.0-beta.2.tgz",
@ -6757,6 +6866,11 @@
"isobject": "^3.0.1"
}
},
"is-promise": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
},
"is-regex": {
"version": "1.1.4",
"resolved": "https://registry.nlark.com/is-regex/download/is-regex-1.1.4.tgz?cache=0&sync_timestamp=1628221905423&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-regex%2Fdownload%2Fis-regex-1.1.4.tgz",
@ -7115,9 +7229,8 @@
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.nlark.com/lodash/download/lodash-4.17.21.tgz",
"integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=",
"dev": true
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash.debounce": {
"version": "4.0.8",
@ -7215,6 +7328,11 @@
"object-visit": "^1.0.0"
}
},
"material-colors": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
"integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg=="
},
"md5.js": {
"version": "1.3.5",
"resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz",
@ -11374,87 +11492,6 @@
}
}
},
"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"
},
"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.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"
}
},
"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",
@ -11564,6 +11601,11 @@
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
"integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
},
"watch-size": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/watch-size/-/watch-size-2.0.0.tgz",
"integrity": "sha512-M92R89dNoTPWyCD+HuUEDdhaDnh9jxPGOwlDc0u51jAgmjUvzqaEMynXSr3BaWs+QdHYk4KzibPy1TFtjLmOZQ=="
},
"watchpack": {
"version": "1.7.5",
"resolved": "https://registry.nlark.com/watchpack/download/watchpack-1.7.5.tgz?cache=0&sync_timestamp=1621437900992&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwatchpack%2Fdownload%2Fwatchpack-1.7.5.tgz",

@ -8,11 +8,13 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"@riophae/vue-treeselect": "^0.4.0",
"axios": "^0.21.4",
"bootstrap": "^4.6.0",
"core-js": "^3.6.5",
"izitoast": "^1.4.0",
"jquery": "^3.6.0",
"lodash": "^4.17.21",
"meta-router": "^4.0.1",
"module-alias": "^2.2.2",
"popper.js": "^1.16.1",

@ -0,0 +1,18 @@
import axios from "axios";
import url from '@/router/url';
import { getArray } from "../resources/bookmarksResource";
export default class BookmarsRepository {
async indexCourses() {
let response = await axios.get(url('indexCoursesBookmarks'));
if (response.status === 200) {
return getArray(response.data);
}
}
async indexWorkouts() {
let response = await axios.get(url('indexWorkoutsBookmarks'));
if (response.status === 200) {
return getArray(response.data);
}
}
}

@ -0,0 +1,12 @@
import axios from "axios";
import url from '@/router/url';
import { getJson } from "../resources/countriesResource";
export default class CountriesRepository {
async index() {
let response = await axios.get(url("indexCountries"));
if (response.status === 200) {
return getJson(response.data)
}
}
}

@ -0,0 +1,11 @@
import axios from "axios";
import url from "@/router/url";
import { getArray } from "../resources/productCategoriesResource";
export default class ProductCategoriesRepository {
async index() {
let response = await axios.get(url("indexProductCategories"));
if (response.status === 200) {
return getArray(response.data);
}
}
}

@ -0,0 +1,25 @@
import axios from "axios";
import url from "@/router/url";
import { getJson, setData, getArray, setQuery } from "../resources/productResource";
export default class ProductRepository {
async index(data) {
let params = setQuery(data);
let response = await axios.get(url("indexProduct"), { params });
if (response.status === 200) {
return getArray(response.data);
}
}
async show(productId) {
let response = await axios.get(url("showProduct", { product: productId }));
if (response.status === 200) {
return getJson(response.data.data);
}
}
async store(data) {
let json = setData(data);
let response = await axios.post(url("storeProduct"), json);
if (response.status === 201) {
return getJson(response.data);
}
}
}

@ -0,0 +1,18 @@
import axios from "axios";
import url from '@/router/url'
import { setData, getJson } from '../resources/profileResource';
export default class ProfileRepository {
async show() {
let response = await axios.get(url("showProfile"));
if (response.status === 200) {
return getJson(response.data.data);
}
}
async update(data) {
let json = setData(data, true);
let response = await axios.post(url("updateProfile"), json);
if (response.status === 200) {
return getJson(response.data.data);
}
}
}

@ -15,7 +15,6 @@ export default class ProgramRepository {
// data.pagination['itemsPerPage'] = 2
// }
let params = setQuery(data);
// console.log('params', params);
let response = await axios.get(url("indexProgram"), {
headers: { 'accept-language': 'en' },
params

@ -0,0 +1,21 @@
import axios from "axios";
import url from "@/router/url";
import { getJson, setData } from "../resources/programSerieResource";
export default class ProgramSerieRepository {
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);
}
}
async delete(data) {
await axios.delete(url("destroySerie", { serie: data }));
}
}

@ -0,0 +1,16 @@
import axios from "axios";
import url from "@/router/url";
import { getArray, setQuery } from "../resources/usersResource";
export default class UsersRepository {
async index(data) {
let params = setQuery(data)
let response = await axios.get(url('indexUsers'), { params })
if (response.status === 200) {
return getArray(response.data)
}
}
async delete(userId) {
await axios.delete(url("destroyUser", { user: userId }));
}
}

@ -0,0 +1,28 @@
import axios from "axios";
import url from "@/router/url";
import { getJson, getArray, setQuery, setData } from "../resources/workoutResource.js";
export default class WorkoutToSerieRepository {
async index(data) {
let params = setQuery(data);
let response = await axios.get(url("indexClientWorkout"), { params });
if (response.status === 200) {
return getArray(response.data);
}
}
async show(workoutId) {
let response = await axios.get(url("showClientWorkout", { workout: workoutId }));
if (response.status === 200) {
return getJson(response.data.data);
}
}
async store(data, serieId, workoutId) {
let json = setData(data);
let response = await axios.post(url("joinWorkoutToSerie", { serie: serieId, workout: workoutId }), json);
if (response.status === 201 || response.status === 200) {
return response.data;
}
}
async delete(data) {
await axios.delete(url("destroyWorkoutFromSerie", { serie: data.serieId, workout: data.workoutId }));
}
}

@ -0,0 +1,16 @@
import { getJson as getJsonProgram } from './programResource'
import { getJson as getJsonWorkout } from './workoutResource'
export const getJson = (data) => ({
id: data.id,
bookmarkable_type: data.bookmarkable_type,
bookmarkable_id: data.bookmarkable_id,
user_id: data.user_id,
bookmark_data: data.courses ? getJsonProgram(data.courses) : getJsonWorkout(data.workouts),
});
export const getArray = ({ data }) => {
// const pagination = SetPagination(meta);
console.log(data);
data = data.map(bookmark => getJson(bookmark));
return { data };
};

@ -0,0 +1,9 @@
export const getJson = (data) => ({
id: data.id,
name: data.name,
code: data.code
});
export const getArray = ({ data }) => {
data = data.map(country => getJson(country))
return { data }
};

@ -0,0 +1,11 @@
export const getJson = (data) => ({
id: data.id,
local_name: data.local_name,
name: data.name,
label: data.name,
children: data.children
});
export const getArray = ({ data }) => {
data = data.map((productCategory) => getJson(productCategory));
return { data };
}

@ -0,0 +1,48 @@
import { objectToFormData } from "@/utils/objectToFormData";
import { SetPagination, SetQueriesObject } from "@/utils/setQueriesObject";
export const getJson = (data) => ({
id: data.id,
thumbnail: data.thumbnail,
title: data.title,
tags: data.tags,
description: data.description,
images: data.images,
name: data.name,
video_link: data.video_link,
purchase_link: data.purchase_link,
price: data.price,
weight: data.weight,
dimensions: data.dimensions,
product_category: data.product_category,
product_categories_id: data.product_category?.id,
product_category_id: data.product_category?.parent?.id
});
export const setData = (data, isUpdate = false) => {
let formData = {
product_category_id: data.product_category_id,
title: data.title,
description: data.description,
purchase_link: data.purchase_link,
price: `${data.price}$`,
video_link: data.video_link,
name: data.name,
dimensions: `${data.dimensions}cm`,
weight: `${data.weight}kg`,
tags: data.tags,
batch_id: data.batch_id
};
if (isUpdate) {
formData["_method"] = "put";
}
return objectToFormData(formData);
};
export const getArray = ({ data, meta }) => {
const pagination = SetPagination(meta);
data = data.map(product => getJson(product));
return { data, pagination };
};
export const setQuery = (data) => {
return SetQueriesObject(data);
};

@ -0,0 +1,11 @@
export const getJsonProductSubCategory = (data) => ({
id: data.id,
name: data.name,
label: data.name,
local_name: data.local_name,
children: data.children ? getArrayProductSubCategory(data.children) : [],
});
export const getArrayProductSubCategory = (data) => {
data = data.map((productCategory) => getJsonProductSubCategory(productCategory));
return data;
}

@ -0,0 +1,42 @@
import { objectToFormData } from "@/utils/objectToFormData";
export const getJson = (data) => ({
id: data.id,
first_name: data.first_name,
last_name: data.last_name,
birthday: data.birthday,
weight: data.weight,
height: data.height,
arm_diameter: data.arm_diameter,
leg_diameter: data.leg_diameter,
details: data.details,
profile: data.profile,
address: data.address,
email: data.email,
cell_number: data.cell_number,
is_admin: data.is_admin,
is_trainer: data.is_trainer,
country: data.country,
country_id: data.country.id,
created_courses_count: data.created_courses_count,
joined_courses_count: data.joined_courses_count
});
export const setData = (data, isUpdate = false) => {
let formData = {
first_name: data.first_name,
last_name: data.last_name,
birthday: data.birthday,
weight: data.weight,
height: data.height,
arm_diameter: data.arm_diameter,
leg_diameter: data.leg_diameter,
details: data.details,
address: data.address,
email: data.email,
cell_number: data.cell_number,
country_id: data.country_id,
};
if (isUpdate) {
formData["_method"] = "put";
}
return objectToFormData(formData);
}

@ -5,6 +5,7 @@ import { objectToFormData } from "@/utils/objectToFormData";
export const getJson = (data) => ({
id: data.id,
trainer: data.trainer ? getJsonTrainer(data.trainer) : {},
trainer_id: data.trainer_id,
sport_category: data.trainer ? getJsonSportCategory(data.trainer) : {},
sport_category_id: data.sport_category_id,
thumbnail: data.thumbnail,
@ -15,6 +16,9 @@ export const getJson = (data) => ({
description: data.description,
series_count: data.series_count,
workouts_count: data.workouts_count,
language_id: data.language_id,
type: data.type,
period: data.period
});
export const setData = (data, isUpdate = false) => {
let formData = {

@ -0,0 +1,28 @@
import { getJsonTrainer } from './trainerProgramResource';
import { objectToFormData } from "@/utils/objectToFormData";
export const getJson = (data) => ({
id: data.id,
trainer: data.trainer ? getJsonTrainer(data.trainer) : {},
sport_category_id: data.sport_category_id,
verified: data.verified,
title: data.title,
description: data.description,
thumbnail: data.thumbnail,
course_type: data.course_type,
tags: data.tags,
series_count: data.series_count,
workouts_count: data.workouts_count,
series: data.series,
course_series_id: data.course_series_id,
estimate_time: data.estimate_time,
repeat: data.repeat,
name: data.name
});
export const setData = (data) => {
let formData = {
name: data.name,
estimate_time: data.estimate_time,
repeat: data.repeat
};
return objectToFormData(formData);
};

@ -7,5 +7,11 @@ export const getJsonTrainer = (data) => ({
height: data.height,
arm_diameter: data.arm_diameter,
leg_diameter: data.leg_diameter,
details: data.details
})
details: data.details,
profile: data.profile,
address: data.address,
email: data.email,
cell_number: data.cell_number,
is_admin: data.is_admin,
is_trainer: data.is_trainer,
});

@ -0,0 +1,28 @@
import { SetPagination, SetQueriesObject } from "@/utils/setQueriesObject";
export const getJson = (data) => ({
id: data.id,
first_name: data.first_name,
last_name: data.last_name,
birthday: data.birthday,
weight: data.weight,
height: data.height,
arm_diameter: data.arm_diameter,
leg_diameter: data.leg_diameter,
details: data.details,
profile: data.profile,
address: data.address,
email: data.email,
cell_number: data.cell_number,
is_admin: data.is_admin,
is_trainer: data.is_trainer,
created_courses_count: data.created_courses_count,
joined_courses_count: data.joined_courses_count
});
export const getArray = ({ data, meta }) => {
const pagination = SetPagination(meta);
data = data.map((user) => getJson(user));
return { data, pagination };
};
export const setQuery = (data) => {
return SetQueriesObject(data);
};

@ -1,11 +1,11 @@
import { objectToFormData } from "@/utils/objectToFormData";
import { SetQueriesObject } from "@/utils/setQueriesObject";
import { SetPagination, SetQueriesObject } from "@/utils/setQueriesObject";
export const getJson = (data) => ({
id: data.id,
local_name: data.local_name,
name: data.name,
workout_category_id: data.workout_category.id,
sport_category_id: data.workout_category.sport_category ? data.workout_category.sport_category.id : null,
workout_category_id: data.workout_category?.id,
sport_category_id: data.workout_category?.sport_category ? data.workout_category.sport_category.id : null,
description: data.description,
suggested_per_set: data.suggested_per_set,
suggested_set: data.suggested_set,
@ -29,16 +29,19 @@ export const setData = (data, isUpdate = false) => {
suggested_time: data.suggested_time,
batch_id: data.batch_id,
tags: data.tags,
set: data.set,
per_set: data.per_set,
estimate_time: data.estimate_time
};
if (isUpdate) {
formData["_method"] = "put";
}
return objectToFormData(formData);
};
export const getArray = ({ data }) => {
export const getArray = ({ data, meta }) => {
const pagination = SetPagination(meta);
data = data.map((workout) => getJson(workout));
return { data };
return { data, pagination };
};
export const setQuery = (data) => {

@ -15,12 +15,11 @@
<v-col cols="3">
<div class="pb-14 h-100">
<div class="add__workout dark w-100 h-100">
<div class="add__workout__picture d-flex align-center">
<i class="WMi-picture add__workout__picture--icon"></i>
<div class="add__workout__picture--text">
select a workout image
</div>
</div>
<ImageCropper
label="manager image"
:url.sync="form.thumbnail"
v-model="fileForm.media"
/>
</div>
</div>
</v-col>
@ -28,16 +27,37 @@
<v-row>
<v-col cols="4">
<v-autocomplete
dark
item-text="name"
item-value="id"
label="product category"
:items="getProductCategories"
@change="changeProductCategories"
v-model="form.product_categories_id"
></v-autocomplete>
</v-col>
<v-col cols="4">
<!-- <template>
<v-treeview
activatable
dark
:items="child.children"
></v-treeview>
<TreeSelect
:options="child"
:noChildrenText="noChildrenText"
:placeholder="placeholder"
:noResultsText="noResultsText"
v-model="form.product_category_id"
/>
</template> -->
<v-autocomplete
dark
item-text="name"
item-value="id"
label="product subcategory"
label="workout subcategory"
:items="child"
v-model="form.product_category_id"
></v-autocomplete>
</v-col>
<v-col cols="4"></v-col>
@ -48,6 +68,8 @@
placeholder="product name"
label="product name"
class="no-error-msg pt-0 mt-0"
dark
v-model="form.name"
></v-text-field>
</v-col>
<v-col cols="8"
@ -55,6 +77,8 @@
placeholder="a short quote"
label="a short quote"
class="no-error-msg pt-0 mt-0"
dark
v-model="form.title"
></v-text-field
></v-col>
</v-row>
@ -64,6 +88,8 @@
rows="3"
label="description"
placeholder="description"
dark
v-model="form.description"
></v-textarea>
</v-col>
</v-row>
@ -78,6 +104,9 @@
placeholder="price"
label="price"
class="no-error-msg pt-0 mt-0"
prefix="$"
dark
v-model="form.price"
></v-text-field
></v-col>
<v-col cols="2"
@ -85,6 +114,9 @@
placeholder="package weight"
label="package weight"
class="no-error-msg pt-0 mt-0"
suffix="kg"
dark
v-model="form.weight"
></v-text-field
></v-col>
<v-col cols="2"
@ -92,6 +124,9 @@
placeholder="package dimensions"
label="package dimensions"
class="no-error-msg pt-0 mt-0"
suffix="cm"
dark
v-model="form.dimensions"
></v-text-field
></v-col>
<v-col cols="6"
@ -99,6 +134,8 @@
placeholder="vintroduction video link"
label="vintroduction video link"
class="no-error-msg pt-0 mt-0"
dark
v-model="form.video_link"
></v-text-field
></v-col>
</v-row>
@ -107,22 +144,39 @@
<v-text-field
placeholder="shopping link - amazon mainly"
label="shopping link - amazon mainly"
dark
v-model="form.purchase_link"
></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<v-autocomplete
class="pt-0 multiple"
:items="items"
item-value="id"
item-text="name"
attach
chips
<v-combobox
v-model="form.tags"
clearable
:append-icon="null"
hide-selected
class="multiple"
label="product tags - useful for better search"
placeholder="product tags - useful for better search"
multiple
></v-autocomplete>
persistent-hint
small-chips
dark
>
<template #selection="{ item, select }">
<v-chip
label
small
color="white"
text-color="black"
close
@click="select"
@click:close="removeTags(item)"
>{{ item }}</v-chip
>
</template>
</v-combobox>
</v-col>
</v-row>
<v-row class="mb-4">
@ -155,6 +209,7 @@
text="add the product"
class="custom-btn add-btn"
height="25"
@click.native="submit"
/>
</div>
</div>
@ -163,19 +218,88 @@
</div>
</template>
<script>
import { mapActions, mapGetters } from "vuex";
import SectionTitle from "../Global/Section/SectionTitle.vue";
import FileRepository from "../../abstraction/repository/FileRepository";
import ImageCropper from "../Global/Input/ImageCropper.vue";
import { makeid } from "@/utils/math";
const RANDOM_TOKEN = makeid(50);
//
export default {
components: {
SectionTitle,
ImageCropper,
},
data: () => ({
items: [
{
id: 1,
name: "fkskad",
},
],
form: {
batch_id: RANDOM_TOKEN,
price: "",
},
fileForm: {
batch_id: RANDOM_TOKEN,
collection: "thumbnail",
},
noResultsText: "No results found.",
noChildrenText: "It does not have a subset",
placeholder: "product subcategory",
child: [],
}),
computed: {
...mapGetters("productCategories", ["getProductCategories"]),
...mapGetters("products", ["getProduct"]),
ProductId() {
return this.$route.params.id;
},
},
methods: {
...mapActions("productCategories", ["loadProductCategories"]),
...mapActions("products", ["addProduct", "updateProduct", "loadProduct"]),
symbol() {},
changeProductCategories() {
this.child = [];
console.log(this.getProductCategories);
let index = this.getProductCategories.find((x) => {
return x.id === this.form.product_categories_id;
// x.children.map((y) => console.log("y.name", y.name));
});
index.children.map((x) => this.child.push(x));
console.log(this.child);
},
async submit() {
try {
if (this.fileForm.media) {
let repository = new FileRepository();
await repository.store(this.fileForm);
}
if (this.ProductId) {
this.updateProduct(this.form);
} else {
this.addProduct(this.form);
}
} catch (e) {
return e;
}
},
async load() {
await this.loadProduct(this.ProductId);
this.form = this.getProduct;
console.log("this.form", this.form);
},
removeTags(item) {
// {
// course: data.filter(x => x.type === 'course'),
// workout: data.filter(x => x.type === 'workout')
// }
this.form.tags.splice(this.form.tags.indexOf(item), 1);
this.form.tags = [...this.form.tags];
},
},
async created() {
await this.loadProductCategories();
if (this.ProductId) {
this.load();
}
},
};
</script>
<style scoped>
@ -206,4 +330,35 @@ export default {
.upload {
height: 148px;
}
</style>
<style>
.vue-treeselect {
margin-top: 7px;
}
.vue-treeselect__menu-container {
color: var(--color-black) !important;
}
.vue-treeselect__control {
padding-left: 5 px;
padding-right: 5 px;
display: table;
table-layout: fixed;
width: 100%;
height: 36 px;
border-color: rgb(255, 255, 255);
border-style: solid;
border-width: 0 0 1px 0;
border-radius: 0;
background: transparent;
transition-duration: 200ms;
transition-property: border-color, box-shadow, width, height, background-color,
opacity;
transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
}
.vue-treeselect__single-value {
color: var(--color-white);
}
.vue-treeselect__placeholder {
text-transform: uppercase;
}
</style>

@ -5,7 +5,7 @@
<ul class="pl-0 ml-0">
<MenuItem :active="true" text="Home" link="dashboard" />
<MenuItem text="my profile" link="profile" />
<MenuItem text="my bookmarks" link="dashboard" />
<MenuItem text="my bookmarks" link="bookmarks" />
<MenuItem text="programs" link="programs" />
<MenuItem text="users" link="users" />
<MenuItem text="products" link="products" />

@ -25,7 +25,7 @@
<v-col
cols="4"
class="mb-2"
v-for="(program, i) in bookmarksPrograms"
v-for="(program, i) in getBookmarksPrograms"
:key="i"
>
<BookmarksPrograms :program="program" />
@ -36,7 +36,7 @@
<v-row class="mt-4">
<v-col
cols="6"
v-for="(workout, i) in bookmarksWorkouts"
v-for="(workout, i) in getBookmarksWorkouts"
:key="i"
class="mb-2"
><BookmarksWorkouts :workout="workout"
@ -57,6 +57,7 @@ import BookmarksPrograms from "./Programs/Programs";
import FirstImage from "../../assets/28-284379_photo-wallpaper-man-workout-gym-working-gym-workout.jpg";
import SecondImage from "../../assets/a-bodybuilder-exhibits-his-muscular-physique-1024-768-0.jpg";
import ThirdImage from "../../assets/5595849.jpg";
import { mapActions, mapGetters } from "vuex";
export default {
components: {
SectionTitle,
@ -137,6 +138,24 @@ export default {
},
],
}),
computed: {
...mapGetters("bookmarks", [
"getBookmarksPrograms",
"getBookmarksWorkouts",
]),
},
methods: {
...mapActions("bookmarks", [
"loadBookmarksPrograms",
"loadBookmarksWorkouts",
]),
},
async created() {
await this.loadBookmarksPrograms();
await this.loadBookmarksWorkouts();
console.log("this.getBookmarksPrograms", this.getBookmarksPrograms);
console.log("this.getBookmarksWorkouts", this.getBookmarksWorkouts);
},
};
</script>
<style >

@ -3,7 +3,7 @@
<div class="wa__program__images">
<div
class="wa__program__image"
:style="{ backgroundImage: `url(${program.src})` }"
:style="{ backgroundImage: `url(${program.bookmark_data.thumbnail})` }"
></div>
<div class="wa__program__image__button">
<div class="wa__program__image__button--icon">
@ -16,8 +16,10 @@
</div>
</div>
</div>
<div class="program__title">{{ program.title }}</div>
<div class="program__sub-title">{{ program.subTitle }}</div>
<div class="program__title">{{ program.bookmark_data.title }}</div>
<div class="program__sub-title">
{{ program.bookmark_data.description }}
</div>
<div>
<v-chip
label
@ -26,7 +28,7 @@
class="mr-1 text-uppercase"
x-small
>
{{ program.sets }} sets
{{ program.bookmark_data.series_count }} series
</v-chip>
<v-chip
label
@ -35,7 +37,7 @@
class="mr-1 text-uppercase"
x-small
>
{{ program.workout }} workout
{{ program.bookmark_data.workouts_count }} workout
</v-chip>
</div>
</div>
@ -47,6 +49,9 @@ export default {
type: Object,
},
},
created() {
console.log(this.program);
},
};
</script>
<style scoped>

@ -4,16 +4,18 @@
<v-col cols="4" class="pr-0">
<div
class="workout__img"
:style="{ backgroundImage: `url(${workout.src})` }"
:style="{
backgroundImage: `url(${workout.bookmark_data.thumbnail})`,
}"
></div
></v-col>
<v-col cols="8">
<div class="details__card">
<div>
<div class="workout__title wa__f__m__eb text-uppercase">
{{ workout.title }}
{{ workout.bookmark_data.title }}
</div>
<div class="workout__description">{{ workout.description }}</div>
<div class="workout__description">{{ workout.bookmark_data.description }}</div>
</div>
<div>
<div class="d-flex justify-space-between align-center">
@ -24,7 +26,7 @@
text-color="black"
class="mr-1 text-uppercase"
x-small
v-for="(item, i) in workout.items"
v-for="(item, i) in workout.tags"
:key="i"
>
{{ item.text }}

@ -23,6 +23,7 @@
/>
</template>
<v-date-picker
:dark="dark"
:color="color"
v-model="date"
:type="type"
@ -41,6 +42,10 @@ export default {
type: {
default: "date",
},
dark: {
type: Boolean,
default: false,
},
},
data: () => ({
menu: false,

@ -10,7 +10,7 @@
>
<template v-slot:activator="{ on, attrs }">
<v-text-field
class="pt-0"
class="pt-0 mt-0"
v-model="time"
:label="label"
:placeholder="placeholder || label"

@ -1,6 +1,6 @@
<template>
<div class="wa__back wa__link">
<router-link :to="{ name: link }">
<router-link :to="{ name: link, params: { id: params } }">
<i :class="icon"></i>
<p>{{ backText }}</p>
</router-link>
@ -8,7 +8,7 @@
</template>
<script>
export default {
props: ["icon", "backText", "link"],
props: ["icon", "backText", "link", "params"],
};
</script>
<style scoped>

@ -1,6 +1,12 @@
<template>
<div>
<Back v-if="link" :back-text="backText" :link="link" :icon="icon" />
<Back
v-if="link"
:back-text="backText"
:link="link"
:params="params"
:icon="icon"
/>
<div :class="{ section: !isModal, modal__section: isModal }">
<div
:class="[
@ -28,6 +34,7 @@ export default {
props: {
backText: {},
link: {},
params: {},
icon: {},
title: {},
subTitle: {},

@ -1,7 +1,7 @@
<template>
<router-link
class="d-block text-decoration-none text-white"
:to="{ name: 'addProduct' }"
:to="{ name: 'addProduct', params: { id: product.id } }"
>
<div class="product__card">
<div class="product__image">
@ -14,7 +14,7 @@
<div class="product__title mt-2">{{ product.title }}</div>
<div class="product__sub__title">{{ product.subTitle }}</div>
</div>
<div class="product__price wa__f__m__eb">{{ product.price }}$</div>
<div class="product__price wa__f__m__eb">{{ product.price }}</div>
</div>
</router-link>
</template>

@ -30,51 +30,47 @@
<v-col
cols="12"
sm="4"
v-for="(product, i) in products"
v-for="(product, i) in getProducts"
:key="i"
class="mb-3"
><ProductItem :product="product"
/></v-col>
</v-row>
</div>
<div class="text-center mt-40 mb-5">
<pagination
:pagination="getPaginationProduct"
@pagination="changePagination"
/>
</div>
</main-back>
</div>
</template>
<script>
import SectionTitle from "../Global/Section/SectionTitle.vue";
import FirstImage from "../../assets/28-284379_photo-wallpaper-man-workout-gym-working-gym-workout.jpg";
import SecondImage from "../../assets/a-bodybuilder-exhibits-his-muscular-physique-1024-768-0.jpg";
import ThirdImage from "../../assets/5595849.jpg";
import ProductItem from "./Item.vue";
import { mapActions, mapGetters, mapMutations } from "vuex";
export default {
components: {
SectionTitle,
ProductItem,
},
data: () => ({
products: [
{
id: 1,
src: FirstImage,
title: "Champya TRX Item",
subTitle: "The best move for shoulder abs",
price: 127,
},
{
id: 2,
src: SecondImage,
title: "Champya Training Ball",
subTitle: "The best move for shoulder abs",
price: 66,
},
{
id: 3,
src: ThirdImage,
title: "Champya Training Ball",
subTitle: "The best move for shoulder abs",
price: 66,
},
],
}),
data: () => ({}),
computed: {
...mapGetters("products", ["getProducts", "getPaginationProduct"]),
},
methods: {
...mapActions("products", ["loadProducts"]),
...mapMutations("products", ["SET_PAGINATION"]),
changePagination(page) {
if (this.getPaginationProduct.page !== page) {
this.SET_PAGINATION(page);
this.loadProducts();
}
},
},
async created() {
await this.loadProducts();
},
};
</script>

@ -18,6 +18,7 @@
label="your email address"
class="no-error-msg pt-0"
dark
v-model="form.email"
></v-text-field>
</v-col>
<v-col class="12" sm="3">
@ -26,6 +27,7 @@
label="your name"
class="no-error-msg pt-0"
dark
v-model="form.first_name"
></v-text-field>
</v-col>
<v-col class="12" sm="3">
@ -34,6 +36,7 @@
label="your family name"
class="no-error-msg pt-0"
dark
v-model="form.last_name"
></v-text-field>
</v-col>
<v-col class="12" sm="3">
@ -42,17 +45,22 @@
label="your cell number"
class="no-error-msg pt-0"
dark
v-model="form.cell_number"
></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col cols="3">
<v-text-field
<v-autocomplete
placeholder="your country"
label="your country"
class="no-error-msg pt-0"
dark
></v-text-field>
item-value="id"
item-text="name"
:items="getCountries"
v-model="form.country_id"
></v-autocomplete>
</v-col>
<v-col cols="3">
<v-text-field
@ -60,9 +68,16 @@
label="address"
class="no-error-msg pt-0"
dark
v-model="form.address"
></v-text-field>
</v-col>
<v-col cols="3"><DateInput /></v-col>
<v-col cols="3"
><DateInput
class="no-error-msg"
label="Birthday"
dark
v-model="form.birthday"
/></v-col>
<v-col cols="3"></v-col>
</v-row>
<v-divider dark></v-divider>
@ -74,15 +89,17 @@
class="no-error-msg pt-0"
suffix="kg"
dark
v-model="form.weight"
></v-text-field
></v-col>
<v-col cols="3"
><v-text-field
placeholder="heighn"
label="heighn"
placeholder="height"
label="height"
class="no-error-msg pt-0"
suffix="cm"
dark
v-model="form.height"
></v-text-field
></v-col>
<v-col cols="3"
@ -92,6 +109,7 @@
class="no-error-msg pt-0"
suffix="cm"
dark
v-model="form.arm_diameter"
></v-text-field
></v-col>
<v-col cols="3"
@ -101,6 +119,7 @@
class="no-error-msg pt-0"
suffix="cm"
dark
v-model="form.leg_diameter"
></v-text-field
></v-col>
</v-row>
@ -112,6 +131,7 @@
class="no-error-msg"
rows="4"
dark
v-model="form.details"
></v-textarea>
</v-col>
</v-row>
@ -128,6 +148,7 @@
text="SAVE THE INFO"
class="custom-btn save-btn"
height="25"
@click.native="updateProfile(form)"
/>
</div>
</div>
@ -136,11 +157,31 @@
</div>
</template>
<script>
import { mapActions, mapGetters } from "vuex";
import SectionTitle from "../Global/Section/SectionTitle.vue";
export default {
components: {
SectionTitle,
},
data: () => ({
form: {},
}),
computed: {
...mapGetters("profile", ["getProfile"]),
...mapGetters("countries", ["getCountries"]),
},
methods: {
...mapActions("profile", ["updateProfile", "loadProfile"]),
...mapActions("countries", ["loadCountries"]),
async setProfile() {
await this.loadProfile();
this.form = this.getProfile;
},
},
created() {
this.loadCountries();
this.setProfile();
},
};
</script>
<style scoped>

@ -1,7 +1,11 @@
<template>
<router-link
class="d-block text-decoration-none text-white"
:to="{ name: 'workoutsSeries' }"
:to="{
name: 'workoutsSeries',
params: { programId: programId, serieId: series.id },
}"
@click.native="setSerieId(series.id)"
>
<div class="series__card">
<v-row>
@ -15,7 +19,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.per_week }}
{{ series.repeat }}
</div>
<div class="series__week__text">
time <br />
@ -26,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.moves_add }}
{{ series.workouts_count }}
</div>
<div class="series__moves__text">moves added</div>
</div>
@ -38,6 +42,7 @@
width="48"
class="ml-1 custom-btn custom-icon"
icon="WMi-yoga-posture"
@click.native.prevent=""
/>
<RectangleButton
size="large"
@ -52,6 +57,7 @@
width="48"
class="ml-1 custom-btn custom-icon"
icon=" WMi-trash"
@click.native.prevent="deleteSerieFromProgram(series.id)"
/>
<i class="WMi-right-open ml-3"></i>
</v-col>
@ -60,12 +66,22 @@
</router-link>
</template>
<script>
import { mapActions, mapMutations } from "vuex";
export default {
props: {
series: {
type: Object,
},
seriesNumber: {},
programId: {},
},
computed: {},
methods: {
...mapActions("programSerie", ["deleteSerieFromProgram"]),
...mapMutations("programSerie", ["SET_CURRENT_SERIE_ID"]),
async setSerieId(id) {
await this.SET_CURRENT_SERIE_ID(id);
},
},
};
</script>

@ -14,52 +14,58 @@
</div>
<div>
<RectangleButton
icon-right="WMi-filter"
class="custom-btn filter-btn"
size="x-large"
icon="WMi-plus"
class="custom-btn"
height="54"
:text-mode="true"
text="2"
size="xx-large"
@click.native="$_openModal('add_series')"
/>
</div>
</div>
<v-row v-for="(series, i) in allSeries" :key="i" class="mt-4">
<v-col cols="12"><SeriesItem :seriesNumber="i + 1" :series="series" /></v-col>
<v-row
v-for="(series, i) in getProgramSerie.series"
:key="i"
class="mt-4"
>
<v-col cols="12"
><SeriesItem
:seriesNumber="i + 1"
:series="series"
:programId="porgramtId"
/></v-col>
</v-row>
</div>
</main-back>
<div class="text-center">
<AddSeriesModal :programId="porgramtId" />
</div>
</div>
</template>
<script>
import SectionTitle from "../Global/Section/SectionTitle.vue";
import SeriesItem from "./Item.vue";
import { mapGetters, mapActions } from "vuex";
import AddSeriesModal from "./Modals/AddSeriesModal.vue";
export default {
components: {
SectionTitle,
SeriesItem,
AddSeriesModal,
},
computed: {
...mapGetters("programSerie", ["getProgramSerie"]),
porgramtId() {
return this.$route.params.id;
},
},
methods: {
...mapActions("programSerie", ["loadProgramSerie"]),
},
async created() {
await this.loadProgramSerie(this.porgramtId);
},
data: () => ({
allSeries: [
{
id: 1,
name: "chest",
per_week: 1,
moves_add: 8,
},
{
id: 2,
name: "arms",
per_week: 2,
moves_add: 7,
},
{
id: 3,
name: "abs",
per_week: 1,
moves_add: 12,
},
],
}),
};
</script>
<style scoped>

@ -0,0 +1,101 @@
<template>
<basic-modal width="520" transition="slide-x-transition">
<template #header>
<div class="close__modal">
<v-icon class="WMi-cancel-1" large @click="$_closeModal()"></v-icon>
</div>
</template>
<template #default>
<div>
<SectionTitle
title="add a series"
subTitle="let us help in your search"
:is-modal="true"
/>
</div>
<div class="mt-6 mb-10">
<v-row>
<v-col cols="12">
<v-text-field
dark
placeholder="series Name"
label="series Name"
class="no-error-msg"
v-model="form.name"
></v-text-field
></v-col>
</v-row>
<div class="mt-5">
<v-row>
<v-col cols="6"
><v-text-field
dark
placeholder="how many times in a week?"
label="how many times in a week?"
class="no-error-msg mt-0 pt-0"
v-model="form.repeat"
></v-text-field>
</v-col>
<v-col cols="6">
<TimeInput
v-model="form.estimate_time"
class="no-error-msg"
placeholder="estimated training time"
label="estimated training time"
/>
</v-col>
</v-row>
</div>
</div>
</template>
<template #footer>
<v-spacer></v-spacer>
<div
class="d-flex justify-space-between align-items-center w-100 px-4 pb-10"
>
<RectangleButton
class="btn__modal--cancel pl-0"
text="cancel"
icon="WMi-cancel-1"
text-mode="text"
size="large"
:is-modal="true"
height="29"
@click.native="$_closeModal()"
/>
<RectangleButton
height="29"
class="btn__modal--confirm custom-btn wa__f__m__eb"
text="add"
@click.native="addSerie"
/>
</div>
</template>
</basic-modal>
</template>
<script>
import { mapActions } from "vuex";
import SectionTitle from "../../Global/Section/SectionTitle.vue";
export default {
name: "modal_add_series",
components: { SectionTitle },
props: {
programId: {},
},
data: () => ({
form: {},
}),
methods: {
...mapActions("programSerie", ["addSerieToProgram"]),
async addSerie() {
let response = await this.addSerieToProgram({
data: this.form,
courseId: Number(this.programId),
});
if (response) {
this.$_closeModal();
}
},
},
};
</script>

@ -14,7 +14,10 @@
height="32"
:icon="program.verified ? 'WMi-cancel' : 'WMi-ok'"
/>
<router-link :to="{ name: 'programSeries' }">
<router-link
class="text-decoration-none"
:to="{ name: 'programSeries', params: { id: program.id } }"
>
<RectangleButton
size="large"
class="custom-btn ml-1"

@ -82,12 +82,4 @@ export default {
name: "modal_filters",
components: { SectionTitle },
};
</script>
<style scoped>
.close__modal {
position: absolute;
top: 0;
right: 0;
cursor: pointer;
}
</style>
</script>

@ -3,7 +3,9 @@
<v-row>
<v-col cols="3">
<div>
<div class="user__name wa__f__m__eb">{{ user.name }}</div>
<div class="user__name wa__f__m__eb">
{{ user.first_name }} {{ user.last_name }}
</div>
<small class="user__email">{{ user.email }}</small>
</div>
</v-col>
@ -11,23 +13,23 @@
<div class="mt-n1">
<small>Role:</small>
<div class="user__role wa__f__m__eb text-uppercase">
{{ user.role }}
{{ userRole }}
</div>
</div>
</v-col>
<v-col cols="3">
<div v-if="user.role == 'trainer'" class="d-flex align-center mt-n4">
<div v-if="userRole == 'trainer'" class="d-flex align-center mt-n4">
<div class="user__program--quantity wa__f__m__eb mr-2">
{{ user.program_created }}
{{ user.created_courses_count }}
</div>
<div class="user__program__text">program created</div>
</div>
<div
v-else-if="user.role == 'trainee'"
v-else-if="userRole == 'trainee'"
class="d-flex align-center mt-n4"
>
<div class="user__program--quantity wa__f__m__eb mr-2">
{{ user.program_attended }}
{{ user.joined_courses_count }}
</div>
<div class="user__program__text">program attended</div>
</div>
@ -42,6 +44,7 @@
@click.native="$_openModal('changeRole')"
size="large"
/>
<!-- <router-link :to="{ name: 'profile' }"> -->
<RectangleButton
height="35"
width="48"
@ -49,12 +52,14 @@
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>
@ -62,12 +67,27 @@
</div>
</template>
<script>
import { mapActions } from "vuex";
export default {
props: {
user: {
type: Object,
},
},
computed: {
userRole() {
return this.user.is_admin && !this.user.is_trainer
? "admin"
: this.user.is_admin && this.user.is_trainer
? "admin & trainer"
: this.user.is_trainer
? "trainer"
: "trainee";
},
},
methods: {
...mapActions("users", ["deleteUser"]),
},
};
</script>
<style scoped>
@ -90,6 +110,10 @@ export default {
.user__name {
text-transform: uppercase;
letter-spacing: 5px;
white-space: nowrap;
text-overflow: ellipsis;
word-wrap: break-word;
overflow: hidden;
}
.user__email {
position: relative;

@ -24,10 +24,16 @@
/>
</div>
</div>
<v-row v-for="(user, i) in users" :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" /></v-col>
</v-row>
</div>
<div class="text-center mt-40 mb-5">
<pagination
:pagination="getPaginationUser"
@pagination="changePagination"
/>
</div>
</main-back>
<div class="text-center"><ChangeRoleModal /><FiltersModal /></div>
</div>
@ -37,6 +43,7 @@ import SectionTitle from "../Global/Section/SectionTitle.vue";
import ChangeRoleModal from "./Modals/ChangeRoleModal.vue";
import FiltersModal from "./Modals/FiltersModal.vue";
import UserItem from "./Item.vue";
import { mapActions, mapGetters, mapMutations } from "vuex";
export default {
components: {
SectionTitle,
@ -44,29 +51,21 @@ export default {
ChangeRoleModal,
FiltersModal,
},
data: () => ({
users: [
{
id: 1,
name: "reza asgari",
email: "Reza-Asgary@outlook.com",
role: "trainer",
program_created: 12,
},
{
id: 2,
name: "alireza hassani",
email: "Alireza-Hassani@outlook.com",
role: "trainee",
program_attended: 2,
},
{
id: 3,
name: "farzad hosseini",
email: "Farzad-Hosseini@outlook.com",
role: "admin",
},
],
}),
computed: {
...mapGetters("users", ["getUsers", "getPaginationUser"]),
},
methods: {
...mapActions("users", ["loadUsers"]),
...mapMutations("users", ["SET_PAGINATION"]),
changePagination(page) {
if (this.getPaginationUser.page !== page) {
this.SET_PAGINATION(page);
this.loadUsers();
}
},
},
created() {
this.loadUsers();
},
};
</script>

@ -13,24 +13,32 @@
:is-modal="true"
/>
</div>
<v-item-group class="mt-10 mb-16" mandatory>
<v-item-group
class="mt-10 mb-16"
mandatory
multiple
v-model="form.roles"
@change="change"
>
<v-row>
<v-col cols="12" v-for="(role, i) in roles" :key="i" class="py-1">
<v-item v-slot="{ active, toggle }">
<main-back :social="true">
<v-card
:class="[
'd-flex',
'align-center',
{ 'item--active': active },
]"
dark
height="45"
@click="toggle"
>
<v-card-text class="role">{{ role.text }}</v-card-text>
</v-card>
</main-back>
<v-item v-slot="{ active, toggle }" :value="role.text">
<v-list-item :disabled="role.disabled" class="d-block">
<main-back :social="true">
<v-card
:class="[
'd-flex',
'align-center',
{ 'item--active': active },
]"
dark
height="45"
@click="toggle"
>
<v-card-text class="role">{{ role.text }}</v-card-text>
</v-card>
</main-back>
</v-list-item>
</v-item>
</v-col>
</v-row>
@ -38,7 +46,7 @@
</template>
<template #footer>
<v-spacer></v-spacer>
<div class="d-flex justify-space-between align-items-center w-100">
<div class="d-flex justify-space-between align-items-center w-100 px-4">
<RectangleButton
class="btn__modal--cancel pl-0"
text="cancel"
@ -64,30 +72,38 @@ export default {
name: "modal_changeRole",
components: { SectionTitle },
data: () => ({
form: {},
roles: [
{
id: 1,
text: "trainee",
disabled: false,
},
{
id: 2,
text: "trainer",
disabled: false,
},
{
id: 3,
text: "admin",
disabled: false,
},
],
}),
methods: {
change() {
console.log(this.form);
console.log(this.form.roles.includes("admin"));
this.form.roles.includes("admin") || this.form.roles.includes("admin")
? (this.disabled = true)
: (this.disabled = false);
console.log(this.disabled);
},
},
};
</script>
<style scoped>
.close__modal {
position: absolute;
top: 0;
right: 0;
cursor: pointer;
}
.role {
font-size: 26px;
text-transform: uppercase;

@ -46,10 +46,10 @@
</template>
<template #footer>
<v-spacer></v-spacer>
<div class="d-flex justify-space-between align-items-center w-100">
<div class="d-flex justify-space-between align-items-center w-100 px-4">
<RectangleButton
class="btn__modal--cancel pl-0"
text="cancel"
text="clear"
icon="WMi-cancel-1"
text-mode="text"
size="large"
@ -73,12 +73,4 @@ export default {
name: "modal_filters",
components: { SectionTitle },
};
</script>
<style scoped>
.close__modal {
position: absolute;
top: 0;
right: 0;
cursor: pointer;
}
</style>
</script>

@ -69,7 +69,7 @@ export default {
},
methods: {
...mapActions("workouts", ["loadWorkouts"]),
...mapMutations("programs", ["SET_PAGINATION"]),
...mapMutations("workouts", ["SET_PAGINATION"]),
changePagination(page) {
if (this.getPaginationWorkout.page !== page) {
this.SET_PAGINATION(page);

@ -55,10 +55,10 @@
</template>
<template #footer>
<v-spacer></v-spacer>
<div class="d-flex justify-space-between align-items-center w-100">
<div class="d-flex justify-space-between align-items-center w-100 px-4">
<RectangleButton
class="btn__modal--cancel pl-0"
text="cancel"
text="clear"
icon="WMi-cancel-1"
text-mode="text"
size="large"
@ -82,12 +82,4 @@ export default {
name: "modal_filters",
components: { SectionTitle },
};
</script>
<style scoped>
.close__modal {
position: absolute;
top: 0;
right: 0;
cursor: pointer;
}
</style>
</script>

@ -1,39 +1,66 @@
<template>
<div class="border-bottom">
<div class="border-bottom w-100">
<v-row>
<v-col cols="4" class="pr-0">
<v-col :cols="addWorkout ? 3 : 4" class="pr-0">
<!-- addWorkout ? addWorkout.thumbnail : seriesWorkout.thumbnail -->
<div
class="series__workout__img"
:style="{ backgroundImage: `url(${seriesWorkout.src})` }"
></div
></v-col>
<v-col cols="8">
class="series__workout__image"
:style="{
backgroundImage: `url('http://via.placeholder.com/200')`,
}"
></div>
<!-- <div v-else>
<img
src="http://via.placeholder.com/200"
alt="add workout"
class="series__workout__img"
/>
</div> -->
</v-col>
<v-col :cols="addWorkout ? 9 : 8">
<div class="details__card">
<div>
<div class="series__workout__title wa__f__m__eb text-uppercase">
{{ seriesWorkout.title }}
<div
class="series__workout__title wa__f__m__eb text-uppercase mb-2"
>
{{ addWorkout ? addWorkout.title : seriesWorkout.title }}
</div>
<div class="series__workout__description">
{{ seriesWorkout.description }}
{{
addWorkout ? addWorkout.description : seriesWorkout.description
}}
</div>
</div>
<div>
<div v-if="seriesWorkout">
<div class="d-flex justify-space-between align-center">
<div class="d-flex">
<div class="mr-6">
<i class="WMi-clock-3"></i>
<span class="wa__f__m__eb">{{ seriesWorkout.time }}</span>
<span class="wa__f__m__eb">{{
seriesWorkout.suggested_time
}}</span>
</div>
<div>
<i class="WMi-list"></i>
<span class="wa__f__m__eb"
>{{ seriesWorkout.sets }}x{{ seriesWorkout.workouts }}</span
>{{ seriesWorkout.set }}x{{ seriesWorkout.per_set }}</span
>
</div>
</div>
<div>
<rectangle-button size="large" height="26" icon="WMi-trash" class="custom-btn custom-icon ml-1" />
<rectangle-button size="large" height="26" icon="WMi-pencil" class="custom-btn custom-icon ml-1" />
<RectangleButton
size="large"
height="26"
icon="WMi-trash"
class="custom-btn custom-icon ml-1"
@click.native="removeWorkoutFromSerie(seriesWorkout)"
/>
<RectangleButton
size="large"
height="26"
icon="WMi-pencil"
class="custom-btn custom-icon ml-1"
/>
</div>
</div>
</div>
@ -43,28 +70,54 @@
</div>
</template>
<script>
import { mapActions, mapGetters } from "vuex";
export default {
props: {
seriesWorkout: {
type: Object,
},
addWorkout: {
default: false,
},
serieId: {},
},
computed: {
...mapGetters("workoutToSerie", ["getWorkoutsToSerie"]),
},
methods: {
...mapActions("workoutToSerie", ["deleteWorkoutFromSerie"]),
async removeWorkoutFromSerie(workout) {
await this.deleteWorkoutFromSerie({
serieId: this.serieId,
workoutId: workout.id,
});
this.$emit("deleteWorkoutFromSerie", this.serieId);
console.log("this.getWorkoutsToSerie after", this.getWorkoutsToSerie);
},
},
};
</script>
<style scoped>
.series__workout__img {
.series__workout__image {
border-radius: 20px;
height: 150px;
background-size: cover;
background-position: center;
}
.series__workout__img {
width: 100%;
height: 100px;
object-fit: contain;
}
.series__workout__title {
letter-spacing: 4px;
color: var(--color-white);
}
.series__workout__description {
font-size: 10px;
text-align: left;
line-height: 10px;
color: #e3e3e3;
}
.border-bottom {
border-bottom: 1px solid var(--color-gray) !important;

@ -7,6 +7,7 @@
<SectionTitle
backText="program series"
link="programSeries"
:params="programId"
icon="WMi-left-open"
title="series workouts"
subTitle="let us know you better, it comes handy."
@ -19,6 +20,7 @@
size="xx-large"
height="54"
:text-mode="true"
@click.native="$_openModal('add_workout')"
/>
</div>
</div>
@ -27,49 +29,82 @@
cols="12"
sm="6"
class="mb-3"
v-for="(seriesWorkout, i) in seriesWorkouts"
v-for="(seriesWorkout, i) in workoutsSeries"
:key="i"
><SeriesWorkoutsItem :seriesWorkout="seriesWorkout"
><workoutsSeriesItem
:seriesWorkout="seriesWorkout"
:serieId="getCurrentSerieId"
@deleteWorkoutFromSerie="deleteWorkoutFromSerie($event)"
/></v-col>
</v-row>
</div>
</main-back>
<div class="text-center">
<AddWorkoutModal />
</div>
</div>
</template>
<script>
import SectionTitle from "../Global/Section/SectionTitle.vue";
import SeriesWorkoutsItem from "./Item.vue";
import FirstImage from "../../assets/28-284379_photo-wallpaper-man-workout-gym-working-gym-workout.jpg";
import SecondImage from "../../assets/a-bodybuilder-exhibits-his-muscular-physique-1024-768-0.jpg";
import workoutsSeriesItem from "./Item.vue";
import AddWorkoutModal from "./Modals/AddWorkoutModal.vue";
import { mapGetters, mapActions, mapMutations } from "vuex";
export default {
components: {
SectionTitle,
SeriesWorkoutsItem,
workoutsSeriesItem,
AddWorkoutModal,
},
data: () => ({
seriesWorkouts: [
{
id: 1,
src: FirstImage,
title: "chest press",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum",
time: "15:30",
sets: 3,
workouts: 12,
},
{
id: 2,
src: SecondImage,
title: "chest press - dumbell ",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum",
time: "15:30",
sets: 3,
workouts: 12,
},
],
workoutsSeries: [],
}),
computed: {
...mapGetters("programSerie", ["getProgramSerie", "getCurrentSerieId"]),
serieId() {
return this.$route.params.serieId;
},
programId() {
return this.$route.params.programId;
},
},
watch: {
$route(to) {
this.SET_CURRENT_SERIE_ID(to.params.serieId);
},
},
methods: {
...mapActions("programSerie", ["loadProgramSerie"]),
...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.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>

@ -0,0 +1,197 @@
<template>
<basic-modal width="800" transition="slide-x-transition">
<template #header>
<div class="close__modal">
<v-icon class="WMi-cancel-1" large @click="$_closeModal()"></v-icon>
</div>
</template>
<template #default>
<div>
<SectionTitle
title="add a workout"
subTitle="let us help in your search"
:is-modal="true"
/>
</div>
<div class="mt-8 mb-10">
<div>
<v-autocomplete
class="no-error-msg pt-0"
placeholder="search the workout name you want to add"
label="search the workout name you want to add"
append-icon="WMi-search"
:items="getWorkoutsToSerie"
item-value="id"
item-text="title"
:loading="isLoading"
:search-input.sync="search"
>
<template #item="{ item }">
<div class="dashfkl w-100">
<AddWorkoutsItem
@click.native="joinWorkout(item.id)"
:addWorkout="item"
:add="true"
class="mt-3"
/>
</div>
</template>
</v-autocomplete>
</div>
<template v-if="Object.keys(getWorkoutToSerie).length !== 0">
<v-divider class="mt-6"></v-divider>
<v-row class="mt-1">
<v-col cols="12"
><AddWorkoutsItem :addWorkout="getWorkoutToSerie" :add="true"
/></v-col>
</v-row>
</template>
<div class="mt-6">
<v-row
:class="{ 'mt-9': Object.keys(getWorkoutToSerie).length === 0 }"
>
<v-col cols="4">
<v-text-field
dark
placeholder="how many courses?"
label="how many courses?"
class="no-error-msg pt-0 mt-0"
v-model="form.set"
></v-text-field>
</v-col>
<v-col cols="4">
<v-text-field
dark
placeholder="how many times each course?"
label="how many times each course?"
class="no-error-msg pt-0 mt-0"
v-model="form.per_set"
></v-text-field>
</v-col>
<v-col cols="4">
<TimeInput
v-model="form.estimate_time"
class="no-error-msg"
placeholder="ESTIMATED REQUIRED TIME"
label="ESTIMATED REQUIRED TIME"
/>
</v-col>
</v-row>
</div>
<v-row>
<v-col cols="12">
<v-textarea
placeholder="any other description"
label="any other description"
class="no-error-msg"
dark
row="4"
v-model="form.description"
></v-textarea>
</v-col>
</v-row>
</div>
</template>
<template #footer>
<v-spacer></v-spacer>
<div class="d-flex justify-space-between align-items-center w-100 px-4">
<RectangleButton
class="btn__modal--cancel pl-0"
text="cancel"
icon="WMi-cancel-1"
text-mode="text"
size="large"
:is-modal="true"
height="29"
@click.native="$_closeModal()"
/>
<RectangleButton
height="29"
class="btn__modal--confirm custom-btn wa__f__m__eb"
text="add"
@click.native="WorkoutToSerie"
/>
</div>
</template>
</basic-modal>
</template>
<script>
import SectionTitle from "../../Global/Section/SectionTitle.vue";
import AddWorkoutsItem from "../Item.vue";
import { mapActions, mapGetters, mapMutations } from "vuex";
import { cloneDeep } from "lodash";
let cancelId;
const defaultFilter = {
title: {
type: "like",
val: null,
},
};
export default {
name: "modal_add_workout",
components: { SectionTitle, AddWorkoutsItem },
data: () => ({
filter: cloneDeep(defaultFilter),
search: null,
isLoading: false,
isLoadingTimeout: null,
form: {},
workoutId: null,
}),
computed: {
...mapGetters("workoutToSerie", [
"getWorkoutsToSerie",
"getWorkoutToSerie",
]),
...mapGetters("programSerie", ["getCurrentSerieId"]),
},
watch: {
search(val) {
this.isLoading = true;
clearTimeout(cancelId);
if (val && val.length > 1) {
cancelId = setTimeout(async () => {
this.filter.title.val = val;
this.SET_FILTER_WORKOUTS_TO_SERIE(this.filter);
await this.loadWorkoutsToSerie();
this.isLoading = false;
}, 400);
} else if (val.length == 0) {
this.SET_FILTER_WORKOUTS_TO_SERIE({});
this.loadWorkoutsToSerie();
this.isLoading = false;
}
},
},
methods: {
...mapActions("workoutToSerie", [
"loadWorkoutsToSerie",
"loadWorkoutToSerie",
"addWorkoutToSerie",
]),
...mapMutations("workoutToSerie", ["SET_FILTER_WORKOUTS_TO_SERIE"]),
async joinWorkout(id) {
this.workoutId = id;
await this.loadWorkoutToSerie(this.workoutId);
},
async WorkoutToSerie() {
let response = await this.addWorkoutToSerie({
data: this.form,
serieId: Number(this.getCurrentSerieId),
workoutId: this.workoutId,
});
if (response) {
this.$_closeModal();
}
},
},
async created() {
await this.loadWorkoutsToSerie();
},
};
</script>
<style scoped>
.theme--light.v-list {
background-color: rgb(46, 45, 45) !important;
}
</style>

@ -60,12 +60,12 @@ export default [
name: 'programs'
},
{
path: '/program-series',
path: '/program-series/:id',
view: 'ProgramSeries',
name: 'programSeries'
},
{
path: '/workouts-series',
path: '/program-series/:programId/workouts-series/:serieId',
view: 'WorkoutsSeries',
name: 'workoutsSeries'
},
@ -80,7 +80,7 @@ export default [
name: 'products'
},
{
path: '/add-product',
path: '/add-product/:id?',
view: 'AddProduct',
name: 'addProduct'
},

@ -19,11 +19,36 @@ const urls = {
// workout categories
indexWorkoutCategories: "admin/workout-categories",
// workouts
indexClientWorkout: "workouts",
showClientWorkout: "workouts/:workout",
indexWorkout: "admin/workouts",
showWorkout: "admin/workouts/:workout",
storeWorkout: "admin/workouts",
updateWorkout: "admin/workouts/:workout",
destroyWorkout: "admin/workouts/:workout",
// join workout to serie
joinWorkoutToSerie: "trainer/series/:serie/workout/:workout",
destroyWorkoutFromSerie: "trainer/series/:serie/workout/:workout",
// serie
storeSerie: "trainer/course/:course/series",
destroySerie: "trainer/series/:serie",
// product
indexProduct: "admin/products",
showProduct: "admin/products/:product",
storeProduct: "admin/products",
// product category
indexProductCategories: "admin/product-categories",
// users
indexUsers: "admin/users",
destroyUser: "admin/users/:user",
// countries
indexCountries: "countries",
// profile
updateProfile: "user",
showProfile: "user",
// bookmarks
indexCoursesBookmarks: "bookmarks/course",
indexWorkoutsBookmarks: "bookmarks/workout",
// file
storeFile: 'media'
};

@ -28,7 +28,6 @@ export default {
async register({ commit }, data) {
let repository = new AuthRepository();
const response = await repository.register(data);
console.log('response', response);
if (response) {
setTokenHeader(commit, response);
return response;

@ -1,6 +1,6 @@
import Vue from "vue";
export default {
SET_AUTH_USER(state, data) {
Vue.set(state, "user", data);
SET_AUTH_USER(state, payload) {
Vue.set(state, "user", payload);
},
};

@ -0,0 +1,15 @@
import BookmarksRepository from "@/abstraction/repository/bookmarksRepository";
export default {
async loadBookmarksPrograms({ commit }) {
let repository = new BookmarksRepository();
const resource = await repository.indexCourses();
commit("SET_BOOKMARKS_PROGRAMS", resource.data);
// commit("SET_PAGINATION", resource.pagination);
},
async loadBookmarksWorkouts({ commit }) {
let repository = new BookmarksRepository();
const resource = await repository.indexWorkouts();
commit("SET_BOOKMARKS_WORKOUTS", resource.data);
// commit("SET_PAGINATION", resource.pagination);
},
};

@ -0,0 +1,4 @@
export default {
getBookmarksPrograms: state => state.programs,
getBookmarksWorkouts: state => state.workouts,
}

@ -0,0 +1,9 @@
import Vue from "vue";
export default {
SET_BOOKMARKS_PROGRAMS(state, payload) {
Vue.set(state, "programs", payload)
},
SET_BOOKMARKS_WORKOUTS(state, payload) {
Vue.set(state, "workouts", payload)
},
};

@ -0,0 +1,7 @@
export default {
programs: [],
workouts: [],
pagination: {
itemsPerPage: 12
},
};

@ -0,0 +1,8 @@
import CountriesRepository from "@/abstraction/repository/countriesRepository"
export default {
async loadCountries({ commit }) {
let repository = new CountriesRepository();
let resource = await repository.index();
commit('SET_COUNTRIES', resource.data)
},
}

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

@ -0,0 +1,6 @@
import Vue from 'vue';
export default {
SET_COUNTRIES(state, payload) {
Vue.set(state, 'countries', payload)
},
}

@ -0,0 +1,3 @@
export default {
countries: []
}

@ -0,0 +1,8 @@
import ProductCategoriesRepository from "@/abstraction/repository/productCategoriesRepository";
export default {
async loadProductCategories({ commit }) {
let repository = new ProductCategoriesRepository();
const resource = await repository.index();
commit("SET_PRODUCT_CATEGORIES", resource.data);
},
};

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

@ -0,0 +1,6 @@
import Vue from "vue";
export default {
SET_PRODUCT_CATEGORIES(state, payload) {
Vue.set(state, "productCategories", payload);
},
};

@ -0,0 +1,3 @@
export default {
productCategories: [],
};

@ -0,0 +1,29 @@
import ProductRepository from "@/abstraction/repository/productRepository";
export default {
async loadProducts({ state, commit }) {
let data = { pagination: state.pagination };
let repository = new ProductRepository();
const resource = await repository.index(data);
console.log('dfsa');
console.log('resource', resource);
commit("SET_PRODUCTS", resource.data);
commit("SET_PAGINATION", resource.pagination);
},
async loadProduct({ commit }, productId) {
let repository = new ProductRepository();
const resource = await repository.show(productId);
commit("SET_PRODUCT", resource);
},
async addProduct({ commit }, data) {
let repository = new ProductRepository();
const resource = await repository.store(data);
commit("ADD_PRODUCT", resource.data);
},
async updateProduct({ commit }, data) {
let repository = new ProductRepository();
const resource = await repository.update(data.id, data);
commit("UPDATE_PRODUCT", resource);
}
};

@ -0,0 +1,5 @@
export default {
getProducts: state => state.products,
getProduct: state => state.product,
getPaginationProduct: state => state.pagination
}

@ -0,0 +1,21 @@
import Vue from "vue";
export default {
SET_PRODUCTS(state, payload) {
console.log('payload', payload);
Vue.set(state, "products", payload)
},
SET_PAGINATION(state, pagination) {
pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination);
},
SET_PRODUCT(state, payload) {
Vue.set(state, "product", payload);
},
ADD_PRODUCT(state, payload) {
state.products.push(payload);
},
UPDATE_PROGRAM(state, payload) {
const index = state.products.findIndex((x) => x.id === payload.id);
Vue.set(state.products, index, payload);
},
};

@ -0,0 +1,7 @@
export default {
products: [],
product: {},
pagination: {
itemsPerPage: 12
},
};

@ -0,0 +1,13 @@
import ProfileRepository from "@/abstraction/repository/profileRepository"
export default {
async loadProfile({ commit },) {
let repository = new ProfileRepository();
let resource = await repository.show();
commit('SET_PROFILE', resource)
},
async updateProfile({ commit }, data) {
let repository = new ProfileRepository();
let resource = await repository.update(data);
commit("UPDATE_PROFILE", resource);
}
}

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

@ -0,0 +1,9 @@
import Vue from 'vue';
export default {
SET_PROFILE(state, payload) {
Vue.set(state, 'profile', payload)
},
UPDATE_PROFILE(state, payload) {
Vue.set(state, 'profile', payload)
}
}

@ -0,0 +1,3 @@
export default {
profile: {}
}

@ -0,0 +1,21 @@
import ProgramSerieRepository from "@/abstraction/repository/programSerieRepository";
export default {
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);
return resource
}
},
async deleteSerieFromProgram({ commit }, serieId) {
let repository = new ProgramSerieRepository();
await repository.delete(serieId);
commit('DELETE_SERIE_FROM_PROGRAM', serieId);
},
};

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

@ -0,0 +1,16 @@
import Vue from "vue";
export default {
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);
},
DELETE_SERIE_FROM_PROGRAM(state, payload) {
const index = state.programSerie.series.findIndex((x) => x.id === payload);
Vue.delete(state.programSerie.series, index)
}
};

@ -0,0 +1,4 @@
export default {
programSerie: {},
currentSerieId: null,
};

@ -33,7 +33,6 @@ export default {
commit('DELETE_PROGRAM', courseId);
},
async verifyProgram({ commit }, courseId) {
console.log('s');
let repository = new ProgramRepository();
await repository.verify(courseId);
commit("VERIFY_PROGRAM", courseId);

@ -1,29 +1,28 @@
import Vue from "vue";
export default {
SET_PROGRAMS(state, data) {
Vue.set(state, "programs", data);
SET_PROGRAMS(state, payload) {
Vue.set(state, "programs", payload);
},
SET_PROGRAM(state, data) {
Vue.set(state, "program", data);
SET_PROGRAM(state, payload) {
Vue.set(state, "program", payload);
},
SET_PAGINATION(state, pagination) {
pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination);
},
ADD_PROGRAM(state, data) {
state.programs.push(data);
ADD_PROGRAM(state, payload) {
state.programs.push(payload);
},
UPDATE_PROGRAM(state, data) {
const index = state.programs.findIndex((x) => x.id === data.id);
Vue.set(state.programs, index, data);
UPDATE_PROGRAM(state, payload) {
const index = state.programs.findIndex((x) => x.id === payload.id);
Vue.set(state.programs, index, payload);
},
DELETE_PROGRAM(state, courseId) {
const index = state.programs.findIndex((x) => x.id === courseId);
state.programs.splice(index, 1);
Vue.delete(state.programs, index)
},
VERIFY_PROGRAM(state, courseId) {
const index = state.programs.find(x => x.id === courseId);
console.log('index', index);
index.verified = !index.verified;
}
};

@ -1,9 +1,9 @@
import Vue from "vue";
export default {
SET_SPORT_CATEGORIES(state, data) {
Vue.set(state, "sportCategories", data);
SET_SPORT_CATEGORIES(state, payload) {
Vue.set(state, "sportCategories", payload);
},
SET_SPORT_CATEGORY(state, data) {
Vue.set(state, "sportCategory", data);
SET_SPORT_CATEGORY(state, payload) {
Vue.set(state, "sportCategory", payload);
},
};

@ -0,0 +1,15 @@
import UsersRepository from "@/abstraction/repository/usersRepository";
export default {
async loadUsers({ state, commit }) {
let data = { pagination: state.pagination }
let repository = new UsersRepository();
const resource = await repository.index(data);
commit("SET_USERS", resource.data);
commit("SET_PAGINATION", resource.pagination);
},
async deleteUser({ commit }, userId) {
let repository = new UsersRepository();
await repository.delete(userId);
commit('DELETE_USER', userId);
},
};

@ -0,0 +1,4 @@
export default {
getUsers: state => state.users,
getPaginationUser: state => state.pagination
};

@ -0,0 +1,15 @@
import Vue from "vue";
export default {
SET_USERS(state, payload) {
Vue.set(state, "users", payload);
},
SET_PAGINATION(state, pagination) {
pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination);
},
DELETE_USER(state, userId) {
const index = state.users.findIndex((x) => x.id === userId);
// state.users.splice(index, 1);
Vue.delete(state.users, index)
},
};

@ -0,0 +1,6 @@
export default {
users: [],
pagination: {
itemsPerPage: 12
}
};

@ -1,7 +1,7 @@
import Vue from "vue";
export default {
SET_WORKOUT_CATEGORIES(state, data) {
Vue.set(state, "workoutCategories", data);
SET_WORKOUT_CATEGORIES(state, payload) {
Vue.set(state, "workoutCategories", payload);
},
};

@ -0,0 +1,31 @@
import WorkoutToSerieRepository from "../../../abstraction/repository/workoutToSerieRepository";
export default {
async loadWorkoutsToSerie({ state, commit }) {
try {
let data = { filters: state.filters };
let repository = new WorkoutToSerieRepository();
const resource = await repository.index(data);
commit("SET_WORKOUTS_TO_SERIE", resource.data);
} catch (e) {
return e;
}
},
async loadWorkoutToSerie({ commit }, workoutId) {
let repository = new WorkoutToSerieRepository();
const resource = await repository.show(workoutId);
commit("SET_WORKOUT_TO_SERIE", resource);
},
async addWorkoutToSerie({ commit }, data) {
let repository = new WorkoutToSerieRepository();
const resource = await repository.store(data.data, data.serieId, data.workoutId);
if (resource) {
commit("ADD_WORKOUT_TO_SERIE", resource.data);
return resource.data
}
},
async deleteWorkoutFromSerie({ commit }, data) {
let repository = new WorkoutToSerieRepository();
await repository.delete(data);
commit('DELETE_WORKOUT_FROM_SERIE', data.workoutId);
},
};

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

@ -0,0 +1,19 @@
import Vue from "vue";
export default {
SET_WORKOUTS_TO_SERIE(state, payload) {
Vue.set(state, "workoutsToSerie", payload);
},
SET_WORKOUT_TO_SERIE(state, payload) {
Vue.set(state, "workoutToSerie", payload);
},
SET_FILTER_WORKOUTS_TO_SERIE(state, payload) {
Vue.set(state, "filters", payload);
},
ADD_WORKOUT_TO_SERIE(state, payload) {
state.workoutsToSerie.push(payload);
},
DELETE_WORKOUT_FROM_SERIE(state, workoutId) {
const index = state.workoutsToSerie.findIndex((x) => x.id === workoutId);
Vue.delete(state.workoutsToSerie, index)
},
};

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

@ -1,24 +1,24 @@
import Vue from "vue";
export default {
SET_WORKOUTS(state, data) {
Vue.set(state, "workouts", data);
SET_WORKOUTS(state, payload) {
Vue.set(state, "workouts", payload);
},
SET_WORKOUT(state, data) {
Vue.set(state, "workout", data);
SET_WORKOUT(state, payload) {
Vue.set(state, "workout", payload);
},
SET_PAGINATION(state, pagination) {
pagination = { ...state.pagination, ...pagination };
Vue.set(state, "pagination", pagination);
},
ADD_WORKOUT(state, data) {
state.workouts.push(data);
ADD_WORKOUT(state, payload) {
state.workouts.push(payload);
},
UPDATE_WORKOUT(state, data) {
const index = state.workouts.findIndex((x) => x.id === data.id);
Vue.set(state.workouts, index, data);
UPDATE_WORKOUT(state, payload) {
const index = state.workouts.findIndex((x) => x.id === payload.id);
Vue.set(state.workouts, index, payload);
},
DELETE_WORKOUT(state, workoutId) {
const index = state.workouts.findIndex((x) => x.id === workoutId);
state.workouts.splice(index, 1);
Vue.delete(state.workouts, index)
},
};

@ -54,8 +54,7 @@ textarea {
}
.v-list-item__content,
.v-select__slot input {
font-family: "montserrat";
text-transform: uppercase;
font-family: "Montserrat-light";
}
.v-label--active {
top: 13px !important;
@ -250,6 +249,13 @@ input::placeholder {
}
/* -------------------- button on modal ------------------------------*/
/* -------------------- button on modal ------------------------------*/
.close__modal {
position: absolute;
top: 0;
right: 0;
cursor: pointer;
}
.btn__modal--cancel {
font-family: "montserrat-medium" !important;
font-size: 14px !important;

@ -3,4 +3,13 @@ module.exports = {
transpileDependencies: [
'vuetify'
],
}
configureWebpack: {
resolve: {
alias: {
'@Assets': path.resolve(__dirname, 'src/assets'),
'@Styles': path.resolve(__dirname, 'src/styles'),
'@': path.resolve(__dirname, 'src/')
},
},
}
}
Loading…
Cancel
Save