View | Details | Raw Unified | Return to bug 28694
Collapse All | Expand All

(-)a/koha-tmpl/intranet-tmpl/prog/css/addbiblio.css (+12 lines)
Lines 368-373 tbody tr.active td { Link Here
368
     background-color: #FFAAAA !important;
368
     background-color: #FFAAAA !important;
369
 }
369
 }
370
370
371
 .show-errors {
372
    background: #FFEC8C none;
373
    border-color: #E0C726;
374
    color: #000;
375
    display: none;
376
    text-shadow: none;
377
}
378
379
.floating .show-errors {
380
    display: inline-block;
381
}
382
371
@media (min-width: 768px) {
383
@media (min-width: 768px) {
372
    li.subfield_line label {
384
    li.subfield_line label {
373
        width: 20em;
385
        width: 20em;
(-)a/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss (+12 lines)
Lines 1762-1767 i { Link Here
1762
    padding: .5em;
1762
    padding: .5em;
1763
    text-align: center;
1763
    text-align: center;
1764
    width: 65%;
1764
    width: 65%;
1765
    max-width: 600px;
1765
1766
1766
    a {
1767
    a {
1767
        &.approve {
1768
        &.approve {
Lines 1864-1869 i { Link Here
1864
        strong {
1865
        strong {
1865
            color: #900;
1866
            color: #900;
1866
        }
1867
        }
1868
1869
        &.list {
1870
            text-align: left;
1871
1872
            h2,
1873
            h3,
1874
            h4 {
1875
                margin: 1em 0;
1876
                text-align: left;
1877
            }
1878
        }
1867
    }
1879
    }
1868
}
1880
}
1869
1881
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (-24 / +91 lines)
Lines 155-168 Link Here
155
155
156
        $(".tag_anchor").on("click", function(e){
156
        $(".tag_anchor").on("click", function(e){
157
            e.preventDefault();
157
            e.preventDefault();
158
            var toolbar_height = $("#toolbar").outerHeight();
159
            $(".tag_anchor").removeClass("selected");
158
            $(".tag_anchor").removeClass("selected");
160
            $(this).addClass("selected");
159
            $(this).addClass("selected");
161
            var link = this.href;
160
            var link = this.href;
162
            var linkid = link.substring( link.indexOf("#") + 1 );
161
            var linkid = link.substring( link.indexOf("#") + 1 );
163
            var dest = $("#" + linkid );
162
            window.scrollTo( 0, getScrollto( linkid, "toolbar" ) );
164
            var yoffset = dest.offset();
163
        });
165
            window.scrollTo( 0, yoffset.top - toolbar_height - 20 );
164
165
        $("body").on("click", ".linkfield", function(e){
166
            e.preventDefault();
167
            var tab = $(this).data("tab");
168
            var field = $(this).data("field");
169
            var tablink = $("a[data-tabid='" + tab + "']" );
170
            selectTab( tablink );
171
            window.scrollTo( 0, getScrollto( field, "toolbar" ) );
172
        });
173
174
        $("body").on("click", ".show-errors", function(e){
175
            document.getElementById("form-errors").scrollIntoView();
166
        });
176
        });
167
177
168
    });
178
    });
Lines 176-181 Link Here
176
        $(".tag_anchors_" + tabid ).addClass("tab_selected").show();
186
        $(".tag_anchors_" + tabid ).addClass("tab_selected").show();
177
    }
187
    }
178
188
189
    /**
190
    * Returns a roughly ideal position to scroll an element into view
191
    * @param {string} target - The HTML id of the element to scroll into view
192
    * @param {string} elemid - The HTML id of the element which might obscure
193
    *                          the view of the target element e.g. a floating toolbar
194
    * @return {number} - The y-coordinate to pass to window.scrollTo()
195
    */
196
    function getScrollto( target, elemid ){
197
        var dest = $("#" + target );
198
        var yoffset = dest.offset();
199
200
        if( elemid != "" ){
201
            var element = $("#" + elemid );
202
            var elem_height = element.outerHeight();
203
        } else {
204
            elem_height = 0;
205
        }
206
        return yoffset.top - elem_height - 20;
207
    }
208
179
    function redirect(dest){
209
    function redirect(dest){
180
        $("#redirect").attr("value",dest);
210
        $("#redirect").attr("value",dest);
181
        return Check();
211
        return Check();
Lines 185-191 Link Here
185
        var onOption = function () {
215
        var onOption = function () {
186
            return Check();
216
            return Check();
187
        }
217
        }
188
[% END %]
218
    [% END %]
189
219
190
/**
220
/**
191
* this function append button for create new authority if not found
221
* this function append button for create new authority if not found
Lines 512-525 function PopupMARCFieldDoc(field) { Link Here
512
        var label = new Array();
542
        var label = new Array();
513
        var flag=0;
543
        var flag=0;
514
        var tabflag= new Array();
544
        var tabflag= new Array();
515
        var StrAlert = "";
545
        var StrAlert = "<div id='form-errors' class='dialog alert list'>";
516
        var notFilledClass = "subfield_not_filled";
546
        var notFilledClass = "subfield_not_filled";
517
547
518
        if (mandatory) {
548
        if (mandatory) {
519
            [% FOREACH BIG_LOO IN BIG_LOOP %]
549
            [% FOREACH BIG_LOO IN BIG_LOOP %]
520
                [% FOREACH innerloo IN BIG_LOO.innerloop %]
550
                [% FOREACH innerloo IN BIG_LOO.innerloop %]
521
                    [% IF ( innerloo.mandatory ) %]
551
                    [% IF ( innerloo.mandatory ) %]
522
                        fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]"));
552
                        fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]", "[% BIG_LOO.number | html %]"));
523
                    [% END %]
553
                    [% END %]
524
                    [% FOREACH subfield_loo IN innerloo.subfield_loop %]
554
                    [% FOREACH subfield_loo IN innerloo.subfield_loop %]
525
                        [% IF ( subfield_loo.mandatory ) %]subfields.push("[% subfield_loo.id | html %]");
555
                        [% IF ( subfield_loo.mandatory ) %]subfields.push("[% subfield_loo.id | html %]");
Lines 529-540 function PopupMARCFieldDoc(field) { Link Here
529
                    [% END %]
559
                    [% END %]
530
                [% END %]
560
                [% END %]
531
            [% END %]
561
            [% END %]
532
            StrAlert = _("Can't save this record because the following field aren't filled:");
562
            StrAlert += "<h4>" + _("The following subfields aren't filled:") + "</h4>";
533
        } else {
563
        } else {
534
            [% FOREACH BIG_LOO IN BIG_LOOP %]
564
            [% FOREACH BIG_LOO IN BIG_LOOP %]
535
                [% FOREACH innerloo IN BIG_LOO.innerloop %]
565
                [% FOREACH innerloo IN BIG_LOO.innerloop %]
536
                    [% IF ( innerloo.important ) %]
566
                    [% IF ( innerloo.important ) %]
537
                    fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]"));
567
                        fields.push(new Array("[% innerloo.tag | html %]","[% innerloo.index | html %][% innerloo.random | html %]","[% innerloo.index | html %]", "[% BIG_LOO.number | html %]"));
538
                    [% END %]
568
                    [% END %]
539
                    [% FOREACH subfield_loo IN innerloo.subfield_loop %]
569
                    [% FOREACH subfield_loo IN innerloo.subfield_loop %]
540
                        [% IF ( subfield_loo.important ) %]subfields.push("[% subfield_loo.id | html %]");
570
                        [% IF ( subfield_loo.important ) %]subfields.push("[% subfield_loo.id | html %]");
Lines 544-554 function PopupMARCFieldDoc(field) { Link Here
544
                    [% END %]
574
                    [% END %]
545
                [% END %]
575
                [% END %]
546
            [% END %]
576
            [% END %]
547
            StrAlert = _("A few important fields are not filled:");
577
            StrAlert += "<h4>" + _("A few important fields are not filled:") + "</h4>";
548
            notFilledClass = "important_subfield_not_filled";
578
            notFilledClass = "important_subfield_not_filled";
549
        }
579
        }
550
580
        StrAlert += "<ul>";
551
        StrAlert += "\n\n";
552
        for(var i=0,len=subfields.length; i<len ; i++){
581
        for(var i=0,len=subfields.length; i<len ; i++){
553
            var tag=subfields[i].substr(4,3);
582
            var tag=subfields[i].substr(4,3);
554
            var subfield=subfields[i].substr(17,1);
583
            var subfield=subfields[i].substr(17,1);
Lines 572-589 function PopupMARCFieldDoc(field) { Link Here
572
            } else {
601
            } else {
573
                tabflag[tag+subfield+tagnumber][0] = 1;
602
                tabflag[tag+subfield+tagnumber][0] = 1;
574
            }
603
            }
604
            tabflag[tag+subfield+tagnumber][3] = subfields[i];
575
        }
605
        }
606
576
        for (var tagsubfieldid in tabflag){
607
        for (var tagsubfieldid in tabflag){
577
            if (tabflag[tagsubfieldid][0]==0){
608
            if (tabflag[tagsubfieldid][0]==0){
578
                var tag=tagsubfieldid.substr(0,3);
609
                var tag=tagsubfieldid.substr(0,3);
579
                var subfield=tagsubfieldid.substr(3,1);
610
                var subfield=tagsubfieldid.substr(3,1);
580
                StrAlert += "\t* "+_("tag %s subfield %s %s in tab %s").format(tag, subfield, tabflag[tagsubfieldid][1], tabflag[tagsubfieldid][2]) + "\n";
611
                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>';
581
                //StrAlert += "\t* "+label[i]+_(" in tab ")+tab[i]+"\n";
582
                flag=1;
612
                flag=1;
583
            }
613
            }
584
        }
614
        }
585
615
        StrAlert += "</ul>";
586
        /* Check for mandatories/importants field(not subfields) */
616
        /* Check for mandatories/importants field(not subfields) */
617
        /* Loop over array of fields identified as mandatory or
618
           important to see if at least one subfield is filled */
619
        mandatoryFields = new Object();
620
587
        for(var i=0,len=fields.length; i<len; i++){
621
        for(var i=0,len=fields.length; i<len; i++){
588
            isempty  = true;
622
            isempty  = true;
589
            arr      = fields[i];
623
            arr      = fields[i];
Lines 600-607 function PopupMARCFieldDoc(field) { Link Here
600
                        inputregexp = new RegExp("^tag_" + arr[0] + "_subfield_" + eleminputs[j].value + "_" + arr[2]);
634
                        inputregexp = new RegExp("^tag_" + arr[0] + "_subfield_" + eleminputs[j].value + "_" + arr[2]);
601
635
602
                        for( var k=0; k<len2; k++){
636
                        for( var k=0; k<len2; k++){
603
                            if(eleminputs[k].id.match(inputregexp) && eleminputs[k].value){
637
                            if( eleminputs[k].id.match(inputregexp) ){
604
                                isempty = false
638
                                if( eleminputs[k].value ){
639
                                    isempty = false
640
                                }
605
                            }
641
                            }
606
                        }
642
                        }
607
643
Lines 621-644 function PopupMARCFieldDoc(field) { Link Here
621
                        isempty = false;
657
                        isempty = false;
622
                    }
658
                    }
623
                }
659
                }
660
624
            } else {
661
            } else {
625
                isempty = false;
662
                isempty = false;
626
            }
663
            }
627
664
628
            if(isempty){
665
            if(isempty){
629
                flag = 1;
666
                flag = 1;
630
                StrAlert += "\t* ";
631
                if (mandatory) {
667
                if (mandatory) {
632
                    StrAlert += _("Field %s is mandatory, at least one of its subfields must be filled.").format(arr[0]);
668
                    mandatoryFields[ arr[0] ] = {
669
                        importance: "mandatory",
670
                        elemid: "div_indicator_" + divid,
671
                        tab: arr[3]
672
                    }
633
                } else {
673
                } else {
634
                    StrAlert += _("Field %s is important, at least one of its subfields must be filled.").format(arr[0]);
674
                    mandatoryFields[ arr[0] ] = {
675
                        importance: "important",
676
                        elemid: "div_indicator_" + divid,
677
                        tab: arr[3]
678
                    }
635
                }
679
                }
636
                StrAlert += "\n";
637
            }
680
            }
638
681
639
        }
682
        }
640
683
684
        if( Object.entries(mandatoryFields).length > 0 ){
685
            StrAlert += "<h4>" + _("The following fields aren't filled:") + "</h4>";
686
            StrAlert += "<ul>";
687
            for( var prop in mandatoryFields ){
688
                if( mandatoryFields[prop]["importance"] == "mandatory" ){
689
                    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>';
690
                } else {
691
                    StrAlert += "<li>" + _("Field %s is important, at least one of its subfields must be filled.").format(arr[0]) + ' <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>';
692
                }
693
            }
694
            StrAlert += "</ul>";
695
        }
696
        StrAlert += "</div>";
641
        if(flag){
697
        if(flag){
698
            $("#show-errors").html('<button type="button" class="btn btn-danger show-errors"><i class="fa fa-warning"></i> Errors</span>');
642
            return StrAlert;
699
            return StrAlert;
643
        } else {
700
        } else {
644
            return flag;
701
            return flag;
Lines 663-669 function PopupMARCFieldDoc(field) { Link Here
663
            document.f.submit();
720
            document.f.submit();
664
            return true;
721
            return true;
665
        } else {
722
        } else {
666
            alert(StrAlert);
723
            $("#check_errors").html( StrAlert );
724
            $('html, body').animate({ scrollTop: 0 }, 'fast');
725
            Sticky.hcSticky('refresh');
667
            return false;
726
            return false;
668
        }
727
        }
669
    }
728
    }
Lines 704-709 function PopupMARCFieldDoc(field) { Link Here
704
        f.submit();
763
        f.submit();
705
    }
764
    }
706
765
766
    /* Wrap a value in HTML without putting HTML in translatable string */
767
    function formatFieldName( string ){
768
        return "<strong><em>" + string + "</em></strong>";
769
    }
707
</script>
770
</script>
708
[% Asset.css("css/addbiblio.css") | $raw %]
771
[% Asset.css("css/addbiblio.css") | $raw %]
709
</head>
772
</head>
Lines 739-744 function PopupMARCFieldDoc(field) { Link Here
739
        <div class="row">
802
        <div class="row">
740
            <div class="col-md-10 col-md-offset-1">
803
            <div class="col-md-10 col-md-offset-1">
741
804
805
                <div id="check_errors"></div>
806
742
                <h1>
807
                <h1>
743
                    [% IF ( biblionumber ) %]
808
                    [% IF ( biblionumber ) %]
744
                        Editing <em>[% title | html %]</em> (Record number [% biblionumber | html %])
809
                        Editing <em>[% title | html %]</em> (Record number [% biblionumber | html %])
Lines 881-888 function PopupMARCFieldDoc(field) { Link Here
881
                                </div>
946
                                </div>
882
                            [% END %]
947
                            [% END %]
883
                        [% ELSE %]
948
                        [% ELSE %]
884
                            <a class="btn btn-default" id="cancel" href="/cgi-bin/koha/cataloguing/addbooks.pl">Cancel</a>
949
                            <div class="btn-group">
950
                                <a class="btn btn-default" id="cancel" href="/cgi-bin/koha/cataloguing/addbooks.pl">Cancel</a>
951
                            </div>
885
                        [% END %]
952
                        [% END %]
953
                        <div id="show-errors" class="btn-group"></div>
886
                    [% END # /UNLESS circborrowernumber %]
954
                    [% END # /UNLESS circborrowernumber %]
887
                    <div class="toolbar-tabs-container">
955
                    <div class="toolbar-tabs-container">
888
                        [% IF ( BIG_LOOP && BIG_LOOP.size > 1 ) %]
956
                        [% IF ( BIG_LOOP && BIG_LOOP.size > 1 ) %]
889
- 

Return to bug 28694