From c76202a5cf5f1c502aa77e47823c0979f5a8bf58 Mon Sep 17 00:00:00 2001 From: MigBash <20924663+migbash@users.noreply.github.com> Date: Wed, 1 Feb 2023 12:10:36 +0000 Subject: [PATCH] Enhance/translations and wallet issues and other (#1030) * issue #1006 #1021 * `update` .github/deploy script * issue #1019 * `renaming` * `aesthetic` `doc` * `update` for `docker:dev` + `package.json` scripts * `update` with `main` * `update` settings.json * issue #951 * issue #951 * issue #951 * issue #951 `redundant` code * issue #951 * issue #1028 * issue #951 `styles` update * `deepsource` JS-0128 --- .github/workflows/deploy.yml | 4 +- .github/workflows/docker-image.yml | 2 +- .vscode/settings.json | 9 +- Dockerfile | 2 +- Dockerfile.dev | 2 +- Makefile | 2 +- Procfile | 1 + WEBSITE-DEV-README.md => README-DEV.md | 0 package.json | 21 +- my-server.js => server-docker.js | 34 +- server-heroku.js | 93 ++ .../components/_main_/auth/Auth_Widget.svelte | 951 +++++++++-------- .../standings/Standings-Loader.svelte | 230 ++++ .../standings/Standings-Team-Row.svelte | 378 +++++++ .../standings/Standings-Widget.svelte | 994 ++++++++++++++++++ .../standings/assets/arrow-down.svg | 3 + .../standings/assets/arrow-up.svg | 3 + .../assets/no_featured_match_visual.svg | 5 + .../assets/no_featured_match_visual_dark.svg | 5 + .../standings/assets/no_visual.svg | 11 + .../standings/assets/no_visual_dark.svg | 11 + .../standings/assets/slider-left-dark.svg | 3 + .../standings/assets/slider-left.svg | 3 + .../standings/assets/slider-right-dark.svg | 3 + .../standings/assets/slider-right.svg | 3 + .../standings/assets/team-white.svg | 8 + .../fixtures_page/standings/assets/team.svg | 8 + .../loaders/desktop/Loader-Bottom.svelte | 17 + .../loaders/desktop/Loader-Head.svelte | 17 + .../loaders/desktop/Loader-Row-Left.svelte | 17 + .../loaders/desktop/Loader-Row-Right.svelte | 24 + .../loaders/desktop/Loader-ViewSel.svelte | 16 + .../loaders/mobile/Loader-Bottom.svelte | 17 + .../loaders/mobile/Loader-Head.svelte | 17 + .../loaders/mobile/Loader-Row-Left-M.svelte | 15 + .../loaders/mobile/Loader-Row-Right-M.svelte | 20 + .../loaders/mobile/Loader-Table-View.svelte | 17 + .../mobile/Loader-ViewSel-Right.svelte | 14 + .../loaders/mobile/Loader-ViewSel.svelte | 24 + src/lib/graphql/_main_/auth/query.ts | 33 + src/lib/models/_main_/auth/types.ts | 27 + src/lib/models/fixtures/scoreboard/types.ts | 1 + src/lib/models/hasura.ts | 29 + .../[sport]/[fixture=fixture]/+page.svelte | 103 +- .../[sport]/[fixture=fixture]/+page.ts | 37 +- .../[sport]/[fixture=fixture]/+page.svelte | 103 +- src/routes/[sport]/[fixture=fixture]/+page.ts | 37 +- src/routes/api/hasura/_main_/auth/+server.ts | 86 ++ .../api/hasura/fixtures/scoreboard/+server.ts | 1 + tsconfig.json | 2 +- 50 files changed, 2881 insertions(+), 582 deletions(-) create mode 100644 Procfile rename WEBSITE-DEV-README.md => README-DEV.md (100%) rename my-server.js => server-docker.js (68%) create mode 100644 server-heroku.js create mode 100644 src/lib/components/fixtures_page/standings/Standings-Loader.svelte create mode 100644 src/lib/components/fixtures_page/standings/Standings-Team-Row.svelte create mode 100644 src/lib/components/fixtures_page/standings/Standings-Widget.svelte create mode 100644 src/lib/components/fixtures_page/standings/assets/arrow-down.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/arrow-up.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/no_featured_match_visual.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/no_featured_match_visual_dark.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/no_visual.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/no_visual_dark.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/slider-left-dark.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/slider-left.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/slider-right-dark.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/slider-right.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/team-white.svg create mode 100644 src/lib/components/fixtures_page/standings/assets/team.svg create mode 100644 src/lib/components/fixtures_page/standings/loaders/desktop/Loader-Bottom.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/desktop/Loader-Head.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/desktop/Loader-Row-Left.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/desktop/Loader-Row-Right.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/desktop/Loader-ViewSel.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/mobile/Loader-Bottom.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/mobile/Loader-Head.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/mobile/Loader-Row-Left-M.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/mobile/Loader-Row-Right-M.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/mobile/Loader-Table-View.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/mobile/Loader-ViewSel-Right.svelte create mode 100644 src/lib/components/fixtures_page/standings/loaders/mobile/Loader-ViewSel.svelte create mode 100644 src/lib/graphql/_main_/auth/query.ts create mode 100644 src/lib/models/_main_/auth/types.ts create mode 100644 src/routes/api/hasura/_main_/auth/+server.ts diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 924234705..3eb7c931d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -31,6 +31,6 @@ jobs: # [ℹ] Navigate to target project directory cd web/scores # [ℹ] Update the directory with latests changes - git pull origin enhance/feature-docker-deploy + git pull origin main # [ℹ] Run target makefile command - make update-scores-web + make update-scores-web \ No newline at end of file diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 7b3b723bb..717f8cb15 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -38,4 +38,4 @@ jobs: - name: Build the Docker image run: | docker build . --file Dockerfile --tag my-image-name:$(date +%s) - # run: docker build --no-cache --progress=plain --tag scores-platform:$(date +%s) . + # run: docker build --no-cache --progress=plain --tag scores-platform:$(date +%s) . \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 14ac0e1d9..0f58ae0e4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,12 @@ { - // https://stackoverflow.com/questions/64365300/how-can-i-remove-unused-imports-declarations-from-the-entire-project-of-react-ty - // https://stackoverflow.com/questions/46722701/is-there-a-way-to-remove-unused-imports-and-declarations-from-angular-2 + // DOC: https://stackoverflow.com/questions/64365300/how-can-i-remove-unused-imports-declarations-from-the-entire-project-of-react-ty + // DOC: https://stackoverflow.com/questions/46722701/is-there-a-way-to-remove-unused-imports-and-declarations-from-angular-2 "editor.codeActionsOnSave": { "source.fixAll": true, - "source.organizeImports": true, - "source.sortMembers": true + "source.organizeImports": true, + "source.sortMembers": true }, + // NOTE: custom highlighter for data "todohighlight.keywords": [ { "text": "NOTE:", diff --git a/Dockerfile b/Dockerfile index f951f0eeb..d7cec60f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,4 +31,4 @@ COPY . . EXPOSE 5055 # CMD ["node", "./build"] -CMD ["npm", "start"] \ No newline at end of file +CMD ["npm", "run", "start:docker"] \ No newline at end of file diff --git a/Dockerfile.dev b/Dockerfile.dev index bcf5b397d..9bb063794 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -26,4 +26,4 @@ EXPOSE 5055 EXPOSE 24678 # CMD ["node", "./build"] -CMD ["npm", "run", "dev-docker"] \ No newline at end of file +CMD ["npm", "run", "dev:docker"] \ No newline at end of file diff --git a/Makefile b/Makefile index 3cc79c4b6..8f3961bc6 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ log-listen: update-scores-web: echo 'Updating PROD Scores Web container...' - git pull origin enhance/feature-docker-deploy + git pull origin main -docker rm $$(docker stop $$(docker ps -a -q --filter="name=scores_scores_web_1" --format="{{.ID}}")) -docker rmi $$(docker images -q scores_web) -docker rmi $$(docker images --filter "dangling=true" -q --no-trunc) diff --git a/Procfile b/Procfile new file mode 100644 index 000000000..d0b35ca42 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: npm run start:heroku \ No newline at end of file diff --git a/WEBSITE-DEV-README.md b/README-DEV.md similarity index 100% rename from WEBSITE-DEV-README.md rename to README-DEV.md diff --git a/package.json b/package.json index 7fbcb38f7..2d4258c5a 100644 --- a/package.json +++ b/package.json @@ -7,20 +7,21 @@ "node": "16.17.0" }, "scripts": { + "check": "svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", + "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. .", "debug": "cross-env NODE_OPTIONS='--inspect' vite dev --host --port 3050", - "debug-preview": "cross-env NODE_OPTIONS='--inspect' vite preview --host --port 5000", - "debug-bull": "cross-env NODE_DEBUG='bull' vite preview --host --port 5000", + "debug:bull": "cross-env NODE_DEBUG='bull' vite preview --host --port 5000", + "debug:preview": "cross-env NODE_OPTIONS='--inspect' vite preview --host --port 5000", "dev": "vite dev --host --port 3050", - "dev-docker": "vite dev --host --port 5055", - "docker-dev-up": "docker-compose -f docker-compose.dev.yml up", - "build": "vite build", + "dev:docker": "vite dev --host --port 5055", + "dev:docker:up": "docker-compose -f docker-compose.dev.yml up", "staging": "npm run dev -- --mode staging", - "start": "node my-server.js", + "build": "vite build", "preview": "vite preview --host --port 5000", - "check": "svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .", - "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ." + "start:docker": "node server-docker.js", + "start:heroku": "node server-heroku.js" }, "devDependencies": { "@sveltejs/adapter-node": "1.0.0-next.88", diff --git a/my-server.js b/server-docker.js similarity index 68% rename from my-server.js rename to server-docker.js index 63ae796c9..1fdd9501f 100644 --- a/my-server.js +++ b/server-docker.js @@ -1,14 +1,14 @@ -// [ℹ] https://github.com/sveltejs/kit/tree/master/packages/adapter-node#custom-server -// [ℹ] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import +// DOC: https://github.com/sveltejs/kit/tree/master/packages/adapter-node#custom-server +// DOC: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import import express from 'express'; import http from 'http'; import https from 'https'; import { handler } from './build/handler.js'; -// import sslRedirect from 'heroku-ssl-redirect'; -import compression from 'compression'; // https://expressjs.com/en/resources/middleware/compression.html +// DOC: https://expressjs.com/en/resources/middleware/compression.html +import compression from 'compression'; import * as sslify from 'express-sslify'; -import * as requestIp from 'request-ip'; // https://www.npmjs.com/package/request-ip +// DOC: https://www.npmjs.com/package/request-ip import fs from 'fs'; @@ -20,24 +20,11 @@ const options = { const app = express(); -/** - * [ℹ] add a route that lives separately from the SvelteKit app -*/ -// app.get('/healthcheck', (req, res) => { -// res.end('ok'); -// }); - -/** - * [ℹ] enable ssl redirect - * [ℹ] https://www.npmjs.com/package/heroku-ssl-redirect - * => does not seem to be working -*/ -// app.use(sslRedirect()); - /** * [ℹ] separate from SvelteKit endpoint in attempts to * [ℹ] identify clients (IP - address) */ +/** app.get('/getClientIP', (req, res) => { const ip = req.headers['x-forwarded-for'] || @@ -69,6 +56,7 @@ app.get('/getClientIP', (req, res) => { res.end() }) +*/ /** * [ℹ] [FORCE] https-redirect @@ -97,14 +85,6 @@ app.use(compression()) */ app.use(handler); -/** - * [ℹ] initialize app; - * [ℹ] https://stackoverflow.com/questions/15693192/heroku-node-js-error-web-process-failed-to-bind-to-port-within-60-seconds-o -*/ -// app.listen(process.env.PORT, () => { -// console.log(`listening on port ${process.env.PORT}`); -// }); - // ~~~~~~~~~~~~~~~~~~~~~~ // APP SPIN-UP [PROD] [V2] // ~~~~~~~~~~~~~~~~~~~~~~ diff --git a/server-heroku.js b/server-heroku.js new file mode 100644 index 000000000..5d6b33038 --- /dev/null +++ b/server-heroku.js @@ -0,0 +1,93 @@ +// DOC: https://github.com/sveltejs/kit/tree/master/packages/adapter-node#custom-server +// DOC: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import + +import express from 'express'; +import { handler } from './build/handler.js'; +// import sslRedirect from 'heroku-ssl-redirect'; +// DOC: https://expressjs.com/en/resources/middleware/compression.html +import compression from 'compression'; +import * as sslify from 'express-sslify'; +// DOC: https://www.npmjs.com/package/request-ip + +const app = express(); + +/** + * [ℹ] enable ssl redirect + * DOC: https://www.npmjs.com/package/heroku-ssl-redirect + * => does not seem to be working +*/ +// app.use(sslRedirect()); + +/** + * [ℹ] separate from SvelteKit endpoint in attempts to + * [ℹ] identify clients (IP - address) +*/ +/** +app.get('/getClientIP', (req, res, next) => { + + const ip = req.headers['x-forwarded-for'] || + req.socket.remoteAddress || + null; + console.log('ip', ip); + + const ip2 = req.ip + console.log('ip2', ip2); + + const ip3 = requestIp.getClientIp(req); + console.log('ip3', ip3); + + let ipAddr = req.headers["x-forwarded-for"]; + if (ipAddr){ + const list = ipAddr.split(","); + ipAddr = list[list.length-1]; + } else { + ipAddr = req.connection.remoteAddress; + } + + console.log('ipAddr', ipAddr); + + res.json( + { + "ip": ip.toString().replace(/,/g, '') + } + ); + + res.end() +}) +*/ + +/** + * [ℹ] [FORCE] https-redirect + * DOC: https://jaketrent.com/post/https-redirect-node-heroku + * DOC: https://webdva.github.io/how-to-force-express-https-tutorial + * [HEROKU] +*/ +app.use((req, res, next) => { + if (req.header('x-forwarded-proto') !== 'https') + res.redirect(`https://${req.header('host')}${req.url}`); + else + next(); +}); + +/** + * DOC: https://www.npmjs.com/package/express-sslify + * DOC: https://stackoverflow.com/questions/51234023/heroku-nodejs-redirect-http-to-http +*/ +app.use(sslify.HTTPS({ trustProtoHeader: true })) + +// [ℹ] compress all responses +app.use(compression()) + +/** + * [ℹ] let SvelteKit handle everything else, + * [ℹ] including serving prerendered pages and static assets +*/ +app.use(handler); + +/** + * [ℹ] initialize app; + * DOC: https://stackoverflow.com/questions/15693192/heroku-node-js-error-web-process-failed-to-bind-to-port-within-60-seconds-o +*/ +app.listen(process.env.PORT || 5000, () => { + console.log('listening on port 5000'); +}); \ No newline at end of file diff --git a/src/lib/components/_main_/auth/Auth_Widget.svelte b/src/lib/components/_main_/auth/Auth_Widget.svelte index 5551bcc92..ba439b902 100644 --- a/src/lib/components/_main_/auth/Auth_Widget.svelte +++ b/src/lib/components/_main_/auth/Auth_Widget.svelte @@ -16,6 +16,8 @@ COMPONENT JS (w/ TS) import { signInWithMoralis } from '@moralisweb3/client-firebase-evm-auth'; import { fetchSignInMethodsForEmail, GithubAuthProvider, GoogleAuthProvider, isSignInWithEmailLink, sendSignInLinkToEmail, signInWithCustomToken, signInWithEmailLink, signInWithPopup, type User } from "firebase/auth"; + import { get } from '$lib/api/utils'; + import type { REDIS_CACHE_SINGLE_auth_translation } from '$lib/models/_main_/auth/types'; import discord_icon from './assets/discord.svg'; import email_verify from './assets/email-verify.svg'; import error_icon from './assets/error-alert.svg'; @@ -76,11 +78,30 @@ COMPONENT JS (w/ TS) // COMPONENT METHODS // ~~~~~~~~~~~~~~~~~~~~~ - /* - function close_widget() { - dispatch('close_widget'); - } - */ + // [ℹ] MAIN WIDGET METHOD + async function widget_init (): Promise < REDIS_CACHE_SINGLE_auth_translation > { + + let server_side_language: string = 'en'; + if ($page.routeId != null + && !$page.error + ) { + if ($page.routeId.includes("[lang=lang]")) { + server_side_language = $page.params.lang; + } + else { + server_side_language = 'en'; + } + } + else { + server_side_language = 'en'; + } + + const response_auth: REDIS_CACHE_SINGLE_auth_translation = + await get(`/api/hasura/_main_/auth?lang=${server_side_language}`) + ; + + return response_auth + } async function login_with_google () { // DOC: https://firebase.google.com/docs/auth/web/google-signin @@ -441,6 +462,7 @@ COMPONENT JS (w/ TS) email_error_format = false } + // [🐞] // $: if (browser) { // console.log(provider('isCoinbaseWallet')) // } @@ -496,9 +518,18 @@ COMPONENT JS (w/ TS) if (dev) console.log(`🟢 ${walletType} identified`) // DOC: https://stackoverflow.com/questions/69377437/metamask-conflicting-with-coinbase-wallet // DOC: https://stackoverflow.com/questions/72613011/whenever-i-click-on-connect-metamask-button-why-it-connects-the-coinbase-wallet + // DOC: https://stackoverflow.com/questions/68023651/how-to-connect-to-either-metamask-or-coinbase-wallet + // DOC: https://github.com/MetaMask/metamask-extension/issues/13622 // NOTE: conflicting use of CoinBaseWallet & MetaMask // NOTE: setting MetaMask as main wallet - target_wallet.request({ method: 'eth_requestAccounts' }); + // NOTE: IMPORTANT causes issues with FireFox + // target_wallet.request({ method: 'eth_requestAccounts' }); + // NOTE: Not working + // window.ethereum.setSelectedProvider(target_wallet); + // window.ethereum.request({ + // method: 'wallet_requestPermissions', + // params: [{ eth_accounts: {}}] + // }); return [true, target_wallet] } else { @@ -569,192 +600,292 @@ COMPONENT JS (w/ TS) COMPONENT HTML =================--> - -{#if $sessionStore.auth_show} -
- Success! User - {#if auth_type == 'login'} - logged in - {:else} - signed up + {/if} + + + {#if success_auth} +
+ {#if auth_type == 'login'} + {WIDGET_LAZY_LOAD_DATA?.success_msg[0]} + {:else} + {WIDGET_LAZY_LOAD_DATA?.success_msg[1]} + {/if} +
++ {WIDGET_LAZY_LOAD_DATA?.err_msg[0]} +
++ Processing +
+- Uh-oh! There has been an error -
-- Processing + w-500 + color-black-2 + " + style="font-size: 20px;"> + {WIDGET_LAZY_LOAD_DATA?.verification} +
+ ++ {WIDGET_LAZY_LOAD_DATA?.verify_email} +
+ + + +
+ {WIDGET_LAZY_LOAD_DATA?.email_verify_sent[0]}
+
+
+ {email_input}
+
+
+ {WIDGET_LAZY_LOAD_DATA?.email_verify_sent[1]}
+
window.open('mailto:')}> + {WIDGET_LAZY_LOAD_DATA?.inbox} +
+ ++ {WIDGET_LAZY_LOAD_DATA?.no_email_verify[0]} + login_with_email_link()}> + {WIDGET_LAZY_LOAD_DATA?.no_email_verify[1]} +
- Verification -
- -- Please verify your email -
- - - -
- An email has been sent to
-
-
- {email_input}
-
-
- Please verify your email to continue.
-
window.open('mailto:')}> - Go to my inbox -
- -
- Did not get the email?
-
+ {#if email_sent_process}
+
+ Check your email
+
+ Please follow the link in your email
+
+ An email has been sent to
+ login_with_email_link()}>
- Resend email
-
-
+ Did not get the email?
+ login_with_email_link()}>
+ Resend email
+
+
+ {countD_min}:{countD_sec} to resend option
+
- Check your email
-
- Please follow the link in your email
-
- An email has been sent to
- window.open('mailto:')}>
- Go to my inbox
+ color-grey
+ ">
+ {#if auth_type == 'login'}
+ {WIDGET_LAZY_LOAD_DATA?.email_msg[0]}
+ {:else}
+ {WIDGET_LAZY_LOAD_DATA?.email_msg[1]}
+ {/if}
- Did not get the email?
- login_with_email_link()}>
+
+ wrong_email_format()}
+ autocomplete="off"
+ class:error-email={email_error_format}
+ required
+ />
+
+ {#if email_error_format}
+
+ {WIDGET_LAZY_LOAD_DATA?.err_msg[1]}
+
- {countD_min}:{countD_sec} to resend option
-
+
+ {email_input}
+
+
+ Please follow the link in your email to login.
+
-
- {email_input}
-
-
- Please follow the link in your email to login.
+ id="auth-head"
+ class="
+ color-black-2
+ w-500
+ ">
+ {#if auth_type == 'login'}
+ {WIDGET_LAZY_LOAD_DATA?.login}
+ {:else}
+ {WIDGET_LAZY_LOAD_DATA?.sign_up}
+ {/if}
- {#if auth_type == 'login'} - Login - {:else} - Sign Up - {/if} -
+ w-500 + "> + {WIDGET_LAZY_LOAD_DATA?.email_continue} + + + - -- {#if auth_type == 'login'} - Enter your email address to login - {:else} - Enter your email address to sign up - {/if} -
- - -- Or -
- -{#if auth_type == 'login'} - Or login with your crypto wallet + {WIDGET_LAZY_LOAD_DATA?.no_account} + auth_type = 'register'}> + {WIDGET_LAZY_LOAD_DATA?.register} + {:else} - Or sign up with your crypto wallet + {WIDGET_LAZY_LOAD_DATA?.account_exists} + auth_type = 'login'}> + {WIDGET_LAZY_LOAD_DATA?.login} + {/if}
- -- {#if auth_type == 'login'} - Do not have an account? - auth_type = 'register'}> - Register - - {:else} - Already have an account? - auth_type = 'login'}> - Login - - {/if} -
- {/if} ++ {position} +
++ {team_name} +
++ {points} +
++ {games_played} +
++ {TEAM_DATA.won} +
++ {TEAM_DATA.draw} +
++ {TEAM_DATA.lost} +
++ {TEAM_DATA.gs} +
++ {TEAM_DATA.ga} +
+{team.team_name}
+ {/each} + {:else} + {#each STANDINGS_DATA.seasons[0].group_standings as group} +{group.group_name}
+ {#each group.total as team} +{team.team_name}
+ {/each} + {/each} + {/if} + + {/if} + ++ {STANDINGS_T.no_data_t.no_info}
++ {STANDINGS_T.no_data_t.no_info_desc} +
++ {STANDINGS_T.translations.total} +
++ {STANDINGS_T.translations.home} +
++ {STANDINGS_T.translations.away} +
++ Form +
+
+ + # + + {STANDINGS_T.translations.team} + + |
+
+ {#if (mobileExclusive
+ && selectedOptTableMobile == 1)
+ || !mobileExclusive}
+
+
+ + {STANDINGS_T.translations.pts} + +
+
+ + {STANDINGS_T.translations.tooltips.pts.title} + ++ {STANDINGS_T.translations.tooltips.pts.description} + + |
+
+
+ + {STANDINGS_T.translations.pld} + +
+
+ + {STANDINGS_T.translations.tooltips.pld.title} + ++ {STANDINGS_T.translations.tooltips.pld.description} + + |
+
+
+ + {STANDINGS_T.translations.w} + +
+
+ + {STANDINGS_T.translations.tooltips.w.title} + ++ {STANDINGS_T.translations.tooltips.w.description} + + |
+
+
+ + {STANDINGS_T.translations.d} + +
+
+ + {STANDINGS_T.translations.tooltips.d.title} + ++ {STANDINGS_T.translations.tooltips.d.description} + + |
+
+
+ + {STANDINGS_T.translations.l} + +
+
+ + {STANDINGS_T.translations.tooltips.l.title} + ++ {STANDINGS_T.translations.tooltips.l.description} + + |
+
+
+ + {STANDINGS_T.translations.gf} + +
+
+ + {STANDINGS_T.translations.tooltips.gf.title} + ++ {STANDINGS_T.translations.tooltips.gf.description} + + |
+
+
+ + {STANDINGS_T.translations.ga} + +
+
+ + {STANDINGS_T.translations.tooltips.ga.title} + ++ {STANDINGS_T.translations.tooltips.ga.description} + + |
+ {/if}
+
+ {#if (mobileExclusive
+ && selectedOptTableMobile == 2)
+ || !mobileExclusive}
+
+
+ + {STANDINGS_T.translations.recent_form} + + |
+ {/if}
+ |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+
+ + {STANDINGS_T?.translations?.group} + {group.group_name.split(' ')[1]} + + |
+ |||||||||||||||||||
+ + | +
toggle_full_list()}> + {#if !showMore} + See the full standings + {:else} + Show less + {/if} +
+