diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index 98dc8c4c8..2423858b4 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -30,6 +30,7 @@ use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; use Combodo\iTop\Application\UI\DisplayBlock\BlockChart\BlockChart; use Combodo\iTop\Application\UI\DisplayBlock\BlockChartAjaxBars\BlockChartAjaxBars; use Combodo\iTop\Application\UI\DisplayBlock\BlockChartAjaxPie\BlockChartAjaxPie; +use Combodo\iTop\Application\UI\DisplayBlock\BlockCsv\BlockCsv; use Combodo\iTop\Application\UI\DisplayBlock\BlockList\BlockList; require_once(APPROOT.'/application/utils.inc.php'); @@ -457,6 +458,10 @@ HTML; $oBlock = $this->RenderSummary($aExtraParams); break; + case 'csv': + $oBlock = $this->RenderCsv($oAppContext, $sId); + break; + case 'search': $oBlock = $this->RenderSearch($oPage, $sId, $aExtraParams); break; @@ -1323,6 +1328,44 @@ JS return $oBlock; } + /** + * @param \ApplicationContext $oAppContext + * @param string|null $sId + * + * @return iUIBlock + * @throws \ArchivedObjectException + * @throws \CoreException + */ + protected function RenderCsv(ApplicationContext $oAppContext, string $sId = null) + { + $oBlock = new BlockCsv($sId); + $oBlock->bAdvancedMode = utils::ReadParam('advanced', false); + + $oBlock->sCsvFile = strtolower($this->m_oFilter->GetClass()).'.csv'; + $oBlock->sDownloadLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?expression='.urlencode($this->m_oFilter->ToOQL(true)).'&format=csv&filename='.urlencode($oBlock->sCsvFile); + $oBlock->sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.rawurlencode($this->m_oFilter->serialize()).'&format=csv'; + // Pass the parameters via POST, since expression may be very long + $aParamsToPost = array( + 'expression' => $this->m_oFilter->ToOQL(true), + 'format' => 'csv', + 'filename' => $oBlock->sCsvFile, + 'charset' => 'UTF-8', + ); + if ($oBlock->bAdvancedMode) { + $oBlock->sDownloadLink .= '&fields_advanced=1'; + $aParamsToPost['fields_advance'] = 1; + $oBlock->sChecked = 'CHECKED'; + } else { + $oBlock->sLinkToToggle = $oBlock->sLinkToToggle.'&advanced=1'; + $oBlock->sChecked = ''; + } + $oBlock->sAjaxLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php'; + + $oBlock->sCharsetNotice = false; + $oBlock->sJsonParams = json_encode($aParamsToPost); + return $oBlock; + } + } /** diff --git a/css/backoffice/application/_all.scss b/css/backoffice/application/_all.scss deleted file mode 100644 index 2a658bc1a..000000000 --- a/css/backoffice/application/_all.scss +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * copyright Copyright (C) 2010-2020 Combodo SARL - * license http://opensource.org/licenses/AGPL-3.0 - */ - -@import "display-block/all"; \ No newline at end of file diff --git a/css/backoffice/application/display-block/_all.scss b/css/backoffice/application/display-block/_all.scss deleted file mode 100644 index 2b1c120e8..000000000 --- a/css/backoffice/application/display-block/_all.scss +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * copyright Copyright (C) 2010-2020 Combodo SARL - * license http://opensource.org/licenses/AGPL-3.0 - */ diff --git a/css/backoffice/main.scss b/css/backoffice/main.scss index 55664f9c8..8fc3d7238 100644 --- a/css/backoffice/main.scss +++ b/css/backoffice/main.scss @@ -21,6 +21,5 @@ @import "base/all"; @import "components/all"; @import "layout/all"; -@import "application/all"; @import "pages/all"; @import "themes/all"; diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index a51db6265..13385dd7d 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -242,6 +242,7 @@ return array( 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxBars\\BlockChartAjaxBars' => $baseDir . '/sources/application/UI/DisplayBlock/BlockChartAjaxBars/BlockChartAjaxBars.php', 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxPie\\BlockChartAjaxPie' => $baseDir . '/sources/application/UI/DisplayBlock/BlockChartAjaxPie/BlockChartAjaxPie.php', 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChart\\BlockChart' => $baseDir . '/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php', + 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockCsv\\BlockCsv' => $baseDir . '/sources/application/UI/DisplayBlock/BlockCsv/BlockCsv.php', 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockList\\BlockList' => $baseDir . '/sources/application/UI/DisplayBlock/BlockList/BlockList.php', 'Combodo\\iTop\\Application\\UI\\Helper\\UIHelper' => $baseDir . '/sources/application/UI/Helper/UIHelper.php', 'Combodo\\iTop\\Composer\\iTopComposer' => $baseDir . '/sources/Composer/iTopComposer.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index babc52c82..f558d7b9f 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -472,6 +472,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxBars\\BlockChartAjaxBars' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockChartAjaxBars/BlockChartAjaxBars.php', 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChartAjaxPie\\BlockChartAjaxPie' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockChartAjaxPie/BlockChartAjaxPie.php', 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockChart\\BlockChart' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockChart/BlockChart.php', + 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockCsv\\BlockCsv' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockCsv/BlockCsv.php', 'Combodo\\iTop\\Application\\UI\\DisplayBlock\\BlockList\\BlockList' => __DIR__ . '/../..' . '/sources/application/UI/DisplayBlock/BlockList/BlockList.php', 'Combodo\\iTop\\Application\\UI\\Helper\\UIHelper' => __DIR__ . '/../..' . '/sources/application/UI/Helper/UIHelper.php', 'Combodo\\iTop\\Composer\\iTopComposer' => __DIR__ . '/../..' . '/sources/Composer/iTopComposer.php', diff --git a/pages/UI.php b/pages/UI.php index f9af9ffe1..5b276118e 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -212,47 +212,47 @@ function SetObjectBreadCrumbEntry(DBObject $oObj, WebPage $oPage) function DisplaySearchSet($oP, $oFilter, $bSearchForm = true, $sBaseClass = '', $sFormat = '', $bDoSearch = true, $bSearchFormOpen = true) { //search block - $oBlockForm=null; - if ($bSearchForm) - { + $oBlockForm = null; + if ($bSearchForm) { $aParams = array('open' => $bSearchFormOpen, 'table_id' => '1'); - if (!empty($sBaseClass)) - { + if (!empty($sBaseClass)) { $aParams['baseClass'] = $sBaseClass; } $oBlockForm = new DisplayBlock($oFilter, 'search', false /* Asynchronous */, $aParams); - if (!$bDoSearch) - { + if (!$bDoSearch) { $oBlockForm->Display($oP, 0); } } - if ($bDoSearch) - { - $oBlock = new DisplayBlock($oFilter, 'list', false); + if ($bDoSearch) { + if (strtolower($sFormat) == 'csv') { + $oBlock = new DisplayBlock($oFilter, 'csv', false); + // Adjust the size of the Textarea containing the CSV to fit almost all the remaining space + $oP->add_ready_script(" $('#1>textarea').height($('#1').parent().height() - $('#0').outerHeight() - 30).width( $('#1').parent().width() - 20);"); // adjust the size of the block + } else { + $oBlock = new DisplayBlock($oFilter, 'list', false); - // Breadcrumb - //$iCount = $oBlock->GetDisplayedCount(); - $sPageId = "ui-search-".$oFilter->GetClass(); - $sLabel = MetaModel::GetName($oFilter->GetClass()); - $oP->SetBreadCrumbEntry($sPageId, $sLabel, '', '', 'fas fa-search', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES); + // Breadcrumb + //$iCount = $oBlock->GetDisplayedCount(); + $sPageId = "ui-search-".$oFilter->GetClass(); + $sLabel = MetaModel::GetName($oFilter->GetClass()); + $oP->SetBreadCrumbEntry($sPageId, $sLabel, '', '', 'fas fa-search', iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES); + } if ($bSearchForm) { //add search block $sTableId = utils::ReadParam('_table_id_', null, false, 'raw_data'); - if($sTableId=='') - { + if ($sTableId == '') { $sTableId = 'result_1'; } - $aExtraParams['table_id']=$sTableId; - $oUIBlockForm=$oBlockForm->GetDisplay($oP,'search_1'); + $aExtraParams['table_id'] = $sTableId; + $oUIBlockForm = $oBlockForm->GetDisplay($oP, 'search_1'); //add result block - $oUIBlock=$oBlock->GetDisplay($oP, $sTableId); + $oUIBlock = $oBlock->GetDisplay($oP, $sTableId); $oUIBlock->AddCSSClasses("display_block sf_results_area"); //$oUIBlockForm->AddSubBlock($oUIBlock); $oP->AddUiBlock($oUIBlockForm); $oP->AddUiBlock($oUIBlock); - } - else { + } else { $oBlock->Display($oP, 1); } } diff --git a/sources/application/UI/DisplayBlock/BlockCsv/BlockCsv.php b/sources/application/UI/DisplayBlock/BlockCsv/BlockCsv.php new file mode 100644 index 000000000..279e92087 --- /dev/null +++ b/sources/application/UI/DisplayBlock/BlockCsv/BlockCsv.php @@ -0,0 +1,41 @@ + +
+ + + + + +
{{ 'UI:Download-CSV'|dict_format(oUIBlock.sCsvFile) }}{{ oUIBlock.sCharsetNotice }} + +  {{ 'UI:CSVExport:AdvancedMode'|dict_s }} +
+ {% if oUIBlock.bAdvancedMode %} +

+ {{ 'UI:CSVExport:AdvancedMode+'|dict_s }} +

+ {% endif %} +
+ +
+
+ {{ 'UI:Loading'|dict_s }} +
+
+ + +{% endapply %} \ No newline at end of file diff --git a/templates/application/display-block/block-csv/layout.js.twig b/templates/application/display-block/block-csv/layout.js.twig new file mode 100644 index 000000000..03ade45ff --- /dev/null +++ b/templates/application/display-block/block-csv/layout.js.twig @@ -0,0 +1,12 @@ +{# @copyright Copyright (C) 2010-2020 Combodo SARL #} +{# @license http://opensource.org/licenses/AGPL-3.0 #} +{% apply spaceless %} +$.post( + '{{ oUIBlock.sAjaxLink|raw }}', + {{ oUIBlock.sJsonParams|raw }}, + function(data) { + $('#csv_content').html(data); + $('#csv_content_loading').hide(); + $('#csv_content').show(); + }); +{% endapply %} \ No newline at end of file