LP#1765501: ensure that webstaff MARC editor can deal with short 008s
authorGalen Charlton <gmc@equinoxinitiative.org>
Thu, 19 Apr 2018 19:11:41 +0000 (15:11 -0400)
committerMike Rylander <mrylander@gmail.com>
Wed, 9 May 2018 13:36:07 +0000 (09:36 -0400)
This patch ensures that the 008 field, when maintained by the web staff
MARC editor, is kept at its proper length. In particular, this solves a
problem where input can get messed up if the user selects the entire
contents of the 008 field and replaces it with a shorter string.

To test
------
[1] Create a new bib record. Ensure that the MARC record editor is
    /not/ in flat text mode.
[2] Edit the 008 field by selecting its entire contents and replacing it
    with a subset. For example, this might be done when the first action
    that a cataloger takes is to set the 008/00-05.
[3] Enter value in the individual fixed-field inputs at the top of the
    MARC editor form. For example, enter 'eng' in the Lang field.
[4] Note that the results are wrong; e.g., the text ends up as
    "080419en en eng".
[5] Apply the patch and repeat steps #1-#4. This time, the results
    should be correct.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Signed-off-by: Cesar Velez <cesar.velez@equinoxinitiative.org>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/web/js/ui/default/staff/marcrecord.js

index fa4db5b..9fe525b 100644 (file)
@@ -523,6 +523,16 @@ var MARC21 = {
                         value = value.substr(0, MARC21.Record._ff_pos[field]._8[rtype].len);
                     while (value.length < MARC21.Record._ff_pos[field]._8[rtype].len)
                         value += MARC21.Record._ff_pos[field]._8[rtype].def;
                         value = value.substr(0, MARC21.Record._ff_pos[field]._8[rtype].len);
                     while (value.length < MARC21.Record._ff_pos[field]._8[rtype].len)
                         value += MARC21.Record._ff_pos[field]._8[rtype].def;
+
+                    // first ensure that 008 is padded to appropriate length
+                    var f008_length = (rtype in MARC21.Record._ff_lengths['008']) ?
+                        MARC21.Record._ff_lengths['008'][rtype] :
+                        MARC21.Record._ff_lengths['008']['default'];
+                    if (_8.length < f008_length) {
+                        for (var i = _8.length; i < f008_length; i++) {
+                            _8 += ' ';
+                        }
+                    }
                     this.field('008').update(
                         _8.substring(0, MARC21.Record._ff_pos[field]._8[rtype].start) +
                         value +
                     this.field('008').update(
                         _8.substring(0, MARC21.Record._ff_pos[field]._8[rtype].start) +
                         value +
@@ -1111,6 +1121,13 @@ MARC21.Record._recType = {
     MFHD : { Type : /[uvxy]{1}/,  BLvl : /.{1}/ }
 };
 
     MFHD : { Type : /[uvxy]{1}/,  BLvl : /.{1}/ }
 };
 
+MARC21.Record._ff_lengths = {
+    '008' : {
+        default : 40,
+        MFHD    : 32
+    }
+}
+
 MARC21.Record._ff_pos = {
     AccM : {
         _8 : {
 MARC21.Record._ff_pos = {
     AccM : {
         _8 : {