mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-22 06:30:59 +01:00
Et2DropdownButton WIP
This commit is contained in:
parent
a7940fe4f6
commit
8172f6e72d
106
api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts
Normal file
106
api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* EGroupware eTemplate2 - Dropdown Button widget
|
||||||
|
*
|
||||||
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||||
|
* @package etemplate
|
||||||
|
* @subpackage api
|
||||||
|
* @link https://www.egroupware.org
|
||||||
|
* @author Nathan Gray
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import {Et2Button} from "../Et2Button/Et2Button";
|
||||||
|
import {SlButtonGroup, SlDropdown} from "@shoelace-style/shoelace";
|
||||||
|
import {css, html, repeat, TemplateResult} from "@lion/core";
|
||||||
|
import {Et2widgetWithSelectMixin} from "../Et2Select/Et2WidgetWithSelectMixin";
|
||||||
|
import {SelectOption} from "../Et2Select/FindSelectOptions";
|
||||||
|
import {buttonStyles} from "../Et2Button/ButtonStyles";
|
||||||
|
import shoelace from "../Styles/shoelace";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A split button - a button with a dropdown list
|
||||||
|
*
|
||||||
|
* There are several parts to the button UI:
|
||||||
|
* - Container: This is what is percieved as the dropdown button, the whole package together
|
||||||
|
* - Button: The part on the left that can be clicked
|
||||||
|
* - Arrow: The button to display the choices
|
||||||
|
* - Menu: The list of choices
|
||||||
|
*
|
||||||
|
* Menu options are passed via the select_options. They are normally the same
|
||||||
|
* as for a select box, but the title can also be full HTML if needed.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export class Et2DropdownButton extends Et2widgetWithSelectMixin(Et2Button)
|
||||||
|
{
|
||||||
|
|
||||||
|
static get styles()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
...super.styles,
|
||||||
|
shoelace,
|
||||||
|
buttonStyles,
|
||||||
|
css`
|
||||||
|
:host {
|
||||||
|
display: contents;
|
||||||
|
}
|
||||||
|
.menu-item {
|
||||||
|
width: --sl-input-height-medium;
|
||||||
|
max-height: var(--sl-input-height-medium)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
`,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure imports stay
|
||||||
|
private _group : SlButtonGroup;
|
||||||
|
private _dropdow : SlDropdown;
|
||||||
|
|
||||||
|
|
||||||
|
connectedCallback()
|
||||||
|
{
|
||||||
|
super.connectedCallback();
|
||||||
|
|
||||||
|
// Rebind click to just the button
|
||||||
|
this.removeEventListener("click", this._handleClick);
|
||||||
|
this.buttonNode.addEventListener("click", this._handleClick);
|
||||||
|
}
|
||||||
|
|
||||||
|
render()
|
||||||
|
{
|
||||||
|
return html`
|
||||||
|
<sl-button-group>
|
||||||
|
<sl-button size="medium">${this.label}</sl-button>
|
||||||
|
<sl-dropdown placement="bottom-end">
|
||||||
|
<sl-button size="medium" slot="trigger" caret></sl-button>
|
||||||
|
<sl-menu>
|
||||||
|
${repeat(this.select_options, (option : SelectOption) => option.value, option =>
|
||||||
|
this._itemTemplate(option)
|
||||||
|
)}
|
||||||
|
</sl-menu>
|
||||||
|
</sl-dropdown>
|
||||||
|
</sl-button-group>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected _itemTemplate(option : SelectOption) : TemplateResult
|
||||||
|
{
|
||||||
|
let icon = option.icon ? html`
|
||||||
|
<et2-image slot="prefix" src=${option.icon} icon></et2-image>` : '';
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<sl-menu-item value="${option.value}">
|
||||||
|
${icon}
|
||||||
|
${option.label}
|
||||||
|
</sl-menu-item>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
get buttonNode()
|
||||||
|
{
|
||||||
|
return this.shadowRoot.querySelector("et2-button");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @ts-ignore TypeScript is not recognizing that Et2Button is a LitElement
|
||||||
|
customElements.define("et2-dropdown-button", Et2DropdownButton);
|
@ -27,6 +27,9 @@ export class Et2Image extends Et2Widget(SlotMixin(LitElement)) implements et2_ID
|
|||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
:host([icon]) {
|
||||||
|
height: 1.3rem;
|
||||||
|
}
|
||||||
`,
|
`,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@ export interface SelectOption
|
|||||||
label : string;
|
label : string;
|
||||||
// Hover help text
|
// Hover help text
|
||||||
title? : string;
|
title? : string;
|
||||||
|
// Related image or icon
|
||||||
|
icon? : string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -214,7 +214,8 @@ const Et2WidgetMixin = (superClass) =>
|
|||||||
super(...args);
|
super(...args);
|
||||||
|
|
||||||
this.disabled = false;
|
this.disabled = false;
|
||||||
this.addEventListener("click", this._handleClick.bind(this));
|
this._handleClick = this._handleClick.bind(this);
|
||||||
|
this.addEventListener("click", this._handleClick);
|
||||||
}
|
}
|
||||||
|
|
||||||
connectedCallback()
|
connectedCallback()
|
||||||
@ -231,7 +232,7 @@ const Et2WidgetMixin = (superClass) =>
|
|||||||
{
|
{
|
||||||
this.egw()?.tooltipUnbind(this);
|
this.egw()?.tooltipUnbind(this);
|
||||||
|
|
||||||
this.removeEventListener("click", this._handleClick.bind(this));
|
this.removeEventListener("click", this._handleClick);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
24
api/js/etemplate/Styles/shoelace.ts
Normal file
24
api/js/etemplate/Styles/shoelace.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import sl_css from '@shoelace-style/shoelace/dist/themes/light.styles.js';
|
||||||
|
import {css} from "lit";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Customise shoelace styles to match our stuff
|
||||||
|
*/
|
||||||
|
export default [sl_css, css`
|
||||||
|
:root,
|
||||||
|
:host,
|
||||||
|
.sl-theme-light {
|
||||||
|
--sl-input-height-small: 18px;
|
||||||
|
--sl-input-height-medium: 24px;
|
||||||
|
|
||||||
|
--sl-spacing-small: 0.1rem;
|
||||||
|
--sl-spacing-medium: 0.5rem;
|
||||||
|
|
||||||
|
--sl-input-border-radius-small: 2px;
|
||||||
|
--sl-input-border-radius-medium: 3px;
|
||||||
|
}
|
||||||
|
.menu-item {
|
||||||
|
width: --sl-input-height-medium;
|
||||||
|
max-height: var(--sl-input-height-medium)
|
||||||
|
}
|
||||||
|
`];
|
@ -37,6 +37,7 @@ import './Et2Date/Et2DateTimeReadonly';
|
|||||||
import './Et2Date/Et2DateTimeToday';
|
import './Et2Date/Et2DateTimeToday';
|
||||||
import './Et2Description/Et2Description';
|
import './Et2Description/Et2Description';
|
||||||
import './Et2Dialog/Et2Dialog';
|
import './Et2Dialog/Et2Dialog';
|
||||||
|
import './Et2DropdownButton/Et2DropdownButton';
|
||||||
import './Expose/Et2ImageExpose';
|
import './Expose/Et2ImageExpose';
|
||||||
import './Expose/Et2DescriptionExpose';
|
import './Expose/Et2DescriptionExpose';
|
||||||
import './Et2Image/Et2Image';
|
import './Et2Image/Et2Image';
|
||||||
|
@ -126,9 +126,10 @@ class filemanager_ui
|
|||||||
$sel_options = array ();
|
$sel_options = array ();
|
||||||
foreach ($actions as $action => $value)
|
foreach ($actions as $action => $value)
|
||||||
{
|
{
|
||||||
$sel_options[$action] = array (
|
$sel_options[] = array(
|
||||||
|
'value' => $action,
|
||||||
'label' => $value['caption'],
|
'label' => $value['caption'],
|
||||||
'icon' => $value['icon']
|
'icon' => $value['icon']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return $sel_options;
|
return $sel_options;
|
||||||
|
Loading…
Reference in New Issue
Block a user