Files
TA-ProxMenu/inc/ui.inc
T
2026-09-22 23:04:25 -05:00

92 lines
3.3 KiB
Bash

#!/usr/bin/env bash
# Shared presentation helpers. No Proxmox operations belong in this file.
TAPM_UI_INIT() {
TAPM_UI_RESET='' TAPM_UI_BOLD='' TAPM_UI_MUTED='' TAPM_UI_ACCENT=''
TAPM_UI_SUCCESS='' TAPM_UI_WARNING='' TAPM_UI_ERROR='' TAPM_UI_SELECTED=''
if [[ -t 1 && "${TERM:-dumb}" != dumb && -z "${NO_COLOR+x}" ]]; then
TAPM_UI_RESET=$'\e[0m' TAPM_UI_BOLD=$'\e[1m' TAPM_UI_MUTED=$'\e[90m'
TAPM_UI_ACCENT=$'\e[96m' TAPM_UI_SUCCESS=$'\e[32m'
TAPM_UI_WARNING=$'\e[33m' TAPM_UI_ERROR=$'\e[31m'
TAPM_UI_SELECTED=$'\e[1;36m'
fi
TAPM_UI_WIDTH="${COLUMNS:-80}"
if [[ -t 1 && "${TERM:-dumb}" != dumb ]]; then
TAPM_UI_WIDTH="$(tput cols 2>/dev/null)" || TAPM_UI_WIDTH="${COLUMNS:-80}"
fi
[[ "$TAPM_UI_WIDTH" =~ ^[0-9]+$ ]] || TAPM_UI_WIDTH=80
(( TAPM_UI_WIDTH > 100 )) && TAPM_UI_WIDTH=100
(( TAPM_UI_WIDTH < 20 )) && TAPM_UI_WIDTH=20
return 0
}
TAPM_UI_PLAIN() {
# Existing menus embed ANSI colors in a few labels; styling is centralized here.
printf '%s' "$1" | sed -E $'s/\033\\[[0-9;]*[[:alpha:]]//g'
}
TAPM_UI_TEXT() {
local style="$1" text="$2" line
while IFS= read -r line; do
printf ' %s%s%s\n' "$style" "$line" "$TAPM_UI_RESET"
done < <(printf '%s\n' "$text" | fold -s -w "$((TAPM_UI_WIDTH - 2))")
}
TAPM_UI_RULE() {
local rule
printf -v rule '%*s' "$((TAPM_UI_WIDTH - 2))" ''
TAPM_UI_TEXT "$TAPM_UI_MUTED" "${rule// /-}"
}
TAPM_UI_TASK() {
TAPM_UI_TEXT "$TAPM_UI_ACCENT" "Starting: $(TAPM_UI_PLAIN "$1")"
TAPM_UI_RULE
printf '\n'
}
TAPM_UI_MENU_META() {
local title="$1" value="$2"
TAPM_UI_KIND=task
TAPM_UI_HINT=''
case "$title:$value" in
'Main Menu:'*|'Host Setup:post_install'|'Host Setup:virtio'|\
'Cluster & Maintenance:services'|'TA-ProxMenu Management:branches'|\
'TAPM Host Configuration:customize'|'TAPM Host Configuration:vzdump'|\
'TAPM Host Configuration:restore'|'Configure vzdump Performance:restore')
TAPM_UI_KIND=submenu ;;
'Select ISO Storage:'*|'Restore TAPM Host Configuration Backup:'*|\
'Git Branch Management:'*|'Configure vzdump Performance:'*)
TAPM_UI_KIND=choice ;;
'Customize TAPM Host Profile:'*)
[[ "$value" == apply ]] || TAPM_UI_KIND=choice ;;
'TA-ProxMenu Management:install_update')
# The update banner is printed after the user confirms installation.
TAPM_UI_KIND=choice ;;
esac
case "$value" in back|quit) TAPM_UI_KIND=navigation ;; esac
case "$title:$value" in
'Cluster & Maintenance:maintenance')
TAPM_UI_HINT='Applies to this host; entering maintenance evacuates guests.' ;;
'Cluster & Maintenance:keepalived')
TAPM_UI_HINT='Deploy or reconfigure Keepalived across cluster hosts.' ;;
'Cluster & Maintenance:iso_nfs')
TAPM_UI_HINT='Create an LXC NFS server and register shared ISO storage.' ;;
'Cluster & Maintenance:orphan_disks')
TAPM_UI_HINT='Read-only cluster scan with optional CSV export.' ;;
'Host Setup:cpu')
TAPM_UI_HINT='Analyze migration compatibility; review before applying a CPU model.' ;;
'TA-ProxMenu Management:install_update')
TAPM_UI_HINT="Update status: ${UPDATE_STATUS:-unknown}" ;;
esac
}
TAPM_UI_MENU_ROW() {
local number="$1" label="$2" active="$3" marker=' ' style='' suffix=''
label="$(TAPM_UI_PLAIN "$label")"
[[ "$TAPM_UI_KIND" == submenu ]] && suffix=' >'
if (( active )); then
marker='>' style="$TAPM_UI_SELECTED"
fi
TAPM_UI_TEXT "$style" "$marker $number $label$suffix"
}