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