diff --git a/.easya_info.json b/.easya_info.json new file mode 100644 index 0000000..75597a4 --- /dev/null +++ b/.easya_info.json @@ -0,0 +1,4 @@ +{ + "dlb_min_version": 3, + "php_min_version": 5 +} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..70cee73 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,3 @@ +include: + - project: "opendsi/ci-templates" + file: "/dolibarr/module/main.yml" \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md index 29cc8fd..80ffd87 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -2,34 +2,54 @@ ## Unreleased -## 1.8 + + +## release 1.9 +- FIX : définition d'une valeur par défaut si aucun titre trouvé pour éviter une erreur sur la fonction trim - *14/03/2025* - 1.9.3 +- FIX : Add compatibility with conf MAIN_CHECKBOX_LEFT_COLUMN - *20/01/2024* - 1.9.2 +- FIX : COMPAT 21 - *10/12/2024* - 1.9.1 +- FIX : Nettoyage et compatibilité Dolibarr 20 - *02/08/2024* - 1.9.1 +- NEW : DA025083 - Création d'un hook listInCSVFooterContext permettant à des modules externes d'utiliser ListInCSV. - *11/06/2024* - 1.9.0 + +## release 1.8 +- FIX : DA024994 - Problème de sélection sur la liste des demandes de congés (car elle contient des valeurs dans des inputs) - *21/05/2024* - 1.8.4 +- FIX : object test - *25/03/2024* - 1.8.3 +- FIX : Compat agefodd session onglet participant sur tableau stagiaire *20/03/2024* - 1.8.2 +- FIX : Module logo Image *18/12/2023* - 1.8.1 - FIX : Compat v19 et php8.2 *07/10/2023* - 1.8.0 -## 1.7 +## release 1.7 + - NEW : Ajout de la possibilité d'exporter la liste des prix clients *07/10/2023* - 1.7.0 -## 1.6 +## release 1.6 + - NEW : Ajout icône listincsv sur objets référents produit et tiers *07/02/2023* - 1.6.0 -## 1.5 +## release 1.5 + - NEW : Ajout de la class TechATM pour l'affichage de la page "A propos" *10/05/2022* 1.15.0 -## 1.4 +## release 1.4 + - FIX: Family name - *02/06/2022* - 1.4.3 - FIX: Delete Trigger - *02/06/2022* - 1.4.2 - FIX: context detection - *15/03/2022* - 1.4.1 - NEW: Include Dolibarr V13 stock to date - *28/02/2022* - 1.4.0 -## 1.3 +## release 1.3 + - FIX: Appel de `call_trigger()` sur un non-objet - *08/10/2021* - 1.3.1 - NEW: Déclenchement d'un trigger sur export d'un fichier avec listincsv - *19/05/2021* - 1.3.0 -## 1.2 +## release 1.2 + - FIX: La liste ne s'exporte plus - *20/05/2021* - 1.2.4 - FIX: Les champs de type "case à cocher" ne sont pas exportés - *17/05/2021* - 1.2.3 - FIX: Suppression du dossier Box ainsi que tu fichier box *11/05/2021* - 1.2.2 - FIX: $_SESSION devient newToken() *11/05/2021* - 1.2.1 - NEW: Déplacement du code qui crée le boutton vert "CSV" pour utilisation dans des modules externes avec un contexte ajax *06/05/2021* - 1.2.0 -## 1.1 +## release 1.1 + - NEW: Ajout d'une gestion de récupération des informations via un autre paramètre que l'action du formulaire le plus proche *06/05/2021* - 1.1.0 diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..77fee73 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.9.3 diff --git a/backport/v19/core/class/commonhookactions.class.php b/backport/v19/core/class/commonhookactions.class.php index c16585d..5496f33 100644 --- a/backport/v19/core/class/commonhookactions.class.php +++ b/backport/v19/core/class/commonhookactions.class.php @@ -25,9 +25,9 @@ */ -if (file_exists(DOL_DOCUMENT_ROOT . '/htdocs/core/class/commonhookactions.class.php')){ +if (file_exists(DOL_DOCUMENT_ROOT . '/core/class/commonhookactions.class.php')){ - require_once DOL_DOCUMENT_ROOT . '/htdocs/core/class/commonhookactions.class.php'; + require_once DOL_DOCUMENT_ROOT . '/core/class/commonhookactions.class.php'; /** * Parent class of all other hook actions classes */ diff --git a/class/actions_listincsv.class.php b/class/actions_listincsv.class.php index 2e288d6..339b84f 100644 --- a/class/actions_listincsv.class.php +++ b/class/actions_listincsv.class.php @@ -17,10 +17,10 @@ */ /** - * \file class/actions_listincsv.class.php + * \file class/actions_listincsv.class.php * \ingroup listincsv * \brief This file is an example hook overload class file - * Put some comments here + * Put some comments here */ require_once __DIR__ . '/../backport/v19/core/class/commonhookactions.class.php'; @@ -29,194 +29,247 @@ */ class ActionsListInCSV extends \listincsv\RetroCompatCommonHookActions { - /** - * @var array Hook results. Propagated to $hookmanager->resArray for later reuse - */ - public $results = array(); - - /** - * @var string String displayed by executeHook() immediately after return - */ - public $resprints; - - /** - * @var array Errors - */ - public $errors = array(); - - /** - * Constructor - */ - public function __construct() - { - } - - /** - * doActions - * - * @param array() $parameters Hook metadatas (context, etc...) - * @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) - * @param string &$action Current action (if set). Generally create or edit or null - * @param HookManager $hookmanager Hook manager propagated to allow calling another hook - * @return int < 0 on error, 0 on success, 1 to replace standard code - */ - function doActions($parameters, &$object, &$action, $hookmanager) { - - global $db, $user; - - if(GETPOSTISSET('exportlistincsv', 'bool') && method_exists($object, 'call_trigger')) { - $object->call_trigger('LISTINCSV_EXPORT_FILE_'.strtoupper($object->element), $user); - } - - } - - /** - * printCommonFooter - * - * @param array() $parameters Hook metadatas (context, etc...) - * @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) - * @param string &$action Current action (if set). Generally create or edit or null - * @param HookManager $hookmanager Hook manager propagated to allow calling another hook - * @return int < 0 on error, 0 on success, 1 to replace standard code - */ - function printCommonFooter($parameters, &$object, &$action, $hookmanager) - { - $TContext = explode(':', $parameters['context']); - $context_list = preg_grep('/(.*list$)/i', $TContext); + /** + * @var array Hook results. Propagated to $hookmanager->resArray for later reuse + */ + public $results = array(); + + /** + * @var string String displayed by executeHook() immediately after return + */ + public $resprints; + + /** + * @var array Errors + */ + public $errors = array(); + + /** + * Constructor + */ + public function __construct() { + } + + /** + * doActions + * + * @param array() $parameters Hook metadatas (context, etc...) + * @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string &$action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + function doActions($parameters, &$object, &$action, $hookmanager) { + + global $db, $user; + + if (isset($object) && GETPOSTISSET('exportlistincsv', 'bool') && is_object($object) && method_exists($object, 'call_trigger')) { + $object->call_trigger('LISTINCSV_EXPORT_FILE_' . strtoupper($object->element), $user); + } + } + + /** + * printCommonFooter + * + * @param array() $parameters Hook metadatas (context, etc...) + * @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string &$action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + function printCommonFooter($parameters, &$object, &$action, $hookmanager) { + $TContext = explode(':', $parameters['context']); + $context_list = preg_grep('/(.*list$)/i', $TContext); // Gestion des objets référents produits - if(empty($context_list)) { + if (empty($context_list)) { $context_list = preg_grep('/(productstats.*)/i', $TContext); } // Gestion des écrans objets référents tiers - if(empty($context_list)) { + if (empty($context_list)) { $context_list = preg_grep('/(consumptionthirdparty)/i', $TContext); } // Gestion des écrans objets référents tiers - if(empty($context_list)) { + if (empty($context_list)) { $context_list = preg_grep('/(stockatdate)/i', $TContext); } // Gestion des écrans objets référents tiers - if(empty($context_list)) { + if (empty($context_list)) { $context_list = preg_grep('/(thirdpartycustomerprice)/i', $TContext); } + if (empty($context_list)) { + $context_list = preg_grep('/(agefoddsessionsubscribers)/i', $TContext); + } + + // Permettre à d'autres modules externes d'utiliser listInCSV + $parameters['context_list'] = &$context_list; + $reshook = $hookmanager->executeHooks('listInCSVFooterContext', $parameters); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } - if (!empty($context_list)) - { - global $langs, $user, $conf; - $langs->load('listincsv@listincsv'); - - if(!empty($user->hasRight('listincsv', 'export'))) { - - require_once __DIR__ . './../lib/listincsv.lib.php'; - - $pathtojs = dol_buildpath('/listincsv/js/listincsv.js.php',1); - - $download = getListInCSVDownloadLink(); - - $socid = GETPOST('socid'); - if(empty($socid)) $socid = 0; - - // Inclusion d'un JS qui va permettre de télécharger la liste - ?> - - + - + $table.find('th:last-child, td:last-child'+extraslectorfilter).each(function(index) { + $(this).find('dl').remove(); + if ($(search).length > 0 && $(this).closest('table').hasClass('liste')) { + $(this).remove(); // Dans les listes ne contenant pas de recherche, il ne faut pas supprimer la dernière colonne + } + }); + + $table.find('th:first-child, td:first-child'+extraslectorfilter).each(function(index) { + $(this).find('dl').remove(); + if ($(search).length > 0 && $(this).closest('table').hasClass('liste')) { + $(this).remove(); // Dans les listes ne contenant pas de recherche, il ne faut pas supprimer la dernière colonne + } + }); + + + // Suppression de la ligne TOTAL en pied de tableau + if (varsFromPHP.conf['LISTINCSV_DONT_REMOVE_TOTAL']) { + $table.find('tr.liste_total').remove(); + } + + //Suppression des espaces pour les nombres + if (varsFromPHP.conf['LISTINCSV_DELETESPACEFROMNUMBER']) { + $table.find('td').each(function (e) { + let nbWthtSpace = $(this).text().replace(/ /g, '').replace(/\xa0/g, ''); + let commaToPoint = nbWthtSpace.replace(',', '.'); + if ($.isNumeric(commaToPoint)) $(this).html(nbWthtSpace); + }); + } + + // Remplacement des sous-table par leur valeur text(), notamment pour la ref dans les listes de propales, factures... + $table.find('td > table').map(function (i, cell) { + $cell = $(cell); + $cell.html($cell.text()); + }); + + // Transformation de la table liste en CSV + téléchargement + var args = [$table, 'export.csv']; + exportTableToCSV.apply($self, args); + + $('#dialogforpopup').dialog('close'); + }); + } + }); + }); + }; + + $(document).ready(() => listInCSVMain()); + + + * Copyright (C) 2015 ATM Consulting + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file class/actions_listincsv.class.php + * \ingroup listincsv + * \brief This file is an example hook overload class file + * Put some comments here + */ +require_once __DIR__ . '/../backport/v19/core/class/commonhookactions.class.php'; + +/** + * Class ActionsListInCSV + */ +class ActionsListInCSV extends \listincsv\RetroCompatCommonHookActions +{ + /** + * @var array Hook results. Propagated to $hookmanager->resArray for later reuse + */ + public $results = array(); + + /** + * @var string String displayed by executeHook() immediately after return + */ + public $resprints; + + /** + * @var array Errors + */ + public $errors = array(); + + /** + * Constructor + */ + public function __construct() { + } + + /** + * doActions + * + * @param array() $parameters Hook metadatas (context, etc...) + * @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string &$action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + function doActions($parameters, &$object, &$action, $hookmanager) { + + global $db, $user; + + if (GETPOSTISSET('exportlistincsv', 'bool') && is_object($object) && method_exists($object, 'call_trigger')) { + $object->call_trigger('LISTINCSV_EXPORT_FILE_' . strtoupper($object->element), $user); + } + } + + /** + * printCommonFooter + * + * @param array() $parameters Hook metadatas (context, etc...) + * @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string &$action Current action (if set). Generally create or edit or null + * @param HookManager $hookmanager Hook manager propagated to allow calling another hook + * @return int < 0 on error, 0 on success, 1 to replace standard code + */ + function printCommonFooter($parameters, &$object, &$action, $hookmanager) { + $TContext = explode(':', $parameters['context']); + $context_list = preg_grep('/(.*list$)/i', $TContext); + + // Gestion des objets référents produits + if (empty($context_list)) { + $context_list = preg_grep('/(productstats.*)/i', $TContext); + } + + // Gestion des écrans objets référents tiers + if (empty($context_list)) { + $context_list = preg_grep('/(consumptionthirdparty)/i', $TContext); + } + + // Gestion des écrans objets référents tiers + if (empty($context_list)) { + $context_list = preg_grep('/(stockatdate)/i', $TContext); + } + + // Gestion des écrans objets référents tiers + if (empty($context_list)) { + $context_list = preg_grep('/(thirdpartycustomerprice)/i', $TContext); + } + if (empty($context_list)) { + $context_list = preg_grep('/(agefoddsessionsubscribers)/i', $TContext); + } + + // Permettre à d'autres modules externes d'utiliser listInCSV + $parameters['context_list'] = &$context_list; + $reshook = $hookmanager->executeHooks('listInCSVFooterContext', $parameters); + if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + } + + if (! empty($context_list)) { + global $langs, $user, $conf; + $langs->load('listincsv@listincsv'); + + if (! empty($user->hasRight('listincsv', 'export'))) { + + require_once __DIR__ . './../lib/listincsv.lib.php'; + + $pathtojs = dol_buildpath('/listincsv/js/listincsv.js.php', 1); + + $download = getListInCSVDownloadLink(); + + $socid = GETPOST('socid'); + if (empty($socid)) $socid = 0; + + $varsForJs = array( + 'downloadButton' => $download, + 'TContexts' => explode(':', $parameters['context']), + 'socid' => $socid, + 'langs' => array( + 'FileGenerationInProgress' => $langs->trans('FileGenerationInProgress') + ), + 'conf' => array( + 'LISTINCSV_DONT_REMOVE_TOTAL' => ! empty(getDolGlobalInt('LISTINCSV_DONT_REMOVE_TOTAL')), + 'LISTINCSV_DELETESPACEFROMNUMBER' => ! empty(getDolGlobalInt('LISTINCSV_DELETESPACEFROMNUMBER')) + ), + ); + // Inclusion d'un JS qui va permettre de télécharger la liste + ?> + + + description = "ListInCSV permet d'exporter en CSV une liste Dolibarr telle qu'elle apparaît à l'écran."; // Possible values for version are: 'development', 'experimental', 'dolibarr' or version - $this->version = '1.8.0'; + $this->version = '1.9.3'; // Url to the file with your last numberversion of this module require_once __DIR__ . '/../../class/techatm.class.php'; @@ -73,7 +73,7 @@ function __construct($db) // Name of image file used for this module. // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' - $this->picto='listincsv@listincsv'; + $this->picto='modulelistincsv@listincsv'; // Defined all module parts (triggers, login, substitutions, menus, css, etc...) // for default path (eg: /listincsv/core/xxxxx) (0=disable, 1=enable) @@ -150,14 +150,14 @@ function __construct($db) $this->tabs = array(); // Dictionaries - if (! isset($conf->listincsv->enabled)) + if (! isModEnabled("listincsv")) { $conf->listincsv=new stdClass(); $conf->listincsv->enabled=0; } $this->dictionaries=array(); /* Example: - if (! isset($conf->listincsv->enabled)) $conf->listincsv->enabled=0; // This is to avoid warnings + if (! isModEnabled("listincsv")) $conf->listincsv->enabled=0; // This is to avoid warnings $this->dictionaries=array( 'langs'=>'mylangfile@listincsv', 'tabname'=>array(MAIN_DB_PREFIX."table1",MAIN_DB_PREFIX."table2",MAIN_DB_PREFIX."table3"), // List of tables we want to see into dictonnary editor @@ -168,7 +168,7 @@ function __construct($db) 'tabfieldvalue'=>array("code,label","code,label","code,label"), // List of fields (list of fields to edit a record) 'tabfieldinsert'=>array("code,label","code,label","code,label"), // List of fields (list of fields for insert) 'tabrowid'=>array("rowid","rowid","rowid"), // Name of columns with primary key (try to always name it 'rowid') - 'tabcond'=>array($conf->listincsv->enabled,$conf->listincsv->enabled,$conf->listincsv->enabled) // Condition to show each dictionary + 'tabcond'=>array(isModEnabled("listincsv"),isModEnabled("listincsv"),isModEnabled("listincsv")) // Condition to show each dictionary ); */ @@ -187,13 +187,13 @@ function __construct($db) // $this->rights[$r][0] = $this->numero . $r; // Permission id (must not be already used) // $this->rights[$r][1] = 'Permision label'; // Permission label // $this->rights[$r][3] = 1; // Permission by default for new user (0/1) - // $this->rights[$r][4] = 'level1'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2) - // $this->rights[$r][5] = 'level2'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2) + // $this->rights[$r][4] = 'level1'; // In php code, permission will be checked by test if ($user->hasRight("permkey", "level1", "level2")) + // $this->rights[$r][5] = 'level2'; // In php code, permission will be checked by test if ($user->hasRight("permkey", "level1", "level2")) // $r++; $this->rights[$r][0] = $this->numero . $r; // Permission id (must not be already used) $this->rights[$r][1] = $langs->trans('LISTINCSVExport'); // Permission label $this->rights[$r][3] = 0; // Permission by default for new user (0/1) - $this->rights[$r][4] = 'export'; // In php code, permission will be checked by test if ($user->rights->permkey->level1) + $this->rights[$r][4] = 'export'; // In php code, permission will be checked by test if ($user->hasRight("permkey", "level1")) $r++; @@ -212,8 +212,8 @@ function __construct($db) // 'url'=>'/listincsv/pagetop.php', // 'langs'=>'mylangfile@listincsv', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. // 'position'=>100, - // 'enabled'=>'$conf->listincsv->enabled', // Define condition to show or hide menu entry. Use '$conf->listincsv->enabled' if entry must be visible if module is enabled. - // 'perms'=>'1', // Use 'perms'=>'$user->rights->listincsv->level1->level2' if you want your menu with a permission rules + // 'enabled'=>'isModEnabled("listincsv")', // Define condition to show or hide menu entry. Use 'isModEnabled("listincsv")' if entry must be visible if module is enabled. + // 'perms'=>'1', // Use 'perms'=>'$user->hasRight("listincsv", "level1", "level2")' if you want your menu with a permission rules // 'target'=>'', // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both // $r++; @@ -228,7 +228,7 @@ function __construct($db) // 'langs'=>'mylangfile@listincsv', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. // 'position'=>100, // 'enabled'=>'$conf->listincsv->enabled', // Define condition to show or hide menu entry. Use '$conf->listincsv->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. - // 'perms'=>'1', // Use 'perms'=>'$user->rights->listincsv->level1->level2' if you want your menu with a permission rules + // 'perms'=>'1', // Use 'perms'=>'$user->hasRight("listincsv", "level1", "level2")' if you want your menu with a permission rules // 'target'=>'', // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both // $r++; diff --git a/img/logo list in csv.svg b/img/logo list in csv.svg new file mode 100644 index 0000000..5b1c0fa --- /dev/null +++ b/img/logo list in csv.svg @@ -0,0 +1,90 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/img/object_modulelistincsv.png b/img/object_modulelistincsv.png new file mode 100644 index 0000000..2cfdf03 Binary files /dev/null and b/img/object_modulelistincsv.png differ diff --git a/js/listincsv.js.php b/js/listincsv.js.php index 62a6ec9..b28775e 100644 --- a/js/listincsv.js.php +++ b/js/listincsv.js.php @@ -19,8 +19,8 @@ */ /** - * \file htdocs/listincsv/js/lib_head.js.php - * \brief File that include javascript functions (included if option use_javascript activated) + * \file /listincsv/js/listincsv.js.php + * \brief Functions for Dolibarr module ListInCSV * JQuery (providing object $) and JQuery-UI (providing $datepicker) libraries must be loaded before this file. */ @@ -86,11 +86,14 @@ function exportTableToCSV($table, filename) { let $colFirstChild = $col.children().first(); if ($col.find("span.linkobject:not(.hideobject)").length > 0) { // Fix sur liste produit si conf MAIN_DIRECT_STATUS_UPDATE active - text = $col.find("span.linkobject:not(.hideobject)").children().first().attr('title').trim(); + text = ($col.find("span.linkobject:not(.hideobject)").children().first().attr('title') || "").trim(); } else if ($col.find('a').length > 0 && $col.find('a')[0].href.indexOf('mailto:') == 0) { // Fix mails tronqués dans les listes par dol_trunc dans la fonction dol_print_email link=$col.find('a')[0].href; text = link.substr(7); + } else if ($col.find('input').length > 0 && $col.find('input').prop('type') === 'text') { + // Fix DA024994 liste avec des inputs + text=$col.find('input').val(); } else text = $col.text().trim(); // Spécifique pour "nettoyer" les données @@ -115,6 +118,7 @@ function exportTableToCSV($table, filename) { .split(tmpRowDelim).join(rowDelim) .split(tmpColDelim).join(colDelim) + '"'; + // Deliberate 'false', see comment below if (false && window.navigator.msSaveBlob) { diff --git a/langs/es_MX/listincsv.lang b/langs/es_MX/listincsv.lang new file mode 100644 index 0000000..190313f --- /dev/null +++ b/langs/es_MX/listincsv.lang @@ -0,0 +1,13 @@ +Module104856Name = Lista en CSV +Module104856Desc = Agrega un ícono que le permite descargar listas en formato CSV + +ATMAbout = Este módulo fue desarrollado por ATM Consulting
Puede encontrar la documentación en nuestro wiki

Para cualquier pregunta técnica o comentario, contáctenos en support@atm-consulting.fr

Para cualquier pregunta comercial, contáctenos en contact@atm-consulting.fr o +33 9 77 19 50 70

Encuentre nuestros otros módulos en Dolistore + +ListInCSVSetup = Configuración del módulo Lista en CSV +ListInCSVAbout = Acerca del módulo Lista en CSV + +NoSetupAvailable = No es necesaria ninguna configuración. Ahora está disponible un ícono junto al título de cada lista que le permite descargarla en un archivo CSV. + +FileGenerationInProgress = Generación del archivo CSV en curso. +LISTINCSVExport=Permitir exportación de listas en CSV +LISTINCSV_DELETESPACEFROMNUMBER=Eliminar espacios contenidos en números