Compare commits
134 Commits
614886306a
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cf9bc27a23 | |||
|
|
4a1fee0092 | ||
|
|
65409a908b | ||
|
|
c47ec66dff | ||
|
|
70fbefd317 | ||
|
|
27ca602154 | ||
|
|
c89dd356fb | ||
|
|
1414b6ff74 | ||
| f263a79ff7 | |||
|
|
00f9f00392 | ||
|
|
ad0cec9efb | ||
|
|
db881cba06 | ||
|
|
1e553380e2 | ||
|
|
8fc0f924b8 | ||
|
|
c0ca7108c7 | ||
| 6b316ec1aa | |||
|
|
298f35903b | ||
| 598107f8ad | |||
|
|
e3b4b40ae7 | ||
|
|
b64ad30c00 | ||
|
|
0c232f80cd | ||
|
|
effa7f8f2f | ||
|
|
2c74b1a2fd | ||
|
|
a9ca4b3482 | ||
|
|
587a4482db | ||
| 6075457fcf | |||
|
|
3de55264c9 | ||
|
|
cde23153ba | ||
|
|
622f2a7686 | ||
|
|
917918d742 | ||
|
|
f1069f3124 | ||
|
|
a3e57f295f | ||
|
|
054cb48e4c | ||
|
|
6298bb7b8c | ||
| f977877cd7 | |||
|
|
4807edec8f | ||
|
|
11cbd10db9 | ||
|
|
6acf79e23d | ||
|
|
e9aa0e795e | ||
| cc1a4aade1 | |||
|
|
fe4c4be6dd | ||
|
|
cd2eded7aa | ||
|
|
8fdc59552f | ||
| a6e7bb9dab | |||
|
|
930dbe3354 | ||
|
|
0f1bfcf774 | ||
|
|
1a7c5c5247 | ||
| 7133e43464 | |||
|
|
2929ab6150 | ||
|
|
92b528c9e9 | ||
|
|
8324294853 | ||
|
|
3bbd9dcbf6 | ||
|
|
ca60a9a2f4 | ||
| 90a7dbf827 | |||
|
|
fac8dd6f19 | ||
|
|
cc6d8147de | ||
| 217a26ca83 | |||
|
|
d50eac40c3 | ||
|
|
f0f0a975a9 | ||
|
|
97feef9395 | ||
| 6866c0e41c | |||
|
|
dd6f21c57b | ||
|
|
6bb9365a6c | ||
|
|
434de73554 | ||
|
|
d248ccd985 | ||
|
|
0f3056af01 | ||
|
|
0be0070568 | ||
| 7a3cf063ed | |||
|
|
f33e97666e | ||
|
|
67839dbfb9 | ||
|
|
35f172702a | ||
|
|
22272e0a17 | ||
| 4a0cf5762f | |||
|
|
16b6107206 | ||
|
|
9dc426bf64 | ||
|
|
2c71984d96 | ||
|
|
2d4487263d | ||
|
|
f1daf34751 | ||
| e106863c75 | |||
|
|
30128ea7c0 | ||
|
|
57552b3cf3 | ||
|
|
5db6974d16 | ||
|
|
77363d0f45 | ||
|
|
dbb1bc3073 | ||
| 7aab555cd2 | |||
| af1ad3227a | |||
|
|
07365df5eb | ||
|
|
8826edfcb6 | ||
|
|
c2095b6d8b | ||
| e5bafff815 | |||
|
|
f718d553c9 | ||
|
|
5d6555ea37 | ||
|
|
cb2b88c53d | ||
|
|
9036b9ab46 | ||
|
|
1bb26381d3 | ||
|
|
001ac9d230 | ||
|
|
c04be1b56f | ||
|
|
477286fe45 | ||
|
|
248a80727a | ||
|
|
036f194fb1 | ||
|
|
73ece6521b | ||
|
|
bbd1ceb8b5 | ||
|
|
a5fe5c22d1 | ||
|
|
98df36d4e5 | ||
|
|
3d0e922326 | ||
|
|
50030fd72f | ||
|
|
36a7b8a79b | ||
|
|
505f5c0840 | ||
|
|
b9f44caf1a | ||
|
|
886505885b | ||
|
|
cf6201cfa9 | ||
|
|
bc67a5ae1f | ||
|
|
fd7e602189 | ||
|
|
156658f3fa | ||
|
|
0a85108186 | ||
|
|
f5a6f527e3 | ||
|
|
abcf52111b | ||
|
|
ba93553b80 | ||
|
|
6929ed6b03 | ||
|
|
f33ece990d | ||
|
|
4375f0dec0 | ||
|
|
5ace0a7fd8 | ||
|
|
7df2989843 | ||
|
|
e3b0897727 | ||
|
|
96b5946eb5 | ||
|
|
0cd6f8c0ba | ||
|
|
bd643a20ca | ||
|
|
8ef7aecc2a | ||
|
|
ae8c22b560 | ||
|
|
a735471eb1 | ||
|
|
a860e0b163 | ||
|
|
4385f28143 | ||
|
|
fad41038c4 | ||
|
|
0b0f370c3b |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
*.iml
|
*.iml
|
||||||
.idea/
|
.idea/
|
||||||
/environment/infra/docker-compose/yogastic/.env
|
/environment/infra/docker-compose/yogastic/.env
|
||||||
|
/environment/prod/docker-compose/yogastic/.env
|
||||||
node_modules/
|
node_modules/
|
||||||
|
|
||||||
.strapi
|
.strapi
|
||||||
|
|||||||
13
api.http
13
api.http
@@ -22,3 +22,16 @@ x
|
|||||||
GET {{domain}}/api/yoga-blog-posts/wmhqy1n8japcfpy0of4hauwm
|
GET {{domain}}/api/yoga-blog-posts/wmhqy1n8japcfpy0of4hauwm
|
||||||
Accept: application/json
|
Accept: application/json
|
||||||
#Authorization: Bearer {{token}}
|
#Authorization: Bearer {{token}}
|
||||||
|
|
||||||
|
|
||||||
|
### GET request with a header
|
||||||
|
GET {{domain}}/api/yoga-single-services?filters[name][$eq]=service4
|
||||||
|
Accept: application/json
|
||||||
|
|
||||||
|
### GET service page
|
||||||
|
GET {{domain}}/api/service-list-page?fields[0]=*&populate[services][fields][0]=*&populate[services][populate][image][fields][0]=name&populate[services][populate][image][fields][1]=mime&populate[services][populate][image][fields][2]=url&populate[common][fields][0]=*&populate[common][populate][logoImage][fields][0]=name&populate[common][populate][logoImage][fields][1]=mime&populate[common][populate][logoImage][fields][2]=url&populate[subscribeNow][fields][0]=*&populate[subscribeNow][populate][image][fields][0]=name&populate[subscribeNow][populate][image][fields][1]=mime&populate[subscribeNow][populate][image][fields][2]=url&populate[footer][fields][0]=*&populate[footer][populate][links][fields][0]=*&populate[footer][populate][contactUsEmail][fields][0]=*&populate[footer][populate][contactUsLocation][fields][0]=*&populate[footer][populate][contactUsPhoneNumber][fields][0]=*&populate[footer][populate][logo][fields][0]=name&populate[footer][populate][logo][fields][1]=mime&populate[footer][populate][logo][fields][2]=url
|
||||||
|
Accept: application/json
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
20
dev.sh
Executable file
20
dev.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
PROJECT_ROOT=$(readlink -f $(dirname $0))
|
||||||
|
|
||||||
|
ENV_DIR=${PROJECT_ROOT}"/environment/dev/docker-compose/yogastic"
|
||||||
|
CMS_DIR=${PROJECT_ROOT}"/yoga-cms"
|
||||||
|
APP_DIR=${PROJECT_ROOT}"/yoga-app"
|
||||||
|
|
||||||
|
echo "PROJECT_ROOT $PROJECT_ROOT"
|
||||||
|
|
||||||
|
cd $ENV_DIR
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
cd $CMS_DIR
|
||||||
|
fuser -k 1337/tcp
|
||||||
|
npm run develop &
|
||||||
|
|
||||||
|
cd $APP_DIR
|
||||||
|
fuser -k 4081/tcp
|
||||||
|
npm run dev &
|
||||||
1
environment/common/.gitignore
vendored
Normal file
1
environment/common/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.env
|
||||||
255
environment/common/package-lock.json
generated
Normal file
255
environment/common/package-lock.json
generated
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
{
|
||||||
|
"name": "common",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {
|
||||||
|
"": {
|
||||||
|
"name": "common",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/js-yaml": "^4.0.9",
|
||||||
|
"@types/node": "^22.15.18",
|
||||||
|
"dotenv": "^16.5.0",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
|
"ts-node": "^10.9.2",
|
||||||
|
"typescript": "^5.8.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@cspotcode/source-map-support": {
|
||||||
|
"version": "0.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
|
||||||
|
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/trace-mapping": "0.3.9"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@jridgewell/resolve-uri": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@jridgewell/sourcemap-codec": {
|
||||||
|
"version": "1.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
|
||||||
|
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@jridgewell/trace-mapping": {
|
||||||
|
"version": "0.3.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
|
||||||
|
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@jridgewell/resolve-uri": "^3.0.3",
|
||||||
|
"@jridgewell/sourcemap-codec": "^1.4.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@tsconfig/node10": {
|
||||||
|
"version": "1.0.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
|
||||||
|
"integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@tsconfig/node12": {
|
||||||
|
"version": "1.0.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
|
||||||
|
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@tsconfig/node14": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@tsconfig/node16": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@types/js-yaml": {
|
||||||
|
"version": "4.0.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
|
||||||
|
"integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/@types/node": {
|
||||||
|
"version": "22.15.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.18.tgz",
|
||||||
|
"integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"undici-types": "~6.21.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/acorn": {
|
||||||
|
"version": "8.14.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
|
||||||
|
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": {
|
||||||
|
"acorn": "bin/acorn"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/acorn-walk": {
|
||||||
|
"version": "8.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
|
||||||
|
"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"acorn": "^8.11.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/arg": {
|
||||||
|
"version": "4.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
|
||||||
|
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/argparse": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||||
|
"license": "Python-2.0"
|
||||||
|
},
|
||||||
|
"node_modules/create-require": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/diff": {
|
||||||
|
"version": "4.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
||||||
|
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/dotenv": {
|
||||||
|
"version": "16.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
|
||||||
|
"integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
|
||||||
|
"license": "BSD-2-Clause",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://dotenvx.com"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/js-yaml": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"argparse": "^2.0.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"js-yaml": "bin/js-yaml.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/make-error": {
|
||||||
|
"version": "1.3.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
|
||||||
|
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
|
||||||
|
"license": "ISC"
|
||||||
|
},
|
||||||
|
"node_modules/ts-node": {
|
||||||
|
"version": "10.9.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
|
||||||
|
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@cspotcode/source-map-support": "^0.8.0",
|
||||||
|
"@tsconfig/node10": "^1.0.7",
|
||||||
|
"@tsconfig/node12": "^1.0.7",
|
||||||
|
"@tsconfig/node14": "^1.0.0",
|
||||||
|
"@tsconfig/node16": "^1.0.2",
|
||||||
|
"acorn": "^8.4.1",
|
||||||
|
"acorn-walk": "^8.1.1",
|
||||||
|
"arg": "^4.1.0",
|
||||||
|
"create-require": "^1.1.0",
|
||||||
|
"diff": "^4.0.1",
|
||||||
|
"make-error": "^1.1.1",
|
||||||
|
"v8-compile-cache-lib": "^3.0.1",
|
||||||
|
"yn": "3.1.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"ts-node": "dist/bin.js",
|
||||||
|
"ts-node-cwd": "dist/bin-cwd.js",
|
||||||
|
"ts-node-esm": "dist/bin-esm.js",
|
||||||
|
"ts-node-script": "dist/bin-script.js",
|
||||||
|
"ts-node-transpile-only": "dist/bin-transpile.js",
|
||||||
|
"ts-script": "dist/bin-script-deprecated.js"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@swc/core": ">=1.2.50",
|
||||||
|
"@swc/wasm": ">=1.2.50",
|
||||||
|
"@types/node": "*",
|
||||||
|
"typescript": ">=2.7"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@swc/core": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"@swc/wasm": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/typescript": {
|
||||||
|
"version": "5.8.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
|
||||||
|
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"bin": {
|
||||||
|
"tsc": "bin/tsc",
|
||||||
|
"tsserver": "bin/tsserver"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=14.17"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/undici-types": {
|
||||||
|
"version": "6.21.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
||||||
|
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/v8-compile-cache-lib": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
|
"node_modules/yn": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
environment/common/package.json
Normal file
19
environment/common/package.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "common",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"description": "",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/js-yaml": "^4.0.9",
|
||||||
|
"@types/node": "^22.15.18",
|
||||||
|
"dotenv": "^16.5.0",
|
||||||
|
"js-yaml": "^4.1.0",
|
||||||
|
"ts-node": "^10.9.2",
|
||||||
|
"typescript": "^5.8.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
28
environment/common/src/update.service.version.ts
Normal file
28
environment/common/src/update.service.version.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
import yaml from 'js-yaml'
|
||||||
|
import fs from 'fs';
|
||||||
|
import dotenv from "dotenv"
|
||||||
|
|
||||||
|
dotenv.config()
|
||||||
|
if ( !process.env.TARGET_FILE
|
||||||
|
|| !process.env.TARGET_SERVICE
|
||||||
|
|| !process.env.TARGET_IMAGE ) {
|
||||||
|
console.log("environment variables: TARGET_FILE, TARGET_SERVICE, TARGET_IMAGE are required")
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
console.log("Working directory",process.cwd());
|
||||||
|
console.log("TARGET_FILE",process.env.TARGET_FILE);
|
||||||
|
console.log("TARGET_SERVICE",process.env.TARGET_SERVICE);
|
||||||
|
console.log("TARGET_IMAGE",process.env.TARGET_IMAGE);
|
||||||
|
try {
|
||||||
|
console.log("updating service version");
|
||||||
|
const composeFile: any = yaml.load(fs.readFileSync(process.env.TARGET_FILE as string, 'utf8'));
|
||||||
|
console.log("updating image");
|
||||||
|
composeFile.services[process.env.TARGET_SERVICE as string].image = process.env.TARGET_IMAGE;
|
||||||
|
const result = yaml.dump(composeFile);
|
||||||
|
fs.writeFileSync(process.env.TARGET_FILE as string, result)
|
||||||
|
console.log("image updated",process.env.TARGET_FILE,process.env.TARGET_SERVICE,process.env.TARGET_IMAGE);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
|
||||||
113
environment/common/tsconfig.json
Normal file
113
environment/common/tsconfig.json
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
/* Visit https://aka.ms/tsconfig to read more about this file */
|
||||||
|
|
||||||
|
/* Projects */
|
||||||
|
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
|
||||||
|
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||||
|
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
|
||||||
|
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
|
||||||
|
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||||
|
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||||
|
|
||||||
|
/* Language and Environment */
|
||||||
|
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||||
|
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||||
|
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||||
|
// "libReplacement": true, /* Enable lib replacement. */
|
||||||
|
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
|
||||||
|
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||||
|
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
|
||||||
|
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||||
|
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
|
||||||
|
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
|
||||||
|
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||||
|
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||||
|
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
|
||||||
|
|
||||||
|
/* Modules */
|
||||||
|
"module": "commonjs", /* Specify what module code is generated. */
|
||||||
|
// "rootDir": "./", /* Specify the root folder within your source files. */
|
||||||
|
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||||
|
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||||
|
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||||
|
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||||
|
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
|
||||||
|
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||||
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
|
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
|
||||||
|
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
|
||||||
|
// "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
|
||||||
|
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
|
||||||
|
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
|
||||||
|
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
|
||||||
|
// "noUncheckedSideEffectImports": true, /* Check side effect imports. */
|
||||||
|
// "resolveJsonModule": true, /* Enable importing .json files. */
|
||||||
|
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
|
||||||
|
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
|
||||||
|
|
||||||
|
/* JavaScript Support */
|
||||||
|
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
|
||||||
|
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||||
|
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
|
||||||
|
|
||||||
|
/* Emit */
|
||||||
|
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||||
|
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||||
|
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||||
|
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||||
|
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||||
|
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||||
|
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
|
||||||
|
// "outDir": "./", /* Specify an output folder for all emitted files. */
|
||||||
|
// "removeComments": true, /* Disable emitting comments. */
|
||||||
|
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||||
|
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||||
|
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||||
|
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
|
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||||
|
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||||
|
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||||
|
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
|
||||||
|
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
|
||||||
|
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||||
|
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
|
||||||
|
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||||
|
|
||||||
|
/* Interop Constraints */
|
||||||
|
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||||
|
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
|
||||||
|
// "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
|
||||||
|
// "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */
|
||||||
|
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||||
|
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
|
||||||
|
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||||
|
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||||
|
|
||||||
|
/* Type Checking */
|
||||||
|
"strict": true, /* Enable all strict type-checking options. */
|
||||||
|
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
|
||||||
|
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
|
||||||
|
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||||
|
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
|
||||||
|
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||||
|
// "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
|
||||||
|
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
|
||||||
|
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
|
||||||
|
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||||
|
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
|
||||||
|
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
|
||||||
|
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||||
|
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||||
|
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||||
|
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
|
||||||
|
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||||
|
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
|
||||||
|
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||||
|
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||||
|
|
||||||
|
/* Completeness */
|
||||||
|
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||||
|
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
202502042213.4d239f7
|
202509160924.c47ec66
|
||||||
|
|||||||
@@ -9,4 +9,4 @@ echo "build image ${TAG} from folder ${PROJECT_ROOT}"
|
|||||||
|
|
||||||
cd $PROJECT_ROOT
|
cd $PROJECT_ROOT
|
||||||
|
|
||||||
docker build -t $TAG .
|
docker build --build-arg NODE_ENV=production -t $TAG_INTERNAL -t $TAG_PUBLIC .
|
||||||
|
|||||||
@@ -6,4 +6,5 @@ echo "Reading version file: ${VERSION_FILE}"
|
|||||||
|
|
||||||
export VERSION=$(cat "${VERSION_FILE}")
|
export VERSION=$(cat "${VERSION_FILE}")
|
||||||
|
|
||||||
export TAG=docker.rschneider.hu/infra/yoga-cms:$VERSION
|
export TAG_PUBLIC=docker.rschneider.hu/infra/yoga-cms:$VERSION
|
||||||
|
export TAG_INTERNAL=internal-docker.rschneider.hu/infra/yoga-cms:$VERSION
|
||||||
|
|||||||
@@ -3,5 +3,7 @@
|
|||||||
CURRENT_DIR=$(dirname "$0")
|
CURRENT_DIR=$(dirname "$0")
|
||||||
# push docker image
|
# push docker image
|
||||||
source "${CURRENT_DIR}/build.docker.env.sh"
|
source "${CURRENT_DIR}/build.docker.env.sh"
|
||||||
echo "push image ${TAG}"
|
echo "push image ${TAG_INTERNAL}"
|
||||||
docker push $TAG
|
docker push $TAG_INTERNAL
|
||||||
|
echo "push image ${TAG_PUBLIC}"
|
||||||
|
docker push $TAG_PUBLIC
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
202502242042.e44ab6c
|
202509161943.65409a9
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
202412282019.ae4bba3
|
202502251913.4385f28
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
# Copy from .env.local on the Vercel dashboard
|
|
||||||
# https://nextjs.org/learn/dashboard-app/setting-up-your-database#create-a-postgres-database
|
|
||||||
POSTGRES_URL="postgres://nextjs:nextjs@nextjs-db:5432/nextjs"
|
|
||||||
POSTGRES_URL_NON_POOLING="postgres://nextjs:nextjs@nextjs-db:5432/nextjs"
|
|
||||||
POSTGRES_USER="nextjs"
|
|
||||||
POSTGRES_HOST="nextjs-db"
|
|
||||||
POSTGRES_PORT="5432"
|
|
||||||
POSTGRES_PASSWORD="nextjs"
|
|
||||||
POSTGRES_DATABASE="nextjs"
|
|
||||||
|
|
||||||
# `openssl rand -base64 32`
|
|
||||||
AUTH_SECRET=
|
|
||||||
AUTH_URL=http://localhost:3000/api/auth
|
|
||||||
|
|
||||||
COMPOSE_PROJECT_NAME=yoga-infra
|
|
||||||
35
environment/infra/docker-compose/yogastic/.example.env
Normal file
35
environment/infra/docker-compose/yogastic/.example.env
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
COMPOSE_PROJECT_NAME=yoga-infra
|
||||||
|
|
||||||
|
APP_POSTGRES_URL="postgres://scrambled_user:scrambled_pass@nextjs-db:5432/nextjs"
|
||||||
|
APP_POSTGRES_URL_NON_POOLING="postgres://scrambled_user:scrambled_pass@nextjs-db:5432/nextjs"
|
||||||
|
APP_POSTGRES_USER="scrambled_user"
|
||||||
|
APP_POSTGRES_HOST="nextjs-db"
|
||||||
|
APP_POSTGRES_PORT="5432"
|
||||||
|
APP_POSTGRES_PASSWORD="scrambled_pass"
|
||||||
|
APP_POSTGRES_DATABASE="nextjs"
|
||||||
|
|
||||||
|
# `openssl rand -base64 32`
|
||||||
|
APP_AUTH_SECRET=
|
||||||
|
APP_AUTH_URL=http://localhost:3000/api/auth
|
||||||
|
APP_STRAPI_URL=http://cms:1337
|
||||||
|
APP_STRAPI_KEY=
|
||||||
|
APP_SMTP_SERVER_USERNAME=scrambled_user
|
||||||
|
APP_SMTP_SERVER_PASSWORD=scrambled_pass
|
||||||
|
APP_SMTP_SERVER_HOST=localhost
|
||||||
|
APP_SMTP_SERVER_PORT=4014
|
||||||
|
APP_SMTP_SERVER_SECURE=false
|
||||||
|
APP_SITE_MAIL_RECIEVER=scrambled_email@example.com
|
||||||
|
|
||||||
|
CMS_DATABASE_CLIENT=mysql
|
||||||
|
CMS_DATABASE_HOST=localhost
|
||||||
|
CMS_DATABASE_PORT=4011
|
||||||
|
CMS_DATABASE_NAME=strapi
|
||||||
|
CMS_DATABASE_USERNAME=scrambled_user
|
||||||
|
CMS_DATABASE_PASSWORD=scrambled_pass
|
||||||
|
CMS_HOST=0.0.0.0
|
||||||
|
CMS_PORT=1337
|
||||||
|
CMS_APP_KEYS="scrambled_key1,scrambled_key2"
|
||||||
|
CMS_API_TOKEN_SALT=scrambled_salt
|
||||||
|
CMS_ADMIN_JWT_SECRET=scrambled_jwt_secret
|
||||||
|
CMS_TRANSFER_TOKEN_SALT=scrambled_salt
|
||||||
|
CMS_JWT_SECRET=scrambled_jwt_secret
|
||||||
@@ -41,23 +41,48 @@ services:
|
|||||||
- "4022:5432"
|
- "4022:5432"
|
||||||
|
|
||||||
app:
|
app:
|
||||||
image: docker.rschneider.hu/infra/yoga-app:202501081712.9d7bb39
|
image: docker.rschneider.hu/infra/yoga-app:202502252004.fad4103
|
||||||
platform: linux/amd64
|
platform: linux/amd64
|
||||||
ports:
|
ports:
|
||||||
- "4023:3000"
|
- "4023:3000"
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_URL: ${POSTGRES_URL}
|
POSTGRES_URL: ${APP_POSTGRES_URL}
|
||||||
POSTGRES_URL_NON_POOLING: ${POSTGRES_URL_NON_POOLING}
|
POSTGRES_URL_NON_POOLING: ${APP_POSTGRES_URL_NON_POOLING}
|
||||||
POSTGRES_USER: ${POSTGRES_USER}
|
POSTGRES_USER: ${APP_POSTGRES_USER}
|
||||||
POSTGRES_HOST: ${POSTGRES_HOST}
|
POSTGRES_HOST: ${APP_POSTGRES_HOST}
|
||||||
POSTGRES_PORT: ${POSTGRES_PORT}
|
POSTGRES_PORT: ${APP_POSTGRES_PORT}
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
POSTGRES_PASSWORD: ${APP_POSTGRES_PASSWORD}
|
||||||
POSTGRES_DATABASE: ${POSTGRES_DATABASE}
|
POSTGRES_DATABASE: ${APP_POSTGRES_DATABASE}
|
||||||
|
AUTH_SECRET: ${APP_AUTH_SECRET}
|
||||||
|
AUTH_URL: ${APP_AUTH_URL}
|
||||||
|
STRAPI_URL: ${APP_STRAPI_URL}
|
||||||
|
STRAPI_KEY: ${APP_STRAPI_KEY}
|
||||||
|
SMTP_SERVER_USERNAME: ${APP_SMTP_SERVER_USERNAME}
|
||||||
|
SMTP_SERVER_PASSWORD: ${APP_SMTP_SERVER_PASSWORD}
|
||||||
|
SMTP_SERVER_HOST: ${APP_SMTP_SERVER_HOST}
|
||||||
|
SMTP_SERVER_PORT: ${APP_SMTP_SERVER_PORT}
|
||||||
|
SMTP_SERVER_SECURE: ${APP_SMTP_SERVER_SECURE}
|
||||||
|
SITE_MAIL_RECIEVER: ${APP_SITE_MAIL_RECIEVER}
|
||||||
|
|
||||||
cms:
|
cms:
|
||||||
image: docker.rschneider.hu/infra/yoga-cms:202501071722.a8b144f
|
image: docker.rschneider.hu/infra/yoga-cms:202503282223.50030fd
|
||||||
ports:
|
ports:
|
||||||
- "4024:1337"
|
- "4024:1337"
|
||||||
|
environment:
|
||||||
|
DATABASE_CLIENT: mysql
|
||||||
|
DATABASE_HOST: strapi-db
|
||||||
|
DATABASE_PORT: 3306
|
||||||
|
DATABASE_NAME: strapi
|
||||||
|
DATABASE_USERNAME: strapi
|
||||||
|
DATABASE_PASSWORD: strapi
|
||||||
|
HOST: 0.0.0.0
|
||||||
|
PORT: 1337
|
||||||
|
APP_KEYS: "yoga1,yoga2"
|
||||||
|
API_TOKEN_SALT: diana
|
||||||
|
ADMIN_JWT_SECRET: 6d49a635a298dfff1457002ab1ea26d51f94f6c67c03f7299e8adc19aafe02a2aadb2258aa1be90b836898e0b1ce6970d7584dda32129fb0e4aa09db9ba2076909a44491bbf1c0e1840b8a78843388851ed80407a71fabc3674faca3b4c4fd147c86347a390e86051b1530cac454063bb351632c75852110a5dc198f96a4f4b709d34d240d3e82206f29756a703d7b873b387d7a20e87df71f31a2f934d2a32a3795898c8d43d7f088ebfc8c430b81f4112b811c2aac6be8af551afd8cc29c4875037fd5c7fdacfcd5740b89bab0e1ada51b23f99fb0d181a8ad4758447331edd339ce988e02a6eae170ff57b6650f91dfb2988f7d91be6ea330c0e8fd647799
|
||||||
|
TRANSFER_TOKEN_SALT: 2209851913
|
||||||
|
JWT_SECRET: fc2be7f56eefe9790bd80a3713974620f42a66313f71bb581ac15328b886ccd42c51eb54f6e897b5d3f6d12bec069dfd116eb63f09d709346ab8c5c328ff42cef1f1cd7e39448186c9c96af3d838e25a3e82dfe72578d775f322bfb3b280ee7db103ae768dcebfc3fa0a9fffeb4d4773cd70e818f6cd8e98f360faa926a8388d18a1c9abcb616600c2c450820a29328df5592dea4a76edf3e9f8147cf92fc88a8a9e3f3698e038c9f7ccbfd7fc04fada3583f2ad8d1ff087a6f23cd33cfc8edf82e6489f1470da5dc52bc1ab1ac025bc9f77a6098f5efecff451498e2d936d005284e149971df15ed81d92ddddd0f71b5ffa3584d853aa3cecc37652430e7d27
|
||||||
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
next-db: {}
|
next-db: {}
|
||||||
|
|||||||
70
environment/infra/jenkins/build.app.image.Jenkinsfile
Normal file
70
environment/infra/jenkins/build.app.image.Jenkinsfile
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
environment {
|
||||||
|
DOCKER_IMAGE = 'yoga-app'
|
||||||
|
DOCKER_REGISTRY = 'docker.rschneider.hu/infra'
|
||||||
|
DOCKER_CREDENTIALS_ID = 'your-docker-credentials-id'
|
||||||
|
CURRENT_VERSION = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
git branch: 'main', credentialsId: 'rschneider_gitea.rschneider.hu', poll: false, url: 'https://gitea.rschneider.hu/rschneider/yogastic.git'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
stage('Build Docker image') {
|
||||||
|
steps {
|
||||||
|
sh """
|
||||||
|
cd environment/dev/docker/app/scripts
|
||||||
|
bash ./build.docker.build.sh
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Commit & Push version image') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
CURRENT_VERSION = readFile('environment/dev/docker/app/scripts/version.txt').trim()
|
||||||
|
env.CURRENT_VERSION = CURRENT_VERSION
|
||||||
|
}
|
||||||
|
withCredentials([
|
||||||
|
gitUsernamePassword(credentialsId: 'rschneider_gitea.rschneider.hu', gitToolName: 'Default')
|
||||||
|
]) {
|
||||||
|
sh """
|
||||||
|
cd environment/dev/docker/app/scripts
|
||||||
|
git config user.email "jenkins@rschneider.hu"
|
||||||
|
git config user.name "Jenkins"
|
||||||
|
git status
|
||||||
|
git add version.txt
|
||||||
|
git commit -m "[ci-skip] Update version to ${CURRENT_VERSION}"
|
||||||
|
git push --set-upstream origin main
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Push Docker image') {
|
||||||
|
steps {
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'rschneider-docker-reop1', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
|
||||||
|
sh """
|
||||||
|
echo $PASSWORD | docker login -u $USERNAME --password-stdin ${DOCKER_REGISTRY}
|
||||||
|
cd environment/dev/docker/app/scripts
|
||||||
|
|
||||||
|
bash ./build.docker.push.sh
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
cleanWs()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
environment/prod/docker-compose/yogastic/.example.env
Normal file
35
environment/prod/docker-compose/yogastic/.example.env
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
COMPOSE_PROJECT_NAME=yoga-infra
|
||||||
|
|
||||||
|
APP_POSTGRES_URL="postgres://scrambled_user:scrambled_pass@nextjs-db:5432/nextjs"
|
||||||
|
APP_POSTGRES_URL_NON_POOLING="postgres://scrambled_user:scrambled_pass@nextjs-db:5432/nextjs"
|
||||||
|
APP_POSTGRES_USER="scrambled_user"
|
||||||
|
APP_POSTGRES_HOST="nextjs-db"
|
||||||
|
APP_POSTGRES_PORT="5432"
|
||||||
|
APP_POSTGRES_PASSWORD="scrambled_pass"
|
||||||
|
APP_POSTGRES_DATABASE="nextjs"
|
||||||
|
|
||||||
|
# `openssl rand -base64 32`
|
||||||
|
APP_AUTH_SECRET=
|
||||||
|
APP_AUTH_URL=http://localhost:3000/api/auth
|
||||||
|
APP_STRAPI_URL=http://cms:1337
|
||||||
|
APP_STRAPI_KEY=
|
||||||
|
APP_SMTP_SERVER_USERNAME=scrambled_user
|
||||||
|
APP_SMTP_SERVER_PASSWORD=scrambled_pass
|
||||||
|
APP_SMTP_SERVER_HOST=localhost
|
||||||
|
APP_SMTP_SERVER_PORT=4014
|
||||||
|
APP_SMTP_SERVER_SECURE=false
|
||||||
|
APP_SITE_MAIL_RECIEVER=scrambled_email@example.com
|
||||||
|
|
||||||
|
CMS_DATABASE_CLIENT=mysql
|
||||||
|
CMS_DATABASE_HOST=localhost
|
||||||
|
CMS_DATABASE_PORT=4011
|
||||||
|
CMS_DATABASE_NAME=strapi
|
||||||
|
CMS_DATABASE_USERNAME=scrambled_user
|
||||||
|
CMS_DATABASE_PASSWORD=scrambled_pass
|
||||||
|
CMS_HOST=0.0.0.0
|
||||||
|
CMS_PORT=1337
|
||||||
|
CMS_APP_KEYS="scrambled_key1,scrambled_key2"
|
||||||
|
CMS_API_TOKEN_SALT=scrambled_salt
|
||||||
|
CMS_ADMIN_JWT_SECRET=scrambled_jwt_secret
|
||||||
|
CMS_TRANSFER_TOKEN_SALT=scrambled_salt
|
||||||
|
CMS_JWT_SECRET=scrambled_jwt_secret
|
||||||
81
environment/prod/docker-compose/yogastic/docker-compose.yaml
Normal file
81
environment/prod/docker-compose/yogastic/docker-compose.yaml
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
services:
|
||||||
|
strapi-db:
|
||||||
|
image: mariadb:11.6.2
|
||||||
|
environment:
|
||||||
|
MARIADB_ROOT_PASSWORD: strapi
|
||||||
|
MARIADB_DATABASE: strapi
|
||||||
|
MARIADB_USER: strapi
|
||||||
|
MARIADB_PASSWORD: strapi
|
||||||
|
volumes:
|
||||||
|
- strapi-db:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- yogastic
|
||||||
|
nextjs-db:
|
||||||
|
image: postgres:17
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${APP_POSTGRES_PASSWORD}
|
||||||
|
POSTGRES_DB: ${APP_POSTGRES_DATABASE}
|
||||||
|
POSTGRES_USER: ${APP_POSTGRES_USER}
|
||||||
|
volumes:
|
||||||
|
- next-db:/var/lib/postgresql/data
|
||||||
|
networks:
|
||||||
|
- yogastic
|
||||||
|
app:
|
||||||
|
image: docker.rschneider.hu/infra/yoga-app:202509160924.c47ec66
|
||||||
|
platform: linux/amd64
|
||||||
|
ports:
|
||||||
|
- '4025:3000'
|
||||||
|
environment:
|
||||||
|
POSTGRES_URL: ${APP_POSTGRES_URL}
|
||||||
|
POSTGRES_URL_NON_POOLING: ${APP_POSTGRES_URL_NON_POOLING}
|
||||||
|
POSTGRES_USER: ${APP_POSTGRES_USER}
|
||||||
|
POSTGRES_HOST: ${APP_POSTGRES_HOST}
|
||||||
|
POSTGRES_PORT: ${APP_POSTGRES_PORT}
|
||||||
|
POSTGRES_PASSWORD: ${APP_POSTGRES_PASSWORD}
|
||||||
|
POSTGRES_DATABASE: ${APP_POSTGRES_DATABASE}
|
||||||
|
AUTH_SECRET: ${APP_AUTH_SECRET}
|
||||||
|
AUTH_URL: ${APP_AUTH_URL}
|
||||||
|
STRAPI_URL: ${APP_STRAPI_URL}
|
||||||
|
STRAPI_KEY: ${APP_STRAPI_KEY}
|
||||||
|
SMTP_SERVER_USERNAME: ${APP_SMTP_SERVER_USERNAME}
|
||||||
|
SMTP_SERVER_PASSWORD: ${APP_SMTP_SERVER_PASSWORD}
|
||||||
|
SMTP_SERVER_HOST: ${APP_SMTP_SERVER_HOST}
|
||||||
|
SMTP_SERVER_PORT: ${APP_SMTP_SERVER_PORT}
|
||||||
|
SMTP_SERVER_SECURE: ${APP_SMTP_SERVER_SECURE}
|
||||||
|
SITE_MAIL_RECIEVER: ${APP_SITE_MAIL_RECIEVER}
|
||||||
|
networks:
|
||||||
|
- proxy_shared
|
||||||
|
- yogastic
|
||||||
|
cms:
|
||||||
|
image: docker.rschneider.hu/infra/yoga-cms:202509161943.65409a9
|
||||||
|
ports:
|
||||||
|
- '4026:1337'
|
||||||
|
environment:
|
||||||
|
DATABASE_CLIENT: mysql
|
||||||
|
DATABASE_HOST: strapi-db
|
||||||
|
DATABASE_PORT: 3306
|
||||||
|
DATABASE_NAME: strapi
|
||||||
|
DATABASE_USERNAME: strapi
|
||||||
|
DATABASE_PASSWORD: strapi
|
||||||
|
HOST: 0.0.0.0
|
||||||
|
PORT: 1337
|
||||||
|
APP_KEYS: yoga1,yoga2
|
||||||
|
API_TOKEN_SALT: diana
|
||||||
|
ADMIN_JWT_SECRET: >-
|
||||||
|
6d49a635a298dfff1457002ab1ea26d51f94f6c67c03f7299e8adc19aafe02a2aadb2258aa1be90b836898e0b1ce6970d7584dda32129fb0e4aa09db9ba2076909a44491bbf1c0e1840b8a78843388851ed80407a71fabc3674faca3b4c4fd147c86347a390e86051b1530cac454063bb351632c75852110a5dc198f96a4f4b709d34d240d3e82206f29756a703d7b873b387d7a20e87df71f31a2f934d2a32a3795898c8d43d7f088ebfc8c430b81f4112b811c2aac6be8af551afd8cc29c4875037fd5c7fdacfcd5740b89bab0e1ada51b23f99fb0d181a8ad4758447331edd339ce988e02a6eae170ff57b6650f91dfb2988f7d91be6ea330c0e8fd647799
|
||||||
|
TRANSFER_TOKEN_SALT: 2209851913
|
||||||
|
JWT_SECRET: >-
|
||||||
|
fc2be7f56eefe9790bd80a3713974620f42a66313f71bb581ac15328b886ccd42c51eb54f6e897b5d3f6d12bec069dfd116eb63f09d709346ab8c5c328ff42cef1f1cd7e39448186c9c96af3d838e25a3e82dfe72578d775f322bfb3b280ee7db103ae768dcebfc3fa0a9fffeb4d4773cd70e818f6cd8e98f360faa926a8388d18a1c9abcb616600c2c450820a29328df5592dea4a76edf3e9f8147cf92fc88a8a9e3f3698e038c9f7ccbfd7fc04fada3583f2ad8d1ff087a6f23cd33cfc8edf82e6489f1470da5dc52bc1ab1ac025bc9f77a6098f5efecff451498e2d936d005284e149971df15ed81d92ddddd0f71b5ffa3584d853aa3cecc37652430e7d27
|
||||||
|
networks:
|
||||||
|
- proxy_shared
|
||||||
|
- yogastic
|
||||||
|
volumes:
|
||||||
|
- strapi-uploads:/opt/app/public/uploads
|
||||||
|
volumes:
|
||||||
|
next-db: {}
|
||||||
|
strapi-db: {}
|
||||||
|
strapi-uploads: {}
|
||||||
|
networks:
|
||||||
|
yogastic: null
|
||||||
|
proxy_shared:
|
||||||
|
external: true
|
||||||
29
environment/prod/jenkins/Jenkinsfile
vendored
Normal file
29
environment/prod/jenkins/Jenkinsfile
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Git pull && docker compose restart') {
|
||||||
|
steps {
|
||||||
|
sshPublisher(publishers: [sshPublisherDesc(configName: 'rschneider.hu', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''
|
||||||
|
cd /home/rocho/projects/yogastic
|
||||||
|
git pull
|
||||||
|
cd /home/rocho/projects/yogastic/environment/prod/docker-compose/yogastic
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d
|
||||||
|
cd /home/rocho/docker/proxy/proxy
|
||||||
|
bash ./restart.sh
|
||||||
|
''', execTimeout: 120000,
|
||||||
|
flatten: false,
|
||||||
|
makeEmptyDirs: false,
|
||||||
|
noDefaultExcludes: false,
|
||||||
|
patternSeparator: '[, ]+',
|
||||||
|
remoteDirectory: '',
|
||||||
|
remoteDirectorySDF: false,
|
||||||
|
removePrefix: '', sourceFiles: '')],
|
||||||
|
usePromotionTimestamp: false,
|
||||||
|
useWorkspaceInPromotion: false,
|
||||||
|
verbose: true)])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
221
environment/prod/jenkins/update.versions.Jenkinsfile
Normal file
221
environment/prod/jenkins/update.versions.Jenkinsfile
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
environment {
|
||||||
|
|
||||||
|
DOCKER_CREDS = 'rschneider@docker.rschneider.hu'
|
||||||
|
GIT_USER = "Roland Schneider"
|
||||||
|
GIT_EMAIL = "rocho02@gmail.com"
|
||||||
|
GIT_REPO = "gitea.rschneider.hu/rschneider/yogastic.git"
|
||||||
|
GIT_BRANCH = "main"
|
||||||
|
GIT_CREDS_ID = "rschneider_gitea.rschneider.hu"
|
||||||
|
CMS_IMAGE= "docker.rschneider.hu/infra/yoga-cms"
|
||||||
|
APP_IMAGE= "docker.rschneider.hu/infra/yoga-app"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
|
||||||
|
git branch: 'main', credentialsId: "${GIT_CREDS_ID}", url: "https://${GIT_REPO}"
|
||||||
|
sh '''
|
||||||
|
ls -lah
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Collect project info - cms') {
|
||||||
|
agent{
|
||||||
|
docker {
|
||||||
|
reuseNode true
|
||||||
|
image 'linuxserver/yq'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
withCredentials([usernamePassword(credentialsId: "${GIT_CREDS_ID}", passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME')]) {
|
||||||
|
|
||||||
|
script {
|
||||||
|
def block = ""
|
||||||
|
|
||||||
|
block = sh returnStdout:true, script:'''
|
||||||
|
yq -y '.services.cms.image' environment/prod/docker-compose/yogastic/docker-compose.yaml
|
||||||
|
|
||||||
|
'''
|
||||||
|
block = block.readLines();
|
||||||
|
env.CMS_CURRENT = block[0];
|
||||||
|
|
||||||
|
block = sh returnStdout:true, script:'''
|
||||||
|
cat environment/dev/docker/cms/scripts/version.txt
|
||||||
|
'''
|
||||||
|
block = block.readLines();
|
||||||
|
env.CMS_LATEST = block[0];
|
||||||
|
|
||||||
|
def apiUrl = "https://docker.rschneider.hu/v2/infra/yoga-cms/tags/list"
|
||||||
|
def tagsResponse = sh(script: """
|
||||||
|
curl -s -u "${DOCKER_USERNAME}:${DOCKER_PASSWORD}" ${apiUrl}
|
||||||
|
""", returnStdout: true).trim()
|
||||||
|
// Step 3: Use JsonSlurper to parse the JSON response
|
||||||
|
def jsonSlurper = new groovy.json.JsonSlurper()
|
||||||
|
def tags = jsonSlurper.parseText(tagsResponse)
|
||||||
|
// Extract the tag names
|
||||||
|
def availableTags = tags.tags.collect { it }
|
||||||
|
availableTags = availableTags.reverse()
|
||||||
|
println availableTags
|
||||||
|
env.CMS_TAGS = availableTags.join("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Collect project info - app') {
|
||||||
|
agent{
|
||||||
|
docker {
|
||||||
|
reuseNode true
|
||||||
|
image 'linuxserver/yq'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'rschneider@docker.rschneider.hu', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME')]) {
|
||||||
|
|
||||||
|
script {
|
||||||
|
def block = ""
|
||||||
|
|
||||||
|
block = sh returnStdout:true, script:'''
|
||||||
|
yq -y '.services.app.image' environment/prod/docker-compose/yogastic/docker-compose.yaml
|
||||||
|
|
||||||
|
'''
|
||||||
|
block = block.readLines();
|
||||||
|
env.APP_CURRENT = block[0];
|
||||||
|
|
||||||
|
block = sh returnStdout:true, script:'''
|
||||||
|
cat environment/dev/docker/app/scripts/version.txt
|
||||||
|
'''
|
||||||
|
block = block.readLines();
|
||||||
|
env.APP_LATEST = block[0];
|
||||||
|
|
||||||
|
def apiUrl = "https://docker.rschneider.hu/v2/infra/yoga-app/tags/list"
|
||||||
|
def tagsResponse = sh(script: """
|
||||||
|
curl -s -u "${DOCKER_USERNAME}:${DOCKER_PASSWORD}" ${apiUrl}
|
||||||
|
""", returnStdout: true).trim()
|
||||||
|
// Step 3: Use JsonSlurper to parse the JSON response
|
||||||
|
def jsonSlurper = new groovy.json.JsonSlurper()
|
||||||
|
def tags = jsonSlurper.parseText(tagsResponse)
|
||||||
|
// Extract the tag names
|
||||||
|
def availableTags = tags.tags.collect { it }
|
||||||
|
availableTags = availableTags.reverse()
|
||||||
|
|
||||||
|
env.APP_TAGS = availableTags.join("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
stage('Select version CMS') {
|
||||||
|
steps {
|
||||||
|
echo "new tags"
|
||||||
|
println env.CMS_TAGS
|
||||||
|
script{
|
||||||
|
env.CMS_VERSION = input message: 'Select version for PROD', ok: 'Update',
|
||||||
|
parameters: [choice(name: 'Select version', choices: env.CMS_TAGS, description: """
|
||||||
|
Latest: ${env.CMS_LATEST}
|
||||||
|
Current: ${env.CMS_CURRENT}
|
||||||
|
""" )]
|
||||||
|
echo "You have selected Docker Tag: ${env.CMS_VERSION}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Select version APP') {
|
||||||
|
steps {
|
||||||
|
echo "new APP tags"
|
||||||
|
println env.APP_TAGS
|
||||||
|
script{
|
||||||
|
env.APP_VERSION = input message: 'Select version for PROD', ok: 'Update',
|
||||||
|
parameters: [choice(name: 'Select version', choices: env.APP_TAGS, description: """
|
||||||
|
Latest: ${env.APP_LATEST}
|
||||||
|
Current: ${env.APP_CURRENT}
|
||||||
|
""")]
|
||||||
|
echo "You have selected Docker Tag: ${env.APP_VERSION}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Update version CMS') {
|
||||||
|
agent{
|
||||||
|
docker {
|
||||||
|
reuseNode true
|
||||||
|
image 'node:22'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
script{
|
||||||
|
|
||||||
|
env.TARGET_FILE='../prod/docker-compose/yogastic/docker-compose.yaml'
|
||||||
|
env.TARGET_SERVICE='cms'
|
||||||
|
env.TARGET_IMAGE= "${CMS_IMAGE}:${CMS_VERSION}"
|
||||||
|
|
||||||
|
sh '''
|
||||||
|
cd environment/common
|
||||||
|
npm i -c
|
||||||
|
npx ts-node src/update.service.version.ts
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Update version APP') {
|
||||||
|
agent{
|
||||||
|
docker {
|
||||||
|
reuseNode true
|
||||||
|
image 'node:22'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
script{
|
||||||
|
|
||||||
|
env.TARGET_FILE='../prod/docker-compose/yogastic/docker-compose.yaml'
|
||||||
|
env.TARGET_SERVICE='app'
|
||||||
|
env.TARGET_IMAGE= "${APP_IMAGE}:${APP_VERSION}"
|
||||||
|
|
||||||
|
sh '''
|
||||||
|
cd environment/common
|
||||||
|
npm i -c
|
||||||
|
npx ts-node src/update.service.version.ts
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Update git ') {
|
||||||
|
/*
|
||||||
|
agent{
|
||||||
|
docker {
|
||||||
|
reuseNode true
|
||||||
|
image 'alpine/git'
|
||||||
|
args '--entrypoint /bin/sh'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
environment{
|
||||||
|
GIT_CREDS = credentials("${GIT_CREDS_ID}")
|
||||||
|
ENV_NAME = "Prod yoga-app"
|
||||||
|
IMAGE_VERSION = "${CMS_VERSION}"
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
git status
|
||||||
|
git config user.email "${GIT_EMAIL}"
|
||||||
|
git config user.name "${GIT_USER}"
|
||||||
|
git commit -a -m "[ci-skip] New ${ENV_NAME} deployment version: ${IMAGE_VERSION}"
|
||||||
|
git push --tags https://$GIT_CREDS@$GIT_REPO $GIT_BRANCH
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -5,8 +5,11 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"build.docker.image.yogastic": "cd environment/dev/docker/yogastic/scripts && bash build.docker.build.sh",
|
"build.docker.image.yogastic": "cd environment/dev/docker/yogastic/scripts && bash build.docker.build.sh",
|
||||||
"build.docker.image.app": "cd environment/dev/docker/app/scripts && bash build.docker.build.sh "
|
"build.docker.image.app": "cd environment/dev/docker/app/scripts && bash build.docker.build.sh ",
|
||||||
|
"build.docker.image.cms": "cd environment/dev/docker/cms/scripts && bash build.docker.build.sh ",
|
||||||
|
"push.docker.image.app": "cd environment/dev/docker/app/scripts && bash build.docker.push.sh ",
|
||||||
|
"push.docker.image.cms": "cd environment/dev/docker/cms/scripts && bash build.docker.push.sh ",
|
||||||
|
"dev": "bash ./dev.sh"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { dirname } from "path";
|
|||||||
import { fileURLToPath } from "url";
|
import { fileURLToPath } from "url";
|
||||||
import { FlatCompat } from "@eslint/eslintrc";
|
import { FlatCompat } from "@eslint/eslintrc";
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta?.url);
|
||||||
const __dirname = dirname(__filename);
|
const __dirname = dirname(__filename);
|
||||||
|
|
||||||
const compat = new FlatCompat({
|
const compat = new FlatCompat({
|
||||||
@@ -16,9 +16,9 @@ const eslintConfig = [
|
|||||||
"next/core-web-vitals",
|
"next/core-web-vitals",
|
||||||
"next/typescript",
|
"next/typescript",
|
||||||
],
|
],
|
||||||
// rules: {
|
rules: {
|
||||||
// "@typescript-eslint/no-explicit-any": "off"
|
"@typescript-eslint/no-explicit-any": "off"
|
||||||
// },
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
),
|
),
|
||||||
@@ -32,6 +32,6 @@ const eslintConfig = [
|
|||||||
// }
|
// }
|
||||||
];
|
];
|
||||||
|
|
||||||
console.info("eslint config",eslintConfig)
|
// console.info("eslint config",eslintConfig)
|
||||||
|
|
||||||
export default eslintConfig;
|
export default eslintConfig;
|
||||||
|
|||||||
86
yoga-app/package-lock.json
generated
86
yoga-app/package-lock.json
generated
@@ -9,6 +9,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-free": "^6.7.2",
|
"@fortawesome/fontawesome-free": "^6.7.2",
|
||||||
|
"@strapi/blocks-react-renderer": "^1.0.2",
|
||||||
"@strapi/database": "^5.10.3",
|
"@strapi/database": "^5.10.3",
|
||||||
"@types/aos": "^3.0.7",
|
"@types/aos": "^3.0.7",
|
||||||
"@types/bcrypt": "^5.0.2",
|
"@types/bcrypt": "^5.0.2",
|
||||||
@@ -17,6 +18,7 @@
|
|||||||
"@types/ityped": "^1.0.3",
|
"@types/ityped": "^1.0.3",
|
||||||
"@types/pg": "^8.11.10",
|
"@types/pg": "^8.11.10",
|
||||||
"@types/qs": "^6.9.18",
|
"@types/qs": "^6.9.18",
|
||||||
|
"@types/react-slick": "^0.23.13",
|
||||||
"ajv": "^8.17.1",
|
"ajv": "^8.17.1",
|
||||||
"ajv-formats": "^3.0.1",
|
"ajv-formats": "^3.0.1",
|
||||||
"ajv-i18n": "^4.2.0",
|
"ajv-i18n": "^4.2.0",
|
||||||
@@ -33,12 +35,14 @@
|
|||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-bootstrap": "^2.10.9",
|
"react-bootstrap": "^2.10.9",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
|
"react-slick": "^0.30.3",
|
||||||
|
"slick-carousel": "^1.8.1",
|
||||||
"validator": "^13.12.0"
|
"validator": "^13.12.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3",
|
"@eslint/eslintrc": "^3",
|
||||||
"@types/bcryptjs": "^2.4.6",
|
"@types/bcryptjs": "^2.4.6",
|
||||||
"@types/node": "^20",
|
"@types/node": "^20.17.47",
|
||||||
"@types/nodemailer": "^6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
"@types/react": "^19",
|
"@types/react": "^19",
|
||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
@@ -1390,6 +1394,16 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@strapi/blocks-react-renderer": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@strapi/blocks-react-renderer/-/blocks-react-renderer-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-pRV/WMreo5wyrLg7J0pw1DM9lg8U8m+QA7Bd8CPN3beUBTdDhYrFTTNZh3XveEdnURZNJu1X0aWXAg4SzVg7QA==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^18.0.0 || ^19.0.0",
|
||||||
|
"react-dom": "^18.0.0 || ^19.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@strapi/database": {
|
"node_modules/@strapi/database": {
|
||||||
"version": "5.10.3",
|
"version": "5.10.3",
|
||||||
"resolved": "https://registry.npmjs.org/@strapi/database/-/database-5.10.3.tgz",
|
"resolved": "https://registry.npmjs.org/@strapi/database/-/database-5.10.3.tgz",
|
||||||
@@ -1567,9 +1581,10 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.17.10",
|
"version": "20.17.47",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz",
|
||||||
"integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==",
|
"integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~6.19.2"
|
"undici-types": "~6.19.2"
|
||||||
}
|
}
|
||||||
@@ -1673,6 +1688,15 @@
|
|||||||
"@types/react": "^19.0.0"
|
"@types/react": "^19.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/react-slick": {
|
||||||
|
"version": "0.23.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.13.tgz",
|
||||||
|
"integrity": "sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@types/react": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/react-transition-group": {
|
"node_modules/@types/react-transition-group": {
|
||||||
"version": "4.4.12",
|
"version": "4.4.12",
|
||||||
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
|
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
|
||||||
@@ -2739,6 +2763,12 @@
|
|||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/enquire.js": {
|
||||||
|
"version": "2.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
|
||||||
|
"integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/es-abstract": {
|
"node_modules/es-abstract": {
|
||||||
"version": "1.23.8",
|
"version": "1.23.8",
|
||||||
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.8.tgz",
|
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.8.tgz",
|
||||||
@@ -4383,6 +4413,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
||||||
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"argparse": "^2.0.1"
|
"argparse": "^2.0.1"
|
||||||
},
|
},
|
||||||
@@ -4407,6 +4438,15 @@
|
|||||||
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
|
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/json2mq": {
|
||||||
|
"version": "0.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
|
||||||
|
"integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"string-convert": "^0.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/json5": {
|
"node_modules/json5": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||||
@@ -5550,6 +5590,23 @@
|
|||||||
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
|
||||||
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
|
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
|
||||||
},
|
},
|
||||||
|
"node_modules/react-slick": {
|
||||||
|
"version": "0.30.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.3.tgz",
|
||||||
|
"integrity": "sha512-B4x0L9GhkEWUMApeHxr/Ezp2NncpGc+5174R02j+zFiWuYboaq98vmxwlpafZfMjZic1bjdIqqmwLDcQY0QaFA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"classnames": "^2.2.5",
|
||||||
|
"enquire.js": "^2.1.6",
|
||||||
|
"json2mq": "^0.2.0",
|
||||||
|
"lodash.debounce": "^4.0.8",
|
||||||
|
"resize-observer-polyfill": "^1.5.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
|
||||||
|
"react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/react-transition-group": {
|
"node_modules/react-transition-group": {
|
||||||
"version": "4.4.5",
|
"version": "4.4.5",
|
||||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
|
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
|
||||||
@@ -5644,6 +5701,12 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/resize-observer-polyfill": {
|
||||||
|
"version": "1.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
|
||||||
|
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/resolve": {
|
"node_modules/resolve": {
|
||||||
"version": "1.22.10",
|
"version": "1.22.10",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
|
||||||
@@ -5981,6 +6044,15 @@
|
|||||||
"is-arrayish": "^0.3.1"
|
"is-arrayish": "^0.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/slick-carousel": {
|
||||||
|
"version": "1.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
|
||||||
|
"integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
|
||||||
|
"license": "MIT",
|
||||||
|
"peerDependencies": {
|
||||||
|
"jquery": ">=1.8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/source-map-js": {
|
"node_modules/source-map-js": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
|
||||||
@@ -6035,6 +6107,12 @@
|
|||||||
"node": ">=0.6.19"
|
"node": ">=0.6.19"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/string-convert": {
|
||||||
|
"version": "0.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
|
||||||
|
"integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/string.prototype.includes": {
|
"node_modules/string.prototype.includes": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-free": "^6.7.2",
|
"@fortawesome/fontawesome-free": "^6.7.2",
|
||||||
|
"@strapi/blocks-react-renderer": "^1.0.2",
|
||||||
"@strapi/database": "^5.10.3",
|
"@strapi/database": "^5.10.3",
|
||||||
"@types/aos": "^3.0.7",
|
"@types/aos": "^3.0.7",
|
||||||
"@types/bcrypt": "^5.0.2",
|
"@types/bcrypt": "^5.0.2",
|
||||||
@@ -19,6 +20,7 @@
|
|||||||
"@types/ityped": "^1.0.3",
|
"@types/ityped": "^1.0.3",
|
||||||
"@types/pg": "^8.11.10",
|
"@types/pg": "^8.11.10",
|
||||||
"@types/qs": "^6.9.18",
|
"@types/qs": "^6.9.18",
|
||||||
|
"@types/react-slick": "^0.23.13",
|
||||||
"ajv": "^8.17.1",
|
"ajv": "^8.17.1",
|
||||||
"ajv-formats": "^3.0.1",
|
"ajv-formats": "^3.0.1",
|
||||||
"ajv-i18n": "^4.2.0",
|
"ajv-i18n": "^4.2.0",
|
||||||
@@ -35,12 +37,14 @@
|
|||||||
"react": "^19.0.0",
|
"react": "^19.0.0",
|
||||||
"react-bootstrap": "^2.10.9",
|
"react-bootstrap": "^2.10.9",
|
||||||
"react-dom": "^19.0.0",
|
"react-dom": "^19.0.0",
|
||||||
|
"react-slick": "^0.30.3",
|
||||||
|
"slick-carousel": "^1.8.1",
|
||||||
"validator": "^13.12.0"
|
"validator": "^13.12.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3",
|
"@eslint/eslintrc": "^3",
|
||||||
"@types/bcryptjs": "^2.4.6",
|
"@types/bcryptjs": "^2.4.6",
|
||||||
"@types/node": "^20",
|
"@types/node": "^20.17.47",
|
||||||
"@types/nodemailer": "^6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
"@types/react": "^19",
|
"@types/react": "^19",
|
||||||
"@types/react-dom": "^19",
|
"@types/react-dom": "^19",
|
||||||
|
|||||||
@@ -1,8 +1,17 @@
|
|||||||
{
|
{
|
||||||
|
|
||||||
"populate": {
|
"populate": {
|
||||||
"header": {
|
"header": {
|
||||||
"fields": ["header1","description"]
|
"fields": ["header1","description"]
|
||||||
},
|
},
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"aboutUs": {
|
"aboutUs": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
@@ -63,7 +72,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"subscribeNow": {
|
"subscribeNow": {
|
||||||
"fields": ["*"]
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
@@ -79,6 +97,9 @@
|
|||||||
},
|
},
|
||||||
"contactUsPhoneNumber": {
|
"contactUsPhoneNumber": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
{
|
{
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"contactUs": {
|
"contactUs": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
},
|
},
|
||||||
@@ -8,7 +16,16 @@
|
|||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
},
|
},
|
||||||
"subscribe": {
|
"subscribe": {
|
||||||
"fields": ["*"]
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
@@ -24,6 +41,9 @@
|
|||||||
},
|
},
|
||||||
"contactUsPhoneNumber": {
|
"contactUsPhoneNumber": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
{
|
{
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"questionsAndAnswers": {
|
"questionsAndAnswers": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
@@ -43,7 +51,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"subscribe": {
|
"subscribe": {
|
||||||
"fields": ["*"]
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
@@ -59,6 +76,9 @@
|
|||||||
},
|
},
|
||||||
"contactUsPhoneNumber": {
|
"contactUsPhoneNumber": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
{
|
{
|
||||||
"populate": {
|
"populate": {
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
@@ -7,8 +15,12 @@
|
|||||||
"fields": [
|
"fields": [
|
||||||
"*"
|
"*"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
@@ -24,11 +36,23 @@
|
|||||||
},
|
},
|
||||||
"contactUsPhoneNumber": {
|
"contactUsPhoneNumber": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"subscribeNow": {
|
"subscribeNow": {
|
||||||
"fields": ["*"]
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"blogs": {
|
"blogs": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
@@ -128,6 +152,9 @@
|
|||||||
},
|
},
|
||||||
"right4": {
|
"right4": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
{
|
{
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"price": {
|
"price": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
@@ -40,7 +48,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"subscribe": {
|
"subscribe": {
|
||||||
"fields": ["*"]
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
@@ -56,6 +73,9 @@
|
|||||||
},
|
},
|
||||||
"contactUsPhoneNumber": {
|
"contactUsPhoneNumber": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
56
yoga-app/src/api/strapi/query/service-list.json
Normal file
56
yoga-app/src/api/strapi/query/service-list.json
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"services": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": ["name","mime","url" ]
|
||||||
|
},
|
||||||
|
"articleImage": {
|
||||||
|
"fields": ["name","mime","url" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"subscribeNow": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"links": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"contactUsEmail": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"contactUsLocation": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"contactUsPhoneNumber": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
45
yoga-app/src/api/strapi/query/service.json
Normal file
45
yoga-app/src/api/strapi/query/service.json
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"subscribeNow": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"footer": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"links": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"contactUsEmail": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"contactUsLocation": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"contactUsPhoneNumber": {
|
||||||
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
{
|
{
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
|
"common": {
|
||||||
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"logoImage": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"ourServices": {
|
"ourServices": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
"populate": {
|
"populate": {
|
||||||
@@ -43,6 +51,9 @@
|
|||||||
},
|
},
|
||||||
"right4": {
|
"right4": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -79,7 +90,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"subscribe": {
|
"subscribe": {
|
||||||
"fields": ["*"]
|
"fields": ["*"],
|
||||||
|
"populate": {
|
||||||
|
"image": {
|
||||||
|
"fields": [
|
||||||
|
"name",
|
||||||
|
"mime",
|
||||||
|
"url"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"fields": ["*"],
|
"fields": ["*"],
|
||||||
@@ -95,6 +115,9 @@
|
|||||||
},
|
},
|
||||||
"contactUsPhoneNumber": {
|
"contactUsPhoneNumber": {
|
||||||
"fields": ["*"]
|
"fields": ["*"]
|
||||||
|
},
|
||||||
|
"logo": {
|
||||||
|
"fields": ["name","mime","url"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,15 +4,20 @@ import qs from "qs";
|
|||||||
import aboutQuery from "@/api/strapi/query/about.json";
|
import aboutQuery from "@/api/strapi/query/about.json";
|
||||||
import homeQuery from "@/api/strapi/query/home.json";
|
import homeQuery from "@/api/strapi/query/home.json";
|
||||||
import servicesQuery from "@/api/strapi/query/services.json";
|
import servicesQuery from "@/api/strapi/query/services.json";
|
||||||
|
import serviceListPageQuery from "@/api/strapi/query/service-list.json";
|
||||||
|
import serviceQuery from "@/api/strapi/query/service.json";
|
||||||
import pricesQuery from "@/api/strapi/query/prices.json";
|
import pricesQuery from "@/api/strapi/query/prices.json";
|
||||||
import faqQuery from "@/api/strapi/query/faq.json";
|
import faqQuery from "@/api/strapi/query/faq.json";
|
||||||
import contactQuery from "@/api/strapi/query/contact.json";
|
import contactQuery from "@/api/strapi/query/contact.json";
|
||||||
import {YogaBlogPost_Plain} from "@/types/generated-strapi-interfaces/api/yoga-blog-post";
|
import {YogaBlogPost_Plain} from "@/types/generated-strapi-interfaces/api/yoga-blog-post";
|
||||||
import {Home_Plain} from "@/types/generated-strapi-interfaces/api/home";
|
import {Home_Plain} from "@/types/generated-strapi-interfaces/api/home";
|
||||||
import {ServicesPage_Plain} from "@/types/generated-strapi-interfaces/api/services-page";
|
import {ServicesPage_Plain} from "@/types/generated-strapi-interfaces/api/services-page";
|
||||||
|
import {ServiceListPage_Plain} from "@/types/generated-strapi-interfaces/api/service-list-page";
|
||||||
import {PricesPage_Plain} from "@/types/generated-strapi-interfaces/api/prices-page";
|
import {PricesPage_Plain} from "@/types/generated-strapi-interfaces/api/prices-page";
|
||||||
import {FaqPage_Plain} from "@/types/generated-strapi-interfaces/api/faq-page";
|
import {FaqPage_Plain} from "@/types/generated-strapi-interfaces/api/faq-page";
|
||||||
import {ContactPage_Plain} from "@/types/generated-strapi-interfaces/api/contact-page";
|
import {ContactPage_Plain} from "@/types/generated-strapi-interfaces/api/contact-page";
|
||||||
|
import {YogaSingleService_Plain} from "@/types/generated-strapi-interfaces/api/yoga-single-service";
|
||||||
|
import {ServicePage_Plain} from "@/types/generated-strapi-interfaces/api/service-page";
|
||||||
|
|
||||||
|
|
||||||
class StrapiApi{
|
class StrapiApi{
|
||||||
@@ -42,6 +47,24 @@ class StrapiApi{
|
|||||||
return this.getJson("/api/services-page?",servicesQuery);
|
return this.getJson("/api/services-page?",servicesQuery);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getServicePage(): Promise<ServicePage_Plain>{
|
||||||
|
return this.getJson("/api/service-page?",serviceQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getServiceListPage(): Promise<ServiceListPage_Plain>{
|
||||||
|
return this.getJson("/api/service-list-page?",serviceListPageQuery);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getService(name: string): Promise<YogaSingleService_Plain[]>{
|
||||||
|
return this.getJson("/api/yoga-single-services?", {
|
||||||
|
filters: {
|
||||||
|
name: {
|
||||||
|
$eq: name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public getPricesPage(): Promise<PricesPage_Plain>{
|
public getPricesPage(): Promise<PricesPage_Plain>{
|
||||||
return this.getJson("/api/prices-page?",pricesQuery);
|
return this.getJson("/api/prices-page?",pricesQuery);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,31 @@ class StrapiClient{
|
|||||||
|
|
||||||
constructor(private strapiUrl: string = "http://localhost:1337") {
|
constructor(private strapiUrl: string = "http://localhost:1337") {
|
||||||
}
|
}
|
||||||
|
|
||||||
public getImageUrl(imagePath: string) {
|
public getImageUrl(imagePath: string) {
|
||||||
return this.strapiUrl + imagePath;
|
if (!imagePath) {
|
||||||
|
return "dummy.png"
|
||||||
}
|
}
|
||||||
|
return '/image/' + imagePath;
|
||||||
|
}
|
||||||
|
|
||||||
public async httpGet(path: string) {
|
public async httpGet(path: string) {
|
||||||
return await httpClient.httpGet(this.strapiUrl + path);
|
let result = undefined;
|
||||||
|
try {
|
||||||
|
const absoluteUrl = this.strapiUrl + path;
|
||||||
|
console.info("httpGet", {path,absoluteUrl});
|
||||||
|
result = await httpClient.httpGet(this.strapiUrl + path);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("httpGet error", e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
|
if (!result.ok) {
|
||||||
|
console.info("httpGet not ok", result);
|
||||||
|
throw new Error(result.statusText);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public async httpGetJson<T>(url: string): Promise<Payload<T>> {
|
public async httpGetJson<T>(url: string): Promise<Payload<T>> {
|
||||||
const response = await this.httpGet(url);
|
const response = await this.httpGet(url);
|
||||||
return await response.json();
|
return await response.json();
|
||||||
@@ -28,7 +47,6 @@ class StrapiClient{
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const response = await this.httpGet("/api/" + contentType + "?" + searchParams.toString());
|
const response = await this.httpGet("/api/" + contentType + "?" + searchParams.toString());
|
||||||
return await response.json();
|
return await response.json();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,13 +24,16 @@ export default async function About() {
|
|||||||
blogs,
|
blogs,
|
||||||
subscribeNow,
|
subscribeNow,
|
||||||
footer,
|
footer,
|
||||||
|
common
|
||||||
} = pageData;
|
} = pageData;
|
||||||
|
|
||||||
|
|
||||||
console.info("about us", JSON.stringify(aboutUs))
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{ header && <SubHeaderComponent header1={header?.header1} header2={header?.header2} description={header?.description}/> }
|
{ header && <SubHeaderComponent header={header} common={common}/> }
|
||||||
|
|
||||||
{ aboutUs && <AboutUsWithBoxesComponent config={aboutUs}/>}
|
{ aboutUs && <AboutUsWithBoxesComponent config={aboutUs}/>}
|
||||||
{ discount && <YogaDiscountComponent config={discount}/>}
|
{ discount && <YogaDiscountComponent config={discount}/>}
|
||||||
|
|||||||
@@ -16,11 +16,12 @@ export default async function ContactPage(){
|
|||||||
contactUs,
|
contactUs,
|
||||||
google_maps,
|
google_maps,
|
||||||
subscribe,
|
subscribe,
|
||||||
footer
|
footer,
|
||||||
|
common
|
||||||
} = await strapiApi.getContactPage();
|
} = await strapiApi.getContactPage();
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{ <SubHeaderComponent header1={header} description={description} /> }
|
{ <SubHeaderComponent header={{header1:header,description}} common={common}/> }
|
||||||
{ contactUs && <ContactUsComponent contactUs={contactUs} /> }
|
{ contactUs && <ContactUsComponent contactUs={contactUs} /> }
|
||||||
{ google_maps && <GoogleMapsComponent config={google_maps} /> }
|
{ google_maps && <GoogleMapsComponent config={google_maps} /> }
|
||||||
{ subscribe && <SubscribeComponent config={subscribe} styleClass={"contact_subscribe_section"} /> }
|
{ subscribe && <SubscribeComponent config={subscribe} styleClass={"contact_subscribe_section"} /> }
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import AosComponent from "@/components/aos.component";
|
import AosComponent from "@/components/aos.component";
|
||||||
import BlogPostsComponent from "@/components/blog.posts.component";
|
|
||||||
import FooterComponent from "@/components/footer.component";
|
import FooterComponent from "@/components/footer.component";
|
||||||
import SubscribeComponent from "@/components/subscribe.component";
|
import SubscribeComponent from "@/components/subscribe.component";
|
||||||
import strapiApi from "@/api/strapi/strapi-api";
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
@@ -13,15 +12,14 @@ export default async function About() {
|
|||||||
header,
|
header,
|
||||||
description,
|
description,
|
||||||
questionsAndAnswers,
|
questionsAndAnswers,
|
||||||
blogs,
|
|
||||||
subscribe,
|
subscribe,
|
||||||
footer
|
footer,
|
||||||
|
common
|
||||||
} = await strapiApi.getFaqPage();
|
} = await strapiApi.getFaqPage();
|
||||||
return (
|
return (
|
||||||
<>xxxxx
|
<>
|
||||||
{ <SubHeaderComponent header1={header} description={description} /> }
|
{ <SubHeaderComponent header={{header1:header,description}} common={common}/> }
|
||||||
{ questionsAndAnswers && <FaqComponent config={questionsAndAnswers} /> }
|
{ questionsAndAnswers && <FaqComponent config={questionsAndAnswers} /> }
|
||||||
{ blogs && <BlogPostsComponent config={blogs} /> }
|
|
||||||
{ subscribe && <SubscribeComponent config={subscribe} /> }
|
{ subscribe && <SubscribeComponent config={subscribe} /> }
|
||||||
{ footer && <FooterComponent config={footer} /> }
|
{ footer && <FooterComponent config={footer} /> }
|
||||||
<AosComponent />
|
<AosComponent />
|
||||||
|
|||||||
@@ -12,6 +12,9 @@
|
|||||||
@import '../styles/custom-style';
|
@import '../styles/custom-style';
|
||||||
@import '../styles/special-classes';
|
@import '../styles/special-classes';
|
||||||
@import 'node_modules/aos/src/sass/aos.scss';
|
@import 'node_modules/aos/src/sass/aos.scss';
|
||||||
|
@import '../styles/block-with-image';
|
||||||
|
@import '../styles/block-with-left-image';
|
||||||
|
@import '../styles/block-with-right-image';
|
||||||
|
|
||||||
//<!-- Latest compiled and minified CSS -->
|
//<!-- Latest compiled and minified CSS -->
|
||||||
//<link
|
//<link
|
||||||
|
|||||||
24
yoga-app/src/app/image/[...path]/route.ts
Normal file
24
yoga-app/src/app/image/[...path]/route.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import strapiClient from "@/api/strapi/strapi-client";
|
||||||
|
|
||||||
|
export async function GET(_request: Request, {params}: { params: Promise<{ path: string[] }> }) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
const pathParams = await params;
|
||||||
|
const strapiImageUrl = ("/" + pathParams.path.join("/"))
|
||||||
|
const imageResponse = await strapiClient.httpGet(strapiImageUrl);
|
||||||
|
if (imageResponse.status != 200) {
|
||||||
|
console.info("failed to download image,status,statusText", imageResponse.status, imageResponse.statusText)
|
||||||
|
}
|
||||||
|
const image = await imageResponse.blob()
|
||||||
|
|
||||||
|
return new Response(image, {
|
||||||
|
status: 200,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': imageResponse.headers.get('content-type') as string
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.info('failed to download image: ', error);
|
||||||
|
return Response.json({error}, {status: 404});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -73,8 +73,8 @@ const generateIcons = ( ): IconDescriptor[] => {
|
|||||||
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Yoga App",
|
title: "Reverseyoga",
|
||||||
description: "Yoga App",
|
description: "Reverseyoga - Yoga mindenkinek",
|
||||||
icons: generateIcons(),
|
icons: generateIcons(),
|
||||||
manifest: "./assets/images/favicon/manifest.json",
|
manifest: "./assets/images/favicon/manifest.json",
|
||||||
other: {
|
other: {
|
||||||
|
|||||||
@@ -5,21 +5,18 @@ import AboutUsComponent from "@/components/about.us.component";
|
|||||||
import OurSpecialitiesComponent from "@/components/our.specialities.component";
|
import OurSpecialitiesComponent from "@/components/our.specialities.component";
|
||||||
import ContactUsComponent from "@/components/contact.us.component";
|
import ContactUsComponent from "@/components/contact.us.component";
|
||||||
import PricingComponent from "@/components/pricing.component";
|
import PricingComponent from "@/components/pricing.component";
|
||||||
import FeedbackComponent from "@/components/feedbackComponent";
|
|
||||||
import BlogPostsComponent from "@/components/blog.posts.component";
|
import BlogPostsComponent from "@/components/blog.posts.component";
|
||||||
import FooterComponent from "@/components/footer.component";
|
import FooterComponent from "@/components/footer.component";
|
||||||
import SubscribeComponent from "@/components/subscribe.component";
|
import SubscribeComponent from "@/components/subscribe.component";
|
||||||
import MainHeaderComponent from "@/components/mainHeaderComponent";
|
import MainHeaderComponent from "@/components/mainHeaderComponent";
|
||||||
import BootstrapComponent from "@/components/bootstrap.component";
|
import BootstrapComponent from "@/components/bootstrap.component";
|
||||||
import ITypedComponent from "@/components/ityped.component";
|
|
||||||
import webApi from "@/api/web-client/web-api";
|
import webApi from "@/api/web-client/web-api";
|
||||||
|
|
||||||
export default async function Home() {
|
export default async function Home() {
|
||||||
const pageData = await webApi.getHomePage();
|
const pageData = await webApi.getHomePage();
|
||||||
|
|
||||||
console.info(JSON.stringify(pageData))
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
common,
|
||||||
header,
|
header,
|
||||||
ourServices,
|
ourServices,
|
||||||
aboutUs,
|
aboutUs,
|
||||||
@@ -29,23 +26,22 @@ export default async function Home() {
|
|||||||
blogs,
|
blogs,
|
||||||
subscribeNow,
|
subscribeNow,
|
||||||
footer,
|
footer,
|
||||||
feedbacks
|
|
||||||
} = pageData;
|
} = pageData;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{ header && <MainHeaderComponent config={header}/> }
|
{ header && <MainHeaderComponent config={header} common={common} /> }
|
||||||
{ ourServices && <OurServicesComponent header={ourServices.header!} description={ourServices.description!} title={ourServices.title!}/> }
|
|
||||||
{ aboutUs && <AboutUsComponent data={aboutUs} /> }
|
{ aboutUs && <AboutUsComponent data={aboutUs} /> }
|
||||||
|
{ ourServices && <OurServicesComponent config={ourServices}/> }
|
||||||
{ ourSpecialities && <OurSpecialitiesComponent config={ourSpecialities} /> }
|
{ ourSpecialities && <OurSpecialitiesComponent config={ourSpecialities} /> }
|
||||||
{ contactUs && <ContactUsComponent contactUs={contactUs} /> }
|
{ contactUs && <ContactUsComponent contactUs={contactUs} /> }
|
||||||
{ prices && <PricingComponent config={prices}/> }
|
{ prices && <PricingComponent config={prices}/> }
|
||||||
{ feedbacks && <FeedbackComponent config={feedbacks} /> }
|
{/*{ feedbacks && <FeedbackComponent config={feedbacks} /> }*/}
|
||||||
{ blogs && <BlogPostsComponent config={blogs} /> }
|
{ blogs && blogs.posts?.length && <BlogPostsComponent config={blogs} /> }
|
||||||
{ subscribeNow && <SubscribeComponent config={subscribeNow} /> }
|
{ subscribeNow && <SubscribeComponent config={subscribeNow} /> }
|
||||||
{ footer && <FooterComponent config={footer} /> }
|
{ footer && <FooterComponent config={footer} /> }
|
||||||
<AosComponent />
|
<AosComponent />
|
||||||
<BootstrapComponent />
|
<BootstrapComponent />
|
||||||
{header?.headerIType && <ITypedComponent text={header.headerIType} /> }
|
|
||||||
</>
|
</>
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import AosComponent from "@/components/aos.component";
|
import AosComponent from "@/components/aos.component";
|
||||||
import PricingComponent from "@/components/pricing.component";
|
import PricingComponent from "@/components/pricing.component";
|
||||||
import BlogPostsComponent from "@/components/blog.posts.component";
|
|
||||||
import SubscribeComponent from "@/components/subscribe.component";
|
import SubscribeComponent from "@/components/subscribe.component";
|
||||||
import SubHeaderComponent from "@/components/subHeader.component";
|
import SubHeaderComponent from "@/components/subHeader.component";
|
||||||
import YogaDiscountComponent from "@/components/yogaDiscountComponent";
|
import YogaDiscountComponent from "@/components/yogaDiscountComponent";
|
||||||
@@ -19,16 +18,15 @@ export default async function PricesPage( ) {
|
|||||||
description,
|
description,
|
||||||
price,
|
price,
|
||||||
discount,
|
discount,
|
||||||
blogs,
|
|
||||||
subscribe,
|
subscribe,
|
||||||
footer
|
footer,
|
||||||
|
common
|
||||||
} = await strapiApi.getPricesPage();
|
} = await strapiApi.getPricesPage();
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<SubHeaderComponent header1={header} description={description}/>
|
<SubHeaderComponent header={{header1:header,description}} common={common}/>
|
||||||
{ price && <PricingComponent config={price}/> }
|
{ price && <PricingComponent config={price}/> }
|
||||||
{ discount && <YogaDiscountComponent config={discount} /> }
|
{ discount && <YogaDiscountComponent config={discount} /> }
|
||||||
{ blogs && <BlogPostsComponent config={blogs} /> }
|
|
||||||
{ subscribe && <SubscribeComponent config={subscribe} /> }
|
{ subscribe && <SubscribeComponent config={subscribe} /> }
|
||||||
{ footer && <FooterComponent config={footer} /> }
|
{ footer && <FooterComponent config={footer} /> }
|
||||||
<AosComponent />
|
<AosComponent />
|
||||||
|
|||||||
@@ -110,10 +110,8 @@ export async function GET() {
|
|||||||
// 'Uncomment this file and remove this line. You can delete this file when you are finished.',
|
// 'Uncomment this file and remove this line. You can delete this file when you are finished.',
|
||||||
// });
|
// });
|
||||||
try {
|
try {
|
||||||
console.info("get request")
|
|
||||||
strapiApi.getHomePage();
|
strapiApi.getHomePage();
|
||||||
|
|
||||||
console.info("begin")
|
|
||||||
await connectionPool.query(`BEGIN`);
|
await connectionPool.query(`BEGIN`);
|
||||||
await seedUsers();
|
await seedUsers();
|
||||||
await seedCustomers();
|
await seedCustomers();
|
||||||
|
|||||||
39
yoga-app/src/app/serviceList/page.tsx
Normal file
39
yoga-app/src/app/serviceList/page.tsx
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import React from "react";
|
||||||
|
import AosComponent from "@/components/aos.component";
|
||||||
|
import FooterComponent from "@/components/footer.component";
|
||||||
|
import SubscribeComponent from "@/components/subscribe.component";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import SubHeaderComponent from "@/components/subHeader.component";
|
||||||
|
import SingleServiceComponent from "@/components/single.service.component";
|
||||||
|
import {sortServicesByPriority} from "@/util/sorting";
|
||||||
|
|
||||||
|
export default async function Services() {
|
||||||
|
const {
|
||||||
|
header,
|
||||||
|
description,
|
||||||
|
footer,
|
||||||
|
subscribeNow,
|
||||||
|
common,
|
||||||
|
services
|
||||||
|
} = await strapiApi.getServiceListPage();
|
||||||
|
const sortedServices = services ? [...services] : [];
|
||||||
|
sortedServices.sort( sortServicesByPriority )
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<SubHeaderComponent header={{header1:header,description}} common={common}/>
|
||||||
|
{
|
||||||
|
sortedServices.map( (singleService,index) => {
|
||||||
|
return (
|
||||||
|
<SingleServiceComponent key={singleService.id} config={singleService} index={index}/>
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
{ subscribeNow && <SubscribeComponent config={subscribeNow} /> }
|
||||||
|
{ footer && <FooterComponent config={footer} /> }
|
||||||
|
<AosComponent />
|
||||||
|
</>
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const dynamic = 'force-dynamic'
|
||||||
11
yoga-app/src/app/services/[slug]/not-found.tsx
Normal file
11
yoga-app/src/app/services/[slug]/not-found.tsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import Link from 'next/link'
|
||||||
|
|
||||||
|
export default function NotFound() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h2>Nem található</h2>
|
||||||
|
<p>Could not find requested resource</p>
|
||||||
|
<Link href="/">Vissza a kezdőoldalra</Link>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
3
yoga-app/src/app/services/[slug]/page.module.css
Normal file
3
yoga-app/src/app/services/[slug]/page.module.css
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.article h1{
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
74
yoga-app/src/app/services/[slug]/page.tsx
Normal file
74
yoga-app/src/app/services/[slug]/page.tsx
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
import React from "react";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import {BlocksContent} from "@strapi/blocks-react-renderer";
|
||||||
|
import SubscribeComponent from "@/components/subscribe.component";
|
||||||
|
import FooterComponent from "@/components/footer.component";
|
||||||
|
import SubHeaderComponent from "@/components/subHeader.component";
|
||||||
|
import AosComponent from "@/components/aos.component";
|
||||||
|
import styles from './page.module.css'
|
||||||
|
import NextBlocksRenderer from "@/components/next.blocks.renderer";
|
||||||
|
import clsx from "clsx";
|
||||||
|
import {notFound} from "next/navigation";
|
||||||
|
|
||||||
|
const rewriteStrapiImageUrlToNextImageUrl = (content: BlocksContent) =>{
|
||||||
|
console.info("content", content);
|
||||||
|
for(const item of content){
|
||||||
|
if ( item.type == 'image'){
|
||||||
|
const imageData = item.image;
|
||||||
|
const url = new URL(imageData.url);
|
||||||
|
imageData.url = strapiApi.getImageUrl(url.pathname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function ServiceArticlePage({params}: {
|
||||||
|
params: Promise<{ slug: string }>
|
||||||
|
}) {
|
||||||
|
const {slug} = await params
|
||||||
|
|
||||||
|
console.info("service slug",slug);
|
||||||
|
const servicePage = await strapiApi.getServicePage();
|
||||||
|
if (!servicePage) {
|
||||||
|
return notFound()
|
||||||
|
}
|
||||||
|
console.info("Servicepage found");
|
||||||
|
const {subscribeNow, footer, common} = servicePage;
|
||||||
|
const servicesByName = await strapiApi.getService(slug);
|
||||||
|
console.info("servicesByName",servicesByName);
|
||||||
|
|
||||||
|
if (!servicesByName || servicesByName.length === 0) {
|
||||||
|
return notFound();
|
||||||
|
}
|
||||||
|
const selectedService = servicesByName[0];
|
||||||
|
console.info("selected service",selectedService)
|
||||||
|
if ( !selectedService?.article?.length ) {
|
||||||
|
return notFound();
|
||||||
|
}
|
||||||
|
const article: BlocksContent = rewriteStrapiImageUrlToNextImageUrl( selectedService.article);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{selectedService && selectedService.header && selectedService.description &&
|
||||||
|
<SubHeaderComponent header={{header1:selectedService.header, description: selectedService.description}} common={common}/>}
|
||||||
|
|
||||||
|
<section className={clsx( styles.article, 'mb-3')}>
|
||||||
|
<div className="container">
|
||||||
|
<div className={"row"}>
|
||||||
|
<div className={"col-lg-12 col-md-12 col-sm-12 col-xs-12"}>
|
||||||
|
<NextBlocksRenderer
|
||||||
|
content={article as BlocksContent}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
{subscribeNow && <SubscribeComponent config={subscribeNow}/>}
|
||||||
|
{footer && <FooterComponent config={footer}/>}
|
||||||
|
<AosComponent/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const dynamic = 'force-dynamic'
|
||||||
@@ -12,7 +12,7 @@ import SubHeaderComponent from "@/components/subHeader.component";
|
|||||||
|
|
||||||
export default async function Services() {
|
export default async function Services() {
|
||||||
const {
|
const {
|
||||||
header,
|
header = undefined,
|
||||||
description,
|
description,
|
||||||
ourServices,
|
ourServices,
|
||||||
contactUs,
|
contactUs,
|
||||||
@@ -20,12 +20,13 @@ export default async function Services() {
|
|||||||
feedbacks,
|
feedbacks,
|
||||||
blogs,
|
blogs,
|
||||||
footer,
|
footer,
|
||||||
subscribe
|
subscribe,
|
||||||
} = await strapiApi.getServicesPage();
|
common
|
||||||
|
} = await strapiApi.getServicesPage()
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{header && description && <SubHeaderComponent header1={header} description={description} />}
|
<SubHeaderComponent header={{header1:header,description}} common={common}/>
|
||||||
{ ourServices && <OurServicesComponent header={ourServices.header!} title={ourServices.title!} description={ourServices.description!} /> }
|
{ ourServices && <OurServicesComponent config={ourServices} /> }
|
||||||
{ contactUs && <ContactUsComponent contactUs={contactUs} />}
|
{ contactUs && <ContactUsComponent contactUs={contactUs} />}
|
||||||
{ ourSpecialities && <OurSpecialitiesComponent config={ourSpecialities} /> }
|
{ ourSpecialities && <OurSpecialitiesComponent config={ourSpecialities} /> }
|
||||||
{ feedbacks && <FeedbackComponent config={feedbacks} /> }
|
{ feedbacks && <FeedbackComponent config={feedbacks} /> }
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ const AboutUsComponent = ( {data: {title,header,description,content,buttonText,b
|
|||||||
<section className="aboutus_section">
|
<section className="aboutus_section">
|
||||||
<div className="container">
|
<div className="container">
|
||||||
<div className="row">
|
<div className="row">
|
||||||
<div className="col-lg-7 col-md-7 col-sm-12 col-xs-12">
|
<div className="col-lg-5 col-md-5 col-sm-12 col-xs-12">
|
||||||
<div className="aboutus_image">
|
<div className="aboutus_image">
|
||||||
<figure className="mb-0"><YogaImageComponent src={strapiApi.getImageUrl(fileImage.url)} alt="" className="img-fluid"/></figure>
|
<figure className="mb-0"><YogaImageComponent src={strapiApi.getImageUrl(fileImage?.url)} alt="" className="img-fluid"/></figure>
|
||||||
</div>
|
</div>
|
||||||
<figure className="aboutus_top_shape left_shape mb-0">
|
<figure className="aboutus_top_shape left_shape mb-0">
|
||||||
<YogaImageComponent src="/assets/images/aboutus_top_shape.png" alt="" className="img-fluid"/>
|
<YogaImageComponent src="/assets/images/aboutus_top_shape.png" alt="" className="img-fluid"/>
|
||||||
@@ -25,7 +25,7 @@ const AboutUsComponent = ( {data: {title,header,description,content,buttonText,b
|
|||||||
<YogaImageComponent src="/assets/images/aboutus_bottom_shape.png" alt="" className="img-fluid"/>
|
<YogaImageComponent src="/assets/images/aboutus_bottom_shape.png" alt="" className="img-fluid"/>
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-lg-5 col-md-5 col-sm-12 col-xs-12" data-aos="fade-right">
|
<div className="col-lg-7 col-md-7 col-sm-12 col-xs-12" data-aos="fade-right">
|
||||||
<div className="aboutus_content">
|
<div className="aboutus_content">
|
||||||
<h5>{title}</h5>
|
<h5>{title}</h5>
|
||||||
<h2>{header}</h2>
|
<h2>{header}</h2>
|
||||||
|
|||||||
@@ -2,13 +2,17 @@ import YogaImageComponent from "@/components/yoga.image.component";
|
|||||||
import {
|
import {
|
||||||
YogaAboutUsWithBoxesComponent_Plain
|
YogaAboutUsWithBoxesComponent_Plain
|
||||||
} from "@/types/generated-strapi-interfaces/api/yoga-about-us-with-boxes-component";
|
} from "@/types/generated-strapi-interfaces/api/yoga-about-us-with-boxes-component";
|
||||||
|
import {StrapiFile} from "@/types/types";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
config: YogaAboutUsWithBoxesComponent_Plain
|
config: YogaAboutUsWithBoxesComponent_Plain
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function AboutUsWithBoxesComponent({ config: {title,header,description, box1,box2,box3,box4}}: Props){
|
export default function AboutUsWithBoxesComponent({ config: {title,header,description, image, box1,box2,box3,box4}}: Props){
|
||||||
|
|
||||||
|
const imageFile: StrapiFile = image as StrapiFile;
|
||||||
|
const imageUrl = strapiApi.getImageUrl(imageFile?.url)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="aboutpage_aboutus_section">
|
<section className="aboutpage_aboutus_section">
|
||||||
@@ -16,7 +20,7 @@ export default function AboutUsWithBoxesComponent({ config: {title,header,descri
|
|||||||
<div className="row">
|
<div className="row">
|
||||||
<div className="col-lg-7 col-md-6 col-sm-12 col-xs-12">
|
<div className="col-lg-7 col-md-6 col-sm-12 col-xs-12">
|
||||||
<div className="aboutpage_aboutus_image">
|
<div className="aboutpage_aboutus_image">
|
||||||
<figure className="mb-0"><YogaImageComponent src="./assets/images/about_page_aboutus_image.png" alt="" className="img-fluid" /></figure>
|
<figure className="mb-0"><YogaImageComponent src={imageUrl} alt="" className="img-fluid" /></figure>
|
||||||
</div>
|
</div>
|
||||||
<figure className="aboutus_top_shape left_shape mb-0">
|
<figure className="aboutus_top_shape left_shape mb-0">
|
||||||
<YogaImageComponent src="./assets/images/aboutus_top_shape.png" alt="" className="img-fluid" />
|
<YogaImageComponent src="./assets/images/aboutus_top_shape.png" alt="" className="img-fluid" />
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ export default function AchievementsComponent({
|
|||||||
title,header,description
|
title,header,description
|
||||||
}
|
}
|
||||||
}: Props){
|
}: Props){
|
||||||
console.info("achievements",achievements)
|
|
||||||
return (
|
return (
|
||||||
<section className="achievement_section">
|
<section className="achievement_section">
|
||||||
<div className="container">
|
<div className="container">
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
.textCenter{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
@@ -3,19 +3,26 @@ import {YogaAchivement_Plain} from "@/types/generated-strapi-interfaces/api/yoga
|
|||||||
import {StrapiFile} from "@/types/types";
|
import {StrapiFile} from "@/types/types";
|
||||||
import strapiApi from "@/api/strapi/strapi-api";
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
|
||||||
|
import styles from './achievements.item.component.module.css';
|
||||||
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
achievement: YogaAchivement_Plain
|
achievement: YogaAchivement_Plain
|
||||||
|
|
||||||
}
|
}
|
||||||
export default function AchievementsItemComponent({achievement
|
export default function AchievementsItemComponent({achievement
|
||||||
:{ image}
|
:{ image,description}
|
||||||
}: Props){
|
}: Props){
|
||||||
const imageFile: StrapiFile = image as StrapiFile;
|
const imageFile: StrapiFile = image as StrapiFile;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="col-lg-2 col-md-4 col-sm-6 col-xs-12">
|
<div className="col-lg-2 col-md-4 col-sm-6 col-xs-12">
|
||||||
<div className="logo_wrapper">
|
<div className="logo_wrapper">
|
||||||
<figure className="mb-0"><YogaImageComponent src={strapiApi.getImageUrl(imageFile?.url)} alt="" className="img-fluid"/></figure>
|
<figure className="mb-0"><YogaImageComponent src={strapiApi.getImageUrl(imageFile?.url)} alt="" className={clsx(styles.textCenter, "img-fluid")}/></figure>
|
||||||
|
<div className="logo_content">
|
||||||
|
{description}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
35
yoga-app/src/components/block.with.image.component.tsx
Normal file
35
yoga-app/src/components/block.with.image.component.tsx
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import {ButtonConfig, ImageConfig} from "@/types/types";
|
||||||
|
import {BlocksContent} from "@strapi/blocks-react-renderer";
|
||||||
|
import BlockWithRightImage from "@/components/block.with.right.image.component";
|
||||||
|
import BlockWithLeftImage from "@/components/block.with.left.image.component";
|
||||||
|
|
||||||
|
|
||||||
|
export interface BlockWithImageComponentProps {
|
||||||
|
id?: string;
|
||||||
|
title?: string;
|
||||||
|
header?: string;
|
||||||
|
block: BlocksContent;
|
||||||
|
image: ImageConfig;
|
||||||
|
button?: ButtonConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function BlockWithImageComponent({
|
||||||
|
block,
|
||||||
|
image,
|
||||||
|
id,
|
||||||
|
title,
|
||||||
|
header,
|
||||||
|
button
|
||||||
|
}: BlockWithImageComponentProps) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{image?.position == 'Right' && <BlockWithRightImage
|
||||||
|
block={block} image={image} id={id} title={title}
|
||||||
|
header={header}
|
||||||
|
button={button}/>}
|
||||||
|
{image?.position == 'Left' && <BlockWithLeftImage block={block} image={image} id={id} title={title}
|
||||||
|
header={header}
|
||||||
|
button={button}/>}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
.leftImage {
|
||||||
|
/*border-top-left-radius: 200px;*/
|
||||||
|
/*border-bottom-right-radius: 200px;*/
|
||||||
|
/*margin: -150px 12px 12px 0;*/
|
||||||
|
}
|
||||||
|
|
||||||
50
yoga-app/src/components/block.with.left.image.component.tsx
Normal file
50
yoga-app/src/components/block.with.left.image.component.tsx
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
|
import NextBlocksRenderer from "@/components/next.blocks.renderer";
|
||||||
|
import {BlockWithImageComponentProps} from "@/components/block.with.image.component";
|
||||||
|
import styles from './block.with.left.image.component.module.css';
|
||||||
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
|
||||||
|
export default function BlockWithLeftImage ( {
|
||||||
|
id,title,header, image: {
|
||||||
|
url,
|
||||||
|
},block,button
|
||||||
|
} : BlockWithImageComponentProps){
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={clsx("block_with_left_image_section","block_with_image","block_with_left_image",styles.blockWithLeftImage)} id={id}>
|
||||||
|
<div className="container">
|
||||||
|
<div className="block_with_left_image_box">
|
||||||
|
<div className="row">
|
||||||
|
{ url && <div className="block_with_left_image_image d-lg-none d-md-none col-sm-12 col-xs-12">
|
||||||
|
<figure className="mb-0">
|
||||||
|
<YogaImageComponent src={url} alt=""
|
||||||
|
className={clsx("img-fluid", styles.leftImage)}/>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
<div className="col-lg-12 col-md-12 col-sm-12 col-xs-12" data-aos="fade-up">
|
||||||
|
<div className={ clsx("block_with_image_content","block_with_image_content","block_with_left_image_content",styles.blockLeftblock_with_imageContent)}>
|
||||||
|
{url && <div className="block_with_left_image_image d-lg-block d-md-block d-sm-none d-xs-none d-none">
|
||||||
|
<figure className="mb-0"><YogaImageComponent src={url} alt="" className={clsx("img-fluid", "float-left", styles.leftImage)}/></figure>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
{title && <h5>{title}</h5> }
|
||||||
|
{header && <h2>{header}</h2> }
|
||||||
|
<NextBlocksRenderer content={ block } />
|
||||||
|
<div className="btn_wrapper">
|
||||||
|
{button && <a href={button.link} className="text-decoration-none read_more_btn">{button.label}</a>}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<figure className="block_with_image_left_shape left_shape mb-0">
|
||||||
|
<YogaImageComponent src="./assets/images/our_block_with_image_shape.png" alt="" className="img-fluid" />
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
.rightImage {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
53
yoga-app/src/components/block.with.right.image.component.tsx
Normal file
53
yoga-app/src/components/block.with.right.image.component.tsx
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
|
import {BlockWithImageComponentProps} from "@/components/block.with.image.component";
|
||||||
|
import NextBlocksRenderer from "@/components/next.blocks.renderer";
|
||||||
|
import styles from './block.with.right.image.component.module.css';
|
||||||
|
import clsx from "clsx";
|
||||||
|
|
||||||
|
export default function BlockWithRightImage({
|
||||||
|
id, title, header, block, button, image: {
|
||||||
|
url,
|
||||||
|
},
|
||||||
|
}: BlockWithImageComponentProps) {
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className={clsx("block_with_right_image_section","block_with_image","block_with_right_image")} id={id}>
|
||||||
|
<div className="container">
|
||||||
|
<div className="block_with_image_box">
|
||||||
|
<div className="row">
|
||||||
|
<div className="col-lg-12 col-md-12 col-sm-12 col-xs-12" data-aos="fade-up">
|
||||||
|
<div className={ clsx("block_with_right_image_content","block-with-image-content","block-with-right-image-content")}>
|
||||||
|
{
|
||||||
|
url && <div className="block_with_right_image_image d-lg-block d-md-block d-sm-none d-xs-none d-none">
|
||||||
|
<figure className="mb-0">
|
||||||
|
<YogaImageComponent src={url} alt=""
|
||||||
|
className={clsx("img-fluid", "float-right", styles.rightImage)}/>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
{title && <h5>{title}</h5>}
|
||||||
|
{header && <h2>{header}</h2>}
|
||||||
|
<NextBlocksRenderer content={block}/>
|
||||||
|
<div className="btn_wrapper">
|
||||||
|
{button && <a href={button.link}
|
||||||
|
className="text-decoration-none read_more_btn">{button.label}</a>}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{ url && <div className="block_with_right_image_image d-lg-none d-md-none col-sm-12 col-xs-12">
|
||||||
|
<figure className="mb-0">
|
||||||
|
<YogaImageComponent src={url} alt=""
|
||||||
|
className={clsx("img-fluid", "float-right", styles.rightImage)}/>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<figure className="block_with_right_image_right_shape right_shape mb-0">
|
||||||
|
<YogaImageComponent src="./assets/images/our_block_with_image_shape.png" alt="" className="img-fluid"/>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ const BlogSinglePostComponent = ({post: {header,teaserImage,tags,documentId} }:
|
|||||||
<div className="col-lg-6 col-md-6 col-sm-12 col-xs-12">
|
<div className="col-lg-6 col-md-6 col-sm-12 col-xs-12">
|
||||||
<div className="blog_posts_image position-relative">
|
<div className="blog_posts_image position-relative">
|
||||||
<figure className="mb-0">
|
<figure className="mb-0">
|
||||||
<YogaImageComponent src={strapiApi.getImageUrl( teaserFile.url ) } alt=""
|
<YogaImageComponent src={strapiApi.getImageUrl( teaserFile?.url ) } alt=""
|
||||||
className="img-fluid"/>
|
className="img-fluid"/>
|
||||||
</figure>
|
</figure>
|
||||||
<div className="blog_posts_image_content">
|
<div className="blog_posts_image_content">
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ const pathToBreadCrumbs = (path: string) => {
|
|||||||
'services' : 'Szolgáltatásaim',
|
'services' : 'Szolgáltatásaim',
|
||||||
'prices' : 'Áraim',
|
'prices' : 'Áraim',
|
||||||
'faq' : 'GYIK',
|
'faq' : 'GYIK',
|
||||||
|
'serviceList' : 'Szolgáltatások',
|
||||||
}
|
}
|
||||||
if ( mapping.hasOwnProperty(path)){
|
if ( mapping.hasOwnProperty(path)){
|
||||||
return mapping[path];
|
return mapping[path];
|
||||||
@@ -24,9 +25,6 @@ const NextBreadcrumb = () => {
|
|||||||
const paths = usePathname()
|
const paths = usePathname()
|
||||||
const pathNames = paths.split('/').filter( path => path )
|
const pathNames = paths.split('/').filter( path => path )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="btn_wrapper">
|
<div className="btn_wrapper">
|
||||||
<span className="sub_home_span">{pathToBreadCrumbs( "/" )} </span>
|
<span className="sub_home_span">{pathToBreadCrumbs( "/" )} </span>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const FeedbackComponent = ({active,config: {customerName, feedback, customerImag
|
|||||||
<div className="testimonial_content">
|
<div className="testimonial_content">
|
||||||
<i className="fa-solid fa-quote-left"></i>
|
<i className="fa-solid fa-quote-left"></i>
|
||||||
<p className="testimonial_paragraph">“{feedback}”</p>
|
<p className="testimonial_paragraph">“{feedback}”</p>
|
||||||
<figure><YogaImageComponent src={strapiApi.getImageUrl(imageFile.url)} alt=""
|
<figure><YogaImageComponent src={strapiApi.getImageUrl(imageFile?.url)} alt=""
|
||||||
className="img-fluid"/></figure>
|
className="img-fluid"/></figure>
|
||||||
<p className="testimonial_person_name">{customerName}</p>
|
<p className="testimonial_person_name">{customerName}</p>
|
||||||
<span>{customerDescription}</span>
|
<span>{customerDescription}</span>
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import YogaImageComponent from "@/components/yoga.image.component";
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
import {YogaFooter_Plain} from "@/types/generated-strapi-interfaces/api/yoga-footer";
|
import {YogaFooter_Plain} from "@/types/generated-strapi-interfaces/api/yoga-footer";
|
||||||
|
import {StrapiFile} from "@/types/types";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
config: YogaFooter_Plain
|
config: YogaFooter_Plain
|
||||||
@@ -14,10 +16,13 @@ const FooterComponent = ({ config: {
|
|||||||
contactUsEmail,
|
contactUsEmail,
|
||||||
contactUsLocation,
|
contactUsLocation,
|
||||||
contactUsPhoneNumber,
|
contactUsPhoneNumber,
|
||||||
copyRight
|
copyRight,
|
||||||
|
logo = undefined
|
||||||
} }: Props) => {
|
} }: Props) => {
|
||||||
|
|
||||||
|
const imageFile: StrapiFile = logo as StrapiFile;
|
||||||
|
const imageUrl = strapiApi.getImageUrl(imageFile?.url)
|
||||||
|
console.info("imageUrl", imageUrl);
|
||||||
|
|
||||||
return (<section className="footer-section" id="footer_section">
|
return (<section className="footer-section" id="footer_section">
|
||||||
<div className="container">
|
<div className="container">
|
||||||
@@ -26,7 +31,7 @@ const FooterComponent = ({ config: {
|
|||||||
<div className="col-lg-3 col-md-4 col-sm-6 col-xs-12 d-lg-block d-none">
|
<div className="col-lg-3 col-md-4 col-sm-6 col-xs-12 d-lg-block d-none">
|
||||||
<div className="footer_logo">
|
<div className="footer_logo">
|
||||||
<Link href="/index.html" className="text-decoration-none">
|
<Link href="/index.html" className="text-decoration-none">
|
||||||
<figure className="mb-0"><YogaImageComponent src="/assets/images/footer_logo.png" alt=""
|
<figure className="mb-0"><YogaImageComponent src={imageUrl} alt=""
|
||||||
className="img-fluid"/></figure>
|
className="img-fluid"/></figure>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
69
yoga-app/src/components/listing.component.tsx
Normal file
69
yoga-app/src/components/listing.component.tsx
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
interface ListingComponentProps {
|
||||||
|
text?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ListingComponent: React.FC<ListingComponentProps> = ({ text }) => {
|
||||||
|
if (!text) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const lines = text.split('\n');
|
||||||
|
const elements: React.ReactNode[] = [];
|
||||||
|
let currentParagraph: string[] = [];
|
||||||
|
let currentList: React.ReactNode[] = [];
|
||||||
|
|
||||||
|
const flushParagraph = () => {
|
||||||
|
if (currentParagraph.length > 0) {
|
||||||
|
elements.push(<p key={elements.length}>{currentParagraph.join('\n')}</p>);
|
||||||
|
currentParagraph = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const flushList = () => {
|
||||||
|
if (currentList.length > 0) {
|
||||||
|
elements.push(<ul key={elements.length}>{currentList}</ul>);
|
||||||
|
currentList = [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let currentListItemContent: string[] = [];
|
||||||
|
|
||||||
|
const flushListItem = () => {
|
||||||
|
if(currentListItemContent.length > 0) {
|
||||||
|
currentList.push(<li key={currentList.length}>{currentListItemContent.join('\n')}</li>);
|
||||||
|
currentListItemContent = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
const trimmedLine = line.trim();
|
||||||
|
|
||||||
|
if (trimmedLine.startsWith('- ') || trimmedLine.startsWith('* ')) {
|
||||||
|
flushParagraph(); // End any ongoing paragraph
|
||||||
|
flushListItem(); // End previous list item
|
||||||
|
currentListItemContent.push(trimmedLine.substring(2));
|
||||||
|
} else if (trimmedLine === '') {
|
||||||
|
flushListItem();
|
||||||
|
flushList(); // An empty line ends the list
|
||||||
|
} else {
|
||||||
|
if (currentList.length > 0 || currentListItemContent.length > 0) {
|
||||||
|
// This line belongs to the current list item
|
||||||
|
currentListItemContent.push(line);
|
||||||
|
} else {
|
||||||
|
// This is a paragraph line
|
||||||
|
flushList();
|
||||||
|
currentParagraph.push(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flushListItem();
|
||||||
|
flushList();
|
||||||
|
flushParagraph();
|
||||||
|
|
||||||
|
return <>{elements}</>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ListingComponent;
|
||||||
@@ -1,99 +1,33 @@
|
|||||||
import YogaImageComponent from "@/components/yoga.image.component";
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
import {YogaMainHeaderComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-main-header-component";
|
import {YogaMainHeaderComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-main-header-component";
|
||||||
|
import {MAIN_MENU} from "@/util/const";
|
||||||
|
import Nav from "@/components/nav.component";
|
||||||
|
import {StrapiFile} from "@/types/types";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import { YogaCommon_Plain } from "@/types/generated-strapi-interfaces/api/yoga-common";
|
||||||
export interface Props{
|
export interface Props{
|
||||||
config: YogaMainHeaderComponent_Plain
|
config: YogaMainHeaderComponent_Plain,
|
||||||
|
common?: YogaCommon_Plain
|
||||||
}
|
}
|
||||||
const MainHeaderComponent = ({ config: {
|
const MainHeaderComponent = ({ config: {
|
||||||
title,
|
title,
|
||||||
header,
|
header,
|
||||||
description,
|
description,
|
||||||
button,
|
button,
|
||||||
|
headerIType,
|
||||||
|
image
|
||||||
|
|
||||||
}}: Props) => {
|
},common}: Props) => {
|
||||||
|
|
||||||
|
const imageFile: StrapiFile = image as StrapiFile;
|
||||||
|
const imageSrc = imageFile ? strapiApi.getImageUrl(imageFile?.url): undefined;
|
||||||
|
const logoImageFile: StrapiFile = (common?.logoImage) as StrapiFile;
|
||||||
|
const logoImageSrc = logoImageFile ? strapiApi.getImageUrl(logoImageFile.url) : undefined;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="banner-section-outer">
|
<div className="banner-section-outer">
|
||||||
<header>
|
<header>
|
||||||
<div className="main_header">
|
<Nav menuItems={MAIN_MENU} imageSrc={logoImageSrc} />
|
||||||
<div className="container-fluid">
|
|
||||||
<nav className="navbar navbar-expand-lg navbar-light p-0">
|
|
||||||
<a className="navbar-brand" href="/index"><figure className="mb-0"><YogaImageComponent src="/assets/images/yogastic_logo.png" alt=""/></figure></a>
|
|
||||||
<button className="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
|
||||||
<span className="navbar-toggler-icon"></span>
|
|
||||||
<span className="navbar-toggler-icon"></span>
|
|
||||||
<span className="navbar-toggler-icon"></span>
|
|
||||||
</button>
|
|
||||||
<div className="collapse navbar-collapse" id="navbarSupportedContent">
|
|
||||||
<ul className="navbar-nav">
|
|
||||||
<li className="nav-item active">
|
|
||||||
<a className="nav-link" href="/index">Home</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="nav-link" href="/about">About Us</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="nav-link" href="/services">Services</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item dropdown">
|
|
||||||
<a className="nav-link dropdown-toggle dropdown-color navbar-text-color" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true"
|
|
||||||
aria-expanded="false"> Pages </a>
|
|
||||||
<div className="dropdown-menu drop-down-content">
|
|
||||||
<ul className="list-unstyled drop-down-pages">
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/pricing">Pricing</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/faq">Faq</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="nav-link" href="/team">Team</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item dropdown">
|
|
||||||
<a className="nav-link dropdown-toggle dropdown-color navbar-text-color" href="#" id="navbarDropdown2" role="button" data-toggle="dropdown" aria-haspopup="true"
|
|
||||||
aria-expanded="false"> Blog </a>
|
|
||||||
<div className="dropdown-menu drop-down-content">
|
|
||||||
<ul className="list-unstyled drop-down-pages">
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/single-post">Single Post</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/infinite-scroll">Infinite Scroll</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/load-more">Load More</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/one-column">One Column</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/two-column">Two Column</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/three-column">Three Column</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/three-colum-sidbar">Three Column Sidebar</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/four-column">Four Column</a>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="dropdown-item nav-link" href="/six-column">Six Column</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li className="nav-item">
|
|
||||||
<a className="nav-link contact_us" href="/contact">Contact Us</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
</header>
|
||||||
{/*<!-- SOCIAL ICONS -->*/}
|
{/*<!-- SOCIAL ICONS -->*/}
|
||||||
<div className="social-icons left_icons float-left d-table" data-aos="fade-down">
|
<div className="social-icons left_icons float-left d-table" data-aos="fade-down">
|
||||||
@@ -117,7 +51,7 @@ const MainHeaderComponent = ({ config: {
|
|||||||
<div className="col-lg-6 col-md-6 col-sm-12 col-xs-12 text-md-left text-center">
|
<div className="col-lg-6 col-md-6 col-sm-12 col-xs-12 text-md-left text-center">
|
||||||
<div className="banner-section-content">
|
<div className="banner-section-content">
|
||||||
<h5>{title}</h5>
|
<h5>{title}</h5>
|
||||||
<h1 data-aos="fade-up">{header} <span className="ityped"></span></h1>
|
<h1 data-aos="fade-up">{header} <span className="{}">{headerIType}</span></h1>
|
||||||
<p data-aos="fade-right">{description}</p>
|
<p data-aos="fade-right">{description}</p>
|
||||||
<div className="btn_wrapper" data-aos="fade-up">
|
<div className="btn_wrapper" data-aos="fade-up">
|
||||||
{button && <a className="text-decoration-none getstarted_btn" href={button.link}>{button.label}</a> }
|
{button && <a className="text-decoration-none getstarted_btn" href={button.link}>{button.label}</a> }
|
||||||
@@ -130,7 +64,7 @@ const MainHeaderComponent = ({ config: {
|
|||||||
<div className="col-lg-6 col-md-6 col-sm-12 col-xs-12">
|
<div className="col-lg-6 col-md-6 col-sm-12 col-xs-12">
|
||||||
<div className="banner-section-image">
|
<div className="banner-section-image">
|
||||||
<figure className="mb-0">
|
<figure className="mb-0">
|
||||||
<YogaImageComponent src="/assets/images/banner_right_image.png" alt="" />
|
<YogaImageComponent src={imageSrc!} alt="" />
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
import {FC} from "react";
|
|
||||||
import YogaImageComponent from "@/components/yoga.image.component";
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
import Link from "next/link";
|
||||||
|
|
||||||
export interface MenuItem {
|
export interface MenuItem {
|
||||||
href?: string;
|
href?: string;
|
||||||
@@ -10,23 +10,23 @@ export interface MenuItem{
|
|||||||
active?: boolean,
|
active?: boolean,
|
||||||
styleClass?: string;
|
styleClass?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
menuItems: MenuItem[];
|
menuItems: MenuItem[];
|
||||||
|
imageSrc?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Nav: FC<Props> = ({menuItems}:Props) => {
|
const Nav = ({menuItems, imageSrc}: Props) => {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header>
|
<header>
|
||||||
<div className="main_header">
|
<div className="main_header">
|
||||||
<div className="container-fluid">
|
<div className="container-fluid">
|
||||||
<nav className="navbar navbar-expand-lg navbar-light p-0">
|
<nav className="navbar navbar-expand-lg navbar-light p-0">
|
||||||
<a className="navbar-brand" href="/index">
|
<Link className="navbar-brand" href="/">
|
||||||
<figure className="mb-0"><YogaImageComponent src="/assets/images/yogastic_logo.png" alt=""/>
|
<figure className="mb-0"> {imageSrc && <YogaImageComponent src={imageSrc} alt=""/>}
|
||||||
</figure>
|
</figure>
|
||||||
</a>
|
</Link>
|
||||||
<button className="navbar-toggler collapsed" type="button" data-toggle="collapse"
|
<button className="navbar-toggler collapsed" type="button" data-toggle="collapse"
|
||||||
data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
|
data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
|
||||||
aria-expanded="false" aria-label="Toggle navigation">
|
aria-expanded="false" aria-label="Toggle navigation">
|
||||||
@@ -36,7 +36,8 @@ const Nav: FC<Props> = ({menuItems}:Props) => {
|
|||||||
</button>
|
</button>
|
||||||
<div className="collapse navbar-collapse" id="navbarSupportedContent">
|
<div className="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
<ul className="navbar-nav">
|
<ul className="navbar-nav">
|
||||||
{menuItems.map( (menuItem,index) => <MenuItemComponent key={"nav"+menuItem.href+"_"+index} menuItem={menuItem} />)}
|
{menuItems.map((menuItem, index) => <MenuItemComponent
|
||||||
|
key={"nav" + menuItem.href + "_" + index} menuItem={menuItem}/>)}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -50,7 +51,8 @@ interface MenuItemProps{
|
|||||||
menuItem: MenuItem,
|
menuItem: MenuItem,
|
||||||
dropdownItem?: boolean,
|
dropdownItem?: boolean,
|
||||||
}
|
}
|
||||||
const MenuItemComponent: FC<MenuItemProps> = ({menuItem, dropdownItem}: MenuItemProps) => {
|
|
||||||
|
const MenuItemComponent = ({menuItem, dropdownItem}: MenuItemProps) => {
|
||||||
if (!menuItem) {
|
if (!menuItem) {
|
||||||
return (<></>);
|
return (<></>);
|
||||||
}
|
}
|
||||||
@@ -58,7 +60,8 @@ const MenuItemComponent: FC<MenuItemProps> = ({menuItem, dropdownItem}: MenuIte
|
|||||||
return (
|
return (
|
||||||
// <li className="nav-item active">
|
// <li className="nav-item active">
|
||||||
<li className={clsx("nav-item", {"active": menuItem.active})}>
|
<li className={clsx("nav-item", {"active": menuItem.active})}>
|
||||||
<a className={clsx("nav-link", {"dropdown-item":dropdownItem},menuItem.styleClass)} href={menuItem.href}>{menuItem.label}</a>
|
<a className={clsx("nav-link", {"dropdown-item": dropdownItem}, menuItem.styleClass)}
|
||||||
|
href={menuItem.href!}>{menuItem.label}</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -71,7 +74,8 @@ const MenuItemComponent: FC<MenuItemProps> = ({menuItem, dropdownItem}: MenuIte
|
|||||||
<div className="dropdown-menu drop-down-content">
|
<div className="dropdown-menu drop-down-content">
|
||||||
<ul className="list-unstyled drop-down-pages">
|
<ul className="list-unstyled drop-down-pages">
|
||||||
{
|
{
|
||||||
menuItem.children.map((item,index) => <MenuItemComponent key={"child_"+item.href+"_"+index} menuItem={item} dropdownItem={true}/>)
|
menuItem.children.map((item, index) => <MenuItemComponent
|
||||||
|
key={"child_" + item.href + "_" + index} menuItem={item} dropdownItem={true}/>)
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
28
yoga-app/src/components/next.blocks.renderer.tsx
Normal file
28
yoga-app/src/components/next.blocks.renderer.tsx
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
'use client';
|
||||||
|
import {BlocksContent, BlocksRenderer} from "@strapi/blocks-react-renderer";
|
||||||
|
import React from "react";
|
||||||
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
|
|
||||||
|
export interface Props{
|
||||||
|
content: BlocksContent;
|
||||||
|
}
|
||||||
|
const NextBlocksRenderer = ({ content }: Props) => {
|
||||||
|
return (
|
||||||
|
<BlocksRenderer
|
||||||
|
content={content}
|
||||||
|
blocks={{
|
||||||
|
image: ({image}) => {
|
||||||
|
return (
|
||||||
|
<YogaImageComponent
|
||||||
|
src={image.url}
|
||||||
|
// width={image.width}
|
||||||
|
// height={image.height}
|
||||||
|
alt={image.alternativeText || ""}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NextBlocksRenderer;
|
||||||
@@ -1,11 +1,75 @@
|
|||||||
|
'use client';
|
||||||
import YogaImageComponent from "@/components/yoga.image.component";
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
|
import {YogaOurServicesComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-our-services-component";
|
||||||
|
// import OurServiceItemComponent from "@/components/our.services.item.component";
|
||||||
|
import "slick-carousel/slick/slick.css";
|
||||||
|
import "slick-carousel/slick/slick-theme.css";
|
||||||
|
import Slider ,{Settings} from "react-slick";
|
||||||
|
import OurServiceItemComponent from "@/components/our.services.item.component";
|
||||||
|
import {sortServicesByPriority} from "@/util/sorting";
|
||||||
|
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
title: string;
|
config: YogaOurServicesComponent_Plain
|
||||||
header: string;
|
|
||||||
description: string;
|
|
||||||
}
|
}
|
||||||
const OurServiceComponent = ({title,header,description}: Props) => {
|
const OurServiceComponent = ({config: {title,header,description,services}}: Props) => {
|
||||||
|
|
||||||
|
const settings: Settings = {
|
||||||
|
dots: true,
|
||||||
|
infinite: true,
|
||||||
|
speed: 500,
|
||||||
|
slidesToShow: 4,
|
||||||
|
slidesToScroll: 1,
|
||||||
|
swipe: true,
|
||||||
|
responsive: [
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* col-lg-3 col-md-6 col-sm-6 col-xs-12
|
||||||
|
*
|
||||||
|
* Breakpoint Class infix Dimensions
|
||||||
|
* X-Small None <576px
|
||||||
|
* Small sm ≥576px
|
||||||
|
* Medium md ≥768px
|
||||||
|
* Large lg ≥992px
|
||||||
|
* Extra large xl ≥1200px
|
||||||
|
* Extra extra large xxl ≥1400px
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
breakpoint: 992,
|
||||||
|
settings: {
|
||||||
|
slidesToShow: 4,
|
||||||
|
slidesToScroll: 1,
|
||||||
|
infinite: true,
|
||||||
|
dots: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
breakpoint: 768,
|
||||||
|
settings: {
|
||||||
|
slidesToShow: 2,
|
||||||
|
slidesToScroll: 1,
|
||||||
|
initialSlide: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
breakpoint: 576,
|
||||||
|
settings: {
|
||||||
|
slidesToShow: 2,
|
||||||
|
slidesToScroll: 1,
|
||||||
|
initialSlide: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
breakpoint: 480,
|
||||||
|
settings: {
|
||||||
|
slidesToShow: 1,
|
||||||
|
slidesToScroll: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
const sortedServices = services ? [...services] : [];
|
||||||
|
sortedServices.sort( sortServicesByPriority )
|
||||||
return (
|
return (
|
||||||
<section className="services_section">
|
<section className="services_section">
|
||||||
<div className="container">
|
<div className="container">
|
||||||
@@ -18,72 +82,21 @@ const OurServiceComponent = ({title,header,description}: Props) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="row" data-aos="fade-up">
|
|
||||||
<div className="col-lg-3 col-md-6 col-sm-6 col-xs-12">
|
{/*<div className="row" data-aos="fade-up">*/}
|
||||||
<div className="services_box_content">
|
{/* {services.map(*/}
|
||||||
<div className="services_box_upper_portion">
|
{/* itemConfig =>*/}
|
||||||
<figure className="mb-0"><YogaImageComponent src="/assets/images/services_img_1.png" alt=""
|
{/* <OurServiceItemComponent config={itemConfig} key={itemConfig.id} />*/}
|
||||||
className="img-fluid"/></figure>
|
{/* )}*/}
|
||||||
</div>
|
{/*</div>*/}
|
||||||
<div className="services_box_lower_portion">
|
|
||||||
<h3>Prenatal Yoga</h3>
|
<Slider {...settings}>
|
||||||
<p>Finibus metus elit tempus faucibus urna nunc aui.</p>
|
{sortedServices.map(
|
||||||
<div className="btn_wrapper">
|
itemConfig =>
|
||||||
<a href="/services" className="text-decoration-none"><i
|
<OurServiceItemComponent config={itemConfig} key={itemConfig.id} />
|
||||||
className="fa-solid fa-arrow-right" aria-hidden="true"></i></a>
|
)}
|
||||||
</div>
|
</Slider>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-3 col-md-6 col-sm-6 col-xs-12">
|
|
||||||
<div className="services_box_content">
|
|
||||||
<div className="services_box_upper_portion">
|
|
||||||
<figure className="mb-0"><YogaImageComponent src="/assets/images/services_img_2.png" alt=""
|
|
||||||
className="img-fluid"/></figure>
|
|
||||||
</div>
|
|
||||||
<div className="services_box_lower_portion">
|
|
||||||
<h3>Meditation</h3>
|
|
||||||
<p>Ainibus metus elit tempus faucibus urna nunc cui.</p>
|
|
||||||
<div className="btn_wrapper">
|
|
||||||
<a href="/services" className="text-decoration-none"><i
|
|
||||||
className="fa-solid fa-arrow-right" aria-hidden="true"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-3 col-md-6 col-sm-6 col-xs-12">
|
|
||||||
<div className="services_box_content">
|
|
||||||
<div className="services_box_upper_portion">
|
|
||||||
<figure className="mb-0"><YogaImageComponent src="/assets/images/services_img_3.png" alt=""
|
|
||||||
className="img-fluid"/></figure>
|
|
||||||
</div>
|
|
||||||
<div className="services_box_lower_portion">
|
|
||||||
<h3>Nutrition Consultation</h3>
|
|
||||||
<p>Binibus metus elit tempus faucibus urna nunc eui.</p>
|
|
||||||
<div className="btn_wrapper">
|
|
||||||
<a href="/services" className="text-decoration-none"><i
|
|
||||||
className="fa-solid fa-arrow-right" aria-hidden="true"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-3 col-md-6 col-sm-6 col-xs-12">
|
|
||||||
<div className="services_box_content">
|
|
||||||
<div className="services_box_upper_portion">
|
|
||||||
<figure className="mb-0"><YogaImageComponent src="/assets/images/services_img_4.png" alt=""
|
|
||||||
className="img-fluid"/></figure>
|
|
||||||
</div>
|
|
||||||
<div className="services_box_lower_portion">
|
|
||||||
<h3>Hatha Yoga</h3>
|
|
||||||
<p>Dinibus metus elit tempus faucibus urna nunc rui.</p>
|
|
||||||
<div className="btn_wrapper">
|
|
||||||
<a href="/services" className="text-decoration-none"><i
|
|
||||||
className="fa-solid fa-arrow-right" aria-hidden="true"></i></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<figure className="services_left_shape left_shape mb-0">
|
<figure className="services_left_shape left_shape mb-0">
|
||||||
<YogaImageComponent src="/assets/images/services_left_shape.png" alt="" className="img-fluid"/>
|
<YogaImageComponent src="/assets/images/services_left_shape.png" alt="" className="img-fluid"/>
|
||||||
</figure>
|
</figure>
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*.serviceSlide{*/
|
||||||
|
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
/*button.slick-arrow:first-of-type{*/
|
||||||
|
/* left: 6px;*/
|
||||||
|
/* z-index: 1;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
/*button.slick-arrow:last-of-type{*/
|
||||||
|
/* right: 6px;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
|
.serviceSlide{
|
||||||
|
margin: 0 6px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-track :global(.slick-active){
|
||||||
|
padding-left: 3px;
|
||||||
|
padding-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-track :global(div:nth-child(1 of .slick-active)){
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slick-track :global(div:nth-last-child(1 of .slick-active)){
|
||||||
|
padding-left: 3px;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.roundedImage{
|
||||||
|
border-top-left-radius: 60px;
|
||||||
|
border-bottom-right-radius: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*:global(div.slick-active):nth-last-child(n!*){*/
|
||||||
|
/* padding-left: 6px;*/
|
||||||
|
/* padding-right: 0;*!*/
|
||||||
|
/*}*/
|
||||||
43
yoga-app/src/components/our.services.item.component.tsx
Normal file
43
yoga-app/src/components/our.services.item.component.tsx
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
|
import {YogaSingleService_Plain} from "@/types/generated-strapi-interfaces/api/yoga-single-service";
|
||||||
|
import {StrapiFile} from "@/types/types";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import styles from './our.services.item.component.module.css'
|
||||||
|
import Link from "next/link";
|
||||||
|
import classNames from "classnames";
|
||||||
|
|
||||||
|
export interface Props {
|
||||||
|
config: YogaSingleService_Plain
|
||||||
|
}
|
||||||
|
|
||||||
|
const OurServiceItemComponent = ({config: {header,description,image,name}}: Props) => {
|
||||||
|
const imageFile: StrapiFile = image as StrapiFile;
|
||||||
|
if (!imageFile || !imageFile.url) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const path = '/serviceList#' + name;
|
||||||
|
return (
|
||||||
|
|
||||||
|
<div className={styles.serviceSlide}>
|
||||||
|
{/*<div className="col-lg-3 col-md-6 col-sm-6 col-xs-12">*/}
|
||||||
|
<div className="services_box_content">
|
||||||
|
<div className="services_box_upper_portion">
|
||||||
|
<figure className="mb-0">
|
||||||
|
<YogaImageComponent src={strapiApi.getImageUrl(imageFile.url)} alt="" className={classNames(styles.roundedImage,"img-fluid" )}/>
|
||||||
|
</figure>
|
||||||
|
</div>
|
||||||
|
<div className="services_box_lower_portion">
|
||||||
|
<h3>{header}</h3>
|
||||||
|
<p>{description}</p>
|
||||||
|
<div className="btn_wrapper">
|
||||||
|
<Link href={path} className="text-decoration-none"><i
|
||||||
|
className="fa-solid fa-arrow-right" aria-hidden="true"></i></Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default OurServiceItemComponent;
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import YogaImageComponent from "@/components/yoga.image.component";
|
import YogaImageComponent from "@/components/yoga.image.component";
|
||||||
import OurSpecialitiesItemComponent from "@/components/our.specialities.item.component";
|
import OurSpecialitiesItemComponent from "@/components/our.specialities.item.component";
|
||||||
import {YogaSpecialitiesComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-specialities-component";
|
import {YogaSpecialitiesComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-specialities-component";
|
||||||
|
import {StrapiFile} from "@/types/types";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
config: YogaSpecialitiesComponent_Plain
|
config: YogaSpecialitiesComponent_Plain
|
||||||
@@ -14,8 +16,14 @@ const OurSpecialitiesComponent = ({ config: { title,header,description,
|
|||||||
right1,
|
right1,
|
||||||
right2,
|
right2,
|
||||||
right3,
|
right3,
|
||||||
right4
|
right4,
|
||||||
|
image
|
||||||
} }: Props) => {
|
} }: Props) => {
|
||||||
|
|
||||||
|
|
||||||
|
const imageFile: StrapiFile = image as StrapiFile;
|
||||||
|
const imageUrl = strapiApi.getImageUrl(imageFile?.url)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
||||||
<section className="our_specialties_section">
|
<section className="our_specialties_section">
|
||||||
@@ -43,7 +51,7 @@ const OurSpecialitiesComponent = ({ config: { title,header,description,
|
|||||||
</div>
|
</div>
|
||||||
<div className="col-lg-6 col-md-4 col-sm-6 col-xs-12 d-md-block d-none">
|
<div className="col-lg-6 col-md-4 col-sm-6 col-xs-12 d-md-block d-none">
|
||||||
<figure className="specialties_image mb-0">
|
<figure className="specialties_image mb-0">
|
||||||
<YogaImageComponent src="/assets/images/specialties_image.png" alt="" className="img-fluid" />
|
<YogaImageComponent src={imageUrl} alt="" className="img-fluid" />
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-lg-3 col-md-4 col-sm-6 col-xs-12" data-aos="fade-right">
|
<div className="col-lg-3 col-md-4 col-sm-6 col-xs-12" data-aos="fade-right">
|
||||||
|
|||||||
@@ -7,27 +7,27 @@ export interface Props{
|
|||||||
config: YogaPrice_Plain
|
config: YogaPrice_Plain
|
||||||
}
|
}
|
||||||
|
|
||||||
export function PriceItemComponent({config: {header,option1,option2,price,icon, image,buttonText}} : Props){
|
export function PriceItemComponent({config: {header, description, option1,option2,price,pricePostfix, icon, image,buttonText}} : Props){
|
||||||
// there are some issues with the strapi generated types
|
// there are some issues with the strapi generated types
|
||||||
const iconFile: StrapiFile = icon as StrapiFile;
|
const iconFile: StrapiFile = icon as StrapiFile;
|
||||||
const imageFile: StrapiFile = image as StrapiFile;
|
const imageFile: StrapiFile = image as StrapiFile;
|
||||||
console.info("image:",strapiApi.getImageUrl(imageFile.url));
|
|
||||||
return (
|
return (
|
||||||
<div className="col-lg-4 col-md-4 col-sm-6 col-xs-12">
|
<div className="col-lg-4 col-md-4 col-sm-6 col-xs-12">
|
||||||
<div className="pricing_plans_box_content">
|
<div className="pricing_plans_box_content">
|
||||||
<div className="pricing_plans_box_upper_portion">
|
<div className="pricing_plans_box_upper_portion">
|
||||||
<figure className="pricing_plans_image mb-0">
|
<figure className="pricing_plans_image mb-0">
|
||||||
<YogaImageComponent src={strapiApi.getImageUrl(imageFile.url)} alt="" className="img-fluid"/>
|
<YogaImageComponent src={strapiApi.getImageUrl(imageFile?.url)} alt="" className="img-fluid"/>
|
||||||
</figure>
|
</figure>
|
||||||
<div className="pricing_plans_box_image_content">
|
<div className="pricing_plans_box_image_content">
|
||||||
<figure className="mb-0">
|
<figure className="mb-0">
|
||||||
<YogaImageComponent src={strapiApi.getImageUrl(iconFile.url)} alt=""
|
<YogaImageComponent src={strapiApi.getImageUrl(iconFile?.url)} alt=""
|
||||||
className="img-fluid"/>
|
className="img-fluid"/>
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="pricing_plans_box_lower_portion">
|
<div className="pricing_plans_box_lower_portion">
|
||||||
<h3>{header}</h3>
|
<h3>{header}</h3>
|
||||||
|
<p className={'text-center'}>{description}</p>
|
||||||
<ul className="list-unstyled">
|
<ul className="list-unstyled">
|
||||||
<li>
|
<li>
|
||||||
<i className="fa-solid fa-check" aria-hidden="true"></i>{option1}
|
<i className="fa-solid fa-check" aria-hidden="true"></i>{option1}
|
||||||
@@ -38,7 +38,7 @@ export function PriceItemComponent({config: {header,option1,option2,price,icon,
|
|||||||
</ul>
|
</ul>
|
||||||
<div className="pricing_plans_span_wrapper">
|
<div className="pricing_plans_span_wrapper">
|
||||||
<span className="price">{price} FT</span>
|
<span className="price">{price} FT</span>
|
||||||
<span className="per_month">/per month</span>
|
{ pricePostfix && <span className="per_month">{pricePostfix}</span> }
|
||||||
</div>
|
</div>
|
||||||
<div className="btn_wrapper">
|
<div className="btn_wrapper">
|
||||||
<a className="enroll_now_btn text-decoration-none" href="/pricing.html">{buttonText}</a>
|
<a className="enroll_now_btn text-decoration-none" href="/pricing.html">{buttonText}</a>
|
||||||
|
|||||||
30
yoga-app/src/components/single.service.component.tsx
Normal file
30
yoga-app/src/components/single.service.component.tsx
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import {YogaSingleService_Plain} from "@/types/generated-strapi-interfaces/api/yoga-single-service";
|
||||||
|
import React from "react";
|
||||||
|
import BlockWithImageComponent from "@/components/block.with.image.component";
|
||||||
|
import {ImagePosition, StrapiFile} from "@/types/types";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
|
||||||
|
|
||||||
|
export interface Props {
|
||||||
|
config: YogaSingleService_Plain,
|
||||||
|
index: number
|
||||||
|
}
|
||||||
|
|
||||||
|
const SingleService = ({config, index}: Props) => {
|
||||||
|
if (!config || !config.article) {
|
||||||
|
return null; // or some fallback UI
|
||||||
|
}
|
||||||
|
|
||||||
|
const {article, articleImage, name, header} = config;
|
||||||
|
let imageUrl: string | undefined = undefined;
|
||||||
|
const strapiFile = articleImage as StrapiFile;
|
||||||
|
imageUrl = strapiApi.getImageUrl(strapiFile?.url);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<BlockWithImageComponent id={name} block={article}
|
||||||
|
image={{position: index % 2 ? ImagePosition.Left : ImagePosition.Right, url: imageUrl}}
|
||||||
|
header={header}/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SingleService;
|
||||||
@@ -3,14 +3,31 @@ import Nav from "@/components/nav.component";
|
|||||||
import {MAIN_MENU} from "@/util/const";
|
import {MAIN_MENU} from "@/util/const";
|
||||||
import {HeaderB} from "@/types/generated-strapi-interfaces/components/yoga-site/HeaderB";
|
import {HeaderB} from "@/types/generated-strapi-interfaces/components/yoga-site/HeaderB";
|
||||||
import NextBreadcrumb from "@/components/breadcrumbs.component";
|
import NextBreadcrumb from "@/components/breadcrumbs.component";
|
||||||
|
import {YogaCommon_Plain} from "@/types/generated-strapi-interfaces/api/yoga-common";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import {StrapiFile} from "@/types/types";
|
||||||
|
|
||||||
|
|
||||||
export type Props = HeaderB ;
|
export type Props = {
|
||||||
|
header: HeaderB,
|
||||||
|
common?: YogaCommon_Plain
|
||||||
|
} ;
|
||||||
|
|
||||||
|
const SubHeaderComponent = ( {
|
||||||
|
header:{ header1,description},common }: Props) =>{
|
||||||
|
|
||||||
|
|
||||||
|
let logoImageSrc: string|undefined = undefined;
|
||||||
|
|
||||||
|
const logoImage = common && common.logoImage;
|
||||||
|
if ( logoImage ){
|
||||||
|
const logoImageFile: StrapiFile = logoImage as StrapiFile;
|
||||||
|
logoImageSrc = strapiApi.getImageUrl(logoImageFile?.url) ;
|
||||||
|
}
|
||||||
|
|
||||||
const SubHeaderComponent = ({header1,description}: Props) =>{
|
|
||||||
return (
|
return (
|
||||||
<div className="sub-banner-section">
|
<div className="sub-banner-section">
|
||||||
<Nav menuItems={MAIN_MENU} />
|
<Nav menuItems={MAIN_MENU} imageSrc={logoImageSrc} />
|
||||||
<section className="banner-section">
|
<section className="banner-section">
|
||||||
<div className="container">
|
<div className="container">
|
||||||
<div className="row">
|
<div className="row">
|
||||||
@@ -42,3 +59,6 @@ const SubHeaderComponent = ({header1,description}: Props) =>{
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default SubHeaderComponent;
|
export default SubHeaderComponent;
|
||||||
|
|
||||||
|
|
||||||
|
export const dynamic = 'force-dynamic'
|
||||||
|
|||||||
4
yoga-app/src/components/subscribe.component.module.css
Normal file
4
yoga-app/src/components/subscribe.component.module.css
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
.roundedImage img{
|
||||||
|
border-bottom-right-radius: 60px;
|
||||||
|
}
|
||||||
@@ -3,14 +3,22 @@ import {
|
|||||||
YogaSubscribeNowComponent_Plain
|
YogaSubscribeNowComponent_Plain
|
||||||
} from "@/types/generated-strapi-interfaces/api/yoga-subscribe-now-component";
|
} from "@/types/generated-strapi-interfaces/api/yoga-subscribe-now-component";
|
||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
|
import {StrapiFile} from "@/types/types";
|
||||||
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import styles from './subscribe.component.module.css'
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
config: YogaSubscribeNowComponent_Plain,
|
config: YogaSubscribeNowComponent_Plain,
|
||||||
styleClass?: string
|
styleClass?: string,
|
||||||
}
|
}
|
||||||
const SubscribeComponent = ({
|
const SubscribeComponent = ({
|
||||||
config: {title,header,placeHolderEmail,buttonSubscribeLabel},
|
config: {title,header,placeHolderEmail,buttonSubscribeLabel, image = undefined},
|
||||||
styleClass
|
styleClass
|
||||||
}: Props) => {
|
}: Props) => {
|
||||||
|
const imageFile: StrapiFile = image as StrapiFile;
|
||||||
|
if (!imageFile || !imageFile.url) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<section className={clsx("subscribe_section",styleClass)}>
|
<section className={clsx("subscribe_section",styleClass)}>
|
||||||
<div className="container">
|
<div className="container">
|
||||||
@@ -32,8 +40,8 @@ const SubscribeComponent = ({
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-lg-5 col-md-5 col-sm-6 col-xs-12">
|
<div className="col-lg-5 col-md-5 col-sm-6 col-xs-12">
|
||||||
<figure className="subscribe_image mb-0">
|
<figure className={clsx(styles.roundedImage,"subscribe_image","mb-0",)}>
|
||||||
<YogaImageComponent src="/assets/images/subscribe_image.png" alt=""/>
|
<YogaImageComponent src={strapiApi.getImageUrl(imageFile.url)} alt=""/>
|
||||||
</figure>
|
</figure>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import TextWithRightImage from "@/components/text.with.right.image.component";
|
import TextWithRightImage from "@/components/text.with.right.image.component";
|
||||||
import TextWithLeftImage from "@/components/text.with.right.left.component";
|
import TextWithLeftImage from "@/components/text.with.left.image.component";
|
||||||
import {YogaTextWithImageComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-text-with-image-component";
|
import {YogaTextWithImageComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-text-with-image-component";
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import YogaImageComponent from "@/components/yoga.image.component";
|
|||||||
import {YogaTextWithImageComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-text-with-image-component";
|
import {YogaTextWithImageComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-text-with-image-component";
|
||||||
import {StrapiFile} from "@/types/types";
|
import {StrapiFile} from "@/types/types";
|
||||||
import strapiApi from "@/api/strapi/strapi-api";
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import ListingComponent from "@/components/listing.component";
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
config: YogaTextWithImageComponent_Plain
|
config: YogaTextWithImageComponent_Plain
|
||||||
@@ -12,7 +13,7 @@ export default function TextWithLeftImage ({config: {
|
|||||||
}}: Props){
|
}}: Props){
|
||||||
|
|
||||||
const strapiFile = image as StrapiFile;
|
const strapiFile = image as StrapiFile;
|
||||||
const imageUrl = strapiApi.getImageUrl(strapiFile.url)
|
const imageUrl = strapiApi.getImageUrl(strapiFile?.url);
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -29,7 +30,7 @@ export default function TextWithLeftImage ({config: {
|
|||||||
<div className="vision_content">
|
<div className="vision_content">
|
||||||
<h5>{title}</h5>
|
<h5>{title}</h5>
|
||||||
<h2>{header}</h2>
|
<h2>{header}</h2>
|
||||||
<p>{description}</p>
|
<ListingComponent text={description} />
|
||||||
<div className="btn_wrapper">
|
<div className="btn_wrapper">
|
||||||
{button && <a href={button.link} className="text-decoration-none read_more_btn">{button.label}</a>}
|
{button && <a href={button.link} className="text-decoration-none read_more_btn">{button.label}</a>}
|
||||||
</div>
|
</div>
|
||||||
@@ -2,6 +2,7 @@ import YogaImageComponent from "@/components/yoga.image.component";
|
|||||||
import {YogaTextWithImageComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-text-with-image-component";
|
import {YogaTextWithImageComponent_Plain} from "@/types/generated-strapi-interfaces/api/yoga-text-with-image-component";
|
||||||
import {StrapiFile} from "@/types/types";
|
import {StrapiFile} from "@/types/types";
|
||||||
import strapiApi from "@/api/strapi/strapi-api";
|
import strapiApi from "@/api/strapi/strapi-api";
|
||||||
|
import ListingComponent from "./listing.component";
|
||||||
|
|
||||||
export interface Props{
|
export interface Props{
|
||||||
config: YogaTextWithImageComponent_Plain
|
config: YogaTextWithImageComponent_Plain
|
||||||
@@ -11,7 +12,7 @@ export default function TextWithRightImage ({config: {
|
|||||||
}}: Props){
|
}}: Props){
|
||||||
|
|
||||||
const strapiFile = image as StrapiFile;
|
const strapiFile = image as StrapiFile;
|
||||||
const imageUrl = strapiApi.getImageUrl(strapiFile.url)
|
const imageUrl = strapiApi.getImageUrl(strapiFile?.url)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="mission_section">
|
<section className="mission_section">
|
||||||
@@ -22,7 +23,7 @@ export default function TextWithRightImage ({config: {
|
|||||||
<div className="mission_content">
|
<div className="mission_content">
|
||||||
<h5>{title}</h5>
|
<h5>{title}</h5>
|
||||||
<h2>{header}</h2>
|
<h2>{header}</h2>
|
||||||
<p>{description}</p>
|
<ListingComponent text={description} />
|
||||||
<div className="btn_wrapper">
|
<div className="btn_wrapper">
|
||||||
{button && <a href={button.link} className="text-decoration-none read_more_btn">{button.label}</a>}
|
{button && <a href={button.link} className="text-decoration-none read_more_btn">{button.label}</a>}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
1
yoga-app/src/styles/block-with-image.scss
Normal file
1
yoga-app/src/styles/block-with-image.scss
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
209
yoga-app/src/styles/block-with-left-image.scss
Normal file
209
yoga-app/src/styles/block-with-left-image.scss
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
.block_with_left_image {
|
||||||
|
--y-padding: 45px 0 130px;
|
||||||
|
--y-box-border-radius: 200px;
|
||||||
|
--y-content-padding-top: 150px;
|
||||||
|
--y-btn-font-size: 22px;
|
||||||
|
--y-btn-padding: 24px 44px;
|
||||||
|
--y-image-margin-top: -150px;
|
||||||
|
--y-block-with-right-image-spacing-image: 96px;
|
||||||
|
--y-block-with-image-spacing-main: 66px;
|
||||||
|
|
||||||
|
padding: var(--y-padding);
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&_box {
|
||||||
|
width: 100%;
|
||||||
|
background-color: var(--e-global-color-white);
|
||||||
|
border-radius: var(--y-box-border-radius) 0 var(--y-box-border-radius) 0;
|
||||||
|
box-shadow: 1px 1px 50px rgb(0 0 0 / 7%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
padding-top: var(--y-content-padding-top);
|
||||||
|
padding-left: 40px;
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--e-global-color-secondary);
|
||||||
|
letter-spacing: 3.1px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
color: var(--e-global-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 32px;
|
||||||
|
color: var(--e-global-color-text);
|
||||||
|
padding-right: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn_wrapper .read_more_btn {
|
||||||
|
font-size: var(--y-btn-font-size);
|
||||||
|
line-height: var(--y-btn-font-size);
|
||||||
|
font-weight: 500;
|
||||||
|
padding: var(--y-btn-padding);
|
||||||
|
text-align: center;
|
||||||
|
color: var(--e-global-color-white);
|
||||||
|
display: inline-block;
|
||||||
|
background-color: var(--e-global-color-secondary);
|
||||||
|
border-radius: 35px 0px 35px 0px;
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--e-global-color-accent);
|
||||||
|
background-color: var(--e-global-color-soft-orange);
|
||||||
|
transform: translateY(-10px);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
left: 0%;
|
||||||
|
right: auto;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
right: 0px;
|
||||||
|
height: 100%;
|
||||||
|
width: 0px;
|
||||||
|
z-index: -1;
|
||||||
|
content: '';
|
||||||
|
color: var(--e-global-color-accent);
|
||||||
|
background-color: var(--e-global-color-soft-orange);
|
||||||
|
transition: all 0.4s cubic-bezier(0.12, 0, 0.38, 1) 0s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p, h1, h2, h3, h4, h5 {
|
||||||
|
padding-right: var(--y-block-with-right-image-spacing-image);
|
||||||
|
padding-left: var(--y-block-with-image-spacing-main);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&_image img {
|
||||||
|
border-top-left-radius: var(--y-box-border-radius);
|
||||||
|
border-bottom-right-radius: var(--y-box-border-radius);
|
||||||
|
margin: var(--y-image-margin-top) 12px 12px -40px;
|
||||||
|
max-width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&_left_shape {
|
||||||
|
position: absolute;
|
||||||
|
top: 140px;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1440px) {
|
||||||
|
&_left_shape {
|
||||||
|
top: unset;
|
||||||
|
bottom: 15px;
|
||||||
|
img {
|
||||||
|
width: 95px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1199px) {
|
||||||
|
--y-padding: 50px 0 100px;
|
||||||
|
--y-content-padding-top: 80px;
|
||||||
|
--y-btn-font-size: 20px;
|
||||||
|
--y-btn-padding: 22px 40px;
|
||||||
|
--y-image-margin-top: -80px;
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
padding-left: 15px;
|
||||||
|
|
||||||
|
p, h2, h3, h4, h5, h6{
|
||||||
|
padding-left: 55px;
|
||||||
|
padding-right: 70px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 { margin-bottom: 8px; }
|
||||||
|
h2 { margin-bottom: 12px; }
|
||||||
|
p {
|
||||||
|
margin-bottom: 28px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&_left_shape {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.block_with_left_image_image img{
|
||||||
|
margin-left: -15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 991px) {
|
||||||
|
--y-padding: 35px 0 70px;
|
||||||
|
--y-box-border-radius: 120px;
|
||||||
|
--y-content-padding-top: 40px;
|
||||||
|
--y-btn-font-size: 18px;
|
||||||
|
--y-btn-padding: 20px 35px;
|
||||||
|
--y-image-margin-top: -40px;
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
padding-left: 0;
|
||||||
|
|
||||||
|
p, h2, h3, h4, h5, h6{
|
||||||
|
padding-right: 45px;
|
||||||
|
padding-left: 45px;
|
||||||
|
}
|
||||||
|
h5 { margin-bottom: 5px; }
|
||||||
|
h2 { margin-bottom: 10px; }
|
||||||
|
p {
|
||||||
|
margin-bottom: 22px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.block_with_left_image_image img{
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px) {
|
||||||
|
--y-padding: 30px 0 60px;
|
||||||
|
--y-box-border-radius: 185px;
|
||||||
|
--y-btn-font-size: 16px;
|
||||||
|
--y-btn-padding: 18px 32px;
|
||||||
|
--y-image-margin-top: 0;
|
||||||
|
|
||||||
|
&_image {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
padding-top: 0;
|
||||||
|
text-align: center;
|
||||||
|
padding-left: 0px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
h2 { margin-bottom: 8px; }
|
||||||
|
p {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
padding: 0 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 575px) {
|
||||||
|
--y-box-border-radius: 118px;
|
||||||
|
--y-btn-font-size: 14px;
|
||||||
|
--y-btn-padding: 16px 30px;
|
||||||
|
|
||||||
|
&_content p {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
&_image img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
221
yoga-app/src/styles/block-with-right-image.scss
Normal file
221
yoga-app/src/styles/block-with-right-image.scss
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
/* About Page Our block_with_image Section Style */
|
||||||
|
|
||||||
|
.block_with_right_image {
|
||||||
|
--y-block-with-right-image-spacing-image: 96px;
|
||||||
|
--y-block-with-image-spacing-main: 66px;
|
||||||
|
--y-block-with-right-image-top-spacing: 150px;
|
||||||
|
--y-box-border-radius: 200px;
|
||||||
|
--y-btn-font-size: 22px;
|
||||||
|
--y-btn-padding: 24px 44px;
|
||||||
|
|
||||||
|
padding: 130px 0 45px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&_image img {
|
||||||
|
max-width: 50%;
|
||||||
|
border-top-left-radius: var(--y-box-border-radius);
|
||||||
|
border-bottom-right-radius: var(--y-box-border-radius);
|
||||||
|
margin: calc(-1 * var(--y-block-with-right-image-top-spacing)) 0 12px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.block_with_image_box {
|
||||||
|
width: 100%;
|
||||||
|
background-color: var(--e-global-color-white);
|
||||||
|
border-radius: var(--y-box-border-radius) 0 var(--y-box-border-radius) 0;
|
||||||
|
box-shadow: 1px 1px 50px rgb(0 0 0 / 7%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
padding-top: var(--y-block-with-right-image-top-spacing);
|
||||||
|
padding-left: 96px;
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--e-global-color-secondary);
|
||||||
|
letter-spacing: 3.1px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin-bottom: 16px;
|
||||||
|
color: var(--e-global-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 32px;
|
||||||
|
color: var(--e-global-color-text);
|
||||||
|
padding-right: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn_wrapper .read_more_btn {
|
||||||
|
font-size: var(--y-btn-font-size);
|
||||||
|
line-height: var(--y-btn-font-size);
|
||||||
|
font-weight: 500;
|
||||||
|
padding: var(--y-btn-padding);
|
||||||
|
text-align: center;
|
||||||
|
color: var(--e-global-color-white);
|
||||||
|
display: inline-block;
|
||||||
|
background-color: var(--e-global-color-secondary);
|
||||||
|
border-radius: 35px 0px 35px 0px;
|
||||||
|
transition: all 0.3s ease-in-out;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: var(--e-global-color-accent);
|
||||||
|
background-color: var(--e-global-color-soft-orange);
|
||||||
|
transform: translateY(-10px);
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
left: 0%;
|
||||||
|
right: auto;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
right: 0px;
|
||||||
|
height: 100%;
|
||||||
|
width: 0px;
|
||||||
|
z-index: -1;
|
||||||
|
content: '';
|
||||||
|
color: var(--e-global-color-accent);
|
||||||
|
background-color: var(--e-global-color-soft-orange);
|
||||||
|
transition: all 0.4s cubic-bezier(0.12, 0, 0.38, 1) 0s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p, h1, h2, h3, h4, h5 {
|
||||||
|
padding-right: var(--y-block-with-right-image-spacing-image);
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&_right_shape {
|
||||||
|
position: absolute;
|
||||||
|
top: 210px;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1440px) {
|
||||||
|
&_right_shape {
|
||||||
|
top: 15px;
|
||||||
|
img {
|
||||||
|
width: 90px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&_image img {
|
||||||
|
margin-top: calc(-1 * var(--y-block-with-right-image-top-spacing));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1199px) {
|
||||||
|
--y-block-with-right-image-top-spacing: 135px;
|
||||||
|
--y-btn-font-size: 20px;
|
||||||
|
--y-btn-padding: 22px 40px;
|
||||||
|
padding: 100px 0 50px;
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
padding-left: 70px;
|
||||||
|
p, h2, h3, h4, h5, h6{
|
||||||
|
padding-right: 70px;
|
||||||
|
}
|
||||||
|
h5 {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin-bottom: 28px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&_right_shape {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
&_image img {
|
||||||
|
margin-top: calc(-1 * var(--y-block-with-right-image-top-spacing));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 991px) {
|
||||||
|
--y-block-with-right-image-top-spacing: 70px;
|
||||||
|
--y-box-border-radius: 140px;
|
||||||
|
--y-btn-font-size: 18px;
|
||||||
|
--y-btn-padding: 20px 35px;
|
||||||
|
padding: 70px 0 35px;
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
|
||||||
|
p, h2, h3, h4, h5, h6{
|
||||||
|
padding-right: 45px;
|
||||||
|
}
|
||||||
|
|
||||||
|
padding-left: 45px;
|
||||||
|
h5 {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin-bottom: 22px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&_image img {
|
||||||
|
margin-top: calc(-1 * var(--y-block-with-right-image-top-spacing));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px) {
|
||||||
|
--y-block-with-right-image-top-spacing: 60px;
|
||||||
|
--y-box-border-radius: 185px;
|
||||||
|
--y-btn-font-size: 16px;
|
||||||
|
--y-btn-padding: 18px 32px;
|
||||||
|
padding: 60px 0 30px;
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
padding-left: 0;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
h2,h3,h4,h5,h6 {
|
||||||
|
padding-right: 0;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
padding: 0 50px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&_image img {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 575px) {
|
||||||
|
--y-block-with-right-image-top-spacing: 50px;
|
||||||
|
--y-box-border-radius: 118px;
|
||||||
|
--y-btn-font-size: 14px;
|
||||||
|
--y-btn-padding: 16px 30px;
|
||||||
|
|
||||||
|
&_content {
|
||||||
|
h2,h3,h4,h5,h6{
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&_image img {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -299,7 +299,7 @@
|
|||||||
width: 115px;
|
width: 115px;
|
||||||
}
|
}
|
||||||
.aboutus_content {
|
.aboutus_content {
|
||||||
padding-top: 130px;
|
padding-top: 0;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
}
|
}
|
||||||
.aboutus_content h5 {
|
.aboutus_content h5 {
|
||||||
@@ -1263,7 +1263,7 @@
|
|||||||
width: 110px;
|
width: 110px;
|
||||||
}
|
}
|
||||||
.aboutus_content {
|
.aboutus_content {
|
||||||
padding-top: 60px;
|
padding-top: 0;
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
}
|
}
|
||||||
.aboutus_content h2 {
|
.aboutus_content h2 {
|
||||||
|
|||||||
21
yoga-app/src/styles/readme.md
Normal file
21
yoga-app/src/styles/readme.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
## MediaQueries brakepoints
|
||||||
|
|
||||||
|
```css
|
||||||
|
|
||||||
|
|
||||||
|
/* Media Queries */
|
||||||
|
|
||||||
|
@media screen and (max-width: 1440px){
|
||||||
|
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 1199px){
|
||||||
|
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 991px){}
|
||||||
|
|
||||||
|
@media screen and (max-width: 767px){}
|
||||||
|
|
||||||
|
@media screen and (max-width: 575px) {
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
@@ -501,7 +501,7 @@ p{
|
|||||||
left: -65px;
|
left: -65px;
|
||||||
}
|
}
|
||||||
.aboutus_content{
|
.aboutus_content{
|
||||||
padding-top: 145px;
|
padding-top: 0;
|
||||||
padding-left: 16px;
|
padding-left: 16px;
|
||||||
}
|
}
|
||||||
.aboutus_content h5{
|
.aboutus_content h5{
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { YogaAboutUsWithBoxesComponent } from './yoga-about-us-with-boxes-compon
|
|||||||
import { YogaDiscountComponent } from './yoga-discount-component';
|
import { YogaDiscountComponent } from './yoga-discount-component';
|
||||||
import { YogaTextWithImageComponent } from './yoga-text-with-image-component';
|
import { YogaTextWithImageComponent } from './yoga-text-with-image-component';
|
||||||
import { YogaAchivementsComponent } from './yoga-achivements-component';
|
import { YogaAchivementsComponent } from './yoga-achivements-component';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
import { HeaderB_Plain } from '../components/yoga-site/HeaderB';
|
import { HeaderB_Plain } from '../components/yoga-site/HeaderB';
|
||||||
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
||||||
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
@@ -16,6 +17,7 @@ import { YogaAboutUsWithBoxesComponent_Plain } from './yoga-about-us-with-boxes-
|
|||||||
import { YogaDiscountComponent_Plain } from './yoga-discount-component';
|
import { YogaDiscountComponent_Plain } from './yoga-discount-component';
|
||||||
import { YogaTextWithImageComponent_Plain } from './yoga-text-with-image-component';
|
import { YogaTextWithImageComponent_Plain } from './yoga-text-with-image-component';
|
||||||
import { YogaAchivementsComponent_Plain } from './yoga-achivements-component';
|
import { YogaAchivementsComponent_Plain } from './yoga-achivements-component';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
import { HeaderB_NoRelations } from '../components/yoga-site/HeaderB';
|
import { HeaderB_NoRelations } from '../components/yoga-site/HeaderB';
|
||||||
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
@@ -31,6 +33,7 @@ export interface About {
|
|||||||
ourMission?: { data: YogaTextWithImageComponent };
|
ourMission?: { data: YogaTextWithImageComponent };
|
||||||
ourVision?: { data: YogaTextWithImageComponent };
|
ourVision?: { data: YogaTextWithImageComponent };
|
||||||
achievements?: { data: YogaAchivementsComponent };
|
achievements?: { data: YogaAchivementsComponent };
|
||||||
|
common?: { data: YogaCommon };
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: { data: About[] };
|
localizations?: { data: About[] };
|
||||||
};
|
};
|
||||||
@@ -46,6 +49,7 @@ export interface About_Plain {
|
|||||||
ourMission?: YogaTextWithImageComponent_Plain;
|
ourMission?: YogaTextWithImageComponent_Plain;
|
||||||
ourVision?: YogaTextWithImageComponent_Plain;
|
ourVision?: YogaTextWithImageComponent_Plain;
|
||||||
achievements?: YogaAchivementsComponent_Plain;
|
achievements?: YogaAchivementsComponent_Plain;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: About_Plain[];
|
localizations?: About_Plain[];
|
||||||
}
|
}
|
||||||
@@ -61,6 +65,7 @@ export interface About_NoRelations {
|
|||||||
ourMission?: number;
|
ourMission?: number;
|
||||||
ourVision?: number;
|
ourVision?: number;
|
||||||
achievements?: number;
|
achievements?: number;
|
||||||
|
common?: number;
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: About[];
|
localizations?: About[];
|
||||||
}
|
}
|
||||||
@@ -76,6 +81,7 @@ export interface About_AdminPanelLifeCycle {
|
|||||||
ourMission?: AdminPanelRelationPropertyModification<YogaTextWithImageComponent_Plain>;
|
ourMission?: AdminPanelRelationPropertyModification<YogaTextWithImageComponent_Plain>;
|
||||||
ourVision?: AdminPanelRelationPropertyModification<YogaTextWithImageComponent_Plain>;
|
ourVision?: AdminPanelRelationPropertyModification<YogaTextWithImageComponent_Plain>;
|
||||||
achievements?: AdminPanelRelationPropertyModification<YogaAchivementsComponent_Plain>;
|
achievements?: AdminPanelRelationPropertyModification<YogaAchivementsComponent_Plain>;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: About[];
|
localizations?: About[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export interface Article {
|
|||||||
cover?: { data: Media };
|
cover?: { data: Media };
|
||||||
author?: { data: Author };
|
author?: { data: Author };
|
||||||
category?: { data: Category };
|
category?: { data: Category };
|
||||||
blocks?: object;
|
blocks?: any;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface Article_Plain {
|
export interface Article_Plain {
|
||||||
@@ -28,7 +28,7 @@ export interface Article_Plain {
|
|||||||
cover?: Media_Plain;
|
cover?: Media_Plain;
|
||||||
author?: Author_Plain;
|
author?: Author_Plain;
|
||||||
category?: Category_Plain;
|
category?: Category_Plain;
|
||||||
blocks?: object;
|
blocks?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Article_NoRelations {
|
export interface Article_NoRelations {
|
||||||
@@ -39,7 +39,7 @@ export interface Article_NoRelations {
|
|||||||
cover?: number;
|
cover?: number;
|
||||||
author?: number;
|
author?: number;
|
||||||
category?: number;
|
category?: number;
|
||||||
blocks?: object;
|
blocks?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Article_AdminPanelLifeCycle {
|
export interface Article_AdminPanelLifeCycle {
|
||||||
@@ -50,5 +50,5 @@ export interface Article_AdminPanelLifeCycle {
|
|||||||
cover?: AdminPanelRelationPropertyModification<Media_Plain>;
|
cover?: AdminPanelRelationPropertyModification<Media_Plain>;
|
||||||
author?: AdminPanelRelationPropertyModification<Author_Plain>;
|
author?: AdminPanelRelationPropertyModification<Author_Plain>;
|
||||||
category?: AdminPanelRelationPropertyModification<Category_Plain>;
|
category?: AdminPanelRelationPropertyModification<Category_Plain>;
|
||||||
blocks?: object;
|
blocks?: any;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,10 +4,12 @@ import { YogaContactUs } from './yoga-contact-us';
|
|||||||
import { YogaGoogleMapsComponent } from './yoga-google-maps-component';
|
import { YogaGoogleMapsComponent } from './yoga-google-maps-component';
|
||||||
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter } from './yoga-footer';
|
import { YogaFooter } from './yoga-footer';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
import { YogaContactUs_Plain } from './yoga-contact-us';
|
import { YogaContactUs_Plain } from './yoga-contact-us';
|
||||||
import { YogaGoogleMapsComponent_Plain } from './yoga-google-maps-component';
|
import { YogaGoogleMapsComponent_Plain } from './yoga-google-maps-component';
|
||||||
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter_Plain } from './yoga-footer';
|
import { YogaFooter_Plain } from './yoga-footer';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
export interface ContactPage {
|
export interface ContactPage {
|
||||||
@@ -19,6 +21,7 @@ export interface ContactPage {
|
|||||||
google_maps?: { data: YogaGoogleMapsComponent };
|
google_maps?: { data: YogaGoogleMapsComponent };
|
||||||
subscribe?: { data: YogaSubscribeNowComponent };
|
subscribe?: { data: YogaSubscribeNowComponent };
|
||||||
footer?: { data: YogaFooter };
|
footer?: { data: YogaFooter };
|
||||||
|
common?: { data: YogaCommon };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface ContactPage_Plain {
|
export interface ContactPage_Plain {
|
||||||
@@ -29,6 +32,7 @@ export interface ContactPage_Plain {
|
|||||||
google_maps?: YogaGoogleMapsComponent_Plain;
|
google_maps?: YogaGoogleMapsComponent_Plain;
|
||||||
subscribe?: YogaSubscribeNowComponent_Plain;
|
subscribe?: YogaSubscribeNowComponent_Plain;
|
||||||
footer?: YogaFooter_Plain;
|
footer?: YogaFooter_Plain;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ContactPage_NoRelations {
|
export interface ContactPage_NoRelations {
|
||||||
@@ -39,6 +43,7 @@ export interface ContactPage_NoRelations {
|
|||||||
google_maps?: number;
|
google_maps?: number;
|
||||||
subscribe?: number;
|
subscribe?: number;
|
||||||
footer?: number;
|
footer?: number;
|
||||||
|
common?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ContactPage_AdminPanelLifeCycle {
|
export interface ContactPage_AdminPanelLifeCycle {
|
||||||
@@ -49,4 +54,5 @@ export interface ContactPage_AdminPanelLifeCycle {
|
|||||||
google_maps?: AdminPanelRelationPropertyModification<YogaGoogleMapsComponent_Plain>;
|
google_maps?: AdminPanelRelationPropertyModification<YogaGoogleMapsComponent_Plain>;
|
||||||
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
||||||
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ import { YogaAchivementsComponent } from './yoga-achivements-component';
|
|||||||
import { YogaBlogPostsComponent } from './yoga-blog-posts-component';
|
import { YogaBlogPostsComponent } from './yoga-blog-posts-component';
|
||||||
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter } from './yoga-footer';
|
import { YogaFooter } from './yoga-footer';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
import { YogaFaqComponent_Plain } from './yoga-faq-component';
|
import { YogaFaqComponent_Plain } from './yoga-faq-component';
|
||||||
import { YogaAchivementsComponent_Plain } from './yoga-achivements-component';
|
import { YogaAchivementsComponent_Plain } from './yoga-achivements-component';
|
||||||
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
||||||
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter_Plain } from './yoga-footer';
|
import { YogaFooter_Plain } from './yoga-footer';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
export interface FaqPage {
|
export interface FaqPage {
|
||||||
@@ -22,6 +24,7 @@ export interface FaqPage {
|
|||||||
blogs?: { data: YogaBlogPostsComponent };
|
blogs?: { data: YogaBlogPostsComponent };
|
||||||
subscribe?: { data: YogaSubscribeNowComponent };
|
subscribe?: { data: YogaSubscribeNowComponent };
|
||||||
footer?: { data: YogaFooter };
|
footer?: { data: YogaFooter };
|
||||||
|
common?: { data: YogaCommon };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface FaqPage_Plain {
|
export interface FaqPage_Plain {
|
||||||
@@ -33,6 +36,7 @@ export interface FaqPage_Plain {
|
|||||||
blogs?: YogaBlogPostsComponent_Plain;
|
blogs?: YogaBlogPostsComponent_Plain;
|
||||||
subscribe?: YogaSubscribeNowComponent_Plain;
|
subscribe?: YogaSubscribeNowComponent_Plain;
|
||||||
footer?: YogaFooter_Plain;
|
footer?: YogaFooter_Plain;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FaqPage_NoRelations {
|
export interface FaqPage_NoRelations {
|
||||||
@@ -44,6 +48,7 @@ export interface FaqPage_NoRelations {
|
|||||||
blogs?: number;
|
blogs?: number;
|
||||||
subscribe?: number;
|
subscribe?: number;
|
||||||
footer?: number;
|
footer?: number;
|
||||||
|
common?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FaqPage_AdminPanelLifeCycle {
|
export interface FaqPage_AdminPanelLifeCycle {
|
||||||
@@ -55,4 +60,5 @@ export interface FaqPage_AdminPanelLifeCycle {
|
|||||||
blogs?: AdminPanelRelationPropertyModification<YogaBlogPostsComponent_Plain>;
|
blogs?: AdminPanelRelationPropertyModification<YogaBlogPostsComponent_Plain>;
|
||||||
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
||||||
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export interface Global {
|
|||||||
favicon?: { data: Media };
|
favicon?: { data: Media };
|
||||||
siteDescription: string;
|
siteDescription: string;
|
||||||
defaultSeo?: Seo;
|
defaultSeo?: Seo;
|
||||||
|
logoImage?: { data: Media };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface Global_Plain {
|
export interface Global_Plain {
|
||||||
@@ -22,6 +23,7 @@ export interface Global_Plain {
|
|||||||
favicon?: Media_Plain;
|
favicon?: Media_Plain;
|
||||||
siteDescription: string;
|
siteDescription: string;
|
||||||
defaultSeo?: Seo_Plain;
|
defaultSeo?: Seo_Plain;
|
||||||
|
logoImage?: Media_Plain;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Global_NoRelations {
|
export interface Global_NoRelations {
|
||||||
@@ -30,6 +32,7 @@ export interface Global_NoRelations {
|
|||||||
favicon?: number;
|
favicon?: number;
|
||||||
siteDescription: string;
|
siteDescription: string;
|
||||||
defaultSeo?: Seo_NoRelations;
|
defaultSeo?: Seo_NoRelations;
|
||||||
|
logoImage?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Global_AdminPanelLifeCycle {
|
export interface Global_AdminPanelLifeCycle {
|
||||||
@@ -38,4 +41,5 @@ export interface Global_AdminPanelLifeCycle {
|
|||||||
favicon?: AdminPanelRelationPropertyModification<Media_Plain>;
|
favicon?: AdminPanelRelationPropertyModification<Media_Plain>;
|
||||||
siteDescription: string;
|
siteDescription: string;
|
||||||
defaultSeo?: Seo_Plain;
|
defaultSeo?: Seo_Plain;
|
||||||
|
logoImage?: AdminPanelRelationPropertyModification<Media_Plain>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { YogaBlogPostsComponent } from './yoga-blog-posts-component';
|
|||||||
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter } from './yoga-footer';
|
import { YogaFooter } from './yoga-footer';
|
||||||
import { YogaMainHeaderComponent } from './yoga-main-header-component';
|
import { YogaMainHeaderComponent } from './yoga-main-header-component';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
import { YogaOurServicesComponent_Plain } from './yoga-our-services-component';
|
import { YogaOurServicesComponent_Plain } from './yoga-our-services-component';
|
||||||
import { YogaAboutUsComponent_Plain } from './yoga-about-us-component';
|
import { YogaAboutUsComponent_Plain } from './yoga-about-us-component';
|
||||||
import { YogaSpecialitiesComponent_Plain } from './yoga-specialities-component';
|
import { YogaSpecialitiesComponent_Plain } from './yoga-specialities-component';
|
||||||
@@ -20,6 +21,7 @@ import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
|||||||
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter_Plain } from './yoga-footer';
|
import { YogaFooter_Plain } from './yoga-footer';
|
||||||
import { YogaMainHeaderComponent_Plain } from './yoga-main-header-component';
|
import { YogaMainHeaderComponent_Plain } from './yoga-main-header-component';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
export interface Home {
|
export interface Home {
|
||||||
@@ -35,6 +37,7 @@ export interface Home {
|
|||||||
subscribeNow?: { data: YogaSubscribeNowComponent };
|
subscribeNow?: { data: YogaSubscribeNowComponent };
|
||||||
footer?: { data: YogaFooter };
|
footer?: { data: YogaFooter };
|
||||||
header?: { data: YogaMainHeaderComponent };
|
header?: { data: YogaMainHeaderComponent };
|
||||||
|
common?: { data: YogaCommon };
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: { data: Home[] };
|
localizations?: { data: Home[] };
|
||||||
};
|
};
|
||||||
@@ -51,6 +54,7 @@ export interface Home_Plain {
|
|||||||
subscribeNow?: YogaSubscribeNowComponent_Plain;
|
subscribeNow?: YogaSubscribeNowComponent_Plain;
|
||||||
footer?: YogaFooter_Plain;
|
footer?: YogaFooter_Plain;
|
||||||
header?: YogaMainHeaderComponent_Plain;
|
header?: YogaMainHeaderComponent_Plain;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: Home_Plain[];
|
localizations?: Home_Plain[];
|
||||||
}
|
}
|
||||||
@@ -67,6 +71,7 @@ export interface Home_NoRelations {
|
|||||||
subscribeNow?: number;
|
subscribeNow?: number;
|
||||||
footer?: number;
|
footer?: number;
|
||||||
header?: number;
|
header?: number;
|
||||||
|
common?: number;
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: Home[];
|
localizations?: Home[];
|
||||||
}
|
}
|
||||||
@@ -83,6 +88,7 @@ export interface Home_AdminPanelLifeCycle {
|
|||||||
subscribeNow?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
subscribeNow?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
||||||
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
||||||
header?: AdminPanelRelationPropertyModification<YogaMainHeaderComponent_Plain>;
|
header?: AdminPanelRelationPropertyModification<YogaMainHeaderComponent_Plain>;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
locale: string;
|
locale: string;
|
||||||
localizations?: Home[];
|
localizations?: Home[];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,13 @@ import { YogaDiscountComponent } from './yoga-discount-component';
|
|||||||
import { YogaBlogPostsComponent } from './yoga-blog-posts-component';
|
import { YogaBlogPostsComponent } from './yoga-blog-posts-component';
|
||||||
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter } from './yoga-footer';
|
import { YogaFooter } from './yoga-footer';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
import { YogaPriceComponent_Plain } from './yoga-price-component';
|
import { YogaPriceComponent_Plain } from './yoga-price-component';
|
||||||
import { YogaDiscountComponent_Plain } from './yoga-discount-component';
|
import { YogaDiscountComponent_Plain } from './yoga-discount-component';
|
||||||
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
||||||
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter_Plain } from './yoga-footer';
|
import { YogaFooter_Plain } from './yoga-footer';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
export interface PricesPage {
|
export interface PricesPage {
|
||||||
@@ -22,6 +24,7 @@ export interface PricesPage {
|
|||||||
blogs?: { data: YogaBlogPostsComponent };
|
blogs?: { data: YogaBlogPostsComponent };
|
||||||
subscribe?: { data: YogaSubscribeNowComponent };
|
subscribe?: { data: YogaSubscribeNowComponent };
|
||||||
footer?: { data: YogaFooter };
|
footer?: { data: YogaFooter };
|
||||||
|
common?: { data: YogaCommon };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface PricesPage_Plain {
|
export interface PricesPage_Plain {
|
||||||
@@ -33,6 +36,7 @@ export interface PricesPage_Plain {
|
|||||||
blogs?: YogaBlogPostsComponent_Plain;
|
blogs?: YogaBlogPostsComponent_Plain;
|
||||||
subscribe?: YogaSubscribeNowComponent_Plain;
|
subscribe?: YogaSubscribeNowComponent_Plain;
|
||||||
footer?: YogaFooter_Plain;
|
footer?: YogaFooter_Plain;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PricesPage_NoRelations {
|
export interface PricesPage_NoRelations {
|
||||||
@@ -44,6 +48,7 @@ export interface PricesPage_NoRelations {
|
|||||||
blogs?: number;
|
blogs?: number;
|
||||||
subscribe?: number;
|
subscribe?: number;
|
||||||
footer?: number;
|
footer?: number;
|
||||||
|
common?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PricesPage_AdminPanelLifeCycle {
|
export interface PricesPage_AdminPanelLifeCycle {
|
||||||
@@ -55,4 +60,5 @@ export interface PricesPage_AdminPanelLifeCycle {
|
|||||||
blogs?: AdminPanelRelationPropertyModification<YogaBlogPostsComponent_Plain>;
|
blogs?: AdminPanelRelationPropertyModification<YogaBlogPostsComponent_Plain>;
|
||||||
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
||||||
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
// Interface automatically generated by schemas-to-ts
|
||||||
|
|
||||||
|
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
||||||
|
import { YogaFooter } from './yoga-footer';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
|
import { YogaSingleService } from './yoga-single-service';
|
||||||
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
|
import { YogaFooter_Plain } from './yoga-footer';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
|
import { YogaSingleService_Plain } from './yoga-single-service';
|
||||||
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
|
export interface ServiceListPage {
|
||||||
|
id: number;
|
||||||
|
attributes: {
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: { data: YogaSubscribeNowComponent };
|
||||||
|
footer?: { data: YogaFooter };
|
||||||
|
common?: { data: YogaCommon };
|
||||||
|
services: { data: YogaSingleService[] };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export interface ServiceListPage_Plain {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: YogaSubscribeNowComponent_Plain;
|
||||||
|
footer?: YogaFooter_Plain;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
|
services: YogaSingleService_Plain[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ServiceListPage_NoRelations {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: number;
|
||||||
|
footer?: number;
|
||||||
|
common?: number;
|
||||||
|
services: number[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ServiceListPage_AdminPanelLifeCycle {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
||||||
|
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
|
services: AdminPanelRelationPropertyModification<YogaSingleService_Plain>;
|
||||||
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
// Interface automatically generated by schemas-to-ts
|
||||||
|
|
||||||
|
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
||||||
|
import { YogaFooter } from './yoga-footer';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
|
import { YogaFooter_Plain } from './yoga-footer';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
|
export interface ServicePage {
|
||||||
|
id: number;
|
||||||
|
attributes: {
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: { data: YogaSubscribeNowComponent };
|
||||||
|
footer?: { data: YogaFooter };
|
||||||
|
common?: { data: YogaCommon };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export interface ServicePage_Plain {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: YogaSubscribeNowComponent_Plain;
|
||||||
|
footer?: YogaFooter_Plain;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ServicePage_NoRelations {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: number;
|
||||||
|
footer?: number;
|
||||||
|
common?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ServicePage_AdminPanelLifeCycle {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; header?: string;
|
||||||
|
description?: string;
|
||||||
|
subscribeNow?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
||||||
|
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ import { YogaCustomerFeedbackComponent } from './yoga-customer-feedback-componen
|
|||||||
import { YogaBlogPostsComponent } from './yoga-blog-posts-component';
|
import { YogaBlogPostsComponent } from './yoga-blog-posts-component';
|
||||||
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter } from './yoga-footer';
|
import { YogaFooter } from './yoga-footer';
|
||||||
|
import { YogaCommon } from './yoga-common';
|
||||||
import { YogaOurServicesComponent_Plain } from './yoga-our-services-component';
|
import { YogaOurServicesComponent_Plain } from './yoga-our-services-component';
|
||||||
import { YogaContactUs_Plain } from './yoga-contact-us';
|
import { YogaContactUs_Plain } from './yoga-contact-us';
|
||||||
import { YogaSpecialitiesComponent_Plain } from './yoga-specialities-component';
|
import { YogaSpecialitiesComponent_Plain } from './yoga-specialities-component';
|
||||||
@@ -14,6 +15,7 @@ import { YogaCustomerFeedbackComponent_Plain } from './yoga-customer-feedback-co
|
|||||||
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
import { YogaBlogPostsComponent_Plain } from './yoga-blog-posts-component';
|
||||||
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
import { YogaSubscribeNowComponent_Plain } from './yoga-subscribe-now-component';
|
||||||
import { YogaFooter_Plain } from './yoga-footer';
|
import { YogaFooter_Plain } from './yoga-footer';
|
||||||
|
import { YogaCommon_Plain } from './yoga-common';
|
||||||
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
export interface ServicesPage {
|
export interface ServicesPage {
|
||||||
@@ -29,6 +31,7 @@ export interface ServicesPage {
|
|||||||
subscribe?: { data: YogaSubscribeNowComponent };
|
subscribe?: { data: YogaSubscribeNowComponent };
|
||||||
footer?: { data: YogaFooter };
|
footer?: { data: YogaFooter };
|
||||||
title?: string;
|
title?: string;
|
||||||
|
common?: { data: YogaCommon };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface ServicesPage_Plain {
|
export interface ServicesPage_Plain {
|
||||||
@@ -43,6 +46,7 @@ export interface ServicesPage_Plain {
|
|||||||
subscribe?: YogaSubscribeNowComponent_Plain;
|
subscribe?: YogaSubscribeNowComponent_Plain;
|
||||||
footer?: YogaFooter_Plain;
|
footer?: YogaFooter_Plain;
|
||||||
title?: string;
|
title?: string;
|
||||||
|
common?: YogaCommon_Plain;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServicesPage_NoRelations {
|
export interface ServicesPage_NoRelations {
|
||||||
@@ -57,6 +61,7 @@ export interface ServicesPage_NoRelations {
|
|||||||
subscribe?: number;
|
subscribe?: number;
|
||||||
footer?: number;
|
footer?: number;
|
||||||
title?: string;
|
title?: string;
|
||||||
|
common?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServicesPage_AdminPanelLifeCycle {
|
export interface ServicesPage_AdminPanelLifeCycle {
|
||||||
@@ -71,4 +76,5 @@ export interface ServicesPage_AdminPanelLifeCycle {
|
|||||||
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
subscribe?: AdminPanelRelationPropertyModification<YogaSubscribeNowComponent_Plain>;
|
||||||
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
footer?: AdminPanelRelationPropertyModification<YogaFooter_Plain>;
|
||||||
title?: string;
|
title?: string;
|
||||||
|
common?: AdminPanelRelationPropertyModification<YogaCommon_Plain>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export interface YogaAchivement {
|
|||||||
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
||||||
image?: { data: Media };
|
image?: { data: Media };
|
||||||
name?: string;
|
name?: string;
|
||||||
|
description?: string;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface YogaAchivement_Plain {
|
export interface YogaAchivement_Plain {
|
||||||
@@ -17,6 +18,7 @@ export interface YogaAchivement_Plain {
|
|||||||
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
||||||
image?: Media_Plain;
|
image?: Media_Plain;
|
||||||
name?: string;
|
name?: string;
|
||||||
|
description?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface YogaAchivement_NoRelations {
|
export interface YogaAchivement_NoRelations {
|
||||||
@@ -24,6 +26,7 @@ export interface YogaAchivement_NoRelations {
|
|||||||
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
||||||
image?: number;
|
image?: number;
|
||||||
name?: string;
|
name?: string;
|
||||||
|
description?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface YogaAchivement_AdminPanelLifeCycle {
|
export interface YogaAchivement_AdminPanelLifeCycle {
|
||||||
@@ -31,4 +34,5 @@ export interface YogaAchivement_AdminPanelLifeCycle {
|
|||||||
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; title?: string;
|
||||||
image?: AdminPanelRelationPropertyModification<Media_Plain>;
|
image?: AdminPanelRelationPropertyModification<Media_Plain>;
|
||||||
name?: string;
|
name?: string;
|
||||||
|
description?: string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
// Interface automatically generated by schemas-to-ts
|
||||||
|
|
||||||
|
import { Media } from '../components/shared/Media';
|
||||||
|
import { Media_Plain } from '../components/shared/Media';
|
||||||
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
|
export interface YogaCommon {
|
||||||
|
id: number;
|
||||||
|
attributes: {
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; logoImage?: { data: Media };
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export interface YogaCommon_Plain {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; logoImage?: Media_Plain;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface YogaCommon_NoRelations {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; logoImage?: number;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface YogaCommon_AdminPanelLifeCycle {
|
||||||
|
id: number;
|
||||||
|
createdAt: Date; updatedAt: Date; publishedAt?: Date; logoImage?: AdminPanelRelationPropertyModification<Media_Plain>;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
// Interface automatically generated by schemas-to-ts
|
// Interface automatically generated by schemas-to-ts
|
||||||
|
|
||||||
import { Link } from '../components/yoga-site/Link';
|
import { Link } from '../components/yoga-site/Link';
|
||||||
|
import { Media } from '../components/shared/Media';
|
||||||
import { Link_Plain } from '../components/yoga-site/Link';
|
import { Link_Plain } from '../components/yoga-site/Link';
|
||||||
|
import { Media_Plain } from '../components/shared/Media';
|
||||||
import { Link_NoRelations } from '../components/yoga-site/Link';
|
import { Link_NoRelations } from '../components/yoga-site/Link';
|
||||||
|
import { AdminPanelRelationPropertyModification } from '../common/AdminPanelRelationPropertyModification';
|
||||||
|
|
||||||
export interface YogaFooter {
|
export interface YogaFooter {
|
||||||
id: number;
|
id: number;
|
||||||
@@ -17,6 +20,7 @@ export interface YogaFooter {
|
|||||||
contactUsLocation?: Link;
|
contactUsLocation?: Link;
|
||||||
copyRight?: string;
|
copyRight?: string;
|
||||||
name?: string;
|
name?: string;
|
||||||
|
logo?: { data: Media };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface YogaFooter_Plain {
|
export interface YogaFooter_Plain {
|
||||||
@@ -31,6 +35,7 @@ export interface YogaFooter_Plain {
|
|||||||
contactUsLocation?: Link_Plain;
|
contactUsLocation?: Link_Plain;
|
||||||
copyRight?: string;
|
copyRight?: string;
|
||||||
name?: string;
|
name?: string;
|
||||||
|
logo?: Media_Plain;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface YogaFooter_NoRelations {
|
export interface YogaFooter_NoRelations {
|
||||||
@@ -45,6 +50,7 @@ export interface YogaFooter_NoRelations {
|
|||||||
contactUsLocation?: Link_NoRelations;
|
contactUsLocation?: Link_NoRelations;
|
||||||
copyRight?: string;
|
copyRight?: string;
|
||||||
name?: string;
|
name?: string;
|
||||||
|
logo?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface YogaFooter_AdminPanelLifeCycle {
|
export interface YogaFooter_AdminPanelLifeCycle {
|
||||||
@@ -59,4 +65,5 @@ export interface YogaFooter_AdminPanelLifeCycle {
|
|||||||
contactUsLocation?: Link_Plain;
|
contactUsLocation?: Link_Plain;
|
||||||
copyRight?: string;
|
copyRight?: string;
|
||||||
name?: string;
|
name?: string;
|
||||||
|
logo?: AdminPanelRelationPropertyModification<Media_Plain>;
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user