From 914ea26b5391c24b66186998096d46e84ea2b260 Mon Sep 17 00:00:00 2001 From: Theo Date: Sat, 23 Oct 2021 17:07:43 +0200 Subject: [PATCH] [DigiriskElement] add: digirisk element dynamic organization --- core/modules/modDigiriskDolibarr.class.php | 15 + css/digiriskdolibarr.css | 265 +++++++++++++++- css/scss/page/_page-ut-gp-organization.scss | 263 ++++++++++++++++ digiriskelement_organization.php | 333 ++++++++++++++++++++ js/digiriskdolibarr.js.php | 131 +++++++- lib/digiriskdolibarr_function.lib.php | 90 ++++++ 6 files changed, 1093 insertions(+), 4 deletions(-) create mode 100644 css/scss/page/_page-ut-gp-organization.scss create mode 100644 digiriskelement_organization.php diff --git a/core/modules/modDigiriskDolibarr.class.php b/core/modules/modDigiriskDolibarr.class.php index 1b5dda0b6..2ab3b7c64 100644 --- a/core/modules/modDigiriskDolibarr.class.php +++ b/core/modules/modDigiriskDolibarr.class.php @@ -611,6 +611,21 @@ public function __construct($db) 'user'=>0, // 0=Menu for internal users, 1=external users, 2=both ); + $this->menu[$r++]=array( + 'fk_menu'=>'fk_mainmenu=digiriskdolibarr', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'left', // This is a Left menu entry + 'titre'=>' ' . $langs->trans('GPUTOrganisation'), + 'mainmenu'=>'digiriskdolibarr', + 'leftmenu'=>'digiriskstandard', + 'url'=>'/digiriskdolibarr/digiriskelement_organization.php', + 'langs'=>'digiriskdolibarr@digiriskdolibarr', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>48520+$r, + 'enabled'=>'$conf->digiriskdolibarr->enabled', // Define condition to show or hide menu entry. Use '$conf->digiriskdolibarr->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + 'perms'=>'$user->rights->digiriskdolibarr->riskassessmentdocument->read', // Use 'perms'=>'$user->rights->digiriskdolibarr->level1->level2' if you want your menu with a permission rules + 'target'=>'', + 'user'=>0, // 0=Menu for internal users, 1=external users, 2=both + ); + $this->menu[$r++]=array( 'fk_menu'=>'fk_mainmenu=digiriskdolibarr', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode 'type'=>'left', // This is a Left menu entry diff --git a/css/digiriskdolibarr.css b/css/digiriskdolibarr.css index 0bddd11ba..784364ca9 100644 --- a/css/digiriskdolibarr.css +++ b/css/digiriskdolibarr.css @@ -3490,4 +3490,267 @@ td > .risk-evaluation-container { .dropdown-toggle::after { display: none; -} \ No newline at end of file +} + +/** UT / GP Organization */ +.page-ut-gp-list .organization { + position: absolute; + height: 100%; + top: 0; + padding-top: 50px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-box-shadow: none; + box-shadow: none; +} +.page-ut-gp-list .organization .side-nav-responsive { + display: none; +} +.page-ut-gp-list .organization #id-left { + width: 300px; + padding-top: 0; +} +.page-ut-gp-list .organization .digirisk-wrap { + padding: 0 !important; +} +.page-ut-gp-list .organization .navigation-container { + max-height: 1000px; + overflow-y: auto; +} +.page-ut-gp-list .organization .add-container { + position: absolute; + right: 0; + bottom: 5px; + opacity: 0; + pointer-events: none; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} + +/** Header */ +.page-ut-gp-list .organization .society-header { + padding-top: 27px; + position: relative; + padding-left: 10px; + padding-right: 10px; +} +.page-ut-gp-list .organization .society-header .title { + font-weight: 700; +} +.page-ut-gp-list .organization .society-header .linkElement { + line-height: 1; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding-bottom: 10px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; +} +.page-ut-gp-list .organization .society-header:hover .add-container { + opacity: 1; + pointer-events: all; +} + +/** Toolbar */ +.page-ut-gp-list .organization .toolbar { + padding-left: 10px; + padding-right: 10px; +} +.page-ut-gp-list .organization .toolbar .toggle-plus, .page-ut-gp-list .organization .toolbar .toggle-minus { + display: inline-block; + padding: 3px; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + color: rgba(0, 0, 0, 0.6); +} +.page-ut-gp-list .organization .toolbar .toggle-plus:hover, .page-ut-gp-list .organization .toolbar .toggle-minus:hover { + cursor: pointer; + opacity: 0.6; +} + +/** Content */ +.page-ut-gp-list .organization .workunit-list { + padding-left: 0; + /** Toggle */ +} +.page-ut-gp-list .organization .workunit-list ul, .page-ut-gp-list .organization .workunit-list li { + list-style-type: none; + margin: 0; +} +.page-ut-gp-list .organization .workunit-list .unit-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + position: relative; +} +.page-ut-gp-list .organization .workunit-list .unit-container:hover .add-container { + opacity: 1; + pointer-events: all; +} +.page-ut-gp-list .organization .workunit-list .unit-container .toggle-unit { + color: rgba(0, 0, 0, 0.6); + line-height: 40px; + font-size: 18px; + min-width: 30px; + width: 30px; + text-align: center; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +.page-ut-gp-list .organization .workunit-list .unit-container .toggle-unit:hover { + cursor: pointer; +} +.page-ut-gp-list .organization .workunit-list .unit-container .toggle-unit .toggle-icon { + line-height: 40px; +} +.page-ut-gp-list .organization .workunit-list .unit-container .spacer { + position: relative; + min-width: 30px; + width: 30px; +} +.page-ut-gp-list .organization .workunit-list .unit-container .spacer::before { + display: block; + position: absolute; + content: ""; + height: 1px; + left: 0; + right: 10px; + top: 20px; + background: rgba(0, 0, 0, 0.3); +} +.page-ut-gp-list .organization .workunit-list .unit-container .photodigiriskdolibarr { + display: block; + width: 40px; + min-width: 40px; + height: 40px; + position: relative; + background: #fff; + text-align: center; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title { + width: 100%; + padding-left: 1em; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title .title-container { + margin: auto 0; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title .ref { + font-size: 10px; + color: #fff; + text-transform: uppercase; + font-weight: 600; + display: inline-block; + background: #263C5C; + padding: 0.2em 0.4em; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title .name { + font-size: 14px; + color: #000; + display: block; +} +.page-ut-gp-list .organization .workunit-list .unit > .unit-container { + padding: 4px 0 0 0; + border: solid; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list { + padding: 0 0 0 7px; + display: none; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list > .unit:last-child::before { + height: 24px; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .toggle-unit { + position: relative; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .toggle-unit::before { + right: 20px; + display: block; + position: absolute; + content: ""; + height: 1px; + left: 0; + top: 20px; + background: rgba(0, 0, 0, 0.3); +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .unit { + position: relative; + margin-left: 0.6em; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .unit::before { + display: block; + position: absolute; + content: ""; + width: 1px; + height: 100%; + left: 0; + top: 0; + background: rgba(0, 0, 0, 0.3); +} +.page-ut-gp-list .organization .workunit-list .unit.active > .unit-container .title { + background: rgba(0, 0, 0, 0.1); +} +.page-ut-gp-list .organization .workunit-list .unit.active > .unit-container .title .name { + font-weight: 600; +} +.page-ut-gp-list .organization .workunit-list .unit.type-workunit .unit-container .ref { + background: #0d8aff; +} +.page-ut-gp-list .organization .workunit-list .unit.toggled > .sub-list { + display: block; +} + +@media (max-width: 1200px) { + #id-container.page-ut-gp-list .organization { + position: static; + height: auto; + padding: 0 2em; + background: none; + border: 0; + } + #id-container.page-ut-gp-list .organization .side-nav-responsive { + display: block; + background: #263C5C; + color: #fff; + border-radius: 6px; + padding: 0.6em 1em; + font-weight: 600; + font-size: 14px; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + } + #id-container.page-ut-gp-list .organization .side-nav-responsive:hover { + cursor: pointer; + background: #446ba4; + } + #id-container.page-ut-gp-list .organization #id-left { + opacity: 0; + pointer-events: none; + position: absolute; + z-index: 999; + background: #efefef; + border: 1px solid rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 0 40px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 0 40px 0 rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + max-height: 500px; + overflow-y: auto; + } + #id-container.page-ut-gp-list .organization #id-left.active { + opacity: 1; + pointer-events: auto; + -webkit-transform: translateY(0px); + transform: translateY(0px); + } + + #id-container.page-ut-gp-list #id-right { + padding-left: 0; + } +} diff --git a/css/scss/page/_page-ut-gp-organization.scss b/css/scss/page/_page-ut-gp-organization.scss new file mode 100644 index 000000000..dd8082020 --- /dev/null +++ b/css/scss/page/_page-ut-gp-organization.scss @@ -0,0 +1,263 @@ + +/** UT / GP Organization */ +.page-ut-gp-list .organization { + position: absolute; + height: 100%; + top: 0; + padding-top: 50px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-box-shadow: none; + box-shadow: none; +} +.page-ut-gp-list .organization .side-nav-responsive { + display: none; +} +.page-ut-gp-list .organization #id-left { + width: 300px; + padding-top: 0; +} +.page-ut-gp-list .organization .digirisk-wrap { + padding: 0 !important; +} +.page-ut-gp-list .organization .navigation-container { + max-height: 1000px; + overflow-y: auto; +} +.page-ut-gp-list .organization .add-container { + position: absolute; + right: 0; + bottom: 5px; + opacity: 0; + pointer-events: none; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} + +/** Header */ +.page-ut-gp-list .organization .society-header { + padding-top: 27px; + position: relative; + padding-left: 10px; + padding-right: 10px; +} +.page-ut-gp-list .organization .society-header .title { + font-weight: 700; +} +.page-ut-gp-list .organization .society-header .linkElement { + line-height: 1; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding-bottom: 10px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; +} +.page-ut-gp-list .organization .society-header:hover .add-container { + opacity: 1; + pointer-events: all; +} + +/** Toolbar */ +.page-ut-gp-list .organization .toolbar { + padding-left: 10px; + padding-right: 10px; +} +.page-ut-gp-list .organization .toolbar .toggle-plus, .page-ut-gp-list .organization .toolbar .toggle-minus { + display: inline-block; + padding: 3px; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + color: rgba(0, 0, 0, 0.6); +} +.page-ut-gp-list .organization .toolbar .toggle-plus:hover, .page-ut-gp-list .organization .toolbar .toggle-minus:hover { + cursor: pointer; + opacity: 0.6; +} + +/** Content */ +.page-ut-gp-list .organization .workunit-list { + padding-left: 0; + /** Toggle */ +} +.page-ut-gp-list .organization .workunit-list ul, .page-ut-gp-list .organization .workunit-list li { + list-style-type: none; + margin: 0; +} +.page-ut-gp-list .organization .workunit-list .unit-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + position: relative; +} +.page-ut-gp-list .organization .workunit-list .unit-container:hover .add-container { + opacity: 1; + pointer-events: all; +} +.page-ut-gp-list .organization .workunit-list .unit-container .toggle-unit { + color: rgba(0, 0, 0, 0.6); + line-height: 40px; + font-size: 18px; + min-width: 30px; + width: 30px; + text-align: center; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +.page-ut-gp-list .organization .workunit-list .unit-container .toggle-unit:hover { + cursor: pointer; +} +.page-ut-gp-list .organization .workunit-list .unit-container .toggle-unit .toggle-icon { + line-height: 40px; +} +.page-ut-gp-list .organization .workunit-list .unit-container .spacer { + position: relative; + min-width: 30px; + width: 30px; +} +.page-ut-gp-list .organization .workunit-list .unit-container .spacer::before { + display: block; + position: absolute; + content: ""; + height: 1px; + left: 0; + right: 10px; + top: 20px; + background: rgba(0, 0, 0, 0.3); +} +.page-ut-gp-list .organization .workunit-list .unit-container .photodigiriskdolibarr { + display: block; + width: 40px; + min-width: 40px; + height: 40px; + position: relative; + background: #fff; + text-align: center; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title { + width: 100%; + padding-left: 1em; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title .title-container { + margin: auto 0; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title .ref { + font-size: 10px; + color: #fff; + text-transform: uppercase; + font-weight: 600; + display: inline-block; + background: #263C5C; + padding: 0.2em 0.4em; +} +.page-ut-gp-list .organization .workunit-list .unit-container .title .name { + font-size: 14px; + color: #000; + display: block; +} +.page-ut-gp-list .organization .workunit-list .unit > .unit-container { + padding: 4px 0 0 0; + border: solid; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list { + padding: 0 0 0 7px; + display: none; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list > .unit:last-child::before { + height: 24px; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .toggle-unit { + position: relative; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .toggle-unit::before { + right: 20px; + display: block; + position: absolute; + content: ""; + height: 1px; + left: 0; + top: 20px; + background: rgba(0, 0, 0, 0.3); +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .unit { + position: relative; + margin-left: 0.6em; +} +.page-ut-gp-list .organization .workunit-list .unit > .sub-list .unit::before { + display: block; + position: absolute; + content: ""; + width: 1px; + height: 100%; + left: 0; + top: 0; + background: rgba(0, 0, 0, 0.3); +} +.page-ut-gp-list .organization .workunit-list .unit.active > .unit-container .title { + background: rgba(0, 0, 0, 0.1); +} +.page-ut-gp-list .organization .workunit-list .unit.active > .unit-container .title .name { + font-weight: 600; +} +.page-ut-gp-list .organization .workunit-list .unit.type-workunit .unit-container .ref { + background: #0d8aff; +} +.page-ut-gp-list .organization .workunit-list .unit.toggled > .sub-list { + display: block; +} + +@media (max-width: 1200px) { + #id-container.page-ut-gp-list .organization { + position: static; + height: auto; + padding: 0 2em; + background: none; + border: 0; + } + #id-container.page-ut-gp-list .organization .side-nav-responsive { + display: block; + background: #263C5C; + color: #fff; + border-radius: 6px; + padding: 0.6em 1em; + font-weight: 600; + font-size: 14px; + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + } + #id-container.page-ut-gp-list .organization .side-nav-responsive:hover { + cursor: pointer; + background: #446ba4; + } + #id-container.page-ut-gp-list .organization #id-left { + opacity: 0; + pointer-events: none; + position: absolute; + z-index: 999; + background: #efefef; + border: 1px solid rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 0 40px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 0 40px 0 rgba(0, 0, 0, 0.1); + -webkit-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + max-height: 500px; + overflow-y: auto; + } + #id-container.page-ut-gp-list .organization #id-left.active { + opacity: 1; + pointer-events: auto; + -webkit-transform: translateY(0px); + transform: translateY(0px); + } + + #id-container.page-ut-gp-list #id-right { + padding-left: 0; + } +} diff --git a/digiriskelement_organization.php b/digiriskelement_organization.php new file mode 100644 index 000000000..9fb27e56d --- /dev/null +++ b/digiriskelement_organization.php @@ -0,0 +1,333 @@ + + * + * 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 digiriskelement_card.php + * \ingroup digiriskdolibarr + * \brief Page to create/edit/view digiriskelement + */ + +// Load Dolibarr environment +$res = 0; +// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) +if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; +// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME +$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; +while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { $i--; $j--; } +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +// Try main.inc.php using relative path +if (!$res && file_exists("../../main.inc.php")) $res = @include "../../main.inc.php"; +if (!$res && file_exists("../../../main.inc.php")) $res = @include "../../../main.inc.php"; +if (!$res) die("Include of main fails"); + +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; + +require_once './class/digiriskdocuments.class.php'; +require_once './class/digiriskelement.class.php'; +require_once './class/digiriskdocuments/groupmentdocument.class.php'; +require_once './class/digiriskdocuments/workunitdocument.class.php'; +require_once './lib/digiriskdolibarr_digiriskelement.lib.php'; +require_once './lib/digiriskdolibarr_function.lib.php'; +require_once './core/modules/digiriskdolibarr/digiriskelement/groupment/mod_groupment_standard.php'; +require_once './core/modules/digiriskdolibarr/digiriskelement/workunit/mod_workunit_standard.php'; +require_once './core/modules/digiriskdolibarr/digiriskdocuments/groupmentdocument/modules_groupmentdocument.php'; +require_once './core/modules/digiriskdolibarr/digiriskdocuments/workunitdocument/modules_workunitdocument.php'; + +global $db, $conf, $langs, $user; + +// Load translation files required by the page +$langs->loadLangs(array("digiriskdolibarr@digiriskdolibarr", "other")); + +// Get parameters +$id = GETPOST('id', 'int'); +$ref = GETPOST('ref', 'alpha'); +$action = GETPOST('action', 'aZ09'); +$confirm = GETPOST('confirm', 'alpha'); +$cancel = GETPOST('cancel', 'aZ09'); +$contextpage = GETPOST('contextpage', 'aZ') ?GETPOST('contextpage', 'aZ') : 'digiriskelementcard'; // To manage different context of search +$backtopage = GETPOST('backtopage', 'alpha'); +$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); +$element_type = GETPOST('element_type', 'alpha'); +$fk_parent = GETPOST('fk_parent', 'int'); + +// Initialize technical objects +$object = new DigiriskElement($db); +$extrafields = new ExtraFields($db); + +$object->fetch($id); + +if ( $object->element_type == 'groupment') { + $digiriskelementdocument = new GroupmentDocument($db); +} elseif ( $object->element_type == 'workunit' ) { + $digiriskelementdocument = new WorkUnitDocument($db); +} + +// Fetch optionals attributes and labels +$extrafields->fetch_name_optionals_label($object->table_element); + +$hookmanager->initHooks(array('digiriskelementcard', 'globalcard')); // Note that conf->hooks_modules contains array + +$upload_dir = $conf->digiriskdolibarr->multidir_output[isset($object->entity) ? $object->entity : 1]; + +//Security check +$permissiontoread = $user->rights->digiriskdolibarr->digiriskelement->read; +$permissiontoadd = $user->rights->digiriskdolibarr->digiriskelement->write; +$permissiontodelete = $user->rights->digiriskdolibarr->digiriskelement->delete; + +if (!$permissiontoread) accessforbidden(); + +/* + * Actions + */ + +$parameters = array(); +$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) { + $error = 0; + + $backurlforlist = dol_buildpath('/digiriskdolibarr/digiriskstandard_card.php?id=1', 1); + + if (empty($backtopage) || ($cancel && empty($id))) { + if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) { + if (empty($object->id) && (($action != 'add' && $action != 'create') || $cancel)) $backtopage = $backurlforlist; + else $backtopage = dol_buildpath('/digiriskdolibarr/digiriskelement_card.php', 1).'?id='.($object->id > 0 ? $object->id : '__ID__'); + } + } + + // Action to add record + include DOL_DOCUMENT_ROOT.'/core/actions_addupdatedelete.inc.php'; + + if ($action == 'add' && $permissiontoadd) { ?> + + global->MAIN_MULTILANGS && empty($newlang) && GETPOST('lang_id', 'aZ09')) $newlang = GETPOST('lang_id', 'aZ09'); + if (!empty($newlang)) { + $outputlangs = new Translate("", $conf); + $outputlangs->setDefaultLang($newlang); + } + + // To be sure vars is defined + if (empty($hidedetails)) $hidedetails = 0; + if (empty($hidedesc)) $hidedesc = 0; + if (empty($hideref)) $hideref = 0; + if (empty($moreparams)) $moreparams = null; + + $model = GETPOST('model', 'alpha'); + + $moreparams['object'] = $object; + $moreparams['user'] = $user; + + $result = $digiriskelementdocument->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams); + if ($result <= 0) { + setEventMessages($object->error, $object->errors, 'errors'); + $action = ''; + } else { + if (empty($donotredirect)) + { + setEventMessages($langs->trans("FileGenerated") . ' - ' . $digiriskelementdocument->last_main_doc, null); + + $urltoredirect = $_SERVER['REQUEST_URI']; + $urltoredirect = preg_replace('/#builddoc$/', '', $urltoredirect); + $urltoredirect = preg_replace('/action=builddoc&?/', '', $urltoredirect); // To avoid infinite loop + + header('Location: ' . $urltoredirect . '#builddoc'); + exit; + } + } + } + + // Delete file in doc form + if ($action == 'remove_file' && $permissiontodelete) { + if (!empty($upload_dir)) { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + $langs->load("other"); + $filetodelete = GETPOST('file', 'alpha'); + $file = $upload_dir.'/'.$filetodelete; + $ret = dol_delete_file($file, 0, 0, 0, $object); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", $filetodelete), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", $filetodelete), null, 'errors'); + + // Make a redirect to avoid to keep the remove_file into the url that create side effects + $urltoredirect = $_SERVER['REQUEST_URI']; + $urltoredirect = preg_replace('/#builddoc$/', '', $urltoredirect); + $urltoredirect = preg_replace('/action=remove_file&?/', '', $urltoredirect); + + header('Location: '.$urltoredirect); + exit; + } + else { + setEventMessages('BugFoundVarUploaddirnotDefined', null, 'errors'); + } + } + + if ($action == 'confirm_delete' && GETPOST("confirm") == "yes") + { + $object->fetch($id); + $result = $object->delete($user); + + if ($result > 0) + { + setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); + header('Location: '.$backurlforlist); + exit; + } else { + dol_syslog($object->error, LOG_DEBUG); + setEventMessages($object->error, $object->errors, 'errors'); + } + } +} + +/* + * View + */ + +$form = new Form($db); +$emptyobject = new stdClass($db); +$formconfirm = ''; + +$parameters = array('formConfirm' => $formconfirm, 'object' => $object); +$reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook +if (empty($reshook)) $formconfirm .= $hookmanager->resPrint; +elseif ($reshook > 0) $formconfirm = $hookmanager->resPrint; + + +if ( $object->element_type == 'groupment' ) { + $title = $langs->trans("Groupment"); + $title_create = $langs->trans("NewGroupment"); + $title_edit = $langs->trans("ModifyGroupment"); + $object->picto = 'groupment@digiriskdolibarr'; +} else if ( $object->element_type == 'workunit' ) { + $title = $langs->trans("WorkUnit"); + $title_create = $langs->trans("NewWorkUnit"); + $title_edit = $langs->trans("ModifyWorkUnit"); + $object->picto = 'workunit@digiriskdolibarr'; +} else { + $element_type = GETPOST('element_type', 'alpha'); + if ( $element_type == 'groupment' ){ + $title_create = $langs->trans("NewGroupment"); + }else { + $title_create = $langs->trans("NewWorkUnit"); + } +} + +$help_url = 'FR:Module_DigiriskDolibarr'; +$morejs = array("/digiriskdolibarr/js/digiriskdolibarr.js.php"); +$morecss = array("/digiriskdolibarr/css/digiriskdolibarr.css"); + +llxHeader('', $title, $help_url, '', '', '', $morejs, $morecss); ?> + +
+global->DIGIRISKDOLIBARR_SHOW_HIDDEN_DIGIRISKELEMENT) { + $objects = $object->fetchAll('', 'ref', 0, 0); +} else { + $objects = $object->fetchAll('', '', 0, 0, array('customsql' => 'status > 0')); +} + $results = recurse_tree(0,0,$objects); ?> + +
+
+
+ +
+
+close(); diff --git a/js/digiriskdolibarr.js.php b/js/digiriskdolibarr.js.php index d6be1c8bb..000499071 100644 --- a/js/digiriskdolibarr.js.php +++ b/js/digiriskdolibarr.js.php @@ -72,7 +72,7 @@ * @returns {void} [description] */ window.eoxiaJS.load_list_script = function() { - if ( ! window.eoxiaJS.scriptsLoaded ) { + if ( ! window.eoxiaJS.scriptsLoaded) { var key = undefined, slug = undefined; for ( key in window.eoxiaJS ) { @@ -151,7 +151,7 @@ */ window.eoxiaJS.navigation.event = function() { // Main Menu Digirisk Society - jQuery( document ).on( 'click', '.digirisk-wrap .navigation-container .unit-container .toggle-unit', window.eoxiaJS.navigation.switchToggle ); + jQuery( document ).on( 'click', '.toggle-unit', window.eoxiaJS.navigation.switchToggle ); jQuery( document ).on( 'click', '#newGroupment', window.eoxiaJS.navigation.switchToggle ); jQuery( document ).on( 'click', '#newWorkunit', window.eoxiaJS.navigation.switchToggle ); jQuery( document ).on( 'click', '.digirisk-wrap .navigation-container .toolbar div', window.eoxiaJS.navigation.toggleAll ); @@ -159,6 +159,7 @@ jQuery( document ).on( 'click', '#newGroupment', window.eoxiaJS.navigation.redirect ); jQuery( document ).on( 'click', '#newWorkunit', window.eoxiaJS.navigation.redirect ); jQuery( document ).on( 'click', '.side-nav-responsive', window.eoxiaJS.navigation.toggleMobileNav ); + jQuery( document ).on( 'click', '.unit-container.draggable', window.eoxiaJS.navigation.dragElement ); }; /** @@ -182,7 +183,6 @@ MENU = new Set(MENU) } - if ( jQuery( this ).find( '.toggle-icon' ).hasClass( 'fa-chevron-down' ) ) { jQuery(this).find( '.toggle-icon' ).removeClass('fa-chevron-down').addClass('fa-chevron-right'); @@ -294,6 +294,131 @@ window.eoxiaJS.navigation.toggleMobileNav = function( event ) { $( this ).closest( '.side-nav' ).find( '#id-left' ).toggleClass( 'active' ); } +function calcWidth(obj){ + console.log('---- calcWidth -----'); + + var titles = $(obj).siblings('.workunit-list').children('.unit.type-groupment').children('.unit-container'); +console.log(titles) + $(titles).each(function(index, element){ + var pTitleWidth = parseInt($(obj).css('width')); + var leftOffset = parseInt($(obj).siblings('.workunit-list').css('margin-left')); + + var newWidth = pTitleWidth - leftOffset; + if ($(obj).attr('id') == 'title0'){ + console.log("called"); + + newWidth = newWidth - 10; + } + + $(element).css({ + 'width': newWidth, + }) + + calcWidth(element); + }); + +} + +/** + * Permet de drag & drop les éléments pour réorganiser la liste des groupements et unités de travail + * + * @since 8.2.2 + * @version 8.2.2 + */ +window.eoxiaJS.navigation.dragElement = function( event ) { + + calcWidth($('#title0')); + + window.onresize = function(event) { + console.log("window resized"); + + //method to execute one time after a timer + + }; + + //recursively calculate the Width all titles + + + $('.sub-list, .workunit-list').sortable({ + connectWith:'.workunit-list', + // handle:'.title', + // placeholder: ...., + tolerance:'intersect', + over:function(event,ui){ + // //Recaculate width of all children + // var pTitleWidth = parseInt($(this).siblings('.title').css('width').replace('px', '')); + + // if ($(this).siblings('.title').attr('id') == 'title0'){ + // var newWidth = (pTitleWidth-20).toString().concat('px'); + // } + // else { + // var newWidth = (pTitleWidth-70).toString().concat('px'); + // } + + // console.log(pTitleWidth + ', ' + newWidth); + + // $(ui.item).children('.title').css({ + // 'width': newWidth, + // }); + }, + receive:function(event, ui){ + calcWidth($(this).siblings('.unit-container')); + }, + }); + $('.workunit-list').disableSelection(); + + + + + // + //jQuery( this ).draggable( { + // helper: 'clone', + // opacity: .75, + // refreshPositions: true, + // revert: 'invalid', + // revertDuration: 300, + // scroll: true + //} ); + //$(".treetable .digi-group").each(function () { + //$(this).droppable({ + // drop: function(event, ui) { + // $(this).css('background', 'rgb(0,200,0)'); + // }, + // over: function(event, ui) {; + // $(this).css('background', 'gray'); + // }, + // + // }); + //}) + //$(".unit-container").each(function() { jQuery( this ).droppable( { + // accept: '.unit-container', + // drop: function( e, ui ) { + // var droppedEl = ui.draggable.parents( 'ul' ); + // + // if ( droppedEl.attr( 'id' ) == jQuery( this ).data( 'ttParentId' ) ) { + // e.preventDefault(); + // return false; + // } else { + // window.addEventListener( 'beforeunload', window.eoxiaJS.digirisk.pageSorter.safeExit ); + // + // jQuery( 'input[type="submit"]' ).attr( 'disabled', false ); + // + // jQuery( 'input[name="menu_item_parent_id[' + droppedEl.data( 'ttId' ) + ']"]' ).val( jQuery( this ).data( 'ttId' ) ); + // jQuery( '.treetable' ).treetable( 'move', droppedEl.data( 'ttId' ), jQuery( this ).data( 'ttId' ) ); + // } + // }, + // hoverClass: 'accept', + // over: function( e, ui ) { + // var droppedEl = ui.draggable.parents( 'tr' ); + // if ( this != droppedEl[0] && ! jQuery( this ).is( '.expanded' ) ) { + // jQuery( '.treetable' ).treetable( 'expandNode', jQuery( this ).data( 'ttId' ) ); + // } + // } + // }); + + +} + /** * Initialise l'objet "modal" ainsi que la méthode "init" obligatoire pour la bibliothèque EoxiaJS. diff --git a/lib/digiriskdolibarr_function.lib.php b/lib/digiriskdolibarr_function.lib.php index d95f66830..9ec96a4f6 100644 --- a/lib/digiriskdolibarr_function.lib.php +++ b/lib/digiriskdolibarr_function.lib.php @@ -979,6 +979,96 @@ class="wpeo-button button-square-40 wpeo-tooltip-event" } } +/** + * Display Recursive tree process + * + * @param array $result Global Digirisk Element list after recursive process + * @return void + */ +function display_recurse_tree_organization($results) { + include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; + + global $conf, $langs, $user, $db; + + + if ($user->rights->digiriskdolibarr->digiriskelement->read) { + if ( !empty( $results )) { + foreach ($results as $element) { ?> +
  • +
    + element_type == 'groupment' && count($element['children'])) { ?> +
    + +
    + +
    + +
    + + ref; ?> + label; ?> + +
    +
    +
    +
  • + +element_type == 'groupment' && count($element['children'])) > 0 ? 'toggle-unit' : '') ?> +element_type == 'groupment' && count($element['children'])) { ?> +id;?> + +id ; ?>fk_parent ; ?> +id ; ?>id; ?> +element_type ; ?>ref . ' - ' . $element['object']->label; ?> + + + + + + + + + + + + + + + + + + + + + +fetch(GETPOST('id')); ?> +fk_parent) ;?> + + + + + + + + + + + + + + + + + trans('YouDontHaveTheRightToSeeThis'); + } +} + /** * Show tab footer of a card. * Note: $object->next_prev_filter can be set to restrict select to find next or previous record by $form->showrefnav.