mirror of
https://codeberg.org/scip/anydb.git
synced 2025-12-17 04:20:59 +01:00
Add little UI script using fzf (#25)
* added Taglist template helper * added simple fzf ui script
This commit is contained in:
@@ -62,6 +62,10 @@ type DbTag struct {
|
|||||||
Keys []string `json:"key"`
|
Keys []string `json:"key"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (entry *DbEntry) Taglist() string {
|
||||||
|
return strings.Join(entry.Tags, ",")
|
||||||
|
}
|
||||||
|
|
||||||
const BucketData string = "data"
|
const BucketData string = "data"
|
||||||
|
|
||||||
func GetDbFile(file string) string {
|
func GetDbFile(file string) string {
|
||||||
|
|||||||
95
contrib/anydbui
Executable file
95
contrib/anydbui
Executable file
@@ -0,0 +1,95 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
template="{{.Key}} {{.Created.AsTime.Year}}-{{.Created.AsTime.Month}}-{{.Created.AsTime.Day}} {{.Taglist}} {{.Preview}}"
|
||||||
|
header="TITLE DATE TAGS PREVIEW"
|
||||||
|
|
||||||
|
# its possible to use another version of anydb for testing purposes
|
||||||
|
anydb="${ANYDB:-anydb}"
|
||||||
|
|
||||||
|
# list command
|
||||||
|
command="( echo '$header'; $anydb ls -m template --template '$template' ) | column -t -l4"
|
||||||
|
|
||||||
|
for binary in fzf $anydb column diff awk less; do
|
||||||
|
if ! type $binary > /dev/null 2>&1; then
|
||||||
|
echo "$binary is not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if type gum > /dev/null 2>&1; then
|
||||||
|
GUM=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
_rand() {
|
||||||
|
awk 'BEGIN {srand(); printf( "%d\n", 1024 * rand() )}'
|
||||||
|
}
|
||||||
|
|
||||||
|
_list() {
|
||||||
|
(
|
||||||
|
echo "$header"
|
||||||
|
$anydb ls -m template --template "$template"
|
||||||
|
) | column -t -l4
|
||||||
|
}
|
||||||
|
|
||||||
|
_updater() {
|
||||||
|
_port="$1"
|
||||||
|
_cache="/tmp/anydbcache.$port"
|
||||||
|
_current="/tmp/anydbcache.$port.current"
|
||||||
|
|
||||||
|
touch $_current $_cache
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
_list > $_current
|
||||||
|
|
||||||
|
if ! diff -q $_current $_cache > /dev/null 2>&1; then
|
||||||
|
curl -d "reload($command)+clear-screen" "http://127.0.0.1:$_port"
|
||||||
|
fi
|
||||||
|
cp $_current $_cache
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
_cleanup() {
|
||||||
|
# get rid of the update child
|
||||||
|
kill $pid
|
||||||
|
|
||||||
|
# clean up reloader cache
|
||||||
|
rm -f /tmp/anydbcache.${port}*
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# fork background updater
|
||||||
|
port=$((8000 + $(_rand) % 1000))
|
||||||
|
_updater $port &
|
||||||
|
pid=$!
|
||||||
|
|
||||||
|
db=$($anydb info | grep Database | cut -d: -f2)
|
||||||
|
shorthelp="$db - [enter]read [c-e]edit [c-k]kill [c-c]exit [c-k]delete"
|
||||||
|
|
||||||
|
if test -n "$GUM"; then
|
||||||
|
color="Color \"#ff\" \"#0000ff\"" # white on blue
|
||||||
|
db="{{ $color \"Database:\"}}$db"
|
||||||
|
enter="{{ $color \"[Enter]\"}} Read"
|
||||||
|
edit="{{ $color \"[ctrl-c]\"}} Edit"
|
||||||
|
delete="{{ $color \"[ctrl-k]\"}} Delete"
|
||||||
|
template="$db $enter $edit $delete"
|
||||||
|
shorthelp=$(echo "$template" | gum format -t template)
|
||||||
|
fi
|
||||||
|
|
||||||
|
trap '_cleanup; (exit $?); exit' INT TERM EXIT
|
||||||
|
|
||||||
|
: | command="$command" fzf \
|
||||||
|
--bind "start:reload:$command" \
|
||||||
|
--header-lines 1 --layout=reverse --info=inline \
|
||||||
|
--height 100% --pointer="→" --separator="─" \
|
||||||
|
--scrollbar="│" --preview-window "right:50%" \
|
||||||
|
--border-label="$shorthelp" \
|
||||||
|
--border=bottom --layout=reverse --info=inline \
|
||||||
|
--height 100% --header-first --cycle --header-lines=1 --listen=$port \
|
||||||
|
--bind "enter:execute: clear; $anydb get {1} | less" \
|
||||||
|
--bind "ctrl-e:execute: $anydb edit {1}" \
|
||||||
|
--bind "ctrl-k:execute:$anydb del {1}"
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user