This commit is contained in:
KONE SOREL 2026-02-24 10:38:51 +00:00
parent 44043391fe
commit 25c11083b8

View File

@ -48489,30 +48489,341 @@ function appliquerDataTable() {
}
/**
* Applique une configuration simplifiée (SaaS style) pour les tableaux spéciaux
* Idéal pour les affichages de type "journal" ou "aperçu"
*/
function dataTableSpeciale() {
const $table = $('.tabspeciale');
const codeLangue = $("#codeLangue").val() || "fr_FR";
// Détruire l'instance existante si elle existe
if ($.fn.DataTable.isDataTable($table)) {
$table.DataTable().clear().destroy();
$table.empty(); // Optionnel : vider le contenu si nécessaire
// Sécurité : Vérifier si l'objet DataTables existe
if (typeof $.fn.DataTable === 'undefined') {
console.error("DataTables non chargé.");
return false;
}
// Définition des traductions
const $table = $('.tabspeciale');
// Si le sélecteur ne trouve rien, on arrête pour éviter des erreurs
if ($table.length === 0) return;
// Récupération de la langue (par défaut FR)
const codeLangue = $("#codeLangue").val() || "fr_FR";
// --- NETTOYAGE DE L'INSTANCE EXISTANTE ---
if ($.fn.DataTable.isDataTable($table)) {
// .clear() vide les données, .destroy() supprime l'instance DataTables
$table.DataTable().clear().destroy();
// ATTENTION : Ne pas faire $table.empty() car cela supprime le <thead>
// Si vous voulez vider les lignes manuellement sans casser la structure :
$table.find('tbody').empty();
}
// --- CONFIGURATION DES TRADUCTIONS ---
const langOptions = {
en_US: {
lengthMenu: "Display _MENU_ records per page",
zeroRecords: "Nothing found",
info: "Showing _PAGE_ of _PAGES_",
infoEmpty: "No records",
search: "Search:",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtered from _MAX_ total records)"
},
fr_FR: {
lengthMenu: "Affiche _MENU_ par page",
zeroRecords: "Aucune donnée trouvée",
info: "_PAGE_ sur _PAGES_",
infoEmpty: "Pas d'enregistrement",
search: "Recherche :",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtré de _MAX_ total enregistrements)"
}
};
// --- INITIALISATION ---
try {
$table.DataTable({
destroy: true, // Permet de réinitialiser proprement
responsive: true, // S'adapte aux mobiles
scrollX: true, // Scroll horizontal si nécessaire
scrollY: "60vh", // Hauteur fixe avec scroll interne
pagingType: "full_numbers",
autoWidth: false,
// Paramètres SaaS : on épure l'interface
searching: false, // Cache la barre de recherche
ordering: false, // Désactive le tri (souvent pour les journaux)
lengthChange: false, // Cache le choix "10, 20, 50"
// Langue sélectionnée
language: langOptions[codeLangue] || langOptions.fr_FR
});
/**
* AJUSTEMENT TECHNIQUE
* Force DataTables à recalculer les largeurs de colonnes (important si le
* tableau était caché dans un onglet ou si le scrollY est activé).
*/
setTimeout(function() {
$table.DataTable().columns.adjust().draw();
}, 200);
} catch (err) {
console.error("Erreur lors de l'application DataTable sur .tabspeciale :", err);
return false;
}
}
/**
* Applique une configuration "Mini" pour les petits tableaux (ex: widgets, aperçus)
* Optimisée pour la performance et le rendu SaaS
*/
function dataTableSpecialeMini() {
// Vérification de l'existence de DataTables
if (typeof $.fn.DataTable === 'undefined') return false;
const $oTable = $('.tabspecialemini');
// Si le tableau n'existe pas sur la page, on sort
if ($oTable.length === 0) return;
const codeLangue = $("#codeLangue").val() || "fr_FR";
// --- NETTOYAGE SÉCURISÉ ---
// Correction : Utilisation de $oTable (et non 'table' qui est undefined)
if ($.fn.DataTable.isDataTable($oTable)) {
$oTable.DataTable().clear().destroy();
// On vide le body uniquement pour préserver le thead technique
$oTable.find('tbody').empty();
}
// --- CONFIGURATION DE LA LANGUE ---
const langConfig = {
en_US: {
zeroRecords: "No data",
info: "Page _PAGE_/_PAGES_",
infoEmpty: "",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" }
},
fr_FR: {
zeroRecords: "Aucune donnée",
info: "Page _PAGE_/_PAGES_",
infoEmpty: "",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" }
}
};
// --- INITIALISATION ---
try {
$oTable.DataTable({
destroy: true,
responsive: true,
autoWidth: false,
scrollX: true,
scrollY: "34vh", // Hauteur réduite pour les mini-vues
scrollCollapse: true,
pagingType: "simple_numbers", // Plus compact pour les petits tableaux
// Paramètres SaaS (Interface épurée)
searching: false, // bFilter: false
lengthChange: false, // bLengthChange: false
ordering: true, // On garde le tri pour l'utilité
orderMulti: true,
// Application de la langue
language: langConfig[codeLangue] || langConfig.fr_FR
});
// Ajustement automatique des colonnes après un léger délai
setTimeout(() => {
$oTable.DataTable().columns.adjust().draw();
}, 150);
} catch (err) {
console.error("Erreur dataTableSpecialeMini :", err);
return false;
}
}
/**
* Applique une configuration "Ultra-Mini" (ex: petites listes dans des widgets)
* Correction de l'erreur sur la variable 'table' et optimisation du rendu.
*/
function dataTableMini() {
// Sécurité : Vérifier si DataTables est bien chargé
if (typeof $.fn.DataTable === 'undefined') return false;
const $oTable = $('.tabmini');
// Sortie propre si le tableau n'existe pas
if ($oTable.length === 0) return;
const codeLangue = $("#codeLangue").val() || "fr_FR";
// --- NETTOYAGE SÉCURISÉ ---
// Correction : Remplacement de 'table' (undefined) par '$oTable'
if ($.fn.DataTable.isDataTable($oTable)) {
$oTable.DataTable().clear().destroy();
// On ne vide pas le HTML pour préserver la structure <thead>
$oTable.find('tbody').empty();
}
// --- CONFIGURATION DE LA LANGUE ---
const langConfig = {
en_US: {
zeroRecords: "No data",
info: "_PAGE_ / _PAGES_",
infoEmpty: "",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" }
},
fr_FR: {
zeroRecords: "Aucune donnée",
info: "_PAGE_ / _PAGES_",
infoEmpty: "",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" }
}
};
// --- INITIALISATION ---
try {
$oTable.DataTable({
destroy: true,
responsive: true,
autoWidth: false,
scrollX: true,
scrollY: "20vh", // Hauteur très compacte
scrollCollapse: true, // Réduit la hauteur si peu de données
pageLength: 10, // Force 10 lignes max
// Épurement de l'interface pour le style SaaS
searching: false, // bFilter: false
lengthChange: false, // bLengthChange: false
ordering: true,
orderMulti: true,
pagingType: "numbers", // Style très minimaliste
language: langConfig[codeLangue] || langConfig.fr_FR
});
// Recalcul des colonnes (indispensable pour scrollX/scrollY)
setTimeout(() => {
$oTable.DataTable().columns.adjust().draw();
}, 100);
} catch (err) {
console.error("Erreur dataTableMini :", err);
return false;
}
}
/**
* Applique une configuration standard pour les tableaux de classe .datatab
* Optimisé pour un affichage SaaS avec barre de recherche active (bFilter: true)
*/
function dataTab() {
// Sécurité : Vérifier si DataTables est chargé
if (typeof $.fn.DataTable === 'undefined') return false;
const $oTable = $('.datatab');
// Sortie si aucun tableau trouvé
if ($oTable.length === 0) return;
const codeLangue = $("#codeLangue").val() || "fr_FR";
// --- NETTOYAGE DE L'INSTANCE ---
if ($.fn.DataTable.isDataTable($oTable)) {
// Correction : Utilisation de $oTable (évite l'erreur 'table is undefined')
$oTable.DataTable().clear().destroy();
// Vider le body pour une réinitialisation propre sans toucher au thead
$oTable.find('tbody').empty();
}
// --- CONFIGURATION DES TRADUCTIONS ---
const langConfig = {
en_US: {
lengthMenu: "Display _MENU_ records",
zeroRecords: "Nothing found",
info: "Page _PAGE_ of _PAGES_",
infoEmpty: "No records available",
search: "Search:",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtered from _MAX_ total records)"
},
fr_FR: {
lengthMenu: "Affiche _MENU_ par page",
zeroRecords: "Aucune donnée trouvée",
info: "_PAGE_ sur _PAGES_",
infoEmpty: "Pas d'enregistrement",
search: "Recherche :",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtré de _MAX_ total enregistrements)"
}
};
// --- INITIALISATION ---
try {
$oTable.DataTable({
destroy: true,
responsive: true,
autoWidth: false,
lengthMenu: [10, 50, 100],
scrollX: true,
scrollY: "23vh", // Hauteur fixe définie
scrollCollapse: true,
pagingType: "full_numbers",
searching: true, // bFilter: true (Active la recherche)
// On applique la langue correspondante
language: langConfig[codeLangue] || langConfig.fr_FR
});
// Ajustement des colonnes pour éviter les décalages d'entête
setTimeout(() => {
$oTable.DataTable().columns.adjust().draw();
}, 150);
} catch (err) {
console.error("Erreur dans dataTab :", err);
return false;
}
}
/**
* Applique la configuration DataTable pour les tableaux de filtrage (.datafiltre)
* Correction de l'erreur de variable et optimisation du code
*/
function datafiltre() {
// Sécurité : Vérifier si DataTables est bien chargé
if (typeof $.fn.DataTable === 'undefined') return false;
const $oTable = $('.datafiltre');
// Sortie si aucun tableau trouvé sur la page
if ($oTable.length === 0) return;
const codeLangue = $("#codeLangue").val() || "fr_FR";
// --- NETTOYAGE DE L'INSTANCE EXISTANTE ---
if ($.fn.DataTable.isDataTable($oTable)) {
// Correction : Utilisation de $oTable pour éviter l'erreur "table is undefined"
$oTable.DataTable().clear().destroy();
// On vide le body pour une réinitialisation propre sans altérer le <thead>
$oTable.find('tbody').empty();
}
// --- CONFIGURATION DES TRADUCTIONS (DRY) ---
const langConfig = {
en_US: {
lengthMenu: "Display _MENU_ records per page",
zeroRecords: "Nothing found - sorry",
info: "Showing page _PAGE_ of _PAGES_",
infoEmpty: "No records available",
search: "Search:",
paginate: {
next: "►",
previous: "◄",
first: "|◄",
last: "►|"
},
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtered from _MAX_ total records)"
},
fr_FR: {
@ -48520,426 +48831,114 @@ function dataTableSpeciale() {
zeroRecords: "Désolé - Aucune donnée trouvée",
info: "_PAGE_ sur _PAGES_ pages",
infoEmpty: "Pas d'enregistrement",
search: "Recherche:",
paginate: {
next: "►",
previous: "◄",
first: "|◄",
last: "►|"
},
search: "Recherche :",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtré de _MAX_ total enregistrements)"
}
};
// Définition des lengthMenu selon la langue
const lengthMenuOptions = (codeLangue === "en_US") ? [50, 100, 150] : [20, 50, 100];
// --- INITIALISATION ---
try {
$table.DataTable({
$oTable.DataTable({
destroy: true,
responsive: true,
lengthMenu: lengthMenuOptions,
scrollX: true,
scrollY: "75vh",
pagingType: "full_numbers",
autoWidth: false,
searching: false, // équivalent moderne de bFilter:false
ordering: false,
lengthChange: false, // équivalent moderne de bLengthChange:false
orderMulti: true,
language: langOptions[codeLangue] || langOptions.fr_FR
lengthMenu: [10, 50, 100],
scrollX: true,
scrollY: "23vh", // Hauteur compacte pour les filtres
scrollCollapse: true,
pagingType: "full_numbers",
searching: true, // bFilter: true (Indispensable pour le filtrage)
// On injecte la langue dynamiquement
language: langConfig[codeLangue] || langConfig.fr_FR
});
// Ajuster les colonnes après init
$table.DataTable().columns.adjust().draw();
// Ajustement des colonnes pour un alignement parfait (indispensable avec scrollY)
setTimeout(() => {
$oTable.DataTable().columns.adjust().draw();
}, 150);
} catch (err) {
console.error("Erreur DataTable:", err);
console.error("Erreur dans datafiltre :", err);
return false;
}
}
function dataTableSpecialeMini(){
const oTable = $('.tabspecialemini');
var codeLangue = $("#codeLangue").val();
// Détruire l'instance existante si elle existe
if ($.fn.DataTable.isDataTable(oTable)) {
table.DataTable().destroy();
table.empty(); // Optionnel : vider le contenu si nécessaire
/**
* Applique la configuration DataTable pour les tableaux de filtrage (.filtreTab)
* Correction de l'erreur de variable et unification de la logique multilingue.
*/
function filtreTab() {
// Sécurité : Vérifier si DataTables est bien chargé avant exécution
if (typeof $.fn.DataTable === 'undefined') return false;
const $oTable = $('.filtreTab');
// On quitte la fonction si le tableau n'est pas présent sur la page actuelle
if ($oTable.length === 0) return;
// Détection de la langue avec valeur par défaut
const codeLangue = $("#codeLangue").val() || "fr_FR";
// --- NETTOYAGE SÉCURISÉ ---
// On détruit l'instance existante pour permettre la réinitialisation sans erreur
if ($.fn.DataTable.isDataTable($oTable)) {
// Correction : Utilisation de $oTable (évite l'erreur fatale "table is undefined")
$oTable.DataTable().clear().destroy();
// On vide uniquement le corps du tableau pour garder les entêtes HTML (thead)
$oTable.find('tbody').empty();
}
try{
if(codeLangue=="en_US")
{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 50, 100, 150],
"scrollX": true,
"scrollY": "34vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": false,
"bLengthChange": false,
"orderMulti": true,
"language": {
"lengthMenu":"Display _MENU_ records per page",
"zeroRecords": "Nothing found - sorry",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"search": "Search:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtered from _MAX_ total records)"
}
});
}else{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 50, 100, 150],
"scrollX": true,
"scrollY": "34vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": false,
"bLengthChange": false,
"orderMulti": true,
"language": {
"lengthMenu":"Affiche _MENU_ par page",
"zeroRecords": "Désolé - Aucune donnée trouvée",
"info": "_PAGE_ sur _PAGES_ pages",
"infoEmpty": "Pas d'enregistrement",
"search": "Recherche:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
// --- CONFIGURATION DES TRADUCTIONS (Approche centralisée) ---
const langConfig = {
en_US: {
lengthMenu: "Display _MENU_ records per page",
zeroRecords: "Nothing found - sorry",
info: "Showing page _PAGE_ of _PAGES_",
infoEmpty: "No records available",
search: "Search:",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtered from _MAX_ total records)"
},
fr_FR: {
lengthMenu: "Affiche _MENU_ par page",
zeroRecords: "Désolé - Aucune donnée trouvée",
info: "_PAGE_ sur _PAGES_ pages",
infoEmpty: "Pas d'enregistrement",
search: "Recherche :",
paginate: { next: "►", previous: "◄", first: "|◄", last: "►|" },
infoFiltered: "(filtré de _MAX_ total enregistrements)"
}
};
},
"infoFiltered": "(filtré de _MAX_ total enregistrements)"
}
});
}
//$('.tabspecialemini').columns.adjust().draw();
// --- INITIALISATION ---
try {
$oTable.DataTable({
destroy: true,
responsive: true,
autoWidth: false,
lengthMenu: [10, 50, 100],
scrollX: true,
scrollY: "23vh", // Hauteur compacte pour les zones de filtrage
scrollCollapse: true, // Ajuste la hauteur si peu de résultats
pagingType: "full_numbers",
searching: true, // bFilter: true (Indispensable pour filtrer les données)
// Application dynamique de la langue
language: langConfig[codeLangue] || langConfig.fr_FR
});
}
catch(err){
return false;
}
}
// Ajustement forcé des colonnes pour corriger les décalages visuels
setTimeout(() => {
$oTable.DataTable().columns.adjust().draw();
}, 150);
function dataTableMini(){
const oTable = $('.tabmini');
var codeLangue = $("#codeLangue").val();
// Détruire l'instance existante si elle existe
if ($.fn.DataTable.isDataTable(oTable)) {
table.DataTable().destroy();
table.empty(); // Optionnel : vider le contenu si nécessaire
} catch (err) {
console.error("Erreur dans filtreTab :", err);
return false;
}
try{
if(codeLangue=="en_US")
{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [10],
"scrollX": true,
"scrollY": "20vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": false,
"bLengthChange": false,
"orderMulti": true,
"language": {
"lengthMenu":"Display _MENU_ records per page",
"zeroRecords": "Nothing found - sorry",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"search": "Search:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtered from _MAX_ total records)"
}
});
}else{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [10],
"scrollX": true,
"scrollY": "20vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": false,
"bLengthChange": false,
"orderMulti": true,
"language": {
"lengthMenu":"Affiche _MENU_ par page",
"zeroRecords": "Désolé - Aucune donnée trouvée",
"info": "_PAGE_ sur _PAGES_ pages",
"infoEmpty": "Pas d'enregistrement",
"search": "Recherche:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtré de _MAX_ total enregistrements)"
}
});
}
//$('.tabmini').columns.adjust().draw();
}
catch(err){
return false;
}
}
function dataTab(){
const oTable = $('.datatab');
var codeLangue = $("#codeLangue").val();
// Détruire l'instance existante si elle existe
if ($.fn.DataTable.isDataTable(oTable)) {
table.DataTable().destroy();
table.empty(); // Optionnel : vider le contenu si nécessaire
}
try{
if(codeLangue=="en_US")
{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 10, 50, 100],
"scrollX": true,
"scrollY": "23vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": true,
"language": {
"lengthMenu":"Display _MENU_ records per page",
"zeroRecords": "Nothing found - sorry",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"search": "Search:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtered from _MAX_ total records)"
}
});
}else{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 10, 50, 100],
"scrollX": true,
"scrollY": "23vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": true,
"language": {
"lengthMenu":"Affiche _MENU_ par page",
"zeroRecords": "Désolé - Aucune donnée trouvée",
"info": "_PAGE_ sur _PAGES_ pages",
"infoEmpty": "Pas d'enregistrement",
"search": "Recherche:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtré de _MAX_ total enregistrements)"
}
});
}
}
catch(err){
return false;
}
}
function datafiltre(){
const oTable = $('.datafiltre');
var codeLangue = $("#codeLangue").val();
// Détruire l'instance existante si elle existe
if ($.fn.DataTable.isDataTable(oTable)) {
table.DataTable().destroy();
table.empty(); // Optionnel : vider le contenu si nécessaire
}
try{
if(codeLangue=="en_US")
{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 10, 50, 100],
"scrollX": true,
"scrollY": "23vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": true,
"language": {
"lengthMenu":"Display _MENU_ records per page",
"zeroRecords": "Nothing found - sorry",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"search": "Search:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtered from _MAX_ total records)"
}
});
}else{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 10, 50, 100],
"scrollX": true,
"scrollY": "23vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": true,
"language": {
"lengthMenu":"Affiche _MENU_ par page",
"zeroRecords": "Désolé - Aucune donnée trouvée",
"info": "_PAGE_ sur _PAGES_ pages",
"infoEmpty": "Pas d'enregistrement",
"search": "Recherche:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtré de _MAX_ total enregistrements)"
}
});
}
}
catch(err){
return false;
}
}
function filtreTab(){
const oTable = $('.filtreTab');
var codeLangue = $("#codeLangue").val();
// Détruire l'instance existante si elle existe
if ($.fn.DataTable.isDataTable(oTable)) {
table.DataTable().destroy();
table.empty(); // Optionnel : vider le contenu si nécessaire
}
try{
if(codeLangue=="en_US")
{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 10, 50, 100],
"scrollX": true,
"scrollY": "23vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": true,
"language": {
"lengthMenu":"Display _MENU_ records per page",
"zeroRecords": "Nothing found - sorry",
"info": "Showing page _PAGE_ of _PAGES_",
"infoEmpty": "No records available",
"search": "Search:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtered from _MAX_ total records)"
}
});
}else{
oTable.DataTable({
destroy: true,
responsive: true,
"lengthMenu": [ 10, 50, 100],
"scrollX": true,
"scrollY": "23vh",
"pagingType": "full_numbers",
"autoWidth": false,
"bFilter": true,
"language": {
"lengthMenu":"Affiche _MENU_ par page",
"zeroRecords": "Désolé - Aucune donnée trouvée",
"info": "_PAGE_ sur _PAGES_ pages",
"infoEmpty": "Pas d'enregistrement",
"search": "Recherche:",
"paginate": {
"next": "►",
"previous": "◄",
"first": "|◄",
"last": "►|"
},
"infoFiltered": "(filtré de _MAX_ total enregistrements)"
}
});
}
}
catch(err){
return false;
}
}
function datatab_plus(){