diff --git a/admin/templates/default/config.xet b/admin/templates/default/config.xet
index 108f7c23be..f9e8700138 100644
--- a/admin/templates/default/config.xet
+++ b/admin/templates/default/config.xet
@@ -140,15 +140,6 @@
-->
-
-
-
-
diff --git a/api/js/framework/fw_ui.js b/api/js/framework/fw_ui.js
index 0852b3f8ec..dd49b855ee 100644
--- a/api/js/framework/fw_ui.js
+++ b/api/js/framework/fw_ui.js
@@ -995,9 +995,7 @@ window.egw_fw_ui_scrollarea = function(_contDiv)
// Do not scrolldown/up when we are on selectbox items
// seems Firefox does not prevent the mousewheel event over
// selectbox items with scrollbars
- // Do not scroll on video tutorials as well
- if (e.target.tagName == "OPTION" || e.target.tagName == "SELECT" ||
- e.target.getAttribute('class') && e.target.getAttribute('class').match(/egw_tutorial/ig))
+ if (e.target.tagName == "OPTION" || e.target.tagName == "SELECT")
{
noscroll = true;
}
diff --git a/api/js/jsapi/app_base.js b/api/js/jsapi/app_base.js
index b411ae8415..451ad6d0d8 100644
--- a/api/js/jsapi/app_base.js
+++ b/api/js/jsapi/app_base.js
@@ -568,18 +568,6 @@ export const AppJS = (function(){ "use strict"; return Class.extend(
*/
_init_sidebox: function(sidebox)
{
- // Initialize egw tutorial sidebox, but only for non-popups, as calendar edit app.js has this.et2 set to tutorial et2 object
- if (!this.egw.is_popup())
- {
- var egw_fw = egw_getFramework();
- var tutorial = jQuery('#egw_tutorial_'+this.appname+'_sidebox', egw_fw ? egw_fw.sidemenuDiv : document);
- // _init_sidebox gets currently called multiple times, which needs to be fixed
- if (tutorial.length && !this.tutorial_initialised)
- {
- this.egwTutorial_init(tutorial[0]);
- this.tutorial_initialised = true;
- }
- }
if(sidebox.length)
{
var self = this;
@@ -1185,137 +1173,6 @@ export const AppJS = (function(){ "use strict"; return Class.extend(
}
},
- /**
- * Get json data for videos from the given url
- *
- * @return {Promise, object} return Promise, json object as resolved result and error message in case of failure
- */
- egwTutorialGetData: function(){
- var self = this;
- return new Promise (function(_resolve, _reject)
- {
- var resolve = _resolve;
- var reject = _reject;
- // delay the execution and let the rendering catches up. Seems only FF problem
- window.setTimeout(function(){
- self.egw.json('EGroupware\\Api\\Framework\\Tutorial::ajax_data', [self.egw.app_name()], function(_data){
- resolve(_data);
- }).sendRequest();
- },0);
-
- });
- },
-
- /**
- * Create and Render etemplate2 for egroupware tutorial
- * sidebox option. The .xet file is stored in api/templates/default/egw_tutorials
- *
- * @description tutorials json object should have the following structure:
- * object:
- * {
- * [app name]:{
- * [language tag]:[
- * {src:"",thumbnail:"",title:"",desc:""}
- * ]
- * }
- * }
- *
- * *Note: "desc" and "title" are optional attributes, which "desc" would appears as tooltip for the video.
- *
- * example:
- * {
- * "mail":{
- * "en":[
- * {src:"https://www.youtube.com/embed/mCDJndpjO40", thumbnail:"http://img.youtube.com/vi/mCDJndpjO40/0.jpg", "title":"PGP Encryption", "desc":""},
- * {src:"https://www.youtube.com/embed/mCDJndpjO", thumbnail:"http://img.youtube.com/vi/mCDJndpjO/0.jpg", "title":"Subscription", "desc":""},
- * ],
- * "de":[
- * {src:"https://www.youtube.com/embed/m40", thumbnail:"http://img.youtube.com/vi/m40/0.jpg", "title":"PGP Verschlüsselung", "desc":""},
- * {src:"https://www.youtube.com/embed/mpjO", thumbnail:"http://img.youtube.com/vi/mpjO/0.jpg", "title":"Ordner Abonnieren", "desc":""},
- * ]
- * }
- * }
- *
- * @param {DOMNode} div
- */
- egwTutorial_init: function(div)
- {
- // et2 object
- var etemplate = new etemplate2 (div, false);
- var template = egw.webserverUrl+'/api/templates/default/egw_tutorial.xet?1';
-
- this.egwTutorialGetData().then(function(_data){
- var lang = egw.preference('lang');
- var content = {content:{list:[]}};
- if (_data && _data[egw.app_name()])
- {
- if (!_data[egw.app_name()][lang]) lang = 'en';
- if (typeof _data[egw.app_name()][lang] !='undefined'
- && _data[egw.app_name()][lang].length > 0)
- {
- for (var i=0;i < _data[egw.app_name()][lang].length;i++)
- {
- var tuid = egw.app_name() + '-' +lang + '-' + i;
- _data[egw.app_name()][lang][i]['onclick'] = 'app.'+egw.app_name()+'.egwTutorialPopup("'+tuid+'")';
- }
- content.content.list = _data[egw.app_name()][lang];
-
- if (template.indexOf('.xet') >0)
- {
- etemplate.load ('',template , content, function(){});
- }
- else
- {
- etemplate.load (template, '', content);
- }
- }
- }
- },
- function(_err){
- console.log(_err);
- });
- },
-
- /**
- * Open popup to show given tutorial id
- * @param {string} _tuid tutorial object id
- * - tuid: appname-lang-index
- */
- egwTutorialPopup: function (_tuid)
- {
- var url = egw.link('/index.php', 'menuaction=api.EGroupware\\Api\\Framework\\Tutorial.popup&tuid='+_tuid);
- egw.open_link(url,'_blank','960x580');
- },
-
- /**
- * Function to set video iframe base on selected tutorial from tutorials box
- *
- * @param {string} _url
- */
- tutorial_videoOnClick: function (_url)
- {
- var frame = etemplate2.getByApplication('api')[0].widgetContainer.getWidgetById('src');
- if (frame)
- {
- frame.set_value(_url);
- }
- },
-
- /**
- * Function calls on discard checkbox and will set
- * the egw_tutorial_noautoload preference
- *
- * @param {type} egw
- * @param {type} widget
- */
- tutorial_autoloadDiscard: function (egw, widget)
- {
- if (widget)
- {
- this.egw.set_preference('common', 'egw_tutorial_noautoload', widget.get_value());
- }
- },
-
/**
* Check if Mailvelope is available, open (or create) "egroupware" keyring and call callback with it
*
diff --git a/api/js/jsapi/egw.js b/api/js/jsapi/egw.js
index 2cdf8e1c55..5b68a35583 100644
--- a/api/js/jsapi/egw.js
+++ b/api/js/jsapi/egw.js
@@ -434,37 +434,6 @@ window.app = {classes: {}};
window.scrollTo(0, 1);
}
try {
- // Open tutorial popup with an introduction video about egroupware
- if (window.framework === window.top.framework && typeof Et2Dialog != 'undefined' &&
- !egw.preference('egw_tutorial_noautoload', 'common') &&
- !parseInt(egw_script.getAttribute('data-framework-reload')) &&
- (!egw.config('egw_tutorial_disable', 'phpgwapi') || egw.config('egw_tutorial_disable', 'phpgwapi') == 'sidebox'))
- {
- // we need to wait until common translations are loaded
- egw.langRequireApp(window, 'common', function ()
- {
- var buttons = [
- {label: egw.lang("Show now"), id: "show", image: "check", default: "true"},
- {label: egw.lang("Show next login"), id: "later", image: "right"},
- {label: egw.lang("No thanks"), id: "never", image: "cancel"}
- ];
- Et2Dialog.show_dialog(function (_button_id)
- {
- if (_button_id == "show")
- {
- egw.open_link(egw.link('/index.php', 'menuaction=api.EGroupware\\Api\\Framework\\Tutorial.popup&tuid=introduction-' + egw.preference('lang') + '-0-a'), '_blank', '960x580');
- }
- if (_button_id != "later")
- {
- egw.set_preference('common', 'egw_tutorial_noautoload', true);
- }
- },
- egw.lang('We would like to introduce you to EGroupware by showing a short introduction video.'),
- egw.lang('Introduction'),
- {}, buttons, Et2Dialog.QUESTION_MESSAGE, undefined, egw(window));
- }, this);
- }
-
// open websocket to push server for our top window
if (egw === window.top.egw && egw_script.getAttribute('data-websocket-url'))
{
diff --git a/api/js/jsapi/egw_app.ts b/api/js/jsapi/egw_app.ts
index f1d9d28692..77ad7fb8d9 100644
--- a/api/js/jsapi/egw_app.ts
+++ b/api/js/jsapi/egw_app.ts
@@ -120,8 +120,6 @@ export abstract class EgwApp
et2_view : any;
favorite_popup : JQuery | any;
- tutorial_initialised : boolean;
-
dom_id : string;
mailvelopeSyncHandlerObj : any;
@@ -803,18 +801,7 @@ export abstract class EgwApp
*/
_init_sidebox(sidebox)
{
- // Initialize egw tutorial sidebox, but only for non-popups, as calendar edit app.js has this.et2 set to tutorial et2 object
- if(!this.egw.is_popup())
- {
- var egw_fw = egw_getFramework();
- var tutorial = jQuery('#egw_tutorial_' + this.appname + '_sidebox', egw_fw ? egw_fw.sidemenuDiv : document);
- // _init_sidebox gets currently called multiple times, which needs to be fixed
- if(tutorial.length && !this.tutorial_initialised)
- {
- this.egwTutorial_init(tutorial[0]);
- this.tutorial_initialised = true;
- }
- }
+
if(sidebox.length)
{
var self = this;
@@ -1345,142 +1332,6 @@ export abstract class EgwApp
}
}
- /**
- * Get json data for videos from the given url
- *
- * @return {Promise, object} return Promise, json object as resolved result and error message in case of failure
- */
- egwTutorialGetData()
- {
- var self = this;
- return new Promise(function(_resolve, _reject)
- {
- var resolve = _resolve;
- var reject = _reject;
- // delay the execution and let the rendering catches up. Seems only FF problem
- window.setTimeout(function()
- {
- self.egw.json('EGroupware\\Api\\Framework\\Tutorial::ajax_data', [self.egw.app_name()], function(_data)
- {
- resolve(_data);
- }).sendRequest();
- }, 0);
-
- });
- }
-
- /**
- * Create and Render etemplate2 for egroupware tutorial
- * sidebox option. The .xet file is stored in api/templates/default/egw_tutorials
- *
- * @description tutorials json object should have the following structure:
- * object:
- * {
- * [app name]:{
- * [language tag]:[
- * {src:"",thumbnail:"",title:"",desc:""}
- * ]
- * }
- * }
- *
- * *Note: "desc" and "title" are optional attributes, which "desc" would appears as tooltip for the video.
- *
- * example:
- * {
- * "mail":{
- * "en":[
- * {src:"https://www.youtube.com/embed/mCDJndpjO40", thumbnail:"http://img.youtube.com/vi/mCDJndpjO40/0.jpg", "title":"PGP Encryption", "desc":""},
- * {src:"https://www.youtube.com/embed/mCDJndpjO", thumbnail:"http://img.youtube.com/vi/mCDJndpjO/0.jpg", "title":"Subscription", "desc":""},
- * ],
- * "de":[
- * {src:"https://www.youtube.com/embed/m40", thumbnail:"http://img.youtube.com/vi/m40/0.jpg", "title":"PGP Verschlüsselung", "desc":""},
- * {src:"https://www.youtube.com/embed/mpjO", thumbnail:"http://img.youtube.com/vi/mpjO/0.jpg", "title":"Ordner Abonnieren", "desc":""},
- * ]
- * }
- * }
- *
- * @param {DOMNode} div
- */
- egwTutorial_init(div)
- {
- // et2 object
- var etemplate = new etemplate2(div, '');
- var template = egw.webserverUrl + '/api/templates/default/egw_tutorial.xet?1';
-
- this.egwTutorialGetData().then(function(_data)
- {
- var lang = egw.preference('lang');
- var content = {content: {list: []}};
- if(_data && _data[egw.app_name()])
- {
- if (!_data[egw.app_name()][lang]) lang = 'en';
- if(typeof _data[egw.app_name()][lang] != 'undefined'
- && _data[egw.app_name()][lang].length > 0)
- {
- for(var i = 0; i < _data[egw.app_name()][lang].length; i++)
- {
- var tuid = egw.app_name() + '-' + lang + '-' + i;
- _data[egw.app_name()][lang][i]['onclick'] = 'app.' + egw.app_name() + '.egwTutorialPopup("' + tuid + '")';
- }
- content.content.list = _data[egw.app_name()][lang];
-
- if(template.indexOf('.xet') > 0)
- {
- etemplate.load('', template, content, function() {});
- }
- else
- {
- etemplate.load(template, '', content);
- }
- }
- }
- },
- function(_err)
- {
- console.log(_err);
- });
- }
-
- /**
- * Open popup to show given tutorial id
- * @param {string} _tuid tutorial object id
- * - tuid: appname-lang-index
- */
- egwTutorialPopup(_tuid)
- {
- var url = egw.link('/index.php', 'menuaction=api.EGroupware\\Api\\Framework\\Tutorial.popup&tuid=' + _tuid);
- egw.open_link(url, '_blank', '960x580');
- }
-
- /**
- * Function to set video iframe base on selected tutorial from tutorials box
- *
- * @param {string} _url
- */
- tutorial_videoOnClick(_url)
- {
- var frame = etemplate2.getByApplication('api')[0].widgetContainer.getWidgetById('src');
- if(frame)
- {
- frame.set_value(_url);
- }
- }
-
- /**
- * Function calls on discard checkbox and will set
- * the egw_tutorial_noautoload preference
- *
- * @param {type} egw
- * @param {type} widget
- */
- tutorial_autoloadDiscard(egw, widget)
- {
- if(widget)
- {
- this.egw.set_preference('common', 'egw_tutorial_noautoload', widget.get_value());
- }
- }
-
/**
* Check if Mailvelope is available, open (or create) "egroupware" keyring and call callback with it
*
diff --git a/api/setup/setup.inc.php b/api/setup/setup.inc.php
index 2884a1ac91..1ab198e147 100644
--- a/api/setup/setup.inc.php
+++ b/api/setup/setup.inc.php
@@ -62,7 +62,6 @@ $setup_info['api']['hooks']['addgroup'] = 'EGroupware\\Api\\Vfs\\Hooks::addGroup
$setup_info['api']['hooks']['deletegroup'] = array('EGroupware\\Api\\Vfs\\Hooks::deleteGroup', 'EGroupware\\Api\\Mail\\Hooks::deletegroup');
$setup_info['api']['hooks']['editgroup'] = 'EGroupware\\Api\\Vfs\\Hooks::editGroup';
$setup_info['api']['hooks']['changepassword'] = 'EGroupware\\Api\\Mail\\Hooks::changepassword';
-$setup_info['api']['hooks']['sidebox_all'] = 'EGroupware\\Api\\Framework\\Tutorial::tutorial_menu';
// Hooks to delete shares when file is deleted
$setup_info['api']['hooks']['vfs_unlink'] = 'EGroupware\\Api\\Vfs\\Sharing::vfsUpdate';
diff --git a/api/setup/tutorials.json b/api/setup/tutorials.json
deleted file mode 100644
index 31b30b19af..0000000000
--- a/api/setup/tutorials.json
+++ /dev/null
@@ -1,101 +0,0 @@
-{
- "introduction":{
- "de":[
- {"src":"https://www.youtube.com/embed/0JqoFhAGLwo?rel=0&autoplay=1","title":"EGroupware Basics","thumbnail":"https://img.youtube.com/vi/0JqoFhAGLwo/0.jpg","desc":"In diesem Tutorial erklären wird grundlegende Funktionen aller EGroupware Apps."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/iPrtjeEnXeU?rel=0&autoplay=1","title":"EGroupware Basics","thumbnail":"https://img.youtube.com/vi/iPrtjeEnXeU/0.jpg","desc":"Some of EGroupwares most important basic features and functions in all apps."}
- ]
- },
- "addressbook":{
- "de":[
- {"src":"https://www.youtube.com/embed/0JqoFhAGLwo?rel=0&autoplay=1","title":"EGroupware Basics","thumbnail":"https://img.youtube.com/vi/0JqoFhAGLwo/0.jpg", "desc":"Die wichtigsten Basics von EGroupware und die grundlegenden Funktionen der Software."},
- {"src":"https://www.youtube.com/embed/fiPjk49HtMY?rel=0&autoplay=1","title":"EGroupware - CRM","thumbnail":"https://img.youtube.com/vi/fiPjk49HtMY/0.jpg", "desc":"Customer Relationship Management - Hier zeigen wir, wie Kontakte und Termine von Kunden oder Partnern mit Adressbuch, Kalender und InfoLog abgebildet werden können."},
- {"src":"https://www.youtube.com/embed/e_X2InMcBao?rel=0&autoplay=1","title":"EGroupware Synchronisation - Apple","thumbnail":"https://img.youtube.com/vi/e_X2InMcBao/0.jpg", "desc":"In diesem Video erklären wir Schritt für Schritt die Synchronisation mit Ihrem Mobilgerät - für alle Apple-Geräte."},
- {"src":"https://www.youtube.com/embed/hJWQYzxC9MA?rel=0&autoplay=1","title":"EGroupware Synchronisation - Android","thumbnail":"https://img.youtube.com/vi/hJWQYzxC9MA/0.jpg", "desc":"In diesem Video erklären wir Schritt für Schritt die Synchronisation mit Ihrem Mobilgerät - für alle Android-Geräte."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/iPrtjeEnXeU?rel=0&autoplay=1","title":"EGroupware Basics","thumbnail":"https://img.youtube.com/vi/iPrtjeEnXeU/0.jpg", "desc":"Some of EGroupwares most important basic features and functions in all apps."},
- {"src":"https://www.youtube.com/embed/HwjZFnitqRQ?rel=0&autoplay=1","title":"EGroupware - CRM","thumbnail":"https://img.youtube.com/vi/HwjZFnitqRQ/0.jpg", "desc":"Customer Relationship Management - We show, how contacts and events of customers or partners can be edited with Addressbook, Calendar and InfoLog."},
- {"src":"https://www.youtube.com/embed/hHxjjQ_MqnY?rel=0&autoplay=1","title":"EGroupware Synchronisation - Apple","thumbnail":"https://img.youtube.com/vi/hHxjjQ_MqnY/0.jpg", "desc":"We explain step by step, how to synchronise EGroupware with your smartphone or tablet - for all Apple devices."},
- {"src":"https://www.youtube.com/embed/-NdgyI7BDpY?rel=0&autoplay=1","title":"EGroupware Synchronisation - Android","thumbnail":"https://img.youtube.com/vi/-NdgyI7BDpY/0.jpg", "desc":"We explain step by step, how to synchronise EGroupware with your smartphone or tablet - for all Android devices."}
- ]
- },
- "admin":{
- "de":[
- {"src":"https://www.youtube.com/embed/a-VYyo7rQxA?rel=0&autoplay=1","title":"EGroupware Admin Basics","thumbnail":"https://img.youtube.com/vi/a-VYyo7rQxA/0.jpg", "desc":"Grundlagen der EGroupware Administration: Benutzer und Gruppen anlegen, Kategorien anlegen, Zugriffsrechte vergeben und benutzerdefinierte Felder erstellen."},
- {"src":"https://www.youtube.com/embed/vml4Ok1qdGM?rel=0&autoplay=1","title":"EGroupware Admin Mail","thumbnail":"https://img.youtube.com/vi/vml4Ok1qdGM/0.jpg", "desc":"Hier zeigen wir - für alle Admins - wichtige Einstellungen in EGroupware Mail!"},
- {"src":"https://www.youtube.com/embed/7DZKPKa_Rj0?rel=0&autoplay=1","title":"EGroupware E-Mail Account Management","thumbnail":"https://img.youtube.com/vi/7DZKPKa_Rj0/0.jpg", "desc":"In diesem Tutorial erklären wir, wie einfach Sie sich selbst einen neuen Mailaccount anlegen und wie schnell das geht."},
- {"src":"https://www.youtube.com/embed/e_X2InMcBao?rel=0&autoplay=1","title":"EGroupware Synchronisation - Apple","thumbnail":"https://img.youtube.com/vi/e_X2InMcBao/0.jpg", "desc":"In diesem Video erklären wir Schritt für Schritt die Synchronisation mit Ihrem Mobilgerät - für alle Apple-Geräte."},
- {"src":"https://www.youtube.com/embed/hJWQYzxC9MA?rel=0&autoplay=1","title":"EGroupware Synchronisation - Android","thumbnail":"https://img.youtube.com/vi/hJWQYzxC9MA/0.jpg", "desc":"In diesem Video erklären wir Schritt für Schritt die Synchronisation mit Ihrem Mobilgerät - für alle Android-Geräte."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/W0q2HyT6tQU?rel=0&autoplay=1","title":"EGroupware Admin Basics","thumbnail":"https://img.youtube.com/vi/W0q2HyT6tQU/0.jpg", "desc":"Basics of EGroupware Administration: create users and groups, add categories, define access rights and custom fields."},
- {"src":"https://www.youtube.com/embed/8CTF7w3K8kA?rel=0&autoplay=1","title":"EGroupware Admin Mail","thumbnail":"https://img.youtube.com/vi/8CTF7w3K8kA/0.jpg", "desc":"We show, how you – as an admin – change settings for one user in Stylite Mail Hosting."},
- {"src":"https://www.youtube.com/embed/LkWOL8PkgvU?rel=0&autoplay=1","title":"EGroupware E-Mail account management","thumbnail":"https://img.youtube.com/vi/LkWOL8PkgvU/0.jpg", "desc":"In this tutorial we explain, how fast and how easy you create your own mail account."},
- {"src":"https://www.youtube.com/embed/hHxjjQ_MqnY?rel=0&autoplay=1","title":"EGroupware Synchronisation - Apple","thumbnail":"https://img.youtube.com/vi/hHxjjQ_MqnY/0.jpg", "desc":"We explain step by step, how to synchronise EGroupware with your smartphone or tablet - for all Apple devices."},
- {"src":"https://www.youtube.com/embed/-NdgyI7BDpY?rel=0&autoplay=1","title":"EGroupware Synchronisation - Android","thumbnail":"https://img.youtube.com/vi/-NdgyI7BDpY/0.jpg", "desc":"We explain step by step, how to synchronise EGroupware with your smartphone or tablet - for all Android devices."}
- ]
-
- },
- "filemanager":{
- "de":[
- {"src":"https://www.youtube.com/embed/scB_l7OjdJI?rel=0&autoplay=1","title":"EGroupware Dateimanager","thumbnail":"https://img.youtube.com/vi/scB_l7OjdJI/0.jpg", "desc":"In diesem Tutorial gibt es praktische Tipps und Erklärungen zur Nutzung des Dateimanagers."},
- {"src":"https://www.youtube.com/embed/A_tkKYaW_iI?rel=0&autoplay=1","title":"EGroupware 14.2 neue Features","thumbnail":"https://img.youtube.com/vi/A_tkKYaW_iI/0.jpg", "desc":"In diesem Video werden die drei wichtigsten Neuerungen der neuen EGroupware Version 14.2. beschrieben."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/lOR3vo6hMwA?rel=0&autoplay=1","title":"EGroupware File Manager","thumbnail":"https://img.youtube.com/vi/lOR3vo6hMwA/0.jpg", "desc":"We here give some useful tips concerning the usage of filemanager. We talk about handling and usability and the new sharing options that are available with version 14.2."},
- {"src":"https://www.youtube.com/embed/mCDJndpjO40?rel=0&autoplay=1","title":"EGroupware 14.2 new features","thumbnail":"https://img.youtube.com/vi/mCDJndpjO40/0.jpg", "desc":"This video shows the three main features of upcoming new EGroupware version 14.2."}
- ]
- },
- "home":{
- "de":[
- {"src":"https://www.youtube.com/embed/A_tkKYaW_iI?rel=0&autoplay=1","title":"EGroupware 14.2 neue Features","thumbnail":"https://img.youtube.com/vi/A_tkKYaW_iI/0.jpg", "desc":"In diesem Video werden die drei wichtigsten Neuerungen der neuen EGroupware Version 14.2. beschrieben."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/mCDJndpjO40?rel=0&autoplay=1","title":"EGroupware 14.2 new features","thumbnail":"https://img.youtube.com/vi/mCDJndpjO40/0.jpg", "desc":"This video shows the three main features of upcoming new EGroupware version 14.2."}
- ]
- },
- "infolog":{
- "de":[
- {"src":"https://www.youtube.com/embed/fiPjk49HtMY?rel=0&autoplay=1","title":"EGroupware - CRM","thumbnail":"https://img.youtube.com/vi/fiPjk49HtMY/0.jpg", "desc":"Customer Relationship Management - Hier zeigen wir, wie Kontakte und Termine von Kunden oder Partnern mit Adressbuch, Kalender und InfoLog abgebildet werden können."},
- {"src":"https://www.youtube.com/embed/A_tkKYaW_iI?rel=0&autoplay=1","title":"EGroupware 14.2 neue Features","thumbnail":"https://img.youtube.com/vi/A_tkKYaW_iI/0.jpg", "desc":"In diesem Video werden die drei wichtigsten Neuerungen der neuen EGroupware Version 14.2. beschrieben."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/HwjZFnitqRQ?rel=0&autoplay=1","title":"EGroupware - CRM","thumbnail":"https://img.youtube.com/vi/HwjZFnitqRQ/0.jpg", "desc":"Customer Relationship Management - We show, how contacts and events of customers or partners can be edited with Addressbook, Calendar and InfoLog."},
- {"src":"https://www.youtube.com/embed/mCDJndpjO40?rel=0&autoplay=1","title":"EGroupware 14.2 new features","thumbnail":"https://img.youtube.com/vi/mCDJndpjO40/0.jpg", "desc":"This video shows the three main features of upcoming new EGroupware version 14.2."}
- ]
- },
- "calendar":{
- "de":[
- {"src":"https://www.youtube.com/embed/fiPjk49HtMY?rel=0&autoplay=1","title":"EGroupware - CRM","thumbnail":"https://img.youtube.com/vi/fiPjk49HtMY/0.jpg", "desc":"Customer Relationship Management - Hier zeigen wir, wie Kontakte und Termine von Kunden oder Partnern mit Adressbuch, Kalender und InfoLog abgebildet werden können."},
- {"src":"https://www.youtube.com/embed/rP_fK7Dk42s?rel=0&autoplay=1","title":"EGroupware für Universitäten und Schulen ","thumbnail":"https://img.youtube.com/vi/rP_fK7Dk42s/0.jpg", "desc":"Die EGroupware Ressourcen-Verwaltung ersetzt einzelne Listen und Aushänge und kann den Verleih von Beamern oder Laptops sowie die Nutzung von Sportplatz oder Sitzungssaal übersichtlich abbilden."},
- {"src":"https://www.youtube.com/embed/e_X2InMcBao?rel=0&autoplay=1","title":"EGroupware Synchronisation - Apple","thumbnail":"https://img.youtube.com/vi/e_X2InMcBao/0.jpg", "desc":"In diesem Video erklären wir Schritt für Schritt die Synchronisation mit Ihrem Mobilgerät - für alle Apple-Geräte."},
- {"src":"https://www.youtube.com/embed/hJWQYzxC9MA?rel=0&autoplay=1","title":"EGroupware Synchronisation - Android","thumbnail":"https://img.youtube.com/vi/hJWQYzxC9MA/0.jpg", "desc":"In diesem Video erklären wir Schritt für Schritt die Synchronisation mit Ihrem Mobilgerät - für alle Android-Geräte."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/HwjZFnitqRQ?rel=0&autoplay=1","title":"EGroupware - CRM","thumbnail":"https://img.youtube.com/vi/HwjZFnitqRQ/0.jpg", "desc":"Customer Relationship Management - We show, how contacts and events of customers or partners can be edited with Addressbook, Calendar and InfoLog."},
- {"src":"https://www.youtube.com/embed/hHxjjQ_MqnY?rel=0&autoplay=1","title":"EGroupware Synchronisation - Apple","thumbnail":"https://img.youtube.com/vi/hHxjjQ_MqnY/0.jpg", "desc":"We explain step by step, how to synchronise EGroupware with your smartphone or tablet - for all Apple devices."},
- {"src":"https://www.youtube.com/embed/-NdgyI7BDpY?rel=0&autoplay=1","title":"EGroupware Synchronisation - Android","thumbnail":"https://img.youtube.com/vi/-NdgyI7BDpY/0.jpg", "desc":"We explain step by step, how to synchronise EGroupware with your smartphone or tablet - for all Android devices."}
- ]
- },
- "mail":{
- "de":[
- {"src":"https://www.youtube.com/embed/wUdHb6Zha60?rel=0&autoplay=1","title":"EGroupware E-Mail Basics","thumbnail":"https://img.youtube.com/vi/wUdHb6Zha60/0.jpg", "desc":"Hier zeigen wir einige praktische Funktionen der Anwendung Mail. Beipiele: Benutzung des Kontextmenüs und Anpassen des Vorschaudialogs für Emails."},
- {"src":"https://www.youtube.com/embed/7DZKPKa_Rj0?rel=0&autoplay=1","title":"EGroupware E-Mail Account Management","thumbnail":"https://img.youtube.com/vi/7DZKPKa_Rj0/0.jpg", "desc":"In diesem Tutorial erklären wir, wie einfach Sie sich selbst einen neuen Mailaccount anlegen und wie schnell das geht."},
- {"src":"https://www.youtube.com/embed/vml4Ok1qdGM?rel=0&autoplay=1","title":"EGroupware Admin Mail","thumbnail":"https://img.youtube.com/vi/vml4Ok1qdGM/0.jpg", "desc":"Hier zeigen wir - für alle Admins - wichtige Einstellungen in EGroupware Mail!"},
- {"src":"https://www.youtube.com/embed/A_tkKYaW_iI?rel=0&autoplay=1","title":"EGroupware 14.2 neue Features","thumbnail":"https://img.youtube.com/vi/A_tkKYaW_iI/0.jpg", "desc":"In diesem Video werden die drei wichtigsten Neuerungen der neuen EGroupware Version 14.2. beschrieben."}
- ],
- "en":[
- {"src":"https://www.youtube.com/embed/5ukeZd-kEMo?rel=0&autoplay=1","title":"EGroupware E-Mail Basics","thumbnail":"https://img.youtube.com/vi/5ukeZd-kEMo/0.jpg", "desc":"Here we show some useful features of mail application. E.g. we explain how to use context menu or how you can customize preview dialog."},
- {"src":"https://www.youtube.com/embed/LkWOL8PkgvU?rel=0&autoplay=1","title":"EGroupware E-Mail account management","thumbnail":"https://img.youtube.com/vi/LkWOL8PkgvU/0.jpg", "desc":"In this tutorial we explain, how fast and how easy you create your own mail account."},
- {"src":"https://www.youtube.com/embed/8CTF7w3K8kA?rel=0&autoplay=1","title":"EGroupware Admin Mail","thumbnail":"https://img.youtube.com/vi/8CTF7w3K8kA/0.jpg", "desc":"We show, how you – as an admin – change settings for one user in Stylite Mail Hosting."},
- {"src":"https://www.youtube.com/embed/mCDJndpjO40?rel=0&autoplay=1","title":"EGroupware 14.2 new features","thumbnail":"https://img.youtube.com/vi/mCDJndpjO40/0.jpg", "desc":"This video shows the three main features of upcoming new EGroupware version 14.2."}
- ]
- },
- "ressources":{
- "de":[
- {"src":"https://www.youtube.com/embed/rP_fK7Dk42s?rel=0&autoplay=1","title":"EGroupware für Universitäten und Schulen ","thumbnail":"https://img.youtube.com/vi/rP_fK7Dk42s/0.jpg", "desc":"Die EGroupware Ressourcen-Verwaltung ersetzt einzelne Listen und Aushänge und kann den Verleih von Beamern oder Laptops sowie die Nutzung von Sportplatz oder Sitzungssaal übersichtlich abbilden."}
- ]
- }
-}
\ No newline at end of file
diff --git a/api/src/Config.php b/api/src/Config.php
index 1593438dbf..b7809d5c6f 100755
--- a/api/src/Config.php
+++ b/api/src/Config.php
@@ -257,7 +257,7 @@ class Config
'site_title','login_logo_file','login_logo_url','login_logo_title','favicon_file',
'markuntranslated','link_list_thumbnail','enabled_spellcheck','debug_minify',
'call_link','call_popup','fax_email','fax_email_regexp','geolocation_url', // addressbook
- 'hide_birthdays','calview_no_consolidate', 'egw_tutorial_disable','fw_mobile_app_list'), // calendar
+ 'hide_birthdays','calview_no_consolidate','fw_mobile_app_list'), // calendar
'projectmanager' => array('hours_per_workday', 'duration_units'),
'manual' => array('manual_remote_egw_url'),
'infolog' => array('status'),
diff --git a/api/src/Framework/Tutorial.php b/api/src/Framework/Tutorial.php
deleted file mode 100644
index 30e1c5994c..0000000000
--- a/api/src/Framework/Tutorial.php
+++ /dev/null
@@ -1,155 +0,0 @@
-
- * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
- * @version $Id$
- */
-
-namespace EGroupware\Api\Framework;
-
-use EGroupware\Api;
-use EGroupware\Api\Etemplate;
-
-class Tutorial
-{
- /**
- * Methods callable via menuaction
- *
- * @var array
- */
- public $public_functions = array(
- 'popup' => true
- );
-
- /**
- * Popup window to display youtube video
- *
- * @param array $content
- */
- function popup ($content=null)
- {
- // check and if not done register tutorial_menu hook
- if (!Api\Hooks::exists('sidebox_all', 'api') ||
- Api\Hooks::exists('sidebox_all', 'api', true) != 'EGroupware\\Api\\Framework\\Tutorial::tutorial_menu')
- {
- Api\Hooks::read(true);
- }
-
- //Allow youtube frame to pass the CSP check
- Api\Header\ContentSecurityPolicy::add('frame-src', array('https://www.youtube.com'));
-
- $tmpl = new Etemplate('api.tutorial');
- if (!is_array($content))
- {
- // Get tutorial object id
- $tuid_indx = explode('-',$_GET['tuid']);
- $appName = $tuid_indx[0];
- $lang = $tuid_indx[1];
- $id = $tuid_indx[2];
- }
- else // set the first video of selected app
- {
- $appName = $content['list']['apps'];
- $lang = $GLOBALS['egw_info']['user']['preferences']['common']['lang'];
- $id ="0";
- }
- // read tutorials json file to fetch data
- $tutorials = json_decode(self::getJsonData(), true);
- $apps = array('introduction' => lang('Introduction'));
- foreach (array_keys($tutorials) as $app)
- {
- // show only apps user has access to them
- if (in_array($app, array_keys($GLOBALS['egw_info']['user']['apps']))) $apps [$app] = $app;
- }
- $sel_options = array(
- 'apps' => $apps,
- );
- // Check if the user has right to see the app's tutorial
- if (in_array($appName, array_keys($GLOBALS['egw_info']['user']['apps'])) || $appName === "introduction")
- {
- // fallback to english video
- $tutorial = $tutorials[$appName][$lang][$id]? $tutorials[$appName][$lang][$id]:
- $tutorials[$appName]['en'][$id];
-
- $list = array(
- 'apps' => $appName,
- '0' => ''
- );
- foreach (isset($tutorials[$appName][$lang]) ? $tutorials[$appName][$lang] : $tutorials[$appName]['en'] as $v)
- {
- $v ['onclick'] = 'etemplate2.getByApplication("api")[0].widgetContainer.getWidgetById("src").set_value("'.$v['src'].'")';
- array_push($list, $v);
- }
- $content = array (
- 'src' => $tutorial['src'],
- 'title' => $tutorial['title'],
- 'desc' => $tutorial['desc'],
- 'list' => $list
- );
- }
- else
- {
- $content = array();
- Api\Framework::message(lang('You do not have permission to see this tutorial!'));
- }
-
- $tmpl->exec('api.EGroupware\\Api\\Framework\\Tutorial.popup', $content, $sel_options, array(), array(), 2);
- }
-
- /**
- * Ajax function to get videos links as json
- */
- public static function ajax_data()
- {
- $response = Api\Json\Response::get();
- $response->data(json_decode(self::getJsonData()));
- }
-
- /**
- * Function to fetch data from tutorials.json file
- *
- * @return string returns json string
- */
- static function getJsonData()
- {
- if (!($json = Api\Cache::getCache(Api\Cache::TREE, __CLASS__, 'egw_tutorial_json')))
- {
- $json = file_get_contents('api/setup/tutorials.json');
- // Cache the json object for two hours
- Api\Cache::setCache(Api\Cache::TREE, __CLASS__, 'egw_tutorial_json', $json, 7200);
- }
-
- return $json;
- }
-
- /**
- * Static function to build egw tutorial sidebox menu
- *
- */
- public static function tutorial_menu()
- {
- if (Api\Header\UserAgent::mobile()) return;
- $tutorials = json_decode(self::getJsonData(),true);
- $appname = $GLOBALS['egw_info']['flags']['currentapp'];
- if (!is_array($tutorials[$appname])) return false;
- if (!$GLOBALS['egw_info']['server']['egw_tutorial_disable']
- || $GLOBALS['egw_info']['server']['egw_tutorial_disable'] == 'intro')
- {
- $file = Array (
- array(
- 'text' => '',
- 'no_lang' => true,
- 'link' => false,
- 'icon' => false,
- )
- );
- display_sidebox($appname, lang('Video Tutorials'), $file);
- }
- }
-}
\ No newline at end of file
diff --git a/api/templates/default/def_tutorials.css b/api/templates/default/def_tutorials.css
deleted file mode 100644
index 42dd821ce4..0000000000
--- a/api/templates/default/def_tutorials.css
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * EGroupware: CSS with less preprocessor
- *
- * Definitions for tutorials
- *
- * Please do NOT change css-files directly, instead change less-files and compile them!
- *
- * @link http://www.egroupware.org
- * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
- * @author Hadi NAtegh
- * @package phpgwapi
- * @version $Id$
- */
-span.egw_tutorial_title {
- color: black;
- font-weight: bold;
- text-align: left;
- width: 99%;
- background-color: #D6DEF0;
- border: 1px solid #B3B3B3;
- padding-top: 4px;
- padding-left: 5px;
- padding-bottom: 5px;
- border-radius: 2px;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow-x: hidden;
-}
-.egw_tutorial_thumb:hover [id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn,
-.egw_tutorial_thumb:hover #home-tutorial_play.egw_tutorial_playBtn {
- background-color: #FF0000;
- opacity: 0.68;
-}
-.egw_tutorial_thumb:hover [id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn > div,
-.egw_tutorial_thumb:hover #home-tutorial_play.egw_tutorial_playBtn > div {
- border-left-color: white;
-}
-.egw_tutorial_thumb {
- background-repeat: no-repeat;
- background-position: -2px;
- border-radius: 5px;
- display: block !important;
-}
-[id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn,
-#home-tutorial_play.egw_tutorial_playBtn {
- display: block;
- margin: 10%;
- border: 2px solid rgba(0, 0, 0, 0.7);
- -webkit-border-radius: 100%;
- -moz-border-radius: 100%;
- border-radius: 100%;
- width: 40px;
- height: 40px;
- cursor: pointer;
-}
-[id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn > div,
-#home-tutorial_play.egw_tutorial_playBtn > div {
- display: block;
- position: relative;
- top: 10px;
- left: 45%;
- width: 0;
- height: 0;
- border-top: 10px solid transparent;
- border-bottom: 10px solid transparent;
- border-left: 10px solid rgba(0, 0, 0, 0.8);
-}
-[id^="egw_tutorial_"][id$="sidebox_list"] {
- overflow-x: hidden;
- overflow-y: auto;
- max-height: 200px;
-}
-#list_grid_wrapper {
- max-height: 200px;
-}
-#home-tutorial_list {
- float: left;
-}
-#home-tutorial_list .egw_tutorial_thumb {
- display: block;
-}
-#home-tutorial_list .th .et2_label {
- font-size: 12px;
- padding-left: 7px;
-}
-#home-tutorial_list .th #home-tutorial_apps {
- margin-left: 5px;
-}
-#home-tutorial_list tbody td:first-child {
- padding-top: 4px;
-}
-#home-tutorial_src {
- border-left: 6px solid #E0E0E0;
-}
-.tutorial_popup {
- background-color: white;
- padding-top: 5px;
- overflow-y: hidden;
-}
-.tutorial_videoList {
- overflow-x: hidden;
- overflow-y: auto;
- height: 100%;
- display: inline-block !important;
-}
-div.tutorial_iframe_wrapper {
- position: absolute;
- left: 225px;
- right: 12px;
- height: 90%;
-}
diff --git a/api/templates/default/def_tutorials.less b/api/templates/default/def_tutorials.less
deleted file mode 100644
index bc6ccafc96..0000000000
--- a/api/templates/default/def_tutorials.less
+++ /dev/null
@@ -1,118 +0,0 @@
-/**
- * EGroupware: CSS with less preprocessor
- *
- * Definitions for tutorials
- *
- * Please do NOT change css-files directly, instead change less-files and compile them!
- *
- * @link http://www.egroupware.org
- * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
- * @author Hadi NAtegh
- * @package phpgwapi
- * @version $Id$
- */
-
-span.egw_tutorial_title {
- color: black;
- font-weight: bold;
- text-align: left;
- width: 99%;
- background-color: #D6DEF0;
- border: 1px solid #B3B3B3;
- padding-top: 4px;
- padding-left: 5px;
- padding-bottom: 5px;
- border-radius: 2px;
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow-x: hidden;
-}
-.egw_tutorial_thumb:hover [id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn,
-.egw_tutorial_thumb:hover #home-tutorial_play.egw_tutorial_playBtn{
- background-color: #FF0000;
- opacity: 0.68;
-}
-.egw_tutorial_thumb:hover [id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn> div,
-.egw_tutorial_thumb:hover #home-tutorial_play.egw_tutorial_playBtn> div{
- border-left-color: white;
-}
-.egw_tutorial_thumb {
- background-repeat: no-repeat;
- background-position: -2px;
- border-radius: 5px;
- display: block !important;
-}
-[id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn,
-#home-tutorial_play.egw_tutorial_playBtn{
- display:block;
- margin:10%;
- border: 2px solid rgba(0,0,0,0.7);
- -webkit-border-radius: 100%;
- -moz-border-radius: 100%;
- border-radius: 100%;
- width: 40px;
- height: 40px;
- cursor: pointer;
-}
-[id^="egw_tutorial_"][id$="_play"].egw_tutorial_playBtn> div,
-#home-tutorial_play.egw_tutorial_playBtn>div{
- display:block;
- position:relative;
- top: 10px;
- left: 45%;
- width: 0;
- height: 0;
- border-top: 10px solid transparent;
- border-bottom: 10px solid transparent;
- border-left: 10px solid rgba(0,0,0,0.8);
-}
-[id^="egw_tutorial_"][id$="sidebox_list"] {
- overflow-x: hidden;
- overflow-y: auto;
- max-height: 200px;
-}
-#list_grid_wrapper {
- max-height: 200px;
-}
-
-
-#home-tutorial_list {
- float:left;
- .egw_tutorial_thumb {
- display:block;
- }
- .th {
- .et2_label {
- font-size: 12px;
- padding-left: 7px;
- }
- #home-tutorial_apps {
- margin-left: 5px;
- }
- }
- tbody{
- td:first-child {
- padding-top:4px;
- }
- }
-}
-#home-tutorial_src {
- border-left: 6px solid #E0E0E0;
-}
-.tutorial_popup {
- background-color:white;
- padding-top: 5px;
- overflow-y: hidden;
-}
-.tutorial_videoList {
- overflow-x: hidden;
- overflow-y: auto;
- height: 100%;
- display: inline-block !important;
-}
-div.tutorial_iframe_wrapper {
- position:absolute;
- left:225px;
- right:12px;
- height:90%;
-}
\ No newline at end of file
diff --git a/api/templates/default/egw_tutorial.xet b/api/templates/default/egw_tutorial.xet
deleted file mode 100644
index c3f445d6b8..0000000000
--- a/api/templates/default/egw_tutorial.xet
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/api/templates/default/tutorial.xet b/api/templates/default/tutorial.xet
deleted file mode 100644
index c8f507eeb4..0000000000
--- a/api/templates/default/tutorial.xet
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-