Redesign the export/import pages to use Bootstrap components
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
This commit is contained in:
parent
4001460066
commit
fbd5b0a67c
@ -24,6 +24,7 @@ phpMyAdmin - ChangeLog
|
||||
- issue #17143 Use composer/ca-bundle to manage the CA cert file
|
||||
- issue #17143 Require the openssl PHP extension
|
||||
- issue #17171 Remove the printview.css file from themes
|
||||
- issue #17203 Redesign the export and the import pages
|
||||
|
||||
5.1.2 (not yet released)
|
||||
- issue Replaced MySQL documentation redirected links
|
||||
|
||||
@ -282,9 +282,9 @@ AJAX.registerOnload('export.js', function () {
|
||||
* according to the currently selected plugin from the dropdown list
|
||||
*/
|
||||
$('#plugins').on('change', function () {
|
||||
$('#format_specific_opts').find('div.format_specific_options').hide();
|
||||
$('#format_specific_opts').find('div.format_specific_options').addClass('d-none');
|
||||
var selectedPluginName = $('#plugins').find('option:selected').val();
|
||||
$('#' + selectedPluginName + '_options').show();
|
||||
$('#' + selectedPluginName + '_options').removeClass('d-none');
|
||||
});
|
||||
|
||||
/**
|
||||
@ -704,15 +704,15 @@ Export.toggleQuickOrCustom = function () {
|
||||
$('#rows').show();
|
||||
$('#output').show();
|
||||
$('#format_specific_opts').show();
|
||||
$('#output_quick_export').hide();
|
||||
$('#output_quick_export').addClass('d-none');
|
||||
var selectedPluginName = $('#plugins').find('option:selected').val();
|
||||
$('#' + selectedPluginName + '_options').show();
|
||||
$('#' + selectedPluginName + '_options').removeClass('d-none');
|
||||
} else { // quick
|
||||
$('#databases_and_tables').hide();
|
||||
$('#rows').hide();
|
||||
$('#output').hide();
|
||||
$('#format_specific_opts').hide();
|
||||
$('#output_quick_export').show();
|
||||
$('#output_quick_export').removeClass('d-none');
|
||||
}
|
||||
};
|
||||
|
||||
@ -835,14 +835,8 @@ Export.addAlias = function (type, name, field, value) {
|
||||
AJAX.registerOnload('export.js', function () {
|
||||
$('input[type=\'radio\'][name=\'quick_or_custom\']').on('change', Export.toggleQuickOrCustom);
|
||||
|
||||
$('#scroll_to_options_msg').hide();
|
||||
$('#format_specific_opts').find('div.format_specific_options')
|
||||
.hide()
|
||||
.css({
|
||||
'border': 0,
|
||||
'margin': 0,
|
||||
'padding': 0
|
||||
})
|
||||
.addClass('d-none')
|
||||
.find('h3')
|
||||
.remove();
|
||||
Export.toggleQuickOrCustom();
|
||||
@ -860,7 +854,7 @@ AJAX.registerOnload('export.js', function () {
|
||||
* Disables the "Dump some row(s)" sub-options when it is not selected
|
||||
*/
|
||||
$('input[type=\'radio\'][name=\'allrows\']').on('change', function () {
|
||||
if ($('input[type=\'radio\'][name=\'allrows\']').prop('checked')) {
|
||||
if ($('#radio_allrows_0').prop('checked')) {
|
||||
Export.enableDumpSomeRowsSubOptions();
|
||||
} else {
|
||||
Export.disableDumpSomeRowsSubOptions();
|
||||
|
||||
@ -14,10 +14,11 @@ function changePluginOpts () {
|
||||
});
|
||||
var selectedPluginName = $('#plugins').find('option:selected').val();
|
||||
$('#' + selectedPluginName + '_options').fadeIn('slow');
|
||||
|
||||
const importNotification = document.getElementById('import_notification');
|
||||
importNotification.innerText = '';
|
||||
if (selectedPluginName === 'csv') {
|
||||
$('#import_notification').text(Messages.strImportCSV);
|
||||
} else {
|
||||
$('#import_notification').text('');
|
||||
importNotification.innerHTML = '<div class="alert alert-info mb-0 mt-3" role="alert">' + Messages.strImportCSV + '</div>';
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,8 +59,8 @@ AJAX.registerTeardown('import.js', function () {
|
||||
AJAX.registerOnload('import.js', function () {
|
||||
// import_file_form validation.
|
||||
$(document).on('submit', '#import_file_form', function () {
|
||||
var radioLocalImport = $('#radio_local_import_file');
|
||||
var radioImport = $('#radio_import_file');
|
||||
var radioLocalImport = $('#localFileTab');
|
||||
var radioImport = $('#uploadFileTab');
|
||||
var fileMsg = '<div class="alert alert-danger" role="alert"><img src="themes/dot.gif" title="" alt="" class="icon ic_s_error"> ' + Messages.strImportDialogMessage + '</div>';
|
||||
var wrongTblNameMsg = '<div class="alert alert-danger" role="alert"><img src="themes/dot.gif" title="" alt="" class="icon ic_s_error">' + Messages.strTableNameDialogMessage + '</div>';
|
||||
var wrongDBNameMsg = '<div class="alert alert-danger" role="alert"><img src="themes/dot.gif" title="" alt="" class="icon ic_s_error">' + Messages.strDBNameDialogMessage + '</div>';
|
||||
@ -67,13 +68,13 @@ AJAX.registerOnload('import.js', function () {
|
||||
if (radioLocalImport.length !== 0) {
|
||||
// remote upload.
|
||||
|
||||
if (radioImport.is(':checked') && $('#input_import_file').val() === '') {
|
||||
if (radioImport.hasClass('active') && $('#input_import_file').val() === '') {
|
||||
$('#input_import_file').trigger('focus');
|
||||
Functions.ajaxShowMessage(fileMsg, false);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (radioLocalImport.is(':checked')) {
|
||||
if (radioLocalImport.hasClass('active')) {
|
||||
if ($('#select_local_import_file').length === 0) {
|
||||
Functions.ajaxShowMessage('<div class="alert alert-danger" role="alert"><img src="themes/dot.gif" title="" alt="" class="icon ic_s_error"> ' + Messages.strNoImportFile + ' </div>', false);
|
||||
return false;
|
||||
@ -129,30 +130,11 @@ AJAX.registerOnload('import.js', function () {
|
||||
matchFile($(this).val());
|
||||
});
|
||||
|
||||
/*
|
||||
* When the "Browse the server" form is clicked or the "Select from the web server upload directory"
|
||||
* form is clicked, the radio button beside it becomes selected and the other form becomes disabled.
|
||||
*/
|
||||
$('#input_import_file').on('focus change', function () {
|
||||
$('#radio_import_file').prop('checked', true);
|
||||
$('#radio_local_import_file').prop('checked', false);
|
||||
});
|
||||
$('#select_local_import_file').on('focus', function () {
|
||||
$('#radio_local_import_file').prop('checked', true);
|
||||
$('#radio_import_file').prop('checked', false);
|
||||
});
|
||||
|
||||
/**
|
||||
* Set up the interface for Javascript-enabled browsers since the default is for
|
||||
* Javascript-disabled browsers
|
||||
*/
|
||||
$('#scroll_to_options_msg').hide();
|
||||
$('#format_specific_opts').find('div.format_specific_options')
|
||||
.css({
|
||||
'border': 0,
|
||||
'margin': 0,
|
||||
'padding': 0
|
||||
})
|
||||
.find('h3')
|
||||
.remove();
|
||||
// $("form[name=import] *").unwrap();
|
||||
|
||||
@ -309,11 +309,11 @@ function goTo2NFStep2 (pd, primaryKey) {
|
||||
for (var dependson in pd) {
|
||||
if (dependson !== primaryKey) {
|
||||
pdFound = true;
|
||||
extra += '<p class="d-block desc">' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '</p>';
|
||||
extra += '<p class="d-block m-1">' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '</p>';
|
||||
}
|
||||
}
|
||||
if (!pdFound) {
|
||||
extra += '<p class="d-block desc">' + Messages.strNoPdSelected + '</p>';
|
||||
extra += '<p class="d-block m-1">' + Messages.strNoPdSelected + '</p>';
|
||||
extra += '</div>';
|
||||
} else {
|
||||
extra += '</div>';
|
||||
@ -357,12 +357,12 @@ function goTo3NFStep2 (pd, tablesTds) {
|
||||
var dependson = tablesTds[table][i];
|
||||
if (dependson !== '' && dependson !== table) {
|
||||
pdFound = true;
|
||||
extra += '<p class="d-block desc">' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '</p>';
|
||||
extra += '<p class="d-block m-1">' + Functions.escapeHtml(dependson) + ' -> ' + Functions.escapeHtml(pd[dependson].toString()) + '</p>';
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!pdFound) {
|
||||
extra += '<p class="d-block desc">' + Messages.strNoTdSelected + '</p>';
|
||||
extra += '<p class="d-block m-1">' + Messages.strNoTdSelected + '</p>';
|
||||
extra += '</div>';
|
||||
} else {
|
||||
extra += '</div>';
|
||||
|
||||
@ -107,6 +107,7 @@ final class ImportController extends AbstractController
|
||||
$options = Plugins::getOptions('Import', $importList);
|
||||
$skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries');
|
||||
$isAllowInterruptChecked = Plugins::checkboxCheck('Import', 'allow_interrupt');
|
||||
$maxUploadSize = (int) $GLOBALS['config']->get('max_upload_size');
|
||||
|
||||
$this->render('database/import/index', [
|
||||
'page_settings_error_html' => $pageSettingsErrorHtml,
|
||||
@ -116,7 +117,8 @@ final class ImportController extends AbstractController
|
||||
'hidden_inputs' => $hiddenInputs,
|
||||
'db' => $db,
|
||||
'table' => $table,
|
||||
'max_upload_size' => $GLOBALS['config']->get('max_upload_size'),
|
||||
'max_upload_size' => $maxUploadSize,
|
||||
'formatted_maximum_upload_size' => Util::getFormattedMaximumUploadSize($maxUploadSize),
|
||||
'plugins_choice' => $choice,
|
||||
'options' => $options,
|
||||
'skip_queries_default' => $skipQueriesDefault,
|
||||
|
||||
@ -92,6 +92,7 @@ final class ImportController extends AbstractController
|
||||
$options = Plugins::getOptions('Import', $importList);
|
||||
$skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries');
|
||||
$isAllowInterruptChecked = Plugins::checkboxCheck('Import', 'allow_interrupt');
|
||||
$maxUploadSize = (int) $GLOBALS['config']->get('max_upload_size');
|
||||
|
||||
$this->render('server/import/index', [
|
||||
'page_settings_error_html' => $pageSettingsErrorHtml,
|
||||
@ -101,7 +102,8 @@ final class ImportController extends AbstractController
|
||||
'hidden_inputs' => $hiddenInputs,
|
||||
'db' => $db,
|
||||
'table' => $table,
|
||||
'max_upload_size' => $GLOBALS['config']->get('max_upload_size'),
|
||||
'max_upload_size' => $maxUploadSize,
|
||||
'formatted_maximum_upload_size' => Util::getFormattedMaximumUploadSize($maxUploadSize),
|
||||
'plugins_choice' => $choice,
|
||||
'options' => $options,
|
||||
'skip_queries_default' => $skipQueriesDefault,
|
||||
|
||||
@ -105,6 +105,7 @@ final class ImportController extends AbstractController
|
||||
$options = Plugins::getOptions('Import', $importList);
|
||||
$skipQueriesDefault = Plugins::getDefault('Import', 'skip_queries');
|
||||
$isAllowInterruptChecked = Plugins::checkboxCheck('Import', 'allow_interrupt');
|
||||
$maxUploadSize = (int) $GLOBALS['config']->get('max_upload_size');
|
||||
|
||||
$this->render('table/import/index', [
|
||||
'page_settings_error_html' => $pageSettingsErrorHtml,
|
||||
@ -114,7 +115,8 @@ final class ImportController extends AbstractController
|
||||
'hidden_inputs' => $hiddenInputs,
|
||||
'db' => $db,
|
||||
'table' => $table,
|
||||
'max_upload_size' => $GLOBALS['config']->get('max_upload_size'),
|
||||
'max_upload_size' => $maxUploadSize,
|
||||
'formatted_maximum_upload_size' => Util::getFormattedMaximumUploadSize($maxUploadSize),
|
||||
'plugins_choice' => $choice,
|
||||
'options' => $options,
|
||||
'skip_queries_default' => $skipQueriesDefault,
|
||||
|
||||
@ -549,7 +549,7 @@ class Export
|
||||
* Displays a back button with all the $_POST data in the URL
|
||||
* (store in a variable to also display after the textarea)
|
||||
*/
|
||||
$backButton = '<p id="export_back_button">[ <a href="';
|
||||
$backButton = '<p>[ <a href="';
|
||||
if ($exportType === 'server') {
|
||||
$backButton .= Url::getFromRoute('/server/export') . '" data-post="' . Url::getCommon([], '');
|
||||
} elseif ($exportType === 'database') {
|
||||
|
||||
@ -1072,7 +1072,7 @@ class Normalization
|
||||
}
|
||||
|
||||
if (empty($dependencyList)) {
|
||||
$html .= '<p class="d-block desc">'
|
||||
$html .= '<p class="d-block m-1">'
|
||||
. __('No partial dependencies found!') . '</p>';
|
||||
}
|
||||
|
||||
|
||||
@ -284,8 +284,7 @@ class Plugins
|
||||
$properties = [$propertyGroup];
|
||||
} else {
|
||||
// for main groups
|
||||
$ret .= '<div class="export_sub_options" id="' . $plugin_name . '_'
|
||||
. $propertyGroup->getName() . '">';
|
||||
$ret .= '<div id="' . $plugin_name . '_' . $propertyGroup->getName() . '">';
|
||||
|
||||
$text = null;
|
||||
if (method_exists($propertyGroup, 'getText')) {
|
||||
@ -293,10 +292,10 @@ class Plugins
|
||||
}
|
||||
|
||||
if ($text != null) {
|
||||
$ret .= '<h4>' . self::getString($text) . '</h4>';
|
||||
$ret .= '<h5 class="card-title mt-4 mb-2">' . self::getString($text) . '</h5>';
|
||||
}
|
||||
|
||||
$ret .= '<ul>';
|
||||
$ret .= '<ul class="list-group">';
|
||||
}
|
||||
}
|
||||
|
||||
@ -322,7 +321,7 @@ class Plugins
|
||||
$ret .= self::getOneOption($section, $plugin_name, $subgroup_header);
|
||||
}
|
||||
|
||||
$ret .= '<li class="subgroup"><ul';
|
||||
$ret .= '<li class="list-group-item"><ul class="list-group"';
|
||||
if ($subgroup_header !== null) {
|
||||
$ret .= ' id="ul_' . $subgroup_header->getName() . '">';
|
||||
} else {
|
||||
@ -396,8 +395,9 @@ class Plugins
|
||||
$property_class = get_class($propertyItem);
|
||||
switch ($property_class) {
|
||||
case BoolPropertyItem::class:
|
||||
$ret .= '<li>' . "\n";
|
||||
$ret .= '<input type="checkbox" name="' . $plugin_name . '_'
|
||||
$ret .= '<li class="list-group-item">' . "\n";
|
||||
$ret .= '<div class="form-check form-switch">' . "\n";
|
||||
$ret .= '<input class="form-check-input" type="checkbox" role="switch" name="' . $plugin_name . '_'
|
||||
. $propertyItem->getName() . '"'
|
||||
. ' value="something" id="checkbox_' . $plugin_name . '_'
|
||||
. $propertyItem->getName() . '"'
|
||||
@ -419,15 +419,15 @@ class Plugins
|
||||
}
|
||||
|
||||
$ret .= '>';
|
||||
$ret .= '<label for="checkbox_' . $plugin_name . '_'
|
||||
$ret .= '<label class="form-check-label" for="checkbox_' . $plugin_name . '_'
|
||||
. $propertyItem->getName() . '">'
|
||||
. self::getString($propertyItem->getText()) . '</label>';
|
||||
. self::getString($propertyItem->getText()) . '</label></div>';
|
||||
break;
|
||||
case DocPropertyItem::class:
|
||||
echo DocPropertyItem::class;
|
||||
break;
|
||||
case HiddenPropertyItem::class:
|
||||
$ret .= '<li><input type="hidden" name="' . $plugin_name . '_'
|
||||
$ret .= '<li class="list-group-item"><input type="hidden" name="' . $plugin_name . '_'
|
||||
. $propertyItem->getName() . '"'
|
||||
. ' value="' . self::getDefault(
|
||||
$section,
|
||||
@ -436,8 +436,8 @@ class Plugins
|
||||
. '"></li>';
|
||||
break;
|
||||
case MessageOnlyPropertyItem::class:
|
||||
$ret .= '<li>' . "\n";
|
||||
$ret .= '<p>' . self::getString($propertyItem->getText()) . '</p>';
|
||||
$ret .= '<li class="list-group-item">' . "\n";
|
||||
$ret .= self::getString($propertyItem->getText());
|
||||
break;
|
||||
case RadioPropertyItem::class:
|
||||
/**
|
||||
@ -450,31 +450,35 @@ class Plugins
|
||||
$plugin_name . '_' . $pitem->getName()
|
||||
);
|
||||
|
||||
$ret .= '<li class="list-group-item">';
|
||||
|
||||
foreach ($pitem->getValues() as $key => $val) {
|
||||
$ret .= '<li><input type="radio" name="' . $plugin_name
|
||||
. '_' . $pitem->getName() . '" value="' . $key
|
||||
$ret .= '<div class="form-check"><input type="radio" name="' . $plugin_name
|
||||
. '_' . $pitem->getName() . '" class="form-check-input" value="' . $key
|
||||
. '" id="radio_' . $plugin_name . '_'
|
||||
. $pitem->getName() . '_' . $key . '"';
|
||||
if ($key == $default) {
|
||||
$ret .= ' checked="checked"';
|
||||
$ret .= ' checked';
|
||||
}
|
||||
|
||||
$ret .= '><label for="radio_' . $plugin_name . '_'
|
||||
$ret .= '><label class="form-check-label" for="radio_' . $plugin_name . '_'
|
||||
. $pitem->getName() . '_' . $key . '">'
|
||||
. self::getString($val) . '</label></li>';
|
||||
. self::getString($val) . '</label></div>';
|
||||
}
|
||||
|
||||
$ret .= '</li>';
|
||||
|
||||
break;
|
||||
case SelectPropertyItem::class:
|
||||
/**
|
||||
* @var SelectPropertyItem $pitem
|
||||
*/
|
||||
$pitem = $propertyItem;
|
||||
$ret .= '<li>' . "\n";
|
||||
$ret .= '<li class="list-group-item">' . "\n";
|
||||
$ret .= '<label for="select_' . $plugin_name . '_'
|
||||
. $pitem->getName() . '" class="desc">'
|
||||
. $pitem->getName() . '" class="form-label">'
|
||||
. self::getString($pitem->getText()) . '</label>';
|
||||
$ret .= '<select name="' . $plugin_name . '_'
|
||||
$ret .= '<select class="form-select" name="' . $plugin_name . '_'
|
||||
. $pitem->getName() . '"'
|
||||
. ' id="select_' . $plugin_name . '_'
|
||||
. $pitem->getName() . '">';
|
||||
@ -485,7 +489,7 @@ class Plugins
|
||||
foreach ($pitem->getValues() as $key => $val) {
|
||||
$ret .= '<option value="' . $key . '"';
|
||||
if ($key == $default) {
|
||||
$ret .= ' selected="selected"';
|
||||
$ret .= ' selected';
|
||||
}
|
||||
|
||||
$ret .= '>' . self::getString($val) . '</option>';
|
||||
@ -498,11 +502,11 @@ class Plugins
|
||||
* @var TextPropertyItem $pitem
|
||||
*/
|
||||
$pitem = $propertyItem;
|
||||
$ret .= '<li>' . "\n";
|
||||
$ret .= '<li class="list-group-item">' . "\n";
|
||||
$ret .= '<label for="text_' . $plugin_name . '_'
|
||||
. $pitem->getName() . '" class="desc">'
|
||||
. $pitem->getName() . '" class="form-label">'
|
||||
. self::getString($pitem->getText()) . '</label>';
|
||||
$ret .= '<input type="text" name="' . $plugin_name . '_'
|
||||
$ret .= '<input class="form-control" type="text" name="' . $plugin_name . '_'
|
||||
. $pitem->getName() . '"'
|
||||
. ' value="' . self::getDefault(
|
||||
$section,
|
||||
@ -519,11 +523,11 @@ class Plugins
|
||||
. '>';
|
||||
break;
|
||||
case NumberPropertyItem::class:
|
||||
$ret .= '<li>' . "\n";
|
||||
$ret .= '<li class="list-group-item">' . "\n";
|
||||
$ret .= '<label for="number_' . $plugin_name . '_'
|
||||
. $propertyItem->getName() . '" class="desc">'
|
||||
. $propertyItem->getName() . '" class="form-label">'
|
||||
. self::getString($propertyItem->getText()) . '</label>';
|
||||
$ret .= '<input type="number" name="' . $plugin_name . '_'
|
||||
$ret .= '<input class="form-control" type="number" name="' . $plugin_name . '_'
|
||||
. $propertyItem->getName() . '"'
|
||||
. ' value="' . self::getDefault(
|
||||
$section,
|
||||
@ -586,7 +590,7 @@ class Plugins
|
||||
}
|
||||
|
||||
if ($no_options) {
|
||||
$ret .= '<p>' . __('This format has no options') . '</p>';
|
||||
$ret .= '<p class="card-text">' . __('This format has no options') . '</p>';
|
||||
}
|
||||
|
||||
$ret .= '</div>';
|
||||
|
||||
@ -35,10 +35,6 @@ class UtilExtension extends AbstractExtension
|
||||
'format_byte_down',
|
||||
[Util::class, 'formatByteDown']
|
||||
),
|
||||
new TwigFunction(
|
||||
'get_formatted_maximum_upload_size',
|
||||
[Util::class, 'getFormattedMaximumUploadSize']
|
||||
),
|
||||
new TwigFunction(
|
||||
'format_number',
|
||||
[Util::class, 'formatNumber']
|
||||
|
||||
@ -10,10 +10,9 @@
|
||||
|
||||
{% block selection_options %}
|
||||
{% if export_type != 'raw' %}
|
||||
<div class="exportoptions" id="databases_and_tables">
|
||||
<h3>{% trans 'Tables:' %}</h3>
|
||||
|
||||
<div class="export_table_list_container">
|
||||
<div class="card mb-3" id="databases_and_tables">
|
||||
<div class="card-header">{% trans 'Tables:' %}</div>
|
||||
<div class="card-body" style="overflow-y: scroll; max-height: 20em;">
|
||||
<input type="hidden" name="structure_or_data_forced" value="{{ structure_or_data_forced }}">
|
||||
|
||||
<table class="table table-sm table-striped table-hover export_table_select">
|
||||
@ -21,17 +20,17 @@
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>{% trans 'Tables' %}</th>
|
||||
<th class="export_structure">{% trans 'Structure' %}</th>
|
||||
<th class="export_data">{% trans 'Data' %}</th>
|
||||
<th class="export_structure text-center">{% trans 'Structure' %}</th>
|
||||
<th class="export_data text-center">{% trans 'Data' %}</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td class="export_table_name all">{% trans 'Select all' %}</td>
|
||||
<td class="export_structure all">
|
||||
<input type="checkbox" id="table_structure_all">
|
||||
<td class="align-middle">{% trans 'Select all' %}</td>
|
||||
<td class="export_structure text-center">
|
||||
<input type="checkbox" id="table_structure_all" aria-label="{% trans 'Export the structure of all tables.' %}">
|
||||
</td>
|
||||
<td class="export_data all">
|
||||
<input type="checkbox" id="table_data_all">
|
||||
<td class="export_data text-center">
|
||||
<input type="checkbox" id="table_data_all" aria-label="{% trans 'Export the data of all tables.' %}">
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@ -42,11 +41,11 @@
|
||||
<td>
|
||||
<input class="checkall" type="checkbox" name="table_select[]" value="{{ each_table.name }}"{{ each_table.is_checked_select ? ' checked' }}>
|
||||
</td>
|
||||
<td class="export_table_name text-nowrap">{{ each_table.name }}</td>
|
||||
<td class="export_structure">
|
||||
<td class="align-middle text-nowrap">{{ each_table.name }}</td>
|
||||
<td class="export_structure text-center">
|
||||
<input type="checkbox" name="table_structure[]" value="{{ each_table.name }}"{{ each_table.is_checked_structure ? ' checked' }}>
|
||||
</td>
|
||||
<td class="export_data">
|
||||
<td class="export_data text-center">
|
||||
<input type="checkbox" name="table_data[]" value="{{ each_table.name }}"{{ each_table.is_checked_data ? ' checked' }}>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@ -1,461 +1,502 @@
|
||||
{{ page_settings_error_html|raw }}
|
||||
{{ page_settings_html|raw }}
|
||||
|
||||
{% block message %}{% endblock %}
|
||||
|
||||
<div class="exportoptions row" id="header">
|
||||
<h2>
|
||||
<div class="container">
|
||||
<h2 class="my-3">
|
||||
{{ get_image('b_export', 'Export'|trans) }}
|
||||
{% block title %}{% endblock %}
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
{% if templates.is_enabled %}
|
||||
<div class="exportoptions" id="export_templates">
|
||||
<h3>{% trans 'Export templates:' %}</h3>
|
||||
{{ page_settings_error_html|raw }}
|
||||
{{ page_settings_html|raw }}
|
||||
|
||||
<div class="float-start">
|
||||
<form method="post" action="{{ url('/export/template/create') }}" id="newTemplateForm" class="ajax">
|
||||
<h4>{% trans 'New template:' %}</h4>
|
||||
<input type="text" name="templateName" id="templateName" maxlength="64" placeholder="{% trans 'Template name' %}" required>
|
||||
<input class="btn btn-secondary" type="submit" name="createTemplate" id="createTemplate" value="{% trans 'Create' %}">
|
||||
</form>
|
||||
</div>
|
||||
{% block message %}{% endblock %}
|
||||
|
||||
<div class="float-start" style="margin-left: 50px;">
|
||||
<form method="post" id="existingTemplatesForm" class="ajax">
|
||||
<h4>{% trans 'Existing templates:' %}</h4>
|
||||
<label for="template">{% trans 'Template:' %}</label>
|
||||
<select name="template" id="template" required>
|
||||
<option value="">-- {% trans 'Select a template' %} --</option>
|
||||
{% for template in templates.templates %}
|
||||
<option value="{{ template.getId() }}"{{ template.getId() == templates.selected ? ' selected' }}>
|
||||
{{ template.getName() }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<input class="btn btn-secondary" type="submit" formaction="{{ url('/export/template/update') }}" name="updateTemplate" id="updateTemplate" value="{% trans 'Update' %}">
|
||||
<input class="btn btn-secondary" type="submit" formaction="{{ url('/export/template/delete') }}" name="deleteTemplate" id="deleteTemplate" value="{% trans 'Delete' %}">
|
||||
</form>
|
||||
</div>
|
||||
{% if templates.is_enabled %}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">{% trans 'Export templates:' %}</div>
|
||||
<div class="card-body row gy-3">
|
||||
<form method="post" action="{{ url('/export/template/create') }}" class="col-12 col-md ajax">
|
||||
<fieldset>
|
||||
<legend>{% trans 'New template:' %}</legend>
|
||||
<div class="row g-3 align-items-center">
|
||||
<div class="col-auto">
|
||||
<label for="templateName" class="col-form-label">{% trans 'Template name' %}</label>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<input class="form-control" type="text" name="templateName" id="templateName" maxlength="64" placeholder="{% trans 'Template name' %}" required>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<input class="btn btn-secondary" type="submit" name="createTemplate" id="createTemplate" value="{% trans 'Create' %}">
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<div class="clearfloat"></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if sql_query is not empty %}
|
||||
<div class="exportoptions">
|
||||
{# l10n: Title of the option on the Export page #}
|
||||
<h3>{% trans 'SQL query:' %}</h3>
|
||||
<div class="float-start">
|
||||
<div id="sqlqueryform">
|
||||
{# l10n: Button to show the SQL query on the export page #}
|
||||
<input class="btn btn-secondary" type="submit" id="showsqlquery" value="{% trans 'Show SQL query' %}">
|
||||
<form method="post" id="existingTemplatesForm" class="col-12 col-md ajax">
|
||||
<fieldset>
|
||||
<legend>{% trans 'Existing templates:' %}</legend>
|
||||
<div class="row g-3 align-items-center">
|
||||
<div class="col-auto">
|
||||
<label for="template" class="col-form-label">{% trans 'Template:' %}</label>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<select class="form-select" name="template" id="template" required>
|
||||
<option value="">-- {% trans 'Select a template' %} --</option>
|
||||
{% for template in templates.templates %}
|
||||
<option value="{{ template.getId() }}"{{ template.getId() == templates.selected ? ' selected' }}>
|
||||
{{ template.getName() }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<input class="btn btn-secondary" type="submit" formaction="{{ url('/export/template/update') }}" name="updateTemplate" id="updateTemplate" value="{% trans 'Update' %}">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<input class="btn btn-secondary" type="submit" formaction="{{ url('/export/template/delete') }}" name="deleteTemplate" id="deleteTemplate" value="{% trans 'Delete' %}">
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
<div class="d-none"></div>
|
||||
</div>
|
||||
<div class="clearfloat"></div>
|
||||
</div>
|
||||
<div class="modal fade" id="showSqlQueryModal" tabindex="-1" aria-labelledby="showSqlQueryModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="showSqlQueryModalLabel">{% trans 'Loading' %}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% trans 'Close' %}"></button>
|
||||
{% endif %}
|
||||
|
||||
{% if sql_query is not empty %}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
{# l10n: Title of the option on the Export page #}
|
||||
{% trans 'SQL query:' %}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="sqlqueryform">
|
||||
{# l10n: Button to show the SQL query on the export page #}
|
||||
<input class="btn btn-secondary" type="submit" id="showsqlquery" value="{% trans 'Show SQL query' %}">
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div id="export_sql_modal_content">
|
||||
<code class="sql">
|
||||
<pre id="sql_preview_query">{{ sql_query }}</pre>
|
||||
</code>
|
||||
<div class="d-none"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="showSqlQueryModal" tabindex="-1" aria-labelledby="showSqlQueryModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="showSqlQueryModalLabel">{% trans 'Loading' %}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% trans 'Close' %}"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div id="export_sql_modal_content">
|
||||
<code class="sql">
|
||||
<pre id="sql_preview_query">{{ sql_query }}</pre>
|
||||
</code>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{% trans 'Close' %}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{% trans 'Close' %}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<form method="post" action="{{ url('/export') }}" name="dump" class="disableAjax">
|
||||
{{ get_hidden_inputs(hidden_inputs) }}
|
||||
|
||||
{% if export_method != 'custom-no-form' %}
|
||||
<div class="exportoptions" id="quick_or_custom">
|
||||
<h3>{% trans 'Export method:' %}</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<input type="radio" name="quick_or_custom" value="quick" id="radio_quick_export"
|
||||
{{- export_method == 'quick' ? ' checked' }}>
|
||||
<label for="radio_quick_export">
|
||||
{% trans 'Quick - display only the minimal options' %}
|
||||
</label>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<input type="radio" name="quick_or_custom" value="custom" id="radio_custom_export"
|
||||
{{- export_method == 'custom' ? ' checked' }}>
|
||||
<label for="radio_custom_export">
|
||||
{% trans 'Custom - display all possible options' %}
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="exportoptions" id="format">
|
||||
<h3>{% trans 'Format:' %}</h3>
|
||||
<select id="plugins" name="what">
|
||||
{% for option in plugins_choice %}
|
||||
<option value="{{ option.name }}"{{ option.is_selected ? ' selected' }}>{{ option.text }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<form method="post" action="{{ url('/export') }}" name="dump" class="disableAjax">
|
||||
{{ get_hidden_inputs(hidden_inputs) }}
|
||||
|
||||
{% for option in plugins_choice %}
|
||||
<input type="hidden" id="force_file_{{ option.name }}" value="{{ option.force_file ? 'true' : 'false' }}">
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% if export_method != 'custom-no-form' %}
|
||||
<div class="card mb-3" id="quick_or_custom">
|
||||
<div class="card-header">{% trans 'Export method:' %}</div>
|
||||
<div class="card-body">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="quick_or_custom" value="quick" id="radio_quick_export"{{ export_method == 'quick' ? ' checked' }}>
|
||||
<label class="form-check-label" for="radio_quick_export">{% trans 'Quick - display only the minimal options' %}</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="quick_or_custom" value="custom" id="radio_custom_export"{{ export_method == 'custom' ? ' checked' }}>
|
||||
<label class="form-check-label" for="radio_custom_export">{% trans 'Custom - display all possible options' %}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% block selection_options %}{% endblock %}
|
||||
<div class="card mb-3" id="format">
|
||||
<div class="card-header">{% trans 'Format:' %}</div>
|
||||
<div class="card-body">
|
||||
<select class="form-select" id="plugins" name="what" aria-label="{% trans 'File format to export' %}">
|
||||
{% for option in plugins_choice %}
|
||||
<option value="{{ option.name }}"{{ option.is_selected ? ' selected' }}>{{ option.text }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
||||
{% if rows is not empty %}
|
||||
<div class="exportoptions" id="rows">
|
||||
<h3>{% trans 'Rows:' %}</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<input type="radio" name="allrows" value="0" id="radio_allrows_0"
|
||||
{{- rows.allrows is not null and rows.allrows == 0 ? ' checked' }}>
|
||||
<label for="radio_allrows_0">{% trans 'Dump some row(s)' %}</label>
|
||||
<ul>
|
||||
<li>
|
||||
<label for="limit_to">{% trans 'Number of rows:' %}</label>
|
||||
<input type="text" id="limit_to" name="limit_to" size="5" value="
|
||||
{%- if rows.limit_to is not null -%}
|
||||
{{- rows.limit_to -}}
|
||||
{%- elseif rows.unlim_num_rows is not empty and rows.unlim_num_rows != 0 -%}
|
||||
{{- rows.unlim_num_rows -}}
|
||||
{%- else %}
|
||||
{{- rows.number_of_rows -}}
|
||||
{%- endif -%}" onfocus="this.select()">
|
||||
{% for option in plugins_choice %}
|
||||
<input type="hidden" id="force_file_{{ option.name }}" value="{{ option.force_file ? 'true' : 'false' }}">
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% block selection_options %}{% endblock %}
|
||||
|
||||
{% if rows is not empty %}
|
||||
<div class="card mb-3" id="rows">
|
||||
<div class="card-header">{% trans 'Rows:' %}</div>
|
||||
<div class="card-body">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" name="allrows" value="1" id="radio_allrows_1"{{ rows.allrows is null or rows.allrows == 1 ? ' checked' }}>
|
||||
<label class="form-check-label" for="radio_allrows_1">{% trans 'Dump all rows' %}</label>
|
||||
</div>
|
||||
<div class="form-check mb-2">
|
||||
<input class="form-check-input" type="radio" name="allrows" value="0" id="radio_allrows_0"{{ rows.allrows is not null and rows.allrows == 0 ? ' checked' }}>
|
||||
<label class="form-check-label" for="radio_allrows_0">{% trans 'Dump some row(s)' %}</label>
|
||||
</div>
|
||||
<ul class="list-group">
|
||||
<li class="list-group-item">
|
||||
<label class="form-label" for="limit_to">{% trans 'Number of rows:' %}</label>
|
||||
<input class="form-control" type="text" id="limit_to" name="limit_to" size="5" value="
|
||||
{%- if rows.limit_to is not null -%}
|
||||
{{- rows.limit_to -}}
|
||||
{%- elseif rows.unlim_num_rows is not empty and rows.unlim_num_rows != 0 -%}
|
||||
{{- rows.unlim_num_rows -}}
|
||||
{%- else %}
|
||||
{{- rows.number_of_rows -}}
|
||||
{%- endif -%}" onfocus="this.select()">
|
||||
</li>
|
||||
<li>
|
||||
<label for="limit_from">{% trans 'Row to begin at:' %}</label>
|
||||
<input type="text" id="limit_from" name="limit_from" size="5" value="
|
||||
{{- rows.limit_from is not null ? rows.limit_from : 0 }}" onfocus="this.select()">
|
||||
<li class="list-group-item">
|
||||
<label class="form-label" for="limit_from">{% trans 'Row to begin at:' %}</label>
|
||||
<input class="form-control" type="text" id="limit_from" name="limit_from" size="5" value="{{ rows.limit_from is not null ? rows.limit_from : 0 }}" onfocus="this.select()">
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<input type="radio" name="allrows" value="1" id="radio_allrows_1"
|
||||
{{- rows.allrows is null or rows.allrows == 1 ? ' checked' }}>
|
||||
<label for="radio_allrows_1">{% trans 'Dump all rows' %}</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if has_save_dir %}
|
||||
<div class="exportoptions" id="output_quick_export">
|
||||
<h3>{% trans 'Output:' %}</h3>
|
||||
<ul>
|
||||
<li>
|
||||
<input type="checkbox" name="quick_export_onserver" value="saveit" id="checkbox_quick_dump_onserver"{{ export_is_checked ? ' checked' }}>
|
||||
<label for="checkbox_quick_dump_onserver">
|
||||
{{ 'Save on server in the directory <strong>%s</strong>'|trans|format(save_dir|e)|raw }}
|
||||
</label>
|
||||
</li>
|
||||
<li>
|
||||
<input type="checkbox" name="quick_export_onserver_overwrite" value="saveitover" id="checkbox_quick_dump_onserver_overwrite"
|
||||
{{- export_overwrite_is_checked ? ' checked' }}>
|
||||
<label for="checkbox_quick_dump_onserver_overwrite">
|
||||
{% trans 'Overwrite existing file(s)' %}
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="modal fade" id="renameExportModal" tabindex="-1" aria-labelledby="renameExportModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="renameExportModalLabel">{% trans 'Rename exported databases/tables/columns' %}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% trans 'Close' %}"></button>
|
||||
</div>
|
||||
<div class="modal-body" style="overflow: auto;">
|
||||
<table class="table align-middle mb-3" id="alias_data">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="4">
|
||||
{% trans 'Defined aliases' %}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<tbody>
|
||||
{% for db, db_data in aliases %}
|
||||
{% if db_data.alias is defined and db_data.alias is not null %}
|
||||
{% if has_save_dir %}
|
||||
<div class="card mb-3 d-none" id="output_quick_export">
|
||||
<div class="card-header">{% trans 'Output:' %}</div>
|
||||
<div class="card-body">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="quick_export_onserver" value="saveit" id="checkbox_quick_dump_onserver"{{ export_is_checked ? ' checked' }}>
|
||||
<label class="form-check-label" for="checkbox_quick_dump_onserver">
|
||||
{{ 'Save on server in the directory <strong>%s</strong>'|trans|format(save_dir|e)|raw }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="quick_export_onserver_overwrite" value="saveitover" id="checkbox_quick_dump_onserver_overwrite"
|
||||
{{- export_overwrite_is_checked ? ' checked' }}>
|
||||
<label class="form-check-label" for="checkbox_quick_dump_onserver_overwrite">
|
||||
{% trans 'Overwrite existing file(s)' %}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="modal fade" id="renameExportModal" tabindex="-1" aria-labelledby="renameExportModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-xl">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="renameExportModalLabel">{% trans 'Rename exported databases/tables/columns' %}</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{% trans 'Close' %}"></button>
|
||||
</div>
|
||||
<div class="modal-body overflow-auto">
|
||||
<table class="table align-middle mb-3" id="alias_data">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans %}Database{% context %}Alias{% endtrans %}</th>
|
||||
<td>{{ db }}</td>
|
||||
<th colspan="4">
|
||||
{% trans 'Defined aliases' %}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{% for db, db_data in aliases %}
|
||||
{% if db_data.alias is defined and db_data.alias is not null %}
|
||||
<tr>
|
||||
<th>{% trans %}Database{% context %}Alias{% endtrans %}</th>
|
||||
<td>{{ db }}</td>
|
||||
<td>
|
||||
<input name="aliases[{{ db }}][alias]" value="{{ db_data.alias }}" type="text">
|
||||
</td>
|
||||
<td>
|
||||
<button class="alias_remove btn btn-secondary">{% trans 'Remove' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
|
||||
{% for table, table_data in db_data.tables ?? [] %}
|
||||
{% if table_data.alias is defined and table_data.alias is not null %}
|
||||
<tr>
|
||||
<th>{% trans %}Table{% context %}Alias{% endtrans %}</th>
|
||||
<td>{{ db }}.{{ table }}</td>
|
||||
<td>
|
||||
<input name="aliases[{{ db }}][tables][{{ table }}][alias]" value="{{ table_data.alias }}" type="text">
|
||||
</td>
|
||||
<td>
|
||||
<button class="alias_remove btn btn-secondary">{% trans 'Remove' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
|
||||
{% for column, column_name in table_data.columns ?? [] %}
|
||||
<tr>
|
||||
<th>{% trans %}Column{% context %}Alias{% endtrans %}</th>
|
||||
<td>{{ db }}.{{ table }}.{{ column }}</td>
|
||||
<td>
|
||||
<input name="aliases[{{ db }}][tables][{{ table }}][colums][{{ column }}]" value="{{ column_name }}" type="text">
|
||||
</td>
|
||||
<td>
|
||||
<button class="alias_remove btn btn-secondary">{% trans 'Remove' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
{# Empty row for javascript manipulations. #}
|
||||
<tfoot class="hide">
|
||||
<tr>
|
||||
<th></th>
|
||||
<td></td>
|
||||
<td>
|
||||
<input name="aliases[{{ db }}][alias]" value="{{ db_data.alias }}" type="text">
|
||||
<input name="aliases_new" value="" type="text">
|
||||
</td>
|
||||
<td>
|
||||
<button class="alias_remove btn btn-secondary">{% trans 'Remove' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
{% for table, table_data in db_data.tables ?? [] %}
|
||||
{% if table_data.alias is defined and table_data.alias is not null %}
|
||||
<tr>
|
||||
<th>{% trans %}Table{% context %}Alias{% endtrans %}</th>
|
||||
<td>{{ db }}.{{ table }}</td>
|
||||
<td>
|
||||
<input name="aliases[{{ db }}][tables][{{ table }}][alias]" value="{{ table_data.alias }}" type="text">
|
||||
</td>
|
||||
<td>
|
||||
<button class="alias_remove btn btn-secondary">{% trans 'Remove' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
|
||||
{% for column, column_name in table_data.columns ?? [] %}
|
||||
<tr>
|
||||
<th>{% trans %}Column{% context %}Alias{% endtrans %}</th>
|
||||
<td>{{ db }}.{{ table }}.{{ column }}</td>
|
||||
<td>
|
||||
<input name="aliases[{{ db }}][tables][{{ table }}][colums][{{ column }}]" value="{{ column_name }}" type="text">
|
||||
</td>
|
||||
<td>
|
||||
<button class="alias_remove btn btn-secondary">{% trans 'Remove' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
{# Empty row for javascript manipulations. #}
|
||||
<tfoot class="hide">
|
||||
<tr>
|
||||
<th></th>
|
||||
<td></td>
|
||||
<td>
|
||||
<input name="aliases_new" value="" type="text">
|
||||
</td>
|
||||
<td>
|
||||
<button class="alias_remove btn btn-secondary">{% trans 'Remove' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
<table class="table align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="4">{% trans 'Define new aliases' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<td>
|
||||
<label>{% trans 'Select database:' %}</label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="db_alias_select"><option value=""></option></select>
|
||||
</td>
|
||||
<td>
|
||||
<input id="db_alias_name" placeholder="{% trans 'New database name' %}" disabled="1">
|
||||
</td>
|
||||
<td>
|
||||
<button id="db_alias_button" class="btn btn-secondary" disabled="1">{% trans 'Add' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label>{% trans 'Select table:' %}</label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="table_alias_select"><option value=""></option></select>
|
||||
</td>
|
||||
<td>
|
||||
<input id="table_alias_name" placeholder="{% trans 'New table name' %}" disabled="1">
|
||||
</td>
|
||||
<td>
|
||||
<button id="table_alias_button" class="btn btn-secondary" disabled="1">{% trans 'Add' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label>{% trans 'Select column:' %}</label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="column_alias_select"><option value=""></option></select>
|
||||
</td>
|
||||
<td>
|
||||
<input id="column_alias_name" placeholder="{% trans 'New column name' %}" disabled="1">
|
||||
</td>
|
||||
<td>
|
||||
<button id="column_alias_button" class="btn btn-secondary" disabled="1">{% trans 'Add' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" id="saveAndCloseBtn" data-bs-dismiss="modal">
|
||||
{% trans 'Save & close' %}
|
||||
</button>
|
||||
<table class="table align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="4">{% trans 'Define new aliases' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tr>
|
||||
<td>
|
||||
<label>{% trans 'Select database:' %}</label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="db_alias_select">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input id="db_alias_name" placeholder="{% trans 'New database name' %}" disabled="1">
|
||||
</td>
|
||||
<td>
|
||||
<button id="db_alias_button" class="btn btn-secondary" disabled="1">{% trans 'Add' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label>{% trans 'Select table:' %}</label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="table_alias_select">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input id="table_alias_name" placeholder="{% trans 'New table name' %}" disabled="1">
|
||||
</td>
|
||||
<td>
|
||||
<button id="table_alias_button" class="btn btn-secondary" disabled="1">{% trans 'Add' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label>{% trans 'Select column:' %}</label>
|
||||
</td>
|
||||
<td>
|
||||
<select id="column_alias_select">
|
||||
<option value=""></option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
<input id="column_alias_name" placeholder="{% trans 'New column name' %}" disabled="1">
|
||||
</td>
|
||||
<td>
|
||||
<button id="column_alias_button" class="btn btn-secondary" disabled="1">{% trans 'Add' %}</button>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" id="saveAndCloseBtn" data-bs-dismiss="modal">
|
||||
{% trans 'Save & close' %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="exportoptions" id="output">
|
||||
<h3>{% trans 'Output:' %}</h3>
|
||||
<ul id="ul_output">
|
||||
<li>
|
||||
<input type="checkbox" id="btn_alias_config"{{ has_aliases ? ' checked' }}>
|
||||
<label for="btn_alias_config">
|
||||
{% trans 'Rename exported databases/tables/columns' %}
|
||||
</label>
|
||||
</li>
|
||||
|
||||
{% if export_type != 'server' %}
|
||||
<li>
|
||||
<input type="checkbox" name="lock_tables" value="something" id="checkbox_lock_tables"
|
||||
{{- (not repopulate and is_checked_lock_tables) or lock_tables ? ' checked' }}>
|
||||
<label for="checkbox_lock_tables">
|
||||
{{ 'Use %s statement'|trans|format('<code>LOCK TABLES</code>')|raw }}
|
||||
</label>
|
||||
<div class="card mb-3" id="output">
|
||||
<div class="card-header">{% trans 'Output:' %}</div>
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="btn_alias_config"{{ has_aliases ? ' checked' }}>
|
||||
<label class="form-check-label" for="btn_alias_config">{% trans 'Rename exported databases/tables/columns' %}</label>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li>
|
||||
<input type="radio" name="output_format" value="sendit" id="radio_dump_asfile"
|
||||
{{- not repopulate and is_checked_asfile ? ' checked' }}>
|
||||
<label for="radio_dump_asfile">
|
||||
{% trans 'Save output to a file' %}
|
||||
</label>
|
||||
<ul id="ul_save_asfile">
|
||||
{% if has_save_dir %}
|
||||
<li>
|
||||
<input type="checkbox" name="onserver" value="saveit" id="checkbox_dump_onserver"{{ is_checked_export ? ' checked' }}>
|
||||
<label for="checkbox_dump_onserver">
|
||||
{{ 'Save on server in the directory <strong>%s</strong>'|trans|format(save_dir|e)|raw }}
|
||||
{% if export_type != 'server' %}
|
||||
<li class="list-group-item">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="lock_tables" value="something" id="checkbox_lock_tables"
|
||||
{{- (not repopulate and is_checked_lock_tables) or lock_tables ? ' checked' }}>
|
||||
<label class="form-check-label" for="checkbox_lock_tables">
|
||||
{{ 'Use %s statement'|trans|format('<code>LOCK TABLES</code>')|raw }}
|
||||
</label>
|
||||
</li>
|
||||
<li>
|
||||
<input type="checkbox" name="onserver_overwrite" value="saveitover" id="checkbox_dump_onserver_overwrite"
|
||||
{{- is_checked_export_overwrite ? ' checked' }}>
|
||||
<label for="checkbox_dump_onserver_overwrite">
|
||||
{% trans 'Overwrite existing file(s)' %}
|
||||
</label>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li>
|
||||
<label for="filename_template" class="desc">
|
||||
{% trans 'File name template:' %}
|
||||
{{ show_hint('This value is interpreted using the \'strftime\' function, so you can use time formatting strings. Additionally the following transformations will happen: %s Other text will be kept as is. See the FAQ 6.27 for details.'|trans|format(filename_hint)) }}
|
||||
</label>
|
||||
<input type="text" name="filename_template" id="filename_template" value="{{ filename_template }}">
|
||||
<input type="checkbox" name="remember_template" id="checkbox_remember_template"{{ is_checked_remember_file_template ? ' checked' }}>
|
||||
<label for="checkbox_remember_template">
|
||||
{% trans 'use this for future exports' %}
|
||||
</label>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if is_encoding_supported %}
|
||||
<li>
|
||||
<label for="select_charset" class="desc">
|
||||
{% trans 'Character set of the file:' %}
|
||||
</label>
|
||||
<select id="select_charset" name="charset" size="1">
|
||||
{% for charset in encodings %}
|
||||
<option value="{{ charset }}"
|
||||
{{- (export_charset is empty and charset == 'utf-8') or charset == export_charset ? ' selected' }}>
|
||||
{{- charset -}}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="list-group-item">
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="radio" id="radio_view_as_text" name="output_format" value="astext"{{ repopulate or export_asfile == false ? ' checked' }}>
|
||||
<label class="form-check-label" for="radio_view_as_text">{% trans 'View output as text' %}</label>
|
||||
</div>
|
||||
<div class="form-check mb-2">
|
||||
<input class="form-check-input" type="radio" name="output_format" value="sendit" id="radio_dump_asfile"{{ not repopulate and is_checked_asfile ? ' checked' }}>
|
||||
<label class="form-check-label" for="radio_dump_asfile">{% trans 'Save output to a file' %}</label>
|
||||
</div>
|
||||
<div class="hstack gap-3">
|
||||
<div class="vr"></div>
|
||||
<ul class="list-group" id="ul_save_asfile">
|
||||
{% if has_save_dir %}
|
||||
<li class="list-group-item">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="onserver" value="saveit" id="checkbox_dump_onserver"{{ is_checked_export ? ' checked' }}>
|
||||
<label class="form-check-label" for="checkbox_dump_onserver">
|
||||
{{ 'Save on server in the directory <strong>%s</strong>'|trans|format(save_dir|e)|raw }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="onserver_overwrite" value="saveitover" id="checkbox_dump_onserver_overwrite"
|
||||
{{- is_checked_export_overwrite ? ' checked' }}>
|
||||
<label class="form-check-label" for="checkbox_dump_onserver_overwrite">
|
||||
{% trans 'Overwrite existing file(s)' %}
|
||||
</label>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if has_zip or has_gzip %}
|
||||
<li>
|
||||
<label for="compression" class="desc">
|
||||
{% trans 'Compression:' %}
|
||||
</label>
|
||||
<select id="compression" name="compression">
|
||||
<option value="none">{% trans 'None' %}</option>
|
||||
{% if has_zip %}
|
||||
<option value="zip"
|
||||
{{- selected_compression == 'zip' ? ' selected' }}>
|
||||
{% trans 'zipped' %}
|
||||
</option>
|
||||
{% endif %}
|
||||
{% if has_gzip %}
|
||||
<option value="gzip"
|
||||
{{- selected_compression == 'gzip' ? ' selected' }}>
|
||||
{% trans 'gzipped' %}
|
||||
</option>
|
||||
{% endif %}
|
||||
</select>
|
||||
</li>
|
||||
{% else %}
|
||||
<input type="hidden" name="compression" value="{{ selected_compression }}">
|
||||
{% endif %}
|
||||
<li class="list-group-item">
|
||||
<div class="row g-3 align-items-center">
|
||||
<div class="col-auto">
|
||||
<label for="filename_template" class="col-form-label">
|
||||
{% trans 'File name template:' %}
|
||||
{{ show_hint('This value is interpreted using the \'strftime\' function, so you can use time formatting strings. Additionally the following transformations will happen: %s Other text will be kept as is. See the FAQ 6.27 for details.'|trans|format(filename_hint)) }}
|
||||
</label>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<input type="text" class="form-control" name="filename_template" id="filename_template" value="{{ filename_template }}">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="remember_template" id="checkbox_remember_template"{{ is_checked_remember_file_template ? ' checked' }}>
|
||||
<label class="form-check-label" for="checkbox_remember_template">
|
||||
{% trans 'Use this for future exports' %}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
{% if export_type == 'server' or export_type == 'database' %}
|
||||
<li>
|
||||
<input type="checkbox" id="checkbox_as_separate_files" name="as_separate_files" value="{{ export_type }}"
|
||||
{{- is_checked_as_separate_files ? ' checked' }}>
|
||||
<label for="checkbox_as_separate_files">
|
||||
{% if export_type == 'server' %}
|
||||
{% trans 'Export databases as separate files' %}
|
||||
{% elseif export_type == 'database' %}
|
||||
{% trans 'Export tables as separate files' %}
|
||||
{% endif %}
|
||||
</label>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
{% if is_encoding_supported %}
|
||||
<li class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col-auto">
|
||||
<label for="select_charset" class="col-form-label">{% trans 'Character set of the file:' %}</label>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<select class="form-select" id="select_charset" name="charset">
|
||||
{% for charset in encodings %}
|
||||
<option value="{{ charset }}"
|
||||
{{- (export_charset is empty and charset == 'utf-8') or charset == export_charset ? ' selected' }}>
|
||||
{{- charset -}}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li>
|
||||
<input type="radio" id="radio_view_as_text" name="output_format" value="astext"
|
||||
{{- repopulate or export_asfile == false ? ' checked' }}>
|
||||
<label for="radio_view_as_text">
|
||||
{% trans 'View output as text' %}
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
{% if has_zip or has_gzip %}
|
||||
<li class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="col-auto">
|
||||
<label for="compression" class="col-form-label">{% trans 'Compression:' %}</label>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<select class="form-select" id="compression" name="compression">
|
||||
<option value="none">{% trans 'None' %}</option>
|
||||
{% if has_zip %}
|
||||
<option value="zip"
|
||||
{{- selected_compression == 'zip' ? ' selected' }}>
|
||||
{% trans 'zipped' %}
|
||||
</option>
|
||||
{% endif %}
|
||||
{% if has_gzip %}
|
||||
<option value="gzip"
|
||||
{{- selected_compression == 'gzip' ? ' selected' }}>
|
||||
{% trans 'gzipped' %}
|
||||
</option>
|
||||
{% endif %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{% else %}
|
||||
<input type="hidden" name="compression" value="{{ selected_compression }}">
|
||||
{% endif %}
|
||||
|
||||
<label for="maxsize">
|
||||
{{- 'Skip tables larger than %s MiB'|trans|format(
|
||||
'</label><input type="text" id="maxsize" name="maxsize" size="4">'
|
||||
)|raw }}
|
||||
</div>
|
||||
{% if export_type == 'server' or export_type == 'database' %}
|
||||
<li class="list-group-item">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="checkbox_as_separate_files" name="as_separate_files" value="{{ export_type }}"
|
||||
{{- is_checked_as_separate_files ? ' checked' }}>
|
||||
<label class="form-check-label" for="checkbox_as_separate_files">
|
||||
{% if export_type == 'server' %}
|
||||
{% trans 'Export databases as separate files' %}
|
||||
{% elseif export_type == 'database' %}
|
||||
{% trans 'Export tables as separate files' %}
|
||||
{% endif %}
|
||||
</label>
|
||||
</div>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<div class="exportoptions" id="format_specific_opts">
|
||||
<h3>{% trans 'Format-specific options:' %}</h3>
|
||||
<p class="no_js_msg" id="scroll_to_options_msg">
|
||||
{% trans 'Scroll down to fill in the options for the selected format and ignore the options for other formats.' %}
|
||||
</p>
|
||||
{{ options|raw }}
|
||||
</div>
|
||||
|
||||
{% if can_convert_kanji %}
|
||||
{# Japanese encoding setting #}
|
||||
<div class="exportoptions" id="kanji_encoding">
|
||||
<h3>{% trans 'Encoding Conversion:' %}</h3>
|
||||
{% include 'encoding/kanji_encoding_form.twig' %}
|
||||
<li class="list-group-item">
|
||||
<label for="maxsize" class="form-label">{% trans 'Skip tables larger than:' %}</label>
|
||||
<input class="form-control" type="number" id="maxsize" name="maxsize" aria-describedby="maxsizeHelp">
|
||||
<div id="maxsizeHelp" class="form-text">{% trans 'The size is measured in MiB.' %}</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="exportoptions justify-content-end" id="submit">
|
||||
<input id="buttonGo" class="btn btn-primary" type="submit" value="{% trans 'Go' %}" data-exec-time-limit="{{ exec_time_limit }}">
|
||||
</div>
|
||||
</form>
|
||||
<div class="card mb-3" id="format_specific_opts">
|
||||
<div class="card-header">{% trans 'Format-specific options:' %}</div>
|
||||
<div class="card-body">
|
||||
{{ options|raw }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if can_convert_kanji %}
|
||||
{# Japanese encoding setting #}
|
||||
<div class="card mb-3" id="kanji_encoding">
|
||||
<div class="card-header">{% trans 'Encoding Conversion:' %}</div>
|
||||
<div class="card-body">
|
||||
{% include 'encoding/kanji_encoding_form.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div id="submit">
|
||||
<input id="buttonGo" class="btn btn-primary" type="submit" value="{% trans 'Export' %}" data-exec-time-limit="{{ exec_time_limit }}">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@ -1,231 +1,203 @@
|
||||
{{ page_settings_error_html|raw }}
|
||||
{{ page_settings_html|raw }}
|
||||
<div class="container">
|
||||
<h2 class="my-3">
|
||||
{{ get_image('b_import', 'Import'|trans) }}
|
||||
{% block title %}{% endblock %}
|
||||
</h2>
|
||||
|
||||
<iframe id="import_upload_iframe" name="import_upload_iframe" width="1" height="1" class="hide"></iframe>
|
||||
<div id="import_form_status" class="hide"></div>
|
||||
<div id="importmain" class="container-fluid">
|
||||
{{ page_settings_error_html|raw }}
|
||||
{{ page_settings_html|raw }}
|
||||
|
||||
<iframe id="import_upload_iframe" name="import_upload_iframe" width="1" height="1" class="hide"></iframe>
|
||||
<div id="import_form_status" class="hide"></div>
|
||||
<div id="importmain">
|
||||
<img src="{{ image('ajax_clock_small.gif') }}" width="16" height="16" alt="ajax clock" class="hide">
|
||||
|
||||
<script type="text/javascript">
|
||||
//<![CDATA[
|
||||
{% include 'import/javascript.twig' with {
|
||||
'upload_id': upload_id,
|
||||
'handler': handler,
|
||||
} only %}
|
||||
//]]>
|
||||
//<![CDATA[
|
||||
{% include 'import/javascript.twig' with {'upload_id': upload_id, 'handler': handler} only %}
|
||||
//]]>
|
||||
</script>
|
||||
|
||||
<form id="import_file_form"
|
||||
action="{{ url('/import') }}"
|
||||
method="post"
|
||||
enctype="multipart/form-data"
|
||||
name="import"
|
||||
class="ajax"
|
||||
{%- if handler != 'PhpMyAdmin\\Plugins\\Import\\Upload\\UploadNoplugin' %}
|
||||
target="import_upload_iframe"
|
||||
{%- endif %}>
|
||||
<form id="import_file_form" action="{{ url('/import') }}" method="post" enctype="multipart/form-data" name="import" class="ajax"
|
||||
{%- if handler != 'PhpMyAdmin\\Plugins\\Import\\Upload\\UploadNoplugin' %} target="import_upload_iframe"{% endif %}>
|
||||
{{ get_hidden_inputs(hidden_inputs) }}
|
||||
|
||||
{{ get_hidden_inputs(hidden_inputs) }}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">{% trans 'File to import:' %}</div>
|
||||
<div class="card-body">
|
||||
{# We don't have show anything about compression, when no supported #}
|
||||
{% if compressions is not empty %}
|
||||
<p class="card-text">
|
||||
{{ 'File may be compressed (%s) or uncompressed.'|trans|format(compressions|join(', ')) }}<br>
|
||||
{% trans 'A compressed file\'s name must end in <strong>.[format].[compression]</strong>. Example: <strong>.sql.zip</strong>' %}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<div class="exportoptions" id="header">
|
||||
<h2>
|
||||
{{ get_image('b_import', 'Import'|trans) }}
|
||||
{% block title %}{% endblock %}
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div class="importoptions">
|
||||
<h3>{% trans 'File to import:' %}</h3>
|
||||
|
||||
{# We don't have show anything about compression, when no supported #}
|
||||
{% if compressions is not empty %}
|
||||
<div class="formelementrow" id="compression_info">
|
||||
<p>
|
||||
{{ 'File may be compressed (%s) or uncompressed.'|trans|format(compressions|join(', ')) }}
|
||||
<br>
|
||||
{% trans 'A compressed file\'s name must end in <strong>.[format].[compression]</strong>. Example: <strong>.sql.zip</strong>' %}
|
||||
</p>
|
||||
{% if is_upload and upload_dir is not empty %}
|
||||
{% set use_local_file_import = timeout_passed_global is not empty and local_import_file is not empty %}
|
||||
<ul class="nav nav-pills mb-3" id="importFileTab" role="tablist">
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link{{ not use_local_file_import ? ' active' }}" id="uploadFileTab" data-bs-toggle="tab" data-bs-target="#uploadFile" type="button" role="tab" aria-controls="uploadFile" aria-selected="{{ not use_local_file_import ? 'true' : 'false' }}">{% trans 'Upload a file' %}</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link{{ use_local_file_import ? ' active' }}" id="localFileTab" data-bs-toggle="tab" data-bs-target="#localFile" type="button" role="tab" aria-controls="localFile" aria-selected="{{ use_local_file_import ? 'true' : 'false' }}">{% trans 'Select file to import' %}</button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content mb-3" id="importFileTabContent">
|
||||
<div class="tab-pane fade{{ not use_local_file_import ? ' show active' }}" id="uploadFile" role="tabpanel" aria-labelledby="uploadFileTab">
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="{{ max_upload_size }}">
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="input_import_file">{% trans 'Browse your computer:' %} <small>{{ formatted_maximum_upload_size }}</small></label>
|
||||
<input class="form-control" type="file" name="import_file" id="input_import_file">
|
||||
</div>
|
||||
{% endif %}
|
||||
<div id="upload_form_status" class="hide"></div>
|
||||
<div id="upload_form_status_info" class="hide"></div>
|
||||
<p class="card-text">{% trans 'You may also drag and drop a file on any page.' %}</p>
|
||||
</div>
|
||||
|
||||
<div class="formelementrow" id="upload_form">
|
||||
{% if is_upload and upload_dir is not empty %}
|
||||
<ul>
|
||||
<li>
|
||||
<input type="radio" name="file_location" id="radio_import_file" required="required">
|
||||
<label for="radio_import_file">{% trans 'Browse your computer:' %}</label>
|
||||
|
||||
<div id="upload_form_status" class="hide"></div>
|
||||
<div id="upload_form_status_info" class="hide"></div>
|
||||
|
||||
<input type="file" name="import_file" id="input_import_file" aria-label="{% trans 'Browse your computer' %}">
|
||||
|
||||
{{ get_formatted_maximum_upload_size(max_upload_size) }}
|
||||
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="{{ max_upload_size }}">
|
||||
|
||||
<p>{% trans 'You may also drag and drop a file on any page.' %}</p>
|
||||
</li>
|
||||
<li>
|
||||
<input type="radio" name="file_location" id="radio_local_import_file"
|
||||
{{- timeout_passed_global is not empty and local_import_file is not empty ? ' checked' }}>
|
||||
<label for="radio_local_import_file">
|
||||
{{ 'Select from the web server upload directory [strong]%s[/strong]:'|trans|format(user_upload_dir)|sanitize }}
|
||||
</label>
|
||||
|
||||
{% if local_files is same as(false) %}
|
||||
{{ 'The directory you set for upload work cannot be reached.'|trans|error }}
|
||||
{% elseif local_files is not empty %}
|
||||
<select size="1" name="local_import_file" id="select_local_import_file" aria-label="{% trans 'Select file to import' %}">
|
||||
<option value=""></option>
|
||||
{{ local_files|raw }}
|
||||
</select>
|
||||
{% else %}
|
||||
<em>{% trans 'There are no files to upload!' %}</em>
|
||||
{% endif %}
|
||||
</li>
|
||||
</ul>
|
||||
{% elseif is_upload %}
|
||||
<label for="input_import_file">{% trans 'Browse your computer:' %}</label>
|
||||
|
||||
<div id="upload_form_status" class="hide"></div>
|
||||
<div id="upload_form_status_info" class="hide"></div>
|
||||
|
||||
<input type="file" name="import_file" id="input_import_file">
|
||||
|
||||
{{ get_formatted_maximum_upload_size(max_upload_size) }}
|
||||
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="{{ max_upload_size }}">
|
||||
|
||||
<p>{% trans 'You may also drag and drop a file on any page.' %}</p>
|
||||
{% elseif upload_dir is not empty %}
|
||||
<label for="select_local_import_file">
|
||||
{{ 'Select from the web server upload directory [strong]%s[/strong]:'|trans|format(user_upload_dir)|sanitize }}
|
||||
</label>
|
||||
|
||||
{% if local_files is same as(false) %}
|
||||
{{ 'The directory you set for upload work cannot be reached.'|trans|error }}
|
||||
{% elseif local_files is not empty %}
|
||||
<select size="1" name="local_import_file" id="select_local_import_file">
|
||||
<option value=""></option>
|
||||
{{ local_files|raw }}
|
||||
</select>
|
||||
{% else %}
|
||||
<em>{% trans 'There are no files to upload!' %}</em>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{{ 'File uploads are not allowed on this server.'|trans|notice }}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="formelementrow" id="charaset_of_file">
|
||||
{# Charset of file #}
|
||||
<label for="charset_of_file">{% trans 'Character set of the file:' %}</label>
|
||||
{% if is_encoding_supported %}
|
||||
<select id="charset_of_file" name="charset_of_file" size="1">
|
||||
{% for charset in encodings %}
|
||||
<option value="{{ charset }}"
|
||||
{% if (import_charset is empty and charset == 'utf-8')
|
||||
or charset == import_charset %}
|
||||
selected="selected"
|
||||
{% endif %}>
|
||||
{{ charset }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% else %}
|
||||
<select lang="en" dir="ltr" name="charset_of_file" id="charset_of_file">
|
||||
<div class="tab-pane fade{{ use_local_file_import ? ' show active' }}" id="localFile" role="tabpanel" aria-labelledby="localFileTab">
|
||||
{% if local_files is same as(false) %}
|
||||
{{ 'The directory you set for upload work cannot be reached.'|trans|error }}
|
||||
{% elseif local_files is not empty %}
|
||||
<label class="form-label" for="select_local_import_file">{{ 'Select from the web server upload directory [strong]%s[/strong]:'|trans|format(user_upload_dir)|sanitize }}</label>
|
||||
<select class="form-select" size="1" name="local_import_file" id="select_local_import_file">
|
||||
<option value=""></option>
|
||||
{% for charset in charsets %}
|
||||
<option value="{{ charset.name }}" title="{{ charset.description }}"
|
||||
{{- charset.name == 'utf8' ? ' selected' }}>
|
||||
{{- charset.name -}}
|
||||
</option>
|
||||
{% endfor %}
|
||||
{{ local_files|raw }}
|
||||
</select>
|
||||
{% else %}
|
||||
<div class="alert alert-info" role="alert">
|
||||
{% trans 'There are no files to import!' %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="importoptions">
|
||||
<h3>{% trans 'Partial import:' %}</h3>
|
||||
|
||||
{% if timeout_passed is defined and timeout_passed %}
|
||||
<div class="formelementrow">
|
||||
<input type="hidden" name="skip" value="{{ offset }}">
|
||||
{{ 'Previous import timed out, after resubmitting will continue from position %d.'|trans|format(offset) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="formelementrow">
|
||||
<input type="checkbox" name="allow_interrupt" value="yes" id="checkbox_allow_interrupt"{{ is_allow_interrupt_checked|raw }}>
|
||||
<label for="checkbox_allow_interrupt">
|
||||
{% trans 'Allow the interruption of an import in case the script detects it is close to the PHP timeout limit. <em>(This might be a good way to import large files, however it can break transactions.)</em>' %}
|
||||
</label>
|
||||
{% elseif is_upload %}
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="{{ max_upload_size }}">
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="input_import_file">{% trans 'Browse your computer:' %} <small>{{ formatted_maximum_upload_size }}</small></label>
|
||||
<input class="form-control" type="file" name="import_file" id="input_import_file">
|
||||
</div>
|
||||
|
||||
{% if not (timeout_passed is defined and timeout_passed) %}
|
||||
<div class="formelementrow">
|
||||
<label for="text_skip_queries">
|
||||
{% trans 'Skip this number of queries (for SQL) starting from the first one:' %}
|
||||
</label>
|
||||
<input type="number" name="skip_queries" value="
|
||||
{{- skip_queries_default|raw -}}
|
||||
" id="text_skip_queries" min="0">
|
||||
</div>
|
||||
<div id="upload_form_status" class="hide"></div>
|
||||
<div id="upload_form_status_info" class="hide"></div>
|
||||
<p class="card-text">{% trans 'You may also drag and drop a file on any page.' %}</p>
|
||||
{% elseif upload_dir is not empty %}
|
||||
{% if local_files is same as(false) %}
|
||||
{{ 'The directory you set for upload work cannot be reached.'|trans|error }}
|
||||
{% elseif local_files is not empty %}
|
||||
<div class="mb-3">
|
||||
<label class="form-label" for="select_local_import_file">{{ 'Select from the web server upload directory [strong]%s[/strong]:'|trans|format(user_upload_dir)|sanitize }}</label>
|
||||
<select class="form-select" size="1" name="local_import_file" id="select_local_import_file">
|
||||
<option value=""></option>
|
||||
{{ local_files|raw }}
|
||||
</select>
|
||||
</div>
|
||||
{% else %}
|
||||
{# If timeout has passed,
|
||||
do not show the Skip dialog to avoid the risk of someone
|
||||
entering a value here that would interfere with "skip" #}
|
||||
<input type="hidden" name="skip_queries" value="
|
||||
{{- skip_queries_default|raw -}}
|
||||
" id="text_skip_queries">
|
||||
<div class="alert alert-info" role="alert">
|
||||
{% trans 'There are no files to import!' %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% else %}
|
||||
{{ 'File uploads are not allowed on this server.'|trans|notice }}
|
||||
{% endif %}
|
||||
|
||||
<div class="importoptions">
|
||||
<h3>{% trans 'Other options:' %}</h3>
|
||||
<div class="formelementrow">
|
||||
<input type="hidden" name="fk_checks" value="0">
|
||||
<input type="checkbox" name="fk_checks" id="fk_checks" value="1"{{ is_foreign_key_check ? ' checked' }}>
|
||||
<label for="fk_checks">{% trans 'Enable foreign key checks' %}</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="importoptions">
|
||||
<h3>{% trans 'Format:' %}</h3>
|
||||
<select id="plugins" name="format">
|
||||
{% for option in plugins_choice %}
|
||||
<option value="{{ option.name }}"{{ option.is_selected ? ' selected' }}>{{ option.text }}</option>
|
||||
<label class="form-label" for="charset_of_file">{% trans 'Character set of the file:' %}</label>
|
||||
{% if is_encoding_supported %}
|
||||
<select class="form-select" id="charset_of_file" name="charset_of_file" size="1">
|
||||
{% for charset in encodings %}
|
||||
<option value="{{ charset }}"{% if (import_charset is empty and charset == 'utf-8') or charset == import_charset %} selected{% endif %}>
|
||||
{{- charset -}}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
||||
{% for option in plugins_choice %}
|
||||
<input type="hidden" id="force_file_{{ option.name }}" value="true">
|
||||
{% endfor %}
|
||||
|
||||
<div id="import_notification"></div>
|
||||
{% else %}
|
||||
<select class="form-select" lang="en" dir="ltr" name="charset_of_file" id="charset_of_file">
|
||||
<option value=""></option>
|
||||
{% for charset in charsets %}
|
||||
<option value="{{ charset.name }}" title="{{ charset.description }}"{{ charset.name == 'utf8' ? ' selected' }}>
|
||||
{{- charset.name -}}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="importoptions" id="format_specific_opts">
|
||||
<h3>{% trans 'Format-specific options:' %}</h3>
|
||||
<p class="no_js_msg" id="scroll_to_options_msg">
|
||||
{% trans 'Scroll down to fill in the options for the selected format and ignore the options for other formats.' %}
|
||||
</p>
|
||||
{{ options|raw }}
|
||||
</div>
|
||||
<div class="clearfloat"></div>
|
||||
|
||||
{# Japanese encoding setting #}
|
||||
{% if can_convert_kanji %}
|
||||
<div class="importoptions" id="kanji_encoding">
|
||||
<h3>{% trans 'Encoding Conversion:' %}</h3>
|
||||
{% include 'encoding/kanji_encoding_form.twig' %}
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">{% trans 'Partial import:' %}</div>
|
||||
<div class="card-body">
|
||||
{% if timeout_passed is defined and timeout_passed %}
|
||||
<input type="hidden" name="skip" value="{{ offset }}">
|
||||
<div class="alert alert-info" role="alert">
|
||||
{{ 'Previous import timed out, after resubmitting will continue from position %d.'|trans|format(offset) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<div class="importoptions justify-content-end" id="submit">
|
||||
<input id="buttonGo" class="btn btn-primary" type="submit" value="{% trans 'Go' %}">
|
||||
<div class="form-check form-switch mb-3">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="allow_interrupt" value="yes" id="checkbox_allow_interrupt"{{ is_allow_interrupt_checked|raw }} aria-describedby="allowInterruptHelp">
|
||||
<label class="form-check-label" for="checkbox_allow_interrupt">
|
||||
{% trans 'Allow the interruption of an import in case the script detects it is close to the PHP timeout limit.' %}
|
||||
</label>
|
||||
<div id="allowInterruptHelp" class="form-text">{% trans 'This might be a good way to import large files, however it can break transactions.' %}</div>
|
||||
</div>
|
||||
|
||||
{% if not (timeout_passed is defined and timeout_passed) %}
|
||||
<label class="form-label" for="text_skip_queries">{% trans 'Skip this number of queries (for SQL) starting from the first one:' %}</label>
|
||||
<input class="form-control" type="number" name="skip_queries" value="{{ skip_queries_default|raw }}" id="text_skip_queries" min="0">
|
||||
{% else %}
|
||||
{# If timeout has passed, do not show the Skip dialog to avoid the risk of someone entering a value here that would interfere with "skip" #}
|
||||
<input type="hidden" name="skip_queries" value="{{ skip_queries_default|raw }}" id="text_skip_queries">
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">{% trans 'Other options' %}</div>
|
||||
<div class="card-body">
|
||||
<input type="hidden" name="fk_checks" value="0">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" name="fk_checks" id="fk_checks" value="1"{{ is_foreign_key_check ? ' checked' }}>
|
||||
<label class="form-check-label" for="fk_checks">{% trans 'Enable foreign key checks' %}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">{% trans 'Format' %}</div>
|
||||
<div class="card-body">
|
||||
<select class="form-select" id="plugins" name="format" aria-label="{% trans 'Format' %}">
|
||||
{% for option in plugins_choice %}
|
||||
<option value="{{ option.name }}"{{ option.is_selected ? ' selected' }}>{{ option.text }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
||||
{% for option in plugins_choice %}
|
||||
<input type="hidden" id="force_file_{{ option.name }}" value="true">
|
||||
{% endfor %}
|
||||
|
||||
<div id="import_notification"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-3" id="format_specific_opts">
|
||||
<div class="card-header">{% trans 'Format-specific options:' %}</div>
|
||||
<div class="card-body">
|
||||
{{ options|raw }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Japanese encoding setting #}
|
||||
{% if can_convert_kanji %}
|
||||
<div class="card mb-3" id="kanji_encoding">
|
||||
<div class="card-header">{% trans 'Encoding Conversion:' %}</div>
|
||||
<div class="card-body">
|
||||
{% include 'encoding/kanji_encoding_form.twig' %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div id="submit">
|
||||
<input id="buttonGo" class="btn btn-primary" type="submit" value="{% trans 'Import' %}">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -3,21 +3,15 @@
|
||||
{% block title %}{% trans 'Exporting databases from the current server' %}{% endblock %}
|
||||
|
||||
{% block selection_options %}
|
||||
<div class="exportoptions" id="databases_and_tables">
|
||||
<h3>{% trans 'Databases:' %}</h3>
|
||||
<div class="card mb-3" id="databases_and_tables">
|
||||
<div class="card-header">{% trans 'Databases' %}</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<button type="button" class="btn btn-secondary" id="db_select_all">{% trans 'Select all' %}</button>
|
||||
<button type="button" class="btn btn-secondary" id="db_unselect_all">{% trans 'Unselect all' %}</button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p>
|
||||
<a href="#" id="db_select_all">
|
||||
{% trans 'Select all' %}
|
||||
</a>
|
||||
/
|
||||
<a href="#" id="db_unselect_all">
|
||||
{% trans 'Unselect all' %}
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<select class="resize-vertical" name="db_select[]" id="db_select" size="10" multiple>
|
||||
<select class="form-select" name="db_select[]" id="db_select" size="10" multiple aria-label="{% trans 'Databases' %}">
|
||||
{% for database in databases %}
|
||||
<option value="{{ database.name }}"{{ database.is_selected ? ' selected' }}>
|
||||
{{ database.name }}
|
||||
|
||||
@ -189,13 +189,19 @@ class DesignerTest extends AbstractTestCase
|
||||
$this->assertStringContainsString('<input type="hidden" name="page_number" value="' . $page . '">', $result);
|
||||
|
||||
// orientation
|
||||
$this->assertStringContainsString('<select name="pdf_orientation" id="select_pdf_orientation">', $result);
|
||||
$this->assertStringContainsString('<option value="L" selected="selected">Landscape</option>', $result);
|
||||
$this->assertStringContainsString(
|
||||
'<select class="form-select" name="pdf_orientation" id="select_pdf_orientation">',
|
||||
$result
|
||||
);
|
||||
$this->assertStringContainsString('<option value="L" selected>Landscape</option>', $result);
|
||||
$this->assertStringContainsString('<option value="P">Portrait</option>', $result);
|
||||
|
||||
// paper size
|
||||
$this->assertStringContainsString('<select name="pdf_paper" id="select_pdf_paper">', $result);
|
||||
$this->assertStringContainsString(
|
||||
'<select class="form-select" name="pdf_paper" id="select_pdf_paper">',
|
||||
$result
|
||||
);
|
||||
$this->assertStringContainsString('<option value="A3">A3</option>', $result);
|
||||
$this->assertStringContainsString('<option value="A4" selected="selected">A4</option>', $result);
|
||||
$this->assertStringContainsString('<option value="A4" selected>A4</option>', $result);
|
||||
}
|
||||
}
|
||||
|
||||
@ -141,7 +141,7 @@ class ExportTest extends TestBase
|
||||
$this->scrollIntoView('databases_and_tables', 200);
|
||||
sleep(1);
|
||||
$this->scrollIntoView('databases_and_tables', 200);
|
||||
$this->byPartialLinkText('Unselect all')->click();
|
||||
$this->byId('db_unselect_all')->click();
|
||||
|
||||
$this->byCssSelector('option[value="' . $this->databaseName . '"]')->click();
|
||||
}
|
||||
|
||||
@ -101,7 +101,7 @@ class ImportTest extends TestBase
|
||||
$this->waitAjax();
|
||||
$this->waitForElement('id', 'input_import_file');
|
||||
|
||||
$this->waitForElement('cssSelector', 'label[for=radio_local_import_file]')->click();
|
||||
$this->waitForElement('id', 'localFileTab')->click();
|
||||
|
||||
$this->selectByValue(
|
||||
$this->byName('local_import_file'),
|
||||
@ -119,6 +119,9 @@ class ImportTest extends TestBase
|
||||
$this->scrollToBottom();
|
||||
$this->waitUntilElementIsVisible('id', 'buttonGo', 30);
|
||||
|
||||
$this->scrollToBottom();
|
||||
sleep(1);
|
||||
$this->scrollToBottom();
|
||||
$this->byId('buttonGo')->click();
|
||||
sleep(2);
|
||||
$this->waitUntilElementIsVisible(
|
||||
|
||||
@ -831,15 +831,6 @@ textarea {
|
||||
float: left;
|
||||
}
|
||||
|
||||
label.desc {
|
||||
width: 30em;
|
||||
float: left;
|
||||
|
||||
sup {
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 1em;
|
||||
|
||||
@ -1007,164 +998,6 @@ select.invalid_value,
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export and Import styles
|
||||
*/
|
||||
|
||||
.export_table_list_container {
|
||||
display: inline-block;
|
||||
max-height: 20em;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.export_table_select {
|
||||
th {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.all {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
}
|
||||
|
||||
.export_structure,
|
||||
.export_data {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.export_table_name {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.exportoptions {
|
||||
h2 {
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h3 {
|
||||
border-bottom: 1px #999 solid;
|
||||
font-size: 110%;
|
||||
}
|
||||
}
|
||||
|
||||
.importoptions h3 {
|
||||
border-bottom: 1px #999 solid;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
.exportoptions ul,
|
||||
.importoptions ul,
|
||||
.format_specific_options ul {
|
||||
list-style-type: none;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.exportoptions li,
|
||||
.importoptions li {
|
||||
margin: 7px;
|
||||
}
|
||||
|
||||
.exportoptions label,
|
||||
.importoptions label,
|
||||
.exportoptions p,
|
||||
.importoptions p {
|
||||
margin: 5px;
|
||||
float: none;
|
||||
}
|
||||
|
||||
#csv_options label.desc,
|
||||
#ldi_options label.desc,
|
||||
#latex_options label.desc,
|
||||
#output label.desc {
|
||||
float: left;
|
||||
width: 15em;
|
||||
}
|
||||
|
||||
.exportoptions,
|
||||
.importoptions {
|
||||
margin: 20px 30px 30px;
|
||||
margin-left: 10px;
|
||||
|
||||
#buttonGo {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.format_specific_options {
|
||||
border: 1px solid #999;
|
||||
margin: 7px 0;
|
||||
padding: 3px;
|
||||
|
||||
h3 {
|
||||
margin: 10px 0 0;
|
||||
margin-left: 10px;
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
p.desc {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export styles only
|
||||
*/
|
||||
select {
|
||||
&#db_select,
|
||||
&#table_select {
|
||||
width: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
.export_sub_options {
|
||||
margin: 20px 0 0;
|
||||
margin-left: 30px;
|
||||
|
||||
h4 {
|
||||
border-bottom: 1px #999 solid;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0;
|
||||
|
||||
&.subgroup {
|
||||
display: inline-block;
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#export_refresh_form {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
#export_back_button {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#output_quick_export {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import styles only
|
||||
*/
|
||||
|
||||
.importoptions #import_notification {
|
||||
margin: 10px 0;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
input#input_import_file {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.formelementrow {
|
||||
margin: 5px 0 5px 0;
|
||||
}
|
||||
|
||||
#popup_background {
|
||||
display: none;
|
||||
position: fixed;
|
||||
|
||||
@ -1025,15 +1025,6 @@ li {
|
||||
float: left;
|
||||
}
|
||||
|
||||
label.desc {
|
||||
width: 30em;
|
||||
float: left;
|
||||
|
||||
sup {
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
||||
kbd {
|
||||
color: $main-color;
|
||||
background-color: transparent;
|
||||
@ -1183,150 +1174,6 @@ input {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export and Import styles
|
||||
*/
|
||||
|
||||
.export_table_list_container {
|
||||
display: inline-block;
|
||||
max-height: 20em;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.export_table_select {
|
||||
th {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.all {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
}
|
||||
|
||||
.export_structure,
|
||||
.export_data {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.export_table_name {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.exportoptions h3,
|
||||
.importoptions h3 {
|
||||
border-bottom: 1px #ccc solid;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
.exportoptions ul,
|
||||
.importoptions ul,
|
||||
.format_specific_options ul {
|
||||
list-style-type: none;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.exportoptions li,
|
||||
.importoptions li {
|
||||
margin: 7px;
|
||||
}
|
||||
|
||||
.exportoptions label,
|
||||
.importoptions label,
|
||||
.exportoptions p,
|
||||
.importoptions p {
|
||||
margin: 5px;
|
||||
float: none;
|
||||
}
|
||||
|
||||
#csv_options label.desc,
|
||||
#ldi_options label.desc,
|
||||
#latex_options label.desc,
|
||||
#output label.desc {
|
||||
float: left;
|
||||
width: 15em;
|
||||
}
|
||||
|
||||
.exportoptions,
|
||||
.importoptions {
|
||||
margin: 20px 30px 30px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.exportoptions #buttonGo,
|
||||
.importoptions #buttonGo {
|
||||
padding: 5px 12px;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.format_specific_options {
|
||||
border: 1px solid #999;
|
||||
margin: 7px 0;
|
||||
padding: 3px;
|
||||
|
||||
h3 {
|
||||
margin: 10px 0 0;
|
||||
margin-left: 10px;
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
p.desc {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export styles only
|
||||
*/
|
||||
select {
|
||||
&#db_select,
|
||||
&#table_select {
|
||||
width: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
.export_sub_options {
|
||||
margin: 20px 0 0;
|
||||
margin-left: 30px;
|
||||
|
||||
h4 {
|
||||
border-bottom: 1px #999 solid;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0;
|
||||
|
||||
&.subgroup {
|
||||
display: inline-block;
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#output_quick_export {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import styles only
|
||||
*/
|
||||
|
||||
.importoptions #import_notification {
|
||||
margin: 10px 0;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
input#input_import_file {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.formelementrow {
|
||||
margin: 5px 0 5px 0;
|
||||
}
|
||||
|
||||
#popup_background {
|
||||
display: none;
|
||||
position: fixed;
|
||||
|
||||
@ -813,15 +813,6 @@ textarea {
|
||||
float: left;
|
||||
}
|
||||
|
||||
label.desc {
|
||||
width: 30em;
|
||||
float: left;
|
||||
|
||||
sup {
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
||||
kbd {
|
||||
color: $main-color;
|
||||
background-color: transparent;
|
||||
@ -1000,150 +991,6 @@ select.invalid_value,
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export and Import styles
|
||||
*/
|
||||
|
||||
.export_table_list_container {
|
||||
display: inline-block;
|
||||
max-height: 20em;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.export_table_select {
|
||||
th {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.all {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
}
|
||||
|
||||
.export_structure,
|
||||
.export_data {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.export_table_name {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.exportoptions {
|
||||
h2 {
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h3 {
|
||||
border-bottom: 1px #999 solid;
|
||||
font-size: 110%;
|
||||
}
|
||||
}
|
||||
|
||||
.importoptions h3 {
|
||||
border-bottom: 1px #999 solid;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
.exportoptions ul,
|
||||
.importoptions ul,
|
||||
.format_specific_options ul {
|
||||
list-style-type: none;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.exportoptions li,
|
||||
.importoptions li {
|
||||
margin: 7px;
|
||||
}
|
||||
|
||||
.exportoptions label,
|
||||
.importoptions label,
|
||||
.exportoptions p,
|
||||
.importoptions p {
|
||||
margin: 5px;
|
||||
float: none;
|
||||
}
|
||||
|
||||
#csv_options label.desc,
|
||||
#ldi_options label.desc,
|
||||
#latex_options label.desc,
|
||||
#output label.desc {
|
||||
float: left;
|
||||
width: 15em;
|
||||
}
|
||||
|
||||
.exportoptions,
|
||||
.importoptions {
|
||||
margin: 20px 30px 30px 10px;
|
||||
}
|
||||
|
||||
.format_specific_options {
|
||||
border: 1px solid #999;
|
||||
margin: 7px 0;
|
||||
padding: 3px;
|
||||
|
||||
h3 {
|
||||
margin: 10px 0 0 10px;
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
p.desc {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export styles only
|
||||
*/
|
||||
|
||||
select {
|
||||
&#db_select,
|
||||
&#table_select {
|
||||
width: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
.export_sub_options {
|
||||
margin: 20px 0 0 30px;
|
||||
|
||||
h4 {
|
||||
border-bottom: 1px #999 solid;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0;
|
||||
|
||||
&.subgroup {
|
||||
display: inline-block;
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#output_quick_export {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import styles only
|
||||
*/
|
||||
|
||||
.importoptions #import_notification {
|
||||
margin: 10px 0;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
input#input_import_file {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.formelementrow {
|
||||
margin: 5px 0 5px 0;
|
||||
}
|
||||
|
||||
#popup_background {
|
||||
display: none;
|
||||
position: fixed;
|
||||
|
||||
@ -1008,15 +1008,6 @@ textarea {
|
||||
float: left;
|
||||
}
|
||||
|
||||
label.desc {
|
||||
width: 30em;
|
||||
float: left;
|
||||
|
||||
sup {
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
|
||||
kbd {
|
||||
color: $main-color;
|
||||
background-color: transparent;
|
||||
@ -1189,168 +1180,10 @@ select.invalid_value,
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export and Import styles
|
||||
*/
|
||||
|
||||
.export_table_list_container {
|
||||
display: inline-block;
|
||||
max-height: 20em;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
.export_table_select {
|
||||
th {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.all {
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
}
|
||||
|
||||
.export_structure,
|
||||
.export_data {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.export_table_name {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.exportoptions {
|
||||
h2 {
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
h3 {
|
||||
border-bottom: 1px #999 solid;
|
||||
font-size: 110%;
|
||||
}
|
||||
}
|
||||
|
||||
.importoptions h3 {
|
||||
border-bottom: 1px #999 solid;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
.exportoptions ul,
|
||||
.importoptions ul,
|
||||
.format_specific_options ul {
|
||||
list-style-type: none;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.exportoptions li,
|
||||
.importoptions li {
|
||||
margin: 7px;
|
||||
}
|
||||
|
||||
.exportoptions label,
|
||||
.importoptions label,
|
||||
.exportoptions p,
|
||||
.importoptions p {
|
||||
margin: 5px;
|
||||
float: none;
|
||||
}
|
||||
|
||||
#csv_options label.desc,
|
||||
#ldi_options label.desc,
|
||||
#latex_options label.desc,
|
||||
#output label.desc {
|
||||
float: left;
|
||||
width: 15em;
|
||||
}
|
||||
|
||||
.exportoptions,
|
||||
.importoptions {
|
||||
margin: 20px 30px 30px;
|
||||
margin-left: 10px;
|
||||
|
||||
#buttonGo {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.format_specific_options {
|
||||
border: 1px solid #999;
|
||||
margin: 7px 0;
|
||||
padding: 3px;
|
||||
|
||||
h3 {
|
||||
margin: 10px 0 0;
|
||||
margin-left: 10px;
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
p.desc {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export styles only
|
||||
*/
|
||||
select {
|
||||
&#db_select,
|
||||
&#table_select {
|
||||
width: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
.export_sub_options {
|
||||
margin: 20px 0 0;
|
||||
margin-left: 30px;
|
||||
|
||||
h4 {
|
||||
border-bottom: 1px #999 solid;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 0;
|
||||
|
||||
&.subgroup {
|
||||
display: inline-block;
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#export_refresh_form {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
#export_back_button {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#output_quick_export {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import styles only
|
||||
*/
|
||||
|
||||
.importoptions #import_notification {
|
||||
margin: 10px 0;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
input#input_import_file {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
input#import_merge {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.formelementrow {
|
||||
margin: 5px 0 5px 0;
|
||||
}
|
||||
|
||||
#popup_background {
|
||||
display: none;
|
||||
position: fixed;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user