Big, big rewrite. Not only does it now work properly in all three
authorMike Taylor <mike@indexdata.com>
Wed, 29 Nov 2006 18:22:08 +0000 (18:22 +0000)
committerMike Taylor <mike@indexdata.com>
Wed, 29 Nov 2006 18:22:08 +0000 (18:22 +0000)
modes (New, Edit, Copy) and in all three phases (initial form,
rejected submission, accepted submission), but the code that does work
is rather simpler than the old code that didn't.

web/htdocs/details/edit.mc

index 1d789f0..7b3e6d7 100644 (file)
@@ -1,43 +1,55 @@
-%# $Id: edit.mc,v 1.20 2006-11-17 22:39:17 mike Exp $
+%# $Id: edit.mc,v 1.21 2006-11-29 18:22:08 mike Exp $
+<%args>
+$op
+$id => undef
+$update => undef
+</%args>
 <%doc>
 Since this form is used in many different situations, some care is
 merited in considering the possibilities:
 
-New?   Copy    ID?     Situation
---------------------------------------------------------------------------
-Y                      Blank form for adding a new target.
-Y                      New target submitted successfully.
-Y                      Partial new target submitted, requiring more
-
-               Y       Existing target to be edited.
-               Y       Existing target has been updated.
+Situation                                      Op      ID      Update
+----------------------------------------------------------------------
+Blank form for adding a new target             new
+New target rejected, changes required          new             X
+New target accepted and added                  new             X
+---------------------------------------------------------------------
+Existing target to be edited                   edit    X
+Edit rejected, changes required                        edit    X       X
+Target successfully updated                    edit    X       X
+----------------------------------------------------------------------
+Existing target to be copied                   copy    X
+New target rejected, changes required          copy    X       X
+New target accepted and added                  copy    X       X
+----------------------------------------------------------------------
 
-       Y       Y       Existing target to be copied.
-       Y               New or copied target rejected due to duplicate ID.
---------------------------------------------------------------------------
+Submissions, whether of new targets, edits or copies, may be rejected
+due either to missing mandatory fields or host/name/port that form a
+duplicate ID.
 </%doc>
-<%args>
-$new => undef
-$copy => undef
-$id => undef
-</%args>
 <%perl>
+# Sanity checking
+die "op = new but id defined" if $op eq "new" && defined $id;
+die "op != new but id undefined" if $op ne "new" && !defined $id;
+
 my $conn = new ZOOM::Connection("localhost:3313/IR-Explain---1", 0,
                                user => "admin", password => "fruitbat",
                                elementSetName => "zeerex");
 my $rec = '<explain xmlns="http://explain.z3950.org/dtd/2.0/"/>';
-if (defined $id && $id ne "") {
+if (defined $id && ($op ne "copy" || !$update)) {
     # Existing record
     my $query = 'rec.id="' . cql_quote($id) . '"';
     my $rs = $conn->search(new ZOOM::Query::CQL($query));
     if ($rs->size() > 0) {
        $rec = $rs->record(0);
     } else {
+       ### Is this an error?  I don't think the UI will ever provoke it
+       print qq[<p class="error">(New ID specified.)</p>\n];
        $id = undef;
     }
 
 } else {
-    # New record
+    # No ID supplied -- this is a brand new record
     my $host = $r->param("host");
     my $port = $r->param("port");
     my $dbname = $r->param("dbname");
@@ -45,8 +57,8 @@ if (defined $id && $id ne "") {
        !defined $port || $port eq "" ||
        !defined $dbname || $dbname eq "") {
        print qq[<p class="error">
-You must specify host, port and database name.</p>\n];
-       $r->param(update => 0);
+You must specify host, port and database name.</p>\n] if $update;
+       undef $update;
     } else {
        my $query = cql_target($host, $port, $dbname);
        my $rs = $conn->search(new ZOOM::Query::CQL($query));
@@ -54,9 +66,10 @@ You must specify host, port and database name.</p>\n];
            my $fakeid = xml_encode(uri_escape("$host:$port/$dbname"));
            print qq[<p class="error">
 There is already
-<a href='?id=$fakeid'>a record</a>
+<a href='?op=edit&amp;id=$fakeid'>a record</a>
 for this host, port and database name.
 </p>\n];
+           undef $update;
        }
     }
 }
@@ -98,31 +111,32 @@ my @fields =
        qw(e:title e:description) ],
      );
 
-my $nchanges = 0;
-my $update = $r->param("update");
-
-    # Update record with submitted data
-    my %fieldsByKey = map { ( $_->[0], $_) } @fields;
-    my %data;
-    foreach my $key ($r->param()) {
-       next if grep { $key eq $_ } qw(id update new copy);
-       $data{$key} = $r->param($key);
-    }
-    my $mynchanges = modify_xml_document($xc, \%fieldsByKey, \%data);
-
-if ($update) {
-    $nchanges = $mynchanges;
-    if ($nchanges) {
-       ### Set e:metaInfo/e:dateModified
-    }
+# Update record with submitted data
+my %fieldsByKey = map { ( $_->[0], $_) } @fields;
+my %data;
+foreach my $key ($r->param()) {
+    next if grep { $key eq $_ } qw(op id update);
+    $data{$key} = $r->param($key);
+}
+my @changedFields = modify_xml_document($xc, \%fieldsByKey, \%data);
+if ($update && @changedFields) {
+    my @x = modify_xml_document($xc, { dateModified =>
+                                          [ dateModified => 0,
+                                            "Data/time modified",
+                                            "e:metaInfo/e:dateModified" ] },
+                               { dateModified => isodate(time()) });
+    die "Didn't set dateModified!" if !@x;
     ZOOM::IRSpy::_really_rewrite_record($conn, $xc->getContextNode());
 }
+
 </%perl>
  <h2><% xml_encode($xc->find("e:databaseInfo/e:title"), "[Untitled]") %></h2>
-% if ($nchanges) {
+% if ($update && @changedFields) {
+%     my $nchanges = @changedFields;
  <p style="font-weight: bold">
-  The record has been <% $new ? "created" : "updated" %>.<br/>
-  Changed <% $nchanges %> field<% $nchanges == 1 ? "" : "s" %>.
+  The record has been <% $op ne "edit" ? "created" : "updated" %>.<br/>
+  Changed <% $nchanges %> field<% $nchanges == 1 ? "" : "s" %>:
+  <% join(", ", map { xml_encode($_->[2]) } @changedFields) %>.
  </p>
 % }
  <form method="get" action="">
@@ -134,20 +148,20 @@ foreach my $ref (@fields) {
    <tr>
     <th><% $caption %></th>
     <td>
-% my $rawdata = $xc->findvalue($xpath);
-% my $data = xml_encode($rawdata, "");
+% my $rawval = $xc->findvalue($xpath);
+% my $val = xml_encode($rawval, "");
 % if (ref $nlines) {
      <select name="<% $name %>" size="1">
-%     foreach my $val (@$nlines) {
-      <option value="<% $val %>"
-% print ' selected="selected"' if $rawdata eq $val;
-       ><% $val %></option>
+%     foreach my $option (@$nlines) {
+      <option value="<% xml_encode($option) %>"<%
+       ($rawval eq $option ? ' selected="selected"' : "")
+       %>><% xml_encode($option) %></option>
 %     }
      </select>
 % } elsif ($nlines) {
-     <textarea name="<% $name %>" rows="<% $nlines %>" cols="51"><% $data %></textarea>
+     <textarea name="<% $name %>" rows="<% $nlines %>" cols="51"><% $val %></textarea>
 % } else {
-     <input name="<% $name %>" type="text" size="60" value="<% $data %>"/>
+     <input name="<% $name %>" type="text" size="60" value="<% $val %>"/>
 % }
     </td>
    </tr>
@@ -155,20 +169,16 @@ foreach my $ref (@fields) {
    <tr>
     <td align="right" colspan="2">
      <input type="submit" name="update" value="Update"/>
+     <input type="hidden" name="op" value="<% xml_encode($op) %>"/>
 % if (defined $id) {
      <input type="hidden" name="id" value="<% xml_encode($id) %>"/>
-% } else {
-     <input type="hidden" name="new" value="1"/>
-% }
-% if (defined $copy) {
-     <input type="hidden" name="copy" value="<% xml_encode($copy) %>"/>
 % }
     </td>
    </tr>
   </table>
  </form>
 <%perl>
-    if ($nchanges && 0) {
+    if (@changedFields && 0) {
        my $x = $xc->getContextNode()->toString();
        $x = xml_encode($x);
        #$x =~ s/$/<br\/>/gm;