X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=cards%2Flist.sh;h=9224ace75460e82691b865dcb970b27c36910643;hb=638d268ba4eff001614d065396572a6d1c03efae;hp=cb33637cdbc36c5f4ca7e2166c8c572dc2302653;hpb=6655ac8dd9a786d394d628fed0fbc6e6008078c1;p=lobster diff --git a/cards/list.sh b/cards/list.sh index cb33637..9224ace 100755 --- a/cards/list.sh +++ b/cards/list.sh @@ -2,124 +2,148 @@ . "${_EXEC}"/pdiread.sh -card_fullname(){ - local card="$1" n1 n2 n3 n4 n5 +edit_card(){ + local cardfile="$_DATA/vcard/$1" + local tempfile card - local N="$(pdi_value "$card" N)" - local FN="$(pdi_value "$card" FN)" - local NICKNAME="$(pdi_value "$card" NICKNAME)" + . $_EXEC/session_lock.sh - if [ "$FN" ]; then - printf %s "$FN" - elif [ "$N" ]; then - IFS=\; read n1 n2 n3 n4 n5 <<-EOF - $(pdi_value "$card" N) + if ! tempfile="$(CHECK_SLOCK "$cardfile")"; then + printf '[div .message %s]' "$(l10n "This card is not set up for editing within this session.")" + else + card="$(pdi_load "$tempfile")" + cat <<-EOF + [form .card #${cardfile##*/} action="/cards/update_card.sh" method="POST" + [input type="hidden" name="tid" value="$(transid ${tempfile})"] + [div .section .basic $( + edit_item "$card" N GENDER + [ "$(pdi_count "$card" NICKNAME)" -gt 0 ] \ + && edit_item "$card" NICKNAME + edit_item "$card" BDAY + card_item "$card" SOUND PHOTO LOGO + )] + [div .section .phone $( + edit_item "$card" TEL EMAIL + [ $(pdi_count "$card" IMPP) -gt 0 ] \ + && edit_item "$card" IMPP + [ $(pdi_count "$card" URL ) -gt 0 ] \ + && edit_item "$card" URL + )] + [div .section .address $(edit_item "$card" ADR)] + [div .section .insurance $(edit_item "$card" X-HEALTH-INSURANCE)] + [div .section .note $(edit_item "$card" NOTE X-CLIENT-REFERRAL)] + [div .control + [select .item name="newfield" + [option value="" disabled="disabled" selected="selected" $(l10n edit_addfieldtext)] + $(for f in NICKNAME EMAIL TEL IMPP ADR URL NOTE; do + printf '[option value="%s" %s] ' "$f" "$(l10n "$f")" + done) + ][button .item type="submit" name="action" value="addfield" $(l10n edit_addfield)] + [button .item type="submit" name="action" value="update" $(l10n edit_update)] + [input type="checkbox" #delete] [label .item for="delete" $(l10n edit_delete)] + [button .item type="submit" name="action" value="delete"] + [button .item type="submit" name="action" value="cancel" $(l10n edit_cancel)] + ] + [input type="hidden" name="UID" value="$(pdi_value "$card" UID |HTML)"] + [input type="hidden" name="card" value="${cardfile##*/}"] + ] EOF - printf '%s %s %s %s %s' "$n4" "$n2" "$n3" "$n1" "$n5" - elif [ "$NICKNAME" ]; then - printf '"%s"' "$NICKNAME" fi } -card_item(){ - local card="$1" - local item cnt c - shift 1 +print_card(){ + local cardfile="$1" + local card="$(pdi_load "$cardfile")" + cat <<-EOF + [div .card #${cardfile##*/} + [div .section .basic $( + card_item "$card" FN GENDER NICKNAME BDAY X-ZACK-JOINDATE X-ZACK-LEAVEDATE SOUND PHOTO LOGO + )] + [div .section .address $(card_item "$card" ADR)] + [div .section .phone $(card_item "$card" TEL EMAL IMPP URL)] + [div .section .insurance $(card_item "$card" X-HEALTH-INSURANCE)] + [div .section .note $(card_item "$card" NOTE X-CLIENT-REFERRAL)] + [div .section .therapies $(card_item "$card" therapies)] + [div .control + [a .item href="/cards/edit_card.sh?card=${cardfile##*/}" $(l10n edit)] + [a .item href="/cards/export_card.sh?card=${cardfile##*/}" $(l10n vcf_export)] + ] + ] + EOF +} - for item in $@; do - cnt="$(pdi_count "$card" "$item")" +print_cards(){ + local cardfile cachefile date size name ldate=0 lsize lname - case $item in - FN) printf '[h2 .item .FN ­%s]' "$(card_fullname "$card" |HTML)" - ;; - GENDER) printf '[span .item .GENDER ­%s]' "$(pdi_value "$card" GENDER |l10n)" - ;; - NICKNAME) seq 1 $cnt |while read c; do - printf '[span .item .NICKNAME ­aka. "%s"]' \ - "$(pdi_value "$card" NICKNAME $c |HTML)" - done - ;; - X-ZACK-JOINDATE|X-ZACK-LEAVEDATE) if [ $cnt -gt 0 ]; then - printf '[span .item .%s [b %s:] %s]' \ - "$item" "$(l10n "${item}_short")" \ - "$(pdi_value "$card" "$item" |HTML)" - fi - ;; - BDAY) if [ $cnt -gt 0 ]; then - printf '[span .item .BDAY [b *:] %s]' \ - "$(pdi_value "$card" BDAY |grep -xE '[0-9-]+')" - fi + while read cardfile; do + cachefile="${_DATA}/cache/${cardfile##*/}.cache" + # if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" \ + # -a "$cachefile" -nt "${_EXEC}/cards" ]; then + if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" ]; then + cat "$cachefile" + else + print_card "$cardfile" |tee "$cachefile" + fi + done +} + +filter_cards(){ + local filter f fex='x;p;' + + filter="$(printf %s "${filter}" \ + | sed -E 's;[]\/\(\)\\\$\?\.\+\*\;\[\{\}];\\\\&;g; + '"$upcase" + )^" + + while [ "$filter" ]; do + f="${filter%%^*}" filter="${filter#*^}" + case $f in + '') break ;; - SOUND) if [ $cnt -gt 0 ]; then - printf '[audio .item .SOUND controls="controls" - [source type="audio/ogg" src="data:audio/ogg;base64,%s"] - ]' \ - "$(pdi_value "$card" SOUND |grep -xE '[a-zA-Z0-9/+=]+')" - fi + ANY:*) fex="/\n.*(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" ;; - PHOTO|LOGO) if [ $cnt -gt 0 ]; then - printf '[img .item .%s src="data:image/%s;base64,%s"]' "$item" \ - "$(pdi_attrib "$card" "$item" |sed -r 's;^(.*;)?TYPE="?(.+)"?(;.*)?$;\2;')" \ - "$(pdi_value "$card" "$item" |grep -xE '[a-zA-Z0-9/+=]+')" - fi + NAME:*) fex="/\n(N|FN|NICKNAME)(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" ;; - EMAIL) if [ $cnt -gt 0 ]; then - printf '[h3 %s]' "$(l10n EMAIL)" - seq 1 $cnt |while read c; do - printf '[a .item .EMAIL href="mailto:%s" ­%s]' \ - "$(pdi_value "$card" EMAIL $c |HTML)" \ - "$(pdi_value "$card" EMAIL $c |HTML)" - done - fi + STREET:*|ZIP:*) fex="/\nADR(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" ;; - *) if [ $cnt -gt 0 ]; then - printf '[h3 %s]' "$(l10n "$item")" - seq 1 $cnt |while read c; do - printf '[span .item .%s ­%s]' "$item" \ - "$(pdi_value "$card" "$item" $c |HTML)" - done - fi + *) fex="/\n${f%%:*}(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}" ;; esac done + + for cardfile in "${_DATA}"/vcard/*.vcf; do + printf '%s\n' "$cardfile" + cat "$cardfile" + done \ + | sed -En ':X; /\nEND:VCARD\r?$/!{ N; bX; }; h; s;\n.*$;;; x; s;^[^\n]+\n;;; + '"$upcase""$fex" } -print_card(){ - local cardfile="$1" - local cachefile="${_DATA}/cache/${cardfile##*/}.cache" +order_cards() { + local cardfile card - if [ "$cachefile" -nt "$cardfile" -a "$cachefile" -nt "${_EXEC}/cards" ]; then - cat "$cachefile" - else - local card="$(pdi_load "$cardfile")" - tee "$cachefile" <<-EOF - [div .card #${cardfile##*/} - [div .section .basic ­$( - card_item "$card" FN GENDER NICKNAME BDAY X-ZACK-JOINDATE X-ZACK-LEAVEDATE SOUND PHOTO LOGO - )] - [div .section .phone ­$(card_item "$card" TEL)] - [div .section .message ­$(card_item "$card" EMAIL IMPP URL)] - [div .section .address ­$(card_item "$card" ADR)] - [div .section .note ­$(card_item "$card" NOTE)] - [div .section .attendance [h3 $(l10n course_attendance) ] [ul ­ - $(grep -F " ${cardfile##*/}" "$_DATA/mappings/attendance" |while read each discard; do - printf '[li [a .item .attendance href="/courses#%s" ­%s]]' \ - "$each" \ - "$(pdi_value "$(pdi_load "$_DATA/ical/$each")" SUMMARY |HTML)" - done)] - $(card_item "$card" CATEGORIES) - ] - [div .control - [a .item href="/cards/${cardfile##*/}?action=edit" $(l10n edit)] - [a .item href="/cards/${cardfile##*/}?action=export" $(l10n vcf_export)] - ] - ] - EOF - fi + while read cardfile; do + card="$(pdi_load "$cardfile")" + + case $order in + firstname) + printf '%s %s\n' "$(pdi_value "$card" FN)" "$cardfile" + ;; + lastname) + printf '%s %s\n' "$(pdi_value "$card" N || pdi_value "$card" FN)" "$cardfile" + ;; + bdate) + printf '%s %s\n' "$(pdi_value "$card" BDAY || printf 0000-00-00)" "$cardfile" + ;; + esac + done \ + | sort \ + | sed -E 's;^.*\t;;g' } list_cards(){ - for cardfile in "${_DATA}"/vcard/*.vcf; do - print_card "$cardfile" - done + filter_cards \ + | order_cards \ + | grep -xvF "$edit" \ + | print_cards }