From 5a40c54f3c43ded75c6f5a178af6d04c6e696d5c Mon Sep 17 00:00:00 2001 From: Samuel Georges Date: Tue, 21 Jul 2015 07:56:55 +1000 Subject: [PATCH] Add required fields + validation step, headers checkbox can be toggled --- .../behaviors/ImportExportController.php | 102 +++++++++++++----- .../assets/css/import.css | 9 +- .../assets/js/october.import.js | 14 ++- .../assets/less/import.less | 10 +- ...mple_popup.htm => _column_sample_form.htm} | 0 .../partials/_import_db_columns.htm | 10 +- .../partials/_import_form.htm | 51 +++++++++ .../partials/fields_import.yaml | 3 +- 8 files changed, 160 insertions(+), 39 deletions(-) rename modules/backend/behaviors/importexportcontroller/partials/{_column_sample_popup.htm => _column_sample_form.htm} (100%) create mode 100644 modules/backend/behaviors/importexportcontroller/partials/_import_form.htm diff --git a/modules/backend/behaviors/ImportExportController.php b/modules/backend/behaviors/ImportExportController.php index feee756f3..7e83b3ab0 100644 --- a/modules/backend/behaviors/ImportExportController.php +++ b/modules/backend/behaviors/ImportExportController.php @@ -5,6 +5,7 @@ use Backend\Classes\ControllerBehavior; use League\Csv\Writer as CsvWrtier; use League\Csv\Reader as CsvReader; use ApplicationException; +use Exception; /** * Import/Export Controller Behavior @@ -79,8 +80,61 @@ class ImportExportController extends ControllerBehavior // TBA } + // + // Importing AJAX + // + public function onImport() { + // traceLog(post()); + } + + public function onImportLoadForm() + { + try { + $this->checkRequiredImportColumns(); + } + catch (Exception $ex) { + $this->controller->handleError($ex); + } + + return $this->importExportMakePartial('import_form'); + } + + public function onImportLoadColumnSampleForm() + { + if (($columnId = post('file_column_id', false)) === false) { + throw new ApplicationException('Missing column identifier'); + } + + $columns = $this->getImportFileColumns(); + if (!array_key_exists($columnId, $columns)) { + throw new ApplicationException('Unknown column'); + } + + $path = $this->getImportFilePath(); + $reader = CsvReader::createFromPath($path); + + if (post('first_row_titles')) { + $reader->setOffset(1); + } + + $data = $reader->setLimit(20)->fetchColumn((int) $columnId); + + /* + * Clean up data + */ + foreach ($data as $index => $sample) { + $data[$index] = Str::limit($sample, 100); + if (!strlen($data[$index])) { + unset($data[$index]); + } + } + + $this->vars['columnName'] = array_get($columns, $columnId); + $this->vars['columnData'] = $data; + + return $this->importExportMakePartial('column_sample_form'); } // @@ -173,40 +227,34 @@ class ImportExportController extends ControllerBehavior return $file->getLocalPath(); } - public function onImportLoadColumnSamplePopup() + public function importIsColumnRequired($columnName) { - if (($columnId = post('file_column_id', false)) === false) { - throw new ApplicationException('Missing column identifier'); + $model = $this->importGetModel(); + return $model->isAttributeRequired($columnName); + } + + protected function checkRequiredImportColumns() + { + if (!$matches = post('column_match', [])) { + throw new ApplicationException('Please match some columns first.'); } - $columns = $this->getImportFileColumns(); - if (!array_key_exists($columnId, $columns)) { - throw new ApplicationException('Unknown column'); - } + $dbColumns = $this->getImportDbColumns(); + foreach ($dbColumns as $column => $label) { + if (!$this->importIsColumnRequired($column)) continue; - $path = $this->getImportFilePath(); - $reader = CsvReader::createFromPath($path); + $found = false; + foreach ($matches as $matchedColumns) { + if (in_array($column, $matchedColumns)) { + $found = true; + break; + } + } - if (post('first_row_titles')) { - $reader->setOffset(1); - } - - $data = $reader->setLimit(20)->fetchColumn((int) $columnId); - - /* - * Clean up data - */ - foreach ($data as $index => $sample) { - $data[$index] = Str::limit($sample, 100); - if (!strlen($data[$index])) { - unset($data[$index]); + if (!$found) { + throw new ApplicationException('Please specify a match for the required field '.$label.'.'); } } - - $this->vars['columnName'] = array_get($columns, $columnId); - $this->vars['columnData'] = $data; - - return $this->importExportMakePartial('column_sample_popup'); } // diff --git a/modules/backend/behaviors/importexportcontroller/assets/css/import.css b/modules/backend/behaviors/importexportcontroller/assets/css/import.css index 6f67d4646..31660c0e9 100644 --- a/modules/backend/behaviors/importexportcontroller/assets/css/import.css +++ b/modules/backend/behaviors/importexportcontroller/assets/css/import.css @@ -62,6 +62,9 @@ .import-behavior .import-db-columns > ul > li:hover .column-icon { color: #4da7e8; } +.import-behavior .import-db-columns > ul > li.is-required .column-icon { + color: #ab2a1c; +} .import-behavior .import-file-columns > ul > li:before, .import-behavior .import-file-columns > ul > li:after { content: " "; @@ -70,7 +73,7 @@ .import-behavior .import-file-columns > ul > li:after { clear: both; } -.import-behavior .import-file-columns > ul > li.column-ignored { +.import-behavior .import-file-columns > ul > li.is-ignored { display: none; } .import-behavior .import-file-columns > ul > li .column-success-icon { @@ -79,10 +82,10 @@ left: -2px; width: 15px; } -.import-behavior .import-file-columns > ul > li.column-matched .column-success-icon { +.import-behavior .import-file-columns > ul > li.is-matched .column-success-icon { display: inline-block; } -.import-behavior .import-file-columns > ul > li.column-matched .column-ignore-button { +.import-behavior .import-file-columns > ul > li.is-matched .column-ignore-button { display: none !important; } .import-behavior .import-file-columns > ul div.import-column-name { diff --git a/modules/backend/behaviors/importexportcontroller/assets/js/october.import.js b/modules/backend/behaviors/importexportcontroller/assets/js/october.import.js index 69b2afac9..2e1b1ffe1 100644 --- a/modules/backend/behaviors/importexportcontroller/assets/js/october.import.js +++ b/modules/backend/behaviors/importexportcontroller/assets/js/october.import.js @@ -69,19 +69,19 @@ this.toggleMatchState = function ($container) { var hasItems = !!$('.import-column-bindings li', $container).length - $container.toggleClass('column-matched', hasItems) + $container.toggleClass('is-matched', hasItems) } this.ignoreFileColumn = function(el) { var $el = $(el), $column = $el.closest('[data-column-id]') - $column.addClass('column-ignored') + $column.addClass('is-ignored') $('#showIgnoredColumnsButton').removeClass('disabled') } this.showIgnoredColumns = function(el) { - $('#importFileColumns li.column-ignored').removeClass('column-ignored') + $('#importFileColumns li.is-ignored').removeClass('is-ignored') $('#showIgnoredColumnsButton').addClass('disabled') } @@ -91,12 +91,18 @@ columnId = $column.data('column-id') $el.popup({ - handler: 'onImportLoadColumnSamplePopup', + handler: 'onImportLoadColumnSampleForm', extraData: { file_column_id: columnId } }) } + + this.processImport = function () { + var $form = $('#importFileColumns').closest('form') + + $form.request('onImport') + } } $.oc.importBehavior = new ImportBehavior; diff --git a/modules/backend/behaviors/importexportcontroller/assets/less/import.less b/modules/backend/behaviors/importexportcontroller/assets/less/import.less index 5eeab4d19..56d8cbadc 100644 --- a/modules/backend/behaviors/importexportcontroller/assets/less/import.less +++ b/modules/backend/behaviors/importexportcontroller/assets/less/import.less @@ -79,6 +79,12 @@ &:hover .column-icon { color: #4da7e8; } + + &.is-required { + .column-icon { + color: #ab2a1c; + } + } } } @@ -86,7 +92,7 @@ > li { .clearfix; - &.column-ignored { + &.is-ignored { display: none; } @@ -97,7 +103,7 @@ width: 15px; } - &.column-matched { + &.is-matched { .column-success-icon { display: inline-block; } diff --git a/modules/backend/behaviors/importexportcontroller/partials/_column_sample_popup.htm b/modules/backend/behaviors/importexportcontroller/partials/_column_sample_form.htm similarity index 100% rename from modules/backend/behaviors/importexportcontroller/partials/_column_sample_popup.htm rename to modules/backend/behaviors/importexportcontroller/partials/_column_sample_form.htm diff --git a/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.htm b/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.htm index 742c29da5..b66f599e2 100644 --- a/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.htm +++ b/modules/backend/behaviors/importexportcontroller/partials/_import_db_columns.htm @@ -1,9 +1,15 @@