]> git.plutz.net Git - lobster/blob - cards/list.sh
9ff31254f488fa32ebaabb020b190dd873d6cb55
[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 .control
67         [a .item href="/cards/edit_card.sh?card=${cardfile##*/}" $(l10n edit)]
68         [a .item href="/cards/export_card.sh?card=${cardfile##*/}" $(l10n vcf_export)]
69       ]
70     ]
71         EOF
72 }
73
74 print_cards(){
75   local cardfile cachefile date size name ldate=0 lsize lname
76
77   while read cardfile; do
78     cachefile="${_DATA}/cache/${cardfile##*/}.cache"
79     # if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" \
80     #                      -a "$cachefile" -nt "${_EXEC}/cards" ]; then
81     if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" ]; then
82       cat "$cachefile"
83     else
84       print_card "$cardfile" |tee "$cachefile"
85     fi
86   done
87 }
88
89 filter_cards(){
90   local filter f fex='x;p;'
91
92   filter="$(printf %s "${filter}" \
93             | sed -E 's;[]\/\(\)\\\$\?\.\+\*\;\[\{\}];\\\\&;g;
94                       '"$upcase"
95            )^"
96
97   while [ "$filter" ]; do
98     f="${filter%%^*}" filter="${filter#*^}"
99     case $f in
100       '') break
101         ;;
102       ANY:*) fex="/\n.*(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
103         ;;
104       NAME:*) fex="/\n(N|FN|NICKNAME)(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
105         ;;
106       STREET:*|ZIP:*) fex="/\nADR(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
107         ;;
108       *) fex="/\n${f%%:*}(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
109         ;;
110     esac
111   done
112
113   for cardfile in "${_DATA}"/vcard/*.vcf; do
114     printf '%s\n' "$cardfile"
115     cat "$cardfile"
116   done \
117   | sed -En ':X; /\nEND:VCARD\r?$/!{ N; bX; }; h; s;\n.*$;;; x; s;^[^\n]+\n;;;
118              '"$upcase""$fex"
119 }
120
121 order_cards() {
122   local cardfile card
123
124   while read cardfile; do
125     card="$(pdi_load "$cardfile")"
126
127     case $order in
128       firstname)
129         printf '%s      %s\n' "$(pdi_value "$card" FN)" "$cardfile"
130         ;;
131       lastname)
132         printf '%s      %s\n' "$(pdi_value "$card" N || pdi_value "$card" FN)" "$cardfile"
133         ;;
134       bdate)
135         printf '%s      %s\n' "$(pdi_value "$card" BDAY || printf 0000-00-00)" "$cardfile"
136         ;;
137     esac
138   done \
139   | sort \
140   | sed -E 's;^.*\t;;g'
141 }
142
143 list_cards(){
144   filter_cards \
145   | order_cards \
146   | grep -xvF "$edit" \
147   | print_cards
148 }