egroupware/api/js/etemplate/ActivateLinksDirective.ts

66 lines
1.6 KiB
TypeScript

import {Directive, directive, html, repeat} from "@lion/core";
import {et2_activateLinks} from "./et2_core_common";
/**
* Activates links in text
*
* @example
* this.value = "This text has links to https://www.egroupware.org";
* ...
* render()
* {
* return html`activateLinks(this.value)`;
* }
* renders as:
* <a href="https://www.egroupware.org" target="_blank">egroupware.org</a>
*/
class ActivateLinksDirective extends Directive
{
render(text_with_urls, _target)
{
let list = et2_activateLinks(text_with_urls);
return html`${repeat(list, (item, index) =>
{
// No urls in this section
if(typeof item == "string" || typeof item == "number")
{
// Just text. Easy (framework handles \n)
return item;
}
// Url found, deal with it
else if(item && item.text)
{
if(!item.href)
{
console.warn("et2_activateLinks gave bad data", item, _target);
item.href = "";
}
let click = null;
let target = null;
// open mailto links depending on preferences in mail app
if(item.href.substr(0, 7) == "mailto:" &&
egw.user('apps').mail &&
egw.preference('force_mailto', 'addressbook') != '1')
{
click = function(event)
{
egw.open_link(this);
return false;
}.bind(item.href);
item.href = "#";
}
if(typeof _target != "undefined" && _target && _target != "_self" && item.href.substr(0, 7) != "mailto:")
{
target = _target;
}
return html`<a href="${item.href}" @click=${click} target="${target}">${item.text}</a>`;
}
})}`;
}
}
export const activateLinks = directive(ActivateLinksDirective);