Fix CI/CD checkout failure + enlarge panel action buttons
Some checks failed
Build and Deploy UMBRA / build-and-deploy (push) Failing after 11m16s

CI/CD fixes (from debugger + docker specialist review):
- Add explicit GITEA_TOKEN for checkout auth
- Add act_runner_config.yaml with container.network: host so job
  containers can reach git.sentinelforest.xyz (root cause of 0s
  silent checkout failure)
- Mount config into act_runner container

UI: Enlarge save/close/edit/delete icons in all detail panels
(EventDetailPanel, TodoDetailPanel, ReminderDetailPanel,
TaskDetailPanel, EntityDetailPanel) from h-7/h-3.5 to h-8/h-4
for better visibility and click targets.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kyle 2026-03-18 08:28:15 +08:00
parent 507c841a92
commit 1f34da9199
8 changed files with 56 additions and 49 deletions

View File

@ -12,6 +12,8 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: https://github.com/actions/checkout@v4 uses: https://github.com/actions/checkout@v4
with:
token: ${{ secrets.GITEA_TOKEN }}
- name: Login to Gitea Container Registry - name: Login to Gitea Container Registry
uses: https://github.com/docker/login-action@v3 uses: https://github.com/docker/login-action@v3

4
act_runner_config.yaml Normal file
View File

@ -0,0 +1,4 @@
container:
network: host
privileged: false
options: "--security-opt label:disable"

View File

@ -72,6 +72,7 @@ services:
volumes: volumes:
- act_runner_data:/data - act_runner_data:/data
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- ./act_runner_config.yaml:/data/config.yaml:ro
environment: environment:
- GITEA_INSTANCE_URL=https://git.sentinelforest.xyz - GITEA_INSTANCE_URL=https://git.sentinelforest.xyz
- GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN} - GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN}

View File

@ -591,32 +591,32 @@ export default function EventDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={() => setScopeStep(null)} onClick={() => setScopeStep(null)}
title="Cancel" title="Cancel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
) : (isEditing || isCreating) ? ( ) : (isEditing || isCreating) ? (
<> <>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-green-400 hover:text-green-300" className="h-8 w-8 text-green-400 hover:text-green-300"
onClick={handleEditSave} onClick={handleEditSave}
disabled={saveMutation.isPending} disabled={saveMutation.isPending}
title="Save" title="Save"
> >
<Save className="h-3.5 w-3.5" /> <Save className="h-4 w-4" />
</Button> </Button>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditCancel} onClick={handleEditCancel}
title="Cancel" title="Cancel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
</> </>
) : ( ) : (
@ -628,12 +628,12 @@ export default function EventDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditStart} onClick={handleEditStart}
disabled={isAcquiringLock || !!activeLockInfo} disabled={isAcquiringLock || !!activeLockInfo}
title={activeLockInfo ? `Locked by ${activeLockInfo.locked_by_name || 'another user'}` : 'Edit event'} title={activeLockInfo ? `Locked by ${activeLockInfo.locked_by_name || 'another user'}` : 'Edit event'}
> >
{isAcquiringLock ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Pencil className="h-3.5 w-3.5" />} {isAcquiringLock ? <Loader2 className="h-4 w-4 animate-spin" /> : <Pencil className="h-4 w-4" />}
</Button> </Button>
)} )}
{/* Leave button for invited events */} {/* Leave button for invited events */}
@ -641,11 +641,11 @@ export default function EventDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-muted-foreground hover:text-destructive" className="h-8 w-8 text-muted-foreground hover:text-destructive"
onClick={() => setShowLeaveDialog(true)} onClick={() => setShowLeaveDialog(true)}
title="Leave event" title="Leave event"
> >
<LogOut className="h-3.5 w-3.5" /> <LogOut className="h-4 w-4" />
</Button> </Button>
)} )}
{/* Delete button for own events */} {/* Delete button for own events */}
@ -664,12 +664,12 @@ export default function EventDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-muted-foreground hover:text-destructive" className="h-8 w-8 text-muted-foreground hover:text-destructive"
onClick={handleDeleteStart} onClick={handleDeleteStart}
disabled={deleteMutation.isPending} disabled={deleteMutation.isPending}
title="Delete event" title="Delete event"
> >
<Trash2 className="h-3.5 w-3.5" /> <Trash2 className="h-4 w-4" />
</Button> </Button>
) )
)} )}
@ -678,11 +678,11 @@ export default function EventDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={onClose} onClick={onClose}
title="Close panel" title="Close panel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
</> </>
)} )}

View File

@ -285,21 +285,21 @@ export default function TaskDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-green-400 hover:text-green-300" className="h-8 w-8 text-green-400 hover:text-green-300"
onClick={handleEditSave} onClick={handleEditSave}
disabled={updateTaskMutation.isPending} disabled={updateTaskMutation.isPending}
title="Save changes" title="Save changes"
> >
<Save className="h-3.5 w-3.5" /> <Save className="h-4 w-4" />
</Button> </Button>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditCancel} onClick={handleEditCancel}
title="Cancel editing" title="Cancel editing"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
</> </>
) : ( ) : (
@ -307,30 +307,30 @@ export default function TaskDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditStart} onClick={handleEditStart}
title="Edit task" title="Edit task"
> >
<Pencil className="h-3.5 w-3.5" /> <Pencil className="h-4 w-4" />
</Button> </Button>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-muted-foreground hover:text-destructive" className="h-8 w-8 text-muted-foreground hover:text-destructive"
onClick={() => onDelete(task.id)} onClick={() => onDelete(task.id)}
title="Delete task" title="Delete task"
> >
<Trash2 className="h-3.5 w-3.5" /> <Trash2 className="h-4 w-4" />
</Button> </Button>
{onClose && ( {onClose && (
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={onClose} onClick={onClose}
title="Close panel" title="Close panel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
)} )}
</> </>
@ -562,7 +562,7 @@ export default function TaskDetailPanel({
{/* Comments */} {/* Comments */}
<div className="space-y-3"> <div className="space-y-3">
<div className="flex items-center gap-1.5"> <div className="flex items-center gap-1.5">
<MessageSquare className="h-3.5 w-3.5 text-muted-foreground" /> <MessageSquare className="h-4 w-4 text-muted-foreground" />
<h4 className="text-[11px] text-muted-foreground uppercase tracking-wider"> <h4 className="text-[11px] text-muted-foreground uppercase tracking-wider">
Comments Comments
{comments.length > 0 && ( {comments.length > 0 && (

View File

@ -236,21 +236,21 @@ export default function ReminderDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-green-400 hover:text-green-300" className="h-8 w-8 text-green-400 hover:text-green-300"
onClick={handleEditSave} onClick={handleEditSave}
disabled={saveMutation.isPending} disabled={saveMutation.isPending}
title="Save" title="Save"
> >
<Save className="h-3.5 w-3.5" /> <Save className="h-4 w-4" />
</Button> </Button>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditCancel} onClick={handleEditCancel}
title="Cancel" title="Cancel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
</> </>
) : ( ) : (
@ -259,22 +259,22 @@ export default function ReminderDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 hover:bg-orange-500/10 hover:text-orange-400" className="h-8 w-8 hover:bg-orange-500/10 hover:text-orange-400"
onClick={() => dismissMutation.mutate()} onClick={() => dismissMutation.mutate()}
disabled={dismissMutation.isPending} disabled={dismissMutation.isPending}
title="Dismiss reminder" title="Dismiss reminder"
> >
<BellOff className="h-3.5 w-3.5" /> <BellOff className="h-4 w-4" />
</Button> </Button>
)} )}
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditStart} onClick={handleEditStart}
title="Edit reminder" title="Edit reminder"
> >
<Pencil className="h-3.5 w-3.5" /> <Pencil className="h-4 w-4" />
</Button> </Button>
{confirmingDelete ? ( {confirmingDelete ? (
<Button <Button
@ -290,22 +290,22 @@ export default function ReminderDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-muted-foreground hover:text-destructive" className="h-8 w-8 text-muted-foreground hover:text-destructive"
onClick={handleDeleteClick} onClick={handleDeleteClick}
disabled={deleteMutation.isPending} disabled={deleteMutation.isPending}
title="Delete reminder" title="Delete reminder"
> >
<Trash2 className="h-3.5 w-3.5" /> <Trash2 className="h-4 w-4" />
</Button> </Button>
)} )}
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={onClose} onClick={onClose}
title="Close panel" title="Close panel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
</> </>
)} )}

View File

@ -61,7 +61,7 @@ export function EntityDetailPanel<T>({
size="icon" size="icon"
onClick={onToggleFavourite} onClick={onToggleFavourite}
aria-label={isFavourite ? `Remove from ${favouriteLabel}s` : `Add to ${favouriteLabel}s`} aria-label={isFavourite ? `Remove from ${favouriteLabel}s` : `Add to ${favouriteLabel}s`}
className={`h-7 w-7 ${isFavourite ? 'text-yellow-400' : 'text-muted-foreground'}`} className={`h-8 w-8 ${isFavourite ? 'text-yellow-400' : 'text-muted-foreground'}`}
> >
{isFavourite ? ( {isFavourite ? (
<Star className="h-4 w-4 fill-yellow-400" /> <Star className="h-4 w-4 fill-yellow-400" />
@ -75,7 +75,7 @@ export function EntityDetailPanel<T>({
size="icon" size="icon"
onClick={onClose} onClick={onClose}
aria-label="Close panel" aria-label="Close panel"
className="h-7 w-7" className="h-8 w-8"
> >
<X className="h-4 w-4" /> <X className="h-4 w-4" />
</Button> </Button>

View File

@ -272,21 +272,21 @@ export default function TodoDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-green-400 hover:text-green-300" className="h-8 w-8 text-green-400 hover:text-green-300"
onClick={handleEditSave} onClick={handleEditSave}
disabled={saveMutation.isPending} disabled={saveMutation.isPending}
title="Save" title="Save"
> >
<Save className="h-3.5 w-3.5" /> <Save className="h-4 w-4" />
</Button> </Button>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditCancel} onClick={handleEditCancel}
title="Cancel" title="Cancel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
</> </>
) : ( ) : (
@ -294,11 +294,11 @@ export default function TodoDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={handleEditStart} onClick={handleEditStart}
title="Edit todo" title="Edit todo"
> >
<Pencil className="h-3.5 w-3.5" /> <Pencil className="h-4 w-4" />
</Button> </Button>
{confirmingDelete ? ( {confirmingDelete ? (
<Button <Button
@ -314,22 +314,22 @@ export default function TodoDetailPanel({
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7 text-muted-foreground hover:text-destructive" className="h-8 w-8 text-muted-foreground hover:text-destructive"
onClick={handleDeleteClick} onClick={handleDeleteClick}
disabled={deleteMutation.isPending} disabled={deleteMutation.isPending}
title="Delete todo" title="Delete todo"
> >
<Trash2 className="h-3.5 w-3.5" /> <Trash2 className="h-4 w-4" />
</Button> </Button>
)} )}
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
className="h-7 w-7" className="h-8 w-8"
onClick={onClose} onClick={onClose}
title="Close panel" title="Close panel"
> >
<X className="h-3.5 w-3.5" /> <X className="h-4 w-4" />
</Button> </Button>
</> </>
)} )}