mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-06-25 04:11:49 +02:00
Drop tutorials
This commit is contained in:
parent
e916dda8a6
commit
f7c8c09a4b
@ -140,15 +140,6 @@
|
|||||||
<option value="YesUseWebSpellCheck">Yes, use WebSpellChecker</option>
|
<option value="YesUseWebSpellCheck">Yes, use WebSpellChecker</option>
|
||||||
</select>
|
</select>
|
||||||
</row> -->
|
</row> -->
|
||||||
<row>
|
|
||||||
<description value="EGroupware Tutorial" label="%s:"/>
|
|
||||||
<select id="newsettings[egw_tutorial_disable]">
|
|
||||||
<option value="">Enable</option>
|
|
||||||
<option value="sidebox">Hide sidebox video tutorials</option>
|
|
||||||
<option value="intro">Do not offer introduction video</option>
|
|
||||||
<option value="all">Disable all</option>
|
|
||||||
</select>
|
|
||||||
</row>
|
|
||||||
<row>
|
<row>
|
||||||
<description value="Applications available on mobile devices" label="%s:"/>
|
<description value="Applications available on mobile devices" label="%s:"/>
|
||||||
<select-app id="newsettings[fw_mobile_app_list]" multiple="true" tags="true" other=",enabled:home;groupdav;sitemgr-link;sitemgr;developer_tools;etemplate;stylite;archive;importexport;activesync;notifications;esyncpro;preferences;registration" width="100%"/>
|
<select-app id="newsettings[fw_mobile_app_list]" multiple="true" tags="true" other=",enabled:home;groupdav;sitemgr-link;sitemgr;developer_tools;etemplate;stylite;archive;importexport;activesync;notifications;esyncpro;preferences;registration" width="100%"/>
|
||||||
|
@ -995,9 +995,7 @@ window.egw_fw_ui_scrollarea = function(_contDiv)
|
|||||||
// Do not scrolldown/up when we are on selectbox items
|
// Do not scrolldown/up when we are on selectbox items
|
||||||
// seems Firefox does not prevent the mousewheel event over
|
// seems Firefox does not prevent the mousewheel event over
|
||||||
// selectbox items with scrollbars
|
// selectbox items with scrollbars
|
||||||
// Do not scroll on video tutorials as well
|
if (e.target.tagName == "OPTION" || e.target.tagName == "SELECT")
|
||||||
if (e.target.tagName == "OPTION" || e.target.tagName == "SELECT" ||
|
|
||||||
e.target.getAttribute('class') && e.target.getAttribute('class').match(/egw_tutorial/ig))
|
|
||||||
{
|
{
|
||||||
noscroll = true;
|
noscroll = true;
|
||||||
}
|
}
|
||||||
|
@ -568,18 +568,6 @@ export const AppJS = (function(){ "use strict"; return Class.extend(
|
|||||||
*/
|
*/
|
||||||
_init_sidebox: function(sidebox)
|
_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)
|
if(sidebox.length)
|
||||||
{
|
{
|
||||||
var self = this;
|
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
|
* Check if Mailvelope is available, open (or create) "egroupware" keyring and call callback with it
|
||||||
*
|
*
|
||||||
|
@ -434,37 +434,6 @@ window.app = {classes: {}};
|
|||||||
window.scrollTo(0, 1);
|
window.scrollTo(0, 1);
|
||||||
}
|
}
|
||||||
try {
|
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
|
// open websocket to push server for our top window
|
||||||
if (egw === window.top.egw && egw_script.getAttribute('data-websocket-url'))
|
if (egw === window.top.egw && egw_script.getAttribute('data-websocket-url'))
|
||||||
{
|
{
|
||||||
|
@ -120,8 +120,6 @@ export abstract class EgwApp
|
|||||||
et2_view : any;
|
et2_view : any;
|
||||||
favorite_popup : JQuery | any;
|
favorite_popup : JQuery | any;
|
||||||
|
|
||||||
tutorial_initialised : boolean;
|
|
||||||
|
|
||||||
dom_id : string;
|
dom_id : string;
|
||||||
|
|
||||||
mailvelopeSyncHandlerObj : any;
|
mailvelopeSyncHandlerObj : any;
|
||||||
@ -803,18 +801,7 @@ export abstract class EgwApp
|
|||||||
*/
|
*/
|
||||||
_init_sidebox(sidebox)
|
_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)
|
if(sidebox.length)
|
||||||
{
|
{
|
||||||
var self = this;
|
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
|
* Check if Mailvelope is available, open (or create) "egroupware" keyring and call callback with it
|
||||||
*
|
*
|
||||||
|
@ -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']['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']['editgroup'] = 'EGroupware\\Api\\Vfs\\Hooks::editGroup';
|
||||||
$setup_info['api']['hooks']['changepassword'] = 'EGroupware\\Api\\Mail\\Hooks::changepassword';
|
$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
|
// Hooks to delete shares when file is deleted
|
||||||
$setup_info['api']['hooks']['vfs_unlink'] = 'EGroupware\\Api\\Vfs\\Sharing::vfsUpdate';
|
$setup_info['api']['hooks']['vfs_unlink'] = 'EGroupware\\Api\\Vfs\\Sharing::vfsUpdate';
|
||||||
|
@ -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."}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
@ -257,7 +257,7 @@ class Config
|
|||||||
'site_title','login_logo_file','login_logo_url','login_logo_title','favicon_file',
|
'site_title','login_logo_file','login_logo_url','login_logo_title','favicon_file',
|
||||||
'markuntranslated','link_list_thumbnail','enabled_spellcheck','debug_minify',
|
'markuntranslated','link_list_thumbnail','enabled_spellcheck','debug_minify',
|
||||||
'call_link','call_popup','fax_email','fax_email_regexp','geolocation_url', // addressbook
|
'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'),
|
'projectmanager' => array('hours_per_workday', 'duration_units'),
|
||||||
'manual' => array('manual_remote_egw_url'),
|
'manual' => array('manual_remote_egw_url'),
|
||||||
'infolog' => array('status'),
|
'infolog' => array('status'),
|
||||||
|
@ -1,155 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* EGroupware - Tutorial
|
|
||||||
*
|
|
||||||
* @link http://www.egroupware.org
|
|
||||||
* @package api
|
|
||||||
* @subpackage framework
|
|
||||||
* @author Hadi Nategh [hn@stylite.de]
|
|
||||||
* @copyright (c) 2015-16 by Stylite AG <info-AT-stylite.de>
|
|
||||||
* @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' => '<div id="egw_tutorial_'.$appname.'_sidebox" class="egwTutorial"/>',
|
|
||||||
'no_lang' => true,
|
|
||||||
'link' => false,
|
|
||||||
'icon' => false,
|
|
||||||
)
|
|
||||||
);
|
|
||||||
display_sidebox($appname, lang('Video Tutorials'), $file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 <hn@stylite.de>
|
|
||||||
* @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%;
|
|
||||||
}
|
|
@ -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 <hn@stylite.de>
|
|
||||||
* @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%;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE overlay PUBLIC "-//EGroupware GmbH//eTemplate 2//EN" "http://www.egroupware.org/etemplate2.dtd">
|
|
||||||
<!-- $Id$ -->
|
|
||||||
<overlay>
|
|
||||||
<template id="etemplate.egw_tutorial" template="" lang="" group="0" version="15.1">
|
|
||||||
<grid id="list" width="99%" overflow="auto">
|
|
||||||
<columns>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row >
|
|
||||||
<vbox onclick="$row_cont[onclick]" align="center" statustext="$row_cont[desc]">
|
|
||||||
<hbox background="$row_cont[thumbnail]" height="130px" width="99%" class="egw_tutorial_thumb">
|
|
||||||
<description value = "$row_cont[title]" class="egw_tutorial_title"/>
|
|
||||||
<hbox id="play" class="egw_tutorial_playBtn">
|
|
||||||
<hbox></hbox>
|
|
||||||
</hbox>
|
|
||||||
</hbox>
|
|
||||||
</vbox>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</template>
|
|
||||||
</overlay>
|
|
@ -1,63 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE overlay PUBLIC "-//EGroupware GmbH//eTemplate 2//EN" "http://www.egroupware.org/etemplate2.dtd">
|
|
||||||
<!-- $Id$ -->
|
|
||||||
<overlay>
|
|
||||||
<template id="api.tutorial" template="" lang="" group="0" version="15.1">
|
|
||||||
<grid height="100%" width="100%">
|
|
||||||
<columns>
|
|
||||||
<column width="100%"/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row>
|
|
||||||
<hbox height="100%" class="tutorial_popup">
|
|
||||||
<hbox class="tutorial_videoList" width="220px" height="580">
|
|
||||||
<grid id="list" classs="egwGridView_grid" resize_ratio="0" width="220px">
|
|
||||||
<columns>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row class="th" part="header">
|
|
||||||
<menulist>
|
|
||||||
<menupopup id="apps" label="Applications" statustext="Please select application name" onchange="1"/>
|
|
||||||
</menulist>
|
|
||||||
</row>
|
|
||||||
<row>
|
|
||||||
<vbox onclick="$row_cont[onclick]" align="center" statustext="$row_cont[desc]">
|
|
||||||
<hbox background="$row_cont[thumbnail]" height="130px" width="210px" class="egw_tutorial_thumb">
|
|
||||||
<description value = "$row_cont[title]" class="egw_tutorial_title"/>
|
|
||||||
<hbox id="play" class="egw_tutorial_playBtn">
|
|
||||||
<hbox></hbox>
|
|
||||||
</hbox>
|
|
||||||
</hbox>
|
|
||||||
</vbox>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</hbox>
|
|
||||||
<hbox class="tutorial_iframe_wrapper">
|
|
||||||
<iframe id="src" height="100%" seamless="true" width="100%" fullscreen="true"/>
|
|
||||||
</hbox>
|
|
||||||
</hbox>
|
|
||||||
</row>
|
|
||||||
<!-- This row needs to be here in order to keep footer always at bottom when we resize the window -->
|
|
||||||
<row>
|
|
||||||
<grid resize_ratio="1">
|
|
||||||
<columns>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row>
|
|
||||||
<description/>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</row>
|
|
||||||
<row class="dialogFooterToolbar">
|
|
||||||
<hbox span="all">
|
|
||||||
<button align="left" statustext="Close this window" label="Close" id="button[close]" onclick="window.close()" image="close" background_image="1"/>
|
|
||||||
</hbox>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</template>
|
|
||||||
</overlay>
|
|
Loading…
x
Reference in New Issue
Block a user