diff --git a/application/nicewebpage.class.inc.php b/application/nicewebpage.class.inc.php index 405089057..bee24fac4 100644 --- a/application/nicewebpage.class.inc.php +++ b/application/nicewebpage.class.inc.php @@ -75,6 +75,8 @@ class NiceWebPage extends WebPage $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/search/search_form_criteria_date_abstract.js'); $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/search/search_form_criteria_date.js'); $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/search/search_form_criteria_date_time.js'); + $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/clipboard.min.js'); + $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/clipboardwidget.js'); $this->add_dict_entries('UI:Combo'); diff --git a/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php index 127428b4f..6cb4d4fd8 100644 --- a/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/cs.dict.itop-portal-base.php @@ -133,6 +133,9 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Uloženo', 'Brick:Portal:Object:Search:Regular:Title' => 'Vybrat %1$s (%2$s)', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Vybrat %1$s (%2$s)', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/da.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/da.dict.itop-portal-base.php index 3d85da984..50b69e598 100644 --- a/datamodels/2.x/itop-portal-base/da.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/da.dict.itop-portal-base.php @@ -130,6 +130,9 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Saved~~', 'Brick:Portal:Object:Search:Regular:Title' => 'Select %1$s (%2$s)~~', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Select %1$s (%2$s)~~', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php index c45c8c023..0299e68bd 100644 --- a/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/de.dict.itop-portal-base.php @@ -130,6 +130,9 @@ Dict::Add('DE DE', 'German', 'Deutsch', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Saved', 'Brick:Portal:Object:Search:Regular:Title' => 'Select %1$s (%2$s)', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Select %1$s (%2$s)', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php index 0c873368e..bbf90ef2b 100644 --- a/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/en.dict.itop-portal-base.php @@ -126,11 +126,14 @@ Dict::Add('EN US', 'English', 'English', array( 'Brick:Portal:Object:Name' => 'Object', 'Brick:Portal:Object:Form:Create:Title' => 'New %1$s', 'Brick:Portal:Object:Form:Edit:Title' => 'Updating %2$s (%1$s)', - 'Brick:Portal:Object:Form:View:Title' => '%1$s : %2$s', + 'Brick:Portal:Object:Form:View:Title' => '%1$s: %2$s', 'Brick:Portal:Object:Form:Stimulus:Title' => 'Please, complete the following information:', 'Brick:Portal:Object:Form:Message:Saved' => 'Saved', 'Brick:Portal:Object:Search:Regular:Title' => 'Select %1$s (%2$s)', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Select %1$s (%2$s)', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php index 792d93c7e..972443949 100644 --- a/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/es_cr.dict.itop-portal-base.php @@ -129,6 +129,9 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Guardado', 'Brick:Portal:Object:Search:Regular:Title' => 'Selección %1$s (%2$s)', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Selección %1$s (%2$s)', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php index 6a306580f..eece26d89 100644 --- a/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/fr.dict.itop-portal-base.php @@ -129,6 +129,9 @@ Dict::Add('FR FR', 'French', 'Français', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Enregistré', 'Brick:Portal:Object:Search:Regular:Title' => 'Sélection de %1$s (%2$s)', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Sélection de %1$s (%2$s)', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copier l\'url de l\'objet', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copié' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/hu.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/hu.dict.itop-portal-base.php index 42411c69a..611d2ee52 100644 --- a/datamodels/2.x/itop-portal-base/hu.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/hu.dict.itop-portal-base.php @@ -130,6 +130,9 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Saved~~', 'Brick:Portal:Object:Search:Regular:Title' => 'Select %1$s (%2$s)~~', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Select %1$s (%2$s)~~', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/it.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/it.dict.itop-portal-base.php index 84dd3e150..655d54bf7 100644 --- a/datamodels/2.x/itop-portal-base/it.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/it.dict.itop-portal-base.php @@ -130,6 +130,9 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Saved~~', 'Brick:Portal:Object:Search:Regular:Title' => 'Select %1$s (%2$s)~~', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Select %1$s (%2$s)~~', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/ja.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/ja.dict.itop-portal-base.php index 480fa3c1c..4af075286 100644 --- a/datamodels/2.x/itop-portal-base/ja.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/ja.dict.itop-portal-base.php @@ -130,6 +130,9 @@ Dict::Add('JA JP', 'Japanese', '日本語', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Saved~~', 'Brick:Portal:Object:Search:Regular:Title' => 'Select %1$s (%2$s)~~', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Select %1$s (%2$s)~~', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/nl.dict.itop-portal-base.php b/datamodels/2.x/itop-portal-base/nl.dict.itop-portal-base.php index e9144a326..85086b600 100644 --- a/datamodels/2.x/itop-portal-base/nl.dict.itop-portal-base.php +++ b/datamodels/2.x/itop-portal-base/nl.dict.itop-portal-base.php @@ -130,6 +130,9 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array( 'Brick:Portal:Object:Form:Message:Saved' => 'Opgeslagen', 'Brick:Portal:Object:Search:Regular:Title' => 'Geselecteerd %1$s (%2$s)', 'Brick:Portal:Object:Search:Hierarchy:Title' => 'Selecteer %1$s (%2$s)', + 'Brick:Portal:Object:Copy:TextToCopy' => '%1$s: %2$s~~', + 'Brick:Portal:Object:Copy:Tooltip' => 'Copy object link~~', + 'Brick:Portal:Object:Copy:CopiedTooltip' => 'Copied~~' )); // CreateBrick brick diff --git a/datamodels/2.x/itop-portal-base/portal/public/css/portal.css b/datamodels/2.x/itop-portal-base/portal/public/css/portal.css index d80e302ba..4075fd873 100644 --- a/datamodels/2.x/itop-portal-base/portal/public/css/portal.css +++ b/datamodels/2.x/itop-portal-base/portal/public/css/portal.css @@ -278,6 +278,21 @@ footer { margin: 7em 0em; text-align: center; } +/*******************/ +/* Clipboard icons */ +/*******************/ +.url-to-clipboard.url-to-clipboard-icon { + opacity: 0.5; + cursor: pointer; + transition: opacity 0.2s linear; +} +.url-to-clipboard.url-to-clipboard-icon:hover { + opacity: 1; +} +.url-to-clipboard-tooltip-copied { + color: green; + margin-right: 3px; +} /**************************/ /* MagnificPopup settings */ /**************************/ @@ -292,7 +307,7 @@ footer { cursor: zoom-out; } /********************/ -/* Typeahed setting */ +/* Typeahead setting */ /********************/ .twitter-typeahead .tt-menu { max-height: 200px; diff --git a/datamodels/2.x/itop-portal-base/portal/public/css/portal.scss b/datamodels/2.x/itop-portal-base/portal/public/css/portal.scss index f59d600b7..cacb0b20c 100644 --- a/datamodels/2.x/itop-portal-base/portal/public/css/portal.scss +++ b/datamodels/2.x/itop-portal-base/portal/public/css/portal.scss @@ -293,6 +293,25 @@ footer{ text-align: center; } +/*******************/ +/* Clipboard icons */ +/*******************/ +.url-to-clipboard{ + &.url-to-clipboard-icon { + opacity: 0.5; + cursor: pointer; + transition: opacity 0.2s linear; + &:hover { + opacity: 1; + } + } +} +// Used for clipboard's tooltip, which is not part of .url-to-clipboard element +.url-to-clipboard-tooltip-copied { + color: green; + margin-right: 3px; +} + /**************************/ /* MagnificPopup settings */ /**************************/ @@ -308,7 +327,7 @@ footer{ } /********************/ -/* Typeahed setting */ +/* Typeahead setting */ /********************/ .twitter-typeahead .tt-menu{ max-height: 200px; diff --git a/datamodels/2.x/itop-portal-base/portal/public/js/portal-clipboard.js b/datamodels/2.x/itop-portal-base/portal/public/js/portal-clipboard.js new file mode 100644 index 000000000..2cb2c4508 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/public/js/portal-clipboard.js @@ -0,0 +1,38 @@ +/* + * + * * Copyright (C) 2013-2019 Combodo SARL + * * + * * This file is part of iTop. + * * + * * iTop is free software; you can redistribute it and/or modify + * * it under the terms of the GNU Affero General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * iTop 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 Affero General Public License for more details. + * * + * * You should have received a copy of the GNU Affero General Public License + * + */ + +/* + * Initialize every modal DOM objects with class url-to-clipboard with itop.clipboard widget + */ +$(document).ready(function() +{ + // Bootstrap modal: initialize .url-to-clipboard and set the widget container to the modal + $('body').on('loaded.bs.modal', function (oEvent) { + var oModalsElem = $(this).find('.modal.in'); + oModalsElem.each(function() + { + var oModalElem = $(this); + oModalElem.find('.url-to-clipboard').each(function() + { + $(this).clipboard({'container': oModalElem[0]}); + }); + }); + }); +}); \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php index 424a4f2ce..a604ffa53 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php @@ -23,6 +23,7 @@ namespace Combodo\iTop\Portal\Helper; +use ApplicationContext; use Combodo\iTop\Portal\Form\ObjectFormManager; use Combodo\iTop\Portal\Twig\AppExtension; use Combodo\iTop\Renderer\Bootstrap\BsFormRenderer; @@ -363,7 +364,16 @@ class ObjectFormHandlerHelper $aFormData['object_state'] = $oFormManager->GetObject()->GetState(); $aFormData['fieldset'] = $aFieldSetData; $aFormData['display_mode'] = (isset($aFormProperties['properties'])) ? $aFormProperties['properties']['display_mode'] : ApplicationHelper::FORM_DEFAULT_DISPLAY_MODE; - + // - Set a text to be copied on title if the object is not in creation + if($sMode !== static::ENUM_MODE_CREATE) + { + $aFormData['title_clipboard_text'] = Dict::Format( + 'Brick:Portal:Object:Copy:TextToCopy', + $aFormData['object_name'], + ApplicationContext::MakeObjectUrl($sObjectClass, $sObjectId) + ); + } + return $aFormData; } diff --git a/datamodels/2.x/itop-portal-base/portal/templates/bricks/object/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/bricks/object/layout.html.twig index c9123d57a..5a207c201 100644 --- a/datamodels/2.x/itop-portal-base/portal/templates/bricks/object/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/templates/bricks/object/layout.html.twig @@ -7,7 +7,18 @@ {% block pMainHeader %}