From 2460fb32d64f459782421de8695b58924d2b91c1 Mon Sep 17 00:00:00 2001 From: Peter Siegmund Date: Thu, 9 Apr 2026 22:11:43 +0200 Subject: [PATCH] gitea actions Signed-off-by: Peter Siegmund --- assets/icons/gitea.png | Bin 0 -> 10304 bytes de_DE.json | 6 +- en.json | 6 +- manifest.json | 13 ++ plugin/actions/GiteaAction.js | 152 ++++++++++++++++++++++++ plugin/app.html | 1 + plugin/app.js | 2 + property-inspector/gitea/inspector.html | 49 ++++++++ property-inspector/gitea/inspector.js | 31 +++++ 9 files changed, 258 insertions(+), 2 deletions(-) create mode 100644 assets/icons/gitea.png create mode 100644 plugin/actions/GiteaAction.js create mode 100644 property-inspector/gitea/inspector.html create mode 100644 property-inspector/gitea/inspector.js diff --git a/assets/icons/gitea.png b/assets/icons/gitea.png new file mode 100644 index 0000000000000000000000000000000000000000..85f2ff85d5483bb88d7caffff64cc0147c11d8cd GIT binary patch literal 10304 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

2e$)kR5pCW75MF@9=~zKnWYbonEj6 z2g{BV_7lxWLUFh-w9EeDaMAV;TUcw%$FS{GhU2SP3Rs7T6$e5dSy(-$hCdw}*_G5w;;SGL*4` zS1?qtLWP3NbMfHJ7H+NR2cG0foEbGzrX1U3J0OGFVGBRd%kCvDQdJ|q;Y4!gqKWx* z9qs(WK_7*66w-}7-}t=J{^|evfig@=9QSko&t+;F) literal 0 HcmV?d00001 diff --git a/de_DE.json b/de_DE.json index 23b7c29..653384d 100644 --- a/de_DE.json +++ b/de_DE.json @@ -10,6 +10,10 @@ "Every 5 min": "Alle 5 Minuten", "Every 10 min": "Alle 10 Minuten", "Every 30 min": "Alle 30 Minuten", - "Every Hour": "Jede Stunde" + "Every Hour": "Jede Stunde", + "Gitea URL": "Gitea URL", + "Owner": "Eigentümer", + "Repository": "Repository", + "API Token": "API Token" } } diff --git a/en.json b/en.json index 531370a..dd7b750 100644 --- a/en.json +++ b/en.json @@ -10,6 +10,10 @@ "Every 5 min": "Every 5 min", "Every 10 min": "Every 10 min", "Every 30 min": "Every 30 min", - "Every Hour": "Every Hour" + "Every Hour": "Every Hour", + "Gitea URL": "Gitea URL", + "Owner": "Owner", + "Repository": "Repository", + "API Token": "API Token" } } diff --git a/manifest.json b/manifest.json index c3ca224..fbf2c01 100644 --- a/manifest.json +++ b/manifest.json @@ -36,6 +36,19 @@ ], "Tooltip": "Displays GitHub Copilot usage percentage as a gauge", "UUID": "dev.mars3142.ulanzideck.collection.copilot" + }, + { + "Name": "Gitea Actions", + "Icon": "assets/icons/gitea.png", + "PropertyInspectorPath": "property-inspector/gitea/inspector.html", + "States": [ + { + "Name": "Default", + "Image": "assets/icons/gitea.png" + } + ], + "Tooltip": "Shows the latest Gitea Actions run status for a repository", + "UUID": "dev.mars3142.ulanzideck.collection.gitea" } ], "OS": [ diff --git a/plugin/actions/GiteaAction.js b/plugin/actions/GiteaAction.js new file mode 100644 index 0000000..5ccf6f9 --- /dev/null +++ b/plugin/actions/GiteaAction.js @@ -0,0 +1,152 @@ +class GiteaAction { + constructor($UD, context) { + this.$UD = $UD; + this.context = context; + this.config = { + url: '', + owner: '', + repo: '', + token: '', + refreshRate: '4', + }; + this.refreshTimer = null; + this.debounceTimer = 0; + } + + setActive() {} + + onClear() { + if (this.refreshTimer) { + clearInterval(this.refreshTimer); + this.refreshTimer = null; + } + if (this.debounceTimer) { + clearTimeout(this.debounceTimer); + this.debounceTimer = 0; + } + } + + setParams(jsn) { + this.config = Object.assign(this.config, (jsn && jsn.param) || {}); + this.start(); + } + + onRun() { + if (this.config.url && this.config.owner && this.config.repo) { + this.$UD.openUrl(`${this.config.url}/${this.config.owner}/${this.config.repo}/actions`); + } + } + + start() { + this.onClear(); + this.fetchRun(); + const duration = this.getRefreshDuration(); + if (duration > 0) { + this.refreshTimer = setInterval(() => this.fetchRun(), duration * 60 * 1000); + } + } + + async fetchRun() { + if (this.debounceTimer) clearTimeout(this.debounceTimer); + this.debounceTimer = setTimeout(async () => { + if (!this.config.url || !this.config.owner || !this.config.repo) { + this.renderButton(null); + return; + } + try { + const headers = this.config.token ? { Authorization: `token ${this.config.token}` } : {}; + const response = await fetch( + `${this.config.url}/api/v1/repos/${this.config.owner}/${this.config.repo}/actions/runs?limit=1`, + { headers } + ); + if (!response.ok) { + this.renderButton({ error: response.status }); + return; + } + const data = await response.json(); + const run = data.workflow_runs && data.workflow_runs[0]; + this.renderButton(run || null); + } catch (e) { + this.renderButton({ error: 'ERR' }); + } + }, 300); + } + + renderButton(run) { + const canvas = document.createElement('canvas'); + canvas.width = 196; + canvas.height = 196; + const ctx = canvas.getContext('2d'); + + ctx.fillStyle = '#000000'; + ctx.fillRect(0, 0, 196, 196); + + ctx.textBaseline = 'middle'; + ctx.textAlign = 'center'; + + // Owner — top + const ownerLabel = this.config.owner || '?'; + ctx.fillStyle = '#888888'; + ctx.font = '18px "Source Han Sans SC"'; + ctx.fillText(ownerLabel.length > 14 ? ownerLabel.slice(0, 13) + '…' : ownerLabel, 98, 22); + + // Repo name — below owner + const repoLabel = this.config.repo || '?'; + ctx.fillStyle = '#7ec8e3'; + ctx.font = 'bold 22px "Source Han Sans SC"'; + ctx.fillText(repoLabel.length > 12 ? repoLabel.slice(0, 11) + '…' : repoLabel, 98, 46); + + // Status symbol — center + let symbol, color; + if (!run) { + symbol = '?'; + color = '#666666'; + } else if (run.error) { + symbol = '✗'; + color = '#ff6b6b'; + } else if (run.status === 'running' || run.status === 'waiting') { + symbol = '⟳'; + color = '#f0c040'; + } else if (run.conclusion === 'success') { + symbol = '✓'; + color = '#6bff6b'; + } else if (run.conclusion === 'failure') { + symbol = '✗'; + color = '#ff6b6b'; + } else if (run.conclusion === 'cancelled') { + symbol = '⊘'; + color = '#aaaaaa'; + } else { + symbol = '?'; + color = '#666666'; + } + + ctx.fillStyle = color; + ctx.font = 'bold 76px "Source Han Sans SC"'; + ctx.fillText(symbol, 98, 115); + + // Run info — bottom, single line + if (run && !run.error) { + const branch = run.head_branch || ''; + const num = `#${run.run_number}`; + const info = branch ? `${num} · ${branch}` : num; + ctx.fillStyle = '#aaaaaa'; + ctx.font = 'bold 20px "Source Han Sans SC"'; + ctx.fillText(info.length > 16 ? info.slice(0, 15) + '…' : info, 98, 172); + } + + this.$UD.setBaseDataIcon(this.context, canvas.toDataURL('image/png')); + } + + getRefreshDuration() { + switch (this.config.refreshRate) { + case '1': return 1; + case '2': return 2; + case '3': return 5; + case '4': return 10; + case '5': return 30; + case '6': return 60; + default: return 0; + } + } +} diff --git a/plugin/app.html b/plugin/app.html index 47b7e81..485affb 100644 --- a/plugin/app.html +++ b/plugin/app.html @@ -13,6 +13,7 @@ + diff --git a/plugin/app.js b/plugin/app.js index 71264e4..f8ccd32 100644 --- a/plugin/app.js +++ b/plugin/app.js @@ -15,6 +15,8 @@ $UD.onAdd(jsn => { ACTION_CACHES[context] = new PetrolAction($UD, context); } else if (name === 'copilot') { ACTION_CACHES[context] = new CopilotAction($UD, context); + } else if (name === 'gitea') { + ACTION_CACHES[context] = new GiteaAction($UD, context); } } diff --git a/property-inspector/gitea/inspector.html b/property-inspector/gitea/inspector.html new file mode 100644 index 0000000..0190cc4 --- /dev/null +++ b/property-inspector/gitea/inspector.html @@ -0,0 +1,49 @@ + + + + + + Gitea Actions + + + +

+
+
+
Gitea URL
+ +
+
+
Owner
+ +
+
+
Repository
+ +
+
+
API Token
+ +
+
+
Refresh Rate
+ +
+
+
+ + + + + + + + diff --git a/property-inspector/gitea/inspector.js b/property-inspector/gitea/inspector.js new file mode 100644 index 0000000..5fabb70 --- /dev/null +++ b/property-inspector/gitea/inspector.js @@ -0,0 +1,31 @@ +let ACTION_SETTING = {}; +let form = ''; + +$UD.connect('dev.mars3142.ulanzideck.collection.gitea'); + +$UD.onConnected(() => { + form = document.querySelector('#property-inspector'); + + form.addEventListener('input', Utils.debounce(() => { + const value = Utils.getFormValue(form); + ACTION_SETTING = { ...ACTION_SETTING, ...value }; + $UD.sendParamFromPlugin(ACTION_SETTING); + })); +}); + +$UD.onAdd(jsn => { + if (jsn && jsn.param) settingSaveParam(jsn.param); +}); + +$UD.onParamFromApp(jsn => { + settingSaveParam((jsn && jsn.param) || {}); +}); + +$UD.onParamFromPlugin(jsn => { + settingSaveParam((jsn && jsn.param) || {}); +}); + +function settingSaveParam(params) { + ACTION_SETTING = { ...ACTION_SETTING, ...params }; + if (form) Utils.setFormValue(ACTION_SETTING, form); +}