]> git.plutz.net Git - confetti/blobdiff - cards/list.sh
session aware file locking
[confetti] / cards / list.sh
index 2cdfcbce6f538bd3fe0ee33c21e71b3892a30ffc..f598cd2b465d0fcf504cd5126124acb00c0fb3e7 100755 (executable)
@@ -68,6 +68,153 @@ card_item(){
   done
 }
 
+edit_item(){
+  local card="$1"
+  local item cnt c
+  shift 1
+
+  for item in $@; do
+    cnt="$(pdi_count "$card" "$item")"
+    [ $cnt -lt 1 ] && cnt=1
+
+    case $item in
+      N)if N="$(pdi_value "$card" N)"; then
+          IFS=\; read n1 n2 n3 n4 n5 <<-EOF
+               $(pdi_value "$card" N)
+               EOF
+        else
+         N="$(pdi_value "$card" FN |unescape)"
+          n1="${N%%[a-z]*}" n1="${N#$n1}"
+          [ "$n1" ] || n1="${N##* }"
+          n2="${N%$n1}"
+        fi
+        printf '
+        [h3 %s]
+        [input .item .N name="4N" placeholder="%s" value="%s"]
+        [input .item .N name="2N" placeholder="%s" value="%s"]
+        [input .item .N name="1N" placeholder="%s" value="%s"]
+        [input .item .N name="5N" placeholder="%s" value="%s"]
+        ' "$(l10n "$item")" \
+        "$(l10n n_pre)"   "$(HTML "$n4")" \
+        "$(l10n n_first)" "$(HTML "$n2" "$n3")" \
+        "$(l10n n_last)"  "$(HTML "$n1")" \
+        "$(l10n n_post)"  "$(HTML "$n5")"
+        ;;
+      GENDER)
+        printf '
+        [select .item .GENDER name="GENDER"
+          [option value="" disabled="disabled" %s %s]
+          [option value="female" %s %s]
+          [option value="male"   %s %s]
+          [option value="other"  %s %s]
+          [option value="none"   %s %s]
+        ]
+        ' \
+        "$([ "$(pdi_value "$card" GENDER)" = '' ] && printf 'selected="selected"')" \
+        "$(l10n GENDER)" \
+        "$([ "$(pdi_value "$card" GENDER)" = 'female' ] && printf 'selected="selected"')" \
+        "$(l10n gender_female)" \
+        "$([ "$(pdi_value "$card" GENDER)" = 'male' ] && printf 'selected="selected"')" \
+        "$(l10n gender_male)" \
+        "$([ "$(pdi_value "$card" GENDER)" = 'other' ] && printf 'selected="selected"')" \
+        "$(l10n gender_other)" \
+        "$([ "$(pdi_value "$card" GENDER)" = 'none' ] && printf 'selected="selected"')" \
+        "$(l10n gender_none)"
+        ;;
+      BDAY|X-ZACK-JOIDATE|X-ZACK-LEAVEDATE)
+        printf '[h3 %s]
+        [input .item .%s name="%s" value="%s" placeholder="YYYY-MM-DD"]
+        ' \
+        "$(l10n "$item")" "$item" "$item" "$(pdi_value "$card" "$item" |grep -xE '[0-9-]+')"
+        ;;
+      ADR|NOTE)
+        printf '[h3 %s]' "$(l10n "$item")"
+        seq 1 $cnt |while read c; do
+          printf '<textarea class="item %s" name="%s">%s</textarea>' \
+          "$item" "$item" "$(pdi_value "$card" "$item" $c |unescape |HTML)"
+        done
+        ;;
+      *) printf '[h3 %s]' "$(l10n "$item")"
+        seq 1 $cnt |while read c; do
+          printf '[input .item .%s name="%s" value="%s" placeholder="%s"]' \
+          "$item" "$item" "$(pdi_value "$card" "$item" $c |unescape |HTML)" "$(l10n "$item")"
+        done
+        ;;
+    esac
+  done
+}
+
+edit_card(){
+  local cardfile="$_DATA/vcard/$1" 
+  local tempfile card
+
+  . $_EXEC/session_lock.sh
+
+  if ! tempfile="$(CHECK_SLOCK "$cardfile")"; then
+    printf '[div .message %s]' "$(l10n "This card is not set up for editing within this session.")"
+  else
+    card="$(pdi_load "$tempfile")"
+    cat <<-EOF
+       [form .card #${cardfile##*/} action="/cards/update_card.sh" method="POST"
+         [input type="hidden" name="tid" value="$(transid ${tempfile})"]
+         [div .section .basic $(
+           edit_item "$card" N GENDER
+           [ "$(pdi_count "$card" NICKNAME)" -gt 0 ] \
+           && edit_item "$card" NICKNAME
+           edit_item "$card" X-ZACK-JOINDATE
+           [ "$(pdi_count "$card" X-ZACK-LEAVEDATE)" -gt 0 ] \
+           && edit_item "$card" X-ZACK-LEAVEDATE
+           card_item "$card" SOUND PHOTO LOGO
+         )]
+         [div .section .phone   $(edit_item "$card" TEL)]
+         [div .section .message $(
+           edit_item "$card" EMAIL
+           [ $(pdi_count "$card" IMPP) -gt 0 ] && edit_item "$card" IMPP
+           [ $(pdi_count "$card" URL ) -gt 0 ] && edit_item "$card" URL
+         )]
+         [div .section .address $(edit_item "$card" ADR)]
+         [div .section .note    $(edit_item "$card" NOTE)]
+         [div .section .attendance
+           [h3 $(l10n course_attendance) ] $(
+           for course in "$_DATA"/ical/*.ics; do
+             printf '[label [input type="checkbox" name="attendance" value="%s" %s] %s]' \
+                    "${course##*/}" \
+                    "$(grep -qF "${course##*/} ${cardfile##*/}" "$_DATA/mappings/attendance" \
+                       && printf 'checked="checked"'
+                    )" \
+                    "$(pdi_value "$(pdi_load "$course")" SUMMARY |unescape |HTML)"
+           done)
+           [h3 $(l10n CATEGORIES) ] $(
+           grep -xE '[^ ]+' "$_DATA"/mappings/categories |while read -r cat; do
+             printf '[label [input type="checkbox" name="attendance" value="%s" %s] %s]' \
+                    "$(HTML "$cat")" \
+                    "$(seq 1 $(pdi_count "$card" CATEGORIES) |while read c; do
+                      pdi_value "$card" CATEGORIES $c |grep -qxF "$cat" \
+                      && printf 'checked="checked"' && break
+                    done)" \
+                    "$(HTML "$cat")"
+           done)
+         ]
+         [div .control
+           [select .item name="newfield"
+             [option value="" disabled="disabled" selected="selected" $(l10n edit_addfieldtext)]
+             $(for f in ; do
+               printf '[option value="%s" %s] ' "$f" "$(l10n "$f")"
+             done)
+           ]
+           [button .item type="submit" name="action" value="addfield" $(l10n edit_addfield)]
+           [button .item type="submit" name="action" value="update"   $(l10n edit_update)]
+           [input type="checkbox" #delete] [label .item for="delete" $(l10n edit_delete)]
+             [button .item type="submit" name="action" value="delete"]
+           [button .item type="submit" name="action" value="cancel"   $(l10n edit_cancel)]
+         ]
+         [input type="hidden" name="UID" value="$(pdi_value "$card" UID |HTML)"]
+         [input type="hidden" name="card" value="${cardfile##*/}"]
+       ]
+       EOF
+  fi
+}
+
 print_card(){
   local cardfile="$1"
   local cachefile="${_DATA}/cache/${cardfile##*/}.cache"
@@ -94,8 +241,8 @@ print_card(){
         $(card_item "$card" CATEGORIES)
       ]
       [div .control
-        [a .item href="/cards/${cardfile##*/}?action=edit" $(l10n edit)]
-        [a .item href="/cards/${cardfile##*/}?action=export" $(l10n vcf_export)]
+        [a .item href="/cards/edit_card.sh?card=${cardfile##*/}" $(l10n edit)]
+        [a .item href="/cards/?x=${cardfile##*/}" $(l10n vcf_export)]
       ]
     ]
        EOF
@@ -106,7 +253,7 @@ filter_cards(){
   local filter f fex='x;p;'
 
   filter="$(printf %s "${filter}" \
-            | sed -E 's;[]\/\(\)\\\^\$\?\.\+\*\;\[\{\}];\\\\&;g;
+            | sed -E 's;[]\/\(\)\\\$\?\.\+\*\;\[\{\}];\\\\&;g;
                       '"$upcase"
            )^"
 
@@ -159,6 +306,7 @@ order_cards() {
 list_cards(){
   filter_cards \
   | order_cards \
+  | grep -xvF "$edit" \
   | while read cardfile; do
     print_card "$cardfile"
   done