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