Add LSaddon orgchart

A first implementation of this addon which deserves some improvements.
This commit is contained in:
Benjamin Renard 2022-02-22 18:17:43 +01:00
parent bbf40090a9
commit ad38812859
12 changed files with 598 additions and 93 deletions

View file

@ -0,0 +1,72 @@
<?php
/*******************************************************************************
* Copyright (C) 2007 Easter-eggs
* https://ldapsaisie.org
*
* Author: See AUTHORS file in top-level directory.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
/*
***********************************************
* OrgChart configuration
***********************************************
*/
// OrgChart entity object types
$GLOBALS['ORGCHART_ENTITY_OBJECT_TYPES'] = array(
// Object type included in chart and its parameters
'LSpeople' => array(
// Attribute name that contening parent object reference (optional)
'parent_id_attr' => 'lsGodfatherDn',
// Value of the parent attribute : could be 'dn' or another attribute of this type of object.
// Optional, default: 'dn'
// Note: in the chart, all entities are known by their DN. If you specify here an attribute,
// the first object matching with the value of the parent ID attribute will be keeped.
//'parent_id_attr_value' => 'dn',
// Parent object types
// Optional, default: all object types included in the chart
//'parent_object_types' => array('LSpeople', ...),
// Other attributes to load from LDAP : map here keys to attribute. These attributes values
// will be available in chart node template (as array).
'other_attrs' => array(
'name' => 'cn',
),
),
);
// Optional chart root entity
// If defined, all objects found without parent entity will be linked to this root entity. It's
// could be usefull when you have multiple root entities (no support by the d3-org-chart lib used).
// You could define here all information of the root entity and they will be available in the chart
// node template.
$GLOBALS['ORGCHART_ROOT_ENTITY'] = array(
'id' => 'root',
'name' => array('LSexample'),
);
// Chart node template
// The Mustache templating system is used here:
// https://github.com/janl/mustache.js
$GLOBALS['ORGCHART_TEMPLATE'] = <<<EOF
<div class="chart-node"><a href="{{url}}">{{name.0}}</a></div>
EOF;
// Additional CSS files to load on chart page
$GLOBALS['ORGCHART_ADDITIONAL_CSS_FILES'] = array();

View file

@ -0,0 +1,16 @@
div.chart-container {
width: 100vw;
height: 100vh;
}
div.chart-node {
width: 300px;
height: 70px;
border-radius: 10px;
border: 1px solid #E4E2E9;
display: flex;
text-align: center;
justify-content: center;
align-content: center;
flex-direction: column;
}

View file

@ -0,0 +1,285 @@
<?php
/*******************************************************************************
* Copyright (C) 2007 Easter-eggs
* https://ldapsaisie.org
*
* Author: See AUTHORS file in top-level directory.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
// Error messages
// Support
LSerror :: defineError('LSORGCHART_SUPPORT_01',
___("Organizational Chart Support : The global array %{array} is not defined.")
);
LSerror :: defineError('LSORGCHART_SUPPORT_02',
___("Organizational Chart Support : The global variable %{var} is not defined.")
);
/**
* Check support of orgchart addon by LdapSaisie
*
* @author Benjamin Renard <brenard@easter-eggs.com>
*
* @retval boolean true if orgchart addon is totally supported, false in other case
*/
function LSaddon_orgchart_support() {
$retval = True;
$MUST_DEFINE_ARRAY = array(
'ORGCHART_ENTITY_OBJECT_TYPES',
'ORGCHART_ADDITIONAL_CSS_FILES',
);
foreach($MUST_DEFINE_ARRAY as $array) {
if (!isset($GLOBALS[$array]) || !is_array($GLOBALS[$array])) {
LSerror :: addErrorCode('LSORGCHART_SUPPORT_01', $array);
$retval = false;
}
}
$MUST_DEFINE_VAR = array(
'ORGCHART_TEMPLATE',
);
foreach($MUST_DEFINE_VAR as $var) {
if (!isset($GLOBALS[$var])) {
LSerror :: addErrorCode('LSORGCHART_SUPPORT_02', $var);
$retval = false;
}
}
if ($retval) {
$retval = (
LSsession :: registerLSaddonView(
'orgchart',
'orgchart',
_('Organizational chart'),
'organizationalChartPage',
null, // No access crontol
true // Show in menu
) &&
LSsession :: registerLSaddonView(
'orgchart',
'orgchartdata',
_('Organizational chart data'),
'organizationalChartData',
null, // No access crontol
false // Show in menu
)
);
}
return $retval;
}
function organizationalChartPage() {
LStemplate :: assign('template', $GLOBALS['ORGCHART_TEMPLATE']);
LStemplate :: assign('additional_css_files', $GLOBALS['ORGCHART_ADDITIONAL_CSS_FILES']);
LSsession :: setTemplate('organizationalChart.tpl');
}
function organizationalChartData() {
$root_entity = (isset($GLOBALS['ORGCHART_ROOT_ENTITY'])?$GLOBALS['ORGCHART_ROOT_ENTITY']:null);
$objects = array();
$objects_conf = array();
$objects_attr2dn = array();
$objects_attr2dn_need = array();
$requested_attrs = array();
// Load all object types
foreach($GLOBALS['ORGCHART_ENTITY_OBJECT_TYPES'] as $obj_type => $conf) {
if (!LSsession :: loadLSobject($obj_type))
LStemplate :: fatal_error("Fail to load object type '$obj_type'.");
$objects[$obj_type] = array();
$requested_attrs[$obj_type] = array();
$objects_attr2dn[$obj_type] = array();
$objects_attr2dn_need[$obj_type] = array();
$objects_conf[$obj_type] = array();
}
// Load configuration and attributes to request for each object types
foreach($GLOBALS['ORGCHART_ENTITY_OBJECT_TYPES'] as $obj_type => $conf) {
$parent_id_attr = LSconfig :: get('parent_id_attr', '', 'string', $conf);
if ($parent_id_attr) {
if (!$obj_type :: hasAttr($parent_id_attr))
LStemplate :: fatal_error("Object '$obj_type' does not have attribute '$id_attr'.");
$requested_attrs[$obj_type][] = $parent_id_attr;
}
$objects_conf[$obj_type]['parent_id_attr'] = $parent_id_attr;
$objects_conf[$obj_type]['other_attrs'] = LSconfig :: get('other_attrs', array(), 'array', $conf);
foreach($objects_conf[$obj_type]['other_attrs'] as $attr) {
if ($obj_type :: hasAttr($attr)) {
if (!in_array($attr, $requested_attrs))
$requested_attrs[$obj_type][] = $attr;
}
foreach(getFieldInFormat($attr) as $a) {
if (!$obj_type :: hasAttr($a))
LStemplate :: fatal_error("Object '$obj_type' does not have attribute '$a'.");
if (!in_array($a, $attrs))
$requested_attrs[$obj_type][] = $a;
}
}
$parent_id_attr_value = LSconfig :: get('parent_id_attr_value', 'dn', 'string', $conf);
$objects_conf[$obj_type]['parent_id_attr_value'] = $parent_id_attr_value;
$objects_conf[$obj_type]['parent_object_types'] = LSconfig :: get(
'parent_object_types',
array_keys($GLOBALS['ORGCHART_ENTITY_OBJECT_TYPES']),
'array', $conf);
foreach($objects_conf[$obj_type]['parent_object_types'] as $parent_object_type) {
if (!array_key_exists($parent_object_type, $objects))
LStemplate :: fatal_error("Object type '$parent_object_type' not configured for the organizational chart.");
if ($parent_id_attr_value == 'dn') continue;
if (!$parent_object_type :: hasAttr($parent_id_attr_value))
LStemplate :: fatal_error("Object '$parent_object_type' does not have attribute '$parent_id_attr_value'.");
if (!in_array($parent_id_attr_value, $requested_attrs[$parent_object_type]))
$requested_attrs[$parent_object_type][] = $parent_id_attr_value;
if (!in_array($parent_id_attr_value, $objects_attr2dn_need[$parent_object_type])) {
$objects_attr2dn_need[$parent_object_type][] = $parent_id_attr_value;
$objects_attr2dn[$parent_object_type][$parent_id_attr_value] = array();
}
}
// Load optional filter
$objects_conf[$obj_type]['filter'] = LSconfig :: get('filter', '', 'string', $conf);
}
// Load all objects
if (!LSsession :: loadLSclass('LSsearch'))
LStemplate :: fatal_error("Error loading LSsearch class");
foreach($objects_conf as $obj_type => $conf) {
// Compute search parameters
$search_params = array(
'attributes' => $requested_attrs[$obj_type],
);
if ($conf['filter']) {
$search_params['filter'] = $conf['filter'];
}
// Run search
$search = new LSsearch($obj_type, 'orgchart', $search_params);
$search -> run();
// Iter on found entries and store object data in $objects[$obj_type]
foreach($search -> listEntries() as $dn => $entry) {
$data = array(
'type' => $obj_type,
'url' => "object/$obj_type/".urlencode($dn),
'parent_id' => null,
);
// Load parent ID
if ($conf['parent_id_attr']) {
$parent_ids = ensureIsArray($entry->get($conf['parent_id_attr']));
if ($parent_ids) $data['parent_id'] = $parent_ids[0];
}
// Load other attributes values
foreach ($conf['other_attrs'] as $key => $attr)
$data[$key] = ensureIsArray($entry->get($attr));
$objects[$obj_type][$dn] = $data;
// If some object types refer to this one using attribute values,
// store attribute values to DN in $objects_attr2dn[$obj_type][$attr]
foreach($objects_attr2dn_need[$obj_type] as $attr)
foreach(ensureIsArray($entry->get($attr)) as $value)
$objects_attr2dn[$obj_type][$attr][$value] = $dn;
}
}
// Compute list of org chart entities
$entities = array();
$root_entities = array();
foreach($objects_conf as $obj_type => $conf) {
foreach($objects[$obj_type] as $dn => $data) {
// Check parent exist
$data['parentId'] = null;
if ($conf['parent_id_attr'] && $data['parent_id']) {
// Object have a parent
$parent_id = $data['parent_id'];
if ($conf['parent_id_attr_value'] == 'dn') {
// Parent is refer by DN
foreach($conf['parent_object_types'] as $parent_object_type) {
if (array_key_exists($parent_id, $objects[$parent_object_type])) {
$data['parentId'] = $parent_id;
break;
}
}
}
else {
// Parent is refer by one of its attribute value
foreach($conf['parent_object_types'] as $parent_object_type) {
if (array_key_exists($parent_id, $objects_attr2dn[$parent_object_type][$conf['parent_id_attr_value']])) {
$data['parentId'] = $objects_attr2dn[$parent_object_type][$conf['parent_id_attr_value']][$parent_id];
break;
}
}
}
if (is_null($data['parentId'])) {
// Parent not found: use root entity if defined or ignored object
if ($root_entity)
$data['parentId'] = $root_entity['id'];
else
// No root entity: do not add this object from chart
continue;
}
}
elseif ($root_entity && !$data['parent_id']) {
// Object have no parent, but root entity configured : add it
$data['parentId'] = $root_entity['id'];
}
elseif (!$root_entity && !$data['parent_id']) {
// Object have no parent and no root entity configured : store it as root entities
$root_entities[] = $dn;
}
// Remove parent_id and keep only parentId key
unset($data['parent_id']);
// Store DN as chart entity ID
$data['id'] = $dn;
$entities[] = $data;
}
}
if ($root_entity) {
// Root entity configured : add it to chart entities
$entities[] = $root_entity;
}
elseif(count($root_entities) != 1) {
LStemplate :: fatal_error('More than one root entities found : '.implode(' / ', $root_entities));
}
// Adjust content-type and dump entities data as JSON
header('Content-Type: application/json');
echo json_encode(
$entities,
(
$pretty || isset($_REQUEST['pretty'])?
JSON_PRETTY_PRINT:
0
)
);
exit();
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
src/includes/js/d3_7.3.0.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
src/includes/js/mustache_4.2.0.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,21 @@
renderChart = function () {
var chart;
d3.json(
'addon/orgchart/orgchartdata'
).then(data => {
chart = new d3.OrgChart()
.container('.chart-container')
.nodeWidth((d) => 300)
.initialZoom(0.7)
.nodeHeight((d) => 70)
.childrenMargin((d) => 40)
.compactMarginBetween((d) => 15)
.compactMarginPair((d) => 80)
.data(data)
.nodeContent(function (d, i, arr, state) {
var template = document.getElementById('nodeTemplate').innerHTML;
return Mustache.render(template, d.data);
})
.render();
});
};

View file

@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: LdapSaisie\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2021-12-15 15:34+0100\n"
"PO-Revision-Date: 2022-02-22 18:24+0100\n"
"Last-Translator: Benjamin Renard <brenard@zionetrix.net>\n"
"Language-Team: LdapSaisie <ldapsaisie-users@lists.labs.libre-entreprise."
"org>\n"
@ -223,6 +223,24 @@ msgstr ""
"Support POSIX : L'attribut %{dependency} est manquant. Impossible de générer "
"l'attribut %{attr}."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:27
msgid ""
"Organizational Chart Support : The global array %{array} is not defined."
msgstr "Support Organigramme : Le tableau global %{array} n'est pas définie."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:30
msgid ""
"Organizational Chart Support : The global variable %{var} is not defined."
msgstr "Support Organigramme : La variable globale %{var} n'est pas définie."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:67
msgid "Organizational chart"
msgstr "Organigramme"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:75
msgid "Organizational chart data"
msgstr "Données de l'organigramme"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.supann.php:27
msgid "SUPANN Support : The constant %{const} is not defined."
msgstr "Support SUPPAN : La constante %{const} n'est pas définie."
@ -630,9 +648,9 @@ msgstr "Confirmez-vous votre choix ?"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSconfirmBox.php:37
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsmoothbox.php:39
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:74
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:631
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1285
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1431
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:632
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1286
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1432
#: templates/default/recoverpassword.tpl:21
msgid "Validate"
msgstr "Valider"
@ -774,10 +792,10 @@ msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:68
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_supannLabeledValue.php:79
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:177
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1045
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1213
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1298
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1444
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1046
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1214
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1299
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1445
msgid "Modify"
msgstr "Modifier"
@ -1091,7 +1109,7 @@ msgstr ""
"LSformElement_postaladdress : La fonction de génération de l'URL de la carte "
"n'est pas exécutable (%{function})."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_zxcvbn.php:82
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_zxcvbn.php:88
msgid "The security of this password is too weak."
msgstr "La sécurité de ce mot de passe est trop faible."
@ -1142,8 +1160,8 @@ msgid "Your new password has been sent to %{mail}."
msgstr "Votre nouveau mot de passe vous a été envoyé à l'adresse %{mail}."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsession.php:1745
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:156
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:467
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:157
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:468
#: templates/default/select.tpl:29
msgid "Refresh"
msgstr "Rafraîchir"
@ -1743,8 +1761,8 @@ msgstr "Attention"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:69
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:85
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:193
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1061
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1205
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1062
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1206
msgid "Delete"
msgstr "Supprimer"
@ -1754,8 +1772,8 @@ msgid "No object."
msgstr "Aucun objet."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSrelation.php:712
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:449
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:990
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:450
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:991
msgid "New"
msgstr "Nouveau"
@ -1993,14 +2011,14 @@ msgstr ""
"de contacter le support."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:230
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:627
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:628
msgid "Do you really want to execute custom action %{title} on this search ?"
msgstr ""
"Êtes-vous vraiment sûre de vouloir exécuter l'action personnalisée %{title} "
"sur cette recherche ?"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:236
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1425
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1426
msgid ""
"Do you really want to execute custom action %{customAction} on "
"%{objectname} ?"
@ -2201,8 +2219,8 @@ msgid "Display RSS stack."
msgstr "Afficher la file RSS."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattr_ldap_password.php:100
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:580
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1372
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:581
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1373
msgid "undefined"
msgstr "non-définie"
@ -2518,7 +2536,7 @@ msgstr ""
"LSattr_html_select_list : Impossible de récupérer les valeurs possibles de "
"l'attribut %{attr} en utilisant la fonction configurée %{callable}."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_inarray.php:62
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_inarray.php:66
msgid ""
"LSformRule_inarray : Possible values has not been configured to validate "
"data."
@ -2607,14 +2625,14 @@ msgid "Unknown error : %{error}"
msgstr "Erreur inconnu : %{error}"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:169
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1197
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1290
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1436
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1198
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1291
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1437
msgid "View"
msgstr "Voir"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:185
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1053
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1054
msgid "Copy"
msgstr "Copier"
@ -2640,83 +2658,83 @@ msgstr ""
msgid "Home"
msgstr "Accueil"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:150
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:151
msgid "You must provide pattern for global search."
msgstr "Vous devez fournir un mot clé pour les recherches globales."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:455
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:811
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:456
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:812
msgid "Import"
msgstr "Importer"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:460
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:877
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:461
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:878
msgid "Export"
msgstr "Exporter"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:472
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:473
msgid "Reset"
msgstr "Réinitialiser"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:510
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:511
#: templates/default/select.tpl:28 templates/default/global_search.tpl:6
msgid "Search"
msgstr "Rechercher"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:511
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:512
#: templates/default/select.tpl:31
msgid "Approximative search"
msgstr "Recherche approximative"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:512
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:513
#: templates/default/select.tpl:32
msgid "Recursive search"
msgstr "Recherche récursive"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:601
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:602
msgid ""
"The custom action %{title} have been successfully execute on this search."
msgstr ""
"L'action personnalisée %{title} a été correctement exécutée sur cette "
"recherche."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:949
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:950
msgid "Data entry form"
msgstr "Masque de saisie"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:955
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1729
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:956
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1730
msgid "Object has been added."
msgstr "L'objet a été ajouté."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1092
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1093
msgid "My account"
msgstr "Mon compte"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1155
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1901
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1156
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1902
msgid "The object has been partially modified."
msgstr "L'objet a été partiellement modifié."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1158
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1904
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1159
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1905
msgid "The object has been modified successfully."
msgstr "L'objet a bien été modifié."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1273
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1944
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1274
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1945
msgid "%{objectname} has been successfully deleted."
msgstr "%{objectname} a bien été supprimé."
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1282
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1283
msgid "Deleting : %{objectname}"
msgstr "Suppression : %{objectname}"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1283
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1284
msgid "Do you really want to delete <strong>%{displayName}</strong> ?"
msgstr "Voulez-vous vraiment supprimer <strong>%{displayName}</strong> ?"
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1393
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1394
msgid ""
"The custom action %{customAction} have been successfully execute on "
"%{objectname}."

View file

@ -164,6 +164,24 @@ msgid ""
"attribute %{attr}."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:27
msgid ""
"Organizational Chart Support : The global array %{array} is not defined."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:30
msgid ""
"Organizational Chart Support : The global variable %{var} is not defined."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:67
msgid "Organizational chart"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.orgchart.php:75
msgid "Organizational chart data"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.supann.php:27
msgid "SUPANN Support : The constant %{const} is not defined."
msgstr ""
@ -528,9 +546,9 @@ msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSconfirmBox.php:37
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsmoothbox.php:39
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:74
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:631
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1285
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1431
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:632
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1286
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1432
#: templates/default/recoverpassword.tpl:21
msgid "Validate"
msgstr ""
@ -659,10 +677,10 @@ msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:68
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_supannLabeledValue.php:79
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:177
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1045
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1213
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1298
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1444
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1046
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1214
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1299
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1445
msgid "Modify"
msgstr ""
@ -924,7 +942,7 @@ msgid ""
"callabled (%{function})."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_zxcvbn.php:82
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_zxcvbn.php:88
msgid "The security of this password is too weak."
msgstr ""
@ -970,8 +988,8 @@ msgid "Your new password has been sent to %{mail}."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsession.php:1745
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:156
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:467
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:157
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:468
#: templates/default/select.tpl:29
msgid "Refresh"
msgstr ""
@ -1469,8 +1487,8 @@ msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:69
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformElement_select_object.php:85
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:193
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1061
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1205
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1062
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1206
msgid "Delete"
msgstr ""
@ -1480,8 +1498,8 @@ msgid "No object."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSrelation.php:712
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:449
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:990
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:450
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:991
msgid "New"
msgstr ""
@ -1679,12 +1697,12 @@ msgid ""
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:230
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:627
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:628
msgid "Do you really want to execute custom action %{title} on this search ?"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSform.php:236
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1425
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1426
msgid ""
"Do you really want to execute custom action %{customAction} on "
"%{objectname} ?"
@ -1869,8 +1887,8 @@ msgid "Display RSS stack."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSattr_ldap_password.php:100
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:580
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1372
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:581
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1373
msgid "undefined"
msgstr ""
@ -2146,7 +2164,7 @@ msgid ""
"%{attr} using configured function %{callable}."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_inarray.php:62
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSformRule_inarray.php:66
msgid ""
"LSformRule_inarray : Possible values has not been configured to validate "
"data."
@ -2228,14 +2246,14 @@ msgid "Unknown error : %{error}"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:169
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1197
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1290
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1436
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1198
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1291
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1437
msgid "View"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSsearchEntry.php:185
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1053
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1054
msgid "Copy"
msgstr ""
@ -2257,81 +2275,81 @@ msgstr ""
msgid "Home"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:150
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:151
msgid "You must provide pattern for global search."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:455
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:811
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:456
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:812
msgid "Import"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:460
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:877
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:461
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:878
msgid "Export"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:472
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:473
msgid "Reset"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:510
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:511
#: templates/default/select.tpl:28 templates/default/global_search.tpl:6
msgid "Search"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:511
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:512
#: templates/default/select.tpl:31
msgid "Approximative search"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:512
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:513
#: templates/default/select.tpl:32
msgid "Recursive search"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:601
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:602
msgid ""
"The custom action %{title} have been successfully execute on this search."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:949
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:950
msgid "Data entry form"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:955
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1729
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:956
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1730
msgid "Object has been added."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1092
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1093
msgid "My account"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1155
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1901
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1156
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1902
msgid "The object has been partially modified."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1158
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1904
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1159
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1905
msgid "The object has been modified successfully."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1273
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1944
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1274
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1945
msgid "%{objectname} has been successfully deleted."
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1282
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1283
msgid "Deleting : %{objectname}"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1283
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1284
msgid "Do you really want to delete <strong>%{displayName}</strong> ?"
msgstr ""
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1393
#: /home/brenard/dev/ldapsaisie_clean3/src/includes/routes.php:1394
msgid ""
"The custom action %{customAction} have been successfully execute on "
"%{objectname}."

View file

@ -0,0 +1,27 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset={$LSencoding}">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>LdapSaisie{if isset($pagetitle) && $pagetitle} - {$pagetitle|escape:"htmlall"}{/if}</title>
<base href="{$public_root_url}/"/>
<link rel="icon" href="image/favicon" />
<script src="js/d3_7.3.0.min.js" type="text/javascript"></script>
<script src="js/d3-org-chart_2.6.0.min.js" type="text/javascript"></script>
<script src="js/d3-flextree_2.1.2.min.js" type="text/javascript"></script>
<script src="js/mustache_4.2.0.min.js" type="text/javascript"></script>
<script src="js/organizationalChart.js" type="text/javascript"></script>
<script id="nodeTemplate" type="x-tmpl-mustache">{$template}</script>
<link rel="stylesheet" type="text/css" href="{css name='organizationalChart.css'}" title="Normal" />
{foreach $additional_css_files as $file}
<link rel="stylesheet" type="text/css" href="{css name=$file}" title="Normal" />
{/foreach}
</head>
<body onload="renderChart()">
<div class="chart-container"></div>
</body>
</html>