Bug 13952: Import and export authority types
authorAleisha <aleishaamohia@hotmail.com>
Tue, 26 Jan 2016 23:39:26 +0000 (23:39 +0000)
committerFridolin Somers <fridolin.somers@biblibre.com>
Mon, 4 Apr 2022 14:23:45 +0000 (16:23 +0200)
This patch amends C4::ImportExportFramework to work for authority types as well as MARC frameworks.
New file: admin/import_export_authtype.pl
Update: Ensuring we are passing the right column to the right tables.
Update2: Making the error messages the same to be consistent with patch on Bug 15665
Update3: Fixing merge conflicts
Update4: Fixing merge conflicts and removing tabs
Update5: Getting rid of warns, making sure Import and Export of default
authority will work
Update6: Merge conflicts and making sure export of default auth type
works
Update7: Fixing merge conflicts and updating buttons to bootstrap3

To test:
1) Go to Admin -> Authority types
2) Confirm there are two new columns 'Export' and 'Import' in the table
3) Click 'Export' on an existing authority type and choose a file type, click 'Export'
4) Confirm that the authority type is exported as your chosen file type. Save the file
5) Create a new authority type
6) Import into your new authority type using the file you just exported
7) Confirm you are taken to auth_tag_structure.pl
8) Go back to Authority types
9) Export your new authority type. View the exported file and confirm
the authtypecode has been updated to match the code you set for the new
auth type
10) Click 'Import' next to any existing authority type and attempt to import a file that is not XML, CSV or ODS. Confirm that this fails and you are asked to import a file of the correct file type
11) Confirm Export and Import work for the Default authority type
12) Go to Admin -> MARC bibliographic framework
13) Confirm that the 'Export' and 'Import' functions still work here as well

Sponsored-by: Catalyst IT
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Michal Denar <black23@gmail.com>
Signed-off-by: Michal Denar <black23@gmail.com>
Signed-off-by: Mazen Khallaf <mazen.i.khallaf@gamil.com>
Signed-off-by: Michal Denar <black23@gmail.com>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
C4/ImportExportFramework.pm
admin/import_export_authtype.pl [new file with mode: 0755]
admin/import_export_framework.pl
koha-tmpl/intranet-tmpl/prog/en/modules/admin/authtypes.tt

index 2ad5ac9..9dbf1e1 100644 (file)
@@ -193,7 +193,7 @@ Functions for handling import/export.
 
 =head2 ExportFramework
 
-Export all the information of a Framework to an excel "xml" file or OpenDocument SpreadSheet "ods" file.
+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.
 
 return :
 succes
@@ -202,7 +202,7 @@ succes
 
 sub ExportFramework
 {
-    my ($frameworkcode, $xmlStrRef, $mode) = @_;
+    my ($frameworkcode, $xmlStrRef, $mode, $frameworktype) = @_;
 
     my $dbh = C4::Context->dbh;
     if ($dbh) {
@@ -229,8 +229,15 @@ sub ExportFramework
             }
         }
 
-        if (_export_table('marc_tag_structure', $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode)) {
-            if (_export_table('marc_subfield_structure', $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode)) {
+        my $table = 'marc_tag_structure';
+        my $subtable = 'marc_subfield_structure';
+        if ($frameworktype eq "authority") {
+            $table = 'auth_tag_structure';
+            $subtable = 'auth_subfield_structure';
+        }
+
+        if (_export_table($table, $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode, $frameworktype)) {
+            if (_export_table($subtable, $dbh, ($mode eq 'csv')?$xmlStrRef:$dom, ($mode eq 'ods')?$elementSS:$root, $frameworkcode, $mode, $frameworktype)) {
                 $$xmlStrRef = $dom->toString(1) if ($mode eq 'ods' || $mode eq 'excel');
                 return 1;
             }
@@ -245,20 +252,20 @@ sub ExportFramework
 # Export all the data from a mysql table to an spreadsheet.
 sub _export_table
 {
-    my ($table, $dbh, $dom, $root, $frameworkcode, $mode) = @_;
+    my ($table, $dbh, $dom, $root, $frameworkcode, $mode, $frameworktype) = @_;
     if ($mode eq 'csv') {
-        _export_table_csv($table, $dbh, $dom, $root, $frameworkcode);
+        _export_table_csv($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
     } elsif ($mode eq 'ods') {
-        _export_table_ods($table, $dbh, $dom, $root, $frameworkcode);
+        _export_table_ods($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
     } else {
-        _export_table_excel($table, $dbh, $dom, $root, $frameworkcode);
+        _export_table_excel($table, $dbh, $dom, $root, $frameworkcode, $frameworktype);
     }
 }
 
 # Export the mysql table to an csv file
 sub _export_table_csv
 {
-    my ($table, $dbh, $strCSV, $root, $frameworkcode) = @_;
+    my ($table, $dbh, $strCSV, $root, $frameworkcode, $frameworktype) = @_;
 
     eval {
         # First row with the name of the columns
@@ -274,6 +281,9 @@ sub _export_table_csv
         $$strCSV .= chr(10);
         # Populate rows with the data from mysql
         $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
+        }
         $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $data;
@@ -306,7 +316,7 @@ sub _export_table_csv
 # Export the mysql table to an ods file
 sub _export_table_ods
 {
-    my ($table, $dbh, $dom, $root, $frameworkcode) = @_;
+    my ($table, $dbh, $dom, $root, $frameworkcode, $frameworktype) = @_;
 
     eval {
         my $elementTable = $dom->createElement('table:table');
@@ -335,6 +345,9 @@ sub _export_table_ods
         }
         # Populate rows with the data from mysql
         $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
+        }
         $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $data;
@@ -372,7 +385,7 @@ sub _export_table_ods
 # Export the mysql table to an excel-xml (openoffice/libreoffice compatible) file
 sub _export_table_excel
 {
-    my ($table, $dbh, $dom, $root, $frameworkcode) = @_;
+    my ($table, $dbh, $dom, $root, $frameworkcode, $frameworktype) = @_;
 
     eval {
         my $elementWS = $dom->createElement('Worksheet');
@@ -402,6 +415,9 @@ sub _export_table_excel
         }
         # Populate rows with the data from mysql
         $query = 'SELECT * FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT * FROM ' . $table . ' WHERE authtypecode=?';
+        }
         $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $data;
@@ -433,12 +449,6 @@ sub _export_table_excel
     return 1;
 }#_export_table_excel
 
-
-
-
-
-
-
 # Format chars problematics to a correct format for xml.
 sub _parseContent2Xml
 {
@@ -623,7 +633,7 @@ sub _getMeta
 
 =head2 ImportFramework
 
-Import all the information of a Framework from a excel-xml/ods file.
+Import all the information of a MARC or Authority Type Framework from a excel-xml/ods file.
 
 return :
 success
@@ -632,7 +642,7 @@ success
 
 sub ImportFramework
 {
-    my ($filename, $frameworkcode, $deleteFilename) = @_;
+    my ($filename, $frameworkcode, $deleteFilename, $frameworktype) = @_;
 
     my $tempdir;
     my $ok = -1;
@@ -662,13 +672,21 @@ sub ImportFramework
                     # They are text files, so open it to read
                     open($dom, '<', $filename);
                 }
+
+                my $table = 'marc_tag_structure';
+                my $subtable = 'marc_subfield_structure';
+                if ($frameworktype eq "authority") {
+                    $table = 'auth_tag_structure';
+                    $subtable = 'auth_subfield_structure';
+                }
+
                 if ($dom) {
                     # Process both tables
                     my $numDeleted = 0;
                     my $numDeletedAux = 0;
-                    if (($numDeletedAux = _import_table($dbh, 'marc_tag_structure', $frameworkcode, $dom, ['frameworkcode', 'tagfield'], $extension)) >= 0) {
+                    if (($numDeletedAux = _import_table($dbh, $table, $frameworkcode, $dom, ['frameworkcode', 'tagfield'], $extension, $frameworktype)) >= 0) {
                         $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
-                        if (($numDeletedAux = _import_table($dbh, 'marc_subfield_structure', $frameworkcode, $dom, ['frameworkcode', 'tagfield', 'tagsubfield'], $extension)) >= 0) {
+                        if (($numDeletedAux = _import_table($dbh, $subtable, $frameworkcode, $dom, ['frameworkcode', 'tagfield', 'tagsubfield'], $extension, $frameworktype)) >= 0) {
                             $numDeleted += $numDeletedAux if ($numDeletedAux > 0);
                             $ok = ($numDeleted > 0)?$numDeleted:0;
                         }
@@ -789,7 +807,7 @@ sub _check_validity_worksheet
 # Import the data from an excel-xml/ods to mysql tables.
 sub _import_table
 {
-    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $format) = @_;
+    my ($dbh, $table, $frameworkcode, $dom, $PKArray, $format, $frameworktype) = @_;
     my %fields2Delete;
     my $query;
     my @fields;
@@ -798,6 +816,9 @@ sub _import_table
         @fields = @$PKArray;
         shift @fields;
         $query = 'SELECT ' . join(',', @fields) . ' FROM ' . $table . ' WHERE frameworkcode=?';
+        if ($frameworktype eq "authority") {
+            $query = 'SELECT ' . join(',', @fields) . ' FROM ' . $table . ' WHERE authtypecode=?';
+        }
         my $sth = $dbh->prepare($query);
         $sth->execute($frameworkcode);
         my $field;
diff --git a/admin/import_export_authtype.pl b/admin/import_export_authtype.pl
new file mode 100755 (executable)
index 0000000..cbf4a16
--- /dev/null
@@ -0,0 +1,102 @@
+#!/usr/bin/perl
+
+# Copyright 2016 Aleisha Amohia <aleisha@catalyst.net.nz>
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
+
+
+use strict;
+use warnings;
+use CGI qw ( -utf8 );
+use CGI::Cookie;
+use C4::Context;
+use C4::Auth qw/check_cookie_auth/;
+use C4::ImportExportFramework;
+
+my %cookies = CGI::Cookie->fetch();
+my $authenticated = 0;
+my ($auth_status, $sessionID);
+if (exists $cookies{'CGISESSID'}) {
+    ($auth_status, $sessionID) = check_cookie_auth(
+        $cookies{'CGISESSID'}->value,
+        { parameters => 'parameters_remaining_permissions' },
+    );
+}
+if ($auth_status eq 'ok') {
+    $authenticated = 1;
+}
+
+my $input = new CGI;
+
+unless ($authenticated) {
+    print $input->header(-type => 'text/plain', -status => '403 Forbidden');
+    exit 0;
+}
+
+my $authtypecode = $input->param('authtypecode') || 'default';
+my $action = $input->param('action') || 'export';
+
+## Exporting
+if ($action eq 'export' && $input->request_method() eq 'GET') {
+    my $strXml = '';
+    my $format = $input->param('type_export_' . $authtypecode);
+    if ($authtypecode eq 'default') {
+        $format = $input->param('type_export_');
+        ExportFramework('', \$strXml, $format, 'authority');
+    } else {
+        ExportFramework($authtypecode, \$strXml, $format, 'authority');
+    }
+
+    if ($format eq 'csv') {
+        # CSV file
+
+        # Correctly set the encoding to output plain text in UTF-8
+        binmode(STDOUT,':encoding(UTF-8)');
+        print $input->header(-type => 'application/vnd.ms-excel', -attachment => 'export_' . $authtypecode . '.csv');
+        print $strXml;
+    } elsif ($format eq 'excel') {
+        # Excel-xml file
+        print $input->header(-type => 'application/excel', -attachment => 'export_' . $authtypecode . '.xml');
+        print $strXml;
+    } else {
+        # ODS file
+        my $strODS = '';
+        createODS($strXml, 'en', \$strODS);
+        print $input->header(-type => 'application/vnd.oasis.opendocument.spreadsheet', -attachment => 'export_' . $authtypecode . '.ods');
+        print $strODS;
+    }
+## Importing
+} elsif ($input->request_method() eq 'POST') {
+    my $ok = -1;
+    my $fieldname = 'file_import_' . $authtypecode;
+    my $filename = $input->param($fieldname);
+    # upload the input file
+    if ($filename && $filename =~ /\.(csv|ods|xml)$/i) {
+        my $extension = $1;
+        my $uploadFd = $input->upload($fieldname);
+        if ($uploadFd && !$input->cgi_error) {
+            my $tmpfilename = $input->tmpFileName($input->param($fieldname));
+            $filename = $tmpfilename . '.' . $extension; # rename the tmp file with the extension
+            $ok = ImportFramework($filename, $authtypecode, 1, 'authority') if (rename($tmpfilename, $filename));
+        }
+    }
+    if ($ok >= 0) { # If everything went ok go to the authority type marc structure
+        print $input->redirect( -location => '/cgi-bin/koha/admin/auth_tag_structure.pl?authtypecode=' . $authtypecode);
+    } else {
+        # If something failed go to the list of authority types and show message
+        print $input->redirect( -location => '/cgi-bin/koha/admin/authtypes.pl?error_import_export=' . $authtypecode);
+    }
+}
index b2dec83..459ba1f 100755 (executable)
@@ -52,8 +52,12 @@ my $action = $input->param('action') || 'export';
 ## Exporting
 if ($action eq 'export' && $input->request_method() eq 'GET') {
     my $strXml = '';
-    my $format = $input->param('type_export_' . $framework_name);
-    ExportFramework($frameworkcode, \$strXml, $format);
+    my $format = $input->param('type_export_' . $frameworkcode);
+    if ($frameworkcode eq 'default') {
+        ExportFramework('', \$strXml, $format, 'biblio');
+    } else {
+        ExportFramework($frameworkcode, \$strXml, $format, 'biblio');
+    }
 
     if ($format eq 'csv') {
         # CSV file
@@ -81,7 +85,7 @@ if ($action eq 'export' && $input->request_method() eq 'GET') {
         if ($uploadFd && !$input->cgi_error) {
             my $tmpfilename = $input->tmpFileName(scalar $input->param($fieldname));
             $filename = $tmpfilename . '.' . $extension; # rename the tmp file with the extension
-            $ok = ImportFramework($filename, $frameworkcode, 1) if (rename($tmpfilename, $filename));
+            $ok = ImportFramework($filename, $frameworkcode, 1, 'biblio') if (rename($tmpfilename, $filename));
         }
     }
     if ($ok >= 0) { # If everything went ok go to the framework marc structure
index 83338af..f1251a8 100644 (file)
@@ -191,8 +191,62 @@ Authority types &rsaquo; Administration &rsaquo; Koha
                       <li><a href="auth_tag_structure.pl?authtypecode=[% authority_type.authtypecode | uri %]" class="button parameters"><i class="fa fa-eye"></i> MARC structure</a></li>
                       <li><a href="/cgi-bin/koha/admin/authtypes.pl?op=add_form&amp;authtypecode=[% authority_type.authtypecode | uri %]"><i class="fa fa-pencil"></i> Edit</a></li>
                       [% IF authority_type.authtypecode %]<li><a href="/cgi-bin/koha/admin/authtypes.pl?op=delete_confirm&amp;authtypecode=[% authority_type.authtypecode | uri %]"><i class="fa fa-trash"></i> Delete</a></li>[% END %]
+                      <!-- Button to trigger modal -->
+                      <li><a href="#" data-toggle="modal" data-target="#exportModal_[% authority_type.authtypecode %][% loop.count %]" title="Export authority type (fields, subfields) to a spreadsheet file (.csv, .xml, .ods)"><i class="fa fa-upload"></i> Export</a></li>
+                      <!-- Button to trigger modal -->
+                      <li><a href="#" data-toggle="modal" data-target="#importModal_[% authority_type.authtypecode %][% loop.count %]" title="Import authority type (fields, subfields) from a spreadsheet file (.csv, .xml, .ods)"><i class="fa fa-download"></i> Import</a></li>
                     </ul>
                   </div>
+
+                  <!-- Modal for export -->
+                  <div class="modal" id="exportModal_[% authority_type.authtypecode %][% loop.count %]" tabindex="-1" role="dialog" aria-labelledby="exportLabelexportModal_[% authority_type.authtypecode %][% loop.count %]" aria-hidden="true">
+                      <div class="modal-dialog">
+                          <div class="modal-content">
+                              <div class="modal-header">
+                                  <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
+                                  <h3 id="exportLabelexportModal_[% authority_type.authtypecode %][% loop.count %]">Export [% authority_type.authtypetext %] authority type</h3>
+                              </div>
+                              <form action="import_export_authtype.pl" name="form_[% authority_type.authtypecode %]" method="get" target="_blank" class="form_export">
+                                  <div class="modal-body">
+                                      <fieldset>
+                                          <input type="hidden" name="authtypecode" value="[% authority_type.authtypecode %]" />
+                                          <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>
+                                          <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>
+                                          <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>
+                                      </fieldset>
+                                  </div>
+                                  <div class="modal-footer">
+                                      <button type="submit" class="btn btn-default">Export</button>
+                                      <button class="btn btn-link" data-dismiss="modal" aria-hidden="true">Cancel</button>
+                                  </div>
+                              </form>
+                          </div>
+                      </div>
+                  </div>
+
+                  <!-- Modal for import -->
+                  <div class="modal" id="importModal_[% authority_type.authtypecode %][% loop.count %]" tabindex="-1" role="dialog" aria-labelledby="importLabelexportModal_[% authority_type.authtypecode %][% loop.count %]" aria-hidden="true">
+                      <div class="modal-dialog">
+                          <div class="modal-content">
+                              <div class="modal-header">
+                                  <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
+                                  <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>
+                              </div>
+                              <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">
+                                  <div class="modal-body">
+                                      <input type="hidden" name="authtypecode" value="[% authority_type.authtypecode %]" />
+                                      <input type="hidden" name="action" value="import" />
+                                      <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>
+                                      <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>
+                                  </div>
+                                  <div class="modal-footer">
+                                      <button type="submit" class="btn btn-default">Import</button>
+                                      <button class="btn btn-link" data-dismiss="modal" aria-hidden="true">Close</button>
+                                  </div>
+                              </form>
+                          </div>
+                      </div>
+                  </div>
                 </td>
             </tr>
         [% END %]
@@ -214,16 +268,83 @@ Authority types &rsaquo; Administration &rsaquo; Koha
     [% INCLUDE 'datatables.inc' %]
     [% Asset.js("js/admin-menu.js") | $raw %]
     <script>
+        var importing = false;
+
         $(document).ready(function() {
             $("#authtypes").dataTable($.extend(true, {}, dataTablesDefaults, {
                 "aoColumnDefs": [
                     { "aTargets": [ -1 ], "bSortable": false, "bSearchable": false },
+                    { "aTargets": [ 0, 1 ], "sType": "natural" },
                 ],
                 "sPaginationType": "full"
             }));
             $("#authtypecode").on("blur",function(){
                 toUC(this);
             });
+
+            $("body").css("cursor", "auto");
+            $('.import_export_options').hide();
+            $('a.import_export_fw').click(function() {
+                if (!importing) {
+                    $('.import_export_options').hide();
+                    $(this).next().show('slide');
+                }
+                return false;
+            });
+
+            $('.import_export_close').click(function() {
+                if (!importing) {
+                    $('.import_export_options').fadeOut('fast');
+                    $("body").css("cursor", "auto");
+                    return false;
+                }
+            });
+            $('.input_import').val("");
+
+            var matches = new RegExp("\\?error_import_export=(.+)$").exec(window.location.search);
+            if (matches && matches.length > 1) {
+                alert(_("Error importing the authority type %s").format(decodeURIComponent(matches[1])));
+            }
+
+            $('input.input_import').change( function() {
+                var filename = $(this).val();
+                if ( ! /(?:\.csv|\.ods|\.xml)$/.test(filename)) {
+                    $(this).css("background-color","yellow");
+                    alert(_("Please select a CSV (.csv), ODS (.ods) or XML (.xml) spreadsheet file."));
+                    $(this).val("");
+                    $(this).css("background-color","white");
+                }
+            });
+            $('form.form_export').submit(function() {
+                $('.modal').modal("hide");
+                return true;
+            });
+            $('form.form_import').submit(function() {
+                var id = $(this).attr('id');
+                var obj = $('#' + id + ' input:file');
+                if (/(?:\.csv|\.ods|\.xml)$/.test(obj.val())) {
+                    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"))) {
+                        var authtypecode = $('#' + id + ' input:hidden[name=authtypecode]').val();
+                        $('#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>"));
+                        if (navigator.userAgent.toLowerCase().indexOf('msie') != -1) {
+                            var timestamp = new Date().getTime();
+                            $('#importing_' + authtypecode).find("img").attr('src', '[% interface %]/[% theme %]/img/loading-small.gif' + '?' +timestamp);
+                        }
+                        $('#importing_' + authtypecode).css('display', 'block');
+                        if (navigator.userAgent.toLowerCase().indexOf('firefox') == -1) $("body").css("cursor", "progress");
+                        importing = true;
+                        $(".modal-footer,.closebtn").hide();
+                        return true;
+                    } else {
+                        return false;
+                    }
+                }
+                obj.css("background-color","yellow");
+                alert(_("Please select a CSV (.csv), ODS (.ods) or XML (.xml) spreadsheet file."));
+                obj.val("");
+                obj.css("background-color","white");
+                return false;
+            });
         });
     </script>
 [% END %]