Compare commits
97
Commits
0.3.0
...
3e2cdddd5a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3e2cdddd5a | ||
|
|
1d4c3e51c7 | ||
|
|
1694c71528 | ||
|
|
169ffc1b0b | ||
|
|
89eb3259d4 | ||
|
|
6c2d13bd17 | ||
|
|
8d92a75ef0 | ||
|
|
acb86ae266 | ||
|
|
4debab2636 | ||
|
|
e91e197873 | ||
|
|
b30b6734a1 | ||
|
|
dadb80608a | ||
|
|
16c9969fb9 | ||
|
|
dc1644ed25 | ||
|
|
2cc9b3e1ed | ||
|
|
415f340a68 | ||
|
|
2d4869128d | ||
|
|
ae8bc01d9b | ||
|
|
e2552d9442 | ||
|
|
5d1b5d80b6 | ||
|
|
366804aa29 | ||
|
|
9240e0c903 | ||
|
|
7baaf2cff3 | ||
|
|
9fbc1ba031 | ||
|
|
6704c07db0 | ||
|
|
a87165148a | ||
|
|
ec4bcd093b | ||
|
|
5552055b98 | ||
|
|
03aa67034d | ||
|
|
fc21427685 | ||
|
|
819b02a204 | ||
|
|
de0bd5fd57 | ||
|
|
8aa1d94a1a | ||
|
|
f8a59133a2 | ||
|
|
c382f770dc | ||
|
|
cde4ec13ef | ||
|
|
ecad1ea839 | ||
|
|
6b91b22713 | ||
|
|
e34c91b2cc | ||
|
|
822759a688 | ||
|
|
b606037890 | ||
|
|
74d9b94119 | ||
|
|
b1e9f955b0 | ||
|
|
e0356fa360 | ||
|
|
fbc67eeb98 | ||
|
|
09fd73b130 | ||
|
|
259a76f46b | ||
|
|
c6504c2eaf | ||
|
|
7d104a1514 | ||
|
|
b3bd61c89e | ||
|
|
e49dca0275 | ||
|
|
03125b3a2d | ||
|
|
a523379b3a | ||
|
|
aa6348a29a | ||
|
|
b9f0f1a69a | ||
|
|
a284806d3c | ||
|
|
7e10c1db65 | ||
|
|
11790638d6 | ||
|
|
0583cbe266 | ||
|
|
2e6874c822 | ||
|
|
2ce41990bf | ||
|
|
c8aeba38ba | ||
|
|
5e02502a5c | ||
|
|
382cc3d844 | ||
|
|
dd74d9ee89 | ||
|
|
383f82807f | ||
|
|
d4579a9a41 | ||
|
|
66a07c6a51 | ||
|
|
66ffd8e936 | ||
|
|
dccf7c6c8d | ||
|
|
64ade901de | ||
|
|
eb0dd3f781 | ||
|
|
66e6cd80d3 | ||
|
|
42851686ca | ||
|
|
e3943d868a | ||
|
|
7654b795c7 | ||
|
|
489244f1a9 | ||
|
|
cbcce336d6 | ||
|
|
52a96b2a4f | ||
|
|
ce6002a631 | ||
|
|
84a9cf069a | ||
|
|
83f19a7572 | ||
|
|
a1a4c8b56d | ||
|
|
d8901126d0 | ||
|
|
854db4ece8 | ||
|
|
07f2e65fc7 | ||
|
|
ccf09f97d5 | ||
|
|
8f9a4ebc04 | ||
|
|
f1833f13d5 | ||
|
|
6a81e369fa | ||
|
|
597e9e1ea9 | ||
|
|
9bb027ec4c | ||
|
|
fbbbaa5d49 | ||
|
|
aaec5a3fc9 | ||
|
|
6870a7f9b1 | ||
|
|
ace1a1b063 | ||
|
|
d87b879cc3 |
No files matched your search
+8
-7
@@ -1,10 +1,11 @@
|
|||||||
.vscode
|
|
||||||
.idea
|
|
||||||
node_modules
|
node_modules
|
||||||
dist
|
build
|
||||||
dist-ssr
|
|
||||||
public/env.js
|
|
||||||
/build
|
|
||||||
yarn.lock
|
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
yarn.lock
|
||||||
*.map
|
*.map
|
||||||
|
public/env.js
|
||||||
|
public/sw.js
|
||||||
|
public/index.html
|
||||||
|
public/workbox-*.js
|
||||||
|
svelte.config.js
|
||||||
|
public/index.html
|
||||||
Vendored
+13
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"2gua.rainbow-brackets",
|
||||||
|
"christian-kohler.npm-intellisense",
|
||||||
|
"remimarsal.prettier-now",
|
||||||
|
"svelte.svelte-vscode",
|
||||||
|
"lokalise.i18n-ally",
|
||||||
|
"fivethree.vscode-svelte-snippets"
|
||||||
|
],
|
||||||
|
"unwantedRecommendations": [
|
||||||
|
"antfu.i18n-ally"
|
||||||
|
]
|
||||||
|
}
|
||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"i18n-ally.localesPaths": "src/locales",
|
||||||
|
"i18n-ally.keystyle": "nested"
|
||||||
|
}
|
||||||
@@ -2,11 +2,65 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
|
#### [0.4.0](https://git.odit.services/lfk/frontend/compare/0.3.1...0.4.0)
|
||||||
|
|
||||||
|
- Merge commit 'a284806d3cb769030a4e28d0403190b746f8fc61' into dev [`#37`](https://git.odit.services/lfk/frontend/issues/37)
|
||||||
|
- ✨ AddRunnerModal [`66ffd8e`](https://git.odit.services/lfk/frontend/commit/66ffd8e936010960766e7f9021319d549e1d3e6b)
|
||||||
|
- ✨ RunnersOverview [`66a07c6`](https://git.odit.services/lfk/frontend/commit/66a07c6a51674a92d5e8459f250de2ab5ff6d902)
|
||||||
|
- ⚡ improved dev scripts for speed starts [`383f828`](https://git.odit.services/lfk/frontend/commit/383f82807f4090bdd2c3dcdc695b75093b854031)
|
||||||
|
- ✨ dynamic contact info in AddRunnerModal [`d4579a9`](https://git.odit.services/lfk/frontend/commit/d4579a9a410a27676e0ed0285bd124696153aae4)
|
||||||
|
- 🐞 fix cross-env logic for faster dev starts ⚡ [`2ce4199`](https://git.odit.services/lfk/frontend/commit/2ce41990bf9911db11eb556ce4c9aa3b3e5ca16c)
|
||||||
|
- 👩💻 developer configs/ recommendations for VSCode [`5e02502`](https://git.odit.services/lfk/frontend/commit/5e02502a5c2b8ebf798cbc21856b4425f8510041)
|
||||||
|
- ⚡ re-enable PWA functionality via serviceworker [`a284806`](https://git.odit.services/lfk/frontend/commit/a284806d3cb769030a4e28d0403190b746f8fc61)
|
||||||
|
- 🔨 cleaned up build process + Dockerfile [`7e10c1d`](https://git.odit.services/lfk/frontend/commit/7e10c1db659c21cd737b5d1e10bf3e61c4e0de94)
|
||||||
|
- 🔨 cleaned up build process + Dockerfile [`1179063`](https://git.odit.services/lfk/frontend/commit/11790638d68e8c43f91448bd0c35f910a3d9e446)
|
||||||
|
- ⚡ improved serviceworker + PWA logic [`0583cbe`](https://git.odit.services/lfk/frontend/commit/0583cbe2664f8832c5eaa7fb155b3e6deccb2ed3)
|
||||||
|
- apply new gitignore config [`2e6874c`](https://git.odit.services/lfk/frontend/commit/2e6874c822f2f8e9a8a7b74b4765631ba08f0255)
|
||||||
|
- ⚡ PWA optimizations [`dccf7c6`](https://git.odit.services/lfk/frontend/commit/dccf7c6c8de0da0f25ad77e20822fb4fbf68a61a)
|
||||||
|
- ⏫ general dependency bumps [`03125b3`](https://git.odit.services/lfk/frontend/commit/03125b3a2d0ad4b12cffdec98f27da14f3f45f77)
|
||||||
|
- 🐞 gitignore fix [`e49dca0`](https://git.odit.services/lfk/frontend/commit/e49dca02754aa57cbe464066f11505db4a9b5ca9)
|
||||||
|
- gitignore fix [`a523379`](https://git.odit.services/lfk/frontend/commit/a523379b3a5f7f3cffecca82c0c066167da046ca)
|
||||||
|
- fix package:dev script [`aa6348a`](https://git.odit.services/lfk/frontend/commit/aa6348a29a6e9ecb9789681b7195527c4eef19e4)
|
||||||
|
- new license file version [CI SKIP] [`382cc3d`](https://git.odit.services/lfk/frontend/commit/382cc3d844bf0af7c46492907f8a9a78fadc25d0)
|
||||||
|
- 🧹 gitignore changes in public/index.html & svelte.config.js [`dd74d9e`](https://git.odit.services/lfk/frontend/commit/dd74d9ee89b80c46ce3d3347a3c7cbe34373019c)
|
||||||
|
|
||||||
|
#### [0.3.1](https://git.odit.services/lfk/frontend/compare/0.3.0...0.3.1)
|
||||||
|
|
||||||
|
> 16 January 2021
|
||||||
|
|
||||||
|
- Merge pull request 'feature/16-org-management' (#35) from feature/16-org-management into dev [`#16`](https://git.odit.services/lfk/frontend/issues/16)
|
||||||
|
- 🏃♂️🏃♂️🏃♂️ basic UI components for team management [`d87b879`](https://git.odit.services/lfk/frontend/commit/d87b879cc3d6c771a8a9932409e39068e1b2acdb)
|
||||||
|
- ✨ TeamDetail with edit,delete [`ccf09f9`](https://git.odit.services/lfk/frontend/commit/ccf09f97d5fb476113f24a9559a48bccd75fd0a5)
|
||||||
|
- 🔒 ConfirmTeamDeletion in TeamsOverview [`cbcce33`](https://git.odit.services/lfk/frontend/commit/cbcce336d68b0752daeaf4b5608c43ff6fa11c0d)
|
||||||
|
- 🔒 ConfirmOrgDeletion in OrgDetail [`d890112`](https://git.odit.services/lfk/frontend/commit/d8901126d0cc91cabe3b94a30a83f36e6288126d)
|
||||||
|
- ✨ basic TeamsOverview [`597e9e1`](https://git.odit.services/lfk/frontend/commit/597e9e1ea9da7c73bdcb8ef1ae1a13dfa68ff5a3)
|
||||||
|
- ✨ UX - ConfirmOrgDeletion cancel event reflection in datatable [`84a9cf0`](https://git.odit.services/lfk/frontend/commit/84a9cf069a4aa0940eaacc87ea67e745deabe939)
|
||||||
|
- 🐞 fix Dashboard sidebar responsiveness [`6a81e36`](https://git.odit.services/lfk/frontend/commit/6a81e369fa20f0bb2846365a45f96e91e95fe2e7)
|
||||||
|
- 🧹 Dashboard - drop header bar [`f1833f1`](https://git.odit.services/lfk/frontend/commit/f1833f13d57595c23abf29bce1a2795cbb05a116)
|
||||||
|
- ✨ AddTeamModal working [`9bb027e`](https://git.odit.services/lfk/frontend/commit/9bb027ec4c73483907d396180f739dc3a11b2404)
|
||||||
|
- 🧹 TeamDetail cleanup [`7654b79`](https://git.odit.services/lfk/frontend/commit/7654b795c756ca198bad77068823032714408535)
|
||||||
|
- 🚀RELEASE v0.3.1 [`64ade90`](https://git.odit.services/lfk/frontend/commit/64ade901ded75fa738c713446343a209eca89ce6)
|
||||||
|
- 🤝 attribution/ credits for icons and illustrations [`eb0dd3f`](https://git.odit.services/lfk/frontend/commit/eb0dd3f781f739c6511588a8e153c14a39096025)
|
||||||
|
- 🔒 re-enable confirmation in OrgOverview [`ce6002a`](https://git.odit.services/lfk/frontend/commit/ce6002a631dd3c140f3892c750d052e89c135653)
|
||||||
|
- ✨ added new empty states [`66e6cd8`](https://git.odit.services/lfk/frontend/commit/66e6cd80d39ef18a29fd8ac80fbac929bd0c4f8c)
|
||||||
|
- Merge pull request 'feature/14-team-management' (#36) from feature/14-team-management into dev [`4285168`](https://git.odit.services/lfk/frontend/commit/42851686caae69e6672f48cd7df77ee4c2e49092)
|
||||||
|
- 🧹 TeamsOverview - formatting [`6870a7f`](https://git.odit.services/lfk/frontend/commit/6870a7f9b1fce2f06182dafa502f6dc4bb818bd3)
|
||||||
|
- 🔒 ConfirmOrgDeletion in OrgOverview [`83f19a7`](https://git.odit.services/lfk/frontend/commit/83f19a7572255b5c095c68d688a963dbe3cf4a75)
|
||||||
|
- 🧹 Team cleanups [`07f2e65`](https://git.odit.services/lfk/frontend/commit/07f2e65fc722c0328ee5a8dc4d01fc89c906fa86)
|
||||||
|
- 🔒 ConfirmTeamDeletion in TeamDetail [`489244f`](https://git.odit.services/lfk/frontend/commit/489244f1a9636b9807e751073443f1c767f7b8ca)
|
||||||
|
- 🐞 fix deletion in TeamDetail + TeamsOverview [`e3943d8`](https://git.odit.services/lfk/frontend/commit/e3943d868a6131ea561c4000159b77ff70a4af8b)
|
||||||
|
- 🐞 fix component mount in TeamsEmptyState [`ace1a1b`](https://git.odit.services/lfk/frontend/commit/ace1a1b06379d922df2593c3a7aec77d5f958512)
|
||||||
|
- new license file version [CI SKIP] [`aaec5a3`](https://git.odit.services/lfk/frontend/commit/aaec5a3fc94e13c6d29ea16ab110151aa6dc1156)
|
||||||
|
- 🧹 drop tmp modification from UsersOverview [`854db4e`](https://git.odit.services/lfk/frontend/commit/854db4ece8388a70b8a50c5b4c7ce9be974a2616)
|
||||||
|
|
||||||
#### [0.3.0](https://git.odit.services/lfk/frontend/compare/0.2.1...0.3.0)
|
#### [0.3.0](https://git.odit.services/lfk/frontend/compare/0.2.1...0.3.0)
|
||||||
|
|
||||||
|
> 15 January 2021
|
||||||
|
|
||||||
- Merge pull request 'feature/16-org-management' (#32) from feature/16-org-management into dev [`#16`](https://git.odit.services/lfk/frontend/issues/16)
|
- Merge pull request 'feature/16-org-management' (#32) from feature/16-org-management into dev [`#16`](https://git.odit.services/lfk/frontend/issues/16)
|
||||||
- Merge commit 'fcd657c10ea14290455cfb0bf2de89375a664143' into dev [`#31`](https://git.odit.services/lfk/frontend/issues/31)
|
- Merge commit 'fcd657c10ea14290455cfb0bf2de89375a664143' into dev [`#31`](https://git.odit.services/lfk/frontend/issues/31)
|
||||||
- ✨ added Org base components [`bdc0de6`](https://git.odit.services/lfk/frontend/commit/bdc0de6adab2db95e6075a993bd50317e9e36eb5)
|
- ✨ added Org base components [`bdc0de6`](https://git.odit.services/lfk/frontend/commit/bdc0de6adab2db95e6075a993bd50317e9e36eb5)
|
||||||
|
- 🚀RELEASE v0.3.0 [`7cd24cd`](https://git.odit.services/lfk/frontend/commit/7cd24cd51d52efff22f4ee0817f2d89f6efb35ed)
|
||||||
- 🏬 OrgDetail ui [`7a09869`](https://git.odit.services/lfk/frontend/commit/7a09869b0ca9d5dd38cf0c0010b71ab9ce6c6f40)
|
- 🏬 OrgDetail ui [`7a09869`](https://git.odit.services/lfk/frontend/commit/7a09869b0ca9d5dd38cf0c0010b71ab9ce6c6f40)
|
||||||
- 🏁 finish basic functionality of AddOrgModal + OrgDetail [`9324925`](https://git.odit.services/lfk/frontend/commit/93249258c6b0f34da22f0ed5d290b437d221a8fd)
|
- 🏁 finish basic functionality of AddOrgModal + OrgDetail [`9324925`](https://git.odit.services/lfk/frontend/commit/93249258c6b0f34da22f0ed5d290b437d221a8fd)
|
||||||
- ✨ basic functionality in OrgDetail [`0e2a10f`](https://git.odit.services/lfk/frontend/commit/0e2a10fe94075b3cda8ef3ebae6a6159a2e6bbf9)
|
- ✨ basic functionality in OrgDetail [`0e2a10f`](https://git.odit.services/lfk/frontend/commit/0e2a10fe94075b3cda8ef3ebae6a6159a2e6bbf9)
|
||||||
|
|||||||
+1
-3
@@ -3,15 +3,13 @@ WORKDIR /app
|
|||||||
RUN npm i -g pnpm
|
RUN npm i -g pnpm
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN pnpm i
|
RUN pnpm i
|
||||||
COPY package.json *.config.js workbox-config.js ./
|
COPY package.json *.config.js workbox-config.js template-copy.js index.template.html s-config.template.js ./
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
COPY public ./public
|
COPY public ./public
|
||||||
RUN pnpm run build:sw
|
|
||||||
RUN pnpm run build
|
RUN pnpm run build
|
||||||
# final image
|
# final image
|
||||||
FROM alpine
|
FROM alpine
|
||||||
COPY --from=0 /app/build /app
|
COPY --from=0 /app/build /app
|
||||||
RUN rm -rf build/sw.js.map build/workbox-*.js.map
|
|
||||||
RUN rm -rf /app/build/_dist_/components
|
RUN rm -rf /app/build/_dist_/components
|
||||||
RUN rm -rf /app/build/_dist_/locales
|
RUN rm -rf /app/build/_dist_/locales
|
||||||
RUN rm -rf /app/build-manifest.json
|
RUN rm -rf /app/build-manifest.json
|
||||||
|
|||||||
@@ -10,10 +10,11 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<meta name="description" content="Lauf Für Kaya! - Admin" />
|
<meta name="description" content="Lauf Für Kaya! - Admin" />
|
||||||
<title>Lauf für Kaya! - Admin</title>
|
<title>Lauf für Kaya! - Admin</title>
|
||||||
|
__TAILWIND_INSERT__
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.3.0-RELEASE_INFO</span>
|
<span style="display: none;visibility: hidden;" id="buildinfo">RELEASE_INFO-0.4.0-RELEASE_INFO</span>
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
<script src="/env.js"></script>
|
<script src="/env.js"></script>
|
||||||
<script defer type="module" src="/_dist_/index.js"></script>
|
<script defer type="module" src="/_dist_/index.js"></script>
|
||||||
+15
-10
@@ -1,16 +1,19 @@
|
|||||||
{
|
{
|
||||||
"name": "@odit/lfk-frontend",
|
"name": "@odit/lfk-frontend",
|
||||||
"version": "0.3.0",
|
"version": "0.4.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"i18n-order": "node order.js",
|
"i18n-order": "node order.js",
|
||||||
"dev": "snowpack dev",
|
"dev:all": "yarn prebuild && snowpack dev",
|
||||||
"build": "snowpack build",
|
"dev": "cross-env NODE_ENV_ODIT=development_fast node template-copy.js && yarn build:sw && snowpack dev",
|
||||||
|
"build": "yarn prebuild && snowpack build",
|
||||||
|
"prebuild": "cross-env NODE_ENV_ODIT=production node template-copy.js && yarn build:sw",
|
||||||
"build:sw": "workbox generateSW workbox-config.js",
|
"build:sw": "workbox generateSW workbox-config.js",
|
||||||
"release": "release-it",
|
"release": "release-it",
|
||||||
"licenses:export": "license-exporter --json -o public"
|
"licenses:export": "license-exporter --json -o public"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@odit/lfk-client-js": "0.0.12",
|
"@odit/lfk-client-js": "0.3.0",
|
||||||
|
"csvtojson": "^2.0.10",
|
||||||
"filepond": "4.25.1",
|
"filepond": "4.25.1",
|
||||||
"gridjs": "3.2.2",
|
"gridjs": "3.2.2",
|
||||||
"localforage": "1.9.0",
|
"localforage": "1.9.0",
|
||||||
@@ -19,21 +22,23 @@
|
|||||||
"svelte-focus-trap": "1.0.1",
|
"svelte-focus-trap": "1.0.1",
|
||||||
"svelte-i18n": "3.3.0",
|
"svelte-i18n": "3.3.0",
|
||||||
"tailwindcss": "2.0.2",
|
"tailwindcss": "2.0.2",
|
||||||
"tinro": "0.5.6",
|
"tinro": "0.5.8",
|
||||||
"toastify-js": "1.9.3",
|
"toastify-js": "1.9.3",
|
||||||
"validator": "13.5.2"
|
"validator": "13.5.2",
|
||||||
|
"xlsx": "^0.16.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@odit/license-exporter": "0.0.9",
|
"@odit/license-exporter": "0.0.9",
|
||||||
"@snowpack/plugin-svelte": "3.5.1",
|
"@snowpack/plugin-svelte": "3.5.2",
|
||||||
"auto-changelog": "^2.2.1",
|
"auto-changelog": "^2.2.1",
|
||||||
"autoprefixer": "10.2.1",
|
"autoprefixer": "10.2.3",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
"postcss": "8.2.4",
|
"postcss": "8.2.4",
|
||||||
"postcss-load-config": "3.0.0",
|
"postcss-load-config": "3.0.0",
|
||||||
"release-it": "^14.2.2",
|
"release-it": "^14.2.2",
|
||||||
"snowpack": "3.0.10",
|
"snowpack": "3.0.11",
|
||||||
"svelte": "3.31.2",
|
"svelte": "3.31.2",
|
||||||
"svelte-preprocess": "4.6.1",
|
"svelte-preprocess": "4.6.3",
|
||||||
"workbox-cli": "6.0.2"
|
"workbox-cli": "6.0.2"
|
||||||
},
|
},
|
||||||
"release-it": {
|
"release-it": {
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
[{"author":"ODIT.Services","repo":{"type":"git","url":"git+https://git.odit.services/lfk/lfk-client-js"},"description":"A lib to interact with https://git.odit.services/lfk/backend. Use this version for native JS applications.","name":"@odit/lfk-client-js","license":"CC-BY-NC-SA-4.0","version":"0.0.12","licensetext":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Creative\r\nCommons Corporation (\"Creative Commons\") is not a law firm and does not provide\r\nlegal services or legal advice. Distribution of Creative Commons public licenses\r\ndoes not create a lawyer-client or other relationship. Creative Commons makes\r\nits licenses and related information available on an \"as-is\" basis. Creative\r\nCommons gives no warranties regarding its licenses, any material licensed\r\nunder their terms and conditions, or any related information. Creative Commons\r\ndisclaims all liability for damages resulting from their use to the fullest\r\nextent possible.\r\n\r\nUsing Creative Commons Public Licenses\r\n\r\nCreative Commons public licenses provide a standard set of terms and conditions\r\nthat creators and other rights holders may use to share original works of\r\nauthorship and other material subject to copyright and certain other rights\r\nspecified in the public license below. The following considerations are for\r\ninformational purposes only, are not exhaustive, and do not form part of our\r\nlicenses.\r\n\r\nConsiderations for licensors: Our public licenses are intended for use by\r\nthose authorized to give the public permission to use material in ways otherwise\r\nrestricted by copyright and certain other rights. Our licenses are irrevocable.\r\nLicensors should read and understand the terms and conditions of the license\r\nthey choose before applying it. Licensors should also secure all rights necessary\r\nbefore applying our licenses so that the public can reuse the material as\r\nexpected. Licensors should clearly mark any material not subject to the license.\r\nThis includes other CC-licensed material, or material used under an exception\r\nor limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors\r\n\r\nConsiderations for the public: By using one of our public licenses, a licensor\r\ngrants the public permission to use the licensed material under specified\r\nterms and conditions. If the licensor's permission is not necessary for any\r\nreason–for example, because of any applicable exception or limitation to copyright–then\r\nthat use is not regulated by the license. Our licenses grant only permissions\r\nunder copyright and certain other rights that a licensor has authority to\r\ngrant. Use of the licensed material may still be restricted for other reasons,\r\nincluding because others have copyright or other rights in the material. A\r\nlicensor may make special requests, such as asking that all changes be marked\r\nor described. Although not required by our licenses, you are encouraged to\r\nrespect those requests where reasonable. More considerations for the public\r\n: wiki.creativecommons.org/Considerations_for_licensees\r\n\r\nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public\r\nLicense\r\n\r\nBy exercising the Licensed Rights (defined below), You accept and agree to\r\nbe bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike\r\n4.0 International Public License (\"Public License\"). To the extent this Public\r\nLicense may be interpreted as a contract, You are granted the Licensed Rights\r\nin consideration of Your acceptance of these terms and conditions, and the\r\nLicensor grants You such rights in consideration of benefits the Licensor\r\nreceives from making the Licensed Material available under these terms and\r\nconditions.\r\n\r\nSection 1 – Definitions.\r\n\r\na. Adapted Material means material subject to Copyright and Similar Rights\r\nthat is derived from or based upon the Licensed Material and in which the\r\nLicensed Material is translated, altered, arranged, transformed, or otherwise\r\nmodified in a manner requiring permission under the Copyright and Similar\r\nRights held by the Licensor. For purposes of this Public License, where the\r\nLicensed Material is a musical work, performance, or sound recording, Adapted\r\nMaterial is always produced where the Licensed Material is synched in timed\r\nrelation with a moving image.\r\n\r\nb. Adapter's License means the license You apply to Your Copyright and Similar\r\nRights in Your contributions to Adapted Material in accordance with the terms\r\nand conditions of this Public License.\r\n\r\nc. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses,\r\napproved by Creative Commons as essentially the equivalent of this Public\r\nLicense.\r\n\r\nd. Copyright and Similar Rights means copyright and/or similar rights closely\r\nrelated to coLine truncated
|
[{"author":"ODIT.Services","repo":{"type":"git","url":"git+https://git.odit.services/lfk/lfk-client-js"},"description":"A lib to interact with https://git.odit.services/lfk/backend. Use this version for native JS applications.","name":"@odit/lfk-client-js","license":"CC-BY-NC-SA-4.0","version":"0.3.0","licensetext":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Creative\r\nCommons Corporation (\"Creative Commons\") is not a law firm and does not provide\r\nlegal services or legal advice. Distribution of Creative Commons public licenses\r\ndoes not create a lawyer-client or other relationship. Creative Commons makes\r\nits licenses and related information available on an \"as-is\" basis. Creative\r\nCommons gives no warranties regarding its licenses, any material licensed\r\nunder their terms and conditions, or any related information. Creative Commons\r\ndisclaims all liability for damages resulting from their use to the fullest\r\nextent possible.\r\n\r\nUsing Creative Commons Public Licenses\r\n\r\nCreative Commons public licenses provide a standard set of terms and conditions\r\nthat creators and other rights holders may use to share original works of\r\nauthorship and other material subject to copyright and certain other rights\r\nspecified in the public license below. The following considerations are for\r\ninformational purposes only, are not exhaustive, and do not form part of our\r\nlicenses.\r\n\r\nConsiderations for licensors: Our public licenses are intended for use by\r\nthose authorized to give the public permission to use material in ways otherwise\r\nrestricted by copyright and certain other rights. Our licenses are irrevocable.\r\nLicensors should read and understand the terms and conditions of the license\r\nthey choose before applying it. Licensors should also secure all rights necessary\r\nbefore applying our licenses so that the public can reuse the material as\r\nexpected. Licensors should clearly mark any material not subject to the license.\r\nThis includes other CC-licensed material, or material used under an exception\r\nor limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors\r\n\r\nConsiderations for the public: By using one of our public licenses, a licensor\r\ngrants the public permission to use the licensed material under specified\r\nterms and conditions. If the licensor's permission is not necessary for any\r\nreason–for example, because of any applicable exception or limitation to copyright–then\r\nthat use is not regulated by the license. Our licenses grant only permissions\r\nunder copyright and certain other rights that a licensor has authority to\r\ngrant. Use of the licensed material may still be restricted for other reasons,\r\nincluding because others have copyright or other rights in the material. A\r\nlicensor may make special requests, such as asking that all changes be marked\r\nor described. Although not required by our licenses, you are encouraged to\r\nrespect those requests where reasonable. More considerations for the public\r\n: wiki.creativecommons.org/Considerations_for_licensees\r\n\r\nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public\r\nLicense\r\n\r\nBy exercising the Licensed Rights (defined below), You accept and agree to\r\nbe bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike\r\n4.0 International Public License (\"Public License\"). To the extent this Public\r\nLicense may be interpreted as a contract, You are granted the Licensed Rights\r\nin consideration of Your acceptance of these terms and conditions, and the\r\nLicensor grants You such rights in consideration of benefits the Licensor\r\nreceives from making the Licensed Material available under these terms and\r\nconditions.\r\n\r\nSection 1 – Definitions.\r\n\r\na. Adapted Material means material subject to Copyright and Similar Rights\r\nthat is derived from or based upon the Licensed Material and in which the\r\nLicensed Material is translated, altered, arranged, transformed, or otherwise\r\nmodified in a manner requiring permission under the Copyright and Similar\r\nRights held by the Licensor. For purposes of this Public License, where the\r\nLicensed Material is a musical work, performance, or sound recording, Adapted\r\nMaterial is always produced where the Licensed Material is synched in timed\r\nrelation with a moving image.\r\n\r\nb. Adapter's License means the license You apply to Your Copyright and Similar\r\nRights in Your contributions to Adapted Material in accordance with the terms\r\nand conditions of this Public License.\r\n\r\nc. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses,\r\napproved by Creative Commons as essentially the equivalent of this Public\r\nLicense.\r\n\r\nd. Copyright and Similar Rights means copyright and/or similar rights closely\r\nrelated to copLine truncated
|
||||||
@@ -1,11 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "Lauf für Kaya! - Admin",
|
"name": "Lauf für Kaya! - Admin",
|
||||||
"short_name": "LfK!Admin",
|
"short_name": "LfK!Admin",
|
||||||
"start_url": ".",
|
"start_url": "/?utm_source=pwa",
|
||||||
|
"orientation": "portrait-primary",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#fff",
|
"background_color": "#fff",
|
||||||
"theme_color": "#fff",
|
"theme_color": "#fff",
|
||||||
"description": "Lauf für Kaya! - Admin",
|
"description": "Lauf für Kaya! - Admin",
|
||||||
|
"shortcuts": [
|
||||||
|
{
|
||||||
|
"name": "Users",
|
||||||
|
"url": "/users/?utm_source=pwa"
|
||||||
|
}
|
||||||
|
],
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/favicon.png",
|
"src": "/favicon.png",
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return i[e]||(r=new Promise((async r=>{if("document"in self){const i=document.createElement("script");i.src=e,document.head.appendChild(i),i.onload=r}else importScripts(e),r()}))),r.then((()=>{if(!i[e])throw new Error(`Module ${e} didn’t register its module`);return i[e]}))},r=(r,i)=>{Promise.all(r.map(e)).then((e=>i(1===e.length?e[0]:e)))},i={require:Promise.resolve(r)};self.define=(r,s,o)=>{i[r]||(i[r]=Promise.resolve().then((()=>{let i={};const c={uri:location.origin+r.slice(1)};return Promise.all(s.map((r=>{switch(r){case"exports":return i;case"module":return c;default:return e(r)}}))).then((e=>{const r=o(...e);return i.default||(i.default=r),i}))})))}}define("./sw.js",["./workbox-c8ead010"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.precacheAndRoute([{url:"favicon.ico",revision:"ba44f340afba5bb1a07f14decc15dd04"},{url:"favicon.png",revision:"07a9941cec62319578fa2a1734db9959"},{url:"favicon.svg",revision:"689d6c6fda51e359c0e5725d9e905064"},{url:"index.html",revision:"931c34f3675364dcc09411aa0f223776"},{url:"logo.svg",revision:"4c9e31a1f4268d7e36e22cda7656e561"},{url:"manifest.webmanifest",revision:"75c93eb352c4877216e77b1d7f73445f"},{url:"robots.txt",revision:"61c27d2cd39a713f7829422c3d9edcc7"}],{})}));
|
|
||||||
//# sourceMappingURL=sw.js.map
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
define("./workbox-c8ead010.js",["exports"],(function(t){"use strict";try{self["workbox:core:6.0.2"]&&_()}catch(t){}const e=(t,...e)=>{let s=t;return e.length>0&&(s+=` :: ${JSON.stringify(e)}`),s};class s extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}try{self["workbox:routing:6.0.2"]&&_()}catch(t){}const n=t=>t&&"object"==typeof t?t:{handle:t};class i{constructor(t,e,s="GET"){this.handler=n(e),this.match=t,this.method=s}}class r extends i{constructor(t,e,s){super((({url:e})=>{const s=t.exec(e.href);if(s&&(e.origin===location.origin||0===s.index))return s.slice(1)}),e,s)}}class o{constructor(){this.t=new Map,this.i=new Map}get routes(){return this.t}addFetchListener(){self.addEventListener("fetch",(t=>{const{request:e}=t,s=this.handleRequest({request:e,event:t});s&&t.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,s=Promise.all(e.urlsToCache.map((e=>{"string"==typeof e&&(e=[e]);const s=new Request(...e);return this.handleRequest({request:s,event:t})})));t.waitUntil(s),t.ports&&t.ports[0]&&s.then((()=>t.ports[0].postMessage(!0)))}}))}handleRequest({request:t,event:e}){const s=new URL(t.url,location.href);if(!s.protocol.startsWith("http"))return;const n=s.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:e,request:t,sameOrigin:n,url:s});let o=r&&r.handler;const a=t.method;if(!o&&this.i.has(a)&&(o=this.i.get(a)),!o)return;let c;try{c=o.handle({url:s,request:t,event:e,params:i})}catch(t){c=Promise.reject(t)}return c instanceof Promise&&this.o&&(c=c.catch((n=>this.o.handle({url:s,request:t,event:e})))),c}findMatchingRoute({url:t,sameOrigin:e,request:s,event:n}){const i=this.t.get(s.method)||[];for(const r of i){let i;const o=r.match({url:t,sameOrigin:e,request:s,event:n});if(o)return i=o,(Array.isArray(o)&&0===o.length||o.constructor===Object&&0===Object.keys(o).length||"boolean"==typeof o)&&(i=void 0),{route:r,params:i}}return{}}setDefaultHandler(t,e="GET"){this.i.set(e,n(t))}setCatchHandler(t){this.o=n(t)}registerRoute(t){this.t.has(t.method)||this.t.set(t.method,[]),this.t.get(t.method).push(t)}unregisterRoute(t){if(!this.t.has(t.method))throw new s("unregister-route-but-not-found-with-method",{method:t.method});const e=this.t.get(t.method).indexOf(t);if(!(e>-1))throw new s("unregister-route-route-not-registered");this.t.get(t.method).splice(e,1)}}let a;function c(){return(c=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var s=arguments[e];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(t[n]=s[n])}return t}).apply(this,arguments)}const h={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},u=t=>[h.prefix,t,h.suffix].filter((t=>t&&t.length>0)).join("-"),l=t=>t||u(h.precache),f=t=>t||u(h.runtime);function w(t,e){const s=e();return t.waitUntil(s),s}try{self["workbox:precaching:6.0.2"]&&_()}catch(t){}function d(t){if(!t)throw new s("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location.href);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new s("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location.href);return{cacheKey:t.href,url:t.href}}const i=new URL(n,location.href),r=new URL(n,location.href);return i.searchParams.set("__WB_REVISION__",e),{cacheKey:i.href,url:r.href}}class p{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:t,state:e})=>{e&&(e.originalRequest=t)},this.cachedResponseWillBeUsed=async({event:t,state:e,cachedResponse:s})=>{if("install"===t.type){const t=e.originalRequest.url;s?this.notUpdatedURLs.push(t):this.updatedURLs.push(t)}return s}}}class y{constructor({precacheController:t}){this.cacheKeyWillBeUsed=async({request:t,params:e})=>{const s=e&&e.cacheKey||this.h.getCacheKeyForURL(t.url);return s?new Request(s):t},this.h=t}}let g;async function R(t,e){let n=null;if(t.url){n=new URL(t.url).origin}if(n!==self.location.origin)throw new s("cross-origin-copy-response",{origin:n});const i=t.clone(),r={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=e?e(r):r,a=function(){if(void 0===g){const t=new Response("");if("body"in t)try{new Response(t.body),g=!0}catch(t){g=!1}g=!1}return g}()?i.body:await i.blob();return new Response(a,o)}function m(t,e){const s=new URL(t);for(const t of e)s.searchParams.delete(t);return s.href}class v{constructor(){this.promise=new Promise(((t,e)=>{this.resolve=t,this.reject=e}))}}const q=new Set;try{self["workbox:strategies:6.0.2"]&&_()}catch(t){}function U(t){return"string"==typeof t?new Request(t):t}class L{constructor(t,e){this.u={},Object.assign(this,e),this.event=e.event,this.l=t,this.p=new v,this.g=[],this.R=[...t.plugins],this.m=new Map;for(const t of this.R)this.m.set(t,{});this.event.waitUntil(this.p.promise)}fetch(t){return this.waitUntil((Line truncated
|
|
||||||
//# sourceMappingURL=workbox-c8ead010.js.map
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
const sveltePreprocess = require('svelte-preprocess');
|
||||||
|
const preprocess = sveltePreprocess(__insert__);
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
preprocess
|
||||||
|
};
|
||||||
+18
-8
@@ -31,7 +31,6 @@
|
|||||||
import Login from "./components/Login.svelte";
|
import Login from "./components/Login.svelte";
|
||||||
import Dashboard from "./components/Dashboard.svelte";
|
import Dashboard from "./components/Dashboard.svelte";
|
||||||
import store from "./store.js";
|
import store from "./store.js";
|
||||||
import NotFound from "./components/NotFound.svelte";
|
|
||||||
import ForgotPassword from "./components/ForgotPassword.svelte";
|
import ForgotPassword from "./components/ForgotPassword.svelte";
|
||||||
import MainDashContent from "./components/MainDashContent.svelte";
|
import MainDashContent from "./components/MainDashContent.svelte";
|
||||||
import Users from "./components/Users.svelte";
|
import Users from "./components/Users.svelte";
|
||||||
@@ -41,16 +40,17 @@
|
|||||||
import Orgs from "./components/Orgs.svelte";
|
import Orgs from "./components/Orgs.svelte";
|
||||||
import Runners from "./components/Runners.svelte";
|
import Runners from "./components/Runners.svelte";
|
||||||
import Footer from "./components/Footer.svelte";
|
import Footer from "./components/Footer.svelte";
|
||||||
import Tracks from "./components/Tracks.svelte";
|
|
||||||
import TracksOverview from "./components/TracksOverview.svelte";
|
import TracksOverview from "./components/TracksOverview.svelte";
|
||||||
import OrgDetail from "./components/OrgDetail.svelte";
|
import OrgDetail from "./components/OrgDetail.svelte";
|
||||||
import Teams from "./components/Teams.svelte";
|
import Teams from "./components/Teams.svelte";
|
||||||
import { OpenAPI, AuthService } from "@odit/lfk-client-js";
|
import { OpenAPI } from "@odit/lfk-client-js";
|
||||||
import UserDetail from "./components/UserDetail.svelte";
|
import UserDetail from "./components/UserDetail.svelte";
|
||||||
OpenAPI.BASE = config.baseurl;
|
OpenAPI.BASE = config.baseurl;
|
||||||
import { register as registerSW } from "./swmodule";
|
import { register as registerSW } from "./swmodule";
|
||||||
|
import TeamDetail from "./components/TeamDetail.svelte";
|
||||||
|
import RunnerDetail from "./components/RunnerDetail.svelte";
|
||||||
store.init();
|
store.init();
|
||||||
// registerSW();
|
registerSW();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Route>
|
<Route>
|
||||||
@@ -82,11 +82,21 @@
|
|||||||
</Route>
|
</Route>
|
||||||
<Route path="/:trackid" let:params />
|
<Route path="/:trackid" let:params />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="/runners">
|
<Route path="/runners/*">
|
||||||
<Runners />
|
<Route path="/">
|
||||||
|
<Runners />
|
||||||
|
</Route>
|
||||||
|
<Route path="/:runnerid" let:params>
|
||||||
|
<RunnerDetail {params} />
|
||||||
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="/teams">
|
<Route path="/teams/*">
|
||||||
<Teams />
|
<Route path="/">
|
||||||
|
<Teams />
|
||||||
|
</Route>
|
||||||
|
<Route path="/:teamid" let:params>
|
||||||
|
<TeamDetail {params} />
|
||||||
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
<Route path="/orgs/*">
|
<Route path="/orgs/*">
|
||||||
<Route path="/">
|
<Route path="/">
|
||||||
|
|||||||
@@ -163,7 +163,35 @@
|
|||||||
</div>
|
</div>
|
||||||
{/await}
|
{/await}
|
||||||
</div>
|
</div>
|
||||||
<h2 class="text-4xl font-display font-semibold md:text-5xl">{$_('faq')}</h2>
|
<div class="w-full leading-8 mt-8">
|
||||||
|
<p class="text-xl font-medium">{$_('icon-image-credits')}</p>
|
||||||
|
<ul class="list-disc">
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
class="underline"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
href="https://storyset.com">https://storyset.com</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
class="underline"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
href="https://undraw.co">https://undraw.co</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a
|
||||||
|
class="underline"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
href="https://remixicon.com">https://remixicon.com</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<h2 class="mt-4 text-4xl font-display font-semibold md:text-5xl">
|
||||||
|
{$_('faq')}
|
||||||
|
</h2>
|
||||||
<div class="mt-6 border-t-2 border-gray-100 pt-10">
|
<div class="mt-6 border-t-2 border-gray-100 pt-10">
|
||||||
<dl class="md:grid md:grid-cols-2 md:gap-8">
|
<dl class="md:grid md:grid-cols-2 md:gap-8">
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { clickOutside } from "./outsideclick";
|
import { clickOutside } from "./outsideclick";
|
||||||
import { focusTrap } from "svelte-focus-trap";
|
import { focusTrap } from "svelte-focus-trap";
|
||||||
import { RunnerOrganisationService } from "@odit/lfk-client-js";
|
import { RunnerOrganizationService } from "@odit/lfk-client-js";
|
||||||
import Toastify from "toastify-js";
|
import Toastify from "toastify-js";
|
||||||
export let modal_open;
|
export let modal_open;
|
||||||
export let current_organizations;
|
export let current_organizations;
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
text: "Organization is being added...",
|
text: "Organization is being added...",
|
||||||
duration: -1,
|
duration: -1,
|
||||||
}).showToast();
|
}).showToast();
|
||||||
RunnerOrganisationService.runnerOrganisationControllerPost({
|
RunnerOrganizationService.runnerOrganizationControllerPost({
|
||||||
name,
|
name,
|
||||||
address: undefined,
|
address: undefined,
|
||||||
contact: undefined,
|
contact: undefined,
|
||||||
|
|||||||
@@ -0,0 +1,312 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import { clickOutside } from "./outsideclick";
|
||||||
|
import { focusTrap } from "svelte-focus-trap";
|
||||||
|
import {
|
||||||
|
RunnerService,
|
||||||
|
RunnerTeamService,
|
||||||
|
RunnerOrganizationService,
|
||||||
|
} from "@odit/lfk-client-js";
|
||||||
|
import isEmail from "validator/es/lib/isEmail";
|
||||||
|
import isMobilePhone from "validator/es/lib/isMobilePhone";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
export let modal_open;
|
||||||
|
export let current_runners;
|
||||||
|
$: selected_team = undefined;
|
||||||
|
let firstname_input;
|
||||||
|
let lastname_input;
|
||||||
|
let middlename_input;
|
||||||
|
let phone_input;
|
||||||
|
let email_input;
|
||||||
|
let teams = [];
|
||||||
|
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
||||||
|
teams = val;
|
||||||
|
});
|
||||||
|
let orgs = [];
|
||||||
|
RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
|
||||||
|
orgs = val;
|
||||||
|
});
|
||||||
|
function focus(el) {
|
||||||
|
el.focus();
|
||||||
|
}
|
||||||
|
$: middlename_input_value = "";
|
||||||
|
$: phone_input_value = "";
|
||||||
|
$: email_input_value = "";
|
||||||
|
$: lastname_input_value = "";
|
||||||
|
$: firstname_input_value = "";
|
||||||
|
$: processed_last_submit = true;
|
||||||
|
$: isPhoneValidOrEmpty =
|
||||||
|
isMobilePhone(
|
||||||
|
phone_input_value
|
||||||
|
.replaceAll("(", "")
|
||||||
|
.replaceAll(")", "")
|
||||||
|
.replaceAll("-", "")
|
||||||
|
.replaceAll(" ", "")
|
||||||
|
) || phone_input_value === "";
|
||||||
|
$: isEmailValidOrEmpty =
|
||||||
|
isEmail(email_input_value) || email_input_value === "";
|
||||||
|
$: isLastnameValid = lastname_input_value.trim().length !== 0;
|
||||||
|
$: isFirstnameValid = firstname_input_value.trim().length !== 0;
|
||||||
|
$: createbtnenabled =
|
||||||
|
isFirstnameValid &&
|
||||||
|
isLastnameValid &&
|
||||||
|
isEmailValidOrEmpty &&
|
||||||
|
isPhoneValidOrEmpty;
|
||||||
|
(() => {
|
||||||
|
document.onkeydown = (e) => {
|
||||||
|
e = e || window.event;
|
||||||
|
if (e.key === "Escape") {
|
||||||
|
modal_open = false;
|
||||||
|
}
|
||||||
|
if (e.keyCode === 13) {
|
||||||
|
if (createbtnenabled === true) {
|
||||||
|
createbtnenabled = false;
|
||||||
|
submit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
function submit() {
|
||||||
|
if (processed_last_submit === true) {
|
||||||
|
processed_last_submit = false;
|
||||||
|
const toast = Toastify({
|
||||||
|
text: "Runner is being added...",
|
||||||
|
duration: -1,
|
||||||
|
}).showToast();
|
||||||
|
let postdata = {
|
||||||
|
group: selected_team,
|
||||||
|
firstname: firstname_input_value,
|
||||||
|
lastname: lastname_input_value,
|
||||||
|
};
|
||||||
|
if (middlename_input_value) {
|
||||||
|
postdata.middlename = middlename_input_value;
|
||||||
|
}
|
||||||
|
if (phone_input_value) {
|
||||||
|
postdata.phone = phone_input_value;
|
||||||
|
}
|
||||||
|
if (email_input_value) {
|
||||||
|
postdata.email = email_input_value;
|
||||||
|
}
|
||||||
|
RunnerService.runnerControllerPost(postdata)
|
||||||
|
.then((result) => {
|
||||||
|
firstname_input_value = "";
|
||||||
|
lastname_input_value = "";
|
||||||
|
middlename_input_value = "";
|
||||||
|
email_input_value = "";
|
||||||
|
modal_open = false;
|
||||||
|
//
|
||||||
|
Toastify({
|
||||||
|
text: "Runner added",
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
current_runners.push(result);
|
||||||
|
current_runners = current_runners;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
//
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
processed_last_submit = true;
|
||||||
|
//
|
||||||
|
toast.hideToast();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if modal_open}
|
||||||
|
<div
|
||||||
|
class="fixed z-10 inset-0 overflow-y-auto"
|
||||||
|
use:focusTrap
|
||||||
|
use:clickOutside
|
||||||
|
on:click_outside={() => {
|
||||||
|
modal_open = false;
|
||||||
|
}}>
|
||||||
|
<div
|
||||||
|
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
||||||
|
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
|
||||||
|
<div
|
||||||
|
class="absolute inset-0 bg-gray-500 opacity-75"
|
||||||
|
data-id="modal_backdrop" />
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
class="hidden sm:inline-block sm:align-middle sm:h-screen"
|
||||||
|
aria-hidden="true">​</span>
|
||||||
|
<div
|
||||||
|
class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
|
||||||
|
role="dialog"
|
||||||
|
aria-modal="true"
|
||||||
|
aria-labelledby="modal-headline">
|
||||||
|
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
|
||||||
|
<div class="sm:flex sm:items-start">
|
||||||
|
<div
|
||||||
|
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
class="h-6 w-6 text-blue-600"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"><path fill="none" d="M0 0h24v24H0z" />
|
||||||
|
<path
|
||||||
|
d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" /></svg>
|
||||||
|
</div>
|
||||||
|
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
|
||||||
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
|
{$_('create-a-new-runner')}
|
||||||
|
</h3>
|
||||||
|
<div class="mt-2 mb-6">
|
||||||
|
<p class="text-sm text-gray-500">
|
||||||
|
{$_('please-provide-the-required-information-to-add-a-new-runner')}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-6 gap-6">
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="firstname"
|
||||||
|
class="block text-sm font-medium text-gray-700">{$_('first-name')}</label>
|
||||||
|
<input
|
||||||
|
use:focus
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('first-name')}
|
||||||
|
class:border-red-500={!isFirstnameValid}
|
||||||
|
class:focus:border-red-500={!isFirstnameValid}
|
||||||
|
class:focus:ring-red-500={!isFirstnameValid}
|
||||||
|
bind:value={firstname_input_value}
|
||||||
|
bind:this={firstname_input}
|
||||||
|
type="text"
|
||||||
|
name="firstname"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isFirstnameValid}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
{$_('first-name-is-required')}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="trackname"
|
||||||
|
class="block text-sm font-medium text-gray-700">{$_('middle-name')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('middle-name')}
|
||||||
|
bind:value={middlename_input_value}
|
||||||
|
bind:this={middlename_input}
|
||||||
|
type="text"
|
||||||
|
name="trackname"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
</div>
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="lastname"
|
||||||
|
class="block text-sm font-medium text-gray-700">Last Name</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder="Last Name"
|
||||||
|
class:border-red-500={!isLastnameValid}
|
||||||
|
class:focus:border-red-500={!isLastnameValid}
|
||||||
|
class:focus:ring-red-500={!isLastnameValid}
|
||||||
|
bind:value={lastname_input_value}
|
||||||
|
bind:this={lastname_input}
|
||||||
|
type="text"
|
||||||
|
name="lastname"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isLastnameValid}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
{$_('last-name-is-required')}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="team"
|
||||||
|
class="block text-sm font-medium text-gray-700">{$_('team')}</label>
|
||||||
|
<select
|
||||||
|
name="team"
|
||||||
|
bind:value={selected_team}
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2">
|
||||||
|
{#each teams as team}
|
||||||
|
<option value={team.id}>
|
||||||
|
{team.parentGroup.name}
|
||||||
|
>
|
||||||
|
{team.name}
|
||||||
|
</option>
|
||||||
|
{/each}
|
||||||
|
{#each orgs as org}
|
||||||
|
<option value={org.id}>{org.name}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="phone"
|
||||||
|
class="block text-sm font-medium text-gray-700">Phone</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder="Phone"
|
||||||
|
class:border-red-500={!isPhoneValidOrEmpty}
|
||||||
|
class:focus:border-red-500={!isPhoneValidOrEmpty}
|
||||||
|
class:focus:ring-red-500={!isPhoneValidOrEmpty}
|
||||||
|
bind:value={phone_input_value}
|
||||||
|
bind:this={phone_input}
|
||||||
|
type="tel"
|
||||||
|
name="phone"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isPhoneValidOrEmpty}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
{$_('the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number')}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="email"
|
||||||
|
class="block text-sm font-medium text-gray-700">{$_('e-mail-adress')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('e-mail-adress')}
|
||||||
|
class:border-red-500={!isEmailValidOrEmpty}
|
||||||
|
class:focus:border-red-500={!isEmailValidOrEmpty}
|
||||||
|
class:focus:ring-red-500={!isEmailValidOrEmpty}
|
||||||
|
bind:value={email_input_value}
|
||||||
|
bind:this={email_input}
|
||||||
|
type="email"
|
||||||
|
name="email"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isEmailValidOrEmpty}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
{$_('valid-email-is-required')}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
|
||||||
|
<button
|
||||||
|
disabled={!createbtnenabled}
|
||||||
|
class:opacity-50={!createbtnenabled}
|
||||||
|
on:click={submit}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('create')}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
modal_open = false;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('cancel')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import { clickOutside } from "./outsideclick";
|
||||||
|
import { focusTrap } from "svelte-focus-trap";
|
||||||
|
import {
|
||||||
|
RunnerOrganizationService,
|
||||||
|
RunnerTeamService,
|
||||||
|
} from "@odit/lfk-client-js";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
export let modal_open;
|
||||||
|
export let current_teams;
|
||||||
|
let teamname_input_dom;
|
||||||
|
function focus(el) {
|
||||||
|
el.focus();
|
||||||
|
}
|
||||||
|
$: teamname = "";
|
||||||
|
$: processed_last_submit = true;
|
||||||
|
$: isTeamNameValid = teamname.trim().length !== 0;
|
||||||
|
$: createbtnenabled = isTeamNameValid;
|
||||||
|
(function () {
|
||||||
|
document.onkeydown = function (e) {
|
||||||
|
e = e || window.event;
|
||||||
|
if (e.key === "Escape") {
|
||||||
|
modal_open = false;
|
||||||
|
}
|
||||||
|
if (e.keyCode === 13) {
|
||||||
|
if (createbtnenabled === true) {
|
||||||
|
createbtnenabled = false;
|
||||||
|
submit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
$: parentGroup = undefined;
|
||||||
|
$: orgs = [];
|
||||||
|
RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
|
||||||
|
orgs = val;
|
||||||
|
});
|
||||||
|
function submit() {
|
||||||
|
if (processed_last_submit === true) {
|
||||||
|
processed_last_submit = false;
|
||||||
|
const toast = Toastify({
|
||||||
|
text: "Team is being added...",
|
||||||
|
duration: -1,
|
||||||
|
}).showToast();
|
||||||
|
RunnerTeamService.runnerTeamControllerPost({
|
||||||
|
parentGroup,
|
||||||
|
name: teamname,
|
||||||
|
})
|
||||||
|
.then((result) => {
|
||||||
|
teamname = "";
|
||||||
|
modal_open = false;
|
||||||
|
//
|
||||||
|
Toastify({
|
||||||
|
text: "Team added",
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
current_teams.push(result);
|
||||||
|
current_teams = current_teams;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
//
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
processed_last_submit = true;
|
||||||
|
//
|
||||||
|
toast.hideToast();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if modal_open}
|
||||||
|
<div
|
||||||
|
class="fixed z-10 inset-0 overflow-y-auto"
|
||||||
|
use:focusTrap
|
||||||
|
use:clickOutside
|
||||||
|
on:click_outside={() => {
|
||||||
|
modal_open = false;
|
||||||
|
}}>
|
||||||
|
<div
|
||||||
|
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
||||||
|
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
|
||||||
|
<div
|
||||||
|
class="absolute inset-0 bg-gray-500 opacity-75"
|
||||||
|
data-id="modal_backdrop" />
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
class="hidden sm:inline-block sm:align-middle sm:h-screen"
|
||||||
|
aria-hidden="true">​</span>
|
||||||
|
<div
|
||||||
|
class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
|
||||||
|
role="dialog"
|
||||||
|
aria-modal="true"
|
||||||
|
aria-labelledby="modal-headline">
|
||||||
|
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
|
||||||
|
<div class="sm:flex sm:items-start">
|
||||||
|
<div
|
||||||
|
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
|
||||||
|
<svg
|
||||||
|
class="h-6 w-6 text-blue-600"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 640 512"><path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
||||||
|
</div>
|
||||||
|
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
|
||||||
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
|
Create a new team
|
||||||
|
</h3>
|
||||||
|
<div class="mt-2 mb-6">
|
||||||
|
<p class="text-sm text-gray-500">
|
||||||
|
Please provide the required information to add a new team.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-6 gap-6">
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="firstname"
|
||||||
|
class="block text-sm font-medium text-gray-700">{$_('team-name')}</label>
|
||||||
|
<input
|
||||||
|
use:focus
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('team-name')}
|
||||||
|
class:border-red-500={!isTeamNameValid}
|
||||||
|
class:focus:border-red-500={!isTeamNameValid}
|
||||||
|
class:focus:ring-red-500={!isTeamNameValid}
|
||||||
|
bind:value={teamname}
|
||||||
|
bind:this={teamname_input_dom}
|
||||||
|
type="text"
|
||||||
|
name="firstname"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isTeamNameValid}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
team name is required
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="col-span-6">
|
||||||
|
<label
|
||||||
|
for="firstname"
|
||||||
|
class="block text-sm font-medium text-gray-700">{$_('organization')}</label>
|
||||||
|
<select
|
||||||
|
bind:value={parentGroup}
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2">
|
||||||
|
{#each orgs as t}
|
||||||
|
<option value={t.id}>{t.name}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
|
||||||
|
<button
|
||||||
|
disabled={!createbtnenabled}
|
||||||
|
class:opacity-50={!createbtnenabled}
|
||||||
|
on:click={submit}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('create')}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
modal_open = false;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('cancel')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
<Table />
|
<Table />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 mb-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
class="widget w-full p-4 mb-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">Regular</div>
|
<div class="text-sm font-light text-grey-500">Regular</div>
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import { clickOutside } from "./outsideclick";
|
||||||
|
import { focusTrap } from "svelte-focus-trap";
|
||||||
|
import { RunnerOrganizationService } from "@odit/lfk-client-js";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import { createEventDispatcher } from "svelte";
|
||||||
|
export let modal_open;
|
||||||
|
export let delete_org;
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
function cancelDelete() {
|
||||||
|
modal_open = false;
|
||||||
|
dispatch("cancelDelete", { id: delete_org.id });
|
||||||
|
}
|
||||||
|
function deleteOrg() {
|
||||||
|
RunnerOrganizationService.runnerOrganizationControllerRemove(
|
||||||
|
delete_org.id,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
.then((resp) => {
|
||||||
|
Toastify({
|
||||||
|
text: "Organization deleted",
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
location.replace("./");
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
//
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if modal_open}
|
||||||
|
<div
|
||||||
|
class="fixed z-10 inset-0 overflow-y-auto"
|
||||||
|
use:focusTrap
|
||||||
|
use:clickOutside
|
||||||
|
on:click_outside={cancelDelete}>
|
||||||
|
<div
|
||||||
|
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
||||||
|
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
|
||||||
|
<div
|
||||||
|
class="absolute inset-0 bg-gray-500 opacity-75"
|
||||||
|
data-id="modal_backdrop" />
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
class="hidden sm:inline-block sm:align-middle sm:h-screen"
|
||||||
|
aria-hidden="true">​</span>
|
||||||
|
<div
|
||||||
|
class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
|
||||||
|
role="dialog"
|
||||||
|
aria-modal="true"
|
||||||
|
aria-labelledby="modal-headline">
|
||||||
|
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
|
||||||
|
<div class="sm:flex sm:items-start">
|
||||||
|
<div
|
||||||
|
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
|
||||||
|
<svg
|
||||||
|
class="h-6 w-6 text-blue-600"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 640 512"><path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
||||||
|
</div>
|
||||||
|
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
|
||||||
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
|
Attention!
|
||||||
|
</h3>
|
||||||
|
<div class="mt-2 mb-6">
|
||||||
|
<p class="text-sm text-gray-500">
|
||||||
|
Do you want to delete the organization
|
||||||
|
{delete_org.name}?<br />All associated teams and runners will
|
||||||
|
be deleted too!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
|
||||||
|
<button
|
||||||
|
on:click={deleteOrg}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
Confirm, delete organization and associated teams+runners.
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
on:click={cancelDelete}
|
||||||
|
type="button"
|
||||||
|
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
Cancel, keep organization
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import { clickOutside } from "./outsideclick";
|
||||||
|
import { focusTrap } from "svelte-focus-trap";
|
||||||
|
import { RunnerTeamService } from "@odit/lfk-client-js";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import { createEventDispatcher } from "svelte";
|
||||||
|
export let modal_open;
|
||||||
|
export let delete_team;
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
function cancelDelete() {
|
||||||
|
modal_open = false;
|
||||||
|
dispatch("cancelDelete", { id: delete_team.id });
|
||||||
|
}
|
||||||
|
function deleteTeam() {
|
||||||
|
RunnerTeamService.runnerTeamControllerRemove(delete_team.id, true)
|
||||||
|
.then((resp) => {
|
||||||
|
Toastify({
|
||||||
|
text: "Team deleted",
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
location.replace("./");
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
//
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if modal_open}
|
||||||
|
<div
|
||||||
|
class="fixed z-10 inset-0 overflow-y-auto"
|
||||||
|
use:focusTrap
|
||||||
|
use:clickOutside
|
||||||
|
on:click_outside={cancelDelete}>
|
||||||
|
<div
|
||||||
|
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
||||||
|
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
|
||||||
|
<div
|
||||||
|
class="absolute inset-0 bg-gray-500 opacity-75"
|
||||||
|
data-id="modal_backdrop" />
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
class="hidden sm:inline-block sm:align-middle sm:h-screen"
|
||||||
|
aria-hidden="true">​</span>
|
||||||
|
<div
|
||||||
|
class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
|
||||||
|
role="dialog"
|
||||||
|
aria-modal="true"
|
||||||
|
aria-labelledby="modal-headline">
|
||||||
|
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
|
||||||
|
<div class="sm:flex sm:items-start">
|
||||||
|
<div
|
||||||
|
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
|
||||||
|
<svg
|
||||||
|
class="h-6 w-6 text-blue-600"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 640 512"><path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
||||||
|
</div>
|
||||||
|
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
|
||||||
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
|
Attention!
|
||||||
|
</h3>
|
||||||
|
<div class="mt-2 mb-6">
|
||||||
|
<p class="text-sm text-gray-500">
|
||||||
|
Do you want to delete the team
|
||||||
|
{delete_team.name}?<br />All associated runners will be
|
||||||
|
deleted too!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
|
||||||
|
<button
|
||||||
|
on:click={deleteTeam}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
Confirm, delete team and associated runners.
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
on:click={cancelDelete}
|
||||||
|
type="button"
|
||||||
|
class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
Cancel, keep team
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<div class="w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
<div class="w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">Conversions</div>
|
<div class="text-sm font-light text-grey-500">Conversions</div>
|
||||||
@@ -18,16 +18,16 @@
|
|||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<ul class="list-none">
|
<ul class="list-none">
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">Today</a></li>
|
href="/">Today</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This week</a></li>
|
href="/">This week</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This month</a></li>
|
href="/">This month</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This year</a></li>
|
href="/">This year</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+39
-39
@@ -323,7 +323,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="main w-full bg-grey-50 text-grey-900 dark:bg-grey-900 dark:text-white">
|
<div class="main w-full bg-grey-50 text-grey-900">
|
||||||
<div class="navbar navbar-1 border-b">
|
<div class="navbar navbar-1 border-b">
|
||||||
<div class="navbar-inner w-full flex items-center justify-start"><button class="mx-4"><svg stroke="currentColor"
|
<div class="navbar-inner w-full flex items-center justify-start"><button class="mx-4"><svg stroke="currentColor"
|
||||||
fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" size="20"
|
fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" size="20"
|
||||||
@@ -733,7 +733,7 @@
|
|||||||
<div class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
<div class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
||||||
<div class="w-full lg:w-1/4">
|
<div class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">Users</div>
|
<div class="text-xs uppercase font-light text-grey-500">Users</div>
|
||||||
@@ -751,7 +751,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-1/4">
|
<div class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">Sessions</div>
|
<div class="text-xs uppercase font-light text-grey-500">Sessions</div>
|
||||||
@@ -766,7 +766,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-1/4">
|
<div class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">Bounce rate</div>
|
<div class="text-xs uppercase font-light text-grey-500">Bounce rate</div>
|
||||||
@@ -783,7 +783,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-1/4">
|
<div class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">Session duration</div>
|
<div class="text-xs uppercase font-light text-grey-500">Session duration</div>
|
||||||
@@ -803,7 +803,7 @@
|
|||||||
<ConversionsChart />
|
<ConversionsChart />
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-1/3">
|
<div class="w-full lg:w-1/3">
|
||||||
<div class="w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
<div class="w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">Sessions</div>
|
<div class="text-sm font-light text-grey-500">Sessions</div>
|
||||||
@@ -823,16 +823,16 @@
|
|||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<ul class="list-none">
|
<ul class="list-none">
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">Today</a></li>
|
href="/">Today</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This week</a></li>
|
href="/">This week</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This month</a></li>
|
href="/">This month</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This year</a></li>
|
href="/">This year</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -923,7 +923,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
<div class="w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
||||||
<div class="w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
<div class="w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">Users</div>
|
<div class="text-sm font-light text-grey-500">Users</div>
|
||||||
@@ -1211,15 +1211,15 @@
|
|||||||
</table>
|
</table>
|
||||||
<div class="flex flex-row w-full items-center justify-around lg:justify-between my-4">
|
<div class="flex flex-row w-full items-center justify-around lg:justify-between my-4">
|
||||||
<div class="flex flex-wrap items-center justify-start space-x-2 pagination"><button
|
<div class="flex flex-wrap items-center justify-start space-x-2 pagination"><button
|
||||||
class="btn btn-default bg-transparent hover:bg-grey-200 text-grey-900 dark:text-white">Next</button><button
|
class="btn btn-default bg-transparent hover:bg-grey-200 text-grey-900">Next</button><button
|
||||||
class="btn btn-default bg-transparent hover:bg-grey-200 text-grey-900 dark:text-white">Last</button>
|
class="btn btn-default bg-transparent hover:bg-grey-200 text-grey-900">Last</button>
|
||||||
</div><span class="hidden lg:block">Page
|
</div><span class="hidden lg:block">Page
|
||||||
<!-- --> <b>1
|
<!-- --> <b>1
|
||||||
<!-- --> of
|
<!-- --> of
|
||||||
<!-- -->11
|
<!-- -->11
|
||||||
</b>
|
</b>
|
||||||
</span><select
|
</span><select
|
||||||
class="hidden lg:block form-select text-sm bg-white dark:bg-grey-800 dark:border-grey-800 outline-none shadow-none focus:shadow-none">
|
class="hidden lg:block form-select text-sm bg-white outline-none shadow-none focus:shadow-none">
|
||||||
<option selected="" value="10">Show 10</option>
|
<option selected="" value="10">Show 10</option>
|
||||||
<option value="25">Show 25</option>
|
<option value="25">Show 25</option>
|
||||||
<option value="50">Show 50</option>
|
<option value="50">Show 50</option>
|
||||||
@@ -1232,7 +1232,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
<div class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
||||||
<div class="w-full lg:w-1/2">
|
<div class="w-full lg:w-1/2">
|
||||||
<div class="w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
<div class="w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">Project status</div>
|
<div class="text-sm font-light text-grey-500">Project status</div>
|
||||||
@@ -1252,16 +1252,16 @@
|
|||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<ul class="list-none">
|
<ul class="list-none">
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">Today</a></li>
|
href="/">Today</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This week</a></li>
|
href="/">This week</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This month</a></li>
|
href="/">This month</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This year</a></li>
|
href="/">This year</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -1336,7 +1336,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-1/2">
|
<div class="w-full lg:w-1/2">
|
||||||
<div class="w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
<div class="w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">Sales</div>
|
<div class="text-sm font-light text-grey-500">Sales</div>
|
||||||
@@ -1356,16 +1356,16 @@
|
|||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<ul class="list-none">
|
<ul class="list-none">
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">Today</a></li>
|
href="/">Today</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This week</a></li>
|
href="/">This week</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This month</a></li>
|
href="/">This month</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This year</a></li>
|
href="/">This year</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -1578,7 +1578,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
<div class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
||||||
<div class="w-full lg:w-1/3">
|
<div class="w-full lg:w-1/3">
|
||||||
<div class="w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
<div class="w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">Activities</div>
|
<div class="text-sm font-light text-grey-500">Activities</div>
|
||||||
@@ -1598,16 +1598,16 @@
|
|||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<ul class="list-none">
|
<ul class="list-none">
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">Today</a></li>
|
href="/">Today</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This week</a></li>
|
href="/">This week</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This month</a></li>
|
href="/">This month</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This year</a></li>
|
href="/">This year</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -1619,7 +1619,7 @@
|
|||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<div class="flex relative justify-start items-start">
|
<div class="flex relative justify-start items-start">
|
||||||
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
||||||
<div class="h-full w-1 bg-grey-200 dark:bg-grey-800 pointer-events-none"></div>
|
<div class="h-full w-1 bg-grey-200 pointer-events-none"></div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
||||||
@@ -1636,7 +1636,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex relative justify-start items-start">
|
<div class="flex relative justify-start items-start">
|
||||||
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
||||||
<div class="h-full w-1 bg-grey-200 dark:bg-grey-800 pointer-events-none"></div>
|
<div class="h-full w-1 bg-grey-200 pointer-events-none"></div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
||||||
@@ -1653,7 +1653,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex relative justify-start items-start">
|
<div class="flex relative justify-start items-start">
|
||||||
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
||||||
<div class="h-full w-1 bg-grey-200 dark:bg-grey-800 pointer-events-none"></div>
|
<div class="h-full w-1 bg-grey-200 pointer-events-none"></div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
||||||
@@ -1670,7 +1670,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex relative justify-start items-start">
|
<div class="flex relative justify-start items-start">
|
||||||
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
<div class="h-full w-6 absolute inset-0 flex items-center justify-center">
|
||||||
<div class="h-full w-1 bg-grey-200 dark:bg-grey-800 pointer-events-none"></div>
|
<div class="h-full w-1 bg-grey-200 pointer-events-none"></div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
class="flex-shrink-0 w-6 h-6 rounded-full inline-flex items-center justify-center bg-blue-500 text-white relative z-10 font-medium text-sm">
|
||||||
@@ -1690,7 +1690,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-2/3">
|
<div class="w-full lg:w-2/3">
|
||||||
<div class="w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
<div class="w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between mb-6">
|
<div class="flex flex-row items-center justify-between mb-6">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-sm font-light text-grey-500">To do</div>
|
<div class="text-sm font-light text-grey-500">To do</div>
|
||||||
@@ -1710,16 +1710,16 @@
|
|||||||
<div class="flex flex-col w-full">
|
<div class="flex flex-col w-full">
|
||||||
<ul class="list-none">
|
<ul class="list-none">
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">Today</a></li>
|
href="/">Today</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This week</a></li>
|
href="/">This week</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This month</a></li>
|
href="/">This month</a></li>
|
||||||
<li><a
|
<li><a
|
||||||
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100 dark:bg-grey-895 dark:hover:bg-grey-890"
|
class="flex flex-row items-center justify-start h-10 w-full px-2 bg-white hover:bg-grey-100"
|
||||||
href="/">This year</a></li>
|
href="/">This year</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -1831,7 +1831,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<form>
|
<form>
|
||||||
<div class="form-element"><input type="text" value="" name="todo"
|
<div class="form-element"><input type="text" value="" name="todo"
|
||||||
class="form-input text-sm bg-white dark:bg-grey-800 dark:border-grey-800"
|
class="form-input text-sm bg-white"
|
||||||
placeholder="Add new..."></div>
|
placeholder="Add new..."></div>
|
||||||
</form>
|
</form>
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
|
|||||||
+90
-188
@@ -1,53 +1,12 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { active } from "tinro";
|
|
||||||
import localForage from "localforage";
|
import localForage from "localforage";
|
||||||
import { router } from "tinro";
|
|
||||||
|
|
||||||
import store from "../store";
|
import store from "../store";
|
||||||
|
import { router } from "tinro";
|
||||||
import NoComponentLoaded from "./NoComponentLoaded.svelte";
|
import NoComponentLoaded from "./NoComponentLoaded.svelte";
|
||||||
import { AuthService, OpenAPI } from "@odit/lfk-client-js";
|
import { AuthService } from "@odit/lfk-client-js";
|
||||||
|
|
||||||
let activePage = "dashboard";
|
|
||||||
let dropdown1 = false;
|
let dropdown1 = false;
|
||||||
let navOpen = false;
|
$: navOpen = false;
|
||||||
function ismobile() {
|
|
||||||
let check = false;
|
|
||||||
(function (a) {
|
|
||||||
if (
|
|
||||||
/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(
|
|
||||||
a
|
|
||||||
) ||
|
|
||||||
/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(
|
|
||||||
a.substr(0, 4)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
check = true;
|
|
||||||
})(navigator.userAgent || navigator.vendor || window.opera);
|
|
||||||
const aspectratio=window.innerWidth/window.innerHeight;
|
|
||||||
if(aspectratio<=0.765){
|
|
||||||
check=true;
|
|
||||||
}
|
|
||||||
return check;
|
|
||||||
}
|
|
||||||
$: mobile = ismobile();
|
|
||||||
window.addEventListener('resize', function(){
|
|
||||||
const aspectratio=window.innerWidth/window.innerHeight;
|
|
||||||
if(aspectratio<=0.765){
|
|
||||||
navOpen=false;
|
|
||||||
mobile=true;
|
|
||||||
}else{
|
|
||||||
navOpen=true;
|
|
||||||
mobile=false;
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// $: if (mobile===true) {
|
|
||||||
// console.log("changed to mobile");
|
|
||||||
// }
|
|
||||||
// $: if (mobile===false) {
|
|
||||||
// console.log("changed to md");
|
|
||||||
// }
|
|
||||||
function logout() {
|
function logout() {
|
||||||
localForage.clear();
|
localForage.clear();
|
||||||
location.replace("/");
|
location.replace("/");
|
||||||
@@ -56,18 +15,15 @@
|
|||||||
|
|
||||||
<section class="min-h-screen bg-gray-50">
|
<section class="min-h-screen bg-gray-50">
|
||||||
<nav
|
<nav
|
||||||
class:hidden={!navOpen && mobile}
|
class:-translate-x-full={!navOpen}
|
||||||
|
class:translate-x-0={navOpen}
|
||||||
class="select-none fixed top-0 left-0 z-20 h-full pb-10 overflow-x-hidden overflow-y-auto transition origin-left transform border-r w-60 md:translate-x-0 bg-gray-50">
|
class="select-none fixed top-0 left-0 z-20 h-full pb-10 overflow-x-hidden overflow-y-auto transition origin-left transform border-r w-60 md:translate-x-0 bg-gray-50">
|
||||||
<a href="/" class="flex items-center px-4 py-5">
|
<a href="/" class="flex items-center px-4 py-5">
|
||||||
<img
|
<img src="/lfk-logo.png" alt="Logo" class="h-10" />
|
||||||
src="/lfk-logo.png"
|
|
||||||
alt="Logo"
|
|
||||||
class="h-10" />
|
|
||||||
<h3 class="text-lg">Lauf für Kaya! Admin</h3>
|
<h3 class="text-lg">Lauf für Kaya! Admin</h3>
|
||||||
</a>
|
</a>
|
||||||
<nav class="text-sm font-medium text-gray-600" aria-label="Main Navigation">
|
<nav class="text-sm font-medium text-gray-600" aria-label="Main Navigation">
|
||||||
<a
|
<a
|
||||||
class:dark:bg-gray-900={$router.path === '/'}
|
|
||||||
class:bg-gray-100={$router.path === '/'}
|
class:bg-gray-100={$router.path === '/'}
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
href="/">
|
href="/">
|
||||||
@@ -81,89 +37,93 @@
|
|||||||
</svg>
|
</svg>
|
||||||
<span>{$_('dashboard-title')}</span>
|
<span>{$_('dashboard-title')}</span>
|
||||||
</a>
|
</a>
|
||||||
<a
|
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANIZATION:GET')}
|
||||||
class:dark:bg-gray-900={$router.path.includes('/orgs/')}
|
<a
|
||||||
class:bg-gray-100={$router.path.includes('/orgs/')}
|
class:bg-gray-100={$router.path.includes('/orgs/')}
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
href="/orgs/">
|
href="/orgs/">
|
||||||
<svg
|
<svg
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
||||||
fill="currentColor"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
width="24"
|
|
||||||
height="24"><path fill="none" d="M0 0h24v24H0z" />
|
|
||||||
<path
|
|
||||||
d="M17 19h2v-8h-6v8h2v-6h2v6zM3 19V4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v5h2v10h1v2H2v-2h1zm4-8v2h2v-2H7zm0 4v2h2v-2H7zm0-8v2h2V7H7z" /></svg>
|
|
||||||
<span>{$_('orgs')}</span>
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
class:dark:bg-gray-900={$router.path === '/users/'}
|
|
||||||
class:bg-gray-100={$router.path === '/users/'}
|
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
|
||||||
href="/users/">
|
|
||||||
<svg
|
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
|
||||||
fill="currentColor"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 640 512"><path
|
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<span>{$_('users')}</span>
|
viewBox="0 0 24 24"
|
||||||
</a>
|
width="24"
|
||||||
<a
|
height="24"><path fill="none" d="M0 0h24v24H0z" />
|
||||||
class:dark:bg-gray-900={$router.path === '/runners/'}
|
<path
|
||||||
class:bg-gray-100={$router.path === '/runners/'}
|
d="M17 19h2v-8h-6v8h2v-6h2v6zM3 19V4a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v5h2v10h1v2H2v-2h1zm4-8v2h2v-2H7zm0 4v2h2v-2H7zm0-8v2h2V7H7z" /></svg>
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
<span>{$_('orgs')}</span>
|
||||||
href="/runners/">
|
</a>
|
||||||
<svg
|
{/if}
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
{#if store.state.jwtinfo.userdetails.permissions.includes('USER:GET')}
|
||||||
viewBox="0 0 24 24"
|
<a
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
class:bg-gray-100={$router.path === '/users/'}
|
||||||
fill="currentColor"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
width="24"
|
href="/users/">
|
||||||
height="24"><path fill="none" d="M0 0h24v24H0z" />
|
<svg
|
||||||
<path
|
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
||||||
d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" /></svg>
|
|
||||||
<span>{$_('runners')}</span>
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
class:dark:bg-gray-900={$router.path === '/teams/'}
|
|
||||||
class:bg-gray-100={$router.path === '/teams/'}
|
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
|
||||||
href="/teams/">
|
|
||||||
<svg
|
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
|
||||||
fill="currentColor"
|
|
||||||
width="24"
|
|
||||||
height="24"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 640 512"><path
|
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
width="24"
|
||||||
<span>{$_('teams')}</span>
|
height="24"
|
||||||
</a>
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<a
|
viewBox="0 0 640 512"><path
|
||||||
class:dark:bg-gray-900={$router.path === '/tracks/'}
|
fill="currentColor"
|
||||||
class:bg-gray-100={$router.path === '/tracks/'}
|
d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
<span>{$_('users')}</span>
|
||||||
href="/tracks/">
|
</a>
|
||||||
<svg
|
{/if}
|
||||||
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:GET')}
|
||||||
fill="currentColor"
|
<a
|
||||||
width="24"
|
class:bg-gray-100={$router.path === '/runners/'}
|
||||||
height="24"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
href="/runners/">
|
||||||
viewBox="0 0 640 512"><path
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
d="M635.7 167.2L556.1 31.7c-8.8-15-28.3-20.1-43.5-11.5l-69 39.1L503.3 161c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L416 75l-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L333.2 122 278 153.3 337.8 255c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-59.7-101.7-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-27.9-47.5-55.2 31.3 59.7 101.7c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L84.9 262.9l-69 39.1C.7 310.7-4.6 329.8 4.2 344.8l79.6 135.6c8.8 15 28.3 20.1 43.5 11.5L624.1 210c15.2-8.6 20.4-27.8 11.6-42.8z" /></svg>
|
width="24"
|
||||||
<span>{$_('tracks')}</span>
|
height="24"><path fill="none" d="M0 0h24v24H0z" />
|
||||||
</a>
|
<path
|
||||||
|
d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" /></svg>
|
||||||
|
<span>{$_('runners')}</span>
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('TEAM:GET')}
|
||||||
|
<a
|
||||||
|
class:bg-gray-100={$router.path === '/teams/'}
|
||||||
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
|
href="/teams/">
|
||||||
|
<svg
|
||||||
|
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 640 512"><path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
||||||
|
<span>{$_('teams')}</span>
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('TRACK:GET')}
|
||||||
|
<a
|
||||||
|
class:bg-gray-100={$router.path === '/tracks/'}
|
||||||
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
|
href="/tracks/">
|
||||||
|
<svg
|
||||||
|
class="flex-shrink-0 w-5 h-5 mr-2 text-gray-400 transition group-hover:text-gray-600"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 640 512"><path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M635.7 167.2L556.1 31.7c-8.8-15-28.3-20.1-43.5-11.5l-69 39.1L503.3 161c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L416 75l-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L333.2 122 278 153.3 337.8 255c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-59.7-101.7-55.2 31.3 27.9 47.4c2.2 3.8.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9l-27.9-47.5-55.2 31.3 59.7 101.7c2.2 3.7.9 8.5-2.9 10.7l-13.8 7.8c-3.8 2.2-8.7.9-10.9-2.9L84.9 262.9l-69 39.1C.7 310.7-4.6 329.8 4.2 344.8l79.6 135.6c8.8 15 28.3 20.1 43.5 11.5L624.1 210c15.2-8.6 20.4-27.8 11.6-42.8z" /></svg>
|
||||||
|
<span>{$_('tracks')}</span>
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
<a
|
<a
|
||||||
class:dark:bg-gray-900={activePage === 'blub'}
|
class:bg-gray-100={false}
|
||||||
class:bg-gray-100={activePage === 'blub'}
|
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
href="#">
|
href="#">
|
||||||
<svg
|
<svg
|
||||||
@@ -182,8 +142,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div
|
<div
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
class:dark:bg-gray-900={activePage === 'blub'}
|
class:bg-gray-100={false}
|
||||||
class:bg-gray-100={activePage === 'blub'}
|
|
||||||
class="flex items-center justify-between px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
class="flex items-center justify-between px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
role="button"
|
role="button"
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
@@ -258,7 +217,6 @@
|
|||||||
<span>{$_('changelog')}</span>
|
<span>{$_('changelog')}</span>
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
class:dark:bg-gray-900={$router.path === '/settings/'}
|
|
||||||
class:bg-gray-100={$router.path === '/settings/'}
|
class:bg-gray-100={$router.path === '/settings/'}
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
href="/settings/">
|
href="/settings/">
|
||||||
@@ -275,7 +233,6 @@
|
|||||||
<span>{$_('settings')}</span>
|
<span>{$_('settings')}</span>
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
class:dark:bg-gray-900={$router.path === '/about/'}
|
|
||||||
class:bg-gray-100={$router.path === '/about/'}
|
class:bg-gray-100={$router.path === '/about/'}
|
||||||
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
class="flex items-center px-4 py-3 transition cursor-pointer group hover:bg-gray-100 hover:text-gray-900"
|
||||||
href="/about/">
|
href="/about/">
|
||||||
@@ -312,65 +269,10 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="ml-0 transition md:ml-60">
|
<div class="ml-0 transition md:ml-60">
|
||||||
<header
|
|
||||||
class="flex items-center justify-between w-full px-4 border-b h-14">
|
|
||||||
<button
|
|
||||||
on:click={() => {
|
|
||||||
navOpen = !navOpen;
|
|
||||||
}}
|
|
||||||
class="block btn btn-light md:hidden">
|
|
||||||
<span class="sr-only">Menu</span>
|
|
||||||
<svg
|
|
||||||
class="w-4 h-4"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
fill="currentColor">
|
|
||||||
<path
|
|
||||||
fill-rule="evenodd"
|
|
||||||
d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
|
|
||||||
clip-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<!-- <div class="hidden -ml-3 form-icon md:block w-96">
|
|
||||||
<svg
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
fill="none"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
stroke="currentColor">
|
|
||||||
<path
|
|
||||||
stroke-linecap="round"
|
|
||||||
stroke-linejoin="round"
|
|
||||||
stroke-width="2"
|
|
||||||
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
|
|
||||||
</svg>
|
|
||||||
<input
|
|
||||||
class="border-0 form-input"
|
|
||||||
placeholder="Search for articles..." />
|
|
||||||
</div> -->
|
|
||||||
<div class="flex items-end">
|
|
||||||
<a href="#" class="flex text-gray-500">
|
|
||||||
<svg
|
|
||||||
class="flex-shrink-0 w-5 h-5"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 20 20"
|
|
||||||
fill="currentColor">
|
|
||||||
<path
|
|
||||||
d="M10 2a6 6 0 00-6 6v3.586l-.707.707A1 1 0 004 14h12a1 1 0 00.707-1.707L16 11.586V8a6 6 0 00-6-6zM10 18a3 3 0 01-3-3h6a3 3 0 01-3 3z" />
|
|
||||||
</svg>
|
|
||||||
</a>
|
|
||||||
<a href="/profile/" class="ml-4">
|
|
||||||
<img
|
|
||||||
class="h-8 w-8 rounded-full"
|
|
||||||
src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80"
|
|
||||||
alt="Profile Picture" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<slot>
|
<slot>
|
||||||
<NoComponentLoaded />
|
<NoComponentLoaded />
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
<!-- Sidebar Backdrop -->
|
|
||||||
<div
|
<div
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
navOpen = false;
|
navOpen = false;
|
||||||
|
|||||||
@@ -0,0 +1,286 @@
|
|||||||
|
<script>
|
||||||
|
import csv from "csvtojson";
|
||||||
|
import { read as readXlsx, utils as xlsx_utils } from "xlsx";
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import { clickOutside } from "./outsideclick";
|
||||||
|
import { focusTrap } from "svelte-focus-trap";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import { ImportService } from "@odit/lfk-client-js";
|
||||||
|
import { createEventDispatcher } from "svelte";
|
||||||
|
export let opened_from;
|
||||||
|
export let passed_org;
|
||||||
|
export let passed_orgs;
|
||||||
|
export let passed_team;
|
||||||
|
export let import_modal_open;
|
||||||
|
$: searchvalue = "";
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
function cancelModal() {
|
||||||
|
import_modal_open = false;
|
||||||
|
dispatch("cancel");
|
||||||
|
}
|
||||||
|
(() => {
|
||||||
|
document.onkeydown = (e) => {
|
||||||
|
e = e || window.event;
|
||||||
|
if (e.key === "Escape") {
|
||||||
|
import_modal_open = false;
|
||||||
|
}
|
||||||
|
if (e.keyCode === 13) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
let selected_org;
|
||||||
|
let files;
|
||||||
|
let recent_processed = true;
|
||||||
|
$: json_output = [];
|
||||||
|
$: {
|
||||||
|
if (files) {
|
||||||
|
if (
|
||||||
|
files[0].type ===
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||||
|
) {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.addEventListener("load", async (e) => {
|
||||||
|
const data = new Uint8Array(e.target.result);
|
||||||
|
const out = readXlsx(data, { type: "array" });
|
||||||
|
json_output = xlsx_utils.sheet_to_json(
|
||||||
|
out.Sheets[Object.keys(out.Sheets)[0]]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
reader.readAsArrayBuffer(files[0]);
|
||||||
|
} else {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.addEventListener("load", async (e) => {
|
||||||
|
json_output = await csv({
|
||||||
|
delimiter: [";", ","],
|
||||||
|
trim: true,
|
||||||
|
}).fromString(e.target.result);
|
||||||
|
});
|
||||||
|
reader.readAsText(files[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function importAction() {
|
||||||
|
if (recent_processed === true) {
|
||||||
|
const toast = Toastify({
|
||||||
|
text: "Runners are being imported...",
|
||||||
|
duration: -1,
|
||||||
|
}).showToast();
|
||||||
|
recent_processed = false;
|
||||||
|
const mapped = json_output.map(function (runner) {
|
||||||
|
return {
|
||||||
|
firstname: runner[`${$_("csv_import__firstname")}`],
|
||||||
|
middlename: runner[`${$_("csv_import__middlename")}`],
|
||||||
|
lastname: runner[`${$_("csv_import__lastname")}`],
|
||||||
|
team:
|
||||||
|
runner[`${$_("csv_import__team")}`] ||
|
||||||
|
runner[`${$_("csv_import__class")}`],
|
||||||
|
};
|
||||||
|
});
|
||||||
|
let org = 0;
|
||||||
|
if (opened_from === "OrgDetail") {
|
||||||
|
org = passed_org.id;
|
||||||
|
}
|
||||||
|
if (opened_from === "OrgOverview") {
|
||||||
|
org = parseInt(selected_org);
|
||||||
|
}
|
||||||
|
if (opened_from === "OrgOverview" || opened_from === "OrgDetail") {
|
||||||
|
ImportService.importControllerPostOrgsJson(org, mapped)
|
||||||
|
.then((resp) => {
|
||||||
|
toast.hideToast();
|
||||||
|
recent_processed = true;
|
||||||
|
Toastify({
|
||||||
|
text: "Import finished",
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
cancelModal();
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
toast.hideToast();
|
||||||
|
recent_processed = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (opened_from === "TeamDetail") {
|
||||||
|
ImportService.importControllerPostTeamsJson(passed_team.id, mapped)
|
||||||
|
.then((resp) => {
|
||||||
|
toast.hideToast();
|
||||||
|
recent_processed = true;
|
||||||
|
Toastify({
|
||||||
|
text: "Import finished",
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
cancelModal();
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
toast.hideToast();
|
||||||
|
recent_processed = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if import_modal_open}
|
||||||
|
<div
|
||||||
|
class="fixed z-10 inset-0 overflow-y-auto"
|
||||||
|
use:focusTrap
|
||||||
|
use:clickOutside
|
||||||
|
on:click_outside={() => {
|
||||||
|
import_modal_open = false;
|
||||||
|
}}>
|
||||||
|
<div
|
||||||
|
class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
||||||
|
<div class="fixed inset-0 transition-opacity" aria-hidden="true">
|
||||||
|
<div
|
||||||
|
class="absolute inset-0 bg-gray-500 opacity-75"
|
||||||
|
data-id="modal_backdrop" />
|
||||||
|
</div>
|
||||||
|
<span
|
||||||
|
class="hidden sm:inline-block sm:align-middle sm:h-screen"
|
||||||
|
aria-hidden="true">​</span>
|
||||||
|
<div
|
||||||
|
class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
|
||||||
|
role="dialog"
|
||||||
|
aria-modal="true"
|
||||||
|
aria-labelledby="modal-headline">
|
||||||
|
<div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
|
||||||
|
<div class="sm:flex sm:items-start">
|
||||||
|
<div
|
||||||
|
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-blue-100 sm:mx-0 sm:h-10 sm:w-10">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
class="h-6 w-6 text-blue-600"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"><path fill="none" d="M0 0h24v24H0z" />
|
||||||
|
<path
|
||||||
|
d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" /></svg>
|
||||||
|
</div>
|
||||||
|
<div class="mt-3 text-center sm:mt-0 sm:ml-2 sm:text-left w-full">
|
||||||
|
<h3 class="text-lg leading-6 font-bold mt-2 text-gray-900">
|
||||||
|
{$_('runner-import')}
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-5 text-center sm:mt-0 sm:ml-2 sm:text-left w-full">
|
||||||
|
{#if json_output.length === 0}
|
||||||
|
<div class="mt-2 mb-6">
|
||||||
|
<p class="text-sm text-gray-500">
|
||||||
|
{$_('please-provide-the-required-csv-xlsx-file')}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="overflow-hidden relative mt-4 mb-4">
|
||||||
|
<input
|
||||||
|
accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||||
|
bind:files
|
||||||
|
type="file" />
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{#if json_output.length > 0}
|
||||||
|
{#if opened_from === 'OrgOverview'}
|
||||||
|
<p>{$_('import__target-organization')}</p>
|
||||||
|
<select
|
||||||
|
name="team"
|
||||||
|
bind:value={selected_org}
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2">
|
||||||
|
{#each passed_orgs as o}
|
||||||
|
<option value={o.id}>{o.name}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
<p>{$_('bitte-bestaetige-diese-laeufer-fuer-den-import')}</p>
|
||||||
|
{/if}
|
||||||
|
{#if opened_from === 'OrgDetail'}
|
||||||
|
<p>
|
||||||
|
{$_('runnerimport_verify_runners_org', {
|
||||||
|
values: { org_name: passed_org.name },
|
||||||
|
})}
|
||||||
|
</p>
|
||||||
|
{/if}
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
bind:value={searchvalue}
|
||||||
|
placeholder={$_('datatable.search')}
|
||||||
|
aria-label={$_('datatable.search')}
|
||||||
|
class="p-2 w-full" />
|
||||||
|
<div class="relative w-full mt-4 mb-4">
|
||||||
|
<div class="w-full overflow-x-auto">
|
||||||
|
<table class="divide-y divide-gray-200 w-full">
|
||||||
|
<thead class="bg-gray-50">
|
||||||
|
<tr>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('csv_import__firstname')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('csv_import__middlename')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('csv_import__lastname')}
|
||||||
|
</th>
|
||||||
|
{#if opened_from !== 'TeamDetail'}
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('csv_import__team')}
|
||||||
|
</th>
|
||||||
|
{/if}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="divide-y divide-gray-200">
|
||||||
|
{#each json_output as runner}
|
||||||
|
{#if Object.values(runner)
|
||||||
|
.toString()
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(searchvalue)}
|
||||||
|
<tr>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
{runner[`${$_('csv_import__firstname')}`]}
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
{runner[`${$_('csv_import__middlename')}`] || ''}
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
{runner[`${$_('csv_import__lastname')}`]}
|
||||||
|
</td>
|
||||||
|
{#if opened_from !== 'TeamDetail'}
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
{runner[`${$_('csv_import__team')}`] || runner[`${$_('csv_import__class')}`] || '---'}
|
||||||
|
</td>
|
||||||
|
{/if}
|
||||||
|
</tr>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
on:click={importAction}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('import-runners')}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
json_output = [];
|
||||||
|
cancelModal();
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('cancel')}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
<script>
|
<script>
|
||||||
import { RunnerOrganisationService } from "@odit/lfk-client-js";
|
import { RunnerOrganizationService } from "@odit/lfk-client-js";
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import Toastify from "toastify-js";
|
import Toastify from "toastify-js";
|
||||||
import store from "../store";
|
import store from "../store";
|
||||||
|
import ConfirmOrgDeletion from "./ConfirmOrgDeletion.svelte";
|
||||||
|
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
||||||
import PromiseError from "./PromiseError.svelte";
|
import PromiseError from "./PromiseError.svelte";
|
||||||
$: delete_triggered = false;
|
$: delete_triggered = false;
|
||||||
$: save_enabled = !data_changed;
|
$: save_enabled = !data_changed;
|
||||||
@@ -11,22 +13,32 @@
|
|||||||
let original = {};
|
let original = {};
|
||||||
$: data_loaded = false;
|
$: data_loaded = false;
|
||||||
$: data_changed = JSON.stringify(orgdata) === JSON.stringify(original);
|
$: data_changed = JSON.stringify(orgdata) === JSON.stringify(original);
|
||||||
const promise = RunnerOrganisationService.runnerOrganisationControllerGetOne(
|
const promise = RunnerOrganizationService.runnerOrganizationControllerGetOne(
|
||||||
params.orgid
|
params.orgid
|
||||||
).then((value) => {
|
).then((value) => {
|
||||||
data_loaded = true;
|
data_loaded = true;
|
||||||
orgdata = Object.assign(orgdata, value);
|
orgdata = Object.assign(orgdata, value);
|
||||||
original = Object.assign(original, value);
|
original = Object.assign(original, value);
|
||||||
});
|
});
|
||||||
function deleteOrganisation() {
|
let modal_open = false;
|
||||||
RunnerOrganisationService.runnerOrganisationControllerRemove(
|
let delete_org = {};
|
||||||
original.id,
|
function deleteOrganization() {
|
||||||
true
|
// RunnerOrganizationService.runnerOrganizationControllerRemove(
|
||||||
)
|
// original.id,
|
||||||
.then((resp) => {
|
// false
|
||||||
location.replace("./");
|
// )
|
||||||
})
|
// .then((resp) => {
|
||||||
.catch((err) => {});
|
// Toastify({
|
||||||
|
// text: "Organization deleted",
|
||||||
|
// duration: 500,
|
||||||
|
// backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
// }).showToast();
|
||||||
|
// location.replace("./");
|
||||||
|
// })
|
||||||
|
// .catch((err) => {
|
||||||
|
modal_open = true;
|
||||||
|
delete_org = original;
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
function submit() {
|
function submit() {
|
||||||
if (data_loaded === true && save_enabled) {
|
if (data_loaded === true && save_enabled) {
|
||||||
@@ -34,7 +46,7 @@
|
|||||||
text: "updating organization",
|
text: "updating organization",
|
||||||
duration: 2500,
|
duration: 2500,
|
||||||
}).showToast();
|
}).showToast();
|
||||||
RunnerOrganisationService.runnerOrganisationControllerPut(
|
RunnerOrganizationService.runnerOrganizationControllerPut(
|
||||||
original.id,
|
original.id,
|
||||||
orgdata
|
orgdata
|
||||||
)
|
)
|
||||||
@@ -53,17 +65,37 @@
|
|||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
export let import_modal_open = false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<ImportRunnerModal
|
||||||
|
on:cancelDelete={(event) => {
|
||||||
|
import_modal_open = false;
|
||||||
|
}}
|
||||||
|
passed_orgs={[]}
|
||||||
|
passed_org={orgdata}
|
||||||
|
opened_from="OrgDetail"
|
||||||
|
bind:import_modal_open />
|
||||||
|
<ConfirmOrgDeletion bind:modal_open bind:delete_org />
|
||||||
{#if data_loaded}
|
{#if data_loaded}
|
||||||
<section class="container p-5">
|
<section class="container p-5">
|
||||||
<div class="mb-8 text-3xl font-extrabold leading-tight">
|
<div class="mb-8 text-3xl font-extrabold leading-tight">
|
||||||
{original.name}
|
{original.name}
|
||||||
<span data-id="org_actions_${orgdata.id}">
|
<span data-id="org_actions_${orgdata.id}">
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
import_modal_open = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('import-runners')}
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('USER:DELETE')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('USER:DELETE')}
|
||||||
{#if delete_triggered}
|
{#if delete_triggered}
|
||||||
<button
|
<button
|
||||||
on:click={deleteOrganisation}
|
on:click={deleteOrganization}
|
||||||
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('confirm-delete')}</button>
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('confirm-delete')}</button>
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
@@ -169,7 +201,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
bind:value={orgdata.name}
|
bind:value={orgdata.name}
|
||||||
name="name"
|
name="name"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label
|
<label
|
||||||
@@ -181,7 +213,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
bind:value={orgdata.contact}
|
bind:value={orgdata.contact}
|
||||||
name="contact"
|
name="contact"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label
|
<label
|
||||||
@@ -193,7 +225,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
bind:value={orgdata.address}
|
bind:value={orgdata.address}
|
||||||
name="address"
|
name="address"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
{:else}
|
{:else}
|
||||||
|
|||||||
@@ -1,21 +1,31 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import { RunnerOrganisationService } from "@odit/lfk-client-js";
|
let modal_open = false;
|
||||||
import "gridjs/dist/theme/mermaid.css";
|
let delete_org = {};
|
||||||
|
import { RunnerOrganizationService } from "@odit/lfk-client-js";
|
||||||
import store from "../store";
|
import store from "../store";
|
||||||
import OrgsEmptyState from "./OrgsEmptyState.svelte";
|
import OrgsEmptyState from "./OrgsEmptyState.svelte";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import ConfirmOrgDeletion from "./ConfirmOrgDeletion.svelte";
|
||||||
$: searchvalue = "";
|
$: searchvalue = "";
|
||||||
$: active_deletes = [];
|
$: active_deletes = [];
|
||||||
export let current_organizations = [];
|
export let current_organizations = [];
|
||||||
|
|
||||||
const promise = RunnerOrganisationService.runnerOrganisationControllerGetAll().then(
|
const promise = RunnerOrganizationService.runnerOrganizationControllerGetAll().then(
|
||||||
(val) => {
|
(val) => {
|
||||||
current_organizations = val;
|
current_organizations = val;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:GET')}
|
<ConfirmOrgDeletion
|
||||||
|
on:cancelDelete={(event) => {
|
||||||
|
modal_open = false;
|
||||||
|
active_deletes[event.detail.id] = false;
|
||||||
|
}}
|
||||||
|
bind:modal_open
|
||||||
|
bind:delete_org />
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANIZATION:GET')}
|
||||||
{#await promise}
|
{#await promise}
|
||||||
<div
|
<div
|
||||||
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
|
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
|
||||||
@@ -69,7 +79,7 @@
|
|||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<div class="ml-4">
|
<div class="ml-4">
|
||||||
<div
|
<div
|
||||||
class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
class="text-sm font-medium text-gray-900">
|
||||||
{o.name}
|
{o.name}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -79,7 +89,7 @@
|
|||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<div class="ml-4">
|
<div class="ml-4">
|
||||||
<div
|
<div
|
||||||
class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
class="text-sm font-medium text-gray-900">
|
||||||
{#if o.address}
|
{#if o.address}
|
||||||
{JSON.stringify(o.address)}
|
{JSON.stringify(o.address)}
|
||||||
{:else}no address specified{/if}
|
{:else}no address specified{/if}
|
||||||
@@ -91,7 +101,7 @@
|
|||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<div class="ml-4">
|
<div class="ml-4">
|
||||||
<div
|
<div
|
||||||
class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
class="text-sm font-medium text-gray-900">
|
||||||
{#if o.contact}
|
{#if o.contact}
|
||||||
{JSON.stringify(o.contact)}
|
{JSON.stringify(o.contact)}
|
||||||
{:else}no contact specified{/if}
|
{:else}no contact specified{/if}
|
||||||
@@ -111,12 +121,19 @@
|
|||||||
Delete</button>
|
Delete</button>
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
RunnerOrganisationService.runnerOrganisationControllerRemove(o.id, true)
|
RunnerOrganizationService.runnerOrganizationControllerRemove(o.id, false)
|
||||||
.then((resp) => {
|
.then((resp) => {
|
||||||
current_organizations = current_organizations.filter((obj) => obj.id !== o.id);
|
current_organizations = current_organizations.filter((obj) => obj.id !== o.id);
|
||||||
|
Toastify({
|
||||||
|
text: 'Organization deleted',
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor:
|
||||||
|
'linear-gradient(to right, #00b09b, #96c93d)',
|
||||||
|
}).showToast();
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
// error deleting user
|
modal_open = true;
|
||||||
|
delete_org = o;
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
@@ -129,7 +146,7 @@
|
|||||||
<a
|
<a
|
||||||
href="./{o.id}"
|
href="./{o.id}"
|
||||||
class="text-indigo-600 hover:text-indigo-900">Edit</a>
|
class="text-indigo-600 hover:text-indigo-900">Edit</a>
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:DELETE')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANIZATION:DELETE')}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
active_deletes[o.id] = true;
|
active_deletes[o.id] = true;
|
||||||
|
|||||||
@@ -4,14 +4,15 @@
|
|||||||
import AddOrgModal from "./AddOrgModal.svelte";
|
import AddOrgModal from "./AddOrgModal.svelte";
|
||||||
export let modal_open = false;
|
export let modal_open = false;
|
||||||
import OrgOverview from "./OrgOverview.svelte";
|
import OrgOverview from "./OrgOverview.svelte";
|
||||||
console.log(store.state.jwtinfo.userdetails.permissions);
|
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
||||||
let current_organizations = [];
|
let current_organizations = [];
|
||||||
|
export let import_modal_open = false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section class="container p-5">
|
<section class="container p-5">
|
||||||
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
||||||
{$_('organizations')}
|
{$_('organizations')}
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:CREATE')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANIZATION:CREATE')}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
modal_open = true;
|
modal_open = true;
|
||||||
@@ -21,11 +22,29 @@
|
|||||||
{$_('create-organization')}
|
{$_('create-organization')}
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
import_modal_open = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('import-runners')}
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
<p class="mb-8 text-lg text-gray-500">manage runner organizations</p>
|
<p class="mb-8 text-lg text-gray-500">manage runner organizations</p>
|
||||||
<OrgOverview bind:current_organizations />
|
<OrgOverview bind:current_organizations />
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANISATION:CREATE')}
|
{#if store.state.jwtinfo.userdetails.permissions.includes('ORGANIZATION:CREATE')}
|
||||||
<AddOrgModal bind:current_organizations bind:modal_open />
|
<AddOrgModal bind:current_organizations bind:modal_open />
|
||||||
|
<ImportRunnerModal
|
||||||
|
on:cancelDelete={(event) => {
|
||||||
|
import_modal_open = false;
|
||||||
|
}}
|
||||||
|
passed_org={{}}
|
||||||
|
passed_orgs={current_organizations}
|
||||||
|
opened_from="OrgOverview"
|
||||||
|
bind:import_modal_open />
|
||||||
{/if}
|
{/if}
|
||||||
@@ -1,12 +1,14 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
import AddOrgModal from "./AddOrgModal.svelte";
|
import AddOrgModal from "./AddOrgModal.svelte";
|
||||||
|
import org_empty from "./org_empty.svg";
|
||||||
let modal_open = false;
|
let modal_open = false;
|
||||||
let current_organizations = [];
|
let current_organizations = [];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="text-center items-center justify-center">
|
<div class="text-center items-center justify-center">
|
||||||
<p class="mb-16 text-lg text-gray-500">
|
<p class="mb-16 text-lg text-gray-500">
|
||||||
|
<img class="w-full h-44" src={org_empty} alt="" />
|
||||||
<span class="font-bold">There are no organizations added yet.</span><br />
|
<span class="font-bold">There are no organizations added yet.</span><br />
|
||||||
<span>Add your first organization</span>
|
<span>Add your first organization</span>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="w-full p-4 mb-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890">
|
class="w-full p-4 mb-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-start p-4">
|
<div class="flex flex-row items-center justify-start p-4">
|
||||||
<div class="flex-shrink-0 w-24">
|
<div class="flex-shrink-0 w-24">
|
||||||
<img
|
<img
|
||||||
|
|||||||
@@ -0,0 +1,264 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import lodashIsEqual from "lodash.isequal";
|
||||||
|
import store from "../store";
|
||||||
|
import {
|
||||||
|
RunnerService,
|
||||||
|
RunnerTeamService,
|
||||||
|
RunnerOrganizationService,
|
||||||
|
} from "@odit/lfk-client-js";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import PromiseError from "./PromiseError.svelte";
|
||||||
|
import isEmail from "validator/es/lib/isEmail";
|
||||||
|
let data_loaded = false;
|
||||||
|
export let params;
|
||||||
|
const runner_promise = RunnerService.runnerControllerGetOne(params.runnerid);
|
||||||
|
$: delete_triggered = false;
|
||||||
|
$: original_data = {};
|
||||||
|
$: editable = {};
|
||||||
|
$: changes_performed = !lodashIsEqual(original_data, editable);
|
||||||
|
$: isEmailValid =
|
||||||
|
(editable.email || "") === "" ||
|
||||||
|
(editable.email && isEmail(editable.email || ""));
|
||||||
|
$: isFirstnameValid = editable.firstname !== "";
|
||||||
|
$: isLastnameValid = editable.lastname !== "";
|
||||||
|
$: save_enabled =
|
||||||
|
changes_performed && isFirstnameValid && isLastnameValid && isEmailValid;
|
||||||
|
runner_promise.then((data) => {
|
||||||
|
data_loaded = true;
|
||||||
|
original_data = Object.assign(original_data, data);
|
||||||
|
original_data.group = original_data.group.id;
|
||||||
|
editable = Object.assign(editable, original_data);
|
||||||
|
});
|
||||||
|
let orgs = [];
|
||||||
|
RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
|
||||||
|
orgs = val;
|
||||||
|
});
|
||||||
|
let teams = [];
|
||||||
|
RunnerTeamService.runnerTeamControllerGetAll().then((val) => {
|
||||||
|
teams = val;
|
||||||
|
});
|
||||||
|
function submit() {
|
||||||
|
if (data_loaded === true && save_enabled) {
|
||||||
|
Toastify({
|
||||||
|
text: $_("updating-runner"),
|
||||||
|
duration: 2500,
|
||||||
|
}).showToast();
|
||||||
|
RunnerService.runnerControllerPut(original_data.id, editable)
|
||||||
|
.then((resp) => {
|
||||||
|
Object.assign(original_data, editable);
|
||||||
|
original_data = editable;
|
||||||
|
Object.assign(original_data, editable);
|
||||||
|
Toastify({
|
||||||
|
text: $_("runner-updated"),
|
||||||
|
duration: 2500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
})
|
||||||
|
.catch((err) => {});
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function deleteRunner() {
|
||||||
|
RunnerService.runnerControllerRemove(original_data.id, true)
|
||||||
|
.then((resp) => {
|
||||||
|
location.replace("./");
|
||||||
|
})
|
||||||
|
.catch((err) => {});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#await runner_promise}
|
||||||
|
<!-- -->
|
||||||
|
{:then}
|
||||||
|
<section class="container p-5 select-none">
|
||||||
|
<div class="flex flex-row mb-4">
|
||||||
|
<div class="w-full">
|
||||||
|
<nav class="w-full flex">
|
||||||
|
<ol class="list-none flex flex-row items-center justify-start">
|
||||||
|
<li class="flex items-center">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
class="flex-shrink-0 w-5 h-5 mr-2"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"><path fill="none" d="M0 0h24v24H0z" />
|
||||||
|
<path
|
||||||
|
d="M9.83 8.79L8 9.456V13H6V8.05h.015l5.268-1.918c.244-.093.51-.14.782-.131a2.616 2.616 0 0 1 2.427 1.82c.186.583.356.977.51 1.182A4.992 4.992 0 0 0 19 11v2a6.986 6.986 0 0 1-5.402-2.547l-.581 3.297L15 15.67V23h-2v-5.986l-2.05-1.987-.947 4.298-6.894-1.215.348-1.97 4.924.868L9.83 8.79zM13.5 5.5a2 2 0 1 1 0-4 2 2 0 0 1 0 4z" /></svg>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-center">
|
||||||
|
<a class="mr-2" href="./">{$_('runners')}</a><svg
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="2"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="h-3 w-3 mr-2 stroke-current"
|
||||||
|
height="1em"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"><line
|
||||||
|
x1="5"
|
||||||
|
y1="12"
|
||||||
|
x2="19"
|
||||||
|
y2="12" />
|
||||||
|
<polyline points="12 5 19 12 12 19" /></svg>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-center">
|
||||||
|
<span class="mr-2">{original_data.firstname}
|
||||||
|
{original_data.middlename || ''}
|
||||||
|
{original_data.lastname}</span>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-8 text-3xl font-extrabold leading-tight">
|
||||||
|
{original_data.firstname}
|
||||||
|
{original_data.middlename || ''}
|
||||||
|
{original_data.lastname}
|
||||||
|
<span data-id="runner_actions_${editable.id}">
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:DELETE')}
|
||||||
|
{#if delete_triggered}
|
||||||
|
<button
|
||||||
|
on:click={deleteRunner}
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('confirm-deletion')}</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
delete_triggered = !delete_triggered;
|
||||||
|
}}
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-400 text-base font-medium text-white sm:w-auto sm:text-sm">{$_('cancel')}</button>
|
||||||
|
{/if}
|
||||||
|
{#if !delete_triggered}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
delete_triggered = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('delete-runner')}</button>
|
||||||
|
{/if}
|
||||||
|
{/if}
|
||||||
|
{#if !delete_triggered}
|
||||||
|
<button
|
||||||
|
disabled={!save_enabled}
|
||||||
|
class:opacity-50={!save_enabled}
|
||||||
|
type="button"
|
||||||
|
on:click={submit}
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('save-changes')}</button>
|
||||||
|
{/if}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- -->
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label
|
||||||
|
for="firstname"
|
||||||
|
class="font-medium text-gray-700">{$_('first-name')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('first-name')}
|
||||||
|
type="text"
|
||||||
|
class:border-red-500={!isFirstnameValid}
|
||||||
|
class:focus:border-red-500={!isFirstnameValid}
|
||||||
|
class:focus:ring-red-500={!isFirstnameValid}
|
||||||
|
bind:value={editable.firstname}
|
||||||
|
name="firstname"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isFirstnameValid}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
{$_('first-name-is-required')}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label
|
||||||
|
for="middlename"
|
||||||
|
class="font-medium text-gray-700">{$_('middle-name')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('middle-name')}
|
||||||
|
type="text"
|
||||||
|
bind:value={editable.middlename}
|
||||||
|
name="middlename"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label
|
||||||
|
for="lastname"
|
||||||
|
class="font-medium text-gray-700">{$_('last-name')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('last-name')}
|
||||||
|
type="text"
|
||||||
|
bind:value={editable.lastname}
|
||||||
|
class:border-red-500={!isLastnameValid}
|
||||||
|
class:focus:border-red-500={!isLastnameValid}
|
||||||
|
class:focus:ring-red-500={!isLastnameValid}
|
||||||
|
name="lastname"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isLastnameValid}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
{$_('last-name-is-required')}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label
|
||||||
|
for="email"
|
||||||
|
class="font-medium text-gray-700">{$_('e-mail-adress')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('e-mail-adress')}
|
||||||
|
type="email"
|
||||||
|
bind:value={editable.email}
|
||||||
|
class:border-red-500={!isEmailValid}
|
||||||
|
class:focus:border-red-500={!isEmailValid}
|
||||||
|
class:focus:ring-red-500={!isEmailValid}
|
||||||
|
name="email"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
{#if !isEmailValid}
|
||||||
|
<span
|
||||||
|
class="flex items-center font-medium tracking-wide text-red-500 text-xs mt-1 ml-1">
|
||||||
|
{$_('valid-email-is-required')}
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label for="phone" class="font-medium text-gray-700">{$_('phone')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('phone')}
|
||||||
|
type="tel"
|
||||||
|
bind:value={editable.phone}
|
||||||
|
name="phone"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<span class="font-medium text-gray-700">{$_('group')}</span>
|
||||||
|
<select
|
||||||
|
bind:value={editable.group}
|
||||||
|
name="team"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2">
|
||||||
|
{#each teams as team}
|
||||||
|
<option value={team.id}>
|
||||||
|
{team.parentGroup.name}
|
||||||
|
>
|
||||||
|
{team.name}
|
||||||
|
</option>
|
||||||
|
{/each}
|
||||||
|
{#each orgs as org}
|
||||||
|
<option value={org.id}>{org.name}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<span class="font-medium text-gray-700">{$_('distance')}</span>
|
||||||
|
<br />
|
||||||
|
<span class="text-gray-700">{original_data.distance} km</span>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{:catch error}
|
||||||
|
<PromiseError {error} />
|
||||||
|
{/await}
|
||||||
@@ -1,10 +1,48 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
|
import store from "../store";
|
||||||
|
import AddRunnerModal from "./AddRunnerModal.svelte";
|
||||||
|
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
||||||
|
import RunnersOverview from "./RunnersOverview.svelte";
|
||||||
|
let current_runners = [];
|
||||||
|
export let modal_open = false;
|
||||||
|
export let import_modal_open = false;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section class="container p-5">
|
<section class="container p-5">
|
||||||
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
||||||
{$_('runners')}
|
{$_('runners')}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:CREATE')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
modal_open = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
Läufer hinzufügen
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
import_modal_open = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
Läufer importieren
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
<p class="mb-8 text-lg text-gray-500">läuft bei ihnen</p>
|
<RunnersOverview bind:current_runners />
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:CREATE')}
|
||||||
|
<AddRunnerModal bind:current_runners bind:modal_open />
|
||||||
|
<ImportRunnerModal
|
||||||
|
on:cancelDelete={(event) => {
|
||||||
|
import_modal_open = false;
|
||||||
|
}}
|
||||||
|
passed_team={{}}
|
||||||
|
passed_orgs={[]}
|
||||||
|
passed_org={{}}
|
||||||
|
opened_from="RunnerOverview"
|
||||||
|
bind:import_modal_open />
|
||||||
|
{/if}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
// import AddUserModal from "./AddUserModal.svelte";
|
||||||
|
import runners_empty from "./runners_empty.svg";
|
||||||
|
// let modal_open = false;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="text-center items-center justify-center">
|
||||||
|
<p class="mb-16 text-lg text-gray-500">
|
||||||
|
<img class="w-full h-44" src={runners_empty} alt="" />
|
||||||
|
<span class="font-bold">There are no runners added yet.</span><br />
|
||||||
|
<span>Add your first runner</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <AddUserModal bind:modal_open /> -->
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import { RunnerService } from "@odit/lfk-client-js";
|
||||||
|
import store from "../store";
|
||||||
|
import RunnersEmptyState from "./RunnersEmptyState.svelte";
|
||||||
|
$: searchvalue = "";
|
||||||
|
$: active_deletes = [];
|
||||||
|
export let current_runners = [];
|
||||||
|
const runners_promise = RunnerService.runnerControllerGetAll().then((val) => {
|
||||||
|
current_runners = val;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:GET')}
|
||||||
|
{#await runners_promise}
|
||||||
|
<div
|
||||||
|
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
|
||||||
|
role="alert">
|
||||||
|
<p class="font-bold">runners are being loaded...</p>
|
||||||
|
<p class="text-sm">{$_('this-might-take-a-moment')}</p>
|
||||||
|
</div>
|
||||||
|
{:then}
|
||||||
|
{#if current_runners.length === 0}
|
||||||
|
<RunnersEmptyState />
|
||||||
|
{:else}
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
bind:value={searchvalue}
|
||||||
|
placeholder={$_('datatable.search')}
|
||||||
|
aria-label={$_('datatable.search')}
|
||||||
|
class="gridjs-input gridjs-search-input mb-4" />
|
||||||
|
<div
|
||||||
|
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
||||||
|
<table class="divide-y divide-gray-200 w-full">
|
||||||
|
<thead class="bg-gray-50">
|
||||||
|
<tr>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('name')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('contact-information')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('group')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('distance-in-km')}
|
||||||
|
</th>
|
||||||
|
<th scope="col" class="relative px-6 py-3">
|
||||||
|
<span class="sr-only">{$_('action')}</span>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="divide-y divide-gray-200">
|
||||||
|
{#each current_runners as runner}
|
||||||
|
{#if Object.values(runner)
|
||||||
|
.toString()
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(searchvalue)}
|
||||||
|
<tr data-rowid="user_{runner.id}">
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-4">
|
||||||
|
<div class="text-sm font-medium text-gray-900">
|
||||||
|
{runner.firstname}
|
||||||
|
{runner.middlename || ''}
|
||||||
|
{runner.lastname}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
{#if runner.email}
|
||||||
|
<div class="text-sm text-gray-500">{runner.email}</div>
|
||||||
|
{/if}
|
||||||
|
{#if runner.phone}
|
||||||
|
<div class="text-sm text-gray-500">{runner.phone}</div>
|
||||||
|
{/if}
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
{runner.group.name}
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">{runner.distance}</td>
|
||||||
|
{#if active_deletes[runner.id] === true}
|
||||||
|
<td
|
||||||
|
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
active_deletes[runner.id] = false;
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">Cancel
|
||||||
|
Delete</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
RunnerService.runnerControllerRemove(runner.id, true)
|
||||||
|
.then((resp) => {
|
||||||
|
current_runners = current_runners.filter((obj) => obj.id !== runner.id);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
// error deleting user
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('confirm-delete')}</button>
|
||||||
|
</td>
|
||||||
|
{:else}
|
||||||
|
<td
|
||||||
|
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
|
<a
|
||||||
|
href="./{runner.id}"
|
||||||
|
class="text-indigo-600 hover:text-indigo-900">Edit</a>
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:DELETE')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
active_deletes[runner.id] = true;
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">{$_('delete')}</button>
|
||||||
|
{/if}
|
||||||
|
</td>
|
||||||
|
{/if}
|
||||||
|
</tr>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{:catch error}
|
||||||
|
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
||||||
|
<span class="inline-block align-middle mr-8">
|
||||||
|
<b class="capitalize">{$_('general_promise_error')}</b>
|
||||||
|
{error}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{/await}
|
||||||
|
{/if}
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
class="flex flex-col lg:flex-row w-full lg:space-x-2 space-y-2 lg:space-y-0 mb-2 lg:mb-4">
|
||||||
<a href="/runners/" class="w-full lg:w-1/4">
|
<a href="/runners/" class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890 dark:bg-gray-900 dark:text-white">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">
|
<div class="text-xs uppercase font-light text-grey-500">
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
</a>
|
</a>
|
||||||
<div class="w-full lg:w-1/4">
|
<div class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890 dark:bg-gray-900 dark:text-white">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">
|
<div class="text-xs uppercase font-light text-grey-500">
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-1/4">
|
<div class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890 dark:bg-gray-900 dark:text-white">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">
|
<div class="text-xs uppercase font-light text-grey-500">
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="w-full lg:w-1/4">
|
<div class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890 dark:bg-gray-900 dark:text-white">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">
|
<div class="text-xs uppercase font-light text-grey-500">
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<a href="/teams/" class="w-full lg:w-1/4">
|
<a href="/teams/" class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890 dark:bg-gray-900 dark:text-white">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">
|
<div class="text-xs uppercase font-light text-grey-500">
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
</a>
|
</a>
|
||||||
<a href="/orgs/" class="w-full lg:w-1/4">
|
<a href="/orgs/" class="w-full lg:w-1/4">
|
||||||
<div
|
<div
|
||||||
class="widget w-full p-4 rounded-lg bg-white border border-grey-100 dark:bg-grey-895 dark:border-grey-890 dark:bg-gray-900 dark:text-white">
|
class="widget w-full p-4 rounded-lg bg-white border border-grey-100">
|
||||||
<div class="flex flex-row items-center justify-between">
|
<div class="flex flex-row items-center justify-between">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="text-xs uppercase font-light text-grey-500">
|
<div class="text-xs uppercase font-light text-grey-500">
|
||||||
|
|||||||
@@ -0,0 +1,244 @@
|
|||||||
|
<script>
|
||||||
|
import {
|
||||||
|
RunnerOrganizationService,
|
||||||
|
RunnerTeamService,
|
||||||
|
} from "@odit/lfk-client-js";
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import store from "../store";
|
||||||
|
import ImportRunnerModal from "./ImportRunnerModal.svelte";
|
||||||
|
import PromiseError from "./PromiseError.svelte";
|
||||||
|
import ConfirmTeamDeletion from "./ConfirmTeamDeletion.svelte";
|
||||||
|
export let params;
|
||||||
|
let [teamdata, original, delete_team, orgs, modal_open] = [
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
{},
|
||||||
|
[],
|
||||||
|
false,
|
||||||
|
];
|
||||||
|
export let import_modal_open = false;
|
||||||
|
$: delete_triggered = false;
|
||||||
|
$: save_enabled = !data_changed;
|
||||||
|
$: data_loaded = false;
|
||||||
|
$: data_changed = JSON.stringify(teamdata) === JSON.stringify(original);
|
||||||
|
//
|
||||||
|
const promise = RunnerTeamService.runnerTeamControllerGetOne(
|
||||||
|
params.teamid
|
||||||
|
).then((value) => {
|
||||||
|
data_loaded = true;
|
||||||
|
teamdata = Object.assign(teamdata, value);
|
||||||
|
original = Object.assign(original, value);
|
||||||
|
});
|
||||||
|
RunnerOrganizationService.runnerOrganizationControllerGetAll().then((val) => {
|
||||||
|
orgs = val;
|
||||||
|
});
|
||||||
|
function deleteTeam() {
|
||||||
|
RunnerTeamService.runnerTeamControllerRemove(original.id, false)
|
||||||
|
.then((resp) => {
|
||||||
|
Toastify({
|
||||||
|
text: "Organization deleted",
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
location.replace("./");
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
modal_open = true;
|
||||||
|
delete_team = original;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function submit() {
|
||||||
|
if (data_loaded === true && save_enabled) {
|
||||||
|
Toastify({
|
||||||
|
text: "updating team",
|
||||||
|
duration: 2500,
|
||||||
|
}).showToast();
|
||||||
|
teamdata.parentGroup = teamdata.parentGroup.id;
|
||||||
|
RunnerTeamService.runnerTeamControllerPut(original.id, teamdata)
|
||||||
|
.then((resp) => {
|
||||||
|
Object.assign(original, teamdata);
|
||||||
|
original = teamdata;
|
||||||
|
Object.assign(original, teamdata);
|
||||||
|
//
|
||||||
|
Toastify({
|
||||||
|
text: "updated team",
|
||||||
|
duration: 2500,
|
||||||
|
backgroundColor: "linear-gradient(to right, #00b09b, #96c93d)",
|
||||||
|
}).showToast();
|
||||||
|
})
|
||||||
|
.catch((err) => {});
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<ImportRunnerModal
|
||||||
|
on:cancelDelete={(event) => {
|
||||||
|
import_modal_open = false;
|
||||||
|
}}
|
||||||
|
passed_team={teamdata}
|
||||||
|
passed_orgs={[]}
|
||||||
|
passed_org={{}}
|
||||||
|
opened_from="TeamDetail"
|
||||||
|
bind:import_modal_open />
|
||||||
|
<ConfirmTeamDeletion bind:modal_open bind:delete_team />
|
||||||
|
{#if data_loaded}
|
||||||
|
<section class="container p-5">
|
||||||
|
<div class="mb-8 text-3xl font-extrabold leading-tight">
|
||||||
|
{original.name}
|
||||||
|
<span data-id="org_actions_${teamdata.id}">
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('RUNNER:IMPORT')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
import_modal_open = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
{$_('import-runners')}
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('TEAM:DELETE')}
|
||||||
|
{#if delete_triggered}
|
||||||
|
<button
|
||||||
|
on:click={deleteTeam}
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('confirm-delete')}</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
delete_triggered = !delete_triggered;
|
||||||
|
}}
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-400 text-base font-medium text-white sm:w-auto sm:text-sm">{$_('cancel')}</button>
|
||||||
|
{/if}
|
||||||
|
{#if !delete_triggered}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
delete_triggered = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('delete-team')}</button>
|
||||||
|
{/if}
|
||||||
|
{/if}
|
||||||
|
{#if !delete_triggered}
|
||||||
|
<button
|
||||||
|
on:click={submit}
|
||||||
|
disabled={!save_enabled}
|
||||||
|
class:opacity-50={!save_enabled}
|
||||||
|
type="button"
|
||||||
|
class="w-full justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">{$_('save-changes')}</button>
|
||||||
|
{/if}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row mb-4">
|
||||||
|
<div class="w-full">
|
||||||
|
<nav class="w-full flex">
|
||||||
|
<ol class="list-none flex flex-row items-center justify-start">
|
||||||
|
<li class="mr-2 flex items-center">
|
||||||
|
<svg
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="2"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="h-3 w-3 stroke-current"
|
||||||
|
height="1em"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"><path
|
||||||
|
d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
|
||||||
|
<polyline points="9 22 9 12 15 12 15 22" /></svg>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-center">
|
||||||
|
<a class="mr-2" href="/">Home</a><svg
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="2"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="h-3 w-3 mr-2 stroke-current"
|
||||||
|
height="1em"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"><line
|
||||||
|
x1="5"
|
||||||
|
y1="12"
|
||||||
|
x2="19"
|
||||||
|
y2="12" />
|
||||||
|
<polyline points="12 5 19 12 12 19" /></svg>
|
||||||
|
</li>
|
||||||
|
<li class="mr-2 flex items-center">
|
||||||
|
<svg
|
||||||
|
class="flex-shrink-0 w-5 h-5 mr-2"
|
||||||
|
fill="currentColor"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 640 512"><path
|
||||||
|
fill="currentColor"
|
||||||
|
d="M96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm448 0c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm32 32h-64c-17.6 0-33.5 7.1-45.1 18.6 40.3 22.1 68.9 62 75.1 109.4h66c17.7 0 32-14.3 32-32v-32c0-35.3-28.7-64-64-64zm-256 0c61.9 0 112-50.1 112-112S381.9 32 320 32 208 82.1 208 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zm-223.7-13.4C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z" /></svg>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-center">
|
||||||
|
<a class="mr-2" href="./">Teams</a><svg
|
||||||
|
stroke="currentColor"
|
||||||
|
fill="none"
|
||||||
|
stroke-width="2"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
class="h-3 w-3 mr-2 stroke-current"
|
||||||
|
height="1em"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"><line
|
||||||
|
x1="5"
|
||||||
|
y1="12"
|
||||||
|
x2="19"
|
||||||
|
y2="12" />
|
||||||
|
<polyline points="12 5 19 12 12 19" /></svg>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-center">
|
||||||
|
<span class="mr-2">Team-Details #{params.teamid}</span>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label for="name" class="font-medium text-gray-700">Name</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder="Name"
|
||||||
|
type="text"
|
||||||
|
bind:value={teamdata.name}
|
||||||
|
name="name"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label
|
||||||
|
for="contact"
|
||||||
|
class="font-medium text-gray-700">{$_('contact')}</label>
|
||||||
|
<input
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder={$_('contact')}
|
||||||
|
type="text"
|
||||||
|
bind:value={teamdata.contact}
|
||||||
|
name="contact"
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
|
</div>
|
||||||
|
<div class="text-sm w-full">
|
||||||
|
<label for="org" class="font-medium text-gray-700">Parent Organization</label>
|
||||||
|
<select
|
||||||
|
name="org"
|
||||||
|
bind:value={teamdata.parentGroup}
|
||||||
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2">
|
||||||
|
{#each orgs as o}
|
||||||
|
<option value={o.id}>{o.name}</option>
|
||||||
|
{/each}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{:else}
|
||||||
|
{#await promise}
|
||||||
|
team detail is being loaded...
|
||||||
|
{:catch error}
|
||||||
|
<PromiseError />
|
||||||
|
{/await}
|
||||||
|
{/if}
|
||||||
@@ -1,10 +1,31 @@
|
|||||||
<script>
|
<script>
|
||||||
import { _ } from "svelte-i18n";
|
import { _ } from "svelte-i18n";
|
||||||
|
import store from "../store";
|
||||||
|
import AddTeamModal from "./AddTeamModal.svelte";
|
||||||
|
export let modal_open = false;
|
||||||
|
import TeamsOverview from "./TeamsOverview.svelte";
|
||||||
|
console.log(store.state.jwtinfo.userdetails.permissions);
|
||||||
|
let current_teams=[];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section class="container p-5">
|
<section class="container p-5">
|
||||||
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
<span class="mb-1 text-3xl font-extrabold leading-tight">
|
||||||
{$_('teams')}
|
{$_('teams')}
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('USER:CREATE')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
modal_open = true;
|
||||||
|
}}
|
||||||
|
type="button"
|
||||||
|
class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm">
|
||||||
|
Create Team
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
<p class="mb-8 text-lg text-gray-500">everything is more fun together 🏃♂️🏃♀️🏃♂️</p>
|
<p class="mb-8 text-lg text-gray-500">everything is more fun together 🏃♂️🏃♀️🏃♂️</p>
|
||||||
|
<TeamsOverview bind:current_teams />
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('USER:CREATE')}
|
||||||
|
<AddTeamModal bind:current_teams bind:modal_open />
|
||||||
|
{/if}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script>
|
||||||
|
import { _ } from "svelte-i18n";
|
||||||
|
import AddTeamModal from "./AddTeamModal.svelte";
|
||||||
|
import team_empty from "./team_empty.svg";
|
||||||
|
let modal_open = false;
|
||||||
|
let current_teams = [];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="text-center items-center justify-center">
|
||||||
|
<p class="mb-16 text-lg text-gray-500">
|
||||||
|
<img class="w-full h-44" src={team_empty} alt="" />
|
||||||
|
<span class="font-bold">There are no teams added yet.</span><br />
|
||||||
|
<span>Add your first team</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<AddTeamModal bind:modal_open bind:current_teams />
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
<script>
|
||||||
|
import { t, _ } from "svelte-i18n";
|
||||||
|
import Toastify from "toastify-js";
|
||||||
|
import { RunnerTeamService } from "@odit/lfk-client-js";
|
||||||
|
const teams_promise = RunnerTeamService.runnerTeamControllerGetAll();
|
||||||
|
import { users as usersstore } from "../store.js";
|
||||||
|
import store from "../store";
|
||||||
|
import TeamsEmptyState from "./TeamsEmptyState.svelte";
|
||||||
|
import ConfirmTeamDeletion from "./ConfirmTeamDeletion.svelte";
|
||||||
|
$: searchvalue = "";
|
||||||
|
$: active_deletes = [];
|
||||||
|
export let current_teams = [];
|
||||||
|
let modal_open = false;
|
||||||
|
let delete_team = {};
|
||||||
|
usersstore.subscribe((val) => {
|
||||||
|
current_teams = val;
|
||||||
|
});
|
||||||
|
teams_promise.then((data) => {
|
||||||
|
usersstore.set(data);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<ConfirmTeamDeletion
|
||||||
|
on:cancelDelete={(event) => {
|
||||||
|
modal_open = false;
|
||||||
|
active_deletes[event.detail.id] = false;
|
||||||
|
}}
|
||||||
|
bind:modal_open
|
||||||
|
bind:delete_team />
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('TEAM:GET')}
|
||||||
|
{#await teams_promise}
|
||||||
|
<div
|
||||||
|
class="bg-teal-lightest border-t-4 border-teal rounded-b text-teal-darkest px-4 py-3 shadow-md my-2"
|
||||||
|
role="alert">
|
||||||
|
<p class="font-bold">teams are being loaded...</p>
|
||||||
|
<p class="text-sm">{$_('this-might-take-a-moment')}</p>
|
||||||
|
</div>
|
||||||
|
{:then}
|
||||||
|
{#if current_teams.length === 0}
|
||||||
|
<TeamsEmptyState />
|
||||||
|
{:else}
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
bind:value={searchvalue}
|
||||||
|
placeholder={$_('datatable.search')}
|
||||||
|
aria-label={$_('datatable.search')}
|
||||||
|
class="gridjs-input gridjs-search-input mb-4" />
|
||||||
|
<div
|
||||||
|
class="shadow border-b border-gray-200 sm:rounded-lg overflow-x-scroll">
|
||||||
|
<table class="divide-y divide-gray-200 w-full">
|
||||||
|
<thead class="bg-gray-50">
|
||||||
|
<tr>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
Name
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
{$_('organization')}
|
||||||
|
</th>
|
||||||
|
<th
|
||||||
|
scope="col"
|
||||||
|
class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
||||||
|
Contact
|
||||||
|
</th>
|
||||||
|
<th scope="col" class="relative px-6 py-3">
|
||||||
|
<span class="sr-only">Action</span>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="divide-y divide-gray-200">
|
||||||
|
{#each current_teams as t}
|
||||||
|
{#if Object.values(t)
|
||||||
|
.toString()
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(searchvalue)}
|
||||||
|
<tr data-rowid="team_{t.id}">
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-4">
|
||||||
|
<div
|
||||||
|
class="text-sm font-medium text-gray-900">
|
||||||
|
{t.name}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-4">
|
||||||
|
<div
|
||||||
|
class="text-sm font-medium text-gray-900">
|
||||||
|
{#if t.parentGroup}
|
||||||
|
{t.parentGroup.name}
|
||||||
|
{:else}no organization specified{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="px-6 py-4 whitespace-nowrap">
|
||||||
|
<div class="flex items-center">
|
||||||
|
<div class="ml-4">
|
||||||
|
<div
|
||||||
|
class="text-sm font-medium text-gray-900">
|
||||||
|
{#if t.contact}
|
||||||
|
{JSON.stringify(t.contact)}
|
||||||
|
{:else}no contact specified{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
{#if active_deletes[t.id] === true}
|
||||||
|
<td
|
||||||
|
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
active_deletes[t.id] = false;
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-indigo-600 hover:text-indigo-900 cursor-pointer">Cancel
|
||||||
|
Delete</button>
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
RunnerTeamService.runnerTeamControllerRemove(t.id, false)
|
||||||
|
.then((resp) => {
|
||||||
|
current_teams = current_teams.filter((obj) => obj.id !== t.id);
|
||||||
|
Toastify({
|
||||||
|
text: 'Organization deleted',
|
||||||
|
duration: 500,
|
||||||
|
backgroundColor:
|
||||||
|
'linear-gradient(to right, #00b09b, #96c93d)',
|
||||||
|
}).showToast();
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
modal_open = true;
|
||||||
|
delete_team = t;
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">Confirm
|
||||||
|
Delete</button>
|
||||||
|
</td>
|
||||||
|
{:else}
|
||||||
|
<td
|
||||||
|
class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
|
||||||
|
<a
|
||||||
|
href="./{t.id}"
|
||||||
|
class="text-indigo-600 hover:text-indigo-900">Edit</a>
|
||||||
|
{#if store.state.jwtinfo.userdetails.permissions.includes('TEAM:DELETE')}
|
||||||
|
<button
|
||||||
|
on:click={() => {
|
||||||
|
active_deletes[t.id] = true;
|
||||||
|
}}
|
||||||
|
tabindex="0"
|
||||||
|
class="ml-4 text-red-600 hover:text-red-900 cursor-pointer">Delete</button>
|
||||||
|
{/if}
|
||||||
|
</td>
|
||||||
|
{/if}
|
||||||
|
</tr>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{:catch error}
|
||||||
|
<div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-red-500">
|
||||||
|
<span class="inline-block align-middle mr-8">
|
||||||
|
<b class="capitalize">{$_('general_promise_error')}</b>
|
||||||
|
{error}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
{/await}
|
||||||
|
{/if}
|
||||||
@@ -206,7 +206,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
bind:value={editable_userdata.firstname}
|
bind:value={editable_userdata.firstname}
|
||||||
name="firstname"
|
name="firstname"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label
|
<label
|
||||||
@@ -218,7 +218,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
bind:value={editable_userdata.middlename}
|
bind:value={editable_userdata.middlename}
|
||||||
name="middlename"
|
name="middlename"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label
|
<label
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
bind:value={editable_userdata.lastname}
|
bind:value={editable_userdata.lastname}
|
||||||
name="lastname"
|
name="lastname"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label
|
<label
|
||||||
@@ -242,7 +242,7 @@
|
|||||||
type="email"
|
type="email"
|
||||||
bind:value={editable_userdata.email}
|
bind:value={editable_userdata.email}
|
||||||
name="email"
|
name="email"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<label
|
<label
|
||||||
@@ -254,14 +254,14 @@
|
|||||||
type="text"
|
type="text"
|
||||||
bind:value={editable_userdata.username}
|
bind:value={editable_userdata.username}
|
||||||
name="username"
|
name="username"
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2" />
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-sm w-full">
|
<div class="text-sm w-full">
|
||||||
<span class="font-medium">{$_('groups')}</span>
|
<span class="font-medium">{$_('groups')}</span>
|
||||||
<!-- svelte-ignore a11y-no-onchange -->
|
<!-- svelte-ignore a11y-no-onchange -->
|
||||||
<select
|
<select
|
||||||
bind:value={usergroups_array}
|
bind:value={usergroups_array}
|
||||||
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 dark:bg-gray-900 dark:text-gray-100 rounded-md p-2"
|
class="mt-1 focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm rounded-l-md sm:text-sm border-gray-300 border bg-gray-50 text-gray-500 rounded-md p-2"
|
||||||
multiple>
|
multiple>
|
||||||
{#each allgroups as g}
|
{#each allgroups as g}
|
||||||
{#if usergroups_array.includes(g.id)}
|
{#if usergroups_array.includes(g.id)}
|
||||||
@@ -291,7 +291,7 @@
|
|||||||
{#each allpermissions as p}
|
{#each allpermissions as p}
|
||||||
{#if !editable_userdata.permissions.includes(p)}
|
{#if !editable_userdata.permissions.includes(p)}
|
||||||
<p
|
<p
|
||||||
class="block w-full mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 bg-gray-200 p-2 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input">
|
class="block w-full mt-1 text-sm bg-gray-200 p-2 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple form-input">
|
||||||
{p}
|
{p}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
@@ -311,7 +311,7 @@
|
|||||||
{#each allpermissions as p}
|
{#each allpermissions as p}
|
||||||
{#if editable_userdata.permissions.includes(p)}
|
{#if editable_userdata.permissions.includes(p)}
|
||||||
<p
|
<p
|
||||||
class="block w-full mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 bg-gray-200 p-2 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input">
|
class="block w-full mt-1 text-sm bg-gray-200 p-2 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple form-input">
|
||||||
{p}
|
{p}
|
||||||
<button
|
<button
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
export let current_users=[];
|
export let current_users=[];
|
||||||
$: advanced_search = false;
|
$: advanced_search = false;
|
||||||
usersstore.subscribe((val) => {
|
usersstore.subscribe((val) => {
|
||||||
userscache = val;
|
|
||||||
current_users=val;
|
current_users=val;
|
||||||
});
|
});
|
||||||
users_promise.then((data) => {
|
users_promise.then((data) => {
|
||||||
@@ -94,7 +93,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
<div class="ml-4">
|
<div class="ml-4">
|
||||||
<div
|
<div
|
||||||
class="text-sm font-medium text-gray-900 dark:text-gray-100">
|
class="text-sm font-medium text-gray-900">
|
||||||
{u.firstname}
|
{u.firstname}
|
||||||
{u.middlename || ''}
|
{u.middlename || ''}
|
||||||
{u.lastname}
|
{u.lastname}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1010 770.563"><circle cx="144.272" cy="391" r="64" fill="#ff6584"/><path d="M275.337 752.5h-.065a8.51 8.51 0 01-8.5-8.5V245a8.51 8.51 0 018.5-8.5h420a8.51 8.51 0 018.5 8.5v388a8.51 8.51 0 01-8.434 8.5z" fill="#f2f2f2"/><path d="M585.772 166h-195V53a9.01 9.01 0 019-9h177a9.01 9.01 0 019 9zm-193-2h191V53a7.008 7.008 0 00-7-7h-177a7.008 7.008 0 00-7 7z" fill="#3f3d56"/><path d="M446.272 87h84a8 8 0 018 8v120h-100V95a8 8 0 018-8z" fill="#e6e6e6"/><path d="M462.772 46h-41V5a5.006 5.006 0 015-5h31a5.006 5.006 0 015 5zm-39-2h37V5a3.003 3.003 0 00-3-3h-31a3.003 3.003 0 00-3 3zM799.682 648.84c-.399 0-.787 0-1.185-.01a101.522 101.522 0 01-66.895-26.147q-1.019-.928-2.02-1.88l-.31-.295V428.856l.095-.203c.662-1.403 1.334-2.786 2.005-4.17 20.8-42.23 45.06-65.483 68.31-65.483 33.53 0 59.533 45.994 72.05 73.41 17.404 38.124 29.56 85.364 29.56 114.88a101.576 101.576 0 01-100.45 101.54c-.373.01-.772.01-1.16.01zm-68.41-29.19c.554.524 1.113 1.04 1.673 1.55a99.531 99.531 0 0065.588 25.63c.405.01.788-.001 1.175.01.363 0 .735 0 1.098-.01 54.312-.602 98.486-45.256 98.486-99.54 0-29.26-12.082-76.159-29.38-114.05-12.317-26.98-37.82-72.24-70.23-72.24-22.449 0-46.07 22.857-66.513 64.362a431.309 431.309 0 00-1.897 3.942z" fill="#3f3d56"/><path d="M799.677 770.088a1.15 1.15 0 01-1.15-1.15V534.068a1.15 1.15 0 112.3 0v234.868a1.15 1.15 0 01-1.15 1.15zM202.677 770.088a1.15 1.15 0 01-1.15-1.15V534.068a1.15 1.15 0 112.3 0v234.868a1.15 1.15 0 01-1.15 1.15z" fill="#ccc"/><path d="M799.678 577.95a1.148 1.148 0 01-.87-.396l-57.864-66.73a1.15 1.15 0 011.739-1.508l57.863 66.73a1.15 1.15 0 01-.868 1.905zM799.677 616.462a1.15 1.15 0 01-.813-1.964l32.879-32.88a1.15 1.15 0 011.627 1.627l-32.88 32.88a1.146 1.146 0 01-.813.337z" fill="#ccc"/><path d="M906.124 770.563h-86.005v-1a43.003 43.003 0 1186.005 0zm-83.993-2h81.981a41.003 41.003 0 00-81.981 0z" fill="#3f3d56"/><path d="M863.121 745.156a1.135 1.135 0 00-1.135 1.136v12.06l-11.748-10.084a1.135 1.135 0 10-1.479 1.723l13.227 11.352v7.085a1.135 1.135 0 102.27 0v-22.136a1.135 1.135 0 00-1.135-1.136zM185.124 770.563H99.119v-1a43.003 43.003 0 1186.005 0zm-83.993-2h81.981a41.003 41.003 0 00-81.981 0z" fill="#3f3d56"/><path d="M142.121 745.156a1.135 1.135 0 00-1.135 1.136v12.06l-11.748-10.084a1.135 1.135 0 10-1.479 1.723l13.227 11.352v7.085a1.135 1.135 0 102.27 0v-22.136a1.135 1.135 0 00-1.135-1.136zM203.682 648.84c-.399 0-.787 0-1.185-.01a101.581 101.581 0 01-100.435-101.54c0-29.517 12.156-76.757 29.561-114.88C144.14 404.994 170.146 359 203.682 359c13.813 0 27.722 7.873 41.341 23.4a95.432 95.432 0 012.02 2.363l.229.278v253.986l-.564.273c-.673.326-1.356.632-2.04.928a100.608 100.608 0 01-39.826 8.602c-.373.01-.772.01-1.16.01zm0-287.84c-32.417 0-57.922 45.26-70.24 72.24-17.298 37.89-29.38 84.79-29.38 114.05 0 54.275 44.174 98.928 98.47 99.54.405.01.783.013 1.176.01.363 0 .735 0 1.098-.01a98.656 98.656 0 0039.061-8.435c.472-.204.94-.412 1.405-.627V385.76a96.587 96.587 0 00-1.75-2.04C230.297 368.644 216.894 361 203.682 361z" fill="#3f3d56"/><path d="M203.678 577.95a1.148 1.148 0 01-.87-.396l-57.864-66.73a1.15 1.15 0 011.739-1.508l57.863 66.73a1.15 1.15 0 01-.868 1.905zM203.677 616.462a1.15 1.15 0 01-.813-1.964l32.879-32.88a1.15 1.15 0 011.627 1.627l-32.88 32.88a1.146 1.146 0 01-.813.337z" fill="#ccc"/><path d="M294.031 174l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm9.76-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277 0 00-.18-1.5h31.36a6.277 6.277 0 00-.18 1.5zm-34.24-3.5l.74 1.46a4.423 4.423 0 01.5 2.04V217h35v-39.5a4.423 4.423 0 01.5-2.04l.74-1.46zm34.24 3.5V215h-31v-37.5a6.277 6.277Line truncated
|
||||||
|
After Width: | Height: | Size: 25 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 854.63 686"><path fill="#3f3d56" d="M0 600h821v9.053H0zM0 676.947h821V686H0z"/><path d="M750.178 608.328c-.49-.802-12.06-20.12-16.071-60.234-3.68-36.802-1.313-98.836 30.858-185.367 60.947-163.928-14.046-296.194-14.812-297.512l3.7-2.146c.194.334 19.545 34.057 30.977 87.755a382.846 382.846 0 01-15.856 213.394c-60.844 163.648-15.61 241.118-15.146 241.882z" fill="#3f3d56"/><circle cx="726.346" cy="27.795" r="27.795" fill="#3f3d56"/><circle cx="814.007" cy="130.422" r="27.795" fill="#3f3d56"/><circle cx="754.141" cy="198.841" r="27.795" fill="#dfe5ee"/><circle cx="826.835" cy="256.569" r="27.795" fill="#dfe5ee"/><circle cx="732.76" cy="346.368" r="27.795" fill="#3f3d56"/><path d="M766.97 609.35s-27.796-68.418 55.59-119.731zM732.786 608.11s-12.65-72.758-110.557-72.134z" fill="#3f3d56"/><circle cx="136.5" cy="387.5" r="41" fill="#a0616a"/><path d="M143.928 336.504c-7.84-1.925-16.272-2.247-23.868.49-7.824 2.817-14.263 8.708-19 15.542s-7.918 14.613-10.767 22.425a78.442 78.442 0 00-3.845 13.14 44.992 44.992 0 008.167 34.325c-1.2-3.166 1.822-6.617 5.138-7.303s6.693.474 9.963 1.353a61.559 61.559 0 0017.68 2.078c2.284-.065 4.679-.295 6.578-1.565 5.952-3.98 2.802-14.263 7.754-19.434 1.767-1.845 4.29-2.708 6.567-3.865 8.2-4.167 13.604-12.576 16.156-21.413 1.599-5.54 5.567-21.45 2.185-26.598-3.057-4.653-17.516-7.9-22.708-9.175z" fill="#2f2e41"/><path d="M248.066 342.291a24.396 24.396 0 00-18.677 1.041c-10.695 5.016-29.608 17.167-28.889 40.168 1 32 12 53 12 53l-2 65-10 118s-49 40-30 50 51-48 51-48l25-67 9-65s15-68 0-98c0 0 17.328-40.17-7.434-49.209zM367.5 445.5s-17 72 43 92 139 54 139 54l10 17 23-31-4-24-39-11s-73-56-105-60l4-37zM527.307 387.717L548.5 422.5s70 40 88 67 61 56 61 56l-19 45s-54-63-77-69-125-88-125-88z" fill="#a0616a"/><path d="M338.568 265.819c-7.805 1.226-15.617 2.454-23.33 4.174-17.917 3.995-35.147 10.616-51.966 17.974a608.405 608.405 0 00-68.447 35.267 132.255 132.255 0 00-16.97 11.523c-3.559 2.964-6.91 6.363-8.82 10.584a33.406 33.406 0 00-2.33 9.221c-1.55 11.12-1.477 22.595 1.535 33.41s9.124 20.955 18.119 27.674a29.88 29.88 0 007.84 4.348 45.675 45.675 0 0011.675 1.957c12.617 1.003 25.798 1.923 37.474-2.964 7.42-3.105 13.701-8.354 20.528-12.607 28.913-18.008 65.646-17.241 97.26-29.92 3.074-1.233 6.204-2.67 8.354-5.189a22.578 22.578 0 003.62-7.187l11.99-33.188c2.533-7.01 5.067-14.023 7.193-21.167 2.224-7.472 3.996-15.07 5.766-22.661 1.524-6.534 3.093-13.376 2.507-20.13-.864-9.962-3.166-10.367-12.316-8.925q-24.839 3.915-49.682 7.806z" fill="#dfe5ee"/><path d="M218.066 342.291a24.396 24.396 0 00-18.677 1.041c-10.695 5.016-29.608 17.167-28.889 40.168 1 32 12 53 12 53l-2 65-10 118s-49 40-30 50 51-48 51-48l25-67 9-65s15-68 0-98c0 0 17.328-40.17-7.434-49.209z" fill="#a0616a"/><path d="M391.66 257.544S480.5 249.5 476.5 304.5s-34 150-34 150l-77 4s-10-65 4-87z" fill="#2f2e41"/><path d="M453.5 275.5s22 14 34 42 48 83 48 83l-59 42-44-45zM559.5 587.5s-19 7-6 21a126.61 126.61 0 0120 29s-4 26 13 25 24-36 20-48-9-69-9-69-35 3-34 8 6 30-4 34zM678.5 567.5s-18 9-13 17 21 31 21 31-6 30 11 33 27-36 24-44-3-39-3-39 1-31-9-31-27 4-27 4 4 28-4 29z" fill="#2f2e41"/><path fill="#dfe5ee" d="M96 617.871h29v50.612H96z"/></svg>
|
||||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 750 500"><g fill="#ebebeb"><path d="M483.37 71.82l-1.19 1.9c-10 16.08-10.74 36.34-1.24 52.53a50.47 50.47 0 004.11 6 53.35 53.35 0 0046.61 19c10.28-1.15 20.71-5.28 30.67-2.63 13 3.45 20.08 16.83 25.71 28.91s12.78 25.47 25.76 28.84c8.13 2.12 16.93-.34 24.26-4.54 19.41-11.13 30.23-34 30.17-56.18s-9.77-43.36-23.43-60.73c-19.14-24.34-47.15-42.54-78.14-46.34s-64.54 8.22-83.29 33.24zM65.1 232.78l1.35 1.11a38.71 38.71 0 0045.32 3.72 41.44 41.44 0 0019.39-34c.16-8-2-16.48 1.08-23.89 4-9.63 15-13.75 24.87-16.86S178 155.64 181.93 146c2.46-6.05 1.46-13.07-1-19.14-6.6-16.07-23.14-26.73-40.2-28.93s-34.38 3.13-49.14 11.88C70.87 122.08 54 141.8 48 165.28s-.26 50.52 17.1 67.5z"/><circle cx="344.93" cy="76.31" r="26.73"/><circle cx="677.53" cy="291.13" r="20.86"/><circle cx="58.34" cy="311.27" r="20.86" transform="rotate(-80.17 58.35 311.279)"/></g><path d="M198.54 58.07s-11.93-4.29-19.93-1.76-10.26 7.6-16.36 7.34c-4.82-.21-8.28-2.2-10.14-7.26S150.06 45 133.67 46c-12.54.81-13.75 2.68-13.75 2.68l-.43 33.43c7.07-1.32 14.31-2.33 22.13-1.44a9.35 9.35 0 017.54 7.81c1.1 7.11 8.51 9.69 12.9 9.57 6.29-.18 9.36-4.51 14.65-5.89 8.31-2.15 22.86 3.31 22.86 3.31z" fill="#ebd8ed"/><path d="M154.13 85c.13 0 .19-5.54.13-12.38s-.2-12.37-.33-12.37-.19 5.54-.13 12.38.2 12.37.33 12.37zM167 70.2c-.13 0-.08 5.73.11 12.78s.46 12.76.59 12.76.07-5.72-.12-12.78-.51-12.76-.58-12.76z" fill="#263238"/><path d="M167.49 90.08c.16 2.56.17 6 .17 6-1.84 1.31-5.69 2.17-7.86 1.56h-.06a8.72 8.72 0 01-6-6.12 10.45 10.45 0 01-.42-3c.48-8.51 1.11-19.12.61-27.63a14.2 14.2 0 0013.13 2.46z" opacity=".2"/><path d="M168 64.54a7.57 7.57 0 001.07-.66l2.85-1.88a31.59 31.59 0 0110.19-4.63 23.3 23.3 0 0111.12.35 46.47 46.47 0 014.38 1.64 7.36 7.36 0 00-1.09-.65 20.43 20.43 0 00-3.2-1.3A22.37 22.37 0 00182 56.9a29.89 29.89 0 00-10.27 4.82c-1.2.82-2.14 1.52-2.79 2a5.39 5.39 0 00-.94.82zM138.5 48.28c0 .08.89-.05 2.28.08a11 11 0 018.76 5.74c.68 1.23.91 2.09 1 2.07a5.86 5.86 0 00-.69-2.22 10.51 10.51 0 00-9-5.92 5.57 5.57 0 00-2.35.25z" fill="#fff" opacity=".6"/><path fill="#263238" d="M119.18 45.28l-1.83 222.67 1.66.35 2.08-222.94-1.91-.08z"/><g><path d="M572.23 448.27l4.65 14.61s-13.3 9.64-12.7 12.42l28.66-8-6.31-23.06z" fill="#ebd8ed"/><path d="M585.39 459.17a1.2 1.2 0 011.18 1.11 1.17 1.17 0 01-1.09 1.18 1.29 1.29 0 01-1.24-1.18 1.21 1.21 0 011.27-1.11M593 467.9l-.61-2.23-27.52 7.86s-1.12.91-.72 1.77z" fill="#e0e0e0"/><path d="M576.37 462.87c0 .14.76 0 1.58.26s1.34.75 1.45.65-.32-.84-1.31-1.13-1.79.1-1.72.22zM573.71 465c0 .14.68.21 1.32.67s1 1.05 1.09 1 0-.86-.8-1.41-1.64-.44-1.61-.26zM573 469c.13 0 .13-.76-.44-1.42s-1.31-.79-1.34-.66.49.43 1 1 .64 1.13.78 1.08zM575.68 459.42c.09.11.68-.26 1.49-.43s1.49-.09 1.53-.23-.69-.47-1.64-.26-1.48.83-1.38.92z" fill="#263238"/><path d="M521.28 430.68l9.72 16.77s-16.88 6.55-17 9.73l32.93.16v-2.56l-7.28-24.44z" fill="#ebd8ed"/><path d="M541.18 445.86a1.34 1.34 0 011 1.52 1.31 1.31 0 01-1.5 1 1.43 1.43 0 01-1-1.62 1.35 1.35 0 011.67-.82M546.91 457.34v-2.56l-31.63.71s-1.45.66-1.27 1.69z" fill="#e0e0e0"/><path d="M531.12 447.29c0 .16.82.22 1.61.72s1.24 1.18 1.38 1.11-.11-1-1.08-1.58-1.94-.4-1.91-.25zM527.39 449c0 .16.67.42 1.22 1.09s.73 1.39.89 1.38.25-.92-.46-1.74-1.65-.87-1.65-.73zM525.44 453.21c.15 0 .36-.77-.07-1.64s-1.18-1.22-1.25-1.08.41.6.75 1.32.41 1.39.57 1.4zM529 443.8c.07.15.81-.09 1.72 0s1.62.32 1.7.18-.61-.7-1.68-.74-1.81.44-1.74.56z" fill="#263238"/><path fill="#ffbe9d" d="M580.57 298.44l1.84 26.3 9.82 1.89 2.05-29.3-13.71 1.11z"/><path d="M577.49 346.65s-.3-6.5-.5-9.09a3.75 3.75 0 01.59-2.35l4.83-7.5v-3l9.82 1.9s.73 7.53.73 8.77c0 .81-.3 5-.52 7.87a3 3 0 01-2.81 2.8 2.44 2.44 0 01-2.26 3 5 5 0 01-3.91 1.32h-1s-.2 1.06-1.89 1.06-1.09-2.29-1.09-2.29l-.24-2.78z" fill="#ffbe9d"/><path d="M579.52 338.61a26.39 26.39 0 01-.29 9 27.4 27.4 0 010-4.49 25.15 25.15 0 01.29-4.51zM584.18 341.79a10 10 0 01-.24 4.39 10.48 10.48 0 01-1.62 4.09c-.14-.07.6-1.87 1.11-4.2s.57-4.28.75-4.28zM587.71 341.88a12.91 12.91 0 01-.93 7.39 28.42 28.42 0 01.49-3.69 29.91 29.91 0 01.44-3.7zM589.75 341.14a5.56 5.56 0 01.33 2.77 5.62 5.62 0 01-.57 2.74 11.66 11.66 0 010-2.76 12.26 12.26 0 01.24-2.75z" fill="#eb996e"/><path d="M523.33 201.42a3.64 3.64 0 01-1.74-7 3.79 3.79 0 013.13-6.47 4.53 4.53 0 016.73-3.89 5.09 5.09 0 016.26-.3 3.62 3.62 0 013.36 6.06" fill="#263238"/><path d="M522.81 201.94a15.44 15.44 0 0115-14.62h.8c8.63.26 13.23 7.73 12.73 16.35l-.44 28.72v1.39l-19.76 4.55-.24-7.33s-8.32-1.06-8.65-9.33c-.17-4 .17-12.26.56-19.73z" fill="#ffbe9d"/><path d="M530.83 231a20.08 20.08 0 0010.76-3.48s-2.38 6-10.67 5.51z" fill="#eb996e"/><path d="M526.54 208.35a1.18 1.18 0 001.17 1.16 1.14 1.14 0 001.19-1.1 1.19 1.19 0 00-1.17-1.17 1.13 1.13 0 00-1.19 1.11zM524.71 205.94c.15.15 1-.54 2.3-.57s2.22.58 2.35.42-.09-.35-.5-.63a3.33 3.33 0 00-1.9-.53 3.11 3.11 0 00-1.82.65c-.38.31-.51.59-.43.66zM538.76 209a1.19 1.19 0 001.17 1.16 1.13 1.13 0 001.19-1.1 1.17 1.17 0 00-1.17-1.16 1.13 1.13 0 00-1.19 1.1zM537.22 205.83cLine truncated
|
||||||
|
After Width: | Height: | Size: 52 KiB |
+14
-1
@@ -2,10 +2,17 @@
|
|||||||
"404message": "Die gesuchte Seite wurde leider nicht gefunden.",
|
"404message": "Die gesuchte Seite wurde leider nicht gefunden.",
|
||||||
"404title": "Fehler 404",
|
"404title": "Fehler 404",
|
||||||
"about": "Über",
|
"about": "Über",
|
||||||
"application_name": "Lauf für Kaya! \n- Admin",
|
"application_name": "Lauf für Kaya! - Admin",
|
||||||
|
"bitte-bestaetige-diese-laeufer-fuer-den-import": "Bitte die Läufer für den import bestätigen.",
|
||||||
"by": "von",
|
"by": "von",
|
||||||
|
"cancel": "Abbrechen",
|
||||||
"cannot-reset-your-password-directly": "Schade. \nWir können das Passwort leider nicht direkt zurücksetzen.\nBitte sende uns eine Mail in der du deine Identität bestätigst.",
|
"cannot-reset-your-password-directly": "Schade. \nWir können das Passwort leider nicht direkt zurücksetzen.\nBitte sende uns eine Mail in der du deine Identität bestätigst.",
|
||||||
"credits": "",
|
"credits": "",
|
||||||
|
"csv_import__class": "Klasse",
|
||||||
|
"csv_import__firstname": "Vorname",
|
||||||
|
"csv_import__lastname": "Nachname",
|
||||||
|
"csv_import__middlename": "Mittelname",
|
||||||
|
"csv_import__team": "Team",
|
||||||
"dashboard-greeting": "Moin",
|
"dashboard-greeting": "Moin",
|
||||||
"datatable": {
|
"datatable": {
|
||||||
"search": "🔍 Suche ...",
|
"search": "🔍 Suche ...",
|
||||||
@@ -26,6 +33,9 @@
|
|||||||
"general-stats": "Allgemeine Statistiken",
|
"general-stats": "Allgemeine Statistiken",
|
||||||
"goback": "Zur Startseite",
|
"goback": "Zur Startseite",
|
||||||
"hallo": "hallo",
|
"hallo": "hallo",
|
||||||
|
"icon-image-credits": "Wir möchten uns außerdem für die verwendeten Icons und Bilder bedanken bei:",
|
||||||
|
"import-runners": "Läufer importieren",
|
||||||
|
"import__target-organization": "Ziel Organisation",
|
||||||
"invalid-mail-reset": "Das ist keine gültige E-Mail",
|
"invalid-mail-reset": "Das ist keine gültige E-Mail",
|
||||||
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
|
"lfk-is-os": "Das \"Lauf für Kaya!\" Frontend ist (wie alle anderen Projekte für den \"LfK!\" auch) ein OpenSource Projekt.",
|
||||||
"log_in": "Anmelden",
|
"log_in": "Anmelden",
|
||||||
@@ -33,8 +43,11 @@
|
|||||||
"login_is_checked": "Login wird überprüft",
|
"login_is_checked": "Login wird überprüft",
|
||||||
"oss_credit_description": "Wir verwenden eine Menge Open Source-Software bei diesen Projekten und möchten uns bei den folgenden Projekten und Mitwirkenden bedanken, die dazu beitragen, Open Source großartig zu machen!",
|
"oss_credit_description": "Wir verwenden eine Menge Open Source-Software bei diesen Projekten und möchten uns bei den folgenden Projekten und Mitwirkenden bedanken, die dazu beitragen, Open Source großartig zu machen!",
|
||||||
"password": "Passwort",
|
"password": "Passwort",
|
||||||
|
"please-provide-the-required-csv-xlsx-file": "Bitte eine CSV oder XLSX Datei hochladen.",
|
||||||
"register": "Registrieren",
|
"register": "Registrieren",
|
||||||
"reset-my-password": "Passwort zurücksetzen",
|
"reset-my-password": "Passwort zurücksetzen",
|
||||||
|
"runner-import": "Läufer Import",
|
||||||
|
"runnerimport_verify_runners_org": "Bitte die Läufer für den Import in die Organisation \"{org_name}\" bestätigen",
|
||||||
"runners": "Läufer",
|
"runners": "Läufer",
|
||||||
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
|
"send-a-mail-to-lfk-odit-services": "Sende eine Mail an lfk@odit.services",
|
||||||
"settings": "Einstellungen",
|
"settings": "Einstellungen",
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
"address": "Address",
|
"address": "Address",
|
||||||
"application_name": "Lauf für Kaya! - Admin",
|
"application_name": "Lauf für Kaya! - Admin",
|
||||||
"author": "Author",
|
"author": "Author",
|
||||||
|
"bitte-bestaetige-diese-laeufer-fuer-den-import": "Please confirm these runners for import",
|
||||||
"browse": "Browse",
|
"browse": "Browse",
|
||||||
"by": "by",
|
"by": "by",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
@@ -14,14 +15,22 @@
|
|||||||
"changelog": "Changelog",
|
"changelog": "Changelog",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
"confirm-delete": "Confirm Delete",
|
"confirm-delete": "Confirm Delete",
|
||||||
|
"confirm-deletion": "Confirm Deletion",
|
||||||
"contact": "Contact",
|
"contact": "Contact",
|
||||||
|
"contact-information": "Contact Information",
|
||||||
"count_organizations": "# Organizations",
|
"count_organizations": "# Organizations",
|
||||||
"count_teams": "# Teams",
|
"count_teams": "# Teams",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
|
"create-a-new-runner": "Create a new Runner",
|
||||||
"create-a-new-track": "Create a new Track",
|
"create-a-new-track": "Create a new Track",
|
||||||
"create-organization": "Create Organization",
|
"create-organization": "Create Organization",
|
||||||
"create-user": "Create User",
|
"create-user": "Create User",
|
||||||
"credits": "Credits",
|
"credits": "Credits",
|
||||||
|
"csv_import__class": "Class",
|
||||||
|
"csv_import__firstname": "Firstname",
|
||||||
|
"csv_import__lastname": "Lastname",
|
||||||
|
"csv_import__middlename": "Middlename",
|
||||||
|
"csv_import__team": "Team",
|
||||||
"dashboard-greeting": "hello there",
|
"dashboard-greeting": "hello there",
|
||||||
"dashboard-title": "Dashboard",
|
"dashboard-title": "Dashboard",
|
||||||
"datatable": {
|
"datatable": {
|
||||||
@@ -39,9 +48,14 @@
|
|||||||
"no_matching_records_found": "No matching records found",
|
"no_matching_records_found": "No matching records found",
|
||||||
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
|
"an_error_happened_while_fetching_the_data": "An error happened while fetching the data"
|
||||||
},
|
},
|
||||||
|
"delete": "Delete",
|
||||||
"delete-organization": "Delete Organization",
|
"delete-organization": "Delete Organization",
|
||||||
|
"delete-runner": "Delete Runner",
|
||||||
|
"delete-team": "Delete Team",
|
||||||
"delete-user": "Delete User",
|
"delete-user": "Delete User",
|
||||||
"dependency_name": "Name",
|
"dependency_name": "Name",
|
||||||
|
"distance": "Distance",
|
||||||
|
"distance-in-km": "Distance in km",
|
||||||
"dont-have-your-email-connected": "Don't have your email connected?",
|
"dont-have-your-email-connected": "Don't have your email connected?",
|
||||||
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
|
"dont-panic-were-resetting-it": "Don't panic, we're resetting it ✌",
|
||||||
"drag-and-drop-your-files-or": "Drag & Drop your files or",
|
"drag-and-drop-your-files-or": "Drag & Drop your files or",
|
||||||
@@ -75,8 +89,12 @@
|
|||||||
"general-stats": "General Stats",
|
"general-stats": "General Stats",
|
||||||
"general_promise_error": "😢 Error",
|
"general_promise_error": "😢 Error",
|
||||||
"goback": "Go Home",
|
"goback": "Go Home",
|
||||||
|
"group": "Group",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"hallo": "hello",
|
"hallo": "hello",
|
||||||
|
"icon-image-credits": "We also want to thank these projects for illustrations and icons:",
|
||||||
|
"import-runners": "Import runners",
|
||||||
|
"import__target-organization": "Target Organization",
|
||||||
"installed-version": "Installed version",
|
"installed-version": "Installed version",
|
||||||
"invalid-mail-reset": "the provided email is invalid",
|
"invalid-mail-reset": "the provided email is invalid",
|
||||||
"last-name": "Last name",
|
"last-name": "Last name",
|
||||||
@@ -92,26 +110,37 @@
|
|||||||
"manage-admin-users": "manage admin users",
|
"manage-admin-users": "manage admin users",
|
||||||
"middle-name": "Middle name",
|
"middle-name": "Middle name",
|
||||||
"minimum-lap-time-in-s": "minimum lap time in s",
|
"minimum-lap-time-in-s": "minimum lap time in s",
|
||||||
|
"name": "Name",
|
||||||
"no-license-text-could-be-found": "No license text could be found 😢",
|
"no-license-text-could-be-found": "No license text could be found 😢",
|
||||||
"no-tracks-added-yet": "there are no tracks added yet.",
|
"no-tracks-added-yet": "there are no tracks added yet.",
|
||||||
|
"organization": "Organization",
|
||||||
"organizations": "Organizations",
|
"organizations": "Organizations",
|
||||||
"orgs": "Orgs",
|
"orgs": "Orgs",
|
||||||
"oss_credit_description": "We use a lot of open source software on these projects, and would like to thank the following projects and contributors who help make open source great!",
|
"oss_credit_description": "We use a lot of open source software on these projects, and would like to thank the following projects and contributors who help make open source great!",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"password-is-required": "Password is required",
|
"password-is-required": "Password is required",
|
||||||
|
"phone": "Phone",
|
||||||
|
"please-provide-the-required-csv-xlsx-file": "Please provide the required csv/ xlsx file",
|
||||||
|
"please-provide-the-required-information-to-add-a-new-runner": "Please provide the required information to add a new runner.",
|
||||||
"please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.",
|
"please-provide-the-required-information-to-add-a-new-track": "Please provide the required information to add a new track.",
|
||||||
"profile-picture": "Profile Picture",
|
"profile-picture": "Profile Picture",
|
||||||
"read-license": "Read License",
|
"read-license": "Read License",
|
||||||
"register": "Register",
|
"register": "Register",
|
||||||
"repo_link": "Link",
|
"repo_link": "Link",
|
||||||
"reset-my-password": "Reset my password",
|
"reset-my-password": "Reset my password",
|
||||||
|
"runner-import": "Runner Import",
|
||||||
|
"runner-updated": "Runner updated!",
|
||||||
|
"runnerimport_verify_runners_org": "Please confirm these runners for import into the organization \"{org_name}\"",
|
||||||
"runners": "Runners",
|
"runners": "Runners",
|
||||||
"save-changes": "Save Changes",
|
"save-changes": "Save Changes",
|
||||||
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
"send-a-mail-to-lfk-odit-services": "send a mail to lfk@odit.services",
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
"signout": "Sign out",
|
"signout": "Sign out",
|
||||||
"stats-are-being-loaded": "stats are being loaded...",
|
"stats-are-being-loaded": "stats are being loaded...",
|
||||||
|
"team": "Team",
|
||||||
|
"team-name": "Team name",
|
||||||
"teams": "Teams",
|
"teams": "Teams",
|
||||||
|
"the-provided-phone-number-is-invalid-less-than-br-greater-than-please-enter-a-valid-international-number": "the provided phone number is invalid.<br />please enter a valid international number...",
|
||||||
"this-might-take-a-moment": "This might take a moment 👀",
|
"this-might-take-a-moment": "This might take a moment 👀",
|
||||||
"total-distance": "total distance",
|
"total-distance": "total distance",
|
||||||
"total-donations": "total donations",
|
"total-donations": "total donations",
|
||||||
@@ -122,6 +151,7 @@
|
|||||||
"track-length-in-m": "Track Length in m",
|
"track-length-in-m": "Track Length in m",
|
||||||
"track-name": "Track name",
|
"track-name": "Track name",
|
||||||
"tracks": "Tracks",
|
"tracks": "Tracks",
|
||||||
|
"updating-runner": "Updating runner...",
|
||||||
"updating-user": "updating user...",
|
"updating-user": "updating user...",
|
||||||
"user-updated": "User updated",
|
"user-updated": "User updated",
|
||||||
"username": "Username",
|
"username": "Username",
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
const sveltePreprocess = require('svelte-preprocess');
|
|
||||||
|
|
||||||
const preprocess = sveltePreprocess({
|
|
||||||
postcss: {
|
|
||||||
plugins: [ require('tailwindcss'), require('autoprefixer') ]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
preprocess
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
let content_svelteconfig = fs.readFileSync('./s-config.template.js', { encoding: 'utf8' });
|
||||||
|
let content_html = fs.readFileSync('./index.template.html', { encoding: 'utf8' });
|
||||||
|
if (process.env.NODE_ENV_ODIT == 'development_fast') {
|
||||||
|
content_html = content_html.replace(
|
||||||
|
'__TAILWIND_INSERT__',
|
||||||
|
'<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tailwindcss@2.0.2/dist/tailwind.min.css">'
|
||||||
|
);
|
||||||
|
content_svelteconfig = content_svelteconfig.replace('__insert__', '{postcss:{}}');
|
||||||
|
} else {
|
||||||
|
content_html = content_html.replace('__TAILWIND_INSERT__', '');
|
||||||
|
content_svelteconfig = content_svelteconfig.replace(
|
||||||
|
'__insert__',
|
||||||
|
"{postcss:{plugins:[require('tailwindcss'),require('autoprefixer')]}}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
fs.writeFileSync('./public/index.html', content_html);
|
||||||
|
fs.writeFileSync('./svelte.config.js', content_svelteconfig);
|
||||||
|
console.info('dev setup script done');
|
||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const package = JSON.parse(fs.readFileSync(`./package.json`, { encoding: 'utf-8' }));
|
const package = JSON.parse(fs.readFileSync(`./package.json`, { encoding: 'utf-8' }));
|
||||||
const original = fs.readFileSync(`./public/index.html`, { encoding: 'utf-8' });
|
const original = fs.readFileSync(`./index.template.html`, { encoding: 'utf-8' });
|
||||||
let out = original.replace(/RELEASE_INFO-(\S)+-RELEASE_INFO/gi, 'RELEASE_INFO-' + package.version + '-RELEASE_INFO');
|
let out = original.replace(/RELEASE_INFO-(\S)+-RELEASE_INFO/gi, 'RELEASE_INFO-' + package.version + '-RELEASE_INFO');
|
||||||
fs.writeFileSync(`./public/index.html`, out);
|
fs.writeFileSync(`./index.template.html`, out);
|
||||||
+6
-3
@@ -1,6 +1,9 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
globDirectory: 'public',
|
globDirectory: 'public',
|
||||||
globPatterns: [ '**/*.{js,ico,png,svg,html,webmanifest,txt}' ],
|
globPatterns: [ '**/*.{js,ico,png,svg,html,webmanifest,txt,json}' ],
|
||||||
globIgnores: [ 'env.js', 'env.sample.js', 'licenses.json' ],
|
globIgnores: [ 'env.js', 'env.sample.js' ],
|
||||||
swDest: 'public/sw.js'
|
swDest: 'public/sw.js',
|
||||||
|
cleanupOutdatedCaches: true,
|
||||||
|
mode: 'production',
|
||||||
|
sourcemap: false
|
||||||
};
|
};
|
||||||
Reference in new issue
Block a user