From c5058cf99df782db1a8d6e6bca41ccbb73f6bbf4 Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 18 Jun 2026 10:55:58 -0500 Subject: [PATCH 1/2] ci: add block-stable workflow --- .gitea/workflows/block-stable.yaml | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .gitea/workflows/block-stable.yaml diff --git a/.gitea/workflows/block-stable.yaml b/.gitea/workflows/block-stable.yaml new file mode 100644 index 0000000..a32ae6f --- /dev/null +++ b/.gitea/workflows/block-stable.yaml @@ -0,0 +1,33 @@ +name: Block Stable Releases (Untested) + +# This workflow auto-deletes "stable" releases until we're ready. +# DELETE THIS FILE when all testing is complete and stable releases should be allowed. + +on: + release: + types: [published] + +jobs: + block-stable: + runs-on: ubuntu-latest + if: contains(github.event.release.tag_name, 'stable') + steps: + - name: Delete stable release (not yet tested) + env: + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + echo "Blocking stable release: ${{ github.event.release.tag_name }}" + echo "Reason: Code has not been fully tested yet." + echo "Remove .gitea/workflows/block-stable.yaml when ready for stable releases." + + # Delete the release via API + curl -s -X DELETE \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/${{ github.event.release.id }}" + + # Also delete the tag to keep things clean + curl -s -X DELETE \ + -H "Authorization: token ${GITEA_TOKEN}" \ + "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/tags/${{ github.event.release.tag_name }}" || true + + echo "Stable release blocked and deleted." -- 2.52.0 From a704e716bf5da412b4563abc06fbbd8eb133822b Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Thu, 18 Jun 2026 11:12:43 -0500 Subject: [PATCH 2/2] =?UTF-8?q?Add=20DonorWall=20site=20view=20=E2=80=94?= =?UTF-8?q?=20public=20donor=20recognition=20by=20level?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../site/src/View/DonorWall/HtmlView.php | 50 +++++++++++++++++++ .../site/tmpl/donorwall/default.php | 45 +++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 source/packages/com_mokosuitenpo/site/src/View/DonorWall/HtmlView.php create mode 100644 source/packages/com_mokosuitenpo/site/tmpl/donorwall/default.php diff --git a/source/packages/com_mokosuitenpo/site/src/View/DonorWall/HtmlView.php b/source/packages/com_mokosuitenpo/site/src/View/DonorWall/HtmlView.php new file mode 100644 index 0000000..f1e8442 --- /dev/null +++ b/source/packages/com_mokosuitenpo/site/src/View/DonorWall/HtmlView.php @@ -0,0 +1,50 @@ +get(DatabaseInterface::class); + + // Get donors grouped by level (exclude anonymous) + $levelOrder = ['legacy', 'major', 'repeat', 'first_time']; + + foreach ($levelOrder as $level) { + $db->setQuery($db->getQuery(true) + ->select('d.recognition_name, d.donor_level, d.lifetime_giving') + ->from($db->quoteName('#__mokosuitenpo_donors', 'd')) + ->where($db->quoteName('d.donor_level') . ' = ' . $db->quote($level)) + ->where($db->quoteName('d.anonymous_giving') . ' = 0') + ->where('d.recognition_name IS NOT NULL AND d.recognition_name != ' . $db->quote('')) + ->order('d.lifetime_giving DESC'), 0, 50); + + $donors = $db->loadObjectList() ?: []; + if (!empty($donors)) { + $this->levels[$level] = $donors; + } + } + + // Overall stats + $db->setQuery($db->getQuery(true) + ->select('COUNT(DISTINCT d.id) AS total_donors') + ->select('COALESCE(SUM(d.lifetime_giving), 0) AS total_raised') + ->from($db->quoteName('#__mokosuitenpo_donors', 'd')) + ->where($db->quoteName('d.lifetime_giving') . ' > 0')); + $this->stats = $db->loadObject() ?: (object) ['total_donors' => 0, 'total_raised' => 0]; + + parent::display($tpl); + } +} diff --git a/source/packages/com_mokosuitenpo/site/tmpl/donorwall/default.php b/source/packages/com_mokosuitenpo/site/tmpl/donorwall/default.php new file mode 100644 index 0000000..cfa0a7c --- /dev/null +++ b/source/packages/com_mokosuitenpo/site/tmpl/donorwall/default.php @@ -0,0 +1,45 @@ + ['label' => 'Legacy Donors', 'icon' => 'star', 'color' => 'warning'], + 'major' => ['label' => 'Major Donors', 'icon' => 'diamond', 'color' => 'primary'], + 'repeat' => ['label' => 'Sustaining Donors', 'icon' => 'heart', 'color' => 'success'], + 'first_time' => ['label' => 'Welcome New Donors', 'icon' => 'seedling','color' => 'info'], +]; +?> +
+
+

Thank You To Our Generous Donors

+
+
+

stats->total_donors); ?>

+

Donors

+
+
+

$stats->total_raised); ?>

+

Total Raised

+
+
+
+ + levels as $level => $donors) : + $info = $levelLabels[$level] ?? ['label' => ucfirst($level), 'color' => 'secondary']; + ?> +
+

+
+ +
+
+ recognition_name); ?> +
+
+ +
+
+ + + levels)) : ?> +
Be the first to appear on our donor wall!
+ +
-- 2.52.0