Bugzilla – Attachment 148909 Details for
Bug 32722
UNIMARC: Remove mandatory flag from some subfields and field in default bibliographic framework
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 32722: Don't block record save if subfield is mandatory but field is optional
Bug-32722-Dont-block-record-save-if-subfield-is-ma.patch (text/plain), 11.37 KB, created by
Jonathan Druart
on 2023-03-29 12:19:04 UTC
(
hide
)
Description:
Bug 32722: Don't block record save if subfield is mandatory but field is optional
Filename:
MIME Type:
Creator:
Jonathan Druart
Created:
2023-03-29 12:19:04 UTC
Size:
11.37 KB
patch
obsolete
>From 8fbc762df70e336a04945c6b93e5e5f073ba462e Mon Sep 17 00:00:00 2001 >From: Jonathan Druart <jonathan.druart@bugs.koha-community.org> >Date: Wed, 29 Mar 2023 14:16:31 +0200 >Subject: [PATCH] Bug 32722: Don't block record save if subfield is mandatory > but field is optional > >It should only be considered mandatory if at least one of the other >subfield is not empty. >--- > .../prog/en/modules/cataloguing/addbiblio.tt | 156 ++++++++++-------- > 1 file changed, 89 insertions(+), 67 deletions(-) > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt >index 0207a5e9e19..b42fabd12d4 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt >@@ -541,6 +541,58 @@ function PopupMARCFieldDoc(field) { > } > } > >+ function get_missing_fields(fields) { >+ let missingFields = []; >+ for(var i=0,len=fields.length; i<len; i++){ >+ isempty = true; >+ arr = fields[i]; >+ divid = "tag_" + arr[0] + "_" + arr[1]; >+ varegexp = new RegExp("^tag_" + arr[0] + "_code_"); >+ >+ if(parseInt(arr[0]) >= 10){ >+ elem = document.getElementById(divid); >+ eleminputs = elem.getElementsByTagName('input'); >+ >+ for(var j=0,len2=eleminputs.length; j<len2; j++){ >+ >+ if(eleminputs[j].name.match(varegexp) && eleminputs[j].value){ >+ inputregexp = new RegExp("^tag_" + arr[0] + "_subfield_" + eleminputs[j].value + "_" + arr[2]); >+ >+ for( var k=0; k<len2; k++){ >+ if( eleminputs[k].id.match(inputregexp) ){ >+ if( eleminputs[k].value ){ >+ isempty = false >+ } >+ } >+ } >+ >+ elemselect = elem.getElementsByTagName('select'); >+ for( var k=0; k<elemselect.length; k++){ >+ if(elemselect[k].id.match(inputregexp) && elemselect[k].value){ >+ isempty = false >+ } >+ } >+ } >+ } >+ >+ elemtextareas = elem.getElementsByTagName('textarea'); >+ for(var j=0,len2=elemtextareas.length; j<len2; j++){ >+ // this bit assumes that the only textareas in this context would be for subfields >+ if (elemtextareas[j].value) { >+ isempty = false; >+ } >+ } >+ >+ } else { >+ isempty = false; >+ } >+ >+ if(isempty){ >+ missingFields.push(arr); >+ } >+ } >+ return missingFields; >+ } > /** > * check if mandatory/important subfields are written > * @param mandatory true to check for mandatories, false for importants >@@ -555,6 +607,7 @@ function PopupMARCFieldDoc(field) { > var StrAlert = "<div id='form-errors' class='dialog alert list'>"; > var notFilledClass = "subfield_not_filled"; > >+ let allFields = {}; > if (mandatory) { > [% FOREACH BIG_LOO IN BIG_LOOP %] > [% FOREACH innerloo IN BIG_LOO.innerloop %] >@@ -567,6 +620,7 @@ function PopupMARCFieldDoc(field) { > label.push("[% subfield_loo.marc_lib | $raw %]"); > [% END %] > [% END %] >+ allFields["[% innerloo.tag %]"] = new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]", "[% BIG_LOO.number | html %]"); > [% END %] > [% END %] > StrAlert += "<h4>" + _("The following mandatory subfields aren't filled:") + "</h4>"; >@@ -587,7 +641,6 @@ function PopupMARCFieldDoc(field) { > StrAlert += "<h4>" + _("The following important subfields arenĂ¢t filled:") + "</h4>"; > notFilledClass = "important_subfield_not_filled"; > } >- StrAlert += "<ul>"; > for(var i=0,len=subfields.length; i<len ; i++){ > var tag=subfields[i].substr(4,3); > var subfield=subfields[i].substr(17,1); >@@ -614,91 +667,60 @@ function PopupMARCFieldDoc(field) { > tabflag[tag+subfield+tagnumber][3] = subfields[i]; > } > >- for (var tagsubfieldid in tabflag){ >- if (tabflag[tagsubfieldid][0]==0){ >- var tag=tagsubfieldid.substr(0,3); >- var subfield=tagsubfieldid.substr(3,1); >- StrAlert += "<li>"+_("Tag %s subfield %s %s in tab %s").format(tag, subfield, formatFieldName( tabflag[tagsubfieldid][1] ), tabflag[tagsubfieldid][2]) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + tabflag[tagsubfieldid][2] + '" data-field="' + tabflag[tagsubfieldid][3] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>'; >- flag = true; >- } >- } >- StrAlert += "</ul>"; > /* Check for mandatories/importants field(not subfields) */ > /* Loop over array of fields identified as mandatory or > important to see if at least one subfield is filled */ >- mandatoryFields = new Object(); >- >- for(var i=0,len=fields.length; i<len; i++){ >- isempty = true; >- arr = fields[i]; >- divid = "tag_" + arr[0] + "_" + arr[1]; >- varegexp = new RegExp("^tag_" + arr[0] + "_code_"); >+ missingMandatoryFields = new Object(); > >- if(parseInt(arr[0]) >= 10){ >- elem = document.getElementById(divid); >- eleminputs = elem.getElementsByTagName('input'); >- >- for(var j=0,len2=eleminputs.length; j<len2; j++){ >- >- if(eleminputs[j].name.match(varegexp) && eleminputs[j].value){ >- inputregexp = new RegExp("^tag_" + arr[0] + "_subfield_" + eleminputs[j].value + "_" + arr[2]); >- >- for( var k=0; k<len2; k++){ >- if( eleminputs[k].id.match(inputregexp) ){ >- if( eleminputs[k].value ){ >- isempty = false >- } >- } >- } >- >- elemselect = elem.getElementsByTagName('select'); >- for( var k=0; k<elemselect.length; k++){ >- if(elemselect[k].id.match(inputregexp) && elemselect[k].value){ >- isempty = false >- } >- } >- } >- } >- >- elemtextareas = elem.getElementsByTagName('textarea'); >- for(var j=0,len2=elemtextareas.length; j<len2; j++){ >- // this bit assumes that the only textareas in this context would be for subfields >- if (elemtextareas[j].value) { >- isempty = false; >- } >- } >- >- } else { >- isempty = false; >- } >- >- if(isempty){ >- flag = true; >+ let notEmptyFields = []; >+ let missingFields = get_missing_fields(fields); >+ if ( missingFields.length > 0 ) { >+ flag = true; >+ missingFields.forEach(f => { > if (mandatory) { >- mandatoryFields[ arr[0] ] = { >+ missingMandatoryFields[ f[0] ] = { > importance: "mandatory", > elemid: "div_indicator_" + divid, >- tab: arr[3] >+ tab: f[3] > } > } else { >- mandatoryFields[ arr[0] ] = { >+ missingMandatoryFields[ f[0] ] = { > importance: "important", > elemid: "div_indicator_" + divid, >- tab: arr[3] >+ tab: f[3] > } > } >- } >+ }); >+ } > >+ StrAlert += "<ul>"; >+ for (var tagsubfieldid in tabflag){ >+ if (tabflag[tagsubfieldid][0]==0){ >+ var tag=tagsubfieldid.substr(0,3); >+ var subfield=tagsubfieldid.substr(3,1); >+ let alert = "<li>"+_("Tag %s subfield %s %s in tab %s").format(tag, subfield, formatFieldName( tabflag[tagsubfieldid][1] ), tabflag[tagsubfieldid][2]) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + tabflag[tagsubfieldid][2] + '" data-field="' + tabflag[tagsubfieldid][3] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>'; >+ if ( fields.map(f => f[0]).includes(tag) ) { >+ StrAlert += alert; >+ flag = true; >+ } else { >+ let allSubfieldsMissing = get_missing_fields([allFields[tag]]).length > 0 ? false : true; >+ if ( allSubfieldsMissing ) { >+ StrAlert += alert; >+ flag = true; >+ } >+ } >+ } > } >+ StrAlert += "</ul>"; > >- if( Object.entries(mandatoryFields).length > 0 ){ >+ if( Object.entries(missingMandatoryFields).length > 0 ){ > StrAlert += "<h4>" + _("The following fields aren't filled:") + "</h4>"; > StrAlert += "<ul>"; >- for( var prop in mandatoryFields ){ >- if( mandatoryFields[prop]["importance"] == "mandatory" ){ >- StrAlert += "<li>" + _("Field %s is mandatory, at least one of its subfields must be filled.").format( prop ) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + mandatoryFields[prop]["tab"] + '" data-field="' + mandatoryFields[prop]["elemid"] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>'; >+ for( var prop in missingMandatoryFields ){ >+ if( missingMandatoryFields[prop]["importance"] == "mandatory" ){ >+ StrAlert += "<li>" + _("Field %s is mandatory, at least one of its subfields must be filled.").format( prop ) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + missingMandatoryFields[prop]["tab"] + '" data-field="' + missingMandatoryFields[prop]["elemid"] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>'; > } else { >- StrAlert += "<li>" + _("Field %s is important, at least one of its subfields must be filled.").format(prop) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + mandatoryFields[prop]["tab"] + '" data-field="' + mandatoryFields[prop]["elemid"] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>'; >+ StrAlert += "<li>" + _("Field %s is important, at least one of its subfields must be filled.").format(prop) + ' <a class="linkfield btn btn-link" href="#" data-tab="' + missingMandatoryFields[prop]["tab"] + '" data-field="' + missingMandatoryFields[prop]["elemid"] + '"><i class="fa fa-arrow-right" aria-hidden="true"></i> ' + _("Go to field") + '</a></li>'; > } > } > StrAlert += "</ul>"; >-- >2.25.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 32722
:
145658
|
148909
|
168801
|
175278
|
175340
|
175589