egroupware/api/js/etemplate/Et2Link/Et2LinkAppSelect.ts

246 lines
5.3 KiB
TypeScript
Raw Normal View History

2022-06-30 17:38:14 +02:00
import {cleanSelectOptions, SelectOption} from "../Et2Select/FindSelectOptions";
import {css, html, SlotMixin, TemplateResult} from "@lion/core";
2022-05-26 22:47:52 +02:00
import {Et2Select} from "../Et2Select/Et2Select";
export class Et2LinkAppSelect extends SlotMixin(Et2Select)
2022-05-26 22:47:52 +02:00
{
static get styles()
{
return [
...super.styles,
css`
:host {
--icon-width: 20px;
display: inline-block;
2022-05-31 21:40:31 +02:00
min-width: 64px;
}
:host([appIcons]) {
max-width: 75px;
}
.select__menu {
overflow-x: hidden;
2022-05-26 22:47:52 +02:00
}
::part(control) {
border: none;
box-shadow: initial;
}
`
]
}
static get properties()
{
return {
...super.properties,
/**
* Limit to just this one application, and hide the selection
*/
onlyApp: {type: String},
2022-05-26 22:47:52 +02:00
/**
* Limit to these applications (comma seperated).
*/
applicationList: {type: String},
2022-05-26 22:47:52 +02:00
/**
* Show application icons instead of application names
*/
appIcons: {type: Boolean, reflect: true}
2022-05-26 22:47:52 +02:00
}
};
get slots()
{
return {
...super.slots,
"": () =>
2022-05-26 22:47:52 +02:00
{
2022-05-26 22:47:52 +02:00
const icon = document.createElement("et2-image");
icon.setAttribute("slot", "prefix");
icon.setAttribute("src", "api/navbar");
icon.style.width = "var(--icon-width)";
return icon;
2022-05-26 22:47:52 +02:00
}
}
}
protected __applicationList : string[];
protected __onlyApp : string;
2022-05-26 22:47:52 +02:00
/**
* Constructor
*
*/
constructor()
{
super();
this.onlyApp = "";
this.appIcons = true;
this.applicationList = [];
2022-05-27 22:22:15 +02:00
this.hoist = true;
2022-05-26 22:47:52 +02:00
// Select options are based off abilities registered with link system
this._reset_select_options();
this._handleChange = this._handleChange.bind(this);
2022-05-26 22:47:52 +02:00
}
set onlyApp(app : string)
2022-06-01 16:05:34 +02:00
{
this.__onlyApp = app || "";
this.updateComplete.then(() =>
{
this.style.display = this.onlyApp ? 'none' : '';
});
2022-06-01 16:05:34 +02:00
}
get onlyApp() : string
2022-06-01 16:05:34 +02:00
{
// __onlyApp may be undefined during creation
return this.__onlyApp || "";
2022-06-01 16:05:34 +02:00
}
2022-05-26 22:47:52 +02:00
connectedCallback()
{
super.connectedCallback();
// Set icon
this.querySelector("[slot='prefix']").setAttribute("src", this.value + "/navbar");
2022-05-26 22:47:52 +02:00
if(!this.value)
{
// use preference
let appname = "";
if(typeof this.value != 'undefined' && this.parentNode && this.parentNode.to_app)
{
appname = this.parentNode.to_app;
}
this.value = this.egw().preference('link_app', appname || this.egw().app_name());
}
2022-05-26 22:47:52 +02:00
// Register to
this.addEventListener("change", this._handleChange);
2022-06-01 16:05:34 +02:00
if(this.__onlyApp)
{
this.style.display = 'none';
}
}
2022-05-26 22:47:52 +02:00
disconnectedCallback()
{
super.disconnectedCallback();
this.removeEventListener("change", this._handleChange);
2022-05-26 22:47:52 +02:00
}
/**
* Called before update() to compute values needed during the update
*
* @param changedProperties
*/
willUpdate(changedProperties)
{
super.willUpdate(changedProperties);
if(changedProperties.has("onlyApp") || changedProperties.has("applicationList"))
2022-05-26 22:47:52 +02:00
{
this._reset_select_options();
}
}
set applicationList(app_list : string[])
2022-05-31 21:40:31 +02:00
{
let oldValue = this.__applicationList;
2022-05-31 21:40:31 +02:00
if(typeof app_list == "string")
{
app_list = (<string>app_list).split(",");
}
this.__applicationList = app_list;
this.requestUpdate("applicationList", oldValue);
2022-05-31 21:40:31 +02:00
}
get applicationList() : string[]
2022-05-31 21:40:31 +02:00
{
return this.__applicationList;
2022-05-31 21:40:31 +02:00
}
get value() : string
2022-06-01 17:42:50 +02:00
{
return this.onlyApp ? this.onlyApp : <string>super.value;
2022-06-01 17:42:50 +02:00
}
set value(new_value)
{
super.value = new_value;
}
private _handleChange(e)
{
// Set icon
this.querySelector("[slot='prefix']").setAttribute("src", this.value + "/navbar");
// update preference
let appname = "";
if(typeof this.value != 'undefined' && this.parentNode && this.parentNode.to_app)
{
appname = this.parentNode.to_app;
}
this.egw().set_preference(appname || this.egw().app_name(), 'link_app', this.value);
}
2022-05-26 22:47:52 +02:00
/**
* Limited select options here
* This method will check properties and set select options appropriately
*/
private _reset_select_options()
{
let select_options = [];
// Limit to one app
if(this.onlyApp)
2022-05-26 22:47:52 +02:00
{
select_options.push({value: this.onlyApp, label: this.egw().lang(this.onlyApp)});
2022-05-26 22:47:52 +02:00
}
else if(this.applicationList.length > 0)
2022-05-26 22:47:52 +02:00
{
select_options = this.applicationList.map((app) =>
{
return {value: app, label: this.egw().lang(app)};
});
2022-05-26 22:47:52 +02:00
}
else
{
//@ts-ignore link_app_list gives {app:name} instead of an array, but parent will fix it
select_options = this.egw().link_app_list('query');
if(typeof select_options['addressbook-email'] !== 'undefined')
{
delete select_options['addressbook-email'];
}
}
if (!this.value)
{
this.value = <string>this.egw().preference('link_app', this.egw().app_name());
}
2022-06-30 17:38:14 +02:00
this.select_options = cleanSelectOptions(select_options);
2022-05-26 22:47:52 +02:00
}
_optionTemplate(option : SelectOption) : TemplateResult
{
return html`
<sl-menu-item value="${option.value}" title="${option.title}">
${this.appIcons ? "" : option.label}
2022-05-26 22:47:52 +02:00
${this._iconTemplate(option.value)}
</sl-menu-item>`;
}
_iconTemplate(appname)
{
let url = appname ? this.egw().image('navbar', appname) : "";
2022-05-26 22:47:52 +02:00
return html`
<et2-image style="width: var(--icon-width)" slot="prefix" src="${url}"></et2-image>`;
}
}
// @ts-ignore TypeScript is not recognizing that this widget is a LitElement
customElements.define("et2-link-apps", Et2LinkAppSelect);