]> git.plutz.net Git - lobster/blob - cards/list.sh
display "new therapy" button only when no therapies exist
[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" ]; then
81       cat "$cachefile"
82     else
83       print_card "$cardfile" |tee "$cachefile"
84     fi
85   done
86 }
87
88 filter_cards(){
89   local filter f fex='x;p;'
90
91   filter="$(printf %s "${filter}" \
92             | sed -E 's;[]\/\(\)\\\$\?\.\+\*\;\[\{\}];\\\\&;g;
93                       '"$upcase"
94            )^"
95
96   while [ "$filter" ]; do
97     f="${filter%%^*}" filter="${filter#*^}"
98     debug "Filter: $f"
99     case $f in
100       '') break
101         ;;
102       ANY:*) fex="/\n.*(\;[^:]*)?:.*(${f#*:}).*\r?\n/{${fex}}"
103         ;;
104       NAME:*) fex="/\n(N|FN|NICKNAME)(\;[^:]*)?:[^\n]*(${f#*:}).*\r?\n/{${fex}}"
105         ;;
106       STREET:*|ZIP:*) fex="/\nADR(\;[^:]*)?:[^\n]*(${f#*:}).*\r?\n/{${fex}}"
107         ;;
108       *) fex="/\n${f%%:*}(\;[^:]*)?:[^\n]*(${f#*:}).*\r?\n/{${fex}}"
109         ;;
110     esac
111   done
112
113   for cardfile in "${_DATA}"/vcard/*.vcf; do
114     printf '%s\n' "$cardfile" "$(grep -vxE " *${CR}?" "$cardfile")"
115   done \
116   | sed -En ':X; /\nEND;?:VCARD\r?$/!{ N; bX; }; h; s;\n.*$;;; x; s;^[^\n]+\n;;;
117              '"$upcase""$fex"
118 }
119
120 order_cards() {
121   local cardfile card
122
123   while read cardfile; do
124     card="$(pdi_load "$cardfile")"
125
126     case $order in
127       firstname)
128         printf '%s      %s\n' "$(pdi_value "$card" FN)" "$cardfile"
129         ;;
130       lastname)
131         printf '%s      %s\n' "$(pdi_value "$card" N || pdi_value "$card" FN)" "$cardfile"
132         ;;
133       bdate)
134         printf '%s      %s\n' "$(pdi_value "$card" BDAY || printf 0000-00-00)" "$cardfile"
135         ;;
136     esac
137   done \
138   | sort \
139   | sed -E 's;^.*\t;;g'
140 }
141
142 list_cards(){
143   filter_cards \
144   | order_cards \
145   | grep -xvF "$edit" \
146   | print_cards
147 }