egroupware_official/api/js/jsapi/egw_images.js

220 lines
6.4 KiB
JavaScript
Raw Normal View History

/**
* EGroupware clientside API object
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @author Andreas Stöckel (as AT stylite.de)
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @version $Id$
*/
/*egw:uses
egw_core;
*/
2021-06-05 20:39:39 +02:00
import './egw_core.js';
egw.extend('images', egw.MODULE_GLOBAL, function()
{
"use strict";
/**
* Map to serverside available images for users template-set
*
* @access: private, use egw.image(_name, _app)
*/
let images;
/**
* Mapping some old formats to the newer form, or any other aliasing for mime-types
*
* Should be in sync with ../inc/class.mime_magic.inc.php
*/
const mime_alias_map = {
'text/vcard': 'text/x-vcard',
'text/comma-separated-values': 'text/csv',
'text/rtf': 'application/rtf',
'text/xml': 'application/xml',
'text/x-diff': 'text/diff',
'application/x-jar': 'application/java-archive',
'application/x-javascript': 'application/javascript',
'application/x-troff': 'text/troff',
'application/x-egroupware-etemplate': 'application/xml'
};
return {
/**
2016-04-06 21:57:40 +02:00
* Set imagemap, called from /api/images.php
*
* @param {array|object} _images
* @param {boolean} _need_clone _images need to be cloned, as it is from different window context
* and therefore will be inaccessible in IE, after that window is closed
*/
set_images: function (_images, _need_clone)
{
images = _need_clone ? jQuery.extend(true, {}, _images) : _images;
},
/**
* Get image URL for a given image-name and application
*
* @param {string} _name image-name without extension
* @param {string} _app application name, default current app of window
* @return string with URL of image
*/
image: function (_name, _app)
{
// For logging all paths tried
var tries = {};
if (!images)
{
console.log("calling egw.image('"+_name+"', '"+_app+"') before egw.set_images() returning null");
return null;
}
if (typeof _app === 'undefined')
{
// If the application name is not given, set it to the name of
// current application
_app = this.getAppName();
}
// Handle images in appname/imagename format
if(_name.indexOf('/') > 0)
{
var split = _name.match(/^([^/]+)\/(.*)$/);
// e.g. dhtmlxtree and egw_action are subdirs in image dir, not applications
if (typeof images[split[1]] !== 'undefined')
{
_app = split[1];
_name = split[2];
}
}
// own instance specific images in vfs have the highest precedence
tries.vfs = _name;
2024-09-13 12:05:27 +02:00
if (typeof images.vfs !== 'undefined' && typeof images.vfs[_name] === 'string')
{
return this.webserverUrl+images.vfs[_name];
}
if (typeof images.global !== 'undefined' && (_name !== 'navbar' || _app === 'api'))
{
tries.global = '('+_app+'/)'+_name;
let replace = images.global[_app+'/'+_name] || images.global[_name];
if (replace)
{
if (typeof images.bootstrap[replace] === 'string')
{
return this.webserverUrl+images.bootstrap[replace];
}
const parts = replace.split('/');
if (parts.length > 1)
{
_app = parts.shift();
_name = parts.join('/');
}
else
{
_name = replace;
}
}
}
tries[_app + (_app == 'phpgwapi' ? " (current app)" : "")] = _name;
if (typeof images[_app] !== 'undefined' && typeof images[_app][_name] === 'string')
{
return this.webserverUrl+images[_app][_name];
}
tries.bootstrap = _name;
if (typeof images.bootstrap !== 'undefined' && typeof images.bootstrap[_name] === 'string')
{
return this.webserverUrl+images.bootstrap[_name];
}
tries.api = _name;
if (typeof images.api !== 'undefined' && typeof images.api[_name] === 'string')
{
return this.webserverUrl+images.api[_name];
}
// if no match, check if it might contain an extension
var matches = _name.match(/\.(png|gif|jpg)$/i);
if (matches)
{
return this.image(_name.replace(/.(png|gif|jpg)$/i,''), _app);
}
if(matches != null) tries[_app + " (matched)"]= matches;
egw.debug("log",'egw.image("'+_name+'", "'+_app+'") image NOT found! Tried ', tries);
return null;
2012-03-28 10:10:57 +02:00
},
2012-03-28 10:10:57 +02:00
/**
* Get image url for a given mime-type and option file
*
* @param {string} _mime
* @param {string} _path vfs path to generate thumbnails for images
* @param {number} _size defaults to 128 (only supported size currently)
* @param {number} _mtime current modification time of file to allow infinit caching as url changes
2012-03-28 10:10:57 +02:00
* @returns url of image
*/
mime_icon: function(_mime, _path, _size, _mtime)
2012-03-28 10:10:57 +02:00
{
if (typeof _size == 'undefined') _size = 128;
2012-03-28 10:10:57 +02:00
if (!_mime) _mime = 'unknown';
if (_mime == 'httpd/unix-directory') _mime = 'directory';
2012-03-28 10:10:57 +02:00
var type = _mime.toLowerCase().split('/');
var image = type[0] == 'egw' ? this.image('navbar',type[1]) : undefined;
if (image)
2012-03-28 10:10:57 +02:00
{
2012-03-28 10:10:57 +02:00
}
else if (typeof _path == 'string' && (type[0] == 'image' && type[1].match(/^(png|jpe?g|gif|bmp)$/) ||
type[0] == 'application' && (
// Open Document
type[1].indexOf('vnd.oasis.opendocument.') === 0 ||
// PDF
type[1] == 'pdf' ||
// Microsoft
type[1].indexOf('vnd.openxmlformats-officedocument.') === 0
)
))
2012-03-28 10:10:57 +02:00
{
var params = { 'path': _path, 'thsize': this.config('link_list_thumbnail') || 64};
if (_mtime) params.mtime = _mtime;
2016-04-06 21:39:49 +02:00
image = this.link('/api/thumbnail.php', params);
2012-03-28 10:10:57 +02:00
}
2016-02-29 14:05:48 +01:00
// for svg return image itself
else if (type[0] == 'image' && type[1] == 'svg+xml' && typeof _path == "string")
2016-02-29 14:05:48 +01:00
{
image = this.webserverUrl+'/webdav.php'+_path;
}
2012-03-28 10:10:57 +02:00
else
{
if ((typeof type[1] == 'undefined' || !(image = this.image('mime'+_size+'_'+type[0]+'_'+type[1], 'etemplate')) &&
!(typeof mime_alias_map[_mime] != 'undefined' && (image=this.mime_icon(mime_alias_map[_mime], _path, _size, _mtime)))) &&
2012-03-28 10:10:57 +02:00
!(image = this.image('mime'+_size+'_'+type[0], 'etemplate')))
{
image = this.image('mime'+_size+'_unknown', 'etemplate');
}
}
return image;
},
/**
* Create DOM img or svn element depending on url
*
* @param {string} _url source url
* @param {string} _alt alt attribute for img tag
* @returns DOM node
*/
image_element: function(_url, _alt)
{
var icon;
icon = document.createElement('img');
if (_url) icon.src = _url;
if (_alt) icon.alt = _alt;
return icon;
}
};
});