diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 0000000..2e4b7f4 --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,22 @@ +name-template: "Release $NEXT_PATCH_VERSION" +tag-template: "v$NEXT_PATCH_VERSION" + +exclude: + pulls: true + +categories: + - title: "Features" + labels: ["feature", "enhancement"] + - title: "Fixes" + labels: ["bug"] + - title: "Maintenance" + labels: ["chore", "refactor"] + +change-template: "- $TITLE ([#$NUMBER]($URL))" + +template: | + # Release $NEXT_PATCH_VERSION + + ## Changes + + $CHANGES diff --git a/.github/workflows/build_release.yml b/.github/workflows/build_release.yml new file mode 100644 index 0000000..9d251f8 --- /dev/null +++ b/.github/workflows/build_release.yml @@ -0,0 +1,60 @@ +# 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 + uses: release-drafter/release-drafter@v6 + with: + config-name: release-drafter.yml + + - name: Save release notes to file + run: | + echo "${{ steps.release_notes.outputs.body }}" > RELEASE_NOTES.md + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Commit RELEASE_NOTES.md + run: | + git add RELEASE_NOTES.md + git commit -m "Update RELEASE_NOTES.md for ${{ github.ref_name }}" || echo "No changes to commit" + git push + + - name: Run build script + run: npm run release + + - 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 }} diff --git a/.github/workflows/build_snapshot.yml b/.github/workflows/build_snapshot.yml index 7ed9bd0..be6f1a9 100644 --- a/.github/workflows/build_snapshot.yml +++ b/.github/workflows/build_snapshot.yml @@ -6,7 +6,7 @@ name: Snapshot Release on: push: 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 jobs: build: @@ -33,7 +33,7 @@ jobs: uses: softprops/action-gh-release@v2 with: prerelease: true - name: SNAPSHOT + name: "Snapshot ${{ github.ref_name }}" files: package/packages/com_sportsmanager.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 295d810..fb15ca2 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,22 @@ # SportsManager -## Deploy status +## DEV/STAGE environments -### DEV environment -[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/173/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/173) [Preview: sportsmanager.s10.kicktemp.dev](https://sportsmanager.s10.kicktemp.dev) +| LV | HOSTER | DOMAIN | BRANCH | +| ------ | -------- | ------------------------------------------------------------ | ------------------ | +| DTFB | Kicktemp | [stage.dtfb.de](https://stage.dtfb.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 | -[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/204/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/204) [Preview: stage.kickern-hamburg.de](https://stage.kickern-hamburg.de) +## PROD environments -### PROD environment -[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/218/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/218) [Preview: dtfb.de](https://dtfb.de) - -[![buddy pipeline](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/219/badge.svg?token=de39e4e4c47351d592b59a5d1e26a41cf5196861f67d4499bbab990600468001 "buddy pipeline")](https://buddy.kicktemp.com/kicktemp/com-sportsmanager/pipelines/pipeline/219) [Preview: kickern-hamburg.de](https://kickern-hamburg.de) +| LV | HOSTER | DOMAIN | BRANCH | +| ------ | -------- | ------------------------------------------------ | ------------------- | +| DTFB | Kicktemp | [dtfb.de](https://dtfb.de) | production | +| TFVHH | Kicktemp | [kickern-hamburg.de](https://kickern-hamburg.de) | production | +| MTFV | DTFB | [mtfv.de](https://mtfv.de/) | sportsmanager2-prod | +| TFVSH | DTFB | [tfvsh.de](https://tfvsh.de/) | sportsmanager2-prod | +| STFVH | DTFB | [stfv.de](https://stfv.de/) | sportsmanager2-prod | ## Test setup @@ -42,3 +48,4 @@ Joomla install path: `./data/joomla_data` JConfig: `./data/joomla_data/configuration.php` +Test \ No newline at end of file diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md new file mode 100644 index 0000000..e69de29 diff --git a/gulpfile.babel.js/config.js b/gulpfile.babel.js/config.js index 14173e7..adc5010 100644 --- a/gulpfile.babel.js/config.js +++ b/gulpfile.babel.js/config.js @@ -43,7 +43,7 @@ export const config = { watch: ['src/structure/**/*.{php,html,xml,ini,less,json,js,css}'], }, 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}'], dest: 'releasefiles/' }, @@ -90,6 +90,10 @@ export const config = { { src: './releasefiles/plugins/system/kickyootheme/**/**', dest: 'sourcefiles/plg_system_kickyootheme' + }, + { + src: './releasefiles/RELEASE_NOTES.md', + dest: 'sourcefiles/com_sportsmanager/admin/' } ], package: [ diff --git a/src/structure/administrator/components/com_sportsmanager/src/View/Sportsmanager/HtmlView.php b/src/structure/administrator/components/com_sportsmanager/src/View/Sportsmanager/HtmlView.php index efdb051..82fb61f 100644 --- a/src/structure/administrator/components/com_sportsmanager/src/View/Sportsmanager/HtmlView.php +++ b/src/structure/administrator/components/com_sportsmanager/src/View/Sportsmanager/HtmlView.php @@ -24,6 +24,15 @@ class HtmlView extends BaseHtmlView ?>

– Created by Sven Nickel | Maintained by DTFB

Release Notes

' .
+                htmlspecialchars($notes) . '
'; + } + + // Display the template parent::display($tpl); } diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php index 7ce20be..29e8f08 100644 --- a/src/structure/components/com_sportsmanager/admin.php +++ b/src/structure/components/com_sportsmanager/admin.php @@ -7203,7 +7203,16 @@ function adminMannschaften(): void $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) 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 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" @@ -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," . "\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 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" diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php index c1db5d5..eacb8df 100644 --- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php +++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php @@ -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/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 "" . htmlentities_utf8($team_name) . ""; + } else { + return htmlentities_utf8($team_name); + } +} + class HTML_sportsmanager_admin { static function adminUebersicht($veranstaltungen, $spielerstatistiken, $turniere, $ranglisten, $individualwettbewerbe, $statistik, $saisons, $filter_saison_id, $externe_datenbank): void @@ -7405,6 +7428,8 @@ class HTML_sportsmanager_admin + + mitglieder_aktiv . " / " . ($row->mitglieder - $row->mitglieder_aktiv); ?> + anzahl_verschiebungen; ?> name)) echo htmlentities_utf8($row->name); ?> begegnungen == 0) { ?> punktetyp == 0 ? Text::_('COM_SPORTSMANAGER_GOALS') : Text::_('COM_SPORTSMANAGER_SETS'); ?> + verlegung_eingetragen != null) echo " **"; 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)))) echo " !"; ?> @@ -8658,13 +8685,20 @@ class HTML_sportsmanager_admin echo "
" . Text::_('COM_SPORTSMANAGER_MATCH_TABLE') . ": " . htmlentities_utf8($row->tisch) . ""; ?> - heim_name); ?> - gast_name); ?> + heim_name, $row->heim_team_id, $row->verantwortliches_team); ?> + gast_name, $row->gast_team_id, $row->verantwortliches_team); ?>
heim_punkte . " : " . $row->gast_punkte; else echo "_ : _" ?>unbestaetigtes_ergebnis_id != null) echo "
" . ($row->zwischenergebnis ? "live" : "unbestätigt") . ""; ?> + href="veranstaltung_id . '&id=' . $row->begegnung_id); ?>">heim_punkte . " : " . $row->gast_punkte; else echo "_ : _" ?>unbestaetigtes_ergebnis_id != null) echo "
" . ($row->zwischenergebnis ? "live" : "unbestätigt") . ""; else if ($row->fehlende_spieler > 0) echo " (*)"; ?> heim_spielpunkte . " : " . $row->gast_spielpunkte; else echo "_ : _" ?>unbestaetigtes_ergebnis_id != null) echo "
" . ($row->zwischenergebnis ? "live" : "unbestätigt") . ""; ?> + + termin_spiel, $row->ergebnis_vorgeschlagen, false) + . " / " + . formatTimediff($row->ergebnis_vorgeschlagen, $row->ergebnis_akzeptiert, false); + ?> + diff --git a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini index b639d11..73cf52c 100644 --- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini +++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini @@ -990,3 +990,6 @@ COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking Wertung" COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Nachname" COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Vorname" 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" diff --git a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini index ad77db4..a01636b 100644 --- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini +++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini @@ -988,3 +988,6 @@ COM_SPORTSMANAGER_ARIA_LABEL_RANKING_EVALUATION="Ranking evaluation" COM_SPORTSMANAGER_ARIA_LABEL_LASTNAME="Lastname" COM_SPORTSMANAGER_ARIA_LABEL_FIRSTNAME="Firstname" 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" diff --git a/src/structure/sportsmanager.xml b/src/structure/sportsmanager.xml index 84c0e38..032d2c0 100644 --- a/src/structure/sportsmanager.xml +++ b/src/structure/sportsmanager.xml @@ -37,6 +37,7 @@ access.xml index.html + RELEASE_NOTES.md services src tmpl