]> git.plutz.net Git - confetti/blob - cards/list.sh
74ad0200f45f6e96b57dbd65c9862003b2450144
[confetti] / 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   $(edit_item "$card" TEL)]
29           [div .section .message $(
30             edit_item "$card" EMAIL
31             [ $(pdi_count "$card" IMPP) -gt 0 ] && edit_item "$card" IMPP
32             [ $(pdi_count "$card" URL ) -gt 0 ] && edit_item "$card" URL
33           )]
34           [div .section .address $(edit_item "$card" ADR)]
35           [div .section .note    $(edit_item "$card" NOTE)]
36           [div .section .attendance
37             [h3 $(l10n course_attendance) ] $(
38             for course in "$_DATA"/ical/*.ics; do
39               printf '[label [input type="checkbox" name="attendance" value="%s" %s] %s]' \
40                      "${course##*/}" \
41                      "$(grep -qF "${course##*/} ${cardfile##*/}" "$_DATA/mappings/attendance" \
42                         && printf 'checked="checked"'
43                        )" \
44                      "$(pdi_value "$(pdi_load "$course")" SUMMARY || l10n "(unnamed course)" |unescape |HTML)"
45             done)
46             [h3 $(l10n CATEGORIES) ] $(
47             grep -xE '[^ ]+' "$_DATA"/mappings/categories |while read -r cat; do
48               printf '[label [input type="checkbox" name="CATEGORIES" value="%s" %s] %s]' \
49                      "$(HTML "$cat")" \
50                      "$(seq 1 $(pdi_count "$card" CATEGORIES) |while read c; do
51                        pdi_value "$card" CATEGORIES $c |grep -qxF "$cat" \
52                        && printf 'checked="checked"' && break
53                      done)" \
54                      "$(HTML "$cat")"
55             done)
56           ]
57           [div .control
58             [div .item .delete label="$(l10n edit_delete)"
59               [input type="checkbox" #delete]
60               [label for="delete" $(l10n edit_delete)]
61               [button type="submit" name="action" value="delete" $(l10n edit_delete)]
62             ]
63             [div .item .newfield
64               [select name="newfield"
65                 [option value="" disabled="disabled" selected="selected" $(l10n edit_addfieldtext)]
66                 $(for f in NICKNAME EMAIL TEL IMPP ADR URL NOTE; do
67                   printf '[option value="%s" %s] ' "$f" "$(l10n "$f")"
68                 done)
69               ][button type="submit" name="action" value="addfield" $(l10n edit_addfield)]
70             ]
71             [button .item type="submit" name="action" value="update"   $(l10n edit_update)]
72             [button .item type="submit" name="action" value="cancel"   $(l10n edit_cancel)]
73           ]
74           [input type="hidden" name="UID" value="$(pdi_value "$card" UID |HTML)"]
75           [input type="hidden" name="card" value="${cardfile##*/}"]
76         ]
77         EOF
78   fi
79 }
80
81 print_card(){
82   local cardfile="$1"
83   local card="$(pdi_load "$cardfile")"
84   cat <<-EOF
85     [div .card #${cardfile##*/}
86       [div .section .basic . $(
87         card_item "$card" FN GENDER NICKNAME BDAY X-ZACK-JOINDATE X-ZACK-LEAVEDATE SOUND PHOTO LOGO
88       )]
89       [div .section .phone   . $(card_item "$card" TEL)]
90       [div .section .message . $(card_item "$card" EMAIL IMPP URL)]
91       [div .section .address . $(card_item "$card" ADR)]
92       [div .section .note    . $(card_item "$card" NOTE)]
93       [div .section .attendance [h3 $(l10n course_attendance) ] [ul
94         $(grep -F "     ${cardfile##*/}" "$_DATA/mappings/attendance" |while read each discard; do
95           printf '[li [a .item .attendance href="/courses#%s" . %s]]' \
96                  "$each" \
97                  "$(pdi_value "$(pdi_load "$_DATA/ical/$each")" SUMMARY || l10n "(unnamed course)" |unescape |HTML)"
98         done)]
99         $(card_item "$card" CATEGORIES)
100       ]
101       [div .control
102         [a .item href="/cards/edit_card.sh?card=${cardfile##*/}" $(l10n edit)]
103         [a .item href="/cards/export_card.sh?card=${cardfile##*/}" $(l10n vcf_export)]
104       ]
105     ]
106         EOF
107 }
108
109 print_cards(){
110   local cardfile cachefile date size name ldate=0 lsize lname
111
112   while read cardfile; do
113     cachefile="${_DATA}/cache/${cardfile##*/}.cache"
114     # if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" \
115     #                      -a "$cachefile" -nt "${_EXEC}/cards" ]; then
116     if [ -s "$cachefile" -a "$cachefile" -nt "$cardfile" ]; then
117       cat "$cachefile"
118     else
119       print_card "$cardfile" |tee "$cachefile"
120     fi
121   done
122 }
123
124 filter_cards(){
125   local filter f fex='x;p;'
126
127   filter="$(printf %s "${filter}" \
128             | sed -E 's;[]\/\(\)\\\$\?\.\+\*\;\[\{\}];\\\\&;g;
129                       '"$upcase"
130            )^"
131
132   while [ "$filter" ]; do
133     f="${filter%%^*}" filter="${filter#*^}"
134     case $f in
135       '') break
136         ;;
137       ANY:*) fex="/\n.*(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
138         ;;
139       NAME:*) fex="/\n(N|FN|NICKNAME)(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
140         ;;
141       STREET:*|ZIP:*) fex="/\nADR(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
142         ;;
143       *) fex="/\n${f%%:*}(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
144         ;;
145     esac
146   done
147
148   for cardfile in "${_DATA}"/vcard/*.vcf; do
149     printf '%s\n' "$cardfile"
150     cat "$cardfile"
151   done \
152   | sed -En ':X; /\nEND:VCARD\r?$/!{ N; bX; }; h; s;\n.*$;;; x; s;^[^\n]+\n;;;
153              '"$upcase""$fex"
154 }
155
156 order_cards() {
157   local cardfile card
158
159   while read cardfile; do
160     card="$(pdi_load "$cardfile")"
161
162     case $order in
163       firstname)
164         printf '%s      %s\n' "$(pdi_value "$card" FN)" "$cardfile"
165         ;;
166       lastname)
167         printf '%s      %s\n' "$(pdi_value "$card" N || pdi_value "$card" FN)" "$cardfile"
168         ;;
169       bdate)
170         printf '%s      %s\n' "$(pdi_value "$card" BDAY || printf 0000-00-00)" "$cardfile"
171         ;;
172     esac
173   done \
174   | sort \
175   | sed -E 's;^.*\t;;g'
176 }
177
178 list_cards(){
179   filter_cards \
180   | order_cards \
181   | grep -xvF "$edit" \
182   | print_cards
183 }