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

(-)a/C4/ImportExportFramework.pm (-22 / +43 lines)
Lines 194-200 Functions for handling import/export. Link Here
194
194
195
=head2 ExportFramework
195
=head2 ExportFramework
196
196
197
Export all the information of a Framework to an excel "xml" file or OpenDocument SpreadSheet "ods" file.
197
Export all the information of a MARC or Authority Type Framework to an excel "xml" file, comma separated values "csv" file or OpenDocument SpreadSheet "ods" file.
198
198
199
return :
199
return :
200
succes
200
succes
Lines 203-209 succes Link Here
203
203
204
sub ExportFramework
204
sub ExportFramework
205
{
205
{
206
    my ($frameworkcode, $xmlStrRef, $mode) = @_;
206
    my ($frameworkcode, $xmlStrRef, $mode, $frameworktype) = @_;
207
207
208
    my $dbh = C4::Context->dbh;
208
    my $dbh = C4::Context->dbh;
209
    if ($dbh) {
209
    if ($dbh) {
Lines 230-237 sub ExportFramework Link Here
230
            }
230
            }
231
        }
231
        }
232
232
233
        if (_export_table('marc_tag_structure', $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode)) {
233
	my $table = 'marc_tag_structure';
234
            if (_export_table('marc_subfield_structure', $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode)) {
234
	my $subtable = 'marc_subfield_structure';
235
	if ($frameworktype && $frameworktype eq "authority") {
236
	    $table = 'auth_tag_structure';
237
	    $subtable = 'auth_subfield_structure';
238
	}
239
240
        if (_export_table($table, $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode, $frameworktype)) {
241
            if (_export_table($subtable, $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode, $frameworktype)) {
235
                $$xmlStrRef = $dom->toString(1) if ($mode eq 'ods' || $mode eq 'excel');
242
                $$xmlStrRef = $dom->toString(1) if ($mode eq 'ods' || $mode eq 'excel');
236
                return 1;
243
                return 1;
237
            }
244
            }
Lines 246-265 sub ExportFramework Link Here
246
# Export all the data from a mysql table to an spreadsheet.
253
# Export all the data from a mysql table to an spreadsheet.
247
sub _export_table
254
sub _export_table
248
{
255
{
249
    my ($table, $dbh, $dom, $root, $frameworkcode, $mode) = @_;
256
    my ($table, $dbh, $dom, $root, $frameworkcode, $mode, $frameworktype) = @_;
250
    if ($mode eq 'csv') {
257
    if ($mode eq 'csv') {
251
        _export_table_csv($table, $dbh, $dom, $root, $frameworkcode);
258
        _export_table_csv($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
252
    } elsif ($mode eq 'ods') {
259
    } elsif ($mode eq 'ods') {
253
        _export_table_ods($table, $dbh, $dom, $root, $frameworkcode);
260
        _export_table_ods($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
254
    } else {
261
    } else {
255
        _export_table_excel($table, $dbh, $dom, $root, $frameworkcode);
262
        _export_table_excel($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
256
    }
263
    }
257
}
264
}
258
265
259
# Export the mysql table to an csv file
266
# Export the mysql table to an csv file
260
sub _export_table_csv
267
sub _export_table_csv
261
{
268
{
262
    my ($table, $dbh, $strCSV, $root, $frameworkcode) = @_;
269
    my ($table, $dbh, $strCSV, $root, $frameworkcode, $frameworktype) = @_;
263
270
264
    eval {
271
    eval {
265
        # First row with the name of the columns
272
        # First row with the name of the columns
Lines 275-280 sub _export_table_csv Link Here
275
        $$strCSV .= chr(10);
282
        $$strCSV .= chr(10);
276
        # Populate rows with the data from mysql
283
        # Populate rows with the data from mysql
277
        $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
284
        $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
285
        if ($frameworktype eq "authority") {
286
	    $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
287
        }
278
        $sth = $dbh->prepare($query);
288
        $sth = $dbh->prepare($query);
279
        $sth->execute($frameworkcode);
289
        $sth->execute($frameworkcode);
280
        my $data;
290
        my $data;
Lines 306-312 sub _export_table_csv Link Here
306
# Export the mysql table to an ods file
316
# Export the mysql table to an ods file
307
sub _export_table_ods
317
sub _export_table_ods
308
{
318
{
309
    my ($table, $dbh, $dom, $root, $frameworkcode) = @_;
319
    my ($table, $dbh, $dom, $root, $frameworkcode, $frameworktype) = @_;
310
320
311
    eval {
321
    eval {
312
        my $elementTable = $dom->createElement('table:table');
322
        my $elementTable = $dom->createElement('table:table');
Lines 335-340 sub _export_table_ods Link Here
335
        }
345
        }
336
        # Populate rows with the data from mysql
346
        # Populate rows with the data from mysql
337
        $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
347
        $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
348
        if ($frameworktype eq "authority") {
349
            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
350
        }
338
        $sth = $dbh->prepare($query);
351
        $sth = $dbh->prepare($query);
339
        $sth->execute($frameworkcode);
352
        $sth->execute($frameworkcode);
340
        my $data;
353
        my $data;
Lines 370-376 sub _export_table_ods Link Here
370
# Export the mysql table to an excel-xml (openoffice/libreoffice compatible) file
383
# Export the mysql table to an excel-xml (openoffice/libreoffice compatible) file
371
sub _export_table_excel
384
sub _export_table_excel
372
{
385
{
373
    my ($table, $dbh, $dom, $root, $frameworkcode) = @_;
386
    my ($table, $dbh, $dom, $root, $frameworkcode, $frameworktype) = @_;
374
387
375
    eval {
388
    eval {
376
        my $elementWS = $dom->createElement('Worksheet');
389
        my $elementWS = $dom->createElement('Worksheet');
Lines 400-405 sub _export_table_excel Link Here
400
        }
413
        }
401
        # Populate rows with the data from mysql
414
        # Populate rows with the data from mysql
402
        $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
415
        $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
416
        if ($frameworktype eq "authority") {
417
            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
418
        }
403
        $sth = $dbh->prepare($query);
419
        $sth = $dbh->prepare($query);
404
        $sth->execute($frameworkcode);
420
        $sth->execute($frameworkcode);
405
        my $data;
421
        my $data;
Lines 429-440 sub _export_table_excel Link Here
429
    return 1;
445
    return 1;
430
}#_export_table_excel
446
}#_export_table_excel
431
447
432
433
434
435
436
437
438
# Format chars problematics to a correct format for xml.
448
# Format chars problematics to a correct format for xml.
439
sub _parseContent2Xml
449
sub _parseContent2Xml
440
{
450
{
Lines 619-625 sub _getMeta Link Here
619
629
620
=head2 ImportFramework
630
=head2 ImportFramework
621
631
622
Import all the information of a Framework from a excel-xml/ods file.
632
Import all the information of a MARC or Authority Type Framework from a excel-xml/ods file.
623
633
624
return :
634
return :
625
success
635
success
Lines 628-634 success Link Here
628
638
629
sub ImportFramework
639
sub ImportFramework
630
{
640
{
631
    my ($filename, $frameworkcode, $deleteFilename) = @_;
641
    my ($filename, $frameworkcode, $deleteFilename, $frameworktype) = @_;
632
642
633
    my $tempdir;
643
    my $tempdir;
634
    my $ok = -1;
644
    my $ok = -1;
Lines 658-670 sub ImportFramework Link Here
658
                    # They are text files, so open it to read
668
                    # They are text files, so open it to read
659
                    open($dom, '<', $filename);
669
                    open($dom, '<', $filename);
660
                }
670
                }
671
672
                my $table = 'marc_tag_structure';
673
                my $subtable = 'marc_subfield_structure';
674
                if ($frameworktype && $frameworktype eq "authority") {
675
                    $table = 'auth_tag_structure';
676
                    $subtable = 'auth_subfield_structure';
677
                }
678
661
                if ($dom) {
679
                if ($dom) {
662
                    # Process both tables
680
                    # Process both tables
663
                    my $numDeleted = 0;
681
                    my $numDeleted = 0;
664
                    my $numDeletedAux = 0;
682
                    my $numDeletedAux = 0;
665
                    if (($numDeletedAux = _import_table($dbh, 'marc_tag_structure', $frameworkcode, $dom, ['frameworkcode', 'tagfield'], $extension)) >= 0) {
683
                    if (($numDeletedAux = _import_table($dbh, $table, $frameworkcode, $dom, ['frameworkcode', 'tagfield'], $extension, $frameworktype)) >= 0) {
666
                        $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
684
                        $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
667
                        if (($numDeletedAux = _import_table($dbh, 'marc_subfield_structure', $frameworkcode, $dom, ['frameworkcode', 'tagfield', 'tagsubfield'], $extension)) >= 0) {
685
                        if (($numDeletedAux = _import_table($dbh, $subtable, $frameworkcode, $dom, ['frameworkcode', 'tagfield', 'tagsubfield'], $extension, $frameworktype)) >= 0) {
668
                            $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
686
                            $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
669
                            $ok = ($numDeleted > 0)?$numDeleted:0;
687
                            $ok = ($numDeleted > 0)?$numDeleted:0;
670
                        }
688
                        }
Lines 785-791 sub _check_validity_worksheet Link Here
785
# Import the data from an excel-xml/ods to mysql tables.
803
# Import the data from an excel-xml/ods to mysql tables.
786
sub _import_table
804
sub _import_table
787
{
805
{
788
    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $format) = @_;
806
    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $format, $frameworktype) = @_;
789
    my %fields2Delete;
807
    my %fields2Delete;
790
    my $query;
808
    my $query;
791
    my @fields;
809
    my @fields;
Lines 794-799 sub _import_table Link Here
794
        @fields = @$PKArray;
812
        @fields = @$PKArray;
795
        shift @fields;
813
        shift @fields;
796
        $query = 'SELECT ' . join(',', @fields) . ' FROM ' . $table . ' WHERE frameworkcode=?';
814
        $query = 'SELECT ' . join(',', @fields) . ' FROM ' . $table . ' WHERE frameworkcode=?';
815
        if ($frameworktype eq "authority") {
816
            $query = 'SELECT ' . join(',', @fields) . ' FROM ' . $table . ' WHERE authtypecode=?';
817
        }
797
        my $sth = $dbh->prepare($query);
818
        my $sth = $dbh->prepare($query);
798
        $sth->execute($frameworkcode);
819
        $sth->execute($frameworkcode);
799
        my $field;
820
        my $field;
(-)a/admin/import_export_authtype.pl (+97 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright 2016 Aleisha Amohia <aleisha@catalyst.net.nz>
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
#
12
# Koha is distributed in the hope that it will be useful, but
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
# GNU General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20
21
use strict;
22
use warnings;
23
use CGI qw ( -utf8 );
24
use CGI::Cookie;
25
use C4::Context;
26
use C4::Auth qw/check_cookie_auth/;
27
use C4::ImportExportFramework;
28
29
my %cookies = CGI::Cookie->fetch();
30
my $authenticated = 0;
31
my ($auth_status, $sessionID);
32
if (exists $cookies{'CGISESSID'}) {
33
    ($auth_status, $sessionID) = check_cookie_auth(
34
        $cookies{'CGISESSID'}->value,
35
        { parameters => 'parameters_remaining_permissions' },
36
    );
37
}
38
if ($auth_status eq 'ok') {
39
    $authenticated = 1;
40
}
41
42
my $input = new CGI;
43
44
unless ($authenticated) {
45
    print $input->header(-type => 'text/plain', -status => '403 Forbidden');
46
    exit 0;
47
}
48
49
my $authtypecode = $input->param('authtypecode') || '';
50
my $action = $input->param('action') || 'export';
51
52
## Exporting
53
if ($action eq 'export' && $input->request_method() eq 'GET') {
54
    my $strXml = '';
55
    my $format = $input->param('type_export_' . $authtypecode);
56
    ExportFramework($authtypecode, \$strXml, $format, 'authority');
57
58
    if ($format eq 'csv') {
59
        # CSV file
60
61
        # Correctly set the encoding to output plain text in UTF-8
62
        binmode(STDOUT,':encoding(UTF-8)');
63
        print $input->header(-type => 'application/vnd.ms-excel', -attachment => 'export_' . $authtypecode . '.csv');
64
        print $strXml;
65
    } elsif ($format eq 'excel') {
66
        # Excel-xml file
67
        print $input->header(-type => 'application/excel', -attachment => 'export_' . $authtypecode . '.xml');
68
        print $strXml;
69
    } else {
70
        # ODS file
71
        my $strODS = '';
72
        createODS($strXml, 'en', \$strODS);
73
        print $input->header(-type => 'application/vnd.oasis.opendocument.spreadsheet', -attachment => 'export_' . $authtypecode . '.ods');
74
        print $strODS;
75
    }
76
## Importing
77
} elsif ($input->request_method() eq 'POST') {
78
    my $ok = -1;
79
    my $fieldname = 'file_import_' . $authtypecode;
80
    my $filename = $input->param($fieldname);
81
    # upload the input file
82
    if ($filename && $filename =~ /\.(csv|ods|xml)$/i) {
83
        my $extension = $1;
84
        my $uploadFd = $input->upload($fieldname);
85
        if ($uploadFd && !$input->cgi_error) {
86
            my $tmpfilename = $input->tmpFileName($input->param($fieldname));
87
            $filename = $tmpfilename . '.' . $extension; # rename the tmp file with the extension
88
            $ok = ImportFramework($filename, $authtypecode, 1, 'authority') if (rename($tmpfilename, $filename));
89
        }
90
    }
91
    if ($ok >= 0) { # If everything went ok go to the authority type marc structure
92
        print $input->redirect( -location => '/cgi-bin/koha/admin/auth_tag_structure.pl?authtypecode=' . $authtypecode);
93
    } else {
94
        # If something failed go to the list of authority types and show message
95
        print $input->redirect( -location => '/cgi-bin/koha/admin/authtypes.pl?error_import_export=' . $authtypecode);
96
    }
97
}
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/authtypes.tt (-2 / +120 lines)
Lines 11-25 Link Here
11
[% INCLUDE 'datatables.inc' %]
11
[% INCLUDE 'datatables.inc' %]
12
<script type="text/javascript">
12
<script type="text/javascript">
13
//<![CDATA[
13
//<![CDATA[
14
15
    /* Import/Export from/to spreadsheet */
16
17
    var importing = false;
18
14
    $(document).ready(function() {
19
    $(document).ready(function() {
15
        $("#authtypes").dataTable($.extend(true, {}, dataTablesDefaults, {
20
        $("#authtypes").dataTable($.extend(true, {}, dataTablesDefaults, {
16
            "aoColumnDefs": [
21
            "aoColumnDefs": [
17
                { "aTargets": [ -1, -2, -3 ], "bSortable": false, "bSearchable": false },
22
                { "aTargets": [ -1, -2, -3 ], "bSortable": false, "bSearchable": false },
23
                { "aTargets": [ 0, 1 ], "sType": "natural" },
18
            ],
24
            ],
25
            "bSort": true,
19
            "sPaginationType": "four_button"
26
            "sPaginationType": "four_button"
20
        }));
27
        }));
28
29
        $("body").css("cursor", "auto");
30
        $('.import_export_options').hide();
31
        $('a.import_export_fw').click(function() {
32
            if (!importing) {
33
                $('.import_export_options').hide();
34
                $(this).next().show('slide');
35
            }
36
            return false;
37
        });
38
        $('.import_export_close').click(function() {
39
            if (!importing) {
40
                $('.import_export_options').fadeOut('fast');
41
                $("body").css("cursor", "auto");
42
                return false;
43
            }
44
        });
45
        $('.input_import').val("");
46
47
        var matches = new RegExp("\\?error_import_export=(.+)$").exec(window.location.search);
48
        if (matches && matches.length > 1) {
49
            alert(_("Error importing the authority type %s").format(decodeURIComponent(matches[1])));
50
        }
51
52
        $('input.input_import').change( function() {
53
            var filename = $(this).val();
54
            if ( ! /(?:\.csv|\.ods|\.xml)$/.test(filename)) {
55
                $(this).css("background-color","yellow");
56
                alert(_("Please select a CSV (.csv), ODS (.ods) or XML (.xml) file."));
57
                $(this).val("");
58
                $(this).css("background-color","white");
59
            }
60
        });
61
        $('form.form_export').submit(function() {
62
            $('.modal').modal("hide");
63
            return true;
64
        });
65
        $('form.form_import').submit(function() {
66
            var id = $(this).attr('id');
67
            var obj = $('#' + id + ' input:file');
68
            if (/(?:\.csv|\.ods|\.xml)$/.test(obj.val())) {
69
                if (confirm(_("Do you really want to import the authority type fields and subfields? This will overwrite the current configuration. For safety reasons please use the export option to make a backup"))) {
70
                    var authtypecode = $('#' + id + ' input:hidden[name=authtypecode]').val();
71
                    $('#importing_' + authtypecode).find("span").html(_("Importing to authority type: %s. Importing from file: %s").format("<strong>" + authtypecode + "</strong>", "<i>" + obj.val().replace(new RegExp("^.+[/\\\\]"),"") + "</i>"));
72
                    if (navigator.userAgent.toLowerCase().indexOf('msie') != -1) {
73
                        var timestamp = new Date().getTime();
74
                        $('#importing_' + authtypecode).find("img").attr('src', '[% interface %]/[% theme %]/img/loading-small.gif' + '?' +timestamp);
75
                    }
76
                    $('#importing_' + authtypecode).css('display', 'block');
77
                    if (navigator.userAgent.toLowerCase().indexOf('firefox') == -1) $("body").css("cursor", "progress");
78
                    importing = true;
79
                    $(".modal-footer,.closebtn").hide();
80
                    return true;
81
                } else
82
                    return false;
83
            }
84
            obj.css("background-color","yellow");
85
            alert(_("Please select a spreadsheet (.csv, .ods, .xml) file."));
86
            obj.val("");
87
            obj.css("background-color","white");
88
            return false;
89
        });
21
    });
90
    });
22
//]]>
23
</script>
91
</script>
24
</head>
92
</head>
25
93
Lines 153-158 Link Here
153
            <th>&nbsp;</th>
221
            <th>&nbsp;</th>
154
            <th>Edit</th>
222
            <th>Edit</th>
155
            <th>Delete</th>
223
            <th>Delete</th>
224
            <th title="Export authority type (fields, subfields) to a spreadsheet file (.csv, .xml, .ods)">Export</th>
225
            <th title="Import authority type (fields, subfields) from a spreadsheet file (.csv, .xml, .ods)">Import</th>
156
        </tr>
226
        </tr>
157
        </thead>
227
        </thead>
158
        <tbody>
228
        <tbody>
Lines 165-170 Link Here
165
                <td><a href="auth_tag_structure.pl?authtypecode=[% authority_type.authtypecode %]" class="button parameters" >MARC structure</a></td>
235
                <td><a href="auth_tag_structure.pl?authtypecode=[% authority_type.authtypecode %]" class="button parameters" >MARC structure</a></td>
166
                <td><a href="/cgi-bin/koha/admin/authtypes.pl?op=add_form&amp;authtypecode=[% authority_type.authtypecode |html %]">Edit</a></td>
236
                <td><a href="/cgi-bin/koha/admin/authtypes.pl?op=add_form&amp;authtypecode=[% authority_type.authtypecode |html %]">Edit</a></td>
167
                <td><a href="/cgi-bin/koha/admin/authtypes.pl?op=delete_confirm&amp;authtypecode=[% authority_type.authtypecode |html %]">Delete</a></td>
237
                <td><a href="/cgi-bin/koha/admin/authtypes.pl?op=delete_confirm&amp;authtypecode=[% authority_type.authtypecode |html %]">Delete</a></td>
238
		<td>
239
                <!-- Button to trigger modal -->
240
                <a href="#" data-toggle="modal" data-target="#exportModal_[% authority_type.authtypecode %][% loop.count %]">Export</a>
241
                <!-- Modal -->
242
                <div class="modal hide" id="exportModal_[% authority_type.authtypecode %][% loop.count %]" tabindex="-1" role="dialog" aria-labelledby="exportLabelexportModal_[% authority_type.authtypecode %][% loop.count %]" aria-hidden="true">
243
                    <div class="modal-header">
244
                        <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
245
                        <h3 id="exportLabelexportModal_[% authority_type.authtypecode %][% loop.count %]">Export [% authority_type.authtypetext %] authority type</h3>
246
                    </div>
247
                    <form action="import_export_authtype.pl" name="form_[% authority_type.authtypecode %]" method="get" target="_blank"  class="form_export">
248
                        <div class="modal-body">
249
                            <fieldset>
250
                                <input type="hidden" name="authtypecode" value="[% authority_type.authtypecode %]" />
251
                                <p><label for="csv_type_export_[% authority_type.authtypecode %][% loop.count %]"><input type="radio" name="type_export_[% authority_type.authtypecode %]" value="csv" id="csv_type_export_[% authority_type.authtypecode %][% loop.count %]" checked="checked" /> Export to CSV spreadsheet</label></p>
252
                                <p><label for="xml_type_export_[% authority_type.authtypecode %][% loop.count %]"><input type="radio" name="type_export_[% authority_type.authtypecode %]" value="excel" id="xml_type_export_[% authority_type.authtypecode %][% loop.count %]" /> Export to Excel with XML format, compatible with OpenOffice/LibreOffice as well</label></p>
253
                                <p><label for="ods_type_export_[% authority_type.authtypecode %][% loop.count %]"><input type="radio" name="type_export_[% authority_type.authtypecode %]" value="ods" id="ods_type_export_[% authority_type.authtypecode %][% loop.count %]" /> Export to OpenDocument spreadsheet format</label></p>
254
255
                            </fieldset>
256
                        </div>
257
                        <div class="modal-footer">
258
                            <button type="submit" class="btn">Export</button>
259
                            <button class="btn btn-link" data-dismiss="modal" aria-hidden="true">Cancel</button>
260
                        </div>
261
                    </form>
262
                </div>
263
                </td>
264
                <td>
265
                <!-- Button to trigger modal -->
266
                <a href="#" data-toggle="modal" data-target="#importModal_[% authority_type.authtypecode %][% loop.count %]">Import</a>
267
                <!-- Modal -->
268
                <div class="modal hide" id="importModal_[% authority_type.authtypecode %][% loop.count %]" tabindex="-1" role="dialog" aria-labelledby="importLabelexportModal_[% authority_type.authtypecode %][% loop.count %]" aria-hidden="true">
269
                    <div class="modal-header">
270
                        <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
271
                        <h3 id="importLabelexportModal_[% authority_type.authtypecode %][% loop.count %]">Import [% authority_type.authtypecode %] authority type (fields and subfields) from a spreadsheet file (.csv, .xml, .ods)</h3>
272
                    </div>
273
                    <form action="/cgi-bin/koha/admin/import_export_authtype.pl" name="form_i_[% authority_type.authtypecode %]" id="form_i_[% authority_type.authtypecode %]" method="post" enctype="multipart/form-data" class="form_import">
274
                        <div class="modal-body">
275
                                <input type="hidden" name="authtypecode" value="[% authority_type.authtypecode %]" />
276
                                <input type="hidden" name="action" value="import" />
277
                                <p><label for="file_import_[% authority_type.authtypecode %]">Upload file:</label> <input type="file" name="file_import_[% authority_type.authtypecode %]" id="file_import_[% authority_type.authtypecode %]" class="input_import" /></p>
278
                                <div id="importing_[% authority_type.authtypecode %]" style="display:none" class="importing"><img src="[% interface %]/[% theme %]/img/loading-small.gif" alt="" /><span class="importing_msg"></span></div>
279
                        </div>
280
                        <div class="modal-footer">
281
                            <button type="submit" class="btn">Import</button>
282
                            <button class="btn btn-link" data-dismiss="modal" aria-hidden="true">Close</button>
283
                        </div>
284
                    </form>
285
                </div>
286
                </td>
168
            </tr>
287
            </tr>
169
        [% END %]
288
        [% END %]
170
        <tbody>
289
        <tbody>
171
- 

Return to bug 13952