Compare commits

..

87 Commits

Author SHA1 Message Date
MarvinF 7b1cc50943 Merge pull request #120 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage -> Prod merge
2025-07-29 18:30:28 +02:00
MarvinF 133a983685 Merge pull request #119 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev -> Stage merge
2025-07-29 18:28:39 +02:00
MarvinF 20b956b239 Merge pull request #118 from Deutscher-Tischfussballbund/feature/refactor-readme
refactor: remove test from readme
2025-07-29 18:21:05 +02:00
Marvin Flock fedb300d8f refactor: remove test from readme 2025-07-29 18:19:01 +02:00
MarvinF 07121c2233 Merge pull request #114 from Deutscher-Tischfussballbund/fix/issue-108-yootheme-path-fix
fix: add base url to yootheme images
2025-07-29 18:01:16 +02:00
MarvinF 8dab7fa74f Merge branch 'sportsmanager2-dev' into fix/issue-108-yootheme-path-fix 2025-07-29 17:59:55 +02:00
jmeyer26 1bd53893a8 Merge pull request #83 from Deutscher-Tischfussballbund/sportsmanager2-juergen
Fix: #74 Player picture improvements & remove 'Ranglisten' YooTheme Lazyloading optimizations
2025-07-22 05:49:22 +02:00
Jürgen Meyer acfcbb1010 Funktion yoothemeBild in rangliste wird wieder aufgerufen. 2025-07-22 05:46:23 +02:00
Marvin Flock a6aee26211 fix: add base url to yootheme images 2025-07-21 20:17:20 +02:00
MarvinF b24203ccb9 Merge pull request #109 from Deutscher-Tischfussballbund/sportsmanager2-issue108
Mannschaftsbilder in Teamsport zu klein gefixt (issue #108)
2025-07-21 19:43:44 +02:00
Jürgen Meyer 2ff39cf086 Fehler Versatz Header Tabelle wenn Bilder fehlen gefixt. 2025-07-16 10:34:40 +02:00
Jürgen Meyer 0729291afc Fehler Anführungszeichen korrigiert. 2025-07-13 23:34:51 +02:00
Jürgen Meyer f3c2040632 Mannschaftsbilder in Teamsport zu klein gefixt (issue #108) 2025-07-02 08:19:44 +02:00
Jürgen Meyer 1235edde82 Letzte Änderung wegen Konflikten rückgängig gemacht. 2025-07-01 12:37:41 +02:00
Jürgen Meyer 763fd7d386 Tabellenformatierung angepasst (issue #108) 2025-07-01 12:31:03 +02:00
MarvinF 77e2c6e910 Merge pull request #77 from Deutscher-Tischfussballbund/issues/43
fix: #43 - remove css3.js reference
2025-06-30 18:57:43 +02:00
MarvinF a2aee3b135 Merge pull request #82 from Deutscher-Tischfussballbund/issues/73_missing-dropdown-in-league
fix: add season dropdown to events, even if there is just one event
2025-06-30 18:57:10 +02:00
MarvinF 9a7f8acc3b Merge pull request #107 from Deutscher-Tischfussballbund/fix/64_division_by_zero
Fix: add division by zero check, return zero instead of exception
2025-06-30 18:55:47 +02:00
Jürgen Meyer 9091b22859 Konfilkt mit README.md 2025-06-30 00:52:54 +02:00
Jürgen Meyer 839b27756a Konflikt mit README.md 2025-06-30 00:50:03 +02:00
Jürgen Meyer 0d0ee08199 Weitere Optimierungen der Tabellen Rangliste, Turnierergebnisse und Spielerstatistik 2025-06-30 00:16:05 +02:00
Jürgen Meyer 6609a4ca78 Änderungen nach Kommentaren in PR83 überarbeitet. 2025-06-29 19:00:59 +02:00
Marvin Flock 4ecf48d02e fix: add division by zero check, return zero instead of exception 2025-06-29 16:44:18 +02:00
MarvinF 40633f864a Merge pull request #106 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod pr
2025-06-25 17:23:09 +02:00
MarvinF 8e6aa127c6 Merge pull request #105 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage pr
2025-06-25 17:21:52 +02:00
MarvinF 9289843cb1 Update README.md 2025-06-25 17:19:33 +02:00
MarvinF 7a70500175 Merge pull request #76 from Deutscher-Tischfussballbund/php-debugging
feat: add debugging for php in docker
2025-06-25 17:14:02 +02:00
MarvinF 31b8e5251e Update release-drafter_extension.yml 2025-06-25 01:22:57 +02:00
MarvinF 455f845ab0 Update build_release.yml 2025-06-25 01:21:52 +02:00
MarvinF f55d89827a Merge pull request #103 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod pr
2025-06-25 01:00:10 +02:00
MarvinF 874e06e061 Merge pull request #102 from Deutscher-Tischfussballbund/sportsmanager2-dev
dev to stage pr
2025-06-25 00:59:11 +02:00
MarvinF 83b8e1c25f Create release-drafter_github.yml 2025-06-25 00:52:06 +02:00
MarvinF 3c9fac7e1a Rename release-drafter.yml to release-drafter_extension.yml 2025-06-25 00:50:45 +02:00
MarvinF 4ec02e5f02 Update build_release.yml 2025-06-25 00:49:57 +02:00
MarvinF 4d1573729d Merge pull request #101 from Deutscher-Tischfussballbund/sportsmanager2-stage
stage to prod PR
2025-06-25 00:36:39 +02:00
MarvinF 6da371569a Merge pull request #100 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-25 00:35:48 +02:00
MarvinF fdede4a4a7 Delete .github/release-drafter_github.yml 2025-06-25 00:31:36 +02:00
MarvinF 7ced30cf5b Rename release-drafter_extension.yml to release-drafter.yml 2025-06-25 00:31:08 +02:00
MarvinF 934b5b4971 Update build_release.yml 2025-06-25 00:30:35 +02:00
MarvinF 085e5a8aeb Merge pull request #99 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to Prod PR
2025-06-24 23:29:31 +02:00
MarvinF 53ada7c6b0 Merge pull request #98 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 23:28:19 +02:00
MarvinF 29dbfaeea4 Update build_release.yml 2025-06-24 23:25:58 +02:00
MarvinF 95e02435fd Merge pull request #97 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to Prod PR
2025-06-24 23:06:32 +02:00
MarvinF 32eacde07d Merge pull request #96 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 23:05:43 +02:00
MarvinF 2b19aee00f Update release-drafter_extension.yml 2025-06-24 23:04:06 +02:00
MarvinF 8b6ad5103c Update release-drafter_github.yml 2025-06-24 23:03:51 +02:00
MarvinF 743f2b4013 Update release-drafter_github.yml 2025-06-24 22:53:45 +02:00
MarvinF 2d2a124239 Update release-drafter_extension.yml 2025-06-24 22:53:23 +02:00
MarvinF d1e0dec74a Update autolabel.yaml 2025-06-24 22:52:56 +02:00
MarvinF c4c3ea88fc Merge pull request #95 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to Prod PR
2025-06-24 22:42:28 +02:00
MarvinF 761e04b6f2 Merge pull request #94 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 22:41:27 +02:00
MarvinF 089796d201 Create autolabel.yaml 2025-06-24 22:37:05 +02:00
MarvinF e2b6f48498 Update release-drafter_github.yml 2025-06-24 22:33:49 +02:00
MarvinF 3422813152 Update release-drafter_github.yml 2025-06-24 22:32:31 +02:00
MarvinF 67b46f121a Update release-drafter_extension.yml 2025-06-24 22:31:47 +02:00
MarvinF 6c3c9badfd Create release-drafter_github.yml 2025-06-24 22:06:27 +02:00
MarvinF e05d107af3 Rename release-drafter.yml to release-drafter_extension.yml 2025-06-24 22:05:51 +02:00
MarvinF 2f94c29c7e Update build_release.yml 2025-06-24 22:05:24 +02:00
MarvinF b656cb5df3 Merge pull request #93 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to prod PR
2025-06-24 21:49:28 +02:00
MarvinF af97c59960 Merge pull request #92 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 21:48:48 +02:00
MarvinF ebb3580fad Update build_release.yml 2025-06-24 21:47:56 +02:00
MarvinF 4a313d5914 Merge pull request #91 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage to prod PR
2025-06-24 21:23:42 +02:00
MarvinF 771856b842 Merge pull request #90 from Deutscher-Tischfussballbund/sportsmanager2-dev
Dev to Stage PR
2025-06-24 21:22:59 +02:00
MarvinF 0c4d0820d1 Update build_release.yml 2025-06-24 21:22:00 +02:00
MarvinF 8a0ad8d8e9 Merge pull request #89 from Deutscher-Tischfussballbund/sportsmanager2-stage
Stage 2 Prod PR
2025-06-24 21:06:54 +02:00
MarvinF 03a448f4cc Merge pull request #88 from Deutscher-Tischfussballbund/sportsmanager2-dev
stage PR
2025-06-24 21:05:39 +02:00
MarvinF 9d75619c2c Update release-drafter.yml 2025-06-24 20:28:20 +02:00
MarvinF a1890c51c0 feat: add release notes to extension installation 2025-06-24 20:20:28 +02:00
Marvin Flock 51ee656f66 feat: add release notes to extension installation 2025-06-24 20:16:51 +02:00
MarvinF 6d9df0e769 Create release-drafter.yml 2025-06-24 20:11:53 +02:00
MarvinF a74bcb0ee8 Update build_release.yml 2025-06-24 20:10:53 +02:00
MarvinF 6399eab0af Update build_release.yml 2025-06-24 19:33:06 +02:00
MarvinF 9cde84a1d0 Update build_snapshot.yml 2025-06-24 19:32:50 +02:00
MarvinF 76738ec307 Update build_snapshot.yml 2025-06-24 19:30:36 +02:00
MarvinF 59e1a4571b Create prod release pipeline 2025-06-24 19:29:17 +02:00
Tim 7952c95217 Merge branch 'sportsmanager2-dev' into php-debugging 2025-06-24 18:58:07 +02:00
Jürgen Meyer 56d8be9a55 Hilfskommentare in Programm zu issue #74 rausgelöscht. 2025-06-24 13:52:32 +02:00
Jürgen Meyer 29f0e6842b issue #74 Player image size (Details siehe issue #74) 2025-06-24 13:29:20 +02:00
Marvin Flock 22e96bf49d fix: add season dropdown to events, even if there is just one event 2025-06-23 21:12:43 +02:00
MarvinF 1e4e34ef71 Merge pull request #65 from Deutscher-Tischfussballbund/tfvb_league_admin_infos
Tfvb league admin infos
2025-06-22 21:27:50 +02:00
Marvin Flock 36dbfdb7c4 fix: check for null since str_starts_with is typed 2025-06-17 22:01:07 +02:00
Marvin Flock 5cfd8f3c1a fix: remove non existent css reference 2025-06-17 22:00:08 +02:00
Marvin Flock de467c0d4a feat: add debugging for php in docker 2025-06-17 21:29:15 +02:00
Wieland Hagen 385bef0752 Admin League Team View: add tooltip 2025-06-12 17:55:05 +02:00
Wieland Hagen 2dddfa473a Admin League Games View: display "+0d" for 0 day shifts, fix SQL query 2025-05-11 21:26:22 +02:00
Wieland Hagen 82c0f3a58b Admin League Games View: show various additional information
- mark teams which have requested a game shift
- display amount of time that a game has been shifted
- display time that has passed between game and result proposal, and result proposal and result validation
- mark games with incomplete player data
2025-05-04 21:04:36 +02:00
Wieland Hagen a6fe497cad Admin League Team View: show number of shifts that each team is responsible for 2025-05-04 20:59:06 +02:00
23 changed files with 1171 additions and 877 deletions
+25
View File
@@ -0,0 +1,25 @@
name-template: "Release $COMPLETE"
tag-template: "v$COMPLETE"
draft: false
exclude:
pulls: true
exclude-labels:
- changelog-ignore
categories:
- title: "Features"
labels: ["feature", "enhancement"]
- title: "Fixes"
labels: ["bug"]
- title: "Maintenance"
labels: ["chore", "refactor"]
change-template: "- $TITLE [#$NUMBER]"
template: |
# Release $RESOLVED_VERSION
## Changes
$CHANGES
+23
View File
@@ -0,0 +1,23 @@
name-template: "Release $COMPLETE"
tag-template: "v$COMPLETE"
draft: false
exclude:
pulls: true
exclude-labels:
- changelog-ignore
categories:
- title: "Features"
labels: ["feature", "enhancement"]
- title: "Fixes"
labels: ["bug"]
- title: "Maintenance"
labels: ["chore", "refactor"]
change-template: "- $TITLE [#$NUMBER]"
template: |
## Changes
$CHANGES
+25
View File
@@ -0,0 +1,25 @@
name: Auto-label PRs
on:
pull_request:
types: [opened, reopened, synchronize, edited]
jobs:
label-changelog-ignore:
runs-on: ubuntu-latest
steps:
- name: Label PRs
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const base = context.payload.pull_request.base.ref;
const head = context.payload.pull_request.head.ref;
if ((base === 'sportsmanager2-prod' && head === 'sportsmanager2-stage') || (base === 'sportsmanager2-stage' && head === 'sportsmanager2-dev')) {
await github.rest.issues.addLabels({
...context.repo,
issue_number: context.payload.pull_request.number,
labels: ['changelog-ignore']
});
}
+81
View File
@@ -0,0 +1,81 @@
# This workflow will run release using node and then publish a package to GitHub Packages when a release is created
# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
name: Sportsmanager Release
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+' # run only on version tags like v1.0.0
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: sportsmanager2-prod
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install npm dependencies
run: npm ci
- name: Generate release notes
id: release_notes_extension
uses: release-drafter/release-drafter@v6
with:
config-name: release-drafter_extension.yml
version: ${{ github.ref_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Save release notes to file
run: |
echo "${{ steps.release_notes_extension.outputs.body }}" > RELEASE_NOTES.md
- name: Run build script
run: npm run release
- name: Generate release notes
id: release_notes_github
uses: release-drafter/release-drafter@v6
with:
config-name: release-drafter_github.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Save release notes to file
run: |
echo "${{ steps.release_notes_github.outputs.body }}" > RELEASE_NOTES.md
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: "${{ github.ref_name }}"
name: "Release ${{ github.ref_name }}"
files: package/packages/com_sportsmanager.zip
body_path: "RELEASE_NOTES.md"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Delete draft release via API # workaround: remove leftover draft by release-drafter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
REPO: ${{ github.repository }}
run: |
drafts=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$REPO/releases | jq '.[] | select(.draft == true)')
if [ -n "$drafts" ]; then
id=$(echo "$drafts" | jq -r '.id')
curl -s -X DELETE -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$REPO/releases/$id
echo "Deleted draft release with ID: $id"
else
echo "No draft releases found"
fi
+2 -2
View File
@@ -6,7 +6,7 @@ name: Snapshot Release
on: on:
push: push:
tags: tags:
- 'v*-snapshot' # run only on version tags like v1.0.0-snapshot - 'v[0-9]+.[0-9]+.[0-9]+-snapshot' # run only on version tags like v1.0.0-snapshot
# - 'v*' # Run only on version tags like v1.0.0 # - 'v*' # Run only on version tags like v1.0.0
jobs: jobs:
build: build:
@@ -33,7 +33,7 @@ jobs:
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
with: with:
prerelease: true prerelease: true
name: SNAPSHOT name: "Snapshot ${{ github.ref_name }}"
files: package/packages/com_sportsmanager.zip files: package/packages/com_sportsmanager.zip
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+40 -6
View File
@@ -2,11 +2,14 @@
## DEV/STAGE environments ## DEV/STAGE environments
| LV | HOSTER | DOMAIN | BRANCH | | LV | HOSTER | DOMAIN | BRANCH |
| ------ | -------- | ------------------------------------------------------------ | ------------------ | | ------ | -------- | ------------------------------------------------------------ | -------------------- |
| DTFB | Kicktemp | [stage.dtfb.de](https://stage.dtfb.de) | dev | | DTFB | Kicktemp | [stage.dtfb.de](https://stage.dtfb.de) | dev |
| TFVHH | Kicktemp | [stage.kickern-hamburg.de](https://stage.kickern-hamburg.de) | dev | | TFVHH | Kicktemp | [stage.kickern-hamburg.de](https://stage.kickern-hamburg.de) | dev |
| STFVH | DTFB | [stage.stfv.de](https://stage.stfv.de/) | sportsmanager2-dev | | STFVH | DTFB | [stage.stfv.de](https://stage.stfv.de/) | sportsmanager2-stage |
| MTFV | DTFB | [stage.mtfv.de](https://stage.mtfv.de/) | ? |
| TFVSH | DTFB | [relaunch.tfvsh.de](https://relaunch.tfvsh.de) | ? |
## PROD environments ## PROD environments
@@ -46,6 +49,37 @@ joomla specific database prefixes like #__
To set it up, insert into the configuration popup which follows after you enable the framework support: To set it up, insert into the configuration popup which follows after you enable the framework support:
Joomla install path: `./data/joomla_data` Joomla install path: `./data/joomla_data`
JConfig: `./data/joomla_data/configuration.php` JConfig: `./data/joomla_data/configuration.php`
> This works only with mounted volumes. However, mounted volumes will slow down the joomla instance significantly.
> The current setup does not use mounted volumes.
> An alternative would be to download joomla and use that installation
### Debugging (with Docker/Intellij)
1. Start Docker Container (see above)
2. Create a terminal for that container
```shell
docker exec -it <container_name> bash
```
3. install xdebug within the container since joomla does not come with xdebug preinstalled
```shell
pecl install xdebug
```
4. restart the container
5. In Intellij Go to [File | Settings | Languages & Frameworks | PHP | Servers](jetbrains://idea/settings?name=Languages+%26+Frameworks--PHP--Servers) and setup your server
Test | | |
|----------|-----------|
| name | anything |
| host | localhost |
| port | 8080 |
| debugger | xdebug |
use the path mapping and map the repo structure to the container content
| File/Directory | path on server |
|------------------------------------------------------------------|----------------------------------------|
| \<path>/com_sportsmanager/src/structure/administrator/components | /var/www/html/administrator/components |
| \<path>/com_sportsmanager/src/structure/components | /var/www/html/components |
7. Click on "Start Listening for PHP Debug Connections" in the top row of intellij
8. (Not sure if optional) Install a browser extension by Jetbrains
https://chromewebstore.google.com/detail/xdebug-helper-by-jetbrain/aoelhdemabeimdhedkidlnbkfhnhgnhm
+2
View File
@@ -0,0 +1,2 @@
This is no official release!
The Release and the release notes will be generated by github actions
+1
View File
@@ -30,6 +30,7 @@ services:
MYSQL_USER: joomla MYSQL_USER: joomla
MYSQL_PASSWORD: examplepass MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1' MYSQL_RANDOM_ROOT_PASSWORD: '1'
TZ: Europe/Berlin
volumes: volumes:
- joomla_database:/var/lib/mysql - joomla_database:/var/lib/mysql
networks: networks:
+9
View File
@@ -1924,3 +1924,12 @@ opcache.file_cache = /tmp/opcache_file
; List of headers files to preload, wildcard patterns allowed. ; List of headers files to preload, wildcard patterns allowed.
;ffi.preload= ;ffi.preload=
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.log=/tmp/xdebug.log
xdebug.discover_client_host=false
xdebug.log_level=7
+5 -1
View File
@@ -43,7 +43,7 @@ export const config = {
watch: ['src/structure/**/*.{php,html,xml,ini,less,json,js,css}'], watch: ['src/structure/**/*.{php,html,xml,ini,less,json,js,css}'],
}, },
copyrelease: { copyrelease: {
src: ['src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'], src: ['RELEASE_NOTES.md','src/structure/**/**', 'src/structure/**/.*', '!src/structure/**/*.{php,html,xml,ini,less,json,js,css}', '!src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
replacesrc: ['src/structure/**/**.{php,html,xml,ini,less,json,js,css}', 'src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'], replacesrc: ['src/structure/**/**.{php,html,xml,ini,less,json,js,css}', 'src/structure/**/.*.{php,html,xml,ini,less,json,js,css}'],
dest: 'releasefiles/' dest: 'releasefiles/'
}, },
@@ -90,6 +90,10 @@ export const config = {
{ {
src: './releasefiles/plugins/system/kickyootheme/**/**', src: './releasefiles/plugins/system/kickyootheme/**/**',
dest: 'sourcefiles/plg_system_kickyootheme' dest: 'sourcefiles/plg_system_kickyootheme'
},
{
src: './releasefiles/RELEASE_NOTES.md',
dest: 'sourcefiles/com_sportsmanager/admin/'
} }
], ],
package: [ package: [
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "sportsmanager", "name": "sportsmanager",
"description": "", "description": "",
"version": "0.0.1", "version": "2.0.0",
"scripts": { "scripts": {
"boilerplate": "cross-env NODE_ENV=development gulp boilerplate", "boilerplate": "cross-env NODE_ENV=development gulp boilerplate",
"build": "cross-env NODE_ENV=production gulp build", "build": "cross-env NODE_ENV=production gulp build",
@@ -16,7 +16,7 @@
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/nielsnuebel/com_sportsmanager.git" "url": "https://github.com/Deutscher-Tischfussballbund/com_sportsmanager.git"
}, },
"keywords": [], "keywords": [],
"author": { "author": {
@@ -24,6 +24,15 @@ class HtmlView extends BaseHtmlView
?> ?>
<h3><?php echo Text::_('COM_SPORTSMANAGER'); ?> &#8211; Created by Sven Nickel | Maintained by DTFB</h3> <h3><?php echo Text::_('COM_SPORTSMANAGER'); ?> &#8211; Created by Sven Nickel | Maintained by DTFB</h3>
<?php <?php
$notesPath = JPATH_COMPONENT_ADMINISTRATOR . '/RELEASE_NOTES.md';
if (file_exists($notesPath)) {
$notes = file_get_contents($notesPath);
echo '<div style="padding:1em;"><h3>Release Notes</h3><pre>' .
htmlspecialchars($notes) . '</pre></div>';
}
// Display the template // Display the template
parent::display($tpl); parent::display($tpl);
} }
@@ -7203,7 +7203,16 @@ function adminMannschaften(): void
$query = "SELECT #__sportsmanager_team.*, #__sportsmanager_verein.vereinsname, #__sportsmanager_spielort.*," $query = "SELECT #__sportsmanager_team.*, #__sportsmanager_verein.vereinsname, #__sportsmanager_spielort.*,"
. "\n (SELECT COUNT(*) FROM #__sportsmanager_mitglied_von_team WHERE #__sportsmanager_team.team_id = #__sportsmanager_mitglied_von_team.team_id AND NOT ausgetreten) AS mitglieder_aktiv," . "\n (SELECT COUNT(*) FROM #__sportsmanager_mitglied_von_team WHERE #__sportsmanager_team.team_id = #__sportsmanager_mitglied_von_team.team_id AND NOT ausgetreten) AS mitglieder_aktiv,"
. "\n (SELECT COUNT(*) FROM #__sportsmanager_mitglied_von_team WHERE #__sportsmanager_team.team_id = #__sportsmanager_mitglied_von_team.team_id) AS mitglieder," . "\n (SELECT COUNT(*) FROM #__sportsmanager_mitglied_von_team WHERE #__sportsmanager_team.team_id = #__sportsmanager_mitglied_von_team.team_id) AS mitglieder,"
. "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung WHERE heim_team_id = #__sportsmanager_team.team_id OR gast_team_id = #__sportsmanager_team.team_id) AS begegnungen" . "\n (SELECT COUNT(*) FROM #__sportsmanager_begegnung WHERE heim_team_id = #__sportsmanager_team.team_id OR gast_team_id = #__sportsmanager_team.team_id) AS begegnungen,"
. "\n (SELECT COUNT(team_id) FROM #__sportsmanager_begegnung_historie"
. "\n WHERE begegnung_historie_id IN ("
. "\n SELECT MIN(begegnung_historie_id) AS historie_id FROM #__sportsmanager_begegnung_historie "
. "\n WHERE aktion IN (0, 3) AND team_id in "
. "\n (SELECT team_id FROM #__sportsmanager_team WHERE veranstaltung_id = $veranstaltungId)"
. "\n GROUP BY begegnung_id"
. "\n )"
. "\n AND team_id = #__sportsmanager_team.team_id"
. "\n ) AS anzahl_verschiebungen"
. "\n FROM #__sportsmanager_team" . "\n FROM #__sportsmanager_team"
. "\n LEFT JOIN #__sportsmanager_verein ON #__sportsmanager_verein.verein_id = #__sportsmanager_team.verein_id" . "\n LEFT JOIN #__sportsmanager_verein ON #__sportsmanager_verein.verein_id = #__sportsmanager_team.verein_id"
. "\n LEFT JOIN #__sportsmanager_spielort ON #__sportsmanager_spielort.spielort_id = #__sportsmanager_team.heimspielort_id" . "\n LEFT JOIN #__sportsmanager_spielort ON #__sportsmanager_spielort.spielort_id = #__sportsmanager_team.heimspielort_id"
@@ -8875,7 +8884,56 @@ function adminBegegnungen(): void
$query = "SELECT t1.*, t2.teamname AS heim_name, t3.teamname AS gast_name, t4.unbestaetigtes_ergebnis_id, t4.zwischenergebnis, t2.nichtraucherschutz AS heim_nichtraucherschutz, t3.nichtraucherschutz AS gast_nichtraucherschutz," $query = "SELECT t1.*, t2.teamname AS heim_name, t3.teamname AS gast_name, t4.unbestaetigtes_ergebnis_id, t4.zwischenergebnis, t2.nichtraucherschutz AS heim_nichtraucherschutz, t3.nichtraucherschutz AS gast_nichtraucherschutz,"
. "\n EXISTS(SELECT * FROM #__sportsmanager_begegnung_historie USE INDEX (begegnung_id) WHERE #__sportsmanager_begegnung_historie.begegnung_id = t1.begegnung_id AND aktion IN (1, 5)) AS verlegt," . "\n EXISTS(SELECT * FROM #__sportsmanager_begegnung_historie USE INDEX (begegnung_id) WHERE #__sportsmanager_begegnung_historie.begegnung_id = t1.begegnung_id AND aktion IN (1, 5)) AS verlegt,"
. "\n (SELECT IF(#__sportsmanager_begegnung_historie.aktion NOT IN (0, 3, 4), NULL, #__sportsmanager_begegnung_historie.eingetragen) AS eingetragen FROM #__sportsmanager_begegnung_historie USE INDEX (begegnung_id) WHERE #__sportsmanager_begegnung_historie.begegnung_id = t1.begegnung_id ORDER BY begegnung_historie_id DESC LIMIT 1) AS verlegung_eingetragen" . "\n (SELECT IF(#__sportsmanager_begegnung_historie.aktion NOT IN (0, 3, 4), NULL, #__sportsmanager_begegnung_historie.eingetragen) AS eingetragen FROM #__sportsmanager_begegnung_historie USE INDEX (begegnung_id) WHERE #__sportsmanager_begegnung_historie.begegnung_id = t1.begegnung_id ORDER BY begegnung_historie_id DESC LIMIT 1) AS verlegung_eingetragen,"
. "\n UNIX_TIMESTAMP(t1.zeitpunkt) AS termin_spiel,"
. "\n ("
. "\n SELECT UNIX_TIMESTAMP(zeitpunkt)"
. "\n FROM #__sportsmanager_begegnung_historie"
. "\n WHERE begegnung_id = t1.begegnung_id AND aktion = 2"
. "\n ORDER BY begegnung_historie_id ASC"
. "\n LIMIT 1"
. "\n ) AS termin_original,"
. "\n ("
. "\n SELECT team_id"
. "\n FROM #__sportsmanager_begegnung_historie"
. "\n WHERE begegnung_id = t1.begegnung_id AND aktion IN (0, 3)"
. "\n ORDER BY begegnung_historie_id ASC"
. "\n LIMIT 1"
. "\n ) AS verantwortliches_team,"
. "\n ("
. "\n SELECT UNIX_TIMESTAMP(zeitpunkt)"
. "\n FROM #__sportsmanager_begegnung_historie"
. "\n WHERE begegnung_id = t1.begegnung_id AND aktion = 1"
. "\n ORDER BY begegnung_historie_id ASC"
. "\n LIMIT 1"
. "\n ) AS termin_akzeptiert,"
. "\n ("
. "\n SELECT UNIX_TIMESTAMP(eingetragen)"
. "\n FROM #__sportsmanager_begegnung_historie"
. "\n WHERE begegnung_id = t1.begegnung_id AND aktion = 6"
. "\n ORDER BY begegnung_historie_id ASC"
. "\n LIMIT 1"
. "\n ) AS ergebnis_vorgeschlagen,"
. "\n ("
. "\n SELECT UNIX_TIMESTAMP(eingetragen)"
. "\n FROM #__sportsmanager_begegnung_historie"
. "\n WHERE begegnung_id = t1.begegnung_id AND aktion = 7"
. "\n ORDER BY begegnung_historie_id ASC"
. "\n LIMIT 1"
. "\n ) AS ergebnis_akzeptiert,"
. "\n ("
. "\n SELECT COUNT(*) FROM #__sportsmanager_teamspiel"
. "\n WHERE begegnung_id = t1.begegnung_id"
. "\n AND (heim_spieler_1_id = 0 OR heim_spieler_2_id = 0 OR gast_spieler_1_id = 0 OR gast_spieler_2_id = 0)"
. "\n ) AS fehlende_spieler"
. "\n FROM #__sportsmanager_begegnung AS t1" . "\n FROM #__sportsmanager_begegnung AS t1"
. "\n LEFT JOIN #__sportsmanager_team AS t2 ON t1.heim_team_id = t2.team_id" . "\n LEFT JOIN #__sportsmanager_team AS t2 ON t1.heim_team_id = t2.team_id"
. "\n LEFT JOIN #__sportsmanager_team AS t3 ON t1.gast_team_id = t3.team_id" . "\n LEFT JOIN #__sportsmanager_team AS t3 ON t1.gast_team_id = t3.team_id"
@@ -2323,6 +2323,10 @@ function mp_mult_($p1, $p2): float|int
*/ */
function mp_div_($p1, $p2): float|int function mp_div_($p1, $p2): float|int
{ {
if ($p2 == 0) {
Log::add("Division by zero detected in mp_div_: divisor was 0. Returning 0 as fallback.", Log::WARNING, "com_sportsmanager");
return 0;
}
return $p1 / $p2; return $p1 / $p2;
} }
@@ -71,7 +71,7 @@ if ($task == "spielerbild") {
terminDokument(); terminDokument();
} else if ($task == "spieler_details") { } else if ($task == "spieler_details") {
spielerDetails(); spielerDetails();
} else if (str_starts_with($task, "admin_")) { } else if ($task !== null && str_starts_with($task, "admin_")) {
// in some cases there are no breaks needed due to no return from method // in some cases there are no breaks needed due to no return from method
switch ($task) { switch ($task) {
case 'admin_einstellungen': case 'admin_einstellungen':
@@ -1577,8 +1577,12 @@ function veranstaltung(): void
} }
} }
$showSeasons = false;
if (count($saisons) > 1) {
$showSeasons = true;
}
// Anzeigen // Anzeigen
HTML_sportsmanager::veranstaltungHeaderAlone($veranstaltung, $vorherige_veranstaltung_id, $naechste_veranstaltung_id); HTML_sportsmanager::veranstaltungHeaderAlone($veranstaltung, $vorherige_veranstaltung_id, $naechste_veranstaltung_id, $showSeasons, $saisons, $filter_saison_id);
if ($veranstaltung->tabellenwertung != 0) if ($veranstaltung->tabellenwertung != 0)
tabelle($veranstaltung, $spieltag, true); tabelle($veranstaltung, $spieltag, true);
@@ -382,7 +382,7 @@ function yoothemeBild($typ, $id, $alternativ, $resize = '', $zusatz = ""): ?stri
else else
return null; return null;
$bildpfad = "/images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . "." . $ext; $bildpfad = SPORTSMANAGER_JOOMLA_URL . "images/sportsmanager/" . $typ . "/" . $typ_prefix . $id . "." . $ext;
return '<img class="el-image" data-src="' . $bildpfad . $resize . '" ' . $zusatz . ' uk-img />'; return '<img class="el-image" data-src="' . $bildpfad . $resize . '" ' . $zusatz . ' uk-img />';
} }
File diff suppressed because it is too large Load Diff
@@ -12,6 +12,29 @@ defined('_JEXEC') or die('Restricted access');
require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_tools.php'; require_once JPATH_SITE . '/components/com_sportsmanager/views/sportsmanager/view_tools.php';
require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php'; require_once JPATH_SITE . '/components/com_sportsmanager/util/image.php';
function formatTimediff( $timestamp1, $timestamp2, $verbose ) {
if (empty($timestamp1) || empty($timestamp2)) {
return "";
} else {
$daydiff = round(($timestamp2 - $timestamp1) / (3600.0 * 24.0));
if ($verbose) {
return sprintf("%+d d", $daydiff);
} else if (abs($daydiff) > 0) {
return sprintf("%dd", $daydiff);
} else {
return "-";
}
}
}
function formatTeamName( $team_name, $team_id, $highlight_team_id ) {
if ($team_id == $highlight_team_id) {
return "<b><i>" . htmlentities_utf8($team_name) . "</i></b>";
} else {
return htmlentities_utf8($team_name);
}
}
class HTML_sportsmanager_admin class HTML_sportsmanager_admin
{ {
static function adminUebersicht($veranstaltungen, $spielerstatistiken, $turniere, $ranglisten, $individualwettbewerbe, $statistik, $saisons, $filter_saison_id, $externe_datenbank): void static function adminUebersicht($veranstaltungen, $spielerstatistiken, $turniere, $ranglisten, $individualwettbewerbe, $statistik, $saisons, $filter_saison_id, $externe_datenbank): void
@@ -7405,6 +7428,8 @@ class HTML_sportsmanager_admin
<th nowrap><strong><?php echo Text::_('COM_SPORTSMANAGER_CLUB'); ?></strong></th> <th nowrap><strong><?php echo Text::_('COM_SPORTSMANAGER_CLUB'); ?></strong></th>
<th nowrap title="<?php echo Text::_('COM_SPORTSMANAGER_PLAYERS_ACTIVE_INACTIVE'); ?>"> <th nowrap title="<?php echo Text::_('COM_SPORTSMANAGER_PLAYERS_ACTIVE_INACTIVE'); ?>">
<strong><?php echo Text::_('COM_SPORTSMANAGER_PLAYERS'); ?></strong></th> <strong><?php echo Text::_('COM_SPORTSMANAGER_PLAYERS'); ?></strong></th>
<th nowrap title="<?php echo Text::_('COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP'); ?>">
<strong><?php echo Text::_('COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS'); ?></strong></th>
<th nowrap><strong><?php echo Text::_('COM_SPORTSMANAGER_HOME_VENUE'); ?></strong></th> <th nowrap><strong><?php echo Text::_('COM_SPORTSMANAGER_HOME_VENUE'); ?></strong></th>
</tr> </tr>
<?php <?php
@@ -7446,6 +7471,7 @@ class HTML_sportsmanager_admin
<td nowrap style="text-align: center"><a <td nowrap style="text-align: center"><a
href="<?php echo SportsManagerURL('&task=admin_mitglieder&teamid=' . $row->team_id); ?>"><?php echo $row->mitglieder_aktiv . " / " . ($row->mitglieder - $row->mitglieder_aktiv); ?></a> href="<?php echo SportsManagerURL('&task=admin_mitglieder&teamid=' . $row->team_id); ?>"><?php echo $row->mitglieder_aktiv . " / " . ($row->mitglieder - $row->mitglieder_aktiv); ?></a>
</td> </td>
<td nowrap align="center"><?php echo $row->anzahl_verschiebungen; ?></td>
<td nowrap><?php if (!empty($row->name)) echo htmlentities_utf8($row->name); ?></td> <td nowrap><?php if (!empty($row->name)) echo htmlentities_utf8($row->name); ?></td>
<?php if ($row->begegnungen == 0) { ?> <?php if ($row->begegnungen == 0) { ?>
<td nowrap><small><a <td nowrap><small><a
@@ -8616,6 +8642,7 @@ class HTML_sportsmanager_admin
<strong><?php echo $modus->punktetyp == 0 ? Text::_('COM_SPORTSMANAGER_GOALS') : Text::_('COM_SPORTSMANAGER_SETS'); ?></strong> <strong><?php echo $modus->punktetyp == 0 ? Text::_('COM_SPORTSMANAGER_GOALS') : Text::_('COM_SPORTSMANAGER_SETS'); ?></strong>
</th> </th>
<th nowrap><strong><?php echo Text::_('COM_SPORTSMANAGER_GAME_POINTS'); ?></strong></th> <th nowrap><strong><?php echo Text::_('COM_SPORTSMANAGER_GAME_POINTS'); ?></strong></th>
<th nowrap><strong><?php echo Text::_('COM_SPORTSMANAGER_GAME_RESULT_DELAYS');?></strong></th>
</tr> </tr>
<?php <?php
@@ -8648,7 +8675,7 @@ class HTML_sportsmanager_admin
if ($row->verlegung_eingetragen != null) if ($row->verlegung_eingetragen != null)
echo " **"; echo " **";
else if ($row->verlegt != 0) else if ($row->verlegt != 0)
echo " *"; echo " (" . formatTimediff($row->termin_original, $row->termin_akzeptiert, true) . ")";
if ($row->nichtraucherschutz == 0 && ((($row->heim_nichtraucherschutz == 1 || $row->heim_nichtraucherschutz == 2 || $row->heim_nichtraucherschutz == 3) && ($row->gast_nichtraucherschutz == 3 || $row->gast_nichtraucherschutz == 7 || $row->gast_nichtraucherschutz == 8)) || (($row->heim_nichtraucherschutz == 5 || $row->heim_nichtraucherschutz == 6 || $row->heim_nichtraucherschutz == 8) && ($row->gast_nichtraucherschutz == 1 || $row->gast_nichtraucherschutz == 4 || $row->gast_nichtraucherschutz == 5)))) if ($row->nichtraucherschutz == 0 && ((($row->heim_nichtraucherschutz == 1 || $row->heim_nichtraucherschutz == 2 || $row->heim_nichtraucherschutz == 3) && ($row->gast_nichtraucherschutz == 3 || $row->gast_nichtraucherschutz == 7 || $row->gast_nichtraucherschutz == 8)) || (($row->heim_nichtraucherschutz == 5 || $row->heim_nichtraucherschutz == 6 || $row->heim_nichtraucherschutz == 8) && ($row->gast_nichtraucherschutz == 1 || $row->gast_nichtraucherschutz == 4 || $row->gast_nichtraucherschutz == 5))))
echo " !"; echo " !";
?> ?>
@@ -8658,13 +8685,20 @@ class HTML_sportsmanager_admin
echo "<br/><small>" . Text::_('COM_SPORTSMANAGER_MATCH_TABLE') . ": " . htmlentities_utf8($row->tisch) . "</small>"; echo "<br/><small>" . Text::_('COM_SPORTSMANAGER_MATCH_TABLE') . ": " . htmlentities_utf8($row->tisch) . "</small>";
?> ?>
</td> </td>
<td nowrap><?php echo htmlentities_utf8($row->heim_name); ?></td> <td nowrap><?php echo formatTeamName($row->heim_name, $row->heim_team_id, $row->verantwortliches_team); ?></td>
<td nowrap><?php echo htmlentities_utf8($row->gast_name); ?></td> <td nowrap><?php echo formatTeamName($row->gast_name, $row->gast_team_id, $row->verantwortliches_team); ?></td>
<td nowrap style="text-align: center"><a <td nowrap style="text-align: center"><a
href="<?php echo SportsManagerURL('&task=admin_begegnung_spielplan_edit&veranstaltungid=' . $veranstaltung->veranstaltung_id . '&id=' . $row->begegnung_id); ?>"><?php if ($ergebnis_vorhanden) echo $row->heim_punkte . " : " . $row->gast_punkte; else echo "_ : _" ?></a><?php if ($row->unbestaetigtes_ergebnis_id != null) echo "<br /><small>" . ($row->zwischenergebnis ? "live" : "unbest&auml;tigt") . "</small>"; ?> href="<?php echo SportsManagerURL('&task=admin_begegnung_spielplan_edit&veranstaltungid=' . $veranstaltung->veranstaltung_id . '&id=' . $row->begegnung_id); ?>"><?php if ($ergebnis_vorhanden) echo $row->heim_punkte . " : " . $row->gast_punkte; else echo "_ : _" ?></a><?php if ($row->unbestaetigtes_ergebnis_id != null) echo "<br /><small>" . ($row->zwischenergebnis ? "live" : "unbest&auml;tigt") . "</small>"; else if ($row->fehlende_spieler > 0) echo " (*)"; ?>
</td> </td>
<td nowrap <td nowrap
style="text-align: center"><?php if ($ergebnis_vorhanden) echo $row->heim_spielpunkte . " : " . $row->gast_spielpunkte; else echo "_ : _" ?><?php if ($row->unbestaetigtes_ergebnis_id != null) echo "<br /><small>" . ($row->zwischenergebnis ? "live" : "unbest&auml;tigt") . "</small>"; ?></td> style="text-align: center"><?php if ($ergebnis_vorhanden) echo $row->heim_spielpunkte . " : " . $row->gast_spielpunkte; else echo "_ : _" ?><?php if ($row->unbestaetigtes_ergebnis_id != null) echo "<br /><small>" . ($row->zwischenergebnis ? "live" : "unbest&auml;tigt") . "</small>"; ?></td>
<td nowrap align="center">
<?php echo
formatTimediff($row->termin_spiel, $row->ergebnis_vorgeschlagen, false)
. " / "
. formatTimediff($row->ergebnis_vorgeschlagen, $row->ergebnis_akzeptiert, false);
?>
</td>
<td nowrap><small><a <td nowrap><small><a
href="<?php echo SportsManagerURL('&task=admin_begegnung_heimtausch&veranstaltungid=' . $veranstaltung->veranstaltung_id . '&id=' . $row->begegnung_id); ?>"><?php echo Text::_('COM_SPORTSMANAGER_HOME_EXCHANGE'); ?></a></small> href="<?php echo SportsManagerURL('&task=admin_begegnung_heimtausch&veranstaltungid=' . $veranstaltung->veranstaltung_id . '&id=' . $row->begegnung_id); ?>"><?php echo Text::_('COM_SPORTSMANAGER_HOME_EXCHANGE'); ?></a></small>
</td> </td>
@@ -291,8 +291,6 @@ class HTML_sportsmanager_ticker
type="text/css"/> type="text/css"/>
<script src="<?php echo Route::_(Uri::root(TRUE) . '/components/com_sportsmanager/js/jquery.min.js'); ?>" <script src="<?php echo Route::_(Uri::root(TRUE) . '/components/com_sportsmanager/js/jquery.min.js'); ?>"
type="text/javascript"></script> type="text/javascript"></script>
<script type="text/javascript"
src="<?php echo Route::_(Uri::root(TRUE) . '/components/com_sportsmanager/js/css3.js'); ?>"></script>
<script> <script>
let globalresize = 0; let globalresize = 0;
@@ -40,7 +40,7 @@ function addOnLoad($function): void
<?php <?php
} }
function SportsManagerURL($weitereParameter = null, $ssl = 0): ?string function SportsManagerURL($weitereParameter = "", $ssl = 0): ?string
{ {
$urlPath = handleFilter($weitereParameter); $urlPath = handleFilter($weitereParameter);
$joomlaBaseUrl = Uri::getInstance()->toString([ $joomlaBaseUrl = Uri::getInstance()->toString([
@@ -990,3 +990,6 @@ COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking Wertung"
COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Nachname" COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Nachname"
COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Vorname" COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Vorname"
COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Verein" COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Verein"
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Verschiebungen"
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Spielverschiebungen durch diese Mannschaft"
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Verzögerung"
@@ -988,3 +988,6 @@ COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking evaluation"
COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Lastname" COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Lastname"
COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Firstname" COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Firstname"
COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Club" COM_SPORTSMANAGER_ARIA_LABEL_CLUB="Club"
COM_SPORTSMANAGER_NUM_REQUESTED_SHIFTS="Shifts"
COM_SPORTSMANAGER_NUM_REQUESTED_SHFITS_TOOLTIP="Game shifts caused by this team"
COM_SPORTSMANAGER_GAME_RESULT_DELAYS="Delay"
+1
View File
@@ -37,6 +37,7 @@
<files folder="admin"> <files folder="admin">
<filename>access.xml</filename> <filename>access.xml</filename>
<filename>index.html</filename> <filename>index.html</filename>
<filename>RELEASE_NOTES.md</filename>
<folder>services</folder> <folder>services</folder>
<folder>src</folder> <folder>src</folder>
<folder>tmpl</folder> <folder>tmpl</folder>