]> git.plutz.net Git - lobster/blob - cards/list.sh
Merge commit '72a09b93c234933c5550aa4848d6111ddf40be8f' into cgilite
[lobster] / cards / list.sh
1 #!/bin/sh
2
3 . "${_EXEC}"/pdiread.sh
4
5 edit_card(){
6   local cardfile="$_DATA/vcard/$1" 
7   local tempfile card
8
9   . $_EXEC/session_lock.sh
10
11   if ! tempfile="$(CHECK_SLOCK "$cardfile")"; then
12     printf '[div .message %s]' "$(l10n "This card is not set up for editing within this session.")"
13   else
14     card="$(pdi_load "$tempfile")"
15     cat <<-EOF
16         [form .card #${cardfile##*/} action="/cards/update_card.sh" method="POST"
17           [input type="hidden" name="tid" value="$(transid ${tempfile})"]
18           [div .section .basic $(
19             edit_item "$card" N GENDER
20             [ "$(pdi_count "$card" NICKNAME)" -gt 0 ] \
21             && edit_item "$card" NICKNAME
22             edit_item "$card" BDAY
23             edit_item "$card" X-ZACK-JOINDATE
24             [ "$(pdi_count "$card" X-ZACK-LEAVEDATE)" -gt 0 ] \
25             && edit_item "$card" X-ZACK-LEAVEDATE
26             card_item "$card" SOUND PHOTO LOGO
27           )]
28           [div .section .phone   $(
29             edit_item "$card" TEL EMAIL
30             [ $(pdi_count "$card" IMPP) -gt 0 ] \
31             && edit_item "$card" IMPP
32             [ $(pdi_count "$card" URL ) -gt 0 ] \
33             && edit_item "$card" URL
34           )]
35           [div .section .address $(edit_item "$card" ADR)]
36           [div .section .insurance $(edit_item "$card" X-HEALTH-INSURANCE)]
37           [div .section .note    $(edit_item "$card" NOTE X-CLIENT-REFERRAL)]
38           [div .control
39             [select .item name="newfield"
40               [option value="" disabled="disabled" selected="selected" $(l10n edit_addfieldtext)]
41               $(for f in NICKNAME EMAIL TEL IMPP ADR URL NOTE; do
42                 printf '[option value="%s" %s] ' "$f" "$(l10n "$f")"
43               done)
44            ][button .item type="submit" name="action" value="addfield" $(l10n edit_addfield)]
45             [button .item type="submit" name="action" value="update"   $(l10n edit_update)]
46             [input type="checkbox" #delete] [label .item for="delete" $(l10n edit_delete)]
47               [button .item type="submit" name="action" value="delete"]
48             [button .item type="submit" name="action" value="cancel"   $(l10n edit_cancel)]
49           ]
50           [input type="hidden" name="UID" value="$(pdi_value "$card" UID |HTML)"]
51           [input type="hidden" name="card" value="${cardfile##*/}"]
52         ]
53         EOF
54   fi
55 }
56
57 print_card(){
58   local cardfile="$1"
59   local card="$(pdi_load "$cardfile")"
60   cat <<-EOF
61     [div .card #${cardfile##*/}
62       [div .section .basic $(
63         card_item "$card" FN GENDER NICKNAME BDAY X-ZACK-JOINDATE X-ZACK-LEAVEDATE SOUND PHOTO LOGO
64       )]
65       [div .section .address   $(card_item "$card" ADR)]
66       [div .section .phone     $(card_item "$card" TEL EMAL IMPP URL)]
67       [div .section .insurance $(card_item "$card" X-HEALTH-INSURANCE)]
68       [div .section .note      $(card_item "$card" NOTE X-CLIENT-REFERRAL)]
69       [div .control
70         [a .item href="/cards/edit_card.sh?card=${cardfile##*/}" $(l10n edit)]
71         [a .item href="/cards/export_card.sh?card=${cardfile##*/}" $(l10n vcf_export)]
72       ]
73     ]
74         EOF
75 }
76
77 print_cards(){
78   local cardfile cachefile date size name ldate=0 lsize lname
79
80   while read cardfile; do
81     cachefile="${_DATA}/cache/${cardfile##*/}.cache"
82     # if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" \
83     #                      -a "$cachefile" -nt "${_EXEC}/cards" ]; then
84     if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" ]; then
85       cat "$cachefile"
86     else
87       print_card "$cardfile" |tee "$cachefile"
88     fi
89   done
90 }
91
92 filter_cards(){
93   local filter f fex='x;p;'
94
95   filter="$(printf %s "${filter}" \
96             | sed -E 's;[]\/\(\)\\\$\?\.\+\*\;\[\{\}];\\\\&;g;
97                       '"$upcase"
98            )^"
99
100   while [ "$filter" ]; do
101     f="${filter%%^*}" filter="${filter#*^}"
102     case $f in
103       '') break
104         ;;
105       ANY:*) fex="/\n.*(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
106         ;;
107       NAME:*) fex="/\n(N|FN|NICKNAME)(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
108         ;;
109       STREET:*|ZIP:*) fex="/\nADR(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
110         ;;
111       *) fex="/\n${f%%:*}(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
112         ;;
113     esac
114   done
115
116   for cardfile in "${_DATA}"/vcard/*.vcf; do
117     printf '%s\n' "$cardfile"
118     cat "$cardfile"
119   done \
120   | sed -En ':X; /\nEND:VCARD\r?$/!{ N; bX; }; h; s;\n.*$;;; x; s;^[^\n]+\n;;;
121              '"$upcase""$fex"
122 }
123
124 order_cards() {
125   local cardfile card
126
127   while read cardfile; do
128     card="$(pdi_load "$cardfile")"
129
130     case $order in
131       firstname)
132         printf '%s      %s\n' "$(pdi_value "$card" FN)" "$cardfile"
133         ;;
134       lastname)
135         printf '%s      %s\n' "$(pdi_value "$card" N || pdi_value "$card" FN)" "$cardfile"
136         ;;
137       bdate)
138         printf '%s      %s\n' "$(pdi_value "$card" BDAY || printf 0000-00-00)" "$cardfile"
139         ;;
140     esac
141   done \
142   | sort \
143   | sed -E 's;^.*\t;;g'
144 }
145
146 list_cards(){
147   filter_cards \
148   | order_cards \
149   | grep -xvF "$edit" \
150   | print_cards
151 }